Probier mal Dim Test As Single.
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" .
Code:$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?
Probier mal Dim Test As Single.
Hallo, das hat nichts gebracht (nicht eingeloggt)
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.
kannst mir mal dein beispiel posten? ich habe mir bereits die verschiedenen hilfen durchgelesen, aber irgendwo stehe ich gewaltig auf dem schlauch
Hier die relevanten Auszüge:
Alle Variablen sind Byte außer Timervorgabe ist WordCode:$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
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
Eine Frage habe ich aber noch - wo bekomme ich die Adresse (hier 106) her?
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.
danke...
weitere 15 zeichen :-D
Lesezeichen