Re: Zase Arduino - jak dostat data do přerušení

Jirka Mww jirka.mww na gmail.com
Pondělí Leden 29 17:00:28 CET 2024


Díky za radu,
nastuduju to a vyzkouším.  Našel jsem tuhle stránku, která to vysvětluje i
pro moji úroveň  (::
https://www.avrfreaks.net/s/topic/a5C3l000000UchyEAC/t162586
Teď jsem ale mluvil s kolegou, pro kterého to dělám,  a vypadá to, že ten
jeho rotátor má i možnost komunikace přes RS485, takže by to Arduino mohlo
číst snímač ( to mi jde) a pro ten rotátor simulovat
snímač, který má RS485 interface. To by situaci jednoznačně vyřešilo.


Zdravi
Jirka Sloupenský  OK1MWW


<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
Neobsahuje
žádné viry.www.avast.com
<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
<#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>

po 29. 1. 2024 v 16:20 odesílatel Petr Zapadlo <zapik na email.cz> napsal:

> Zdravím,
>
> ještě jedna věc mě napadla - použití digitalRead a digitalWrite možná není
> v této části kodu ideální. Nevím na jakém to máte CPU, ale na běžných
> Atmegách je režie hodně vysoká a možná tam bude nějaký dopad na to
> přerušení.
>
> zkuste se na vašem CPU jednoduchý test:
>
> loop(){
>
> digitalWrite(PIN,0);
>
> digitalWrite(PIN, 1);
>
> }
>
> a pak totéž s přímým přístupem do registru portu:
>
> loop(){
>
> portX |=(1<<BIT);
>
> portX &=~(1<<BIT);
>
> }
>
> Možná budete překvapen jak zásadní změna výsledné frekvence tam je.
>
> Petr
>
>
> Dne 29. 01. 24 v 15:28 Jirka Mww napsal(a):
>
> Díky za připomínku, tohle jsem už opravil, zdá se, že to povolení
> přerušení to vyřešilo, díky všem za pomoc.
>
> Zdravi
> Jirka Sloupenský  OK1MWW
>
>
>
> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail> Neobsahuje
> žádné viry.www.avast.com
> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
>
> po 29. 1. 2024 v 15:09 odesílatel Miroslav Šinko <sinkomiro na gmail.com>
> napsal:
>
>> Arduino kniznice nepoznam, a teda mozno toto nesuvisi s problemom..
>>
>> volatile byte K;
>> ..
>> }while  (K>= 0);
>>
>> Podmienka je vzdy platna, myslim, ze sa vam to ostane cyklit.
>>
>> miro
>>
>> On 29.01.2024 14:07, Jirka Mww wrote:
>> > Dobrý den,
>> >
>> > tak jsem se k tomu zase dostal, dole je zdrojovy kod té přerušovací
>> > rutiny.  K tomu jen pár vysvětlení :
>> > Celé to má sloužit k imitaci snímače absolutního úhlu ,  je to
>> spouštěné
>> > sestupnou hranou CS ( žlutá) , CLKEXT ( fialová)  , jsou hodiny
>> > generované nadřízeným systémem, DOEXT je výstup s daty, měla by se
>> > přenést proměnná TEST1.
>> > V hlavní smyčce programu je aktuálně jen delay (100), jinak se tam nic
>> > nedělá
>> > Proměnná TEST1 se v přerušovací rutině opakovaně plní 0xAAA, takže
>> > riziko, že ji nějak přepíše něco v hlavní smyčce je snad nulové
>> > Když ten řádek, kde se zapisuje , tj.
>> > digitalWrite(DOEXT,bitRead(TEST1,R)); nahradím tím, co je v komentáři (
>> > XREF= !XREF atd...), tj. jen reverzací proměnné XREF
>> > tak to dává data dle obrázku v příloze - žlutá je CS, od toho je to
>> > přerušení, fialová jsou hodiny - oboje generované nadřízeným systémem
>> > Modrá jsou data - tak nějak bych si to představoval , že by to mělo
>> vypadat
>> > Na všech třech drátech mám osciloskop - viz přiložený obrázek
>> > Když to pustím po resetu s tím digitalWrite(DOEXT,bitRead(TEST1,R));
>> tak
>> > mi na osciloskopu nějaká data jednou probliknou, ani nejsou celá, a pak
>> > ten výstup DOEXT ( modrý ) zůstane trvale v nule.
>> >
>> >
>> >
>> >     /*  RUTINA PRo VYSTUP DAT     */
>> > void DataOut() {
>> >     // cli(); // disable global interrupts
>> > volatile byte K;                // pocitadlo pro hodiny
>> > volatile byte R;                // pocitadlo pro vystup bitu
>> > volatile unsigned int  TEST1 = 0xAAA;            // jen pro test
>> > volatile byte  XREF = 0;          // pro vysledek
>> >      K= 10;
>> >      R= 10;
>> >       XREF = 0;
>> > do { digitalRead(CLKEXT);} while (digitalRead(CLKEXT) == HIGH);// ceka
>> > na sest. hranu hodin
>> > delayMicroseconds(30);
>> > do {
>> > do {digitalRead(CLKEXT);} while (digitalRead(CLKEXT) == LOW);// ceka na
>> > vzestupnou hranu, aby zapsal data
>> > delayMicroseconds(3);
>> > digitalWrite (DOEXT,bitRead(TEST1,R)); // tady je problem
>> >      // XREF = !XREF; // tohle dává obrázek na osciloskopu v příloze
>> >      // if ( XREF > 0) {digitalWrite (DOEXT,0);} else { digitalWrite
>> > (DOEXT,1);}
>> > delayMicroseconds(30);
>> >          K= K-1;
>> >          R = R-1;
>> > do {digitalRead(CLKEXT);} while (digitalRead(CLKEXT) == HIGH); // ceka
>> > na sestupnou hranu kdy Master cte data
>> > delayMicroseconds(30);
>> > } while (K>= 0);
>> > do {digitalRead(CLKEXT);} while (digitalRead(CLKEXT) == LOW); //
>> konecny
>> > prechod do jednicky
>> > sei();// enable interrupts
>> > }// konec preruseni
>> >
>> > Zdravi
>> > Jirka Sloupenský  OK1MWW
>> >
>> >
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.czHw-list na list.hw.czhttp://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240129/358d6445/attachment-0001.htm>


Další informace o konferenci Hw-list