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.
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.
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.
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 */ |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.