Forum: Compiler & IDEs Adresse eines PORTs


von gast (Gast)


Lesenswert?

hallo,
ich bin Anfänger und arbeite mit dem Mikrocontroller AT90CAN128.
ich beschäftige ich miche im IO vom PORTC.

ich will die Addresse von PORTC und DDRC auslesen.
ich habe so geschrieben.

printf("DDRC=%x PORTC=%x",&DDRC,&PORTC);
ich bekomme: DDRC=27 und PORTC=28


Aber ich iocanxxx.h habe diese define
#define DDRC   _SFR_IO8(0x07)
#define PORTC  _SFR_IO8(0x08)
Ist es richtig.

von (prx) A. K. (prx)


Lesenswert?

Passt so. Doku lesen. Die Ports fangen bei Adresse 0x20 an, die IN/OUT 
Befehle erwarten aber 0-63 für die Adressen 0x20-0x5F.

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:
> hallo,
> ich bin Anfänger und arbeite mit dem Mikrocontroller AT90CAN128.
> ich beschäftige ich miche im IO vom PORTC.
>
> ich will die Addresse von PORTC und DDRC auslesen.
> ich habe so geschrieben.
>
> printf("DDRC=%x PORTC=%x",&DDRC,&PORTC);
> ich bekomme: DDRC=27 und PORTC=28
>
>
> Aber ich iocanxxx.h habe diese define
> #define DDRC   _SFR_IO8(0x07)
> #define PORTC  _SFR_IO8(0x08)
> Ist es richtig.

Das stimmt schon.
Diese Ports, oder wie es intern heißt, die 'Special-Function-Register' 
können auf 2 Arten erreicht werden.
Zum einen über IN/OUT Instruktionen, zum anderen sind sie auch über 
normale Speicheradressen erreichbar.
Und beide Adressen stimmen nicht überein.

Verfolge einmal was sich hinter _SFR_IO8 verbirgt. Irgendwo da drinnen 
wirst du auf die fehlenden 0x20 stossen.

von gast (Gast)


Lesenswert?

hallo,
ich finde nicht wo _SFR_IO8 definiert ist. Wie erreicht mann dann diese 
Port über IN/OUT Instruktionen?

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:
> hallo,
> ich finde nicht wo _SFR_IO8 definiert ist.


Das ist in sfr_defs.h, welches seinerseits von io.h includiert wird

Dort steht
1
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)

und __SFR_OFFSET wiederrum ist kurz davor:
1
#ifndef __SFR_OFFSET
2
/* Define as 0 before including this file for compatibility with old asm
3
   sources that don't subtract __SFR_OFFSET from symbolic I/O addresses.  */
4
#  if __AVR_ARCH__ >= 100
5
#    define __SFR_OFFSET 0x00
6
#  else
7
#    define __SFR_OFFSET 0x20
8
#  endif
9
#endif

> Wie erreicht mann dann diese
> Port über IN/OUT Instruktionen?

Das ist nichts worüber du dir als C-Programmierer Gedanken machen musst. 
Erledigt der Compiler für dich. Die Sache ist nämlich nicht so einfach. 
Einige der SpecialFunctionRegisters können über OUT/IN angesprochen 
werden, andere wieder sind nur über die Speicheradresse erreichbar. Der 
Compiler weiß darüber Bescheid und wählt jeweils den richtigen 
Zugriffsweg aus.

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.