gcc vs. cvavr mit PORTA.1 = (bool)

OP Persönliche Seite #790456
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.
#790550
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.
#791179
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...
Moderator Persönliche Seite #791266
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.

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