roboforum.ru

Технический форум по робототехнике.

помогите новичку разобраться с LCD-дисплеем

помогите новичку разобраться с LCD-дисплеем

pascal » 23 июн 2009, 23:25

Здравствуйте!

Совсем недавно начал изучать микроконтроллеры. Пытаюсь в Proteus7 присоединить LCD-дисплей LM016L к Atmega8535. Получившаяся схема подключения во вложенном файле.

В среде разработки IAR написал следующую программу (команды дисплея взял из даташита к нему).

Код: Выделить всёРазвернуть
#include "iom8535.h"

short unsigned int i;

//Ожидание готовности дисплея
void ReadyWait(){
  do{
    DDRD  = 0;         
    DDRA = 255;         
    PORTA = 6;
 
    asm("NOP");
 
    PORTA = 2;
 
  }while((PORTD & 128) == 1);
}

int main( void )
{
  //Выбираем шину в 8 бит и 2 строки
  ReadyWait();
 
  DDRD  = 255;         
  DDRA = 255;         
  PORTA = 4;
 
  PORTD = 56;
 
  asm("NOP");
 
  PORTA = 0;
  DDRD  = 0;
 
  //Очистка экрана
  ReadyWait();
 
  DDRD  = 255;         
  DDRA = 255;         
  PORTA = 4;
 
  PORTD = 1;
 
  asm("NOP");
 
  PORTA = 0;
  DDRD  = 0;
 
  //Настройка сдвига экрана и курсора
  //Инкремент адреса. Экран не движется
  ReadyWait();
 
  DDRD  = 255;         
  DDRA = 255;         
  PORTA = 4;
 
  PORTD = 6;
 
  asm("NOP");
 
  PORTA = 0;
  DDRD  = 0;
 
  //Включили дисплей
  ReadyWait();
 
  DDRD  = 255;         
  DDRA = 255;         
  PORTA = 4;
 
  PORTD = 12;
 
  asm("NOP");
 
  PORTA = 0;
  DDRD  = 0;
 
  //Очистили дисплей. Указатель встал на DDRAM
  ReadyWait();

  DDRD  = 255;         
  DDRA = 255;         
  PORTA = 4;
 
  PORTD = 1;
 
  asm("NOP");
 
  PORTA = 0;
  DDRD  = 0;
 
  //Сдвинули курсор (S/C=0) вправо (R/L=1)
  ReadyWait();
 
  DDRD  = 255;         
  DDRA = 255;         
  PORTA = 4;
 
  PORTD = 20;
 
  asm("NOP");
 
  PORTA = 0;
  DDRD  = 0;
 
  //Выводим 1
  ReadyWait();
 
  DDRD  = 255;         
  DDRA = 255;         
  PORTA = 5;
 
  PORTD = 49;
 
  asm("NOP");
 
  PORTA = 0;
  DDRD  = 0;

  return 0;
}


Все нормально компилируется. После присоединения программы к микроконтроллеру в Proteus7 и запуска дисплей загорается но информация (цифра 1) на нем не выводится. Попробовал поотлаживать но проблема так и не всплыла. Подскажите пожалуйста в чем может быть проблема. Мне самому кажется что я не правильно что то соединил в схеме. По идее там должен быть еще контроллер самого дисплея но как через него работать и зачем тогда нам самим дается 8 линий данных и 3 линии комманд на самом дисплее не ясно.

Подскажите пожалуйста или скажите что можно почитать. Всем огромное спасибо!
Вложения
avr_lcd.jpg
Схема подключения в Proteus7

Re: помогите новичку разобраться с LCD-дисплеем

=DeaD= » 23 июн 2009, 23:31

А не проще найти библиотеку готовую под этот контроллер? Вроде самый распространенный же?

Re: помогите новичку разобраться с LCD-дисплеем

pascal » 24 июн 2009, 00:23

А можно поподробнее пожалуйста что за библиотека и где ее найти? Я просто не слышал об этом. Спасибо

Re: помогите новичку разобраться с LCD-дисплеем

avr123.nm.ru » 24 июн 2009, 00:30

Библиотеки для LCD и других устройств для IAR посмотрите в проектах в низу странички
Быстрый старт в IAR - http://IAR-Fast.narod.ru/

А свежий IAR для AVR там можно скачать - http://kazus.ru/forum/topic_14518-30.html

Re: помогите новичку разобраться с LCD-дисплеем

pascal » 24 июн 2009, 15:13

Скачал библиотеку сейчас пытаюсь разобраться. А все таки правильно ли собрана схема в Proteus? Нужен ли какой то контроллер для этого дисплея?

Из разбора исходников библиотек как я понял один из основных косяков моей проги является то что должна быть строго определенная задержка после скажем посылки комманды на порт и переключению пина E, чтобы подавать сигнал что можно что то делать с пришедшими данными. В исходниках люди считают под определенную частоту кол-во прогоняемых циклов. Как мне в Proteus задать частоту для микроконтроллера. В жизни насколько я знаю надо ставить кварц. А в этой среде вроде попроще был способ. Спасибо.

Re: помогите новичку разобраться с LCD-дисплеем

Master » 24 июн 2009, 15:35

Программаторо для дисплея не нужен, если я правильно понял что это дисплей совместимый с контроллером HD44780. Схема может быть и правильная, но большинство библиотек построено так что юзают не 8 ног Дата на дисплее, а только 4-и, полубайтный обмен данными и используется целиком одино порт контроллера A, B, C или D (это я щас говорю про библиотеку для CVavr)

Re: помогите новичку разобраться с LCD-дисплеем

avr123.nm.ru » 24 июн 2009, 16:15

pascal писал(а): Из разбора исходников библиотек как я понял один из основных косяков моей проги является то что должна быть строго определенная задержка после скажем посылки комманды на порт и переключению пина E, чтобы подавать сигнал что можно что то делать с пришедшими данными.


Симулятор VMLAB для AVR ( всего 4.2 Mb очень приятный в работе - посмотреть в моей домашней страничке можно ) имеет функцию контроля правильности таймингов обмена с LCD. Очень удобно.

Кроме того не хорошо что не подключеные ноги LCD "висят в воздухе" наверно их надо заземлить в реальном устройстве.

Примеры с работающим LCD есть в проектах-примерах для PROTEUS - http://kazus.ru/forum/topic_10496-0-asc-20.html

Re: помогите новичку разобраться с LCD-дисплеем

Daido » 11 фев 2010, 20:39

Привет всем. Я новичок тут.
Прочел курс http://avr123.nm.ru/.
И решил попробовать собрать что-нибудь )
Купил пару контроллеров Atmega16A (2 на тот случай если первый сразу сгорит).
LCD HD44780 20X4 (можно найти на ebay.com по фразе "HD44780 20X4 Character LCD Display with BLUE backlight")

Собрал 5В питание контроллера на макетной плате. Сделал все как описано в курсе avr123. Пока читал вроде все было просто и должно было с пол пинка завестись. Но нет. Все получалось, пока не дошел до LCD. Ни как он не хочет работать.
Пробовал использовать разные библиотеки и схемы подключения:
1. то что в курсе avr123 (использовал компилятор - CodeVisionAVR C Compiler).
2. http://homepage.hispeed.ch/peterfleury/ ... __lcd.html (использовал компилятор - avr-gcc)
3. http://www.pocketmagic.net/?p=447 (использовал компилятор - avr-gcc)


Не получается.

Может у кого есть железно рабочий кусок кода (библиотека) и схема подключения чтобы понять что я не правильно делаю.
Сам контроллер работает, т.к. я в коде вставил участок который отвечает за моргание лампочки (чтобы убедится что прошивка нормально залита).
Использую встроенныей генератор на 4MHz (фьюзы выставил). Прошиваю программатором VP-280.
LCD также рабочий, паял схему подключения по LPT к компьютеру. С помощью программки LCD Smartie v5.4.1 Beta все отлично выводится.

Re: помогите новичку разобраться с LCD-дисплеем

galex1981 » 11 фев 2010, 23:46

Выложи лучше свой код, вместе попробуем оживить

Re: помогите новичку разобраться с LCD-дисплеем

yak-40 » 11 фев 2010, 23:47

galex1981 писал(а):Выложи лучше свой код, вместе попробуем оживить

... и схему

Re: помогите новичку разобраться с LCD-дисплеем

Daido » 12 фев 2010, 22:43

Код сформировал в CodeVisionAVR.

Код: Выделить всёРазвернуть
/*****************************************************

Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 4,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega16.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

typedef unsigned char byte;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
 
}

// Declare your global variables here

void main(void)
{
byte i,j,d;
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0
PORTA=0x00;
DDRA=0x01;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4000,000 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x01;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

PORTA.0 = 1; /* LED on */

// LCD module initialization
lcd_init(20);

// Global enable interrupts
#asm("sei")

/* switch to writing in Display RAM */
lcd_gotoxy(0,0);
lcd_putsf("00000000000000000000");





PORTA.0 = 0; /* LED off */
 

while (1)
      {     
        for (i = 0; i < 254; i++){
          for (j = 0; j < 254; j++){
            for (d = 0; d < 254; d++){
            ;                         // Это просто задержка, знаю что не красиво:-)
            }
          }
        }
        PORTA.0 = 1;
        lcd_putsf("11111111111111111111");
        for (i = 0; i < 254; i++){
          for (j = 0; j < 254; j++){
            for (d = 0; d < 254; d++){
            ;
            }
          }
        }
        PORTA.0 = 0;
        lcd_putsf("00000000000000000000");
      };
}


Пробовал подавать напряжение сначала на дисплейчик потом на контроллер. Не помогает. Иногда на дисплее подсвечены первая и третья строка, иногда ни одна не подсвечена (как будто инициализация прошла успешно), но ни чего не выводится.
Если вообще отключаю проводки дисплейчика от контроллера то программа видимо зависает, т.к. лампочка не моргает а просто горит.
Как-то получилось вывести курсор на дисплейчике, но не программно ). Просто вставлял светодиод на ножку контроллера которая идет на EN(PIN6) дисплея, чтобы проверить подается ли туда напряжение.

На схемен ни чего нет практически. Питание на контроллер 5 вольт через стабилизатор, светодиод на A0 (так проверяю что контроллер выполняет программу). И на PORTC - сам LCD дисплейчик.

Добавлено спустя 12 минут 13 секунд:
УРА!!!
Дисплейчик заработал!!!
Нужно было отключить JTAG interface.

Re: помогите новичку разобраться с LCD-дисплеем

yak-40 » 12 фев 2010, 22:47

Daido писал(а):УРА!!!
Дисплейчик заработал!!!
Нужно было отключить JTAG interface.

Опять на эти грабли наступили :D

Re: помогите новичку разобраться с LCD-дисплеем

Daido » 12 фев 2010, 22:52

Видимо каждый должен через это пройти, чтобы навсегда запомнить.
Я где-то встречал это но не обратил внимание, сегодня что-то озарило :Yahoo!:

Re: помогите новичку разобраться с LCD-дисплеем

SERGEY_M » 13 фев 2010, 01:14

8) мдя...
век живи, век мучайсО...

Re: помогите новичку разобраться с LCD-дисплеем

avr123.nm.ru » 13 фев 2010, 15:44

Причем пишет !!!
Daido писал(а):Прочел курс http://avr123.nm.ru


Но КАК ???????

-
Вложения
jtag.png


Rambler\'s Top100 Mail.ru counter