avr-gcc: schreiben von 16-Bit Werten in 16-Bit Portregister

Gast #179345
Lesenswert?

Hallo,

Ich frage mich gerade, ob ich mich auf ein Verhalten des gcc verlassen
darf. Wenn ich schreibe TCNT1=0x400, dann setzt der gcc das in
folgenden Assembler um

 25a:   3d bd           out     0x2d, r19       ; 45
 25c:   2c bd           out     0x2c, r18       ; 44

Ist es schlau, sich darauf zu verlassen, daß erst das High Register
beschrieben wird? Oder sollte man das aufteilen in

TCNT1H = 0x4;
TCNT1L = 0x0;

ciao, Stefan
Gast #179347
Lesenswert?

Aber die Lösung mit
TCNT1H = 0x4;
TCNT1L = 0x0;
verhält sich bei einem Interrupt auch nicht besser, als schreib ruhig

TCNT1=0x400

Das der Compiler das richtig macht ist in der Doku dokumentiert.

Du kannst natürlich vorher global die Interrupts abschalten und danach
wieder einschalten.
Gast #179348
Lesenswert?

Das mit dem Interrupt war mir schon klar. Man darf sowieso von keinem
C-Statement ausgehen, daß es in einem Zyklus abgearbeitet wird. Solche
Sachen muß man dann mit Zugriffsmechanismen schützen. Stichwort:
Semaphore oder die ganz harte Methode, Interrupts abschalten.

Wenn das so dokumentiert ist, dann darf man sich darauf auch verlassen.


ciao, Stefan.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren