Forum: Mikrocontroller und Digitale Elektronik AVR (ATtiny2313): GIFR undeclared


von Lars L. (lale)


Lesenswert?

Hallo zusammen,

ich versuche gerade einen ATtiny2313 zu programmieren, das habe ich dem 
AVR Studio auch beim Erstellen des Projekts mitgeteilt. Im Code habe ich 
außerdem
folgende Libs eingebunden.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdint.h>

Mein Problem ist, dass der Compiler mir folgende Fehlermeldung um die 
Ohren haut:

'GIFR' undeclared (first use in this function)

Sollte dieses 'Register' nicht mittels der <avr/io.h> eingebunden sein?
Zu meiner Verwunderung meckert er bei GIMSK nicht.

Was mache ich da falsch?

Herzlichen Dank schon an alle, die sich mit meinem Problem 
auseinandersezten.

Gruß Lars

von MWS (Gast)


Lesenswert?

Lars Lehmann schrieb:
> Was mache ich da falsch?

Siehe: WinAVR-x\avr\include\avr\iotn2313.h

> /* ATtiny External Interrupt Flag Register EIFR, was GIFR */

von Thomas E. (thomase)


Lesenswert?

Lars Lehmann schrieb:

> Sollte dieses 'Register' nicht mittels der <avr/io.h> eingebunden sein?
> Zu meiner Verwunderung meckert er bei GIMSK nicht.
>
> Was mache ich da falsch?

Keine Ahnung. Woher soll man das wissen, wenn man nicht täglich 2313 
programmiert?

Kurzer Blick ins Datenblatt. Und siehe da: Besagtes Register heisst beim 
Attiny2313 EIFR.

Und dann guckt man ins Datenblatt vom 2313A und stellt fest, daß das 
Scheissding wieder GIFR heisst.

mfg.

von MWS (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Woher soll man das wissen, wenn man nicht täglich 2313
> programmiert?

Indem man die Definition des Compilers ansieht.

Thomas Eckmann schrieb:
> Und dann guckt man ins Datenblatt vom 2313A und stellt fest, daß das
> Scheissding wieder GIFR heisst.

Auch in der iotn2313a.h gibt's nur ein EIFR und kein GIFR, da ist's dann 
wurscht, was das DB sagt - Compiler rules.

So 'nen kleinen faux pas sollte man als Programmierer selbst korrigieren 
können.

von Lars L. (lale)


Lesenswert?

Hallo zusammen, insbesondere Thomas und MWS,

zunächstmal Asche auf mein Haupt, es ist der 2313a der programmiert 
werden soll. Demnach ist jetzt auch klar, warum es die 
Registerbezeichnung aus dem Datenblatt (GIFR) nicht tut. Mit dem EIFR 
klappt es, in soweit ist der Thread erledig.

Ich nehme für mich noch mit, dass ich mich wohl mit den #include-Salat 
mehr auseinander setzen muss. Mein Versuch "mal eben" die 2313.h zu 
identifizieren, in der ich die passsende Definition finde, hatte mich 
nämlich auf den Holzweg gezogen, wo es tatsächlich ein GIFR gibt.

Noch mal Danke für die Hilfe.

Gruß Lars

von MWS (Gast)


Lesenswert?

Lars Lehmann schrieb:
> Ich nehme für mich noch mit, dass ich mich wohl mit den #include-Salat
> mehr auseinander setzen muss. Mein Versuch "mal eben" die 2313.h zu
> identifizieren, in der ich die passsende Definition finde, hatte mich
> nämlich auf den Holzweg gezogen, wo es tatsächlich ein GIFR gibt.

Du siehst nach, was im Makefile unter MCU steht, bei Dir eben 
attiny2313. Die suchst Du in der io.h in WinAVR-x\avr\include\avr\, 
finden wirst Du:
1
#elif defined (__AVR_ATtiny2313__)
2
#  include <avr/iotn2313.h>

Aus der iotn2313.h geht dann die korrekte Definition des Registers 
hervor.

Im Gegensatz zu:
1
#elif defined (__AVR_AT90S2313__)
2
#  include <avr/io2313.h>

von Thomas E. (thomase)


Angehängte Dateien:

Lesenswert?

MWS schrieb:
> Lars Lehmann schrieb:
>> Ich nehme für mich noch mit, dass ich mich wohl mit den #include-Salat
>> mehr auseinander setzen muss. Mein Versuch "mal eben" die 2313.h zu
>> identifizieren, in der ich die passsende Definition finde, hatte mich
>> nämlich auf den Holzweg gezogen, wo es tatsächlich ein GIFR gibt.
>
> Du siehst nach, was im Makefile unter MCU steht, bei Dir eben
> attiny2313. Die suchst Du in der io.h in WinAVR-x\avr\include\avr\,
> finden wirst Du:
>
>
1
#elif defined (__AVR_ATtiny2313__)
2
> #  include <avr/iotn2313.h>
>
> Aus der iotn2313.h geht dann die korrekte Definition des Registers
> hervor.
>
> Im Gegensatz zu:
>
>
1
#elif defined (__AVR_AT90S2313__)
2
> #  include <avr/io2313.h>

Wenn man allerdings erstmal fehlerhafte Headerdateien durchsuchen muß, 
um sich dann an die fehlerhafte Bezeichnung anzupassen, finde ich das 
ziemlich Sch...

Ich halte mich lieber an die Bezeichnungen im Datenblatt.
Zumal EIFR/GIFR nicht der einzige Fehler ist und man mit den Pinchange 
Interrupts seine wahre Freude hat. Da ist nichts, wie man es erwartet.

Die Fehler sind allerdings, zumindest wird in anderen Foren darüber 
berichtet, an den Atmel Support gemeldet und es soll sich drum gekümmert 
werden.

Solange ich nicht die neueste Version der iotn*.h, in der es vielleicht 
richtig definiert ist, benutze, behelfe ich mir mit einer 
Würg-Erraund-Datei.

Verwirrend kommt noch hinzu, daß der 2313 ein Einzelkind ist, aber der 
2313A einen grossen Bruder hat. Der heisst 4313 - natürlich ohne A.
Aber das kennt man ja schon von anderen Typen

mfg.

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.