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

[Atmega8535][BASCOM] Błedny odczyt EEPROM

kmieciuNS 24 Kwi 2009 20:40 2038 4
REKLAMA
  • #1 6452931
    kmieciuNS
    Poziom 2  
    Witam,
    W moim programie umieściłem dane typu LONG w pamięci EEPROM
    
    $eeprom                                                     'dane do zapisania w EEPROMie
    Data 0            ' nie uzywany bajt
    Tab_czas1:
    Data 0& , 1& , 2& , 60& , 61& , 75& , 1275& , 1455& , 1456& , 1457& , 2000& , 2001& , 2002& , 2060& , 2061& , 2075&
    Data 3275& , 3455& , 3456& , 3457& , 4000& , 4001& , 4002& , 4060& , 4061& , 4075& , 5275& , 5455& , 5456& , 5457&
    Data 6000& , 6001& , 6002& , 6060& , 6061& , 6075& , 7275& , 7455& , 7456& , 7457&
    Tab_czas2:
    Data 0& , 1& , 2& , 60& , 61& , 75& , 1275& , 1455& , 1456& , 1457& , 2000& , 2001& , 2002& , 2060& , 2061& , 2075&
    Data 3275& , 3455& , 3456& , 3457& , 4000& , 4001& , 4002& , 4060& , 4061& , 4075& , 5275& , 5455& , 5456& , 5457&
    Data 6000& , 6001& , 6002& , 6060& , 6061& , 6075& , 7275& , 7455& , 7456& , 7457&
    
    $data
    Dim Etab_czas1(40) As Eram Long At 1                        'tablica zawiera wszystkie kolejne czasy operacji na zaworach
    Dim Etab_czas2(40) As Eram Long At 161
    ....
    

    Tak zapisane dane odczytuje za pomocą zmiennej tablicowej Etab_czas1 i Etab_czas2.
    
    If Menu_string = "ZWYKLY" Then
             Temp2 = Etab_czas1(n)
          Else
             Temp2 = Etab_czas2(n)
          End If
    

    gdzie: temp2 - zmienna pomocnicza, n - numer od 1 do 40.
    I tu pojawia się problem, otóż w symulacji Bascomem jest wszystko ok (wnioskuje z tego że teoretycznie nie popełniłem błedu), ale jeśli wgram program do procka to ten odczyt jest nie poprawny. Dla każdego odczytu wychodzi -1.
    Dodam jeszcze że jak w programie dodam zapis do EEPROM to późniejszy odczyt jest poprawny, (na zaprogramowanym procku) tzn.
    
    Etab_czas1(1) = 60
    liczba_sekund = Etab_czas1(1)
    

    Co może produkować taki błąd? Jest inny sposób zapisu do pamięci zmiennych LONG w sekcji $eeprom?
  • REKLAMA
  • #2 6457292
    mirley
    Poziom 17  
    Witam

    Oczywiście programując mikrokontroler zaprogramowałeś także EEPROM. Wnioskuję że programujesz procesor także bezpośrednio w Bascomie, (EEPROM jest na drugiej zakładce) :)

    A tak dodatkowo.... czy wydanie polecenia:

    
    Readeeprom Z, 1
    


    powoduje odczyt danej z pierwszej wprowadzonej przez Ciebie komórki (bo zerowej nie używasz). Zmienna Z powinna być takiego typu jak dane. Kolejna dana powinna być pod adresem 5 bo long ma 4 bajty
  • REKLAMA
  • #3 6461581
    kmieciuNS
    Poziom 2  
    Tak, programuje procesor bezpośrednio w Bascomie używając stk200/300.
    Problem rozwiązałem usuwając zmienne
    
    Dim Etab_czas1(40) As Eram Long At 1                        'tablica zawiera wszystkie kolejne czasy operacji na zaworach
    Dim Etab_czas2(40) As Eram Long At 161 
    

    wtedy odczytuje z pamięci właśnie za pomocą
    
    Readeeprom Z, adres_bajtu
    


    Jest to dla mnie trochę dziwne z tymi zmiennymi ERAM. Na pewno są wygodne w użyciu, no ale jak wtedy procesor nie działa jak powinien to muszę z nich zrezygnować. Mam Bascoma 1.11.8.1, wiec jeszcze sprawdzę na nowszej wersji.
  • REKLAMA
  • #5 6950943
    kmieciuNS
    Poziom 2  
    Odpowiadam z sporym opóźnieniem, ale faktycznie problem tkwił w wersji BASCOMA-AVR.
    Teraz mam wersję i co zauważyłem to, że przy tym samym kodzie, zapis do eeprom przy pomocy zmiennych zdefiniowanych jako Eram jest prawidłowy. Obsługa RTC przy pomocy zdefiniowanego zegara: Config clock = soft, też działa sprawniej (tzn, działa wogóle;))
REKLAMA