PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom - eeprom adress



Arne
10.08.2005, 14:35
Hallo,

ich habe das Eeprom Problem zum Teil alleine gelöst. Im Simulator funktioniert es auch , aber im MC .... :-S

Mein Programm - dies ist nur zum Test - soll eine Singlezahl (hier Test) abspeichern und diese bei Neustart des MC (mit Stromverlust) zum weiteren Gebrauch wieder aus dem Eeprom laden.
Das Programm liest aber beim Reset aus dem MC in der Wirklichkeit nur 0.000 , soll aber 123.45 lesen etc.

Vermutlich liegt der Fehler bei "writeeeprom test" .


$regfile = "m16def.dat"
$baud = 9600
$crystal = 16000000

Dim Test As Eram Single , Test2 As Single

Dim Auswahl As Byte
Ganzoben:

Input "0 = Unten: 1= Oben" , Auswahl

If Auswahl = 0 Then
Goto Unten
Elseif Auswahl = 1 Then
Goto Oben
End If

Oben:
Do
Print Test2
Loop


Unten:

Test = 123.456
Writeeeprom Test , 10 <----Fehler


Test2 = Test
Print Test2



Goto Ganzoben


Muss ich da irgendwas besonderes eingeben???
Wo ist der Fehler im Code?

Marco78
10.08.2005, 18:05
Probier mal Dim Test As Single.

10.08.2005, 18:42
Hallo, das hat nichts gebracht :-( (nicht eingeloggt)

Marco78
10.08.2005, 19:18
Die Zuweisung der Zahl in ein Single ist so auch richtig? Probier das ganze mal mit WORD. (Und eine Wert der in WORD passt).

Die BASCOM Hilfe beschreib das Problem so:

Dim b as byte, bx as ERAM byte
B= 1
Bx=b ‘ write to EEPROM
B=bx ‘ read from EEPROM

Wenn ich WORD mit Writeeeprom in eine bestimmte Adresse schreibe wurd bei mir der überhängende Wert nach weiter oben in den EEPROM geschrieben und ich kommte an der Startadresse das Orginal auslesen.

10.08.2005, 19:39
kannst mir mal dein beispiel posten? ich habe mir bereits die verschiedenen hilfen durchgelesen, aber irgendwo stehe ich gewaltig auf dem schlauch

Marco78
10.08.2005, 20:11
Hier die relevanten Auszüge:


$regfile = "m16def.dat" 'Mega16
$crystal = 12000000 '12 MHz

Dim Timervorgabe As Word 'Preload für Sekundentakt
Readeeprom Timervorgabe , 106 'ist abgelegt im EEPROM
If Timervorgabe > 30000 Then Timervorgabe = 18661 'wenn nicht im EEPROM programmiert, dann errechneten Wert nehmen

Readeeprom Minhell , 2
Readeeprom Maxhell , 4
Readeeprom Schwellwert , 6

Do
Gosub Getir
If Command = 0 Then Return
If Command = 1 Then
Pwmmax = A
Writeeeprom Pwmmax , 100
End If
If Command = 7 Then A = A - 5
If Command = 9 Then A = A + 5
If A < 0 Then A = 0
If A > 250 Then A = 250
Ocr2 = A
Upperline
Lcd A ; " "
Loop

Gosub Getir
If Command = 0 Then Return
If Command = 1 Then
Minhell = B
Writeeeprom Minhell , 2
End If

Gosub Getir
If Command = 0 Then Return
If Command = 1 Then
Maxhell = B
Writeeeprom Maxhell , 4
End If

Gosub Getir
If Command = 0 Then Return
If Command = 1 Then
Schwellwert = B
Writeeeprom Schwellwert , 6
End If

Timervorgabe = C
Writeeeprom Timervorgabe , 106



Alle Variablen sind Byte außer Timervorgabe ist Word

Arne
11.08.2005, 14:38
Danke - hast mir sehr geholfen. Muss es jetzt nur noch in das eigentliche Programm einbauen.
Poste noch mein Beispiel - vielleicht hilft es jemanden auch mal;-)
Das Beispiel ist sehr einfach und nur aufs Eeprom bezogen.


$regfile = "m16def.dat"
$baud = 9600
$crystal = 16000000


Dim Auswahl As Bit
Input "Speichern, 0 Lesen, 1)" , Auswahl

If Auswahl = 0 Then
Goto Speichern
Elseif Auswahl = 1 Then
Goto Lesen
End If

Lesen:
Do
Dim Test As Single 'Preload für Sekundentakt
Readeeprom Test , 106
Print Test
Loop

Speichern:
Dim C As Single
C = 123.456
Test = C
Writeeeprom Test , 106
Goto Lesen

Arne
11.08.2005, 14:40
Eine Frage habe ich aber noch - wo bekomme ich die Adresse (hier 106) her?

Marco78
11.08.2005, 17:33
Die kannst du dir fast aussuchen. Du musst nur dran denken, das pro Adresse max. 1 Byte aufgenommen werden kann. Wenn du in die Adresse 100 ein Word schreibst wird die Adresse 100 und 101 belegt. 101 sollte dann nicht mit einer anderen Zahl überschrieben werden sondern erst wieder ab 102.
Die 106 z.B. habe ich genommen, weil ich den Speicher davor für andere Daten brauche.
Du darfst aber die physikalische Grenze nicht überschreiten (aber ich denke da wird BASCOM schon eine Fehlermeldung anzeigen). Die Grenze beim M16 müsste aus dem Bauch herraus bei 512 Bytes liegen. Also hast du 512 Adressen zum beschreiben.
Aber wie schonmal gesagt, Adresse 0 nicht benutzen, weil diese nach einem Reset gelöscht sein kann. Von Atmel gibt es aber eine AppNote dazu. Wenn du diese Adresse um alles in der Welt brauchst müsstest du da das nochmal nachlesen. Kann sein das nicht alle Typen betroffen sind.

EDIT: Mit BASCOM kannst du den Inhalt des EEPROM auch auslesen und dann sehen welche Adressen beschrieben sind. Wäre ja auch mal ein Versuch wert, erstmal dein Single in den EEPROM zu schreiben und dann zu schauen ob die Adressen überhaupt belegt wurden.
Oder es ist ggf. nur bis max. Word möglich. Da ist es ja noch relativ einfach die Zahl wieder zusammenzufügen. Einfach Byte mal Byte.

Arne
11.08.2005, 18:49
danke...



weitere 15 zeichen :-D