HW-Stack wird in Subroutine voll bis Prog. abstürzt

OP #1294392
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
OP #1294429
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
Gast #1294483
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren