Графическая библиотека для драйвера SEPS114A интерфейс SPI

Visits: 207


Функции Библиотеки


Схема подключения индикатора по интерфейсу SPI.

Catcatcat_electronics_SEPS114A_01


void SPI2_ON (void); // инициализация SPI2


void OledInt (void); // инициализация драйвера дисплея
void OledFic_read (void); // фиктивное чтение данных, для эмуляции автоприращения
void OledWriteCom (int IR, int datain); // запись команды управления драйвером
void OledEnVcc (int enable_disable); // выключение/включение внешнего DC/DC преобразователя/off / on the external DC / DC converter

void OledData (void); // установка обращению к регистру данных изображения
void OledPict (void); // запись точки в DDRAM (цветом установленным для рисунка)
void OledFon (void); // запись точки фона в DDRAM (цветом установленным для фона)


расширенная задание рабочих цветов
необходимо ввести цвет рисунка, и фона в формате RGB (0-255)
void OledColorSet (unsigned char Rr, unsigned char Gr, unsigned char Br,unsigned char Rf, unsigned char Gf, unsigned char Bf);


Компактная настройка цвета

необходимо ввести цвет рисунка, и фона в формате 0-15
номер цвета R G B R G B
0-Black (черный) #000000 (000,000,000)
1-Maroon (темно-бордовый) #800000 (128,000,000)
2-Red (красный) #FF0000 (255,000,000)
3-Green (зеленый) #008000 (000,128,000)
4-Lime (ярко-зеленый) #00FF00 (000,255,000)
5-Olive (оливковый) #808000 (128,128,000)
6-Yellow (желтый) #FFFF00 (255,255,000)
7-Navy (темно-синий) #000080 (000,000,128)
8-Blue (голубой) #0000FF (000,000,255)
9-Purple (фиолетовый) #800080 (128,000,128)
10-Fuchsia (фуксин) #FF00FF (255,000,255)
11-Teal (серо-зеленый) #008080 (000,128,128)
12-Aqua (морская волна) #00FFFF (000,255,255)
13-Gray (серый) #808080 (128,128,128)
14-Silver (серебряный) #C0C0C0 (192,192,192)
15-White (белый) #FFFFFF (255,255,255)

void OledColorFast (unsigned char colP, unsigned char colF);// установить цвет выводимой точки


Быстрая очистка в черный цвет
void OledClearAll (void);// быстрая очистка в черный цвет


Установка курсора/positioning of the cursor X-(0,95),Y-(0,95)
void OledCursor (char Xp, char Yp);


Закраска прямоугольной области
XS – начало левый нижний угол (0-95)
YS – начало левый нижний угол (0-95)
XE – конец правый верхний угол (0-95)
YE – конец правый верхний угол (0-95)
tip – тир заливки 0-сплошная, 1-градиентная, 2-градиентная серая
NAP – направление градиента (0-7)
colorN – цвет 1 (0-15)
colorS – цвет 2 (0-15)

void OledFillRect (unsigned char XS,unsigned char YS,unsigned char XE,unsigned char YE,unsigned char tip,unsigned char NAP,unsigned char colorN,unsigned char colorS);


Вывод символа//the output symbol
Прорисовка символа
X – 0-132; Y – 0-64
cod – символ
tip – расстояние после символа
sti – тип наложения на фон 0-наложение 1 – стирание фона
shi – ширина 0/1-стандартная 7-максимальная.
vis – высота 0/1-стандартная, 7-максимальная
void OledSymbol (unsigned char cod,unsigned char tip,unsigned char inv,unsigned char shi,unsigned char vis);


Вывод строк/output character strings
OledString – вывод на дисплей строк c любой точки дисплея
str строка символов или указатель на строку в ПЗУ
prop – расстояние между символами
nalo – тип наложения на фон 0-наложение 1 – стирание фона
width-[ширина символа] 0-нормальное до 7
height-[высота символа] 0-нормальное, 1-двойная высота
X-[координата по X][-1 = центрирование строки Х 0-dispX]
Y-[координата по Y][координата Y 0-62]

void OledString(const char *str,char prop,char nalo,char width,char height,char X,char Y);
/*вывод строки с текущей позиции*/
void OledStringCur(const char *str,char prop,char inv,char width,char height);


Бегущая строка/ Ticker
при вызове функции в окно бегущей строки выводиться 1 следующий символ.
в цикле вывода информации должна быть одна строка OledTicker
строка выезжает в окно, пробегает окно, и начинается заново
str – символьная строка – max 255 символов
tipvy – тип вывода информации 0- нормальный, 1- в начале наложение
shiS – ширина символа 0-2 (0,1 == 1)
vysS – высота символа 0-3 (0,1 == 1)
X – положение по X
Y – высота строки (низ)
dlinokna – длина окна в пикселях (ширина будет подогнана к размеру символов)

void OledTicker (const char *str,char tipvy,char shiS,char vysS,char X,char Y,char dlinokna);


Рисование точки
[тип] 0-цвет рисунка,1-цвет фона
[координата по X] 0-127
[координата по Y] 0-63
void point(unsigned char tip, unsigned char X, unsigned char Y);


Рисование линии алгоритм Брезенхема
// tip тип линии 0-цвет рисунка 1-цвет фона, 2-варианты пунктиров
// x0 y0 x1 y1 – координаты линии
void line(unsigned char tip, unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1);


Рисование прямоугольника (есть ограничение на задание координат – задание координаты верхний левый угол + ширина и высота)
1-[тип углов]0-прямые, 1-скругленные
2-[тип линии] 0-отсутствует 1- сплошная, от 2 и более варианты прорисовки
3-[толщина бордюра] 0- нет (заливка все равно будет делать 1 пиксель отступа), 1,2,3 толщина
4-[тип заливки]0-нет заливки,1-цвет рисунка,2-цвет фона, 3 и более варианты
5-[x0][y0] – координата нижнего левого угла
6-[ширина] – ширина прямоугольника
7-[высота] – высота прямоугольника
void rectangle(unsigned char ugl, unsigned char tip, unsigned char bor, unsigned char tipzal, unsigned char x0, unsigned char y0, unsigned char sh, unsigned char vs);


Полоса загрузки индикатор линейный (есть ограничение на задание координат – задание координата нижнего левый угол + ширина и высота)
[тип углов]0-прямые, 1-скругленные
[тип линии]0-белая 1- сплошная, от 2 и более варианты
[тип заливки]0-белая,1-черная, 2 и более варианты
[x0][y0] – координата нижнего левого угла
[ширина] – ширина прямоугольника
[высота] – высота прямоугольника
[vol] – уровень 0-100%
void strip(unsigned char ugl, unsigned char tip, unsigned char tipzal, unsigned char x0, unsigned char y0, unsigned char sh, unsigned char vs, unsigned char vol);


[box title=”Файлы для загрузки” color=”#521BDE”] Библиотека + демопример v1.0(MPLAB X IDE v1.80, XC16 C Compiler V1.11) [wpdm_file id=199]Схема подключения индикаторов на драйвере SEPS114A[wpdm_file id=194][/box]


Это может быть интересно


  • Четырех канальный терморегулятор ch-4000Четырех канальный терморегулятор ch-4000
    Visits: 3126  Четыре независимых канала регулирования температуры, одновременно можно подключить 16 датчиков температуры DS18B20 с удалением до трехсот метров. Можно для регулировки выбрать любой датчик, подключенный к устройству. Каждый канал может работать …
  • Акриловый корпус для платы ch-4000Акриловый корпус для платы ch-4000
    Visits: 637 Плата ch-4000 подходит для монтажа в корпуса на дин рейку, но для домашней автоматики необходимо что-то другое, поэтому был разработан корпус из акрила который позволит создавать настольные и настенные устройства. Корпус …
  • Стабилизатор тока на SN3350, часть 2Стабилизатор тока на SN3350, часть 2
    Visits: 1125 Если вам необходимо разработать устройство с применением мощных светодиодов, то никак не обойтись без применения стабилизатора тока. На настоящий момент стабилизаторы тока являются самым эффективным механизмом, для питания светодиода в течение всего …
  • NeoPixel LED и PIC18NeoPixel LED и PIC18
    Visits: 1635   Еще раз об управлении светодиодами на драйвере WS2812 и ему подобных. Как известно эти светики управляются по однопроводной шине. Основная особенность, что программно можно описать передачу данных, …
  • MCC – K42 – настройка модуля DMAMCC – K42 – настройка модуля DMA
    Visits: 721 MCC – в версии v.3.95.0 и начиная ядра 4.85.0 конфигуратор предоставляет графический интерфейс для настройки модуля DMA. Для начала: Посмотреть какая версия МСС можно в закладке версии, если …
  • Проект с использованием MCC часть 11Проект с использованием MCC часть 11
    Visits: 800 Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость …
  • MCC PIC24 – модуль OUTPUT COMPARE – режиме ШИМMCC PIC24 – модуль OUTPUT COMPARE – режиме ШИМ
    Visits: 1082 Во многих системах управления, для формирования управляющих сигналов требуется модуль ШИМ, он позволяет не только формировать импульсы заданной длительности, но и с применением обычного RC фильтра строить простые …
  • MPLAB® Harmony – или как это просто! Часть 3.MPLAB® Harmony – или как это просто! Часть 3.
    Visits: 2043 Часть третья – копнём немного глубже. Вы наверное заметили, что во второй главе, вроде сначала все шло как по маслу, а потом, что бы заморгали светики, я вставил …
  • Простой сенсорный регулятор светаПростой сенсорный регулятор света
    Visits: 2289 Простой сенсорный регулятор. Проект – 2007 года. Регулятор выполнена на микроконтроллере PIC12F683 и имеет минимальное количество элементов. Выполняет стандартные функции, включение выключение света, изменение яркости, запоминание последнего установленного уровня …
  • Простой оптический сенсор приближенияПростой оптический сенсор приближения
    Оптический сенсор, назначение оптический концевик, для автоматики, бесконтактный выключатель с функцией автоматического отключения...



10-бит, высокоскоростной, аналого-цифровой преобразователь, часть 2

Visits: 2452


Измерение переменного напряжения, вычисление TrueRMS.

Этот урок обучения работе с АЦП будет предназначен для измерения параметров переменного тока, это актуально к нашим электросетям, где качество поставляемой электроэнергии является проблемой. За основу вычисления величины переменного напряжения возьмем информацию на сайте http://www.easycalculation.comTrueRMS переменного тока, это количество передаваемой энергии которое в идеале соответствует такой же величине постоянного тока.

В нашей электросети сети стандарт 230 вольт, это в идеале 0,707 от амплитудного значения переменного тока в сети, т.е. если максимальное значение амплитуды умножить на 0,707, то мы получим наши 230 вольт. По такому принципу работают большинство вольтметров. В последнее время огибающая кривой не соответствует идеалу синусоиды, а по этому и количество передаваемой энергии далека от идеала. Наша задача определить реальное количество энергии передаваемое в нашей электросети с учетом всех (возможно измеренных) искажений.

pic24-15-600x240
 

Для измерения переменного напряжения, на нашу макетную плату необходимо добавить несколько компонентов. Для измерения необходимо будет применить трансформатор, для гальванической развязки.

Схема.

pic24-08-071

Для вычисление истинного напряжения TrueRMS необходимо выполнить сканирования одного периода напряжения сети. Т.е. необходимо произвести n- количество измерений. В идеале чем чаще мы сделаем выборки тем точнее будет расчет реального напряжения.

pic24-16-600x256

Для измерения истинного напряжения в сети нам необходимо произвести выборку одного периода, или провести выборку на протяжении длительности более одного периода, но я думаю, что точнее будет когда мы будем для измерения выбирать один период.

Для измерения нам скорости от 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.

pic24-08-06


Проект, среда разработки MPLAB® X v1.70, компилятор С MPLAB XC16 v1.11.

Значок

10-бит, высокоскоростной, аналого-цифровой преобразователь, часть 1 72.81 KB 1108 downloads

10-бит, высокоскоростной, аналого-цифровой преобразователь. Проект,...
Значок

10-бит, высокоскоростной, аналого-цифровой преобразователь, часть 2 99.45 KB 884 downloads

10-бит, высокоскоростной, аналого-цифровой преобразователь,...

10-бит, высокоскоростной, аналого-цифровой преобразователь, часть 1

Visits: 1474


Измерение постоянного напряжения.

Ну и  как можно обойти АЦП, тем более что он позволяет сканировать со скоростью до 500 тысяч преобразование в секунду (500 ksps).

Структурная схема

pic24-13-600x600

И так мысли в слух:

В 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 регистров, за время одного конвертирования, можно включить режим, года запись ведется в восемь младших , а процессор, в это время, может считывать информацию со старших восьми регистров и наоборот.

Для изучения работы АЦП необходимо будет немного изменить схему.

pic24-14

Светодиод перенесем на 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

Visits: 1061


Для работы с периферийными устройствам I2C™ просто незаменим. Дисплеи, память, драйверы и много другое…

В нашем примере мы будем подключать дисплей RDX077 (на драйвере UC1601S) к нашей макетной плате. Почему RDX077 – пока на настоящий момент, это самый доступный индикатор (для меня) с приемлемой ценой. Схема подключения:

pic24-10

RDX0077 – графический индикатора с драйвером UC1601s. В этой главе научимся выводить информацию на индикатор. Описывать сам драйвер UC1601s здесь не будем, будем создавать библиотеку для работы с индикатором.

Первое что необходимо выбрать это модуль I2C, у нас подключен индикатор ко второму модулю. Индикатор может работать на скорости до 400 кГц, поэтому необходимо разобраться как настроить необходимую скорость в модуле. За скорость отвечает регистр I2C2BRG из описания мы можем видеть формулы для расчета скорости и таблица с приведенными расчетами.

pic24-11

 Для стандартных тактовых частот приведены расчетные данные:

Заданная частота шины 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);

Думаю для начала этого более чем достаточно.


Результат работы программы:

pic24-12

Теперь необходимо скачать проект и поэкспериментировавший с выводом сообщений и графики.


Описание библиотеки в разделе Библиотеки.  Демонстрационное видео функций библиотеки.

 


Файлы для загрузки

Демопроект с полным текстом + библиотека (графические примитивы и символы).[wpdm_file id=66 template=”link-template-calltoaction3.php”]



Это может быть интересно


  • CCP – модуль в режиме Compare на примере PIC18CCP – модуль в режиме Compare на примере PIC18
    Visits: 3055 CCP – модуль можно использовать в трех режимах: Capture – позволяет захватывать входной сигнал и определять его параметры (длительность или частоту). Дополнительно управлять внутренними модулями. Compare –  позволяет …
  • ch-светомузыка от теории до реализацииch-светомузыка от теории до реализации
    Visits: 670 Сразу оговоримся технология или теория ch-светомузыки, это постоянно развивающийся процесс и то что будет сказано сегодня завтра может быть опровергнуто и считаться ошибочным. Назовем само решение проблемы автоматического …
  • Altium Designer my Libraries, Project templates, System settings by Catcatcat V23.04Altium Designer my Libraries, Project templates, System settings by Catcatcat V23.04
    Visits: 157 Смотри как установить и подключить библиотеку тут.   V.  – 23_04 – Component Database Update. – configuration file name – DXPPreferences1.DXPPrf. – Added two projects for audio amplifier …
  • MPLAB® Code ConfiguratorMPLAB® Code Configurator
    Visits: 1768 MPLAB ® Code конфигуратор (MCC) является свободно распространяемым плагином, это графическая среда программирования, которая генерирует бесшовный, легкий для понимания кода на Cи, чтобы вставить его в свой проект. …
  • Проект с использованием MCC часть 12-1Проект с использованием MCC часть 12-1
    Visits: 892 В настоящее время без визуализации информации уже не интересно. Поэтому научимся выводить информацию на дисплей. Для это возьмет простенький OLED RET012864E/REX012864J я такой приобретал в фирме “Гамма-Украина”, описание можно …
  • I2C MODULE – PIC18F25K42 Device ID Revision = A001I2C MODULE – PIC18F25K42 Device ID Revision = A001
    Visits: 1045 I2C MODULE Обход ошибок в версии I2C MODULE – PIC18F25K42 Device ID Revision = A001 В Серии K42 применен совершенно новый модуль шины I2C, который позволяет поддерживать все …
  • WiFi ESP8266 – AT команды связанные с функцией Wi-FiWiFi ESP8266 – AT команды связанные с функцией Wi-Fi
    Visits: 5205 AT команды связанные с функцией Wi-Fi Функции Wi-Fi подключения, запускаться из командной строки Команда Описание  1 AT+CWMODE Проверка, настройка режима работы Wi-Fi (sta/AP/sta+AP), (не рекомендуется для новых проектов). 2 …
  • Analog-to-Digital Converter with Computation Technical BriefAnalog-to-Digital Converter with Computation Technical Brief
    Visits: 1208 Аналого-цифровой преобразователь с вычислительным модулем. ВВЕДЕНИЕ Аналого-цифровой преобразователь (ADC) с вычислительным модулем (ADC2) в 8-разрядном микроконтроллере Microchip имеет встроенные вычислительные функции, которые обеспечивают функции пост-обработки, такие как передискретизация, …
  • УКВ – радиоприем, часть 2УКВ – радиоприем, часть 2
    Visits: 6168 Пришло свободное время решил вторую часть проекта реализовать (правда есть мысль и третью с использование цветного OLED и функцией ch-светомузыки, но это только задумка… Для понимания функций интегрального …
  • USB K-L-line адаптерUSB K-L-line адаптер
    Visits: 5925 USB K-L-line адаптер предназначен для связи персонального компьютера с диагностической шиной автомобиля – интерфейс ISO-9141. Этот проект предназначен для сборки недорого устройства с использованием специально для этой цели …


Output Compare – формирование импульсов

Visits: 942


Любое обучение преследует определенную цель и сейчас изучение разных возможностей, это цель создания определенного устройства, название которого будет раскрыто позже.

А пока надо научиться настраивать PIC-контроллер, для аппаратного формирования на выходе заданной частоты импульсов.

Для этого будем использовать модуль Output Compare. Он имеет возможность сравнивать значение выбранное времени (подразумевается значение таймер) со значение одного или двух регистров сравнения (в зависимости от выбранного режима). Кроме того, он имеет возможность формировать на выходе единичный импульс, или формировать непрерывную последовательность выходных импульсов, по заданным событиям. Как и большинство PICmicro ® периферийных устройств, он также имеет способность генерировать прерывания в момент события сравнения.

В нашем используемом для обучении контроллере (PIC24FJ64GA002) доступны 5 таких устройств. Все выходные каналы сравнения функционально идентичны. Обозначение они носят OC1 – OC5. Разработчики PIC24 подошли более глубоко к конфигурированию периферии, это связано необходимостью создания  возможности для подключения периферийного устройства к необходимым выводам микроконтроллера, таким подключением занимаются регистры настройки подключения периферийных устройств RPINR0 – RPINR23. В описании можно увидеть обозначение RP0, RP1… и так далее в зависимости от количества выводов микроконтроллера. Это выводы к которым могут быть подключены входы или выходы цифровых периферийных модулей. Естественно более конкретно, что может быть подключено, а что нет надо светиться с описанием на конкретный микроконтроллер. Функция подключения настолько гибки, что могут подключать один выход периферийного устройства к нескольким ножкам микроконтроллера или один вход, для разных периферийных устройств.

Схема, задача – на 26 ножке микроконтроллера получить меандр с заданной частотой.

pic24-09

В нашем случае мы конфигурируем выход 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 предназначены три регистра:

  1. OC1CON – регистр управления.
  2. OC1R – регистр сравнения 1.
  3. 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;	// период счета

pic24-08

При таких настройках мы будем иметь выходную частоту 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

Visits: 1255


Во второй главе для управления светодиодами применялись макросы задержки, они “типа” стопорили работу процессора на пол секунды, после чего, контроллер выполнял необходимые команды по переключению светодиодов  и опять занимался тем что ожидал. в реальной жизни это непозволительная роскошь. Если контроллеру необходимо выполнять обработку информации, то наши задержки будут только стопорить его основную работу.

Для решение этой проблемы можно использовать прерывания, которые формирует аппаратный таймер и который работает независимо от функционирования центрального процессора. Одно из решений задачи, контроллер занимается основной задачей и циклически проверяет флаг который устанавливается когда выполняется прерывание от таймера. Если флаг установлен выполняется процедура “мигания” светодиодами  Если нет выполняется основная задача.

Основные различия от предыдущего проекта это при настройки таймера включение прерывания от таймера 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 745 downloads

Использование прерываний для управления процессами...


Это может быть интересно

  • Интерактивные LedИнтерактивные Led
    Visits: 440 Тема проекта   продолжение следует…. Это может быть интересно Метки: LED
  • Arduino LCD + STONE STVI056WT-01 + Strain gaugeArduino LCD + STONE STVI056WT-01 + Strain gauge
    Visits: 419 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 …
  • Проблемы классической светомузыкиПроблемы классической светомузыки
    Visits: 2018 Светомузыка – что это такое? Определение: Светомузыка  (жаргонное: цветомузыка)  — вид искусства, основанный на способности человека ассоциировать звуковые ощущения со световыми восприятиями. Такое явление в неврологии получило название …
  • AD9833 – Programmable Waveform Generator – part twoAD9833 – Programmable Waveform Generator – part two
    Visits: 1638 Прошло время и появилась тема, что-бы закончить проект AD9833 – Programmable Waveform Generator. Приехали печатные платы. В этот раз я печатные платы заказывал в https://jlcpcb.com/ делал это в …
  • DS18B20 – удаленный контроль температурыDS18B20 – удаленный контроль температуры
    Visits: 3007 Контроль температуры с использованием датчиков температуры DS18B20 и платы ILLISSI-4B-09-primum Проект позволяет подключать к плате ILLISSI-4B-09-primum до 16 датчиков температуры DS18B20, удаленных более 300 метров,  и выводить информацию …
  • ch-светомузыка от теории до реализацииch-светомузыка от теории до реализации
    Visits: 670 Сразу оговоримся технология или теория ch-светомузыки, это постоянно развивающийся процесс и то что будет сказано сегодня завтра может быть опровергнуто и считаться ошибочным. Назовем само решение проблемы автоматического …
  • CLUBBEST – reasoning on the visualization of music.CLUBBEST – reasoning on the visualization of music.
    Visits: 81 ВІД ЗАХОДУ ДО СВІТАНКУ АБО ПОБАЧИТИ МУЗИКУ.     Час доби, коли почуття людини загострюються, – це час від заходу до світанку. В цей час людина відкрита для …
  • WiFi ESP8266 ESP-202 (ESP-12F)WiFi ESP8266 ESP-202 (ESP-12F)
    Visits: 7622 Первое знакомство, сначала надо его купить… http://voron.ua/catalog/024404 Схема для подключения и тестирования По схеме ставим две кнопки, сброс и кнопку BT2, для перевода в режим обновления прошивки. Если надо сделать …
  • Регулятор влажностиРегулятор влажности
    Visits: 1351 Регулятор ILLISSI-CH-1000 предназначен для контроля и регулировки относительной влажности в диапазоне от 0 до 100%. Регулятор позволяет работать как в режиме осушения, так и увлажнения. Для измерения возможно …
  • Дисплей KD035C-3A подключение и управлениеДисплей KD035C-3A подключение и управление
    Visits: 677 Дисплей KD035C-3A производиться компанией SHENZHEN STARTEK ELECTRONIC TECHNOLOGY CO.,LTD Характеристики Параметр Спецификация Единицы измерения Размер дисплея 70.08(H)*52.56(V) (3.5inch) mm Тип дисплея TFT active matrix Цветовая гамма 65K/262K colors Разрешение …


Формат данных XC16

Visits: 812


Для дальнейшей работы, понадобиться понятие переменных. Кратко чтобы не напрягать – название и размер данных:

Объявление Бит  Диапазон чисел Примечание 
Целочисленные типы
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.


Исследуем формирования задержки

Visits: 2854


Сама задержка или ожидание чего-то не самая популярная вещь в программировании, ведь она просто тратит машинное время в пустую. Но как ни крути, время от времени её необходимо использовать. Как видим одним из удобных вариантов формирования задержки нам предоставляет стандартная библиотека 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 секунды

	}
//

Всем желающим можно попробовать этот вариант. Хотя как я уже говорил, он не эффективен.



Это может быть интересно


  • Altium Designer my Libraries, Project templates, System settings by Catcatcat V23.04Altium Designer my Libraries, Project templates, System settings by Catcatcat V23.04
    Visits: 157 Смотри как установить и подключить библиотеку тут.   V.  – 23_04 – Component Database Update. – configuration file name – DXPPreferences1.DXPPrf. – Added two projects for audio amplifier …
  • Development of temperature control and management systemsDevelopment of temperature control and management systems
    Visits: 39 Catcatcat Electronics Пошта для контакту e-mail: catcatcat.electronics@gmail.com Метки: Altium Designer, MPLAB® Code Configurator, Измерение температуры
  • Development Boards PIC18F47Q84Development Boards PIC18F47Q84
    Visits: 525 Microchip тішить новими мікроконтролерами. Особливістю цього MCU – це багата інтелектуальна периферія, що дозволяє вирішувати такі завдання на 8 бітних MCU, які неможливо реалізувати на деяких навіть 32 …
  • Altium Designer first projectAltium Designer first project
    Visits: 212 Эта статья подразумевает, что у вас установлен и настроен Altium Designer как описано в статье  Altium Designer my setup system and project structure.  Обратите внимание! Библиотека постоянно обновляется, …
  • Цифровой тахометр для автомобиля CH-С3300Цифровой тахометр для автомобиля CH-С3300
    Visits: 1870  Тахометр Ch-С3300 предназначен для индикации и контроля оборотов, времени работы и максимальных оборотов развиваемых двигателем во время поездки. Датчиком может использоваться как обычный контактный прерыватель или выход датчика …
  • Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)
    Visits: 3162 Солнечные коллекторы для отопления в Европе используют в более 50% от общего количества установленных гелиосистем. Однако следует понимать, что гелиосистемы предназначены лишь для поддержки отопления и экономии затрат на основную …
  • Мультизоновый индикатор-терморегулятор ch-c3010Мультизоновый индикатор-терморегулятор ch-c3010
    Visits: 1139 Часто возникает необходимость получить информацию по температуре с множества точек контроля. Вам необходимо знать температуру в комнате, в коридоре,  температуру на улице, а в погребе (или на балконе) …
  • ch-светомузыка и AK4113ch-светомузыка и AK4113
    Visits: 1250 Пришло время вернуться к светомузыке. На сегодня использование аналогового входа стало непрактичным, на сегодня необходимо использовать S/PDIF и Toslink. С этим надо было как то разобрать, что это …
  • JDY-62A Audio bluetooth moduleJDY-62A Audio bluetooth module
    Visits: 1614 Простой модуль для простого аудио блютуса. Встроенные подсказки на английском языке. Модуль включён, режим муте – после подачи питания. Контроль разряда батареи предупреждение что батарея разряжена и необходима …
  • Customs codes for exportCustoms codes for export
    Visits: 59   Митні коди (HS Code) для надсилання посилок за кордон. Для відправки товару за кордон на сьогодні необхідно зазначати митні коди. Часто визначення коду займає багато часу. Для …


Первая программа на PIC24

Visits: 2023


При написании первой программы всегда начинает вопрос с чего начать. Пропустим весь процесс установки среды программирования так ка считаем, что это пройденный этап. Программировать будем учиться на языке С 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 секунды

	}

 Первая программа – мигание светодиода, для встроенных систем, это как “Привет Мир”. Светодиод мигает – мир радуется!


Демонстрационное видео

 


Проект для загрузки

Значок

Первая программа на PIC24 41.56 KB 1084 downloads

Первая программа на PIC24 ...


Это может быть интересно

  • Customs codes for exportCustoms codes for export
    Visits: 59   Митні коди (HS Code) для надсилання посилок за кордон. Для відправки товару за кордон на сьогодні необхідно зазначати митні коди. Часто визначення коду займає багато часу. Для …
  • Acquaintance with audio-bluetooth modules F-6888 (BK3254).Acquaintance with audio-bluetooth modules F-6888 (BK3254).
    Visits: 2098 Для проектов появилось необходимость познакомиться с недорогими модулями китайского производства, которые можно приобрести у нас в Украине и у китацев, на алиэкспрессе. Так как меня интересует не просто, …
  • WiFi ESP8266 – AT команды связанные с функцией TCP/IP (v.1.6.1)WiFi ESP8266 – AT команды связанные с функцией TCP/IP (v.1.6.1)
    Visits: 4989 AT команды связанные с функцией TCP/IP В этом разделе описаны команды которые позволяют устанавливать соединения между серверами и клиентами в сети. Приведено описание команд и примеры их выполнения. …
  • Система AT команд версии V2.0 для ESP8266 и ESP32Система AT команд версии V2.0 для ESP8266 и ESP32
    Visits: 9315 Появление нового модуля на базе ESP32 заставило систематизировать систему AT команд, а так же систему обновления и для модулей на базе ESP8266. Начиная с версии v2.0 в ESP8266 …
  • Интерактивные LedИнтерактивные Led
    Visits: 440 Тема проекта   продолжение следует…. Это может быть интересно Метки: LED
  • DS18B20 – удаленный контроль температурыDS18B20 – удаленный контроль температуры
    Visits: 3007 Контроль температуры с использованием датчиков температуры DS18B20 и платы ILLISSI-4B-09-primum Проект позволяет подключать к плате ILLISSI-4B-09-primum до 16 датчиков температуры DS18B20, удаленных более 300 метров,  и выводить информацию …
  • Проект с использованием MCC часть 01Проект с использованием MCC часть 01
    Visits: 2467 Для изучения MCC я выбрал простой контроллер PIC16F1509. Выбор его был обусловлен богатой новой периферией которую можно изучить. Для начала была собрана схема на макетной плате Внешний вид …
  • Защита датчиков температуры DS18B20 от статического электричестваЗащита датчиков температуры DS18B20 от статического электричества
    Visits: 1791 Статья перепечатана с сайта http://svetomuzyka.narod.ru При удалении датчика на большие расстояния возникает опасность наведения импульсов высокого напряжения на кабель, который соединяет датчик с контролером. Если не принимать меры защиты, …
  • LED модуль P10C4V12LED модуль P10C4V12
    Visits: 3058 LED панели на обычных регистрах типа 74HC595. Они выпускаются как монохромные так двух и полно цветные, особенность, что они предназначены для текстовой информации и имеют один уровень яркости. Общую яркость …
  • VU Meter Tower ART – part 2VU Meter Tower ART – part 2
    Visits: 948 Проект – VU Meter Tower ART получил продолжение в своем развитии. Теперь можно заказать набор деталей из акрила для самостоятельной сборки. В проект корпуса внесено целый ряд доработок, …


Как запитать и подключить к программатору PIC24

Visits: 1666


Для обучения будем использовать PIC24FJ64GA002. Его особенность – низкая цена, 28 выводов, диапазон питания 2,0-3,6 вольта.  Для питания будем использовать источник 3,3 вольта. А так как ядро контроллера работает при напряжении 2,5 вольта, мы должны оставить включенным внутренний регулятор напряжения, для этого к выводу Vcap/Vddcore подключить керамический конденсатор 10,0 мкФ. А вывод DISVREG – подключить к Vss (к общему).

Для подключения к программатору у контроллера есть три альтернативных варианта подключения.

Первый вариант подключения.

pic24-02

Второй вариант подключения.

pic24-03

Третий вариант и первая схема для обучения по работе с PIC24.

pic24-04

 Для индикации мы подключим к портам RA0, RA1, RB0, RB1 светодиоды для контроля работы программы. Для питания можно использовать любой 3,3 вольтовый стабилизатор. Для макетирования была применена плата ILLISSI-M4B01

Макетная плата для 28 ногих PIC контроллеров

Макетная плата в сборе для тестирования и обучения.

 pic24-05 pic24-06

 Полная схема, со стабилизатором.

pic24-07

 CON1 предназначен для подключения к программатору, CON2 для подачи питания на микроконтроллер.

Если схема собрана правильно, надо переходить к написанию первой программы.


Изучаем PIC24, компилятор XC16

Visits: 4682


С чего начать и с чего приступить к изучению 16 разрядных PIC-микроконтроллеров.

Первое, это надо разобраться как установить среду программирования и сам компилятор Си, в нашем варианте это MPLAB IDE v8.89 и MPLAB XC16 v1.11.

Второе, приобрести PIC-контроллер, я использовал PIC24FJ64GA002.

Третье, макетную плату и всякую россыпуху и не только.


pic24-05

Чего не стоит искать здесь.

Здесь не стоит искать изучение языка Си, здесь только практические советы, по необходимости, все можно конечно объяснить и помочь понять, для этого задавайте вопросы на форуме http://musiccolor.d-lan.dp.ua/.


Статьи:

  1. Как подключить питание и подключение для внутрисхемного программирования PIC24.
  2. Настройка тактового генератора.
  3. Первая программа на PIC24.
  4. Исследуем формирования задержки.
  5. Объявление переменных – Формат данных.
  6. Использование прерываний для управления процессами.
  7. Output Compare – формирование импульсов.
  8. I2C™ – INTER-INTEGRATED CIRCUIT и PIC24.
  9. 10-бит, высокоскоростной, аналого-цифровой преобразователь, часть 1.
  10. 10-бит, высокоскоростной, аналого-цифровой преобразователь, часть 2.
  11. Измерение частоты.
  12. PIC24 и работа с SD/MMC картами памяти.
  13. Часы реального времени DS1340.
  14. Энкодер и его применение.
  15. Контроллер DMA (Direct Memory Access).
  16. Визуализация данных.
  17. Многокнопочная клавиатура.
  18. Внешний АЦП ADS1230 и PIC24FJ64GA004.
  19. … продолжение следует …

 


Обучение

Visits: 11024

Статьи по обучению программированию и схемотехники PIC-микроконтроллеров.


MPLAB® Code Configurator