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
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 : |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Atmega 8-16 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
EEprom ansprechen | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Zum
Speichern der Daten wurden I2C-EEPROMs des Typs ST24C128 gewaehlt. Die Adressen werden in High und Low aufgeteilt, angesprochen wird zuerst die HIGH Adresse dann die Low. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Software für ein Einfaches Beispiel um Daten ins EEprom ein- und wieder auszulesen |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'--------------------------------------------------------------------------' $regfile = "m8def.dat" Config Sda = Portc.4 Dim X As Byte '----------schreibe ins eeprom------------- For A = 1 To 10 ' Schleifenanfang
'-----------lese aus eeprom------------------- Locate 2 , 1 Waitms 500 Loop |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 |