Hallo,

Zitat von
onion
Was meinst du mit Toggeln des Port-Ausgangs? Umschalten zwischen Ein- und Ausgang?
nein, Umschalten von H nach L bzw. von L nach H.
Gibt es noch was anderes Als Ein- und Ausgang. Direkt nach einem Reset ist ein Port dann auf Ein- oder auf Ausgang gechaltet?
Ich versuche es kurz zu erklären, aber diese Erklärung ersetzt nicht das Datenblatt (verlinkt!), das zu Deiner Pflichtlektüre werden muss.
Laut Datenblatt ist "0" der Initialwert für DDRx und PORTx, also ist jeder Hardware-Pin zunächst einmal ein Eingang ohne Pullup-R. Du würdest von PORTD und DDRD direkt nach einem Power-On-Reset z.B. "0" lesen. Von "PIND" liest Du hingegen das, was Du hardwaremäßig an den zugehörigen Hardware-Pins liegen hast. Oft will man Pins mit z.B. Tastern auf "0" ziehen. Um einen externen Pullup-R zu sparen, aktiviert man den internen durch Schreiben von PORTx/Py (z.B. so:
Code:
clr r16 ;
out DDRD, r16 ; redundant nach einem Reset! D als Eingang
sbi PORTD,0 ; aktiviere Pullup-R für PD0
nop ; ist hier nötig, da die Änderung erst 1 Takt später erfolgt!
in r17, PIND ; r17 Bit0 ist jetzt gesetzt, wenn PD0 offen (int. Pullup)!
Achtung: nicht bei allen ATmegas kannst Du alle SFRs mit "in/out/sbi/cbi etc." ansprechen, z.T. muss man das mit LDS/STS machen, wenn das jeweilige SFR "memory mapped" ist! Wann gilt das? Siehe Datenblatt des μCs!
Auf Eingang schreiben -> Pullup an/aus
Nein, s.o., auf PORTX/PY eine "1"schreiben => Pullup-R für das Bit PY von PORTX.
Am Ausgang lesen -> man bekommt den Wert den der Ausgang gerade hat
Nein, wenn Du PORTX liest, bekommst Du den Wert, der in PORTX steht, also den Initialwert oder den Wert, den Du reingeschrieben hast. Wenn Du PINX liest, bekommst Du das, was durch PORTX und die Hardware vorgegeben ist. Wäre allerdings blöd, DDRD und PORTD auf 0xff zu setzen und alle Pins auf Masse zu legen (Kurzschluss!).
Deinen Code sehe ich mir erst an, wenn Du das Datenblatt gelesen und verdaut hast. [-(
Viele Grüße
Fred
Lesezeichen