AVR - Bascom - externes EEPROM

Gast #262802
Lesenswert?

Hallo,

ich bin zwar in Bascom so recht fit - aber ich hab keine Ahnung wie ich
ein externes EEPROM an einen AVR anschließen und ansprechen soll.
Das Programm soll 10-15 stellige Zahlen in ein EEPROM schreiben. Und
davon ca. 5000.
Welches EEPROM soll ich nehmen? I²C? Fragen über Frage und hoffentlich
naht Hilfe!

Danke im Voraus!

Steffi
Gast #262803
Lesenswert?

hallo,

das kommt darauf an, wieviel platz bzw pinne du frei hast. ich würde
aus platzgründen generell ein I2C eeprom empfehlen... wenn du für jede
ziffer ein komplettes byte belegst (das wäre programmiertechnisch die
einfachste variante) würdest du bei 5000x15 bytes = 75Kbytes
benötigen..
das heisst ein 64k eeprom ist zu klein - du benötigst also 128k. da
wirst du mit nem parallelen eeprom nicht glücklich.
Gast #262804
Lesenswert?

Danke Basti,

aber erstmal Stopp! Bascom Long ist doch nur 10-stellig oder?

Angenommen ich nehm I²C und 256k weil´s dann e schon egal ist, wie geh´
ich da vor. Ich hab in meinem BASCOM-Buch gelesen, dass über I²C nur 16
Kbit!! adressiert werden können. Das stimmt nicht oder?

Hat jemand zufällig einen Beispielcode, wie das mit dem Ansprechen
geht, für mich auf Lager?

Danke und viele Grüße,
Steffi
Gast #262806
Lesenswert?

Hallo Basti,

ja das ist richtig. Aber länger als Long geht ja e nicht oder? Und da
Long nur 10 Stellen lang ist, habich wahrscheinlich ein Problem.
Aber das jetzt nur nebenbei.
Angenommen String 15stellig - hast Du da eine Lösung?

Danke!
Gast #262807
Lesenswert?

long: 4 bytes. das heißt pro zahl musst du i bytes im eeprom
speichern...
es gibt bestimmt irgendne funktion mit der du das long zerlegen kannst
in seine bytes. aber dafür schaust du mal auf www.roboternetz.de im
forum, da gibts direkt n bascom forum. die wissen meist aus erfahrung
mehr
Gast #262817
Lesenswert?

Hallo Steffi, hallo Basti,

nein, das stimmt nicht ganz. Von Microchip und SGS-Thomson z.B. gibt es
die 93Cxx-Serie. Das sind auch serielle EEPROMs, diese haben aber
Microwire und nicht I2C-bus. Außerdem gibt/gab es von Altera spezielle
EEPROMs für die Konfiguration von FPGAs. Diese hatten für damalige
Verhältnisse riesige Speichergrößen. Diese benutzen aber kein
bestimmtes Protokoll. Sprich, die takten einfach nur ihre Daten raus -
von Anfang bis Ende, kein Anlegen einer Adresse möglich. Die Chips in
Telefonkarten sind auch serielle EEPROMs - wieder anderes Protokoll und
es gibt sicher noch mehr...

Gruß,
Markus_8051
Gast #262818
Lesenswert?

Hab den 24c256 mal verbaut, ist ne ganz einfache Geschichte
die Serie mit Bascom zu verwenden.
Dafür gibts den I2C-Befehlssatz. Zu merken ist aber:
Du musst Deine Daten in Bytes zerlegen um sie zu speichern
und Byte für Byte rüber schieben.
Beim auslesen dann das ganze in die Geggenrichtung.
Die Adresse der EEPROM werden über die Pins am 24c... per
Aussenbeschaltung eingestellt, Datenblatt beachten.
Du kannst bis zu 4 der Teile parallel auf den I2C hängen,
mußt nur unterschiedliche Adressen vergeben.
Wichtig: Pullup-Widerstände nicht vergessen!
Zu den HC24C... Bausteinen gibts unter Bascom Samples ne Anleitung
mit Beispielcode, der einfach einzubauen ist.
Gast #262819
Lesenswert?

Code for Bascom to work with a 24LC256 I2c EEPROM

'24lc256
Const E_ctlw = &HA0
Const E_ctlr = &HA1

Dim E_ah As Byte
Dim E_al As Byte
Dim E_addr As Word
Dim E_dat As Byte
Dim Dat As Byte

Declare Sub E_write(byval E_addr As Word , Dat As Byte)
Declare Sub E_read(byval E_addr As Word , E_dat As Byte)
Declare Sub 24lc256_test

call 24lc256_test
end

' Routine to test the 24LC256
'
Sub 24lc256_test
'Test read and writes
   Print "Testing I2C Eeprom"
      Dat = 0
      For E_addr = &H1000 To &H1010
          Call E_write(e_addr , Dat)
          Call E_read(e_addr , E_dat)
          Print E_dat ; " ";
          Incr Dat
          Incr Dat
          Incr Dat                                          ' +1 +1
+1
      Next E_addr

   Print
   Print "Here a counter should appear from 0, 3, 6, 9, 12, 15, 18,
21, 24, 27 etc."
   Print "End of Test"
End Sub


' Routine to write the 24LC256
'
Sub E_write(byval E_addr As Word , Dat As Byte)
    E_ah = High(e_addr)
    E_al = Low(e_addr)
    I2cstart
    I2cwbyte E_ctlw
    I2cwbyte E_ah
    I2cwbyte E_al
    I2cwbyte Dat
    I2cstop
    Waitms 10
End Sub


' Routine to read the 24LC256
'
Sub E_read(byval E_addr As Word , E_dat As Byte)
    E_ah = High(e_addr)
    E_al = Low(e_addr)
    I2cstart
    I2cwbyte E_ctlw
    I2cwbyte E_ah
    I2cwbyte E_al
    I2cstart
    I2cwbyte E_ctlr
    I2crbyte E_dat , Nack
    I2cstop                                                 '
End Sub

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren