Уважаемые форумчане, помогите разобраться... ATmega8 работает с кварцем 8 Мгц. На вход встроенного компаратора подаю синусоиду 20 кГц от стабильного генератора. По положительному перепаду на выходе компаратора происходит захват значения в Timer/Counter1. Возникает прерывание, значение f увеличивается на 1. Когда f достигает значения d, то PORTC.2 устанавливается в 1 на время 10мкс, а затем снова устанавливается в 0. После этого в основном цикле программы PORTC.3 устанавливается в 1 на время 10мкс, а затем снова устанавливается в 0.
Когда я задаю значение d меньше или равное 255, то все работает нормально, после каждого импульса на выходе PORTC.2 возникает импульс выходе PORTC.3, как и должно быть. Но если я задаю значение d больше или равное 256, то импульсы на выходе PORTC.3 так и продолжают идти, но не каждому из них предшествует импульс на выходе PORTC.2.
Пробовал разные частоты синусоиды - то же самое.
В чем причина?
Фрагмент кода:
CODE
unsigned int d=255; // Заданное кол-во НЧ-периодов счета (кол-во сработок компаратора)
unsigned int f; // Текущее кол-во НЧ-периодов счета (кол-во сработок компаратора)
// Timer1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
// Place your code here
PORTC.0=1;
delay_us(10);
PORTC.0=0;
if (f==1) {
PORTC.1=1;
delay_us(10);
PORTC.1=0;
};
if (f==(d)) {
PORTC.2=1;
delay_us(10);
PORTC.2=0;
};
f=f+1;
}
void main(void)
{
f=0;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
while (f<(d+1));
#asm("cli")
PORTC.3=1;
delay_us(10);
PORTC.3=0;
delay_us(100);
PORTC.4=1;
delay_us(10);
PORTC.4=0;
f=0;
#asm("sei")
};
}
Осциллограммы :
d=255; синий цвет - вых. РС2; желт. цвет - вых. РС3; Здесь все правильно и понятно:
d=256; синий цвет - вых. РС2; желт. цвет - вых. РС3; Видно, что нет импульса на РС2, а соответствующий импульс на РС3 есть:
Желт. цвет - сигнал на входе компаратора; синий цвет - на вых. РС0 (смотри код программы):