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
1 | Clear_prescaler(); |
wird
1 | (do { uint8_t tmp = (1 << (7)); __asm__ __volatile__ ( "in __tmp_reg__,__SREG__" "\n\t" "cli" "\n\t" "sts %1, %0" "\n\t" "sts %1, %2" "\n\t" "out __SREG__, __tmp_reg__" : : "d" (tmp), "M" (((uint16_t) &((*(volatile uint8_t *)(0x61))))), "d" (0) : "r0"); } while (0)); |
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.
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.