Проект с использованием MCC часть 13

Visits: 1020


Так как используя MCC мы можем его использовать со своими библиотеками, поэтому настало время и свое создать.

Для начала откроем наш заголовочный файл в нем очень много букв:

По этому. да простит нас майкрочип, почистим его, изменим и оставим только:

/* 
 * File: I2C.h  
 * Author: Catcatcat eletrinics
 * Comments: библиотека для шина I2C
 * Revision history: V0.1
 */

// This is a guard condition so that contents of this file are not included
// more than once.  
#ifndef XC_I2C_H
#define	XC_I2C_H

#include <xc.h> // include processor files - each processor file is guarded.



#endif	/* XC_I2C_H */

сразу скажем для чего нужна конструкция

#ifndef XC_I2C_H
#define	XC_I2C_H

#endif	/* XC_I2C_H */

Она необходима, чтобы компилятор при использовании нашей библиотеки добавил функции только один раз в проект.

Файл I2C.c совершенно чисты, в него добавим заголовок

/* 
 * File: I2C.c  
 * Author: Catcatcat eletrinics
 * Comments: библиотека для шина I2C
 * Revision history: V0.1
 */

С начала необходимо активировать модуль MSSP в режиме I2C (это актуально для 8 битной серии). Для этого необходимо настроить регистры (это все будет актуально для нашего микроконтроллера и для любого 8 битного микроконтроллера)

// настройка модуля МSSP интерфейс I2C в режиме мастер
//void I2C_Open (void)
void I2C_Open (unsigned int FCLOCK) // тактовая задается 100/400/1000 кГц
{
    TRISB |=  0b00101000;           // настройка портов для PIC16F1509
    SSPCON1 = 0b00101000;           // включить модуль МSSP; включить режим ведущего
    SSPSTAT = 0b00000000;           // 100 rUw - 0b10000000; 400 rUw - 0b00000000;
    SSPADD=((_XTAL_FREQ/4)/1000/FCLOCK)-1;           //
    if (SSPADD<=2) SSPADD=3;        // значение в регистре не может быть меньше 2
    _delay (3500);                  // необходимое время для смены частоты
    PEN=1;                          // формировать бит стоп
    while (PEN);                    // ожидание окончания формирования бита стоп
}//
//------------------------------------------------------------------------------

Что первое необходимо знать в работе I2C  это, то что при работе на шине существует два логических состояния. Это состояние СТАРТ скорого начинаются все операции транзакций по шине, состояние СТОП, при формировании которого все передачи прекращаются. Есть дополнительное состояние РЕСТАРТ предназначенное для формирования транзакций, когда необходимо обратиться к конкретному регистру к устройству на шине I2C для чтения его.

Создадим эти функции с основой на XC8. Более того будем создавать для устройств которых адрес 7 бит. Для начала необходимо  определить состояние активности модуля, для работы с модулем нам необходимо знать, что модуль не занят работой с шиной.

void i2c_idle (void)// ожидание окончания активности
{
    while((SSP1CON2 & 0x1F) || R_nW);
}//

Добавим описание функции в заголовок, а саму функцию в рабочий файл

Состояние старт всегда сопровождается с формирование адреса и указанием бита запись или чтение.

char i2c_start (char adres, char R_W)// формирования начала START для записи
{// загрузка адреса устройства с формирование битов управления
	i2c_idle(); 
	SEN=1;
	i2c_idle();
	if(R_W==0) adres &= 0b11111110;	// R_W
              else adres |= 0b00000001;	//
	SSPBUF=adres;
	i2c_idle();
	if (ACKSTAT==0) return 0; 	// адрес принят
	else
	{ PEN=1; while (PEN); return 1;} // формирование стоп, ошибка
}//

При варианте обращения к чтению конкретного регистра в устройстве на шине, понадобиться операция рестарта, для этого создадим функцию рестарт:

//------------------------------------------------------------------------------
unsigned char i2c_restart (unsigned char adres, unsigned char R_W) //формирования повтоного начала для записи
{// загрузка адреса устройства с формирование битов управления
	i2c_idle();                     // ожидание окончания активности
	RSEN=1;                         // сформировать состояние РЭ-старт
	i2c_idle();                     // ожидание окончания активности
	if(R_W==0) adres &= 0b11111110; // R_W
          else adres |= 0b00000001; //
	SSPBUF=adres;                   //
	i2c_idle();                     // ожидание окончания активности
	if (ACKSTAT==0) return 0;       // адрес принят
	else                            //  
	{ 
        PEN=1;                      // формирование стоп,  
        while (PEN);                // 
        return 1;                   // ошибка
    }
}//
//------------------------------------------------------------------------------

Далее добавим функцию записи байта:

//------------------------------------------------------------------------------
unsigned char i2c_write (unsigned char data)	// формирования записи байта в устройство
{
    i2c_idle();                 // ожидание окончания активности
    SSPBUF=data;                //
//    SSPIF=0;
    i2c_idle();                 // ожидание окончания активности
	if (ACKSTAT==0) return 0;   // адрес принят
	else                        //  
	{                           //
        PEN=1;                  // формирование стоп,  
        while (PEN);            // 
        return 1;               // ошибка
    }
}//
//------------------------------------------------------------------------------

Функцию чтения байта, которая предусматривает, что будет дальнейшее чтение:

//------------------------------------------------------------------------------
unsigned char i2c_read_ack (void)	// формирования чтения байта из устройства с подтверждением приема
{
	i2c_idle();                 // ожидание окончания активности
	RCEN=1;                     // начать прием данных
	i2c_idle();                 // ожидание окончания активности
	ACKDT=0;                    // установить бит подтверждения приема
	ACKEN=1;                    // начать формировать бит
	return  SSPBUF;             // чтение буфера
}//
//------------------------------------------------------------------------------

Функцию чтения последнего байта и указания внешнему устройству, что дальнейшее чтение прекращается:

//------------------------------------------------------------------------------
unsigned char i2c_read_noack (void)	// формирования чтения байта из устройства с не_подтверждением приема
{
	i2c_idle();                 // ожидание окончания активности
	RCEN=1;                     // начать прием данных
	i2c_idle();                 // ожидание окончания активности
	ACKDT=1;                    // установить бит не-подтверждения приема
	ACKEN=1;                    // начать формировать бит
	return  SSPBUF;             // чтение буфера
}//
//------------------------------------------------------------------------------

Комбинируя эти функции мы можем создать различные варианты чтения и записи информации с устройств расположенных на шине I2C.

На этом этапе подразумевается, что все, что мы говорили мы вписали в наши файлы библиотеки, как это выглядит можно саму библиотеку скачать здесь:

Значок

Библиотека для шины I2C - компилятор XC8 V1.41 2.35 KB 33 downloads

Microchip MPLAB XC8 C Compiler V1.41 Библиотека для шины I2C ...
Login Required Message:


Наша цель это оживить ОЛЭД индикатор, для этого нам предстоит еще пару библиотек. Первая это библиотека, это инициализация и включение индикатор, а также для вывода элементарных примитивов, и символов. Вторая это для вывода изображений.

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

Обратите внимание, что при использовании последовательных шин в драйвер можно только писать данные, но для работы шины I2C все таки соединить два входа индикатора для возможности формирования индикатор ответа.

Необходимо организовать управление сбросом индикатор и управление высоковольтным преобразователем, Если кому интересно, то ОЛЭД матрица для своей работы требует для работы более высокого напряжения от 9 до 12 вольт, для этого и необходим повышающий DC/DC конвертер (он собран на дополнительной плате индикатора). Начать процедуру инициализации драйвера только после подачи высокого напряжения на матрицу.


Значок

Символьная библиотека для драйвера SSD1309 - компилятор XC8 V1.41 4.00 KB 19 downloads

Символьная библиотека для драйвера SSD1309 - компилятор...
Login Required Message:


 Добавим библиотеку в наш проект, для этого скопируем файлы библиотеки SSD1309_I2C в проект. Папка нашего проекта, будут выглядеть так:

Подключим библиотеку к нашему проекту, сначала добавим исполнительный файл, через подключение папки:

Откроется диалоговое окно, нажимает кнопку добавить папку:

Выберем папку библиотеки:

Добавим её проект, в проекте (Select, Add), в проекте появиться папка:

Проделаем, тоже самое для подключения заголовка библиотеки, для этого установим курсор на папке Header Files

Повторим всю процедуру с добавлением папки аналогичную, как это делали для рабочего файла:

Но папка заголовка добавляется пустой, для добавления файла дополнительно проедаем процедуру добавления файла:

Выберем файл заголовка:

Нажмем клавишу выбрать, в проекте появиться файл:

Следующий этап настроить, т.е сконфигурировать наши библиотеки под нашу схему.

Настройка I2C.

В библиотеку надо передать параметры, а тактовой частоте, это необходимо для формирования скорости шины I2C. Значение рабочей частоты у на прописано файле mcc.h. Для этого добавим в заголовочный файл, строку

#include "../mcc_generated_files/mcc.h" // для получение данных о тактовой частоту

Необходимо определить к каким портам подключен модуль MSSP  в режиме I2C, в нашем микроконтроллере, для этого порты к которым подключен модуль I2C должны быть настроены на вход, и работать как цифровые порты ввода вывода (отключим аналоговые входы). В файле I2C.c в функции инициализации добавим строки:

//------------------------------------------------------------------------------
// настройка модуля МSSP интерфейс I2C в режиме мастер
void I2C1_Open (unsigned int FCLOCK) // тактовая задается 100/400/1000 кГц
{
//-----------------------------------------------------------------------    
    ANSELBbits.ANSB4=0;             // RB4 настроить как цифровой вход 
    
    TRISB |=  0b01010000;           // настройка портов для PIC16F1509
/*               | +----------------- RB4
 *               +------------------- RB6
 */  
//----------------------------------------------------------------------- 
//    1000 = I2C Master mode, clock = FOSC/(4 * (SSPxADD+1))
    SSPCON1 = 0b00101000;           // включить модуль МSSP; включить режим ведущего
    SSPSTAT = 0b00000000;           // 100 rUw - 0b10000000; 400 rUw - 0b00000000;
    
    SSPADD=((_XTAL_FREQ/4)/1000/FCLOCK)-1;           //

Библиотека _SSD1309_I2C заточена, под шину I2C и предназначена, только для вывода символов на дисплей. Почему только символов?

Проблема последовательных шин в простых, монохромных  графических дисплеях, где запись идет по 8 бит за один раз.

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

Выход из этого положения может быть сделан, формирование в памяти контроллера буфера, в который будут одновременно записываться данные которые передаются в дисплей и в нем будет храниться копия изображения на дисплеи. И при необходимости можно будет из него выполнить чтение для получения информации о изображении на дисплеи. Но в нашем микроконтроллере памяти меньше всего 512 байт, а для дисплея 128*64, необходимо 128*8*=910 байт. Т.е. опять неудача.

Конечно можно поставить внешнюю память, на эту же шину, но это не входит в тему этого урока.

Поэтому у нас остается только одна возможность вывода только символьной информации, кодировка W1251 (надо не забывать создавать проекты именно в этой кодировке), в этой библиотеки будут доступны символы трех языков English, Український и Русский.


В основном файле нашего проекта добавим строки подключения наших библиотек:

#include "I2C_XC8/I2C.h"                // библиотека для работы с интерфейсом I2C для компилятора XC8
#include "SSD1309_I2C/SSD1309_I2C.h"    // библиотека для работы графикой для дисплея REN012864

В коде программы добавим строки инициализации модуля MSSP и драйвера ОЛЭД-дисплея.

    I2C1_Open (800);    // тактовая задается 100/400/1000 кГц
    OLEDint ();         // инициализация драйвера дисплея

Для проверки и тестирования, всё ли у нас работает, добавим классические строки:

    String ("Привет мир!!!", 1, 2, -1, 1, 1);
    String ("Привіт світ!!!", 1, 2, -1, 3, 1);
    String ("Hello World!!!", 1, 2, -1, 5, 1);

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

А в итоге мы должны получить на дисплее вот такое:


Проект

Значок

Проект с использованием MCC часть 13 - проект 678.26 KB 20 downloads

Проект к части 13. Наша цель это оживить ОЛЭД индикатор,...
Login Required Message:

Значок

Описание драйвера SSD1309Z 1.72 MB 102 downloads

Описание драйвера SSD1309Z ...


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


  • Ссылки на интересные источникиСсылки на интересные источники
    Visits: 816 Сбор 3D моделей от André L’Hérault конденсаторы, резисторы, индуктивности dropbox IPC-SM-782 Surface Mount Design and Land Pattern Standard Видео уроки по Altium designer Alexey Sabunin https://www.youtube.com/channel/UCG7N5CqXpyK8nQjr1EmMgng Сергей Булавинов https://www.youtube.com/channel/UCISAMXRnN_Qw9UTjUwZI1Jw Robert Feranec https://www.youtube.com/user/matarofe …
  • Индикатор температурыИндикатор температуры
    Visits: 2651 Проект для начинающих, на демо плате BB-2T3D-01. Простой индикатор температуры. Проект никак не задумывался, просто на витрину магазин Ворон нужна была демонстрационная модель на макетной плате, чего нибудь работающего. Остановились на индикаторе …
  • MPLAB X IDE – управление проектамиMPLAB X IDE – управление проектами
    Visits: 909 Среда  MPLAB X IDE позволяет оперативно работать с несколькими проектами, например, если у вас в работе несколько проектов: Для того чтобы переключиться достаточно выбрать другой проект: Для выбора …
  • Часы-кухонный таймерЧасы-кухонный таймер
    Visits: 3925 Каждая кухня должна иметь кухонный таймер, который позволяет напоминать хозяйке когда проходить определенный промежуток времени. Например, печем пирог, варим яйца… , чтобы не смотреть постоянно на часы, установим таймер и …
  • Цифровой спидометр для автомобиляЦифровой спидометр для автомобиля
    Visits: 10142  Универсальность печатной платы ch-c0030pcb позволяет создавать на её основе разнообразные устройства. Одним из таких устройств является электронный спидометр для автомобиля, в котором можно задать два компаратора скорости, например,  для …
  • LED модуль P10C4V12LED модуль P10C4V12
    Visits: 3069 LED панели на обычных регистрах типа 74HC595. Они выпускаются как монохромные так двух и полно цветные, особенность, что они предназначены для текстовой информации и имеют один уровень яркости. Общую яркость …
  • MAX7219/21 и 8х8 LED дисплеиMAX7219/21 и 8х8 LED дисплеи
    Visits: 916 MAX7219, MAX7221 предназначены для вывода информации на 8 разрядов семисегментного индикатора, но на нем легко организовать вывод на светодиодные индикаторы 8х8. продолжение следует…. Это может быть интересно
  • Самый простой диммер для светодиодного освещенияСамый простой диммер для светодиодного освещения
    Visits: 2973 Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы …
  • OLED RET012864E/REX012864JOLED RET012864E/REX012864J
    Visits: 1445 RET012864E/REX012864J ОЛЕД индикатор производитель Raystar-Optronics приобретался в http://www.microchip.ua/ к сожалению никакой информации на сайте поставщика нет. Поэтому решил работу с этой версией индикатора на драйвере SSD1305 предоставить на своем сайте. Так как …
  • CCP – модуль в режиме Compare на примере PIC18CCP – модуль в режиме Compare на примере PIC18
    Visits: 3068 CCP – модуль можно использовать в трех режимах: Capture – позволяет захватывать входной сигнал и определять его параметры (длительность или частоту). Дополнительно управлять внутренними модулями. Compare –  позволяет …



Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

Продолжайте читать

НазадДалее