PCINT (Pin Change Interrupt) bei der Attiny / Mega Serie - Fragen

OP #2067133
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?!
OP #2067148
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}
OP #2067156
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 ;)
Persönliche Seite #2067193
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.
#2067195
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?
Gast #2067196
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

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