Forum: Compiler & IDEs Timer0-Register OCR0 bei Atmega16 nimmt keine Werte


von Holger (Gast)


Lesenswert?

Hallo Forum,

ich betreibe eine Atmega16 im STK500 mit Avr Studio und JTAGICE II. Ich 
will die Timer0 Funktionen ausprobieren. Nun habe ich folgenden Code 
eingegeben:
1
#include <avr/io.h>
2
3
void init_timer0()
4
{
5
  //Timer
6
  TCCR0 =  (1<<COM00) | (1<<CS00);//| (1<<CS02) ;
7
}
8
9
int main(void)
10
{
11
init_timer0();
12
OCR0 = 0x80;
13
PORTB = 0xff;  //Port B wird H --> LEDs aus
14
DDRB = 0xff;   //Alle Pins von Port B als Ausgang
15
16
while (1)
17
{
18
19
}
20
return 0;
21
}
Die LED an Pin PB3 blinkt zwar aber wenn ich es mir im Debug-Modus 
ansehe akzeptiert der µC das ändern vom OCR-Register nicht. Da bleibt 
konstant 0x00 stehen. Er toggelt auch nur bei TCNT = OCR = 0x00. Wo 
mache ich was falsch? Weisse ich das Register falsch zu?

Danke schon mal für die Antworten.

Gruß Holger

von Wasweissich (Gast)


Lesenswert?

Also dieses TCCR0 kommt mir schonmal komisch vor.
Es gibt TCCR0A und TCCR0B aber TCCR0 kann ich im Datenblatt nicht 
finden.

Genauso COM00.
Es gibt COM0A0 und COM0A1 aber nicht im selben Register wie CS00.

Guck lieber nochmal nach.

von Andreas K. (a-k)


Lesenswert?

@Wasweissich: Bei welchem Mega16 hast du schon mal ein TCCR0A erblickt? 
Guck lieber noch mal nach.

von Wasweissich (Gast)


Lesenswert?

>@Wasweissich: Bei welchem Mega16 hast du schon mal ein TCCR0A erblickt?
>Guck lieber noch mal nach.

Oh. Mist. Habe im 48er Datenblatt geguckt.
Dankeschön

von Holger (Gast)


Lesenswert?

Ok, ich habe den Fehler zwar nicht gefunden, dafür kann ich ihn umgehen.
Mein Prog sieht gleich aus, nur dass ich an stelle von
1
OCR0 = 0x81;
schreibe ich nun
1
 asm volatile ("ldi  r24, 0x81");
2
asm volatile ("out  0x3C, r24");

Damit tut es.
Wenn ich mir die *.lss angesehen habe steht da
  OCR0 = 0x81;
  ca:  81 e8         ldi  r24, 0x81  ; 129
  cc:  81 bf         out  0x31, r24

Der Unterschied steht in der letzten Zeile. Der Compiler schreibt für 
die OCR0-Adresse 0x31. In der Doku und im AVR-Studio steht aber als 
Adresse 0x3C.
Ich schreibe also, wenn ich das richtig verstehe, an die falsche 
Speicheradresse.

Verwenden tue ich AVRstudio 4.13 SP2 build 571 und WinAVR 20060421. Ich 
weiss, dass die WinAVR alt ist, jedoch funktioniert mit den aktuellen 
der Debug-Modus mit dem JTAGICE mkII nicht. Entweder fällt er mit Fehler 
aus (WinAVR 20071221) oder der Debug-Modus startet gar nicht 
(WinAVR20080512).
Vielleicht habe ich da aber auch ein Einstellungsfehler.

von Andreas K. (a-k)


Lesenswert?

Dann solltest du die Definitionen in avr/iom16.h (oder so ähnlich) mal 
kontrollieren.

von Holger (Gast)


Lesenswert?

Hab die Datei gefunden. Da steht folgendes drin:

...
#define OSCCAL  _SFR_IO8(0x31)

#define OCDR    _SFR_IO8(0x31)
...
#define OCR0    _SFR_IO8(0x3C)

Ist IMHO richtig, oder?

von Andreas K. (a-k)


Lesenswert?

Warum sollte der Compiler dann 0x31 daraus machen? Tippfehler? 
Versehentlich redefinierter Makro OCR0? Modul nicht neu kompiliert?

Übersetz das Modul mit avr-gcc -E, dann siehst du was der Präprozessor 
draus macht und such dort drin mal nach der Zeile.

von Holger (Gast)


Lesenswert?

Kopf auf den Tisch knall

Ich bin so doof!!!

Ich habe zwar AVR Studio gesagt, dass ich einen Atmega16 verwende, aber 
nicht dem GCC-Compiler. Da stand noch Atmega128 drin. Jetzt tut es.

Danke euch trotzdem für die Antworten.

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.