AVR arduino potize

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Úterý Duben 13 20:06:14 CEST 2021


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



Další informace o konferenci Hw-list