Headerdatei avr/io.h

Gast #3004579
Guten Tag,

ich lese mich gerade in einige Tutorials zur AVR XMEGA Familie ein.
Beim Konfigurieren des µC werden die Register ja immmer über den 
Punktoperator beschrieben. Sind also die Registeradressen in den 
entsprechenden Headerdateien in Stukturen organisiert? Sehe ich das 
richtig so?
Wäre vielleicht jemand so nett mir die Headerdatei avr/io.h irgendeines 
ATXMEGA's zu schicken. Würde da gerne mal reinsehen.
Wäre euch sehr dankbar.

Mfg

marco
marco schrieb:
> Sind also die Registeradressen in den
> entsprechenden Headerdateien in Stukturen organisiert? Sehe ich das
> richtig so?

Ja.

> Wäre vielleicht jemand so nett mir die Headerdatei avr/io.h irgendeines
> ATXMEGA's zu schicken. Würde da gerne mal reinsehen.

Die ist doch in der Toolchain dabei. Bei Atmel Studio 6 wäre sie zum 
Beispiel in:

C:\Program Files (x86)\Atmel\Atmel Studio 
6.0\extensions\Atmel\AVRGCC\3.4.1.95\AVRToolchain\avr\include\avr\io.h

Oder einfach einen Text wie PORTA markieren, Rechtsklick und "Goto 
Implementation", dann bist Du auch gleich in der richtigen Datei für den 
Controller.
Gast
Ja, habe aber bisher nur einen C8051F020 von Silabs programmiert. Mit 
AVR's hatte ich noch nie was zu tun. Deshalb habe ich auch kein Atmel 
Studio oder WinAVR (bis jetzt).

Und bei google hab ich nix zum download gefunden.
marco schrieb:
> Würde da gerne mal reinsehen.

Was willst du dir da ansehen?

Es ist relativ klar, wie das gemacht wird, auch ohne das man die Sache 
sieht.

Für jeden Register-Typ wird es eine Struktur geben, in der ein Bitfeld 
liegt, welches den einzelnen Bits Namen gibt.
Für das eigentliche Register wird es ein #define geben, in welchem die 
Adresse als Zahlenkonstante auf einen volatile Pointer auf diesen 
Strukturtyp umgecastet wird und noch ein Derferenzierungsoperator davor.

Und das wars dann schon.
So sieht das aus:
1
typedef volatile uint8_t register8_t;
2

3
typedef struct PORT_struct
4
{
5
    register8_t DIR;  /* I/O Port Data Direction */
6
    register8_t DIRSET;  /* I/O Port Data Direction Set */
7
    register8_t DIRCLR;  /* I/O Port Data Direction Clear */
8
    register8_t DIRTGL;  /* I/O Port Data Direction Toggle */
9
    register8_t OUT;  /* I/O Port Output */
10
    register8_t OUTSET;  /* I/O Port Output Set */
11
    register8_t OUTCLR;  /* I/O Port Output Clear */
12
    register8_t OUTTGL;  /* I/O Port Output Toggle */
13
    register8_t IN;  /* I/O port Input */
14
    register8_t INTCTRL;  /* Interrupt Control Register */
15
    register8_t INT0MASK;  /* Port Interrupt 0 Mask */
16
    register8_t INT1MASK;  /* Port Interrupt 1 Mask */
17
    register8_t INTFLAGS;  /* Interrupt Flag Register */
18
    register8_t reserved_0x0D;
19
    register8_t REMAP;  /* I/O Port Pin Remap Register */
20
    register8_t reserved_0x0F;
21
    register8_t PIN0CTRL;  /* Pin 0 Control Register */
22
    register8_t PIN1CTRL;  /* Pin 1 Control Register */
23
    register8_t PIN2CTRL;  /* Pin 2 Control Register */
24
    register8_t PIN3CTRL;  /* Pin 3 Control Register */
25
    register8_t PIN4CTRL;  /* Pin 4 Control Register */
26
    register8_t PIN5CTRL;  /* Pin 5 Control Register */
27
    register8_t PIN6CTRL;  /* Pin 6 Control Register */
28
    register8_t PIN7CTRL;  /* Pin 7 Control Register */
29
} PORT_t;
30

31
#define PORTA    (*(PORT_t *) 0x0600)  /* I/O Ports */
32
#define PORTB    (*(PORT_t *) 0x0620)  /* I/O Ports */
33
#define PORTC    (*(PORT_t *) 0x0640)  /* I/O Ports */
34
#define PORTD    (*(PORT_t *) 0x0660)  /* I/O Ports */
35
#define PORTE    (*(PORT_t *) 0x0680)  /* I/O Ports */
36
#define PORTR    (*(PORT_t *) 0x07E0)  /* I/O Ports */
Persönliche Seite
Das ist aber ungeschickt register_t volatile zu machen.  Das macht es 
nämlich obsolet, eine lokale Variable von diesem Typ anzulegen, etwa um 
einen Wert zusammenzubasteln, der hernach ins SFR geschrieben werden 
soll.

Viel zweckmäßiger wäre doch stattdessen
1
#define PORTA    (*(volatile PORT_t *) 0x0600)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 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.