PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Microsoft Visual Studio 2008 Express als AVR IDE für C-Code!



DerMaddin
19.02.2008, 07:46
Hi

ich hab das Microsoft Visual Studio 2008 Express (kostenlos!) als Entwicklungsumgebung für die C-Code entwicklung (gcc - kostenloser Compiler) für AVR umgesetzt!

Keine Kosten!
Keine Codelimits!
Effizienteste Softwareentwicklung!

Lest euch die PDFs durch und dann: viel Spaß ;)

Der Maddin

PS: Ich musste die Attachments auftrennen, eigentlich ist es ein Dokument. Mailt mich mit dem Betreff "RoboterNetzwerk" an unter Martin_Hruschka@web.de und ihr bekommt das komplette PDF

Nepi
20.02.2008, 23:15
Maddin !

.. das ist echt heiß. Großes Danke für die nette Erklärung.

Bisher hab ichs zwar noch nicht am laufen, doch glaube ich das es an einen Leerzeichen im Pfad liegt. Werd mich morgen nochmal dran machen.

DerMaddin
21.02.2008, 06:52
Ja, da hast du Recht. Es ist mir in der Zwischenzeit auch aufgefallen. Aber wenn man den Pfad im Studio mit Hochkommas schützt, dann kann man die Verzeichnisse im Batch nicht mehr zusammensetzen.

Leerzeichen im Projektpfad müssen vermieden werden!


Mfg, Maddin

DerMaddin
25.02.2008, 06:38
Hey, wenns der Erste auch am Laufen hat, gebt mir Feedback, was man noch besser machen kann! Dann kann ich auch das nächste Dokument online stellen, das beschreibt, wie ich weiter gemacht hab. Das mit den Leerzeichen im Projektpfad ist ein known bug; ich gucks mir demnächst nochmal an.

Mfg, Maddin

DerMaddin
04.04.2008, 08:37
Wow, so viele Interessenten. Das nächste Dokument ist fertig. Es beschreibt die vorbereitenden Schritte im Studio. Ein Debugwerkzeug wird von Anfang an eingebunden und der Code durch Makros übersichtlich gehalten. Datentypen werden abstrahiert um flexibel zwischen verschiedenen Controllern wechseln zu können.

Eine Bitte an die Leser: Ich hab mir Mühe gegeben, das Dokument fehlerfrei zu gestalten. Sollten trotzdem logische Fehler oder Tippfehler (ich vertippe mich öfters, denn 20% meiner Finger sind Daumen) auftauchen, dann sagt bitte Bescheid. Ich werde die Doku dann korrigieren.

Dankeschön!

Ansonsten viel Spaß damit :-D

Felix G
04.04.2008, 14:40
Hey, bin gerade erst über diesen thread gestolpert, und muss sagen daß das doch mal eine wirklich gute Idee ist...


Eigentlich wäre diese Anleitung doch ein toller Artikel für unser Wiki (RN-Wissen (https://www.roboternetz.de/wissen)), denn so ein thread verschwindet früher oder später (meist früher) auf den hinteren Seiten, und findet dann kaumnoch Beachtung.

DerMaddin
04.04.2008, 15:03
Ja, er steht schon im Wiki. Such mal nach Microsoft :)
Er ist sogar zur Topic geworden, ich glaub, unter Software und dann Microsoft Visual Studio

Felix G
05.04.2008, 00:17
Ah ok, das hatte ich übersehen

hacker
05.04.2008, 09:20
Mal eine ganz dumme Frage von einem C - Anfänger. Ich bin grad dabei auf C umzusteigen. Jetzt ist meine Frage natürlich, was bringt mir die o.g Lösung im Gegensatz zu AVR Studio mit WinAVR? Vorteile?

Ich bitte um Aufklärung *g*

Grüße Hacker

johns
05.04.2008, 11:59
die antwort auf die frage von hacker würde mich auch sehr interessieren.

DerMaddin
05.04.2008, 12:05
Jetzt muss ich hier aufpassen, dass ich keine Werbung mache. Das Microsoft Visual Studio ist eine der besten IDEs (vergleichbar mit Eclipse). Die Kontextsensitive Soforthilfe Intellisense kann man mit der Tastenkombination Strg + Space auslösen. Diese Funktionalität ist vergleichbar mit ... wie heisst dieses Tool "Whole Tomato"(?) Dann diese hochdynamische GUI, in der man alle Fenster schieben und strecken kann. Jedes einzelne Fenster kann herausgezogen werden. Wenn man Codeblöcke markiert, kann man mit Tab und Shift + Tab einrücken. Bookmarks sind möglich. Und mit Tastenkombinationen Strg+"-" (neben der ShiftTaste) und Strg+Shift+"-" kann man vor- und zurückspringen. F12 führt die Funktion "Go to Definition" aus und und und......
...
Sind das genug Vorteile ?
Aber ich gebe dir recht, wenn du sagst, dass das Studio genauso den GCC benutzt wie das AVRStudio. Ich will auch garnicht sagen, dass das AVRStudio schlecht ist. Ich wollte hier nur eine andere Möglichkeit vorstellen, effizient zu programmieren.
...
Hab ich die Frage beantwortet? (Oder drumrum geredet?)

izaseba
05.04.2008, 13:10
Hallo, DerMaddin,

Das hört sich wirklich sehr interessant an !
Muß ich mal ausprobieren, wenn ich das nächste mal Winows nutze.
Visual Studio hat wirklich eine sehr angenehme Oberfläche.


Jetzt ist meine Frage natürlich, was bringt mir die o.g Lösung im Gegensatz zu AVR Studio mit WinAVR? Vorteile?

AVR Studios Editor ist das letzte, was ich unter Editoren gesehen habe, es eignet sich vielleicht für Assembler, aber für C kann man es vergessen, da ist PN2 um Welten besser !

Gruß Sebastian

DerMaddin
06.04.2008, 15:11
Naja, man sollte das Ganze nicht zu einseitig bewerten. Bei der Installation von Visual Studio wird das komplette .NET Framework in der Version 3.5 mit installiert, was man beim C-Programmieren nicht braucht. Man "müllt" den Rechner damit etwas zu. Es hat also nicht nur Vorzüge. Ich habe mich aber für das Studio entschieden, weil es zB Erweiterungsmöglichkeiten besitzt. Man kann eigene Wizards erstellen, mit denen eine Projektvorlage eingefügt wird. Damit muss man nicht die lästigen custombuildsteps eintragen. (Wenn der Wizard ausgereift ist, wird er online gestellt. Momentan bin ich noch am Basteln.)
Am Besten man informiert sich vorher auf der Microsoftseite ein bisschen darüber.

Mfg, Der Maddin

DerMaddin
09.04.2008, 21:58
So. Die Wizards sind fertig. Mit diesen Wizards ist es möglich, im Studio zu sagen: Datei->Neu->Projekt->AVRProjekt. Alle Einstellungen, die bis jetzt manuell vorgenommen werden mussten, macht der Wizard jetzt. Das heisst, man vergisst nichts mehr. Auch das Einfügen neuer Module kann ein Wizard übernehmen. Ich denke, diese Wizards werden nochmal eine erhebliche Erleichterung darstellen.

Ich habe beschrieben, an welchen Stellen die Wizards zu modifizieren sind, sodass sich jeder die Wizards customizen kann.

Lest euch erst die Doku durch und dann extrahiert die Zipfiles --> have fun ;)

Mfg, DerMaddin

sast
10.04.2008, 14:25
Hi Maddin,

freut mich, dass du uns an deinen Erkenntnissen teil haben läßt.

Habe mir zwar den Wizard noch nicht angesehen, da ich gerade erst wieder in den Thread geschaut habe, aber dafür hab ich mir mal Gedanken gemacht, wie man mit den Batches und Pfaden mit Leerzeichen umgehen kann.

Werde also versuchen, das Ergebnis hier unterzubringen.

Zum Anderen interessiert mich warum du zum WinAvr noch extra das PonyProg brauchst. Mit avrdude kann man das Programm doch auch übertragen. Gibt es da irgendwelche Vorteile?

So nun zu meinen Vorschlägen, die sich natürlich etwas an deinen Batches anlehnen.

Das Ganze ist jetzt alphabetisch sortiert und nicht in der Reihenfolge der Abarbeitung.

calcsize.bat


REM %1 ProjectDir, %2 OutDir\InputFileName, %3 OutDir

IF exist %3\programsize.txt DEL %3\programsize.txt

SET "OutDir=%3"
SET "LogFile=%OutDir%\erstellen.log"
ECHO "Getting size of %3\%2.elf ..." >> %LogFile%

SET OldDir=%CD%
CD %1
SET PrjDir=%CD%
CD %OldDir%

ECHO +++ Size begin +++ >> %3\programsize.txt
ECHO "%PrjDir%\BuildTools\WinAVR\bin\avr-size.exe" -x -A %3\%2.elf >> %LogFile%
"%PrjDir%\BuildTools\WinAVR\bin\avr-size.exe" -x -A %3\%2.elf >> %3\programsize.txt
ECHO +++ Sorted by size +++ >> %3\programsize.txt
ECHO "%PrjDir%\BuildTools\WinAVR\bin\avr-nm.exe" -x -A %3\%2.elf >> %LogFile%
"%PrjDir%\BuildTools\WinAVR\bin\avr-nm.exe" --size-sort -s %3\%2.elf >> %3\programsize.txt
ECHO +++ Size end +++ >> %3\programsize.txt


clean.bat


REM %1 OutDir

SET "OutDir=%1"

IF exist %OutDir% DEL %OutDir%\*.* /q
IF exist %OutDir% CALL :log
GOTO :end

:log
SET "LogFile=%OutDir%\erstellen.log"
ECHO "Cleaning %OutDir% ..." > %LogFile%
GOTO :eof

:end
EXIT


compile.bat


REM %1 ProjectDir, %2 InputFileName, %3 OutDir

IF NOT exist %3 MD %3

SET "OutDir=%3"
SET "LogFile=%OutDir%\erstellen.log"
ECHO "Compiling %2 ..." >> %LogFile%

SET OldDir=%CD%
CD %1
SET PrjDir=%CD%
CD %OldDir%

ECHO "%PrjDir%\BuildTools\WinAVR\bin\avr-gcc.exe" -I "%PrjDir%\/BuildTools/WinAVR/avr/include/avr" -std=c99 -O2 -Wall -c -mmcu=atmega8 "%PrjDir%\Sources"\\%2.c -o %3\\%2.obj >> %LogFile%
"%PrjDir%\BuildTools\WinAVR\bin\avr-gcc.exe" -I "%PrjDir%\/BuildTools/WinAVR/avr/include/avr" -std=c99 -O2 -Wall -c -mmcu=atmega8 "%PrjDir%\Sources"\\%2.c -o %3\\%2.obj

ECHO "%PrjDir%\BuildTools\WinAVR\bin\avr-gcc.exe" -I "%PrjDir%\/BuildTools/WinAVR/avr/include/avr" -std=c99 -O2 -Wall -E -mmcu=atmega8 "%PrjDir%\Sources"\\%2.c -o %3\\%2.pre >> %LogFile%
"%PrjDir%\BuildTools\WinAVR\bin\avr-gcc.exe" -I "%PrjDir%\/BuildTools/WinAVR/avr/include/avr" -std=c99 -O2 -Wall -E -mmcu=atmega8 "%PrjDir%\Sources"\\%2.c -o %3\\%2.pre

ECHO "%PrjDir%\BuildTools\WinAVR\bin\avr-gcc.exe" -I "%PrjDir%\/BuildTools/WinAVR/avr/include/avr" -std=c99 -O2 -Wall -S -mmcu=atmega8 "%PrjDir%\Sources"\\%2.c -o %3\\%2.asm >> %LogFile%
"%PrjDir%\BuildTools\WinAVR\bin\avr-gcc.exe" -I "%PrjDir%\/BuildTools/WinAVR/avr/include/avr" -std=c99 -O2 -Wall -S -mmcu=atmega8 "%PrjDir%\Sources"\\%2.c -o %3\\%2.asm

EXIT


link.bat


REM %1 ProjectDir, %2 OutDir

SET "OutDir=%2"
SET "LogFile=%OutDir%\erstellen.log"
ECHO "Linking AVR project ..." >> %LogFile%

SET "OutputFileName=program"

setlocal enableDelayedExpansion

SET OldDir=%CD%
CD %1
SET PrjDir=%CD%
CD %OldDir%

SET ObjFiles=

FOR %%i IN (%2\*.obj) DO CALL :objCounter "%%i"
ECHO %ObjFiles% >> %LogFile%

ECHO "%PrjDir%\BuildTools\WinAVR\bin\avr-gcc.exe" -mmcu=atmega8%ObjFiles% -o %2\%OutputFileName%.elf -Os --relax -Wl,--section-start=.fuse=0x820000 -Wl,-Map,%2\%OutputFileName%.map >> %LogFile%
"%PrjDir%\BuildTools\WinAVR\bin\avr-gcc.exe" -mmcu=atmega8%ObjFiles% -o %2\%OutputFileName%.elf -Os --relax -Wl,--section-start=.fuse=0x820000 -Wl,-Map,%2\%OutputFileName%.map >> %LogFile%
IF NOT %ERRORLEVEL%==0 (ECHO Linking error %ERRORLEVEL% >> %LogFile%) & ECHO %ERRORLEVEL%
GOTO :end

:objCounter
SET ObjFiles=!ObjFiles! %1
GOTO :eof

:end

CALL "%PrjDir%\BuildTools\makehex.bat" "%PrjDir%" %OutputFileName% %OutDir%
CALL "%PrjDir%\BuildTools\calcsize.bat" "%PrjDir%" %OutputFileName% %OutDir%
CALL "%PrjDir%\BuildTools\makelistfile.bat" "%PrjDir%" %OutputFileName% %OutDir%
CALL "%PrjDir%\BuildTools\send_program.bat" "%PrjDir%" %OutputFileName% %OutDir%

EXIT


makehex.bat


REM %1 ProjectDir, %2 InputFileName, %3 OutDir

SET "OutDir=%3"
SET "LogFile=%OutDir%\erstellen.log"
ECHO "Making .hex file of %3\%2.elf ..." >> %LogFile%

SET OldDir=%CD%
CD %1
SET PrjDir=%CD%
CD %OldDir%

ECHO "%PrjDir%\BuildTools\WinAVR\bin\avr-objcopy.exe" -O ihex -j .text -j .data %3\%2.elf %3\flash.hex >> %LogFile%
"%PrjDir%\BuildTools\WinAVR\bin\avr-objcopy.exe" -O ihex -j .text -j .data %3\%2.elf %3\flash.hex
ECHO "%PrjDir%\BuildTools\WinAVR\bin\avr-objcopy.exe" -O ihex -j .eeprom --change-section-lma .eeprom=0 %3\%2.elf %3\eeprom.hex >> %LogFile%
"%PrjDir%\BuildTools\WinAVR\bin\avr-objcopy.exe" -O ihex -j .eeprom --change-section-lma .eeprom=0 %3\%2.elf %3\eeprom.hex
ECHO "%PrjDir%\BuildTools\WinAVR\bin\avr-objcopy.exe" -O ihex -j .fuse %3\%2.elf %3\fuse.hex >> %LogFile%


makelistfile.bat


REM %1 ProjectDir, %2 InputFileName, %3 OutDir

SET "OutDir=%3"
SET "LogFile=%OutDir%\erstellen.log"
ECHO "Making listfile %3\listfile.lst ..." >> %LogFile%

SET OldDir=%CD%
CD %1
SET PrjDir=%CD%
CD %OldDir%

ECHO "%PrjDir%\BuildTools\WinAVR\bin\avr-objdump.exe" -s -j .fuse %3\%2.elf >> %LogFile%
"%PrjDir%\BuildTools\WinAVR\bin\avr-objdump.exe" -s -j .fuse %3\%2.elf > %3\fuses.txt
ECHO "%PrjDir%\BuildTools\WinAVR\bin\avr-objdump.exe" -h -s -j .text -j .data %3\%2.elf >> %LogFile%
"%PrjDir%\BuildTools\WinAVR\bin\avr-objdump.exe" -h -s -j .text -j .data %3\%2.elf > %3\listfile.lst


send_program.bat

Hier bitte aufpassen, da ich auch die Fusebits mit setze und einen ATMega8 verwende


REM %1 ProjectDir, %2 InputFileName, %3 OutDir

SET "OutDir=%3"
SET "LogFile=%OutDir%\erstellen.log"
ECHO "Programming %3\flash.hex eeprom.hex ..." >> %LogFile%

SET OldDir=%CD%
CD %1
SET PrjDir=%CD%
CD %OldDir%

REM Programming support using avrdude. Settings and variables.

REM Programming hardware: alf avr910 avrisp bascom bsd
REM dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
SET AVRDUDE_PROGRAMMER=avrisp

SET AVRDUDE_PORT=com1
REM SET AVRDUDE_PORT=lpt1

SET AVRDUDE_WRITE_LFUSE=-U lfuse:w:0x24:m
SET AVRDUDE_WRITE_HFUSE=-U hfuse:w:0xd9:m
SET AVRDUDE_WRITE_LOCK =-U lock:w:0x2f:m

SET AVRDUDE_WRITE_FLASH=-U flash:w:flash.hex
SET AVRDUDE_WRITE_EEPROM=-U eeprom:w:eeprom.hex
SET AVRDUDE_FLAGS=-p atmega8 -P %AVRDUDE_PORT% -c %AVRDUDE_PROGRAMMER%

CD %3
REM liest den Inhalt des Flashspeichers vom ATMega8 in die Datei flash.bin r=raw i=intel s=motorola
ECHO "%PrjDir%\BuildTools\WinAVR\bin\avrdude.exe" %AVRDUDE_FLAGS% -U flash:r:"./flash.bin":r >> %LogFile%
"%PrjDir%\BuildTools\WinAVR\bin\avrdude.exe" %AVRDUDE_FLAGS% -U flash:r:"./flash.bin":r

REM liest den Inhalt des EEPROM (512Byte) vom ATMega8 in die Datei eeprom.bin
ECHO "%PrjDir%\BuildTools\WinAVR\bin\avrdude.exe" %AVRDUDE_FLAGS% -U eeprom:r:"./eeprom.bin":r >> %LogFile%
"%PrjDir%\BuildTools\WinAVR\bin\avrdude.exe" %AVRDUDE_FLAGS% -U eeprom:r:"./eeprom.bin":r

ECHO "%PrjDir%\BuildTools\WinAVR\bin\avrdude.exe" %AVRDUDE_FLAGS% %AVRDUDE_WRITE_FLASH% %AVRDUDE_WRITE_EEPROM% %AVRDUDE_WRITE_LFUSE% %AVRDUDE_WRITE_HFUSE% >> %LogFile%
"%PrjDir%\BuildTools\WinAVR\bin\avrdude.exe" %AVRDUDE_FLAGS% %AVRDUDE_WRITE_FLASH% %AVRDUDE_WRITE_EEPROM% %AVRDUDE_WRITE_LFUSE% %AVRDUDE_WRITE_HFUSE% >> %LogFile%
CD %OldDir%


In der Befehlszeile des Studios müssen natürlich alle Parameter (alle heißt auch der nullte) in Anführungszeichen gesetzt werden, die eine Pfadangabe beinhalten. Dabei aber darauf achten, dass jeder Parameter für sich eingekapselt wird. Sonst denkt das Studio es gibt nur den nullten.

So jetzt muss ich erst mal sehen wie das Ergebnis meines CODE - Weitergebe - Versuches aussieht.

sast

Gock
10.04.2008, 14:41
Ich finde die Sache auch toll (Danke schonmal) und habe auch schon fleißig drauflos programmiert.
Aber ich habe wieder davon abgesehen, weil ich den AVRISP MKII Programmer (USB) benutze. So wie ich das sehe, lässt sich mit diesem der Code nicht zum AVR übertragen oder habe ich da was falsch verstanden?
Der andere Nachteil zu AVRStudio, den ich sehe, ist doch, dass ich die einzelnen Register und die ganze Hardware des AVR während des Debugging nicht angezeigt bekomme. Oder habe ich das auch was verpeilt???
Wäre nett, wenn mich jemand aufklären könnte...
Gruß

sast
10.04.2008, 19:55
...\WinAVR\utils\libusb\bin\avrisp2.inf

ist ja wohl eindeutig eine Windows inf Datei mit der man dem Ding einen Treiber verpassen kann

Und das folgende hab ich in der avrdude.conf gefunden

programmer
id = "avrispmkII";
desc = "Atmel AVR ISP mkII";
type = stk500v2;
;

programmer
id = "avrisp2";
desc = "Atmel AVR ISP mkII";
type = stk500v2;
;

Zum Debugging kann ich nichts sagen, da ich wie der Maddin auch meistens nur mit RS232 Ausgaben arbeite oder nem Oszi.

sast

DerMaddin
11.04.2008, 06:27
Also erstmal zur Frage, warum ich Ponyprog nehme. Der Grund ist ganz einfach:

Bei Ponyprog muss man sich keine Gedanken um Fusebits machen, da die negierten Bits vom Ponyprog intern nocheinmal negiert werden. Das ist der einzige Vorteil.

Debugging geht entweder nur mit einem JTAG Debugger auf dem Gerät oder mithilfe eines DeviceEmulators im AVRStudio. Vielleicht kann man eine ähnliche Lösung auch noch im Visual Studio umsetzen.

sast
11.04.2008, 06:48
Beim avr-gcc musst du auch bloß die Fuses setzen, die du haben willst (also alle die auf 0 gesetzt werden sollen. Wenn man Makros verwendet werden diese intern invertiert. Steht alles in den .h Dateien.

Meine Headerdatei für den VS Test ist zum Beispiel


#ifndef _AST_FUSE_SET_ATMEGA8_H_
#define _AST_FUSE_SET_ATMEGA8_H_

#include <avr/io.h>

FUSES =
{
.low = (FUSE_SUT0 & FUSE_CKSEL3 & FUSE_CKSEL1 & FUSE_CKSEL0),// & FUSE_BODLEVEL & FUSE_BODEN),
.high = HFUSE_DEFAULT, //(FUSE_SPIEN & FUSE_BOOTSZ1 & FUSE_BOOTSZ0)
};
// high=0xD9 low=0x24
//zum Fusebits ermitteln
//http://palmavr.sourceforge.net/cgi-bin/fc.cgi

/*
Fuses

#define FUSE_MEMORY_SIZE 2

Low Fuse Byte
#define FUSE_CKSEL0 ~_BV(0)
#define FUSE_CKSEL1 ~_BV(1)
#define FUSE_CKSEL2 ~_BV(2)
#define FUSE_CKSEL3 ~_BV(3)
#define FUSE_SUT0 ~_BV(4)
#define FUSE_SUT1 ~_BV(5)
#define FUSE_BODEN ~_BV(6)
#define FUSE_BODLEVEL ~_BV(7)
#define LFUSE_DEFAULT (FUSE_SUT0 & FUSE_CKSEL3 & FUSE_CKSEL2 & FUSE_CKSEL1)

High Fuse Byte
#define FUSE_BOOTRST ~_BV(0)
#define FUSE_BOOTSZ0 ~_BV(1)
#define FUSE_BOOTSZ1 ~_BV(2)
#define FUSE_EESAVE ~_BV(3)
#define FUSE_CKOPT ~_BV(4)
#define FUSE_SPIEN ~_BV(5)
#define FUSE_WDTON ~_BV(6)
#define FUSE_RSTDISBL ~_BV(7)
#define HFUSE_DEFAULT (FUSE_SPIEN & FUSE_BOOTSZ1 & FUSE_BOOTSZ0)

Lock Bits
#define __LOCK_BITS_EXIST
#define __BOOT_LOCK_BITS_0_EXIST
#define __BOOT_LOCK_BITS_1_EXIST
*/

#endif // _AST_FUSE_SET_ATMEGA8_H_


Die defines sind aus der iom8.h. Muss man sich eben für jeden Typ extra raussuchen.

sast

DerMaddin
13.04.2008, 19:35
Nochmal zu den Fuses.
Bei Ponyprog muss man GARKEIN Wissen über Fuses haben. Man kann sich auf das Wesentliche konzentrieren: Das Programmieren.

Hey, wieso sagt mir keiner, dass ich mal das Linktool aus der Doku online stellen könnte? Dann braucht ihr es nicht selbst zu übersetzen.

Mfg, Martin

DerMaddin
13.04.2008, 19:38
Höö...wieso ist der Anhang nicht hochgeladen worden? Sorry, jetzt mit Anhang

JTR
14.04.2008, 13:30
Hallo Martin,

weißt du ob man für VS2008 Professional irgendetwas an den Wizards anpassen muss oder laufen die so?

Grüße

DerMaddin
14.04.2008, 13:39
Das kann ich dir leider nicht sagen, weil ich soviel Kohle nicht übrig habe. Die Modifikationen dürften sich aber in Grenzen halten. Ich glaube nicht, dass man sehr viel ändern muss.
Probiers einfach mal und wenns nicht klappt, dann schick mir mal die Ordnerstruktur ... als.... Grafik oder so

Mfg, DerMaddin

robotob
15.04.2008, 22:02
Hallo zusammen,
und erst einmal ein dickes Lob an den Urheber der sehr ausführlichen und verständlichen (!) Anleitungen!
Ich habe versucht, sowohl mit der manuellen Anleitung als auch mit den Wizards die Kompilierung zu bewerkstelligen. Allerdings scheitert es bei beiden Varianten an demselben Punkt: Die Ausgabe der *.obj-Datei in den Output-Ordner klappt noch, das anschließende Weiterbearbeiten (Linken) zum "program.elf" geht nicht mehr... VisualStudio liefert mir hier die angehängte Log-Datei.

Ich arbeite mit VisualStudio2008, also der Vollversion. Daher kann ich auch direkt etwas zu den Wizards sagen: Ich musste zur Installation nur einige Pfade anpassen (da ja z.B. kein Express-Ordner existiert) und einige Ordner umbenennen von "1031" zu "1033", was mir aber auch VS gesagt hat; alles also kein Problem ; )

Wäre super, wenn mir irgendwer helfen könnte!

Viele Grüße,
Tobias

sast
16.04.2008, 07:04
@robotob
Martin erzeugt mit dem Wizard keinen Output Ordner, greift aber dann darauf zu. Kann sein, dass du einfach nur in der default.js die Pfadangabe dahin ändern musst, dass nur auf Release und nicht auf Output\\Release verwiesen wird.
Das war mir zumindest aufgefallen.

@all
Mich würde mal interessieren ob jemand mal die Variante mit den Leerzeichen in der Pfadangebe durchgespielt hat und ob er Erfolg hatte.

sast

DerMaddin
16.04.2008, 07:46
Hi Toby,

ich hab mir mal dein Log angeguckt (Bild im Anhang). Folgendes: Das Visual Studio erstellt im Output-Verzeichnis temporäre Batch-Dateien (im Bild gelb markiert), die die Kommandozeile für den Compiler beinhalten. Also im Normalfall für den Microsoftcompiler, in diesem Fall aber für den GCC.
Dieses Log beschreibt nur die Erstellung dieser Batchfiles, nicht aber deren Ausführung!

Die erste Batch-Datei, die für das Clean verantwortlich ist, wird richtig erstellt und wahrscheinlich auch richtig ausgeführt (grüne Markierung --> richtige Hochkommas).

Die folgenden Batchdateien, die die Kommandozeile für compile.bat beinhalten, werden aus irgendeinem Grund mit dreifachen Hochkommas generiert. Ich weiss nicht, worin das begründet liegt. Wenn das ein Fehler im Wizard ist, muss ich ihn noch raus machen. Das KÖNNTE ein Hinweis auf einen ersten Fehler sein. Möglicherweise bekommst du Objectfiles der Größe 0kb generiert? Kannst du das mal überprüfen? Falls die Objectfiles richtig generiert werden, kannst du diese dreifachen Hochkommas drin lassen.

Die letzte Markierung in Bild deutet auf einen fehlerhaften Eintrag für den CustomLinkStep hin. Das Studio erwartet Project1.exe anstatt Project1.elf. Das heisst, der Eintrag für CustomBuildStep bei den Projekteinstellungen falsch ist. Entweder hat da der Wizard für die Vollversion anders funktioniert als für die Expressversion oder du hast es falsch eingetippt.

Um dir genauer sagen zu können, woran es liegt, muss ich wissen
1) wie groß die *.obj files sind
2) ob alle *.c files gebaut werden, die inkludiert werden (möglicherweise fehlt dem Linker einfach ein Modul)

Mfg, DerMaddin

robotob
16.04.2008, 16:44
Vielen Dank schonmal für die raschen Antworten!
Mein *.obj-File hat eine Größe von ~3KB, ich habe nur das Minimalprogramm kompiliert (leere Schleife).
Auch mit zwei enthaltenen *.c-Files funktioniert das Kompilieren bis zu dem bekannten Punkt...
Meine erste Vermutung war, dass das VisualStudio beim Erstellen eine *.exe-Datei erwartet, diese aber nicht gefunden werden kann. Aber ich kann auch völlig falsch liegen ;)

@sast
Wenn ich mich richtig erinnere, habe ich die Pfadangabe auch angepasst...

DerMaddin
16.04.2008, 17:58
Hey, ich hab versucht diesen Fehler nachzustellen, aber ich habs nicht geschafft. Vielleicht ist es ein Phänomen der Prof Edition. Probier doch mal, ob du das Studio austricksen kannst, wenn du in eines der batches (am Besten link.bat) einbaust, dass er program.elf nach program.exe kopiert. Vielleicht ist das Studio zufrieden, wenn es eine exe bekommt (?)
Ist wahrscheinlich ne blöde Idee, aber versuchs doch mal :-/

sast
16.04.2008, 19:14
Also wenn dein log immer noch so aussieht wie oben, dann hast du immer noch Output als Ordner im Pfad. Ist das korrekt? Ausserdem gefällt mir diese manifest Geschichte nicht. Da hatte ich bei mir auch erst mal Änderungen vornehmen müssen. Du musst in der Toolbuildreihenfolge des Projektes mal ein paar Häkchen rausnehmen.

sast

robotob
17.04.2008, 22:51
@Maddin:
Hab mir vorhin mal die Express-Version geladen, vielleicht läuft es ja da problemlos, werde es mal ausprobieren... Wenn der Fehler da wieder auftritt, dann melde ich mich nochmal ; )

@sast:
Ich hatte glaubich einen Ordner in meinem Verzeichnis erstellt, sodass der Pfad wieder gestimmt hat... Was mir das manifest sagen will - no plan...

Danke euch beiden für die Hilfe!

DerMaddin
18.04.2008, 22:09
Hi,

es wird mal wieder Zeit für eine Verbesserung: Mir war es zu lästig, ständig Dateien vom Build auszuschliessen, um nicht zuviel zu linken. Ich will mir darüber keine Gedanken mehr machen, wer wen inkludiert. Das LinkThemAll hat ein bisschen mehr Intelligenz bekommen: Es bekommt über das Studio den Pfad auf die .c - Datei, die die Main-Funktion beinhaltet. Mit ihrer Hilfe scannt sie alle Header in ihrer Inklude-Reihenfolge durch und erkennt rekursiv alle inkludierungen. In dieser ersten Version werden keine *.c Dateien gescannt. Alle Inkludierungen in *.c Dateien werden nicht erkannt und dann auch nicht gelinkt. Also folgende Regel (Beispiel)

In main.c wird nur main.h inkludiert
in main.h kann dann GlobalConstants.h, Memory.h usw inkludiert werden; diese werden weiter gescannt

Im Anhang findet sich ein Beispiel für ein Log (kann man sich mal ansehen, bevor man sich das Update zieht) und ein Zipfile.
Im Zipfile wiederum ist ein Screenshot der neuen Kommandozeile für den Linker und Link.bat und LinkThemAll.exe. Die letzten beiden werden einfach überschrieben.

Wenn man das Projekt dann baut, bekommt man im Outputfolder eine LinkThemAll.log generiert, die anzeigt, welche header von wem inkludiert werden, welche Objectfiles zu den gescannten Headern gefunden wurden (daran kann man erkennen, ob vlt etwas nicht compiliert wurde) und es wird noch angezeigt, welche objectfiles an die Linkercommandline übergeben werden.

Ich denke, das ist eine ganz hübsche Arbeitserleichterung.
Probierts aus und schickt mir Verbesserungsvorschläge!!

Mfg, Martin

PS: Den Code zum Linktool gibts auf Anfrage per Mail (er ist noch ziemlich dirty, wird grad noch verbessert ;))

DerMaddin
19.04.2008, 12:07
So, jetzt kann ich auch den Code für das LinkTool rausgeben, hab ihn noch ein bisschen gesäubert :-D
Im zip befindet sich ein Studio2005 Projekt, ist also mit .NET2 auch übersetzbar.
Das Tool ist abwärtskompatibel zur alten Version. Wenn man den Pfad auf die main.c mitgibt, werden nur alle inkludierten Dateien geklinkt. Wenn der Parameter fehlt, werden alle objfiles gelinkt.

Have fun ;)

robotob
26.04.2008, 17:15
Hallo nochmal!
Ich muss euch schon wieder auf die Nerven gehen ;). Mittlerweile ist der zuerst aufgetretene Fehler beseitigt, aber ein anderer hat sich ergeben...
Ich glaube beim LINKEN des Projekts kommts zu einem unerwarteten Abbruch. Meiner Ansicht nach durch das Nichterstellen eines temporären Batch-Files.

@sast (falls da ;) ): Welche Häkchen müssen weg? Du hattest da ein paar Beiträge weiter oben was von geschrieben...

Wäre klasse, wenn sich mal jemand Fähigeres als ich den BuildLog anschaut : )
In meinem Release-Ordner sind nach dem Kompiliervorgang die *.obj, *.exe, *.exe.intermediate.manifest, mt.dep, vc90.idb.
Die *.exe-Datei verhält sich, wie sie soll...

Danke schonmal für die Hilfe!

DerMaddin
26.04.2008, 18:30
Hi Toby,

Kompilieren... << sieht gut aus
AVRModule1.c << sieht gut aus
Verknüpfen... << MUSS RAUS
Das Manifest wird eingebettet... << MUSS RAUS
Custom AVR linking... << sieht gut aus

Es sieht eigenltich fast gut aus
Du hast aber 2 Linkprozesse drin, das "Verknüpfen" ist falsch. Spür das mal auf und lösch das raus. Dann ist das manifest auch draussen.

Wenns garnicht geht, sag nochmal Bescheid, dann stell ich eine Projektvorlage online, nur mit Main.

robotob
26.04.2008, 18:59
Ah, vielen Dank schonmal! Das hab ich nun gemacht, allerdings bricht das Ganze noch immer beim Linken mit der Fehlermeldung ab:
***
echo Project : error PRJ0019: Ein Tool hat einen Fehlercode aus folgender Quelle zurückgegeben: "Custom AVR linking..."

exit 1

:VCEnd
]Erstellen der Befehlszeile """c:\Users\Toby\Documents\Programmdaten-Speicherordner\VisualStudio\expressproject\express project\Release\BAT00000C1047612268.bat"""
***
In der Toolbildreihenfolge habe ich jetzt nur Benutzerdef. Buildtool, C/C++ Kompiliertool und Postbuildereignis-Tool ausgewählt. Damit sieht meine Ausgabe wie folgt aus:

Kompilieren...
AVRModule1.c
Custom AVR linking...

Also relativ gesund :)

Gruß,
Toby

DerMaddin
26.04.2008, 19:27
Also... es ist verdammt schwer, TeleDiagnosen zu stellen. Wir können jetzt noch ein bisschen weiter raten. Aber du kannst auch dieses Projekt hier nehmen, WinAVR und PonyProg in die vorgesehenen Ordner kopieren und loslegen.
Ich weiss wie frustrierend es ist, wenn man nicht voran kommt. Mit diesem Projekt muss es gehen, so läufts bei mir. (Da ist auch die neueste Version vom LinkThemAll drin, es wird nur gelinkt, was wirklich gebraucht wird).

Mfg, Martin

DerMaddin
26.04.2008, 19:51
Aah, jetzt weiss ich, was noch falsch sein könnte:

In der Toolbildreihenfolge habe ich jetzt nur Benutzerdef. Buildtool, C/C++ Kompiliertool und Postbuildereignis-Tool ausgewählt

--> Es geht nur C/C++ Kompilertool ODER Benutzerdefiniertes Buildtool. Wir brauchen aber unbedingt das Benutzderdefinierte Buildtool, da wir ja Assemblercode für den AVR Controller statt für x86 brauchen.
Also wenn noch irgendwo C/C++ Kompilertool steht, dann ändere es!

Mfg, Martin

robotob
27.04.2008, 00:14
Hey Martin,
tausend Dank für das Projekt! Läuft natürlich...
Ich werde das mal auseinander nehmen und hoffentlich rausfinden, wo es letztendlich bei mir gehakt hat :)
Jetzt nur noch PonyProg installieren und zufrieden sein :-#

Viele Grüße,
Toby

DerMaddin
04.05.2008, 19:52
Hi,

ich hab eine Frage an alle Leser:
Ich würde gern eine professionellere Doku rausbringen, mit noch mehr Features. Code kann man noch strippen und einer statischen Codeanalyse unterziegen. Noch dazu würde ich noch mehr Hintergründe zum Umgang mit dem Visual Studio einbringen und die Implementierungen für alle Funktionen auf dem ATMega32 mitgeben.
Da diese Doku sehr zeitaufwendig ist und ich das nicht umsonst machen möchte, wollte ich vorher fragen, wie hoch die Nachfrage danach ist.
Um das Forum nicht zu überfluten bitte ich euch, mir eine Nachricht ins Postfach zu legen. Ich danke euch allen!

Mfg, Martin

Eisenman
05.12.2008, 19:16
Hallo Leute

ich bekomm es einfach nicht zum compilieren.
Ich habe auch die Hochkommas um den Pfad gesetzt.
Bei Klick auf meine Datei und kompilieren kommt:
"1> Die eingegebene Zeile ist zu lang."


Auch wenn ich die "Vorlage" hier lade und nach d:\
extrahiere komt:
1>Compiling Main.c for Win32|Release...
1>Das System kann den angegebenen Pfad nicht finden.
1>Das System kann den angegebenen Pfad nicht finden.
1>Das System kann den angegebenen Pfad nicht finden.
1>Projekt : error PRJ0002 : Fehler "1" wurde von "C:\WINDOWS\system32\cmd.exe" zurückgegeben.

Was ist denn da los?
:-/

DerMaddin
06.12.2008, 08:04
Kannst du mir ein Zip (von deinem gesamten Projekt) machen und den vollständigen Pfad auf die Solution geben? Dann krieg ichs sicher zum Laufen :)

Eisenman
07.12.2008, 19:24
Hi

wie habt ihr das mit den Include-Dateien gemacht?

z.B.
#include "io.h"

ich kann zwar ein includepfad in den Projekteigenschaften setzen jedoch erkennt er beim Durchlauf der io.h viele Defines nicht :

1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(121) : error C2061: Syntaxfehler: Bezeichner '__attribute__'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(159) : error C2061: Syntaxfehler: Bezeichner 'int_least8_t'

Ich habe die Pfade
include\
und
include\avr

eingebunden.
Woanders können diese Defines doch garnicht stehen?!

Eisenman
11.12.2008, 21:52
öhm.. weis das denn niemand? wie macht ihr es sonst? Doch nicht alle AVR-Header manuell ins Projektverzeichnis kopieren.

DerMaddin
12.12.2008, 08:14
Ich hab mit -I<Path> die Includeverzeichnisse in die Kompilerkommandozeile integriert. Lies mal die Doku zum GCC

Phantomix
12.12.2008, 08:21
Der erste AVR den ich zum laufen brachte, lief 3 Minuten, danach hatte ich in ponyprog die fusebits verstellt ;-) Das zu dem Thema. Aber du hast recht, es ist komfortabler als sich das zeug zusammenzurechnen und byteweise übergeben zu müssen.
Der Controller lebt übrigens wieder, hab einen zweiten AVR als Taktquelle missbraucht (portpin dauernd getoggelt und das dann an XTAL1 hehe)

Eisenman
12.12.2008, 20:37
@Maddin
die zusätzlichen Include-Paths nützen irgendwie nichts, denn der Fehler tritt VOR dem kompilieren auf (habe die compile.bat mal umbenannt, da was das gleiche Problem):


1>Die Zwischen- und Ausgabedateien für das Projekt "main" mit der Konfiguration "Release|Win32" werden gelöscht.
1>Cleaning folder d:\proj\main\main\Output\Release
1>Kompilieren...
1>motor.c
1>lcd.c
1>Kompilieren...
1>Main.c
1>Hinweis: Einlesen der Datei: D:\proj\main\main\BuildTools\WinAVR\avr\include\av r\io.h
1>Hinweis: Einlesen der Datei: D:\proj\main\main\BuildTools\WinAVR\avr\include\av r/sfr_defs.h
1>Hinweis: Einlesen der Datei: D:\proj\main\main\BuildTools\WinAVR\avr\include\in ttypes.h
1>Hinweis: Einlesen der Datei: D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(121) : error C2061: Syntaxfehler: Bezeichner '__attribute__'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(121) : error C2059: Syntaxfehler: ';'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(122) : error C2061: Syntaxfehler: Bezeichner '__attribute__'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(122) : error C2059: Syntaxfehler: ';'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(122) : error C2059: Syntaxfehler: 'Typ'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(123) : error C2061: Syntaxfehler: Bezeichner '__attribute__'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(123) : error C2059: Syntaxfehler: ';'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(123) : error C2059: Syntaxfehler: 'Typ'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(124) : error C2061: Syntaxfehler: Bezeichner '__attribute__'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(124) : error C2059: Syntaxfehler: ';'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(124) : error C2059: Syntaxfehler: 'Typ'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(125) : error C2061: Syntaxfehler: Bezeichner '__attribute__'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(125) : error C2059: Syntaxfehler: ';'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(125) : error C2059: Syntaxfehler: 'Typ'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(126) : error C2061: Syntaxfehler: Bezeichner '__attribute__'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(126) : error C2059: Syntaxfehler: ';'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(126) : error C2059: Syntaxfehler: 'Typ'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(128) : error C2061: Syntaxfehler: Bezeichner '__attribute__'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(128) : error C2059: Syntaxfehler: ';'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(128) : error C2059: Syntaxfehler: 'Typ'
1>D:\proj\main\main\BuildTools\WinAVR\avr\include\st dint.h(129) : error C2061: Syntaxfehler: Bezeichner '__attribute__'


Widerum steht hier im log "Komoilieren" zuerst, was aber nicht stimmt.

Ich versteh nicht warum das Problem keiner weiter hat.


Kann man das Studio denn nicht einfach mit einem generierten Makefile von AVRStudio füttern? Evtl geht das einfacher.. :-(

TheBigK
29.05.2009, 16:55
Nach dem ich es absolut nicht geschafft habe, ein funktionierendes Projekt nach Maddins Anleitung zu erstellen (selbst sein hier eingestelltes Projekt funktioniert bei mir nicht!), habe ich mir gedacht das muss doch einfacher gehen. So habe ich die Jungs von Google noch einmal auf die Suche geschickt und siehe da, es geht noch einfacher!

Vorraussetzung: Visual Studio 2008 Professional (ob auch die Standard Version reicht weiß ich nicht, die Express Version von 2005 soll auch gehen)

Wies geht steht hier: http://hubbard.engr.scu.edu/embedded/avr/msvc_make/msvc_make.html

Man braucht nur ein Makefile Projekt erstellen, das Makefile in die Projektmappe kopieren und fertig!
So kann man Visula Studio so nutzen wie WinAVR.

Nur für die Übertragung auf den AVR muss ich mir noch was überlegen. Momentan nutze ich noch WinAVR dazu.

Feldmaus001
07.07.2009, 10:13
genauso ist es @TheBigK!

DerMaddin hat sich zwar extrem viel arbeit gemacht, diese ist jedoch leider völlig überflüssig.

Man muss nämlich wirklich nur ein makefile Projekt erstellen und fertig...
Mit dem mitgeliferten Makefile-Tool von Winavr ist es kein Problem sich ein solches file zu bauen...

Ich dachte eigentlich bei Maddins Vorgehensweise wird auch der GCC Error Output in das Format vom Visual Studio konvertiert, so das man nach klicken auf den Error direkt zur Zeile springen kann...aber auch das funktioniert nicht.
Genauso wenig funktioniert das "IntelliSense". Denn ich kann nicht auf die guten xMega Structuren zugreifen, die in WinAvr schon definiert worden sind..

Wenn jemand eine Lösung hat zu den beiden Problemen, bitte melden ;)

TheBigK
07.07.2009, 18:30
Für das Problem mit dem Error Output gibt es wohl eine Lösung:
Das Makefile muss so konfiguriert werden das es den fehler in folgendem Format ausgibt:
full_path_and_filename(line number) : errortext
Leider habe ich noch keine funktionierende Variante gefunden und kenne mich auch nicht so gut mit Makefiles aus.
Gibt es jemanden der das Makefile so konfigurieren kann?

Intelli Sense funktioniert wohl nicht so richtig weil abhängig vom verwndeten µC unterschiedliche Headerdateien eingebunden und unterschiedliche Makros und Funktionen definiert werden. Somit weiß Intelli Sense nicht welche Funktionen und Makros zur verfügung stehen. Dies ist erst bei Compilieren bekannt, da der Controlertyp im Makefile definiert ist. Ich habe noch nicht versucht Intelli Sense zu überlisten, es könnte aber möglich sein.

Current
15.08.2009, 14:05
Hallo,

erstmal danke, für das gute Tutorial. Ich habe es nun soweit geschafft, das ich aus meiner main.c mit der minimalen funktionalität eine Hexdatei erzeugen kann.
Ich möchte vs nun für meinen RP6 nutzen, wie muss ich die mitgelieferten Libarys des RP6 einbinden?
Kann man statt Ponyprog auch den Bootloader des RP6 in vs einbinden? Wenn nicht, was muss ich ändern um ponyprob wieder komplett aus der routine zu entfernen, so das mir nur die fertige .hex erzeugt wird?

MfG


EDIT:
Also das mit den PonyProg hab ich hinbekommen um den Bootloader kümmern wir uns später ;)
Zu dem Includen, habe jetzt alle RP6 Libs in das Include Verzeichnis von WinAVR gepackt, nach dem Compilieren gibts auch keine Fehler, jedoch wird mir kein hexfile erzeugt. Wenn ich die neue "LinkThemAll" benutze kommt ein Fenster: "LinkThemAll hat ein Problem festgestellt und muss beendet werden."...
Bei der alten version kommt dieses Fenster nicht, jedoch wird mir auch da kein hexfile erzeugt.