Kann mir jmd diesen C-Code Erklären?

2 Antworten

Ich nehme mal an es geht um einen Atmega.

In dem Fall ist DDRB das Direction Register für Port B

DDRD ist das Direction Register für Port D.

Die Veroderung mit 0xFF macht das Register zu 0xFF damit ist jeder GPIO an Port B als Ausgang konfiguriert.

Die Verundung mit ~0xFF setzt alle Bits zu 0 damit wird jeder GPIO an Port D als Eingang konfiguriert.

Was du danach mit Analog usw redest macht keinen Sinn.

Die beiden Zeilen mit PortD machen nichts da der Port ein Eingang ist.

Das nachfolgende mit PortB setzt die Pins 2,3,5,6 auf High.

Das Nachfolgende PortB verundet mit der invetierten Zahl setzt also Pin6 auf 0.

Erg1 ist nur der Wert am GPIO Pin 0 auf Port D

Erg2 ist 1 wenn Gpio0 auf PortD zuerst 1 ist und bei der nachfolgende Abrage immer noch. 0 sonst.

Mit Analogen Eingängen hat das nichts zu tun.

Diese PORTxx, PINxx etc Register sind vordefnierte Register des Controllers, die auf das Steuerregister des entsprechenden IO Chips gemappt sind. Die verhalten sich nicht wie "normale" Variablen, weil die nicht nur vom Programm, sondern auch von der Hardware selbst geändert werden können.

DDxx ... DD ist meist Data Direction, also Datenrichtung
PORTxx... Wird meist bei Ausgabeports genutzt, um den Wert zuzuweisen. Bei Eingaberegistern aktiviert es je nach Controller evtl. den internen Pull-Up Widerstand
PINxx... zum Lesen der aktuellen Eingabewerte am Port

PORTD |= (1<<PORTD0) In PORTD0 steht drin, das wievielte Bit (Zählung beginnt bei 0) jetzt D0 in dem Register ist. Die 1 wird jetzt so viele Bits nach links geschoben, dass diese auf der passenden Position steht. Wenn da also eine 3 drinsteht, kommt als Ergebnis binär 1000 raus. Dieses eine gesetzte Bit wird mit dem aktuellen Inhalt des Registers von PortD ODER verknüpft, d.h. dieses eine Bit wird gesetzt, der Rest bleibt wie er vorher in dem Register stand.

&= ~ (...) ist das Gleiche zum Rücksetzen (also auf 0 setzen) eines Bits.

Zu den Zeilen:

5) Port B wird mit dem Wert ODER-Verknüpft, d.h. da wo in dem Wert eine 1 steht, wird im Register auch das Bit auf eins gesetzt. Da wo eine 0 steht, bleibt der Wert erhalten, der vorher im Register an der Stelle stand.

7) PIND (Also Eingabeport D) wird ausgeleesen und danach das 0. Bit mit dem UND maskiert, d.h. es wird nor das 0. Bit geprüft. Das Ergebnis ist hier nicht 1 oder 0, sondern der Binärwert von PIND (kann größer 1 sein) oder 0.

8) Im Prinzip ja. Aber wenn Erg1 vorher 0 ist, wird hier NICHTS geprüft, das Erg2 ist immer 0 (auch wenn der PIN mittlerweile 1 ist). Ist Erg1 gesetzt, wird es eben nochmal ausgelesen und wieder das 0. Bit geprüft.