roboforum.ru

Технический форум по робототехнике.
Текущее время: 28 фев 2025, 11:05

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: помогите новичку разобраться с LCD-дисплеем
СообщениеДобавлено: 23 июн 2009, 23:25 
Не в сети

Зарегистрирован: 23 июн 2009, 23:09
Сообщения: 3
Откуда: Москва
Здравствуйте!

Совсем недавно начал изучать микроконтроллеры. Пытаюсь в 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 линии комманд на самом дисплее не ясно.

Подскажите пожалуйста или скажите что можно почитать. Всем огромное спасибо!


Вложения:
Комментарий к файлу: Схема подключения в Proteus7
avr_lcd.jpg
avr_lcd.jpg [ 192.24 КиБ | Просмотров: 5317 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите новичку разобраться с LCD-дисплеем
СообщениеДобавлено: 23 июн 2009, 23:31 
Не в сети
Аватара пользователя

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

_________________
Проект [[Open Robotics]] - Универсальные модули для построения роботов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите новичку разобраться с LCD-дисплеем
СообщениеДобавлено: 24 июн 2009, 00:23 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите новичку разобраться с LCD-дисплеем
СообщениеДобавлено: 24 июн 2009, 00:30 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Библиотеки для LCD и других устройств для IAR посмотрите в проектах в низу странички
Быстрый старт в IAR - http://IAR-Fast.narod.ru/

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите новичку разобраться с LCD-дисплеем
СообщениеДобавлено: 24 июн 2009, 15:13 
Не в сети

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите новичку разобраться с LCD-дисплеем
СообщениеДобавлено: 24 июн 2009, 15:35 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите новичку разобраться с LCD-дисплеем
СообщениеДобавлено: 24 июн 2009, 16:15 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
pascal писал(а):
Из разбора исходников библиотек как я понял один из основных косяков моей проги является то что должна быть строго определенная задержка после скажем посылки комманды на порт и переключению пина E, чтобы подавать сигнал что можно что то делать с пришедшими данными.


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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите новичку разобраться с LCD-дисплеем
СообщениеДобавлено: 11 фев 2010, 20:39 
Не в сети

Зарегистрирован: 05 фев 2010, 08:26
Сообщения: 4
Откуда: Алматы
Привет всем. Я новичок тут.
Прочел курс 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-дисплеем
СообщениеДобавлено: 11 фев 2010, 23:46 
Не в сети
Аватара пользователя

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

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите новичку разобраться с LCD-дисплеем
СообщениеДобавлено: 11 фев 2010, 23:47 
Не в сети
Аватара пользователя

Зарегистрирован: 23 окт 2007, 22:03
Сообщения: 3037
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец
galex1981 писал(а):
Выложи лучше свой код, вместе попробуем оживить

... и схему

_________________
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите новичку разобраться с LCD-дисплеем
СообщениеДобавлено: 12 фев 2010, 22:43 
Не в сети

Зарегистрирован: 05 фев 2010, 08:26
Сообщения: 4
Откуда: Алматы
Код сформировал в 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-дисплеем
СообщениеДобавлено: 12 фев 2010, 22:47 
Не в сети
Аватара пользователя

Зарегистрирован: 23 окт 2007, 22:03
Сообщения: 3037
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец
Daido писал(а):
УРА!!!
Дисплейчик заработал!!!
Нужно было отключить JTAG interface.

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

_________________
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите новичку разобраться с LCD-дисплеем
СообщениеДобавлено: 12 фев 2010, 22:52 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите новичку разобраться с LCD-дисплеем
СообщениеДобавлено: 13 фев 2010, 01:14 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите новичку разобраться с LCD-дисплеем
СообщениеДобавлено: 13 фев 2010, 15:44 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Причем пишет !!!
Daido писал(а):
Прочел курс http://avr123.nm.ru


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

-


Вложения:
jtag.png
jtag.png [ 30.72 КиБ | Просмотров: 4406 ]

_________________
Читайте !
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO