Sari la conținut

memorare stare port la un microcontroler


dan_e

Postări Recomandate

La multi ani,

 

Incep primul subiect tehnic din acest an. Incep de ceva vreme sa aprofundez microcontrolere. Am programat pe ici pe colo, ba PICuri, ba Atmeluri, dar de curand m-am lovit de o problema care nu prea o inteleg eu bine. Poate e cineva dornic sa ma lumineze.

Am o aplicatie care ruleaza intr-un microcontroler, unde am folosit un port de 8 bit ca iesire. E vorba de un microcontroler pe 8bit de la Atmel AVR. La un moment dat, aplicatia lucreaza si portul respectiv ia o anumita valoare, sa zicem: 01001110. Dupa asta, se intrerupe accidental alimentarea microcontrolerului si eu as vrea sa revina la ultima stare inregistrata de portul de iesire, dar nu stiu cum sa fac asta?

putin ajutor va rog!

 

Si La multi ani tuturor celor care poarta numele de Vasile sau Vasilica.

 

stima

dan

Editat de dan_e
Link spre comentariu
Distribuie pe alte site-uri

si portul respectiv ia o anumita valoare, sa zicem: 01001110. Dupa asta, se intrerupe accidental alimentarea microcontrolerului si eu as vrea sa revina la ultima stare inregistrata de portul de iesire, dar nu stiu cum sa fac asta?

 

O idee:

 

Imediat dupa citire sa stocheze acea valoare in memoria EEPROM.

Daca se intampla ceva si se intrerupe alimentarea, la reinitializare mc-ului sa atribuie ca initiala acea valoare din EEPROM, astfel avand valoarea dinainte de intrerupere.

Link spre comentariu
Distribuie pe alte site-uri

Sa vedem daca am inteles. La inceputul programului, cand se definesc porturile de intrare si de iesire, va trebui sa fac programul sa seteze starea portului de iesire in functie de ultima valoare scrisa in EEPROM? Corect? Si daca nu e nimic scris in EEPROM (asta se intampla cand dau drumul pentru prima data la program)? Sa fac programul sa aloce valoare standard de iesire? Bun, bun, dar cum fac sa suprascriu de fiecare data acelasi registru din EEPROM? Vreau sa folosesc acelasi registru pentru ca nu ma intereseaza sa memorez un istoric a starilor inregistrate de portul de iesire.

 

stima

dan

Link spre comentariu
Distribuie pe alte site-uri

DACA exista variabila x in eeprom

PORT = x;

ALTFEL PORT = valoare standard de iesire;

 

Apoi la calcularea valorii portului

PORT = valoare calculata;

x_eeprom = valoare calculata;

 

Iar daca se intrerupe alimentarea, la reinitializare PORT va lua valoarea x din eeprom.

 

-----

 

Iar pentru stocarea/citirea valorii din EEPROM, am folosit asa ceva:

tip EEMEM E_x;

eeprom_read_word((void*)&E_x);

eeprom_write_word((void*)&E_x,y);

 

-

Link spre comentariu
Distribuie pe alte site-uri

Eu as rezolva problema diferit

Dau exemplul pentru AVR ca sunt mai familiarizat cu ele.

Alimentezi MCU din sursa ta normala dar si dintr-o celula de litiu de 3V (CR2032 sau mai mica) inseriata cu o dioda care are 0.7-0.8V tensiune directa.

Setezi BOD (Brown out Detection) la nivelul de 2.7V sa-ti genereze o intrerupere (fara reset) ca sa poti detecta cand dispare tensiunea de alimentare.

Cand dispare tensiunea de alimentare MCU intra automat in rutina de de intrerupere BOD, unde pui MCU in sleep (sau power save).

La revenirea tensiunii iesi din modul sleep si intrii in fuctionare normala, astfel porturile nu-si vor pierde valoarea.

 

In concluzie ai nevoie de o celula de litiu de 3V si o dioda + si cateva linii de cod. Dioda are dublu rol, de a nu lasa tensiunea de alimentare sa distruga celula de litiu, dar si de a asigura o tensiune de alimentare de 3V-0.8V=2.2V care face ca BOD-ul sa asigure detectia scaderii tensiunii, dar tensiunea sa fie suficienta pentru a mentine starea porturilor (si a registrilor interni) - Daca aplicatia ta functioneaza cu clk redus, sau caderile de tensiune nu sunt foarte lungi poti sa lasi MCU sa functioneze cu celula de litiu fara sa mai intrii in modul sleep sau power save.

RR

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

revin cu o erata la ce am scris mai sus.

solutia hardware cu o dioda si o celula de litiu e buna, dar nu trebuie activat BOD (Brown out Detector) pentru ca va genera un reset si va initializa (sterge) porturile, deci aveti grija ca BOD sa nu fie activ.

In rest daca vreti sa detectati caderea de tensiune puteti sa generati o intrerupere cu comparatorul analogic, sau cu o intrare ADC, daca vreti sa puneti MCU in sleep.(pentru caderi de tensiune de lunga durata)

RR

 

PS - solutia asta merge la fel si la PIC sau MSP430.

succese maxime.

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.
×
×
  • Creează nouă...

Informații Importante

Folosim cookie-uri și tehnologii asemănătoare pentru a-ți îmbunătăți experiența pe acest website, pentru a-ți oferi conținut și reclame personalizate și pentru a analiza traficul și audiența website-ului. Înainte de a continua navigarea pe www.tehnium-azi.ro te rugăm să fii de acord cu: Termeni de Utilizare.

ATENTIE !!! Functionarea Tehnium Azi depinde de afisarea de reclame.

Pentru a putea accesa in continuoare site-ul web www.tehnium-azi.ro, va rugam sa dezactivati extensia ad block din browser-ul web al vostru. Dupa ce ati dezactivat extensia ad block din browser dati clic pe butonul de mai jos.

Multumim.

Apasa acest buton dupa dezactivarea extensiei Adblock