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

[ATMEGA8][BASCOM] błędny zapis do eepromu

kaerb 29 Sty 2010 08:15 1614 2
REKLAMA
  • #1 7609379
    kaerb
    Poziom 12  
    Witam wszystkich,

    Mam układ, który po I2C zapisuje mi do pamięci 24c256 16 bajtów jeden po drugim. Robi tak co 3 minuty, procedura wygląda w ten sposób, że odczytuje adres zapisany w 4 i 5 komórce, zwiększa go o 1 po każdym zapisie a potem zapisuje do komórki 4 i 5."
    W komórce 1 i 2 zapisana jest ilość pozycji, pod koniec procedury zapiszdane wartość jest odczytywana, zmniejszana i zapisywana - potrzebne przy innych operacjach

    
    'zapis do eepromu
    Sub Zapis(byval Adres As Word , Byval Dana As Byte)
    Adresh = High(adres)
    Adresl = Low(adres)
    I2cstart
    I2cwbyte 160
    I2cwbyte Adresh
    I2cwbyte Adresl
    I2cwbyte Dana
    I2cstop
    Waitms 7
    End Sub
    
    'odczyt z eepromu
    Function Odczyt(byval Adres As Word) As Byte
    Adresh = High(adres)
    Adresl = Low(adres)
    I2cstart
    I2cwbyte 160
    I2cwbyte Adresh
    I2cwbyte Adresl
    I2cstart
    I2cwbyte 161
    I2crbyte Dana , Nack
    I2cstop
    Odczyt = Dana
    End Function
    
    'zapisywanie danych, A- przykładowa zmienna
    Zapiszdane:
    
    Adresh = Odczyt(4)
    Adresl = Odczyt(5)
    Adres = Makeint(adresl , Adresh)
    
    Pomzap = Val(godziny)
    Call Zapis(adres , Pomzap)
    Adres = Adres + 1
    
    Pomzap = Val(minuty)
    Call Zapis(adres , Pomzap)
    Adres = Adres + 1
    
    
    Pomzap = Val(A)
    Call Zapis(adres , Pomzap)
    Adres = Adres + 1
    
    
    Pomzap = Val(A)
    Call Zapis(adres , Pomzap)
    Adres = Adres + 1
    
    Pomzap = Val(A)
    Call Zapis(adres , Pomzap)
    Adres = Adres + 1
    
    
    Pomzap = Val(A)
    Call Zapis(adres , Pomzap)
    Adres = Adres + 1
    
    
    Pomzap = Val(A)
    Call Zapis(adres , Pomzap)
    Adres = Adres + 1
    
    
    Pomzap = Val(A)
    Call Zapis(adres , Pomzap)
    Adres = Adres + 1
    
    
    Pomzap = Val(A)
    Call Zapis(adres , Pomzap)
    Adres = Adres + 1
    
    
    Pomzap = Val(A)
    Call Zapis(adres , Pomzap)
    Adres = Adres + 1
    
    Pomzap = Val(A)
    Call Zapis(adres , Pomzap)
    Adres = Adres + 1
    
    Call Zapis(adres , X)
    Adres = Adres + 5                                           'do pełnych 16 bajtow
    
    Adresl = Low(adres)
    Adresh = High(adres)
    
    Call Zapis(4 , Adresh)
    Call Zapis(5 , Adresl)
    
    Gosub Ilezostalo
    Wpamiec = Wpamiec - 1
    Adresh = High(wpamiec)
    Adresl = Low(wpamiec)
    Call Zapis(2 , Adresh)
    Call Zapis(3 , Adresl)
    
    Return
    
    
    Ilezostalo:
    Adresh = Odczyt(2)
    Adresl = Odczyt(3)
    Wpamiec = Makeint(Adresl , Adresh)
    Return
    


    Pierwsze dwa bajty to godzina i minuta. Program chodził caaaałą noc wyłączyłem urządzenie o 6:01. Zerknijcie na odczyt z eepromu:


    0000: 00FF 00FF 0007 0021 0000 00F8 00FF 00FF ˙˙.!.ř˙˙
    0008: 0005 0013 0034 000F 0020 001D 0015 0009 ..4.....
    0010: 0026 004C 0008 0000 00FF 00FF 00FF 00FF &L..˙˙˙˙
    0018: 0005 0016 0034 000F 0020 002D 0015 0009 ..4..-..
    0020: 0027 001D 0006 0000 00FF 00FF 00FF 00FF '...˙˙˙˙
    0028: 0005 0019 0034 000F 0020 0046 0015 0009 ..4..F..
    0030: 0027 001A 0005 0000 00FF 00FF 00FF 00FF '...˙˙˙˙
    0038: 0005 001C 0034 000F 0020 0051 0015 0009 ..4..Q..
    0040: 0027 000B 0007 0000 00FF 00FF 00FF 00FF '...˙˙˙˙
    0048: 0005 001F 0034 000F 0021 0002 0015 0009 ..4.!...
    0050: 0027 0024 0007 0000 00FF 00FF 00FF 00FF '$..˙˙˙˙
    0058: 0005 0022 0034 000F 0021 0009 0015 0009 ."4.!...
    0060: 0026 005F 0006 0000 00FF 00FF 00FF 00FF &_..˙˙˙˙
    0068: 0005 0025 0034 000F 0020 0009 0015 0009 .%4.....
    0070: 0027 002A 0006 0000 00FF 00FF 00FF 00FF '*..˙˙˙˙
    0078: 0005 0028 0034 000F 0020 0003 0015 0009 .(4.....
    0080: 0027 0012 0006 0000 00FF 00FF 00FF 00FF '...˙˙˙˙
    0088: 0005 002B 0034 000F 001F 0061 0015 0009 .+4..a..
    0090: 0027 0032 0008 0000 00FF 00FF 00FF 00FF '2..˙˙˙˙
    0098: 0005 002E 0034 000F 0020 0022 0015 0009 ..4.."..
    00A0: 0027 0037 0006 0000 00FF 00FF 00FF 00FF '7..˙˙˙˙
    00A8: 0005 0031 0034 000F 0020 0037 0015 0009 .14..7..
    00B0: 0027 0024 0006 0000 00FF 00FF 00FF 00FF '$..˙˙˙˙
    00B8: 0005 0034 0034 000F 0020 002B 0015 0009 .44..+..
    00C0: 0027 000F 0006 0000 00FF 00FF 00FF 00FF '...˙˙˙˙
    00C8: 0005 0037 0034 000F 0020 0026 0015 0009 .74..&..
    00D0: 0027 001F 0005 0000 00FF 00FF 00FF 00FF '...˙˙˙˙
    00D8: 0005 003A 0034 000F 0020 001E 0015 0009 .:4.....
    00E0: 0027 0027 0009 0000 00FF 00FF 00FF 00FF ''..˙˙˙˙
    00E8: 0006 0001 0034 000F 001F 0038 0015 0009 ..4..8..
    00F0: 0028 0006 000A 0000 00FF 00FF 00FF 00FF (...˙˙˙˙
    00F8: 0005 0010 0034 000F 0020 003C 0015 0009 ..4..<..
    0100: 0026 0044 0007 0000 00FF 00FF 00FF 00FF &D..˙˙˙˙
    0108: 00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF ˙˙˙˙˙˙˙˙
    0110: 00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF ˙˙˙˙˙˙˙˙
    0118: 00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF ˙˙˙˙˙˙˙˙
    0120: 00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF ˙˙˙˙˙˙˙˙
    0128: 00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF ˙˙˙˙˙˙˙˙
    0130: 00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF ˙˙˙˙˙˙˙˙
    0138: 00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF ˙˙˙˙˙˙˙˙
    0140: 00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF ˙˙˙˙˙˙


    Pogrubione to godziny. I teraz widzimy, że pod F8 jest godz. 5:16, a następny zapis jest w komórce nr 8 o godz. 5:19. Widać też, że wyłączyłem o 6:01 bo dalej już skubaniec nie zdążył zapisać.. Jak to jest możliwe że on się zapętla z tym adresem.. Przecież przez całą noc powinien zrobić sądząc po komórkach 2 i 3 175 zapisów (na początku jest tam wpisana wartość 2000, teraz jest 1825)
    Licząc w HEX F8 + 10 = 108 a nie 8.. Czyżby tu była jakaś nieprawidłowość? źle zapisuje 108? A jeżeli tak, to jak to naprawić?
  • REKLAMA
  • #3 7610502
    kaerb
    Poziom 12  
    Nie, adres to "word" na pewno

    kurcze, im dłużej patrzę tym mniej rozumiem...
    tak samo zapisuję i odczytuję adres jak i zmienną wpamięć, obie typu word i jedna się zapisuje poprawnie a druga nie..

    jest co prawda rozwiązanie działające - zapisuje adres w eepromie procesora i śmiga aż miło, ale to takie... nie od końca to :)
REKLAMA