Forum: Mikrocontroller und Digitale Elektronik AVR ATMega8 Systementwicklung in C


von Severino R. (severino)


Lesenswert?

Als langjähriger PIC-Anwender muss (darf? ;-) ich jetzt ein Projekt 
pflegen und weiterentwickeln, das auf einem AVR ATMega8L basiert.

Ich habe Schema und Sourcecode mit Makefile, jedoch keine fertigen 
Projektdateien. Im Makefile tauchen Begriffe auf wie "avr-gcc", 
"avrdude" und  "STK200" (ja, 200 und nicht etwa 500), die mir zumindest 
schon mal begegnet sind.

Jetzt die Frage an die AVR-Profis:
Wie lege ich jetzt los: Ich denke, ich lade AVR Studio 4 herunter.
Dort ist aber der C-Compiler noch nicht dabei, oder? Wo bekomme ich den?
Weiter brauche ich einen Programmer. Am liebsten wäre mir so etwas wie 
der ICD2 von Microchip, aber für AVR, also ein In-Circuit Programmer und 
Debugger.
Für's erste möchte ich auf einen (teuren?) richtigen In-Circuit-Emulator 
verzichten.
Wo immer möglich möchte ich Original-Tools von ATMEL verwenden.

Nach Möglichkeit wünsche ich konkrete kurze Tipps/Antworten.
Natürlich werde ich das Tutorial und die Datasheets studieren, aber ich 
muss vorerst halt den Aufwand für den Einstieg abschätzen.

Vielen Dank

Severino

von Hans J. (hjm)


Lesenswert?

Hallo Severino,

sieh einmal hier: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

dort steht alles was Du bruachst und wissen muß um los legen zu können.

Grüße
Hans-Josef

von Niels H. (monarch35)


Lesenswert?

Alles was du an Software brauchst, um einen AVR Controller in C zu 
programmieren und flash'en  zu können, ist ein einem Softwarepaket 
namens "winavr" enthalten (google ist dein Freund).

Alles weitere findest du, wie eben schon geschrieben, im hiesigen 
Tutorial.

von 2961 (Gast)


Lesenswert?

Als Incircuit emulator kann der Dragon (50Euro) gelten. Leider ist der 
auf 32k begrenzt. Schade. Mehr gibt's von Atmel nicht. Von 
Drittanbietern schon.

von Severino R. (severino)


Lesenswert?

Vielen Dank.

Lässt sich der Dragon von AVR Studio aus einigermassen bequem bedienen?
Und wie sieht es aus mit C Source Level Debugging?

Wie heissen Drittanbieter, die weitere Emulatoren für AVR anbieten?

von Severino R. (severino)


Lesenswert?

So, vielen Dank. Ich bin jetzt schon einen gewaltigen Schritt weiter.
Ich habe WinAVR installiert und konnte die Sourcen auf Anhieb 
compilieren.

Nun ist es aber so, dass im MAKEFILE verschiedene Controller eingetragen 
sind und alle bis auf einen auskommentiert:
#MCU_TARGET     = atmega8
#MCU_TARGET     = atmega16
MCU_TARGET     = atmega32

So liess sich die Sache compilieren und linken.
In der Schaltung ist aber der ATMega8 vorgesehen. Wenn ich also den 
"aktiviere":
MCU_TARGET     = atmega8
#MCU_TARGET     = atmega16
#MCU_TARGET     = atmega32
und erneut make aufrufe, bekomme ich die Meldung:

c:\winavr-20070525\bin\..\lib\gcc\avr\4.1.2\..\..\..\..\avr\bin\ld.exe: 
address
0x25ee of ABCD001_Module.elf section .text is not within region text
make: *** [ABCD001_Module.elf] Error 1


Verstehe ich das richtig, dass der Speicherplatz nicht ausreicht?

Nun habe ich bei atmel.com gesucht in der Hoffnung, einen Controller mit 
gleichem Gehäuse wie der Mega8 aber mit mehr Flash zu finden, und bin 
auf den Mega168 gestossen. Verstehe ich es richtig, dass sich der vom 
Mega8 hauptsächlich im Flash-Speicher unterscheidet?

Wenn ich jedenfalls im MAKEFILE den ATMega168 statt dem ATMega8 
eintrage, bekomme ich etliche Fehlermeldungen:

C:\AVR\SCA1X5\CVERSI~1.6>make all
avr-gcc -g -Wall -Wstrict-prototypes -Os -mcall-prologues 
-mmcu=atmega168    -c
-o ABCD001_Module.o ABCD001_Module.c
In file included from ABCD001_Module.h:218,
                 from ABCD001_Module.c:27:
ABCD001_setup.c: In function 'setup':
ABCD001_setup.c:19: error: 'TCCR0' undeclared (first use in this 
function)
ABCD001_setup.c:19: error: (Each undeclared identifier is reported only 
once
ABCD001_setup.c:19: error: for each function it appears in.)
ABCD001_setup.c:26: error: 'TCCR2' undeclared (first use in this 
function)
ABCD001_setup.c:28: error: 'OCR2' undeclared (first use in this 
function)
ABCD001_setup.c:36: error: 'TIMSK' undeclared (first use in this 
function)
ABCD001_setup.c:36: error: 'OCIE2' undeclared (first use in this 
function)
In file included from ABCD001_Module.h:220,
                 from ABCD001_Module.c:27:
RS485.c: In function 'get_chr':
RS485.c:23: error: 'UCSRA' undeclared (first use in this function)
RS485.c:23: error: 'RXC' undeclared (first use in this function)
RS485.c:26: error: 'UDR' undeclared (first use in this function)
[...]

Muss ich irgendwelche anderen Files includen?
Ich meinte, abhängig vom Parameter -mmcu=... werden die richtigen Files 
included.

Hat mir jemand von Euch Gurus einen Tipp?

Danke

von Niels H. (monarch35)


Lesenswert?

Severino R. wrote:

> Wenn ich jedenfalls im MAKEFILE den ATMega168 statt dem ATMega8
> eintrage, bekomme ich etliche Fehlermeldungen:

Wie hasst du den MCU_Type angegeben.... bitte so genau wie möglich.
Der richtige Eintrag muss "MCU_TARGET=atmega168" 
(gross-/kleinschreibung wichtig!) heissen.

von Peter D. (peda)


Lesenswert?

Ja, da haben sich einige Namen geändert:

http://www.atmel.com/dyn/resources/prod_documents/doc2553.pdf


Peter

von Niels H. (monarch35)


Lesenswert?

Peter Dannegger wrote:

> http://www.atmel.com/dyn/resources/prod_documents/doc2553.pdf

Mag ja sein, das sich Namen geändert haben, aber das es sowas wie 
'TIMSK' in winavrs libc nicht mehr geben soll, halte ich für nahezu 
ausgeschlossen ;)

da halte ich jede Wette ohne entsprechendes pdf-dokument zu lesen :-)

von Jochen S. (schiffner)


Lesenswert?

kann es sein das dein Programm zu groß für einen mega8 ist und es daher 
nur für die größeren erstellt wird?

von Spess53 (Gast)


Lesenswert?

Hi

@Peter : der ATMega168 hat TIMSK0, TIMSK1, TIMSK2 , nämlich für jeden 
Timer.

MfG Spess

von Falk B. (falk)


Lesenswert?

@ Niels Hüsken (monarch35)

>Mag ja sein, das sich Namen geändert haben, aber das es sowas wie
>'TIMSK' in winavrs libc nicht mehr geben soll, halte ich für nahezu
>ausgeschlossen ;)

>da halte ich jede Wette ohne entsprechendes pdf-dokument zu lesen :-)

>@Peter : der ATMega168 hat TIMSK0, TIMSK1, TIMSK2 , nämlich für jeden
>Timer.

Wann und wo gibst Freibier?

MFG
Falk

von Peter D. (peda)


Lesenswert?

Niels Hüsken wrote:

> Mag ja sein, das sich Namen geändert haben, aber das es sowas wie
> 'TIMSK' in winavrs libc nicht mehr geben soll, halte ich für nahezu
> ausgeschlossen ;)
>
> da halte ich jede Wette ohne entsprechendes pdf-dokument zu lesen :-)

Daß Du es nicht gelesen hast, ist mir klar:

Du hast die Wette verloren.


Peter

von strange99 (Gast)


Lesenswert?

Übrigens kannst du - nachdem du WinAVR installiert hast - auch das AVR 
Studio (ich habe 4.13) installieren. Dann hast du nämlich beides 
(Assembler und C) in einer IDE, kannst komfortabel debuggen und sparst 
dir das "hantieren" mit makefiles usw., darum kümmert sich nämlich das 
Studio.
Und Programmieren / Fuses setzen kannst du von dort aus auch ganz 
komfortabel. Versuchs mal ...

Strange

von Niels H. (monarch35)


Lesenswert?

Falk Brunner wrote:

> Wann und wo gibst Freibier?

Mist! :-)
Da hab ich mich wohl ziemlich grob verschätzt, sorry :)

von Severino R. (severino)


Lesenswert?

@ Jochen:

Jochen Schiffner wrote:
> kann es sein das dein Programm zu groß für einen mega8 ist und es daher
> nur für die größeren erstellt wird?

Das nehme ich ja an, deshalb habe ich geschrieben:
> Verstehe ich das richtig, dass der Speicherplatz nicht ausreicht?

von Severino R. (severino)


Lesenswert?

Niels Hüsken wrote:
> Severino R. wrote:
>
>> Wenn ich jedenfalls im MAKEFILE den ATMega168 statt dem ATMega8
>> eintrage, bekomme ich etliche Fehlermeldungen:
>
> Wie hasst du den MCU_Type angegeben.... bitte so genau wie möglich.
> Der richtige Eintrag muss "MCU_TARGET=atmega168"
> (gross-/kleinschreibung wichtig!) heissen.

Habe ich, siehe:
> C:\AVR\SCA1X5\CVERSI~1.6>make all
> avr-gcc -g -Wall -Wstrict-prototypes -Os -mcall-prologues
> -mmcu=atmega168    -c
        ^^^^^^^^^

von Severino R. (severino)


Lesenswert?

@ Peter Dannegger

Alles klar, danke.

Gibt es denn einen Controller, der so kompatibel wie möglich ist, aber 
mehr Flash-Speicher hat als der ATMega8 ?
Am liebsten ohne grosse Änderungen.

von Jochen S. (schiffner)


Lesenswert?

oh,ja :-) (wer lesen kann ist klar im Vorteil)
wenn die .hex-Datei größer als 8kB ist passts nicht innen mega8.

von Severino R. (severino)


Lesenswert?

@ strange99:

Vielen Dank. Ich werde das noch nachholen.
Es geht mir im Moment darum:
Ich habe ein Design übernommen, so im Stil: "Da ist das Zeug. Schau 
selber mal, ob Du damit etwas anfangen kannst.".

Also wollte ich zuerst mit vertretbarem Aufwand sehen, ob:
1. sich die Software überhaupt kompilieren lässt
2. ob sie in einen ATMega8 (Print Layout ist für diesen Controller) 
programmiert werden kann.
3. ob das Ganze überhaupt in etwa so funktioniert, wie es soll.

Wenn das bis dahin gelingt, werde ich mich tiefer in die Materie AVR 
einarbeiten.
Wenn hingegen so ziemlich nichts funzt, dann werde ich eine 
Implementierung in PIC in Erwägung ziehen, da ich hier Erfahrung und 
Tools habe.
Wenn ich ohne Erfahrung Bugs in AVR suchen muss, werde ich noch 
Stammgast hier im Forum.


@ alle:
Vielen Dank für die schnelle Hilfe.

von Severino R. (severino)


Lesenswert?

Jochen Schiffner wrote:
> oh,ja :-) (wer lesen kann ist klar im Vorteil)
> wenn die .hex-Datei größer als 8kB ist passts nicht innen mega8.

Leider ist es nun so, dass im beschriebenen Fall (für den ATMega8) gar 
keine .hex-Datei erstellt wurde :-(

Ausserdem könnte es ja sein (dachte ich mir jedenfalls), dass irgend 
etwas an eine absolute Adresse reloziert wird, die es beim ATMega8 gar 
nicht gibt (weil zu hoch), und nicht einfach der Code als solcher zu 
gross ist.

von Jörg X. (Gast)


Lesenswert?

> wenn die .hex-Datei größer als 8kB ist passts nicht innen mega8.
DAS stimmt ja so nicht, weil eine .hex-Datei min. 100% Overhead hat 
(jedes Byte wird durch min. 2 Zeichen dargestellt).

Aber avr-size kann anzeigen, wieviel Speicher belegt ist, wenn der 
Controller korrekt angegeben ist - funktioniert bei AVR-Studio, WinAVR 
bzw. der mFile-Makefile-Vorlage tadellos.

scnr, Jörg

ps.: @OP den Code wirst du wohl überarbeiten müssen, wenn du vom Atmega8 
auf den 168 umsteigen willst (s. Post von P. Dannegger) - ob nun mit 
find & replace oder (mehr oder weniger cleveren) macros

von Severino R. (severino)


Lesenswert?

@ Jörg X.

Danke für die klare Antwort.
Also kann ich entweder den Sourcecode überarbeiten (und dann wohl noch 
ein bisschen debuggen) oder sehen, ob ich das Layout für den ATMega16 
oder 32 anpassen kann.

Übrigens: Natürlich zeigt die simple Dateigrösse einer Hex-Datei nicht 
die Grösse des Codes an.
Da ist mehr als 100% "Overhead" drin.
Aber wenn man die Datei anschaut, sieht man die verwendeten Adressen, 
was noch viel wichtiger ist.
Denn was nützt eine noch so kleine Hex-Datei, wenn sehr hohe Adressen 
belegt sind.
Ausserdem dürften in der Hex-Datei auch die Werte für Fuses drinsein 
(jedenfalls bei PIC).

von Simon K. (simon) Benutzerseite


Lesenswert?

Jochen Schiffner wrote:
> wenn die .hex-Datei größer als 8kB ist passts nicht innen mega8.

Die einen versuchen genau diese Falschaussage aus der Welt zu schaffen 
und du setzt sie wieder rein. Tz! ;)

von holger (Gast)


Lesenswert?

>Ausserdem dürften in der Hex-Datei auch die Werte für Fuses drinsein
>(jedenfalls bei PIC).

Sind sie bei AVR nicht :( Auch die EEprom Daten landen in einer
eigenen HEX-Datei. Lass dir doch mal statt HEX ne BIN
Datei erzeugen. Dann ist alles klar.

von Peter D. (peda)


Lesenswert?

Severino R. wrote:
> Als langjähriger PIC-Anwender muss (darf? ;-) ich jetzt ein Projekt
> pflegen und weiterentwickeln, das auf einem AVR ATMega8L basiert.

Dann sollte es ja in einen ATmega8 passen.

Hast Du vielleicht ohne Optimierung (-O0) compiliert ?

Versuch mal -Os, das sollte den kleinsten Code erzeugen.

Nicht pinkompatibel, aber Registerkompatibel zum ATmega8 sind ATmega16 
und ATmega32.


Peter

von holger (Gast)


Lesenswert?

>MCU_TARGET     = atmega32

Diese CPU zu nehmen hatte sicherlich einen Grund.
Vieleicht irgendwas mit Bootloader ?
Keine Ahnung ! Ohne deinen Quellcode kann man hier
nur weiter spekulieren. Also mein Tip:
Trag mal wieder den ATMega32 ins makefile ein
und lass dir eine BIN Datei erzeugen. Nur so
kannst du schnell sehen wie groß das Programm
wirklich wird.

@ Peter
>avr-gcc -g -Wall -Wstrict-prototypes -Os -mcall-prologues

Siehe oben. Kleiner gehts kaum noch.

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
Noch kein Account? Hier anmelden.