Gast
#362979
Hallo, ich versuche schon die ganze Zeit einen Timer0 Interrupt mittels CTC Modus hinzubekommen, um einen Takt von 1us für mein Programm zu erzeugen. Die Initialsisierung und der Interrupt funktioniert an sich schon, jedoch ist der kleinste Wert, den ich erreiche 2us! Bei einem Systemtakt von 16MHz (ohne Prescaler) muß das OCR0 Register mit 16 vorgeladen werden. Der Timer0 zählt bis 16 (bei 16MHz = 1us) und wird durch den CTC Modus wieder zurückgesetzt und gleichzeitig wird der SIG_OUTPUT_COMPARE0 Interrupt ausgelöst. Zum Test Toggle ich im Interrupt den PortC. Aber ich messe High bzw. Low Zeiten von genau 2us. ABER: Lade ich das OCR0 Register mit z.B. 64 vor, so messe ich High/Low Zeiten von genau 4us! Dieser Wert ist richtig. Auch für 128 stimmt es. Für 16 erhalte ich auch nur wieder 2us! 2. Versuch: Im Normalmodus von Timer0 muß jedes mal wenn ein SIG_OVERFLOW0-Interrupt ausgelöst wird das Register mit TCNT0=240 vorgeladen werden. Damit verbleiben 16 Takte (= 1us) bis zum nächsten Interrupt. Aber nein, er wird nur aller 2us ausgelöst, auch mit TCNT0=247. Woran kann das liegen??? Folgende Situation: CPU: ATMEGA32-16PU mit 16MHz getaktet Sprache: C (gcc) Der Timer0 (im CTC Modus) wird wie folgt initialisiert: OCR0 = 16; TCCR0 |= (1<<WGM01); // CTC Mod, TCCR0 |= (1<<CS00); // CPU Takt = 16 MHz Danke für eine schnelle Antwort. Stefan