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

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

помогите новичку разобраться с 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
pascal
 
Сообщения: 3
Зарегистрирован: 23 июн 2009, 23:09
Откуда: Москва

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

Сообщение =DeaD= » 23 июн 2009, 23:31

А не проще найти библиотеку готовую под этот контроллер? Вроде самый распространенный же?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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

Сообщение pascal » 24 июн 2009, 00:23

А можно поподробнее пожалуйста что за библиотека и где ее найти? Я просто не слышал об этом. Спасибо
pascal
 
Сообщения: 3
Зарегистрирован: 23 июн 2009, 23:09
Откуда: Москва

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
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

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

Сообщение pascal » 24 июн 2009, 15:13

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

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

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

Сообщение Master » 24 июн 2009, 15:35

Программаторо для дисплея не нужен, если я правильно понял что это дисплей совместимый с контроллером HD44780. Схема может быть и правильная, но большинство библиотек построено так что юзают не 8 ног Дата на дисплее, а только 4-и, полубайтный обмен данными и используется целиком одино порт контроллера A, B, C или D (это я щас говорю про библиотеку для CVavr)
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

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
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

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 все отлично выводится.
Daido
 
Сообщения: 4
Зарегистрирован: 05 фев 2010, 08:26
Откуда: Алматы

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

Сообщение galex1981 » 11 фев 2010, 23:46

Выложи лучше свой код, вместе попробуем оживить
if(!Operate) Read(pDatasheet);
Аватара пользователя
galex1981
 
Сообщения: 4363
Зарегистрирован: 04 дек 2008, 22:44
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович

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

Сообщение yak-40 » 11 фев 2010, 23:47

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

... и схему
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3037
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец

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.
Daido
 
Сообщения: 4
Зарегистрирован: 05 фев 2010, 08:26
Откуда: Алматы

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

Сообщение yak-40 » 12 фев 2010, 22:47

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

Опять на эти грабли наступили :D
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3037
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец

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

Сообщение Daido » 12 фев 2010, 22:52

Видимо каждый должен через это пройти, чтобы навсегда запомнить.
Я где-то встречал это но не обратил внимание, сегодня что-то озарило :Yahoo!:
Daido
 
Сообщения: 4
Зарегистрирован: 05 фев 2010, 08:26
Откуда: Алматы

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

Сообщение SERGEY_M » 13 фев 2010, 01:14

8) мдя...
век живи, век мучайсО...
Аватара пользователя
SERGEY_M
 
Сообщения: 682
Зарегистрирован: 20 мар 2009, 12:45
Откуда: Украина, Одесса
ФИО: Сергей

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

Сообщение avr123.nm.ru » 13 фев 2010, 15:44

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


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

-
Вложения
jtag.png
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23