Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Чт май 24, 2018 14:47:23

Я для батарейного делал от ноги через кондер на два последовательных диода и таким образом генерировал отрицательное напряжение чтоб от 2-х вольт он работал - все было прекрасно и шимом управлялось тож нормально

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Чт май 24, 2018 14:55:14

clawham писал(а):...хоть там и потребление должно быть мизерное, но через транзистор спокойнее чтоль...
По pdf на atmega88v - выход по порту 40mA max. При R4=680 - ток 7,4mA (max), что более чем с 5-ти кратным запасом. К тому же, возможно номинал R4 придётся увеличивать.
Но на диоде с V0 на VDD не экономьте.

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Чт май 24, 2018 15:25:11

я чесн говоря ни разу не видел диода между v0 и vdd на схемах. или он нужен именно в моем случае?

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Чт май 24, 2018 15:28:31

Именно в вашем.
Есть вероятность, что при выключении, напряжение на VDD спадёт быстрее, чем на V0 (а по документации, напряжение на V0 не может превышать VDD).

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Чт май 24, 2018 15:30:28

понял. благодарю за ответ. значит поставим диод

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Пн окт 08, 2018 11:50:05

Друзья, помогите пожалуйста разрулить странный глюк с кодом. Дисплей 1602 HD44780, камень - Atmega8. Странность в том, что он однозначно запускается и работает, только при определенной и единственной конфигурации портов/пинов.
"Дисплейный" раздел кода:
Спойлер
Код:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"


void strobe_lcd(void){
   LCD_E_PORT|=LCD_E;
   _delay_us(20);
   LCD_E_PORT&=~LCD_E;
   _delay_us(20);
   //LCD_E_PORT|=LCD_E;
}

void send_byte(char byte){
   byte&0x80?(LCD_DT7_PORT |= LCD_DT7):(LCD_DT7_PORT &= ~LCD_DT7);
   byte&0x40?(LCD_DT6_PORT |= LCD_DT6):(LCD_DT6_PORT &= ~LCD_DT6);
   byte&0x20?(LCD_DT5_PORT |= LCD_DT5):(LCD_DT5_PORT &= ~LCD_DT5);
   byte&0x10?(LCD_DT4_PORT |= LCD_DT4):(LCD_DT4_PORT &= ~LCD_DT4);
   strobe_lcd();
}

//Командуем
void lcd_cmd(char a){
   LCD_RS_PORT&=~LCD_RS;
   send_byte(a);
   send_byte(a<<4);
   
}

//Данные
void lcd_data(char a){
   LCD_RS_PORT|=LCD_RS;
   send_byte(a);
   send_byte(a<<4);
}

/*Подметаемся*/
void lcd_clear(void){
   lcd_cmd(0x01);
   _delay_ms(2);
}

/**INSTALL LCD**/
void init_lcd_ports(void){
   LCD_RS_DDR|=LCD_RS;
   LCD_E_DDR|=LCD_E;
   LCD_DT7_DDR|=LCD_DT7;
   LCD_DT6_DDR|=LCD_DT6;
   LCD_DT5_DDR|=LCD_DT5;
   LCD_DT4_DDR|=LCD_DT4;
   LCD_RS_PORT&=~LCD_RS;
   LCD_E_PORT&=~LCD_E;
   LCD_DT7_PORT&=~LCD_DT7;
   LCD_DT6_PORT&=~LCD_DT6;
   LCD_DT5_PORT&=~LCD_DT5;
   LCD_DT4_PORT&=~LCD_DT4;
}
//
void lcd_init(void){
   init_lcd_ports();
   _delay_ms(200);
   LCD_RS_PORT&=~LCD_RS;
   send_byte(0x30);
   _delay_ms(6);
   send_byte(0x30);
   _delay_us(200);
   send_byte(0x30);
   _delay_ms(1);
   send_byte(0x20); //4 бит
   lcd_cmd(0x28); //4 бит
   _delay_ms(1);
   lcd_cmd(0x08);//отображение и курсоры выключены.
   _delay_ms(1);
   lcd_clear();
   lcd_cmd(0x06);//режим увеличения счетчика
   _delay_ms(1);
   lcd_cmd(0x0C);//отображение включено, курсоры выключены.
   _delay_ms(10);
}
Простейший тест в майне.
Код:
int main(void){
   lcd_init();
   _delay_ms(200);
   lcd_data(48);//"0"
   while(1){   }
}

Заголовки "lcd.h":
Этот конфиг работает
Спойлер
Код:
#define LCD_RS_DDR DDRB
#define LCD_RS_PORT PORTB
#define LCD_RS 1<<2
#define LCD_E_DDR DDRB
#define LCD_E_PORT PORTB
#define LCD_E 1<<1
#define LCD_DT7_DDR DDRD
#define LCD_DT7_PORT PORTD
#define LCD_DT7 1<<7
#define LCD_DT6_DDR DDRD
#define LCD_DT6_PORT PORTD
#define LCD_DT6 1<<6
#define LCD_DT5_DDR DDRD
#define LCD_DT5_PORT PORTD
#define LCD_DT5 1<<5
#define LCD_DT4_DDR DDRD
#define LCD_DT4_PORT PORTD
#define LCD_DT4 1<<4
А этот и прочие - нет
Спойлер
Код:
#define LCD_RS_DDR DDRD
#define LCD_RS_PORT PORTD
#define LCD_RS 1<<5
#define LCD_E_DDR DDRD
#define LCD_E_PORT PORTD
#define LCD_E 1<<6
#define LCD_DT7_DDR DDRB
#define LCD_DT7_PORT PORTB
#define LCD_DT7 1<<2
#define LCD_DT6_DDR DDRB
#define LCD_DT6_PORT PORTB
#define LCD_DT6 1<<1
#define LCD_DT5_DDR DDRB
#define LCD_DT5_PORT PORTB
#define LCD_DT5 1<<0
#define LCD_DT4_DDR DDRD
#define LCD_DT4_PORT PORTD
#define LCD_DT4 1<<7

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Пн окт 08, 2018 12:19:26

Функция send_byte явно не соответствует своему названию, посылая только половину байта.

Но это так.. просто некорректное имя функции. А вот чего я не вижу, так это позиционирования. Куда должен выводиться текст?
Последний раз редактировалось WiseLord Пн окт 08, 2018 12:58:52, всего редактировалось 1 раз.

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Пн окт 08, 2018 12:57:33

Не зря советуют все выражения в #define заключать в скобки.
Рассмотрим, например, это:
Код:
#define LCD_RS_DDR DDRB
#define LCD_RS_PORT PORTB
#define LCD_RS 1<<2
LCD_RS_PORT&=~LCD_RS;

Поработаем немного компилятором. Первым делом нужно подставить значения из #define'ов:
Код:
PORTB&=~1<<2;

Теперь вспомним про приоритеты операций. Сначала выполняется инверсия (~), потом - сдвиг (<<), и, наконец, присваивание с побитовым И (&=). Итого, получается так:
Код:
PORTB &= ((~1) << 2);

Посчитаем выражение в правой части: (~1) = 0b11111110, ((~1) << 2) = 0b11111000.
Код:
PORTB &= 0b11111000;

Кажется, это не то, чего хотелось от строчки
Код:
LCD_RS_PORT&=~LCD_RS;


Вывод: выражения в #define нужно заключать в скобки!
Код:
#define LCD_RS (1<<2)

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Пн окт 08, 2018 16:14:26

*Trigger* :beer: Вот спасибо вам сердечное! Мало, что все заработало, так вы еще потрудились и объяснить суть проблемы. :)) Жаль, что только плюсами могу отблагодарить.

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Пн дек 03, 2018 08:44:04

Граждане-товарищи а не кто не встречал готовую библиотеку дабы выводить большие цифры. В две или три строки. Под андурино гуглиться без проблем, а вот под просто под avr-gcc не чего не могу найти.

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Пн дек 03, 2018 10:29:51

hcm писал(а):под просто под avr-gcc не чего не могу найти
когда-то давно делал сам
Вложения
lcd_big.zip
(55.75 KiB) Скачиваний: 305

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Вт июн 04, 2019 20:36:40

Народ, кто рисовал свои символы - как заставить символ отрисовываться на полную высоту в 8 точек? Что бы я ни делал, у меня нижняя строка в матрице символа отображается пустой и размер вместо 5x8 точек оказывается 5x7.
Пишу для Atmega8 в WinAVR (компилятор avr-gcc). Для управления LCD используется библиотека от Peter Fleury (в прикрепленном архиве).
Пример моего кода:
Спойлер
Код:
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include <stdio.h>
#include "lcd.h"

unsigned char lines[8] =
{
0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, // Двойная черта высотой по 2 точки сверху и снизу.
};

int main(void) 

   DDRB = 128;
   DDRC = 255;
   DDRD = 255;

   unsigned char i;

   lcd_init(LCD_DISP_ON); // Дисплей включен, курсор выключен.

   // Загружаем свои символы в CGRAM
   lcd_command(0x40);  // Переходим в CGRAM
   for(i=0; i<8; i++)
   {
      lcd_data(lines[i]);
   }
   lcd_command(0x80); // Возвращаемся в DDRAM
   
   while(1)
   {
      // Переходим на начальную позицию и вызываем записанный символ.
      lcd_gotoxy(0, 0);
      lcd_putc(0);
   }
   return 0;
}


В итоге получается вот так:
Изображение

Как я понимаю, нижняя строка остается зарезервирована под курсор, хотя он отключен. При этом некоторые символы вроде заполнения и строчной "j" отрисовываются на все 8 точек, а значит, проблема не в дисплее. Что я делаю не так?
Вложения
lcdlibrary.zip
(31.8 KiB) Скачиваний: 230

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Вт июн 04, 2019 20:49:30

а вы на реальном ЖКИ смотрите полоски или на виртуальном (например, в протеусе)? у меня в протеусе беда с 8-й линией, а в реальности все пучком

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Вт июн 04, 2019 21:37:00

На реальном. В протеусе еще не так заметно - в нем все символы сжаты до 5x7, включая заполнение, а в железе эта разница в одну строку в глаза бросается.
Дисплей типа такого, только обозначен как "MJ1602C" (документации по нему не нашел, какая-то подделка другой подделки):
Изображение

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Ср июн 05, 2019 07:59:51

Andrew88, попробуйте так.
Код:
// Загружаем свои символы в CGRAM
   lcd_command(0x40);  // Переходим в CGRAM
   for(i=0; i<8; i++)
   {
      lcd_data(lines[i]);
   }

   // Переходим на начальную позицию и вызываем записанный символ.
   lcd_gotoxy(0, 0);
   lcd_putc(0);
   
   while(1)
   {
   }

Есть предположение, что в основном цикле вы постоянно выводите символ в позицию (0,0), а так как курсор отключен, то он и затирает нижнюю строку. А на самом деле символ выводится полностью.

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Ср июн 05, 2019 09:50:32

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

Может, при компиляции что-то шло не так или какой-то аппаратный баг словил, даже не знаю. На забугорном форуме нашлась такая же проблема с игнорированием дисплеем команды "0x0C": https://www.avrfreaks.net/forum/lcd-and-cursor-onoff/, но как всегда: "I will post the results", - и тишина с 2007 года :facepalm:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Ср июн 05, 2019 10:54:23

Что-то, видимо, в библиотеке. Советую разобраться (там вовсе не рокетсайнс) и подправить.

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Ср июн 05, 2019 11:44:29

trengtor писал(а):Что-то, видимо, в библиотеке.
у Peter Fleury в библиотеке есть один баг, но с описанной проблемой он никак не связан. баг в том, что при вычислении адреса ячейки ОЗУ для дисплеев с числом строк больше 2 он использует не битовое ИЛИ, а обычное суммирование. Для двух строк выходит так, что переполнение при сложении не возникает, а для остальных получается так, что возникает перенос битов при суммировании... если заменить + на | - все начинает работать отлично.
это просто к слову

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Ср июн 05, 2019 14:57:28

ARV, я так понимаю, эта строка? (Мне как раз и нужно будет 4-строчным дисплеем рулить)
Код:
    lcd_command((1<<LCD_DDRAM)+addressCounter);

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Ср июн 05, 2019 14:58:34

да, только там этих строк больше - внутри функции lcd_gotoxy
Ответить