Hi,
ich verwende den Timer0 eines Mega32 im CTC-Modus. Ich habe einen 16MHz Quarz angeschlossen, Fuses sind gesetzt. Ich möchte Interrupt alle 2µs auslösen.
Welchen Wert muss ich nun einsetzen? Prescaler habe ich ausgeschaltet (Clocksource ist also der Systemtakt (16MHz)).
Meine Berechnung:
Ein Takt dauert 1 / 16MHz = 62.5ns
Ich muss also alle (2µs / 62.5ns = 32) Takte einen Interrupt auslösen.
Folglich stelle ich OCR auf 32.
Es ergibt sich aber (mit Oszi-Messung), dass der Zeitabstand zwischen den IRQs (gemessen wird PORTA:0) etwas größer ist als 2µs (genauer gesagt: er ist 2,3µs groß).
Woran liegt das?
Dachte, es liegt vllt daran, dass durch den IRQ-Aufruf Zeit verbraucht wird, aber das sollte sich ja ausgleichen.
Gruß, CowZ
PS: Hier der Code:
Code:
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
uint8_t sync;
int main(void)
{
DDRA = 0xFF;
// Timer initialisation
// CTC
TCCR0 |= (1<<WGM01);
TCCR0 &= ~(1<<WGM00);
// OC0 disabled
TCCR0 &= ~( (1<<COM01) | (1<<COM01) );
// Clock
TCCR0 |= (1<<CS00);
TCCR0 &= ~( (1<<CS02) | (1<<CS01) );
// OCR Settings
OCR0 = 32;
// IRQ-Settings
TIMSK |= (1<<OCIE0); // Compare Match IRQ
sync = 0;
sei();
while(1)
{};
}
ISR(TIMER0_COMP_vect)
{
if (sync)
{
PORTA = 1;
sync = 0;
}
else
{
PORTA = 0;
sync = 1;
}
}
Lesezeichen