Forum: Mikrocontroller und Digitale Elektronik ATMEL ATmega 328p PCINT nur bei steigender Flanke


von Mav (Gast)


Lesenswert?

Hallo Zusammen,

ich würde gerne einen Pin Change Interrupe an PB0 nur bei steigender 
Flanke auslösen lassen. Leider komm ich nicht mehr weiter. anbei mein 
Code. Was mache ich falsch habt ihr eine Lösung?

#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
DDRB |= (1<<PB5);
PORTB &= ~(1<<PB5);

DDRB &= ~(1<<PB0);
PORTB |= (1<<PB0);


PCICR |= (1<<PCIE0);

PCMSK0 |= (1<<PCINT0);

sei();


    while(1)
    {

    }
}

ISR(PCINT0_vect)
{
      unsigned char sig;
      unsigned char sig_alt;

      sig = PINB & (1<<PB0);  // Signal einlesen

      if (  (sig!=sig_alt) &&  (sig_alt=sig) ) {
        //  steigende Flanke
        PCMSK0 &= ~(1<<PCINT0);
        PINB ^= (1<<PB5);
      }

}


VIELEN DANK!

von Mav (Gast)


Lesenswert?

PB5 soll über Interrupt am PB0 toggeln. INT0 + INT1 habe ich bereits 
verwendet.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Fu brauchst in deinem Code nich auf eine Flanke prüfen. Eine Flanke war 
ja die Ursache für den Interrupt. Du musst für eine steigende Flanke 
also nur noch abfragen, ob der Pin nach dem Interrupt High ist...

von M. T. (restfet)


Lesenswert?

1
ISR(PCINT0_vect)
2
{
3
       if (  PINB & (1<<PB0) ) {
4
        //  steigende Flanke
5
         PCMSK0 &= ~(1<<PCINT0);
6
         PORTB ^= (1<<PB5);
7
       }
8
 
9
}


Ausgabe erfolgt über PORTB, mit PINB kannst du nur das anliegende Signal 
einlesen.

von Mav (Gast)


Lesenswert?

Hallo Lothar, kannst du mir da etwas code geben... ;-) Danke

von Mav (Gast)


Lesenswert?

ISR(PCINT0_vect)
{
  if (  PINB & (1<<PB0) ) {
    //  steigende Flanke
    PORTB ^= (1<<PB5);
  }

}

so funktioniert es... vielen Dank für die schnelle Hilfe

von Max M. (jens2001)


Lesenswert?

Mav schrieb:
> Pin Change Interrupe an PB0 nur bei steigender
> Flanke auslösen lassen

Wenn du mal einen Blick ins Datasheet zum 328 geworfen hättes wüsstes du 
dass das hardwaremäßig nicht möglich ist PCINT NUR auf steigende Flanke 
zu triggern.

B.t.W. Wo wird der Variablen sig_alt ein Wert zugewiesen bevor du sie in 
einem Vergleich verwendest?

von M. T. (restfet)


Lesenswert?

Max M. schrieb:
> Wo wird der Variablen sig_alt ein Wert zugewiesen bevor du sie in
> einem Vergleich verwendest?

Im Vergleich bzw. in der Abfrage. Ich hab auch ein bissl gebraucht bis 
ichs gesehn hab.

von Mav (Gast)


Lesenswert?

@Max Mustermann:

Da es über ein Register nicht möglich ist habe ich ja nach einer 
alternative sucht...

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.