Forum: Compiler & IDEs Problem mit Atmel Application Note AVR 293


von Heiko H. (captain_neutrino)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Heiko H. (captain_neutrino)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Heiko H. (captain_neutrino)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Heiko H. (captain_neutrino)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.