Re: Zase Arduino - jak dostat data do přerušení
Jirka Mww
jirka.mww na gmail.com
Pondělí Leden 29 14:07:51 CET 2024
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>
<#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
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 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
>>
>
> _______________________________________________
> 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/86990b1f/attachment-0001.htm>
------------- další část ---------------
A non-text attachment was scrubbed...
Name: TEK0000.BMP
Type: image/bmp
Size: 77878 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240129/86990b1f/attachment-0001.bmp>
Další informace o konferenci Hw-list