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