Pin Change Interrupt

Persönliche Seite #773020
Lesenswert?
• ▲
▼
MoinMoin,

PCINT bietet die Möglichkeit an JEDEM Pin deines Atmels mit einem 
Pegelwechsel einen entsprechenden Interrupt auszulösen. Hier ein kurzes 
Beispiel (für einen Mega644 PCINT für Pin7 an Port A:
1
/* Interruptroutine PCINT */
2
ISR(PCINT0_vect)
3
{
4
...
5
}
6

7
...
8
/* PCINT initialisieren */
9
DDRA &= ~(1 << PA7);  
10
PCMSK0 |= (1 << PCINT7);
11
PCICR  |= (1 << PCIE0);
12
...

Siehe auch die Doku für deinen Atmel und avr-libc...

Grüße Uwe
Gast #773054
Lesenswert?
• ▲
▼
Hallo,

erstmal danke für Eure schnelle Antwort.
Nur nochmal dumm gefragt, hoffe ich habs jetzt verstanden!

1. Falls ich nur PORT A Pin 7 als INT initialisiere, ist dieser
Interrupt vergleichbar mit dem am z.B. INT0 Eingang?

2. Ich kann am PORT A Pin 4 + Pin 5 + Pin 6 auf einen Pin Change INT
initialisieren und die entsprechende ISR wird abgearbeitet, sobald sich 
einer dieser 3 PIN´s irgendwie ändert?

Danke wiedermal im Voraus!

Wilfried H.
Persönliche Seite #773079
Lesenswert?
• ▲
▼
MoinMoin,

> Nur nochmal dumm gefragt, hoffe ich habs jetzt verstanden!
>
ich habe auch eine Weile gebraucht, ehe ich es verstanden habe und die 
richtigen Register gefunden habe, die man initialisieren muß...

> 1. Falls ich nur PORT A Pin 7 als INT initialisiere, ist dieser
> Interrupt vergleichbar mit dem am z.B. INT0 Eingang?
>
ja.

> 2. Ich kann am PORT A Pin 4 + Pin 5 + Pin 6 auf einen Pin Change INT
> initialisieren und die entsprechende ISR wird abgearbeitet, sobald sich
> einer dieser 3 PIN´s irgendwie ändert?
>
richtig, der Interrupt wird ausgelöst sobald sich an irgendeinem Pin des 
Port A sich etwas ändert (vorausgesetzt die sind als Eingänge 
initialisiert). Du mußt dann in der ISR herausfinden, welcher Pin es 
war.

Was ich noch nicht herausgefunden habe, ist, wie man festlegen kann, bei 
welcher Pegelflanke (L->H oder H->L) der Interrupt ausgelöst wird 
(analog INT0). Vielleicht weis das jemand hier...

Grüße Uwe
#773179
Lesenswert?
• ▲
▼
Uwe Berger wrote:
> Was ich noch nicht herausgefunden habe, ist, wie man festlegen kann, bei
> welcher Pegelflanke (L->H oder H->L) der Interrupt ausgelöst wird
> (analog INT0). Vielleicht weis das jemand hier...
Geht nicht. Pin Change Interrupts reagieren grundsätzlich auf jede 
Änderung. Eine Abfrage, welche Flanke es war, muss man in Software 
machen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren