Visits: 2024
При написании первой программы всегда начинает вопрос с чего начать. Пропустим весь процесс установки среды программирования так ка считаем, что это пройденный этап. Программировать будем учиться на языке С 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 секунды }
Первая программа – мигание светодиода, для встроенных систем, это как “Привет Мир”. Светодиод мигает – мир радуется!
Демонстрационное видео
Проект для загрузки
Это может быть интересно
- Проект с использованием MCC часть 06Visits: 1223 Изменим схему следующим образом добавим две тактовые кнопки BT1 и BT2. Теперь переключимся на конфигурацию выводов, для этого сделаем двойной клик в окне Ресурсы проекта на Pin Module. …
- 12-BIT A/D CONVERTER WITH THRESHOLD DETECT на примере PIC24FJ128GA204Visits: 795 Введение. 12-битный модуль A/D Converter является усовершенствованной версией 10-битного модуля, предлагаемого на некоторых устройствах PIC24. Оба модуля являются преобразователями, в своих ядрах, с последовательным приближением (SAR), в окружении …
- Униполярный шаговый двигательVisits: 2134 В приводах различных устройств часто применяются шаговые двигатели, Шаговый двигатели различают двух типов униполярные – когда обмотки коммутируются током текущим только в одну сторону, например при …
- Просто о структурах и объединениях в СиVisits: 2133 Какие задачи нам позволяют решать структуры и объединения? Для разработчика встроенных систем эффективность и компактность кода всегда на первом месте. Если программировании на Ассемблере ты сам определяешь как …
- REFERENCE CLOCK OUTPUT MODULEVisits: 479 REFERENCE CLOCK OUTPUT MODULE Модуль формирования опорного тактового сигнала Модуль опорного тактового сигнала обеспечивает возможность посылать сигнал синхронизации на тактовый опорный выходной контакт или контакты (CLKR) в зависимости от …
- Проект с использованием MCC часть 14Visits: 786 С выводом данных на дисплей мы справились (но могу сразу сказать библиотеку графики к этой статьи пришлось доработать, поэтому в этом проекте она обновлена). У нас на текущем …
- Датчик контроля протечки воды ch-c0020Visits: 1927 Как здорово летом под теплым дождем с тобою вдвоем оказаться. Как классно по лужам бежать босиком, с тобою играть и смеяться! Но совсем грустно оказаться под таким дождем, который течет с …
- Просто о внешних переменныхVisits: 754 Часто возникает задача когда необходимо предавать данные между модулями программы. Например, передать данные между файлами, или управлять работой модулей. Для этого создаем заголовочный файл и описываем наши переменные как …
- LED модуль P10 (1R) V706AVisits: 7610 Это еще одно чудо от китайского брата. Это монохромные матрицы, называются они P10 (1R) V706A, ну типа R-красные, но не верьте паяют светики и зеленые и синие, в общем …
- Униполярный шаговый двигатель – часть 2Visits: 766 В этой части только итог и версия 2.0 универсальной, которая позволяет управлять шаговым двигателем во всех трех режимах и 3.0 специальной библиотеки только для одного полушагового режима. В …