Вывод изображения на телевизор в CodeVisionAVR
|
|
pupkin | Дата: Суббота, 24.11.2012, 23:33 | Сообщение # 1 |
Сержант
Группа: Проверенные
Сообщений: 36
Статус: Offline
| Здорово было бы, если была бы такая библиотека, написанная на СИ .... От ассемблера я далек, поэтому мне сложно понять как работает библиотека на ассемблере...
Залил код на мк этой статьи http://vg.ucoz.ru/publ....3-1-0-9
выводит то что нужно... частично понял принцип вывода изображения(косячная полоска).. и как двигать его)
Вот тут http://vg.ucoz.ru/publ....-1-0-11 насчет "Вариант 2" нужно сделать таймер по совпадению OC1A ? с высокой частотой - 16000 кГц ?
а в прерывании чего писать? ..
|
|
| |
ВитГо | Дата: Воскресенье, 25.11.2012, 02:00 | Сообщение # 2 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| для начала нужно решить каким образом будут генериться кадровые синхроимпульсы...
у них очень высокая частота, и нужно придумать каким образом их выдавать на пин порта...
в принципе можно настроить прерывание таймер по совпадению с OCR1A, и отмерять интервалы по 64 мкс... и внутри прерывания решать что выводим: КСИ (кадровый синхроимпульс) или строку изображения..
соответственно на входе в прерывание должен быть case (switch) который передает управление или в блок 1 или в блок 2...
далее блок 1 (генерация КСИ) придется разбить на шаги.. причем каждый шаг должен умещаться в 64 мкс - если внимательно посмотреть вторую и третью часть статьи то можно увидеть что во время 64 мкс строки идут 5 импульсов КСИ... соответственно в КСИ есть короткие, длинные, короткие импульсы - это все будет шагами.. потом в КСИ есть обязательные пустые строки избажения, их тоже нужно генерить как шаги...
я могу посоветовать начать генерацию в прерывании по совпадению OCR1A просто строчные синхроимпульсы и постепенно добавлять к ним функционал КСИ...
давайте так и сделаем: пишите прерывание по совпадению c OCR1A с периодом 64 мкс в прерывании 4 мкс - задавайте уровень синхроимпульса и потом уровень черного, через 20 мкс, уровень белого на 1 мкс, и потом опять уровень черного..
(в принципе вы все это уже сделали)
когда подключение покажет то что ожидаешь то идем дальше- добавляем селектор и добавляем генерацию КСИ..
Виталий (аka ВитГо)
|
|
| |
pupkin | Дата: Воскресенье, 25.11.2012, 20:22 | Сообщение # 3 |
Сержант
Группа: Проверенные
Сообщений: 36
Статус: Offline
| Вот код с таймером http://pastebin.ru/AeTfOoiU - выводит белую тонкую полосу...) Насчет с КСИ не допонял походу..) Code int kk = 0; interrupt [TIM1_COMPA] void timer1_compa_isr(void) {
if(kk == 0){ shortsi(shortsyncB); kk++; }else if(kk == 1){ longsi(); kk++; }else if(kk == 2){ shortsi(0); kk++; }else if(kk == 3){ ZERO; delay_us(4); BLACK; delay_us(29); WHITE; delay_us(1); BLACK; delay_us(30); kk=0; } } синий экран рябит со специфическим звуком)
|
|
| |
ВитГо | Дата: Воскресенье, 25.11.2012, 21:13 | Сообщение # 4 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| это одна строка !! а их должно быть 288 !! Quote (pupkin) ZERO; delay_us(4); BLACK; delay_us(29); WHITE; delay_us(1); BLACK; delay_us(30); kk=0;
Виталий (аka ВитГо)
|
|
| |
pupkin | Дата: Воскресенье, 25.11.2012, 22:47 | Сообщение # 5 |
Сержант
Группа: Проверенные
Сообщений: 36
Статус: Offline
| Вообщем вот так: выводится полоса чуть сдвинута вверх и в самом вверху ~1см скошена влево... Code if(kk == 0){ shortsi(shortsyncB); kk++; }else if(kk == 1){ longsi(); kk++; }else if(kk == 2){ shortsi(0); kk++; }else if(kk == 3){ int i; for(i = 0; i <= 288; i++){ ZERO; delay_us(4); BLACK; delay_us(29); WHITE; delay_us(1); BLACK; delay_us(30); } kk=0; }
|
|
| |
ВитГо | Дата: Воскресенье, 25.11.2012, 23:42 | Сообщение # 6 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| фотку бы...
изображение синхронизировано ? нет дерганий или чего то еще ?
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Воскресенье, 25.11.2012, 23:46 | Сообщение # 7 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Quote (pupkin) int i; for(i = 0; i <= 288; i++){ ZERO; delay_us(4); BLACK; delay_us(29); WHITE; delay_us(1); BLACK; delay_us(30); } kk=0; }
так нельзя!! у нас прерывание настроено на 64 мкс ? (кстати чтото я не увидел этой настройки...) - это как раз время чтобы выдать 1 строку! мы попали в прерывание ! и в прерывании должны выдать 1 строку!! по программе же получается что в прерывании выводятся все строки !!!
так что заводите глобальную переменную и внутри прерывания выводите 1 строку, потом увеличиваете значение переменной (это будет количество выведенных строк) и если вывели все строки то kk=0 -для вывода синхроимпульсов, если не все - то выходим из прерывания - и в следующем прерывании выведем следующую строку, опять увеличим счетчик строк и т.д.
Виталий (аka ВитГо)
|
|
| |
pupkin | Дата: Понедельник, 26.11.2012, 08:32 | Сообщение # 8 |
Сержант
Группа: Проверенные
Сообщений: 36
Статус: Offline
| Настройки таймера: Code TCCR1A=0x01; TCCR1B=0x01;
TCNT1H=0x00; TCNT1L=0x00;
ICR1H=0x00; ICR1L=0x00;
OCR1AH=0x01; OCR1AL=0x00;
OCR1BH=0x00; OCR1BL=0x00;
Без цикла рябит синий экран...
Code unsigned int kk = 0; unsigned int str; interrupt [TIM1_COMPA] void timer1_compa_isr(void) { // Place your code here if(kk == 0){ shortsi(shortsyncB); kk++; }else if(kk == 1){ longsi(); kk++; }else if(kk == 2){ shortsi(0); kk++; }else if(kk == 3){ //for(i = 0; i <= 288; i++){
if(str <= 288) { ZERO; delay_us(4); BLACK; delay_us(29); WHITE; delay_us(1); BLACK; delay_us(30); str++; }else{ kk = 0; str = 0; } // } // kk = 0; } }
Сообщение отредактировал pupkin - Понедельник, 26.11.2012, 08:57 |
|
| |
ВитГо | Дата: Понедельник, 26.11.2012, 14:44 | Сообщение # 9 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| расшифруйте настройки таймера...
какая частота кварцевого генератора
по таймеру: какой предделитель, какая частота тиков у таймера, у вас OCR1A=0x0100 - как вы получаете частоту прерываний в 64 мкс
наверное стоит начать с этого...
Виталий (аka ВитГо)
|
|
| |
pupkin | Дата: Понедельник, 26.11.2012, 18:42 | Сообщение # 10 |
Сержант
Группа: Проверенные
Сообщений: 36
Статус: Offline
| Все отлично, таймер чуть переделать нужно было, и через switch сделать он быстрее в данном случае чем if Кварц 16 мгц у меня. Вот настройки таймера: Code TCCR0=0x00; TCNT0=0x00; OCR0=0x00;
TCCR1A=0x01; TCCR1B=0x01;
TCNT1H=0xff; TCNT1L=0xff;
ICR1H=0x00; ICR1L=0x00;
OCR1AH=0x00; OCR1AL=0x01;
OCR1BH=0x00; OCR1BL=0x00;
Вот код прерывания:
Code unsigned int kk = 0; unsigned int str; interrupt [TIM1_COMPA] void timer1_compa_isr(void) { // Place your code here switch (kk){ case '3': if(str <= 288) { ZERO; delay_us(4); BLACK; delay_us(29); WHITE; delay_us(1); BLACK; delay_us(30); str++; }else{ kk = 0; str = 0; } break; case '0': shortsi(shortsyncB); kk = 1; break; case '1': longsi(); kk = 2; break; case '2': shortsi(0); kk = 3; break; } }
И в cvavr в проекте сделал оптимизацию под скорость.. Полоска ровная без дефектов ) Что дальше делать?
|
|
| |
ВитГо | Дата: Понедельник, 26.11.2012, 20:24 | Сообщение # 11 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| отлично,теперь сделайте чтобы у вас было только 224 линии - на них мы будем выводить изображение..
в принципе можно поэксперементировать: на моих телевизорах гарантировано были видны только 224 линии из 288.. попробуйте у себя (заодно и статистику по вашим телекам соберем )
ну так вот - модифицируйте код чтобы вертикальная полоска была только на 224 линии, вокруг соответственно - черная рамка
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Понедельник, 26.11.2012, 20:30 | Сообщение # 12 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| все равно странно у вас таймер настроен :-(
по моему такая настройка приведет к постоянному вызову прерывания...
при 16 мгц в OCR1A должно быть значение: - 1/16 000 000 =0.0625 мкс/тик - на один тик таймера следовательно для 64 мкс => 64 / 0.0625=1024 тиков таймера !
то есть должно быть OCR1AH=0x04 OCR1AL=0x00 в этом случае мы получим вызов прерывания с периодом 64 мкс
Виталий (аka ВитГо)
|
|
| |
pupkin | Дата: Понедельник, 26.11.2012, 20:51 | Сообщение # 13 |
Сержант
Группа: Проверенные
Сообщений: 36
Статус: Offline
| щаз попробуем
Сообщение отредактировал pupkin - Понедельник, 26.11.2012, 20:58 |
|
| |
ВитГо | Дата: Понедельник, 26.11.2012, 21:06 | Сообщение # 14 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| ну и соответственно при такой настройке прерываний окончательную паузу в строке делать не нужно ! просто выходим и все (не забыв выставить уровень черного конечно)
Виталий (аka ВитГо)
|
|
| |
pupkin | Дата: Понедельник, 26.11.2012, 21:17 | Сообщение # 15 |
Сержант
Группа: Проверенные
Сообщений: 36
Статус: Offline
| Беда..,) что-то сдела.. вообщем рябит синий экран.. с вашим вариантом с 0x04 тоже ничего не выводится кроме ряби.. вот код http://pastebin.ru/s3EGZR6h
|
|
| |