Re: Zase Arduino - jak dostat data do přerušení
Jindrich Fucik
FULDA na seznam.cz
Pondělí Leden 29 16:04:02 CET 2024
Hele, čtu to dobře, že to je SPI nebo synchroní sériák?
Co tě nutí to dělat bit bankingem? Proč nepoužiješ SPI devic přímo v
hardware procesoru?
---------- Původní e-mail ----------
Od: Jirka Mww <jirka.mww na gmail.com>
Komu: HW-news <hw-list na list.hw.cz>
Datum: 29. 1. 2024 14:08:29
Předmět: Re: Zase Arduino - jak dostat data do přerušení
"
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)
(#-wm-DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2)
ne 28. 1. 2024 v 20:49 odesílatel Jaroslav Buchta <jaroslav.buchta na hascomp.
cz(mailto: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(mailto: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 <a rel='noreferrer' href='http://www.hw.cz'>www.HW.cz</a>
<a rel='noreferrer' href='mailto:Hw-list na list.hw.cz'>Hw-list na list.hw.cz</a>
<a rel='noreferrer' href='http://list.hw.cz/mailman/listinfo/hw-list'>http://list.hw.cz/mailman/listinfo/hw-list</a>
"
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz(http://www.hw.cz)
Hw-list na list.hw.cz(mailto:Hw-list na list.hw.cz)
http://list.hw.cz/mailman/listinfo/hw-list
(http://list.hw.cz/mailman/listinfo/hw-list)
"
_______________________________________________
HW-list mailing list - sponsored by <a href='http://www.hw.cz'>www.HW.cz</a>
<a href='mailto:Hw-list na list.hw.cz'>Hw-list na list.hw.cz</a>
<a href='http://list.hw.cz/mailman/listinfo/hw-list'>http://list.hw.cz/mailman/listinfo/hw-list</a>
"
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz(http://www.hw.cz)
Hw-list na list.hw.cz(mailto:Hw-list na list.hw.cz)
http://list.hw.cz/mailman/listinfo/hw-list
(http://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/71b07f67/attachment-0001.htm>
Další informace o konferenci Hw-list