Zitat von
Rage_Empire
Ok, danke. hab ich geändert.
Jetzt versteh ich noch nicht ganz, warum das EEPROM für ein Byte genau so viel Zeit benötigt wie für den Page-Write modus wo mehr Informationen gespeichert werden?
Es braucht schon etwas mehr Zeit, das fällt Dir aber nicht auf. Das Übergeben der Adresse geht so flott, daß es nicht ins Gewicht fällt. Was Zeit braucht (10mS) ist das Schreiben der Daten. Im Gegensatz zu Tomas würde ich daher den Waitbefehl auch drinlassen, aus Übersichtlichkeitsgründen aber Waitms statt Waitus nehmen.
Damit ist sichergestellt, daß die Daten fehlerfrei geschrieben werden. Es geht wegen des Zeitverbrauchs der restlichen Routine meist auch ohne, nur verlassen kann man sich nicht darauf. Sonst müsste man schulmäßig abfragen, ob das EEprom bereits fertig ist (siehe Datenblatt).
Byte-Write: Muß man nach jedem Byte ein Stop machen, oder kann man mit einem neuen Start gleich das nächste Byte schreiben?
Ja, das Stop ist zwingend notwendig, sonst bist Du wieder ganz unfreiwillig im Page/Blockwrite Modus .
Etwas allgemeines zu Demprogrammen:
Es ist zweckmäßig bei Demos "Klein Fritzchen"- mäßig vorzugehen. Wir wollen ja nicht beweisen, wie schön wir Schleifen verschachteln können und wie kryptisch Programme sein können, sondern demonstrieren, wie der Quatsch im Prinzip funktioniert.
Auch aussagekräftige Variablennamen, und geordnete Kommentare sind wichtig.
Hier mal ein Beispiel zum Wordwrite mit einem anderen Ansatz, das aus eben diesen Gründen so simple gestrickt ist (die Kopfdeklarationen bitte einfach überlesen, die sind nur für meinen Experimenter interessant):
Code:
'-------------------------------------------------------------------------------
'-------------- 24Cxx EEPROM Test für M8 /168 /M32-Experimenter ----------------
' April 2006 - HR
'-------------------------------------------------------------------------------
$regfile = "m8def.dat"
'$regfile = "m168def.dat"
$regfile = "m32def.dat"
$crystal = 7372800
'$crystal = 14745000
'$crystal = 16000000
$baud = 9600
$hwstack = 64
$swstack = 64
$framesize = 64
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'$lib "i2c_twi.lbx" 'Hardware I2C
'Config Twi = 100000
Config Scl = Portc.5 'für Mega8 und 168
Config Sda = Portc.4
Portc.5 = 1
Portc.4 = 1
'Config Scl = Portc.0 'für Mega16 und 32
'Config Sda = Portc.1
'Portc.0 = 1
'Portc.1 = 1
I2cinit
'-------------------------------------------------------------------------------
$lib "Lcd_i2c.lib" 'i2c Treiber für das LCD
Dim _lcd_e As Byte 'Nötig für die Enable Auswahl
_lcd_e = 128 'Für LCDs mit 1 Controller
Waitms 200
'-------------------------------------------------------------------------------
Config Lcd = 16 * 2
Display On
Cursor Off
'-------------------------------------------------------------------------------
Config Adc = Single , Prescaler = Auto 'Für Analogtastatur
Config Portd.3 = Output 'Für LED1
Config Portd.4 = Output 'Für LED2
'Beep Alias Portc.2 'für Mega32
Beep Alias Portb.0 'für Mega8
'-------------------------------------------------------------------------------
Const Pcf8591 = 144 'DA-AD-Wandler auf Basis
Const Eeprom2 = 166 'Eeprom2 auf Basis
Const Eeprom1 = 174 'Eeprom1 oder Ram auf Basis
Const Eeprom0 = 160 'externes Cip Card Eeprom0
Const Pcf8574_1 = 64
Const Tda8444 = 78 'DA-Wandler auf Extension-Platine
Const Pcf8574_lcd = 112 'Portextension für LCD
Const Pcf8583_rtc = 162 'RTC auf Extension-Platine
Const Max520 = 94 'für MAX520 (extern)
Const Keyboard = 0 'ADC-Nr. für Analogtastatur
'-------------------------------------------------------------------------------
Declare Function Read_eeprom(byval Dev As Byte , Byref Address As Word)as Byte
Declare Function Read_eeprom_word(byref Address As Word)as Word
Declare Sub Write_eeprom(byval Dev As Byte , Byref Address As Word , Byval Wert_
As Byte)
Declare Sub Write_eeprom_word(byref Address As Word , Byref Value As Word)
Dim Address_low As Byte 'Address ist hier überlappend
Dim Address_high As Byte 'dimensioniert, um High- und Low-
Dim Address As Word At Address_low Overlay 'Byte einfach ansprechen zu können.
Dim Value_low As Byte 'Dito mit Value
Dim Value_high As Byte
Dim Value As Word At Value_low Overlay
Dim Wert As Byte
Dim Temp_w As Word
Dim I As Word
'------------------------------ Demodurchlauf ----------------------------------
Cls 'Intro
Lcd "EEPROM TEST"
Locate 2 , 1
Lcd "SCHREIBE"
Wait 2
Value = 1500
For Address = 250 To 500 'von Adresse 250 bis 500
Call Write_eeprom_word(address , Value) 'value ins EEprom schreiben.
Value = Value + 20 'Value zur Abwechslung
Next 'um 20 erhöhen
'-------------------------------------------------------------------------------
Wait 2
Cls
Lcd " LESE"
For Address = 250 To 500 'die Werte wieder auslesen
Temp_w = Read_eeprom_word(address)
Locate 2 , 1
Lcd "A: " ; Address ; " " ; "W: " ; Temp_w ; " "
Wait 1 'Pause, damit man was sieht
Next
Locate 1 , 1
Lcd "FERTIG"
'------------------------ Ende Demodurchlauf -----------------------------------
End
'------------------------ Funktionen und Subs ----------------------------------
'-------------------------------------------------------------------------------
'- Word (value) auf 2 aufeinander folgende EEprom Adressen schreiben
Sub Write_eeprom_word(byref Address As Word , Byref Value As Word)
Call Write_eeprom(eeprom1 , Address , Value_low)
Incr Address
Call Write_eeprom(eeprom1 , Address , Value_high)
End Sub
'-------------------------------------------------------------------------------
'- Word von 2 aufeinanderfolgenden EEprom Adressen lesen
'- Der gelesene Wert ist der Rückgabewert der Funktion
Function Read_eeprom_word(byref Address As Word)as Word
Value_low = Read_eeprom(eeprom1 , Address)
Incr Address
Value_high = Read_eeprom(eeprom1 , Address)
Read_eeprom_word = Value
End Function
'-------------------------------------------------------------------------------
'- Byte (wert) auf EEprom Adresse (address) speichern
Sub Write_eeprom(byval Dev As Byte , Byref Address As Word , Byval Wert As Byte)
I2cstart
I2cwbyte Dev
I2cwbyte Address_high
I2cwbyte Address_low
I2cwbyte Wert
I2cstop
Waitms 10
End Sub
'--------------------------------------------------------
'- Byte von EEprom Adresse (address) lesen
'- Der gelesene Wert ist der Rückgabewert der Funktion
Function Read_eeprom(byval Dev As Byte , Byref Address As Word)
Dim Devread As Byte
Devread = Dev + 1
I2cstart
I2cwbyte Dev
I2cwbyte Address_high
I2cwbyte Address_low
I2cstop
I2cstart
I2cwbyte Devread
I2crbyte Read_eeprom , Nack
I2cstop
End Function
'------------------------------------------------------------------------------
Viele Grüße
Henrik
Lesezeichen