PIC XC8 Mehrere Registerbits auf einmal setzen

Gast #3124903
Lesenswert?

Als AVR Umsteiger bin ich es gewohnt die Bits in den Registern 
folgendermaßen zu setzen:
1
PORTA=1<<PA1|1<<PA2;

Der Compiler optimiert es dann zur PORTA=6 und alle Bits werden 
gleichzeitig gesetzt.

Wenn ich mir die Tutorials zu PICs angucke treffe ich aber auf folgende 
Variante:
1
LATAbits.LATA1=1;
2
LATAbits.LATA2=1;

Dies wird zu einem Haufen Bit sets kompiliert, was Ausführungszeit und 
Platz kostet.

Im Moment behelfe ich mir so:
1
#define my_LATA0_BIT 0
2
#define my_LATA1_BIT 1
3
#define my_LATA2_BIT 2
4

5
LATA=1<<myLATA1bit|1<<myLATA2_BIT;

Was zwar zum gewünschtem Ergebnis führt, auf Dauer aber Zeitaufwändig 
und nervig ist.

Gibt es da vielleicht einen besseren Weg?
Gast #3125177
Lesenswert?

Ich glaube mein Problem gelöst zu haben.

Ich habe folgende Makros erstellt:
1
#define BV(abit) BV2(abit)
2
#define BV2(addr,pos)   1<<pos

Damit wird aus der Definition aus dem Deviceheader
1
LATA2_bit           BANKMASK(LATA), 2
1
1<<2
Die Werte lassen sich dann mit gewünschten logischen Operationen 
verknüpfen und auf einmal in den Register schreiben.
#3126139
Lesenswert?

Alex M. schrieb:
> Ich mag es wenn es aus dem Code ersichtlich ist was die Bedeutung der
> Bits ist, die gesetzt werden.

Dann besser gleich Plattformunabhängig:
1
#define high 1
2
#define low 0
3
#define setLED0(x) (PORTAbits.RA0=(x))
4
#define setLED1(x) (PORTAbits.RA1=(x))

So musst du den Code nur an einer Stelle anpassen, wenn sich die 
Pinbelegung ändert und es ist ersichtlich, was du tust.

Hast du folgenden Codeschnipsel:
1
setLED0(high);
2
setLED1(low);
so wird der Compiler keine Optimierungen vornehmen und die Ausdrücke 
nicht zusammenfassen, da alle internen Register als volatile deklariert 
sind. Ansonsten müsstest du auf Schattenregister ausweichen.

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