Показаны сообщения с ярлыком mikropascal lcd. Показать все сообщения
Показаны сообщения с ярлыком mikropascal lcd. Показать все сообщения

пятница, 13 января 2017 г.

Результаты разработки своей библиотеки для HD44780

Итак, можно подводить первые итоги разработки своей библиотеки для LCD на базе HD44780 и совместимых. Тайминги работы процедур и функций программы стали максимально близки к расчетным.


Режимы: 4-битный обмен, контроль занятости отсутствует (R/W на массе), произвольное назначение линий на выводы МК, тайминги библиотеки приблизительно соответствуют рекомендациям даташита на HD44780. В проекте применен китайский дисплей за $2. Какой пиздец был раньше Как было раньше, вы можете посмотреть в заметке Тайминги библиотеки LCD.

четверг, 12 января 2017 г.

Тайминги библиотеки LCD

По моим расчетам, тайминги отрисовки LCD должны укладываться в сетку диспетчера. Вернее, должны были укладываться. Но встроенная в mikroPascal библиотека Lcd подбросила мне свои коррективы. Там и инициализация чуть отличается от даташита HD44780, и тайминги выполнения команд, похоже на то, очень «щадящие». В итоге имеем 11 мс там, где ожидалось менее 1 мс. Буду переводить проект на свою свеженаписанную библиотеку ULCD.


среда, 11 января 2017 г.

В задумчивости

В глубокой задумчивости пребываю. Есть таймер, запрограммированный на 1 мс. Есть обработчик прерывания для этого таймера. В нем код:


Примитивнее ничего не придумать: каждый тик прерывания в линию ButtonSelect выдается строб длительностью 1 микросекунда. Всё.

Смотрим эту линию анализатором:


Но как? Откуда такая скважность? Выход в режиме триггера? Но как? Откуда?


вторник, 10 января 2017 г.

Загадки во тьме

Переписал управление – все должно крутиться через табличный диспетчер, тактируемый прерыванием... и столкнулся с некоторыми странностями: тайминги отличаются от ожидаемых, странные лакуны в обмене с дисплеем и т.п. Пришлось до предела урезать код, чтобы было легче найти «виновника торжества». Пока что не нашел, но ищу.


UPD. Странности с диспетчером устранил, но причину увеличенных интервалов (должно быть 4 мс, а не 5 с хвостиком) пока не нашел. Вполне возможно, что в этом виноват кварц. Для проверки надо будет посмотреть тайминги при тактировании МК от от внутреннего генератора 8 МГц.


UPD2. Проблема не в частоте генератора. Очень интересно, очень...

понедельник, 9 января 2017 г.

Несколько слов о встроенных задержках в mikroPascal

В mikroPascal имеется ряд удобных процедур (или функций, если говорить применительно к функциональности этих элементов, а не к их синтаксису) для отработки временных задержек. Народ их активно использует, но... Впрочем, дальше вы всё увидите сами:


Возможное предположение здесь, как правило, одно: кварц с Ali завелся не на той гармонике (и далее должна быть пространная ругань в адрес продавца, минимум на половину страницы). Но! Более длинные задержки отрабатываются более-менее корректно (с погрешностью ± несколько процентов). Получается, что короткую задержку в 1 us необходимо реализовывать как-то иначе, например, через процедуру Delay_us(1) ­– ошибка при этом тоже будет, но все-таки она будет меньше.


Надо будет когда-то потом посмотреть эту погрешность и на частоте встроенного генератора 8 МГц, но уже и так понятно, что в критичных к точности таймингов случаях лучше реализовывать короткие задержки своей процедурой, например, через свободный таймер с контролем флага в цикле.

ps. Для анализа таймингов использовался 8-канальный логический анализатор Saleae logic.

суббота, 30 января 2016 г.

И о замене Lcd_Out (MikroPascal)

Обещанный код для замены:

// Lcd_Out_N – замена штатной процедуры Lcd_Out библиотеки Lcd
// row - номер строки
// column - номер позиции в строке
// msg - строка как символьный массив [0..255]
// max_len - максимальная длина строки (для формата 0..x, т.е. для string[4] будет не 5, а 4
procedure Lcd_Out_N(row,column:byte; msg:^byte; max_len:byte);
var
 i : byte;
begin
 i := 0;
 while (msg^ <> 0) and (i < max_len) do
 begin
  if i = 0 then Lcd_Chr(row,column+i,msg^) else Lcd_Chr_CP(msg^);
  inc(msg);
  inc(i);
 end;
end;

// Lcd_Out_NC – замена штатной процедуры Lcd_Out библиотеки Lcd для констант
// row - номер строки
// column - номер позиции в строке
// msg - строка как символьный массив [0..255]
// max_len - максимальная длина строки (для формата 0..x, т.е. для string[4] будет не 5, а 4
procedure Lcd_Out_NC(row,column:byte; const msg:^byte; max_len:byte);
var
 i : byte;
begin
 i := 0;
 while (msg^ <> 0) and (i < max_len) do
 begin
  if i = 0 then Lcd_Chr(row,column+i,msg^) else Lcd_Chr_CP(msg^);
  inc(msg);
  inc(i);
 end;
end;

вторник, 26 января 2016 г.

mikroPascal: снова о выводе строк через Lcd_Out

Надо признать: я был тогда излишне самонадеян и горд. Опять поймал странные иррегулярные глюки, на сей раз с PWM и PID (тип (а) отсутствие нагрева; тип (б) неконтролируемый нагрев). Отключил вывод баннеров через Lcd_Out – похоже, нормализовалось. Так что ранее предложенные мной меры эту болезнь, увы, не лечат, а всего лишь загоняют ее еще дальше вглубь. М-да.

Поэтому советую использовать посимвольный вывод: либо напрямую (используя Lcd_Chr и Lcd_Chr_Cp), либо через массив-буфер (используя Lcd_Cmd и Lcd_Chr_Cp).