Код
void Timers_Init() { // Инициализация Таймеров
// Timer/Counter 0 initialization, Clock source: System Clock, Clock value: Timer 0 Stopped, Mode: Normal top=FFh, OC0A output: Disconnected, OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization, Clock source: System Clock, Clock value: Timer 1 Stopped, Mode: Normal top=FFFFh, OC1A output: Discon.,OC1B output: Discon, OC1C output: Discon., Noise Canceler: Off, Input Capture on Falling Edge, Timer 1 Overflow Interrupt: Off, Input Capture Interrupt: Off, Compare A Match Interrupt: Off, Compare B Match Interrupt: Off, Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
TMR1_CURRENT_VALUE_S=0;
TMR0_BUSY=0;
TMR1_BUSY=0;
};
void Timers_Interrupt_Init() { // Инициализация прерываний от таймеров
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x01;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x01;
};
// Функции управления таймером-1
void TMR1_START(uint16 value, uint8 clkd) {
TCCR1B=clkd;
TCNT1H= value>>8;
TCNT1L= value & 0x00FF;
}
// переполнение через каждую 1мс если считать до 125 и clkd=3
// переполнение будет через каждую 1с если считать до 31250 и clkd=4
void TMR1_STOP(void) {
TCCR1B = 0;
TCNT1H=0;
TCNT1L=0;
}
// Timer/Counter 0 initialization, Clock source: System Clock, Clock value: Timer 0 Stopped, Mode: Normal top=FFh, OC0A output: Disconnected, OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization, Clock source: System Clock, Clock value: Timer 1 Stopped, Mode: Normal top=FFFFh, OC1A output: Discon.,OC1B output: Discon, OC1C output: Discon., Noise Canceler: Off, Input Capture on Falling Edge, Timer 1 Overflow Interrupt: Off, Input Capture Interrupt: Off, Compare A Match Interrupt: Off, Compare B Match Interrupt: Off, Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
TMR1_CURRENT_VALUE_S=0;
TMR0_BUSY=0;
TMR1_BUSY=0;
};
void Timers_Interrupt_Init() { // Инициализация прерываний от таймеров
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x01;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x01;
};
// Функции управления таймером-1
void TMR1_START(uint16 value, uint8 clkd) {
TCCR1B=clkd;
TCNT1H= value>>8;
TCNT1L= value & 0x00FF;
}
// переполнение через каждую 1мс если считать до 125 и clkd=3
// переполнение будет через каждую 1с если считать до 31250 и clkd=4
void TMR1_STOP(void) {
TCCR1B = 0;
TCNT1H=0;
TCNT1L=0;
}
Смысл в том, если в программе забито TMR1_START(0xFF00,4) то прерывание по переполнению счетчика возникает очень быстро. А должно через T=0xFF00/31250 = 2.08 сек. Дальше - интереснее. Если же в программе забито TMR1_START(0x00FF,4) то прерывание по переполнению счетчика возникает не через Т=0x00FF/31250=0.008 сек а через 2 секунды. Т.е. все происходит с точностью до наоборот. Думал ошибка в файле 90USB162.h - нет, там всё согласно свежей версии даташита на МЦУ. Вот что в файле:
Код
#define TCNT1L (*(unsigned char *) 0x84)
#define TCNT1H (*(unsigned char *) 0x85)
#define TCNT1H (*(unsigned char *) 0x85)
В доке смещения для регистров TCNT1L и TCNT1H cоответственно 0x84 и 0x85.
Никто не подскажет что за глюк такой? Ах, да, частота кварца 8МГц, фьюз CLKDIV не активирован.