Перейти к содержанию
    

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

 

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

 

Исходники прилагаются...

Text_LCD.rar

Изменено пользователем ILYCHOFF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Инициализация вроде так должна быть:

задержка 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

Изменено пользователем MMP

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Инициализация вроде так должна быть:

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

 

вроде правильно...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

согласен с 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Попробуй поковырять это. 4-бит. 1Х16 какой-то самсунговский индикатор, с которым противно было работать. одна строка, а вывод как в две по 8 но не рядом стоящие.

ИАР. Работает точно. Это просто упражнения для попробовать. Так что оптимизировать-непаханое поле.

m48.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Попробуй поковырять это. 4-бит. 1Х16 какой-то самсунговский индикатор, с которым противно было работать. одна строка, а вывод как в две по 8 но не рядом стоящие.

ИАР. Работает точно. Это просто упражнения для попробовать. Так что оптимизировать-непаханое поле.

m48.rar

 

 

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

 

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

 

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);

}

 

 

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

 

 

 

 

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

 

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

 

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

 

 

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

 

 

Вам не кажется, что уже достаточно навязывать всем этот курс. Я помощи просил, а не вашу "щепотку си"...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задержки реализованы следующим образом

 

 

#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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а если так ?

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);
    }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а если так ?

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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

выкладывал здесь свое, НО обратите внимание на подключение порта, оно не такое как у Вас, поэтому нужно еще подкорректировать Init_instruction и Write_LCD (добавить/убрать __swap_nibbles) ну и все что в хедере тоже ....

http://electronix.ru/forum/index.php?showt...533;entry118409

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

выкладывал здесь свое, НО обратите внимание на подключение порта, оно не такое как у Вас, поэтому нужно еще подкорректировать Init_instruction и Write_LCD (добавить/убрать __swap_nibbles) ну и все что в хедере тоже ....

http://electronix.ru/forum/index.php?showt...533;entry118409

 

По ссылке выбрасывает на ваше сообщение.... непонимаю..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По ссылке выбрасывает на ваше сообщение.... непонимаю..

 

http://electronix.ru/forum/index.php?showtopic=12426&hl=LCD

видимо это я промахнулся :)

А такой вопрос, JTAG в 16 не на порте С ? доки нет под рукой :( а память что-то такое помнит

установка JTD в 1 два раза исправит проблему. или фуз конечно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите здесь, может дело прояснится:

http://electronix.ru/forum/index.php?showtopic=11930

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все равно не работает, может у кого есть исходник рабочий для 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с, а потом уже инициализация.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...