Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
05.07.2009, 00:14
|
|
Частый гость
Регистрация: 01.12.2007
Сообщений: 25
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
проблема с LCD
Доброго времени суток всем!
Уважаемые гуру программирования МК подскажите плиз
есть LSD 16x2 MTC-S16204XRGHS (аналог MT-16S2H)
есть Atmega 644
написал прогу на с в оболочке WinAvr
залил а на экране "болт"
видно что инициализироватся начинает т.е. после включения питания загорается кубиками верхняя строка потом обе через время задержки при старте и всё дальше полнейший мороз
контролер работает как часики смотрел на анализаторе (записывал кодограммы) всё сходится с программой
Код:
|
#include ‹avr/io.h›
#include "mylsd.h"
#include "FPROEKT.h"
char str1[16] = " **КНЯЗЬ** ";
char str2[16] = " привет ";
int main (void)
{
DDRA = 0xFF;//порт А все выход
DDRB = 0x07;//порт В 0,1,2 выход остальные входы
initlsd();
//while(1)
{
Writestring(str1);
Writestring(str2);
}
} |
второй блк програмы
Код:
|
#include ‹avr/io.h›
#include ‹avr/delay.h›
#include ‹stdio.h›
#include "FPROEKT.h"
#define A_1 PORTB |= 4
#define RW_1 PORTB |= 2
#define E_1 PORTB |= 1
#define A_0 PORTB &= 3
#define RW_0 PORTB &= 5
#define E_0 PORTB &= 6
#define date PORTA
void WriteByte(unsigned char data) //запись 1-го байта по текущему адресу
{
RW_0;
E_1;
date = (data);
E_0;
RW_1;
_delay_loop_2(3000);
}
void Writestring(char str[16]) //запись строки по начальному адресу
{
int i;
A_1;
for(i = 0; i ‹ 15; i++ )
{
WriteByte(str[i]);
}
A_0;
}
void initlsd (void)
{ RW_1;
E_0;
A_0;
_delay_loop_2( 50000 );
WriteByte(0x30); //00110000
WriteByte(0x30); //00110000
WriteByte(0x30); //00110000
WriteByte(0x3A); //00111010
WriteByte(0x08); //00001000
WriteByte(0x01); //00000001
WriteByte(0x07); //00000111
} |
Прикрепленный файл: 4697353.pdf
|
|
|
|
05.07.2009, 08:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
А в симуляторе проверяли ?
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
05.07.2009, 13:43
|
|
Частый гость
Регистрация: 01.12.2007
Сообщений: 25
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
нет не проверял
нет в базе такой LCD
|
|
|
|
05.07.2009, 14:17
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
|
Скорее всего внутри этого модуля LCD стоит контроллер, совместимый с HD44780. В доказательство этого есть эта страница: http://display.compel.ru/passive/pas...p?ser=MT-16S2H. Там контроллер S6B0066U, а это брат-близнец широкораспространенного и известного HD44780.
Если у вас HD44780-совместимый контроллер, то навскидку у вас неправильная функция инициализации - нехватает задержек между командами. Вот правильная функция для 4-битовой шины между LCD и микроконтроллером (задержки в миллисекундах):
Код:
|
Thread.Sleep(16);
WriteCommand(0x33);
Thread.Sleep(5);
WriteCommand(0x32);
Thread.Sleep(1);
WriteCommand(0x28);
WriteCommand(0x08);
WriteCommand(0x01);
Thread.Sleep(10);
WriteCommand(0x06);
WriteCommand(0x0d);
Thread.Sleep(1); |
|
|
|
|
05.07.2009, 14:28
|
|
Прописка
Регистрация: 18.06.2006
Сообщений: 179
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Опередили
Только хотел написать про неправильную инициализацию
Аналогичный вопрос был в ветке про CCS, но там все оказалось тривиальнее - вывод RW был припаян на землю.
На всякий случай ссылка на ту ветку, там есть материалы по LCD:
https://kazus.ru/forum/topics/f_1232...lab+lcd#123279
этот и следующие посты
|
|
|
|
06.07.2009, 20:21
|
|
Частый гость
Регистрация: 01.12.2007
Сообщений: 25
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
с инициализацией разобрался забыл выдать команду на включения
Код:
|
void initlsd (void)
{ RW_1;
E_0;
A_0;
_delay_loop_2( 50000 );
WriteByte(0x30); //00110000
WriteByte(0x30); //00110000
WriteByte(0x30); //00110000
WriteByte(0x38); //00111000
WriteByte(0x08); //00001000
WriteByte(0x01); //00000001
WriteByte(0x04); //00000100
WriteByte(0x0C); //00001100
WriteByte(0x3C); //00111100 --забыл!! |
теперь номогу прочитать из памяти
-вывожу первую строчку
-после считую из памяти
-далее вывожу во вторую строку
а он выдаёт - mmmmmmmmmmmmmmmm
Код:
|
char Rstr[16];
unsigned char ReadByte(void) //чтение 1 байта текущего адреса
{
DDRA = 0x00;//порт А все вход
_delay_loop_2(3000);
E_1;
_delay_loop_2(1);
return date;
E_0;
_delay_loop_2(3000);
DDRA = 0xFF;//порт А все выход
_delay_loop_2(3000);
}
void Raedstring(char adr )
{
int i;
for(i = 0; i ‹ 16; i++ )
{
WriteByte(adr);
A_1;
_delay_loop_2(1);
Rstr[i] = ReadByte;
A_0;
adr++;
}
} |
|
|
|
|
07.07.2009, 03:04
|
|
Прописка
Регистрация: 18.06.2006
Сообщений: 179
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Почитай документацию, особенно в части соответствия адресов позицям индикатора.
|
|
|
|
07.07.2009, 23:49
|
|
Частый гость
Регистрация: 01.12.2007
Сообщений: 25
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
всё тема закрыта ошибки нашел
1 return воткнул внутри тела функции и она не завершившись выходила с пустым результатом
2 неправильно считывал
d = portA
а надо
d = pinA
привык в паскале та с этим проще
Код:
|
#include ‹avr/io.h›
#include ‹avr/delay.h›
#include ‹stdio.h›
#include "FPROEKT.h"
#define A_1 PORTB |= 4
#define RW_1 PORTB |= 2
#define E_1 PORTB |= 1
#define A_0 PORTB &= 3
#define RW_0 PORTB &= 5
#define E_0 PORTB &= 6
#define date PORTA
//char Rstr[16];
char ReadByte() //чтение 1 байта текущего адреса
{
char z;
DDRA = 0x00;//порт А все вход
//date = 0xFF;
_delay_loop_2(10);
RW_1;
_delay_loop_2(1);
E_1;
_delay_loop_2(1);
z = PINA;
E_0;
_delay_loop_2(1);
RW_0;
_delay_loop_2(1);
DDRA = 0xFF;//порт А все выход
_delay_loop_2(10);
return z;
}
void WriteByte(char data) //запись 1-го байта по текущему адресу
{
date = (data);
E_1;
_delay_loop_2(1);
E_0;
_delay_loop_2(3000);
}
void Raedstring(char adr ) //чтение строки с начального адресу
{
int i;
for(i = 0; i ‹ 16; i++ )
{
WriteByte(adr);
A_1;
_delay_loop_2(1);
Rstr[i] = ReadByte();
A_0;
adr++;
}
}
void Writestring(char str[16],char adr) //запись строки по начальному адресу
{
int i;
for(i = 0; i ‹ 16; i++ )
{
WriteByte(adr);
A_1;
_delay_loop_2(1);
WriteByte(str[i]);
A_0;
adr++;
}
}
void initlsd (void)
{
DDRA = 0xFF;//порт А все выход
DDRB = 0x07;//порт В 0,1,2 выход остальные входыRW_0;
E_0;
A_0;
_delay_loop_2( 50000 );
WriteByte(0x30); //00110000
WriteByte(0x30); //00110000
WriteByte(0x30); //00110000
WriteByte(0x38); //00111000
WriteByte(0x08); //00001000
WriteByte(0x01); //00000001
WriteByte(0x04); //00000100
WriteByte(0x0C); //00001100
WriteByte(0x3C); //00111100
} |
главная прога
Код:
|
#include ‹avr/io.h›
#include "mylsd.h"
#include "FPROEKT.h"
char str1[16] = " privet ";
char Rstr[16];
int main (void)
{ initlsd();
//while(1)
{
Writestring(str1,0x80);
Raedstring(0x80);
Writestring(Rstr,0xC0);
}
} |
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:04.
|
|