Поднимаю в очередной раз уже избитую и давно поднадоевшую всем тему по организации динамической индикации в бегущей строке. Просто ни на одном из форумов, посвященой этой теме, не могу найти ответ на, казалось-бы, простой вопрос: какими програмными или аппаратными методами добиваются плавного движения текста (чтобы не было растяжения и сжатия при движении, скачков, при переходе с одной матрицы на другую).
У меня 16 светодиодных матриц 8х8, постолбцовая регенерация слева направо (хотя пробовал и наоборот, но улучшения не получил), соответственно скважность 8. Частота регенерации 100Гц (хотя пререпробовал много других частот), соответственно для одного пикселя частота 800Гц. Движение текста справа налево.
Привожу текст обработки прерывания для одного столбца c подробными комментариями:
CODE
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)________//вывод одного столбца(0-7) во всех 16 индикаторах на 1,25мс (1,25мс * 8 = 10мс = 100Гц)
{
unsigned char number_indic = 0,_//номер индикатора
____________gb_index, delay;__//номер позиции в графическом буффере
//number_col - номер столбца - внешняя переменная
ClrBit(PORTC,COL);___________//выключаем все столбцы (выводы дешифратора 1 из 8 в состоянии лог.1)
TCNT0 = 0xB2;______________ //перезагрузка таймера
tick++;_____________________//тикалка
//WDR();___________________//сброс сторожевого таймера
for (gb_index = number_col; gb_index < 128; gb_index += 8) {__//распихиваем данные из буффера в 574-е регистры по
_______________________________________________________//положительному перепаду
______________________________________________________//всего 16 итераций в этом цикле
______________________________________________________WR_BUS_DATA = graphic_buffer[gb_index];
______________________________________________________delay++; //задержка
______________________________________________________PORTB = number_indic; //выбираем индикатор
______________________________________________________number_indic++;
______________________________________________________SetBit(PORTB,WR_INDICATOR)
;__//формируем положительный перепад
______________________________________________________delay++; //задержка
______________________________________________________ }//end for
WR_BUS_DATA = number_col;__//выставляем на шину номер столбца
number_col++;______________//увеличение номера столбца (внешняя переменная)
SetBit(PORTC,COL);__________//включаем текущий столбец на всех 16-ти индикаторах на 1,25мс до следующего прерывания
if (number_col > 7 ) {
___________________ number_col = 0;
____________________shift_graphic_buffer(); //сдвиг графического буфера влево на одну позицию
___________________}
}
Понимаю, что все банально, тупо в лоб, без изысков, но текст двигается, но двигается с большими проблемами (см.выше)
shift_graphic_buffer() - по времени занимает 165мкс, если верить протеусу
Причем и в реально собранном устройстве и смоделированном в протеусе проблемы с движением одни и теже ( протеус рулит

)
Я даже не прошу исправить код, просто подскажите теоретически в каком направлении двигаться

Скачок текста при переходе с одного индикатора на друой связан, как я понимаю, с увеличением паузы между 1-го столбцом одного индикатора и 7-м столбцом следующего. Фактически время между засветками равно времени двух регенераций. Вот и возникает скачок. И как с этим бороться?
Кстати очень сильное увеличение чатоты регенерации привело к более менее приличному результату, но яркость упала до еле различимой. Несколько циклов регенерации между сдвигами также улучшают ситуацию, но приводит к удвоению, утроению и т.п.
пикселов. Ведь как-то делают на частоте 75 или 100Гц регенерация-сдвиг-регенерация и текст без проблем бежит, вот только как...
К сожалению не удалось вставить в текст программы символы табуляции для удобочитаемости, так что не взыщите...
Сообщение отредактировал Omen_13 - Jan 21 2010, 01:20
Причина редактирования: Оформление кода