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!
#include <avr/io.h>
#include <util/delay.h>
1 | int main(void)
|
2 | {
|
3 | DDRB &= ~(1<<PB1);
|
4 | DDRB |= (1<<PB3);
|
5 | DDRB |= (1<<PB4);
|
6 | DDRB |= (1<<PB5);
|
7 | PORTB |= (1<<PB1);
|
8 |
|
9 | while(1)
|
10 | {
|
11 |
|
12 | if(bit_is_clear(PINB, 1))
|
13 | {
|
14 |
|
15 | PORTB |= (1<<PB3);
|
16 | PORTB |= (1<<PB4);
|
17 | PORTB |= (1<<PB5);
|
18 | _delay_ms(100);
|
19 | PORTB &= ~(1<<PB3);
|
20 | PORTB &= ~(1<<PB4);
|
21 | PORTB &= ~(1<<PB5);
|
22 | _delay_ms(100);
|
23 |
|
24 | }
|
25 |
|
26 | else
|
27 | {
|
28 | PORTB &= ~(1<<PB5);
|
29 | PORTB |= (1<<PB3);
|
30 | _delay_ms(15);
|
31 | PORTB &= ~(1<<PB3);
|
32 | PORTB |= (1<<PB4);
|
33 | _delay_ms(15);
|
34 | PORTB &= ~(1<<PB4);
|
35 | PORTB |= (1<<PB5);
|
36 | _delay_ms(15);
|
37 | }
|
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 :)