Forum: Mikrocontroller und Digitale Elektronik Headerdatei avr/io.h


von marco (Gast)


Lesenswert?

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

von Fabian O. (xfr)


Lesenswert?

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.

von marco (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von marco (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Was willst du dir da ansehen?

Naja, vielleicht wollte ich mit einem Blick in die Headerdatei auch noch 
andere Unklarheiten beseitigen, die ich nicht alle hier reinschreiben 
wollte. Bin halt noch Anfänger was µC angeht.

von Fabian O. (xfr)


Lesenswert?

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 */

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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)

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.