logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Bascom Powerdown - jak przechować zmienną bez zapisu do EEPROM?

seradam 19 Lut 2009 13:32 2418 7
  • #1 6173038
    seradam
    Poziom 17  
    Posty: 297
    Pomógł: 5
    Ocena: 14
    Mam pytanie do doświadczonych kolegów. Mam urządzenie , które włącza się przez reset watchdoga co 128 ms. Działa przez kilka ms i znowu wchodzi w tryb powerdown. W cyklu , kiedy działa sprawdza stan baterii, z której jest zasilane. Chcę zrobić alarm wyczerpanej baterii, ale nie chcę , żeby sygnalizował stale, tylko np piknięcie głośnika i błysk diody co jakiś czas. Wiadomo ,że cały bój jaki toczę jest o zużycie prądu. Dlatego staram się zminimalizować czas potrzebny procesorowi do wykonania wszystkich zadań. Czy poza zapisem do eepromu procesora jest jakaś metoda , na przechowanie zmiennej , sposób na zliczanie cykli ? EEprom też mi długo nie wytrzyma , jak będę go bombardował 8 razy na sekundę.
  • #2 6173183
    shadow0013
    Poziom 34  
    Posty: 2135
    Pomógł: 243
    Ocena: 313
    Jeśli korzystasz z RTC masz tam do dyspozycji RAM na przechowanie zmiennej, ewentualnie zewnętrzna pamięć SRAM z interfejsem SPI (np. 23X256).
  • #3 6173192
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    Dyrektywa $NORAMCLEAR i po problemie:
    Przeznaczenie:
    
    Instruuje kompilator by nie umieszczał w procedurze inicjalizacji fragmentu czyszczącego zawartość pamięci.
    
    Składnia:
    
    $NORAMCLEAR
    
    (c) Zbigniew Gibek, 2002-2005   (c) MCS Electronics, 1999-2005
  • #4 6174204
    seradam
    Poziom 17  
    Posty: 297
    Pomógł: 5
    Ocena: 14
    Nie jestem taki pewien. Dalej w opisie $noramclear jest napisane , że zawartość komórek pamięci nie zostanie skasowana , co nie oznacza , że pozostaną w niej zmienne, a raczej , że pozostaną w niej wartości przypadkowe.
    Cytat:
    Prawdopodobnie będą one wypełnione wartością &H0FF , choć nie jest to pewne.

    Rozważam pomysł wykorzystania generatora liczb losowych , który tylko przy wygenerowaniu konkretnej liczby bysygnalizował słabą baterię.
  • #5 6174362
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    seradam napisał:
    Nie jestem taki pewien. Dalej w opisie $noramclear jest napisane , że zawartość komórek pamięci nie zostanie skasowana , co nie oznacza , że pozostaną w niej zmienne, a raczej , że pozostaną w niej wartości przypadkowe.
    Jeśli napięcie zasilania nie spadnie poniżej poziomu podtrzymania pamięci SRAM to stan komórek pamięci nie zostanie podczas resetu zmieniony (nie dotyczy to rejestrów specjalnych i rejestrów I/O).

    Cytat:
    Prawdopodobnie będą one wypełnione wartością &H0FF , choć nie jest to pewne.
    Tak jest kiedy napięcie zasilania spadnie poniżej wartości podtrzymania pamięci - ile dokładnie trzeba poszukać w datasheecie. Zazwyczaj nie jest to wartość 255 a losowa.
  • #6 6174488
    seradam
    Poziom 17  
    Posty: 297
    Pomógł: 5
    Ocena: 14
    Nie znam się dlatego piszę.
    Jednak czytam i staram się zrozumieć. To co piszesz ma sens. Ale jeżeli wprowadzam procesor w tryb powerdown , to tak jakbym go wyłączył.
    Właśnie studiowałem dokumentację mojego procka atmega88 i niestety nie ma tam wzmianki o zasilaniu pamięci . Tak czy inaczej sprawdzę to.
    Trochę mam utrudnione zadanie, bo nie mam wyświetlacza i ciężko się operuje na zmiennych. Ciekawe , czy po wybudzeniu procek się połapie jaka wartość należy do jakiej zmiennej. Tak czy inaczej mam już alternatywne rozwiązanie.
  • #7 6174548
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    seradam napisał:
    Nie znam się dlatego piszę.
    Jednak czytam i staram się zrozumieć. To co piszesz ma sens. Ale jeżeli wprowadzam procesor w tryb powerdown , to tak jakbym go wyłączył.
    No nie do końca, pamięć jest niezmieniana i podtrzymywana.
    seradam napisał:
    Właśnie studiowałem dokumentację mojego procka atmega88 i niestety nie ma tam wzmianki o zasilaniu pamięci . Tak czy inaczej sprawdzę to.
    Napięcie podtrzymania pamięci na pewno jest poniżej napięcia zasilania - więc nie masz się czym martwić.
    seradam napisał:
    Ciekawe , czy po wybudzeniu procek się połapie jaka wartość należy do jakiej zmiennej. Tak czy inaczej mam już alternatywne rozwiązanie.
    Zmienne w danym skompilowanym programie są zawsze w tym samym miejscu (w raporcie kompilacji masz nawet podane wszystkie adresy - ale w tym momencie nie jest to potrzebne), więc nie będzie z tym problemu.
  • #8 6174630
    pixel7
    Poziom 24  
    Posty: 656
    Pomógł: 53
    Ocena: 160
    Używam tej komendy z watchdogiem. Zawartość pamięci pozostaje bez zmian. Zasilanie jest cały czas takie same. Z resztą co za problem sprawdzić samemu?

Podsumowanie tematu

✨ Dyskusja dotyczy sposobów przechowywania zmiennej w mikrokontrolerze pracującym w trybie powerdown z resetem watchdog co 128 ms, przy minimalizacji zużycia energii i unikaniu częstego zapisu do EEPROM, który szybko się zużyje. Proponowane rozwiązania obejmują wykorzystanie pamięci RAM w RTC lub zewnętrznej pamięci SRAM z interfejsem SPI (np. 23X256). Wspomniano dyrektywę kompilatora $NORAMCLEAR, która zapobiega czyszczeniu pamięci RAM podczas inicjalizacji, co pozwala na zachowanie wartości zmiennych między resetami, choć wartości te mogą być przypadkowe. Podkreślono, że jeśli napięcie zasilania nie spadnie poniżej poziomu podtrzymania pamięci SRAM, zawartość RAM pozostaje niezmieniona podczas resetu, co umożliwia zliczanie cykli bez zapisu do EEPROM. W przypadku mikrokontrolera Atmega88 brak jest informacji o podtrzymaniu zasilania pamięci w dokumentacji, jednak zmienne są zawsze umieszczone pod tymi samymi adresami w pamięci, co ułatwia ich identyfikację po wybudzeniu. Całość rozwiązania opiera się na zachowaniu pamięci RAM podczas krótkich resetów i trybu powerdown, co pozwala na efektywne monitorowanie stanu baterii i sygnalizację alarmu bez nadmiernego zużycia energii.
Wygenerowane przez model językowy.
REKLAMA