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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.