If-Schleife macht das Gegenteil von dem was für mich logisch erscheint

Gast #3322024
Lesenswert?

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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren