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

Bascom Atmega32 - przechowywanie zmiennej w pamięci ulotnej (SRAM?)

Daniel_GSM 30 Sie 2015 16:47 1014 6
REKLAMA
  • #1 14958478
    Daniel_GSM
    Poziom 25  
    Hej wszystkim. Pytanie moje dotyczy przechowywania kilku zmiennych w pamięci ulotnej i ewentualny zapis wartości tych zmiennych do EEPROM w określonym momencie.
    Program napisany w Bascom i póki co nie mam ochoty przerzucać go do C więc muszę rozwiązać to na aktualnym etapie

    Otóż mam sobie 3 zmienne:

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Zmienne te to nic innego jak licznik czasu pracy jakiegoś urządzenia - licznik uruchamia się w momencie podania "1" do jakiegoś tam wejścia uC.
    Najpierw zlicza sekundy, później minuty i godziny.
    Myślałem, żeby zapis do EEPROM wykonywać w momencie kiedy licznik się zatrzymuje, ale urządzenie uruchamia się i wyłącza kilkanaście razy na godzinę więc i to załatwi mi szybko EEPROM

    Oczywistym jest, że wszystkie 3 zmienne są dla mnie istotne i nie mogą się kasować przy restarcie lub zaniku zasilania.

    Do tej pory ktoś kto pisał program rozwiązał zadanie tak, że wszystkie 3 zmienne były zapisywane w każdej pętli do EEPROM-a - świetnie, tyle, że czas życia EEPROM wynosił 4 miesiące ciągłej pracy a później krzaki przy odczycie wartości z EEPROM.

    Są zdefiniowane takie zmienne:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Chcę to poprawić i stąd moje pytania.
    Mam takie rozwiązanie:
    Podczas normalnej pracy liczniki sekund, minut i godzin są normalnie zwiększane jak do tej pory, ale nie są zapisywane co sekundę do EEPROM-a tylko "wiszą" sobie w pamięci (chyba SRAM).
    Wykorzystuję jedno wejście uC do kontroli zasilania i w przypadku zaniku wartości zapisywane są do EEPROM - czyli raz na ruski rok.
    Oczywiście podtrzymanie zasilania mam zrealizowane na jakieś 10 minut.

    Pytanie
    1. Czy takie zmienne mogą sobie tak "wisieć" w pamięci ulotnej, zmieniać swoją wartość i nie będzie błędów jeśli nie będą zapisywane na bieżąco do EEPROM?
    2. A może muszę dopisać jakieś specjalne instrukcje "zapisywania" tych zmiennych w pamięci ulotnej co jakiś czas żeby mieć pewność, że nie znikną?
    3. Jeśli zanik zasilania może wystąpić raz na 3 miesiące i wtedy będzie zapis do EEPROM to może dla bezpieczeństwa zapisywać dodatkowo dane co 24h do EEPROM - najwyżej stracę wartości z ostatniej doby - a może jednak nawet i tego nie trzeba robić bo nic nie zniknie i się nie wykrzaczy?

    Dzięki za cierpliwość w czytaniu i odpowiedzi :)
  • REKLAMA
  • #2 14958561
    BlueDraco
    Specjalista - Mikrokontrolery
    Zapis do EEPROM - to najwyżej marne milisekundy. Po wykryciu spadku napięcia zasilającego (bez jakiegokolwiek podtrzymania) swobodnie zdążysz zapisać te zmienne do EEPROM przed całkowitym padem zasilania. Potrzebne jest tylko przerwanie przy spadku napięcia.
  • REKLAMA
  • #3 14958574
    Daniel_GSM
    Poziom 25  
    Przerwanie ok, podtrzymanie również

    Bardziej mnie interesują pozostałe kwestie.
    Czy 3 (lub więcej) zmiennych przechowywanych w pamięci RAM (SRAM) czyli ulotnej nie będą się wykrzaczać?
    Czy należy użyć jakiejś specjalnej procedury zapisywania tych zmiennych czy po prostu dopóki Atmega jest zasilana to one będą i ich wartości będą się mogły swobodnie zmieniać
  • REKLAMA
  • #4 14958640
    tmf
    VIP Zasłużony dla elektroda
    Oczywiście pamięć nie może się wykrzaczać tak bez przyczyny. Więc jak najbardziej zmienne te mogą być w pamięci SRAM, a przepisywać je należy np. przy padzie zasilania. Czyli tak jak wykombinowałeś jest zupełnie ok. Z drugiej strony - jeśli zajmujesz tylko 3 bajty, a EEPROM masz kilkaset bajtów to proste techniki wear leveling wydłużą żywotnośc EEPROM kilkadziesiąt-kilkaset razy.
  • REKLAMA
  • #5 14958830
    Daniel_GSM
    Poziom 25  
    Zmiennych do przechowywania w SRAM będę miał kilka.
    Zapisywanie - przy awarii zasilania - a tak to cały czas będą sobie siedzieć w SRAM

    Pytanie jeszcze jedno - trzeba używać jakiś specjalnych komend przy tego typu przechowywaniu zmiennych?
    Jakieś wytyczne? Nie chciałbym bym żeby uC mi się zawieszał bo SRAM będzie zbytnio "zawalona"
    Bascom coś oferuje?

    Fragment kodu do zliczania czasu pracy urządzenia poniżej.
    Wykonuje to w przerwaniu od timera (co 1 sekundę)

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #6 14959136
    BlueDraco
    Specjalista - Mikrokontrolery
    Wszystkie zmienne programu są przechowywane w RAM.

    Kod inkrementacji czasu jest błędny - instrukcje If powinny być skaskadowane - nie ma sensu sprawdzać, czy minuty doliczyły do 60, jeśli wcześniej nie zwiększałeś licznika minut.
  • #7 14972576
    Daniel_GSM
    Poziom 25  
    tmf napisał:
    Z drugiej strony - jeśli zajmujesz tylko 3 bajty, a EEPROM masz kilkaset bajtów to proste techniki wear leveling wydłużą żywotnośc EEPROM kilkadziesiąt-kilkaset razy.


    Mógłbyś podać jakiś przykład jak to wykonać?
REKLAMA