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:"
Gast
#1741410
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_4 Sahra 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
Gast
#1741427
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.
danke für eure Hilfe.
Wichtige Regeln - erst lesen, dann posten! Aussagekräftigen Betreff wählen Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)