erstellt 17.03.2009
EEprom und I2C ( TWI )
Es gibt zu einem die Möglichkeit Daten im internen EEprom des Atmega zu speichern so das sie dauerhaft also auch nach einem Spannungsverlust zu Verfügung stehen,
oder man bedient sich der Möglichkeit über ein Externes EEprom Daten abzuspeichern.
Das interne EEprom hat den Vorteil das es sowieso verfügbarer Speicher ist, allerdings mit begrenzter Kapazität.
Das Externe EEprom hat meist je nach Baustein mehr Kapazität , bedeutet aber mehr Schaltungsaufwand.
Kommen wir zuerst zum Internen EEprom.
Die Kapazität des  interne EEprom ist vom jeweiligen Atmega Controller abhängig und daher sehr differenziert, hier sollten man sich das Datenblatt zu Rate ziehen.
Gehen wir von einem Atmega 8 aus
Um ein EEprom am Atmega anzuschliessen, benötige ich die Pin's 27 und 28 am Atmega 8.


Als EEprom wird hier der Typ 24C128, oder 24C256 verwendet, diese Typen besitzen als Interface einen I2C ( oder bei Atmel auch TWI genannt) .
Zur I2C Übertragung werden außer Masse nur zwei Leitungen benötigt. Einmal die Datenleitung SDA  und eine Taktleitung SCL.
Die Leitungen SDA und SCL müssen über PullUp Wiederstände auf Vcc ( in diesem Fall auf +5 Volt ) gezogen werden.
Die größe der Widerstände muss man sich anhand des Datenblattes (Phillips I2C Spezifikation ) berechnen, hier verwende ich Widerstände mit ca 1,8 KOhm.
Der Datenaustausch findet folgendermaßen statt:
Der Atmega prüft zuerst die Pegel der Leitungen SDA und SCL, wenn beide Leitungen High führen weiß der Atmega das der Bus frei ist,
erst dann erzeugt der Atmega ein Startsignal welches die Datenleitung SDA auf Masse zieht, allerdings bleibt die Taktleitung SCL auf High.
Damit hat der Atmega dann den Bus für sich beschlagnahmt, anschließend sendet der Atmega die Adresse des EEprom.
Diese Adresse ist ein Byte groß.

Adress - Byte

Bit 7 6 5 4 3 2 1 0
  Vorgegebene intern verdrahtet Adress-Bit des EEprom Vorgegebene intern verdrahtet Adress-Bit des EEprom Vorgegebene intern verdrahtet Adress-Bit des EEprom Vorgegebene intern verdrahtet Adress-Bit des EEprom Bits werden am EEprom durch Brücken festgelegt Bits werden am EEprom durch Brücken festgelegt Bits werden am EEprom durch Brücken festgelegt

1=Leseoperation

0=Schreiboperation

         

PIN 3 am
EEprom

PIN 2 am EEprom PIN 1 am EEprom PIN 7 am EEprom
Das durch seine Adresse angesprochene EEprom zieht die Datenleitung SDA auf LOW , dadurch weiß der Atmega das dass EEprom bereit ist.
Bleibt hingegen die Datenleitung SDA HIGH dann weiß der Atmega das er kein EEprom gefunden hat, auf Grund des vorher gesetzten Bit 0 ( im obrigen Adress-Byte) weiß der Atmega nun ob er im EEprom lesen oder schreiben soll.

Abbildung eines EEprom 24C128, wobei die EEproms 24C64 und 24C256 die gleiche Anschlussbelegung vorweisen Datenblatt hier :

EEprom 24C128
Pin Anschluss
Funktion
Beschreibung
1 A0
Pin für Adresseinstellung
Auf Masse Adresse 0 Damit haben wir die Adresse des EEprom auf 000 gesetzt
2 A1 Auf Masse Adresse 0
3 A2 Auf Masse Adresse 0
4 GND
Masse
Auf Masse legen ( Minus)
5 SDA
Datenleitung
Über einen PullUp Widerstand auf Pin 27 des Atmega
6 SCL
Taktleitung
Über einen PullUp Widerstand auf Pin 28 des Atmega 8
7 WP
Schreibschutz
Auf Masse Damit ist der Schreibschutz aufgehoben
8 Vcc
Versorgungsspannung
+ 5 Volt Versorgungsspannung
Atmega 8-16
 


 

EEprom ansprechen

Zum Speichern der Daten wurden I2C-EEPROMs des Typs ST24C128 gewaehlt.
Der Speicherbaustein hat eine Kapazität von 16384 X 8 Bit also 128 Kbits und wird hardwareseitig ueber die Pins 1 und 2 und 3 Adressiert,indem der jeweiligen Pin auf 5V (high)
oder Masse (low) gelegt wird.
Somit koennen maximal 8 EEPROMs ueber einen Bus adressiert werden.

Die Adressierung des EEproms geschieht über einen Adressraum von 2 Byte, damit können also maximal 65535 Adressen angesprochen werde.
Die Adressen werden in High und Low aufgeteilt, angesprochen wird zuerst die HIGH Adresse dann die Low.
Dim Adresse As Word AT $100
Adresse wird als Word Variable ab Adresse 100 abgelegt

Dim Low_Adresse as Byte At $100 Overlay
Zeiger der auf die ersten 8 Bit der Adresse im Speicher zeigt

Dim High_Adresse as Byte At $101 Overlay
Zeiger der auf die zweiten 8 Bit der Aderesse im Speicher zeigt






Software für ein Einfaches Beispiel um Daten ins EEprom ein- und wieder auszulesen

'--------------------------------------------------------------------------'
' Test zum beschreiben und auslesen des I2C EEprom 24C128
' '
' Ausgabe fortlaufender Nummerierung auf dem Display und dem Terminalprogramm '
'------------------------------------------------------------------
' '
'Testprogramm für ATmega8 '
'Der gesendete Text kann mit dem Hyperterminal von Windows angezeigt werden' '
'Einstellungen am Hyperterminal: '
' Bits pro sekunde: 9600 '
' Datenbits : 8 '
' Parität : keine '
' Stoppbits : 1 '
' Flusssteuerung : keine '
'Display an folgenden Pins
'B5 = Enable
'B4 = RS
'B3 = DB7
'B2 = DB6
'B1 = DB5
'B0 = DB4

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

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

Dim X As Byte
Dim A As Byte
Dim B As Byte
Dim Lesen As Byte
Cls

'----------schreibe ins eeprom-------------
Do

For A = 1 To 10 ' Schleifenanfang
Incr X ' Variable X wird bei jedem Schleifendurchgang um eins hochgezählt
I2cstart ' Starte I2C
I2cwbyte &HA0 ' Geräteadresse senden
I2cwbyte 1 ' High Speicheradresse senden
I2cwbyte A ' Low Speicheradresse Senden
I2cwbyte X ' Sende Wert aus Variable X
I2cstop ' I2C Stop
Waitms 10 ' Pause von 10 Millisekunden
Locate 1 , 1 ' Display Cursor in Zeile 1 Spalte 1 setzen
Lcd "ins EEprom= " ; X ; "" ' Diplayanzeige der Variable X
Print " ins EEprom= " ; X ; "" ' Terminal Anzeige der Variable X
Waitms 500 ' Pause
Next A ' Schleifenende

 

'-----------lese aus eeprom-------------------
For B = 1 To 10 ' Schleifenanfang
I2cstart
I2cwbyte &HA0
I2cwbyte 1
I2cwbyte B
I2cstart
I2cwbyte &HA1
I2crbyte Lesen , Nack
I2cstop

Locate 2 , 1
Lcd "Lese EEprom =" ; Lesen ; ""
Print "Lese EEprom = " ; Lesen ; ""

Waitms 500
Next B

Loop
End

Download des Programm als *.bas und als *.hex
 
Funktion
Durch die Schleife wird mit der Anweisung " Incr X " der Wert 1 bei jedem Schleifendurchgang immer um eins erhöht und anschließend ins EEprom geschrieben
Nachden die hochgezählten Werte abhängig der Vorgabe im Schleifenaufruf hier z.B 10 im Eeprom gespeichert ist wird der Wert unter Zuhilfenahme der Schleife B wieder aus dem EEprom ausgelesen , das Schreiben sowie das Lesen wird im Display sowohl auch mit dem Terminal Programm zur Anzeige gebracht.
In disem Fall können bei abändern der Werte für die Schleife A sowohl Schleife B Adressen bis 255 angegeben werden.Weil wir hier die Variablen X- A- und B als Byte deklariert haben, wollen wir mehr als 255 Adressen anspringen, und somit auch mehr Werte ins EEprom speichern , müssen wir diese Variable als " Long" deklarieren.
Aktualisiert 26.01.2019
Copyright by Ms 2009