Forum: Compiler & IDEs WinAVR Hexfiles corrupt?


von Mictlan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen!
Ich hab vor ein paar Tagen meine alte Platine mit einem ATMEGA32 
rausgekramt, um damit ein paar Sachen auszuprobieren. Ich hatte noch 
alte Projekte gefunden, die ich mit PonyProg 2000 rübergeschoben habe. 
Hat alles wunderbar funktioniert. Jetzt hab ich WinAVR 20080512 und 
AVRDUDE 5.5 installiert und wollte mit dem Programmers Notepad nur ein 
paar LEDs zum Blinken bringen, um die Funktion zu testen. 'Make clean', 
'make all', und 'Program' läuft fehlerfrei durch, nur das Programm will 
nicht (alle LEDs gehen einmal an und nie wieder aus).
OK also hab ich mir ein altes Programm geschnappt und per Ponyprog 
rübergeschoben: geht. Kompiliere ich es dann einmal mit WinAVR, gehts 
nicht mehr, auch nicht mehr mit Ponyprog.
Ich nutze Windows XP und programmiere mit einem stk200 kompatiblen 
Programmer über den lpt1-Port. Der ATMEGA läuft auf internem 8 MHz Takt, 
die LEDs hängen an PORTB 2,3,4und sind so verschaltet, dass sie 
leuchten, wenn der Port low ist.
Gibt es da vllt. noch Einstellungen unter WinAVR, die man vorher machen 
muss?
Hier mal das Programm (Dateiname "bare.c"):

#include <avr/io.h>

void init(void);

int main(void)
{
    int j, k ;
  init();
  PORTB = 0x00 ;
  while (1)
  {
           for(j=0;j<10000;j++)
        for(k=0;k<1000;k++) ;
     PORTB = 0xff ;
           for(j=0;j<10000;j++)
        for(k=0;k<1000;k++) ;
     PORTB = 0x00 ;
  }
  return 0;
}
void init(void)
{
  DDRB = 0xff;  // PortB als Ausgang deklarieren
  PORTB = 0xff;  // Ports auf LOW schalten
}

Ich wäre sehr dankbar für Ratschläge.

MfG Mictlan

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ich bin mal GCC und optimiere Dein Programm, von main() bleibt
1
int main (void)
2
{
3
  init();
4
  PORTB = 0x00;
5
  while (1)
6
  {
7
     PORTB = 0xff;
8
     PORTB = 0x00;
9
  }
10
}

Die LEDs gehen also sehr schnell an und aus, sieht aus wie ein 
durchgehendes Leuchten.

von Mictlan (Gast)


Lesenswert?

Hi Georg,
Du hast vollkommen recht, nach der Optimierung bleibt von dem Blinken 
nicht mehr viel übrig... Dank Dir für die schnelle Antwort. Aber seit 
wann optimiert GCC denn schon so? Als ich die Programme geschrieben hab 
(gut ok ist auch schon anderthalb Jahre her) hats ja noch funktioniert.

MFG Mictlan

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Damals hat's funktioniert, war aber schon inkorrekt.

Seit Version 4 ist GCC nochmal was aggressiver beim Optimieren, weil 
durch die interne SSA-Darstellung einige neue Optimierungsalgorithmen 
anwendbar sind.

Zudem war früher mal in GCC eingebaut, daß leere Schleifen nicht 
wegoptimiert werden, weil davon ausgegangen wurde, daß der einzige 
Grund, warum ein Programm solche Schleifen enthält, ist, daß der 
Programmierer damit eine Warteschleife im Sinn hatte. Irgendwann ist das 
rausgeflogen.

Warten kann man mit Timern oder dem Zeug in avr/delay.h.

von Mictlan (Gast)


Lesenswert?

Japp ich hab mal die delay Funktion genommen, funktioniert einwandfrei. 
Dank Dir nochmal für den Gedankenanstoß, da saß das Computerproblem ja 
wie so oft mal wieder vor dem Monitor... ;D

Gruß Mictlan

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.