Forum: Mikrocontroller und Digitale Elektronik [Bascom] Variabele in EEPROM


von alex (Gast)


Lesenswert?

Hallo,

in dem angehängten Programm soll eine variabele beim tastendruck erhöht 
(pinb.0) bzw resetet (pinb.1) werden.

Diese variabele soll ins eeprom gesschrieben werden damit sie auch ohne 
versorgungsspannung gespeichert wird.

Allerdings funktioniert das noch nicht wie gewollt.
Das hochzählen und reseten geht.
Aber nach dem aus und wieder einschalten der Versorgungsspannung ist die 
variabele wieder bei 0

was mache ich falsch, dass die werte nicht ins eeprom geschrieben werden 
bzw nicht ausgelesen werden?

Mit freundlichen Grüßen

Alex

1
$regfile = "m16def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 4000000
6
$baud = 1200
7
8
9
10
Config Portb.0 = Input
11
Config Portb.1 = Input
12
13
Config Porta = Output
14
15
Dim Count1 As Byte
16
Dim Count2 As Byte
17
18
Dim Countee As Eram byte
19
20
21
Count2 = 0
22
Count1 = 0
23
24
Count2 = Countee
25
26
Do
27
28
29
30
31
If Pinb.0 = 1 Then
32
Count1 = Count2 + 1
33
Waitms 500
34
End If
35
Countee = Count1
36
If Pinb.1 = 1 Then
37
Count1 = 0
38
Count2 = 0
39
Waitms 500
40
End If
41
42
If Count1 = 0 Then
43
Porta.0 = 1
44
Porta.1 = 0
45
Porta.2 = 0
46
Porta.3 = 0
47
Porta.4 = 0
48
Porta.5 = 0
49
Porta.6 = 0
50
Porta.7 = 0
51
End If
52
53
If Count1 = 1 Then
54
Porta.0 = 0
55
Porta.1 = 1
56
Porta.2 = 0
57
Porta.3 = 0
58
Porta.4 = 0
59
Porta.5 = 0
60
Porta.6 = 0
61
Porta.7 = 0
62
End If
63
64
If Count1 = 2 Then
65
Porta.0 = 0
66
Porta.1 = 0
67
Porta.2 = 1
68
Porta.3 = 0
69
Porta.4 = 0
70
Porta.5 = 0
71
Porta.6 = 0
72
Porta.7 = 0
73
End If
74
75
76
If Count1 = 3 Then
77
Porta.0 = 0
78
Porta.1 = 0
79
Porta.2 = 0
80
Porta.3 = 1
81
Porta.4 = 0
82
Porta.5 = 0
83
Porta.6 = 0
84
Porta.7 = 0
85
End If
86
87
If Count1 = 4 Then
88
Porta.0 = 0
89
Porta.1 = 0
90
Porta.2 = 0
91
Porta.3 = 0
92
Porta.4 = 1
93
Porta.5 = 0
94
Porta.6 = 0
95
Porta.7 = 0
96
End If
97
98
99
100
If Count1 = 5 Then
101
Porta.0 = 0
102
Porta.1 = 0
103
Porta.2 = 0
104
Porta.3 = 0
105
Porta.4 = 0
106
Porta.5 = 1
107
Porta.6 = 0
108
Porta.7 = 0
109
End If
110
111
If Count1 = 6 Then
112
Porta.0 = 0
113
Porta.1 = 0
114
Porta.2 = 0
115
Porta.3 = 0
116
Porta.4 = 0
117
Porta.5 = 0
118
Porta.6 = 1
119
Porta.7 = 0
120
End If
121
122
123
124
If Count1 = 7 Then
125
Porta.0 = 0
126
Porta.1 = 0
127
Porta.2 = 0
128
Porta.3 = 0
129
Porta.4 = 0
130
Porta.5 = 0
131
Porta.6 = 0
132
Porta.7 = 1
133
End If
134
135
136
Count2 = Count1
137
138
Waitms 20
139
Loop
140
141
End

von einhunderttausendmal (Gast)


Lesenswert?

Es müsste eigentlich mindestens eine halbe Stunde funktionieren ;)

von Norbert S. (norberts)


Lesenswert?

Hi,

Count1 wird erst mit dem Wert von EEprom geladen wenn Du einmal den 
Taster gedrückt hast.

Statt dieser unendlich langen auswertung von Count1, versuchs mal so:

Dim Dummy as byte
.
.
.
Dummy = 0
Dummy.count1 = 1
Porta = Dummy

Ein Überlauf für Count1 fehlt auch. Ab 8 drückst Du viele Male bis 
Count1 nach 255 endlich überläuft und wieder etwas passiert.

Was soll überhaupt Count2?
Brauchst Du nicht.

Gruß,
Norbert

von Weingut P. (weinbauer)


Lesenswert?

der Programmablauf ist Murks ...

If Pinb.0 = 1 Then
Count1 = Count2 + 1
Waitms 500
End If
Countee = Count1


daraus folgt, dass Dein EEPROM bei jedem Programmdurchlauf, egal ob 
Taste gedrückt oder nicht neu überschrieben wird. Das EEPROM hat aber 
nur n paar tausend Lösch- und Schreibzyklen und dann war es das mit der 
Zelle

von einhunderttausendmal (Gast)


Lesenswert?

sag isch doch..

von Christian K. (christian_rx7) Benutzerseite


Lesenswert?

Du darfst Countee nicht zyklisch schreiben, das überlebt der EEPROM 
nicht.

Christian_RX7

von Norbert S. (norberts)


Lesenswert?

Hi,

einhunderttausendmal schrieb:
> sag isch doch..
Nee, Du hast Dich über den Fragesteller lustig  gemacht.
Ganz super bei einem Anfänger, toll.

Ich tippe mal, daß die Zelle schon im Arsch ist...

Count2 ist auch über.

Also:

Dim Countee As Eram Byte at 1

Portb.0 = 1
Portb.1 = 1    'Pullups

If Pinb.0 = 1 Then
  Incr Count1
  Count1 = Count1 And &h07
  Countee = Count1
  Waitms 500
End If

If Pinb.1 = 1 Then
  Count1 = 0
  Countee = Count1
  Waitms 500
End If

Die Taster funktionieren damit zwar immer noch besch... aber die zweite 
Zelle lebt erstmal länger.

Gruß,
Norbert

von alex (Gast)


Lesenswert?

Hallo,

also ich habe das Programm nochmal umgeschrieben.

Das hochzählen läuft jetzt mit einer Variable.

>Dim Dummy as byte
>.
>.
>.
>Dummy = 0
>Dummy.count1 = 1
>Porta = Dummy
Das verstehe ich nicht ganz
Allerdings kann ich daraus entnehmen, dass man Porta = count schreiben 
kann.
Das funktioniert auch.


Das komische ist, dass die variable jetzt manchmal (aber nur für ein 
paar sekunden ???) gespeichert ist.

Manchmal aber kommt entweder 255 oder müll.

Mit freundlichen Grüßen

Alex
1
$regfile = "m16def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 4000000
6
$baud = 1200
7
8
9
10
Config Portb.0 = Input
11
Config Portb.1 = Input
12
13
Config Porta = Output
14
15
Dim Count As Byte
16
17
Dim Countee As Eram Byte
18
19
20
21
Count = 0
22
23
Count = Countee
24
25
Do
26
27
28
29
30
If Pinb.0 = 1 Then
31
Count = Count + 1
32
Waitms 500
33
End If
34
35
36
37
If Pinb.1 = 1 Then
38
Count = 0
39
40
Waitms 500
41
End If
42
43
Porta = Count
44
45
Countee = Count
46
47
48
Waitms 20
49
Loop
50
51
End

von Karl H. (kbuchegg)


Lesenswert?

Hast du die Brownout Detection eingeschaltet (Fuse-Setting)?
Bei der EEPROM Zelle 0 kann es manchmal zu eigentümlichen Effekten 
kommen, wenn die nicht aktiviert ist.

von alex (Gast)


Lesenswert?

ok ich habe beim vorherigen post ein paar beiträge verpasst :/

Ich habe jetzt mal wie du während des tastendrucks die Daten ins eeprom 
geschrieben und das funktioniert :)


was bedeutet in deinem code das "Incr " und das "&h07"
und warum Dim Countee As Eram Byte at 1 ?

Vielen Dank

Alex

von Norbert S. (norberts)


Lesenswert?

Hi,

Du beschreibst immer noch in jedem Zyklus das Eeprom mit Countee = Count
Das geht nicht, alle 20ms und max. 100000 Mal ist ne halbe Stunde. Die 
Zelle ist sowieso schon kaputt, deswegen
Dim Countee as Eram Byte at 1
Das ist die zweite Zelle.

Du musst noch das Countee = Count in die If packen denn Du musst das ja 
auch nur speichern, wenn es sich geändert hat.

Kannst ja mal probieren wie lange das ansonsten tut. Wie gesagt, nach 
gut einer halben Stunde (oder auch erst nach ner Stunde) wird das sonst 
auch nicht mehr funktionieren.

Wenn Du Zelle 1 auch kaputtgejackelt hast, kommt eben
Dim Countee as Eram Byte at 2

Porta = count geht natürlich, ist aber anders als Deine erste Version. 
Jetzt siehst Du Count binär an Porta.

Config Portb.0 = Input
Ist übrigens vollkommen überflüssig. Wenn Du nix machst ist das default.

Count = 0

Count = Countee
Das ist auch Quatsch. Schreibst ne Null rein und dann sofort Countee.
Einfach nur Count = Countee


Gruß,
Norbert

von Norbert S. (norberts)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Hast du die Brownout Detection eingeschaltet (Fuse-Setting)?
> Bei der EEPROM Zelle 0 kann es manchmal zu eigentümlichen Effekten
> kommen, wenn die nicht aktiviert ist.

Die Zelle hat er eh schon kaputtgeschruppt.
Edit: Das mit Zelle 0 gilt nur für ganz alte AVR.

alex schrieb:
> was bedeutet in deinem code das "Incr " und das "&h07"
> und warum Dim Countee As Eram Byte at 1 ?

Ganz heisser Tip: RTFM
Steht alles in der Bascom Hilfe, Befehlsreferenz.
Incr erhöht den Wert der Variable um 1.
Das Gleiche wie Count = Count + 1, nur schneller und weniger Code (ja, 
Bascom ist so dumm)
And &h07 bedeutet ein logisches UND mit 0000 0111.
&h07 sagt Bascom, daß das jetzt Hex ist. &b00000111 ist eben binär, 
dezimal 7.
Also:
Incr Count
Count = Count And &b00000111
Zählt immer von 0 bis 7 und läuft dann zu 0 über.
Kapiert?

Die Speicheradresse 0 im Eeprom ist vermutlich schon kaputt.
Dim Countee As Eram Byte at 1
Das sagt Bascom:"Pack Countee an Adresse 1 im Eeprom".

Gruß,
Norbert

Edit: 00000111 statt 00001111 natürlich.

von alex (Gast)


Lesenswert?

hallo,

wie gesagt Countee = Count ist jetzt in der if schleife.

>Wenn Du Zelle 1 auch kaputtgejackelt hast, kommt eben
>Dim Countee as Eram Byte at 2

demnach gibt das "at 2" was ich oben gefragt hatte die speicherzelle an
muss man das machen Bzw. gibt es Probleme wenn man das nicht macht?


>Count = 0

>Count = Countee
>Das ist auch Quatsch. Schreibst ne Null rein und dann sofort Countee.
>Einfach nur Count = Countee

stimmt, ist unnötig


1
$regfile = "m16def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 4000000
6
$baud = 1200
7
8
9
10
Config Portb.0 = Input
11
Config Portb.1 = Input
12
13
Config Porta = Output
14
15
Dim Count As Byte
16
17
Dim Countee As Eram Byte
18
19
20
21
22
Count = Countee
23
24
Do
25
26
27
28
29
If Pinb.0 = 1 Then
30
Count = Count + 1
31
Countee = Count
32
Waitms 500
33
End If
34
35
36
37
If Pinb.1 = 1 Then
38
Count = 0
39
Countee = Count
40
Waitms 500
41
End If
42
43
Porta = Count
44
45
46
Waitms 20
47
Loop
48
49
End

von Norbert S. (norberts)


Lesenswert?

Hi,

alex schrieb:
> demnach gibt das "at 2" was ich oben gefragt hatte die speicherzelle an
> muss man das machen Bzw. gibt es Probleme wenn man das nicht macht?

Genau. Wenn Du nix angibst, nimmt Bascom den ersten freien Platz. Das 
gilt auch für normale Variablen. Da lass aber erstmal lieber die Finger 
von. Such mal nach Overlay in der Hilfe.

Wie hast Du die Taster beschaltet?

Gruß,
Norbert

von alex (Gast)


Lesenswert?

ok, Overlay lese ich mir morgen durch

die taster sind nach 5V geschaltet und haben pull down Widerstände und 
einen kondensator parallel zum entprellen

Mit freundlichen Grüßen

Alex B.

von Norbert S. (norberts)


Lesenswert?

Hi,

gut, aber nimm den Kondensator weg oder schalte einen Widerstand in 
Reihe zum Taster. Bei jedem Tastendruck schliesst Du den C kurz, das 
kann der Taster nicht lange ab.
Entprellen kann man auch in Software und mit diesem ersten Gehversuch 
(Waitms 500) ist das mehr als ausreichend entprellt.

Bitte nicht mit Debounce in Bascom. Das verschwendet Ressourcen und es 
geht sehr gut zu Fuß, dann weisst Du was passiert.
Aber Eins nach dem Anderen.

Gruß,
Norbert

von Charly B. (charly)


Lesenswert?

@Norbert
was soll der Quatsch mit Overlay ???, i denk du hast das
selber nicht verstanden

@Alex

es ist geschickter die Taster nach GND zu schalten, dann kannste den
internen PullUp verwenden.

versuch mal folgenden Code:
1
$regfile = "m16def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 4000000
6
$baud = 1200
7
8
Config Portb.0 = Input
9
Config Portb.1 = Input
10
11
Config Porta = Output
12
13
Dim Count As Byte
14
15
Dim Countee As Eram Byte At 3                         ' neue zelle ;)
16
Dim Dummy As Byte
17
18
'Count = 0
19
20
Count = Countee
21
22
Do
23
24
25
If Pinb.0 = 1 Then
26
Count = Count + 1
27
Gosub Write2ee
28
Waitms 500
29
End If
30
31
32
33
If Pinb.1 = 1 Then
34
Count = 0
35
Gosub Write2ee
36
Waitms 500
37
End If
38
39
Porta = Count
40
41
Waitms 20
42
Loop
43
44
Write2ee:
45
Dummy = Countee
46
47
If Count <> Dummy Then
48
   Countee = Count
49
End If
50
51
Return
52
53
54
End

ps. die Spezialisten hier meckern du zerstoerst das EEprom, aber
    keiner hat sich gedanken gemacht wie man das besser macht ....

vlG
Charly

von Charly B. (charly)


Lesenswert?

Norbert S. schrieb:

> Ganz heisser Tip: RTFM
> Steht alles in der Bascom Hilfe, Befehlsreferenz.
empfehle ich dir auch !

> Incr erhöht den Wert der Variable um 1.
> Das Gleiche wie Count = Count + 1, nur schneller und weniger Code (ja,
> Bascom ist so dumm)


Count = Count + 1 ergibt folgenden Code:
  ldi  r26,k60
  ldi  r27,k00
  ld  r24,X
  subi  r24,kFF
  st  X,r24

Incr Count  ergibt folgenden Code:
  ldi  r26,k60
  ldi  r27,k00
  ld  r24,X
  subi  r24,kFF
  st  X,r24


jetzt frag ich mich wer dumm ist ???


wieso muss ein Anfaenger mit solchen Unwahrheiten noch zusaetlich
verwirrt werden ?

http://www.youtube.com/watch?v=lJ7YY4HiD1I


vlG
Charly

von Norbert S. (norberts)


Lesenswert?

Charly B. schrieb:
> @Norbert
> was soll der Quatsch mit Overlay ???, i denk du hast das
> selber nicht verstanden

Aha, was soll daran falsch sein?
Da ist in der Hilfe das Prinzip beschrieben.
Natürlich braucht er hier kein Overlay aber er soll den Teil in der 
Hilfe lesen.

Deine Lösung mit dem Eeprom ist der richtige Weg aber ändert nicht viel.
Nur wenn er ständig resettet wird nicht unnötig geschrieben.
Sicher ist "erst lesen, dann vergleichen und wenn ungleich dann 
schreiben" richtig aber man muß die Leute dort abholen, wo sie stehen.

Und wenn Du es soooo besser weisst:
Config Portb.0 = Input
ist sinnlos, wenn Ddrb.0 nicht vorher irgendwo gesetzt wurde!
Ein paar weniger Leerzeilen und man könnte das auch besser lesen.

Bitte mal den Ton etwas mässigen.

Gruß,
Norbert

von Norbert S. (norberts)


Lesenswert?

Hallo Charly,

vielen Dank, daß Du mich so überaus freundlich auf meinen Fehler bzgl. 
Incr hingewiesen hast.

Das liebe ich so an diesem Forum. Niemand ist überheblich, keiner wird 
von Besserwissern angepöbelt falls man sich mal irrt, echt klasse.
So macht das Helfen Spass!

Ach ja, Du plenkst. Durchgängig.
Ätsch.

Gruß,
Norbert

von Charly B. (charly)


Lesenswert?

Norbert S. schrieb:

> Und wenn Du es soooo besser weisst:
> Config Portb.0 = Input
> ist sinnlos, wenn Ddrb.0 nicht vorher irgendwo gesetzt wurde!
Da hab i doch garnichts dazu geschrieben, aber als Anfaenger
weis er event. nicht wie die Pins nach dem Reset stehen und da
schadet es nicht sie definiert zu setzen, ausserdem finde ich es
eine unart der *'struddelprogramierer'* sich auf irgendwelche
'koennte' oder 'muesste' annahmen zu verlassen


> Ein paar weniger Leerzeilen und man könnte das auch besser lesen.
haengt das jetzt an denn Leerzeilen das du es nicht verstehst ?

> Bitte mal den Ton etwas mässigen.
mein 'Ton' ist absolut OK, i denke nur dir gefaellt es nicht
das ich deinen Quatsch mit Fakten wiederlegt habe


>vielen Dank, daß Du mich so überaus freundlich auf meinen Fehler bzgl.
>Incr hingewiesen hast.
Fehler macht jeder, auch ich (zwar selten :p ), ich finde es nur eine
FRECHHEIT von dir zu behaupten andere seien dumm (programmier
doch einen beseren Compiler )

>Ach ja, Du plenkst. Durchgängig.
>Ätsch.
ja und?, sei doch Stolz, jetzt haste auch bei mir einen Fehler
gefunden (finger)


> Gruß,
> Norbert

vlG
Charly

von Norbert S. (norberts)


Lesenswert?

Lieber Charly,

Du scheinst ein echtes Problem zu haben.

Hängst Dich hier an der einen Bemerkung "dumm" auf.
Bascom ist sogar noch dümmer: Du hast es mit einem Byte getestet. Da ist 
das identisch.
Mit einem Word oder Integer kostet das sogar noch mehr Takte mit INCR 
als mit + 1.
Ja, ich lag sogar noch falscher als Du es entlarvt hast!
Mit /2 zu Shift sieht das aber wieder krass anders aus.
Probiere es mal aus.

Ist aber auch egal. Ich bin Bascom-Fan und stehe dazu. Da nehme ich mir 
heraus, auch mal Kritik zu üben.
Marc hat aber einen tollen Job gemacht und macht ihn weiterhin, ohne 
Frage.

Jetzt vergleiche mal meine Bemerkung dazu und dann was Du dazu 
geschrieben hast.
Ganz in Ruhe.
Nochmal lesen.
Ganz in Ruhe.
Meine Bemerkung war eine Frechheit?
Dein Ton ist OK?
Immer noch dieser Meinung?
Dann kann ich nur hoffen, daß Du Dein Problem in den Griff bekommst, 
bevor Du es irgendwann mal im Berufsleben mit anderen -realen- Menschen 
zu tun haben wirst.

@alex:
Sorry, so ein Scheiß ist hier leider normal. Einfach ignorieren.
Wenn Du noch Fragen hast - nur zu.

Gruß,
Norbert

von Charly B. (charly)


Lesenswert?

Norbert S. schrieb:

> Dann kann ich nur hoffen, daß Du Dein Problem in den Griff bekommst,
> bevor Du es irgendwann mal im Berufsleben mit anderen -realen- Menschen
> zu tun haben wirst.
fuer mich sind alles 'reale' Menschen, auch die hier schreiben, und mein
Problem sind Leute die irgendwas behaupten ohne davon Ahnung zu haben
und dadurch andere verwirren, verunsichern oder wie auch immer....
oder wuerdest du ein 5KV Kabel anfassen wenn ich sage: "ich glaube da
ist keine Spannung mehr drauf", vielleicht denkste mal darueber nach

zu deiner info: ich hab ueber 30 Jahre Berufserfahrung & Programmiere
u.a. auch in Bascom, sogar Multitaskingsysteme; und klar hat auch
Bascom seine Fehler den Marc ist auch nur ein Mensch aber f. den
Preis ist es meiner Meinung nach einfach SPITZE

ich will hiermit keine diskusion ueber Bascom oder ueber guten oder
schlechten Ton ausloesen, das obengesagte ist meine Meinung und ich
hasse diese Aussagen ohne jede Grundlage (bei uns sagt man: besser
dummgeschwaetzt als gar nix gesagt)


> Sorry, so ein Scheiß ist hier leider normal.
wieso Norbert?, machst du das oefter? ;)


f. mich ist die Diskusion hiermit zu ende

vlG
Charly

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.