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?
Probier mal: SIGNAL(SIG_OVERFLOW0) { PORTB = 0; } Gruß Marco -
Aha. Jetzt tut es! Vielen Dank für die schnelle Hilfe. Ich bin aber völlig ratlos, was da den Unterschied macht.
Aus avr/signal.h: #define SIGNAL(signame) \ void signame (void) _attribute_ ((signal)); \ void signame (void) Gruß
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.
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.
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 ;-)
> ... 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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.