Hallo,
ich hab vor ein paar Tagen angefangen in das
Mikrocontrollerprogrammieren einzusteigen. Als Mikrocontroller habe ich
den ATMEL Atmega32 16pu und benutze "Programmers Notepad". Wie man Leds
an-/ausschaltet verstehe ich - auch wie man Pins als Eingänge
deklariert. Habe mich jetzt an die If-Schleifen gesetzt und habe
folgenes Programm programmieren wollen: Wenn ich nichts mache blinken 3
Leds immer wieder nacheinander. Wenn ich jedoch den Button an PB1 drücke
sollen die Leds gleichzeitig blinken!
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 |
|
4 |
|
5 | int main(void)
|
6 | {
|
7 | DDRB &= ~(1<<PB1);
|
8 | DDRB |= (1<<PB3);
|
9 | DDRB |= (1<<PB4);
|
10 | DDRB |= (1<<PB5);
|
11 | PORTB |= (1<<PB1);
|
12 |
|
13 | while(1)
|
14 | {
|
15 |
|
16 | if(bit_is_clear(PINB, 1))
|
17 | {
|
18 |
|
19 | PORTB |= (1<<PB3);
|
20 | PORTB |= (1<<PB4);
|
21 | PORTB |= (1<<PB5);
|
22 | _delay_ms(100);
|
23 | PORTB &= ~(1<<PB3);
|
24 | PORTB &= ~(1<<PB4);
|
25 | PORTB &= ~(1<<PB5);
|
26 | _delay_ms(100);
|
27 |
|
28 | }
|
29 |
|
30 | else
|
31 | {
|
32 | PORTB &= ~(1<<PB5);
|
33 | PORTB |= (1<<PB3);
|
34 | _delay_ms(15);
|
35 | PORTB &= ~(1<<PB3);
|
36 | PORTB |= (1<<PB4);
|
37 | _delay_ms(15);
|
38 | PORTB &= ~(1<<PB4);
|
39 | PORTB |= (1<<PB5);
|
40 | _delay_ms(15);
|
41 | }
|
So funktioniert es zwar, ich verstehe aber nicht warum ich in die
Klammer (was ich durch ausprobieren herausgefunden habe) bit_is_clear
setzen muss, wenn doch vom Mikrocontroller ein Bit gesetzt werden
müsste, falls ich den Button drücke. Oder wird die If-Schleife
ausgeführt wenn der Wert = 0 ist ?
Würde mich über Antworten freuen, die mir helfen.
Schorsch
PS: Habe mir auch ein paar Bücher über das Thema bestellt. Diese kommen
aber erst in ein paar Tagen und ich möchte gerne weiter kommen :)