@ DMDDE (Gast)
>ja, natürlich sind diese definiert... ich bekomme ja auch Zugriff auf
>diese Bits, aber immer nur indem ich das Register mit "bits" teilweise
>öffne.
>REGISTERbits.XYZ = ...
Logisch. Weil man sich bei den Leuten vom XC8 Compiler für dieses
Konzept entscheiden hat. Bei avr gcc hat man sich, warum auch immer, für
ein anderes Konzept entschieden.
>Damit kann ich aber immer nur auf eine Stelle schreiben.
>REGISTER = (1<<REGISTERbits.XYZ); //funktioniert auch nicht
Logisch.
>oder bastelt der compiler aufeinanderfolgende Schreibbefehle zu einem
>zusammen?
Nein.
>REGISTERbits.XYZ = 1; |
>REGISTERbits.ABC = 3; |___ wird zu einem Schreibbefehl
>verwurstet?
Nein, das darf/kann er nicht, weil die Register volatile sind. Das MUSS
er 1:1 umsetzen, ohne Umformung und Zusammenfassung.
Eigentlich ist der Ansatz mit den einzelnen Registerbists besser, denn
damit kann man nicht aus Versehen Bits in einem Register schreiben, die
gar nicht existieren.
Der avr gcc Ansatz ist deutlich fehleranfälliger, denn der Compiler kann
nicht prüfen, ob die Bits in dem Register wirklich exisitieren.
PORTA = (1<<PC5); ist eigentlich Unsinn, denn das Bit PC5 gibt es dort
nicht. Durch "Zufall" ist PC5 == PA5
Wirklich problematisch sit es eher bei Steuerregistern, z.B. beim Timer
TCCR0A = (1<<WGM03); ist totaler Unsinn, denn das Bit liegt in TCCR0B.
Darüber sind schon viele Leute gestolpert. Und der Compiler kann
keinerlei Fehlermeldung erzeugen.
Schau mal ob in deinen Registerdefinitionen auch die Registetr als
Gesamtkonstrukt vorhanden sind, etw so.
REGISTERbits.all
Dann könnte man wieder die gute, alte Atmel-Schiene fahren ;-) Aber dann
musst du dir auch die gesamten Headerfiles mit allen Definitionen
irgendwie erzeugen. Viel Spaß.
Als Alternative, falls es dir um Speicherlatz und Geschwindigkeit geht,
kann man mit einer nicht volatilen Kopie arbeiten. Wie das geht, findet
man im Dokument im Anhang, Seite 15
Example 15. Optimization Using a Shadow Register
Das ist zwar für einen anderen Prozessor, erklärt die Sache aber sehr
gut!