Forum: Compiler & IDEs gcc vs. cvavr mit PORTA.1 = (bool)


von Random .. (thorstendb) Benutzerseite


Lesenswert?

Hi Leutz,


vor x Jahren hab ich mal den AVR mit CVAVR programmiert, bin dann aber 
recht zeitig (g) davon weg, weil WinAVR halt kostenfrei ist.

Beim cvavr gabs eine Schreibweise, die den bool Zugriff auf einzelne 
Portbits erlaubte:
1
PORTA.1 = 0;
Meine Frage ist nun: Was ist das? Ein Compiler-Intrinsic?

Mir würde jetzt ein struct mit einzelbits einfallen, welches PIN0, PIN1, 
... definiert, und dann mit dem Namen PORTx auf die Adresse mappt.

In dem Fall könnte ich dann per
1
PORTA.PIN0=0;
oder kürzer
1
PORTA.P0
drauf zugreifen, aber Zahlen als Namen können ja nicht verwemdt werden.


VG,
/r.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Beim cvavr gabs eine Schreibweise, die den bool Zugriff auf einzelne
> Portbits erlaubte:
>
> PORTA.1 = 0;
>
> Meine Frage ist nun: Was ist das? Ein Compiler-Intrinsic?

Das ist eine ganz und gar nichtportierbare Erweiterung des 
C-Sprachumfangs. Eine höchstens zu sich selbst kompatible Insellösung.

von Εrnst B. (ernst)


Lesenswert?

Der SDCC für Pics macht das z.B. so für Ports/register:
1
extern __sfr __at (0xF80) PORTA;
2
typedef union {
3
        struct {
4
                unsigned RA0            : 1;
5
                unsigned RA1            : 1;
6
                unsigned RA2            : 1;
7
                unsigned RA3            : 1;
8
                unsigned RA4            : 1;
9
                unsigned RA5            : 1;
10
                unsigned RA6            : 1;
11
                unsigned                : 1;
12
        };
13
        struct {
14
                unsigned RA             : 7;
15
                unsigned                : 1;
16
        };
17
        /* aliases */
18
        struct {
19
                unsigned C1INN          :1;
20
                unsigned C2INN          :1;
21
                unsigned C2INP          :1;
22
                unsigned C1INP          :1;
23
                unsigned C1OUT          :1;
24
                unsigned C2OUT          :1;
25
                unsigned OSC2           :1;
26
                unsigned                :1;
27
        };
28
        struct {
29
                unsigned AN0            :1;
30
                unsigned AN1            :1;
31
                unsigned AN2            :1;
32
                unsigned AN3            :1;
33
                unsigned T0CKI          :1;
34
                unsigned AN4            :1;
35
                unsigned                :1;
36
                unsigned                :1;
37
        };
38
} __PORTA_t;
39
extern volatile __PORTA_t __at (0xF80) PORTAbits;

da geht dann PORTA=0x55; oder auch PORTAbits.RA6=1; etc

Kannst dir ja für die AVR-Headerfiles was ähnliches basteln.

von STK500-Besitzer (Gast)


Lesenswert?

>"PORTAbits.RA6=1"

ist auch nur etwas kürzer als "PORTC |= (1<<PC6);"

"PORTC |= (1<<PC6);" ist dafür C-konform...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

STK500-Besitzer wrote:

> "PORTC |= (1<<PC6);" ist dafür C-konform...

"PORTAbits.RA6=1" ist es auch.

von Εrnst B. (ernst)


Lesenswert?

Noch ein blödes Beispiel:

Was ist der Unterschied zwischen
1
TCCR0A |= (1<<WGM00);
2
TCCR0A |= (1<<WGM02);

und
1
TCCR0Abits.WGM00=1;
2
TCCR0Abits.WGM02=1;

?

Der erste Code lässt sich Compilieren, funktioniert aber nachher auf dem 
Chip nicht, beim zweiten meckert schon der Compiler, dass "WGM02" eben 
nicht im TCCR0A ist...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ernst Bachmann wrote:

> Der erste Code lässt sich Compilieren, funktioniert aber nachher auf dem
> Chip nicht, beim zweiten meckert schon der Compiler, dass "WGM02" eben
> nicht im TCCR0A ist...

Dann kennst du doch auch den Unterschied. ;-)  Die Bitnamen im ersten
Fall sind ja pure Zahlen, da kann der Compiler natürlich keinerlei
Checks vornehmen, zu welchem Register sie wirklich gehören.

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.