Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[BASCOM] Zmienne w EEPROM typu Overlay

xury 19 Nov 2009 21:29 2222 5
Optex
  • #1
    xury
    Automation specialist
    Czy można używać zmiennych typu Overlay w EEPROM ?

    Chcę zrobić mniej więcej coś takiego:

    Code:

    $eeprom
    Adres0:
    Data 0
    Smsc:
    Data "48790998250"
    $data

    a potem na ten obszar nałożyć zmienną
    Code:
    Dim Smsc As Eram String * 11 at  $1 Overlay  


    I odczytywać w programie jak zmienną zamiast używania ReadEeeprom ?
    Teoretycznie powinno to działać. Po prostu nie chcę używać ReadEeprom bo mi komplikuje dalszy kod, a nie chcę też wstawiać zmiennych bezpośrednio w EEPROM , bo wtedy po każdym resecie uC będzie zapisywał tę pamięć.
    Potrzebne mi to jest do tego, bo będę budował zmienną PDU z kilku innych zmiennych zapisanych w EEPROM.
  • Optex
  • #2
    mirekk36
    Level 42  
    xury wrote:

    .... a nie chcę też wstawiać zmiennych bezpośrednio w EEPROM , bo wtedy po każdym resecie uC będzie zapisywał tę pamięć.


    uC sam nic nie będzie zapisywał w EEPROM'ie o ile sam mu tego nie nakażesz. Może coś źle zrozumiałeś czytając helpa czy jak?

    Bardzo łatwo jest zdefiniować zmienne właśnie z dodatkiem "As Eram" i po zawodach.

    To czy do zmiennej będzie coś zapisywane czy nie zależy tylko od ciebie.

    Ja zwykle robię sobie zmienną w pamięci EEPROM i w RAM. Przy starcie procka odczytuję zmienną z EEPROM i wczytuję do RAM - później się wygodnie posługuję tylko tą zmienną w RAM. Jednak gdy zachodzi potrzeba zmiany zmiennej w RAM - to jednocześnie zmieniam ją w EEPROM - aby po ponownym restarcie zawsze była aktualna wartość, np:

    Code:
    Dim eeprom_zmienna As Eram Byte
    
    Dim zmienna As Byte


    Gdzieś przed pętlą główną - o ile to jest konieczne:

    Code:
    zmienna = eeprom_zmienna


    i dalej jak pisałem wyżej działam sobie na zmiennej w RAM'ie, A gdy muszę zmienić jej wartość to przy okazji robię:

    Code:
    eeprom_zmienna = zmienna


    Tzn tak robiłem gdy pisałem w Bascomie ;)
  • Optex
  • #3
    xury
    Automation specialist
    Jak zwykle można na Ciebie liczyć mirekk36
    Zmienne w EEPROM są mi potrzebne z dwóch powodów: aby zaoszczędzić RAM i aby w późniejszym czasie napisać sobie program dla Windows, który dałby mi możliwość edycji samego EEPROM.
    W eeprom chcę zapisać numery telefonów i fragmenty ciągu SMS w PDU. Następnie w zależności od sytuacji chcę składać z tych zmiennych jedną zmienną w RAM - czyli cały ciąg PDU do wysłania do telefonu.

    Jednak jest problem:
    Poniższa konstrukcja nie chce działać dla zmiennych tekstowych w EEPROM :
    PDU = segment1 + segment2

    PDU to zmienna tekstowa w RAM.
    Dla zwykłych zmiennych w ram działa wyśmienicie, ale nie mam już wolnej pamięci by trzymać te wszystkie zmienne w RAMie. (Atmega8)

    Nie wiem czy to ograniczenia BASCOM czy specyfiki odczytu z EEPROM.
    Chyba czas na przejście na C.
    dodane
    mirekk36 wrote:
    xury wrote:

    .... a nie chcę też wstawiać zmiennych bezpośrednio w EEPROM , bo wtedy po każdym resecie uC będzie zapisywał tę pamięć.


    uC sam nic nie będzie zapisywał w EEPROM'ie o ile sam mu tego nie nakażesz. Może coś źle zrozumiałeś czytając helpa czy jak?

    Bardzo łatwo jest zdefiniować zmienne właśnie z dodatkiem "As Eram" i po zawodach.

    To czy do zmiennej będzie coś zapisywane czy nie zależy tylko od ciebie.


    No właśnie jeśli w programie przed pętlą główną nadam wartości zmiennym w eeprom
    np.
    zm_eeprom = "jakis tekst"
    to po resecie program wystartuje od nowa i zapisze z powrotem wartości początkowe w programie do eeprom ?
  • Helpful post
    #4
    arnoldziq
    Moderator of Programming
    xury wrote:
    No właśnie jeśli w programie przed pętlą główną nadam wartości zmiennym w eeprom
    np.
    zm_eeprom = "jakis tekst"
    to po resecie program wystartuje od nowa i zapisze z powrotem wartości początkowe w programie do eeprom ?


    W takim przypadku, po każdym resecie zmienna będzie nadpisywać nową ( taką samą ) zawartością.
    Jeżeli przewidujesz 1 reset co kilka dni, to nie problem, ale częstsze resety mogą spowodować wyczerpanie cyklów zapisu EEPROM.

    Można łatwo to obejść : przed każdym zapisem zm_eeprom, sprawdź, czy zawartość już się tam nie znajduje i czy nie jest to ta sama, oczekiwana zawartość.
  • Helpful post
    #5
    mirekk36
    Level 42  
    xury wrote:

    No właśnie jeśli w programie przed pętlą główną nadam wartości zmiennym w eeprom
    np.
    zm_eeprom = "jakis tekst"
    to po resecie program wystartuje od nowa i zapisze z powrotem wartości początkowe w programie do eeprom ?


    posłuchaj - jeśli potrzebujesz zapisać domyślnie

    zm_eeprom = "jakis tekst"

    to robisz to tylko wtedy jeśli wszystkie komórki tej zmiennej mają wartość 0xFF przy starcie - co oznacza, że procek był pierwszy raz zaprogramowany i EEPROM jest czysty albo gdy EEPROM został skasowany w całości.

    Dzięki temu ta twoja opercja powyżej dokona się tylko raz! i po zawodach

    chyba to proste łatwe i szybkie rozwiązanie ;) ?

    Jeśli chodzi o twoje powyższe problemy z brakiem ilości pamięci RAM na zmienne tekstowe - no to już tu ci nie pomogę ;) bo, albo:

    1. coś za dużo tych zmiennych tworzysz i to normalne że w tak małym procku szybko kończy się RAM - więc trzeba by było dać większy procek z dużo większą ilością RAM jak dla ciebie

    2. albo coś bardzo źle przemyślałeś działanie całości , że aż tyle zmiennych tekstowych tworzysz. O ile jeszcze zrozumiałbym potrzebę jakiegoś większego bufora na nadchodzący SMS - to po jakiego grzybka ty chcesz to zapisywać w pamięci EEPROM - toż to czysta strata zasobów i cieżko mi wymyśleć na jaką okazję zapisywać w EEPROMie nadlatujące fragmenty SMSów - może musisz od nowa przemyśleć działanie całego programu i wtedy okaże się, że spokojnie wystarczy ci ATmega8

    pozdr
  • #6
    xury
    Automation specialist
    Ja nie chcę zapisywać w eeprom nadlatujących SMSów tylko fragmenty ramki PDU. które będę wysyłał. A chcę je tam zapisać by mieć możliwość szybkiej zmiany, kiedy sobie napiszę program do zmiany zawartości eeprom. Staram się napisać program tak elastycznie, by zmiana danych w eeprom, była przez program w uC "do przełknięcia, Czyli jeśli nawet zmienię długość danej w eeprom program odczyta tą daną poprawnie.
    W czasie normalnego działania programu nic nie będzie zapisywane do eeprom, tylko odczyt. Czyli te dane w eeprom pracują głownie jako stałe.
    Po cżęści (na razie tylko w moim umyśle) rozwiązałem ten problem.
    Nie zastosuję zmiennych tylko linie data w eeprom, a program podczas inicjalizacji sprawdzi długośc ciągów w eeprom i zapisze je do zmiennych w RAM. Następnie kiedy zajdzie potrzeba odczytu zawartości i wysłania całej ramki PDU to będę próbował wysłać je przez UART bajt po bajcie.
    Program będzie odczytywał, fragmenty PDU i składał wszystko w zmiennej w RAM. Zastosuję funkcję z przekazywaniem parametrów do niej.
    Po krótce opiszę jak to będzie działać:
    Po wywołaniu alarmu z centrali alarmowej, ATmega8 (oczywiście przez podłączony telefon)będzie dzwonić na numer zapisany w eeprom, a następnie wysyłać SMS na ten numer. Opcjonalnie też wyśle SMS na inny numer.
    Ponadto będzie odbierać SMSy i na podstawie ich treści sterować centralą alarmową i opcjonalnie innymi urządzeniami. Po odebraniu rozkazu SMS będzie wysyłać SMS zwrotny z potwierdzeniem wykonania.
    Numery telefonów i rozkazy będą mogły być zmieniane, bez konieczności zmiany w kodzie uC. Dlatego będą umieszczone w eeprom, gdzie zewnętrzny program będzie miał możliwość ich zmiany bez ingerowania w kod uC. Kod uC ma się dostosować do zmiany długości SMS i zmiany numerów telefonów, a nie odwrotnie. Odbiór i wysyłanie tylko w formacie PDU, ale już napisałem (raczej pożyczyłem kod do konwersji PDU >TXT i TXT>PDU) sobie parsowanie danych przychodzących i wychodzących.

    Twoje rady jak zwykle skłaniają do myślenia kolego mirekk36.
    Zostałem jednak przy Readeeprom, ale podpowiedzi się przydały i tak. Ja jak zwykle łapię po paru dniach :)