Moin!
Ich habe drei Taster, welche ich detektieren will.
Um eine Software-entprellung zu realisieren, setze ich einfach im int0
interrupt (nur steigende Flake) ein Bit. Wenn dieses Bit gesetzt ist,
wird eine zeit gewartet. Und nach ablauf dieser Zeit wird abgefragt,
welcher Pin eine 1 anliegen hat.
Die wartezeit habe ich mit 1ms, 5ms und 20ms getestet.
Das Problem ist nun, das bei kurzem drücken des Tasters immer nicht
erkannt wird, welcher Taster gedrückt wurde. Wenn ich den Taster aber
wirklich lange drücke, wird der Taster am richtigen Eingang erkannt.
Dazu kommt noch, das manchmal bei loslassen des Tasters auch ein
Tasterdruck detektiert wird. Das kann ich mir aber sogar erklären.
Jetzt zum Aufbau:
Die Taster sind alle über jeweils eine Diode verbunden (Kathode am
Int0-Eingang).
Von der Anode der einzelnen Taster geh ich auf Eingänge an PORTA, um zu
erkennen welcher Taster nun gedrückt wurde.
Zum Programm:
Initialisierung der Interrupts:
1 | void init_intr(void)
|
2 | {
|
3 | ///////////////////////////////////////////////////////////////////
|
4 | // Initialize External Interrupt
|
5 |
|
6 | //Interrupt at rising edge at INT0 Input
|
7 | MCUCR |= ((1<<ISC00) | (1<<ISC01));
|
8 |
|
9 | //Enable Interrupt on INT0
|
10 | GICR |= (1<<INT0);
|
11 |
|
12 | ///////////////////////////////////////////////////////////////////
|
13 | // Initialize Timer compare Interrupt
|
14 |
|
15 | TIMSK |= (1<<OCIE0);
|
16 | }
|
ISR von int0:
1 | ISR(INT0_vect) //Taster interrupt
|
2 | {
|
3 | t_event = 1;
|
4 | }
|
ISR vom Timer (compare):
1 | ISR(TIMER0_COMP_vect) //Interrupt every ms
|
2 | {
|
3 |
|
4 | ///////////////////////////////////////////////////////////////////
|
5 | // Entprellen durch 5ms warten
|
6 | if (t_event)
|
7 | {
|
8 | t_ms++;
|
9 |
|
10 | if (t_ms == 5) //wait 5 ms
|
11 | {
|
12 | t_event = 0;
|
13 | t_this = (PINA & ( TUP | TMID | TDOW ));
|
14 | t_press = 1;
|
15 | }
|
16 | }
|
17 | }
|
und meine while(1):
1 | if (t_press)
|
2 | {
|
3 | t_press = 0;
|
4 | uart_puts("\r\n");
|
5 | uart_putc(t_this);
|
6 | }
|
t_this, t_press und t_event is dabei global.
Die Timerzeiten, welche mit der Compare-ISR generiert werden habe ich
mit nem Oszilloskope überprüft. Da kann also nix falsch sein.
Hoffe mir kann jemand einen Tipp geben.
Grüße Jan