Hallo Leute, ich habe ein Problem mit EEprom, das mir nicht logisch erscheint. Ich will einen Kühlschrank regeln, und den Schaltpunkt verändern können. Der veränderte Schaltpunkt soll ins EEprom geschrieben werden, und beim nächsten Programmstart (Spannung am µC) einmalig aus dem EEprom in eine normale Variable gelesen werden. Das mit regeln und Schaltpunkt verändern geht (ohne abspeichern), aber wenn ich die Programmzeile einfüge, die ihm sagt, daß er es bei Programmstart aus dem EEprom lesen soll (Kuehl_ein = Ee_kuehl_ein), funktioniert auf einmal die Möglichkeit nicht mehr, den Schaltpunkt zu ändern, d.h. der Schaltpunkt läßt sich nicht mal mehr in der entsprechenden Schleife ändern, von abspeichern ganz zu schweigen. Hier die betreffenden Codezeilen: Vor dem Hauptprogramm: '************************************************************* Dim Kuehl_ein As Single 'Kühlschrank Einschalt-Temperatur Dim Ee_kuehl_ein As Eram Single 'EEprom-Variable Kuehl_ein = Ee_kuehl_ein 'einlesen aus dem EEprom '************************************************************* '************************************************************** Nachregeln: 'Unterroutine Cls Nachreg_toggle = 1 'Variable zum Ausstieg aus dieser Nachregel-Schleife Wait 1 'Verzögung, um nicht sofort wieder rauszuspringen Locate 1 , 1 Lcd "Kuehl ein:" ; Kuehl_ein ; " C" 'bisherigen Sollwert anzeigen While Nachreg_toggle = 1 'Nachregel-Schleife mit Ausstiegsmöglichkeit If Pind.5 = 0 Then 'Temperatur-Schaltpunkt erhöhen: Do Loop Until Pind.5 = 1 'Warten bis Taster losgelassen Incr Kuehl_ein 'Solltemperatur erhöhen End If If Pind.6 = 0 Then 'Temperatur-Schaltpunkt reduzieren: Do Loop Until Pind.6 = 1 'Warten bis Taster losgelassen Decr Kuehl_ein 'Solltemperatur reduzieren End If Locate 2 , 1 Lcd "Kuehl ein:" ; Kuehl_ein ; " C" 'neuen Wert anzeigen If Pinb.0 = 0 Then 'Ausstieg aus dieser Nachregelschleife: Do Loop Until Pinb.0 = 1 'Warten bis Taster losgelassen Toggle Nachreg_toggle 'wenn toggle-Wert verändert wird Schleife verlassen Ee_kuehl_ein = Kuehl_ein 'zum Schluß den neuen Wert ins EEprom schreiben Locate 2 , 1 Lcd "EEprom gesp." ; Kuehl_ein 'Rückmeldung in der 2. Zeile 'stattdessen den echten EEprom-Wert anzuzeigen akzeptiert Bascom nicht Wait 1 End If Wend 'Ende der while-Schleife - zurück zum Normalbetrieb Cls Return '************************************************************* Hat jemand eine Idee, wo der Zusammenhang ist ? Gruß Tilmann
Dein Programm durchzuschauen hab ich keine Lust. Probier mal kleinere Bissen: Dim Kuehl_ein As Single 'Kühlschrank Einschalt-Temperatur Dim Ee_kuehl_ein As Eram Single 'EEprom-Variable Kuehl_ein = Ee_kuehl_ein 'einlesen aus dem EEprom Kuehl_ein = Kuehl_ein + 1 [...hier Kuehl_ein anzeigen] Ee_kuehl_ein = Kuehl_ein do:loop Sollte bei jedem Programmstart eins größer werden. Wenn nicht - mal mit Integer statt single probieren. Geht das? Falls ja, ist wohl Dein Programmablauf oben etwas durcheinander. Und Du solltest drauf achten, dass Du beim flashen nicht dem Eeprom mit löschst, falls Du den Wert über mehrere Programmversionen hin erhalten willst.
eeprom Speicherzelle schon kaputt getestet? Kommentare brechen in Programmzeilen um oder ist das nur Unvermögen hier einen formatierten Text zu präsentieren?
Hallo Yugo, das ist Unvermögen, hier formatierten Text zu präsentieren. In der Vorschau habe ich alles zurechtgerückt - Kommentare rechts - aber die Foren-Software hat es so angeordnet wie es jetzt ist. Die EEprom-Speicherzelle dürfte noch leben. Danke an blinki für den Ansatz, das macht einen vernüftigen Eindruck. Werde ich probieren. Gruß Tilmann
Hi Blinki, mit Integer hat es funktioniert (Hochzählen, Dein Beispiel) ! Super, danke ! Gruß Tilmann
Hallo, also nochmal die Quintessenz zusammengefaßt: - Single EEprom funktioniert nicht - Integer EEprom funktioniert - Zuweisung des Wertes von Integer-EEprom-Variable an Flashspeicher-Single-Variable geht nicht, nur an Flashspeicher-Integer-Variable, also zwischen EEprom und Flashspeicher nur gleicher Datentyp - Vergleich (>,<) zwischen Single und Integer geht nicht, nur zwischen gleichen Datentypen - Zuweisung des Wertes zwischen Single und Integer (beide Flashspeicher) geht Danke nochmal an Blinki für seinen Tip, das hat es ermöglicht ! Gruß Tilmann
Tilmann schrieb: > - Single EEprom funktioniert nicht Natürlich funktioniert jeder Datentyp als EEprom-Variable. Aber dies sind keine normalen Variablen. Man muss grundsätzlich beim Lesen und Schreiben eine Zuweisung mit einer normalen Variablen vom gleichen Datentyp machen. Einfach mal im Handbuch lesen, da steht doch alles drin: Language Reference/DIM/ERAM
Hallo Herrmann, vielleicht habe ich was nicht verstanden, aber auf den Tip von blinki hin habe ich ein Progrämmchen geschrieben, das nur bei Programmstart (Strom ein) einen EEprom-Integer um jeweise 1 und einen EEprom-Single um jeweils 0,1 erhöht und die beiden Werte in den beiden Zeilen des Displays anzeigt. Bei mehrfach "Strom ein" wird der Integer-Wert hochgezählt, der Single nicht. Falls Du weißt woran es liegt, und es der Nachwelt verraten möchtest (für mich ist Integer prima, mein Problem ist gelöst) - bitte doch ! Gruß Tilmann '*************************************************************** '* Von einem Programmstart zum nächsten wird der Integer '* hochgezählt, der Single aber nicht '*************************************************************** $regfile = "m168def.dat" 'Atmega 168 $hwstack = 100 $swstack = 100 $framesize = 100 $crystal = 5120000 'Quartzoszillator 'Display-Konfiguration Config Lcdpin = Pin , Db4 = Portc.1 , Db5 = Portc.2 , Db6 = Portc.3 , Db7 = Portc.4 , E = Portc.5 , Rs = Portd.0 Config Lcd = 16 * 2 'Display-Typ Dim Ganzzahl As Integer Dim Kommazahl As Single Dim Ee_ganzzahl As Eram Integer 'EEprom-Variable Dim Ee_kommazahl As Eram Single 'EEprom-Variable Ganzzahl = Ee_ganzzahl 'Wert aus dem EEprom laden Kommazahl = Ee_kommazahl 'Wert aus dem EEprom laden Ganzzahl = Ganzzahl + 1 Ee_ganzzahl = Ganzzahl 'Wert ins EEprom schreiben Kommazahl = Kommazahl + 0.1 Ee_kommazahl = Kommazahl 'Wert ins EEprom schreiben Cls 'Display löschen Locate 1 , 1 'gehe in Zeile 1 des Displays Lcd "Ganzzahl: " ; Ganzzahl 'Werte im Display anzeigen Locate 2 , 1 'gehe in Zeile 2 des Displays Lcd "Kommazahl: " ; Kommazahl 'Werte im Display anzeigen Do Loop 'nichts weiter End
Tilmann schrieb: > Falls Du weißt woran es liegt, und es der Nachwelt verraten möchtest > (für mich ist Integer prima, mein Problem ist gelöst) - bitte doch ! Mal auf die Schnelle, da ich momentan wenig Zeit habe: Dein Programm ist im Prinzip genau richtig, aber ... Ein jungfräuliches EEprom hat alle Bits gelöscht oder gesetzt (weiß ich gerade nicht). Eine Single hat auf jeden Fall einen unsinnigen Wert und +0.1 bleibt unsinnig. D.h. es muss erstmal ein vernünftiger Startwert gesetzt werden. Ich habe das folgendermaßen gemacht: die erste EEprom-Variable ist ein Zustands-Byte. Die wird bei jedem Programmstart geprüft. Wenn die nicht auf 1 ist, ist das EEprom jungfräulich und alle Variablen werden auf einen Startwert gesetzt und das Zustands-Byte auf 1. So ist bei jeder Neuprogrammierung ein definierter EEprom-Zustand garantiert und man kann normal damit arbeiten.
Hi Herrmann, für die Uhrzeit bist Du ja noch erstaunlich orientiert ... :-) Mit Jungfrauen kenne ich mich nicht so aus, aber bei meinem o.g. Testprogramm ist der Integer-Wert von einem Strom-einschalten zum nächsten von 1 an immer um eins hochgezählt, der Single-Wert blieb aber auf 0,1. Das habe ich für mich übersetzt in "Single-EEprom funktioniert nicht". Falls Du im ausgeschlafenen Zustand noch eine Idee hast, gern ! Gruß Tilmann
Hi, Die Lösung steht schon da: Hermann schrieb: > D.h. es muss erstmal ein vernünftiger Startwert gesetzt werden. Beim Integer ist der Startwert 0. Beim Single musst du aber erst einmal nach jedem Programmieren einen Startwert angeben. Probier doch mal:
1 | ... |
2 | Ganzzahl = Ganzzahl + 1 |
3 | Ee_ganzzahl = Ganzzahl 'Wert ins EEprom schreiben |
4 | |
5 | If Ganzzahl = 1 Then Ee_kommazahl = 3.14 |
Nach dem Programmieren ist Ganzzahl 1 und du hast deinen Startwert.
Hermann schrieb: > Mal auf die Schnelle, da ich momentan wenig Zeit habe: > Dein Programm ist im Prinzip genau richtig, aber ... > Ein jungfräuliches EEprom hat alle Bits gelöscht oder gesetzt (weiß ich > gerade nicht). Bei AVR8: gesetzt. > Eine Single hat auf jeden Fall einen unsinnigen Wert Nicht unsinnig. Das bedeutet einfach nur "NaN" (not a number). Das ist also zwar keine gültige Zahl, aber trotzdem durchaus ein gültiger Wert im Definitionsbereich des Fliesskommaformats. Üblicherweise existieren Funktion(en), um herauszubekommen, ob ein Fließkommawert "NaN" (oder einer der anderen Spezialwerte wie z.B. "+INF" usw.) ist, denn normale Vergleichsoperationen funktionieren mit solchen Spezialwerten i.A. nicht. Bei BASCOM heisst die entsprechende Funktion CHECKFLOAT. Näheres möge der geneigte BASCOM-User der Dokumentation der von ihm verwendeten Sprache entnehmen. Ganz allgemein halte ich es für überaus sinnvoll, die selbst aktiv verwendete Sprache vollständig zu beherrschen, ganz egal, welche es ist. Und Grundlage dazu kann nur sein, deren Doku wenigstens mal überflogen zu haben, um wenigstens einen Überblick über den Sprachumfang zu haben...
Tilmann schrieb: > Falls Du im ausgeschlafenen Zustand noch eine Idee hast, gern ! Er hat's Dir doch auch im unausgeschlafenen Zustand bereits die Lösung gegeben, etwas was Du selbst ausgeschlafen nicht verstehst. Lies Dich mit IEEE754 an, dann wüsstest Du den Grund, warum &hFFFFFFFF ein NAN, für eine Single ungültig und 0.1 dazu gezählt immer noch ein NAN ist. Tilmann schrieb: > Eine Single hat auf jeden Fall einen unsinnigen Wert und +0.1 > bleibt unsinnig. Genau so ist's. Der Fehler sitzt vor dem Bildschirm.
Korrektur, falsch zitiert: Hermann, nicht Tilmann, schrieb: > Ein jungfräuliches EEprom hat alle Bits gelöscht oder gesetzt (weiß ich > gerade nicht). Eine Single hat auf jeden Fall einen unsinnigen Wert und > +0.1 bleibt unsinnig.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.