mikrocontroller.net

Forum: Compiler & IDEs Adresse eines PORTs


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gast (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)

und __SFR_OFFSET wiederrum ist kurz davor:
#ifndef __SFR_OFFSET
/* Define as 0 before including this file for compatibility with old asm
   sources that don't subtract __SFR_OFFSET from symbolic I/O addresses.  */
#  if __AVR_ARCH__ >= 100
#    define __SFR_OFFSET 0x00
#  else
#    define __SFR_OFFSET 0x20
#  endif
#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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.