Forum: Mikrocontroller und Digitale Elektronik PCINT (Pin Change Interrupt) bei der Attiny / Mega Serie - Fragen


von Rene K. (draconix)


Lesenswert?

Gehe ich richtig in der Annahme das ein PCINT, also ein Pin Change 
Interrupt, wie der Name schon sagt, jegliche Flankenänderung als 
Interrupt nutzt?

Also sowohl eine steigende und eine fallende Flanke? Dies kann man 
leider auf Hardwareebene nicht so einstellen das er ausschließlich 
steigend oder fallend Detektiert so wie es bei einem normalen Externen 
Interrupt möglich ist?!

Wie löst ihr das dann Softwareseitig um eine Steigende / Fallende Flanke 
zu ermitteln? Einfach denn Interrupt kommen lassen und dann 
kontrollieren ob der Pegel am Pin high oder low ist?

Also so zum Beispiel (tiny44, PCINT1):
1
void PC_Int() org 0x0002
2
{
3
   if(PINA.B1 == 1)
4
   {
5
      //steigender Flanke
6
   } else {
7
     
8
      //fallende Flanke
9
   }
10
}

Oder kann man dies auch eleganter lösen?!

von Rene K. (draconix)


Lesenswert?

Rene K. schrieb:
> void PC_Int() org 0x0002
> {
>    if(PINA.B1 == 1)
>    {
>       //steigender Flanke
>    } else {
>
>       //fallende Flanke
>    }
> }

Das wären mir im übrigen schon wieder 5 Clocks die mir nach dem 
Interrupt fehlen würden:
1
;                 void PC_Int() org 0x0002
2
;                 if(PINA.B1 == 1)
3
4
        IN         R27, PINA+0
5
        SBRS       R27, 1
6
        JMP        L_PC_Int0
7
8
;                 } else {
9
10
        JMP        L_PC_Int1
11
L_PC_Int0:
12
;                 steigende Flanke}
13
L_PC_Int1:
14
;                 fallende Flanke}

von B. G. (smarti)


Lesenswert?

Hallo,

ist nicht ganze deine Frage aber ggf. hilft es dir dennoch:

Beitrag "Problem mit Pin Change Interrupt und Timer Interrupt"

Grüßle

von Micha H. (mlh) Benutzerseite


Lesenswert?

Rene K. schrieb:
> Also sowohl eine steigende und eine fallende Flanke? Dies kann man
> leider auf Hardwareebene nicht so einstellen das er ausschließlich
> steigend oder fallend Detektiert so wie es bei einem normalen Externen
> Interrupt möglich ist?!

Meine Datenblätter sagen was anderes.

von Rene K. (draconix)


Lesenswert?

B. G. schrieb:
> Hallo,
>
> ist nicht ganze deine Frage aber ggf. hilft es dir dennoch:
> Beitrag "Problem mit Pin Change Interrupt und Timer Interrupt"
>
> Grüßle

Danke für diesen Thread, werde ihn mir mal genauer anschauen. ;)

Micha H. schrieb:
> Rene K. schrieb:
>> Also sowohl eine steigende und eine fallende Flanke? Dies kann man
>> leider auf Hardwareebene nicht so einstellen das er ausschließlich
>> steigend oder fallend Detektiert so wie es bei einem normalen Externen
>> Interrupt möglich ist?!
>
> Meine Datenblätter sagen was anderes.

Zu was? Mein Datenblatt sagt mir dazu folgendes:

"When the PCIE1 bit is set (one) and the I-bit in the Status Register 
(SREG) is set (one), pin
change interrupt 1 is enabled. Any change on any enabled PCINT11..8 pin 
will cause an interrupt.
The corresponding interrupt of Pin Change Interrupt Request is executed 
from the PCI1
Interrupt Vector. PCINT11..8 pins are enabled individually by the PCMSK1 
Register."

Deshalb gehe ich davon aus das jeder Flankenwechsel gezählt wird. Das 
ist ja ebend meine Frage ;)

von Micha H. (mlh) Benutzerseite


Lesenswert?

Table 43. Interrupt 0 Sense Control
ISC01 ISC00 Description
0 0 The low level of INT0 generates an interrupt request.
0 1 Any logical change on INT0 generates an interrupt request.
1 0 The falling edge of INT0 generates an interrupt request.
1 1 The rising edge of INT0 generates an interrupt request.


Da Du keinen konkreten Controller genannt hast, habe ich einfach mal 
Mega48/88/168 rausgezogen.

von Justus S. (jussa)


Lesenswert?

Micha H. schrieb:
> Table 43. Interrupt 0 Sense Control
> ISC01 ISC00 Description
> 0 0 The low level of INT0 generates an interrupt request.
> 0 1 Any logical change on INT0 generates an interrupt request.
> 1 0 The falling edge of INT0 generates an interrupt request.
> 1 1 The rising edge of INT0 generates an interrupt request.
>
>
> Da Du keinen konkreten Controller genannt hast, habe ich einfach mal
> Mega48/88/168 rausgezogen.

und der Zusammenhang mit den PCINTs liegt wo?

von spess53 (Gast)


Lesenswert?

Hi

>Da Du keinen konkreten Controller genannt hast, habe ich einfach mal
>Mega48/88/168 rausgezogen.

Aber die falsche Stelle. Es geht um PCINT, nicht um INT0/1. Dort ist 
alles klar.

PCINT wird bei einer Änderung getriggert. Die Flanke muss manuell 
dedektiert werden.

MfG Spess

von Micha H. (mlh) Benutzerseite


Lesenswert?

spess53 schrieb:
> Aber die falsche Stelle. Es geht um PCINT, nicht um INT0/1. Dort ist
> alles klar.

Das habe ich übersehen. In dem Fall muss die Auswertung der Flanke wohl 
selbst gemacht werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.