Auratos 0 8 ноября, 2018 Опубликовано 8 ноября, 2018 (изменено) · Жалоба Добрый день. У меня контроллер 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? Изменено 8 ноября, 2018 пользователем Auratos Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Driver_GV 1 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба Прочесть даташит, раздел 11.3 Timer0 Reads and Writes in 16-Bit Mode. В исходнике строки TMR0L = 0xСС; TMR0H = 0xEC; Поменять местами. Сначала пишем в H , потом в L Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Auratos 0 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба 40 minutes ago, Driver_GV said: В исходнике строки TMR0L = 0xСС; TMR0H = 0xEC; Поменять местами. Сначала пишем в H , потом в L Честно говоря, я и не знал, что это играет роль. Надо именно порядок поменять? TMR0H = 0xEC; TMR0L = 0xСС; Или значение предзагрузки поменять местами? TMR0H = 0xCC; TMR0L = 0xEС; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Driver_GV 1 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба Менять порядок записи TMR0H = 0xEC; TMR0L = 0xСС; В даташите есть даже картинка. При записи в H - попадает в промежуточный регистр А при записи в L - пишется одновременно в L и из промежуточного в H Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Auratos 0 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба 6 hours ago, Driver_GV said: Менять порядок записи TMR0H = 0xEC; TMR0L = 0xСС; Спасибо за помощь. Завтра на работе проверю этот вариант. А по поводу тактирования от внутреннего генератора не подскажите? Как его выбрать источником и выбрать частоту, на котором он работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба Или еще проще так TMR0 = 0xECCC; Компилятор сам порядок правильный применит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
siargy 6 3 декабря, 2018 Опубликовано 3 декабря, 2018 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться