Воскресенье, 19.11.2017, 13:38
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | Вывод изображения на телевизор в CodeVisionAVR - Страница 2 - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 2 из 5«12345»
Модератор форума: ВитГо 
Форум » Разработка электронных устройств » Разрабатываю ! » Вывод изображения на телевизор в CodeVisionAVR
Вывод изображения на телевизор в CodeVisionAVR
ВитГоДата: Понедельник, 26.11.2012, 21:36 | Сообщение # 16
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: 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
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: Offline
если не получается то опять откатывайся на генерацию только строчных импульсов с вертикальной линией..

причем с ocr1ah=4

и потом усложняй

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


Виталий (аka ВитГо)
 
pupkinДата: Вторник, 27.11.2012, 16:05 | Сообщение # 18
Сержант
Группа: Проверенные
Сообщений: 36
Репутация: 0
Статус: 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
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: 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
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: 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
Репутация: 0
Статус: 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
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: Offline
угу, только процедура shortsi() должна генерировать только 1 импульс (короткий !)
соответственно longsi() один длинный импульс !

и опять таки помним что последний импульс у нас должен быть без паузы после установки black уровня


Виталий (аka ВитГо)
 
pupkinДата: Вторник, 27.11.2012, 19:19 | Сообщение # 23
Сержант
Группа: Проверенные
Сообщений: 36
Репутация: 0
Статус: Offline
Вот код http://pastebin.ru/eDM8SG69
Процедуры отредактировал, чтобы генерили 1 импульс... изображение нормальное..

Я там цикл нопов хотел сделать, но не смог подобрать число для while(i <= хх){ - 48 не канает... цикл пару мкс небось забрал ....
А то кучу нопов не круто писать....

Чего дальше сделать нужно?
 
ВитГоДата: Вторник, 27.11.2012, 19:32 | Сообщение # 24
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: Offline
куча нопов это не страшно, более того это абсолютно нормально ! так что лучше подобрать поточнее...

по поводу того что нужно дальше:

теперь определяйтесь какое разрешение вам нужно.. по Y это 228 строк (примерно), а вот по X - сколько точек нужно ?

второе: определяйтесь что вы хотите выводить - графику или текст.

третье: исходя из первых двух - определяйте формат буфера экрана в озу вашей 16ой меги


Виталий (аka ВитГо)
 
ВитГоДата: Вторник, 27.11.2012, 19:38 | Сообщение # 25
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: 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
Репутация: 0
Статус: Offline
1) сколько мега16 потянет со своим ОЗУ
2) только текст
3) даже не знаю... ~900 байт dry

PS код поправил....


Сообщение отредактировал pupkin - Вторник, 27.11.2012, 19:47
 
ВитГоДата: Вторник, 27.11.2012, 20:33 | Сообщение # 27
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: Offline
ну вот и считай:

при графике- 1 бит - одна точка (у нас все равно чернобелый вывод) - соответственно 1 байт - это 8 точек по горизонтали - в одну линию (по Y)

теперь считай размер буфера подставляя свои значения X и Y, само собой что X желательно кратным 8 выбирать (иначе будут просто потери)

RAM_BUFFER_SIZE=(X/8)*Y


Виталий (аka ВитГо)
 
ВитГоДата: Вторник, 27.11.2012, 20:43 | Сообщение # 28
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: 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
Репутация: 0
Статус: Offline
96(x) * 64(y)
RAM_BUFFER_SIZE = 768
хватит для начала...
 
ВитГоДата: Вторник, 27.11.2012, 20:45 | Сообщение # 30
Полковник
Группа: Администраторы
Сообщений: 2428
Репутация: 19
Статус: Offline
это что ты посчитал ?
какой режим ? (граф. \ текстовый)


Виталий (аka ВитГо)
 
Форум » Разработка электронных устройств » Разрабатываю ! » Вывод изображения на телевизор в CodeVisionAVR
Страница 2 из 5«12345»
Поиск:


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