Jump to content

    

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

Edited by Auratos

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites
40 minutes ago, Driver_GV said:

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


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

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

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

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

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

TMR0H = 0xCC;
TMR0L = 0xEС;

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites
6 hours ago, Driver_GV said:

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


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

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

Share this post


Link to post
Share on other sites

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

TMR0 = 0xECCC;

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

Share this post


Link to post
Share on other sites
On 11/8/2018 at 6:16 PM, Auratos said:

от внутреннего генератора

2.2.2 INTERNAL FREQUENCY
SELECTION
The  Internal  Oscillator  Frequency  Select  bits
(IRCF<2:0>) select the frequency output of the internal
oscillator block. The choices are the LFINTOSC source
(31.25 kHz),  the  MFINTOSC  source  (31.25 kHz,
250 kHz  or  500 kHz)  and  the  HFINTOSC  source
(16 MHz) or one of the frequencies derived from the
HFINTOSC  postscaler  (31.25 kHz  to  8 MHz).  If  the
internal  oscillator  block  is  supplying  the  main  clock,
changing the states of these bits will have an immedi-
ate  change  on  the  internal  oscillator’s  output.  On
device  Resets,  the  output  frequency  of  the  internal
oscillator is set to the default frequency of 1 MHz.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now