реклама на сайте
подробности

 
 
> Вопрос новичка по бегущей строке
Mark71
сообщение Jan 15 2010, 08:50
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 31-03-08
Пользователь №: 36 358



Поднимаю в очередной раз уже избитую и давно поднадоевшую всем тему по организации динамической индикации в бегущей строке. Просто ни на одном из форумов, посвященой этой теме, не могу найти ответ на, казалось-бы, простой вопрос: какими програмными или аппаратными методами добиваются плавного движения текста (чтобы не было растяжения и сжатия при движении, скачков, при переходе с одной матрицы на другую).
У меня 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мкс, если верить протеусу
Причем и в реально собранном устройстве и смоделированном в протеусе проблемы с движением одни и теже ( протеус рулит smile.gif )
Я даже не прошу исправить код, просто подскажите теоретически в каком направлении двигаться sad.gif
Скачок текста при переходе с одного индикатора на друой связан, как я понимаю, с увеличением паузы между 1-го столбцом одного индикатора и 7-м столбцом следующего. Фактически время между засветками равно времени двух регенераций. Вот и возникает скачок. И как с этим бороться?
Кстати очень сильное увеличение чатоты регенерации привело к более менее приличному результату, но яркость упала до еле различимой. Несколько циклов регенерации между сдвигами также улучшают ситуацию, но приводит к удвоению, утроению и т.п.
пикселов. Ведь как-то делают на частоте 75 или 100Гц регенерация-сдвиг-регенерация и текст без проблем бежит, вот только как...

К сожалению не удалось вставить в текст программы символы табуляции для удобочитаемости, так что не взыщите...

Сообщение отредактировал Omen_13 - Jan 21 2010, 01:20
Причина редактирования: Оформление кода
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_dem
сообщение Jan 15 2010, 09:01
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



Простой ответ на простой вопрос - используйте двойную буферизацию, переключайте буфера по окончанию строки.

ps. Пардон, не досмотрел код. Оформите, пожалуйста, код нужным тегом - ну очень грустно смотреть в такой текст в пятницу )

Да, прерывание у вас как-то неправильно сделано. Отделите мух от котлет, т.е. вывод от сдвига.
Прерывание - строго вывод, основной код - сдвиг. И два буфера, да.
Go to the top of the page
 
+Quote Post
Mark71
сообщение Jan 15 2010, 09:10
Сообщение #3





Группа: Участник
Сообщений: 9
Регистрация: 31-03-08
Пользователь №: 36 358



Цитата(_dem @ Jan 15 2010, 13:01) *
Простой ответ на простой вопрос - используйте двойную буферизацию, переключайте буфера по окончанию строки.


Да, мне много раз встречалось на форумах понятие двойной буфферизации, но как это реализутся на практике...

Цитата(dimka76 @ Jan 15 2010, 13:01) *
А рачем весь буфер сдвигать?


Так если я весь буфер не сдвину, как потом одновременно распихать уже изменненые данные по всем регистрам. Да и занимает это по времени всего 165 мкс, что никак не влияет на время индикации, и сдвиш идет между прерываниями.

Сообщение отредактировал rezident - Jan 16 2010, 19:50
Причина редактирования: Излишнее цитирование.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.02209 секунд с 7
ELECTRONIX ©2004-2016