www.mikrocontroller.net

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


Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
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
PORTA.PIN0=0;
oder kürzer
PORTA.P0
drauf zugreifen, aber Zahlen als Namen können ja nicht verwemdt werden.


VG,
/r.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der SDCC für Pics macht das z.B. so für Ports/register:
extern __sfr __at (0xF80) PORTA;
typedef union {
        struct {
                unsigned RA0            : 1;
                unsigned RA1            : 1;
                unsigned RA2            : 1;
                unsigned RA3            : 1;
                unsigned RA4            : 1;
                unsigned RA5            : 1;
                unsigned RA6            : 1;
                unsigned                : 1;
        };
        struct {
                unsigned RA             : 7;
                unsigned                : 1;
        };
        /* aliases */
        struct {
                unsigned C1INN          :1;
                unsigned C2INN          :1;
                unsigned C2INP          :1;
                unsigned C1INP          :1;
                unsigned C1OUT          :1;
                unsigned C2OUT          :1;
                unsigned OSC2           :1;
                unsigned                :1;
        };
        struct {
                unsigned AN0            :1;
                unsigned AN1            :1;
                unsigned AN2            :1;
                unsigned AN3            :1;
                unsigned T0CKI          :1;
                unsigned AN4            :1;
                unsigned                :1;
                unsigned                :1;
        };
} __PORTA_t;
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.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>"PORTAbits.RA6=1"

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

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
STK500-Besitzer wrote:

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

"PORTAbits.RA6=1" ist es auch.

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ein blödes Beispiel:

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

und
TCCR0Abits.WGM00=1;
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...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.