Hallo, ich suche nach einer Lösung für folgende Aufgabe: 1.) Eine Status LED soll im Sekundentakt blinken. Dieser Sekundentakt soll mit einem Timerinterrupt realisiert werden. 2.) Weiteres soll im Sekundentakt ein Taster abgefragt werden. Ist der Taster gedrückt, soll sich eine 2. LED für 10 Sekunden einschalten. 3.) Wird der Taster innerhalb dieser 10 Sekunden erneut gedrückt, verlängert sich die Einschaltzeit um weitere 10 Sekunden. Und bei Punkt 3 stehe ich derzeit auf der "Leitung"! Kann mir da bitte jemand helfen, wie ich das am einfachsten lösen kann? Hier mein derzeitiger Code:
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | #define led1 (1<<PB4)
|
5 | #define led2 (1<<PB5)
|
6 | |
7 | unsigned int timer_overflow_counter = 0; |
8 | unsigned int glowtime = 10; |
9 | unsigned int glowtime_led_2; |
10 | unsigned char taster_flag = 0; |
11 | |
12 | void init_timer_0 (void) |
13 | {
|
14 | TCCR0B = (1<<CS01) + (1<<CS00); // Prescaler = 64 -> 8Mhz/64 = 125000 clockspeed |
15 | TIMSK0 = (1<<TOIE0); // Timer0 overflow interrupt enable |
16 | TCNT0 = 6; // Timer mit 6 vorladen (256-6 = 250 mal hochzählen bis zum overflow) |
17 | }
|
18 | |
19 | int main(void) |
20 | {
|
21 | DDRB = 0xFF; // PORTB Richtungsregister = Ausgang |
22 | DDRC = 0xF0; // PC0...PC3 auf Eingang |
23 | PORTC = 0xF1; // PC0 = Pull up |
24 | |
25 | init_timer_0(); // Timer 0 initialisieren |
26 | sei(); // Interrupts einschalten |
27 | while(1) |
28 | {
|
29 | asm ("NOP"); // Nichts tun |
30 | }
|
31 | }
|
32 | |
33 | ISR(TIMER0_OVF_vect) |
34 | {
|
35 | if (timer_overflow_counter <= 499) // Zählvariable 500 mal hochzählen |
36 | timer_overflow_counter ++; |
37 | else // Den else-Zweig beim 500 Durchlauf einmal ausführen |
38 | {
|
39 | TCNT0 = 6; // reload timer0 |
40 | PORTB ^= led1; // LED toggeln |
41 | timer_overflow_counter = 0; // Zähler zurücksetzen |
42 | |
43 | if ((PINC &(1<<PINC0)) && (taster_flag == 0)) // Wenn Taster gedrückt wurde... |
44 | {
|
45 | taster_flag = 1; // Flag für Taster wurde gedrückt setzen |
46 | glowtime_led_2 = glowtime; // glowtime_led_2 auf Anfangswert 10 setzen |
47 | }
|
48 | |
49 | if (taster_flag == 1) // Taster wurde gedrückt |
50 | {
|
51 | PORTB |= led2; // LED ON |
52 | glowtime_led_2 --; // glowtime_led_2 pro Sekunde um 1 runter zählen |
53 | |
54 | if (glowtime_led_2 == 0) |
55 | {
|
56 | PORTB &= ~led2; // LED OFF |
57 | glowtime_led_2 = glowtime; // glowtime_led_2 auf Anfangswert 10 setzen |
58 | taster_flag = 0; // Taster flag zurücksetzen |
59 | }
|
60 | }
|
61 | }
|
62 | }
|