Forum: Mikrocontroller und Digitale Elektronik Bascom EEprom


von Tilmann W. (tilmann)


Lesenswert?

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

von blinki (Gast)


Lesenswert?

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.

von jugo (Gast)


Lesenswert?

eeprom Speicherzelle schon kaputt getestet? Kommentare brechen in 
Programmzeilen um oder ist das nur Unvermögen hier einen formatierten 
Text zu präsentieren?

von Tilmann W. (tilmann)


Lesenswert?

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

von Tilmann W. (tilmann)


Lesenswert?

Hi Blinki,

mit Integer hat es funktioniert (Hochzählen, Dein Beispiel) !

Super, danke !

Gruß Tilmann

von Tilmann (Gast)


Lesenswert?

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

von Hermann (Gast)


Lesenswert?

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

von Tilmann (Gast)


Lesenswert?

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

von Hermann (Gast)


Lesenswert?

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.

von Tilmann (Gast)


Lesenswert?

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

von Zensiert (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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...

von MWS (Gast)


Lesenswert?

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.

von MWS (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.