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

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;

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

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


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

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.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...