Forum: Mikrocontroller und Digitale Elektronik Fehler AVR-Studio 4


von Andre B. (drain)


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

von spess53 (Gast)


Lesenswert?

Hi

>Prozessor     : ATmega 32-16PU

>mmcu=atmega128

Falscher Controller eingestellt?

MfG Spess

von Oliver (Gast)


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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?


von Georg G. (df2au)


Lesenswert?

Andre B. schrieb:
> int main;

Hat nichts mit deiner Fehlermeldung zu tun... aber diese Definition 
ist eher ungewöhnlich. "main" ist eigentlich meist eine Funktion, also 
"int main()" (ohne das ";" direkt dahinter).

von Andre B. (drain)


Lesenswert?

danke erstmal für die schnelle antworten

@ Oliver

werde AVR-Studio nochmal installieren.

ich hab windows xp.

@ Georg

ist mir auch aufgefallen, hab auch schon wieder ein paar Kleinigkeiten 
verändert ;)

von Andre B. (drain)


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
}

von Peter II (Gast)


Lesenswert?

aber selbst wenn der fehler weg ist wird das Programm nicht sauber 
laufen

> if(PORTB == 0b00000001);
> if(PORTB == 0b00000010);
> PORTB = 0b00000100;

so setzen man keine Pins oder Fragt welche ab.

siehe: http://www.mikrocontroller.net/articles/Bitmanipulation

von Peter II (Gast)


Lesenswert?

und genau wird es bestimmt auch nicht. Du hast doch gar keine genaue 
Zeitbasis für irgendwelche brechnungen - wie hast du dir vorgestellt das 
es gehen soll?

von Stefan (Gast)


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.

von Dietrich L. (dietrichl)


Lesenswert?


von Andre B. (drain)


Lesenswert?

@Stefan

Vielen vielen Dank!!!

das war eine sehr große Hilfe für mich!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Andre B. schrieb:
> Was haltet ihr allgemein von meinem Programm?
Mach doch beim Posten hier die Tokens [ c ] und [ /c ] ohne die 
Leerzeichen um dein Programm. Dann wird das hübsch leserlich 
formatiert...

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.