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:"
:
Verschoben durch User
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
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.
Wichtige Regeln - erst lesen, dann posten! Aussagekräftigen Betreff wählen Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)