Forum: Compiler & IDEs Umsteiger Asm->GCC, Timerproblem, Mega8


von Frank Simon (Gast)


Lesenswert?

Hallo, gleich meine erste C-Portierung hakt, die Timer0-ISR wird nie
angesprungen. Hab das Programm schon auf ein paar Zeilen reduziert,
dehalb direkt statt im Anhang:

#include <avr/io.h>
#include <avr/interrupt.h>  //wg. sei()
#include <avr/signal.h>

int main(void){
  DDRB = 0xFF;    //Port B als Ausgang
  PORTB = 0xFF;    //Leds an
  TIMSK = (1<<TOIE0);//Timer0 Interrupt freigeben
  TCNT0 = 255;    //Startwert des Timers laden
  TCCR0 = 0b00000101;  //Timer starten mit Vorteiler 1024
  sei();        //Interrupts freigeben
  while(1);      //Warten für immer
}

void signal(SIG_OVERFLOW0){
    PORTB = 0;    //Leds aus
}

Zusatzinfo: der Compiler meckert folgendes an:
In file included from main.c:2:
C:/WinAVR/avr/include/avr/interrupt.h:117:1: warning: "__EICR"
redefined
C:/WinAVR/avr/include/avr/interrupt.h:114:1: warning: this is the
location of the previous definition
main.c:15: warning: function declaration isn't a prototype
main.c: In function `signal':
main.c:15: warning: type of "__vector_9" defaults to "int"

Wer kann mir helfen?

von Marco S (Gast)


Lesenswert?

Probier mal:

SIGNAL(SIG_OVERFLOW0) {
    PORTB = 0;
}

Gruß
Marco
-

von Frank Simon (Gast)


Lesenswert?

Aha. Jetzt tut es! Vielen Dank für die schnelle Hilfe. Ich bin aber
völlig ratlos, was da den Unterschied macht.

von Marco S (Gast)


Lesenswert?

Aus avr/signal.h:

#define SIGNAL(signame)                                 \
void signame (void) _attribute_ ((signal));           \
void signame (void)

Gruß

von Frank Simon (Gast)


Lesenswert?

Hab ich das jetzt richtig verstanden: SIGNAL ist eben kein Schlüsselwort
in C, sondern ein Makro. Deshalb ist es case sensitive, und aus
irgendeinem Grund wurde ich nicht gewarnt, dass ich ein undefiniertes
Makro verwendet habe.

von Mike (Gast)


Lesenswert?

Schaut so aus :-)
Pass nur auf, was du SIGNAL in den Klammern übergibst. Da kannste jeden
Mist reinschreiben und es wird nicht angemeckert. Also lieber zweimal in
der Header-Datei schauen, ob die Bezeichnung für den gewünschten
Interrupt stimmt.

von OldBug (Gast)


Lesenswert?

Du hast doch kein "undefiniertes Makro" verwendet, der Compiler denkt,
daß Du eine Funktion definieren oder deklarieren möchtest, und das nicht
richtig machst!

14:
15: void signal(SIG_OVERFLOW0){
16:     PORTB = 0;    //Leds aus
17: }
18:

main.c:15: warning: function declaration isn't a prototype
main.c: In function `signal':
main.c:15: warning: type of "__vector_9" defaults to "int"

Für den Compiler sieht es so aus, als wolltest Du eine Funktion namens
"signal" definieren (da die öffnende geschweifte klammer "{" ihm
sagt, daß es sich hier nicht um einen Prototypen handelt), die einen
Typen namens "SIG_OVERFLOW0" bzw. "__vector_9" als Parameter
erwartet, was so natürlich unvollständig und sogar falsch ist.

Daß der Compiler Dich nicht warnt, ist also nicht wahr ;-)

von Jörg Wunsch (Gast)


Lesenswert?

> ... sondern ein Makro. Deshalb ist es case sensitive ...

In C ist alles case sensitive -- außer vielleicht die Dateinamen für
#include, wenn man auf einem Betriebssystem mit nicht case sensitiven
Dateinamen arbeitet, aber auch hier sollte man im Sinne der besseren
Portabilität auf korrekte Schreibweise achten.  Früher oder später
kommt der Punkt, wo du dein Projekt in ein Zipfile verpacken willst,
damit jemand anders mal einen Blick drauf werfen kann...

von Frank Simon (Gast)


Lesenswert?

Vielen Dank für Eure Tipps und Infos. Bin jetzt schon wieder viel
schlauer als noch gestern. (Hab eben berufsbedingt C das letzte Mal vor
12 Jahren benutzt und seit dem nur *.asm und *.bas gebraucht (beides
case unsensitive), was mal wieder belegt, dass VBA einen leicht
verblöden lässt ;o)

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.