Перейти к содержанию

    

PIC18F25K22. Настройка прерываний таймера

Добрый день. У меня контроллер 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?

o3HjHrTjL_w.jpg

Изменено пользователем Auratos

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прочесть даташит, раздел   11.3 Timer0 Reads and Writes in
16-Bit Mode.

В исходнике  строки   

    TMR0L = 0xСС;
    TMR0H = 0xEC;

Поменять  местами.  Сначала пишем в H ,  потом в  L

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
40 minutes ago, Driver_GV said:

В исходнике  строки   


    TMR0L = 0xСС;
    TMR0H = 0xEC;

Поменять  местами.  Сначала пишем в H ,  потом в  L

Честно говоря, я и не знал, что это играет роль. Надо именно порядок поменять?

TMR0H = 0xEC;
TMR0L = 0xСС;

Или значение предзагрузки поменять местами?

TMR0H = 0xCC;
TMR0L = 0xEС;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Менять порядок записи 

TMR0H = 0xEC;
TMR0L = 0xСС;

В даташите есть даже картинка. 

При записи  в H - попадает  в промежуточный регистр 

А при записи  в L  - пишется одновременно  в L и  из промежуточного  в H

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
6 hours ago, Driver_GV said:

Менять порядок записи 


TMR0H = 0xEC;
TMR0L = 0xСС;

Спасибо за помощь. Завтра на работе проверю этот вариант. А по поводу тактирования от внутреннего генератора не подскажите? Как его выбрать источником и выбрать частоту, на котором он работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или еще проще так

TMR0 = 0xECCC;

Компилятор сам порядок правильный применит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти