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.
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.