www.mikrocontroller.net

Forum: Compiler & IDEs AVR + WinAVR + Eclipse: <Register> undeclared


Autor: Thomas S. (odwschama)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
als Neuling hoffe ich auf Hilfe von euch: In der Firma habe ich unter 
CodeVision AVR schon ein paar recht umfangreiche Projekte realisiert, 
möchte nun aber (privat) am liebsten mit Eclipse arbeiten. Installiert 
ist wohl alles, doch bekomme ich auch gaaanz einfache Dinge einfach 
nicht zum Laufen:


/***** INCLUDES *****/
#include <avr\io.h>         // das scheint von Eclipse gefunden zu 
werden:
#include <avr\interrupt.h>  // es gibt jedenfalls keine anders lautenden
                            // Fehlermeldungen nach "Build All"


/* Hier hagelt es dann aber Fehlermeldungen:
   'ASSR' undeclared (first use in this function)
   Das Gleiche für die anderen Register...
/*

/*** Timer/Counter 0 Initialization ***/
void InitSPS(void){ // timer initialization
  TCCR0  = 0b00001101;
  TCNT0  = 0;
  OCR0  = 125;
  TIMSK  |= 0b00000010;
  ASSR  = 0b00000000;
}

Der Compiler scheint die Registermakros nicht zu kennen. Sie sind in 
"iom128.h" (welche ja indirekt über io.h includiert werden soll) aber 
definiert:

/* Timer/Counter 0 Asynchronous Control & Status Register */
#define ASSR      _SFR_IO8(0x30)

Was mache ich falsch? Oder wird iom128.h doch nicht eingebunden?

Ich bin für ein paar Tipps dankbar.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau' Dir mal den Compiler-Aufruf an, insbesondere, ob dort ein 
-mmcu=... vorkommt und ob statt der Pünktchen hier dort der richtige 
µC-Typ steht.

Autor: Thomas S. (odwschama)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:
> Schau' Dir mal den Compiler-Aufruf an, insbesondere, ob dort ein
> -mmcu=... vorkommt und ob statt der Pünktchen hier dort der richtige
> µC-Typ steht.

Ja, hier fand ich folgende Zeile:
-funsigned-bitfields -mmcu=atmega128 -DF_CPU=16000000UL -MMD -MP 
-MF"Includes/spsclk.d" -MT"Includes/spsclk.d" -c

Nun fällt mir noch folgendes auf:
Das hier wird NICHT vom Compiler bemängelt, obwohl z.B. für DDRB das 
Gleiche gelten sollte:

/***** START OF RESET-CODE *****/
int main(void){
  /*** Initialization of Ports ***/
  DDRB  = 0b10000000;
  DDRG  = 0b00000011;
  PORTG  = 0b00000010;


/***** START OF PROGRAM-LOOP *****/
  while(1){
    //unsigned long int x;
    WD_service(0xFF);          // Watchdog-Service
    PORTG ^= 0b00000010;
  };
}

Die Funktion mit den Fehlern befindet sich in einer eigenen Datei:
   #include <spsclk.c> // ja, ich weiß: Abzüge in der B-Note
Dieses Include befindet sich in main.c hinter #include <io.h>

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwas anderes muss bei dir schräg sein:
j@uriah 1137% cat > foo.c
#include <avr/io.h>

void InitSPS(void){ // timer initialization
  TCCR0  = 0b00001101;
  TCNT0  = 0;
  OCR0  = 125;
  TIMSK  |= 0b00000010;
  ASSR  = 0b00000000;
}

j@uriah 1138% avr-gcc -Os -mmcu=atmega128 -c foo.c 
j@uriah 1139% 

Geht problemlos.  Dass ein #include einer C-Quelldatei bäh ist,
weißt du ja sicherlich...

Autor: Thomas S. (odwschama)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Irgendwas anderes muss bei dir schräg sein:


Das glaube ich mittlerweile auch - und wenn ich's bin 8-)
Wenn ich die Funktion in main.c verschiebe, geht's auch mit den 
Registern darin.


> Dass ein #include einer C-Quelldatei bäh ist,
> weißt du ja sicherlich...


Habe ich hier schon gelesen. Ich weiß auch, dass nur die Headerfiles mit 
den Prototypen eingebunden werden soll. Nur: woher weiß der Compiler, 
woher er den dazu gehörenden Funktionscode holen soll? (Ich hoffe, diese 
Frage hat mich jetzt nicht als völlig Ahnungslosen geoutet). Habe 
versucht, Infos in
der Doku von WinAVR und Eclipse zu finden, aber dort sehe ich den Wald 
vor lauter Bäumen nicht...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas S. schrieb:
> Nur: woher weiß der Compiler,
> woher er den dazu gehörenden Funktionscode holen soll?

Gar nicht, denn das ist die Aufgabe des Linkers.

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.