mikrocontroller.net

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


Autor: Frank Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Marco S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal:

SIGNAL(SIG_OVERFLOW0) {
    PORTB = 0;
}

Gruß
Marco
-

Autor: Frank Simon (Gast)
Datum:

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

Autor: Marco S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus avr/signal.h:

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

Gruß

Autor: Frank Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Frank Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.