Re: Zase Arduino - jak dostat data do přerušení
Miroslav Šinko
sinkomiro na gmail.com
Pondělí Leden 29 15:09:28 CET 2024
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
>
>
Další informace o konferenci Hw-list