Hallo!
Ich möchte etwas mit den USB-AVRs experimentieren. Hierzu habe ich mir
bei Atmel den Sourcecode von der Application Note "AVR293: USB Composite
Device on megaAVR with USB" heruntergeladen und entpackt.
Nun wollte ich das Demo:
\USB Composite
Device\STK526-series2-ms_hidmouse-2_0_3-doc.zip\STK526-series2-ms_hidmou
se-2_0_3-doc\demo\STK526-series2-ms_hidmouse
kompilieren.
Hierzu habe ich die Projektdatei "STK526-series2-hidio.aps" mit
AVR-Studio geöffnet um das Demo zu kompilieren.
Der Compiler bricht leider den Vorgang mit einigen Fehlermeldungen ab.
Fehlermeldung:
../main.c:107: error: expected expression before 'do'
../main.c: In function '__low_level_init':
../main.c:126: error: expected expression before 'do'
make: *** [../main.o] Error 1
Build failed with 2 errors and 0 warnings...
In Zeile 107 von main.c steht allerdings:
Clear_prescaler();
Dies ist die Main-Routine:
int main(void)
{
Usb_enable_regulator();
wdtdrv_disable();
start_boot_if_required();
Clear_prescaler();
scheduler();
return 0;
}
Ich weiß nicht wie ich das beheben soll, wenn die Fehlermeldung
offensichtlich keinen Sinn macht.
Atmel wird vermutlich korrekten kompilierbaren code ins Netz gestellt
haben, und das sieht alles korrekt aus.
Ich benutze AVR Studio4 Version 4.18. Stimmt da was mit der Projektdatei
oder dem Makefile nicht?
Kann mir jemand auf den richtigen Pfad schubsen?
Vielen Dank!!!
Heiko
Heiko H. schrieb:> \USB Composite> Device\STK526-series2-ms_hidmouse-2_0_3-doc.zip\STK526-series2-ms_hidmou
se-2_0_3-doc\demo\STK526-series2-ms_hidmouse
> kompilieren.
Kannst du das alles mal als Zip File anhängen.
Oder Alternativ einen Link zum Original bei Atmel.
> Dies ist die Main-Routine:>> int main(void)> {> Usb_enable_regulator();> wdtdrv_disable();> start_boot_if_required();> Clear_prescaler();> scheduler();> return 0;> }>> Ich weiß nicht wie ich das beheben soll, wenn die Fehlermeldung> offensichtlich keinen Sinn macht.
Kleb nicht zu sehr an der Zeilennummer.
Wenns nicht in dieser Zeile ist, dann möglicherweise die Zeile davor
oder noch eine paar weiter davor.
Da können auch irgendwo ein paar Makros mit im Spiel sein, etc.
Du kannst zb anfangen abzuspecken.
int main(void)
{
Usb_enable_regulator();
// wdtdrv_disable();
// start_boot_if_required();
// Clear_prescaler();
// scheduler();
return 0;
}
Jetzt ist erst mal alles ausser dem ersten Aufruf in main weg. main()
müsste korrekt compilieren. Wenn nicht müsste man sich wahrscheinlich
Usb_enable_regulator genauer ansehen.
Compiliert es korrekt, dann nimmst du den nächsten Funktionsaufruf mit
dazu.
int main(void)
{
Usb_enable_regulator();
wdtdrv_disable();
// start_boot_if_required();
// Clear_prescaler();
// scheduler();
return 0;
}
usw. usw. Bis du raus hast, wer der Übeltäter (auf dieser Ebene) ist.
Dann geht man her und sieht sich den Übeltäter genauer an, etc.
Man betreibt also eine Art Ausschlussverfahren, mit dem man dem
eigentlichen Problem immer näher kommt.
Und gib auch nicht allzuviel auf Zeilennummer bzw. Fehlermeldung des
Compilers. Ein Compiler ist nur eine Maschine. Oft sind beide Angaben
hilfreich. Aber manchmal sind sie völlig daneben.
Hallo Karl Heinz,
ich habe es mit dem Auskommentieren versucht.
Zuerst so wie in Deinem Beispiel, nur die erste Zeile.
Dann habe ich alle Zeilen auskommentiert:
int main(void)
{
//Usb_enable_regulator();
//wdtdrv_disable();
//start_boot_if_required();
//Clear_prescaler();
//scheduler();
return 0;
}
Trotzdem kommt noch immer:
../main.c:107: error: expected expression before 'do'
../main.c: In function '__low_level_init':
../main.c:126: error: expected expression before 'do'
make: *** [../main.o] Error 1
Build failed with 2 errors and 0 warnings...
Ich glaube nicht, dass es am Sourcecode liegt.
Der Sourcecode liegt auf:
http://www.atmel.com/dyn/products/app_notes.asp?family_id=607
(AVR293: USB Composite Device on megaAVR with USB)
Die Zip-Datei:
http://www.atmel.com/dyn/resources/prod_documents/AVR293_USB_Composite_Device.zip
Anleitung:
http://www.atmel.com/dyn/resources/prod_documents/doc7805.pdf
Ich benutze AVR-Studio seit 3 Jahren ab und zu (Hobby) und habe schon so
ein paar eigene Atmega und Tiny AVR-Projekte gemacht, allerdings mit
Makefiles habe ich es noch nicht so.
Ich habe hier einen Atmega32U2 liegen und möchte mal mit USB einsteigen,
bisher habe ich immer RS232 zur Kommunikation mit dem PC verwendet. Mein
Ziel ist erst mal eine Art USB-Hallo Welt.
Hoffentlich kann mir jemand einen Tipp geben, wie ich das Demo
kompilieren kann.
Grüße
Heiko
Heiko H. schrieb:> Ich glaube nicht, dass es am Sourcecode liegt.
Doch.
Heiko H. schrieb:> ich habe es mit dem Auskommentieren versucht.
Ich auch ;-)
Datei power_drv.h, Zeile 91:
1
#define Clear_prescaler() (clock_prescale_set(0))
hat ein paar KLammern zu viel.
Mit
1
#define Clear_prescaler() clock_prescale_set(0)
geht es.
Warum das so ist, darfts du gerne selber rausfinden (und auch, warum das
wohl mal mir einer älteren Version von avrg-cc und/oder avr-libc
funktioniert hat). Da stecken einige defines ineinander. Viel Spaß.
Oliver
Hallo Oliver,
Danke, das war der Fehler!!! Kompiler läuft jetzt durch.
Auch noch mal Danke an Karl Heinz, ich habe zu früh die Flinte ins Korn
geworfen und hätte auch mal an die Header-Dateien denken sollen.
Grüße
Heiko
Vor allem hätte es dich stutzig machen sollen, dass der Compiler den
Fehler immer noch in Zeile 107 sieht, obowhl du vor dieser Zeile, diese
Zeile und nach dieser Zeile auskommentiert hast.
Karl heinz Buchegger schrieb:> Vor allem hätte es dich stutzig machen sollen, dass der Compiler den> Fehler immer noch in Zeile 107 sieht, obowhl du vor dieser Zeile, diese> Zeile und nach dieser Zeile auskommentiert hast.
Gerade das hat mich ja stuzig gemacht. Die Zeile und die Fehlermeldung
standen in gar keinem Bezug. Von der PC-Programmierung bin ich aus
Visual Studio und Delphi gewohnt, dass mir die IDE die Zeile mit dem
Syntax-Fehler direkt zeigt.
Da die Fehlermeldung und die Zeile überhaupt keienen Sinn mit der main.c
ergeben wollte, dachte ich, da wäre was grundsätzlich falsch. Z.B. ein
Pfad und es würde eine ganz andere main.c compiliert werden. Bei den
Sourcen von Atmel gehe ich davon aus, dass diese Hand und Fuß haben und
getestet sind. Das da ein Syntax-Fehler im Source ist, habe ich daher
erst mal ausgeschlossen und den Fehler in meiner Entwicklungsumgebung
gesucht.
Naja, dafür ist der GCC und AVR Studio ja auch kostenlos, das ist ja
auch was wert, das bezahlt man dann halt manchmal mit Sucherei.
Trotzdem Asche auf mein Haupt!
Grüße
Heiko
> Die Zeile und die Fehlermeldung standen in gar keinem Bezug.
Doch, tun sie.
Du musst halt mal genau nachschauen, was tatsächlich in der Zeile
steht. "Clear_prescaler()" ist ein Präprozessor-Makro, das bedeutet der
Text wird durch was anderes ersetzt, bevor der Compiler es zu sehen
bekommt (und damit die Fehlermeldung entsteht).
Aus
Und in Bezug auf das hier:
Karl heinz Buchegger schrieb:
> Vor allem hätte es dich stutzig machen sollen, dass der Compiler den> Fehler immer noch in Zeile 107 sieht, obowhl du vor dieser Zeile, diese> Zeile und nach dieser Zeile auskommentiert hast.
Du hast schlicht vergessen, vor dem Neu-Kompilieren die Änderungen
abzuspeichern. Denn bei dem mitgelieferten AVR-Studio-Projekt passiert
das aus irgendeinem Grund nicht automatisch.