www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega32 Portadressen


Autor: Peter von Frosta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo schlaue Gemeinde,

ich habe bisher ausschließlich 8051er Controller programmiert. In dessen 
Datenblättern waren freundlicherweise die Adressen der SFR's und der 
Portpins in den jeweiligen Kapitel angegeben.

Nun habe ich vor eine Entwicklung auf einem Atmel 32L8p aufzubauen. Und 
alles scheint neu und anders.

Ich habe mir AVRStudio installiert (zum compilieren benötigte ich noch 
WinAVR)
Verbindung zum Controller über AVRStudio und Programmer konnte ich 
aufbauen und den µC auch flashen.

Mein Problem ist nun folgendes:

Ich möchte zwecks einfachen test eine LED über einen Portpin steuern.
Die benötigten Register sind im Datenblatt zwar erklärt, allerdings 
stehen dort keine Adressen sondern nur Namen.
In den zahlreichen Tutorials werden diese Namen auch so im Source 
verwendet.
Anscheinend sind diese in der Include-datei "io.h" bzw "avr/io.h" 
definiert.
Diese Datei ist aber scheinbar bei mir nicht installiert.

Also brauch ich entweder diese Include-datein oder die Adressen, 
richtig?

ps: im Datenblatt ist noch eine Registerübersicht. Dort stehen die 
Adressen in einem mir unbekannten Format; Bsp DDRA: $1A ($3A)

eine hilfreiche Erlaeuterung wäre klasse!!!
sorry für die länge!

Autor: Markus Burrer (Firma: Embedit Mikrocontrollertechnik) (_mb_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du WinAVR korrekt installiert hast solltest du auch die avr/io.h 
haben.

Bei den AVR läuft alles über die Namen der Register, da die Adressen von 
Controller zu Controller abweichen können. Hier wäre eine direkt 
Verwendung der Adresse fatal. Selbst bei Assembler arbeitet man mit den 
Registernamen.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter von Frosta schrieb:
> Diese Datei ist aber scheinbar bei mir nicht installiert.

wenbn du die oben genannten Programmpakete installiert hast, sind die 
dateien definitiv einthalten.

außerdem steht unter register sumary im Datenblatt sowohl der Name, als 
auch die Adresse.


Auf jeden Fall ist mit der Installation deiner Tool-chain was faul, das 
solltest du beheben, bevor du irgendwelche Experimente machst.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus Burrer schrieb:
> Bei den AVR läuft alles über die Namen der Register, da die Adressen von
> Controller zu Controller abweichen können. Hier wäre eine direkt
> Verwendung der Adresse fatal. Selbst bei Assembler arbeitet man mit den
> Registernamen.

Außerdem gibt es für den Selben Port 2 Adressen, je nach dem mit welchem 
Befehl er angesprochen wird, muss die eine, oder die Andere verwendet 
werden.

Auch dass wird intern über die definitionen in den Includes geregelt.

Autor: Markus Burrer (Firma: Embedit Mikrocontrollertechnik) (_mb_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vlad Tepesch schrieb:
> Außerdem gibt es für den Selben Port 2 Adressen,

Nur bei den ersten 64 Registern. Größere Controller haben einen größeren 
Register Bereich, den man nicht mehr mittels IN/OUT erreichen kann.

Zur Erläuterung für den Thread Ersteller: Die AVR haben einen linearen 
Adressraum im RAM. Dieser beginnt mit den 32 Arbeitsregistern, gefolgt 
von den Registern für die Peripherie und dem SRAM. Verwendet man die 
normalen Befehle für den Zugriff auf das SRAM beginnen die Adressen für 
die Peripherie Register bei 0x20, also dezimal 32.

Verwendet man die speziellen Befehle IN und OUT beginnt die Adressierung 
bei 0x00, weil für diese Befehle die Register in einem eigenen 
Adressraum erscheinen. Dieser ist jedoch nur 64 Byte groß.

Der Vorteil von IN und OUT ist, dass sie in einem Takt ausgeführt 
werden. Der Zugriff mir den normalen Befehlen dauert 2 Takte

Autor: Peter von Frosta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wow... so schnell so viel Antworten... danke!

die letzteren Antworten waren vllt doch n bisschen speziel - wie gesagt: 
AVR ist für Neuland.


Markus Burrer schrieb:
> Wenn du WinAVR korrekt installiert hast solltest du auch die avr/io.h
> haben.

Also ich habe zunächst AVRStudio Installiert, das war auf der 
Kompatibilitätsliste (klasse wort) des Programmers aufgeführt.

Bei dem ersten build versuch wurde ich aufgefordert WinAVR zu 
installieren.
Das Tat ich dann auch und darauf hin konnte ich den code builden und auf 
den µC flashen.


wenn ich nun im AVRStudio folgendes versuche zu compilieren:

#include <stdio.h>
#include <avr/io.h>

void main (void ) {

//Port A als Ausgang initialisieren
  DDRA = 0xFF;

while(1);
}

bekomme ich folgende Fehlermeldungen:

../Atmega1.c:9: error: 'DDRA' undeclared (first use in this function)
../Atmega1.c:9: error: (Each undeclared identifier is reported only once
../Atmega1.c:9: error: for each function it appears in.)

also scheint "DDRA" ja nicht durch "#include <avr/io.h>" initialisiert 
worden zu sein.

Danke für eure Beiträge!!

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

Bewertung
0 lesenswert
nicht lesenswert
Peter von Frosta schrieb:

> ../Atmega1.c:9: error: 'DDRA' undeclared (first use in this function)
> ../Atmega1.c:9: error: (Each undeclared identifier is reported only once
> ../Atmega1.c:9: error: for each function it appears in.)

Hast du bei der Generierung deines Projekts auch den richtigen µC 
ausgewählt?

Du kannst ja mal in die "Project" / "Configuration Options" reinschauen, 
welcher Prozessor dort eingestellt ist.

> also scheint "DDRA" ja nicht durch "#include <avr/io.h>"
> initialisiert worden zu sein.

Wenn schon, dann definiert. DDRA ist ein Makro.
Aber wenn du den richtigen µC eingestellt hast, dann ist das Makro auch 
vorhanden (wenn der µC auch über einen Port A verfügt natürlich)

Autor: Markus Burrer (Firma: Embedit Mikrocontrollertechnik) (_mb_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Möglicherweise hast du in den Projekteinstellungen den falschen/keinen 
AVR angegeben.

Schau mal im Menu "Project/Configuration Options". Da muss bei "Device" 
der richtige AVR eingestellt sein. Steht da z.B. atmega8, dann kennt der 
DDRA nicht

Autor: Peter von Frosta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank Karl Heinz und Markus...
und klar... definiert!

Also als device habe ich: "atmega328p" ausgewählt.
Mein µC ist ein Atmega 32L8
http://www.reichelt.de/?ACTION=3;ARTICLE=45905;GRO...

sollte der nicht richtig sein?

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

Bewertung
0 lesenswert
nicht lesenswert
Du hast einen Mega 32

Mega 328 ist ein anderer Prozessor

Autor: Peter von Frosta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sauber Jungs!
ich habe nun in der configuration device "atmega32" gewählt und nun 
compiliert er diese "Progrämmchen"

Mal schauen ob sie leuchten wird ^^

Besten Dank bin echt beeindruckt.... muss mich wohl mal registrieren..

Autor: Peter von Frosta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh bevor ihr das hier schließt...

kann ich mit PINA1 oder PINA7 direkt einen Portpin schlaten?
Bsp:
PINA1 = 0;
PINA7 = 1;

oder muss ich mit PINA immer alle PortPins von A festlegen?!
Bsp:
PINA = 0x82

Danke!

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

Bewertung
0 lesenswert
nicht lesenswert
Peter von Frosta schrieb:
> Ahh bevor ihr das hier schließt...
>
> kann ich mit PINA1 oder PINA7 direkt einen Portpin schlaten?
> Bsp:
> PINA1 = 0;
> PINA7 = 1;

Nein.

Schau bitte ins AVR-GCC-Tutorial

Autor: Peter von Frosta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch mal Danke an Alles,
es hat mcih ja schon beeidruckt wie schnell und wie viele Beiträge hier 
kamen.

Also seid dem ich das richtige device eingestellt habe funktionier es 
mit dem compilieren und flashen tadellos.

Leider schaltet PortA0 aber noch immer nicht.
Falls jetzt einer fragt ob der µC überhaupt einen Port A hat... laut 
Datenblatt JA!
AVRStudio zeigt mir rechts in so ner Registerübersicht allerding nur 
PORTB bis -C an...

Also Folgend mein C-Code:

#include <stdio.h>
#include <avr/io.h>

int main (void ) {

//Port A als Ausgang einstellen
  DDRA = 0xFF;

// Port A 0 -7 auf 1 setzten
  PINA = 0b11111111;

while(1);
return 1;
}

An meinen Atmega habe ich an PORTA0 eine LED (mit 
Vorwiderstand)angeschlossen.
Sie will einfach nicht lechten...

Falls mich nun einer für total bekloppt hält..
Die LED ist nicht kaputt und es liegt auch nciht am zu großen 
Widerstand.
Mein Oszilloskop zeigt mir am PortA0 keinen High-Pegel...

Fachmänner, was mach ich falsch???

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

Bewertung
0 lesenswert
nicht lesenswert
Peter von Frosta schrieb:

> Falls jetzt einer fragt ob der µC überhaupt einen Port A hat... laut
> Datenblatt JA!

Mega 32 hat ein A

> AVRStudio zeigt mir rechts in so ner Registerübersicht allerding nur
> PORTB bis -C an...

Dann hast du in der Debug Einstellung immer noch den alten Prozessor 
drinnen. Für den SImulator gibt es ein eigenes Einstellungsfeld.
Drum ist es auch schlau bei der Erstellung eines Porjektes sorgfältig 
vorzugehen und den richtigen Prozessor einzustellen.
Dann muss man hinten nach nicht an allen Ecken und Enden umstellen.


> Also Folgend mein C-Code:

> // Port A 0 -7 auf 1 setzten
>   PINA = 0b11111111;

Schau bitte noch einmal ins Tutorial.
Stelle sicher, dass dir der Unterschied zwischen dem PIN Register und 
dem PORT Register klar ist.

PORT      * für Ausgaben
          * um den Pullup bei einer Eingabe zuzuschalten

PIN       * für Eingaben


#include <stdio.h>
#include <avr/io.h>

int main (void ) {

//Port A als Ausgang einstellen
  DDRA = 0xFF;

// Port A 0 -7 auf 1 setzten
  PORTA = 0b11111111;

  while(1)
    ;

  return 0;
}

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wann er wohl fragt, warum PortC2 bis 5 nicht funktionieren? ;)

Autor: Peter von Frosta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haha wie geil ihr seid!!  das werde ich bestimmt noch fragen aber bisher 
ist das uninteresant... vermutlich wird er aber nciht funktionieren, 
weil er standartmäßig nicht auf i/o-ports eingestell ist, sondern auf ne 
alternative funktion?!?! ;)

Danke Karl Heinz du hast mir wirkich sehr geholfen!! das war also 
unkonzentration meinerseits... das probier ich doch gleich nachm essen 
aus!

Echt super von euch! Sollteste mal in bochum sein.. ladt ich dich auf ne 
autowäsche ein ;) :-D

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter von Frosta schrieb:
> vermutlich wird er aber nciht funktionieren,
> weil er standartmäßig nicht auf i/o-ports eingestell ist, sondern auf ne
> alternative funktion?!?!

So ist es. An den vier Pins befindet sich die JTAG Schnittstelle, welche 
ab Werk aktiviert ist. Die kann man entweder dauerhaft mittels Fuse Bit 
deaktivieren oder per Software Befehl

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.