Forum: Compiler & IDEs "avr-objcopy: 'xxx.elf': No such file" Was mache ich falsch


von C. S. (dummi)


Lesenswert?

Hallo zusammen

Ich arbeite mit AVR-Studio und versuche ein C-Programm auf mein 
MK2-Board zu flashen.

Bei build kommt folgende Fehlermeldung:

avr-objcopy: 'xxx.elf': No such file
make: *** [xxx.hex] Error 1
Build failed with 1 errors and 0 warnings...


Kann mir jemand sagen was ich falsch mache, oder vergessen habe.

Vielen Dank im voraus.

von Klaus W. (mfgkw)


Lesenswert?

Gibt es bei dir einen Quelltext, der xxx.c oder so ähnlich heißt?

Ohen mehr Info wird man kaum helfen können: Welche Dateien, wie sieht 
das Makefile aus...

von Christian G. (christian_g83)


Lesenswert?

C. Schneisgen schrieb:

> Kann mir jemand sagen was ich falsch mache, oder vergessen habe.

Zeig mal das Makefile.

Christian

von C. S. (dummi)


Lesenswert?

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <avr\io.h>
#include <util\delay.h>
#include <string.h>
#define F_CPU 3686400

/////////////////////////////////////
//Display Initialisierung//
/////////////////////////////////////

void wait_ms(int miliSec)
{
  _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec;  //4 Zyklen Warteschleife 
= 1ms
}
void wait_us(int mikroSec)
{
  _delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec  // 4 Zyklen = 1µs
}

void lcd_init()
{
  DDRD=0xff;    //PORTD als Ausgang
  PORTD=0;

  wait_ms(50);    //Warten bis Controller bereit

  PORTD=0x20;  //Umschalten auf 4-Bit-Modus

  sbi(PORTD,3)  ;  //Schreibsignal enable Impuls
  cbi(PORTD,3);

  wait_ms(5);    //Zeit zum Umschalten lassen

  lcd_cmd(0x28);  //Ab hier 4-Bit Modus: 2 Zeilen, 5x7 Matrix
  lcd_off();
  lcd_clear();

  lcd_cmd(0x06);  //Eingabe Modus
  lcd_on();
}

void lcd_send(char data)
{
  char rs=PORTD;  //aktuelles RS ermitteln
  rs&=4;

  char tmp=data;  //oberen Teil senden
  tmp&=0xf0;
  tmp|=rs;
  PORTD=tmp;

  sbi(PORTD,3);  //Schreibsignal
  cbi(PORTD,3);

  tmp=data;    //unteren Teil senden
  tmp&=0x0f;
  tmp*=16
  tmp|=rs;
  PORTD=tmp;

  sbi(PORTD,3);  //Schreibsignal
  cbi(PORTD,3);

  wait_ms(1);    //verarbeiten lassen
}

void lcd_cmd(char cmd)
{
  cbi(PORTD,2);  //RS löschen = Kommando folgt
  lcd_send(cmd);  //senden
}

void lcd_clear()
{
  lcd_cmd(0x01);  //löscht die Anzeige im Display
  wait_ms(2);
}

void lcd_home()
{
  lcd_cmd(0x02);  //setzt Cursor auf Position 1,1
  wait_ms(2);
}

void lcd_on()
{
  lcd_cmd(0x0E);  //schaltet LCD an
}

void lcd_off()
{
  lcd_cmd(0x08);  //schaltet LCD aus
}

void lcd_goto(int row, int col)
{
  row--;      //Null basierend
  row&=0x01;    //sicherheitshalber
  row*=40;    //Zeile nach BIT 6 bringen
  col--;      //Null basierend
  col&=0x0f;    //sicherheitshalber
  char tmp=row|col;  //Adresse bilden
  tmp|=0x80;    //Cursor setzen
  lcd_cmd(tmp);  //senden
}

//Display an/aus und Dimmer nicht programmiert

//ab hier Schreibbefehle

void lcd_write (char text)  //Sendet ein Zeichen
{
  sbi(PORTD,2);  //RS setzen = Daten
  lcd_send(text);  //senden
}

void lcd_write(char* pText)  //Sendet Zeichenkette, diese muss mit 0x00 
abschließen
{
  while(pText[0]!=0)
  {
    lcd_write(pText[0]);
    pText++;
  }
}

void lcd_write(char* pText, int Count)  //Sendet eine Zeichenkette mit 
Zähler
{
  while(count!=0)
  {
    lcd_write(pText[0]);
    pText++;
    count--;
  }
}

///////////////////////////////////////
//Display Test-Programm//
///////////////////////////////////////

int main (void)
{
  char d=0;
  wait_ms(200);
  lcd_init();
  while (1)  //Hauptschleife
  {
    lcd_write("Hallo");
    wait_ms(100);
  }
return 0;
}

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

C. Schneisgen schrieb:
> #include <stdio.h>

Erstens ist das kein Makefile - wie gewünscht - sondern Dein 
C-Quelltext.

> #include <avr\io.h>
> #include <util\delay.h>

Zweitens benutzt man Slashes, also  <avr/io.h> statt Backslashes.

>   _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec;  //4 Zyklen Warteschleife
> = 1ms

Drittens multiplizierst du das Ergebnis von _delay_loop_2() mit 
millisSec - das ist bestimmt nicht das, was Du willst. Was sagt denn 
Dein Compiler zu dieser Zeile?

Viertens solltest Du den Code in
[ c ]
Code...
[ /c ]

(ohne die Blanks in den Klammern) einschließen, damit der Source lesbar 
und vor Umbrüchen geschützt ist.

Also, was hier gefragt war, war der Inhalt der Datei "Makefile" in 
Deinem Projekt-Verzeichnis. Hilfreich wäre auch eine vollständige 
Angabe aller Fehlermeldungen, die Du bekommst.

Welches AVR Studio benutzt Du? 4, 5 oder 6?

Gruß,

Frank

von Klaus W. (mfgkw)


Lesenswert?

F_CPU muß vor #include <util\delay.h> kommen.

Übrigens ist das kein Makefile :-)

von Klaus W. (mfgkw)


Lesenswert?

Klaus Wachtler schrieb:
> F_CPU muß vor #include <util\delay.h> kommen.

hatte nicht weit genug gelesen...

Da du F_CPU nur selbst verwendest und nicht in den 
delay_...()-Funktionen, ist es natürlich egal.

Nur: warum nimmst du eigene Funktionen zum Warten? Z.B. _delay_ms ist 
fertig. Dann allerdings muß #define F_CPU vor dem #include kommen.

von HildeK (Gast)


Lesenswert?

C. Schneisgen schrieb:
> void lcd_write (char text)  //Sendet ein Zeichen

> void lcd_write(char* pText)  //Sendet Zeichenkette, diese muss mit 0x00

> void lcd_write(char* pText, int Count)  //Sendet eine Zeichenkette mit

Zum Beispiel: dreimal lcd_write mit drei verschiedenen Parametern und 
-typen. Das geht nicht!

Was du am dringendsten benötigst, ist eine C-Buch.

Kein Wunder, wenn der *.elf nicht erzeugt wird. Das passiert erst, wenn 
dein Quelltext vom Compiler als syntaktisch korrekt erkannt wird.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

HildeK schrieb:
> Zum Beispiel: dreimal lcd_write mit drei verschiedenen Parametern und
> -typen. Das geht nicht!

In C++ schon. ;-)

Er hat ja nirgends erwähnt, dass das C wäre …

von HildeK (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> In C++ schon. ;-)

Gut, du hast damit zielsicher festgestellt, dass ich von C++ keine 
Ahnung habe. Das ist auch so!
Und auch in C habe ich nicht (sehr) viel Übung. Aber der o.g. Code ist 
doch astreines C, oder doch nicht?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

HildeK schrieb:
> Aber der o.g. Code ist
> doch astreines C, oder doch nicht?

Ich würde sagen, er ist altertümliches (und fehlerhaftes) C, aber
astreines C++ (wenngleich natürlich ohne jegliche OO-Nutzung).

von HildeK (Gast)


Lesenswert?

Danke!
Ich werde bei nächster Gelegenheit das Thema mal mit meinem Sohn 
(Informatikstudent) diskutieren ...

von Volker Block (Gast)


Lesenswert?

mal lesen, hat mir geholfen. Einfach Toolchain installieren.
avr-toolchain-installer-3.4.2.1573-win32.win32.x86.exe
Winavr wird wohl nicht erkannt.
(da staunt der Laie, der ich bin. Benutze keine Make-Files, programmiere
alle paar Jahre mal, hab dann alles vergessen)

This seems to be something that the half-brains at Atmel have gone out 
of their way to ruin in Studio 4.19. Originally Studio had a mechanism 
where it would look for an find WinAVR if it was installed. Then Atmel 
started making a half-baked rip-off of WinAVR called "Toolchain" so they 
modified Studio so it would look for both (and annoyingly it found their 
crap in preference to WinAVR). It now appears in 4.19 (which is the 
latest) that they don't even try to look for WinAVR any more. This just 
shows how shorted sighted Atmel are. When you create a GCC project now 
you need to go to Project-Configuration Options then on the 5th tab 
("Custom options") set the path to avr-gcc to be /winavr/bin/avr-gcc.exe 
and the path to "make" to be /winavr/utils/bin/make.exe and THEN you 
should be able to build OK.

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.