реклама на сайте
подробности

 
 
> Универсальный LCD идикатор(GPIO,I2C), Алгоритм
pokk
сообщение Apr 2 2018, 09:50
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Добрый день, в одном из проектов, подключил LCD индикатор через расширитель порта по I2C, но код получился, как-то не очень надежный, в общем сейчас появилось по больше времени, и решил ещё раз все обдумать и сделать нормальный модуль LCD, который можно в любой проект пихать. Но пока только какая то каша в голове.
В общем вот примерно как-то так было, во время всех while, переключался на другие процессы через ОС.
Теперь меня интересует, как бы все это сделать без ОС,( для самообразования!!).
ну и желательно, прозрачный код, но это уже не обязательно.
CODE

//================================================================================
void DisplayUpdate(unsigned char *buf){
unsigned char LcdCountChar;
unsigned char GetCharTemp;
for(LcdCountChar=0;LcdCountChar<40;LcdCountChar++){
if(LcdCountChar==0){
WriteLCDcommand(ADDRESS_FIRST_ROW);
}
if(LcdCountChar==20){
WriteLCDcommand(ADDRESS_SECOND_ROW);
}
GetCharTemp=UTF_conversion(buf[LcdCountChar]);
WriteLCDdata(GetCharTemp);
}
}
//================================================================================
void WriteLCDdata(unsigned char data){
SetRS;
WriteLCD_Nibble(data);
data=data<<4;
WriteLCD_Nibble(data);
}
//================================================================================
void WriteLCD_Nibble(unsigned char data){
SetE;
SetW;
//------------------------
GlobalData_Lcd=data;
Pcf8575_Send_data(GlobalData_Lcd,GlobalData_Led_key_lcd);
//PortLCD=(PortLCD&0xFF0F)|(data&0xF0);
while(Pcf8575_Send_ok==1){} //Передача завершилась
//------------------------
ClrE;
}

Как вот это:
Код
while(Pcf8575_Send_ok==1){} //Передача завершилась

вынести в самый верх что бы можно было по опрашивать в main?

Была идея все данные закинуть в стек, а потом, их выдавать.
где все функции будут запускаться в том порядке как их и устанавливали, но тогда получается на каждый чих( SetE;)
внутри WriteLCD_Nibble надо делать тоже функцию, и все это в большую очередь выстроиться, ну и тут так же стала проблема в том что разные параметры передается,и помимо установки в стек обработчиков, надо ещё и параметры устанавливать.
Код
void Lcd_init(void){
    Lcd_pin_init();
    LCD_ON();
    //----------------
    RTOS_SetTask(lcd_set_8bit_mode(0),0,100);      
    RTOS_SetTask(WriteLCDcommand,0,100);         
    RTOS_SetTask(WriteLCDcommand(0x30),0,0);     
    RTOS_SetTask(WriteLCDcommand(0x30),0,0);      
    RTOS_SetTask(WriteLCDcommand(0x3C),0,0);      
    RTOS_SetTask(lcd_cursor_mode(LCD_ENABLE,CURSOR_ENABLE,BLINK),0,0);
    RTOS_SetTask(WriteLCDcommand(0x1),0,0);  
    
    RTOS_SetTask(Start_UpadeDispaly,0,0);  
    return
}


Думал сделать на КА, жестко прописать какие функции за кем вызываються, но тут
1) теряется читабельность(хотя с этим я уже мерился, так 1 раз все это прописать и больше туда возвращаться не планирую).
2) когда следуют одинаковые функции друг за другом типа 2 раза вызов функции WriteLCDcommand с разным параметром.
как тут быть даже не знаю, делал ещё пред настройку(как бы буфер на 2 функции вперед), установку функции Next, которая будет выполнятся после установленной, но тут получилось все запутано совсем.

Подскажите в какую сторону двигаться?.








Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
k155la3
сообщение Apr 2 2018, 10:55
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Если хотите уйти от "расширителей", крайне неэффективных для I2C.
Предлагается к рассмотрению.
1. На каком-либо процессоре реализовать свой "расширитель", а более правильно - универсальный контроллер LCD
с различными интерфейсами - I2C, SPI, serial итп.
2. Входной интерфейс девайса п.1 - SPI (и/или USART). Первый - простой и надежный. Второй даст возможность
делать "выносной" дисплей, например в виде панели оператора, если использовать RS485.
3. Протокол - делаем какой удобно и надежно. Если это будет MODBUS - получим панель оператора.

Такой себе "OPC-сервер" sm.gif

4. Алгоритм выдачи инф. на дисплей, для упрощения можно использовать следующий.
4.1. Выдача инф. через SPI интерфейс выполняется задачей с низким приоритетом, по таймеру + флаги обновления (нет смысла выдавать инф. на дисплей, если она уже там отображается). Таймер - 0.2 .... 0.5 с. Выдача идет "пакетом", без квитирования и задержек на максимальной скорости, соотв-но зацикл невозможнн.
4.2. Выдача инф. по 4.1. производится из видео-RAM (образ экрана LCD в требуемом формате).
4.3. Изменение буфера RAM выполняется асинхронно из любой задачи, из которой требуется вывод на LCD.

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


Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 21:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016