Добрый день. У меня контроллер PIC18F25K22. Пытался завести таймер TMR0 с частотой прерываний 1мс. Но на деле получаю 1,31мс. И не пойму, почему так. Настройки таймера рассчитал вручную, а затем с помощью программы PIC Timer Calculator. Данные сошлись, но по факту частота не та. У меня внешний тактовый генератор 4,9152МГц с включенной PLL. От этого и отталкивался. Считал, что на CLKOUT имею 4915200Гц. Значит в 16-битном режиме для 1мс мне понадобится 4916 приращений таймера. Сделал предзагрузку 0xECCC. И получил не то, что хотел.
Вот такие у меня настройки источника тактирования:
#pragma config WDTEN = SWON // сторожевой таймер
#pragma config WDTPS = 512 // скорость работы сторожевого таймера
#pragma config FOSC = HSMP // частота тактового генератора
#pragma config PLLCFG = ON
#pragma config PRICLKEN = ON
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRTEN = ON
//#pragma config BORV = 285
#pragma config BOREN = OFF
#pragma config PBADEN = OFF
#pragma config XINST = OFF
И вот настройки таймера:
// обработка прерывания таймера TMR0
void tmr0_int(void)
{
INTCONbits.TMR0IF = 0; // сброс переполнения таймера
T0CONbits.TMR0ON = 0;
TMR0L = 0xСС;
TMR0H = 0xEC;
T0CONbits.TMR0ON = 1;
LED_SW;
}
// инициализация таймера TMR0
void tmr0_init(void)
{
T0CONbits.T08BIT = 0; // 16-ти разрядный таймер
T0CONbits.T0CS = 0; // тактирование от осцилятора 4*Fosc/4
T0CONbits.T0SE = 0; // приращение по переднему фронту импульса
T0CONbits.PSA = 1; // предделитель не используется
T0CONbits.T0PS = 0; // коэф. предделителя не используется
TMR0L = 0xСС; // регистр таймера в ноль
TMR0H = 0xEC;
INTCON2bits.TMR0IP = 1; // приоритет прерывания TMR0 - высокий
INTCONbits.TMR0IE = 1; // разрешить прерывание по переполнению TMR0
T0CONbits.TMR0ON = 1;
}
Частоту смотрю на осциллографе по светодиоду, состояние которого меняю каждое прерывание. Схема подключения внешнего тактового генератора на фотографии. Подскажите, пожалуйста, в чем может быть загвоздка? В Fosc выбрал не тот режим? Завел еще таймер TMR1. В регистре T1CONbits в бите TMR1CS ставил и 00 и 01. После соответствующего пересчета получал все то же значение частоты.
TMRxCS<1:0>: Timer1/3/5 Clock Source Select bits
11 =Reserved. Do not use.
10 =Timer1/3/5 clock source is pin or oscillator:
If TxSOSCEN = 0:
External clock from TxCKI pin (on the rising edge)
If TxSOSCEN = 1:
Crystal oscillator on SOSCI/SOSCO pins
01 =Timer1/3/5 clock source is system clock (FOSC)
00 =Timer1/3/5 clock source is instruction clock (FOSC/4)
Еще подскажите, пожалуйста, как начать тактироваться от внутреннего тактового генератора. Где это настраивается? В регистре OSCCON?