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!
PB5 soll über Interrupt am PB0 toggeln. INT0 + INT1 habe ich bereits verwendet.
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...
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.
Hallo Lothar, kannst du mir da etwas code geben... ;-) Danke
ISR(PCINT0_vect)
{
if ( PINB & (1<<PB0) ) {
// steigende Flanke
PORTB ^= (1<<PB5);
}
}
so funktioniert es... vielen Dank für die schnelle Hilfe
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?
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.