Вывод изображения на телевизор в CodeVisionAVR
|
|
ВитГо | Дата: Понедельник, 26.11.2012, 21:36 | Сообщение # 16 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| как минимум нужно убрать окончательную паузу в строке (я же писал выше)
Code if(str <= 288) { ZERO; delay_us(4); BLACK; delay_us(29); WHITE; delay_us(1); BLACK; delay_us(30); ..вот это точно не нужно !! пауза сама будет до следующего прерывания str++;
ocr1ah должен быть равен 4
кстати вы включили режим ctc со сбросом tcnt1 при совпадении с ocr1a?
и при генерации КСИ нужно смотреть длительность пачки - там помоему длительность коротких/длинных импульсов с паузами 160 мкс - нужно или перестроить ocr1a чтобы оно раньше нас не дергало, либо разбить каким то образом чтобы умещаться в 64 мкс (но так не получиться)
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Понедельник, 26.11.2012, 21:55 | Сообщение # 17 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| если не получается то опять откатывайся на генерацию только строчных импульсов с вертикальной линией..
причем с ocr1ah=4
и потом усложняй
и обязательно сохраняй промежуточные варианты - иначе ошибки искать сложно.. - я сам это проходил не один раз.. чуть где то перемудрил и синхронизация пропала :-(
Виталий (аka ВитГо)
|
|
| |
pupkin | Дата: Вторник, 27.11.2012, 16:05 | Сообщение # 18 |
Сержант
Группа: Проверенные
Сообщений: 36
Статус: Offline
| Пол черное пол белое.. поставил паузу между импульсами 160 мкс... изображение белое сверху косится(~1см) влево...
Code switch (kk){ case 3: if(str <= 288) { ZERO; delay_us(4); BLACK; delay_us(30); WHITE; delay_us(28); BLACK; str++; }else{ kk = 0; str = 0; } break; case 0: shortsi(shortsyncB); delay_us(160); kk = 1; break; case 1: longsi(); delay_us(160); kk = 2; break; case 2: shortsi(0); delay_us(160); kk = 3; break; }
0х04 сделал - нормально...
без этих задержек изображение отличное...
вот алгоритм вывода нескольких полос не могу сообразить... не подскажете?)
Добавлено (27.11.2012, 16:05) --------------------------------------------- Сделал функцию задержки в us.. т.к delay_us требует константу.... изображение отличное
Code unsigned int kk = 0; unsigned int str = 0; unsigned int i = 0; void sec(int n){ i = 0; while( i <= n ){ delay_us(1); i++; } } interrupt [TIM1_COMPA] void timer1_compa_isr(void) { switch (kk){ case 3: if(str <= 288) { ZERO; sec(1); BLACK; delay_us(29); WHITE; delay_us(28); BLACK; str++; }else{ kk = 0; str = 0; } break; case 0: shortsi(shortsyncB); delay_us(160); kk = 1; break; case 1: longsi(); delay_us(160); kk = 2; break; case 2: shortsi(29); delay_us(160); kk = 3; break; } }
Сообщение отредактировал pupkin - Вторник, 27.11.2012, 16:05 |
|
| |
ВитГо | Дата: Вторник, 27.11.2012, 16:08 | Сообщение # 19 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Quote (pupkin) case 0: shortsi(shortsyncB); delay_us(160); kk = 1; break; case 1: longsi(); delay_us(160); kk = 2; break; case 2: shortsi(0); delay_us(160); kk = 3; break;
и что получилось с задержками? у тебя shortsi и longsi - по 160 мкс ! а ты еще после них 160 мкс ждешь !!!! так нельзя !!
посмотри что должно быть в КСИ уравнивающие импульсы - это shortsi по твоему коду..
обращаю внимание что импульсы нужно генерить таким образом чтобы успеть выйти из прерывания до того как оно снова возникнет, то есть для короткого импульса: ZERO; delay_us(4); BLACK; и все !!! на выход !! не нужно ждать еще и паузу... правда это только для последнего короткого или длинного импульса для того что находится вначале - конечно после BLACK; нужно еще ставить паузу до последующего импульса
получается что shortsi длятся 2.5 строки ! это 160 мкс ! и нужно разбить эти последовательности так чтобы умещаться в строчный интервал вызова прерывания (64 мкс)
то есть для тебя получиться например такие кейсы
case 0: пауза 32 мкс и потом один короткий импульс и переход к case 1
case 1: выдача двух коротких импульсов и переход к case 2
case 2: как case 1 и переход к case 3
case 3: выдача двух длинных импульсов и переход к case 4
case 4: как case 3 и переход к case 5
case 5: один длинный и один короткий импульс и переход к case 6
case 6: выдача 2х коротких импульсов и переход к case 7
case 7: как case 6 и переход на выдачу пустых строк (какой там case ты выделил для этого ?)
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Вторник, 27.11.2012, 16:21 | Сообщение # 20 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| задержку в 1 мкс лучше делать командами nop на 1 команду nop уходит 0.0625 мкс то есть на 1 мкс у нас должно быть 1 / 0.0625 = 16 команд nop
их можно включать асм вставками в си код.. если делаем цикл то лучше его тоже сделать на асме - потому что накладные расходы на цикле тоже дают задержку.. причем из ссылки на КСИ что я давал выше видно что короткие импульсы должны быть 2.35 мкс (хотя работало помоему и с 4 мкс)
по коду Code void sec(int n){ i = 0; while( i <= n ){ delay_us(1); i++; } } я боюсь что задержка будет больше !
Виталий (аka ВитГо)
|
|
| |
pupkin | Дата: Вторник, 27.11.2012, 16:50 | Сообщение # 21 |
Сержант
Группа: Проверенные
Сообщений: 36
Статус: Offline
| насчет кейсов сделать так: Code case 0: delay_us(32); shortsi(shortsyncB); kk = 1; break; case 1: shortsi(shortsyncB); shortsi(shortsyncB); kk = 2; break; case 2: shortsi(shortsyncB); shortsi(shortsyncB); kk = 4; break; case 4: longsi(); longsi(); kk = 5; break; case 5: longsi(); longsi(); kk = 6; break; case 6: longsi(); shortsi(shortsyncB); kk = 7; break; case 7: shortsi(shortsyncB); shortsi(shortsyncB); kk = 8; break; case 8: shortsi(shortsyncB); shortsi(shortsyncB); kk = 3; break;
?
|
|
| |
ВитГо | Дата: Вторник, 27.11.2012, 16:58 | Сообщение # 22 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| угу, только процедура shortsi() должна генерировать только 1 импульс (короткий !) соответственно longsi() один длинный импульс !
и опять таки помним что последний импульс у нас должен быть без паузы после установки black уровня
Виталий (аka ВитГо)
|
|
| |
pupkin | Дата: Вторник, 27.11.2012, 19:19 | Сообщение # 23 |
Сержант
Группа: Проверенные
Сообщений: 36
Статус: Offline
| Вот код http://pastebin.ru/eDM8SG69 Процедуры отредактировал, чтобы генерили 1 импульс... изображение нормальное..
Я там цикл нопов хотел сделать, но не смог подобрать число для while(i <= хх){ - 48 не канает... цикл пару мкс небось забрал .... А то кучу нопов не круто писать....
Чего дальше сделать нужно?
|
|
| |
ВитГо | Дата: Вторник, 27.11.2012, 19:32 | Сообщение # 24 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| куча нопов это не страшно, более того это абсолютно нормально ! так что лучше подобрать поточнее...
по поводу того что нужно дальше:
теперь определяйтесь какое разрешение вам нужно.. по Y это 228 строк (примерно), а вот по X - сколько точек нужно ?
второе: определяйтесь что вы хотите выводить - графику или текст.
третье: исходя из первых двух - определяйте формат буфера экрана в озу вашей 16ой меги
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Вторник, 27.11.2012, 19:38 | Сообщение # 25 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| по коду: еще раз повторю - более правильно было бы процедуры генерации импульсов делать без паузы после black;
потом: совершенно не понятно зачем в процедуре параметр ? вы же его не используете! Code void shortsi(unsigned int last_p) { ZERO; delay_us(shortsyncZ); BLACK; delay_us(shortsyncB); // вот эта задержка не нужна !!! лучше ее добавлять в case когда нужно разделить два импульса ! } потому что после второго импульса вы должны выйти и войти снова в прерывание ! если не успеете то изображение будет не устойчиво (или будет устойчиво на одном телеке, но неустойчиво на другом)
Code case 1: shortsi(shortsyncB); delay_us(<на 4 мкс>); shortsi(shortsyncB); kk = 1; break;
так же и с длинными импульсами !
Виталий (аka ВитГо)
|
|
| |
pupkin | Дата: Вторник, 27.11.2012, 19:42 | Сообщение # 26 |
Сержант
Группа: Проверенные
Сообщений: 36
Статус: Offline
| 1) сколько мега16 потянет со своим ОЗУ 2) только текст 3) даже не знаю... ~900 байт
PS код поправил....
Сообщение отредактировал pupkin - Вторник, 27.11.2012, 19:47 |
|
| |
ВитГо | Дата: Вторник, 27.11.2012, 20:33 | Сообщение # 27 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| ну вот и считай:
при графике- 1 бит - одна точка (у нас все равно чернобелый вывод) - соответственно 1 байт - это 8 точек по горизонтали - в одну линию (по Y)
теперь считай размер буфера подставляя свои значения X и Y, само собой что X желательно кратным 8 выбирать (иначе будут просто потери)
RAM_BUFFER_SIZE=(X/8)*Y
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Вторник, 27.11.2012, 20:43 | Сообщение # 28 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| если текстовый режим: то один байт = одному символу..
у нас 228 линий, это примерно 228\8=28 строк при символе высотой 8 точек, и 228\12=19 строк при символе высотой 12 точек
по количеству символов в строке - обычно ширина символа 8 точек (можно и больше но малек сложнее и потери будут в знакогенераторе) - следовательно один символ это 8 точек по горизонтали
теперь считаем RAM_BUFFER_SIZE=X*Y (для символьного режима)
соответственно из количества символов в строке\столбце - считаем графическое разрешение экрана по точкам:
не советую планировать более 350 точек по горизонтали, более того не знаю сможем ли мы на СИ выжать такое разрешение по горизонтали :-( обычно выжимают в районе 176 точек по горизонтали и радуются
хотя может быть и получиться больше.. нужно считать..
время которое мы можем потратить на вывод одной точки будет варьироваться от 0.3125 мкс до 0.125 мкс
длительность строки для вывода изображения около 40 мкс (остальное уйдет на рамку) получаем в первом случае 40 \ 0.3125 = 128 точек по горизонтали
во втором случае 40 \ 0.125 = 320 точек по горизонтали
вполне допускаю что разрешение будет чуть больше (мы под изображение сможем забрать около 44-48 мкс)
вот исходя из всего написанного в этом и предыдущих постах и считай КАКОЕ РАЗРЕШЕНИЕ ТЕБЕ РЕАЛЬНО НУЖНО и КАКОЕ РАЗРЕШЕНИЕ ТЫ РЕАЛЬНО СМОЖЕШЬ ХРАНИТЬ В ОЗУ
истина как говориться где то по середине- это в любом случае будет компромисс между используемой памятью меги и возможностью вывода... настраиваться на высокое разрешение вывода без памяти в меге смысла нет (просто не сможем хранить то что нужно вывести) и наоборот- загрублять разрешение и оставлять пустое место в памяти тоже наверное большого смысла нет..
опять таки не забываем что нужен будет стек, ну и переменные наверное какие нить... - так что памяти байт 150-200 я бы оставил под эти нужды
Виталий (аka ВитГо)
|
|
| |
pupkin | Дата: Вторник, 27.11.2012, 20:45 | Сообщение # 29 |
Сержант
Группа: Проверенные
Сообщений: 36
Статус: Offline
| 96(x) * 64(y) RAM_BUFFER_SIZE = 768 хватит для начала...
|
|
| |
ВитГо | Дата: Вторник, 27.11.2012, 20:45 | Сообщение # 30 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| это что ты посчитал ? какой режим ? (граф. \ текстовый)
Виталий (аka ВитГо)
|
|
| |