|
LCD и IAR, Не могу заставить работать |
|
|
|
May 30 2006, 05:52
|

Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 5-07-05
Из: Великий Новгород
Пользователь №: 6 536

|
Раньше писал на CV перешел на IAR. Нашел исходник для работы с LCD HD44780, написан был для ICC, переделал под IAR не могу никак заставить работать. Сначала думал что задержки не работают, они были организованы через for, заменил на стандартные, все-равно никакого эффекта, Тестовая плата и индикатор рабочие, старые прошивки сделанные в CV работают нормально. Проц Мега16, кварц 8 МГц, R/W у индикатора висит на земле, шина 4 бит. индикатор WinStar 1602A Помогите разобраться в чем причина. Исходники прилагаются...
Сообщение отредактировал ILYCHOFF - May 30 2006, 06:07
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
May 30 2006, 06:53
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 7-07-05
Из: г.Магнитогорск
Пользователь №: 6 618

|
Инициализация вроде так должна быть: задержка 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 - May 30 2006, 07:03
|
|
|
|
|
May 30 2006, 07:09
|

Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 5-07-05
Из: Великий Новгород
Пользователь №: 6 536

|
Цитата(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 вроде правильно...
|
|
|
|
|
May 30 2006, 07:11
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
согласен с 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;
|
|
|
|
|
May 30 2006, 07:18
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 11-01-06
Из: Украина Ровно
Пользователь №: 13 066

|
Цитата(ILYCHOFF @ May 30 2006, 08:52)  Помогите разобраться в чем причина. Попробуй поковырять это. 4-бит. 1Х16 какой-то самсунговский индикатор, с которым противно было работать. одна строка, а вывод как в две по 8 но не рядом стоящие. ИАР. Работает точно. Это просто упражнения для попробовать. Так что оптимизировать-непаханое поле.
m48.rar ( 3.31 килобайт )
Кол-во скачиваний: 210
|
|
|
|
|
May 30 2006, 07:35
|

Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 5-07-05
Из: Великий Новгород
Пользователь №: 6 536

|
Цитата(aleksey_g @ May 30 2006, 11:18)  Цитата(ILYCHOFF @ May 30 2006, 08:52)  Помогите разобраться в чем причина.
Попробуй поковырять это. 4-бит. 1Х16 какой-то самсунговский индикатор, с которым противно было работать. одна строка, а вывод как в две по 8 но не рядом стоящие. ИАР. Работает точно. Это просто упражнения для попробовать. Так что оптимизировать-непаханое поле.
m48.rar ( 3.31 килобайт )
Кол-во скачиваний: 210Спасибо посмотрю.... Вот переписал инициализацию так 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. Вам не кажется, что уже достаточно навязывать всем этот курс. Я помощи просил, а не вашу "щепотку си"...
|
|
|
|
|
May 30 2006, 07:37
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(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.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
May 30 2006, 08:14
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
а если так ? Код 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); }
|
|
|
|
|
May 30 2006, 08:25
|

Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 5-07-05
Из: Великий Новгород
Пользователь №: 6 536

|
Цитата(&-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, просто сравнить, и задержки посмотреть уже не знаю на что думать...
|
|
|
|
|
May 30 2006, 08:41
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

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

Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 5-07-05
Из: Великий Новгород
Пользователь №: 6 536

|
Цитата(&-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 По ссылке выбрасывает на ваше сообщение.... непонимаю..
|
|
|
|
|
May 30 2006, 08:56
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(ILYCHOFF @ May 30 2006, 11:47)  По ссылке выбрасывает на ваше сообщение.... непонимаю.. http://electronix.ru/forum/index.php?showtopic=12426&hl=LCDвидимо это я промахнулся  А такой вопрос, JTAG в 16 не на порте С ? доки нет под рукой  а память что-то такое помнит установка JTD в 1 два раза исправит проблему. или фуз конечно
|
|
|
|
|
May 30 2006, 11:11
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(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с, а потом уже инициализация.
|
|
|
|
|
May 30 2006, 11:37
|
Местный
  
Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589

|
Цитата(ILYCHOFF @ May 30 2006, 12:25)  Все равно не работает, может у кого есть исходник рабочий для 16*2, просто сравнить, и задержки посмотреть уже не знаю на что думать...  Попробуйте это: Код #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;
--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
|
|
|
|
|
May 30 2006, 12:09
|
Местный
  
Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589

|
То что нельзя записать так: Код ADCSRA.ADEN = 1; А в общем уже кое что. Спасибо.
--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
|
|
|
|
|
Jun 1 2006, 06:42
|

Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 5-07-05
Из: Великий Новгород
Пользователь №: 6 536

|
Всем спасибо за ответы разобрался все заработало как надо... То что у меня получилось прикладываю. Возможно новичкам будет полезно. Собрано на IAR 4.11 Проверено на индикаторе WinStar WH1602A и МЭЛТ MT16S2H У МЭЛТА замечен глюк иногда выскакивают лишние символы там где их быть не должно, правда не знаю видимо он с брачком, он у меня с самого начала так же глючил когда писал на CV со стандартными библиотеками для LCD, хотя может это особенность контроллера который там стоит. А так все, всем спасибо....
|
|
|
|
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|