Step
27.08.2006, 01:25
Hallo,
ich hab jetzt erstmal halbwegs verstanden, wie ich bei den Mega 48, 88 und 168 die "höheren" Interrrupts ansprechen und auswerten kann.
Das, bzw. wohl MEIN Problem ist, daß ein Ereignis (hier Leveländerung) bei den "höheren" Interrupts ja wohl nur als kpl. Port gemeldet wird (hier mit "On Pcint0 Intdetect" abgefragt) und dann innerhalb des angesprungenen Labels erst ausgelesen werden kann, welche der 8 Ports (hier Port Bo bis Port B7) denn überhaupt den Interrupt ausgelöst hat.
Wie es scheint, hab ich das hinbekommen.
Nun hab ich versucht die Interrupt-Auswertung eines Tasters mit Debounce zu entprellen.
Ich habe hin und her versucht, bekomme es aber nicht hin.
Es reagiert immer nur die grüne LED an D6.
Die Programmausführung wird dabei rel. auffällig behindert (die rote LED in der Programmsimulation setzt aus) und die Taste nicht wirklich entprellt.
Ich habe mal mein Listing angehängt und den Debounce-Block grün markiert.
Kann mir hier jemend helfen?
Besten Dank!
Wolfram
'---------------------------------------------------------------------------
' PCint-Dummy.bas
' Testprogramm Interruptprogrammierung des Maga48
' Compiler: Bascom 1.11.8.3
' D5 an LED rot, D6 an LED grün, D7 an LED gelb
' Taster 1 an B0, Taster 2 an B1
'---------------------------------------------------------------------------
$regfile = "m48def.dat" 'Definitionsdatei für den Mega48
$crystal = 8000000 'Quarzfrequenz 8,0MHz
Portd = &B11100000 'PullUp von Pin PD5, PD6 und PD7 aktivieren.
Ddrd = &B11100000 'Pin PD5, PD6, PD7 Ausgang, Rest Eingang.
Config Portb = Input 'Der ganze Port B als Input deklariert.
Portb = &B11111111 'Der ganze Port B PullUp eingeschaltet > pcint0-pcint7 (portb.0-portb.7).
Enable Interrupts 'Global Interrupts erlauben.
Enable Pcint0 'Enable Interrupt Pcint0 (pcint0-pcint7).
On Pcint0 Intdetect 'Wenn an Pin B0 bis Pin B7 das Level wechselt, Sprung zu Label Intdetect.
Pcmsk0 = &B00001111 'Enable pcint0-pcint3 (portb.0-portb.3).
Do
Portd.5 = Not Portd.5 'LED blinkt als Programmsimulation.
Waitms 20
Loop
Intdetect: 'Label Intdetect, Sprungmarke für Pcint0-Interrupt.
'################################################# #####################################
'Nachfolgend der Versuch die Tasten mit Debounce zu entprellen - leider ging´s daneben.
'Hierfür wurden natürlich die beiden Tastenabfragen hinter diesem REM-Block vorher mit Remarks versehen.
'Debounce Pinb.0 , 0 , Pb0 'Entprelle Taster an Pin B0 und bei Masseschluß Sprung auf Label Pb0.
'Debounce Pinb.1 , 0 , Pb1 'Entprelle Taster an Pin B1 und bei Masseschluß Sprung auf Label Pb1.
'Pb0: 'Label für Debounce-Sprung Pin B0
'Portd.6 = Not Portd.6 'Grüne LED (Pin PD6) an oder aus, wenn Taster 1 an Pin B0 gedrückt.
'Return 'Return für Label Pb0:
'Pb1: 'Label für Debounce-Sprung Pin B1
'Portd.7 = Not Portd.7 'Gelbe LED (Pin PD7) an oder aus, wenn Tsster 2 an Pin B1 gedrückt.
'Return 'Return für Label Pb1:
'################################################# #####################################
If Pinb.0 = 0 Then Portd.6 = Not Portd.6 'Grüne LED (Pin PD6) an oder aus, wenn Taster 1 an Pin B0 gedrückt.
If Pinb.1 = 0 Then Portd.7 = Not Portd.7 'Gelbe LED (Pin PD7) an oder aus, wenn Taster 2 an Pin B1 gedrückt.
Return 'Verläßt die On Interrupt-Funktion (On Pcint0 Intdetect)
End 'Programmende
+Code Tags (PicNick)
ich hab jetzt erstmal halbwegs verstanden, wie ich bei den Mega 48, 88 und 168 die "höheren" Interrrupts ansprechen und auswerten kann.
Das, bzw. wohl MEIN Problem ist, daß ein Ereignis (hier Leveländerung) bei den "höheren" Interrupts ja wohl nur als kpl. Port gemeldet wird (hier mit "On Pcint0 Intdetect" abgefragt) und dann innerhalb des angesprungenen Labels erst ausgelesen werden kann, welche der 8 Ports (hier Port Bo bis Port B7) denn überhaupt den Interrupt ausgelöst hat.
Wie es scheint, hab ich das hinbekommen.
Nun hab ich versucht die Interrupt-Auswertung eines Tasters mit Debounce zu entprellen.
Ich habe hin und her versucht, bekomme es aber nicht hin.
Es reagiert immer nur die grüne LED an D6.
Die Programmausführung wird dabei rel. auffällig behindert (die rote LED in der Programmsimulation setzt aus) und die Taste nicht wirklich entprellt.
Ich habe mal mein Listing angehängt und den Debounce-Block grün markiert.
Kann mir hier jemend helfen?
Besten Dank!
Wolfram
'---------------------------------------------------------------------------
' PCint-Dummy.bas
' Testprogramm Interruptprogrammierung des Maga48
' Compiler: Bascom 1.11.8.3
' D5 an LED rot, D6 an LED grün, D7 an LED gelb
' Taster 1 an B0, Taster 2 an B1
'---------------------------------------------------------------------------
$regfile = "m48def.dat" 'Definitionsdatei für den Mega48
$crystal = 8000000 'Quarzfrequenz 8,0MHz
Portd = &B11100000 'PullUp von Pin PD5, PD6 und PD7 aktivieren.
Ddrd = &B11100000 'Pin PD5, PD6, PD7 Ausgang, Rest Eingang.
Config Portb = Input 'Der ganze Port B als Input deklariert.
Portb = &B11111111 'Der ganze Port B PullUp eingeschaltet > pcint0-pcint7 (portb.0-portb.7).
Enable Interrupts 'Global Interrupts erlauben.
Enable Pcint0 'Enable Interrupt Pcint0 (pcint0-pcint7).
On Pcint0 Intdetect 'Wenn an Pin B0 bis Pin B7 das Level wechselt, Sprung zu Label Intdetect.
Pcmsk0 = &B00001111 'Enable pcint0-pcint3 (portb.0-portb.3).
Do
Portd.5 = Not Portd.5 'LED blinkt als Programmsimulation.
Waitms 20
Loop
Intdetect: 'Label Intdetect, Sprungmarke für Pcint0-Interrupt.
'################################################# #####################################
'Nachfolgend der Versuch die Tasten mit Debounce zu entprellen - leider ging´s daneben.
'Hierfür wurden natürlich die beiden Tastenabfragen hinter diesem REM-Block vorher mit Remarks versehen.
'Debounce Pinb.0 , 0 , Pb0 'Entprelle Taster an Pin B0 und bei Masseschluß Sprung auf Label Pb0.
'Debounce Pinb.1 , 0 , Pb1 'Entprelle Taster an Pin B1 und bei Masseschluß Sprung auf Label Pb1.
'Pb0: 'Label für Debounce-Sprung Pin B0
'Portd.6 = Not Portd.6 'Grüne LED (Pin PD6) an oder aus, wenn Taster 1 an Pin B0 gedrückt.
'Return 'Return für Label Pb0:
'Pb1: 'Label für Debounce-Sprung Pin B1
'Portd.7 = Not Portd.7 'Gelbe LED (Pin PD7) an oder aus, wenn Tsster 2 an Pin B1 gedrückt.
'Return 'Return für Label Pb1:
'################################################# #####################################
If Pinb.0 = 0 Then Portd.6 = Not Portd.6 'Grüne LED (Pin PD6) an oder aus, wenn Taster 1 an Pin B0 gedrückt.
If Pinb.1 = 0 Then Portd.7 = Not Portd.7 'Gelbe LED (Pin PD7) an oder aus, wenn Taster 2 an Pin B1 gedrückt.
Return 'Verläßt die On Interrupt-Funktion (On Pcint0 Intdetect)
End 'Programmende
+Code Tags (PicNick)