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
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;GROUPID=;SID=31gyHhtawQAR8AAEbIhh0587856488f83297a43c61df0bd7cc1c5 sollte der nicht richtig sein?
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
1 | #include <stdio.h> |
2 | #include <avr/io.h> |
3 | |
4 | int main (void ) { |
5 | |
6 | //Port A als Ausgang einstellen
|
7 | DDRA = 0xFF; |
8 | |
9 | // Port A 0 -7 auf 1 setzten
|
10 | PORTA = 0b11111111; |
11 | |
12 | while(1) |
13 | ;
|
14 | |
15 | return 0; |
16 | }
|
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.