Forum: Mikrocontroller und Digitale Elektronik ATMega 168 Pin Change Interrupt nur bei steigender Flanke


von Ralf B. (spacerx)


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!

von Thomas E. (thomase)


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.

Das kann gar nicht sein. Zeig mal dein ganzes Programm und deine 
Hardware.

mfg.

von Ralf B. (spacerx)


Angehängte Dateien:

Lesenswert?

Hier der Code + Schaltplan um den ATMega168.

Soll ein Soft-Uart werden

von Wolfgang (Gast)


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?

von Thomas E. (thomase)


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.

von Thomas E. (thomase)


Lesenswert?

Ralf B. schrieb:
> Hier der Code + Schaltplan um den ATMega168.
>
> Soll ein Soft-Uart werden

Gibt es das auch in lesbar?
Was ist so schwer daran, die beiden Dateien als Anhang zu posten?

mfg.

von Ralf B. (spacerx)



Lesenswert?

Thomas Eckmann schrieb:
> Gibt es das auch in lesbar?
> Was ist so schwer daran, die beiden Dateien als Anhang zu posten?

Was ist an einer Rar-Datei nicht lesbar?

Dann noch mal einzeln. Büdde

von Stefan E. (sternst)


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.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Ralf B. schrieb:
> 1 MB, 7 Downloads
PNG, wie beim Upload empfohlen, geht nicht?

> Was ist an einer Rar-Datei nicht lesbar?

Das fängt damit an, dass Firefox erstmal ganz pikiert fragt, wie es mit 
der Datei verfahren soll.

von Ralf B. (spacerx)


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?

von Kelvin S. (Firma: Keine) (dtx)


Angehängte Dateien:

Lesenswert?

Wolfgang schrieb:
> Das fängt damit an, dass Firefox erstmal ganz pikiert fragt, wie es mit
> der Datei verfahren soll.

Einstellungssache. Edit->Preferences->Applications

von Stampede (Gast)


Lesenswert?

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

von Thomas E. (thomase)


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.

von Ralf B. (spacerx)


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.

von Wolfgang (Gast)


Lesenswert?

Kelvin S. schrieb:
> Einstellungssache. Edit->Preferences->Applications

Und dann klickt man sich weiter durch, statt direkt in einem 
Browserfenster den Anhang zu sehen (sofern man dann evtl. eine dafür 
passende Anwendung installiert hat). Wozu eine doppelte Verpackung der 
Inhalte?

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.