Re: Zase Arduino - jak dostat data do přerušení
Martin Záruba
swz na volny.cz
Pondělí Leden 29 14:33:52 CET 2024
Pokud se nemýlím, tak obě verze se liší jen použitím bitRead. Zkuste
místo toho napsat posun TEST1 vpravo o R-1 + and 1
Martin Záruba
Dne 29.1.2024 v 14:07 Jirka Mww napsal(a):
> 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
>
>
> <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>
>
>
>
> ne 28. 1. 2024 v 20:49 odesílatel Jaroslav Buchta
> <jaroslav.buchta na hascomp.cz> napsal:
>
> nebo sem poslat cast zdrojaku...
> Dne 28.01.2024 v 20:09 Jirka Mww napsal(a):
>> Tím to bohužel nebude, v současném stavu tam v hlavní smyčce
>> dávám konstantu a ani ta se celá neposle.Bude to nějaká blbost,
>> asi to chce pauzu...
>>
>> Dne ne 28. 1. 2024 19:03 uživatel Jaroslav Buchta
>> <jaroslav.buchta na hascomp.cz> napsal:
>>
>> Data jsou sdilena v jednom pametovem prostoru, v tom by
>> problem byt nemel. Tipnul bych, ze bude nejaky problem v
>> synchronizaci hlavni smycky a data se prepisou znova driv,
>> nez se odeslou?
>> Dne 28.01.2024 v 19:00 Jirka Mww napsal(a):
>>> Dobrý večer,
>>>
>>> zase se tady trápím s Arduinem. Potřebuji v přerušení od
>>> pinu 2 u Arduino Nano poslat ven dvanáct bitů. Přerušení
>>> vyvolá vstup CS od nadřízeného stroje, pak jdou hodiny asi
>>> po 200 uS a na jejich sestupnou hranu potřebuji posílat ven
>>> data. V podstatě mi to funguje, pokud ta data, co potřebuji
>>> poslat, vytvořím až v té přerušovací proceduře. Nevím ale,
>>> jak tam dostat data, která vyrobím v hlavní smyčce.
>>> Deklaraci té proměnné , co chci poslat, mám jako volatile
>>> unsigned integer , zkoušel jsem i volatile byte, deklaraci
>>> mám v hlavním programu ,zkoušel jsem to deklarovat i v té
>>> přerušovací proceduře, ale nejsem úspěšný. Ta data se
>>> pošlou jen jednou, a ještě ne celá. Pak to vypadá, že se ta
>>> data nějak smažou, nebo co. Posílá to už jen nuly. Bohužel,
>>> ladící výpis tam nejde udělat. Můžete mne prosím zase nějak
>>> nakopnout ?
>>>
>>> Zdravi
>>> Jirka Sloupenský OK1MWW
>>>
>>> _______________________________________________
>>> HW-list mailing list - sponsored bywww.HW.cz <http://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.cz
>> <http://www.HW.cz>
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>>
>> _______________________________________________
>> HW-list mailing list - sponsored bywww.HW.cz <http://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.cz <http://www.HW.cz>
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
>
> _______________________________________________
> HW-list mailing list - sponsored bywww.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/9394395c/attachment.htm>
Další informace o konferenci Hw-list