Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S

Непрочитано 31.01.2011, 01:31  
projects.org.ua
Заблокирован
 
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
projects.org.ua на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" projects.org.ua
warel (27.06.2019)
Непрочитано 31.01.2011, 02:02  
jump
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,011
Сказал спасибо: 0
Сказали Спасибо 4,955 раз(а) в 2,379 сообщении(ях)
jump на пути к лучшему
По умолчанию Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S

projects.org.ua,
я не работал пока с арм, но совет таков - поставьте индикатор в проверенную плату с 8мибитником и залейте проверенный код, пусть даже с очень низкой частотой.
т.о. удастся проверить функционирование индикатора и локализовать ошибку в ПО/функционале индикатора
jump вне форума  
Сказали "Спасибо" jump
warel (27.06.2019)
Непрочитано 31.01.2011, 03:02  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S

Сообщение от projects.org.ua Посмотреть сообщение
Вопрос - Где же что не правильно?
Или есть такое что индикатор не поддерживает этот режим?
Так должен - даташит обещает...
А может AT91 тормозит?
По NEWTEC могу сказать, что 1602 подключенный по старшим 4-ём разрядам работает без проблем.
st_1 вне форума  
Сказали "Спасибо" st_1
warel (27.06.2019)
Непрочитано 31.01.2011, 09:40  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S

Длинные тексты не читаю, скорее всего там правильно.
Попробуй перейти на обмен с хэндшейком. В моих поделках ни разу не подводил. Не забудь про таймауты на ожиданиях и эксепшны по зависанию дисплея.
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
warel (27.06.2019)
Непрочитано 31.01.2011, 10:57  
projects.org.ua
Заблокирован
 
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
projects.org.ua на пути к лучшему
По умолчанию Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S

Сообщение от jump Посмотреть сообщение
projects.org.ua,
я не работал пока с арм, но совет таков - поставьте индикатор в проверенную плату с 8мибитником и залейте проверенный код, пусть даже с очень низкой частотой.
т.о. удастся проверить функционирование индикатора и локализовать ошибку в ПО/функционале индикатора
плата проверенная, тем более что это моя разработака, я его уже и вдоль и поперк знаю, и кучу раз юзал, на плату я не грешу вообще
я писал - что код для 8битного режима - работает отлично, тоесть и сам индикатор рабочий полностью, там более что я его до этого применял на другом своем проекте, но там он в 8ми битном режиме работал.
а вот сомнения у меня на счет его инициализации, но делал я все как в даташите. Причем что в даташитена этот индикатор инициализация кардинально отличается от аналогичных(особенно МЭЛТоских)
так что я грешу или на инициализацию или на особенность передачи уже данных в 4бит режиме.
projects.org.ua вне форума  
Сказали "Спасибо" projects.org.ua
warel (27.06.2019)
Непрочитано 31.01.2011, 10:58  
projects.org.ua
Заблокирован
 
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
projects.org.ua на пути к лучшему
По умолчанию Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S

Сообщение от st_1 Посмотреть сообщение
А может AT91 тормозит?
По NEWTEC могу сказать, что 1602 подключенный по старшим 4-ём разрядам работает без проблем.
AT91 точно не тормозит, так как 8битном режиме работает, да и другой код у меня успешно выполняется, ADC, PWM...
скорее всего ошибка в коде вперехлест с его медленность. Но где в коде не могу найти.
projects.org.ua вне форума  
Сказали "Спасибо" projects.org.ua
warel (27.06.2019)
Непрочитано 31.01.2011, 11:00  
projects.org.ua
Заблокирован
 
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
projects.org.ua на пути к лучшему
По умолчанию Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S

Сообщение от ut1wpr Посмотреть сообщение
Длинные тексты не читаю, скорее всего там правильно.
Попробуй перейти на обмен с хэндшейком. В моих поделках ни разу не подводил. Не забудь про таймауты на ожиданиях и эксепшны по зависанию дисплея.
таймауты уже стоят итак бешанные, очень огромные.
сорри, а что есть термин - хэндшейк? что вы имеете ввиду?
projects.org.ua вне форума  
Сказали "Спасибо" projects.org.ua
warel (27.06.2019)
Непрочитано 31.01.2011, 11:54  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S

Сообщение от projects.org.ua Посмотреть сообщение
таймауты уже стоят итак бешанные, очень огромные.
сорри, а что есть термин - хэндшейк? что вы имеете ввиду?
Handshake - рукопожатие. Протокол с квитированием. В данном случае ожидание бита готовности.
Таймауты при этом - это не время задержек на отработку команд дисплеем, а временнЫе лимиты на ожидание подтверждения во избежание зависаний устройства.
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
warel (27.06.2019)
Непрочитано 31.01.2011, 12:13  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S

Сообщение от projects.org.ua Посмотреть сообщение
скорее всего ошибка в коде вперехлест с его медленность. Но где в коде не могу найти.
Совет вам, возьмите другой индикатор, другого производителя, тогда хоть будет уверенность в коде. Сегодня утром вспомнил, были две жалобы на "восьмёрки" купленные в кошмардрале, как найду ссылку отпишусь.
st_1 вне форума  
Сказали "Спасибо" st_1
warel (27.06.2019)
Непрочитано 31.01.2011, 12:14  
projects.org.ua
Заблокирован
 
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
projects.org.ua на пути к лучшему
По умолчанию Re: ARM7MODA - Запуск LCD в 4-bit mode на AT91SAM7S

Сообщение от ut1wpr Посмотреть сообщение
Handshake - рукопожатие. Протокол с квитированием. В данном случае ожидание бита готовности.
Таймауты при этом - это не время задержек на отработку команд дисплеем, а временнЫе лимиты на ожидание подтверждения во избежание зависаний устройства.
Видимо наверно все таки прийдется это сделать, так как действительно дисплеи бывают разные, на одних, например на Болиминовских все замечательно, а на некоторых типа этого всплывают артефакты какие то...
Но в данном случае чтото похоже не так толи с инициализацией толи с функцией отправки даннык или команд

Люди, а какие вы используете значения посылаеммык данных комманд в инициализации, приведите плиз свои примеры?
projects.org.ua вне форума  
Сказали "Спасибо" projects.org.ua
warel (27.06.2019)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите настроить АЦП в Atmega32 sergx1300 Микроконтроллеры, АЦП, память и т.д 72 09.11.2010 00:28
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03


Часовой пояс GMT +4, время: 12:46.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.