Hallo liebe Community!
Seit einigen Tagen bin ich "stiller" Leser hier und habe mir schon einige Tipps und Anregungen geholt
Leider sitze ich noch immer an einem kleinen Problem:
Ich habe einen ATTiyn13A auf einem Versuchsboard aufgebaut. Als Programm nutze ich das AtmelStudio 6.1
-Die Anschlüsse PB0 und PB1 sind jeweils mit einer LED verbunden.
-Die Anschlüsse PB3 und PB4 jeweils mit einem Taster der mit der anderen Seite auf GND liegt.
Das Endergebnis soll einmal so Aussehen das eine gewisse Reihenfolge und Häufigkeit einiger Taster gedrückt werden muss um z.B. eine Segmentanzeige zu Aktivieren. (Klar das der Tiny13 da schnell ausgelastet ist mit Ports aber ich habe auch noch einen 2313A da. Der Tiny13 ist erstmal für den Test gedacht)
Z.B. wenn Taster 1 5mal betätigt wurde und danach Taster 2 3mal soll auf der Segmentanzeige eine 8 aufleuchten.
Angefangen habe ich mit einem Taster der wenn er gehalten wurde eine LED leuchten lies. Dies funktionierte auch.
Wenn ich jedoch statt der LED eine Variable hochzählen will und zb wenn die Variable 5 erreicht die LED anschalten soll geht sie gar nicht an. Egal wie schnell oder häufig man die Taste drückt.
Dann habe ich versucht mit jedem Tastendruck die LED zu invertieren. dh. 1.Druck an, 2.Druck aus usw... Jetzt geht die LED allerdings mal an und mal wieder aus, mal bleibt sie einfach an... Sehr unkontrolliert...
Da habe ich an eine Entprellung gedacht die wie unten eingebaut ist. Jedoch flackert die LED jetzt nur währen die Taste gedrückt ist und die Schaltzustände sind weiterhin sehr unkontrolliert....
Vielleicht kann mir jemand einen Denkanstoß geben?
Hier das aktuelle Programm:
Code:
/*
* LED_Anzeige.c
*
* Created: 18.05.2014 19:27:56
* Author: Dennis
*/
#define F_CPU 9000000UL
#include <util/delay.h>
#include <avr/io.h>
unsigned char Taster1;
unsigned char Taster2;
void entprellung( volatile uint8_t *port, uint8_t maske ) {
uint8_t port_puffer;
uint8_t entprellungs_puffer;
for( entprellungs_puffer=0 ; entprellungs_puffer!=0xff ; ) {
entprellungs_puffer<<=1;
port_puffer = *port;
_delay_us(150);
if( (*port & maske) == (port_puffer & maske) )
entprellungs_puffer |= 0x01;
}
}
int main (void)
{
DDRB=0x03; //Ein /Ausgänge ;
PORTB = 0x18; //Pullup aktivieren (PB3+PB4)
Taster1 = 0;
Taster2 = 0;
while(1)
{
entprellung( &PINB, (1<<PINB3) ); // ggf. Prellen abwarten
if(!(PINB & (1 << PB3)))
{
Taster1++;
PORTB^=0x02; //PB1 invertieren
}
entprellung( &PINB, (1<<PINB4) ); // ggf. Prellen abwarten
if(!(PINB & (1 << PB4)))
PORTB^=0x01; //PB0 invertieren
//PORTB&=~(1<<PB0); //PB0 ausschalten
}
}
Vielen Dank für eure Mühe im Voraus!
Gruß
Dennis
Lesezeichen