Mereni napeti baterie pomoci AVR

Milan milger na pobox.sk
Středa Leden 5 19:48:29 CET 2011


Ja o "voze", vy o "koze".
Vy ste si rozdelil algoritmus na male casti, ktore vo vami definovanom 
poradi vykonavate. To je vsetko. Nijako to nesuvisi s RT OS o ktorom hovorim 
ja.
Rozdiel:
U mna kazde vlakno dostane definovany cas na riesenie, po nom bez ohladu na 
stav, mu je odobrany procesor a ide ine vlakno. Vase casti algoritmu sa 
vykonavaju v definovanom poradi, postupne v naprogramovanom poradi a pokial 
nejaka neskonci, dalsia sa neriesi.

Ja to riesenie nekritizujem, je to idealne pokial nemam RT OS, akurat 
hovorim o niecom inom....


Priklad:
/******************************************************************************/
/*        Task 0 'init': Initialize 
*/
/******************************************************************************/
void INITIALIZE (void) _task_ INIT
{                                      //program execution starts here
  os_create_task (EVENT_IFF);           //start command task for UART1
  os_create_task (EVENT_TTV);           //start command task for UART2
  os_delete_task (INIT);               //stop init task (no longer needed)
}

/******************************************************************************/
/*        Task 2 'EVN_S0': event serial channel 0 
*/
/******************************************************************************/
void EVN_IFF (void) _task_ EVENT_IFF
{
  while (1)
  {
.
.
.
  }
}

/******************************************************************************/
/*        Task 3 'EVN_S1': event serial channel 1 
*/
/******************************************************************************/
void EVN_TTV(void) _task_ EVENT_TTV
{
  while (1)
  {
.
.
.
    os_wait (K_TMO, 5, 0);               //wait interval:  0.025 second
  }
}


Milan

----- Original Message ----- 
From: "Michal Gregor" <a2x1nptda8 na email.cz>
To: "HW-news" <hw-list na list.hw.cz>
Sent: Wednesday, January 05, 2011 7:01 PM
Subject: Re: Mereni napeti baterie pomoci AVR


Neberte to doslova! Mam to rozdelene tak aby se nemuselo nic ukladat, zadny
zasobnik, zadne nasilne prepnuti. Rekneme za mi to vezme 10 - 20 instrukci v
asembleru, v Cecku trochu vic je prece jennom dost nenazrane. Na malych
procesorech s par byty RAM a ROM to byla fuska, ale na dnesnich "masinach"
kdy se clovek nemusi bibrat s kazdym bytem je to docela sranda:

S hlavniho programu poustim nekolik vlaken, jedno po druhem:

 while(1) {
    G_Vypisy_Uloha();
    G_LCD_Uloha();
    G_Edit_Uloha();
    Uroven_100mS();
    Reaguj_Na_Zmenu_Vstupu();
    Vynuluj_WDT();
}


Jedno vlakno a jeho ulohy:

// Ulohy vlakna Vypisy
static enum {
 Uloha_Zacatek,
 Uloha_Aktivace,
 Uloha_Over_Bufer,
 Uloha_Vytiskni_Zpravu,
 Uloha_Cekej_Konec_Vysilani
} Uloha;

Rozdeleni vlakna:

void G_Vypisy_Uloha(void) {

 // Úlohy vlákna
    switch( Uloha ) {

  case Uloha_Zacatek:
      Zacatek();
      break;

  case Uloha_Aktivace:
      Aktivace();
      break;

  case Uloha_Over_Bufer:
      Over_Bufer();
      break;

  case Uloha_Vytiskni_Zpravu:
   Vytiskni_Zpravu();
      break;

  case Uloha_Cekej_Konec_Vysilani:
            Cekej_Konec_Vysilani();
      break;

     default:
         Uloha = Uloha_Zacatek;
         break;
    }
}

Treba vypocet CRC, pocita se vzdy jeden byte zpravy:

//***********************************************************
static void Spust_Vypocet_CRC (void) {

 CRC = 0;

 i_Zprava = i_Zacatek_Vypoctu_CRC;

 Uloha = Uloha_Spocitej_CRC_Zpravy;
}
//***********************************************************
// Vytvoří CRC zprávy.
// Výpočet probihá po jednom byte

static void Spocitej_CRC_Zpravy (void) {

 // Výpočet CRC
 CRC = G_Pre_Pocitej_CRC_Pc ( G_Kpo_Zprava[ i_Zprava ] , CRC );
 ++i_Zprava;

 // Konec zprávy?

 if ( i_Zprava > I_KONEC_ZPRAVY_CRC ) {

  // Dokončen výpočet CRC zprávy,
  // připočítat dva nulové byty

  CRC = G_Pre_Pocitej_CRC_Pc( 0, CRC );
  CRC = G_Pre_Pocitej_CRC_Pc( 0, CRC );

  Uloha = Uloha_Uloz_CRC;
 }
 else {

     // Výpočet pokračuje
  Uloha = Uloha_Spocitej_CRC_Zpravy;
 }
}


Staci si dobre rozdelit program na jednotlive ulohy a jde to samo. A neni to
tak slozite, spise se program zjednodusuje.

Jasne pokud se bude pracovat treba na vetsim matematickem vypoctu, ktery
zabere stovky milisekund a nepujde rozdelit, tak bude treba skutecny RTOS.

Michal Gregor






----- Original Message ----- 
From: "Pavel Troller" <patrol na sinus.cz>
To: "HW-news" <hw-list na list.hw.cz>
Sent: Wednesday, January 05, 2011 5:06 PM
Subject: Re: Mereni napeti baterie pomoci AVR


Zdravím,
  rovněž bych to rád věděl. Operačními systémy se zabývám celkem dlouhou
dobu
a samozřejmě platí, že čím jednodušší RTOS, tím menší režie context switche,
ale nulová - to nebylo ani v případě Z80 a jeho systému zdvojených registrů,
takže mezi právě dvěma kontexty se dalo přepínat pomocí EXX ; EX AF,AF' -
ale
i ty byly tuším 6 clocků každá (možná i více), takže ani tam to nebylo
"žádný čas". U Motoroly se dá použít MOVEM.L pro rychlé uložení na zásobník,
což jsou instrukce právě optimalizované pro podobný případ, ale i ty si svůj
čas vezmou. Jednodušší jednočipáky obvykle nemají žádnou hardwarovou podporu
multitaskingu, takže tam se to musí poctivě uložit tam a zpátky. A to
nemluvíme
o realizaci scheduleru jako takového, který, jakmile má být jen trošku
chytřejší než ten nejblbější round-robin, si taky to svoje vezme...
  Zdraví Pavel.

> To sa rad necham poucit ako prepnut vlakno bez rezie.
> Pre x51 som si to pisal z polovice sam a:
> odkladam registre, plnim ich z noveho vlakna, prehadzujem zasobnik
> /bohuzial u x51 musim menit cely, 128B je strasne malo + reentrantny
> zasobnik pre funkcie, inak ho staci prestavit/ a nastavim novy PC + nejake
> drobnosti /systemove casovace.../. Odhadom niekolko 100-vak instrukcii.
> Systemovy timer bezi kazdych 5ms. A nasilne prepnutie /ked vlakno 
> neodovzda
> procesor -Round-robin alebo tak nejako/ je po 2 tikoch t.j. 10ms.
> A vy vravite "ziadny cas" ??? Poradte co robim zle.
>
>
> Milan
> ----- Original Message ----- From: "Michal Gregor" <a2x1nptda8 na email.cz>
> To: "HW-news" <hw-list na list.hw.cz>
> Sent: Wednesday, January 05, 2011 4:11 PM
> Subject: Re: Mereni napeti baterie pomoci AVR
>
>
> Kdyz se to dobre napise, tak prepnuti mezi vlakny nezere zadny cas.
>
> Michal Gregor
>
> ----- Original Message ----- From: "Milan" <milger na pobox.sk>
> To: "HW-news" <hw-list na list.hw.cz>
> Sent: Wednesday, January 05, 2011 3:20 PM
> Subject: Re: Mereni napeti baterie pomoci AVR
>
>
> To riesenie s casovacom je taka dobra klasika, to bude komentovat hodne
> ludi.
> Spomeniem ale riesenie s pouzitim nejakeho RT operacneho systemu, kde sa
> daju zlozitejsie veci, ktore sa neopakuju az tak casto, riesit samostatnym
> vlaknom. Vyhodou je ze nespotrebujete ziadny casovac /teda dokopy iba 
> jeden
> na chod OS/ a aj zlozite algoritmy realizujete efektivne, riesite ich 
> akoby
> samostatne. Nevyhodou to, ze zmysel to ma iba u pomalsich opakovani /nad
> 10ms/ inak su naroky na reziu /prepnutie procesora/ znacne.
> To len na rozsirenie obzoru, neviem ako AVR ale na x51 a ARM to hodne
> pouzivam, pravdu povediac za poslednych 5 rokov som nemal riesenie, kde by 
> v
> jednocipe nebezali aspon 3 samostatne vlakna...
>
> Milan
>
>
> ----- Original Message ----- From: "Michal Grunt" <michal.grunt na vynet.cz>
> To: "HW-news" <hw-list na list.hw.cz>
> Sent: Wednesday, January 05, 2011 12:43 PM
> Subject: RE: Mereni napeti baterie pomoci AVR
>
>
> Jeste se v teto souvislosti zeptam. Kdybych chtel merit (nebo v podstate
> delat cokoliv) jednou za x jednotek casu (radove vteriny ci desitky 
> vterin),
> to se dela pomoci preruseni? Abych nejakou smyckou delay nezablokoval cely
> program. A dela se to tak, ze nastavim ze se bude preruseni generovat
> kazdych x jednotek casu (placnu, preruseni jeste nastudovane nemam, treba
> jednou za 100ms) ja budu v hlavni smycce programu testovat zda se 
> preruseni
> neprovedlo xy krat a pokud ano provedu pozadovany ukon?
>
> ________________________________________
> Odesílatel: hw-list-bounces na list.hw.cz [hw-list-bounces na list.hw.cz] za
> uživatele Pavel Hudeček [edizon na seznam.cz]
> Odesláno: 4. ledna 2011 23:58
> Komu: HW-news
> Předmět: RE: Mereni napeti baterie pomoci AVR
>
> Ano, takto. Hodnoty skoro jakékoli od 1k do 1M, rozumná střední cesta je
> něco kolem 100k. Nebo kdybyste chtěl přejít z vypínače na tlačítko, tak i
> nad 1M, ale možná s tím bude víc práce, neb při velkých hodnotách můžete 
> na
> některých vstupech dojít k různým kalibračním konstantám pro různé režimy
> činnosti MCU.
>
> Pak je ještě jedna alternativní možnost, zcela bez ext. součástek: Jako
> referenci zvolíte napájení (předpokládám, že je natvrdo připojené ke 
> článku)
> a multiplexer přepnete na pomocnou referenci (má asi 1,23 V), změříte její
> napětí v jednotkách odvozených z napájecího. Pak napájecí napětí 
> vypočítáte
> opačným postupem, než obvykle :-)
>
>> Od: Michal Grunt <michal.grunt na vynet.cz>
>> Jake zhruba hodnoty tech odporu?
>>
>>             AD MCU
>>        ____   |   ____
>> Bat --|_R1_|--*--|_R2_|---| gnd
>>
>> Takto?
> _______________________________________________
> 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
_______________________________________________
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ší informace o konferenci Hw-list