Bascom - Variable wird nicht in Hauptprogramm übergeben

OP #1010249
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
Angehängte Dateien:
OP #1010327
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
#1010361
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

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