PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : lauffähiger Code aus WinAVR funktioniert nicht in AVR-Studio



exaware
13.03.2010, 12:32
Hallo Leute,

habe mal wieder einen merkwürdigen Fehler. Mein Roboter-Programm habe ich zuvor in WinAVR per Programmer Notepad programmiert und es läuft ohne Probleme. Nun bin ich auf AVR-Studio umgestiegen und habe dort ein Projekt angelegt und den Code rein kopiert. Es lässt sicht compilieren und auf den Roboter übertragen. Aber mein Roboter macht gar nichts. Habe ie zwei Hex-Dateien von WinAVR und AVR-Studio verglichen und festgestellt, dass diese nicht gleich sind. Es scheint irgendwie an AVR-Sudio zu liegen.
Weiß jemand woran es liegen kann?

Gruß
Cetin

XBert
13.03.2010, 12:41
Ich behaupte jetzt einfach mal das es am makefile liegt.
Du kannst aber bei den Projektoptionen einstellen, dass das alte makefile verwendet werden soll. Dann sollte es einwandfrei funktionieren

LG

exaware
13.03.2010, 12:47
Habe nun die Makefile vom WinAVR-Projekt benutzt. Wieder das gleiche, ich kann compilieren und programmieren aber das Programm läuft nicht. Kann das sein, dass er meine ausgelagerten Funktionen z.B. myusart.c und myusart.h nicht richtig einbindet?

XBert
13.03.2010, 12:56
Wenn du kompilieren kannst, dann werden deine Includes offensichtlich richtig eingebunden.
Es könnte sein das dein Quellcode fehlerhaft ist (gibt es beim kompilieren Warnungen?).
Nachdem dein Code auch mit dem Programmers-Notepad makefile nicht funktioniert vermute ich, dass es am Code liegt.

exaware
13.03.2010, 12:59
Es kommen keine Warnungen. Wenn ich den gleichen Code in WinAVR programmer Notepad kompiliere dann läuft das Programm ohne Probleme. Deshalb kann man Fehler im Code eigentlich ausschließen.

XBert
13.03.2010, 13:05
Hast du deine WinAVR Installation auf eine neuere Version gebracht??
Denn dann kann es sehrwohl sein, dass Warnungen zu unterschiedlichen Compilaten führen.
Sonst fällt mir auch nichts mehr ein da beide Versuche das selbe makefile benutzen -> selber Compiler,Linker usw...
Und Avr-Studio macht ja nichts anderes als den Quellcode übers makefile an den Compiler zu geben.

exaware
13.03.2010, 13:09
WinAVR und AVR-Studio sind beide auf dem neusten Stand.
Hier mein Sourcecode: www.exaware.de/Robot.zip

XBert
13.03.2010, 13:19
Also die "Warnungen" die ich bekomme sind eigentlich recht eindeutig warum es nicht funktioniert wie es soll.

Du musst entweder Funktionsprototypen für jede Funktion vor die erste Funktion stellen, oder alle funktionen an den Anfang schreiben (nicht schön).
Des weiteren musst du die Optimierung deines Compilers aktivieren (laut einer Warnung).
und das hier:
myusart.h :

#include "myusart.c" ist ja mal ein absolutes no-go.
sowas macht man indem man die "myusart.c" zum Projekt linkt und nicht über sowas.

Ich hoffe ich hab nichts vergessen. Falls ja kommen noch EDITs ;)

EDIT: hier ist es auch schon :)
funktionen die nichts zurück geben deklariert man als void (sonst kommt eine Warnung)
Hatte vergessen zu sagen, dass Header-Files normalerweise für Funktionsprototypen verwendet werden

LG

exaware
13.03.2010, 13:29
Meine Funktionen stehen doch alle am Anfang, oder? Wie meinst du das mit dem linken der "myusart.c"? Meinst du das ich das im Makefile angeben soll? Die Optimierung kann ich aber nicht aktivieren, wenn ich mein altes Makefile benutze.

XBert
13.03.2010, 13:39
Ich hab mir jetzt mal die Mühe gemacht und dein Projekt angepasst.
Sollte so funktionieren.

Du solltest globale Variablen wenn sie innerhalb von Interrups verwendet werden sollen als volatile deklarieren, da sie sonst unter umständen wegoptimiert werden.
Fragwürdig ist auch, ob es sich auszahlt extra eine *.c und *.h Datei für eine einzige Funktion anzulegen...

LG

exaware
13.03.2010, 13:48
@XBert:
Danke dir für deine Mühe, aber leider gleiches Problem.

XBert
13.03.2010, 14:00
Hab natürlich vergessen die while-schleife in main anzupassen. in der jetzigen Form wird sie wegoptimiert.

Du könntest es so machen:

while(1)
{
asm volatile ("nop");
}

exaware
13.03.2010, 14:06
Hab jetzt raus gefunden woran es lag. Ich muss das Häckchen bei "Erase befor programing flash" rein machen.

@XBert: Danke dir für deine Hilfe und deine Mühe.

Gruß
Cetin

exaware
13.03.2010, 14:55
Habe noch eine Frage. Bei einem Interrupt wird doch der aktuelle Code unterbrochen und der Code in der ISR ausgeführt und anschließt wird wieder zurück gesprungen der Code weiter ausgeführt.

Ich habe folgenden Code:


ISR(INT1_vect)
{
impulse_rechts++;

OCR1AL=120;
OCR1BL=120;
if(impulse_rechts<=100)Robot_vor();
if(impulse_rechts>=100)Robot_zurueck();
if(impulse_rechts==200)
{
Robot_stopp();
impulse_rechts=0;
}
}

Wenn ich den Abschnitt ab "OCR1AL=120;" in meine while-Schleife rein kopiere, funktioniert es nicht. Deshalb sind die besagte Zeilen auch im ISR.

Woran liegt es, dass das Programm aus dem ISR nicht wieder zurück in die while -Schleife zurück springt?
Gru?
Cetin