PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bin zu doof für WinAVR...



grind
19.09.2004, 22:22
Hi,
also ich hab grade meinen Controller fertig aufgebaut (Mega8) und jetz versucht mit WinAVR in C das teil zu programmieren. Ich will nur das eine Diode die an PB0 hängt zu blinken beginnt.

Also wie kann ich meinen Sourcecode in eine Controller verständliche datei compilieren? Das geht doch mit WinAVR oder täusche ich mich da?

Danke schonmal
Grind

20.09.2004, 06:56
Bei der aktuellen Version:
- C-Datei im Programmers Notepad Öffnen
- dann Makefile anpassen
- dann bei Tools --> make all klicken
- dann liegt die hex-Datei in deinem Verzeichnis
- die kannst du dann mit avrdude per Tools --> program in den MC laden

Lies der mal die entsprechenden Tutorials und Webseite in der Linksammlung bzw. die Artikel dieser Webseite zu dem Thema durch, dann hätte sich auch diese Frage erledigt gehabt.

PS: Und vergiss nicht die Fusebits anzupassen.

grind
20.09.2004, 13:54
also ich hab jetz das WinAVR Tutorial vom Kreativen-Chaos durchgemacht. Das thema das mich interessiert wird da nich wirklich besprochen.

ok ich habs trotzdem ein bisschen weiter geschafft...

ich bekomm wenn ich in WinAVR Makeall ausführe bekomme ich folgende Meldung:

> "make.exe" all

-------- begin --------
avr-gcc (GCC) 3.4.1
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

make.exe: *** No rule to make target `Blinker.o', needed by `Blinker.elf'. Stop.

> Process Exit Code: 2


was bedeutet das bzw. was is da falsch eingestellt? oder ist des ein code fehler?

Danke
Grind

muraad
20.09.2004, 15:44
Du musst das Makefile mit einem Editor an den Namen deiner Sourcecode Datei anpassen und du musst dich mit Programmers Notepad in dem Ordner mit den Headerdateien, Makefile usw. befinden.
Notfalls einfach Datei nochmal speichern und dann make all ausführen.
Gruß Muraad

bandit
20.09.2004, 15:50
Ich kenne mich nicht mit WINAVR nicht aus aber koenntest du die komplette Ausgabe des makes posten, dann koennte ich vielleicht weiterhelfen.

Es sieht so aus als haette dein Makefile keinen Eintrag fuer Blinker.o was durch kompilieren von Blinker.c generiert wird.


Der Eintrag muesste in etwa so aussehn

Blinker.o: Blinker.c
usw....

Kjion
20.09.2004, 17:35
Hi,

ich vermutet mal das du dein Quelltextdatei "blinker.c" genannt hast. Dann musst du das auch im Makefile einstellen. Dazu einfach in der Datei "Makefile" bei dem Punkt
TARGET = main
durch

TARGET = blinker ersetzen

Ich werd das im Tutorial mal ergänzen.

MfG Kjion

grind
20.09.2004, 18:46
ach verdammt war wirklich ein sau blöder fehler... hatte die source datei nich im selben ordner wie das projekt und das makefile...

also jetz hab ich aber ein anderes problem.

Source:

#include <avr/io.h> //Zugriff auf IO's des Controllers
#include <simple_delayroutinen.c>

int main (void) {
DDRB = 0xff; //PB0...PB7 als Ausgänge definieren
for (;;) { //Endlosschleife
PORTB = 0x00; //LEDs leuchten
delay_ms (750); //warte
PORTB = 0xff; //LEDs aus
delay_ms (750);
}}

Fehler:

> "make.exe" all

-------- begin --------
avr-gcc (GCC) 3.4.1
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling: blinker.c
avr-gcc -c -mmcu=atmega8 -I. -gstabs -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=blinker.lst -std=gnu99 -Wp,-M,-MP,-MT,blinker.o,-MF,.dep/blinker.o.d blinker.c -o blinker.o
blinker.c:2:34: simple_delayroutinen.c: No such file or directory
blinker.c: In function `main':
blinker.c:8: warning: implicit declaration of function `delay_ms'
make.exe: *** [blinker.o] Error 1

> Process Exit Code: 2

Hoffe das war jetz nich zuviel text ich weiss nicht wie man so ein code fenster einfügt...

( Ich habs mal geändert, schaus dir mal im Edit Fenster an, Kjion )

20.09.2004, 20:06
Was soll die 'simple_delayroutinen.c' hier bewirken?

Die Fehlermeldungen sagen Dir doch eigentlich hier alles:
-'simple_delayroutinen.c' nicht gefunden
-'delay_ms' verwenden einer unbekannten Deklaration
Ich beginne auch gerade damit mich in C hineinzufuchsen. Jedoch verwende ich für Verzögerungen die 'delay.h'

bandit
20.09.2004, 20:48
In C werden Includes benutzt um die jeweiligen Funktions-Prototypen fuer den Preprozessor des Compilers zu definieren damit der Compiler die richtigen Symbole anlegt um die jeweiligen Funktionen aufzurufen. Die Funktionen an sich sind in den verschiedenen Source-Dateien (.c) festgelegt.


Bis denne

grind
20.09.2004, 21:17
ja mein problem is ich kann noch kein C und jetz gehts mir erstmal nur darum den controller zu testen ob der funktioniert. hab den source so wie der is auf der page gefunden. weiss einer wo ich nen funktionierenden code bekomme oder kann mir schnell einer was schreiben?

mitm C lernen fang ich an sobald der controller funktioniert. das is mir grad wichtiger...

danke schonmal vielmals!
Grind

21.09.2004, 07:51
#include "simple_delayroutinen.c"

Wenn die C-Datei und deine blinker.c im selben Verzeichnis liegen, wenn du das Compilieren startest, dann dürfte keine Fehlermeldung kommen.
Gib mal ne Info dazu! Makefile Anpassungen sind dafür nicht nötig, gesetzt dem Fall du verwendest bspw. das bei WinAVR mitgelieferte Beispielmakefile.

Kjion
21.09.2004, 12:06
Makefile Anpassungen sind dafür nicht nötig, gesetzt dem Fall du verwendest bspw. das bei WinAVR mitgelieferte Beispielmakefile.

Doch. Es muss dem Compiler mitgeteilt werden das er noch die Datei "simple_delayroutinen.c" verwenden soll. Man müsste das Makefile also folgendermaßen ergänzen:

# Target file name (without extension).
TARGET = blinker

# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c simple_delayroutinen.c
Alle weiteren .c-Dateien einfach da eintragen....

MfG Kjion

21.09.2004, 12:15
Tja, dann ist es wohl immer Glück bei mir gewesen, dass es auch ohne diese Eintragungen im Makefile funktioniert hat. Das zerlegen der Bibliotheken in C-Dateien und H-Dateien musste ich erst anfangen, als diese auch untereinander aufeinander zugreifen sollten.
Ansonsten hat es immer auch so funktioniert.

grind
21.09.2004, 14:10
ok hab jetz die simple_delayroutinen.c (die hatte ich garnich am rechner ;) )

jetzt kommt aber immernoch:
avr-gcc -c -mmcu=atmega8 -I. -gstabs -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=blinker.lst -std=gnu99 -Wp,-M,-MP,-MT,blinker.o,-MF,.dep/blinker.o.d blinker.c -o blinker.o
make.exe: *** No rule to make target `SRC', needed by `blinker.elf'. Stop.

wie bekomm ich das weg?!

MfG
Grind

Kjion
21.09.2004, 14:22
Poste doch mal den gesamten Quellcode den du benutzt ( auch das Makefile )...

MfG Kjion

bandit
21.09.2004, 14:35
ok hab jetz die simple_delayroutinen.c (die hatte ich garnich am rechner ;) )

jetzt kommt aber immernoch:
avr-gcc -c -mmcu=atmega8 -I. -gstabs -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=blinker.lst -std=gnu99 -Wp,-M,-MP,-MT,blinker.o,-MF,.dep/blinker.o.d blinker.c -o blinker.o
make.exe: *** No rule to make target `SRC', needed by `blinker.elf'. Stop.

wie bekomm ich das weg?!

MfG
Grind

Das sieht so aus wie wenn ein $ vor dem SRC im Makefile fehlt. Ich kenne das Makefile nicht aber oft wird SRC als Variable im Makefile benutzt um die jeweilige Quelldatei anzugeben. Um den
Wert der Variable im Makefile zu bekommen muss dann ein $SRC benutzt werden

grind
21.09.2004, 14:48
MakeFile (nur mal die wichtigsten Zeilen):

# MCU name
MCU = atmega8

# Output format. (can be srec, ihex, binary)
FORMAT = ihex

# Target file name (without extension).
TARGET = blinker


# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c simple_delayroutinen.c


Source:

#include <avr/io.h> //Zugriff auf IO's des Controllers
#include <simple_delayroutinen.c>

int main (void) {
DDRB = 0xff; //PB0...PB7 als Ausgänge definieren
for (;;) { //Endlosschleife
PORTB = 0x00; //LEDs leuchten
delay_ms (750); //warte
PORTB = 0xff; //LEDs aus
delay_ms (750);
}}


Fehler:

> "make.exe" all

-------- begin --------
avr-gcc (GCC) 3.4.1
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Linking: blinker.elf
avr-gcc -mmcu=atmega8 -I. -gstabs -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=blinker.o -std=gnu99 -Wp,-M,-MP,-MT,blinker.o,-MF,.dep/blinker.elf.d blinker.o simple_delayroutinen.o --output blinker.elf -Wl,-Map=blinker.map,--cref -lm
simple_delayroutinen.o(.text+0x0): In function `delay_us':
simple_delayroutinen.c:9: multiple definition of `delay_us'
blinker.o(.text+0x0):./simple_delayroutinen.c:9: first defined here
simple_delayroutinen.o(.text+0xa): In function `delay_ms':
simple_delayroutinen.c:14: multiple definition of `delay_ms'
blinker.o(.text+0xa):./simple_delayroutinen.c:14: first defined here
make.exe: *** [blinker.elf] Error 1

> Process Exit Code: 2



Oh man ich muss schon sagen ihr seid mächtig geduldig mir da so durch zu helfen ;) danke auf jeden fall viellmals!

Grind

grind
21.09.2004, 14:50
was mir grad einfällt ich include die io.h ausm AVR verzeichnis aber in meinem projekt ordner gibts kein verzeichnis das avr heisst... weiss der wo er die datei findet?!

hab jetzt auf jeden fall auf die io.h verwiesen wo sie wirklich ist.

Kjion
21.09.2004, 15:02
Die "io.h" lädt er aus dem Standartverzeichniss des Compilers, da wo auch die ganzen anderen Bibiliotheken liegen. Das "#include <avr/io.h>" stimmt also schon und sollte auch so gelassen werden...

Deshalb solltest du auch --> #include "simple_delayroutinen.c" ( mit Anführungszeichen ) schreiben, da der Compiler dann zuerst in deinem Projektverzeichniss sucht.

So wie es aussieht liegt der Fehler in der simple_delayroutinen.c. Von daher meinte ich ja auch allen Quellcode, also auch den davon ;-) Du solltest übrigens den Code Tag ( [ code ] bzw. [ /code ], nur halt zusammengeschrieben ) benutzen.


Oh man ich muss schon sagen ihr seid mächtig geduldig mir da so durch zu helfen ;) danke auf jeden fall viellmals!
kein Problem ;-)

MfG Kjion

grind
21.09.2004, 15:48
also wenn ich das simple_delayroutine in anführungszeichen schreibe ändert sich der fehler!

jetzt:


> "make.exe" all

-------- begin --------
avr-gcc (GCC) 3.4.1
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

make.exe: *** No rule to make target `"simple_delayroutinen.c"', needed by `blinker.elf'. Stop.

> Process Exit Code: 2


und hier der inhalt der datei:


/************************************************** *********
Simple Delayroutinen für den Atmega 8
- empfohlene Taktfrequenz ist 4 MHz
- prinzipiell ist die Verwendung der integrierten Timer
eine wesentlich bessere, genauere und elegantere Lsg.
************************************************** *********/
void delay_us(unsigned short us) {
while ( us ) us--;}
void delay_ms(unsigned short ms) {
unsigned short outer1, outer2;
outer1 = 200; while (outer1) {
outer2 = 500; while (outer2) {
while ( ms ) ms--;
outer2--;
} outer1--; }}


also die simple_delayroutinen.c is ja auch nur von ner internetseite runtergeladen.

Grind

P.s. wusste bis grad eben nicht wie man so ne "Code-Box" erstellt danke dafür ;)

Kjion
21.09.2004, 16:09
Sorry hatte irgendwie nicht aufgepasst. Mach mal folgendes:

1. Erstell eine Datei "simple_delayroutinen.h"
2. Da schreibst du folgendes rein:

extern void delay_us(unsigned short us);
extern void delay_ms(unsigned short ms);
3. In die Datei "simple_delayroutinen.c":

/************************************************** *********
Simple Delayroutinen für den Atmega 8
- empfohlene Taktfrequenz ist 4 MHz
- prinzipiell ist die Verwendung der integrierten Timer
eine wesentlich bessere, genauere und elegantere Lsg.
************************************************** *********/

#include "simple_delayroutinen.h"

void delay_us(unsigned short us) {
while ( us ) us--;}
void delay_ms(unsigned short ms) {
unsigned short outer1, outer2;
outer1 = 200; while (outer1) {
outer2 = 500; while (outer2) {
while ( ms ) ms--;
outer2--;
} outer1--; }}
4. In deiner Hauptdatei "blinker.c" schreibst du statt
#include "simple_delayroutinen.c" -
#include "simple_delayroutinen.h"

MfG Kjion

21.09.2004, 16:34
Irgendwie begreife ich nicht, was du machst ?!

Habe jetzt mal aus Langeweile die C-Datei (simple_delay...) und deine Main-Datei durch den Kompiler gejagt und es kommt kein Fehler. Habe das Makefile von der besagten Homepage lediglich in der Zeile "TARGET = main" angepasst.
Keine Ahnung, wo du noch in den Einstellungen rumgepfuscht hast.

grind
21.09.2004, 17:51
ja gast das weiss ich doch selber nich hab grad nochmal alles neu gemacht und es kommen die selben fehler! :(

sagmal kannst du das ganze für nen mega8 einfach compilieren und mir dann die *.hex datei schicken bitte?! wär wirklich ne feine sache! dann muss ich euch mit dem thema auch nichtmehr belästigen ;)

wenn dus mir schicken willst/kannst meine e-mail is: grind@gmx.de

danke schonmal

Grind

21.09.2004, 19:42
Hab ich gemacht :-)

grind
21.09.2004, 20:08
war grad schon verwirrt wer mir da datein schickt ;)

ja also ich werds dann heut noch testen aber vielen dank erstmal!

MfG
Grind

grind
21.09.2004, 21:12
AHHHHHH ich flip aus!!! ;)

nee also danke auf jeden fall für die files hab nur ein neues problem... wär ja auch mal zu schön...

also wenn ich mit pony prog das file auf meinen MC spielen will dann bringt er mir 2 fehler:

"device missing or unknown device (-24)"

nach einem klick auf ignore schreibt er dann verifiziert er und dann

"write failed"

verdammt woran kann das schon wieder liegen???
also den inhalt ausm controller kann ich lesen aber da stehen nur lauter FF drinnen naja is ja noch ganz neu da sollte das normal sein?! ich denke das ich mich nicht verlötet habe...

Grind

22.09.2004, 07:44
Was hast du für einen Programmer?

Im Makefile ist eigentlich alles für eine Programmierung per avrdude eingestellt.

So muss man kein externes Programm benutzen.

Hast du die Fuse-Bits korrekt eingestellt?

Erkennt Pony dabei den MC?

grind
22.09.2004, 12:28
also mein programmer is ein STK200 kompatibler eigenbau.
wie komm ich denn in des avrdude rein?
und mein pony bringt halt den spruch: "device missing or unknown device (-24)"
aber wenn man dann ignore klickt gehts eigentlich also zumindest des auslesen funktioniert dann
und was zum teufel sind fuse-bits?!

Grind

22.09.2004, 16:29
Lies dir die verlinkten Tutorials durch. Dir alles von Anfang an herzubeten habe ich keine Lust.
mikrocontroller.net
mc-project.de
usw.
Dafür gibt es diese Seiten.

22.09.2004, 18:20
grind, wenn du soviel Probleme mit C hast, dann fang doch einfach erst mal mit Bascom Basic an. Da gibt es auch Bücher dazu

grind
22.09.2004, 18:41
was hat denn das problem das ich mein program nich aufn controller bekomme mit C zu tun??? versteh ich net!

ich möchte nur kontrollieren ob der MC funktioniert aber momentan schauts nich so aus und ich hab keine ahnung obs an soft oder hardware liegt! all diese tutorials bringen mir garnichts wenn der MC im ar*** is aber woher soll ich dass wissen wenn ich von der materie noch nicht soviel ahnung hab?!

Grind

22.09.2004, 19:16
Dann lies dir die Dinger mal durch, dann wirst du auch sehen, was die bringen. Solange du nicht mal halbwegs begreifst, was du eigentlich machen möchtest hat es doch keinen Sinn. Deshalb die Frage nach den Fusebits. Die haben nen Teufel mit der Software zu tun. Wenn du diese aber einstellen kannst, stimmt zumindest die Hardware.
Ausserdem haben schon genug Leute (die vielleicht etwas mehr Geduld und Eigeninitiative hatten) mit Hilfe dieser Tutorials den Einstieg geschafft.