Forum: PC-Programmierung interrupts in bascom


von Zi P. (zippo)


Lesenswert?

nabend,
ich hätte da mal ne frage zu interrupts unter bascom:

ist es normal das der Prozessor das Programm weiter ausführt(wenn auch 
stak verlangsamt) wenn int0 anliegt? Und auch weiter macht wenn meine 
Bedingung nicht erfüllt ist!

Programm :
$regfile = "m8515.dat "
$framesize = 24
$swstack = 8
$hwstack = 32
$crystal = 3680000


Config Portd.1 = Input
Pind.1 = 1
Ddrb = &B11111111
Portb = &B11111111
Config Int0 = Low Level
On Int0 Label1
Enable Interrupts
Enable Int0

Do

Portb.0 = 0
Waitms 100
Portb.0 = 1
Waitms 100

Loop

End
Label1:
If Pind.1 = 0 Then
End If
Return


wenn ich als Bedingung eine Schleife mit Do Loop until mache funktionert 
das ganze.

kann ich auch an eine bestimmte stelle in meiner "Hauptschleife" 
springen? und wenn ja wie geht das?

gruss

von El Patron B. (bastihh)


Lesenswert?

du kannst das ganze als sub deklarieren.
Also zB

Du deklarierst verschiedene Subs in denen du deine Programmteile 
hinterlegst und springst dann in der Hauptschleife in die Subs:
1
Declare Sub Unterprogramm
2
3
Do                                                        
4
Gosub Unterprogramm
5
Loop
6
7
Sub Unterprogramm:
8
'dein Code bzw. Programmteil
9
End Sub

Mit den Interrupts, versuchs mal mit dem Befehl debounce.
Dabei sobald der Taster betätigt wurde, wird die Hauptschleife 
unterbrochen und springt in den definierten Sub:
1
Do
2
Debounce Pind.2 , 0 , InterruptSub, Sub 
3
Loop
4
5
InterruptSub:
6
'Dein Code bei betätigtem Taster
7
return

Zur erklärung:
1
Debounce Pind.2 , 0 , InterruptSub, Sub
In der Hauptschleife wird überprüft welcher Zustand sich am Pind.2 
befindet.
In den Debounceparameter steht 0, also wird dieser bei eine Low Pegel in 
die Interruptroutine springen die den Namen "InterruptSub" trägt.
Einmal in der Interrupt Routine wird er den dort den Code ausführen und 
wenn dieser ausgeführt wurde, springt er automatisch zurück zu dem Punkt 
an der die Hauptschleife unterbrochen wurde.
Wie du siehst ist es nicht allzu schwer.
Sop und ich geh jetzt auch mal ins Bettchen.
Grüße

von STK500-Besitzer (Gast)


Lesenswert?

>ist es normal das der Prozessor das Programm weiter ausführt(wenn auch
>stak verlangsamt) wenn int0 anliegt?

Wie mir scheint, liegt INT0 konstant an. Das sorgt dafür, dass der 
Prozessor die Interrupt-Routine bedient, zurück ins Hauptprogramm 
springt, dort einen Befehlt ausführt und wieder in die Interrupt-Routine 
springt, weil immer noch das Interrupt-Flag gesetzt ist.

>Und auch weiter macht wenn meine Bedingung nicht erfüllt ist!
Die Abfrage kostet auch Zeit...

>kann ich auch an eine bestimmte stelle in meiner "Hauptschleife"
>springen? und wenn ja wie geht das?
Geht nicht.

PS: Du solltest dir den Text noch mal durchlesen, bevor du ihn 
abschickst.

von spess53 (Gast)


Lesenswert?

Hi

>Wie mir scheint, liegt INT0 konstant an. Das sorgt dafür, dass der
>Prozessor die Interrupt-Routine bedient, zurück ins Hauptprogramm...

Ein externer Interrupt verschieden Modi: Level- und Flankengesteuert.
Bei levelgesteuerten Interrupt wird der IR solange immer wieder 
ausgelöst, solange der Pegel (meist L) anliegt. Flanken gesteuerte IR 
lösen nur bei ensprechenden Flanke (L-H oder H-L) aus. Weitere Hilfe im 
Datenblatt.

MfG Spess

von STK500-Besitzer (Gast)


Lesenswert?

>>Wie mir scheint, liegt INT0 konstant an. Das sorgt dafür, dass der
>>Prozessor die Interrupt-Routine bedient, zurück ins Hauptprogramm...

>Ein externer Interrupt verschieden Modi: Level- und Flankengesteuert.
>Bei levelgesteuerten Interrupt wird der IR solange immer wieder
>ausgelöst, solange der Pegel (meist L) anliegt.

>Config Int0 = Low Level

... und ich hab (vorhin) nicht mal richtig ins PRogramm geguckt...

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.