Elektroda.pl
Elektroda.pl
X
Computer ControlsComputer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[mega8][BASCOM]Jak zapisać i odczytać dane z 24Cxx ?

monty_p 22 Lip 2008 23:36 16166 143
  • Pomocny post
    #121
    JmL(TM)
    Poziom 24  
    Tutaj masz cos prostego [USBtiny500]:
    https://www.elektroda.pl/rtvforum/topic1047533.html

    Co do robienia kopii to moze takie rozwiazanie by cie zadowalalo: na kawalku plytki lutujesz tylko podstawke pod pamiec EEPROM z rezystorami podciagajacymi. Na "plycie glownej" urzadzenia lutujesz zlacze [zenskie] i pozniej tylko wsuwasz taka "karte pamieci" do slotu [tak jak np. PCI] i wykonujesz kopie. Oczywiscie dostep do danych chronisz w jakis sposob np. poprzez klucz master i odpowiednia kombinacje przyciskow lub tez kod wpisywany przez dolaczana klawiaturke [ale to juz bardziej rozbudowana wersja projektu]. Pamiec EEPROM na karcie mozna latwo zmieniac i zachowywac jako kopie danych lub rowniez mozna wykonac kilka plytek wraz z pamieciami i tylko co pewniez czas brac nowa i oznaczyc data wykonania kopii. Mozliwosci i rozwiazan jest naprawde wiele ale wybor jak zawsze nalezy do Ciebie! :D

    Pozdrawiam!
  • Computer ControlsComputer Controls
  • Pomocny post
    #122
    Balu
    Poziom 38  
    I wszystkie dramatycznie bolesne w wyniku wycieku takiej kopii...
  • Pomocny post
    #123
    JmL(TM)
    Poziom 24  
    No coz o bezpieczenstwo danych trzeba jakos zadbac :D Mozna dodatkowo chociaz w jakis prosty sposob szyfrowac dane...
  • Computer ControlsComputer Controls
  • #124
    monty_p
    Poziom 18  
    Balu napisał:
    I wszystkie dramatycznie bolesne w wyniku wycieku takiej kopii...


    Nie wydaje mi sie żeby ktoś niepowołany zrobił użytek z takich danych. Nikt, kto nie wie dokładnie jak ten program działa, nie ma pojęcia co siedzi w pamięci i jak ewentualnie wykorzystać te dane. :)

    ...nie trzeba szyfrować a zamiast podstawki i kilku pamięci można zrobić kilka takich "przechowalni" danych. Jedna kość pamięci kosztuje złotówkę :) złącze rs232 wraz z plastikową obudową 1,50zł, wszystkie powtarzalne elementy były by wewnątrz urządzenia. Klucz składał by się tylko ze złącza rs232, plastikowej obudowy, eproma i przycisku służącego do zapisu.

    Może to tylko mi się tak wydaje, ale nie ma chyba sensu aż tak kombinować ?

    Dodano po 7 [minuty]:

    ...a jeszcze taka sprawa. Na stronie, którą polecaliście mi czytać (radzio.dxp.pl) jest napisane, ze układ 24C16 nie posiada żadnych zewnętrznych linii adresowych (na magistrali może być tylko jeden taki układ). Może być problem z podłączeniem drugiej pamięci tak, żeby działała jako kopia zapasowa.

    Tak czy nie?
  • Pomocny post
    #125
    Balu
    Poziom 38  
    Na tą samą magistralę - nie możliwe.
  • Pomocny post
    #126
    JmL(TM)
    Poziom 24  
    Faktycznie upchniecie kostki eeprom'u do obudowy DB9 jest prostym i dobrym rozwiazaniem.

    W datasheet od 24C16 czytamy:
    Cytat:
    The A2, A1 and A0 pins are device address inputs that may be hardwired or actively driven to VDD or VSS. These inputs allow the selection for one of eight possible devices sharing a common bus.


    Czyli mozesz podpiac do osmiu pamieci pod jedna szyne I2C.
  • #127
    monty_p
    Poziom 18  
    też mi się tak wydaje ale RADZIO zaprzecza temu i pisze, że się nie da :)
  • Pomocny post
    #128
    Balu
    Poziom 38  
    http://ww1.microchip.com/downloads/en/DeviceDoc/21703G.pdf

    Proponuję kolego JmL najpierw przeczytać, potem pisać...

    Cytat:

    A control byte is the first byte received following the
    Start condition from the master device (Figure 3-2).
    The control byte consists of a four-bit control code.
    For the 24XX16, this is set as ‘1010’ binary for read
    and write operations. The next three bits of the control
    byte are the block-select bits (B2, B1, B0). They are
    used by the master device to select which of the eight
    256 word-blocks of memory are to be accessed.
    These bits are in effect the three Most Significant bits
    of the word address. It should be noted that the
    protocol limits the size of the memory to eight blocks
    of 256 words, therefore, the protocol can support only
    one 24XX16 per system
    .
  • #131
    Balu
    Poziom 38  
    Ijeszcze...
    Cytat:

    8.4 A0, A1, A2
    The A0, A1 and A2 pins are not used by the 24XX16.
    They may be left floating or tied to either VSS or VCC.


    Powiem więcej Microchip nawet robie wersję bez tych pinów...w obudowie 5 nóżkowej... pomyśl, zastanów się nad zasadą działania nie wklejaj herezji.
  • #132
    JmL(TM)
    Poziom 24  
    :arrow: Balu zwracam honor, a niezbitym dowodem Twojej (jak zwykle zreszta) slusznosci jest ta tabela wyciagnieta z datasheet'a:

    [mega8][BASCOM]Jak zapisać i odczytać dane z 24Cxx ?

    Zmylil mnie ten pierwszy opis na stronie (www) ale tam jest namieszane z 24C164.

    Mea culpa!
  • #133
    monty_p
    Poziom 18  
    WITAM PO KRÓTKIEJ PRZERWIE!!

    :)

    Wracam do tematu. :)
    Zamówiłem zapas procesorów ;) Można ruszać dalej.
    Zrobiłem już w programie obsługę pamięci 24c64 ale mam problem z odczytem komórek.

    Przypomnę tylko...
    Program odczytuje 4 bajtowy NR ID z DS1990A, przeszukuje pamięć i jeżeli nie ma numeru, to go zapisuje.

    zapisuję bajt po bajcie i wszystko jest OK. Wrzucam IDy z 5-ciu kluczy i w pamięci są zapisane POPRAWNIE.

    ...natomiast przy odczycie, program się gubi.
    Adresy od $00 do $14 odczytuje dobrze, natomiast gdy chcę odczytać $15 i wyżej, program czyta mi z komórki $10255 i wyższej :)


    Poniżej podaję WYCINKI kodu. Powinny wystarczyć do diagnozy. Gdyby się okazało, że nie wystarczą, to proszę mówić :)
    Code:

    {...}

    Dim Adres_wr As Word                                        '<<--- adres w ktorym siedzi info o ilosci wpisow.


    {...}


    Do

       cls

       Call Id_klucza()

    Loop

    End

    '***********************-= PODPROGRAMY =-*************************

    Sub Zapis_do_eproma(adres As Word , Wartosc As Byte)

       H = High(adres)
       L = Low(adres)

       I2cstart
       I2cwbyte Adres_zapisu
       'I2cwbyte H                                               'MSB
       'I2cwbyte L

       If Err = 0 Then

          'I2cwbyte Adres_komorki
          I2cwbyte H                                            'MSB
          I2cwbyte L
          I2cwbyte Wartosc
          I2cstop

          Waitms 20

       Elseif Err = 1 Then

          Cls
          Lcd "BLAD ZAPISU!"
          Lowerline
          Lcd "Sprobuj ponownie"
          Wait 1

       End If

    End Sub

    '*************************************************************

    Function Odczyt_z_eproma(adres As Word) As Byte

       Local Odczytany_bajt As Byte

       H = High(adres)
       L = Low(adres)

       I2cstart
       I2cwbyte Adres_zapisu

       If Err = 0 Then

          I2cwbyte H
          I2cwbyte L

          I2crepstart

          I2cwbyte Adres_odczytu
          I2crbyte Odczytany_bajt , Nack
          I2cstop

       Elseif Err = 1 Then

          Cls
          Lcd "BLAD ODCZYTU!"
          Lowerline
          Lcd "Sprobuj ponownie"
          Wait 1

       End If

       Odczyt_z_eproma = Odczytany_bajt

    End Function

    '*************************************************************

    Sub Id_klucza()

       Local Temp_b As Byte

       Reset Portd.7
       Waitms 25
       1wreset
       Set Portd.7
       Waitms 25

       If Err = 0 Then

          1wwrite &H33

          Key_id(1) = 1wread(8)

          If Key_id(8) = Crc8(key_id(1) , 7) Then
             Cls
             Lcd "ID: "

             For Temp_b = 1 To 4
                Lcd Hex(key_id(temp_b))
             Next Temp_b

             Lowerline
             Lcd "Odszukac klucz ?"

             Wait 1

          End If

          If S2 = 0 Then                                        'ZAPISZ/SZUKAJ
             Waitms 25

             If S2 = 0 Then

                Call Szukaj_id()

             End If
          End If
       Else

          Lcd "Brak klucza"
          Waitms 200

       End If
    End Sub

    '*************************************************************

    Function Porownaj_klucze() As Byte

      Local Ilosc_bajtow_klucza_ok As Byte
      Local Temp_x As Byte

      Ilosc_bajtow_klucza_ok = 0

      For Temp_x = 1 To 4

       Waitms 50

       If Key_id(temp_x) = Id(temp_x) Then
          Incr Ilosc_bajtow_klucza_ok
       End If

      Next Temp_x

      Porownaj_klucze = Ilosc_bajtow_klucza_ok

    End Function

    '*************************************************************

    Sub Szukaj_id()

       Local Temp_a As Byte
       Local Temp_c As Byte
       Local Temp_d As Byte
       Local Temp_e As Byte
       Local Temp_f As Byte
       Local Wolna_komorka As Word
       Local Znalazl As Byte
       Local Ilosc_wpisow As Byte

       Petla_szukaj:

       Znalazl = 0
       Adres_wr = 0   


       For Temp_d = 1 To Ile_wpisow()

          For Temp_c = 1 To 4

             Id(temp_c) = Odczyt_z_eproma(adres_wr) '<<--- ZMIENNA adres_wr PRZECHOWUJE JAKO zmienna typu WORD. I TUTAJ JEST CHYBA PROBLEM
             Incr Adres_wr

          Next Temp_c

          Incr Adres_wr

          If Porownaj_klucze() = 4 Then

             Znalazl = 1

             Exit For

          End If

       Next Temp_d

       If Znalazl = 0 Then

          Do

             Cls
             Lcd ">> Nowy KLUCZ <<"
             Lowerline
             Lcd " Dodac do bazy?"
             Waitms 500                                       

             If S1 = 0 Then                                        'ANULUJ

                {...}

             End If

             If S2 = 0 Then                                     'ZAPISZ

                Waitms 25

                If S2 = 0 Then

                   Ilosc_wpisow = Ile_wpisow()

                   Wolna_komorka = Ilosc_wpisow * 5

                   For Temp_e = 1 To 4

                      Call Zapis_do_eproma(wolna_komorka , Key_id(temp_e))
                      Incr Wolna_komorka

                   Next Temp_e

                   Call Wpisy_dodaj()

                   Cls
                   Lcd "  Dodano KLUCZ  "
                   Lowerline
                   Lcd "    do bazy    "
                   Wait 1
                   Goto Petla_szukaj

                   {...}

                   Goto Koniec_petli


                End If

             End If

          Loop

          Koniec_petli:

       Else

          Decr Adres_wr

          Cls
          Lcd "ZNALEZIONO KLUCZ"
          Wait 1

          Call Dodatkowe_info(adres_wr)
       End If

    End Sub


    wydaje mi sie ze problem tkwi w zmiennej adres_wr. Zmienna ta jest przechowywana jako zmienna WORD.
    Zauważyłem, że ten dziwny adres komórki ( $10255 ) to po przerobieniu z wartości Decymalnych na hexodecymalne, daje wartość 280F. Rozdzielając na starszy i młodszy bajt oraz przekształcając spowrotem na wartość decymalną, jest to odpowiednio, dla starszego bajtu 40, dla młodszego: 15.
    ...i tutaj znalazła się moja komórka $15 :)

    Długie tłumaczenie ale mam nadzieję, że wytłumaczyłem w miarę jasno. :)
    Teraz pytanie.

    Jak zmodyfikować kod, żeby można było naprawić ten problem.


    Bardzo proszę o pomoc.
  • #134
    JmL(TM)
    Poziom 24  
    Zobacz czy to cokolwiek zmieni ;)

    Code:
    Function Odczyt_z_eproma(adres As Word) As Byte
    

       Local Odczytany_bajt As Byte
       Odczytany_bajt = 0;

       H = High(adres)
       L = Low(adres)

       I2cstart
       I2cwbyte Adres_zapisu

       If Err = 0 Then
          I2cwbyte H
          I2cwbyte L

          I2crepstart

          I2cwbyte Adres_odczytu
          I2crbyte Odczytany_bajt , Nack

          I2cstop
       Else
          Cls
          Lcd "BLAD ODCZYTU!"

          Lowerline
          Lcd "Sprobuj ponownie"

          Wait 1
       End If

       Odczyt_z_eproma = Low(Odczytany_bajt)

    End Function
  • #135
    monty_p
    Poziom 18  
    :)
    A co bedzie, jezeli bede mial do odczytania wartosc wiesza niz ta, ktora miesci sie w LOW_BYTE ????
  • #136
    JmL(TM)
    Poziom 24  
    Przeciez czytasz wartosc BYTE wiec max wartosc to 0xFF - 255 ;)

    Sprawdzales czy to cokolwiek zmienilo? Moglbys wrzucic caly kod? Duzo tego? :cunning:
  • #137
    monty_p
    Poziom 18  
    Jeżeli chcesz kod, to proszę. To jest cały kod programu :)

    Code:

    $regfile = "m8def.dat"
    $crystal = 1000000

    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
    Config Lcd = 16 * 2

    Config Scl = Portc.5
    Config Sda = Portc.4

    Config Pinc.0 = Input
    Config Pinc.1 = Input
    Config Pinc.2 = Input
    Config Pinc.3 = Input

    '******* KOPIA ZAPASOWA ******
    Config Pind.0 = Output
    Config Pind.1 = Input
    Config Pind.2 = Input

    Led Alias Pind.0
    Switch Alias Pind.1
    Czujnik Alias Pind.2

    Reset Portd.0
    Set Portd.1
    Set Portd.2

    '*****************************

    Config 1wire = Portd.7

    S1 Alias Pinc.0                                             'Anuluj
    S2 Alias Pinc.1                                             'Zapisz
    S3 Alias Pinc.2                                             'PLUS
    S4 Alias Pinc.3                                             'MINUS

    Set Portc.0
    Set Portc.1
    Set Portc.2
    Set Portc.3

    Const Adres_zapisu = 160
    Const Adres_odczytu = 161
    Const Adres_zapisu_sm = 162
    Const Adres_odczytu_sm = 163

    Declare Sub Dodatkowe_info(byval Adres_kom_dodatkowe_info As Word)
    Declare Function Porownaj_klucze() As Byte
    Declare Sub Zapis_do_eproma(adres As Word , Wartosc As Byte)
    Declare Function Odczyt_z_eproma(adres As Word) As Byte
    Declare Sub Id_klucza()
    Declare Sub Szukaj_id()
    Declare Sub Wpisy_dodaj() As Byte
    Declare Function Ile_wpisow() As Byte
    Declare Sub Servicemode() As Byte

    Declare Sub Zapis_do_zewn_eproma(adres As Word , Wartosc As Byte)

    Dim L As Byte , H As Byte
    Dim Key_id(8) As Byte
    Dim A As Byte
    Dim Adres_wr As Word
    Dim Id(4) As Byte


    '************** GŁÓWNA PĘTLA PROGRAMU **************
    Cursor Off
    Cls
    Lcd " START PROGRAMU"
    Wait 2

    Cls
    Lcd "Ilosc klientow"
    Lowerline
    Lcd "w bazie: " ; Ile_wpisow()
    Wait 2
    Do

       Cls

       If Czujnik = 0 Then                                      'Wykrywa podpieta pamiec zewnetrzna.
          Waitms 25

          If Czujnik = 0 Then

             Call Servicemode()

          End If

       End If

       Call Id_klucza()

    Loop

    End

    '***********************-= PODPROGRAMY =-*************************

    Sub Zapis_do_eproma(adres As Word , Wartosc As Byte)

       H = High(adres)
       L = Low(adres)

       I2cstart
       I2cwbyte Adres_zapisu

       If Err = 0 Then

          I2cwbyte H
          I2cwbyte L
          I2cwbyte Wartosc
          I2cstop

          Waitms 20

       Elseif Err = 1 Then

          Cls
          Lcd "BLAD ZAPISU!"
          Lowerline
          Lcd "Sprobuj ponownie"
          Wait 1

       End If

    End Sub

    '*************************************************************

    Function Odczyt_z_eproma(adres As Word) As Byte

       Local Odczytany_bajt As Byte
       Odczytany_bajt = 0;  '<- ten średnik tutaj to pomyłka czy tak ma być ?? :-)

       H = High(adres)
       L = Low(adres)

       I2cstart
       I2cwbyte Adres_zapisu

       If Err = 0 Then
          I2cwbyte H
          I2cwbyte L

          I2crepstart

          I2cwbyte Adres_odczytu
          I2crbyte Odczytany_bajt , Nack

          I2cstop
       Else
          Cls
          Lcd "BLAD ODCZYTU!"

          Lowerline
          Lcd "Sprobuj ponownie"

          Wait 1
       End If

       Odczyt_z_eproma = Low(Odczytany_bajt)

    End Function

    '*************************************************************

    Sub Id_klucza()

       Local Temp_b As Byte

       Reset Portd.7
       Waitms 25
       1wreset
       Set Portd.7
       Waitms 25

       If Err = 0 Then

          1wwrite &H33

          Key_id(1) = 1wread(8)

          If Key_id(8) = Crc8(key_id(1) , 7) Then
             Cls
             Lcd "ID: "

             For Temp_b = 1 To 4
                Lcd Hex(key_id(temp_b))
             Next Temp_b

             Lowerline
             Lcd "Odszukac klucz ?"

             Wait 1

          End If

          If S2 = 0 Then                                        'ZAPISZ/SZUKAJ
             Waitms 25

             If S2 = 0 Then

                Call Szukaj_id()

             End If
          End If
       Else

          Lcd "Brak klucza"
          Waitms 200

       End If
    End Sub

    '*************************************************************

    Function Porownaj_klucze() As Byte

      Local Ilosc_bajtow_klucza_ok As Byte
      Local Temp_x As Byte

      Ilosc_bajtow_klucza_ok = 0

      For Temp_x = 1 To 4

       Waitms 50

       If Key_id(temp_x) = Id(temp_x) Then
          Incr Ilosc_bajtow_klucza_ok
       End If

      Next Temp_x

      Porownaj_klucze = Ilosc_bajtow_klucza_ok

    End Function

    '*************************************************************

    Sub Szukaj_id()

       Local Temp_a As Byte
       Local Temp_c As Byte
       Local Temp_d As Byte
       Local Temp_e As Byte
       Local Temp_f As Byte
       Local Wolna_komorka As Word
       Local Znalazl As Byte
       Local Ilosc_wpisow As Byte

       Petla_szukaj:

       Znalazl = 0
       Adres_wr = 0


       For Temp_d = 1 To Ile_wpisow()

          For Temp_c = 1 To 4

             Id(temp_c) = Odczyt_z_eproma(adres_wr)

             Incr Adres_wr

          Next Temp_c

          Incr Adres_wr

          If Porownaj_klucze() = 4 Then

             Znalazl = 1

             Exit For

          End If

       Next Temp_d

       If Znalazl = 0 Then

          Do

             Cls
             Lcd ">> Nowy KLUCZ <<"
             Lowerline
             Lcd " Dodac do bazy?"
             Waitms 500


             If S1 = 0 Then                                     'ANULUJ

                Waitms 25

                If S1 = 0 Then

                   Cls
                   Lcd "Anulowano"
                   Waitms 500

                   Goto Koniec_petli

                End If

             End If

             If S2 = 0 Then                                     'ZAPISZ

                Waitms 25

                If S2 = 0 Then

                   Ilosc_wpisow = Ile_wpisow()

                   Wolna_komorka = Ilosc_wpisow * 5

                   For Temp_e = 1 To 4

                      Call Zapis_do_eproma(wolna_komorka , Key_id(temp_e))
                      Incr Wolna_komorka

                   Next Temp_e

                   Call Wpisy_dodaj()

                   Cls
                   Lcd "  Dodano KLUCZ  "
                   Lowerline
                   Lcd "    do bazy    "
                   Wait 1
                   Goto Petla_szukaj

                   Call Dodatkowe_info(adres_wr)

                   Goto Koniec_petli


                End If

             End If

          Loop

          Koniec_petli:

       Else

          Decr Adres_wr

          Cls
          Lcd "ZNALEZIONO KLUCZ"
          Wait 1

          Call Dodatkowe_info(adres_wr)
       End If

    End Sub

    '*************************************************************

    Sub Dodatkowe_info(byval Adres_kom_dodatkowe_info As Word)

       Local Adres_info As Byte
       Local Temp_b As Byte

       Adres_info = Odczyt_z_eproma(adres_kom_dodatkowe_info)

       Do

          Cls
          Lcd "PUNKTY: ";
          Lcd Adres_info
          Waitms 100


          If S1 = 0 Then                                        'ANULUJ
             Waitms 25

             If S1 = 0 Then

               Goto Edycja_anuluj

             End If

          End If

          If S2 = 0 Then                                        'ZAPISZ
             Waitms 25

             If S2 = 0 Then

                Goto Edycja_zapisz

             End If

          End If

          If S3 = 0 Then                                        'PLUS
             Waitms 25

             If S3 = 0 Then

                Incr Adres_info

             End If

          End If

          If S4 = 0 Then                                        'MINUS
             Waitms 25

             If S4 = 0 Then

                Decr Adres_info

             End If

          End If
       Loop

       Edycja_zapisz:

          Call Zapis_do_eproma(adres_kom_dodatkowe_info , Adres_info)

          Cls
          Lcd "SaVe: ";

          For Temp_b = 1 To 4

             Lcd Hex(key_id(temp_b))

          Next Temp_b

          Wait 1

       Edycja_anuluj:

    End Sub
    '*****************************************************************

    Function Ile_wpisow() As Byte

       Local Ids As Integer
       Local High_adr As Byte , Low_adr As Byte

       Readeeprom High_adr , 1
       Readeeprom Low_adr , 2

       If High_adr > 0 Then

          Ids = High_adr + Low_adr

       Else

          Ids = Low_adr

       End If

       Ile_wpisow = Ids

    End Function

    '*****************************************************************

    Sub Wpisy_dodaj() As Byte

       Local High_adr As Byte , Low_adr As Byte

       Readeeprom High_adr , 1
       Readeeprom Low_adr , 2

       If Low_adr >= 255 Then

          Low_adr = 0
          High_adr = High_adr + 1

          Writeeeprom High_adr , 1
          Writeeeprom Low_adr , 2


       Else

          Low_adr = Low_adr + 1
          Writeeeprom Low_adr , 2

       End If

    End Sub

    '*****************************************************************

    Sub Servicemode() As Byte

       Local Ilosc_komorek_do_zapisu As Byte
       Local Komorka As Word
       Local Temp_k As Byte

       Cls
       Lcd " Tryb SERWISOWY"
       Wait 1

       If Switch = 0 Then                                       'WCIŚNIĘTO PRZYCISK NA PAMIĘCI ZEWNĘTRZNEJ
             Waitms 25

             If Switch = 0 Then

                Ilosc_komorek_do_zapisu = Ile_wpisow()
                Ilosc_komorek_do_zapisu = Ilosc_komorek_do_zapisu * 5

                For Komorka = 0 To Ilosc_komorek_do_zapisu

                   Temp_k = Odczyt_z_eproma(komorka)
                   Call Zapis_do_zewn_eproma(komorka , Temp_k)
                   Cls
                   Lcd "ZRODLO:" ; Temp_k
                   Waitms 500

                Next Komorka

                Set Portd.0
                Waitms 100
                Reset Portd.0


             End If

          End If



    End Sub


    '*****************************************************************"
    Sub Zapis_do_zewn_eproma(adres As Word , Wartosc As Byte)

       H = High(adres)
       L = Low(adres)

       I2cstart
       I2cwbyte Adres_zapisu_sm

       If Err = 0 Then

          I2cwbyte H
          I2cwbyte L
          I2cwbyte Wartosc
          I2cstop

          Waitms 20

       Elseif Err = 1 Then

          Cls
          Lcd "BLAD ZAPISU!"
          Lowerline
          Lcd "Sprobuj ponownie"
          Wait 1

       End If

    End Sub


    ...

    Code:

    Odczytany_bajt = 0;  '<- ten średnik tutaj to pomyłka czy tak ma być ?? :-)


    Co do tego czy działa... Daj mi chwilkę. Musze złożyć to urządzenie w całość. W między czasie majstrowałem inny wynalazek ;)

    Dodano po 1 [minuty]:

    JmL(TM) napisał:
    Przeciez czytasz wartosc BYTE wiec max wartosc to 0xFF - 255 ;)


    ...no tak <idiota>

    Dodano po 2 [minuty]:

    ...zacząłem robić kopiowanie danych na pamięć zewnętrzną. Poza tym przechowuję info o ilości wpisów nie w pamięci zewnętrznej, a w wewnętrznej pamięci procka.
  • #138
    JmL(TM)
    Poziom 24  
    Ten nieszczesny srednik to nawyk z C++ i oczywiscie musisz go usunac ;)

    Cytat:
    ...zacząłem robić kopiowanie danych na pamięć zewnętrzną. Poza tym przechowuję info o ilości wpisów nie w pamięci zewnętrznej, a w wewnętrznej pamięci procka.

    To juz wiem :D
  • #139
    monty_p
    Poziom 18  
    Niestety ale program dalej skacze po calej pamieci :(

    1, 2, 3, 4,
    6, 7, 8, 9,
    11, 12, 13, 14,
    ..i tutaj juz wariuje :(:(:(
  • Pomocny post
    #140
    JmL(TM)
    Poziom 24  
    Jestem w trakcie przegladania kodu... i jak narazie znalazlem:

    Code:
    Function Ile_wpisow() As Byte
    

       Local Ids As Integer
       Local High_adr As Byte , Low_adr As Byte

       Readeeprom High_adr , 1
       Readeeprom Low_adr , 2

       If High_adr > 0 Then
          Ids = High_adr + Low_adr
       Else
          Ids = Low_adr
       End If

       Ile_wpisow = Ids

    End Function


    W tej funkcji zwracasz wartosc BYTE a wpisujesz do niej INTEGER

    Code:

    Function Ile_wpisow() As Byte

       Local Ids As Integer

       {...}

       Ile_wpisow = Ids


    Poza tym zamiast wywolywac ta funkce za kazdym razem lepiej wczytaj wartosc do jakiejs zmiennej i operuj na niej. Odciazysz troche uC :D

    {...}

    Sprytnie poradziles sobie z laczeniem 2 bajtow w calosc ale do tego sa gotowce w bascom'ie. Fragment z help'a:

    Cytat:
    MAKEINT

    Action
    Compact two bytes into a word or integer.

    Syntax
    varn = MAKEINT(LSB , MSB)

    Remarks
    Varn: Variable that will be assigned with the converted value.
    LSB: Variable or constant with the LS Byte.
    MSB: Variable or constant with the MS Byte.

    The equivalent code is:
    varn = (256 * MSB) + LSB

    Example
    Code:
    Dim A As Integer , I As Integer
    
    A = 2
    I = Makeint(a , 1)                                          'I = (1 * 256) + 2 = 258
    End


    Moze sie na cos przyda :D
  • #141
    monty_p
    Poziom 18  
    Dzieki!

    Dzisiaj wieczorem, jak wrócę z roboty to siądę nad tym i troche zmienię kod. Mi się wydaje, że coś jest nie tak ze zmienną adres_wr. To ona mi pieprzy. Wrzuciłem do kodu podgląd tej zmiennej i to ona, gdy ma osiągnąć wartość 15, raz jest pusta a raz skacze do 10255 i w górę.


    ...nie wiem, czy nie otworzyć nowego tematu, bo ten tytuł,
    "Jak zapisać i odczytać dane z 24Cxx " jest już wyczerpany :)
    JML, co Ty na to?
  • Pomocny post
    #142
    zumek
    Poziom 39  
    JmL(TM) napisał:
    Sprytnie poradziles sobie z laczeniem 2 bajtow w calosc ...

    Jeśli masz na myśli tę ...

    Code:
    Function Ile_wpisow() As Byte
    

       Local Ids As Integer
       Local High_adr As Byte , Low_adr As Byte

       Readeeprom High_adr , 1
       Readeeprom Low_adr , 2

       If High_adr > 0 Then
          Ids = High_adr + Low_adr
       Else
          Ids = Low_adr
       End If

       Ile_wpisow = Ids

    End Function

    ... funkcję , to ... jedna wielka pomyłka , żeby nie powiedzieć bzdura :|

    Co jeszcze. Jak patrzę na kod , to wygląda on tak , jakby autor znał/wykorzystał , tylko 10% możliwości Basica , a resztę sam próbuje jakoś sklecić do kupy , generując przy tym sporo błędów - nazwijmy je - programistycznych ;) Np. taki fragment w pętli Do
    Code:

                   Call Dodatkowe_info(adres_wr)

                   Goto Koniec_petli


                End If

             End If

          Loop

          Koniec_petli:


    A zamiast "niebezpiecznego" Goto , można spokojnie użyć Exit Do.
    Dalej. Obsługa pamięci Internal Eeprom , za pomocą instrukcji Readeeprom , Writeeeprom i "rozbijanie" Word na Byte - po co :?:
    Przecież mamy takie udogodnienie jak.
    Code:

     Dim Zmienna As Eram Word At 1

    Pierwszy fragment przytoczony wyżej , mógłby wyglądać np.
    Code:

    Function Ile_wpisow() As Word
       Ile_wpisow = Zmienna
    End Function
    'lub
    Function Ile_wpisow() As Word
       Readeeprom Ile_wpisow , 1
    End Function

    To oczywiście nie wszystko ... :(
    Na miejscu autora , napisał bym ten kod od nowa , wykorzystując tylko niektóre Funkcje/Procedury , a z Basica "brać" , co się tylko da.
    I już na koniec.
    W kodzie występuje sporo zmiennych Local , więc pytanie brzmi - jak wyglądają ustawienia kompilatora , a szczególnie $Framesize , itp :?:

    Piotrek
  • #143
    monty_p
    Poziom 18  
    zumek napisał:
    ...wygląda on tak , jakby autor znał/wykorzystał , tylko 10% możliwości Basica


    Tak właśnie jest :D To jest moje pierwsze urządzenie wykorzystujące procesor (do tego programowane w BASCOMie) Gdyby nie Balu i JML to nie przebrnął bym przez to wcale. Efektem mojej niewiedzy jest powyższa funkcja :)

    ...Już po samym tytule "Jak zapisać i odczytać dane z 24Cxx" powinieneś o tym wiedzieć. Czy ktoś, kto się zna, pyta o takie "oczywiste" rzeczy?

    ...tak wogóle to czy ktoś kto się zna, w ogóle się o coś na tym forum pyta? ;)

    zumek napisał:

    Przecież mamy takie udogodnienie jak.

    Code:
    Dim Zmienna As Eram Word At 1 




    Gdybym znał takie udogodnienie, na pewno bym z niego skorzystał. :) Każdy konstruktywny post w tym temacie pomaga mi zrozumieć coraz więcej w kwestii BASCOMa.

    ...np. niedawno próbowałem zrobić coś innego na atmedze i nauczyłem się ciekawej komendy do obsługi przycisków, jaką jest debounce.

    Ten kod też przerobię, żeby wykorzystywał tą komendę. Może za jakiś czas moja znajomość BASCOMa się poszerzy i nie będę już pytał o takie "banały" Na razie jesteście (niestety) na mnie skazani ;)

    Tak czy inaczej bardzo mi pomagacie :)
  • #144
    monty_p
    Poziom 18  
    Udało się zrealizować dokładnie te założenia, jakie program miał spełniać. Może nie jest to poprawne i starych wyjadaczy będą kłuły w oczy pewne błędy, ale będę się starał bardziej przy następnych okazjach :D

    Program spełnia następujące założenia:
    - odczyt ID z DS1990A
    - odczyt pamięci zewnętrznej (24C64) w celu wyszukania zapisanego w niej ID
    - zapis ID do pamięci zewnętrznej (w przypadku gdy ID nie zostało znalezione)
    - wyświetlenie ilości zapisanych ID w pamięci zewnętrznej
    - przechowywanie w pamięci zewnętrznej dodatkowych danych dotyczących każdego ID

    Dokładnie tyle chciałem :D

    W związku z tym temat został wyczerpany. Może zostać zamknięty. Dokonam jeszcze kilka kosmetycznych zmian w kodzie ale to już nie sprawi mi problemu.

    BARDZO DZIĘKUJĘ KOLEGOM:
    - JML(TM) - za podsunięcie pomysłu przechowywania IDów w pamięci zewnętrznej ( a nie tak jak wcześniej chciałem, na karcie SD) oraz za nieocenioną pomoc na forum i poza nim.
    - Balu - za konstruktywną krytykę oraz za naprowadzanie mnie do pozytywnych rozwiązań dla programu. :)
    - Zumek - za pomoc w ostatnim poście. Zrobiłem dokładnie tak, jak podpowiedział :)

    Dziękuję też wszystkim pozostałym, którzy mniej lub bardziej starali się mi pomóc.

    Oto program, który powstał wspólnymi siłami:
    Code:

    $regfile = "m8def.dat"
    $crystal = 1000000

    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
    Config Lcd = 16 * 2

    Config Scl = Portc.5
    Config Sda = Portc.4

    Config Pinc.0 = Input
    Config Pinc.1 = Input
    Config Pinc.2 = Input
    Config Pinc.3 = Input

    Config 1wire = Portd.7

    S1_anuluj Alias Pinc.0                                      'Anuluj
    S2_zapisz Alias Pinc.1                                      'Zapisz
    S3_plus Alias Pinc.2                                        'PLUS
    S4_minus Alias Pinc.3                                       'MINUS

    Set Portc.0
    Set Portc.1
    Set Portc.2
    Set Portc.3

    Const Adres_zapisu = 160
    Const Adres_odczytu = 161

    Declare Function Ile_wpisow() As Word
    Declare Function Odczyt_z_eproma(byval Adres As Word) As Byte
    Declare Function Porownaj_klucze() As Byte
    Declare Sub Dodatkowe_info(byval Adres_kom_dodatkowe_info As Word)
    Declare Sub Id_klucza()
    Declare Sub Szukaj_id()
    Declare Sub Wpisy_dodaj() As Byte
    Declare Sub Zapis_do_eproma(byval Adres As Word , Wartosc As Byte)

    Dim Key_id(8) As Byte , Id(4) As Byte
    Dim A As Byte , Adres_wr As Word
    Dim L As Byte , H As Byte
    Dim Wpisow_ogolem As Word
    Dim Ids As Eram Word At 1

    '************** GŁÓWNA PĘTLA PROGRAMU **************
    Cursor Off
    Cls
    Lcd " START PROGRAMU"
    Wait 1

    Cls
    Lcd "Ilosc klientow"
    Locate 2 , 1
    Lcd "w bazie: " ; Ile_wpisow()
    Wait 1

    Do
       Cls
       Call Id_klucza()

    Loop

    End
    '***********************-= PODPROGRAMY =-*************************

    Sub Zapis_do_eproma(byval Adres As Word , Wartosc As Byte)
        H = High(adres)
        L = Low(adres)

        I2cstart
        I2cwbyte Adres_zapisu
        I2cwbyte H
        I2cwbyte L
        I2cwbyte Wartosc
        I2cstop

        Waitms 10
    End Sub
    '*************************************************************

    Function Odczyt_z_eproma(byval Adres As Word) As Byte
        H = High(adres)
        L = Low(adres)

        I2cstart
        I2cwbyte Adres_zapisu
        I2cwbyte H
        I2cwbyte L

        I2cstart
        I2cwbyte Adres_odczytu
        I2crbyte Odczyt_z_eproma , Nack
        I2cstop
    End Function
    '*************************************************************

    Sub Id_klucza()

       Local Temp_b As Byte

       Reset Portd.7
       Waitms 25

       1wreset

       Set Portd.7
       Waitms 25

       If Err = 0 Then
          1wwrite &H33

          Key_id(1) = 1wread(8)

          If Key_id(8) = Crc8(key_id(1) , 7) Then
             Cls
             Lcd "ID: "

             For Temp_b = 1 To 4
                Lcd Hex(key_id(temp_b))
             Next Temp_b

             Locate 2 , 1
             Lcd "Odszukac klucz ?"

             Wait 1
          End If

          If S2_zapisz = 0 Then                                 'ZAPISZ/SZUKAJ
             Waitms 25

             If S2_zapisz = 0 Then
                Call Szukaj_id()
             End If
          End If
       Else
          Lcd "Brak klucza"
          Locate 2 , 1
          Lcd "w bazie: " ; Ile_wpisow()
          Waitms 200
       End If
    End Sub
    '*************************************************************

    Function Porownaj_klucze() As Byte

      Local Ilosc_bajtow_klucza_ok As Byte
      Local Temp_x As Byte

      Ilosc_bajtow_klucza_ok = 0

      For Temp_x = 1 To 4

       If Key_id(temp_x) = Id(temp_x) Then
          Incr Ilosc_bajtow_klucza_ok
       End If
      Next Temp_x

      Porownaj_klucze = Ilosc_bajtow_klucza_ok

    End Function
    '*************************************************************

    Sub Szukaj_id()

       Local Temp_a As Byte , Temp_c As Byte , Temp_e As Byte , Temp_f As Byte , Znalazl As Byte
       Local Temp_d As Word , Wolna_komorka As Word , Ilosc_wpisow As Word

    Petla_szukaj:

       Znalazl = 0
       Adres_wr = 0

       Ilosc_wpisow = Ile_wpisow()

       For Temp_d = 1 To Ilosc_wpisow
       Temp_c = 1
          For Temp_c = 1 To 4

             Id(temp_c) = Odczyt_z_eproma(adres_wr)

             Incr Adres_wr

          Next Temp_c

          Incr Adres_wr

          If Porownaj_klucze() = 4 Then
             Znalazl = 1

             Exit For
          End If
       Next Temp_d

       If Znalazl = 0 Then
          Do
             Cls
             Lcd ">> Nowy KLUCZ <<"
             Locate 2 , 1

             Lcd " Dodac do bazy?"
             Waitms 300

             If S1_anuluj = 0 Then                              'ANULUJ
                Waitms 25

                If S1_anuluj = 0 Then
                   Cls
                   Lcd "Anulowano"
                   Waitms 500

                   Exit Do
                End If
             End If

             If S2_zapisz = 0 Then                              'ZAPISZ
                Waitms 25

                If S2_zapisz = 0 Then
                   Ilosc_wpisow = Ile_wpisow()
                   Wolna_komorka = Ilosc_wpisow * 5

                   For Temp_e = 1 To 4
                      Call Zapis_do_eproma(wolna_komorka , Key_id(temp_e))
                      Incr Wolna_komorka
                   Next Temp_e

                   Call Wpisy_dodaj()

                   Cls
                   Lcd "  Dodano KLUCZ  "
                   Locate 2 , 1
                   Lcd "    do bazy    "
                   Wait 1

                   Goto Petla_szukaj

                   Call Dodatkowe_info(adres_wr)
                   Exit Do

                End If
             End If
          Loop

       Else
          Decr Adres_wr

          Cls
          Lcd "ZNALEZIONO KLUCZ"
          Wait 1

          Call Dodatkowe_info(adres_wr)
       End If

    End Sub
    '*************************************************************

    Sub Dodatkowe_info(byval Adres_kom_dodatkowe_info As Word)

       Local Adres_info As Byte
       Local Temp_b As Byte

       Adres_info = Odczyt_z_eproma(adres_kom_dodatkowe_info)

       Do
          Cls
          Lcd "PUNKTY: " ; Adres_info
          Waitms 100

          If S1_anuluj = 0 Then                                 'ANULUJ
             Waitms 25

             If S1_anuluj = 0 Then
               Exit Do
             End If
          End If

          If S2_zapisz = 0 Then                                 'ZAPISZ
             Waitms 25

             If S2_zapisz = 0 Then
                Goto Edycja_zapisz
             End If
          End If

          If S3_plus = 0 Then                                   'PLUS
             Waitms 25

             If S3_plus = 0 Then
                Incr Adres_info
             End If
          End If

          If S4_minus = 0 Then                                  'MINUS
             Waitms 25

             If S4_minus = 0 Then
                Decr Adres_info
             End If
          End If
       Loop

    Edycja_zapisz:

       Call Zapis_do_eproma(adres_kom_dodatkowe_info , Adres_info)

       Cls
       Lcd "SaVe: ";

       For Temp_b = 1 To 4
          Lcd Hex(key_id(temp_b))
       Next Temp_b

       Wait 1

    End Sub


    '*****************************************************************

    Function Ile_wpisow() As Word

       Ile_wpisow = Ids

    End Function
    '*****************************************************************

    Sub Wpisy_dodaj() As Byte

       Wpisow_ogolem = Ids
       Incr Wpisow_ogolem
       Writeeeprom Wpisow_ogolem , 1

    End Sub
    '*****************************************************************




    Do następnego projektu !!

    Pozdrawiam.