Mitch64
24.09.2009, 19:05
Hallo,
ich habe ein Problem zum Thema Label-Adresse und EEProm.
Es geht darum, in einem Datenbereich des EEProm die Adresse auf ein Label herauszufinden, und Daten ab der Position auslesen zu können. Ich versuche das mal an einem konkreten Beispiel etwas genauer zu beschreiben.
In Bascom gibt es hierfür natürlich einen Befehl: ReadEEProm <variable<[,<labelname>]
Der Befehl funktioniert leider nicht in folgendem Fall:
Der EEProm-Datenbereich enthält mehrere Benutzer-Konfigurationen. Jede Konfiguration beginnt mit einem Label. Hier ein Beispiel:
$eeprom
Dim _eedataadr as word
Konfiguration_1:
data "Konfiguration 1"
data 1 , 2 , 3 , 4 , 5 , 6
Konfiguration_2:
data "Konfiguration 2"
Data 2 , 3 , 4 , 5 , 6 , 7
Konfiguration_3:
data "Konfiguration 2"
Data 2 , 3 , 4 , 5 , 6 , 7
Konfiguration_4:
data "Konfiguration 2"
Data 2 , 3 , 2 , 2 , 6 , 7
Konfiguration_5:
data "Konfiguration 2"
Data 2 , 3 , 4 , 5 , 5 , 5
Zum Auslesen der Konfiguration wollte ich eine Sub-Routine aufrufen, der eine Konfigurations-Nummer übergeben wird. Innerhalb der Sub wird nun die Konfigurations-Nummer abgeprüft und der erste Datenwert per ReadEEProm mit Labelangabe ausgelesen. Das funktioniert noch. Danach sollten alle weiteren Datenbytes ausgelesen werden. Und da wird nur noch Müll zurück gegeben.
Hier die verwendete Sub-Routine:
Sub Init_Config(byval CfgNum as Byte)
select case CfgNum
case 1
readeeprom CfgName , Konfiguration_1
case 2
readeeprom CfgName , Konfiguration_2
end select
readeeprom data1
readeeprom data2
readeeprom data3
readeeprom data4
readeeprom data5
readeeprom data6
End Sub
Durch diese Methode würde ich mir eine Menge Code ersparen, vor allem, wenn die Konfigurationsdaten etwas umfangreicher werden.
Im Moment komme ich nicht weiter. Irgendwie wird der Pointer auf das nächste EEProm-Byte entweder gelöscht oder überschrieben.
Allerdings habe ich 2 Ideen.
1. Entweder nach dem ersten Lesezugriff den Pointer irgendwie sichern und vor dem nächsten Read (ohne Labelangabe) wieder herstellen. oder
2. Eigene Routinen schreiben (z.B. Inline-Assembler)
im 2. Fall stellt sich allerdings die Frage, wie ich die Adresse des Labels im EEProm heraus bekomme.
Die Bascom Methoden loadwordadr, loadlabel usw liefern wirre Adressen, die keinen Sinn ergeben.
Auslesen und Wiederherstellen der Register EEARH und EEARL bringen vermutlich auch keinen Erfolg.
Die Assembler-Befehle
LDI ZL,low(labelname)
LDI ZH,high(labelname)
liefern im Z-Register ebenfalls keine vernünftigen Daten.
Kann mir jemand an dieser Thematik etwas helfen? Vielleicht mit einer Lösung winken?
Es würde mir schon mal weiterhelfen, wie ich mit 2 Assembleranweisungen die Adresse in einem Register wie Z gesetzt bekomme.
Danke schon mal im Voraus.
Mitch.
ich habe ein Problem zum Thema Label-Adresse und EEProm.
Es geht darum, in einem Datenbereich des EEProm die Adresse auf ein Label herauszufinden, und Daten ab der Position auslesen zu können. Ich versuche das mal an einem konkreten Beispiel etwas genauer zu beschreiben.
In Bascom gibt es hierfür natürlich einen Befehl: ReadEEProm <variable<[,<labelname>]
Der Befehl funktioniert leider nicht in folgendem Fall:
Der EEProm-Datenbereich enthält mehrere Benutzer-Konfigurationen. Jede Konfiguration beginnt mit einem Label. Hier ein Beispiel:
$eeprom
Dim _eedataadr as word
Konfiguration_1:
data "Konfiguration 1"
data 1 , 2 , 3 , 4 , 5 , 6
Konfiguration_2:
data "Konfiguration 2"
Data 2 , 3 , 4 , 5 , 6 , 7
Konfiguration_3:
data "Konfiguration 2"
Data 2 , 3 , 4 , 5 , 6 , 7
Konfiguration_4:
data "Konfiguration 2"
Data 2 , 3 , 2 , 2 , 6 , 7
Konfiguration_5:
data "Konfiguration 2"
Data 2 , 3 , 4 , 5 , 5 , 5
Zum Auslesen der Konfiguration wollte ich eine Sub-Routine aufrufen, der eine Konfigurations-Nummer übergeben wird. Innerhalb der Sub wird nun die Konfigurations-Nummer abgeprüft und der erste Datenwert per ReadEEProm mit Labelangabe ausgelesen. Das funktioniert noch. Danach sollten alle weiteren Datenbytes ausgelesen werden. Und da wird nur noch Müll zurück gegeben.
Hier die verwendete Sub-Routine:
Sub Init_Config(byval CfgNum as Byte)
select case CfgNum
case 1
readeeprom CfgName , Konfiguration_1
case 2
readeeprom CfgName , Konfiguration_2
end select
readeeprom data1
readeeprom data2
readeeprom data3
readeeprom data4
readeeprom data5
readeeprom data6
End Sub
Durch diese Methode würde ich mir eine Menge Code ersparen, vor allem, wenn die Konfigurationsdaten etwas umfangreicher werden.
Im Moment komme ich nicht weiter. Irgendwie wird der Pointer auf das nächste EEProm-Byte entweder gelöscht oder überschrieben.
Allerdings habe ich 2 Ideen.
1. Entweder nach dem ersten Lesezugriff den Pointer irgendwie sichern und vor dem nächsten Read (ohne Labelangabe) wieder herstellen. oder
2. Eigene Routinen schreiben (z.B. Inline-Assembler)
im 2. Fall stellt sich allerdings die Frage, wie ich die Adresse des Labels im EEProm heraus bekomme.
Die Bascom Methoden loadwordadr, loadlabel usw liefern wirre Adressen, die keinen Sinn ergeben.
Auslesen und Wiederherstellen der Register EEARH und EEARL bringen vermutlich auch keinen Erfolg.
Die Assembler-Befehle
LDI ZL,low(labelname)
LDI ZH,high(labelname)
liefern im Z-Register ebenfalls keine vernünftigen Daten.
Kann mir jemand an dieser Thematik etwas helfen? Vielleicht mit einer Lösung winken?
Es würde mir schon mal weiterhelfen, wie ich mit 2 Assembleranweisungen die Adresse in einem Register wie Z gesetzt bekomme.
Danke schon mal im Voraus.
Mitch.