Forum: Mikrocontroller und Digitale Elektronik HW-Stack wird in Subroutine voll bis Prog. abstürzt


von Axel K. (axel)


Lesenswert?

huhu : )

Ich komme nicht weiter : ((


Ich habe 4 ineinander verschachtelte Subroutinen.

In der 4. Subroutine inkrementiere bzw. dekrementiere ich eine Variable 
(welche ich ganz am Anfang normal deklariert habe) mittels 2 Taster.

Als ich den HW-Stack auf 32 hatte, konnte ich ca. 15 mal einen Taster 
betätigen (egal welchen), bis das Programm abstürzt.

Dann habe ich den HW-Stack auf 64 erhöht - jetzt kann ich ca. 30 x eine 
Taste drücken, bis das Programm abstürzt...


Habt ihr eine Idee, wie ich das umgehen kann, dass er den HW Stack damit 
vollstopft?

Achso, ich habe schon versucht irgendwie mit byval und byref zum 
erstenmal herumzuexperimentieren, aber da seh ich nicht durch.. (( Zumal 
"mein" Bascom garnicht "byref" kennt, wenn ich byval damit ersetze....

gruss
Axel

von pfft. (Gast)


Lesenswert?

Der Fehler ist in Zeile 42. Mach die weg, und gut ist.

von Klaus (Gast)


Lesenswert?

Der Fehler ist in Zeile 42!

von spess53 (Gast)


Lesenswert?

Hi

Einhellige Meinung. Schließe mich an.

Erzähl erstmal worum es geht, Cotroller etc. Programm wäre durchaus 
hilfreich.

MfG Spess

von Nez (Gast)


Lesenswert?

Komisch. Der Fehler ist schon wieder in Zeile 42. Ob das Zufall ist?

von Helmut L. (helmi1)


Lesenswert?

Man sollte mal einen Editor schreiben der grundsaetzlich Zeile 42 
auslaesst. So koennte man sich manchen Fehler ersparen.

von Peter D. (peda)


Lesenswert?

Axel Krüger schrieb:
> Ich habe 4 ineinander verschachtelte Subroutinen.

Subroutinen dürfen sich nicht gegenseitig aufrufen (unendliche 
Rekursion). Du mußt immer mit Return zum Aufrufer zurückkehren.


Peter

von Axel K. (axel)


Lesenswert?

Hallo! Ganz am Ende ist die Routine:
1
$regfile = "m8def.dat"                                      'ATMEGA8-Deklarationen
2
3
$crystal = 8233333
4
$baud = 9600
5
6
7
'############################################################################################################
8
9
'START Variablen----------------------------------------------------------------
10
Dim C1 As Word
11
Dim C2 As Word
12
13
Dim C4 As Word
14
Dim C5 As Word
15
16
Dim C3 As Word
17
18
Dim Tastenfeld As Word
19
Dim Tastenfeld_zaehler As Byte
20
Dim Tastenwert_ug As Word
21
Dim Tastenwert_og As Word
22
23
24
25
26
27
28
29
Dim Ubatterie As Long
30
Dim Ubatterie_formatiert As Long
31
Dim Ubatterie_str2 As String * 5
32
33
Dim Ubatterie_aktueller_wert As Word
34
35
36
37
Dim Idc1 As Long
38
Dim X As Word
39
40
41
Dim Watt As Long
42
43
Dim L As Word
44
Dim Var1 As Single
45
Dim Var2 As Word
46
Dim Var3 As Word
47
48
Dim Var11 As String * 5
49
Dim Var12 As String * 5
50
51
52
'ENDE Variablen----------------------------------------------------------------
53
54
'############################################################################################################
55
56
'Config Timer0 = Timer , Prescale = 64                       'Timerperiode = 1Sekunde
57
'On Timer0 Overflow_timer0
58
'Enable Timer0
59
'Enable Interrupts
60
61
Config Portb = Output
62
Config Portc = Input
63
Config Portd = Output
64
65
Config Adc = Single , Prescaler = 128 , Reference = Avcc
66
'Set Sfior.adhsm
67
68
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.7 , Rs = Portb.6
69
Config Lcd = 20 * 4
70
Waitms 2000
71
Initlcd
72
73
Declare Sub Lcd_out
74
Declare Sub Tastenabfrage
75
Declare Sub Hauptmenue
76
Declare Sub Konfig_sensoren
77
Declare Sub Konfig_dcsensoren
78
Declare Sub Maxampere
79
80
81
82
Declare Sub Tastenabfrage_schleife
83
Declare Sub Tastenabfrage_schleife2
84
85
86
Call Lcd_out
87
88
Start Adc
89
90
'############################################################################################################
91
92
93
'START DO-LOOP Hauptschleife----------------------------------------------------
94
Do
95
96
Waitms 300                                                  'Wartezeit; spдter durch Timer ersetzen
97
98
'START Batterie Spannung / Versorgungsspannung----------------------------------
99
C1 = Getadc(0)                                              '"Get" Versorgungsspannung
100
'---------------------------------------------------------
101
'Routine welche das stдndige Schwanken der Werte verhindert
102
103
'Dieses dient dazu, dass Flackern der "letzten" LED, im Falle das die Drehzahl zwischen 2 LED hin und
104
'her "pendelt", zu unterbinden. Dazu dient variable C2 als Ausgabevariable. C1 ist der eigentliche,
105
'berechnete Wert. Wenn C1 mehr als eine LED gegenьber C2 zunimmt, dann wird C2 C1- 1 angeglichen.
106
'Ist C2 = C1 oder um eins niedriger, dann behдlt C2 seinen Wert. Im Falle dass C1 niedriger ist,
107
'wird C2 C1 gleichgesetzt. Sollte dann sofort C1 um eins grцЯer werden, wird dieses nicht einbezogen.
108
109
If C2 < C1 Then
110
   C3 = C1 - C2
111
   If C3 > 1 Then                                           'Bei Differenz grцЯer eins C2 = C1 - 1
112
      C2 = C1 - 1
113
   End If
114
115
   Goto Weiter
116
End If
117
118
If C2 > C1 Then
119
   C2 = C1
120
End If
121
122
Weiter:
123
124
Ubatterie = C2
125
'---------------------------------------------------------
126
127
128
Ubatterie = Ubatterie * 1500                                'Dreisatz => 1500 (/10 mV) * Getadc(0) / 512 = UBatterie in mV/10
129
Ubatterie = Ubatterie / 512                                 ' = UBatterie
130
Var1 = Ubatterie
131
Var2 = Round(var1)                                          'auf einer Stelle nach dem Komma runden
132
Var11 = Str(var2)
133
Ubatterie_str2 = Mid(var11 , 1 , 2)
134
Ubatterie_str2 = Ubatterie_str2 + ","
135
Ubatterie_str2 = Ubatterie_str2 + Mid(var11 , 3 , 2)
136
137
138
Locate 1 , 13
139
Lcd Ubatterie_str2 ; "V "
140
'-------------------------------------------------------------------------------
141
142
143
144
145
'START DC1 Sensor---------------------------------------------------------------
146
C4 = Getadc(1)
147
'---------------------------------------------------------
148
'Routine welche das stдndige Schwanken der Werte verhindert
149
150
'Dieses dient dazu, dass Flackern der "letzten" LED, im Falle das die Drehzahl zwischen 2 LED hin und
151
'her "pendelt", zu unterbinden. Dazu dient variable C2 als Ausgabevariable. C1 ist der eigentliche,
152
'berechnete Wert. Wenn C1 mehr als eine LED gegenьber C2 zunimmt, dann wird C2 C1- 1 angeglichen.
153
'Ist C2 = C1 oder um eins niedriger, dann behдlt C2 seinen Wert. Im Falle dass C1 niedriger ist,
154
'wird C2 C1 gleichgesetzt. Sollte dann sofort C1 um eins grцЯer werden, wird dieses nicht einbezogen.
155
156
If C5 < C4 Then
157
   C3 = C4 - C5
158
   If C3 > 1 Then                                           'Bei Differenz grцЯer eins C2 = C1 - 1
159
      C5 = C4 - 1
160
   End If
161
162
   Goto Weiter2
163
End If
164
165
If C5 > C4 Then
166
   C5 = C4
167
End If
168
169
Weiter2:
170
171
Idc1 = C5
172
'---------------------------------------------------------
173
174
175
Locate 2 , 13
176
Lcd Idc1
177
'-------------------------------------------------------------------------------
178
179
180
181
182
183
Locate 4 , 1
184
Lcd Tastenfeld ; " counts  "
185
186
187
188
'Tastenfeldabfrage fьr Aufruf Hauptmenue----------------------------------------
189
Tastenwert_ug = 199                                         'Tastenwert muss ca. bei 205 liegen
190
Tastenwert_og = 211
191
Call Tastenabfrage                                          'Aufruf Sub_Tastenabfrage
192
193
'3mal abfragen zur Fehlervermeidung
194
If Tastenfeld_zaehler = 3 Then                              'nach 3-maliger Abfrage Hauptmenue anrufen
195
   Tastenfeld_zaehler = 0
196
   Call Hauptmenue
197
   Call Lcd_out                                             'wenn do-loop beendet wird dann Ausgangsbildschirm laden
198
End If
199
'-------------------------------------------------------------------------------
200
201
202
Loop
203
End
204
205
'############################################################################################################
206
207
'Ausgangsbildschirm-------------------------------------------------------------
208
Sub Lcd_out
209
210
   Cls
211
212
   Locate 1 , 1
213
   Lcd "U-Batterie: "
214
215
   Locate 2 , 1
216
   Lcd "I-DC1: "
217
218
   Locate 3 , 1
219
   Lcd "Leistung: "
220
221
   Cursor Off
222
223
End Sub
224
'-------------------------------------------------------------------------------
225
226
227
'Hauptmenь----------------------------------------------------------------------
228
Sub Hauptmenue
229
230
   Cls
231
232
   Locate 1 , 1
233
   Lcd "Hauptmenue: "
234
235
   Locate 2 , 1
236
   Lcd "Konfig. Sensoren (1)"                               '206
237
238
   Locate 3 , 1
239
   Lcd "Funktion1 "
240
241
   Locate 4 , 1
242
   Lcd "Funktion4 "
243
244
   Locate 4 , 17                                            '811
245
   Lcd "EXIT"
246
247
   Waitms 1000
248
249
250
Call Tastenabfrage_schleife
251
252
   Cls
253
254
   If Var3 = 4 Then
255
256
   Var3 = 0
257
258
   End If
259
260
   If Var3 = 3 Then
261
262
   Var3 = 0
263
264
      'Exit Sub
265
   End If
266
267
   If Var3 = 2 Then
268
269
   End If
270
271
   If Var3 = 1 Then
272
       Call Konfig_sensoren
273
       Var3 = 0
274
   End If
275
276
End Sub
277
'-------------------------------------------------------------------------------
278
279
280
'Tastenabfrage (Prьfung ob der Wert den Wert xxx entspricht)--------------------
281
Sub Tastenabfrage
282
283
   Tastenfeld = Getadc(3)
284
285
   If Tastenfeld_zaehler > 0 Then                           'Wenn Taste vorzeitig losgelassen wird, dann Rьckstellung des Zaehlers
286
      Tastenfeld_zaehler = Tastenfeld_zaehler - 1
287
   End If
288
289
   If Tastenfeld < Tastenwert_og Then
290
      If Tastenfeld > Tastenwert_ug Then
291
         Tastenfeld_zaehler = Tastenfeld_zaehler + 2
292
      End If
293
   End If
294
295
End Sub
296
'-------------------------------------------------------------------------------
297
298
299
'Tastenabfrage beendet wenn eine Taste gedrьckt wurde---------------------------
300
Sub Tastenabfrage_schleife
301
302
Var3 = 0
303
304
Do
305
306
Tastenfeld = Getadc(3)
307
308
309
'Taste1
310
Tastenwert_ug = 199
311
Tastenwert_og = 211
312
Var2 = 1
313
Call Tastenabfrage_schleife2
314
315
'Taste2
316
Tastenwert_ug = 402
317
Tastenwert_og = 415
318
Var2 = 2
319
Call Tastenabfrage_schleife2
320
321
'Taste3
322
Tastenwert_ug = 605
323
Tastenwert_og = 615
324
Var2 = 3
325
Call Tastenabfrage_schleife2
326
327
'Taste4
328
Tastenwert_ug = 805
329
Tastenwert_og = 816
330
Var2 = 4
331
Call Tastenabfrage_schleife2
332
333
   If Var3 > 0 Then                                         'zum letzten Menь gehen
334
         Exit Do
335
   End If
336
337
Loop
338
339
340
End Sub
341
'-------------------------------------------------------------------------------
342
343
344
Sub Tastenabfrage_schleife2
345
346
If Tastenfeld < Tastenwert_og Then
347
      If Tastenfeld > Tastenwert_ug Then
348
         If Var3 = Var2 Then                                'Taste(var3) "sicher" gedrьckt
349
            Exit Sub
350
         End If
351
352
            Var3 = Var2
353
      End If
354
End If
355
356
357
358
End Sub
359
'---------------------
360
361
362
Sub Konfig_sensoren
363
364
Cls
365
366
   Locate 1 , 1
367
   Lcd "Konfig. Sensoren:"
368
369
   Locate 2 , 1
370
   Lcd "DC-Sensoren(1)"                                     '206
371
372
   Locate 3 , 1
373
   Lcd "AC-Sensoren(2)"
374
375
   Locate 4 , 1
376
   Lcd "F4 "
377
378
   Locate 4 , 17                                            '811
379
   Lcd "back"
380
381
   Waitms 1000
382
383
384
Call Tastenabfrage_schleife
385
386
   Cls
387
388
   If Var3 = 4 Then
389
      Call Hauptmenue
390
      Var3 = 0
391
   End If
392
393
   If Var3 = 3 Then
394
395
   End If
396
397
   If Var3 = 2 Then
398
399
   End If
400
401
   If Var3 = 1 Then
402
   Call Konfig_dcsensoren
403
   Var3 = 0
404
405
   End If
406
407
408
409
End Sub
410
411
'---------
412
413
414
Sub Konfig_dcsensoren
415
416
417
Var11 = Str(l)
418
419
Cls
420
421
   Locate 1 , 1
422
   Lcd "Konfig. DC-Sensoren:"
423
424
   Locate 2 , 1
425
   Lcd "DC-1 (1)"                                           '206
426
427
   Locate 3 , 1
428
   Lcd "DC-2 (2)"
429
430
   Locate 4 , 1
431
   Lcd "F4 " ; Var11
432
433
   Locate 4 , 17                                            '811
434
   Lcd "back"
435
436
   Waitms 1000
437
438
439
Call Tastenabfrage_schleife
440
441
   Cls
442
443
   If Var3 = 4 Then
444
      Call Konfig_sensoren
445
      Var3 = 0
446
   End If
447
448
   If Var3 = 3 Then
449
      Locate 1 , 1
450
   Lcd "Taste 3 gedrueckt"
451
   Var3 = 0
452
   Waitms 5000
453
      'Exit Sub
454
   End If
455
456
   If Var3 = 2 Then
457
      Locate 1 , 1
458
   Lcd "Taste 2 gedrueckt"
459
   Var3 = 0
460
   Waitms 5000
461
      'Exit Sub
462
   End If
463
464
   If Var3 = 1 Then
465
 Call Maxampere
466
   Var3 = 0
467
468
   End If
469
470
471
End Sub
472
473
'-------------------------
474
475
476
Sub Maxampere
477
478
479
480
481
482
483
Cls
484
485
   Locate 1 , 1
486
   Lcd "Konfig. DC-1:"
487
488
   Locate 2 , 1
489
   Lcd "I-Maximal = " ; X ; " A"                            '206
490
491
   Locate 3 , 1
492
   Lcd "F3"
493
494
   Locate 4 , 1
495
   Lcd "F4"
496
497
   Locate 4 , 17                                            '811
498
   Lcd "back"
499
500
501
Waitms 500
502
503
504
Call Tastenabfrage_schleife
505
506
   Cls
507
508
   If Var3 = 4 Then
509
      Call Konfig_dcsensoren
510
      Var3 = 0
511
   End If
512
513
   If Var3 = 3 Then
514
      Locate 1 , 1
515
   Lcd "Taste 3 gedrueckt"
516
   Var3 = 0
517
   Waitms 5000
518
      'Exit Sub
519
   End If
520
521
   If Var3 = 2 Then
522
     If X > 29 Then
523
      X = X - 30
524
     End If
525
   Var3 = 0
526
   Call Maxampere
527
   End If
528
529
   If Var3 = 1 Then
530
        If X < 871 Then
531
      X = X + 30
532
     End If
533
   Var3 = 0
534
   Call Maxampere
535
   End If
536
537
538
539
540
End Sub

von Axel K. (axel)


Lesenswert?

kann das sein, weil sich die sub "maxampere" selbst wieder aufruft? :S

von holger (Gast)


Lesenswert?

>kann das sein, weil sich die sub "maxampere" selbst wieder aufruft? :S

Ja. Der Stack läuft über.

von Axel K. (axel)


Lesenswert?

rotwerd  .... ich habe 2 Stunden gegrübelt und eben beim 
runterscrollen ist mir das aufgefallen :/

von Benedikt K. (benedikt)


Lesenswert?

Seit wann hat ein ATmega8 einen Hardware Stack?

von Tom (Gast)


Lesenswert?

> Seit wann hat ein ATmega8 einen Hardware Stack?

Mit Basic ist alles möglich!

von Magnus Müller (Gast)


Lesenswert?

Benedikt K. schrieb:
> Seit wann hat ein ATmega8 einen Hardware Stack?

Den hat er sich vermutlich selbst in den Die rein dotiert ;)

Chip-Modding rulez     lol

von (prx) A. K. (prx)


Lesenswert?

Nicht jeder Compiler verwendet nur einen Stack. Mancher trennt 
Return-Stack (HW) vom handgemachten Stack für Variablen und Parameter. 
Bei AVRs verkürzt das Funktions-Prolog/Epilog deutlich.

von Tom (Gast)


Lesenswert?

> Nicht jeder Compiler verwendet nur einen Stack. Mancher trennt
> Return-Stack (HW) vom handgemachten Stack für Variablen und Parameter.

Trotzdem ist es kein Hardwarestack. Return-Stack wird ja auch 
sinnvollerweise mit (HW) abgekürzt.

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.