Views: 1124 Во многих системах управления, для формирования управляющих сигналов требуется модуль ШИМ, он позволяет не только формировать импульсы заданной длительности, но и с применением обычного RC фильтра строить простые ЦАП. MCC -позволяет быстро и легко настроить модули OC в PIC24 для работы с ШИМ. Структурная схема модуля в режиме ШИМ: Процедура настройки модуля для …
Читать далее MCC PIC24 – модуль OUTPUT COMPARE – режиме ШИМ
Метка:PIC24
12-BIT A/D CONVERTER WITH THRESHOLD DETECT на примере PIC24FJ128GA204
Views: 823 Введение. 12-битный модуль A/D Converter является усовершенствованной версией 10-битного модуля, предлагаемого на некоторых устройствах PIC24. Оба модуля являются преобразователями, в своих ядрах, с последовательным приближением (SAR), в окружении ряда аппаратных функций для гибкой конфигурации. Эта версия модуля расширяет функциональность, обеспечивая 12-битное разрешение, более широкий диапазон параметров автоматической выборки, более тесную интеграцию с другими …
Читать далее 12-BIT A/D CONVERTER WITH THRESHOLD DETECT на примере PIC24FJ128GA204
HVLD модуль на примере PIC24FJ128GA204
Views: 640 HVLD модуль представляет собой простое устройство, для контроля напряжения питания микроконтроллера или внешнего напряжения (через делитель). Его задача при “выходе” напряжения за заданные пределы сформировать сообщение микроконтроллеру, что необходимо выполнить соответствующие действия.
АЦП ADS1230 и PIC24FJ64GA004
Views: 1153
АЦП ADS1230 – это 20 битный АЦП со скоростью измерения 10 или 80 раз в секунду. При подаче питания АЦП постоянно выполняет измерения. Данные можно получить с него по SPI шине. Максимальная тактовая частота шины до 1 мГц. Каждое измерение выполненное АЦП инициализируется самим АЦП по шине данных положительным импульсом. Чтение микроконтроллер должен начинать по получению отрицательного фронта.
Данные передаются старшим битом в перед для чтения 20 бит необходимо 3 байта. Данные выровнены влево.
Для чтения данных необходимо настроить SPI по отрицательному фронту синхроимпульсов.
Управляя количеством синхроимпульсов можно управлять функциями АЦП, одна из них это калибровка АЦП.
Калибровки смещения
Калибровка смещения может быть начата в любое время для компенсации в ADS1230 погрешности смещения. Чтобы начать калибровку смещения, необходимо по крайней мере, два дополнительных SCLKs после получения 20 бит данных. Данные мы получаем чтением 24 бита. Если продолжить формирование SCLK, то задний фронт 26-го SCLK начинается цикл калибровки. Дополнительные импульсы SCLK могут быть отправлены после 26 SCLK, однако, активность на шине SCLK должны быть сведены к минимуму, во время калибровки смещения, для достижения наилучших результатов. В течение выполнения функции калибровки, аналоговые входные контакты отсоединены от входов АЦП и соответствующий сигнал подается внутри, чтобы выполнить калибровку. Когда калибровка завершена, DRDY/DOUT переходит в низкий уровень, что указывает, что новые данные готовы. Первое преобразование после калибровки содержит достоверные данные.
Стандартная схема подключения АЦП к мосту датчика для измерения веса.
Вариант подключения АЦП к PIC24FJ64GA004.
Подключение будет выполнено к SPI2
void init_spi2 (void) // настройка SPI2 /* настраивается только на приём данных * данные с АЦП */ { /* SPI2 - настройка для работы с входным усилителем и индикатором * PPRE * 11 = Primary prescale 1:1 * 10 = Primary prescale 4:1 * 01 = Primary prescale 16:1 * 00 = Primary prescale 64:1 * SPRE * 111 = Secondary prescale 1:1 * 110 = 2 * 101 = 3 * 100 = 4 * 011 = 5 * 010 = 6 * 001 = 7 * 000 = Secondary prescale 8:1*/ // RPOR4bits.RP9R=0b01001; // SPI2 Slave Select Output//CS // RPOR6bits.RP12R=0b01010; // SPI2 Data Output RPINR22bits.SDI2R = 20; // SPI2 Data Input - RP20/ нога 37 RPOR10bits.RP21R=11; // SPI2 Clock Output SPI2STATbits.SPIEN = 0; // выключить SPI2CON1 = 0b0000000000111001; //FCY/1/6=50/6=8,3 /* ||||||||||||||++--- PPRE<1:0>: настройка предделителя 1 11 = Primary prescale 4:1 * |||||||||||+++----- SPRE<2:0>: настройка предделителя 2 111 = Primary prescale 8:1 * ||||||||||+-------- MSTEN: 1 = Режим ведущего, 0 = режим ведомого * |||||||||+--------- CKP:0 = пассивный уровень шины SCL 1- высокий, 0-низкий * ||||||||+---------- SSEN:Slave Select Enable bit (Slave mode) * |||||||+----------- CKE: смена бита данных происходит: 1-от активного в пассивное(синх-0/1)/0-пассивного в активное (синх-1/0) * ||||||+------------ SMP:0 = Input data sampled at middle of data output time * |||||+------------- MODE16: Communication is word-wide (8 bits) * ||||+-------------- DISSDO: 0-в работе * |||+--------------- DISSCK: 0-в работе * +++---------------- не используются */ SPI2CON2 = 0b0000000000000000; /* |||||||||||||||+--- не используется * ||||||||||||||+---- FRMDLY: * |||+++++++++++----- не используются * ||+---------------- FRMPOL: * |+----------------- SPIFSD: * +------------------ FRMEN: */ SPI2STAT = 0b1000000000000000; /* |||||||||||||||+--- SPIRBF: Флаг приемного буфера 1 - данные приняты 0- прием выполняется SPI2RXB пуст * ||||||||||||||+---- SPITBF: Флаг передатчика 1 - передача не началась (буфер полон), 0 - передача началась буфер пуст (устанавливается сбрасывается аппаратно) * ||||||||||++++----- не используются * |||||||||+--------- SPIROV: 1 - произошло переполнение 0 - нет переполнения премного буфера. * |||++++++---------- не используются * ||+---------------- SPISIDL: режим работы в состоянии ожидания 0 - работает 1 - отключен модуль * |+----------------- не используется * +------------------ SPIEN: 1 - модуль включен 0 - выключен. */ SPI2STATbits.SPIEN = 1; // БИТ Включить - должен быть активирован последним, чтобы вступили в действии все изменения. }
Сама обработка данных и синхронизация выполняется через прерывания по входу через которые на SPI2 поступают данные. Настройка прерывание:
void ADCIZ (void)// включить измерение { ADCVMOSST=1; // подать питание на датчик ADCPDWN=1; // включить ADC CNEN2bits.CN25IE=1; // разрешить прерывание по входу _CNIF = 0; // сбросить прерывание _CNIE = 1; // включить прерывание }
Первые две строчки это если есть необходимость в управлении подачей питания на измерительный мост и управления режимом “слип” АЦП. Следующие три строки это настройка режима прерывания по входу через который АЦП получает данные.
Получение данных происходит через функцию прерывания:
void __attribute__((interrupt, auto_psv)) _CNInterrupt (void) { unsigned long datain; _LATB2=!_LATB2; // индикация работы АЦП while(PORTCbits.RC4); // ожидать низкого уровня на входе SPI2BUF=0; // запуск чтения while(!SPI2STATbits.SPIRBF); // ожидать загрузки буфера datain=SPI2BUF; ADCbufer[ucazad]=datain<<16; // загрузка данных в буфер, сброс бита SPIRBF SPI2BUF=0; // запуск чтения while(!SPI2STATbits.SPIRBF); // ожидать загрузки буфера datain=SPI2BUF; ADCbufer[ucazad]+=datain<<8; // загрузка данных в буфер, сброс бита SPIRBF SPI2BUF=0; // запуск чтения while(!SPI2STATbits.SPIRBF); // ожидать загрузки буфера datain=SPI2BUF; ADCbufer[ucazad++]+=datain; // загрузка данных в буфер, сброс бита SPIRBF if(ucazad==filtrADC)ucazad=0; // инициализация указателя. //калибровка if(Bit.calADC) // если установлен выполнить калибровку { Bit.calADC=0; // сбросить флаг калибровки SPI2BUF=0; // while(!SPI2STATbits.SPIRBF); // ожидать загрузки буфера datain=SPI2BUF; // сброс бита SPIRBF } _CNIF = 0; // сброс прерывания }
Флаг Bit.calADC – предназначен для активирования режима калибровки. Данные загружаются в буфер ADCbufer[] размер которого может быть ограничен переменной filtrADC.
Это может быть интересно
WiFi ESP8266 – AT команды связанные с функцией Wi-Fi
Views: 5382 AT команды связанные с функцией Wi-Fi Функции Wi-Fi подключения, запускаться из командной строки Команда Описание 1 AT+CWMODE Проверка, настройка режима работы Wi-Fi (sta/AP/sta+AP), (не рекомендуется для новых проектов). 2 …ch-4050 – дифференциальный терморегулятор
Views: 1868 ch-4050 – это не новая модель, это расширенная версия универсального терморегулятора ch-4000. Различия коснулись в появлении новой функции дифференциального регулирования. Это вид регулирования по разности температур измеренного двумя …Акриловый корпус для платы ch-4000
Views: 650 Плата ch-4000 подходит для монтажа в корпуса на дин рейку, но для домашней автоматики необходимо что-то другое, поэтому был разработан корпус из акрила который позволит создавать настольные и настенные устройства. Корпус …ch-4000 – универсальная печатная плата
Views: 1004 На смену устаревшей плате ch-3000, пришла новая ch-4000. Плату уже можно приобрести в магазине Ворон. Схема. Плата позволяет создавать таймеры, часы реального времени, регуляторы температуры, регуляторы влажности, вольтметры, …LCD индикаторы на драйвере ML1001
Views: 1910 ML1001 – статический LCD GOG (чип в стекле) драйвер для 40-сегментного LCD в позолоченном противоударном исполнении. На них можно каскадно строить цельные из 80 или 120 сегментов LCD индикаторы. …Проблемы классической светомузыки
Views: 2066 Светомузыка – что это такое? Определение: Светомузыка (жаргонное: цветомузыка) — вид искусства, основанный на способности человека ассоциировать звуковые ощущения со световыми восприятиями. Такое явление в неврологии получило название …Гаджеты для домашней автоматики – Емкостной сенсор
Views: 1606 Управление светодиодным освещением – Сенсор емкостной. Данный гаджет предназначен для управления освещением где необходимо включением освещение сенсорным прикосновением. Датчик позволяет управлять светодиодной нагрузкой в виде модулей или светодиодных лент …TDA7294 part 1
Views: 274 TDA7294 має унікальні дані для створення підсилювачів звукової частоти HI-FI класу. Варіант застосування є конфігурація BRIDGE (мостова схема включення), де використовуються два TDA7294, як показано на схематичній діаграмі …Контроллер управления светодиодным освещением с дистанционным управлением
Views: 1870 Все активнее светодиоды входят в нашу жизнь. Всё эффективнее становится светодиодное освещение. Всё ниже опускаются цены. Всё больше появляется возможностей получения сочных цветов, простоты в управлении. Всё чаще …Moving average – скользящее среднее
Views: 2255 Скользящая средняя, скользящее среднее (англ. moving average, MA) — общее название для семейства функций, значения которых в каждой точке определения равны среднему значению исходной функции за предыдущий период. Скользящие средние обычно используются с данными временных рядов для сглаживания …
Визуализация данных
Views: 718
Для отладки часто необходимо на дисплей вывести данные не только в десятичном виде, но и шестнадцатеричном или двоичном виде.
Ниже приведены три функции которые позволяют (совместно с графической библиотекой) вывести на дисплей исследуемую величину.
Преобразование 16 бит в 4 HEX – шестнадцатеричный вид
void bin_HEX (unsigned int chisloin) { char edin; edin=chisloin>>12; if(edin<10)SendLCDd (edin+0x30); else SendLCDd (edin+0x37); edin=chisloin>>8; edin=(edin & 0b00001111); if(edin<10)SendLCDd (edin+0x30); else SendLCDd (edin+0x37); edin=chisloin>>4; edin=(edin & 0b00001111); if(edin<10)SendLCDd (edin+0x30); else SendLCDd (edin+0x37); edin=(chisloin & 0b00001111); if(edin<10)SendLCDd (edin+0x30); else SendLCDd (edin+0x37); }//------------------------------------------------------------------------
Вывод на дисплей двоичных 16 битных чисел – двоичный вид – 16 BIN.
void bin_bin (unsigned int chisloin) { char a; for(a=0;a<16;a++) { if(chisloin & 0x8000) OledSymbol ('1',1,0,0,0); else OledSymbol ('0',1,0,0,0); chisloin<<=1; } }//------------------------------------------------------------------------
Вывод в десятичном виде – 5 DEC
/*============================================================================*/ /* где, * data число в диапазоне от -32768 до +32767 * comma - положение десятичной точки 0- нет точки, 1-5 перед 1-6 знакоместом * если * nom - количество выводимых символов 0/1 - один символ 2-6 символа * razm - размер выводимых цифр 0/1-нормальные, 2-7 увеличение в соответствующее раз */ void bin_dec(int data,char comma,char nom,char razm) // вывод на дисплей/режим { struct { unsigned MINS:1; }Bit; int unsigned data01; char dest,sotn,tysc,dtys,stys; Bit.MINS=0; if (data<0) // если отрицательно { if (data==0x8000)data01=data; else data01=-data; Bit.MINS=1; // признак отрицательного } else data01=data; // преобразование числа в символ stys=data01/100000+0x30; dtys=data01%100000/10000+0x30; tysc=data01%10000/1000+0x30; sotn=data01%1000/100+0x30; dest=data01%100/10+0x30; // edin=data%10+0x30; // гашение не значащих нулей if (stys==0x30&&comma<5)// гашение не значащих нулей { stys=' '; if (dtys==0x30&&comma<4)// гашение не значащих нулей { dtys=' '; if (tysc==0x30&&comma<3) { tysc=' '; if (sotn==0x30&&comma<2) { sotn=' '; if (comma==0&&comma<1) { if (dest==0x30)dest=' '; } } } } } // формирование символа минус для отрицательных чисел if (Bit.MINS==1)// формирование символа минус для отрицательных чисел { if (dtys!=' ') { stys='-'; } else { if (tysc!=' ') { dtys='-'; } else { if (sotn!=' ') { tysc='-'; } else { if (dest!=' ') { sotn='-'; } else { dest='-'; } } } } // прорисовка чисел } if (comma==6&&nom == 6) OledSymbol (',',1,1,razm,razm);// прорисовка запятой if (nom == 6) { if (dest!=0x20||comma == 6) OledSymbol (stys,1,1,razm,razm);// десятки тысяч else OledSymbol (' ',1,1,razm,razm); } if (comma==5&&nom >= 5) OledSymbol (',',1,1,razm,razm);// прорисовка запятой if (nom >= 5) { if (dest!=0x20||comma >= 5) OledSymbol (dtys,1,1,razm,razm);// десятки тысяч else OledSymbol (' ',1,1,razm,razm); } if (comma==4&&nom >= 4) OledSymbol (',',1,1,razm,razm);// прорисовка запятой if (nom >= 4) { if (dest!=0x20||comma >= 4) OledSymbol (tysc,1,1,razm,razm);// тысячи else OledSymbol (' ',1,1,razm,razm); } if (comma==3&&nom >= 3) OledSymbol (',',1,1,razm,razm);// прорисовка запятой if (nom >= 3) { if (dest!=0x20||comma >= 3) OledSymbol (sotn,1,1,razm,razm);// сотни else OledSymbol (' ',1,1,razm,razm); } if (comma==2&&nom >= 2) OledSymbol (',',1,1,razm,razm);// прорисовка запятой if (nom >= 2) { if (dest!=0x20||comma >= 2) OledSymbol (dest,1,1,razm,razm);// десятки else OledSymbol (' ',1,1,razm,razm); } if (comma==1) OledSymbol (',',1,1,razm,razm);// прорисовка запятой OledSymbol (data01%10+0x30,1,1,razm,razm); // единицы }//
Многокнопочная клавиатура
Views: 339
Самый недорогой и простой вариант ввода данных в устройство на микроконтроллерах, это считывание состояния тактовых кнопок. Для подключения к порту микроконтроллера достаточно одного резистора. А если порт позволяет подключать встроенные подтягивающие резисторы, то подключение имеет элементарно простой вид:
Самый эффективный вариант опроса кнопок и формирования управляющих флагов, это когда обработка выполняется через прерывания. Для семейства PIC24 (MPLAB® XC16) это легко реализовать через прерывания по изменению состояния на входе порта B.
Для примера возьмём простую клавиатуру из 3 тактовых кнопок, из схемы на рисунке, с аналогичным подключением.
Первое что необходимо это для себя определить, какие флаги состояния нам необходимо получит при выполнении события по нажатию тактовой кнопки. При нажатии на кнопку PB1 – должен установиться флаг MINUS, для PB2 – PLUS, для PB3 – FUNC. Дополнительно опишем флаги предыдущего состояния кнопок, они нам понадобиться, что-бы программа могла формировать только типа один импульс при нажатии кнопки, а не последовательность.
/* описываем флаги */ struct { unsigned RB3p : 1; // флаг прошлого состояния unsigned RB4p : 1; // флаг прошлого состояния unsigned RB5p : 1; // флаг прошлого состояния unsigned FUNC : 1; // флаг функция unsigned PLUS : 1; // флаг увеличение unsigned MINUS : 1; // флаг уменьшение } Flagw; // Flagw.NAG название переменной (компилятор самостоятельно отводит количество байт)
Следующее – выполним настройку портов, выполнить настройку выводов порта – это делается при инициализации в начале программы.
/* настройка входов для клавиатуры*/ /* разрешение прерываний*/ CNEN1 = 0b0000000011100000; CNEN2 = 0b0000000000000000; /* включение подтягивающих резисторов*/ CNPU1 = 0b0000000011100000; CNPU2 = 0b0000000000000000; _CNIF = 0;/*сбросить прерывание*/ _CNIE = 1;/*включить прерывание*/
После этого надо создать саму функцию прерывания, а именно в этой функции будут описываться реакция на нажатия кнопок, у нас самое простое, при нажатии программа должно получить 1 импульс независимо от того как долго нажата кнопка.
/* прерывание от клавиатуры*/ void __attribute__((interrupt, auto_psv)) _CNInterrupt (void) { __delay_us(100); if(!_RB5 && Flagw.RB5p) // если кнопка нажата и в предыдущем состоянии, она была отжата, то установить флаг MINUS { Flagw.MINUS=1; } else if(!_RB4 && Flagw.RB4p) { Flagw.PLUS=1; } else if(!_RB3 && Flagw.RB3p) { Flagw.FUNC=1; } // запоминание предыдущего состояния кнопок клавиатуры Flagw.RB5p=_RB5; Flagw.RB4p=_RB4; Flagw.RB3p=_RB3; _CNIF = 0; // сброс прерывания }
Из программы прерывания мы получаем флаги состояния кнопок, эти флаги легко обработать в основном цикле программы например так:
if(Flagw.PLUS) { chettt++; Flagw.PLUS=0; } if(Flagw.MINUS) { chettt--; Flagw.MINUS=0; } if(Flagw.FUNC) { OledString ("тест",1,0,0,0,-1,70); Flagw.FUNC=0; }
Т.е. как видно, все очень просто!
Это может быть интересно
LED модуль P10C4V12
Views: 3116 LED панели на обычных регистрах типа 74HC595. Они выпускаются как монохромные так двух и полно цветные, особенность, что они предназначены для текстовой информации и имеют один уровень яркости. Общую яркость …MCC PIC24 – модуль OUTPUT COMPARE – в режиме генератора звуковых сигналов
Views: 611 При проектировании простых устройств автоматики, часто необходимо иметь механизм звукового оповещения. Самый верхний уровень, это формирование голосовых сообщений, но об этом, как то по позже… В самом примитивном …Сенсорный выключатель света
Views: 13091 Хотя в настоящий момент актуальны системы управления освещением с передачей данных по электросети, но я думаю, что проекты такого рода тоже имеют право на жизнь. Анонс Три вида …USB K-L-line адаптер
Views: 4575 USB K-L-line адаптер предназначен для связи персонального компьютера с диагностической шиной автомобиля – интерфейс ISO-9141. Этот проект предназначен для сборки недорого устройства с использованием специально для этой цели …TM1650 драйвер LED семисегментного индикатора
Views: 17942 Китайский производитель Shenzhen Titan Micro Electronics Co., Ltd. Выпускает широкую линейку драйверов управления светодиодными дисплеями, которые позволяют разгрузить микроконтроллер для основной работы, главная особенность этих драйверов не только …Одноканальный емкостной сенсор – AT42QT1012
Views: 2330 Описание сенсора [wpdm_file id=242] Незаконченный проект, так-как сенсор не оправдал своего назначения, не рекомендую, просто выброшенные деньги. Особенности. • Количество сенсоров – один, режим переключения ( touch-on/touch-off ), а также программируемая …Проект с использованием MCC часть 11
Views: 863 Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость …NS108-5050-16bit от Newstar
Views: 585 Кто уже использует в своих проектах адресуемые светодиоды хорошо знакомы с такими как WS2812 и им подобные. Эти светодиоды для управления используют однопроводную шину. Из-за этого пропускная способность …Проект с использованием MCC часть 13
Views: 1077 Так как используя MCC мы можем его использовать со своими библиотеками, поэтому настало время и свое создать. Для начала откроем наш заголовочный файл в нем очень много букв: По …LED модуль P10 (1R) V706A
Views: 7745 Это еще одно чудо от китайского брата. Это монохромные матрицы, называются они P10 (1R) V706A, ну типа R-красные, но не верьте паяют светики и зеленые и синие, в общем …
Визуализация данных
Views: 1265
Частенько приходиться на дисплей выводить данные в виде графиков, так более наглядно можно проследить за процессом и проанализировать его. Для этого разберем простую функцию на Си для реализации такой визуализации.
Данные полученные при измерениях должны быть помещены в буфер CaptBuf[N] где N – размер буфера. предварительно надо указать размер дисплея для вывода данных и координаты нижнего левого угла расположения дисплея. Данные в буфере должны иметь формат signed int (16 бит -32768 … 32767 со знаком).
#define dispoX 60 // ширина окна #define dispoY 32 // высота окна #define startX 0 // координата X левый нижний угол окна #define startY 0 // координата Y левый нижний угол окна
При вызове функции она извлекает количество данных (равных размеру дисплея dispoX) и преобразовывает их (если это необходимо) в одно полярное, а затем к диапазону 0-31, по высоте дисплея dispoY (в этом месте нет оптимизации, для других размеров придется подбирать значения деления и вводить постоянную смешения нуля). Преобразованные данные помещаем в массив BflyBuf[].
for(a=0;a<dispoX;a++) { pr=CaptBuf[a]+32768; // преобразование signed int -> unsigned int BflyBuf[a]= (pr>>11); // перевести в однополярное значение в диапазоне }
После это используя функции построение точки и линии на дисплее строим график из обработанных данных помещенных в массив BflyBuf[].
// рисование графика for(a=0;a<dispoX-1;a++) { line(1, startX+a+1, startY, startX+a+1, startY+dispoY);// очистка следующего столбца дисплея if(abs(BflyBuf[a]-BflyBuf[a+1])>1)// если разность больше по модулю 1 { if((a+1)<dispoX-1)line(0, startX+a, startY+BflyBuf[a], startX+a+1, startY+BflyBuf[a+1]);// рисовать линию } else { point(0, startX+a, startY+BflyBuf[a]); // рисовать точку } }
Пример работы функции для реализации визуализации аудио-данных в реальном времени.
Полный текст функции.
void oscilloscope (void)//Осцилограф { /*область индикации * dispX dispY * диапазон входного значения signed int -32768 … 32767 * преобразовывается в значение 0-32 * данные выводятся с позиции 0/0 */ #define dispoX 60 // ширина окна #define dispoY 32 // высота окна #define startX 0 // координата X левый нижний угол окна #define startY 40 // координата Y левый нижний угол окна unsigned int a,pr; for(a=0;a<dispoX;a++) { pr=CaptBuf[a]+32768; // преобразование signed int -> unsigned int BflyBuf[a]= (pr>>11); // перевести в однополярное значение в диапазоне } line(1, startX, startY, startX, startY+dispoY);// очистка первого столбца дисплея // рисование графика for(a=0;a<dispoX-1;a++) { line(1, startX+a+1, startY, startX+a+1, startY+dispoY);// очистка следующего столбца дисплея if(abs(BflyBuf[a]-BflyBuf[a+1])>1)// если разность больше по модулю 1 { if((a+1)<dispoX-1)line(0, startX+a, startY+BflyBuf[a], startX+a+1, startY+BflyBuf[a+1]);// рисовать линию } else { point(0, startX+a, startY+BflyBuf[a]); // рисовать точку } } }
Это может быть интересно
MPLAB® Harmony – или как это просто! Часть 2.
Views: 2690 Часть вторая – Первая программа на PIC32. Музыкальная тема к статье, слушаем: Для начала изучения PIC32 надо иметь или демоплату или самому её изготовить имея микроконтроллер. Начнем из …WiFi ESP8266 – AT команды связанные с функцией Wi-Fi
Views: 5382 AT команды связанные с функцией Wi-Fi Функции Wi-Fi подключения, запускаться из командной строки Команда Описание 1 AT+CWMODE Проверка, настройка режима работы Wi-Fi (sta/AP/sta+AP), (не рекомендуется для новых проектов). 2 …APA102 – светодиоды со встроенным драйвером и SPI интерфейсом
Views: 3265 APA102 В 2014 году фирма Shenzhen Led Color Optoelectronic Co., Ltd http://www.szledcolor.com/ начала производство светодиодов на драйвере APA102. Это серия так называемых светодиодов со встроенным драйвером. Основной особенностью этих …WiFi ESP8266 ESP-202 (ESP-12F)
Views: 7699 Первое знакомство, сначала надо его купить… http://voron.ua/catalog/024404 Схема для подключения и тестирования По схеме ставим две кнопки, сброс и кнопку BT2, для перевода в режим обновления прошивки. Если надо сделать …УКВ – радиоприем, часть 2
Views: 6224 Пришло свободное время решил вторую часть проекта реализовать (правда есть мысль и третью с использование цветного OLED и функцией ch-светомузыки, но это только задумка… Для понимания функций интегрального …ch-4000 – универсальная печатная плата
Views: 1004 На смену устаревшей плате ch-3000, пришла новая ch-4000. Плату уже можно приобрести в магазине Ворон. Схема. Плата позволяет создавать таймеры, часы реального времени, регуляторы температуры, регуляторы влажности, вольтметры, …Стабилизатор тока для светодиодов SN3350
Views: 2611 SN3350 ближайший аналог ZXLD1350 Как собрать готовый вариант, читайте во второй части – http://catcatcat.d-lan.dp.ua/stabilizator-toka-na-sn3350-chast-2/ 40V драйвер светодиодов с внутренним ключом SN3350 – импульсный понижающий преобразователь, разработанный для того, чтобы эффективно управлять одним или …Arduino LCD + STONE STVI056WT-01 + Strain gauge
Views: 446 Author li grey email: greyli1987@outlook.com The strain assessment instrument is used to assess the degree of corresponding muscle strain by obtaining the muscle surface action potential through silver …LCD индикаторы на драйвере ML1001
Views: 1910 ML1001 – статический LCD GOG (чип в стекле) драйвер для 40-сегментного LCD в позолоченном противоударном исполнении. На них можно каскадно строить цельные из 80 или 120 сегментов LCD индикаторы. …Проект с использованием MCC часть 15
Views: 1548 EUSART – Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. … читать на вики. Внесем изменения в нашу схему, …
Настройка тактового генератора PIC24H
Views: 881
От частоты тактового генератора зависит производительность, а также потребление тока микроконтроллером. От правильной настройки зависит надежность работы всего устройства.
Рассмотрим пример настройки частоты от внутреннего генератора с тактовой частой 7,37 мГц. Точность его настолько велика, что его можно использовать для множества приложений не требующих высокоточных временных интервалов.
Схема генератора.
Схема умножителя (PLL)
Для настройки частоты с использованием умножителя необходимо соблюдать допуски частот, которые указаны на рисунке, а иначе возможность сбой PLL, что может привести не стабильной работы микроконтроллера, хотя могу сказать, что существует запас стабильности и возможно разгон микроконтроллера как минимум до 50 Mips.
Пример настройки для работы контроллера PIC24HJ128GP502 от внутреннего генератора на скорости 50 Mips.
Настройка регистра конфигураций
//FGS (0xf80004) //General Code Segment Write Protect: //General Segment Code Protection: _FGS( GWRP_OFF & GSS_HIGH) /* | +--------------------- High Security Code Protection is Enabled/Высокая степень защиты кода включена защита * +--------------------------------- User program memory is not write-protected/Памяти программы пользователя не защищена от записи */ //FOSCSEL (0xf80006) //Oscillator Mode: //Internal External Switch Over Mode: _FOSCSEL( FNOSC_FRCPLL & IESO_OFF)//(39.90 мА)// входная через умножитель /* | +--------------------- Start up with user-selected oscillator/Начать работу с генератора выбранного пользователем * +----------------------------------- Internal Fast RC (FRC) w/PLL/Внутренние Быстрый RC (FRC), с/PLL */
Настройка генератора
// настройка делителей частоты CLKDIVbits.PLLPRE=2; // N1 = 4 PLLFBD = 107; // M = 129 CLKDIVbits.PLLPOST=0; // N2 = 2 __builtin_write_OSCCONH(0x01); __builtin_write_OSCCONL(OSCCON | 0x01); // регистр калибровки внутреннего тактового генератора OSCTUNbits.TUN=-1; // Ожидать пока не будет запущен выбранный генератор while (OSCCONbits.COSC != 0b001); // Ожидать пока не будет запушен PLL while(OSCCONbits.LOCK!=1);
При этом надо указать
#define FCY 50208130UL // определение тактовой частоты для макросов __delay_ms() и __delay_us()
Расчет тактовой частоты файл в формате Microsoft Excel 2010[wpdm_file id=228]
Часы реального времени DS1340
Views: 449
DS1340 часы реального времени от ОПИСАНИЕ. Особенностью этой микросхемы является наличие схемы управления питанием резервного источника питания. Для резервирования питания можно использовать как обычную литиевую батарейку, так и обычный конденсатор или ионистор.
Особенности управления.
В 9 регистре хранится флаг OSF – это флаг аварии. Авария может возникать по нескольким причинам, сбой работы генератора от внешних помех, выключение генератора битом EOSC, снижение напряжения основного питания или напряжения резервного питания ниже нормы. Этим битом необходимо контролировать работу часов после включения питания, если этот бит установлен, то гарантированно произошел сбой времени и необходима коррекция. На практике это кусок кода может выглядеть так:
// инициализация часов, если батарейка разряжена i2c_start (0xD0,0); // загрузка адреса устройства,функция запись i2c_write (0x09); // адрес ячейки памяти для обращения i2c_restart (0xD0,1); // загрузка адреса устройства,функция чтение temp=i2c_read_noack (); // i2c_stop (); // if (temp & 0b10000000 ) // если бит CH bit = 1, значить "села" батарейка { // необходима коррекция времени, установка значений по умолчанию i2c_start (0xD0,0); // установка адреса. i2c_write (0x00); // установить адрес обращения i2c_write (0x00); // 00H данные записи СЕКУНДЫ и включаем часы в работу i2c_write (0x30); // 01H данные записи МИНУТЫ i2c_write (0x12); // 02H данные записи ЧАСЫ i2c_write (0x01); // 03H данные записи ДЕНЬ НЕДЕЛИ i2c_write (0x26); // 04H данные записи ДАТА i2c_write (0x06); // 05H данные записи МЕСЯЦ i2c_write (0x13); // 06H данные записи ГОД i2c_stop (); i2c_start (0xD0,0); // установка адреса. i2c_write (0x07); // установить адрес обращения i2c_write (0b01000000); // 07H Control/512Hz на выходе частота i2c_stop (); i2c_start (0xD0,0); // установка адреса. i2c_write (0x08); // установить адрес обращения i2c_write (0b10101001); // 08H Trickle Charger One diode, 250? resistor i2c_stop (); i2c_start (0xD0,0); // установка адреса. i2c_write (0x09); // установить адрес обращения i2c_write (0x00); // 09H Oscillator Stop Flag (OSF) i2c_stop (); }
Бит OSF устанавливается аппаратно, его нужно программно сбросить (установить программно нельзя).
Если необходимо отключить работу генератора, например, для экономии разряда батареи, то это можно сделать установив бит EOSC в 1.
Обратите внимание, что запись (или чтение) в регистры данных 0 -6 можно выполнять последовательно в одном цикле. А для записи в системные регистры 0x07, 0x08, 0x09 надо обращаться конкретно к каждому.
Для чтения и записи данных в регистры часов можно использовать следующие функции:
// преобразование двоичного в двоично-десятичное char bin_decbin (char data) { char dest, edin; dest=data%100/10; edin=data%10; data=edin; data+=dest<<4; return data; } //сохранение настроект календаря void savetime (void) { i2c_start (0xD0,0); // установка адреса. i2c_write (0x00); // адрес ячейки памяти для обращения i2c_write (bin_decbin (rtcSecN)); // данные записи СЕКУНДЫ i2c_write (bin_decbin (rtcMinN)); // данные записи МИНУТЫ i2c_write (bin_decbin (rtcHourN)); // данные записи ЧАСЫ i2c_write (day); // данные записи ДЕНЬ НЕДЕЛИ i2c_write (bin_decbin (rtcMdayN)); // данные записи ДАТА i2c_write (bin_decbin (rtcMonN)); // данные записи МЕСЯЦ i2c_write (bin_decbin (rtcYearN)); // данные записи ГОД i2c_stop (); }// // преобразование двоично-десятичного в двоичное char decbin_bin (char data) { char a; a=data>>4; a=a*10; data=data&0b00001111; data+=a; return data; } void readtime (void) { // char a; // чтение даты и времени i2c_start (0xD0,0); // загрузка адреса устройства,функция запись i2c_write (0x00); // адрес ячейки памяти для обращения i2c_restart (0xD0,1); // загрузка адреса устройства,функция чтение rtcSecN=i2c_read_ack(); rtcSecN=rtcSecN&0b01111111; rtcSecN=decbin_bin (rtcSecN); rtcMinN=i2c_read_ack(); rtcMinN=rtcMinN&0b01111111; rtcMinN=decbin_bin (rtcMinN); rtcHourN=i2c_read_ack(); rtcHourN=rtcHourN&0b00111111; rtcHourN=decbin_bin (rtcHourN); day=i2c_read_ack(); day=day&0b00000111; rtcMdayN=i2c_read_ack(); rtcMdayN=rtcMdayN&0b00111111; rtcMdayN=decbin_bin (rtcMdayN); rtcMonN=i2c_read_ack(); rtcMonN=rtcMonN&0b00011111; rtcMonN=decbin_bin (rtcMonN); rtcYearN=i2c_read_noack(); rtcYearN=decbin_bin (rtcYearN)+100; i2c_stop (); }//
Так как время и дата храниться в часах в двоично десятичном формате, а обрабатывать её удобно в двоичном. для преобразование одно байта используются функции:
Преобразование двоичного в двоично-десятичное
char bin_decbin (char data)
Преобразование двоично-десятичного в двоичное
char decbin_bin (char data)
Для записи и чтения:
Сохранение настроек календаря
void savetime (void)
Чтение времени и даты
void readtime (void)
Для работы с PIC24 можно использовать библиотеку I2C
Это может быть интересно
Униполярный шаговый двигатель
Views: 2222 В приводах различных устройств часто применяются шаговые двигатели, Шаговый двигатели различают двух типов униполярные – когда обмотки коммутируются током текущим только в одну сторону, например при …Altium Designer my Libraries, Project templates, System settings by Catcatcat V23.09
Views: 396 September 2023 component base update. Release updates V. – 23_09 added new components. Changed the structure of the database. Configuration file name – DXPPreferences1.DXPPrf. Added project CLUBBEST_50_Light. …My libraries for Altium Designer
Views: 4053 Attention, this version of the database is outdated today. See updates in articles https://catcatcat.d-lan.dp.ua/altium-designer-my-setup-system-and-project-structure and https://catcatcat.d-lan.dp.ua/altium-designer-my-setup-system-and-project-structure-v23-2/ My libraries for Altium designer (Updated V – 29/05/2022) (c) 2021 …Проект с использованием MCC часть 10
Views: 845 Алгоритм управления освещением от нажатия кнопки. Обработка удержания кнопки: Мы должны проверить кнопка в настоящий момент нажата и флаг удержания установлен, если да Проверить таймер удержания “отработал” – …Real-time music visualization technology
Views: 139 Music visualization technology in real time (RTMV-technology). Я не музикант і я не маю спеціальної музичної освіти, я інженер розробник вбудованих систем. Але моє хобі розроблення технології візуалізації …Проект с использованием MCC часть 02
Views: 2304 Когда мы запустили конфигуратор, самое главное понять, что с этим делать и как проверить, то что мы делаем работает или нет. Для начала настроим регистры конфигурации микроконтроллера и настроем …CCP – модуль в режиме Compare на примере PIC18
Views: 3097 CCP – модуль можно использовать в трех режимах: Capture – позволяет захватывать входной сигнал и определять его параметры (длительность или частоту). Дополнительно управлять внутренними модулями. Compare – позволяет …I2C MODULE – PIC18F25K42 Device ID Revision = A001
Views: 1087 I2C MODULE Обход ошибок в версии I2C MODULE – PIC18F25K42 Device ID Revision = A001 В Серии K42 применен совершенно новый модуль шины I2C, который позволяет поддерживать все …JDY-62A Audio bluetooth module
Views: 1711 Простой модуль для простого аудио блютуса. Встроенные подсказки на английском языке. Модуль включён, режим муте – после подачи питания. Контроль разряда батареи предупреждение что батарея разряжена и необходима …Audio-bluetooth modules F-6188 (BK8000L)
Views: 2327Следующий модуль на чипе BK8000L. Заводское обозначение F-6188 также основным производителем не выпускается и отдан на тиражирование. с нижней стороны имеет маркировку В этом варианте мне попалась вроде полноценная …
Измерение частоты
Views: 1413
Измерение частоты классически можно выполнить двумя способами.
Способ первый.
Необходимо за фиксированный промежуток времени подсчитать количество периодов измеряемой частоты. После этого необходимо количество импульсов разделить на время измерения. Точность измерения зависит от длительности измеряемого промежутка времени. Чем длиннее промежуток, тем точнее можно выполнить изменения.
Второй способ.
Это измерять длительность одного периода и вычислитель частоту. Точность измерения зависит от частоты тактовых импульсов, чем выше и стабильней частота тактовых импульсов тем выше разрешение и точнее измерения.
К каждом методе есть свои плюсы и свои минусы. Если необходимо высокая точно в первом это длительность измерения, если надо быстро измерять, то необходимо высокая тактовая частота.
Для измерения частоты (в нашем варианте частоты электросети), модифицируем нашу схему следующим образом.
Все эти измерения можно выполнить при помощи встроенного таймера. Так-как у нас таймер 1 и 2 занят формированием временных интервалом. Поэтому будем для измерения частоты использовать сборку на таймерах TMR4 и TMR5. Для входа сигнала будем использовать Т4СК.
Так как периферийные модули по умолчанию “никуда не подключен”, то первым делом необходимо настроить регистры конфигурации выбора периферийного модуля. Нам надо определиться к какой ножке микроконтроллера мы подключим его вход. У нас свободна 14 нога. Это функция RP5. Для подключения входа T4CK к ноге 14 на необходимо в регистра настройки входа RPINR4 загрузить значение 5.
Для настройки входа таймера обратимся к регистрам управления входами периферийных устройств.
Название входа | Имя периферийного модуля | Регистр | Биты конфигурации |
External Interrupt 1 | INT1 | RPINR0 | INTR1<4:0> |
External Interrupt 2 | INT2 | RPINR1 | INTR2R<4:0> |
Timer2 External Clock | T2CK | RPINR3 | T2CKR<4:0> |
Timer3 External Clock | T3CK | RPINR3 | T3CKR<4:0> |
Timer4 External Clock | T4CK | RPINR4 | T4CKR<4:0> |
Timer5 External Clock | T5CK | RPINR4 | T5CKR<4:0> |
Input Capture 1 | IC1 | RPINR7 | IC1R<4:0> |
Input Capture 2 | IC2 | RPINR7 | IC2R<4:0> |
Input Capture 3 | IC3 | RPINR8 | IC3R<4:0> |
Input Capture 4 | IC4 | RPINR8 | IC4R<4:0> |
Input Capture 5 | IC5 | RPINR9 | IC5R<4:0> |
Output Compare Fault A | OCFA | RPINR11 | OCFAR<4:0> |
Output Compare Fault B | OCFB | RPINR11 | OCFBR<4:0> |
UART1 Receive | U1RX | RPINR18 | U1RXR<4:0> |
UART1 Clear To Send | U1CTS | RPINR18 | U1CTSR<4:0> |
UART2 Receive | U2RX | RPINR19 | U2RXR<4:0> |
UART2 Clear To Send | U2CTS | RPINR19 | U2CTSR<4:0> |
SPI1 Data Input | SDI1 | RPINR20 | SDI1R<4:0> |
SPI1 Clock Input | SCK1IN | RPINR20 | SCK1R<4:0> |
SPI1 Slave Select Input | SS1IN | RPINR21 | SS1R<4:0> |
SPI2 Data Input | SDI2 | RPINR22 | SDI2R<4:0> |
SPI2 Clock Input | SCK2IN | RPINR22 | SCK2R<4:0> |
SPI2 Slave Select Input | SS2IN | RPINR23 | SS2R<4:0> |
Функции ввода
Функция | Номер ножки | Код для записи в регистр |
RP0 | 4 | 0 |
RP1 | 5 | 1 |
RP2 | 6 | 2 |
RP3 | 7 | 3 |
RP4 | 11 | 4 |
RP5 | 14 | 5 |
RP6 | 15 | 6 |
RP7 | 16 | 7 |
RP8 | 17 | 8 |
RP9 | 18 | 9 |
RP10 | 21 | 10 |
RP11 | 22 | 11 |
RP12 | 23 | 12 |
RP13 | 24 | 13 |
RP14 | 25 | 14 |
RP15 | 26 | 15 |
Настройка входа таймера:
RPINR4bits.T4CKR=5; // настройка входа таймера 4 на вывод 14 микроконтроллера (RP5) TRISB = 0b0000000000100000; // разряды порта B на выход, кроме RB5
Конфигурирование таймеров: (будем настраивать для 32 битного режима):
Чтобы настроить Timer2/3 или Timer4/5 для 32-разрядной работы необходимо:
1. Установить T32 бит (T2CON <3> или T4CON <3> = 1).
2. Настроить предделителя для Timer2 или Timer4 битами TCKPS1: TCKPS0.
3. Настроить вход для тактовых импульсов и режимов работы с помощью TCS и TGATE бит. Если TCS установлен для внешней синхронизации, RPINRx (TxCK) должны быть настроены на доступные RPn вход.
4. Настроить период работы таймера загрузив регистр PR. PR3 (или PR5) будет содержат старшее слово, в то время как PR2 (или PR4) содержать младшие слово.
5. Если требуется прерывания, установить биты в регистрах T3IE или T5IE; использовать приоритет бит, T3IP2: T3IP0 или T5IP2: T5IP0, чтобы установить прерывание приоритет. Обратите внимание, что в то время как Timer2 или Timer4 управления таймера, прерывания появляется как Timer3 или Timer5 прерывания.
6. Установить TON бит (= 1).
//--------------------------------------------------------------------------- // настройка тамера TMR4 T4CON=0b1010000000001010; // |||||||||||||||+-- неиспользуемый // ||||||||||||||+--- TCS: 1 - внешний источник // |||||||||||||+---- неиспользуемый // ||||||||||||+----- T32: 0- 32 битный режим // ||||||||||++------ TCKPS1:TCKPS0: пределитель 00-1:1 // |||||||||+-------- TGATE: - отключен // |||++++++--------- неиспользуемые // ||+--------------- TSIDL: 1- врежиме Idle отключен // |+---------------- неиспользуемый // +----------------- TON: 1 - таймер включен PR2=0xFFFF; // период счета //---------------------------------------------------------------------------
Для работы нашей схемы нам необходимо на 14 ножку контроллера подключить подтягивающий резистор. За активацию подтягивающих резисторов отвечают регистры CNPU1 и CNPU2. Для нашего контроллера соответствие с выводами контроллера следующее:
Регистр | Управляющий бит | Вывод контроллера |
CNPU1 | CN0PUE | 12 |
CNPU1 | CN1PUE | 11 |
CNPU1 | CN2PUE | 2 |
CNPU1 | CN2PUE | 3 |
CNPU1 | CN3PUE | 4 |
CNPU1 | CN4PUE | 5 |
CNPU1 | CN5PUE | 6 |
CNPU1 | CN6PUE | 7 |
CNPU1 | CN7PUE | |
CNPU1 | CN8PUE | |
CNPU1 | CN9PUE | |
CNPU1 | CN10PUE | |
CNPU1 | CN11PUE | 26 |
CNPU1 | CN12PUE | 25 |
CNPU1 | CN13PUE | 24 |
CNPU1 | CN14PUE | 23 |
CNPU1 | CN15PUE | 22 |
CNPU2 | CN16PUE | 21 |
CNPU2 | CN17PUE | |
CNPU2 | CN18PUE | |
CNPU2 | CN19PUE | |
CNPU2 | CN20PUE | |
CNPU2 | CN21PUE | 18 |
CNPU2 | CN22PUE | 17 |
CNPU2 | CN23PUE | 16 |
CNPU2 | CN24PUE | 15 |
CNPU2 | CN25PUE | |
CNPU2 | CN26PUE | |
CNPU2 | CN27PUE | 14 |
CNPU2 | CN28PUE | |
CNPU2 | CN29PUE | 10 |
CNPU2 | CN30PUE | 9 |
Для подключение подтягивающего резистора к ножке 14 , необходимо выполнить команду
CNPU2bits.CN27PUE=1; // подключить к 14 ножке подтягивающий резистор
Так как в нашем примере, мы используем внутренний тактовый генератор, то измерения соответственно будет менее точные если бы мы использовали кварцевую стабилизацию частоты. Для корректировки длительности, будем использовать регистр PR1.
Для измерения частоты, добавить в цикл прерывания от таймера Т1 две команды:
// измерение частоты chastota=TMR4; TMR4=0;
т.е. таймер Т1 формирует заданный нами интервал времени, по прерыванию таймера , мы считываемым значение таймера Т4, а затем обнуляем его.
Для индикации в главном цикле программы добавим
curcorG_LCD (30,0); bin_dec(chastota ,0,0,0); Stringp_LCD (" герц",0,1,1);
теперь внизу дисплея мы увидим измеряемую частоту в герцах. Если период измерения 1 секунда, то измерять будем с точностью до 1 Герца, для увеличение точности до 0,1 Герца или 0,01 герца, нам надо соответственно увеличить время измерения.
Фото для первого варианта, когда период измерения равен 1 секунде.
Но для контроля качества частоты в сети нам необходимо более высокая точность, поэтому увеличим период измерения до 10 секунд. Для это нам необходимо добавить делитель, программный, чтобы увеличить время измерения до 10 секунд.
// измерение частоты if(++chetgerc>9) { chetgerc=0; chastota=TMR4; TMR4=0; }
а для красоты, индикации десятых долей, включит индикацию запятой перед младшим разрядом.
curcorG_LCD (30,0); bin_dec(chastota ,1,0,0); Stringp_LCD (" герц",0,1,1);
10 секунд на измерение это уже много. А если необходимо измерять частоту с точностью до 0,01 Герца, так это надо ждать 100 СЕКУНД!!!, а эффект усреднения который может за это время внести свои погрешности. Вообще сделаем вывод, для оперативного контроля частоты электросети такой метод не эффективен. Хотя при написании этого урока, наблюдая за частотой сети, она колебалась от 50,04 – 50,31 Герца (в режиме измерения 100 секунд).
Испробуем второй метод измерения длительности периода (или импульса). Благо, что сам модуль микроконтроллера позволяет это делать.
продолжение следует…
Это может быть интересно
ESP32-первое знакомство
Views: 6648 Музыкальная тема к статье, слушаем: Настало время познакомиться c ESP32 и для меня, для этого я приобрел в ГАММЕ отладочную плату с модулем ESP-WROOM-32 (ESP32-DevKitC). Первая задача, как …Проект с использованием MCC часть 10
Views: 845 Алгоритм управления освещением от нажатия кнопки. Обработка удержания кнопки: Мы должны проверить кнопка в настоящий момент нажата и флаг удержания установлен, если да Проверить таймер удержания “отработал” – …Простой сенсорный регулятор света
Views: 2314 Простой сенсорный регулятор. Проект – 2007 года. Регулятор выполнена на микроконтроллере PIC12F683 и имеет минимальное количество элементов. Выполняет стандартные функции, включение выключение света, изменение яркости, запоминание последнего установленного уровня …Самый простой индикатор уровня звукового сигнала
Views: 6377 Демонстрационный проект создания индикаторов уровня с использованием WS2812B. Изучив этот проект вы сможете самостоятельно изготавливать и конструировать свои индикаторы уровня звукового сигнала. Дополнительно читайте статью Бегущие огни на …MCC PIC24 – модуль OUTPUT COMPARE – в режиме генератора звуковых сигналов
Views: 611 При проектировании простых устройств автоматики, часто необходимо иметь механизм звукового оповещения. Самый верхний уровень, это формирование голосовых сообщений, но об этом, как то по позже… В самом примитивном …Стробоскоп для автомобиля
Views: 2164 Одним из популярных решений светового тюнинга автомобиля, мотоцикла или скутера стал эффект – “полицейский стробоскоп“. На база платы ch-c0050 реализовано несколько проектов. В этой статье приводятся две версии …Проект с использованием MCC часть 07
Views: 1006 Модуль PWM – широтно импульсная модуляция (ШИМ). ПИК контроллеры часто на борту имеют модули ШИМ. На их основе строятся многие узлы управления электро приводами. В нашем варианте мы …PIC18F25K42 – v. A001 – выявленные баги.
Views: 612 Модуль I2C Не работает при использовании в стандартной конфигурации MCC. Требует особой нестандартной конфигурации и управления для нормальной работы. Обойти Обход проблемы возможен библиотека см статью. Модуль ADC2 На …VU Meter Tower ART – part 2
Views: 987 Проект – VU Meter Tower ART получил продолжение в своем развитии. Теперь можно заказать набор деталей из акрила для самостоятельной сборки. В проект корпуса внесено целый ряд доработок, …PIC32MZ – прерывания (заметки)
Views: 448 Виды формирования запоминая контекста при входе в прерывания. Компилятор представляет три варианта AUTO – когда запоминания места возврата из подпрограммы возложено на программу, т.е все создается программно. Этот …
10-бит, высокоскоростной, аналого-цифровой преобразователь, часть 2
Views: 2385
Измерение переменного напряжения, вычисление TrueRMS.
Этот урок обучения работе с АЦП будет предназначен для измерения параметров переменного тока, это актуально к нашим электросетям, где качество поставляемой электроэнергии является проблемой. За основу вычисления величины переменного напряжения возьмем информацию на сайте http://www.easycalculation.com. TrueRMS переменного тока, это количество передаваемой энергии которое в идеале соответствует такой же величине постоянного тока.
В нашей электросети сети стандарт 230 вольт, это в идеале 0,707 от амплитудного значения переменного тока в сети, т.е. если максимальное значение амплитуды умножить на 0,707, то мы получим наши 230 вольт. По такому принципу работают большинство вольтметров. В последнее время огибающая кривой не соответствует идеалу синусоиды, а по этому и количество передаваемой энергии далека от идеала. Наша задача определить реальное количество энергии передаваемое в нашей электросети с учетом всех (возможно измеренных) искажений.
Для измерения переменного напряжения, на нашу макетную плату необходимо добавить несколько компонентов. Для измерения необходимо будет применить трансформатор, для гальванической развязки.
Схема.
Для вычисление истинного напряжения TrueRMS необходимо выполнить сканирования одного периода напряжения сети. Т.е. необходимо произвести n- количество измерений. В идеале чем чаще мы сделаем выборки тем точнее будет расчет реального напряжения.
Для измерения истинного напряжения в сети нам необходимо произвести выборку одного периода, или провести выборку на протяжении длительности более одного периода, но я думаю, что точнее будет когда мы будем для измерения выбирать один период.
Для измерения нам скорости от RC генератора АЦП будет недостаточно, поэтому Первое, что сделаем переключимся на системный генератор. Нам необходимо будет определиться какое количество измерений нам необходимо сделать за один период. Первое – необходимо организовать формирования массива данных которые потом понадобятся для вычисления.
Необходимо определить, скорость преобразования. Скорость преобразования зависит от тактовой частоты. В нашем проекте тактовая 32 мГц. Это длительность 31,25 ns. Для преобразователя необходимо 12 TAD для конвертирования 10 данных. Длительность вычисляется по формуле TAD = TCY • (ADCS<7:0>+1). Где TCY = 2 * Tosc для нашего микроконтроллера. Tosc=32 мГц.
Для буфера измерений отведем буфер 125 измерений. Для тактовой частоты 32 мГц и измеряемой 50 Гц нам необходимо установить для битов ADCS7:ADCS0: – 63, длительность выборки SAMC4:SAMC0: 28.
Для вычислений можно использовать файл ME (подготавливается).
// настройка АЦП TRISA = 0b0000000000000001; // AN0 вход AD1PCFG=0b1111111111111110; // настроить AN0 на вход AD1CHS = 0x0000; // AN0 подключить к CH0 AD1CSSL = 0; AD1CON3 = 0b0001110000111111; // ||||||||++++++++-- ADCS7:ADCS0: 63 задание длительности TAD // |||+++++---------- SAMC4:SAMC0: 28 TAD время выборки // |++--------------- не используется // +----------------- 0-системный генартор AD1CON2 = 0b0000000000011110; // |||||||||||||||+-- ALTS:всегда использует MUX A входа // ||||||||||||||+--- BUFM: два буфера по 8 регистров // ||||||||||++++---- SMPI3:SMPI0: прерывание от каждого 8 измерения // |||||||||+-------- не используется // ||||||||+--------- BUFS: бит состояния // ||||||++---------- не используется // |||||+------------ CSCNA: сканирование входов выключено // |||++------------- не используется // +++--------------- VCFG2:VCFG0: опорное AVdd и AVss AD1CON1 = 0b1000000111100000; // |||||||||||||||+-- DONE: // ||||||||||||||+--- SAMP // |||||||||||||+---- ASAM // |||||||||||++----- не используется // ||||||||+++------- SSRC2:SSRC0: от внутреннего тактового RC генератора запуск // ||||||++---------- FORM1:FORM0: Целое (0000 00dd dddd dddd) // |||+++------------ не используется // ||+--------------- ADSIDL:Продолжить работу модуля в режиме ожидания // |+---------------- не используется // +----------------- ADON:1 - АЦП - включен
В функции прерывания от АЦП выполним процедуру считывания регистров буфера АЦП и загрузки в буфер данных
void __attribute__ ((__interrupt__, __auto_psv__)) _ADC1Interrupt(void) { IFS0bits.AD1IF = 0;// сбросить бит прерывания if(_BUFS)// определяем в какую часть буфера в настоящий момент пишит АЦП // 0- запись идет в группу ADC1BUF0 до ADC1BUF7 // 1- запись идет в группу ADC1BUF8 до ADC1BUFF { ADC16Ptr = &ADC1BUF0; // будем читать данные из ADC1BUF0 до ADC1BUF7 } else { ADC16Ptr = &ADC1BUF8; // будем читать данные из ADC1BUF8 до ADC1BUFF } for (countZag = 0; countZag < 8; countZag++) { if(++countec>=125) { countec=0; Bit.ZAG=1; } ADC1izm[countec] = *ADC16Ptr++; // загрузка из буфера } }
Проект вычисляет TrueRMS переменного тока, запоминает минимальное и максимальное напряжение за все время работы, выводит на индикатор амплитудное значение.
Сам механизм вычисления:
ADCValue=0; // возведение в квадрад for (count = 0; count < 125; count++) ADC1obra[count]=ADC1obra[count]*ADC1obra[count]; // загрузка из буфера // нахождение сyммы for (count = 0; count < 125; count++) ADCValue+=ADC1obra[count]; // вычисление среднего ADCValue=ADCValue/125; // извлечение корня ADCValue=sqrt(ADCValue);
Фото проекта.
На дисплей выводиться информация по минимаксам (минимальное и максимальное значение напряжения зафиксированное за время работы, а также максимальное амплитудное. Посредине внизу напряжение в сети измеренное методом TrueRMS.
Проект, среда разработки MPLAB® X v1.70, компилятор С MPLAB XC16 v1.11.

10-бит, высокоскоростной, аналого-цифровой преобразователь, часть 1 72.81 KB 1157 downloads
10-бит, высокоскоростной, аналого-цифровой преобразователь. Проект,...
10-бит, высокоскоростной, аналого-цифровой преобразователь, часть 2 99.45 KB 911 downloads
10-бит, высокоскоростной, аналого-цифровой преобразователь,...10-бит, высокоскоростной, аналого-цифровой преобразователь, часть 1
Views: 1357
Измерение постоянного напряжения.
Ну и как можно обойти АЦП, тем более что он позволяет сканировать со скоростью до 500 тысяч преобразование в секунду (500 ksps).
Структурная схема
И так мысли в слух:
В PIC24 серии АЦП более продвинутый, более гибкая схема управления, выборки и конвертирования и получения результата. принцип работы прост усилитель (S/H) выборки/хранения может через коммутаторы подключаться к контактам контроллера настроенным как аналоговые входы. Через эти контакты он получает входное напряжения которое он запоминает для последующей оцифровки в АЦП. Управление выборкой сигнала может быть управляться как вручную, так и автоматически. Существует минимальное время выборки для того, чтобы усилитель выборки/хранения дал желаемую точность преобразования, т.е. чтобы измерительная емкость смогла полностью зарядиться от входного сигнала. Далее включается в работу АЦП и запускается цикл преобразования – это время, необходимое для преобразования напряжения формируемое усилителем выборки/хранения на его входе. Весь процесс может обеспечивается триггером управления работой АЦП, он автоматически заканчивает время выборки и начинает аналогоцифровое преобразование. Управлявшие сигналы для триггера могут быть взяты из различных аппаратных средств контроллера, или он может управляться вручную из программного обеспечения. Для АЦП требуется один такт (TAD), для преобразования каждого бита результата и плюс два дополнительных такта, или в общей сложности 12 TAD циклов для 10-разрядного преобразования. Когда время преобразования будет завершено, результат загружается в один из 16 буферов АЦП. АЦП может формировать прерывания для программного обеспечения. Сумма времени выборки и АЦП преобразования, дает общее время преобразования.
Один из режимов преобразования – есть режим непрерывного преобразования, когда триггер автоматического преобразования, использует счетчик и генератор АЦП для формирование времени между преобразованиями. Режим Auto-Sample и триггер автоматического преобразования могут быть использованы совместно, чтобы обеспечить циклическое преобразование без вмешательства программы.
АЦП в общей сложности использует 22 регистра.
Регистры управления
Модуль имеет шесть регистров управления и состояния:
• AD1CON1: – регистра управления 1
• AD1CON2: – регистра управления 2
• AD1CON3: – регистра управления 3
• AD1CHS: – выбор входного канала
• AD1PCFG: – конфигурация порта
• AD1CSSL: – регистра выбора входов измерения для режима последовательного сканирования.
AD1CON1, AD1CON2 и AD1CON3 регистры контролировать общую работу модуля АЦП. Это подразумевает подключение модуля,
Настройка времени преобразования и источники опорного напряжения, выбрав отбора проб и Преобразование триггеров и ручного управления образца / преобразование последовательности.
AD1CHS регистр (регистр 17-4) выбирает входных каналов для подключения к S/H усилитель. Она также позволяет выбор входных мультиплексоров и выбор источника опорного напряжения для дифференциального режима работы.
AD1PCFG регистр (регистр 17-5) настраивает порты ввода / вывода аналоговых входов или цифровых входов / выходов.
AD1CSSL регистр (регистр 17-6) выбирает каналы должны быть включены для последовательного сканирования.
АЦП Буферы результата измерений.
Модуль включает в себя 16-регистров данных, в зависимости от режима работы АЦП может вести автоматическую запись в эти регистры. Для большей гибкости, если скорости работы процессора недостаточно, чтобы считать все 16 регистров, за время одного конвертирования, можно включить режим, года запись ведется в восемь младших , а процессор, в это время, может считывать информацию со старших восьми регистров и наоборот.
Для изучения работы АЦП необходимо будет немного изменить схему.
Светодиод перенесем на RB4, а вход RA0, будем использовать для измерения напряжения. Для этого подключим потенциометр на 20 кОм к шинам питания контроллера, а сигнал с “движка” подадим на RA0.
Для настройки АЦП добавим в нашу программу следующие строки.
// настройка АЦП TRISA = 0b0000000000000001; // AN0 вход AD1PCFG=0b1111111111111110; // настроить AN0 на вход AD1CHS = 0x0000; // AN0 подключить к CH0 AD1CSSL = 0; AD1CON3 = 0b1000001100000000; // ||||||||++++++++-- ADCS7:ADCS0: TCY/2 // |||+++++---------- SAMC4:SAMC0: 15 TAD время выборки // |++--------------- не используется // +----------------- внутрений генератор AD1CON2 = 0b0000000000000000; // |||||||||||||||+-- ALTS:всегда использует MUX A входа // ||||||||||||||+--- BUFM: один бафур на 16 регистров // ||||||||||++++---- SMPI3:SMPI0: прерывание от каждого 1 // |||||||||+-------- не используется // ||||||||+--------- BUFS: бит состояния // ||||||++---------- не используется // |||||+------------ CSCNA: сканирование входов выключено // |||++------------- не используется // +++--------------- VCFG2:VCFG0: опорное AVdd и AVss AD1CON1 = 0b1000000011100000; // |||||||||||||||+-- DONE: // ||||||||||||||+--- SAMP // |||||||||||||+---- ASAM // |||||||||||++----- не используется // ||||||||+++------- SSRC2:SSRC0: от внутреннего тактового RC генератора запуск // ||||||++---------- FORM1:FORM0: Целое (0000 00dd dddd dddd) // |||+++------------ не используется // ||+--------------- ADSIDL:Продолжить работу модуля в режиме ожидания // |+---------------- не используется // +----------------- ADON:1 - АЦП - включен //----------------------------------------------------------------------
Эти строки позволяют настроить полностью АЦП и входы микроконтроллера, в этом примере мы задаем тактирование от внутреннего RC-генератора АЦП. В основном необходимые пояснения сделаны в комментариях.
Для преобразования числа в символы, будем использовать следующую функцию:
void bin_dec(int data,char mode,char vyv,char raz);
где, data число в диапазоне от -9999 до +32768
mode – положение десятичной точки 0- нет точки, 1-4 после 2-4 знакоместа
vyv – не печатать пустые знакоместа 0-печатать все 5 знакомест, 1-не печатать
raz – размер выводимых цифр 0/1-нормальные, 2-7 увеличение в соответствующее раз
Логика преобразования числа в символ простая, необходимо математически выделить число и преобразовать его в код
// преобразование числа в символ dtys=data/10000+0x30; tysc=data%10000/1000+0x30; sotn=data%1000/100+0x30; dest=data%100/10+0x30; edin=data%10+0x30;
А теперь сам процесс измерения. Изменение будем проводить когда контроллер спит, чтобы уменьшить цифровой шум, это как один из вариантов работы, хотя можно было сделать вариант усреднение результатов измерения, благо 16 регистров имеется.
Первое включит прерывание от АЦП
_AD1IE = 1;
Создадим функцию прерывания, только сброс бита прерывания
void __attribute__ ((__interrupt__, __auto_psv__)) _ADC1Interrupt(void) { IFS0bits.AD1IF = 0; }
И сам процесс измерения, один из вариантов
AD1CON1bits.ASAM = 1; // запустить авто измерения Sleep (); Nop(); AD1CON1bits.ASAM = 0; // остановить ADCValue = ADC1BUF0; // загрузить данные измерения из буфера //---------------------------
Запускаем автоматическое измерение и переходим в спящий режим, чтобы при измерении избавиться от цифрового шума микроконтроллера. Ждем прерывания от АЦП. По прерыванию микроконтроллер просыпается, сбрасывается флаг прерывания. Мы останавливаем измерение, считываем измеренное значение. Затем выводим полученное значение на дисплей и т.п. После этого весь процесс измерения повторяется.
Видео работы программы.
Проект, среда разработки MPLAB® X v1.70, компилятор С MPLAB XC16 v1.11.

I2C™ – INTER-INTEGRATED CIRCUIT и PIC24
Views: 897
Для работы с периферийными устройствам I2C™ просто незаменим. Дисплеи, память, драйверы и много другое…
В нашем примере мы будем подключать дисплей RDX077 (на драйвере UC1601S) к нашей макетной плате. Почему RDX077 – пока на настоящий момент, это самый доступный индикатор (для меня) с приемлемой ценой. Схема подключения:
RDX0077 – графический индикатора с драйвером UC1601s. В этой главе научимся выводить информацию на индикатор. Описывать сам драйвер UC1601s здесь не будем, будем создавать библиотеку для работы с индикатором.
Первое что необходимо выбрать это модуль I2C, у нас подключен индикатор ко второму модулю. Индикатор может работать на скорости до 400 кГц, поэтому необходимо разобраться как настроить необходимую скорость в модуле. За скорость отвечает регистр I2C2BRG из описания мы можем видеть формулы для расчета скорости и таблица с приведенными расчетами.
Для стандартных тактовых частот приведены расчетные данные:
Заданная частота шины Fscl |
Fcy=Fosc/2 | Значение в I2CxBRG | Реальная частота Fscl | |
(Десятичное) | (Hex) | |||
100 kHz |
16 MHz |
157 |
9D |
100 kHz |
100 kHz |
8 MHz |
78 |
4E |
100 kHz |
100 kHz |
4 MHz |
39 |
27 |
99 kHz |
400 kHz |
16 MHz |
37 |
25 |
404 kHz |
400 kHz |
8 MHz |
18 |
12 |
404 kHz |
400 kHz |
4 MHz |
9 |
9 |
385 kHz |
400 kHz |
2 MHz |
4 |
4 |
385 kHz |
1 MHz |
16 MHz |
13 |
D |
1.026 MHz |
1 MHz |
8 MHz |
6 |
6 |
1.026 MHz |
1 MHz |
4 MHz |
3 |
3 |
0.909 MHz |
Будем использовать максимальную возможную скорость шины 400 кГц.
Во всех новых моделях микроконтроллеров в основном по два модуля I2C. В нашем варианте подключение производиться к модулю 2. Для работы с индикатором нам понадобиться написать 7 функций по работе с интерфейсом. Некоторое отличие от стандартных функций будет состоять в том, что они будут ориентированы на модуль 2, а также формирование состояния старт будет объедено с указанием для драйвера индикатора записью адреса и инициализацию типа передачи и команды запись или чтение.
Для работы с многими устройствами I2C я обхожусь своими самодельными функциями, почему самодельными, потому что я знаю как они работают и что от них можно ожидать:
Команда начальной инициализации модуля
void I2C_Open (unsigned int FCLOCK);// инициализация, значение частоты шины в килогерцах (например, 100,150,200….400)
настраивает работу модуля.
Команда стоп
void i2c_stop (void); // формирование стоп
Две команды старт
unsigned char i2c_start (unsigned char adres, unsigned char C_D, unsigned char R_W); // адрес устройства и управление младшими битами
unsigned char i2c_restart (unsigned char adres, unsigned char C_D, unsigned char R_W);
Команда записи байта данных
unsigned char i2c_write (unsigned char data); //запись байта
И две команды чтения
unsigned char i2c_read_ack (void); //чтение с подтверждением
unsigned char i2c_read_noack (void); //чтение без подтверждения
Мое мнение такое чем их меньше тем проще. Для работы с индикатором необходимо сделать библиотеку которая бы упрощала вывод на дисплей символьной информации и графики. О создании библиотеки говорить не буду это не интересно скачать её можно из раздела библиотеки. В этой главе мы ограничимся примером для демонстрации вывода на индикатор текста и графических примитивов.
Первое, что всегда в таких вариантах появляется желание что бы на индикаторе, что нибудь отобразилось. В библиотеке есть функция вывода строк на дисплей String_LCD её формат, на примере:
String_LCD (" Привет Мир!",0,1,2,-1,25); | | | | | +- высота строки по координате Y | | | | +---- координата X, -1 команда выровнять строку по центру. | | | +------- высота символов 2 (двойная) | | +--------- ширина символов 1 (одинарная) | +----------- нормальное изображение (черным по белому писать) +------------------- сам текст длина не более 254 символа максимум.
Теперь все уже понятно и первая программа для работы с графическим LCD на драйвере на драйвере UC1601S будет выглядеть так:
//----------------------------------------------------------- _LATA3 = 1;// включение подсветки дисплея. //----------------------------------------------------------- //настройка i2c I2C_Open(400); // Скорость I2C на 400 кГц int_LCD(); // инициализация LCD; clear_LCD(0); // заливка (очистка индикатора) //----------------------------------------------------------- clear_LCD(2); // заливка // белый прямоугольник rectangle(0,0,2,0, 5, 5, 115, 53); String_LCD (" Привет Мир!",0,1,2,-1,25); rectangle(0,0,2,0, 10, 10, 105, 43); rectangle(1,0,2,0, 15, 15, 95, 33);
Думаю для начала этого более чем достаточно.
Результат работы программы:
Теперь необходимо скачать проект и поэкспериментировавший с выводом сообщений и графики.
Описание библиотеки в разделе Библиотеки. Демонстрационное видео функций библиотеки.
Файлы для загрузки
Демопроект с полным текстом + библиотека (графические примитивы и символы).[wpdm_file id=66 template=”link-template-calltoaction3.php”]
Это может быть интересно
Проект с использованием MCC часть 02
Views: 2304 Когда мы запустили конфигуратор, самое главное понять, что с этим делать и как проверить, то что мы делаем работает или нет. Для начала настроим регистры конфигурации микроконтроллера и настроем …MPLAB® Code Configurator and Encoder
Views: 1421 Еще раз про энкодер… Для некоторых приложений очень удобно и экономически выгодно, для настройки и управления использовать энкодер. Такие энкодеры имеют строенную тактовую кнопку которую можно применить для выбора …Проект с использованием MCC часть 12-1
Views: 962 В настоящее время без визуализации информации уже не интересно. Поэтому научимся выводить информацию на дисплей. Для это возьмет простенький OLED RET012864E/REX012864J я такой приобретал в фирме “Гамма-Украина”, описание можно …Светодиоды со встроенным драйвером WS2812B
Views: 938 Производитель http://www.world-semi.com Краткое описание продукции фирмы Каталог продукции” catcatcat_ws_19 catcatcat_ws_15 catcatcat_ws_11 catcatcat_ws_07 catcatcat_ws_03 catcatcat_ws_18 catcatcat_ws_14 catcatcat_ws_10 catcatcat_ws_06 catcatcat_ws_02 catcatcat_ws_05 catcatcat_ws_09 catcatcat_ws_13 catcatcat_ws_17 catcatcat_ws_16 catcatcat_ws_12 catcatcat_ws_08 catcatcat_ws_04 catcatcat_ws_01 This jQuery …TM1650 драйвер LED семисегментного индикатора
Views: 17942 Китайский производитель Shenzhen Titan Micro Electronics Co., Ltd. Выпускает широкую линейку драйверов управления светодиодными дисплеями, которые позволяют разгрузить микроконтроллер для основной работы, главная особенность этих драйверов не только …CCP – модуль в режиме Compare на примере PIC18
Views: 3097 CCP – модуль можно использовать в трех режимах: Capture – позволяет захватывать входной сигнал и определять его параметры (длительность или частоту). Дополнительно управлять внутренними модулями. Compare – позволяет …Гаджеты для домашней автоматики – Датчик приближения
Views: 1980 Управление светодиодным освещением – Датчик приближения. Данный гаджет предназначен для управления внутренним освещением мебели. Датчик позволяет определить закрытие или открытие дверцы или ящика и при этом включать или …Проект с использованием MCC часть 11
Views: 863 Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость …HVLD модуль на примере PIC24FJ128GA204
Views: 640 HVLD модуль представляет собой простое устройство, для контроля напряжения питания микроконтроллера или внешнего напряжения (через делитель). Его задача при “выходе” напряжения за заданные пределы сформировать сообщение микроконтроллеру, что …Применение typedef, struct и union
Views: 8737 Полезные описания переменных Часто необходимо в памяти расположить последовательно разные виды данных, что бы потом можно было их использовать. Полезные ссылки Взято и переработано с сайта http://www.butovo.com/~zss/cpp/struct.htm http://cppstudio.com/post/9172/ …
Output Compare – формирование импульсов
Views: 895
Любое обучение преследует определенную цель и сейчас изучение разных возможностей, это цель создания определенного устройства, название которого будет раскрыто позже.
А пока надо научиться настраивать PIC-контроллер, для аппаратного формирования на выходе заданной частоты импульсов.
Для этого будем использовать модуль Output Compare. Он имеет возможность сравнивать значение выбранное времени (подразумевается значение таймер) со значение одного или двух регистров сравнения (в зависимости от выбранного режима). Кроме того, он имеет возможность формировать на выходе единичный импульс, или формировать непрерывную последовательность выходных импульсов, по заданным событиям. Как и большинство PICmicro ® периферийных устройств, он также имеет способность генерировать прерывания в момент события сравнения.
В нашем используемом для обучении контроллере (PIC24FJ64GA002) доступны 5 таких устройств. Все выходные каналы сравнения функционально идентичны. Обозначение они носят OC1 – OC5. Разработчики PIC24 подошли более глубоко к конфигурированию периферии, это связано необходимостью создания возможности для подключения периферийного устройства к необходимым выводам микроконтроллера, таким подключением занимаются регистры настройки подключения периферийных устройств RPINR0 – RPINR23. В описании можно увидеть обозначение RP0, RP1… и так далее в зависимости от количества выводов микроконтроллера. Это выводы к которым могут быть подключены входы или выходы цифровых периферийных модулей. Естественно более конкретно, что может быть подключено, а что нет надо светиться с описанием на конкретный микроконтроллер. Функция подключения настолько гибки, что могут подключать один выход периферийного устройства к нескольким ножкам микроконтроллера или один вход, для разных периферийных устройств.
Схема, задача – на 26 ножке микроконтроллера получить меандр с заданной частотой.
В нашем случае мы конфигурируем выход OC1 на (RB15) 26 ножку микроконтроллера. Это вывод RP6. Наш выход Output Compare 1 (OC1) соответствует функциональному номеру 18 (все эти данные надо смотреть в описании). Прямая запись в регистры конфигурации настройки периферийных устройств невозможна, если установлен бит IOLOCK в регистре OSCCON (его функция еще связана с регистром конфигурации), это сделано для блокировки случайной их перенастройки в процессе работы. Если в регистре конфигурации предусмотрено возможность снятия этого бита после установки, то необходимо будет выполнить последовательность разблокирования. Если попробовать выполнить запись в регистр конфигурации периферийных устройств с установленным битом IOLOCK, то такая запись будет выполнена, но значение регистров не измениться.
Сначала по порядку, за подключение к ножке 26 отвечает регистр RPOR7 в нем в старшем байте размещены биты управления функций RP15 (см. таблица 1-2)
Таблица 1-2.
Функция | Номер ножки | Регистр который отвечает за настройку выходных сигналов для указанной ножки контроллера | Регистр выхода |
RP0 | 4 | RPOR0 | RPOR0bits.RP0R |
RP1 | 5 | RPOR0 | RPOR0bits.RP1R |
RP2 | 6 | RPOR1 | RPOR1bits.RP2R |
RP3 | 7 | RPOR1 | RPOR1bits.RP3R |
RP4 | 11 | RPOR2 | RPOR2bits.RP4R |
RP5 | 14 | RPOR2 | RPOR2bits.RP5R |
RP6 | 15 | RPOR3 | RPOR3bits.RP6R |
RP7 | 16 | RPOR3 | RPOR3bits.RP7R |
RP8 | 17 | RPOR4 | RPOR4bits.RP8R |
RP9 | 18 | RPOR4 | RPOR4bits.RP9R |
RP10 | 21 | RPOR5 | RPOR5bits.RP10R |
RP11 | 22 | RPOR5 | RPOR5bits.RP11R |
RP12 | 23 | RPOR6 | RPOR6bits.RP12R |
RP13 | 24 | RPOR6 | RPOR6bits.RP13R |
RP14 | 25 | RPOR7 | RPOR7bits.RP14R |
RP15 | 26 | RPOR7 | RPOR7bits.RP15R |
Для настройки выхода Output Compare 1, необходимо записать в соответствующий регистр выхода, который связан с нужной нам ножкой контроллера значение 18 (см. таблицу 10-3).
Таблица 10-3.
Функция | Номер функции | Название выхода |
NULL | 0 | NULL |
C1OUT | 1 | Comparator 1 Output |
C2OUT | 2 | Comparator 2 Output |
U1TX | 3 | UART1 Transmit |
U1RTS | 4 | UART1 Request To Send |
U2TX | 5 | UART2 Transmit |
U2RTS | 6 | UART2 Request To Send |
SDO1 | 7 | SPI1 Data Output |
SCK1OUT | 8 | SPI1 Clock Output |
SS1OUT | 9 | SPI1 Slave Select Output |
SDO2 | 10 | SPI2 Data Output |
SCK2OUT | 11 | SPI2 Clock Output |
SS2OUT | 12 | SPI2 Slave Select Output |
OC1 | 18 | Output Compare 1 |
OC2 | 19 | Output Compare 2 |
OC3 | 20 | Output Compare 3 |
OC4 | 21 | Output Compare 4 |
OC5 | 22 | Output Compare 5 |
Тетерь если мы не устанавливали бит IOLOCK в регистре OSCCON, то настроить выход нам необходимо будет выполнить команду:
RPOR7bits.RP15R=18; //подключение выхода модуля Output Compare 1 к ножке 26 контроллера.
Если мы хотим это сделать когда бит IOLOCK уже установлен, и если такая возможность разрешена, сброс бита IOLOCK после установки в регистре конфигурации. При инициализации регистра конфигурации, должна быть сделана такая запись:
#pragma config IOL1WAY = OFF // Блокировка регистра OSCCON: - после установки IOLOCK он может быть изменен с помощью последовательности разблокирования
То с начала надо сбросить бит IOLOCK, для чего надо выполнить последовательность разблокирования:
// снятие бита блокировки asm volatile ( "MOV #OSCCON, w1 \n" // копируем адрес регистра OSCCON в аккумулятор w1 "MOV #0x46, w2 \n" // загружаем значение 0x46 в аккумулятор w2 "MOV #0x57, w3 \n" // загружаем значение 0x57 в аккумулятор w3 "MOV.b w2, [w1] \n" // загружаем значение 0x46 из w2 в регистр OSCCON "MOV.b w3, [w1] \n" // загружаем значение 0x57 из w3 в регистр OSCCON "BCLR OSCCON,#6"); // сбрасываем бит IOLOCK в регистре OSCCON
а затем выполнить команду
RPOR7bits.RP15R=18; //подключение выхода модуля Output Compare 1 к ножке 26 контроллера.
И если в дальнейшем надо заблокировать изменение настроек, то надо установить бит IOLOCK. Для этого выполните:
// установка бита блокировки asm volatile( "MOV #OSCCON, w1 \n" "MOV #0x46, w2 \n" "MOV #0x57, w3 \n" "MOV.b w2, [w1] \n" "MOV.b w3, [w1] \n" "BSET OSCCON, #6" );
После того когда подключили наш модуль к ножке контроллера настроим его работу.
Модуль работает только в паре с таймером, который задает все временные параметры. Таймер, с которым может работать наш модуль, может быть Timer2 или Timer3. Один из них может быть выбран битом OCTSEL в регистре (OCxCON <3>).
Для настройки модуля Output Compare 1 предназначены три регистра:
- OC1CON – регистр управления.
- OC1R – регистр сравнения 1.
- OC1RS – регистр сравнения 2.
Регистр управление OC1CON – описание битов:
bit 13 – OCSIDL: отвечает за работу модуля в Idle режиме, если он установлен (1) модуль будет выключен в режиме ожидания, если сброшен (0), то будут продолжать работать в режиме ожидания.
bit 4 – OCFLT: бит состояния режима ШИМ (bit 2-0=111), актуален если модуль работает в режиме ШИМ. Если установлен (1) – произошла неисправность, если (0) – нет неисправности.
bit 3 – OCTSEL: бит выбора таймера для совместной работы, 1 = Timer3, 0 = Timer2.
bit 2-0 – выбор режима работы модуля.
111 = режим PWM, контроль неисправности включен
110 = режим PWM, контроль неисправности выключен
101 = Инициализация выходного контакта модуля низким уровнем, генерация непрерывных импульсов.
100 = Инициализация выходного контакта модуля низким уровнем, генерация одиночного импульса.
011 = Режим сравнения и переключение выхода в противоположное состояние
010 = Инициализация выходного контакта модуля высоким уровнем, после сравнения перевести в низкий уровень.
001 = Инициализация выходного контакта модуля низким уровнем, после сравнения перевести в высокий уровень.
000 = модуль отключен.
Для нашего варианта работы выберем работу с таймером 2 и настроем режим (101) – Инициализация выходного контакта модуля низким уровнем, генерация непрерывных импульсов. Настройка будет выглядеть следующим образом:
// настройка модуля Output Compare 1 OC1CON=0b0010000000010101; // |||||||||||||+++-- OCM<2:0>: Инициализация выходного контакта модуля низким уровнем, генерация непрерывных импульсов // ||||||||||||+----- OCTSEL: 0 = Timer2 // |||||||||||+------ OCFLT: - флаг статуса (не используется в нашем режиме) // |||++++++++------- неиспользуемые // ||+--------------- OCSIDL: 1- режиме Idle отключен // ++---------------- неиспользуемые // тут задаем форму сигнала OC1R=0x007F; // нарастание _/ OC1RS=0x00FF; // спад \
Настройка таймера:
// настройка таймера TMR2 T2CON=0b1010000000000000; // |||||||||||||||+-- неиспользуемый // ||||||||||||||+--- TCS: 0 - внутрений генаратор FOSC/2 // |||||||||||||+---- неиспользуемый // ||||||||||||+----- T32: 0- 16 битный режим // ||||||||||++------ TCKPS1:TCKPS0: пределитель 11-1:256 // |||||||||+-------- TGATE: - отключен // |||++++++--------- неиспользуемые // ||+--------------- TSIDL: 1- врежиме Idle отключен // |+---------------- неиспользуемый // +----------------- TON: 1 - таймер включен PR2=0x00FF; // период счета
При таких настройках мы будем иметь выходную частоту 62,5 кГц, теперь приведем формулу для расчета требуемой частоты. Тактовая частота задается используемым таймером. Частота на выходе таймера определяется настройкой предделителя и значением регистра периода PR.
Fout = Ftakt/2/предделитель/значение PR. Наша тактовая 32 мГц. Предделитель 1:1, значение PR = 255.
Fout = 32 000 000 / 2 / 1 / 255 = 62745 Гц.
Проект для загрузки.
[box title=”Файлы для загрузки” color=”#521BDE”][wpdm_file id=157][/box]
Использование прерываний для управления процессами в PIC24
Views: 1207
Во второй главе для управления светодиодами применялись макросы задержки, они “типа” стопорили работу процессора на пол секунды, после чего, контроллер выполнял необходимые команды по переключению светодиодов и опять занимался тем что ожидал. в реальной жизни это непозволительная роскошь. Если контроллеру необходимо выполнять обработку информации, то наши задержки будут только стопорить его основную работу.
Для решение этой проблемы можно использовать прерывания, которые формирует аппаратный таймер и который работает независимо от функционирования центрального процессора. Одно из решений задачи, контроллер занимается основной задачей и циклически проверяет флаг который устанавливается когда выполняется прерывание от таймера. Если флаг установлен выполняется процедура “мигания” светодиодами Если нет выполняется основная задача.
Основные различия от предыдущего проекта это при настройки таймера включение прерывания от таймера TMR1.
//--------------------------------------------------------------------------- // Настройка таймера TMR1 T1CON = 0b1000000000110000; // |||||||||||||||+-- неиспользуемый // ||||||||||||||+--- TCS: источник тактовых импульсов FOSC/2 // |||||||||||||+---- TSYNC: состояние игнорируется, так как тактовая частота системный генератор // ||||||||||||+----- неиспользуемый // ||||||||||++------ TCKPS1:TCKPS0: настройка предделителя 11 = 1:256 // |||||||||+-------- TGATE: 0- режим измерение длительности входного импульса отключен // |||++++++--------- неиспользуемые // ||+--------------- TSIDL: 0- продолжать работу в режиме ожидания (сна) // |+---------------- неиспользуемый // +----------------- TON: 1 -таймер включен PR1=0xFFFF; // период счета _T1IF=0; // очистить бит прерывания от таймера TMR1 _T1IE=1; // разрешить прерывание от таймера TMR1 //---------------------------------------------------------------------------
Создание функции прерывания от таймера TMR1.
// подпрограмма обслуживания прерываний от таймера TMR1 void __attribute__((__interrupt__, __auto_psv__)) _T1Interrupt(void) { _T1IF=0; // сброс флага прерывания от таймера TMR1 Bit.MIG=1; }//
А сам главный цикл программы теперь будет выглядеть так:
while(1) { ClrWdt(); // сброс сторожевого таймера //------------------------- // переключение светодиодов if(Bit.MIG) { if(Bit.NAG) { _LATA0 = 1; // выключить светодиод _LATB0 = 0; // выключить светодиод Bit.NAG=0; } else { _LATA0 = 0; // выключить светодиод _LATB0 = 1; // включить светодиод Bit.NAG=1; } Bit.MIG=0; } //------------------------- // основная программа в этом месте }
Расчет периода прерываний для таймера TMR1 (смотри в описании по работе с таймером).
Загрузка проекта

Использование прерываний для управления процессами в PIC24 45.72 KB 764 downloads
Использование прерываний для управления процессами...Это может быть интересно
Проект с использованием MCC часть 08
Views: 1055 И так создадим проект в котором при помощи двух кнопок мы сможем управлять яркостью светодиодов. При использовании МСС у нас лафа полная, добрые дяди с Microchipa подготовили функции, …Audio-bluetooth modules BK8000L (noname)
Views: 661 Еще один вариант, так сказать недоразумения Audio-bluetooth modules BK8000L (noname). Его отличительной маркировкой служат два отверстия в плате и надпись R2. Отличают его от модулей на чипе BK8000L, …Контроллер управления светодиодным освещением с дистанционным управлением
Views: 1870 Все активнее светодиоды входят в нашу жизнь. Всё эффективнее становится светодиодное освещение. Всё ниже опускаются цены. Всё больше появляется возможностей получения сочных цветов, простоты в управлении. Всё чаще …Инфракрасный датчик движения, PIR-sensor
Views: 3110 Домашняя автоматика предполагает наличие датчиков движения, которые способны контролировать движения человека. Самым простым и доступным устройством позволяющие контролировать изменения ИК-излучения, это ПИР-сенсоры. На текущий момент доступны не дорогие модели D203B, D204B, D205B. Все …Altium Designer my setup system and project structure V23.3
Views: 189 Оновлення бази даних та шаблонів від березня 2023 року. Updating the database and templates from March 2023. Altium Designer my Libraries, Project templates, System settings by Catcatcat. Дивись …Светодиоды со встроенным драйвером WS2812B
Views: 938 Производитель http://www.world-semi.com Краткое описание продукции фирмы Каталог продукции” catcatcat_ws_19 catcatcat_ws_15 catcatcat_ws_11 catcatcat_ws_07 catcatcat_ws_03 catcatcat_ws_18 catcatcat_ws_14 catcatcat_ws_10 catcatcat_ws_06 catcatcat_ws_02 catcatcat_ws_05 catcatcat_ws_09 catcatcat_ws_13 catcatcat_ws_17 catcatcat_ws_16 catcatcat_ws_12 catcatcat_ws_08 catcatcat_ws_04 catcatcat_ws_01 This jQuery …Arduino LCD + STONE STVI056WT-01 + Strain gauge
Views: 446 Author li grey email: greyli1987@outlook.com The strain assessment instrument is used to assess the degree of corresponding muscle strain by obtaining the muscle surface action potential through silver …Самый простой диммер для светодиодного освещения
Views: 3043 Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы …Altium Designer my Libraries, Project templates, System settings by Catcatcat V23.04
Views: 235 Смотри как установить и подключить библиотеку тут. V. – 23_04 – Component Database Update. – configuration file name – DXPPreferences1.DXPPrf. – Added two projects for audio amplifier …Применение typedef, struct и union
Views: 8737 Полезные описания переменных Часто необходимо в памяти расположить последовательно разные виды данных, что бы потом можно было их использовать. Полезные ссылки Взято и переработано с сайта http://www.butovo.com/~zss/cpp/struct.htm http://cppstudio.com/post/9172/ …
Формат данных XC16
Views: 600
Для дальнейшей работы, понадобиться понятие переменных. Кратко чтобы не напрягать – название и размер данных:
Объявление | Бит | Диапазон чисел | Примечание |
Целочисленные типы | |||
char | 8 | -128 … 127 | со знаком |
signed char | 8 | -128 … 127 | со знаком |
unsigned char | 8 | 0 … 255 | без знака |
short | 16 | -32768 … 32767 | со знаком |
signed short | 16 | -32768 … 32767 | со знаком |
unsigned short | 16 | 0 … 65535 | без знака |
int | 16 | -32768 … 32767 | со знаком |
signed int | 16 | -32768 … 32767 | со знаком |
unsigned int | 16 | 0 … 65535 | без знака |
long | 32 | -2147483648 … 2147438647 | со знаком |
signed long | 32 | -2147483648 … 2147438647 | со знаком |
unsigned long | 32 | 0 … 4294867295 | без знака |
long long**, signed long long** | 64 | -9223372036854775808…9223372036854775807 | со знаком |
unsigned long long** | 64 | 0…18 446 744 073 709 551 615 | без знака |
Для арифметики с плавающей запятой | |||
float | 32 | 1.175494e-38 … 3.40282346e+38 | |
double* | 32 | 1.175494e-38 … 3.40282346e+38 | |
long double | 64 | 2.22507385e-308 … 1.79769313e+308 |
* * ANSI-89 extension
* double is equivalent to long double if -fno-short-double is used.
Исследуем формирования задержки
Views: 994
Сама задержка или ожидание чего-то не самая популярная вещь в программировании, ведь она просто тратит машинное время в пустую. Но как ни крути, время от времени её необходимо использовать. Как видим одним из удобных вариантов формирования задержки нам предоставляет стандартная библиотека libpic30.h в виде трех макросов:
__delay32 – формирование задержки в тактах процессорного времени.
пример: __delay32(NNN); где NNN – unsigned long циклов, минимальное число 12 циклов, если значение меньше 12, то все равно будет задержка в 12 циклов (12-4294967295).
__delay_ms – формирование задержки в миллисекундах.
пример: __delay_ms(NNN); где NNN – unsigned int – миллисекунд (0-65536).
__delay_us – формирование задержки в микросекундах.
пример: __delay_us(NNN); где NNN – unsigned int – микросекунд (0-65536).
Для макросов __delay_ms и __delay_us необходимо сделать определение и указать рабочую тактовую частоту контроллера, сделать это надо до “вставки” библиотеки (типа так):
// #define FCY 32000000UL // определение тактовой частоты для макросов __delay_ms() и __delay_us() #include // библиотека функций //
Существуют разные возможности формирования задержек при помощи встроенных таймеров, но как показала практика, ни в эффективности, ни в практичности они уступают макросам. Во первых расходуется больше памяти, во вторых задействован сам таймер, который может использоваться для других целей.
Но для расширения кругозора, приведем пример, решения нашей задачи из прошлой главы с миганием светодиодов.
Для начала необходимо включить в работу сам таймер (работу самого таймера будет рассмотрено позже):
//--------------------------------------------------------------------------- // Настройка таймера TMP1 T1CON = 0b1000000000110000; // |||||||||||||||+-- неиспользуемый // ||||||||||||||+--- TCS: источник тактовых импульсов FOSC/2 // |||||||||||||+---- TSYNC: состояние игнорируется, так как тактовая частота системный генератор // ||||||||||||+----- неиспользуемый // ||||||||||++------ TCKPS1:TCKPS0: настройка предделителя 11 = 1:256 // |||||||||+-------- TGATE: 0- режим измерение длительности входного импульса отключен // |||++++++--------- неиспользуемые // ||+--------------- TSIDL: 0- продолжать работу в режиме ожидания (сна) // |+---------------- неиспользуемый // +----------------- TON: 1 -таймер включен PR1=0xFFFF; // период счета //
После такого включения таймера можно выполнить формирования задержки следующим образом:
// TMR1=0; while(TMR1 < 60000); //
А сам главный цикл из прошлой главы может быть иметь такой вид:
// while(1) { ClrWdt(); // сброс сторожевого таймера _LATA0 = 0; // выключить светодиод _LATB0 = 1; // включить светодиод TMR1=0; while(TMR1 < 60000); // __delay_ms(500); // ждать 0,5 секунды _LATA0 = 1; // включить светодиод _LATB0 = 0; // выключить светодиод TMR1=0; while(TMR1 < 60000); // __delay_ms(500); // ждать 0,5 секунды } //
Всем желающим можно попробовать этот вариант. Хотя как я уже говорил, он не эффективен.
Это может быть интересно
Цифровой спидометр для автомобиля
Views: 10166 Универсальность печатной платы ch-c0030pcb позволяет создавать на её основе разнообразные устройства. Одним из таких устройств является электронный спидометр для автомобиля, в котором можно задать два компаратора скорости, например, для …Стабилизатор тока для светодиодов SN3350
Views: 2611 SN3350 ближайший аналог ZXLD1350 Как собрать готовый вариант, читайте во второй части – http://catcatcat.d-lan.dp.ua/stabilizator-toka-na-sn3350-chast-2/ 40V драйвер светодиодов с внутренним ключом SN3350 – импульсный понижающий преобразователь, разработанный для того, чтобы эффективно управлять одним или …Часы-кухонный таймер
Views: 2724 Каждая кухня должна иметь кухонный таймер, который позволяет напоминать хозяйке когда проходить определенный промежуток времени. Например, печем пирог, варим яйца… , чтобы не смотреть постоянно на часы, установим таймер и …Мультимедийная сеть – AVC-LAN TOYOTA
Views: 5762 AVC LAN – протокол обмена данными мультимедийных систем автомобиля. Кодирование данных. При кодировании различаться три типа данных : преамбула – её назначение, это сообщение устройствам на шине, что начинается передача данных. …LED драйвер TM1639
Views: 2198 TМ1639 позволяет работать на матрицу 8*8 или 8 семисегметных индикаторов. Может работать как на индикаторы с общим катодом, но и есть возможность подключать общим анодом. Для управления драйвером …Оптосимистор и его применение
Views: 19679 Эрве Кадино “Цветомузыкальные установки” Ответ на вопрос – управление мощным тиристором или симистором, от терморегулятора. Статья в pdf[wpdm_file id=129 template=”link-template-calltoaction3.php”] Оптосимистор принадлежат к классу оптронов и обеспечивают очень хорошую …Самый простой диммер для светодиодного освещения
Views: 3043 Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы …Простой цифровой регулятор мощности
Views: 6961 Простой регулятор мощности с цифровой индикацией. Этот проект создан как обучающий, для ознакомления с основами построения сетевых регуляторов мощности. Устройства подобного типа можно использовать для управления освещением, скоростью …WiFi ESP8266 – AT команды связанные с функцией Wi-Fi
Views: 5382 AT команды связанные с функцией Wi-Fi Функции Wi-Fi подключения, запускаться из командной строки Команда Описание 1 AT+CWMODE Проверка, настройка режима работы Wi-Fi (sta/AP/sta+AP), (не рекомендуется для новых проектов). 2 …Простой цифровой милливольтметр постоянного тока
Views: 4102 Простой цифровой вольтметр постоянного тока. Три диапазона измерений с автоматическим переключением 1 – 0,001 – 0,999 V, 2 – 0,01-9,99 V, 3 – 0,1-99,9. Четыре управляемых выхода с возможностью задания функции контроля …
Первая программа на PIC24
Views: 2074
При написании первой программы всегда начинает вопрос с чего начать. Пропустим весь процесс установки среды программирования так ка считаем, что это пройденный этап. Программировать будем учиться на языке С 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 секунды }
Первая программа – мигание светодиода, для встроенных систем, это как “Привет Мир”. Светодиод мигает – мир радуется!
Демонстрационное видео
Проект для загрузки
Это может быть интересно
REFERENCE CLOCK OUTPUT MODULE
Views: 500 REFERENCE CLOCK OUTPUT MODULE Модуль формирования опорного тактового сигнала Модуль опорного тактового сигнала обеспечивает возможность посылать сигнал синхронизации на тактовый опорный выходной контакт или контакты (CLKR) в зависимости от …Проект с использованием MCC часть 03
Views: 1599 Первым делом перенастроим регистры конфигурации, следующим образом: Отключим выход генератора (CLKOUT function is disabled. I/O function on the CLKOUT pin) Включим сторожевой таймер (WDT enabled) После этой настройки …LED модуль P10 (1R) V706A
Views: 7745 Это еще одно чудо от китайского брата. Это монохромные матрицы, называются они P10 (1R) V706A, ну типа R-красные, но не верьте паяют светики и зеленые и синие, в общем …Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)
Views: 3210 Солнечные коллекторы для отопления в Европе используют в более 50% от общего количества установленных гелиосистем. Однако следует понимать, что гелиосистемы предназначены лишь для поддержки отопления и экономии затрат на основную …PIC18 – System Arbitration
Views: 563 Системный арбитр. Разрешает доступ к памяти между выборами уровнями системы (т.е. Main, Interrupt Service Routine) и выбором периферийных устройств (т.е. DMA и Scanner) на основе назначенных пользователем приоритетов. Каждый …Униполярный шаговый двигатель – часть 2
Views: 812 В этой части только итог и версия 2.0 универсальной, которая позволяет управлять шаговым двигателем во всех трех режимах и 3.0 специальной библиотеки только для одного полушагового режима. В …WiFi ESP8266 – AT команды связанные с функцией TCP/IP (v.1.6.1)
Views: 5100 AT команды связанные с функцией TCP/IP В этом разделе описаны команды которые позволяют устанавливать соединения между серверами и клиентами в сети. Приведено описание команд и примеры их выполнения. …Простой сенсорный регулятор света
Views: 2314 Простой сенсорный регулятор. Проект – 2007 года. Регулятор выполнена на микроконтроллере PIC12F683 и имеет минимальное количество элементов. Выполняет стандартные функции, включение выключение света, изменение яркости, запоминание последнего установленного уровня …Просто о внешних переменных
Views: 789 Часто возникает задача когда необходимо предавать данные между модулями программы. Например, передать данные между файлами, или управлять работой модулей. Для этого создаем заголовочный файл и описываем наши переменные как …NeoPixel LED и PIC18
Views: 1670 Еще раз об управлении светодиодами на драйвере WS2812 и ему подобных. Как известно эти светики управляются по однопроводной шине. Основная особенность, что программно можно описать передачу данных, …
Как запитать и подключить к программатору PIC24
Views: 1695
Для обучения будем использовать PIC24FJ64GA002. Его особенность – низкая цена, 28 выводов, диапазон питания 2,0-3,6 вольта. Для питания будем использовать источник 3,3 вольта. А так как ядро контроллера работает при напряжении 2,5 вольта, мы должны оставить включенным внутренний регулятор напряжения, для этого к выводу Vcap/Vddcore подключить керамический конденсатор 10,0 мкФ. А вывод DISVREG – подключить к Vss (к общему).
Для подключения к программатору у контроллера есть три альтернативных варианта подключения.
Первый вариант подключения.
Второй вариант подключения.
Третий вариант и первая схема для обучения по работе с PIC24.
Для индикации мы подключим к портам RA0, RA1, RB0, RB1 светодиоды для контроля работы программы. Для питания можно использовать любой 3,3 вольтовый стабилизатор. Для макетирования была применена плата ILLISSI-M4B01
Макетная плата в сборе для тестирования и обучения.
Полная схема, со стабилизатором.
CON1 предназначен для подключения к программатору, CON2 для подачи питания на микроконтроллер.
Если схема собрана правильно, надо переходить к написанию первой программы.
Изучаем PIC24, компилятор XC16
Views: 4779
С чего начать и с чего приступить к изучению 16 разрядных PIC-микроконтроллеров.
Первое, это надо разобраться как установить среду программирования и сам компилятор Си, в нашем варианте это MPLAB IDE v8.89 и MPLAB XC16 v1.11.
Второе, приобрести PIC-контроллер, я использовал PIC24FJ64GA002.
Третье, макетную плату и всякую россыпуху и не только.
Чего не стоит искать здесь.
Здесь не стоит искать изучение языка Си, здесь только практические советы, по необходимости, все можно конечно объяснить и помочь понять, для этого задавайте вопросы на форуме http://musiccolor.d-lan.dp.ua/.
Статьи:
- Как подключить питание и подключение для внутрисхемного программирования PIC24.
- Настройка тактового генератора.
- Первая программа на PIC24.
- Исследуем формирования задержки.
- Объявление переменных – Формат данных.
- Использование прерываний для управления процессами.
- Output Compare – формирование импульсов.
- I2C™ – INTER-INTEGRATED CIRCUIT и PIC24.
- 10-бит, высокоскоростной, аналого-цифровой преобразователь, часть 1.
- 10-бит, высокоскоростной, аналого-цифровой преобразователь, часть 2.
- Измерение частоты.
- PIC24 и работа с SD/MMC картами памяти.
- Часы реального времени DS1340.
- Энкодер и его применение.
- Контроллер DMA (Direct Memory Access).
- Визуализация данных.
- Многокнопочная клавиатура.
- Внешний АЦП ADS1230 и PIC24FJ64GA004.
- … продолжение следует …