Forum: Compiler & IDEs AVR - Compiler kennt Register von Timer 0 nicht (TCCR0A undeclared)


von Jochen (Gast)


Lesenswert?

Ich bin seit einiger Zeit dabei, ATtiny2313er zu programmieren. Die 
ersten Mini-Programme hab ich zum Laufen gekriegt (so was wie ein 
Lauflicht etc). Nun wollte ich einen Timer so programmieren, daß ein 
Interrupt ausgelöst wird, wenn der 200 erreicht. Doch es haut einfach 
nicht hin:
Obwohl die avr/io.h includiert ist, kennt der Compiler kein Register des 
Timer0.
Ich habe schon in die io.h bzw in die iotn2313.h geschaut und dort sind 
die Register so definiert, wie ich sie angegeben habe. Wenn ich die 
ganze Sache mit Timer1 statt Timer0 schreibe (TCCR1A, TCCR1B, OCR1A), 
kompliert das Programm fehlerfrei. Ich bin auch sicher, daß ich mich 
nicht vertippt habe (z.B. ein Oh statt einer Null).

Hier der Auszug aus dem Programm mit den Fehlermeldungen des Compilers:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
int main ()
5
{
6
7
  DDRB=0b11111111;    //PortB (TimerAusgang) ist Ausgang
8
  PORTB=0b00000000;    //Am Anfang ist alles dunkel
9
  TCCR0A |= 0b01000000;  //Signal an PortB ausgeben, Normale Timerfunktion
10
  TCCR0B |= 0b00000101;    //Timer start! 1/1024 CPU-Takt
11
  OCR0A = 200;      //Erreicht der Timer 200, wird ein Interrupt geschmissen  
12
  TIMSK |= 0b00000001;    //Compare-Interrupt für ComareRegister A einschalten
13
  sei();
14
15
while(1)
16
{
17
//uswusw
18
}
19
}
Und hier die Fehler des Compilers:
Build started 4.1.2010 at 14:05:41
avr-gcc.exe  -mmcu=atmega128 -Wall -gdwarf-2 -Os -std=gnu99 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP 
-MT Interrupts.o -MF dep/Interrupts.o.d  -c  ../Interrupts.c
../Interrupts.c: In function 'main':
../Interrupts.c:9: error: 'TCCR0A' undeclared (first use in this 
function)
../Interrupts.c:9: error: (Each undeclared identifier is reported only 
once
../Interrupts.c:9: error: for each function it appears in.)
../Interrupts.c:10: error: 'TCCR0B' undeclared (first use in this 
function)
../Interrupts.c:11: error: 'OCR0A' undeclared (first use in this 
function)
make: *** [Interrupts.o] Error 1
Build failed with 5 errors and 0 warnings...


Ich programmiere mit AVR Studio 4.14 und WinAVR-20090313. Danke für eure 
Hilfe!

von Michael M. (Gast)


Lesenswert?

Jochen schrieb:
> avr-gcc.exe  -mmcu=atmega128 -Wall -gdwarf-2 -Os -std=gnu99
                     ^^^^^^^^^
einstellen. am besten im makefile.
und rtfm =)

von Jochen (Gast)


Lesenswert?

Wow, das ging aber schnell :-)
Ich hatte erst das Projekt auf dem ATmega begonnen, später aber auf den 
ATtiny umgestellt. Aber anscheinend wurds nicht richtig übernommen.

Danke für die Hilfe!

von Michael M. (Gast)


Lesenswert?

ach du schreibst unter dem avrstudio und nicht mit dem pn von winavr. 
dann lieber nicht im makefile ändern (grausam aber wahr), sondern in den 
project optionen einstellen.
nur beim flashen reichts nicht.

von Stefan E. (stefane)


Lesenswert?

Hallo zusammen,

ich muß diesen Thread noch einmal aufgreifen, weil ich genau die im 
ersten Posting beschriebenen Fehlermeldungen auch bekomme, ich aber mit 
der Lösung nicht so recht was anfangen kann.

In dem Tutorial

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR

gibt es einen Quellcode für die Benutzung des Timer0 im CTC-Mode. Der 
Quellcode ist für den AT90S2313 geschrieben. Wenn ich diesen Quellcode 
in AVR-Studio4 (Version 4.16) in ein Projekt einbinde und compiliere, 
bekomme ich die oben beschriebenen Fehlermeldungen (z.B. TCCR0A 
undeclared), auch wenn ich unter den Configuration Options den at90S2313 
angebe. Ein Blick in die io2313.h zeigt dann tatsächlich, dass es ein 
Register dieses Namens nicht gibt. Wo liegt nun der Fehler? Ist die 
io2313.h unvollständig? Ist der Quellcode im Tutorial falsch?

Gruß
StefanE

von Hc Z. (mizch)


Lesenswert?

Ein Blick ins Datenblatt und siehe da: der AT90S2313 hat kein TCCR0A.

von Stefan E. (stefane)


Lesenswert?

Hc Zimmerer schrieb:
> Ein Blick ins Datenblatt und siehe da: der AT90S2313 hat kein TCCR0A.

Danke, also ist der Quellcode im Tutorial falsch. Dann werde ich mich 
mal bemühen, dass das geändert wird.

Gruß
StefanE

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Stefan Engelhardt schrieb:

> In dem Tutorial
> 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR
>
> gibt es einen Quellcode für die Benutzung des Timer0 im CTC-Mode. Der
> Quellcode ist für den AT90S2313 geschrieben.

Nö ist er nicht.

Nur der im Tutorial vorangehende Quellcode für das Overflow-Beispiel 
ist für den AT90S2313 geschrieben (und wurde korrigiert: Richtiger 
Name des ISR Vektors).

Der Quellcode fürs CTC-Beispiel ist für Attiny2313 geschrieben und 
die Register passen. Der AT90S2313 hat keinen CTC-Modus bei Timer0.

Zur Verdeutlichung habe ich je eine Kommentarzeile an die Anfänge der 
Quellcodes geschrieben.

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.