Hallo, ich habe Probleme mit dem WinARV Compiler in AVR Studion mit dem Atmega128. Habe ein kleines Programm geschrieben, dass "nacheinander geschrieben" in der main Funktion funktioniert. Lagere ich nun Teile des Codes in Unterfunktionen werden diese nicht erkannt. (in der Simulation funktioniert alles super) und der Compiler bringt auch keine Fehlermeldung. Bin gerade ratlos! Danke im Vorraus Sebastian
-> sorry im Anhang! Das Problem tritt bei jedem Funktionsaufruf auf (mit uart_init und delay). Wenn ich den inhalt der Funktionen direkt in main() schreibe gehts.
Jetzt ist die funktionierende Version angegeben? Und was unterscheidet die funktionierende Version von der nicht-funktionierenden - dass es nicht/langsamer/schneller an PORTD toggelt? An uart_init() sehe ich keine Probleme. Wenn die Anweisungen in main() funktionieren (korrekte Initialisierung habe ich nicht mit Datenblatt kontrolliert), sollte auch als Funktion arbeiten. Probiere es mal, ohne gleichzeitig die Änderung mit delay() zu machen. Ich vermute, dass du bei der nicht-funktionierenden Variante die 2. for-Schleife in main() durch ein delay(1000) ersetzt, richtig? Möglicherweise optimiert der Compiler die Schleife in der Unterfunktion weg. Kontrolliere mal das Assemblerlisting.
Im Dateianhang ist die Warteschleife direkt in der main()-funktion und der Port toggelt langsam (habs mit Oszi nachgemessen), wenn ich nun die for()-Schleife in main() rausnehme und über delay() aufrufe toggelt kein Port. Der Controller gerät in irgendeinen undefinierten Zustand. Das selbe mit dem uart, in main() initialisiert sendet er zeichen, die in main() mit while(...); UDR0 = '..'; deklariert werden. Ausgelagert in Funktionen macht er nix!!
ok habs gefunden, es war tatsächlich der 103er Kompalibilitätsmodus, der mit fusebits gesetzt wird!! Danke jetzt gehts!!
Ich musste weg, desshalb mein so knapp gefasster Hinweis aber Du hast es ja dann doch gefunden! Noch ein Tip: Deine Warteshlaufe würde, so wie sie Du schreibst, vom Optimizer wegoptimiert! Dennoch, den Optimizer solltest Du minsestsns auf die 1. Stufe -O1 setzen (Höhere Stufen bewirken nur noch wenig) Wenn Du verhindern willst, dass eine Variable "optimiert" wird, musst Du diese als volatile deklarieren. Beispiel: Eine Delay-Funktion: //--------------------------------------------------------- // Warte-Funktion (Delay) // Parameter: Wartezeit in 0...65'536 ms //--------------------------------------------------------- void warte_ms(unsigned int wartezeit) { volatile unsigned int i; // Schlaufenzähler für Millisekunden-Loop while(wartezeit) // Schlaufe für jede Millisekunde { i = F_CPU/17000; // Berechne Startwert für Millisekunden-Loop while(i) // Schlaufe, solange i nicht gleich null ist { i--; // i minus eins } // Schlaufen-Ende wenn i gleich null ist wartezeit--; // minus eine Millisekunde } // Schlaufen-Ende wenn wartezeit gleich 0 ist } // Funktionsende => return
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.