Hallo...
habe ein Problem mit meiner Interruptroutine.
An PD3 hatte ich zuvor einen Schalter gegen Masse. Diesen habe ich nun durch einen Taster ersetzt, was mir dann Probleme bereitete.
Vielleicht sollte ich schreiben, was ich machen wollte.
Drücke ich den Taster soll der Zustand 1 aktiviert werden. Drücke ich ihn nochmal, soll der Zustand 2 aktiviert werden.
Das läuft auch soweit recht gut.
Das Problem ist, dass der Taster prellt...die Zustände ändern sich. Habe bereits einen Kondensator und einen Wiederstand zur Entprellung eingelötet. Ist besser geworden, aber das Problem gibt es zwischen durch immer wieder.
Als der Schalter drin war, konnte ich den Zustand abfragen, entweder war er High oder Low, und dann eine simple Warteschleife (zur Entprellung) einbauen. Aber beim Taster geht das doch nicht so einfach (bzw. kriege ich es nicht hin), weil ja jedes mal mit dem Zustand Low geschaltet wird, und der Taster leider auch beim loslassen prellt.
Wie kann ich dieses Problem lösen? Bin über jeden Hinweis dankbar...
Ich füge eben auch mal den Code ein...
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
unsigned int status_taster=1; // Status beim Eintritt in Interruptroutine
void Inter(); // Interrupt funktion
int main()
{
DDRB = 0b11111111; // PORTB als Ausgang definieren
PORTB = 0b00011000; // PORTB setzen
DDRD = 0b11110110; // PD0 und PD3 als Eingang definieren
PORTD = 0b11111111;
Inter();
for (;;)
{}
}
void Inter()
{
MCUCR = 0b00001000; // Flanke definieren
GIMSK = 0b10000000; // Enable interrupt
sei(); // Interrupt freigeben
}
SIGNAL(SIG_INTERRUPT1) // Taster an PD3 löst Interrupt aus
{
if(status_taster==1)
{
PORTB |= (1<<PB3); /*Setzt PB3 HIGH...LED aus \ */
PORTB &= ~(1<<PB4); //Setzt PB4 LOW...LED an } Zustand 1
PORTD |= (1<<PD5); //Setzt PD5 HIGH /
status_taster=2;
}
else
{
PORTB &= ~(1<<PB3); /*Setzt PB3 LOW...LED an \ */
PORTB |= (1<<PB4); //Setzt PB4 HIGH...LED aus } Zustand 2
PORTD &= ~(1<<PD5); //Setzt PD5 LOW /
status_taster=1;
}
GIFR=0;
}
[-o<
Lesezeichen