PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Label-Adresse im EEProm Datenbereich ermitteln



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.

Dirk
25.09.2009, 08:40
Hallo Mitch,

das sollte eigentlich funktionieren.

Ich würde aber eher mit der ERAM Variante arbeiten, das funktioniert einfach und gut. Jede Konfiguration hat dann einen eigenen Namen (z.B. als ERAM Array).

Gruß Dirk

Mitch64
25.09.2009, 12:52
Ich stimme zu, wenn es um eine reine Konfigurationsangelegenheit geht, kann man das Mit ERam Arrays machen.

Aber die Eingangsfrage war, wie ich die Adresse eines Labels innerhalb des EEProm-Datenbereichs ermitteln kann.

Das Konfigurationsbeispiel (oben) sollte nur mal einen Anhaltspunkt bieten. Wenn ich jedoch immer mehr mit Inline-Assembler arbeite, komme ich um die Adresse des EERam-Labels nicht herum.

Deshalb nochmal die Frage.

Wie kann ich mit Bascom - (auch Inline-Assembler) die Label-Adresse eines Labels im EEProm ermitteln.

Mitch.

Dirk
25.09.2009, 18:06
Hallo Mitch,

... wenn es um eine reine Konfigurationsangelegenheit geht ...
Darum genau ging es ja in deiner Frage.

Wenn es aber um die Label geht: Die stehen ja nicht im EEPROM, sondern werden vom Compiler in die EEPROM-Adressen umgesetzt. Vermutlich werden sie genauso wie Variablennamen verwaltet. Sicher kann man die auch direkt irgendwie auslesen, aber man fragt sich dann, WARUM man das in einer Hochsprache macht. Schließlich braucht man die Label eher in einer Hochsprache, in Maschinensprache geht es immer nur um Adressen.

Wie dann mit dieser Adresse gelesen/geschrieben wird, kann man gut in der mcs.lib sehen (suche z.B. nach _READEEPROM).

Wenn du aber konkrete Adressen im EEPROM brauchst und irgendwann mit Inline-Assembler zugreifen willst, geht das auch sehr gut mit ERAM. Du kannst mit "DIM var as Byte at $60" eine konkrete Adresse angeben. Die Funktion _READEEPROM (s.o.) zeigt, wie man da wieder dran kommt.

Gruß Dirk

Mitch64
25.09.2009, 20:47
Gut! Ich glaube mit dieser Info kann ich was anfangen. danke.