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
Der Fehler ist in Zeile 42. Mach die weg, und gut ist.
Hi Einhellige Meinung. Schließe mich an. Erzähl erstmal worum es geht, Cotroller etc. Programm wäre durchaus hilfreich. MfG Spess
Komisch. Der Fehler ist schon wieder in Zeile 42. Ob das Zufall ist?
Man sollte mal einen Editor schreiben der grundsaetzlich Zeile 42 auslaesst. So koennte man sich manchen Fehler ersparen.
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
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 |
kann das sein, weil sich die sub "maxampere" selbst wieder aufruft? :S
>kann das sein, weil sich die sub "maxampere" selbst wieder aufruft? :S
Ja. Der Stack läuft über.
rotwerd .... ich habe 2 Stunden gegrübelt und eben beim runterscrollen ist mir das aufgefallen :/
Seit wann hat ein ATmega8 einen Hardware Stack?
> Seit wann hat ein ATmega8 einen Hardware Stack?
Mit Basic ist alles möglich!
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
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.