Mereni napeti baterie pomoci AVR

Milan milger na pobox.sk
Středa Leden 5 22:44:57 CET 2011


V zadani bol 1kB RAM.
Ja som nepovedal ze nemozte pouzit FIFO povedzme na 3x128B na seriove porty 
/to bude pre 10ms stacit aj pre 115kbd/, ale povedal som ze nie dostatok RAM 
na odlozenie 3x500B celej spravy.
Este stale zostava dost RAM pre reziu OS + rezerva.

Cielom bolo ukazat rozdiel v rieseni, nie sa hrat so slovickami...

Milan


----- Original Message ----- 
From: "Pajpach" <pajpach na katedrala.net>
To: "HW-news" <hw-list na list.hw.cz>
Sent: Wednesday, January 05, 2011 10:27 PM
Subject: Re: Mereni napeti baterie pomoci AVR


No bez toho abych tu chtel jednoho ci druheho napadat, zajima me RTOS:
jak v RTOS se switch time 5 (10)ms budete ty vzorove  tri retezce
zpracovavat "zaraz" ve trech vlaknech, kdyz nez na jedno vlakno zbyde cas
tak ztrati 10 (20) znaku z te seriovky pri rychlosti 9600bd?

MP


-----Původní zpráva----- 
From: Milan
Sent: Wednesday, January 05, 2011 10:14 PM
To: HW-news
Subject: Re: Mereni napeti baterie pomoci AVR

Ja som stanovil podmienku ze nemate dostatok RAM, to znamena buffer pouzit
nemozte, musite spracovavat data priamo tak ako prichadzaju.
To znamena ze zadanie tak ako som ho stanovil je bez RTOS neriesitelne.
Chcel som aby vynikol rozdiel v rieseni.

Vsetkym nam je jasne ze ak mame nekonecne vykonny HW, nekonecne mnozstvo RAM
a pod. + nekonecne mnoho programatorov, je riesitelne skoro vsetko za skoro
nulovy cas...ale s neskutocne nekonecnymi nakladmi. :-)

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


Moment ty tri porty bezi soubezne? Mate dve moznosti:
1) Prijmout zpravy do bufru: potrebujeme 3x 500byte. Plus druhy bufer ktery
se pouziva nez se predchazejici zprava zpracuje to uz mame 3000byte.
2) Rozsekat to na jednotlive ulohy, tedy zpracovavat tok dat byt za bytem.
Pak staci par byte na bufer UARTu. Ale delat to u zpravy, ktera ma slozitou
strukturu bych to delat nechtel. Zatim jsem se vzdy vesel do nekolika uloh /
vlakno.

Pokud se pouziva jenom jeden port a ostatni jsou vypnute je situace jina -
nacist 500byte ze zvoleneho portu a zpracovat. Jak jsem jiz psal pro
slozitejsi algoritmy je asi lepsi skutecny RTOS nebo rovnou operacni system
(Win, linux).

Michal Gregor



----- Original Message ----- 
From: "Milan" <milger na pobox.sk>
To: "HW-news" <hw-list na list.hw.cz>
Sent: Wednesday, January 05, 2011 9:18 PM
Subject: Re: Mereni napeti baterie pomoci AVR


Otazka je skor co je efektivnejsie a vyzaduje menej prace...

Napr. takyto problem:
Dostavate data zo ser.portu. prichadza sprava na ktoru musite nejako
reagovat. Predpokladajme,  na to aby ste vedel co mate robit potrebujete do
hlbky postupne dekodovat povedzme prvych 500byte. To mame 256^500
kombinacii. Predpokladajme ze sa vyuziva len mala cast moznych kombinacii a
algoritmus ktory to riesi ma 5000 riadkov a je nenarocny na RAM.
Dalej predpokladajme ze take ser. porty mate 3 a potrebujete ich opracovat
rovnako, hoci data z nich prichadzaju roznou rychlostou.
RAM pamet je u malych jednocipov dost obmedzeny artikel, povedzme ze zotava
uz len 1kB. Jednoducho malo na ulozenie 3 celych sprav.

Ja spustim 5000riadkovy algoritmus 3x na 3 ser.porty a kedze algoritmus na
dekodovanie spravy je znamy, cele to rozchodim do 30min.

Zaujima ma ako si poradite vy, ako to vyriesite?
Pripadne vymyslite zadanie vy tak, aby ste sa nenarobil a ja som to mal
zlozite.


Milan

P.S. Samozrejme ze som to cele "pritiahol za vlasy" iba koli efektu, ale
realne zadanie bolo dekodovat asi 50B a algoritmus co to riesil mal asi 500
riadkov. RAM zostavalo 250B.

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


Ale vysledek je stejny, bezi vice vlaken najednou.

Co je lepsi? RTOS, ktery to resi za programatora, ale sezere spoustu
prostredku? Nebo program ktery je od pocatku rozdelen a ma malou rezii?


Michal Gregor


----- Original Message ----- 
From: "Milan" <milger na pobox.sk>
To: "HW-news" <hw-list na list.hw.cz>
Sent: Wednesday, January 05, 2011 7:48 PM
Subject: Re: Mereni napeti baterie pomoci AVR


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

_______________________________________________
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