Hallo zusammen,
bei mir drückt der Schuh ziemlich, ich muß mit meinem Kollegen zusammen
eine Sammlung von Testprogrammen für die Procyon AVRLib schreiben. Und
zwar:
- LEDs blinken lassen und Taster nutzen
- UART-Testprogramm mit Hello World-Ausgabe an RS232
- SD-Kartenleser ansteuern
- Kommunikation mit einem FTDI FT232BM-Chip (USB) aufbauen
- LCD-Text-Display ansteuern
Das Ganze wird auf einem bereits existierendem und getesteten Board mit
einem AT90CAN128 und ISP-Programmer entwickelt.
Wir haben dafür 4 Tage Zeit, was ich an sich schon utopisch finde, da
ich zwar vorher schon mit diversen ARMs und MSP430 zu tun hatte, aber
nie mit den AVRs und vor allem nicht mit ISP-Programmern sondern bisher
immer den Luxus von JTAG-Debugging hatte. Tatsache ist, dass wir
kommenden Freitag 13:00 eine Präsentation halten müssen und nichts geht,
ausser die LEDs und die Taster. Ich zähle echt auf eure Hilfe!
Zum Problem:
Die Testprogramme die die LIB-C verwenden funktionieren einwandfrei.
Wenn ich z.B. die Funktion delay_ms() von /utils/delay.h aufrufe, klappt
dies einwandfrei. Soweit so gut.
Nehmen wir an, ich definiere eine Funktion MyFunc() mit beliebigem
Inhalt, z.B. einen LED-Blinker. Diese Funktion platziere ich zunächst in
derselben Datei in der ich auch die main() drin habe. Nach der
Kompilierung und dem Upload mit PonyProg funktioniert alles prima.
Nehme ich nun MyFunc() und lagere diese in eine andere Datei aus, z.B.
"funcs.h" und inkludiere sie mit
, dann jammert zunächst Make herum, dass es die Referenz in der Main auf
MyFunc() nicht erkennt. Der Eintrag "SRC += funcs.c" im Makefile löst
das Problem. Make läuft ohne Probleme durch und bringt auch keinerlei
Warnings oder Errors.
Nach dem Upload des Hexfiles läuft der Prozessor exakt BIS zum Aufruf
von MyFunc(); danach stürzt er ab. Er führt weder den Code innerhalb
MyFunc() noch den nachfolgenden Code aus.
Ich habe es mehrfach getestet, es klappt einfach nicht. Dann habe ich
die erzeugte main.lst analysiert. Dort zeigt sich im Assembler-Code,
dass er das Symbol MyFunc nicht linken konnte. Ganz unten steht dort:
UNDEFINED SYMBOLS
MyFunc
Nun ist mir schon klar, dass er bei call MyFunc irgendwo ins Nirvana
rennt, aber warum ist das so?? Wie bringe ich dem Linker bei, dass er
MyFunc in der funcs.h findet? Und vor allem: Warum zeigt mir Make bei
der Kompilierung keinerlei Fehler an? Das ist nicht nur bei meinen
externen include's so, sondern auch bei den includes von der Procyon
AVRLib. Lediglich die LIB-C includes wie stdio.h usw. funktionieren
einwandfrei.
Betriebssystem: Win XP
ISP-Programmer: Parallel
Software: WinAVR, MFile und PonyProg (AVRStudio und AVR Dude stürzen
beide ab). Alles jeweils in der neusten Version.
Ich hoffe ihr könnt mir etwas helfen. Vielen Dank schonmal vorab.