Fred schrieb:
> vielen Dank für die schnellen Antworten,
>
>
> PB7 verbindet mit Masse bei Betätigung, der Pullup-Widerstand von PB7
> ist aktiviert, was mich gleich zur nächsten Frage bringt. Wieso schaltet
> die Anweisung PORTB = minuten die internen Pullup-Widerstände aus?
Weil jede direkte Zuweisung an PORTB alle Bits des Ports beeinflusst.
Und sehr wahrscheinlich sind in deiner Variablen minute die
entsprechenden Bits, die für PB6 bzw. PB7 zuständig sind, eben nicht auf
0.
> Eigentlich sollte er die Zeit binär auf den Port ausgeben.
Schon. Aber am gleichen Port hängen ja auch die Taster.
D.h. wenn du am PORTB ausgibst, musst du darauf achten, dass du die den
1-Zustand von PB6 bzw. PB7 nicht zerstörst. Sonst .... schaltest du die
Pullups wieder aus.
Dein µC weiß ja nicht, dass du mit zum Beispiel
PORTB = 0;
eigentlich die Zustände von PB6 und PB7 gar nicht verändern wolltest.
Nur: Der µC macht das was du programmiert hast und nicht das was du
eigentlich wolltest. Und da steht nun mal an Port B allen Bits eine 0
zuweisen. Und das beinhaltet selbstverständlich auch PB6 und PB7, die
damit auf 0 gesetzt werden und daher die entsprechenden Pullups wieder
ausschalten.
Ob da jetzt
PORTB = 0;
oder
PORTB = 2;
oder
PORTB = minuten;
steht, ist ja Jacke wie Hose. Für die Pullups entscheidend ist nur, ob
Bit 6 bzw. Bit 7 in dem was zugewiesen wird auf 0 oder auf 1 ist.
Und bei dir sind die beiden Bits auf 0.
Wenn du also den Zustand dieser beiden Bits nicht verändern willst, dann
hast du 2 Möglichkeiten
a) die faule. Du weißt, dass die beiden eigentlich auf 1 sein müssen,
daher sorgst du dafür, dass bei der Zuweisung die beiden Bits auf jeden
Fall wieder eine 1 bekommen
1 | PORTB = minuten | (1<<PB6) | (1<<PB7);
|
b) du übernimmst den Zustand der Bits vom Port selber und sorgst dafür,
dass er nicht verloren geht
1 | PORTB = ( minuten & 0x3F) | ( PORTB & ((1<<PB6) | (1<<PB7)));
|