Forum: Mikrocontroller und Digitale Elektronik Ich weiß nicht mehr weiter... ATMega128 und Timer0


von Der T. (Gast)


Lesenswert?

Hi!

Ich möchte mit dem Timer0 vom ATMega128 einen 10ms-Interrupt erzeugen
(=100Hz). (Quarzfrequenz 11059200Hz)

Hab den Vorteiler auf 1024 und den Reload-wert auf 148.

Jedoch bekomme ich am Test-Ausgang (Pin PC6) anstatt der erwarteten
Frequenz von 50Hz das 8fache, nämlich 400Hz! :-O

F_CPU wird im Makefile definiert. Auch wenn ich T0_RELOAD fest mit 148
definiere, macht es keinen Unterschied...


Hier der Code:
===================
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdlib.h>
#include <string.h>

#define T0_RELOAD (256-((F_CPU/1024)/100))

/* Test-Variablen definieren */
volatile unsigned char test=0;

/* Funktionen deklarieren */
void INIT(void);

/* Hauptfunktion */
int main(void)
{
 INIT(); // Initialisierungsroutine aufrufen

 DDRC=0x40; // Testausgang PC6

 while(1) { }

 return 0;
}


/* Interrupt-Routine Timer0-Überlauf => 10ms */
SIGNAL (SIG_OVERFLOW0)
{
TCNT0 = T0_RELOAD; // Timer0 vorbelegen

 if (test) { PORTC &= 0xbf; test=0; } else { PORTC |= 0x40; test=1; }

}


void INIT(void)
{
 /* Timer0 als 10ms-Taktgeber per Interrupt definieren */
 TCCR0 = (1<<CS00)|(1<<CS02);  // Timer0 => F_CPU / 1024
 TCNT0 = T0_RELOAD;    // Timer0 vorbelegen
 TIMSK |= (1<<TOIE0);    // Interrupt Overflow0 freigeben
 sei();        // Globale Interruptfreigabe
 return;
}

===================

Was kann hier noch faul sein?

Fuse-Bits sollten auch alle passen:
-M103C deaktiviert (andernfalls geht garnix)
-JTAG, OCD, WDTON, BOOTRST deaktiviert
-Takt: Ext XTAL, High frequency
-Keine Lockbits (alle Mode 1)

Wäre über Tipps was ich noch vergessen haben könnte echt dankbar!

MfG
Techniker

von Die Laborratte (Gast)


Lesenswert?

Beim Mega128 musst du für Teiler 1024 CS0, CS1 und CS2 setzen:

TCCR0 = (1<<CS00)|(1<<CS01)|(1<<CS02);  // Timer0 => F_CPU / 1024

Ist anders als bei den kleineren AVRs...

von Irgwer (Gast)


Lesenswert?

Ganz einfach,

dein Prescaler hast du auf 128 statt 1024 eingestellt:

TCCR0 = (1<<CS00)|(1<<CS02);  // Timer0 => F_CPU / 1024

korrekterweise solltest du auch noch das Bit (1<<CS01) setzen.

von Der T. (Gast)


Lesenswert?

megaschäm_und_unten_den_schreibtisch_kriech

Danke!

Wer lesen kann, ist hald klar im Vorteil...  ;)
(Seite 103 im Datenblatt)

von Werner B. (Gast)


Lesenswert?

Warum soll es nur uns so ergehen  *<:-))

von Richard Brose (Gast)


Lesenswert?

Mmmhh das verstehe ich nicht.
Muss man die Variablen nicht auch füllen?

   OCR1AL = 0x09;
   OCR1AH = 0x3d;
   TCNT1L = 0xf7;
   TCNT1H = 0xc2;

Wenn nein, wozu sind denn die dann da?

von The Daz (Gast)


Lesenswert?

Richard,
diese Register sind nur fuer Timer 1 erheblich, oben wurde aber von
Timer 0 gesprochen.

von Werner B. (Gast)


Lesenswert?

Zudem sind es keine Variablen sondern steuerungs Register.

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.