Gesetzt dem Falle ich weiß z.B. nicht welche Wertigkeit das Bit CS12 hat, dann kann ich einfach schreiben:
ldi r16,(1<<CS12) und CS12 wird auf 1 gesetzt unabhängig davon welchen Wert es in dem augenblick hat?!
Würde aus meiner Sicht jetzt einen Sinn ergeben.
Genau das !
Mal angenommen bei Mega 128 wäre CS12 Bit Nummer 3 und bei Mega 64
wäre CS12 Bit Nummer 4 (das ist so nicht, aber wir nehmen es mal so an)

könntest Du ein Programm, wo
ldi r16,(1<<CS12) steht auf beiden µC verwenden, ohne was zu ändern.

die Definition für CS12 steht in der entsprechenden *def.inc drin

Ich nehme an hierbei handelt es sich um eine Assemblerdirektive, weil hiermit ldi r16,(1<<PD0)|(1<<PD7) könnte ich ja alle Bits eines Bytes so setzen wie es dort steht. Wie kommt man zu dem Trennstrich?
Das ist kein Trennstrich, sondern eine logische oder Verknüpfung
in diesem Fall wird in r16 PD0 oderverknüpft mit PD7.
Kennst Du die ODER Funktion ?

sieht hier so aus:

Code:
10000000 <- (1<<PD7)
00000001 <- (1<<PD0)
------------ ODER Ergibt
10000001 <- (1<<PD7)|(1<<PD0)
Du kannst natürlich mehr als nur 2 Bits Oderverknüpfen und nicht nur PD*
auch ales andere (auch CS12 mit anderen Bits von diesem Register)

Diese Verknüpfung macht der Assembler aber beim Assemblieren, im fertigem Programm (was in den µC geladen wird) steht dann
ldi r16,0x81

Gute Nacht

Sebastian