hallo leute, als noch recht unerfahrener STK500 anfänger bin ich gerade
dabei mir die basics wie tasterentprellung, delays, led- lauflicht....
beizubringen.
dazu will ich nun ein programm schreiben, welches bei drücken von
taster0 ein led- lauflicht von Led0- Led2 durchführt. das lauflicht soll
so lange laufen, bis ich taster1 drücke. dann soll es abgebrochen werden
und alle Leds erlöschen.
hier mein programm (die tasterentprellung hab ich aus dem AVR tutorial):
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 |
|
4 |
|
5 | uint8_t Taster0;
|
6 | uint8_t Taster1;
|
7 |
|
8 | void long_delay(uint16_t ms)
|
9 | {
|
10 | for(;ms>0; ms--)
|
11 | {
|
12 | _delay_ms(1);
|
13 | }
|
14 | }
|
15 |
|
16 |
|
17 |
|
18 | inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
|
19 | {
|
20 | if ( ! (*port & (1 << pin)) )
|
21 | {
|
22 | /* Pin wurde auf Masse gezogen, 100ms warten */
|
23 | _delay_ms(50); // max. 262.1 ms / F_CPU in MHz
|
24 | _delay_ms(50);
|
25 | if ( *port & (1 << pin) )
|
26 | {
|
27 | /* Anwender Zeit zum Loslassen des Tasters geben */
|
28 | _delay_ms(50);
|
29 | _delay_ms(50);
|
30 | return 1;
|
31 | }
|
32 | }
|
33 | return 0;
|
34 | }
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 | int main(void)
|
42 | {
|
43 | DDRB = 0b00001111; //PB0 bis PB4 als Ausgang
|
44 | DDRD = 0b11110000; // PD0 bis PD3 als Eingang
|
45 |
|
46 | PORTB = 0xFF; // Alle Ausgänge auf high => alle LEDs aus
|
47 |
|
48 | while (1)
|
49 | {
|
50 |
|
51 | if (debounce(&PIND, PD0)) // Falls Taster0 gedrückt
|
52 | {
|
53 | Taster0 = 1;
|
54 | Taster1 = 0;
|
55 | }
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 | if(Taster0 ==1 && Taster1 ==0) //Lauflicht
|
63 | {
|
64 | PORTB = 0b11111110; // LED0 an
|
65 | long_delay(300);
|
66 | PORTB= 0b11111101; // LED1 an
|
67 | long_delay(300);
|
68 | PORTB= 0b11111011; // LED2 an
|
69 | long_delay(300);
|
70 | }
|
71 |
|
72 |
|
73 | if (debounce(&PIND, PD1)) // Falls Taster1 gedrückt
|
74 | {
|
75 | Taster0 = 0;
|
76 | Taster1 = 1;
|
77 |
|
78 | }
|
79 |
|
80 | if(Taster1 == 1 && Taster0== 0)
|
81 | {
|
82 | PORTB = 0xFF; //Alle Ausgänge auf high => Lauflicht aus
|
83 |
|
84 | }
|
85 |
|
86 |
|
87 | }
|
88 | return 0;
|
89 | }
|
das lauflicht funtioniert aber ich habe noch probleme mit dem abbrechen
beim drücken von taster2. denn wenn ich taster2 drücke läuft das
lauflicht einfacht weiter.
kann mir jemand sagen wo mein programmierfehler liegt.
mfg