Fehler AVR-Studio 4

OP #3008438
Lesenswert?

hallo,

ich habe eine Art Blitzer aufgebaut.
Jetzt hab ich nur Probleme mit der Programmierung meines Microcontroller 
(Atmega32).
Ich bin C Neuling und es handelt sich hier um ein Testprogramm.

Folgendes Programm:
1
//+----------------------------------------------------------------------+
2
//| Title         : Geschwindigkeitsmessung mit Display und Lichtbild    |
3
//+----------------------------------------------------------------------+
4
//| Funktion      : ...                                                  |
5
//| Schaltung     : ...                                                  |
6
//+----------------------------------------------------------------------+
7
//| Prozessor     : ATmega 32-16PU                                       |
8
//| Sprache       : C                                                    |
9
//| Datum         :                                            |
10
//| Version       :                                                      |
11
//| Autor         :                                        |
12
//+----------------------------------------------------------------------+
13

14

15
#include  <avr/io.h>
16
#include   <stdlib.h>
17
#include   <time.h>
18

19
#define   F_CPU 4000000  // clock in Hz
20
#include  <util/delay.h>
21

22

23
//====================================================================
24

25
int main;
26

27
{  DDRA = 0b11111111;     
28
  PORTA = 0b11111111;    //Port A als Ausgang setzten
29

30
  DDRB = 0b00000100;
31
  PORTB = 0b00000100;    //Ein- und Ausg‰nge f¸r Port B festlegen
32
  
33
  int l;          //Variablendeklaration
34
  int xv;        //Variablendeklaration
35
  int v;          //Variablendeklaration
36
  int bcd;        //Variablendeklaration
37
  
38
  while(true)                //Dauerschleife
39
  {
40
    long l = 0;              //Z‰hler
41

42
    if(PORTB == 0b00000001);        //Wenn Signal am Sensor 1
43
    {
44
      while(true)            //Dauerschleife
45
      {
46
        l++;              //Dann Z‰hler +1
47
        if(PORTB == 0b00000010);    //Wenn Signal am Sensor 2
48
        {
49
          xv = 1 / l;          //Geschwindigkeit in m/s
50
                
51
          v = xv * (18/5);          //Umrechnen in km/h
52

53
          bcd = ((v / 10) * 16) + (v % 10);   //dec to bcd
54

55
          PORTA = bcd;          //Ausgabe Port A
56

57
          if(v > 20);            //Wenn km/h grˆfler als 20
58
            {
59
              PORTB = 0b00000100;  //Dann high Kamera
60
            }
61

62
          _delay_s(10);          //10 sekunden warten
63

64
          break;            //Dauerschleife verlassen
65
        }
66
      }
67
    }
68
  }  
69
}
70

71
return 0;


Nun zeigt mir AVR-Studio folgenden fehler an, wenn ich Build:

mmcu=atmega128 -Wl,-Map=Geschwindigkeitsmessung.map 
Geschwindigkeitsmessung.o     -o Geschwindigkeitsmessung.elf
/usr/bin/sh: -Wl,-Map=Geschwindigkeitsmessung.map: command not found
make: [Geschwindigkeitsmessung.elf] Error 127 (ignored)
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature 
Geschwindigkeitsmessung.elf Geschwindigkeitsmessung.hex
avr-objcopy: 'Geschwindigkeitsmessung.elf': No such file
make: *** [Geschwindigkeitsmessung.hex] Error 1
Build failed with 1 errors and 0 warnings...



Leider kann ich mit dieser Meldung überhaupt nichts anfangen. Wäre super 
wenn mir da jemand weiter Helfen könnte.

Falls sich weitere Fehler im Programm befinden, würde ich mich freuen 
darauf hingewiesen zu werden.

Vielen Dank
Gast #3008452
Lesenswert?

Die Fehlermeldung hat nichts mit deinem Sourcecode zu tun, da klemmt was 
in der toolchain. Wenn das die ganze Ausgabe ist, so fehlt der Aufruf 
des Compilers.

AVR-Studio und WinAVR komplett deinstallieren, und nochmal alles neu 
installieren hilft manchmal.

Welche Windows-Version hast du?

Oliver
OP #3008504
Lesenswert?

Was haltet ihr allgemein von meinem Programm?
1
int main(void)
2

3
{  DDRA = 0b11111111;     
4
  PORTA = 0b11111111;    //Port A als Ausgang setzten
5

6
  DDRB = 0b00000100;
7
  PORTB = 0b00000100;    //Ein- und Ausg‰nge f¸r Port B festlegen
8
  
9
       
10
  int xv;          //Variablendeklaration
11
  int v;          //Variablendeklaration
12
  int bcd;        //Variablendeklaration
13
  
14
  while(1)                      //Dauerschleife
15
  {
16
    long l = 0;                    //Z‰hler
17

18
    if(PORTB == 0b00000001);            //Wenn Signal am Sensor 1
19
    {
20
      while(1)                  //Dauerschleife
21
      {
22
        l++;                  //Dann Z‰hler +1
23
        if(PORTB == 0b00000010);        //Wenn Signal am Sensor 2
24
        {
25
          xv = 1 / l;              //Geschwindigkeit in m/s
26
                
27
          v = xv * (18/5);          //Umrechnen in km/h
28

29
          bcd = ((v / 10) * 16) + (v % 10);   //dec to bcd
30

31
          PORTA = bcd;            //Ausgabe Port A
32

33
          if(v > 20);              //Wenn km/h grˆfler als 20
34
            {
35
              PORTB = 0b00000100;      //Dann high Kamera
36
            }
37

38
          _delay_ms (10000);            //10 sekunden warten
39

40
          break;                //Dauerschleife verlassen
41
        }
42
      }
43
    }
44
  }  
45

46

47
return 1;
48
}
Gast #3008533
Lesenswert?

Der Source code enthält grundsätzliche Fehler beim Zugriff auf die 
Ports.

 if(PORTB == 0b00000010);

Zunächst mal sorgt das Semikolon, dass nichts gemacht wird, wenn die 
Bedingung erfüllt ist. Der gewünschte Code-Block gehört VOR das 
Semikolon.

Weiterhin liest PORTB nicht den Zustand der Eingänge ein, sondern den 
der Ausgänge. Es muss PINB heissen.

Wenn Du die Eingänge so abfragst, testest Du alle 8 Bit gleichzeitig. 
Also nur, wenn der Status aller 8 Eingänge dem Bitmuster 0b00000010 
entspricht, ist die Bedingung erfüllt. Du wolltest sicher aber nur ein 
einzelnes Bit antesten, das geht so:

if (PINB & 0b00000010) { ... };

Aus der Zugriff auf die Ausgänge ist nicht in Ordnung:

PORTB = 0b00000100;

Damit schaltest Du 7 Bits auf Low und ein Bit auf High. Sicher wolltest 
Du aber nur ein Bit auf High setzen und die anderen unverändert lassen. 
Das geht so:

PORTB |= 0b00000100; // auf High
PORTB &= 0b11111011; // auf Low
PORTB &= ~0b00000100;  // auch auf Low

oder ander geschrieben:

if (PINB & (1<<1)) { ... };
PORTB |= (1<<2);
PORTB &= ~(1<<2);

Die Zahl rechts neben "<<" gibt an, welches Bit Du abfragen oder setzen 
willst. Die Zahl links von "<<" ist immer 1.

1<<2 bedeutet: Den Wert 1 zweimal nach links schieben, entspricht also 
0b00000100.

Noch ein Tip zum Compilieren:
Vermeide Leerzeichen in Dateinamen und Verzeichnis Namen. Unter 
bestimmtem Umständen (an die ich mich nicht mehr genau erinnere) lösen 
sie Fehler aus.
Bedenke, dass bei einigen deutschen Windows Versionen "C:\Programme" in 
Wirklichkeit "C:\Program Files" heisst und "Eigene Dateien" nicht in 
allen Windows Versionen artig auf einen Pfad ohne Leerezeichen gemappt 
ist (bei mir ist es C:\Users\sfrings\Documents, also Ok).
Installiere WinAVR und Deine Projekte nicht in Verzeichnisse mit 
Leerzeichen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren