Hallo Leute,

ich schäme mich, dieses Problem zu schildern... aber es geht nicht anders.
Ich programmiere schon seit längerem mit AVRGCC (WINAVR),
habe auch schon mehrere Projekte gemacht mit CAN, GrafikDisplays usw...

Ich kann von mir sagen, dass ich es einigermaßen drauf hab.


Nun wollte ich heute mal meinen Bruder ein bisschen anlernen.
Angebangen haben wir mit Ausgänge setzen.
Haben ne simple funktion geschrieben, die ne LED setzt oder löscht.
Dann wollten wir als nächsten schritt nen Schalter anschließen.

Wir benutzen einen ATMega32, DIL40 am Steckbrett. Wir benutzen nur
Drahtbrücken, da die kabel ja nicht 100Pro leiten...

An PB0 schließen wir also unseren Schalter gegen Masse.
Wir initialisieren:
Code:
DDRB &= ~(1<<PB0);    // PB0 als Eingang
PORTB |=  (1<<PB0);   // Pullup an PB0 aktivieren
Dann zum Problem:
Ich schreibe folgendes in die Hauptschleife:


Code:
if( PINB & (1<<PB0) ){
    LED1(1);
}else{
    LED1(0);
}

Ist die Bedingung erfüllt, ist alles OK.
Wird die Bedingung nicht erfüllt, also Schalter gedrückt,
dann hängt sich der Controller auf. Bleibt einfach stehen!

Wenn ich es aber so schreibe, funktioniert es:
Code:
if( PINB & (1<<PB0) ){
    LED1(1);
}
if( !(PINB & (1<<PB0)) ){
    LED1(0);
}

Ich verstehe es nicht. Das ist ein typischer Vorführeffekt...
Ich steig einfach nicht dahinter, warum er das else nicht mag.

Ich habe schon bei vielen programmen die obige Schreibweise benutzt...
Es gab nie ein Problem...

Und jetzt das... ich verstehe es einfach nicht....

Ich hoffe jemand von euch kann mir bei diesem lachhaften Problem helfen.

Besten Dank!