interrupts in bascom

#1063195
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
#1063217
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
Gast #1063266
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.
Gast #1063605
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
Gast #1063782
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...

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