ILYCHOFF 0 30 мая, 2006 Опубликовано 30 мая, 2006 (изменено) · Жалоба Раньше писал на CV перешел на IAR. Нашел исходник для работы с LCD HD44780, написан был для ICC, переделал под IAR не могу никак заставить работать. Сначала думал что задержки не работают, они были организованы через for, заменил на стандартные, все-равно никакого эффекта, Тестовая плата и индикатор рабочие, старые прошивки сделанные в CV работают нормально. Проц Мега16, кварц 8 МГц, R/W у индикатора висит на земле, шина 4 бит. индикатор WinStar 1602A Помогите разобраться в чем причина. Исходники прилагаются... Text_LCD.rar Изменено 30 мая, 2006 пользователем ILYCHOFF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MMP 0 30 мая, 2006 Опубликовано 30 мая, 2006 (изменено) · Жалоба Инициализация вроде так должна быть: задержка 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 Изменено 30 мая, 2006 пользователем MMP Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYCHOFF 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Инициализация вроде так должна быть: 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 вроде правильно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
visht 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба согласен с 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_gregul 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Помогите разобраться в чем причина. Попробуй поковырять это. 4-бит. 1Х16 какой-то самсунговский индикатор, с которым противно было работать. одна строка, а вывод как в две по 8 но не рядом стоящие. ИАР. Работает точно. Это просто упражнения для попробовать. Так что оптимизировать-непаханое поле. m48.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYCHOFF 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Помогите разобраться в чем причина. Попробуй поковырять это. 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. Вам не кажется, что уже достаточно навязывать всем этот курс. Я помощи просил, а не вашу "щепотку си"... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BVU 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Раньше писал на CV перешел на IAR. Нашел исходник для работы с LCD HD44780, написан был для ICC, переделал под IAR не могу никак заставить работать. Сначала думал что задержки не работают, они были организованы через for, заменил на стандартные, все-равно никакого эффекта, Тестовая плата и индикатор рабочие, старые прошивки сделанные в CV работают нормально. Проц Мега16, кварц 8 МГц, R/W у индикатора висит на земле, шина 4 бит. индикатор WinStar 1602A ... Если у Вас все работало под CV, то по всей видимости реализация задержек (сам алгоритм в зависимости от тактовой частоты) для IAR реализован неверно и если код инициализации и управления не менялся - других причин быть не может. На форуме вопрос по задержкам для IAR поднимался и разьяснялся (с приведением кода) не один раз. Сделайте поиск для функций: DelayMs и DelayUs. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYCHOFF 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Задержки реализованы следующим образом #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 кто-то здесь на форуме делился проверял вроде правильно работает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
visht 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба а если так ? 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 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба а если так ? 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, просто сравнить, и задержки посмотреть уже не знаю на что думать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
visht 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Все равно не работает, может у кого есть исходник рабочий для 16*2, просто сравнить, и задержки посмотреть уже не знаю на что думать... выкладывал здесь свое, НО обратите внимание на подключение порта, оно не такое как у Вас, поэтому нужно еще подкорректировать Init_instruction и Write_LCD (добавить/убрать __swap_nibbles) ну и все что в хедере тоже .... http://electronix.ru/forum/index.php?showt...533;entry118409 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYCHOFF 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Все равно не работает, может у кого есть исходник рабочий для 16*2, просто сравнить, и задержки посмотреть уже не знаю на что думать... выкладывал здесь свое, НО обратите внимание на подключение порта, оно не такое как у Вас, поэтому нужно еще подкорректировать Init_instruction и Write_LCD (добавить/убрать __swap_nibbles) ну и все что в хедере тоже .... http://electronix.ru/forum/index.php?showt...533;entry118409 По ссылке выбрасывает на ваше сообщение.... непонимаю.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
visht 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба По ссылке выбрасывает на ваше сообщение.... непонимаю.. http://electronix.ru/forum/index.php?showtopic=12426&hl=LCD видимо это я промахнулся :) А такой вопрос, JTAG в 16 не на порте С ? доки нет под рукой :( а память что-то такое помнит установка JTD в 1 два раза исправит проблему. или фуз конечно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BVU 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Посмотрите здесь, может дело прояснится: http://electronix.ru/forum/index.php?showtopic=11930 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Все равно не работает, может у кого есть исходник рабочий для 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с, а потом уже инициализация. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться