Jump to content

Recommended Posts

#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>

#define RS PINC0
#define EN PINC1
// Функция передачи команды
void lcd_com(unsigned char com)
{
	PORTC &= ~(1 << RS); // RS = 0 (запись команд)
	PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
	PORTD &= 0xF0; //обнуляем 0:4 пины порта Д
	PORTD |= (com >> 4); // старший нибл
	_delay_us(100);
	PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
	_delay_us(100);
	PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
	PORTD &= 0xF0; //обнуляем 0:4 пины порта Д
	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_string (const char str1[])
{
	wchar_t n;
	for(n=0;str1[n]!='\0';n++)
	lcd_data(str1[n]);
}
//функция вывода чисел
void lcd_chisla(unsigned int chislo)
{//делим число и выводим посимвольно в buffer, buffer[2] значение запятой
	unsigned char buffer[5]={'0','0',',','0',0};
	buffer[0]=(chislo/100)+'0';
	buffer[1]=((chislo%100)/10)+'0';
	buffer[3]=(chislo%10)+'0';
	for (unsigned char i=0;i<5;i++)
	{
		lcd_data(buffer[i]);
	}
}
//функция позиционирования курсора
void lcd_poz(unsigned char x)
{
	char adress;
	adress=x|0b10000000;//set DDRAM adress дш стр24
	lcd_com(adress);
}
//функция инициализации дисплея
void lcd_ini(void)
{
	_delay_ms(15);
	// Конфигурирование четырехразрядного режима
	PORTC |= (1 << PIND1);
	PORTC &= ~(1 << PIND0);
	// Активизация четырехразрядного режима
	PORTC |= (1 << EN);
	PORTC &= ~(1 << EN);
	lcd_com(0x20); //0b00100000 - 4 разрядная шина, 1 строки
	_delay_ms(40);
	lcd_com(0x08); // 0b00001000 полное выключение дисплея
	_delay_ms(40);
	lcd_com(0x01); // 0b00000001 очистка дисплея
	lcd_com(0x06);  //0b00000110 - курсор движется вправо, сдвига нет
	_delay_ms(40);
	lcd_com(0x0C);  //0b00001100 - дисплей включен, курсор выключен, мерцание выключено
	_delay_ms(40);
}
//функция очистки дисплея
void lcd_clear (void)
{
	lcd_com(0b00000001);
}

void port_ini (void)
{
	DDRD|=0xFF;
	DDRB|=0xFF;
	DDRC|=0xFF;
	PORTD|=0;
	PORTB|=0;
	PORTC|=0;
}
int main(void)
{
	port_ini();
	lcd_ini();
	while (1)
	{	
		lcd_poz(0);
		lcd_string("i love maria");
	}
}

вот вся портянка

Share this post


Link to post
Share on other sites
Posted (edited)
_delay_ms(20); //Ждем 15 мс (стр 45)
	sendhalfbyte(0b00000011);
	_delay_ms(4);
	sendhalfbyte(0b00000011);
	_delay_us(100);
	sendhalfbyte(0b00000011);
	_delay_ms(1);
	sendhalfbyte(0b00000011);
	_delay_ms(1);
	sendhalfbyte(0b00000010);
	_delay_ms(1);
		
	sendbyte(0b00101000,0); //0-0-1-DL-N-F-0-0,(4бит-режим DL=0) и (2 линии N=1, N=0 1 линия), (F=0 размер символов 5*8 точек F=1 размер 5*10)
	_delay_ms(1);
	sendbyte(0b00001100,0); //0-0-0-0-1-D-C-B,(включаем изображение на дисплее (D=1 вкл D=0 выкл),курсор выкл=0 вкл=1 (C-подчеркивание, B-квадрат)
	_delay_ms(1);
	sendbyte(0b00000110,0); //0-0-0-0-0-1-I/D-S,(I/D=0 счетчик адреса уменьшается =1 увелич.(S=0 сдвиг экрана не будет,S=1 сдвиг производится согласно I/D
	_delay_ms(1);
	clearlcd();//стереть дисплэй

Я полагаю у вас не верная инициализация дисплея. Нужна вот такая последовательность.. sendhalfbyte(0b00000011); функция отсылает 1-е 4 бита.(0-3)

Edited by Demonrostov

Share this post


Link to post
Share on other sites

Конденсаторы Panasonic. Часть 4. Полимеры – номенклатура

В заключительной, четвертой статье из цикла «Конденсаторы Panasonic» рассматриваются основные достоинства и особенности использования конденсаторов этого японского производителя на основе полимерной технологии. Главной конструктивной особенностью таких конденсаторов является полимерный материал, используемый в качестве проводящего слоя. Полимер обеспечивает конденсаторам высокую электрическую проводимость и пониженное эквивалентное сопротивление (ESR). Номинальная емкость и ESR отличается в данном случае высокой стабильностью во всем рабочем диапазоне температур. А повышенная емкость при низком ESR идеальна для решения задач шумоподавления и ограничения токовых паразитных импульсов в широком частотном диапазоне.

Читать статью

8 минут назад, Дмитрий Мамедиев сказал:

но она работает с передачей через порты 4:7

так сделай чтобы работала через 0:3, а не тупо вытри из процедуры инициализации

1 час назад, Дмитрий Мамедиев сказал:


//функция инициализации дисплея
void lcd_ini(void)
{
	_delay_ms(15);
	// Конфигурирование четырехразрядного режима
	PORTC |= (1 << PIND1);
	PORTC &= ~(1 << PIND0);
	// Активизация четырехразрядного режима
	PORTC |= (1 << EN);
	PORTC &= ~(1 << EN);
}

 

Конфигурирование четырехразрядного режима куда делось?

Share this post


Link to post
Share on other sites
                     

STM32G0 - средства противодействия угрозам безопасности

Результатом выполнения требований безопасности всегда является усложнение разрабатываемой системы. Особенно чувствительными эти расходы стали теперь, в процессе массового внедрения IoT. Обладая мощным набором инструментов информационной безопасности, микроконтроллеры STM32G0 производства STMicroelectronics, объединив в себе невысокую цену, энергоэффективность и расширенный арсенал встроенных аппаратных инструментов, способны обеспечить полную безопасность разрабатываемого устройства.

Подробнее...

13 минуты назад, Дмитрий Мамедиев сказал:

но она работает

Может оно и работает, но закрывая на не правильную (согласно даташиту) инициализацию, вы закладываете себе на будущее  непонятки типа "как, оно же работало!".  Один дисплей может работать, второй нет....Один протеус реагирует на код так другая версия уже может по другому.

Share this post


Link to post
Share on other sites

Вам никто не поможет, пока вы сами не начнете делать сразу правильно, а не так "как вроде работает".

Share this post


Link to post
Share on other sites
Только что, Дмитрий Мамедиев сказал:

я только изменил в lcd_com и lcd_data порядок передачи полубайта

Это как? Порядок есть порядок, его менять не надо...

Share this post


Link to post
Share on other sites

Ошибка инициализации есть. Почитайте даташит. Ее надо исправлять.

Share this post


Link to post
Share on other sites
26 минут назад, Дмитрий Мамедиев сказал:

да ничего я не вытирал из инициализации.

да ну? передача первых четырех ниблов (команды 0х3 и 0х2) из твой портянки куда делась?

1602.thumb.png.a40df6dc218a0ae5a936c92661da75c8.png

Share this post


Link to post
Share on other sites
19 минут назад, Дмитрий Мамедиев сказал:

lcd_com и lcd_data

Вы не заметили, что эти функции практически одинаковы и отличаются только RS сигналом, так может их стоит объединить и добавить еще один параметр (команда, данные)...И партянка станет короче:rolleyes:

Share this post


Link to post
Share on other sites
void lcd_ini(void)
{
	_delay_ms(15);
	lcd_com(0x3);
	_delay_ms(5);
	lcd_com(0x3);
	_delay_us(100);	
	lcd_com(0x3);//0b00100000 - 4 разрядная шина, 1 строки
	lcd_com(0x2);//очистка дисплея, курсор невидим и не мигает
	lcd_com(0x8);// 0b00000001 очистка дисплея
	lcd_com(0x6);//0b00000110 - курсор движется вправо, сдвига нет
	lcd_com(0xC);//0b00001100 - дисплей включен, курсор выключен, мерцание выключено
}

вот с этим заработало. 

Share this post


Link to post
Share on other sites
11 минуту назад, Дмитрий Мамедиев сказал:

вот с этим заработало. 

лапшу на ущи не вешай.

Share this post


Link to post
Share on other sites

ну если не вешаешь расскажи, что ты там передал в ЖКИ этой командой  lcd_com(0x3); или этой lcd_com(0x2); и что надо было передать, обиженный ты наш

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

То что программа скомпилировалась не означает что она рабочая.

Share this post


Link to post
Share on other sites

Добрый день!

Раньше имел дело только с дисплеями 1602 и nokia 5110.

Сейчас попал в руки дисплей PG24122 (интернет определяет его как GM24122S1RH).

PG24122_front_640.jpg.8df3afca6cc6fa2b81c53a32c67f51e3.jpgHTB1cFvTJFXXXXcaXVXXq6xXFXXXx.jpg.2b7a9b2946bfbaab83c042a831e4562f.jpg

Описание: http://megtestesules.info/hobbielektronika/cuccok.html

LCD Module Specification: http://megtestesules.info/hobbielektronika/cuccok/HE001/GM24122S1RH-J6.pdf

1365847185_.PNG.e3d8fc9d53abeab008f5ad30461ca31e.PNG

Продается на алиэкспресс: https://ru.aliexpress.com/item/32814247150.html

Это всё, что я смог найти в сети про этот дисплей.

Может кто-то научить, как подключить его к Ардуино или Атмега?

Спасибо!

Share this post


Link to post
Share on other sites

У меня примерно с таким же интерфейсом от древнего ноута есть дисплей. Дело в том что тут не всё так просто. У дисплея есть память только на одну строку, а всю картинку должен держать в себе контроллер. По всей видимости, логически дисплей состоит из двух частей - верхней и нижней половины с независимыми регистрами строк. Каждая часть из себя представляет регистр строки в который ты побитно через SD1 и SD2 с общим клоком CP заносишь данные на одну строку(длину строки в битах х.з. какая у этого дисплея можно определить практически либо с маркировки но думаю что кратная 8) потом выдаёшь сигнал LOAD(типа строчный синхросигнал), и содержимое записывается в транзисторы TFT-матрицы и переключается на следующую строку. Заряд на них держится... какое-то время, от секунд до минуты. Когда загрузил все строки, выдаётся сигнал FRAME(это типа кадровой развертки в телевизоре), счетчик строк обнуляется и всё идет сначала. По-хорошему, сигнал надо выдать в начале отрисовки дисплея.

Общий провод и +5в - понятно куда подключать, VLCD и VADJ всё-таки надо смотреть в даташит, в моём дисплее от ноута там было порядка -19В и на контрасте -21В или наоборот. У этого дисплея поидее должно быть меньше, но надо уточнять.

ME(M) это вход частоты перекллючения ЖК ячеек дисплея... поидее туда надо меандр в диапазоне 10-20Гц. Чем быстрее переключаешь тем отзывчивей дисплей но выше энергопотребление. Можно попробовать в эконом режиме 1-2Гц но может наяать неприятно мерцать.

К мелкому контроллеру не подключишь... тут надо много RAM.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Anton Bondarenko
      Всем привет
      Прошу не ругать, впервые подобный вопрос задаю.
      Хочу сделать прибор, который будет посылать сигнал, когда возле прибора будет проходить металлический предмет. 
      — угол отслеживания до 30° а лучше прямая линия, траектория
      — время реакции очень высокое до 100 мс
      — ширина проема в котором нужно сканировать от 10 до 20метров,
      — передача сигнала через вифи
      Может есть готовые решения, или отдельные компоненты.
      Подскажите пжл в каком направлении искать.
      Смотрел датчики движения, но главная проблема — время реакции.
      Спасибо
       
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
    • Guest Денис
      By Guest Денис
      В общем, есть такое чудо китайской техники (фото)
      Что оно может:
      1. Заряжаться через microUSB порт
      2. Кнопка вкл/выкл, она же переключает режимы
      3. 3 режима свечения светодиода (он светит разными цветами)
      Что я хочу сделать:
      1. Пункты 1 и 2 выше
      2. Разнообразить количество режимов, переливание статичный цвет и тд...
      Вопрос: как это сделать? что купить?

      P.S. К сожалению, в гугле не нашел подробной инструкции, а я в электронике я дуб дубом


    • By Reptile
      Доброго времени суток. Пытаюсь восстановить работоспособность колонок Top Device TDE 261/2.1. Колонки не раз ремонтировалась по части УНЧ, при очередном ремонте по ошибке (одинаковые разъемы) с трансформатора было подано переменное питающее напряжение на входы (разъем AUX/MP3) аудиопроцессора PT2313L  (3,10,14 ноги - AGND, R_IN2 L_IN2). В результате чего выгорел сам аудиопроцессор PT2313L. PT2313L был заменен. Но колонка по прежнему не запускается. Как я понял, не запускается сам PT2313L, на его аудиовыходах (ноги 24, 25) сигнала нет. Передняя панель работает: индикация, кнопки, енкодер. Имеется подозрение, что вместе с процессором выгорели линии DATA и/или CLK на MCU, так как MCU и PT2313L соединены по этим линиям напрямую друг с другом. В МК и всей этой цифровой штуке не очень шарю, не знаю, как грамотно проверить работоспособность этой цифровой части, поэтому прошу помощи - Возможно ли какими-либо способами восстановить колонку или уже всё... 
      Из приборов, к сожалению, только мультиметр, осциллограф отсутствует.
      Ниже немного измерений.
      Напряжения на линиях: STD-BY-ждущий режим (в скобках рабочий режим):
      DATA - 2.31В (1.9В).
      CLK - 0.125В (0.135В).
      Сопротивление между выводами:
      CLK_MCU-DATA_MCU - 47 Ом. 
      CLK_MCU/DATA_MCU-GND - около 0.22 Ом и там и там. Звонится в обе стороны.
      Питание MCU 5В, (4.6В STD-BY-ждущий режим, 4.0В рабочий режим и со временем также почему-то может падать до 3.6В)
      MCU - не известен, нет маркировки. 18 Выводов, DIP.
      Ноги MCU, которые удалось опознать:
      1 - DATA
      18 - CLK
      3 - GND (?)
      5 - GND (?)
      ? - они соединены вместе
      14 - VCC
      17 - not used (n/a)
      15, 16 - OSC
      ET6202 - управление индикатором, Control LED drive circuit
      Фото плат (под сполером) и даташиты прилагаются.
      Схемы данных колонок не имеется. Все что удалось найти это схема чуть более старшей модели TDE280/2.1, с данными колонками она мало что общего имеет, лишь общий принцип, узлы довольно сильно отличаются, но прикреплю на всякий, для общей информации.
      PT2313L
      ET6202
      TDE280
       
×
×
  • Create New...