PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CTC



surfer
22.07.2005, 19:29
Also 1. Mal möchte ich sagen, dass ich an einem wichtigen und dringendem Projekt arbeite und darum so am "threaden" bin... (Für die, die meinen ich versuche es nie selbst)

Für eine Frequenzmessung (Rechteck - 5V) benötige ich einen Timer-Interrupt alle 100us. Ich benutze dafür die CTC Funktion um nicht immer wieder den Timer Wert setzen zu müssen. Ich habe meiner Meinung nach alles so gemacht, damit es laufen sollte, jedoch stimmt irgendetwas noch nicht so ganz. Ich möchte mit dem 8er Vorteiler bei einem 4MHz Quarz den Wert auf 50 setzen, was mir theoretisch 100us geben sollte. Jedoch sind es nicht 100us sondern ca. 47us....!!

Ich habe hier mal den Code:


#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

SIGNAL (SIG_OVERFLOW1)
{
PORT an dem die Frequenz gemessen wird, wird auf LOW/HIGH geprüft...
}

int main(void)
{
Ports initialisieren...

TCCR1A=0x00; // Normale Port-Funktionen
TCCR1B=0x0A; // CTC-Mode (No PWM), Prescaler:8;

OCR1AH=0x00;
OCR1AL=0x32; // Wert 50 ins Compare-Register laden

TIMSK=0x04; // Timer1 Overflow Interrupt aktivieren

sei(); // Interrupts aktivieren

while(1)
{
irgendwas machen...
}

}


Meiner Meinung nach sollte nun alle 100us der Interrupt aufgerufen werden... Tja??? Weiss auch nicht was da los ist.

Ich hoffe ihr könnt helfen! Merci!

PicNick
22.07.2005, 20:04
Bei 4 Megaschweinen kriegst du mit
Vorteiler = 8 und
Zähler = 206
100 uS raus.
Wie kommst du auf 50 ?

Edit: Ich weiß schon, du mußt die 50 von 256 abziehen

surfer
23.07.2005, 18:31
Hoppla... 50 von 256 abziehen... tja. Das wäre vielleicht mal ein Ansatz...
Aber ist im Timer1 der CTC überhaupt 8-bit? Nicht 16-bit... Tendiere zwar auf 8-Bit...

SprinterSB
24.07.2005, 10:26
Kommt drauf an wie du Timer1 benutzt, der kann rauf und runterzählen.
Ausserdem ist's das falsche SIGNAL:


SIGNAL (SIG_OUTPUT_COMPARE1A)

ist das, was du wahrscheinlich willst.
Ich hatte hier mal'n Code gepostet, der Timer1 ganau so initialisiert. Zwar mit Prescale=1, aber das anzupassen schaffst du. Such halt mal in meinen Posts...