Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LCD и IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ILYCHOFF
Раньше писал на CV перешел на IAR. Нашел исходник для работы с LCD HD44780, написан был для ICC, переделал под IAR не могу никак заставить работать. Сначала думал что задержки не работают, они были организованы через for, заменил на стандартные, все-равно никакого эффекта, Тестовая плата и индикатор рабочие, старые прошивки сделанные в CV работают нормально. Проц Мега16, кварц 8 МГц, R/W у индикатора висит на земле, шина 4 бит. индикатор WinStar 1602A

Помогите разобраться в чем причина.

Исходники прилагаются...
MMP
Инициализация вроде так должна быть:
задержка 15 мс
RS = 0;
задержка 5 мс
DB4,DB5 = 1;
задержка 5 мс
DB4,DB5 = 1;
задержка 5 мс
DB5 = 1
задержка 5 мс
DB5 = 1;
DB7 = 1;
задержка 5 мс
DB4 - DB7 = 0;
DB7,DB6 = 1
задержка 5 мс
DB4 - DB7 = 0;
DB5,DB6 = 1
задержка 5 мс
RS = 1
ILYCHOFF
Цитата(MMP @ May 30 2006, 10:53) *
Инициализация вроде так должна быть:
LCDDDR = 0xF9;


// LCD pins
#define DB7 0x80
#define DB6 0x40
#define DB5 0x20
#define DB4 0x10
#define E 0x04
#define RS 0x01


// Port
#define LCDDDR DDRC
#define LCDPORT PORTC
#define LCDPIN PINC

//--------------------------------------

LCDDDR=0xF5 // 11110101

вроде правильно...
andrvisht
согласен с MMP насчет DB4 DB5
вот только насчет задержек когда я писал то у меня были такие данные
Код
  // Power on LCD Delay > 45ms
  __delay_cycles(100_ms);
  //***Reset Sequence***
  Init_instruction(0x03);
  //Delay > 4.1ms
  __delay_cycles(4_ms);
  __delay_cycles(100_us);
  Init_instruction(0x03);
  //Delay > 100mks
  __delay_cycles(100_us);
  Init_instruction(0x03);
  //Delay > 40mks
  __delay_cycles(40_us);
  Init_instruction(0x02);
  //Delay > 40mks
  __delay_cycles(40_us);
  //***End Reset Sequence***

и возможно еще добавить задержку на E
Код
  //Up to LCD_E = 1 Delay > 140ns
  __delay_cycles(140_ns);
  LCD_E = 1;
  //Up to LCD_E = 0 Delay > 450ns
  __delay_cycles(450_ns);
  LCD_E = 0;
aleksey_g
Цитата(ILYCHOFF @ May 30 2006, 08:52) *
Помогите разобраться в чем причина.


Попробуй поковырять это. 4-бит. 1Х16 какой-то самсунговский индикатор, с которым противно было работать. одна строка, а вывод как в две по 8 но не рядом стоящие.
ИАР. Работает точно. Это просто упражнения для попробовать. Так что оптимизировать-непаханое поле.
Нажмите для просмотра прикрепленного файла
ILYCHOFF
Цитата(aleksey_g @ May 30 2006, 11:18) *
Цитата(ILYCHOFF @ May 30 2006, 08:52) *

Помогите разобраться в чем причина.


Попробуй поковырять это. 4-бит. 1Х16 какой-то самсунговский индикатор, с которым противно было работать. одна строка, а вывод как в две по 8 но не рядом стоящие.
ИАР. Работает точно. Это просто упражнения для попробовать. Так что оптимизировать-непаханое поле.
Нажмите для просмотра прикрепленного файла



Спасибо посмотрю....

Вот переписал инициализацию так

void lcd_init(void)
{
delay_ms(50);
LCDDDR = 0xF5;
LCDPORT = 0x00;
delay_us(100);
LCDPORT = (DB5 + DB4);
LCDPORT |= E;
LCDPORT &= ~E;
delay_us(100);
LCDPORT |= E;
LCDPORT &= ~E;
delay_us(100);
LCDPORT |= E;
LCDPORT &= ~E;
delay_us(100);
LCDPORT = DB5;
LCDPORT |= E;
LCDPORT &= ~E;
delay_us(40);
lcd_write_byte(CTRL,0x28);
lcd_write_byte(CTRL,0x0c);
lcd_write_byte(CTRL,0x01);
delay_us(500);
lcd_write_byte(CTRL,0x06);
delay_us(50);
}


все равно не работает...




Цитата(A_Bolshev @ May 30 2006, 11:17) *
Цитата(ILYCHOFF @ May 30 2006, 09:52) *

Раньше писал на CV перешел на IAR.

Нашел исходник для работы с LCD HD44780, написан был для ICC, переделал под IAR не могу никак заставить работать.

Помогите разобраться в чем причина.



попробуйте симулировать в VMLAB - там есть остановка по неверным командам на LCD.



Вам не кажется, что уже достаточно навязывать всем этот курс. Я помощи просил, а не вашу "щепотку си"...
BVU
Цитата(ILYCHOFF @ May 30 2006, 09:52) *
Раньше писал на CV перешел на IAR. Нашел исходник для работы с LCD HD44780, написан был для ICC, переделал под IAR не могу никак заставить работать. Сначала думал что задержки не работают, они были организованы через for, заменил на стандартные, все-равно никакого эффекта, Тестовая плата и индикатор рабочие, старые прошивки сделанные в CV работают нормально. Проц Мега16, кварц 8 МГц, R/W у индикатора висит на земле, шина 4 бит. индикатор WinStar 1602A
...

Если у Вас все работало под CV, то по всей видимости реализация задержек (сам алгоритм в зависимости от тактовой частоты) для IAR реализован неверно и если код инициализации и управления не менялся - других причин быть не может. На форуме вопрос по задержкам для IAR поднимался и разьяснялся (с приведением кода) не один раз. Сделайте поиск для функций: DelayMs и DelayUs.
ILYCHOFF
Задержки реализованы следующим образом


#ifndef DELAY_H
#define DELAY_H

#include <inavr.h>

#define CPU_CLK_Hz 8000000
#define CPU_CLK_kHz (unsigned long)(CPU_CLK_Hz/1000)

#define delay_ns(x) __delay_cycles(x*CPU_CLK_kHz*0.000001)
#define delay_us(x) __delay_cycles(x*(CPU_CLK_Hz/1000000))
#define delay_ms(x) __delay_cycles(x*(CPU_CLK_Hz/1000))
#define delay_s(x) __delay_cycles(x*CPU_CLK_Hz)

#endif

кто-то здесь на форуме делился проверял вроде правильно работает
andrvisht
а если так ?
Код
void lcd_init(void)
    {
    delay_ms(50);
    LCDDDR = 0xF5;
    LCDPORT = (DB5 + DB4);
    delay_us(100);
    LCDPORT |= E;
    delay_us(450);
    LCDPORT &= ~E;
    delay_ms(5);
    LCDPORT |= E;
    delay_us(450);
    LCDPORT &= ~E;
    delay_us(100);
    LCDPORT |= E;
    delay_us(450);
    LCDPORT &= ~E;
    delay_us(100);
    LCDPORT = DB5;
    delay_us(100);
    LCDPORT |= E;
    delay_us(450);
    LCDPORT &= ~E;
    delay_us(40);
    lcd_write_byte(CTRL,0x28);
    lcd_write_byte(CTRL,0x0c);
    lcd_write_byte(CTRL,0x01);
    delay_us(500);
    lcd_write_byte(CTRL,0x06);
    delay_us(50);
    }
ILYCHOFF
Цитата(&-rey @ May 30 2006, 12:14) *
а если так ?
Код
void lcd_init(void)
    {
    delay_ms(50);
    LCDDDR = 0xF5;
    LCDPORT = (DB5 + DB4);
    delay_us(100);
    LCDPORT |= E;
    delay_us(450);
    LCDPORT &= ~E;
    delay_ms(5);
    LCDPORT |= E;
    delay_us(450);
    LCDPORT &= ~E;
    delay_us(100);
    LCDPORT |= E;
    delay_us(450);
    LCDPORT &= ~E;
    delay_us(100);
    LCDPORT = DB5;
    delay_us(100);
    LCDPORT |= E;
    delay_us(450);
    LCDPORT &= ~E;
    delay_us(40);
    lcd_write_byte(CTRL,0x28);
    lcd_write_byte(CTRL,0x0c);
    lcd_write_byte(CTRL,0x01);
    delay_us(500);
    lcd_write_byte(CTRL,0x06);
    delay_us(50);
    }


Все равно не работает, может у кого есть исходник рабочий для 16*2, просто сравнить, и задержки посмотреть уже не знаю на что думать...

help.gif
andrvisht
Цитата(ILYCHOFF @ May 30 2006, 11:25) *
Все равно не работает, может у кого есть исходник рабочий для 16*2, просто сравнить, и задержки посмотреть уже не знаю на что думать...

выкладывал здесь свое, НО обратите внимание на подключение порта, оно не такое как у Вас, поэтому нужно еще подкорректировать Init_instruction и Write_LCD (добавить/убрать __swap_nibbles) ну и все что в хедере тоже ....
http://electronix.ru/forum/index.php?showt...533;entry118409
ILYCHOFF
Цитата(&-rey @ May 30 2006, 12:41) *
Цитата(ILYCHOFF @ May 30 2006, 11:25) *

Все равно не работает, может у кого есть исходник рабочий для 16*2, просто сравнить, и задержки посмотреть уже не знаю на что думать...

выкладывал здесь свое, НО обратите внимание на подключение порта, оно не такое как у Вас, поэтому нужно еще подкорректировать Init_instruction и Write_LCD (добавить/убрать __swap_nibbles) ну и все что в хедере тоже ....
http://electronix.ru/forum/index.php?showt...533;entry118409


По ссылке выбрасывает на ваше сообщение.... непонимаю..
andrvisht
Цитата(ILYCHOFF @ May 30 2006, 11:47) *
По ссылке выбрасывает на ваше сообщение.... непонимаю..


http://electronix.ru/forum/index.php?showtopic=12426&hl=LCD
видимо это я промахнулся smile.gif
А такой вопрос, JTAG в 16 не на порте С ? доки нет под рукой sad.gif а память что-то такое помнит
установка JTD в 1 два раза исправит проблему. или фуз конечно
BVU
Посмотрите здесь, может дело прояснится:
http://electronix.ru/forum/index.php?showtopic=11930
defunct
Цитата(ILYCHOFF @ May 30 2006, 11:25) *
Все равно не работает, может у кого есть исходник рабочий для 16*2, просто сравнить, и задержки посмотреть уже не знаю на что думать...

есть но под arm.. наврятли оно вам подойдет.

функция инициализации такая:

Код
#define MICRODELAY 30
#define MILLYDELAY 100

void LCD_Init(void)
{
   delay_ms( MILLYDELAY );
   IODIR0 |= LCDPins;
   LCD_OutData( 0x0C ); // Включение экрана

   IOCLR0 = pLCD_RS | pLCD_RW;
   IOSET0 = pLCD_E;
   delay_mks( MICRODELAY );
   IOCLR0 = pLCD_E;
   delay_ms( MICRODELAY );
// wait a few

   LCD_OutData( 0x3C ); // Задание функций и шрифтов
   IOSET0 = pLCD_E;
   delay_mks( MICRODELAY );
   IOCLR0 = pLCD_E;
   delay_ms( MICRODELAY );
// wait a few

   LCD_Clear();
}


Ну еще не забыть перед инициализацией "прогреться" LCD (разным по разному) я обычно отвожу ~0.5с, а потом уже инициализация.
otrog
Цитата(ILYCHOFF @ May 30 2006, 12:25) *
Все равно не работает, может у кого есть исходник рабочий для 16*2, просто сравнить, и задержки посмотреть уже не знаю на что думать...

help.gif
Попробуйте это:
Код
#include <avr_macros.h>
#include "delay.h"

#define EN      PORTD
#define EN_Bit  7
#define RS      PORTD
#define RS_Bit  5

#define D      PORTB

#define lcd_delay 15

// Запись в lcd: mode=0 команда, mode=1 данные
void lcd_write(unsigned char data, unsigned char mode)
{
  if (mode) {SETBIT(RS,RS_Bit);} else {CLEARBIT(RS,RS_Bit);}
  SETBIT(EN,EN_Bit);
  D = (D & 0xF0) | (data >> 4); // старший ниббл
  delay_us(lcd_delay);
  CLEARBIT(EN,EN_Bit);
  delay_us(lcd_delay);
  D = (D & 0xF0) | (data & 0x0F); // младший ниббл
  SETBIT(EN,EN_Bit);
  delay_us(lcd_delay);
  CLEARBIT(EN,EN_Bit);
  delay_us(lcd_delay*5);
}

void lcd_init(void)
{
  lcd_write(0x33, 0); delay_ms(5);
  lcd_write(0x32, 0); lcd_write(0x28, 0); // 4 бит, 2 строки
  lcd_write(0x08, 0); // полное выключение дисплея
  lcd_write(0x01, 0); delay_ms(5); // очистка дисплея
  lcd_write(0x06, 0); // сдвиг курсора вправо
  lcd_write(0x0C, 0); // включение дисплея, мигающий курсор
  
//  InitCGram();
}
Работает так например:
Код
lcd_init();
lcd_write('Z', 1);

ПС В lcd_init комментарии некорректны.
ППС А за delay.h большое спасибо. Еще бы найти что-нибудь чтобы можно было в IAR-е писать PORTD.3 = 1;
ILYCHOFF
А что вам мешает писать

PORTB_Bit1=1;
~PORTB_Bit1;
otrog
То что нельзя записать так:
Код
ADCSRA.ADEN = 1;

А в общем уже кое что. Спасибо.
prottoss
Привет всем!



Не вдавался в подробности обсуждения, но может пригодится страждущим мой исходник. С помощью многочисленных #define перестраивается под любой мыслимый дисплей на основе HD44780 (только с одним чипом!, т.е кроме индикаторов 4х40). В исходнике только примитивы - отправить команду, прочитать статус, отправить данные, прочитать данные. Вполне достаточно, что бы приступить к плодотворной работе с дисплеем без экспериментов. Поддерживает 4-х и 8-и битную шину данных... Сварено на IAR C for AVR 4.10B. Как всегда, мои подробнейшие комментарии)))

http://electronix.ru/forum/index.php?showt...opid=118553#
WHALE
А ведь вам A_Bolshev ,нисмотря не на что,неплохой совет дал-воспользоваться в VMLAB функцией виртуального lcd.Очень классная штука,подключается за 5 минут и симулирует на 100%-останов по недопустимым командам и даже ошибки тайминга.Воспользуйтесь-не пожалеете.Удачи.
ILYCHOFF
Всем спасибо за ответы разобрался все заработало как надо...
То что у меня получилось прикладываю. Возможно новичкам будет полезно. Собрано на IAR 4.11
Проверено на индикаторе WinStar WH1602A

и МЭЛТ MT16S2H У МЭЛТА замечен глюк иногда выскакивают лишние символы там где их быть не должно, правда не знаю видимо он с брачком, он у меня с самого начала так же глючил когда писал на CV со стандартными библиотеками для LCD, хотя может это особенность контроллера который там стоит.

А так все, всем спасибо....
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.