µController und eigenes Programm
-
Servus Leute,
Um mein Projektarbeit fürs Studium fertig zu machen, muss ich mein selbstgeschriebenes Programm in Builder C++ mit AVR (ATMEL) µControler verbinden.
Mein Programm gibt am Ende einen C-Code heraus. Diesen Code versteht meinen AVR Controller über den Compiler GCC (http://gcc.gnu.org/).
Meine Frage ist, wie binde ich diesen Compiler in mein Programm ein, damit ich einen µController programmieren kann?Bisher habe ich den Test des C-Codes, welchen mir mein Programm ausgibt, immer über AVRStudio und GCC Compiler gemacht. Sprich ich habe den Code kopiert, ein Neues Projkt in AVRStudio angelegt und µController programmiert.
Aber der Prof. verlangt, dass wir das direkt über das Programm tun müssen.Ich habe eigentlich schon viel gegoogelt. Und einiges gefunden, was mir aber überhaupt nicht geholfen hat!!
Hat jemand vielleicht Vorschläge?? Oder diverse Links?? Oder am besten ein Beispiel Programm?
Gruß
-
ich würde ganz normal avr-gcc mit system() aufrufen um das kompilieren abzuwickeln, ggf mit setenv() (http://www.gnu.org/software/libc/manual/html_node/Environment-Access.html#Environment-Access) benötigte umgebungsvariablen setzen (bin mir nicht sicher ob das unter windows auch so geht). nach dem kompilieren genauso system() und z.B. avrdude programmieren. oder eine makefile generieren und dann mit system() make <target> aufrufen.
das z.B. wäre eine makefile eines projektes von mir, in der make avrdude zum flashen aufruft:DEVICE = atmega32 AVRDUDE = avrdude -c stk500pp -p $(DEVICE) -P /dev/ttyS0 COMPILE = avr-gcc -Wall -O3 -I. -mmcu=$(DEVICE) OBJECTS = usbdrv.o usbdrvasm.o main.o all: main.hex .c.o: $(COMPILE) -c $< -o $@ .S.o: $(COMPILE) -x assembler-with-cpp -c $< -o $@ .c.s: $(COMPILE) -S $< -o $@ flash: all $(AVRDUDE) -U flash:w:main.hex:i fuses: $(AVRDUDE) -U hfuse:w:0xc9:m -U lfuse:w:0x9f:m clean: rm -f main.hex main.lst main.obj main.cof main.list main.map main.eep.hex main.bin *.o main.s usbdrv.s main.bin: $(OBJECTS) $(COMPILE) -o main.bin $(OBJECTS) main.hex: main.bin rm -f main.hex main.eep.hex avr-objcopy -j .text -j .data -O ihex main.bin main.hex ./checksize.sh main.bin disasm: main.bin avr-objdump -d main.bin cpp: $(COMPILE) -E main.c
-
Hallo,
hw_sw schrieb:
Bisher habe ich den Test des C-Codes, welchen mir mein Programm ausgibt, immer über AVRStudio und GCC Compiler gemacht. Sprich ich habe den Code kopiert, ein Neues Projkt in AVRStudio angelegt und µController programmiert.
Aber der Prof. verlangt, dass wir das direkt über das Programm tun müssen.Kannst du das nicht so schrittweise einbauen, wie du es per Hand gemacht hast? So hast du schonmal eine Gliederung und kannst zu den Teilbereichen viel besser Fragen stellen. Also Datei öffnen und auslesen, dann Compiler öffnen und starten - so in Teilschritten.
Eine Datei zu öffnen und den Inhalt zu kopieren sollte einfach sein, damit wäre dann der Anfang gemacht. Du kannst auch zusätzlich ein großes Eingabefeld in deine C++Anwendung einbauen und da den C-Code als Text eingeben / ausgeben lassen.
Den Controller zu programmieren sollte auch kein Ding sein, einfach über USB/COM die Initialisierung machen und dann den compilierten Code rüberschieben. Ist doch einfach nur eine serielle Datenübertragung. Das Hauptproblem würde ich bei diesem Schritt darin sehen, herauszufinden wie die IAP-Sequenz abzulaufen hat.
Insgesamt sähe ich da die Schwierigkeit, einfach den Compiler an sich einzubinden. Aber da kann dir die Community bestimmt helfen.
-
@Kolumbus
Das habe ich mir auch überlegt! Aber mit AVRStudio hast du überhaupt kein Anblick wie es wirklich funktioniet, daher muss man da anders vorgehen. Zmindesten denke ich das so!@sothis_
ist es so kompleziert oder bin ich einfach naja!

Kann man da irgend wo ein Beispiel einsehen oder so?
Weil

Spätestens jetzt habe ich noch mehr Fragen?

Irgendwo habe ich gelesen, dass es vorteilhaft wäre zu vertsehen auf AVRStudio zu verzichten und zu lernen, wie man mit WinAvr ohne AVRStudio
umgeht. Gibt es irgend wo dafür Anleitungen.

Ich habe folgende Aussage aus einem Forum gefunden:
system() sollte man uebrigens eher nicht nehmen, um fremde Programme aufzurufen. Das kann boese Sicherheitsluecken oeffnen, ist oft sehr langsam und bietet keine Features wie direktes Einlesen der Standard-Ausgabe des aufgerufenen Programms. Besser ist es, betriebssystemspezifische Funktionen zu nehmen.Was meinen Sie dazu?

-
hw_sw schrieb:
@sothis_
ist es so kompleziert oder bin ich einfach naja!

es sieht nur kompliziert aus

hw_sw schrieb:
Kann man da irgend wo ein Beispiel einsehen oder so?
Weilich hab dir doch eins gegeben, wenns auch nur ein makefile ist

hw_sw schrieb:
Spätestens jetzt habe ich noch mehr Fragen?
Irgendwo habe ich gelesen, dass es vorteilhaft wäre zu vertsehen auf AVRStudio zu verzichten und zu lernen, wie man mit WinAvr ohne AVRStudio
umgeht. Gibt es irgend wo dafür Anleitungen.Ich habe folgende Aussage aus einem Forum gefunden:
system() sollte man uebrigens eher nicht nehmen, um fremde Programme aufzurufen. Das kann boese Sicherheitsluecken oeffnen, ist oft sehr langsam und bietet keine Features wie direktes Einlesen der Standard-Ausgabe des aufgerufenen Programms. Besser ist es, betriebssystemspezifische Funktionen zu nehmen.Was meinen Sie dazu?
wenn derjenige nicht genauer argumentieren kann, würde ich persönlich erstmal nicht viel drauf geben

Das kann boese Sicherheitsluecken oeffnen, ist oft sehr
langsam und bietet keine Features wie direktes Einlesen der
Standard-Ausgabe des aufgerufenen Programms.selbst wenn dem so ist, ist das für dich relevant? wenn ja, dann musst du halt unter windows CreateProcess() benutzen (http://msdn2.microsoft.com/en-us/library/ms682425.aspx)
hw_sw schrieb:
Irgendwo habe ich gelesen, dass es vorteilhaft wäre zu vertsehen auf AVRStudio zu verzichten und zu lernen, wie man mit WinAvr ohne AVRStudio
umgeht. Gibt es irgend wo dafür Anleitungenin der tat. bevor du noch nicht ein programm erfolgreich via kommandozeile mit avr-gcc kompiliert hast und selbiges mit avrdude, uisp oder was auch immer geflashed hast, kannst du auch nicht wissen, wie man dies aus einem eigenen programm bewerkstelligt. also probier dich erstmal daran
wenn diese abläufe sitzen, dann ist es ein einfaches, dies zu automatisieren 
-
Verstehe ich das Richtig?
Ich habe jetzt was drüber auf der folgenden Seite gelesen:
http://www.roboternetz.de/wissen/index.php/Avr-gccDieser Makefile von dir beihaltet alle Befehle, die für kompelieren und flaschen nötig sind. Den startest du über system() in deinem Programm.
Aber du benutzt AVRDUDE zu flaschen nicht dein eigenes Programm oder??
-
hw_sw schrieb:
richtig, da steht alles, was man braucht

hw_sw schrieb:
Dieser Makefile von dir beihaltet alle Befehle, die für kompelieren und flaschen nötig sind. Den startest du über system() in deinem Programm.
Aber du benutzt AVRDUDE zu flaschen nicht dein eigenes Programm oder??richtig avrdude, man muss es ja wohl nicht übertreiben und alles selbst machen, lol
AVRDUDE = avrdude -c stk500pp -p $(DEVICE) -P /dev/ttyS0
ist die eigentliche befehlszeile. ein
make flashin meinem beispiel würde make veranlassen folgendes auszuführen:
avrdude -c stk500pp -p atmega32 -P /dev/ttyS0 -U flash:w:main.hex:ihier wird also main.hex geflashed. dies ist natürlich jetzt ein beispiel für linux. welche kommandozeilenoptionen für windows nötig sind (insbesondere die angabe der schnittstelle, an der der programmer angeschlossen ist) musst du mal in der dokumentation nachlesen
