По символьным ЖКИ. Не могу пока придти к какому-нибудь выводу. История такая. Наткнулся на одну ссылку, там девайс с использованием ЖКИ. Выхватил одну идейку из этого проекта, достал пылившиеся символьные 20х4 символьные дисплеи ЖКИ и VFD. Про VFD я точно знал из предыдущих опытов, что этому дисплею вообще никакие задержки не нужны. Можно написать библиотечку специально для него, без задержек, можно скормить ему и код для ЖКИ. И с той и с другой времянками будет работать. В ходе опытов увидел, что при переходе с 16 мгц кварца на 4 мгц (STK-500) VFD перестал работать. Обратно на 16 мгц дисплей работает. Ну, думаю, доигрался с программой (делал в проекте код с дефайнами-ключами-переключалками VFD\LCD). Ладно, ставлю LCD. Быстренько правлю код, прошиваю, включаю. Та же байда. В ходе разбирательств выяснилось, что причина в задержке ногодрыгания МК. Если большие задержки, дисплеи перестают работать.
Опыты с VFD показали, что ему вообще никакие задержки не нужны при частоте 16 мгц. вывел на шину данные, стробанул, и все без единого nop-а даже.
Опыты с LCD показали, что ему нужны задержки при ногодрыгании аж в 20 мкс. Что ни хрена не соответствует даташитам.
Пытаюсь понять, я что-то не так делаю или и правда расхождение времянок с даташитами?
Delay: // Задержка для стабилизации уровня сигналов на выводах МК. Примерно 20 мкс.
push r16
ldi r16, 100
Delay_Cycle:
dec r16
brne Delay_Cycle
pop r16
ret
//========================================================================
Send_Com: // Отправка команды.
cbi RS_PORT, RS
rjmp Send_Byte
Send_Data: // Отправка данных.
sbi RS_PORT, RS
rjmp Send_Byte
Send_Com_Init: // Попрограмма отправки команды в секции инициализации.
cbi RS_PORT, RS
Send_Nibble:
in r16, Data_DDR
ori r16, 0xF0
out Data_DDR, r16
in r16, DATA_PORT
andi r16, 0x0F
rjmp Send_Nibble_1
Send_Byte:
in r16, Data_DDR
ori r16, 0xF0
out Data_DDR, r16
in r16, DATA_PORT
andi r16, 0x0F
eor r16, LCD_DATA
andi LCD_DATA, 0x0F
eor r16, LCD_DATA
out DATA_PORT, r16
#if (TYPE_DISPLAY==LCD)
rcall Delay
#else
rcall Empty_Action
#endif
sbi EN_PORT, EN
#if (TYPE_DISPLAY==LCD)
rcall Delay
#else
rcall Empty_Action
#endif
cbi EN_PORT, EN
andi r16, 0x0F
swap LCD_DATA
Send_Nibble_1:
andi LCD_DATA, 0xF0
or r16, LCD_DATA
out DATA_PORT, r16
#if (TYPE_DISPLAY==LCD)
rcall Delay
#else
rcall Empty_Action
#endif
sbi EN_PORT, EN
#if (TYPE_DISPLAY==LCD)
rcall Delay
#else
rcall Empty_Action
#endif
cbi EN_PORT, EN
Data_Port_In:
in r16, Data_DDR
andi r16, 0x0F
out Data_DDR, r16
in r16, Data_Port
andi r16, 0x0F
out Data_Port, r16
ret
//========================================================================