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 odczyt i zapis do/z eeprom w Atmega16

smithpl 30 Jun 2010 02:29 4300 5
  • #1
    smithpl
    Level 15  
    W ramach porzadkowania kodu staram się jego fragmenty zamykac w sub'ach z parametrem.

    Stad pytanie jak wy to robicie?

    mam 3 wyjscia ktore dzialaja w parciu o parametry
    wyjscie1, 2 i 3
    kazde wyjscie ma parametr czasu i statusu

    Aktualnie uklad odczytuje parametry w eeprom w ten sposob:



    Code:

    czytaj1:
    readeeprom godzina(1), 10
    readeeprom minuta(1), 11
    readeeprom stan(1), 12
    czytaj2:
    readeeprom godzina(2), 20
    readeeprom minuta(2), 21
    readeeprom stan(2), 22


    wywoluje je z programu:
    Code:

    If wyjscie = 1 then
        gosub czytaj1
    elseIf Wyjscie = 2 Then
       gosub czytaj2
    End If


    W związku z tym iż konfiguruje teraz 8 takich wyjść to bedzie 16 ( read/write )
    Chcialbym teraz zrobić to logicznie aby odczytywać z pamięci poprzez Call Sub

    Code:

    Call czytaj(wyjscie)


    Code:

    Sub czytaj(wyjscie)
     <no wlasnie i jak to teraz zrobic>
    End Sub


    Mam nadzieje że w miarę jasno nakreśliłem problem...
  • #2
    smithpl
    Level 15  
    No dobrze sam sie bede nakierowywał :-)

    Stwierdzam że mógłbym to zrealizować poprzez

    Code:

    Dim WY_hour_1 As Eram Byte At 10
    Dim WY_min_1 As Eram Byte At 11
    Dim WY_stan_1 As Eram Byte At 12
    Dim WY_hour_2 As Eram Byte At 20
    Dim WY_min_2 As Eram Byte At 21
    Dim WY_stan_2 As Eram Byte At 22


    No i teraz pytanie jak zrobić odczyt np. wszytkich WY w pętli?
    moze tak?

    Code:

    dim id_wy as byte
    dim WY_hour_wynik as byte

    for id_wy =0 to 2
       WY_hour_wynik =  WY_hour_.id_wy
    '                    ^^^^^^^^^^^
    next


    tylko wlasnie nie wiem jak skladac nazwe zmiennej podstawianej
  • Helpful post
    #3
    deksta84
    Level 24  
    Po pierwsze:
    Używasz wewnętrznej pamięci, więc pamiętaj o żywotności cyklów zapisu/odczytu.
    Jest zalecenie, aby czynności związane z wewnętrzną pamięcią nie wkładać do pętli.
    Po drugie:
    Zainteresuj się zewnętrznymi pamięciami na I2C.

    To są moje wycinki kodu do regulatora PID:
    To w nagłówku:
    Code:
    $eeprom                                                     'Informacja dla procesora o korzystaniu z pamięci EEPROM
    
    Epidl:                                                      'Tablice zmiennych korzystających z EEPROM
    $data
    Dim Kp As Single
    Dim Tp As Single
    Dim Ti As Single
    Dim Td As Single
    Dim Ekp As Single
    Dim Etp As Single
    Dim Eti As Single
    Dim Etd As Single
    Dim Eemax As Long
    Dim Eemin As Long
    Dim Etau As Byte
    Dim Etempx As Single
    Dim Eclkk As Word
    Dim Edt As Single
    Dim Et1 As Single
    Dim Epid As Single                                          'Parametry EEPROM






    To w kodzie głównym:

    Code:
    Readeeprom Epid , Epidl
    
    Waitms 10
    Kp = Epid
    Readeeprom Epid
    Waitms 10
    Tp = Epid
    Readeeprom Epid
    Waitms 10
    Ti = Epid
    Readeeprom Epid
    Waitms 10
    Td = Epid
    Readeeprom Epid
    Waitms 10
    Emax = Epid
    Readeeprom Epid
    Waitms 10
    Emin = Epid
    Readeeprom Epid
    Waitms 10
    Tau = Epid
    Readeeprom Epid
    Clkk = Epid
    Waitms 10
    Readeeprom Epid
    Waitms 10
    Tempx = Epid
    Readeeprom Epid
    Dt = Epid
    Waitms 10
    Readeeprom Epid
    Waitms 10
    T1 = Epid
    Waitms 10


    If Kp <= 0 Or Tp <= 0 Or Ti <= 0 Then
    Kp = 2.1
    Tp = 0.97
    Td = 12
    Ti = 50
    Epid = Kp
    Waitms 10
    Writeeeprom Epid , Epidl
    Waitms 10
    Epid = Tp
    Writeeeprom Epid
    Waitms 10
    Epid = Ti
    Writeeeprom Epid
    Waitms 10
    Epid = Td
    Writeeeprom Epid
    Waitms 10
    End If
  • #4
    smithpl
    Level 15  
    Wiem wiem, pamięć wewnętrzna - ogólnie chodzi tu o naukę.
    W docelowym układzie będzie zewnętrzna, choć zapisy będą realizowane 1 dziennie.
    a swoja drogą jaka jest żywotność eepromu wewnętrzengo?

    Co do kodu, posiedziałem i pogłówkowalem i powstało coś takiego.
    oczywiście to przykład który teoretycznie można rozbudować do spokojnie 8-10 WY

    Code:

    '8 MHz/256/31250 = 1 s
    $regfile = "m16def.dat"
    $crystal = 8000000

    Dim Wy(14) As Eram Byte At 10 ' deklaracja tablicy 14 parametrow dla 2 WY

    Dim Id_wy As Byte
    Dim Wy_wynik_hour As Byte
    Dim Wy_wynik_min As Byte
    Dim Wy_wynik_stan As Byte
    Dim Wy_wynik_param1 As Byte
    Dim Wy_wynik_param2 As Byte
    Dim Wy_wynik_param3 As Byte
    Dim Wy_wynik_param4 As Byte
    Dim X As Byte : Dim X_start As Byte : Dim X_end As Byte
    Declare Sub Wy_read(byval Id_wy As Byte)

    ' zapis przykladowych danych do eepromu aby je odczytac
    Wy(1) = 12
    Wy(2) = 13
    Wy(3) = 14
    Wy(4) = 15
    Wy(5) = 16
    Wy(6) = 17
    Wy(7) = 18
    ' ------------------------------------------
    ' Odczyt danych dla konkretnego WY
    ' przyjete ze kazde WY moze miec 7 parametrow

    Call Wy_read(0)
    Call Wy_read(1)

    End

    ' jeden sub dla wszystkich WY ktore podajemy jako parametr
    Sub Wy_read(id_wy)
       Select Case Id_wy
          Case 0 : X_start = 1
          Case 1 : X_start = 8
          Case 2 : X_start = 15
       End Select

       Wy_wynik_hour = Wy(x_start)
       Wy_wynik_min = Wy(x_start + 1)
       Wy_wynik_stan = Wy(x_start + 2)
       Wy_wynik_param1 = Wy(x_start + 3)
       Wy_wynik_param2 = Wy(x_start + 4)
       Wy_wynik_param3 = Wy(x_start + 5)
       Wy_wynik_param4 = Wy(x_start + 6)
    End Sub
  • #5
    deksta84
    Level 24  
    Żywotność opisuje dokumentacja atmegi wprost na pierwszej stronie.
    Należy użyć opóźnienia 10ms, ponieważ trochę mniej trwa procedura obsługi pamięci.
    Sam chciałem podobnie zrobić, ale coś nie wychodziło i pozostawiłem tak jak jest w moim kodzie.
  • #6
    smithpl
    Level 15  
    No właśnie, w symulatorze działa OK. W domu sprawdze na układzie.
    I domontuje eeprom na i2c. W sumie już obsługuje na I2c DS1307 więc dorzuci się kostke więcej.

    dzięki za informacje