Господа разработчики, подскажите пожалуйста, что я не так делаю? Задача следующая необходимо построить тахометр. На вход МК подается последовательность импульсов с частотой до 100 Гц. Нужно подсчитать количество импульсов за секунду и вывести на индикатор. Я использую 6мегу , кварц 8.0МГц. Завожу сигнал на вход T0 счетчика и снимаю с него параметры каждую секунду. Проблема в том что полученные результаты не постоянны. Т.е. значение на индикаторе скачет в пределах +-4 единицы. Думал, что не стабильно получаю секунду, так проверил на осциллографе… вроде нормально.. Всю голову сломал… У кого какие будут мысли? (пишу в AVR Studio)
Прилагаю код …
Код
#define QZ 8000000L
#define TIME_OCR1A ((QZ / 1024)-1)
int Speed_p;
void Timer1_init(void)
{
OCR1A = TIME_OCR1A; /* прерывание раз в секунду */
TCCR1A = 0x00;
TCCR1B = (1 << 3) | 0x05;
TIMSK |= 1 << 4; /* разрешить прерывание OCIE1A */
}
SIGNAL (TIMER1_COMPA_vect)
{
Speed_p=TCNT0;
TCNT0=0;
}
int main()
{
unsigned int g=0;
char str[10];
Timer1_init();
// Таймер0 считает входные импульсы
// Timer/Counter 0 initialization
TCCR0=0x07;
TCNT0=0x00;
OCR0=0x00;
// Port B initialization
// Func7=Out Func6=Out Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=0 State6=0 State5=T State4=T State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xC8;
sei();
while(1)
{
..........
.// Формируем строку для вывода
g=(float)(Speed_p)*(float)1.66;
str_out[8]=g%10;g/=10;
str_out[7]=g%10;g/=10;
str_out[6]=g%10;
// выводим строку
reload();// динамическая индикация
}