Hallo,
ich benutze den Atmel Studio 6.2; ich habe ein Programm (in C) geschrieben, ich steuere mit dem ein HD44780.
[CCODE]DDRC &= ~(1<<PINC0);
DDRC &= ~(1<<PINC1);
DDRC &= ~(1<<PINC2);
DDRC &= ~(1<<PINC3);
DDRC &= ~(1<<PINC4);
PORTC &= ~(1<<PC0);
PORTC &= ~(1<<PC1);
PORTC &= ~(1<<PC2);
PORTC &= ~(1<<PC3);
PORTC &= ~(1<<PC4);
while(1)
{
if(PINC & (1<<PC0))tag++;
if(PINC & (1<<PC1))monat++;
if(PINC & (1<<PC2))jahr++;
if(PINC & (1<<PC3))min++;
if(PINC & (1<<PC4))stunde++;
if(sek>=60) { sek=0; min++;}
if(min>=60) { min=0;stunde++;}
if(stunde>=24) stunde=0;
if(tag>=32) { tag=1;monat++;}
if(monat>=13) monat=1;
sprintf(buffer,"%.2i:%.2i:%.2i %.2i:%.2i:%.2i",stunde, min, sek,tag,monat,jahr);
LCDstring(buffer, 0, 2);
if(num>=100)
{
sek++;
num=0;
}
num++;[/CCODE]
mein Problem liegt daran, daß, wenn ich die Zeit oder Datum ändern will (durch drücken der Tasten), diese Variablen ändern sich sehr schnell. Das ist mir klar, es hängt ab, wie lange ich die Taste drücke.
Deswegen habe ich ein delay() nach der IF Abfrage eingebaut:
[CCODE]if(PINC & (1<<PC0)){_delay_ms(100);tag++;};[/CCODE]
nach flashen sehe ich auf dem Display, daß die Sekunden und das Jahr sich um "eins" erhöht, warum?.
Wenn ich diese delay() nach jedem IF einbaue, dann bleibt alles stecken, also die Sekunden erhöhen sich nicht, als ob das Programm in eine endlose Schleife wäre.
Kann mir jemand bitte sagen, wo mein Fehler ist? Ich danke für jede Antwort.
Abel.
PS. Die Pins 0-4 an Port C habe ich jeden mit einem Widerstand 100Ohm auf Masse gezogen. Bei jedem dieser PIN ist ein Taster nach VCC eingebaut. Ich benutze den Atmega640.
ich benutze den Atmel Studio 6.2; ich habe ein Programm (in C) geschrieben, ich steuere mit dem ein HD44780.
[CCODE]DDRC &= ~(1<<PINC0);
DDRC &= ~(1<<PINC1);
DDRC &= ~(1<<PINC2);
DDRC &= ~(1<<PINC3);
DDRC &= ~(1<<PINC4);
PORTC &= ~(1<<PC0);
PORTC &= ~(1<<PC1);
PORTC &= ~(1<<PC2);
PORTC &= ~(1<<PC3);
PORTC &= ~(1<<PC4);
while(1)
{
if(PINC & (1<<PC0))tag++;
if(PINC & (1<<PC1))monat++;
if(PINC & (1<<PC2))jahr++;
if(PINC & (1<<PC3))min++;
if(PINC & (1<<PC4))stunde++;
if(sek>=60) { sek=0; min++;}
if(min>=60) { min=0;stunde++;}
if(stunde>=24) stunde=0;
if(tag>=32) { tag=1;monat++;}
if(monat>=13) monat=1;
sprintf(buffer,"%.2i:%.2i:%.2i %.2i:%.2i:%.2i",stunde, min, sek,tag,monat,jahr);
LCDstring(buffer, 0, 2);
if(num>=100)
{
sek++;
num=0;
}
num++;[/CCODE]
mein Problem liegt daran, daß, wenn ich die Zeit oder Datum ändern will (durch drücken der Tasten), diese Variablen ändern sich sehr schnell. Das ist mir klar, es hängt ab, wie lange ich die Taste drücke.
Deswegen habe ich ein delay() nach der IF Abfrage eingebaut:
[CCODE]if(PINC & (1<<PC0)){_delay_ms(100);tag++;};[/CCODE]
nach flashen sehe ich auf dem Display, daß die Sekunden und das Jahr sich um "eins" erhöht, warum?.
Wenn ich diese delay() nach jedem IF einbaue, dann bleibt alles stecken, also die Sekunden erhöhen sich nicht, als ob das Programm in eine endlose Schleife wäre.
Kann mir jemand bitte sagen, wo mein Fehler ist? Ich danke für jede Antwort.
Abel.
PS. Die Pins 0-4 an Port C habe ich jeden mit einem Widerstand 100Ohm auf Masse gezogen. Bei jedem dieser PIN ist ein Taster nach VCC eingebaut. Ich benutze den Atmega640.