Добрый день форумчане! Изучаю новый контроллер, столкнулся с проблемой настройки тактовой частоты. Первая задача - мигать светодиодом. Светодиод мигает, но вместо периода в 1 сек я получил почему то 2 сек. Вот мой код:
Код:
#pragma config POSCMOD = NONE // Primary Oscillator Select->Primary oscillator disabled #pragma config I2C1SEL = PRI // I2C1 Pin Location Select->Use default SCL1/SDA1 pins #pragma config IOL1WAY = ON // IOLOCK Protection->Once IOLOCK is set, cannot be changed #pragma config OSCIOFNC = ON // Primary Oscillator Output Function->OSC2/CLKO/RC15 functions as port I/O (RC15) #pragma config FCKSM = CSECMD // Clock Switching and Monitor->Clock switching is enabled, Fail-Safe Clock Monitor is disabled #pragma config FNOSC = FRC // Oscillator Select->FRC #pragma config SOSCSEL = SOSC // Sec Oscillator Select->Default Secondary Oscillator (SOSC) #pragma config WUTSEL = LEG // Wake-up timer Select->Legacy Wake-up Timer #pragma config IESO = ON // Internal External Switch Over Mode->IESO mode (Two-Speed Start-up) enabled
// CONFIG1 #pragma config WDTPS = PS32768 // Watchdog Timer Postscaler->1:32768 #pragma config FWPSA = PR128 // WDT Prescaler->Prescaler ratio of 1:128 #pragma config WINDIS = ON // Watchdog Timer Window->Standard Watchdog Timer enabled,(Windowed-mode is disabled) #pragma config FWDTEN = OFF // Watchdog Timer Enable->Watchdog Timer is disabled #pragma config ICS = PGx1 // Comm Channel Select->Emulator EMUC1/EMUD1 pins are shared with PGC1/PGD1 #pragma config BKBUG = OFF // Background Debug->Device resets into Operational mode #pragma config GWRP = OFF // General Code Segment Write Protect->Writes to program memory are allowed #pragma config GCP = OFF // General Code Segment Code Protect->Code protection is disabled #pragma config JTAGEN = OFF // JTAG Port Enable->JTAG port is disabled
Не ленитесь. Откройте pdf на PIC24FJ64GA002 и сделайте так, как рекомендует разработчик контроллера... /Если не требуется сохранения значений в W1 - W3, команды push и pop можно пропустить/
Добавлено after 15 minutes 30 seconds: P.S. Не забудьте в Config-е разрешить программные изменения в OSCILLATOR CONFIGURATION.
Спасибо за отклик, но использовать переключение осцилляторов - не моя основная задача. Моя проблема в том, что я настраиваю тактирование от внутреннего RC генератора на 8 МГц, подключаю PLL x 4 - по идее контроллер должен работать на 32 МГц. Окей, прописываю определение тактовой частоты для макросов задержки #define FCY 32000000UL. Устанавливаю задержку в главном цикле __delay_ms(1000), но по факту получаю задержку в 2 сек!... Эмпирическим путем установил, что если установить FCY 16000000UL, все работает корректно, но не соответствует установленой мною конфигурации контроллера. Вот и хотел разобраться, где натупил. Неужели определение частоты FCY требует Fosc/2??? На других контроллерах такого не бывало
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Что не бывало? Какая разница какая частота у осциллятора? Важно какая системная частота. Про 16 МИПС написано даже в шапке даташита. Желаете более высокую производительность - берите либо PIC24H - 40МИПС, либо PIC24ЕР - 70 МИПС.
Кто компетентен в этом вопросе, может видите ошибку невооруженным глазом? Настраивал по даташиту и статьям с простора интернета.
Павел, хотел бы уточнить - период зажигания - время между началом (передний фронт) зажигания светодиода? Если да, то все как раз как вы и заказали по программе: 1.зажигаем светодиод (инвертируем LATA) 2.ждем секунду (+ возврат в начало) 3.гасим светодиод (инвертируем LATA) 4.ждем секунду (+ возврат в начало) т.е. период сигнала как раз 2 секунды. Или под периодом понималось именно время горение светодиода?
Похоже, у вас могут быть проблемы с настройкой частоты тактового сигнала и функции задержки. Согласно вашему коду, вы используете внутренний быстрый генератор (FRC) в качестве источника системного тактового сигнала. Рассмотрим несколько шагов для проверки и корректировки параметров, чтобы ваш светодиод мигал так, как ожидалось.
Прежде всего, я предлагаю внести следующие изменения и проверки в ваш код:
Определение FCY:
Убедитесь, что определение FCY верно и соответствует вашей фактической тактовой частоте. Настройка OSCCON и CLKDIV:
Проверьте, правильно ли настроены регистры OSCCON и CLKDIV, так как они напрямую влияют на системную тактовую частоту. Использование правильной функции задержки:
Убедитесь, что функция задержки __delay_ms() используется с правильными параметрами, зависящими от определения FCY. Пример измененного кодаhttp://www.chipic.ru #pragma config POSCMOD = NONE // Primary Oscillator Mode Select bits -> Primary oscillator disabled #pragma config I2C1SEL = PRI // I2C1 Pin Location Select bit -> Use default SCL1/SDA1 pins #pragma config IOL1WAY = ON // IOLOCK Protection -> Once IOLOCK is set, cannot be changed #pragma config OSCIOFNC = ON // OSCO Pin Configuration -> OSCO/CLKO/RC15 functions as port I/O (RC15) #pragma config FCKSM = CSECMD // Clock Switching and Monitor -> Clock switching is enabled, Fail-Safe Clock Monitor is disabled #pragma config FNOSC = FRC // Oscillator Select -> Fast RC Oscillator (FRC) #pragma config SOSCSEL = SOSC // Secondary Oscillator Select -> Default Secondary Oscillator (SOSC) #pragma config WUTSEL = LEG // Wake-up Timer Select -> Legacy Wake-up Timer #pragma config IESO = ON // Internal External Switchover -> Enabled
// CONFIG1 #pragma config WDTPS = PS32768 // Watchdog Timer Postscaler -> 1:32768 #pragma config FWPSA = PR128 // WDT Prescaler -> Prescaler ratio of 1:128 #pragma config WINDIS = ON // Watchdog Timer Window -> Standard WDT enabled, (Window mode is disabled) #pragma config FWDTEN = OFF // Watchdog Timer Enable -> WDT disabled #pragma config ICS = PGx1 // ICD Communication Channel Select -> Communicate on PGEC1 and PGED1 #pragma config BKBUG = OFF // Background Debugger Enable -> Device resets into Operational mode #pragma config GWRP = OFF // General Segment Write Protect -> Writes to program memory are allowed #pragma config GCP = OFF // General Segment Code Protect -> Code protection is disabled #pragma config JTAGEN = OFF // JTAG Port Enable -> JTAG port is disabled
#include <xc.h>
#define FCY 8000000UL // Предполагается, что частота FRC равна 8 МГц #include <libpic30.h>
int main () { // Настройка OSCCON для FRC OSCCON = 0b0001000100000000; CLKDIV = 0b0000000000000000; OSCTUN = 0;
AD1PCFG = 0xffff;
TRISA = 0; TRISB = 0;
while (1) { _LATA0 = !_LATA0; __delay_ms(1000); } } Важные моменты проверки: Частота FCY: Убедитесь, что FCY соответствует вашей фактической частоте циклов команд. Если вы используете внутренний быстрый генератор (FRC), его стандартная частота обычно составляет 8 МГц, что означает, что FCY должна быть установлена на 8 МГц. Настройка OSCCON: Убедитесь, что настройки OSCCON соответствуют вашей аппаратной конфигурации. Если вы используете внутренний быстрый генератор, убедитесь, что соответствующие биты настроены правильно. Функция задержки: Функция __delay_ms() зависит от правильного определения FCY. Если FCY неверна, время задержки также будет неточным. Пожалуйста, убедитесь, что эти настройки проверены на вашем оборудовании, и при необходимости обратитесь к техническому описанию вашего микроконтроллера для получения подробной информации о конфигурации. Эти шаги должны помочь вам решить проблему с неточным временем мигания светодиода.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения