ATMega 168 Pin Change Interrupt nur bei steigender Flanke

OP #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.
OP #3386135
Lesenswert?
• ▲
▼
Ich hab jetzt mal ein

1
PCIFR |=  (1 << PCIF2);              // PCIF2: Pin change interrupt flag 2 cleared ( writing a logical one )

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

ATMega168 defekt?
#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.
OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.