Views: 2070
При написании первой программы всегда начинает вопрос с чего начать. Пропустим весь процесс установки среды программирования так ка считаем, что это пройденный этап. Программировать будем учиться на языке С XC16. Я считаю для начинающих, это самый простой вариант для обучения, так как ассемблер для 16 разрядных более сложен для понимания, чем для 8 разрядных PIC-контроллеров.
Первое, что необходимо, это какие необходимы начальные строки, чтобы компилятор понял, что мы от него хотим. Первая строка:
#include <xc.h> // подключение процессора
А хотим мы от него, что бы он выбрал из настроек среды MPLAB с каким контроллером мы работаем.
Дальше, для уменьшения наших мук, будем использовать библиотеку libpic30. Поэтому включим следующие две строчки, в первой – разъясняем компилятору какая у нас тактовая частота. Вторая, что будем использовать библиотеку.
#define FCY 32000000UL // определение тактовой частоты для макросов __delay_ms() и __delay_us() #include <libpic30.h> // библиотека функций
Определение тактовой частоты полезно настройки для макросов __delay_ms() и __delay_us().
Теперь надо настроить регистр конфигурации контроллера. Каждая строка имеет комментарий описывающий назначение. В двух словах – используем внутренний генератор с умножителем, запустим сторожевой, таймер. Для чего? Чтобы научиться с первых шагов с ним работать!
//--------------------------------------------------------------------------- // конфигурирование контроллера #pragma config POSCMOD = NONE // Главный генератор отключен #pragma config I2C1SEL = PRI // Использовать SCL1/SDA1 контакты по умолчанию #pragma config IOL1WAY = OFF // Впоследствии состояние IOLOCK может быть изменено с помощью разблокировки #pragma config OSCIOFNC = ON // OSC2/CLKO/RC15 функциями, как порт ввода / вывода (RC15) #pragma config FCKSM = CSDCMD // Переключатель генератора отключен, Fail-Safe монитор генератора отключен #pragma config FNOSC = FRCPLL // Тактирование от внутреннего скоростного генератора через умножитель PLL - (FRCPLL) #pragma config SOSCSEL = LPSOSC // Вторичный генератор внутренний низкоскоростной 31 кГц LPRC генератор (LPSOSC) #pragma config WUTSEL = FST // Быстрый пробуждения таймер #pragma config IESO = OFF // IESO режим (две скорости запуска) отключены #pragma config WDTPS = PS1024 // Сторожевой таймер Postscaler #pragma config FWPSA = PR128 // Сторожевой таймер Prescaler соотношении 1: 128 #pragma config WINDIS = ON // Оконный режим сторожевого таймера - отключен #pragma config FWDTEN = ON // Сторожевой таймер выключен #pragma config ICS = PGx1 // Эмулятор EMUC1/EMUD1 выводы совместно с PGC1/PGD1 #pragma config COE = OFF // Сброс в рабочий режим #pragma config BKBUG = OFF // Устройство сбрасывает в рабочий режим #pragma config GWRP = OFF // Запись в память программы отключены #pragma config GCP = ON // Код защита включена для всего пространства памяти программы #pragma config JTAGEN = OFF // JTAG порт отключен
Сама первая программа это показать для самого себя, что контроллер начал работать, а для этого мы будем использовать индикацию на наших светодиодах подключенных портам (см. схему).
Программа, практически всегда, должна начинаться с настройки основного генератора, после этого необходимо перейти к настройке портов ввода вывода, а после можно перейти к этого основному циклу, в котором будет “вечно” работать наше устройство.
Настройка тактового генератора:
// настройка тактового генератора OSCCON=0b00000111000000001; // |||||||||||||||+-- OSWEN: выбор генератора определяется в регистре конфигураций // ||||||||||||||+--- SOSCEN: вторичный внутренний генератора 32 кГц отключен // |||||||||||||+---- неиспользуемый // ||||||||||||+----- CF: флаг детектора сбоя тактового генератора // |||||||||||+------ неиспользуемый // ||||||||||+------- LOCK: флаг состояния работы PLL модуля // |||||||||+-------- IOLOCK: блокировка активна // ||||||||+--------- CLKLOCK: часы и PLL выбор не заблокирован // |||||+++---------- NOSC2:NOSC0: новый генартор 001 - Тактирование от внутреннего скоростного генератора через умножитель PLL - (FRCPLL) // ||||+------------- неиспользуемый // |+++-------------- COSC2:COSC0: текущий генаратор 001 - Тактирование от внутреннего скоростного генератора через умножитель PLL - (FRCPLL) // +----------------- неиспользуемый // настройка регистра делителя тактовой частоты CLKDIV=0b0000000000000000; // ||||||||++++++++-- неиспользуемые // |||||+++---------- RCDIV2:RCDIV0:постделитель - 000 = 8 MHz (divide by 1) // ||||+------------- DOZEN: делитель отключен, тактирование 1:1 (первый делитель тактовой частоты) // |+++-------------- DOZE2:DOZE0: - 1:1 // +----------------- прерывания не влияют DOZEN // регистр калибровки внутреннего тактового генератора OSCTUN=0;
По регистру OSCCON хотелось бы добавить, пока мы не трогаем флаг блокировки IOLOCK, он будет вести себя как обычный регистр, но если его установить, то в зависимости от условий в регистре состояния, мы или не сможем его в последствии программе изменить или нам придется выполнять последовательность разблокирование для того чтобы, в нем что-то изменить.
Настройка портов:
AD1PCFG = 0xffff; // все выводы цифровые TRISA = 0; // разряды порта A на выход TRISB = 0; // разряды порта B на выход
И сам главный цикл программы, в нем мы используем банальную задержку для управления анимации светодиодов.
while(1) { ClrWdt(); // сброс сторожевого таймера _LATA0 = 0; // выключить светодиод _LATB0 = 1; // включить светодиод __delay_ms(500); // ждать 0,5 секунды _LATA0 = 1; // включить светодиод _LATB0 = 0; // выключить светодиод __delay_ms(500); // ждать 0,5 секунды }
Первая программа – мигание светодиода, для встроенных систем, это как “Привет Мир”. Светодиод мигает – мир радуется!
Демонстрационное видео
Проект для загрузки
Это может быть интересно
- MPLAB® Code Configurator and EncoderViews: 1419 Еще раз про энкодер… Для некоторых приложений очень удобно и экономически выгодно, для настройки и управления использовать энкодер. Такие энкодеры имеют строенную тактовую кнопку которую можно применить для выбора …
- PIC18F25K42 – v. A001 – выявленные баги.Views: 606 Модуль I2C Не работает при использовании в стандартной конфигурации MCC. Требует особой нестандартной конфигурации и управления для нормальной работы. Обойти Обход проблемы возможен библиотека см статью. Модуль ADC2 На …
- ch-4050 – дифференциальный терморегуляторViews: 1872 ch-4050 – это не новая модель, это расширенная версия универсального терморегулятора ch-4000. Различия коснулись в появлении новой функции дифференциального регулирования. Это вид регулирования по разности температур измеренного двумя …
- Temperature measurement with NTC thermistor.Views: 291 Проекты в которых присутствовало измерение температуры начинал с цифровых датчиков, т.к. в них все просто и не надо ничего преобразовывать и вычислять. При использовании цифровых датчиков ты получаешь …
- LATINO – открытый проект ch-светомузыкиViews: 1656 Проект построенный на некоторых принципах ch-светомузыка. Проект ознакомительный предназначен, для самостоятельного построения простого и эффективного светосинтезатора. Вывод осуществляется на ВОУ собранной на драйверах HL1606. Для этого была …
- Проект с использованием MCC часть 11Views: 856 Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость …
- Проект с использованием MCC часть 07Views: 978 Модуль PWM – широтно импульсная модуляция (ШИМ). ПИК контроллеры часто на борту имеют модули ШИМ. На их основе строятся многие узлы управления электро приводами. В нашем варианте мы …
- CLUBBEST – reasoning on the visualization of music.Views: 127 ВІД ЗАХОДУ ДО СВІТАНКУ АБО ПОБАЧИТИ МУЗИКУ. Час доби, коли почуття людини загострюються, – це час від заходу до світанку. В цей час людина відкрита для …
- NeoPixel LED и PIC18Views: 1674 Еще раз об управлении светодиодами на драйвере WS2812 и ему подобных. Как известно эти светики управляются по однопроводной шине. Основная особенность, что программно можно описать передачу данных, …
- Дифференциальный терморегуляторViews: 3995 Дифференциальный терморегулятор ch-3020 Назначение. Ch-c3020 представляет собой дифференциальный терморегулятор. Основное назначение солнечные системы горячего водоснабжения, а также вентиляционные системы управление притоком свежего воздуха. Контроллер позволяет работать пяти режимах. …