Hallo zusammen, ich habe da immer noch das Problem das mir die Variable aus eienm Interrupt nicht ins Hauptprogramm übernommen wird, der Inhalt scheint immer "Null" zusein. kurze Beschreibung: Mit dem Interrupt INT0 zähle ich die Variable Zaehlerirq0 hoch, im Überlauf Interrupt von Timer1 wird die Variable Zaehlerirq0 an die Variable Drehfrequenz übergeben und anschließend für den nächsten Zählinterval auf Null gesetzt. Mit dem Timerreload wird der Überlauf auf einmal in der Sekunde festgelegt. Anschließend erfolgt ein Sprung in die Routine Aktu, wo die Ausgabe der Werte erfolgt. Die Ausgabe der Drehfrequenz erfolgt auch einwandfrei, jedoch die Weiterverarbeitung der Variable in der Hauptschleife erfolgt nicht die Multiplikation bleibt immer NULL. Setze ich die Multiplikation " Ausgabe = Drehfrequenz * 60" mit in die Aktu Routine wird sie durchgeführt und das Ergebnis wird auch richtig ausgegeben also auch tatsächlich berechnet. Wo liegt der Fehler, liegt er bei der Deklaration, reicht "Dim" alleine nicht aus ???????? Hilfe !!!!!!!!! Gruß Schorschi
Du kannst nicht mit "Goto" aus der Interruptroutine heraushüpfen. Das hinterläßt Trümmer auf dem Stack. MfG Paul
Hallo Paul, beim Sprung aus der Interruptroutine in die Aktu Routine ist der Wert noch da, aber im Hauptprogramm für die Berechnung nicht. Da liegt mein Problem. Wenn es mit dem Goto Sprung zutun hat, wären doch die Daten in der Aktu Routine auch nicht mehr da - oder liege ich da falsch. Die Übergabe des Wertes an die Drehfrequenz Variable ist erfolgt sonst wäre sie in Aktu nicht zusehen und sollte doch so auch im Hauptprogramm zur Verfügung stehen. ----------------------------------------------------------------------- ""Du kannst nicht mit "Goto" aus der Interruptroutine heraushüpfen. Das hinterläßt Trümmer auf dem Stack. wie sollte ichs sonst anstellen ???? Aus dem Hauptprogramm einen Interval mit Wait einrichten und dann in die Ausgabe "Aktu" springen ?? ------------------------------------------------------------------------ Gruß Schorschi
Einfach den Timer-Interrupt mit GOTO verlassen ist -wie Paul schon sagte- böse. Das geht so nicht! WENN, dann müsstest du zumindest statt GOTO ein GOSUB verwenden, aber auch das tut man nicht. Setzte in deiner Timerinterruptroutine ein Flag, auf das du in der Mainloop wartest. Wenn dieses Flag gesetzt ist, dann machst du die Ausgabe, löschst das Flag und fertig. so z.B:
1 | Dim SekFlag as Byte |
2 | |
3 | [...] |
4 | |
5 | Do |
6 | If SekFlag = 1 then |
7 | SekFlag = 0 |
8 | |
9 | Ausgabe = Drehfrequenz * 60 |
10 | Print #1 , "Drehfrequenz: " ; Drehfrequenz |
11 | Print #1 , "Ausgabe: " ; Ausgabe |
12 | Close #1 |
13 | End If |
14 | Loop |
15 | |
16 | |
17 | End |
18 | |
19 | |
20 | |
21 | 'Pro Impuls ein Aufruf |
22 | Irq0: |
23 | Incr Zaehlerirq0 |
24 | Return |
25 | |
26 | 'Pro Sekunde ein Aufruf |
27 | Timer1_isr: |
28 | Timer1 = Timervorgabe |
29 | |
30 | Drehfrequenz = Zaehlerirq0 |
31 | Zaehlerirq0 = 0 |
32 | SekFlag = 1 |
33 | Return |
Erwin
Hallo Erwin, danke für den super Tipp, teste ist gleich heute Abend Gruß Schorschi
Hallo Erwin, joh so gehts, !!!!!! Danke Gruß Schorschi
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.