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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.