Hallo, ich versuche den INT0 des Tiny25 in Betrieb zu nehmen, aber leider klappt es nicht. Mit dem INT0 will ich einen Puls ausmessen Port vorbereiten.. DDRB &= ~(1<<DDB0); /* Pin PB0 als Eingang */ PORTB |= (1<<PB0); /* internen Pull-Up an PB0 aktivieren */ /* Int0 steigende Flanke / INT0 enable PB0 */ MCUCR = 0x03; GIMSK = (1 << INT0); sei(); in der Routine sollte der Einsprung erfolgen wenn ein Flankenwechsel kommt... SIGNAL(SIG_INTERRUPT0) { if( MCUCR == 0x03) // Testen auf steigende Flanke { TCNT1 = 0; // Timer1 Reset TCCR1 = ( 1 << CS10 | 1 << CS12 ); MCUCR = 0x02; // INT0 fallende Flanke return; } if( MCUCR == 0x02 ) // Testen auf fallende Flanke { TCCR1 = 0x00; // Timer1 Stoppen Pulsdauer = TCNT1; // Timer1 Wert = Pulsdauer MCUCR = 0x03; // INT0 auf steigende Flanke return; } } das gleiche hatte ich schon mit einem Tiny13 gemacht und da geht es ohne Problem, beim Tiny25 reagiert aber der Int nicht auf einen Flankenwechsel am Pin (mit Oszi nachgemessen..) was mach ich falsch??? Gruss Patrick
Fehler über Fehler.... Patrick schrieb: > ich versuche den INT0 des Tiny25 in Betrieb zu nehmen, aber leider > klappt es nicht. Mit dem INT0 will ich einen Puls ausmessen Feststellung: INT0 liegt auf PB2 > Port vorbereiten.. > > DDRB &= ~(1<<DDB0); /* Pin PB0 als Eingang */ > PORTB |= (1<<PB0); /* internen Pull-Up an PB0 aktivieren */ Feststellung: Auf PB0 liegt nicht INT0 sondern PCINT0 > /* Int0 steigende Flanke / INT0 enable PB0 */ > MCUCR = 0x03; > GIMSK = (1 << INT0); > sei(); > > in der Routine sollte der Einsprung erfolgen wenn ein Flankenwechsel > kommt... > > SIGNAL(SIG_INTERRUPT0) In "meinem" Datenblatt nennt sich das "INT0". Und wenn ich mich nicht irre, ist SIGNAL veraltet.
Magnus Müller schrieb: >> SIGNAL(SIG_INTERRUPT0) > > In "meinem" Datenblatt nennt sich das "INT0". Und wenn ich mich nicht > irre, ist SIGNAL veraltet. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ISR
aua.. schande über mein Haupt... stimmt ich hab den PCINT0 mit dem INT0 verwechselt. Kann ich mit dem PCINT0 überhaupt einen Puls ausmessen? Gruss Patrick
Natürlich kannst du das. PCINT0 reagiert auf jeden Flankenwechsel . D.h. der Interrupt wird sowohl bei 0->1 als auch bei 1->0 Wechseln ausgelöst.
und wie bekomme ich mit ob es eine steigende Flanke oder fallende war? geht nur mit dem INT0 oder? Gruss Patrick
Patrick schrieb:
> und wie bekomme ich mit ob es eine steigende Flanke oder fallende war?
Prüfe in der ISR den Zustand des Pins. Wen der Pin high ist, war es eine
positive Flanke. Ist der Pin LOW, war es eine negative.
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.