ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
402926
mazur (18.04.2013 00:12 - 00:17, просмотров: 12974)
По символьным ЖКИ. Не могу пока придти к какому-нибудь выводу. История такая. Наткнулся на одну ссылку, там девайс с использованием ЖКИ. Выхватил одну идейку из этого проекта, достал пылившиеся символьные 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 //========================================================================