Hallo,
ich bin nicht der Spuer-C-Spezi, aber welche Lösung wäre Dir angenehm?
a) befasse Dich mit den Grundlagen von C, mit dem Präprozessor und was
noch dazugehört.
b) #define SPI_CLK PB5
bearbeitet der Präprozessor, das ist also eine reine Textersetzung.
Überall, wo SPI_CLK im Code auftaucht, wird es durch PB5 ersetzt.
Also z.B. hier:
aus SPI_CLK = LOW; //CS=low übertragung anfang
wird PB5 = 0
Das LOW wird ja auch ersetzt.
Dummerweise ist PB5 aber auch schon ein #define in den
AVR-Standard-Includes,
es wird duchr die Bitnummer ersetzt, hier also 5.
Somit bekommr der Compiler also 5 = 0 vor die Füße geworfen und darüber
beklagt er sich, er will zu Recht links eine Variable haben.
Was Du willst ist, daß in PortB das Bit 5 auf Low gesetzt wird.
Also PORTB = PORTB & ~(1<<SPI_CLOCK).
Meist verküzt geschreiben, also PORTB &= ~(1<<SPI_CLOCK).
Was passiert hier? Es wird der Inhalt von PortB eingelesen.
Es wird eine Byte-Maske erzeugt, die eine 1 um 5 Positionen nach links
verschoben enthält, also 0b00100000.
Diese Maske wird invertiert, also zu 0b11011111.
Dann wird die Maske mit dem eingelesenen Byte von PortB AND verknüpft,
also alles außer Bit 5 bleibt wie es ist, nur Bit 5 wird zu 0.
Das Ergebnis wird dann an PortB ausgegeben.
Warum diese Umstände? Es soll ja nur Bit5 in PortB geändert werden,
alles andere muß erhalten bleiben.
Der Compiler wird beim Optimieren sehr wahrscheinlich ein cbi portb,5
draus machen.
Das muß aber der Compiler entscheiden, nicht jeder µC kennt diesen
Befehl und der C-Compiler kann ja je nach Angabe für etliche
verschiedene Controller benutzt werden.
Gruß aus Berlin
Michael