AVR arduino potize

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Úterý Duben 13 21:29:55 CEST 2021


Jo, to bych udelal taky, ale nejdriv bych pouzil STM32 abych nebojoval s 
pameti, nemel problemy s poctem casovacu, neresil ze 64 celociselnych 
bitu je vypocetni problem, na float neni HW podpora a pro ADC a UART 
pouzil DMA...
Ale je to projekt do skoly, material je nejak dan... Samozrejme to jde 
libovolne programovat vlastnimi silami, ale popravde nemam naladu 
zkoumat periferie AVR...
At si mladej zkusi uskali arduino reseni, ono se mu to bude hodit ;-)

Dne 13.04.2021 v 21:22 Pavel Hudecek napsal(a):
>
> Nevím jestli na Arduinu nějak snadno jde si napsat SW úplně svůj se 
> vším všudy, ale já bych:
>
> - Timerem generoval tu PWM
>
> - Tímtéž 1ms přerušení pro svoje další časování
>
> - ADC nechal běžet a generovat přerušení
>
> - Změřené výsledky zpracovávat jako vedlejší činnost ve funkci pro čekání
>
> PH
>
> *Od: *Jaroslav Buchta <mailto:jaroslav.buchta na hascomp.cz>
> *Odesláno:*úterý 13. dubna 2021 21:01
> *Komu: *hw-list na list.hw.cz <mailto:hw-list na list.hw.cz>
> *Předmět: *Re: AVR arduino potize
>
> Tak jsem to trosku prepsal, takhle to na osciloskopu trva 180us a s AD
>
> prevodem necelych 300us. Velke rezervy tam nejsou.
>
> Mimochodem, da se v arduinu nejak jednoduse pouzit ADC asynchronne? Ze
>
> spustim prevod a az je dokoncen, zpracuju, mezitim delam neco jineho... ?
>
> Seriak funguje tusim zasadne synchronne?
>
> int16_t CDataProc::GetSignal()
>
> {
>
>     uint32_t ms = millis();
>
>     if (ms - lastMillis > 0)
>
>     {
>
>         uint16_t sensorValue = (uint16_t)analogRead(A0);
>
>         digitalWrite(13, HIGH);
>
>         cycles++;
>
>         if (firstPass){
>
>             valAvgFilt = ((uint64_t)sensorValue << 24) | 0x7fffffUL;
>
>             valSignalFilt = ((uint32_t)sensorValue << 8) | 0x7f;
>
>             firstPass = false;
>
>         }
>
>         else
>
>         {
>
>             while (ms - lastMillis > 0)
>
>             {
>
>                 lastMillis++;
>
>                 valAvgFilt = (valAvgFilt*(coefAvg-1) +
>
> (((uint64_t)sensorValue << 24) | 0x7fffffUL))/coefAvg;
>
>                 valSignalFilt = (valSignalFilt*(coefSignal-1) +
>
> (((uint32_t)sensorValue << 8) | 0x7f))/coefSignal;
>
>             }
>
>         }
>
>         Message();
>
>         digitalWrite(13, LOW);
>
>     }
>
>     return (int16_t(valSignalFilt >> 8)) - (int16_t(valAvgFilt >> 24));
>
> }
>
> Dne 13.04.2021 v 20:33 Jaroslav Buchta napsal(a):
>
> > Diky za tip s tim casovacem, necekal jsem, ze se da spatne udelat i
>
> > 1ms timer ;-)
>
> > Vypocty to stiha, predtim to bylo jen 32b a chodilo to stejne, kdyz to
>
> > rozsirim na cely program, ktery toho pocita 10x tolik tak se taky nic
>
> > nezmeni. Az budu mit cas, pro zajimavost si udelam pulzy na nejakem IO
>
> > a zmerim, jak to dlouho trva.
>
> >
>
> > Dne 13.04.2021 v 20:28 Martin Locker napsal(a):
>
> >> Ještě teď koukám, že ty výpočty nejsou zcela triviální. Ono násobení
>
> >> a dělení 64-bitových čísel na osmibitu při 16MHz bude chvíli trvat.
>
> >> Nejsem si jist, že se to za 1ms stihne (bude to asi dost na hraně,
>
> >> chtělo by to změřit).
>
> >>
>
> >> S přáním pevného zdraví
>
> >> Martin Locker
>
> >>
>
> >> ----- Původní zpráva -----
>
> >> Odesilatel: Jaroslav Buchta (jaroslav.buchta na hascomp.cz)
>
> >> Datum: 13/04/2021 20:06
>
> >> Příjemce: HW-news (hw-list na list.hw.cz)
>
> >> Předmět: AVR arduino potize
>
> >>
>
> >> Snazim se pomoct se zpracovanim signalu, vzorkovani po 1ms a zda se, ze
>
> >> neco se v knihovnach seka (tipuju obsluhu serv) a za 100ms mi to 
> vynecha
>
> >> tak 2-3 cykly, za sekundu asi 25 takže je to asi celkem rovnoměrné.
>
> >>
>
> >> Dá se nějak pověsit na ISR 1ms od timeru 0? Podle zdrojaku to na 
> nejakou
>
> >> možnost callback fce nevypada (timer1 je použit pro serva)
>
> >>
>
> >> Neřešim zatim teda, jestli to nevynechava i ta přerušeni. Jako
>
> >> doporučuju synovi hodit ten AVR drek po psovi ale zatim rychlou nahradu
>
> >> nemame ;-)
>
> >>
>
> >> Zkousel jsem Nucleo303RE, to funguje i jako arduino hezky ale je to
>
> >> velke. Neco velikosti Arduino Nano s normalnim 32b procesorem neni?
>
> >> (nasel uz nejakou exotiku CM4 ale maji to jen na mouseru a moc se mi to
>
> >> nelibi, odkaz ted nemam)
>
> >>
>
> >> Jo, a jeste to vynechava znaky vysilane na serial, zcela nahodne, nekdy
>
> >> to jede pul minuty bez vypadku, nekdy vypadne znak po par sekundach,
>
> >> nejaky znamy problem? Terminalem to neni, zkousel jsem ruzne ktere mi
>
> >> normalne fungujou na 115200
>
> >>
>
> >> Ono to teda nejak funguje jak jsem to zkorigoval, ale se.e me to...
>
> >>
>
> >> V loop se volaji v redukovane verzi jen tyto metody
>
> >>
>
> >> #define MSGPERIOD   1000
>
> >> void CDataProc::Message()
>
> >> {
>
> >>      uint32_t ms = millis();
>
> >>      if (ms - msgMillis < MSGPERIOD)
>
> >>      {
>
> >>          return;
>
> >>      }
>
> >>      msgMillis += MSGPERIOD;
>
> >>      char s[40];
>
> >>      sprintf (s, "%10lu, %4u, %5u, %5u", msgMillis, cycles,
>
> >> (uint16_t)(valSignalFilt >> 8), (uint16_t)(valAvgFilt >> 24));
>
> >>      Serial.println(s);
>
> >>      cycles=0;
>
> >> }
>
> >>
>
> >> uint16_t CDataProc::GetSignal()
>
> >> {
>
> >>      uint16_t sensorValue = (uint16_t)analogRead(A0);
>
> >>
>
> >>      if (firstPass){
>
> >>          valAvgFilt = ((uint64_t)sensorValue << 24) | 0x7fffffUL;
>
> >>          valSignalFilt = ((uint32_t)sensorValue << 8) | 0x7f;
>
> >>          firstPass = false;
>
> >>      }
>
> >>      else
>
> >>      {
>
> >>          uint32_t ms = millis();
>
> >>          if (ms - lastMillis > 0)
>
> >>          {
>
> >>              cycles++;
>
> >>          }
>
> >>          while (ms - lastMillis > 0)
>
> >>          {
>
> >>              lastMillis++;
>
> >>              valAvgFilt = (valAvgFilt*(coefAvg-1) +
>
> >> (((uint64_t)sensorValue << 24) | 0x7fffffUL))/coefAvg;
>
> >>              valSignalFilt = (valSignalFilt*(coefSignal-1) +
>
> >> (((uint32_t)sensorValue << 8) | 0x7f))/coefSignal;
>
> >>          }
>
> >>      }
>
> >>      Message();
>
> >>      return (int16_t(valSignalFilt >> 8)) - (int16_t(valAvgFilt >> 
> 24));
>
> >> }
>
> >>
>
> >> Vypis vypada takto napr.
>
> >>
>
> >>       53000,  976,   741,   741
>
> >>       54000,  977,   741,   741
>
> >>       55000,  976,   741,   74         //vypadek
>
> >>       56000,  977,   741,   741
>
> >>       57000,  977,   741,   741
>
> >>
>
> >>
>
> >>      188000,  976,   741,   741
>
> >>      189000,  977,   741,   741
>
> >>      190000,  976,   741,   741
>
> >>      191000,  977,   41,   741     //vypadek
>
> >>      192000,  976,   741,   741
>
> >>      193000,  977,   741,   741
>
> >>      194000,  977,   741,   741
>
> >>      15000,  976,   741,   741     //vypadek
>
> >>      196000,  977,   741,   741
>
> >>      197000,  976,   741,   741
>
> >>
>
> >> _______________________________________________
>
> >> 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.cz
>
> >> Hw-list na list.hw.cz
>
> >> 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
>
> _______________________________________________
>
> 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.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/20210413/d6bb3abb/attachment-0001.html>


Další informace o konferenci Hw-list