Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
31.01.2011, 01:31
|
|
Заблокирован
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
|
ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S
Запускаю на модуле ARM7MODA LCD индикатор из серии KS0066 - в 4bit mode. Режим этот нужен, так что вопрос принципиальный.
Уже столько камней об него заточено что и писать нет смысла, однако есть какие то грабли при запуске, и я вот не пойму то ли это у него не так что, то то ли я жутко торможу, надеюсь что первое.
Жутко принципиальный момент, по этому хочется его запустить.
У меня подозрения что гдето я допустил ошибку но не могу ее найти... или чтот с индикатором.
Итак, 8bit mode - запустился на раз плюнуть, код я подставил свой старый, уже рабочий. Но был затык, и как оказалось, выяснил опытным путем, что индикатор мне попался жуткий тормозяра... каких я не встречал до этого.
Индикатор NEWTEC NC08082A. Ну то ладно, главное что нашел виновника, это - его медлительность.
Потом залез в его даташит, там приведены намного меньшие таймауты необходимые для работы... А по моему коду получается что нужно намного большие временные периоды между RS -› E -› Data.
А вот 4bit mode - напрочь не хочет заводиться. И вот тут у меня какой то шоковый ступор. Так как 4 бит я уже запускал несколько штук ранее. А на этом индикаторе - не получается.
В общем вот я вам и пишу, взгляните на код и скажите, это я где то торможу или для этого индикатора нужно что-то отличное от даташита...
На не оптимизированный код в 4bit mode не обращайте внимания, это я уже ради удобства выснения проблемы все перенес в один фрагмент
Код:
|
#define _RS _B8
#define _E _B9
#define LCD_TIME_FAST (10)
#define LCD_TIME_SLOW (50)
#define LCD_TIME LCD_TIME_SLOW
...
...
//-----------------------------------------------------------
void LCD_Config(void)
{
#ifdef LCD_4_BITS
AT91PS_SYS regs = AT91C_BASE_SYS;
tick(600*LCD_TIME); regs-›PIOA_ODSR &=~_RS; // RS=0;
udelay();
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (0);
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
udelay();
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (0);
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
udelay();
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (0);
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
delay();
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (0);
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
delay();
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (0x20);
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
udelay();
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (0x80);
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
delay();
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (0x00);
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
udelay();
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (0x80);
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
delay();
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (0x00);
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
udelay();
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (0x10);
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
delay();
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (0x00);
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
udelay();
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (0x30);
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
delay();
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_RS; // RS=0;
#endif /*LCD_4_BITS*/
#ifdef LCD_8_BITS
unsigned char i=0, init_value[] = { 0x01, 0x02, 0x06, 0x0c, 0x14, 0x38 }; /* 16x2 */
for (i=0; i‹sizeof(init_value); i++) {
lcd_cmd ( init_value[i] );
}
#endif /*LCD_8_BITS*/
} /* LCD_Config() */
//-----------------------------------------------------------
void lcd_cmd (unsigned char ch)
{
AT91PS_SYS regs = AT91C_BASE_SYS;
#ifdef LCD_4_BITS
udelay();
tick(600*LCD_TIME); regs-›PIOA_ODSR &=~_RS;// RS=0;
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (ch&0xf0);
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
udelay();
tick(60*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(60*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |= (ch&0x0f)‹‹4;
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_RS; // RS=0;
#endif /*LCD_4_BITS*/
#ifdef LCD_8_BITS
tick(600*LCD_TIME); regs-›PIOA_ODSR &=~_RS;// RS=0;
tick(6*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(6*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff00;
tick(6*LCD_TIME); regs-›PIOA_ODSR |= ch;
tick(6*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
tick(6*LCD_TIME); regs-›PIOA_ODSR &=~_RS; // RS=0;
#endif /*LCD_8_BITS*/
} /* lcd_cmd() */
//-----------------------------------------------------------
// Set address of first byte on desired row
void lcd_xy( unsigned char y, unsigned char x )
{
unsigned char LCD_ROW_ADDRESS[4] = { 0x00, 0x40, 0x14, 0x54 };
unsigned char AddrXYData;
AT91PS_SYS regs = AT91C_BASE_SYS;
AddrXYData = LCD_ROW_ADDRESS[y]+x;
#ifdef LCD_4_BITS
tick(60*LCD_TIME); regs-›PIOA_ODSR &=~_RS; // RS=0;
tick(40*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(40*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |=0x80|(AddrXYData&0xF0);
tick(40*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
tick(40*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(40*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |=(AddrXYData&0x0F)‹‹4;
tick(40*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
#endif /*LCD_4_BITS*/
#ifdef LCD_8_BITS
tick(6*LCD_TIME); regs-›PIOA_ODSR &=~_RS;// RS=0;
tick(4*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(4*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff00;
tick(1); regs-›PIOA_ODSR |=(0x80|AddrXYData);
tick(4*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
#endif /*LCD_8_BITS*/
} /* lcd_xy() */
//-----------------------------------------------------------
/* Show message on LCD*/
void lcd_char( unsigned char value )
{
AT91PS_SYS regs = AT91C_BASE_SYS;
unsigned char kod;
kod = value;
kod = lcd_recode( value );
#ifdef LCD_4_BITS
tick(30*LCD_TIME); regs-›PIOA_ODSR |=_RS; // RS=1;
tick(30*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(20*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |=((kod &0xF0));
tick(20*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
tick(30*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(20*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff0f;
tick(1); regs-›PIOA_ODSR |=((kod &0x0F)‹‹4);
tick(20*LCD_TIME); regs-›PIOA_ODSR &=~_E; // E=0;
#endif /*LCD_4_BITS*/
#ifdef LCD_8_BITS
tick(3*LCD_TIME); regs-›PIOA_ODSR |=_RS; // RS=1;
tick(3*LCD_TIME); regs-›PIOA_ODSR |=_E; // E=1;
tick(2*LCD_TIME); regs-›PIOA_ODSR &= 0xffffff00;
tick(1); regs-›PIOA_ODSR |= kod;
tick(2*LCD_TIME); regs-›PIOA_ODSR &= ~_E; // E=0;
#endif /*LCD_8_BITS*/
} /* lcd_char() */
...
... |
...тормознутость можете сами заметить по 60*LCD_TIME
Вопрос - Где же что не правильно?
Или есть такое что индикатор не поддерживает этот режим?
Так должен - даташит обещает...
Последний раз редактировалось projects.org.ua; 31.01.2011 в 12:21.
|
|
|
Сказали "Спасибо" projects.org.ua
|
|
|
31.01.2011, 02:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 7,987
Сказал спасибо: 0
Сказали Спасибо 4,943 раз(а) в 2,371 сообщении(ях)
|
Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S
projects.org.ua,
я не работал пока с арм, но совет таков - поставьте индикатор в проверенную плату с 8мибитником и залейте проверенный код, пусть даже с очень низкой частотой.
т.о. удастся проверить функционирование индикатора и локализовать ошибку в ПО/функционале индикатора
|
|
|
|
31.01.2011, 03:02
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S
Сообщение от projects.org.ua
|
Вопрос - Где же что не правильно?
Или есть такое что индикатор не поддерживает этот режим?
Так должен - даташит обещает...
|
А может AT91 тормозит?
По NEWTEC могу сказать, что 1602 подключенный по старшим 4-ём разрядам работает без проблем.
|
|
|
|
31.01.2011, 09:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S
Длинные тексты не читаю, скорее всего там правильно.
Попробуй перейти на обмен с хэндшейком. В моих поделках ни разу не подводил. Не забудь про таймауты на ожиданиях и эксепшны по зависанию дисплея.
|
|
|
|
31.01.2011, 10:57
|
|
Заблокирован
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
|
Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S
Сообщение от jump
|
projects.org.ua,
я не работал пока с арм, но совет таков - поставьте индикатор в проверенную плату с 8мибитником и залейте проверенный код, пусть даже с очень низкой частотой.
т.о. удастся проверить функционирование индикатора и локализовать ошибку в ПО/функционале индикатора
|
плата проверенная, тем более что это моя разработака, я его уже и вдоль и поперк знаю, и кучу раз юзал, на плату я не грешу вообще
я писал - что код для 8битного режима - работает отлично, тоесть и сам индикатор рабочий полностью, там более что я его до этого применял на другом своем проекте, но там он в 8ми битном режиме работал.
а вот сомнения у меня на счет его инициализации, но делал я все как в даташите. Причем что в даташитена этот индикатор инициализация кардинально отличается от аналогичных(особенно МЭЛТоских)
так что я грешу или на инициализацию или на особенность передачи уже данных в 4бит режиме.
|
|
|
Сказали "Спасибо" projects.org.ua
|
|
|
31.01.2011, 10:58
|
|
Заблокирован
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
|
Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S
Сообщение от st_1
|
А может AT91 тормозит?
По NEWTEC могу сказать, что 1602 подключенный по старшим 4-ём разрядам работает без проблем.
|
AT91 точно не тормозит, так как 8битном режиме работает, да и другой код у меня успешно выполняется, ADC, PWM...
скорее всего ошибка в коде вперехлест с его медленность. Но где в коде не могу найти.
|
|
|
Сказали "Спасибо" projects.org.ua
|
|
|
31.01.2011, 11:00
|
|
Заблокирован
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
|
Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S
Сообщение от ut1wpr
|
Длинные тексты не читаю, скорее всего там правильно.
Попробуй перейти на обмен с хэндшейком. В моих поделках ни разу не подводил. Не забудь про таймауты на ожиданиях и эксепшны по зависанию дисплея.
|
таймауты уже стоят итак бешанные, очень огромные.
сорри, а что есть термин - хэндшейк? что вы имеете ввиду?
|
|
|
Сказали "Спасибо" projects.org.ua
|
|
|
31.01.2011, 11:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S
Сообщение от projects.org.ua
|
таймауты уже стоят итак бешанные, очень огромные.
сорри, а что есть термин - хэндшейк? что вы имеете ввиду?
|
Handshake - рукопожатие. Протокол с квитированием. В данном случае ожидание бита готовности.
Таймауты при этом - это не время задержек на отработку команд дисплеем, а временнЫе лимиты на ожидание подтверждения во избежание зависаний устройства.
|
|
|
|
31.01.2011, 12:13
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S
Сообщение от projects.org.ua
|
скорее всего ошибка в коде вперехлест с его медленность. Но где в коде не могу найти.
|
Совет вам, возьмите другой индикатор, другого производителя, тогда хоть будет уверенность в коде. Сегодня утром вспомнил, были две жалобы на "восьмёрки" купленные в кошмардрале, как найду ссылку отпишусь.
|
|
|
|
31.01.2011, 12:14
|
|
Заблокирован
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
|
Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S
Сообщение от ut1wpr
|
Handshake - рукопожатие. Протокол с квитированием. В данном случае ожидание бита готовности.
Таймауты при этом - это не время задержек на отработку команд дисплеем, а временнЫе лимиты на ожидание подтверждения во избежание зависаний устройства.
|
Видимо наверно все таки прийдется это сделать, так как действительно дисплеи бывают разные, на одних, например на Болиминовских все замечательно, а на некоторых типа этого всплывают артефакты какие то...
Но в данном случае чтото похоже не так толи с инициализацией толи с функцией отправки даннык или команд
Люди, а какие вы используете значения посылаеммык данных комманд в инициализации, приведите плиз свои примеры?
|
|
|
Сказали "Спасибо" projects.org.ua
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:12.
|
|