Forum: Mikrocontroller und Digitale Elektronik PIC XC8 Mehrere Registerbits auf einmal setzen


von Alex M. (Gast)


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?

von Alex M. (Gast)


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.

von Jürgen D. (poster)


Lesenswert?

Alex M. schrieb:
> PORTA=1<<PA1|1<<PA2;

Was spricht eigendlich dagegen gleich

PORTA=0x06;

zu schreiben?

von Alex M. (Gast)


Lesenswert?

Jürgen D. schrieb:
> Alex M. schrieb:
>> PORTA=1<<PA1|1<<PA2;
>
> Was spricht eigendlich dagegen gleich
>
> PORTA=0x06;
>
> zu schreiben?

Ich mag es wenn es aus dem Code ersichtlich ist was die Bedeutung der 
Bits ist, die gesetzt werden.

von B. S. (bestucki)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.