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][ATmega8]Dziwne odczyty z eeprom-u.

wyszkowskidaniel 11 Aug 2010 15:43 1973 3
  • #1
    wyszkowskidaniel
    Level 13  
    Witam. Mam problem z prawidłowym odczytywaniem danych z eepromu atmega 8. Dzieje się to po kilkunastu startach procesora, zamiast np. 90 wskakuje mi 10 lub inne głupoty... do procka mam podłączony kwarc 8MHz z każdego +5V 100nF, reset podciągnięty do +5V przez 5,1k i kondensator 100nF do masy, fusy mam ustawione na CKOP = 0 , kwarc zewnętrzny czyli 111111, WDT always on.
    kombinowałem już z zmianą adresów (większe odstępy bo myślałem że coś się nadpisuje), dałem już większe opóźnienia pomiędzy zapisem a odczytem i nic. używam wyświetlacza led , jeśli na samym starcie nacisnę menu (pinc.4) to się ładują. załączę i wyłączę kilkanaście razy i już głupoty, aha jeszcze mi się przestawia przelicznik adc 0,0025 na inny.
    Oto fragment programu jak sobie wczytuje ustawienia początkowe:
    Proszę Was o pomoc bo walczę już z tym 2 dni i nic

    Code:

     Led_1 Alias Portb.5
     Led_2 Alias Portb.3
     Led_3 Alias Portb.1
     Led_4 Alias Portb.4
     Led_5 Alias Portb.2
     Led_6 Alias Portb.0


    ' LED A STEROWANY 0 PORTD.2
    ' LED B STEROWANY 0 PORTD.6
    ' LED C STEROWANY 0 PORTD.4
    ' LED D STEROWANY 0 PORTD.1
    ' LED E STEROWANY 0 PORTD.0
    ' LED F STEROWANY 0 PORTD.3
    ' LED G STEROWANY 0 PORTD.5

    Config Timer0 = Timer , Prescale = 64
    Enable Timer0
    On Timer0 Prztimer0
    Enable Interrupts
                                                  'uruchamiamy układ watchdog


    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Start Adc

    Config Watchdog = 1024                                      'reset wystąpi po 1s


    Sw_port Alias Pinc
    Buzzer Alias Portc.1
    Praca Alias Portc.2


    Buzzer = 0
    Praca = 0
    Licznik_wyjscia = 0
    Poz_wysw = 1
    Czas_pomiaru = 15
    Flaga_histereza = 0
    Flaga_obl_histerezy = 0
    Kalibracja = 0
    Starteep = 0




    Waitms 500

    If Pinc.4 = 0 Then

    Temp_zal = 35
    Temp_wyl = 70
    Temp_alarm_1 = 90
    Temp_alarm_2 = 90
    Histereza = 3
    Kalibracja_1 = 0
    Kalibracja_2 = 0

    Writeeeprom Temp_zal , 10
    waitms 10
    Writeeeprom Temp_wyl , 20
    Waitms 10
    Writeeeprom Temp_alarm_1 , 30
    Waitms 10
    Writeeeprom Temp_alarm_2 , 40
    Waitms 10
    Writeeeprom Histereza , 50
    Waitms 10
    Writeeeprom Kalibracja_1 , 60
    Waitms 10
    Writeeeprom Kalibracja_2 , 70
    Waitms 10
    End If







    Readeeprom Temp_zal , 10
    Waitms 10
    Readeeprom Temp_wyl , 20
    Waitms 10
    Readeeprom Temp_alarm_1 , 30
    Waitms 10
    Readeeprom Temp_alarm_2 , 40
    Waitms 10
    Readeeprom Histereza , 50
    Waitms 10
    Readeeprom Kalibracja_1 , 60
    Waitms 10
    Readeeprom Kalibracja_2 , 70
    Waitms 10

    Start Watchdog

    Do
    '***********************************                           ' co 4ms
          If Flaga_2ms = 1 Then
          Flaga_2ms = 0
          Reset Watchdog
          If Licznik_buzzer > 0 Then
          Decr Licznik_buzzer
          Buzzer = 1
          Else
          Buzzer = 0
          End If




          Gosub Wyswietlanie
          Gosub Przyciski
          End If

    '***********************************                            ' co 1 s
          If Flaga_1s = 1 Then
          Flaga_1s = 0

          If Licznik_wyjscia > 0 Then
          Decr Licznik_wyjscia
          End If

          If Poz_wysw <> 1 And Licznik_wyjscia = 0 Then         ' wychodzenie z menu jeśli czas wyjścia = 0
          Poz_wysw = 1
          End If



          Mig = Not Mig
          If Czas_pomiaru < 20 Then                             'ma być 20 s
          Incr Czas_pomiaru
          If Czas_pomiaru = 20 Then
          Czas_pomiaru = 0
          Gosub Pomiar
          End If
          End If


          Gosub Sterowanie
          End If


    Loop
    End

    Post raportowany - poprawiłem tytuł.
    [zumek]
    [28-30.06.2022, targi] PowerUP EXPO 2022 - zasilanie w elektronice. Zarejestruj się za darmo
  • #2
    jarek4700
    Level 10  
    Jak wyłączysz procek w trakcie zapisu eepromu to nie dziwota że zapisze go źle...
    Czy przypadkiem nie robisz tak że naciskasz menu i zaraz go wyłączasz?
  • #3
    Jaca
    Level 29  
    Spróbuj użyć tego sposobu obsługi parametrów zapisywanych w EEPROM (traktujesz je jak zwykłe zmienne):

    Code:
    Dim Reserved As Eram String * 8 'Przyzwyczajenie ze starych AVRów - zapobiega(ło) utracie danych z początku obszaru EEPROM :)
    
    Dim Zmienna1 As Eram Byte
    Dim Zmienna2 As Eram String * 8
    Dim Zmienna3 As Eram Long
    Dim Temp as Byte
    [...]
    Zmienna1 = 123
    Zmienna2 = "ABCD"
    Zmienna3 = 12345678


    ps. Aby użyć zmiennej z przestrzeni EEPROM w operacjach - musisz ją uprzednio skopiować do zmiennej zadeklarowanej w RAM'ie:

    Code:
    Temp = Zmienna1
    
    Incr Temp
    Zmienna1 = Temp
  • #4
    wyszkowskidaniel
    Level 13  
    Witam. Poradziłem sobie z tym problemem... była to głupota :) mianowicie wystarczyło ustawić odpowiednio w fusach BODa. Jestem początkującymi nie wiedziałem o tym... ale dzięki za pomoc
    Do kolegi Jarka:
    takich rzeczy nie robiłem, że wczytywałem a zaraz wyłączałem, domyśliłem się, że gdy spada na procku napięcie poniżej 2,5V to się dzieją dziwne rzeczy w eepromie i nadpisują róże komórki. Po ustawieniu BODa problem zniknął