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