Hallo zusammen Ich habe folgendes Programm geschrieben um die Interruptprogrammierung in C zu üben(habe bisher Assembler programmiert). Nun gibt der Compiler folgende Warnung aus: ../asdf.c:18: warning: return type defaults to `int' ../asdf.c:24: warning: control reaches end of non-void function Im Forum wurde geschrieben, dass das Programm die Interruptroutine nicht erkennt, und dass man den Vector aus dem iom8.h kopieren soll. Nun steht dort: #define SIG_OVERFLOW1 _VECTOR(8) Das ist doch die alte programmierweise mit SIGNAL() statt mit ISR(). Wenn ich aber SIGNAL(SIG_OVERFLOW1) eingebe, gibts den gleichen Fehler. Wie soll ich jetzt weiter vorgehen? Kann ich die Bibliothek erneuern?
ee schrieb: > habe bisher Assembler programmiert Bitte nicht übel nehmen... Das sieht man xD Bezieht sich jetzt nicht auf den Inhalt den Codes sondern auf dessen Optik. Geschweifte Klammer auf zu in der selben Zeile mit der ersten letzen Instruktion ist stilistisch z.B. etwas ekelhaft, macht den Code einfach recht unleserlich. z.B.
1 | void powersave(void){SREG|=(1<<7); |
oder
1 | return(1);} |
Auch bei der Einrückung solltest du etwas konsequenter Vorgehen. Manche Sachen sind garnicht eingerückt und beim Rest gibt es 3 verschiedene Tiefen. Ist jetzt wie gesagt nicht böse gemeint, aber wenn man seinen Code von Anfang an sauber formatiert tut man sich selbst und anderen einen Gefallen.
Welche Version von avr-gcc bzw. avr-libc verwendest du denn jeweils? Habe es eben mit deinem Code selbst probiert. Bei mir wird bloß folgendes bemeckert:
1 | avr-gcc -Waavr-gcc -Wall -g2 -gstabs -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega16 -DF_CPU=1000000UL -MMD -MP -MF"asdf.d" -MT"asdf.d" -c -o "asdf.o" "../asdf.c" |
2 | In file included from ../asdf.c:2:0: |
3 | /usr/lib/gcc/avr/4.7.0/../../../../avr/include/avr/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>." [-Wcpp] |
4 | ../asdf.c: In function '__vector_8': |
5 | ../asdf.c:20:11: warning: 'TimeDelay' is used uninitialized in this function [-Wuninitialized] |
6 | Finished building: ../asdf.c |
Ich verwende avr-libc in Version 1.8.0 sowie avr-gcc in Version 4.7.0. Es kann also durchaus sein, dass du da mit veralteten Versionen hantierst.
An moep, Ich nehms nicht übel, bin für konstruktive Kritik empfänglich. Ich geb mir beim nächsten Code mehr Mühe=) An Karol Babioch, Wo steht welche Version ich besitze, und falls meine veraltet ist, kann man die kostenlos updaten? Vielen Dank schon mal
Du hast aber ganz schön um dich geworfen mit Fehlern! Deine While(1) Schleife darf keine Ende haben, sonst endet hier das Programm. Also muss das Return da raus. Oben hast du ein Delfine 1/x.yxz, dass geht schief weil du nicht explizit sagst der Compiler soll es float rechnen bzw du weist dieses Float, welches < 0 ist einer int Variable zu, auch Quatsch. Für sleep gibt fertige Makros in der sleep.h. Ingo
Ingo schrieb: > Du hast aber ganz schön um dich geworfen mit Fehlern! Deine While(1) > Schleife darf keine Ende haben, sonst endet hier das Programm. Also muss > das Return da raus. Nein, das ist schon richtig! Er hat nur das "}" vor dem Return gut versteckt!! Gruß Dietrich
Richtig, jetzt seh ich's auch! Und die Main Loop macht er hInter dem Return zu, wirklich schwer zu lesen! Ingo
Hallo ee, falls die Variable TimeDelay ín der ISR ein fortlaufender Zähler sein soll, muss sie als "static" deklariert sein. Sonst wird sie bei jedem Aufruf der Funktion neu angelegt und beim Verlassen verworfen. Grüße Stefan
Ingo schrieb: > Oben hast du ein Delfine 1/x.yxz, dass geht schief weil du nicht > explizit sagst der Compiler soll es float rechnen Nein, das wird automatisch in double gerechnet. > bzw du weist dieses Float, welches < 0 ist einer int Variable zu, auch > Quatsch. Nein. Das Ergebnis der Division ist ca. 3,8, und das wird dann auf 3 abgeschnitten.
Hallo melde mich zurück, danke für euer Antworten. Ich habe das Problem mit Download des Atmel Studio 6 gelöst. Hatte zwar anfangs Probleme mit dem STK500 aber jetzt läufts. Und die Benutzeroberfläche ist wirklich nicht schlecht. Hat sich also gelohnt.
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.