Lies Dich z.B. mal hier rein: http://www.mikrocontroller.net/articles/AVR-Tutorial
Damit hab ich damals auch mit den AVRs angefangen, glaube ich zumindest.
Als Hardware hatte ich einen Atmega32 mit nem 16 MHz Quarz, als Programmieradapter einen AVRISP (gibts z.B. bei Reichelt).
Dann fix eine Grundschaltung aufgebaut, und los gings.

Ich weiss grade nicht was Du mit "unnützen Rechnungen" meinst, vermute allerdings Du willst wissen wie jetzt genau der Zusammenhang zwischen Programm und der aktuellen Hardware aussieht.

Die Atmegas haben Tristate-Pins. Das heisst soweit, die Pins können 3 Zustände annehmen. Also nicht einfach Strom an, Strom aus, wie man meinen könnte, sondern Pin ist auf VCC-Pegel ("Strom fliesst raus"), Pin ist auf GND-Pegel ("Strom fliesst rein"), Pin ist hochohmig ("aus");

Um bei meinem Beispiel zu bleiben, erstmal wird das Datenrichtungsregister DDRA konfiguriert. Das regelt ob der Pin ein Ausgang ("Strom fliesst raus/rein") oder Eingang ("Strom ist aus") sein soll.
In diesem Fall ein Ausgang, denn man will was zum leuchten bringen.
Also wird das Bit für PA0 im Register DDRA auf 1 gesetzt: DDRA|=(1<<PA0);

Dann, in der Schleife, wird der Pin immer zwischen Hi ("Strom fliesst raus") und Lo ("Strom fliesst rein") getoggelt.
PORTA|=(1<<PA0); <-- Pin geht auf Hi-Pegel
PORTA&=~(1<<PA0); <-- Pin geht auf Lo-Pegel

Es sieht jetzt zwar etwas anders aus als in meinem Codeschnipsel, ist aber das Gleiche. Hier hab ich jetzt keine Defines verwendet.
Die sind, zumindest im einfachsten Fall, bloss was fürs Auge und werden vom Präprozessor vor dem Compilieren automatisch bearbeitet.

Also wenn man schreibt:
#define led_ddr DDRA
dann ersetzt der Präprozessor jedes Vorkommen von led_ddr im Quellcode durch DDRA. Ist also ein "Suchen und Ersetzen", hat halt optische Gründe für den Programmierer, der, falls er die LED mal auf einen anderen Port setzen will nicht jedes Vorkommen von DDRA von Hand anpassen muss, sondern nur die eine Stelle im define.

Die Register wie DDRA, PORTA, PINA, PA0, PA1... usw sind übrigens in der io.h deklariert und auch im Datenblatt des Controllers beschrieben was sie machen.

Wichtig ist sich in Bit-Byte-Zusammenhänge einzulesen. Denn damit hängen die gesamten Ein- und Ausgabefunktionen vom Controller zusammen.

Das soll jetzt mal ein 8-Bittiger Port (z.B. Port A) am Atmega sein, bildlich auf die Pins am Chip geschaut.
00000000

Wenn man jetzt im Programm schreiben würde
PORTA=62;
dann würde es so aussen in der wirklichen Welt ankommen:
00111110

Die Pins die hier mit "1" markiert sind, würden also auf VCC-Pegel liegen, die anderen auf GND. Warum ausgerechnet 00111110 und nicht anders? 62 ist, als Binärzahl umgewandelt, 111110...