Перейти к содержанию

Примеры кода для AVR


Duhas

Рекомендуемые сообщения

9 часов назад, IMXO сказал:

а шо это за подозрительные пятна чернил на экране ЖКИ???

Вот-вот, какие-то основания есть считать сие изделие исправным?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

9 часов назад, IMXO сказал:

шо это за подозрительные пятна чернил на экране ЖКИ

Потёк немного. Не знаю от чего, на столе валяется.

10 минут назад, ARV сказал:

от-вот, какие-то основания есть считать сие изделие исправным?

Исправен. Когда нет инициализации, показывает квадратики.

Ссылка на комментарий
Поделиться на другие сайты

Имхо, я бы кинул его в мусорку и купил новый, с гарантией того, что заработает с первого тыка.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

// Функция передачи команды
void lcd_com(unsigned char com)
{
	PORTC &= ~(1 << RS); // RS = 0 (запись команд)
	PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
	PORTD &= 0xF0; PORTD |= (com >> 4); // старший нибл
	_delay_us(100);
	PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
	_delay_us(100);
	PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
	PORTD &= 0xF0; PORTD |= (com & 0x0F); // младший нибл
	_delay_us(100);
	PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
	_delay_us(100);
}
// Функция передачи данных
void lcd_data(unsigned char data)
{
	PORTC |= (1 << RS);PORTC|=(1 << EN); // RS = 1 (запись данных), EN - 1 (начало записи команды в LCD)
	PORTD &= 0xF0; PORTD |= (data >> 4); // старший нибл
	_delay_us(100);
	PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
	_delay_us(100);
	PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
	PORTD &= 0xF0; PORTD |= (data & 0x0F); // младший нибл
	_delay_us(100);
	PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
	_delay_us(100);
}
//функция инициализации дисплея
void lcd_ini(void)
{
	_delay_ms(15);
	lcd_com(0b00110000);
	_delay_ms(5);
	lcd_com(0b00110000);
	_delay_us(100);
	lcd_com(0b001100000);

	lcd_com(0b00100000);
	
	lcd_com(0b00100000);
	lcd_com(0b11000000);//2строки 5*11
	
	lcd_com(0b00000000);
    lcd_com(0b10000000);
	
	lcd_com(0b00000000);
	lcd_com(0b01110000);//сдвиг вправо
}

@IMXO согласно стандартной инициализации. правильно ли я написал? или я не правильно понимаю команды?

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

нет не правильно.

должно быть как-то так:

Скрытый текст

void lcd_write (unsigned char c)
{ unsigned char temp_port;

  _delay_us(10); 

  temp_port = (PORTD & 0x0F);
  temp_port |= (c & 0xF0);
  PORTD = temp_port;

  PORTC |=  (1 << EN);
  _delay_us(10);
  PORTC &= ~(1 << EN);  

  temp_port = (PORTD & 0x0F);
  temp_port |= ((c & 0x0F)<<4);
  PORTD = temp_port;

  PORTC |=  (1 << EN);
  _delay_us(10);
  PORTC &= ~(1 << EN);    

}

void lcd_clear(void)
{
  PORTC &= ~(1 << RS);
	lcd_write(0x01);
  _delay_ms(3);
}

void lcd_init (void)
{ unsigned char temp_port;

  PORTC &= ~(1 << RS);
  PORTC &= ~(1 << EN);
  PORTC &= ~(1 << RW);
 //**** запись нибла 0b0011 три раза*****
  temp_port = (PORTD & 0x0F);
  temp_port |= 0b00110000;        
  PORTD = temp_port;
 
  _delay_ms(15);

  PORTC |=  (1 << EN);
  _delay_us(10);
  PORTC &= ~(1 << EN); 

  _delay_ms(5);

  PORTC |=  (1 << EN);
  _delay_us(10);
  PORTC &= ~(1 << EN); 

  _delay_us(150);

  PORTC |=  (1 << EN);
  _delay_us(10);
  PORTC &= ~(1 << EN); 

// ****  запись нибла 0b0010 ******
  temp_port = (PORTD & 0x0F);
  temp_port |=  0b00100000;        
  PORTD = temp_port;

  _delay_us(50);

  PORTC |=  (1 << EN);
  _delay_us(10);
  PORTC &= ~(1 << EN); 
  
    lcd_write(0x28); // Set interface length
    _delay_us(150);	
    lcd_write(0x0C); // Display On, Cursor On, Cursor Blink
    _delay_us(150);
    lcd_clear();	// Clear screen
    lcd_write(0x06); // Set entry Mode

}

 

 

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, Дмитрий Вас сказал:

Ведь судя по дш должно быть так: 

это вам так хочется/кажется ,  в ЖКИ отправляется только состояние данных при спадающем фронте на EN,

такшта когда EN  будет возведен в 1-у абсолютно монопинесуально.  соответственно выставляя данные и формируя импульс на EN одназначна происходит запись данных в ЖКИ

Ссылка на комментарий
Поделиться на другие сайты

для сигнала EN достаточно всего 250 наносекунд.

поэтому задержка между подачей EN и снятием EN в 10 мкс, и тем более в 100 мкс - совершенно бессмысленная потеря времени.

когда тактовая частота 1 МГц, я ставлю EN и следующей командой снимаю EN. получается 1 мкс, что явно больше 250 нс. и всё у меня прекрасно работает.

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

29.11.2019 в 03:10, IMXO сказал:

должно быть как-то так:

и в четвертый раз 8-битной командой передается переход в 4-битный режим.

и только потом можно передавать по 2 ниббла в 4-битном режиме.

 

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Starichok сказал:

когда тактовая частота 1 МГц, я ставлю EN и следующей командой снимаю EN. получается 1 мкс, что явно больше 250 нс. и всё у меня прекрасно работает.

а когда тактовая будет 20? как будет работать ?

1 час назад, Starichok сказал:

поэтому задержка между подачей EN и снятием EN в 10 мкс, и тем более в 100 мкс - совершенно бессмысленная потеря времени.

100мкс ставится между командами с запасом , исходя из того что команда обрабатывается 37..43мкс, а команды очистки экрана и возврат коретки 1.52мс , на них задержка 2мс.  КМК пройдет инициализация за 30мс или за 100мс абсолютно пенесуально.

 

Ссылка на комментарий
Поделиться на другие сайты

да, для инициализация такая потеря времени не критична.

но я у тебя вижу задержку  между подачей EN и снятием EN в 10 мкс, что не имеет смысла.

к запасу между командами я претензий не предъявлял.

а когда у меня частота 8 МГц, то я между подачей EN и снятием EN ставлю 1-2 команды, чтобы превысить 250 нс. там все равно нужно делать операции с нибблами, поэтому есть такая возможность поставить полезные команды, а не вставлять команду nop.

 

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

у меня было наоборот.

сначала я сделал упрощенную инициализацию, и в железе она прекрасно работала.

позже я установил Протеус, и там экран (1602) не работал.

мне пришлось сделать инициализацию строго по даташиту, и в Протеусе начало работать.

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

@Darth_Vader нашел ваш код более понятным, но т.к. я передаю через младшие ноги порта д функция передачи свелась до 

void lcd_putbyte(char c, char rs)
{
    char hc=0;
    hc=c>>4;
	if (rs==LCD_COMMAND) LCD_RS_CLR;
	else                 LCD_RS_SET;
	LCD_E_SET;
	_delay_us(50);
	PORTD&=0xF0;//очищаем выходы PD0,1,2,3
    PORTD|=(hc);//передаем старшую тетраду
	LCD_E_CLR;
	_delay_us(50);
	LCD_E_SET;
	PORTD&=0xF0;//очищаем выходы PD0,1,2,3
    PORTD|=(c);//передаем младшую тетраду
	LCD_E_CLR;
	_delay_us(50);
}

вот так теперь выглядит инициализация

void lcd_init()
{
    _delay_ms(15);
    lcd_putbyte(0x03,LCD_COMMAND);
    _delay_ms(4);
    lcd_putbyte(0x03,LCD_COMMAND);
    _delay_us(100);
    lcd_putbyte(0x03,LCD_COMMAND);
	 _delay_ms(1);
    lcd_putbyte(0x02,LCD_COMMAND);
	_delay_ms(1);
    lcd_putbyte(0x28, LCD_COMMAND);
    _delay_ms(1);
    lcd_putbyte(0x0C, LCD_COMMAND);
    _delay_ms(1);
    lcd_putbyte(0x06, LCD_COMMAND);
    _delay_ms(1);
}

но вот беда в железе так и отказывается работать

Ссылка на комментарий
Поделиться на другие сайты

@Дмитрий Вас

2 минуты назад, Дмитрий Вас сказал:

передаю через младшие ноги порта

А дисплей-то, надеюсь, подключен старшей половиной порта D4-D7?

Ссылка на комментарий
Поделиться на другие сайты

прозвонил, все четко. дисплея два. один двухстрочный один однострочный. на обоих просто квадратики. 

а может быть ошибка если на однострочный задал команду на две строки?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...