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!
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.
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.
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.
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
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!!
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)
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
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..
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!
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
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???
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
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
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
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.