Forum: Gesperrte Threads Interrupts für Anfänger_2


von Sahra N. (sahra_nana)


Lesenswert?

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
von Oliver (Gast)


Lesenswert?

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

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

> 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

von Grrrr (Gast)


Lesenswert?

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.

von Sahra N. (sahra_nana)


Lesenswert?

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.

von Justus S. (jussa)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Sahra N. (sahra_nana)


Lesenswert?

danke für eure Hilfe.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Wichtige Regeln - erst lesen, dann posten!

Aussagekräftigen Betreff wählen
Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.