PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer0 vom Atmega644 spinnt?



hosti
01.09.2008, 20:28
Guten Abend,
Ich lasse auf einem Atmega644 den Timer0 mit 100khz laufen.
Resp. ich fange alle 0.01ms einen Interupt ab.
Dort lasse ich eine Variable mitzählen um ein PWM Signal zu erzeugen.
Leider ist die Ausgangsfrequenz viel zu tief. Ca. 10mal geringer als erwartet.

So sieht mein Code aus:

#include <avr/io.h> // I/O Port definitions
#include <avr/interrupt.h> // Interrupt macros

#define F_CPU 16000000

#define timer (256-F_CPU/8/100000)

#define SERVOPORT PORTA
#define DDRSERVO DDRA

volatile unsigned int ms;

void timer_init(void)
{
TCCR0B |= (1<<CS01) | (!(1<<CS00)) | (!(1<<CS02)); //Prescaler 8
TCNT0 = timer;
TIMSK0 |= (1<<TOIE0); //Interupts aktivieren

};

ISR(TIMER0_OVF_vect)
{
ms++;
TCNT0 = timer;
if(ms>=1850)
{
PORTA |= (1<<PORTA0);
}
if(ms>=2000)
{
PORTA &= ~(1<<PORTA0); ms = 0;
}


};

int main(void)
{

DDRA |= (1<<PORTA0); //KOMPLETTE PINS A AUSGANG
PORTA &= ~(1<<PORTA0); //PIN 0 LOW

sei(); //GLOBALE INTERUPTS AKTIVIERT

timer_init(); //FUNKTIONSAUFRUF

for(;;)
{

}

}



Ich habe alles mehrfach durchgerechnet und es scheint zu stimmen.

Ich hab mir überlegt ob mein Controller vieleicht doch nicht mit meinen eingestellten 16Mhz läuft :-k Aber auch bei den Fusebits habe ich auf "8.0Mhz -" gestellt.

zerush
01.09.2008, 20:37
edit: sorry, hab mich verguckt...

Hast du einen 16MHz Quarz am Controller?

Was genau hast du bei den Fusebits eingestellt?
Der muss auf "chrystal" stehen, nicht auf "8MHz"...

hosti
01.09.2008, 20:57
Ja, es hängt ein 16Mhz Quarz dran.
Fuse sind auf:

Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 65 ms; [CKSEL=1111 SUT=11]
eingestellt

McJenso
01.09.2008, 21:34
Hallo,
der hat doch auch das "Divide Clock by 8" Bit. Hast du dran gedacht?

Sonst beschreib doch einmal wie du die Ausgangsfrequenz misst. Machst du das mit dem Oszi, kanst du davon Bilder machen?

Gruß

Jens

Hubert.G
01.09.2008, 21:39
Du solltest den "Full Swing Oszillator" nehmen und den "CLKDIV8" abschalten

hosti
01.09.2008, 22:08
Danke für eure Antworten.

@McJenso
Ich habe eine Led dran die fröhlich blinkt.
Ich könnt aber auch mal mit dem Oszi messen, aber die Led hat vieleicht 5Hz... definitiv viel zu wenig.

"Divide Clock by 8" ist eingeschalten. Was heisst den das?

@Hubert.G
Ich dachte "Full Swing Oszillator" sind richtige Oszillatoren und keine Quarze??
Was ist den ein CLKDIV8?

McJenso
01.09.2008, 22:13
Hallo,

mit dem CLKDIV8 oder auch divide clock by 8 wird der Takt durch 8 geteilt. Sprich aus 16 mach 2 Mhz. Stell das um und alles wird gut.

Gruß

Jens

hosti
01.09.2008, 22:16
Danke, ich werds ausprobieren
Wozu ist das den gut? Und betrifft das nur externe Quarze oder sogar den Internen?

markusj
01.09.2008, 23:54
Das betrifft jede Chiptaktquelle, warum? Keine Ahnung, vielleicht um einen stabileren Takt zu bekommen, ich bin gerade im Datasheet über den Hinweis gestolpert, dass man diese Option nutzen kann, wenn VCC zu niedrig für den "normalen" Takt ist.
Ein weiterer Punkt der mit den Teilern in Verbindung erwähnt wird, ist Stromsparen.

mfG
Markus

Hubert.G
02.09.2008, 09:11
Full Swing Oszillator ist der Ersatz für das CKOPT der vorhergehenden Serien. Dieses CKOPT sollte bei Quarze höher 8MHz eingeschalten werden um ein sicheres Schwingen zu gewährleisten. Das ist zumindest meine Interpredation des Datenblatts.