Forum: Mikrocontroller und Digitale Elektronik Bascom Variable verändert sich selbst


von Marcel K. (hobride)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich weiss nicht warum das so ist?
Ich lege einen Wert in einer Variablen (Hygro) ab und etwas später will 
ich diese Variable weiter verwenden aber der Inhalt hat sich verändert.
Diese Variable wird nirgens weiter angefasst. Ich stell mal den Code und 
die Ausgabe vom Terminal rein. Vielleicht fällt Euch Profis ja mein 
Fehler auf.

Die Stellen die ich meine habe ich so "<<<<<<<<<<<<<<" gekennzeichnet.

Wenn ich die Variable später berechnen würde hätte ich zwar ein 
korrektes Ergebnis. Aber ich würde gerne verstehen warum das so ist. 
Evtl kommt dieses Problem na noch öfter vor.

1
$regfile = "m8def.dat"
2
$crystal = 8000000
3
$hwstack = 40
4
$swstack = 32
5
$framesize = 60
6
$baud = 57600
7
8
Config Lcdpin = Pin , Rs = Portc.1 , E = Portc.0 , Db4 = Portb.4 , Db5 = Portb.3 , Db6 = Portb.2 , Db7 = Portb.1
9
Config Lcd = 16 * 2
10
11
Config Int1 = Rising
12
Enable Int1
13
On Int1 Isr_von_int0
14
Enable Interrupts
15
16
Config Timer0 = Timer , Prescale = 8
17
On Timer0 T0isr
18
19
Config Timer1 = Timer , Prescale = 256
20
Enable Timer1
21
Start Timer1
22
23
24
Dim State As Bit
25
Dim Signal As Bit
26
Dim I As Word
27
Dim J As Byte
28
Dim O As Byte
29
30
Dim Tempc As Word
31
Dim Hygro As Word
32
33
Dim Folge As String * 260
34
Dim Tele(7) As String * 36
35
Dim H As String * 1
36
Dim T As String * 8
37
Dim T1 As String * 8
38
39
40
Print "reset"
41
42
Do
43
44
If Signal = 1 Then
45
   Enable Timer0
46
      Timer1 = 15000                                        ' Timer1 grob vorladen 
47
      Folge = ""
48
      While Timer1 < 65535                                  ' Solange laufen bis Timer1 voll ist
49
        If Pind.3 = 1 And State <> 1 Then                   ' Wenn PIND3 auf Low geht und zwar nur einmal
50
          Timer0 = 0                                        ' Timer0 zurücksetzten damit die Messung beginnen kann
51
          O = 0
52
          State = 1                                         ' Status des Pins merken
53
        Elseif Pind.3 = 0 And State <> 0 Then               ' Wenn PIND3 auf High geht und zwar nur einmal
54
          I = O * 256
55
          I = I + Timer0
56
          H = Str(i)
57
          Folge = Folge + Left(h , 1)
58
          State = 0                                         ' Status des Pins merken
59
        End If
60
      Wend
61
62
      Gifr = Gifr Or &H80                                   'clear Flag Int1  pending INT clear
63
64
   Disable Timer0
65
   Signal = 0
66
   Enable Int1
67
End If
68
69
70
If Folge <> "" Then
71
   Replacechars Folge , "9" , ";"
72
   Replacechars Folge , "8" , ";"
73
   Replacechars Folge , "1" , "0"
74
   Replacechars Folge , "2" , "0"
75
   Replacechars Folge , "3" , "1"
76
   Replacechars Folge , "4" , "1"
77
   J = Split(folge , Tele(1) , ";")
78
79
   If Tele(1) = Tele(2) And Tele(2) = Tele(3) Then
80
      Folge = Tele(1)
81
   Elseif Tele(4) = Tele(5) And Tele(5) = Tele(6) Then
82
      Folge = Tele(4)
83
   Elseif Tele(2) = Tele(4) And Tele(4) = Tele(7) Then
84
      Folge = Tele(2)
85
   End If
86
87
   Hygro = 0
88
   T1 = Mid(folge , 29 , 8)
89
   Hygro = Binval(t1)
90
   Print "f1 " + Folge + " " + Hygro
91
   ' <> hier stimmt der Wert von Hygro noch <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
92
93
   Tempc = 0
94
   T = Mid(folge , 20 , 1)
95
   If T = "1" Then
96
   Tempc = 256
97
   End If
98
99
   T = Mid(folge , 21 , 8)
100
   Tempc = Tempc + Binval(t)
101
102
   T = ""
103
   Tempc = Str(tempc)
104
   For I = 0 To Len(tempc)
105
      If I = Len(tempc) Then
106
         T = T + "."                                        'Dezimalpunkt einfügen
107
      End If
108
      H = Mid(tempc , I , 1)
109
      T = T + H
110
   Next I
111
112
113
   Print "f2 " + Folge + " " + Hygro
114
   ' <> hier stimmt der Wert von Hygro nicht mehr <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
115
116
   Cls
117
   Locate 1 , 1
118
   Lcd T
119
   Locate 2 , 1
120
   Lcd Hygro
121
122
   Folge = ""
123
124
End If
125
126
127
Loop
128
End
129
130
131
Isr_von_int0:
132
  Disable Int1
133
  Signal = 1
134
Return
135
136
T0isr:
137
   O = O + 1
138
Return

von Karl H. (kbuchegg)


Lesenswert?

Das geht durch den Compiler?

   Tempc = Str(tempc)
   For I = 0 To Len(tempc)
      If I = Len(tempc) Then

tempc ist doch ein WORD und kein String

Dim Tempc As Word


Was liefert Len, wenn man es auf einen WORD ansetzt?
Wie speichert sich der String, der von STR erzeugt wird in tempc?

Meine BASCOM Kentnisse sind allerdings beschränkt, möchte ich gleich 
dazu sagen. Ist mir nur aufgefallen und unlogisch vorgekommen. Wenn 
Variablen ihren Wert unmotiviert verändern, dann sind Array-Überläufe 
oder eben String-Überläufe immer heiße Kandidaten. Drum hab ich mir die 
String-Operationen genauer angesehen.

von Hackes (Gast)


Lesenswert?

Hallo,

habs nicht weiter durchgelesen. ABER genau das, was mein Vorredner 
sagte, scheint durchaus zuzutreffen. Den Effekt kenn ich aus meinen 
Anfangszeiten sehr gut und du suchst Dir nen Wolf dran.

Wenn ein String "überläuft", dann werden nachfolgende Speicherzellen, wo 
andere Variablen liegen, rücksichtslos überschrieben und damit ihr Wert 
verändert.

Da Du den String (also die Variable, die den STring aufnehmen würde) 
weiter vorne im Speicher liegen hast, deutet es sehr darauf hin. Wundert 
mich aber, daß dann auch nicht andere Variablen betroffen sind, oder 
fällt es vielleicht einfach nur nicht auf.

Versuche als Test mal den STring ganz am Schluß der ganzen Variablen zu 
deklarieren oder besser, schau, daß er nicht überläuft.

Daß der Compiler nicht meckert, wundert mich allerdings auch!

Viel Erfolg

von Marcel K. (hobride)


Lesenswert?

Ja Moin zusammen,

Der Compiler hat tatsächlich nicht gemeckert und ihr hattet recht.

1
   Print Tempc
2
   tempc = Str(tempc)
3
   Print Tempc
4
   Print Len(tempc)

brachte folgende Ausgaben:

185       < print tempc
14385     < print tempc nach tempc = str(tempc)
3         < len(tempc)

Warum die folgende Schleife dann da einen lesbaren String daraus gemacht 
hat weiss ich nicht.

Nachdem ich dem String eine neue Variable spendiert habe(von Typ String) 
stimmen die beiden Werte überein.

Ich stehe noch ganz am Anfang meiner AVR Basic Programmier Erfahrungen. 
Deshalb sieht der Code noch etwas wirr aus und funktioniert eben 
manchmal nicht :-).

Danke für die Hilfe, tolles Forum !!!.


Gruß Marcel

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.