Armins AVR-Buch - Internes_EEPROM_nutzen

Zuletzt geändert am 15.01.2021, 01:22:15

Internes EEPROM nutzen




Der ATMega8 hat hat ein internes EEPROM mit 512 Byte das sich hervorragend zum speichern von Meßwerten eignet.
Diese Meßwerte bleiben auch beim Abschalten der Betriebsspannung erhalten.
Dazu gibt es zwei Befehle.


Writeeeprom A , 1 speichert den Wert der Variablen A in Speicherzelle 1
      
Readeeprom A , 1 liest Speicherzelle 1 aus und weist den Wert der Variablen A zu


Es können nur Varablen des Typs Byte direkt abgespeichert werden.
Bei größeren Werten die mehrere Bytes benötigen, muß man den Wert in einzelne Bytes zerlegen.
Diese muß man dann einzeln abspeichern und später, beim Auslesen, wieder zusammensetzen.
Es ist zu beachten, daß ein EEPROM nicht beliebig oft beschrieben werden kann.
Sondern nur ca 100000 mal. Daher sollte man das Abspeichern von Daten nicht in einer schnellen
Schleife tun.

Muß man z.b. einen Analogwert zerlegen geht das so:
$regfile = "m8def.dat"
$Crystal=10000000
$hwstack=32
$swstack=32
$framesize = 32
Dim A As Byte
Dim B As Word


Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Analog Digital Wandler konfigurieren
B = Getadc(0)

A = High(b) ' weist a das MSB (High-Byte) des Words b zu
Writeeeprom A , 1 ' speichert a in Zelle 1
A = Low(b) ' weist a das LSB (Low-Byte) des Words b zu
Writeeeprom A , 1 ' speichert a in Zelle 2


So wird der Meßwert wieder aus Low und High-Byte zusammengebaut:

$regfile = "m8def.dat"
$Crystal=10000000
$hwstack=32
$swstack=32
$framesize = 32
Dim A As Byte
Dim B As Word


Readeeprom A , 1 ' Speicherzelle 1 (High-Byte) in die Variable a auslesen
B = A * 256 ' High-Byte *256 multiplizieren und b zuweisen
Readeeprom A , 2 ' Speicherzelle 2 (Low-Byte) in die Variable a auslesen
B = B + A ' Low-Byte dazu addieren





Hier ein Beispielprogramm.
Ich habe den Analogwert durch 4 geteilt damit er auf jeden Fall in ein Byte paßt.
Es schreibt 100 Werte alle 4 Sekunden in das EEPROM.
Wenn 100 Werte erfaßt sind, gibt das Programm in einer Schleife die Werte über die RS232 aus.

$regfile = "m8def.dat"
$Crystal=10000000
$hwstack=32
$swstack=32
$framesize = 32
$baud = 2400

Dim Wert As Byte
Dim Flag As Bit
Dim Zahl As Byte
Dim Schleife As Byte
Config Portc.0 = Input
Config Timer1 = Timer , Prescale = 64
On Timer1 Timerroutine
Enable Timer1
Enable Interrupts
Start Timer1 'Timer konfigurieren alle 4 Sekunden

Zahl = 0
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Analog Digital Wandler konfigurieren

Do
If Flag = 1 Then
Flag = 0
Wert = Getadc(0) 'Analogwert einlesen
Wert = Wert / 4 'Analogwert/4 damit er in ein Byte paßt
Incr Zahl
Writeeeprom Wert , Zahl 'Analogwert ins EEprom schreiben
End If

If Zahl = 100 Then 'Wenn 100 Werte eingelesen dann ausgeben
Zahl = 0 ' Timer stoppen
Stop Timer1
For Schleife = 1 To 100
Readeeprom Wert , Schleife ' Analogwert aus EEprom lesen
Print Wert 'Wert über serielle Schnittstelle ausgeben
Waitms 500
Next
End If
Start Timer1 'Timer wieder starten
Loop


Timerroutine:
Flag = 1

Return

End