Umsteiger Asm->GCC, Timerproblem, Mega8

Gast #181731
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?
Gast #181735
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.
Gast #181736
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.
Gast #181737
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 ;-)
Gast #181738
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...
Gast #181739
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren