Adresse eines PORTs

Gast #1337017
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.
#1337028
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.
#1337057
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren