Beim Programmieren lege ich mir immer Makros/Funktionen an, die die Ansteuerung von LEDs und sonstigen Ausgängen passend umsetzen. Ich muss mir dann nur noch merken, dass zb die rote LED mit ROTE_LED_AN; eingeschaltet und mit ROTE_LED_AUS; ausgeschaltet wird. Damit muss man sich nicht mehr merken, an welchem Pin und mit welcher Schaltungsvariante die LEDs angeschlossen sind. Und wenn man mal die LED woanders anschließen will, muss man nur an einer einzigen Stelle, nämlich im Makro, die Werte ändern. Würde man jedesmal den direkten Zugriff hinschreiben, könnte man bei einer Pin-Änderung sehr leicht eine Stelle vergessen, und schon passieren die merkwürdigsten Fehler...

Konkret sieht das in C dann so aus:
Code:
//Makros für eine LED. Anschlussvariante: LED vom AVR-Pin gegen Masse
#define LED_red PB2 //Pin, an dem die LED hängt
#define LED_red_PORT PORTB //PORT-Register
#define LED_red_DDR	DDRB //DDR-Register
#define LED_red_PIN	PINB //PIN-Register

#define LED_red_toggle PORTB ^=(1<<LED_red);//ändert den Zustand (zb nützlich zum Blinken)
#define LED_red_on LED_red_PORT|=(1<<LED_red);//einschalten (Pin auf high)
#define LED_red_off LED_red_PORT&=~(1<<LED_red); //ausschalten (Pin auf low)
#define LED_red_as_output LED_red_DDR|=(1<<LED_red); //Den Pin als Ausgang einstellen
Die Befehle für die LED sind dann LED_red_on, LED_red_off, LED_red_toggle und LED_red_as_output.


Bei heutigen AVRs ist die Schaltungsvariante egal. Ich wählen sie meist so,, dass das Platinenlayout möglichst einfach wird.