Forum: Mikrocontroller und Digitale Elektronik Bascom - Variable wird nicht in Hauptprogramm übergeben


von Georg B. (schorschi)


Angehängte Dateien:

Lesenswert?

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

von Paul Baumann (Gast)


Lesenswert?

Du kannst nicht mit "Goto" aus der Interruptroutine heraushüpfen. Das 
hinterläßt Trümmer auf dem Stack.

MfG Paul

von Georg B. (schorschi)


Lesenswert?

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

von Erwin E. (erwinendres)


Lesenswert?

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

von Georg B. (schorschi)


Lesenswert?

Hallo Erwin,
danke für den super Tipp, teste ist gleich heute Abend

Gruß
Schorschi

von schorschi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.