ATMega 168 Pin Change Interrupt nur bei steigender Flanke

#3386013
Lesenswert?

Hallo,

Ich hab einen ATMega-20PU beim Wickel und möchte Pin Change Interrupt 
verwenden.

Initialisiert.
1
#define SUART_RXD_PORT  PORTD  
2
#define SUART_RXD_PIN  PIND  
3
#define SUART_RXD_DDR  DDRD
4
#define X_RXD    PD3
5

6
#include "sbit.h"
7
#define X_RXD_PIN  SBIT( PIND, 3 )
8

9
void suart_init()
10
{
11
   SUART_RXD_DDR  &= ~(1 << X_RXD);
12
   SUART_RXD_PORT |=  (1 << X_RXD);
13

14
   PCICR  |= (1 << PCIE2);                                      // PCIE2: Pin change interrupt enable 2 = Pin PCINT23..16
15
   PCMSK2 |= (1 << PCINT19) | (1 << PCINT21) | (1 << PCINT23);  // PCMSK2: Pin change mask register 2 = PCINT19 + PCINT21 + PCINT23 = PD3 + PD5 + PD7
16
}

ISR
1
ISR(PCINT2_vect)
2
{
3
   uart_putc( X_RXD_PIN );   // Debug Ausgabe
4
}

Der PCINT2 Interrupt wird aber nur bei steigender Flanke ausgelöst was 
es mir nicht ermöglicht ein Startbit(LOW) zu erkennen.

Probiert hab ich das indem ich den Betreffenden Pin an GND gelegt habe 
und nur beim trennen von GND der Interrupt ausgelöst wurde.


jemand eine Idee? Ich komm nicht weiter!
Gast #3386059
Lesenswert?

Ralf B. schrieb:
> Der PCINT2 Interrupt wird aber nur bei steigender Flanke ausgelöst was
> es mir nicht ermöglicht ein Startbit(LOW) zu erkennen.

Was hast du den im EICRA Register

Thomas Eckmann schrieb:
> Das kann gar nicht sein.

Na, vielleicht steht's im Datenblatt. Für Int0 und Int1 wird die Flanke 
im External Interrupt Control Register A (EICRA) festgelegt, aber für 
Int2?
#3386069
Lesenswert?

Wolfgang schrieb:
> Ralf B. schrieb:
>> Der PCINT2 Interrupt wird aber nur bei steigender Flanke ausgelöst was
>> es mir nicht ermöglicht ein Startbit(LOW) zu erkennen.
>
> Was hast du den im EICRA Register
>
> Thomas Eckmann schrieb:
>> Das kann gar nicht sein.
>
> Na, vielleicht steht's im Datenblatt. Für Int0 und Int1 wird die Flanke
> im External Interrupt Control Register A (EICRA) festgelegt, aber für
> Int2?

Na wie schön. Aber hier geht es um Pinchange-Interrupts.

mfg.
#3386088
Lesenswert?

Ralf B. schrieb:
> Der PCINT2 Interrupt wird aber nur bei steigender Flanke ausgelöst

Das wird wohl lediglich deine Falschinterpretation des beobachteten 
Fehlverhaltens sein.

Ich sehe nämlich nicht, dass du das Flag des Pin-Change-Interrupts vor 
dem wieder einschalten löscht, was bedeutet, dass er sofort danach 
auslöst, ganz ohne irgendeine Flanke zu diesem Zeitpunkt.
#3386247
Lesenswert?

Ralf B. schrieb:
> Ich hab jetzt mal ein
>
>
>
1
> PCIFR |=  (1 << PCIF2);              // PCIF2: Pin change interrupt flag 
2
> 2 cleared ( writing a logical one )
3
>

Mit einer Read-Modify-Write-Operation löscht du alle Flags, auch die, 
die nicht gelöscht werden sollen. Ist in diesem Fall zwar nicht relevant 
aber grundsätzlich werden die Flags mit
1
PCIFR = (1 >> Blabla);

gelöscht.

> vor jedem dem aktivieren und in der ISR des Pin Change Interrups
> eingefügt. Keine andere Reaktion. Immer noch das gleiche verhalten.

Du gehst recht intensiv mit dem Löschen und Setzen von Interrupt Enables 
zur Sache, inkl. cli und sei. Sowie dem Löschen der zugehörigen Flags. 
Wahrscheinlich kommt das was durcheinander.

> ATMega168 defekt?

Die eher unwahrscheinliche Option. Teste das mit einem kleinen 
Progrämmchen, das nichts anderes macht als PCINT, einfach aus.

mfg.
#3386277
Lesenswert?

Stampede schrieb:
> Rein aus Interesse: Was soll diese Schaltung denn eigentlich machen?

Sie liest 3 Digitalmessschieber aus und sendet die Messwert zu 3 
7-Segment Anzeigen sowie an Peer USB an den PC zur Weiterverarbeitung.

-Lesen der Werte von den Messschieber funktioniert.
-Senden der Werte an die 7-Segmentanzeigen funktioniert.
-Senden an PC über USB funktioniert.
-Empfangen vom PC + Befehlsübernahme funktioniert.
-Lesen der Befehle von den Anzeigeeinheiten funktioniert jetzt nach paar 
Anregungen auch .... puh.

Ich hab in der Main-Schleife paar Delays zwischen dem Auslesen der 
Messschieber und damit dem Senden der Daten über Soft-Uart eingefügt.

Scheinbar hatte der Kontroller nicht genug Zeit auf die erste fallende 
Flanke zu reagieren.

Thomas Eckmann schrieb:
> Du gehst recht intensiv mit dem Löschen und Setzen von Interrupt Enables
> zur Sache, inkl. cli und sei. Sowie dem Löschen der zugehörigen Flags.
> Wahrscheinlich kommt das was durcheinander.

Das stimmt wohl! Es sollte erst mal funktionieren bevor ich daran 
rumoptimiere.

Danke an alle für die Denkanstöße! Die letzten 3 Tage nicht darauf 
gekommen dem Kontroller mal Zeit einzuräumen.

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