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.
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.
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
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.