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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 7,987
Сказал спасибо: 0
Сказали Спасибо 4,943 раз(а) в 2,371 сообщении(ях)
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,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
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.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 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.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 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,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
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, время: 05:12.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot