Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom - eeprom adress
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?
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:
$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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.