Easyelectronics.ru

Электроника для всех
Текущее время: 19 ноя 2018, 02:15

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Работа с HD44780
СообщениеДобавлено: 02 фев 2014, 21:00 
Только пришел

Зарегистрирован: 02 апр 2013, 11:34
Сообщения: 20
Народ, я начинающий в этой области. Не могу заставить работать дисплей на PB2. Демо работает, с аппаратной частью все хорошо. Пытаюсь написать свой простой код работы с дисплеем. Третий день не могу ничего добиться. Прочитал уже многие материалы на эту тему и у DI HALT и в других источниках. Вроде бы всё верно, но экран никак не реагирует.
Прилагаю свой код, он небольшой. Может быть кто мне подскажет где ошибка. Сам уже просто даже не знаю куда копать, безрезультатно перепробовал кучу разных способов.
Нашел симулятор: http://www.geocities.com/dinceraydin/dj ... cdsim.html
прогнал в нем - работает.
Заранее спасибо всем небезразличным.

Дисплей подключен к МК следующим образом:
DB0..DB7 - PB0..PB7
RS - PA0
R/W - PA1
E - PA2

Show Длииииииинные листинги прячем под спойлер. Финский


Последний раз редактировалось -Ze- 02 фев 2014, 21:52, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 02 фев 2014, 21:33 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5458
Откуда: Уругвайская АССР
Цитата:
Код:
lcd_init:   
   cbi   CMD_PORT, RS
   cbi CMD_PORT, RW
   cbi   CMD_PORT, E
   sbi   CMD_DDR, RS
   sbi CMD_DDR, RW
   sbi   CMD_DDR, E         
   call lcd_set_bus_in   
Смысл последней инструкции вы мне пояснить сможете?

_________________
Без гнева и жестокости, сегодня Смерть взмахнёт косой, и ангел тайными дорогами мой милый Кубик унесёт с собой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 02 фев 2014, 21:45 
Только пришел

Зарегистрирован: 02 апр 2013, 11:34
Сообщения: 20
Горнист писал(а):
Цитата:
Код:
lcd_init:   
   cbi   CMD_PORT, RS
   cbi CMD_PORT, RW
   cbi   CMD_PORT, E
   sbi   CMD_DDR, RS
   sbi CMD_DDR, RW
   sbi   CMD_DDR, E         
   call lcd_set_bus_in   
Смысл последней инструкции вы мне пояснить сможете?

Даже себе не смогу. Многократно редактировал код функции, вот и доредактировался, похоже.
Эта инструкция там быть не должна.

Убрал её оттуда и добавил в процедуру lcd_wait, т.к. для проверки признака готовности дисплея нам надо переключиться в "режим чтения" порта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 02 фев 2014, 22:00 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5458
Откуда: Уругвайская АССР
Show Тыц!

_________________
Без гнева и жестокости, сегодня Смерть взмахнёт косой, и ангел тайными дорогами мой милый Кубик унесёт с собой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 03 фев 2014, 01:14 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 21 янв 2014, 23:13
Сообщения: 52
Откуда: Киев
Я как раз недавно тоже разбирался с этим дисплеем, написал небольшой драйвер, содержащий только самый необходимый набор процедур. Возможно, сможете найти что-то полезное для себя.
https://github.com/rmnk/hd44780
4-битная передача данных + 3 управляющих бита.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 03 фев 2014, 07:18 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 3772
Откуда: г. Липецк
В качестве ремарки:
Цитата:
.equ INT_VECTORS_SIZE = 62
.equ SRAM_START = 0x0100

Файл m16def.inc уже включает эти определения:
Цитата:
.equ SRAM_START = 0x0060
.equ INT_VECTORS_SIZE = 42 ; size in words

Зачем переопределены?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 03 фев 2014, 09:59 
Заглядывает иногда

Зарегистрирован: 23 янв 2014, 17:24
Сообщения: 44
В асме не силен, но судя по вашему main - Перед инициализацией вставьте задержку милисекунд на 200 (в даташите на дисплей точное время написано).
Буквально 3 дня назад бился с этой фигней, правдо на Сях. Пока задержку не ввел нифига ничего не выводило. (инициализация криво проходила)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 03 фев 2014, 14:04 
Только пришел

Зарегистрирован: 02 апр 2013, 11:34
Сообщения: 20
anakost, в моей версии inc-файла эти определения отсутствуют. Потому и определил сам.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 03 фев 2014, 16:10 
Только пришел

Зарегистрирован: 02 апр 2013, 11:34
Сообщения: 20
Друзья, всем спасибо за помощь, проблема была действительно в недостаточных задержках.
rmnk, спасибо за библиотеку, обязательно посмотрю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 17 мар 2014, 15:06 
Только пришел

Зарегистрирован: 02 ноя 2013, 13:26
Сообщения: 5
Здравствуйте, подскажите пожалуйста, где ошибка. Пользуюсь Pinboard2, решил запустить дисплей. В комплекте пинбоарды дисплей wh1602b-ygk-ctk. Подключение такое A01 - RS, A02 - E,
GND - R/W, A04..A07 - D4..D7. Провода прозванивал, все рабочие.
В данный момент дисплей после инициализации показывает только верхний ряд квадратов при максимальной контрастности.
Да, главный герой -модуль STM32 из набора Pinboard.
Вот код

Код:
#include "stm32f10x.h"
#include "lcd-hd44780.h"
#define DELAY_T 1000000
#define Delay_strob_E 100

ErrorStatus HSEStartUpStatus;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_ClocksTypeDef RCC_Clocks;

#define Port_E            GPIO_Pin_2
#define Port_RS            GPIO_Pin_1
#define Pins_Data         GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
#define Port_E_1         GPIO_SetBits(GPIOA, Port_E);
#define Port_E_0         GPIO_ResetBits(GPIOA, Port_E);
#define Port_RS_1         GPIO_SetBits(GPIOA, Port_RS);
#define Port_RS_0         GPIO_ResetBits(GPIOA, Port_RS);

void Delay(uint32_t Val)//micro sec.
{   volatile uint32_t nCount;
 
        nCount=(RCC_Clocks.HCLK_Frequency/(1000000*6))*Val;
        for (; nCount!=0; nCount--);
}

void Enter_4bits_LCD(uint16_t Data)
{
GPIO_ResetBits(GPIOA, Pins_Data);
   if (Data!=0)
   {
      Port_E_1
      Delay(Delay_strob_E);   
      GPIO_SetBits(GPIOA, (Data&(uint16_t)0x0F)<<4);
      Delay(Delay_strob_E);   
      Port_E_0   
      Delay(Delay_strob_E);
      Delay(50);
   }
   else {
            Port_E_1
            Delay(Delay_strob_E);   
            Port_E_0   
            Delay(Delay_strob_E);
        }
}


void Enter_Byte_LCD(uint16_t Byte)
{
Enter_4bits_LCD((Byte&(uint16_t)0xF0)>>4);   
Enter_4bits_LCD(Byte&(uint16_t)0x0F);

}
void Show_Char_LCD(unsigned char c)
{
   Port_RS_1;
   Delay(100);
   Enter_Byte_LCD(c);
   }

void InitDisplay(void)
{
/*---port init */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
   
   GPIO_InitStructure.GPIO_Pin = Port_E|Port_RS|Pins_Data;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA, Port_E|Port_RS|Pins_Data);

/*-------------*/
   Delay(200000);
   
   Port_RS_0;
   Enter_4bits_LCD(0x03);
   Delay(40);
   Enter_Byte_LCD(0x28);
   Delay(40);
   Enter_Byte_LCD(0x28);
   Delay(38);
   Enter_Byte_LCD(0x08);
   Delay(38);
   Enter_Byte_LCD(0x06);
   Delay(1540);
   Enter_Byte_LCD(0x01);
   Delay(1000);
   Enter_Byte_LCD(0x0C);
   Enter_Byte_LCD(0x02);

   Show_Char_LCD('S');
   Delay(10000000);
   Port_RS_0
   Enter_Byte_LCD(0x01);
}
void InitAll(void)
{
  RCC_DeInit();
   RCC_HSEConfig(RCC_HSE_ON);
   HSEStartUpStatus=RCC_WaitForHSEStartUp();
   
   if (HSEStartUpStatus == SUCCESS)
   {   RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
   
      /* Включаем буфер предвыборки FLASH */
   FLASH->ACR |= FLASH_ACR_PRFTBE;
   FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
   FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
   }
   RCC_ClockSecuritySystemCmd(ENABLE);
   
   /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);

    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1 = HCLK */
    RCC_PCLK1Config(RCC_HCLK_Div1);

    RCC_GetClocksFreq (&RCC_Clocks);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
   
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB, GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
   return;
}

int main(void)
{
InitAll();
   GPIO_SetBits(GPIOB, GPIO_Pin_5);
InitDisplay();
   GPIO_SetBits(GPIOB, GPIO_Pin_6);
   while(1)   {   }

   }
/*============================================================ */
#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %drn", file, line) */

  /* Infinite loop */
   GPIO_SetBits(GPIOB, GPIO_Pin_7);
  while (1)
  {
  }
}
#endif


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 25 окт 2014, 18:32 
Только пришел

Зарегистрирован: 16 окт 2014, 15:06
Сообщения: 15
Привет.
Может кто подскажет: я подключал дисплей следующим образом:
DB0..DB7 - PС0..PС7 (PORTC); RS - PA0, R/W - PA1, E - PA2.
Дисплей не работал.

Поменял подключение на DB0..DB7 - PB0..PB7 (PORTB); RS, R/W, E - так же.
После этого заработало.

Почему не работало на PORTC?
У меня Pinboard 2, дисплей WH1602b.

Заранее спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 25 окт 2014, 18:52 
Администратор
Аватара пользователя

Зарегистрирован: 16 янв 2010, 06:09
Сообщения: 6251
Откуда: Челябинск
JTAG на порту С и он по умолчанию включен и занимает пол порта.

_________________
Хозяин дома


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 26 окт 2014, 14:16 
Только пришел

Зарегистрирован: 16 окт 2014, 15:06
Сообщения: 15
DI HALT писал(а):
JTAG на порту С и он по умолчанию включен и занимает пол порта.

Спасибо!
Выключается фузом или программно, посредством двойной записи в бит JTD регистра MCUCR


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 15 ноя 2014, 11:44 
Только пришел

Зарегистрирован: 16 окт 2014, 15:06
Сообщения: 15
Ребята, подскажите...
Мучаю экран в 4-битном режиме.
Все пишет, все хорошо.
Но при посылке команды перехода курсора на позицию:
- если переход в нулевую строку (lcdGoTo(0, 5)) - все хорошо, переходит и начинает писать с нужного места;
- если переход в первую строку (lcdGoTo(1, 5)) - экран зависает и не хочет ничего дальше делать; причем нормально работает только после сброса питания.

код lcdGoTo(line, col):
putCommand(( ( (line & 1) * 0x40 ) + (col & 15) ) | 0b10000000);

Если нужно, то файл с либой прикрепил.

P.S.: ведь putCommand работает правильно, все остальное работает без сучка без задоринки


Вложения:
lcdWH1602b.c [5.74 Кб]
Скачиваний: 143
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 15 ноя 2014, 20:35 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
dek_an писал(а):
код lcdGoTo(uint08 line, uint08 col):
putCommand(( ( (line & 1) * 0x40 ) + (col & 15) ) | 0b10000000);
Вызывает подозрение самописный тип uint08, который встречается только в этой функции. Хорошо, если он = unsigned char, а то могут быть траблы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 15 ноя 2014, 20:59 
Только пришел

Зарегистрирован: 16 окт 2014, 15:06
Сообщения: 15
AlexPM писал(а):
dek_an писал(а):
код lcdGoTo(uint08 line, uint08 col):
putCommand(( ( (line & 1) * 0x40 ) + (col & 15) ) | 0b10000000);
Вызывает подозрение самописный тип uint08, который встречается только в этой функции. Хорошо, если он = unsigned char, а то могут быть траблы.

Это тайпдеф для uint8_t, а он есть unsigned char. В любом случае, проблема не в этом :( все преобразуется к одному типу, а дальше в putCommand преобразуется в char.

Число в putCommand приходит правильное, выводил его двоичное представление на экран.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 15 ноя 2014, 21:05 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Сделайте простой тест.
От putCommand(0x80) до putCommand(0x8F) - работает нормально?
От putCommand(0xС0) до putCommand(0xСF) - виснет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 15 ноя 2014, 21:30 
Только пришел

Зарегистрирован: 16 окт 2014, 15:06
Сообщения: 15
AlexPM писал(а):
Сделайте простой тест.
От putCommand(0x80) до putCommand(0x8F) - работает нормально?
От putCommand(0xС0) до putCommand(0xСF) - виснет?

Да, именно так. Я не пробовал, но расписав на листочке получается именно так. То, о чем я писал (про нулевую и первую строку)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 15 ноя 2014, 23:17 
Только пришел

Зарегистрирован: 16 окт 2014, 15:06
Сообщения: 15
Что значит такое поведение?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 16 ноя 2014, 02:29 
Только пришел

Зарегистрирован: 16 окт 2014, 15:06
Сообщения: 15
Для успокоения провел тест.
Сразу после передачи 0xC0 завис.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 16 ноя 2014, 04:28 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Тогда ещё один тест.
Замените waitWhileBusy() на delay_us(100). То есть вместо ожидания по флагу - просто задержка в 100 микросекунд.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 16 ноя 2014, 08:49 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2001
Есть замечательная либа для AVR.
Нельзя ли её портировать - просто переписать функцию вывода байта?
Давно это было, но LСD завелся без проблем.


Вложения:
lcd.c [21.12 Кб]
Скачиваний: 130
lcd.h [10.93 Кб]
Скачиваний: 141
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 16 ноя 2014, 14:12 
Только пришел

Зарегистрирован: 16 окт 2014, 15:06
Сообщения: 15
Pingvin писал(а):
Есть замечательная либа для AVR.
Нельзя ли её портировать - просто переписать функцию вывода байта?
Давно это было, но LСD завелся без проблем.

Спасибо.
Я в итоге так и сделал (заюзал написанную уже либу). Просто хотелось разобраться...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 16 ноя 2014, 14:17 
Только пришел

Зарегистрирован: 16 окт 2014, 15:06
Сообщения: 15
AlexPM писал(а):
Тогда ещё один тест.
Замените waitWhileBusy() на delay_us(100). То есть вместо ожидания по флагу - просто задержка в 100 микросекунд.

Помогло. Спасибо!
Хм... буду разбираться...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с HD44780
СообщениеДобавлено: 16 ноя 2014, 14:54 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4858
Откуда: Усинск, республика Коми
Я не знаю, как в вашем дисплее, но в том, с которым я сталкивался чтение нужно было делать 2 раза подряд, т.к. с первого раза был какой-то мусор, и только когда прочитаешь второй раз приходят нормальные данные... Может быть в этом причина?

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB