hallo,
ich habe eine Frage an euch, und zwar ich möchte zwei taster an PB4, und
an PB5 anschliessen, und möchte die durch einen Interrupt betätigen, die
Frage wie kann 2 Labels aufrufen unter einem Interrupt Vektor:
ich meine:
.include "m88def.inc"
.def temp = r16
.org 0x00
rjmp main
.org 0x003
rjmp PCINT0_4
main: ; hier beginnt das Hauptprogramm
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;ldi temp, 0x00
;out DDRD, temp
ldi temp, 0x0F
out DDRB, temp
ldi temp, (1<<PCINT4) | (1<<PCINT5) ; INT4 und INT auf fallende
Flanke konfigurieren
sts PCMSK0, temp
ldi temp, (1<<PCIE0) ;| (1<<INT1) ; INT0 und INT1 aktivieren
sts PCICR, temp
sei ; Interrupts allgemein aktivieren
loop: rjmp loop ; eine leere Endlosschleife
PCINT0_4:
sbi PORTB, 0
reti
PCINT0_5:
cbi PORTB, 0
reti
das Programm liest nur das Label "PCINT0_4:"
Sahra Nana schrieb:> ich habe eine Frage an euch, und zwar ich möchte zwei taster an PB4, und> an PB5 anschliessen, und möchte die durch einen Interrupt betätigen,
Willst du wirklich einen Taster durch einen Interrupt zu betätigen?
Sahra Nana schrieb:> .org 0x003> rjmp PCINT0_4Sahra Nana schrieb:> das Programm liest nur das Label "PCINT0_4:"
Was genau du mit "lesen" meinst, ist mir zwar auch nicht klar, aber
PCINT0_5 wird niemals erreicht und auch niemals angesprungen. Der Sprung
da drauf fehlt in der Interrupttabelle.
Oliver
> Der Sprung da drauf fehlt in der Interrupttabelle.
Ich sehe keine (komplette) Interrupttabelle. Die "abgekürzte Form"
sollte man nur benutzen, wenn man alle Register, deren Bits und auch
alle anderen vordefinierten Labels auswendig kennt.
Ansonsten:
Taster im Ext. Interrupt abfragen ist Unfug, siehe Entprellung.
PinChange-Interrupt und Ext.-Interrupt sind Zweierlei. Du benutzt den
PinCange-Int, da gibt es pro Port (mit je bis zu 8 Bits bzw. Pins) nur
einen Handler. Du musst also die verschiedenen Ereignisse in diesem
einen Handler separieren. Für (prellende) Tasten ist das aber
ungeeignet.
MfG
Ich verstehe Deine Absichten so: Du hast zwei Taster am uC. Wenn der
eine betätigt wird, soll eine LED (oder ähnlich) angehen, wenn der
andere betätigt wird soll die LED ausgehen (oder auch umgekehrt,
jedenfalls immer im Gegensinn).
Es ist so, das Interrupts durch die Taster "betätigt" werden. Man sagt
hier korrekt: Sie werden ausgelöst.
Warum Du nun eigentlich fragst wie man zwei verschiedene Labels unter
einem Interrupt-Vektor aufrufen kann, ist mir nicht klargeworden. Die
beiden Taster lösen, da sie an unterschiedlichen Pins angeschlossen
sind, auch zwei verschiedene Interrupts aus. Du hast ja auch zwei
Routinen PCINT_4 und PCINT_5. Also musst Du in der
Interrupt-Vektortabelle auch zwei Einträge haben, die darauf verweisen
und schon geht es (im groben).
Mal ganz abgesehen davon, wird Peter Dannegger Dir ohne Zweifel noch
mitteilen, das Taster ohne Entprellung nicht zuverlässig funktionieren.
:-) In Deinem Fall spielt das erstmal keine Rolle, aber Du solltest das
beim nächsten Mal beachten. Zur Übung solltest Du Dir aber mal den
entsprechenden Artikel im Wiki durchlesen und versuchen das umzusetzen.
Oliver schrieb:> Was genau du mit "lesen" meinst, ist mir zwar auch nicht klar, aber> PCINT0_5 wird niemals erreicht und auch niemals angesprungen. Der Sprung> da drauf fehlt in der Interrupttabelle.
ja das war meine Frage, . Diese Stelle(.org 0x0003) wird von PCINT0-7
angesprungen. aber ich brauche von diesem Reg nur PCINT4 und PCINT5 wie
kann ich das Label PCINT0_5 definieren.
Sahra Nana schrieb:> ja das war meine Frage, . Diese Stelle(.org 0x0003) wird von PCINT0-7> angesprungen. aber ich brauche von diesem Reg nur PCINT4 und PCINT5 wie> kann ich das Label PCINT0_5 definieren.
direkt gar nicht...du musst in der PCINT0-7-ISR abfragen, welcher Pin
denn den Interrupt ausgelöst hat und dementsprechend springen...
Sieh es so:
Wenn du 2 Babys hast, die in verschiedenen Räumen schlafen und du aber
nur ein Babyphone hast, bei dem ein Licht aufleuchtet, wenn eines der
beiden Babys schreit, dann bleibt dir nichts anderes übrig als bei
leuchtendem Licht in beiden Räumen nachzusehen, welcher der beiden
Racker durch sein Schreien das Licht ausgelöst hat.
Dein Pin Change Interrupt ist das Babyphone
das Aufleuchtende Licht ist das Auslösen und Anspringen des Pin Change
Interrupts, der bei dir beim Label PCINT0_4 endet.
Und dort musst du dir jetzt ansehen, welcher der Pins PB4 oder PB5 den
Interrupt ausgelöst hat.