Forum: Mikrocontroller und Digitale Elektronik Interrupt in C


von ee (Gast)


Angehängte Dateien:

Lesenswert?

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?

von moep (Gast)


Lesenswert?

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.

von Karol B. (johnpatcher)


Lesenswert?

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.

von ee (Gast)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

ee schrieb:
> Wo steht welche Version ich besitze,
1
avr-gcc --version

von Ingo (Gast)


Lesenswert?

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

von Dietrich L. (dietrichl)


Lesenswert?

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

von Ingo (Gast)


Lesenswert?

Richtig, jetzt seh ich's auch! Und die Main Loop macht er hInter dem 
Return zu, wirklich schwer zu lesen!


Ingo

von Stefan W. (dl6dx)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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.

von ee (Gast)


Lesenswert?

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