Воскресенье, 17.12.2017, 18:48
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | Вывод изображения на телевизор в CodeVisionAVR - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 512345»
Модератор форума: ВитГо 
Форум » Разработка электронных устройств » Разрабатываю ! » Вывод изображения на телевизор в CodeVisionAVR
Вывод изображения на телевизор в CodeVisionAVR
pupkinДата: Суббота, 24.11.2012, 23:33 | Сообщение # 1
Сержант
Группа: Проверенные
Сообщений: 36
Репутация: 0
Статус: Offline
Здорово было бы, если была бы такая библиотека, написанная на СИ .... От ассемблера я далек, поэтому мне сложно понять как работает библиотека на ассемблере... biggrin

Залил код на мк этой статьи http://vg.ucoz.ru/publ....3-1-0-9

выводит то что нужно... частично понял принцип вывода изображения(косячная полоска).. и как двигать его)

Вот тут http://vg.ucoz.ru/publ....-1-0-11 насчет "Вариант 2" нужно сделать таймер по совпадению OC1A ? с высокой частотой - 16000 кГц ?

а в прерывании чего писать? .. wacko
 
ВитГоДата: Воскресенье, 25.11.2012, 02:00 | Сообщение # 2
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: 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
Репутация: 0
Статус: 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;  
      }  
}

синий экран рябит со специфическим звуком) dry
 
ВитГоДата: Воскресенье, 25.11.2012, 21:13 | Сообщение # 4
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: 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
Репутация: 0
Статус: 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
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: Offline
фотку бы...

изображение синхронизировано ? нет дерганий или чего то еще ?


Виталий (аka ВитГо)
 
ВитГоДата: Воскресенье, 25.11.2012, 23:46 | Сообщение # 7
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: 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
Репутация: 0
Статус: 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
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: Offline
расшифруйте настройки таймера...

какая частота кварцевого генератора

по таймеру: какой предделитель, какая частота тиков у таймера, у вас OCR1A=0x0100 - как вы получаете частоту прерываний в 64 мкс

наверное стоит начать с этого...


Виталий (аka ВитГо)
 
pupkinДата: Понедельник, 26.11.2012, 18:42 | Сообщение # 10
Сержант
Группа: Проверенные
Сообщений: 36
Репутация: 0
Статус: 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 в проекте сделал оптимизацию под скорость.. Полоска ровная без дефектов )
Что дальше делать? happy
 
ВитГоДата: Понедельник, 26.11.2012, 20:24 | Сообщение # 11
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: Offline
отлично,теперь сделайте чтобы у вас было только 224 линии - на них мы будем выводить изображение..

в принципе можно поэксперементировать: на моих телевизорах гарантировано были видны только 224 линии из 288..
попробуйте у себя (заодно и статистику по вашим телекам соберем smile )

ну так вот - модифицируйте код чтобы вертикальная полоска была только на 224 линии, вокруг соответственно - черная рамка


Виталий (аka ВитГо)
 
ВитГоДата: Понедельник, 26.11.2012, 20:30 | Сообщение # 12
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: 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
Репутация: 0
Статус: Offline
щаз попробуем

Сообщение отредактировал pupkin - Понедельник, 26.11.2012, 20:58
 
ВитГоДата: Понедельник, 26.11.2012, 21:06 | Сообщение # 14
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: Offline
ну и соответственно при такой настройке прерываний окончательную паузу в строке делать не нужно ! просто выходим и все (не забыв выставить уровень черного конечно)

Виталий (аka ВитГо)
 
pupkinДата: Понедельник, 26.11.2012, 21:17 | Сообщение # 15
Сержант
Группа: Проверенные
Сообщений: 36
Репутация: 0
Статус: Offline
Беда..,) что-то сдела.. вообщем рябит синий экран.. с вашим вариантом с 0x04 тоже ничего не выводится кроме ряби..
вот код http://pastebin.ru/s3EGZR6h
 
Форум » Разработка электронных устройств » Разрабатываю ! » Вывод изображения на телевизор в CodeVisionAVR
Страница 1 из 512345»
Поиск:


Copyright MyCorp © 2017
Сделать бесплатный сайт с uCoz