Armins AVR-Buch - Externes_EEProm_24CXX_benutzen

⇑Externes_EEProm_24CXX_benutzen


(armin77, 06.03.2013, 12:49:34)

Oft möchte man viele Meßwerte abspeichern. Dazu bieten sich die externen EEProm`s
der Familie 24CXX an. Die lassen sich bequem über den I2C Bus ansteuern.
Das XX gibt die Speichergröße in kbit an.
24C64 bedeutet also eine Speichergröße von 64kbit = 64 *1024 = 65536 bit

Die Beschaltung aller 24CXX ist fast gleich:

Bild 24cxx.JPG

Besonderheiten vor allen der kleineren EEProm bitte im entsprechenden Datenblatt nachschauen

SDA und SCL sind die I2C Bus Anschlüsse.
A0 bis A2 sind die Adreßkonfiguration (GND=0, +5V = 1)
Wenn am Anschluß WC +5V angelegt werden ist das EEProm schreibgeschützt.

Die I2C Bus Adresse des 24CXX besteht aus einem festen Teil (Bit4 bis Bit7)
und einem beschaltungs abhängigem Teil (Bit1 bis Bit3)
Bit 0 gibt an, ob geschrieben oder gelsen werden soll.

Bild Tabelle3.jpg

Legt man z.B bei einem 24C64 A0 bis A2 auf GND ergibt sich:

Eine Leseadresse: Binär: 10100001 oder Hex: A1 oder Dezimal: 161
Eine Schreibadresse: Binär: 10100000 oder Hex A0 oder Dezimal: 160

Wie man die Adresse angibt, bleibt jedem überlassen.

Bei den EEProm's 24C01 bis 24C16 erfolgt die Speicher Adressierung mit einem Byte.
Gesendet wird also:
Die EEPRom Adresse, die Speicher Adresse (1Byte) und die Daten (Byteweise).

Schreiben der EEProm`s 24C01 bis 24C16:

Bild EEprom1.JPG


Lesen der EEProm`s 24C01 bis 24C16:


Bild EEprom2.JPG


Bei den EEProm's 24C32 bis 24C512 erfolgt die Speicher Adressierung mit zwei Byte.
Gesendet wird also:
Die EEPRom Adresse.
Die Speicher Adresse (2Byte) wobei zuerst das High Byte und dann das Low Byte der Adresse gesendet wird.
Zum Schluß die Daten (Byteweise).

Schreiben der EEProm`s 24C32 bis 24C512:

Bild EEprom3.JPG

Lesen der EEProm`s 24C32 bis 24C512:

Bild EEprom4.JPG


So wird das EEProm 24C64 an den AVR angeschlossen.
Die Pull-Up Widerstände an SDA und SCL des I2C Buses sind sehr wichtig.
Den Analogwert gebe ich mit einem Poti an Portc.0.


Bild 24Cschalt.JPG


Hier ein Beispielprogramm mit einem 24C64.
Ich lese am Analog-Digital Wandler Eingang Portc.0 den Wert ein.
Da das EEProm nur Byteweise speichern kann, teile ich den Analogwert durch 4.
Danach schreibe ich jede Sekunde diesen Wert in einer Schleife in das EEProm.
Wenn 250 Werte gespeichert sind lese ich diese Werte in einer zweiten Schleife
wieder aus und lasse sie auf einem LCD 4*20 anzeigen.

$regfile = "m8adef.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32

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

Dim Adcwert As Word
Dim Schleife As Byte
Dim Ausgabe As Byte
Dim Schleife2 As Byte

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 20 * 4
Cls
Cursor Off
Waitms 10
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC Konfigurieren
Do

For Schleife = 1 To 250

Adcwert = Getadc(0) 'ADC Wert einlesen
Adcwert = Adcwert / 4 'ADC Wert durch 4 teilen damit Wert nicht größer als 255 ist
I2cstart 'EEProm Schreib Adresse
I2cwbyte &HA0
I2cwbyte 1 'Speicheradresse High - Byte
I2cwbyte Schleife 'Speicheradresse LOW - Byte
I2cwbyte Adcwert 'Wert schreiben
I2cstop
Lcd "Schreibe Wert: " ; Schleife 'Ausgabe auf LCD
Locate 2 , 1
Lcd "Wert " ; Adcwert
Wait 1
Cls
Next Schleife

For Schleife2 = 1 To 250
I2cstart
I2cwbyte &HA0 'EEProm Schreib Adresse
I2cwbyte 1 'Speicheradresse High - Byte
I2cwbyte Schleife2 'Speicheradresse LOW - Byte
I2cstart
I2cwbyte &HA1 'EEProm Lese Adresse
I2crbyte Ausgabe , Nack 'Wert auslesen und in Variable Ausgabe speichern
I2cstop
Lcd "Lese Wert Nr: " ; Schleife2 'Ausgabe auf LCD
Locate 2 , 1
Lcd "Wert: " ; Ausgabe
Wait 1
Cls
Next schleife2


Loop
End


Bei den keineren EEProm`s (bis 24C16) entfällt die Angabe des High-Byte`s bei der Adressierung der Speicheradresse.

$regfile = "m8adef.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32

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

Dim Adcwert As Word
Dim Schleife As Byte
Dim Ausgabe As Byte
Dim Schleife2 As Byte

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 20 * 4
Cls
Cursor Off
Waitms 10
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC Konfigurieren
Do

For Schleife = 1 To 250

Adcwert = Getadc(0) 'ADC Wert einlesen
Adcwert = Adcwert / 4 'ADC Wert durch 4 teilen damit Wert nicht größer als 255 ist
I2cstart 'EEProm Schreib Adresse
I2cwbyte &HA0
I2cwbyte Schleife 'Speicheradresse
I2cwbyte Adcwert 'Wert schreiben
I2cstop
Lcd "Schreibe Wert: " ; Schleife 'Ausgabe auf LCD
Locate 2 , 1
Lcd "Wert " ; Adcwert
Wait 1
Cls
Next Schleife

For Schleife2 = 1 To 250
I2cstart
I2cwbyte &HA0 'EEProm Schreib Adresse
I2cwbyte Schleife2 'Speicheradresse
I2cstart
I2cwbyte &HA1 'EEProm Lese Adresse
I2crbyte Ausgabe , Nack 'Wert auslesen und in Variable Ausgabe speichern
I2cstop
Lcd "Lese Wert Nr: " ; Schleife2 'Ausgabe auf LCD
Locate 2 , 1
Lcd "Wert: " ; Ausgabe
Wait 1
Cls
Next schleife2


Loop
End