![]() |
|
|
Продукция MICROCHIP Технические вопросы по всей продукции Microchip |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Senior Member
|
![]()
Добрый день!
PIC18F26K22. Возникла непонятная проблема с работой FSCM. В настройках конфигурации - кварц 16 МГц х 4PLL, т.е. работаем на максимуме 64 МГц. При сбое кварца переходим на внутренний генератор на те же 64МГц, но не выходит. Суть проблемы - на внутренний генератор переходит, но частота 16 МГц. При изменении битов конфигурации МК на внутренний генератор - запускается и работает от внутреннего генератора на 64МГц. TMR2 настроен на период 4мс при 64МГц. Смотрю осциллографом период на RA0. При срабатывании FSCM период в 4 раза больше. Почему? Что упустил? Код:
//#pragma config FOSC = INTIO67 // Oscillator Selection bits (Internal oscillator block) #pragma config FOSC = HSMP #pragma config PLLCFG = ON // 4X PLL Enable (Oscillator multiplied by 4) #pragma config PRICLKEN = ON // Primary clock enable bit (Primary clock is always enabled) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled) #pragma config IESO = ON // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled) .............................. #include <xc.h> void interrupt isr(void){ if(TMR2IE && TMR2IF){ TMR2IF = 0; LATA0 = 1 - LATA0; } } void main(){ ANSELA = 0; TRISA = 0x00; PORTA = 0xFF; // настройки внутреннего генератора OSCCON |= 0x70; // INTOSC = 16 MHz OSCTUNE |= 0x40; //**************** настройки TMR2 *********************** PR2 = 250; T2CON = 0x7E; // PRE = 1:16, POST = 1:16, TMR2 = ON. Period 4 ms (@64 MHz) TMR2IE = 1; PEIE = 1; ei(); for(;;){ } }
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3) |
![]() |
![]() |
![]() |
#2 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,679
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
petrd
В целом не полностью понятен вопрос и непонятно, что за код Вы привели. Где у Вас FSCM обработчик? Вот у Вас что-то. В какой-то момент отказывает кварц, у Вас что-то переключается с кварц+pll на frc и Вы попадаете в прерывание по OSCF, где разбираетесь с частотой. У Вас в коде другое совсем. |
![]() |
![]() |
![]() |
#3 | |
Senior Member
|
![]() Цитата:
1. Запускаем на кварце. Контролируем частоту на RA0. Частота соответствует расчетной. 2. Налету убираем кварц. Срабатывает FSCM. Контролируем частоту. Частота в 4 раза ниже расчетной. Нет обработчика. Не нужен. Что он мне дает? Мне пока не надо назад возвращаться на кварц. Скажу больше, я его убрал для уменьшения кода, флаг OSCFIF выставляется. А для включения перехода на внутренний достаточно #pragma config FCMEN = ON. Настройки для внутреннего генератора заданы в коде заранее, поэтому при срабатывании FCMEN по идее МК должен на них перейти, к тому же я эти настройки вижу отладчиком, но увы, частота не соответствует ожиданиям и тому что вижу в OSCCON и OSCTUNE. Что не ясно в коде?
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3) Последний раз редактировалось petrd; 20.11.2020 в 12:59. |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,376
Вес репутации: 1008/63 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
OSCTUNE
правильно настройте... Цитата:
|
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,679
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
petrd
На этом pic на кварце Вы не можете получить 64MHz. 64MHz можно получить только используя PLL. 1. Запускаем на кварце. Контролируем частоту на RA0. Частота соответствует расчетной. - как я понял, Вы запускаете на кварце 16 MHz +pll (*4). Итого 64MHz. 2. Налету убираем кварц. Срабатывает FSCM. Контролируем частоту. Частота в 4 раза ниже расчетной. - расчетная частота по Вашему коду 16MHz +-. Нет обработчика. Не нужен. Что он мне дает? - как минимум переключиться на frc+pll. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,376
Вес репутации: 1008/63 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#7 | ||||
Senior Member
|
![]() Цитата:
Цитата:
Цитата:
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3) |
||||
![]() |
![]() |
![]() |
#8 |
Senior Member
|
![]()
В приведенном коде всего лишь делаем мАААленькую замену:
Код:
#pragma config FOSC = INTIO67 //#pragma config FOSC = HSMP
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3) |
![]() |
![]() |
![]() |
#9 |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,376
Вес репутации: 1008/63 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#10 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,679
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
petrd
Отлично, только как? Конкретный код можете привести? - Вы сами сохранить в стеке контекст, прожечь config, сделать reset и восстановить контекст не можете? |
![]() |
![]() |
![]() |
#11 |
Senior Member
|
![]()
Вы предлагаете МК на лету перешивать себе биты конфигурации и перезапускаться? Так работает FSCM? Вы это серьезно?
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3) |
![]() |
![]() |
![]() |
#12 | |
Senior Member
|
![]() Цитата:
Перл 1 - http://www.microchip.su/showpost.php...98&postcount=4 Перл 2 - http://www.microchip.su/showpost.php...00&postcount=6
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3) |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,376
Вес репутации: 1008/63 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
#pragma config FOSC = INTIO67 на уровне регистров... |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,679
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
petrd
Вы предлагаете МК на лету перешивать себе биты конфигурации и перезапускаться? Так работает FSCM? Вы это серьезно? - я Вам уже сказал как работает FSCM. Расскажу подробней. Если произошел сбой выбранного осциллятора, то через короткое время происходит переход на frc и выставление флага прерывания. В прерывании Вы можете переключиться с frc обратно на выбранный осциллятор или, если он отказал, сделать что хотите. Автоматического переключения обратно на HS+PLL не будет. Если хотите при отвале кварца работать на 64, когда выбран в конфиге HS+PLL, то сохраните контекст, прожгите конфиг на FRC+PLL, перезагрузитесь и восстановите контекст. Других вариантов я не вижу. |
![]() |
![]() |
![]() |
#15 |
Senior Member
|
![]()
Что Вы подразумеваете под автоматическим переключением?
Автоматическое не будет. А ручное?
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3) |
![]() |
![]() |
![]() |
#16 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,679
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
petrd
Что Вы подразумеваете под автоматическим переключением? - что само при восстановлении HS+PLL переключится. А ручное? - в прерывании можете обратно с frc переключить обратно на FOSC. Если кварц не отвалился - переключится. поле SCS регистра OSCCON. В целом обычно состояние системы пытаются как-то отслеживать. Потому как если часто отваливается, то нужно что-то делать другое, нежели очередной раз пытаться переключиться на HS+PLL. |
![]() |
![]() |
![]() |
#17 |
Senior Member
|
![]()
Видимо проблема связана с тем, что PLL работает c INTOSC только, если INTOSC прописан в битах конфигурации. Но явно об этом в даташите нигде не сказано, или плохо смотрел. Тут тоже такой вывод сделан - https://www.microchip.com/forums/m81...spx?high=FSCM+
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3) |
![]() |
![]() |
![]() |
#18 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,679
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
petrd
Но явно об этом в даташите нигде не сказано, или плохо смотрел. - в даташите не сказано, что как-то иначе. Кроме прочего я Вам про это говорил. Вы почему-то считаете, что не надо сохранить контекст, переписать биты конфигурации, перезапустить контроллер и восстановить контекст. Видимо проблема связана с тем - проблема связана с тем, что Вы упорно отказываетесь смириться с возможностями контроллера. Вы случайно не ругались со мной какое-то время назад? |
![]() |
![]() |
![]() |
#19 | |
Senior Member
|
![]() Цитата:
По теме. 1. Вашими же словами - а где в даташите сказано, что так нельзя. Покажете? Есть PLL, есть бит PLLEN, он может работать c INTOSC, но почему-то не всегда. Об этом как понять? 2. Про FSCM. Если работать от кварца без PLL на 16МГц и перейти на INTOSC, то МК продолжит работать на той же частоте 16МГц. Что и требовалось. И никаких костылей с переписыванием битов не надо. Это не нормально использовать возможности МК, а растрата ресурсов для создания костылей. 3. Команды Reset(); будет достаточно после перепрошивки битов средствами МК?
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3) |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,679
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
petrd
1. Вашими же словами - а где в даташите сказано, что так нельзя. - что Вы хотите сейчас услышать? из документации на контроллер следует, что можно так, как можно. Что можно только в конфигурационных битах выставить. Выяснять от ума ли так сделано не буду. И никаких костылей с переписыванием битов не надо. Это не нормально использовать возможности МК, а растрата ресурсов для создания костылей. - младшие пики зло. На странице pic18f26k22 предлогают взять pic18f26q10 - бегло посмотрел, вроде бы q10 сильно меньшее говно чем pic18f26k22. 3. Команды Reset() - думаю что да. Я не знаю, что делает эта команда, но надеюсь что это просто обертка для соответствующей инструкции. |
![]() |
![]() |
![]() |
#21 | |
Senior Member
|
![]() Цитата:
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3) |
|
![]() |
![]() |
![]() |
#22 |
Senior Member
|
![]()
Решение есть, по подсказке besogonа, оно работает, но мне не очень нравится, оно работает в одну сторону, чтобы вернуться назад на кварц надо снова изголяться. Это костыль! А как бы все было просто с работающим во всех режимах PLL.
Код:
// CONFIG1H #pragma config FOSC = HSMP #pragma config PLLCFG = ON // 4X PLL Enable (Oscillator multiplied by 4) #pragma config PRICLKEN = ON // Primary clock enable bit (Primary clock is always enabled) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled) #pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled) .................... #include <xc.h> #include <stdint.h> uint8_t config_byte; uint16_t config_word; void interrupt isr(void){ if(TMR2IE && TMR2IF){ TMR2IF = 0; LATA0 = 1 - LATA0; } if(OSCFIE && OSCFIF){ OSCFIF = 0; FLASH_Write_Config_Byte(0x300001,0x78); config_byte = FLASH_ReadByte(0x300001); if(config_byte == 0x78){ Reset(); } } } void main(){ ANSELA = 0; TRISA = 0x00; PORTA = 0xFF; OSCCON |= 0x70; // INTOSC = 16 MHz OSCTUNE |= 0x40; // PLL OSCFIE = 1; //**************** TMR2 ************************************ PR2 = 250; T2CON = 0x7E; // PRE = 1:16, POST = 1:16, TMR2 = ON. Period 4 ms (@64 MHz) TMR2IE = 1; PEIE = 1; ei(); for(;;){ } }
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3) |
![]() |
![]() |
![]() |
#23 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,679
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
petrd
чтобы вернуться назад на кварц надо снова изголяться - где Вы видите изголение? "Плохо сделано" это полностью нормальная ситуация для pic16 и то, что Вы называете костылем есть обычный способ. В Вашем коде нет сохранения/восстановления. У Вас после ресета код не продолжит исполняться из того состояния, в котором было. Он начнет работать сначала. |
![]() |
![]() |
![]() |
#24 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 565
Вес репутации: 373/41 ![]() ![]() ![]() ![]() |
![]()
Для чего используют битовую операцию OR | при записии значений в регистры?
OSCCON |= 0x70; // INTOSC = 16 MHz OSCTUNE |= 0x40; |
![]() |
![]() |
![]() |
#25 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,679
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
ATAMAN
Если не вдаваться в подробности, то для модификации определенных битовых полей. Программист гарантирует(что в целом видно из кода), что в данный момент времени эти поля будут модифицироваться из одного места, так что так можно делать. |
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблема с RTL8201BL | Рак | Cетевые протоколы и технологии | 13 | 30.01.2017 10:01 |
проблема с обновлением pickit2 | ctef | Продукция MICROCHIP | 13 | 25.08.2008 18:16 |
Проблема с PIC18F452 | MaxPIC | Продукция MICROCHIP | 4 | 09.02.2008 21:47 |
Проблема с кнопками в MPLAB | RexeR | Продукция MICROCHIP | 0 | 14.11.2007 18:18 |
PIC16F689 проблемы с FSCM | 3682_iop | Продукция MICROCHIP | 17 | 02.11.2007 12:50 |