Mega8 + LCD

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Аватара пользователя
Сообщения: 2
Зарегистрирован: Ср фев 13, 2013 23:38:52
Откуда: Москва

Сообщение deatwisedog »

Доброго времени суток, уважаемые знатоки!
Оговорюсь: в программировании МК я понимаю не так уж много, но стремлюсь к знаниям.

Имеем:
Atmega8
LCD WH1602A
CodeVision AVR
Желание всё это запустить)

Собрал. Подключил D0-D7... Включил CVAVR... И началось. Воевал я с ним около двух недель... И вроде бы LCD даже инициализировался, только таблица символов пестрила повторениями и вообще не соответствовала действительности. Большинство управляющих кодов также воспринималось экраном не в соответствии с таблицей, а от балды.
Пробовал менять дисплей - не помогло. Такая же проблема.
Сегодня перепаял под передачу данных по 4 проводам. Не заработало. Вообще. Даже не видно инициализации. Случайно обнаружил установленный Bascom, немного поковырялся и вуаля! Через него всё прекрасно работает!
Помогите, пожалуйста, найти ошибку(Ошибки) в коде для CVAVR, чтобы заставить работать этот агрегат...
Да! Подключение:
D4=PD0
D5=PD1
D6=PD2
D7=PD3

E=PB6
RS=PB7
RW повесил на землю, т.к. всё равно ничего не считываю из LCD.
Прилагаю исходник Bascom и исходник CVAVR.
Оба наброска взяты с просторов Сети.
Спойлер

Код: Выделить всё


$regfile = "m8def.dat"
 
Config Lcdpin = Pin , Rs = Portb.7 , E = Portb.6 , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3
Config Lcd = 16 * 2

Cursor Off Noblink 
Cls
Lcd "Hello! It work!"
Locate 2 , 2
Lcd "Really work!"

Cursor on, blink
End 

Код: Выделить всё

#include <mega8.h>  //#include <mega48.h>
#define RS PORTB.7     //0-запись команд, 1-запись данных
#define E PORTB.6      //Ввод данных по спадающему фронту
#define DB7 PORTD.3    //Определение линий 4-х битного интерфейса
#define DB6 PORTD.2
#define DB5 PORTD.1
#define DB4 PORTD.0
#define time 340    //Базовая задержка времени(~20 на 1МГц)
//#pragma rl-            

//------------ФУНКЦИЯ ЗАДЕРЖКИ ВРЕМЕНИ-----------------------
void delay(unsigned int a)
{unsigned int cnt;
 for (cnt=a; cnt>0; cnt--);
}    
//------------------ФУНКЦИЯ ЗАПИСИ В ЖКИ--------------------
void lcd(unsigned char d)
 {E=1;   
  DB7=(d&0x80)>>7;    //Выводим старший ниббл
  DB6=(d&0x40)>>6;
  DB5=(d&0x20)>>5;
  DB4=(d&0x10)>>4;
  delay(time);        //Задержка
  E=0;                //Запись
  delay(time);        //Задержка
  E=1;                //enable = 1
  DB7=(d&0x08)>>3;    //Выводим младший ниббл
  DB6=(d&0x04)>>2; 
  DB5=(d&0x02)>>1; 
  DB4=(d&0x01); 
  delay(time);        //Задержка    
  E=0;                //Запись
  delay(5*time);      //Пауза для выполнения команды    
 }   
//------------ФУНКЦИЯ ЗАПИСИ КОМАНДЫ В ЖКИ-------------------
void lcd_com(unsigned char c)
{RS=0;                       //Режим записи команд
 lcd(c);                     //Запись
}
 //---------- ЗАПИСИ ДАННЫХ В ЖКИ---------------------
void lcd_putchar(unsigned char d)
 {RS=1;                       //Режим записи команд
  lcd(d);                     //Запись
 }     
//-------------ФУНКЦИЯ ОЧИСТКИ ЖКИ---------------------------
void lcd_clear(void)
{lcd_com(0x01); delay(time*1000);//Очистка ЖКИ
}
//-----------ФУНКЦИЯ ИНИЦИАЛИЗАЦИИ ЖКИ-----------------------
void lcd_init(void)
{delay(time*100);                //Предварительная задержка
 lcd_com(0x33); delay(time*500); //Подготовка
 lcd_com(0x32); lcd_com(0x28);   //4 бита, 2 строки (см. Datasheet-s)
 lcd_com(0x08);                  //Выключение ЖКИ
 lcd_clear();                    //Очистка ЖКИ
 lcd_com(0x06);                  //Сдвиг курсора вправо
 lcd_com(0x0D);                  //Включение без курсора
 delay(time*5);                  //Пауза для выполнения команды    
}         
//---------- ВЫВОДА СТРОКИ НА ЖКИ---------------------
void lcd_puts(unsigned char *str)
{
char k;
while ((k=*str++)!= 0) lcd_putchar(k);
}


//--------ФУНКЦИЯ  ПЕРЕХОДА В УКАЗАННУЮ ПОЗИЦИЮ--------------
void lcd_gotoxy(unsigned char x, unsigned char y)
{
 lcd_com((0x80+y*64)+x); //Рассчет позиции. Ячейка 0х80 - лев. верхн. угол
}

void main (void)
{
lcd_init();
lcd_gotoxy(2,2);
}
Заранее огромное спасибо!
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 51
Зарегистрирован: Ср окт 31, 2012 10:33:57

Сообщение Полиграф Полиграфыч »

deatwisedog писал(а):Доброго времени суток, уважаемые знатоки! Заранее огромное спасибо!
Порты правильно проинициализированы на вход-выход?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Используйте библиотеку того же кодевижена <lcd.h>.
Docendo discimus
Контактная информация:
Родился
Аватара пользователя
Сообщения: 2
Зарегистрирован: Ср фев 13, 2013 23:38:52
Откуда: Москва

Сообщение deatwisedog »

Порты инициализируются правильно - уже неоднократно проверял.

Lcd.h - наверное хорошо- вот только я не понял, как к ней прикрутить нестандартное подключение дисплея. Т.е. как или где с ее помощью объявить пины подключения.

Полиграф Полиграфыч, Вы оказались абсолютно правы! Сейчас на свежую голову всё перепроверил - окзалось что я не проинициализировал DDRB на выход! И ура, оно заработало! Осталось отловить мелкие баги и дальше подключить всё это к uart...
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

deatwisedog писал(а):Желание всё это запустить)
Хотите знать как подключить и запустить LCD,читайте в книге Лебедева М.Б. о CVAVR,там это всё подробно изложено.
Реклама
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Сб дек 08, 2012 16:40:40

Сообщение Триод »

deatwisedog писал(а): Собрал. Подключил D0-D7... Включил CVAVR... И началось. Воевал я с ним около двух недель... И вроде бы LCD даже инициализировался, только таблица символов пестрила повторениями и вообще не соответствовала действительности. Большинство управляющих кодов также воспринималось экраном не в соответствии с таблицей, а от балды.
Пробовал менять дисплей - не помогло. Такая же проблема.
Я тоже наступал на грабли именно с этим дисплеем!
Фишка там в том, что инициализацию нужно делать тремя циклами.
Вот тут правильный мануал:
http://lib.chipdip.ru/243/DOC000243342.pdf
Сделайте по нему и всё получится
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Сообщение C@at »

Триод писал(а):Вот тут правильный мануал:
http://lib.chipdip.ru/243/DOC000243342.pdf
А че это у него там в знакогенераторе , такое количество символов???
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Сб дек 08, 2012 16:40:40

Сообщение Триод »

C@at писал(а):такое количество символов???
А что не так?
Вымогатель припоя
Аватара пользователя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Сообщение C@at »

Количество символов больше чем в HD44780.
Ответить

Вернуться в «AVR»