PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I²C EEProm und WORD?



TobiasBlome
22.11.2009, 21: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

stefan_Z
22.11.2009, 22:09
Schau dir mal OVERLAY Variablen an.
Gibts einige Infos hier im Forum zu.
Damit definierst du quasi an der selben Stelle wie dein WORD zusätzlich zwei BYTE.
WORD = &B1111111100000000
BYTE1 = &B11111111
BYTE2 = &B00000000

Welche der drei Variablen du auch änderst, das Ergebnis steht dann immer an der selben Stelle.

TobiasBlome
23.11.2009, 16:02
Hi,
das verstehe ich nicht so ganz - weil ich doch schon hier das high und das lowByte zusammen bringe:
Lesen = Makeint(lesenhigh , Lesenlow)

Mein Fehler lag wo anders:
Ich habe das auslesen falsch gemacht - wenn mehrmals in einer Schleife abgefragt wird, muss mit "ACK" angezeigt werden, das es weitergeht und nach der letzten Abfrage mit "NACK" das keine weitere Bytes mehr kommen.

Mein Code funktioniert nun!! \:D/

für alle die sich da auch so schwer tun wie ich:


$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 'eigendlicher Wert
Dim Wert1 As Byte 'Hilfswert1
Dim Wert2 As Byte 'Hilfswert2


Dim Lesen As Word 'Auslesen
Dim Lesenlow As Byte 'Hilfswert1
Dim Lesenhigh As Byte 'Hilfswert2

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 = 64998


'-------------------------------------------------------------------------------
'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
Adresse = Adresse + 1 'weil ja immer 2 Bytes abgefragt werden
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
Adresse = Adresse + 1 'weil ja immer 2 Bytes abgefragt werden
Next Adresse
End If





Loop





'------------------------------------------------------
'- Byte (wert) auf EEprom Adresse (address) speichern -
'------------------------------------------------------
Eeprom_schreiben:
Wert1 = High(wert)
Print Wert1 ; " W1 "
Wert2 = Low(wert)
Print Wert2 ; " W2 "

I2cstart 'Start
I2cwbyte &HA0 'Sende Slavadresse
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse LOW
I2cwbyte Wert2 'Sende Wert
I2cwbyte Wert1 '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 , Ack 'Lese Adresse vom EEprom
I2crbyte Lesenlow , Nack 'Lese Adresse vom EEprom
I2cstop 'Stop
Return