Hallo!
um mein Menü endlich "sauberer" zu gestalten, benötige ich eine gute Tastenentprellung, so dass ich nicht mehr
auf die debounce routine angewiesen bin.
Nur so kann ich unnötige Sprünge vermeiden und den GOTO Befehl aus meinem Code verbannen.
Am liebsten wäre mir die debounce routine ohne sprung, da hat nich zufällig jemand die sourcen von?
Habe auf mikrocontroller.net folgendes für c gefunden:
Wie bekomme ich das am besten nach Bascom?
Mein Versuch scheitert bisher dabei die IF Abfrage entsprechend zu stellen.
Nutzt ihr zu Tastenentprellung auch debounce, oder wie oben selbst geschriebene Routinen?
Bisher habe ich nur pullup Wiederstände verlötet, macht es Sinn einen Kondensator an jedem Schalter anzubringen und Hardware mäßig zu entprellen?
Aktuell ist mir das bei dem Projekt jetzt nicht so recht, aber vielleicht mal beim nächsten.
um mein Menü endlich "sauberer" zu gestalten, benötige ich eine gute Tastenentprellung, so dass ich nicht mehr
auf die debounce routine angewiesen bin.
Nur so kann ich unnötige Sprünge vermeiden und den GOTO Befehl aus meinem Code verbannen.
Am liebsten wäre mir die debounce routine ohne sprung, da hat nich zufällig jemand die sourcen von?
Habe auf mikrocontroller.net folgendes für c gefunden:
Code:
/************************************************************************/
/* */
/* Not so powerful Debouncing Example */
/* No Interrupt needed */
/* */
/* Author: Peter Dannegger */
/* */
/************************************************************************/
// Target: ATtiny13
#include <avr/io.h>
#define F_CPU 9.6e6
#include <util/delay.h>
#define debounce( port, pin ) \
({ \
static uint8_t flag = 0; /* new variable on every macro usage */ \
uint8_t i = 0; \
\
if( flag ){ /* check for key release: */ \
for(;;){ /* loop ... */ \
if( !(port & 1<<pin) ){ /* ... until key pressed or ... */ \
i = 0; /* 0 = bounce */ \
break; \
} \
_delay_us( 98 ); /* * 256 = 25ms */ \
if( --i == 0 ){ /* ... until key >25ms released */ \
flag = 0; /* clear press flag */ \
i = 0; /* 0 = key release debounced */ \
break; \
} \
} \
}else{ /* else check for key press: */ \
for(;;){ /* loop ... */ \
if( (port & 1<<pin) ){ /* ... until key released or ... */ \
i = 0; /* 0 = bounce */ \
break; \
} \
_delay_us( 98 ); /* * 256 = 25ms */ \
if( --i == 0 ){ /* ... until key >25ms pressed */ \
flag = 1; /* set press flag */ \
i = 1; /* 1 = key press debounced */ \
break; \
} \
} \
} \
i; /* return value of Macro */ \
})
/*
Testapplication
*/
int main(void)
{
DDRB &= ~(1<<PB0);
PORTB |= 1<<PB0;
DDRB |= 1<<PB2;
DDRB &= ~(1<<PB1);
PORTB |= 1<<PB1;
DDRB |= 1<<PB3;
for(;;){
if( debounce( PINB, PB1 ) )
PORTB ^= 1<<PB2;
if( debounce( PINB, PB0 ) )
PORTB ^= 1<<PB3;
}
}
Wie bekomme ich das am besten nach Bascom?
Mein Versuch scheitert bisher dabei die IF Abfrage entsprechend zu stellen.
Nutzt ihr zu Tastenentprellung auch debounce, oder wie oben selbst geschriebene Routinen?
Bisher habe ich nur pullup Wiederstände verlötet, macht es Sinn einen Kondensator an jedem Schalter anzubringen und Hardware mäßig zu entprellen?
Aktuell ist mir das bei dem Projekt jetzt nicht so recht, aber vielleicht mal beim nächsten.