Hallo, ich möchte gerne durch drücken eines Tasters einen Interrupt
auslösen. Ich habe die Internen Pullups aktiviert und und schalte den
Port durch Drücken auf GND. Es funktioniert aber nicht.
Ich nutze eine ATMega8 mit 1MHz internen Osszillator und die Taster sind
an den Pins PD2 (INT0) und PD3 (INT1) angeschlossen. Durch drücken des
Taster sollen die Pins PC0 und PC1 getoggelt werden.
mein code:
...
DDRC = 0x03;
DDRD = 0xF3;
...
int main()
{
...
//INTERRUPT (MCUCR S.33, GICR S.49)
DDRD &= ~((1<<PD2)|(1<<PD3)); //Interne PullUps Setzen
PORTD |= ((1<<PD2)|(1<<PD3));
MCUCR &= ~0x0F; // löschen
MCUCR |= 0x0A; // INT0, INT1 auf fallende Flanke
GICR |= (1<<INT1) | (1<<INT0); // Interrupts aktivieren
sei(); // Interrupts einschalten
...
}
...
ISR( INT0_vect ){
PORTC ^= 0x01;
}
ISR( INT1_vect ){
PORTC ^= 0x02;
}
aspire schrieb:> an den ports hängt ne led, und es tut sich garnicht leider. die flackert> nicht mal ein bisschen
Vielleicht prellt die Taste genau 1x und Du schaltest 2x um und siehst
nichts? (Wie wahrscheinlich das ist, sei mal dahingestellt.)
Schalte die LED mal nur ein!
Ansonsten: LED richtig herum? Defekt? Am richtigen Pin?
Gruß Dietrich
Hallo aspire,
das ist doch kein Problem, sondern dein Unwissen, wie man Taster - die
immer PRELLEN - abfragt.
Taster direkt über Interrupts gehören nicht zusammen !
.
du gibst deinem internen (hochohmige) Pullup nur ca 1 µs Zeit, um den
zuvor wahrscheinlich undefinierten Pin auf high zu ziehen. Vielleicht
ist das zu kurz (der externe Pullup hat dafür ms lang Zeit, weil er ab
dem Powerup wirkt).
Bau mal eine Wartezeit zwischen dem Aktivieren der Pullups und dem
enablen des Interrupts ein oder treibe die beiden Pins zunächst mal als
Ausgang definiert auf high, und schalte sie dann erst als Eingang mit
Pullup.
Entprellen muss man immer noch, hier ein Inline Macros von Peda:
Beitrag "Entprellen für Anfänger"
Das Konzept heißt dann Pollen der Pins, die ISR werden gelöscht.
.