TobiasBlome
22.11.2009, 22:41
Hallo,
ich möchte Werte aus einer WordVariable im extenen I²C EEProm speichern. (Habe ein 24C512N)
Als Byte funktioniert es wunderbar. Nun habe ich versucht das Word in 2 Bytes zu trennen:
Wert1 = High(wert)
Wert2 = Low(wert)
und hinterher beim lesen zusammenzufügen:
Lesen = Makeint(lesenhigh , Lesenlow)
aber irgendetwas mache ich da falsch, weil nicht die gespeicherten Werte herauskommen.......
könnt ihr mir weiterhelfen?
$regfile = "m8def.dat" 'MEGA8-Deklarationen
$hwstack = 32
$swstack = 8
$framesize = 24
$crystal = 8000000 'intern 8MHz
$baud = 9600 'Baudrate definieren
'-------------------------------------------------------------------------------
'Ein / Ausgänge definieren:
'Ddrb = &B00111100 '0=Eingang
'Ddrc = &B1111111
Ddrd = &B01100011 '0=Eingang
'PullUps setzen:
'Portb = &B00000000 '1 = PullUp AKTIV
'Portc = &B0000000 '1 = PullUp AKTIV
'Portd = &B00000000 '1 = PullUp AKTIV
'-------------------------------------------------------------------------------
'Alias
Taster1 Alias Pind.2
Taster2 Alias Pind.3
Taster3 Alias Pind.4
Led1 Alias Portd.5
Led2 Alias Portd.6
'-------------------------------------------------------------------------------
'Variablen
'-------------------------------------------------------------------------------
'Timer
'Timer1 = 2x / sec bei 8MHz
'Config Timer1 = Timer , Prescale = 256 'Teiler
'Const Timervorgabe = 49910
'Enable Timer1
'Enable Interrupts
'-------------------------------------------------------------------------------
Dim Wert As Word
Dim Wert1 As Byte
Dim Wert2 As Byte
Dim Lesen As Word
Dim Lesenlow As Byte
Dim Lesenhigh As Byte
Dim Adresse As Word At $160 'Die Adresse als Word-Variable
Dim Low_adresse As Byte At $160 Overlay 'Zeiger auf das erste Byte
Dim High_adresse As Byte At $161 Overlay 'Zeiger auf das zweite Byte
'SDA und SCL definieren
Config Sda = Portc.4 ' I2C-Port festlegen
Config Scl = Portc.5 ' I2C-Port festlegen
Const Ext_eeprom = 162 'I2C Geräteadresse ggf. anpassen
Wert = 12345
'-------------------------------------------------------------------------------
'Für RS232:
'On Urxc Onrxd 'Interrupt-Routine setzen
'Enable Urxc 'Interrupt URXC einschalten
Enable Interrupts 'Interrupts global zulassen
'---------------------------------------------------------------------------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Do
If Taster1 = 1 Then
'----schreiben----
For Adresse = 250 To 260 'Adresse geht über die Byte-Grenze
Incr Wert '1 bis Überlauf
Gosub Eeprom_schreiben
Print "schreiben ->Adres.=" ; Adresse ; "Wert=" ; Wert ; " " 'Anzeige vom schreiben
Waitms 500
Next Adresse
End If
If Taster2 = 1 Then
'---lesen----
For Adresse = 250 To 260
Gosub Eeprom_lesen
Lesen = Makeint(lesenhigh , Lesenlow)
Print "lesen <-Adres.=" ; Adresse ; "Wert=" ; Lesen ; " " 'Anzeige vom lesen
Waitms 500
Next Adresse
End If
Loop
'------------------------------------------------------
'- Byte (wert) auf EEprom Adresse (address) speichern -
'------------------------------------------------------
Eeprom_schreiben:
Wert1 = High(wert)
Wert2 = Low(wert)
I2cstart 'Start
I2cwbyte &HA0 'Sende Slavadresse
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse LOW
I2cwbyte Wert1 'Sende Wert
I2cwbyte Wert2 'Sende Wert
I2cstop 'stop
Waitms 10
Return
'-----------------------------------------------------------------
'--- Byte (wert) von EEprom Adresse (address) lesen ---
'-----------------------------------------------------------------
Eeprom_lesen:
I2cstart 'Start
I2cwbyte &HA0 'Sende Slavadresse +1 für Schreiben
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse Low
I2cstart 'Start
I2cwbyte &HA1 'Sende Slavadresse +1 für Lesen
I2crbyte Lesenhigh , Lesenlow 'Lese Adresse vom EEprom
I2cstop 'Stop
Return
Danke, Tobias
ich möchte Werte aus einer WordVariable im extenen I²C EEProm speichern. (Habe ein 24C512N)
Als Byte funktioniert es wunderbar. Nun habe ich versucht das Word in 2 Bytes zu trennen:
Wert1 = High(wert)
Wert2 = Low(wert)
und hinterher beim lesen zusammenzufügen:
Lesen = Makeint(lesenhigh , Lesenlow)
aber irgendetwas mache ich da falsch, weil nicht die gespeicherten Werte herauskommen.......
könnt ihr mir weiterhelfen?
$regfile = "m8def.dat" 'MEGA8-Deklarationen
$hwstack = 32
$swstack = 8
$framesize = 24
$crystal = 8000000 'intern 8MHz
$baud = 9600 'Baudrate definieren
'-------------------------------------------------------------------------------
'Ein / Ausgänge definieren:
'Ddrb = &B00111100 '0=Eingang
'Ddrc = &B1111111
Ddrd = &B01100011 '0=Eingang
'PullUps setzen:
'Portb = &B00000000 '1 = PullUp AKTIV
'Portc = &B0000000 '1 = PullUp AKTIV
'Portd = &B00000000 '1 = PullUp AKTIV
'-------------------------------------------------------------------------------
'Alias
Taster1 Alias Pind.2
Taster2 Alias Pind.3
Taster3 Alias Pind.4
Led1 Alias Portd.5
Led2 Alias Portd.6
'-------------------------------------------------------------------------------
'Variablen
'-------------------------------------------------------------------------------
'Timer
'Timer1 = 2x / sec bei 8MHz
'Config Timer1 = Timer , Prescale = 256 'Teiler
'Const Timervorgabe = 49910
'Enable Timer1
'Enable Interrupts
'-------------------------------------------------------------------------------
Dim Wert As Word
Dim Wert1 As Byte
Dim Wert2 As Byte
Dim Lesen As Word
Dim Lesenlow As Byte
Dim Lesenhigh As Byte
Dim Adresse As Word At $160 'Die Adresse als Word-Variable
Dim Low_adresse As Byte At $160 Overlay 'Zeiger auf das erste Byte
Dim High_adresse As Byte At $161 Overlay 'Zeiger auf das zweite Byte
'SDA und SCL definieren
Config Sda = Portc.4 ' I2C-Port festlegen
Config Scl = Portc.5 ' I2C-Port festlegen
Const Ext_eeprom = 162 'I2C Geräteadresse ggf. anpassen
Wert = 12345
'-------------------------------------------------------------------------------
'Für RS232:
'On Urxc Onrxd 'Interrupt-Routine setzen
'Enable Urxc 'Interrupt URXC einschalten
Enable Interrupts 'Interrupts global zulassen
'---------------------------------------------------------------------------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Do
If Taster1 = 1 Then
'----schreiben----
For Adresse = 250 To 260 'Adresse geht über die Byte-Grenze
Incr Wert '1 bis Überlauf
Gosub Eeprom_schreiben
Print "schreiben ->Adres.=" ; Adresse ; "Wert=" ; Wert ; " " 'Anzeige vom schreiben
Waitms 500
Next Adresse
End If
If Taster2 = 1 Then
'---lesen----
For Adresse = 250 To 260
Gosub Eeprom_lesen
Lesen = Makeint(lesenhigh , Lesenlow)
Print "lesen <-Adres.=" ; Adresse ; "Wert=" ; Lesen ; " " 'Anzeige vom lesen
Waitms 500
Next Adresse
End If
Loop
'------------------------------------------------------
'- Byte (wert) auf EEprom Adresse (address) speichern -
'------------------------------------------------------
Eeprom_schreiben:
Wert1 = High(wert)
Wert2 = Low(wert)
I2cstart 'Start
I2cwbyte &HA0 'Sende Slavadresse
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse LOW
I2cwbyte Wert1 'Sende Wert
I2cwbyte Wert2 'Sende Wert
I2cstop 'stop
Waitms 10
Return
'-----------------------------------------------------------------
'--- Byte (wert) von EEprom Adresse (address) lesen ---
'-----------------------------------------------------------------
Eeprom_lesen:
I2cstart 'Start
I2cwbyte &HA0 'Sende Slavadresse +1 für Schreiben
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse Low
I2cstart 'Start
I2cwbyte &HA1 'Sende Slavadresse +1 für Lesen
I2crbyte Lesenhigh , Lesenlow 'Lese Adresse vom EEprom
I2cstop 'Stop
Return
Danke, Tobias