Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7S64 и SAA7113H
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Pasha 111
Объясните, пожалуйста, как работает SAA7113H. Не могу разобраться в доке.
http://www.nxp.com/pip/SAA7113H_V2.html

Каким образом кадр можно отцифровать и передать в проц? На выходе есть 8-ми битный интерфейс, но как это всё работает?

Задача стоит такая: получить монохромную картинку 320x240 (2 цвета, один кадр - 9600 байт), найти центр масс того белого пятна, что на ней будет и передать координаты (X, Y) по COM порту.

Памяти контроллера хватает, вычисления тоже вроде очень простые, real time не требуется (т.е. можно хоть 2 кадра в секунду тока обрабатывать). Как это всё можно сделать?
AlexandrY
На этом чипе никак.
См. ссылку http://electronix.ru/forum/index.php?showt...mp;#entry260293

Цитата(Pasha 111 @ Jun 12 2007, 15:54) *
Объясните, пожалуйста, как работает SAA7113H. Не могу разобраться в доке.
http://www.nxp.com/pip/SAA7113H_V2.html

Каким образом кадр можно отцифровать и передать в проц? На выходе есть 8-ми битный интерфейс, но как это всё работает?

Задача стоит такая: получить монохромную картинку 320x240 (2 цвета, один кадр - 9600 байт), найти центр масс того белого пятна, что на ней будет и передать координаты (X, Y) по COM порту.

Памяти контроллера хватает, вычисления тоже вроде очень простые, real time не требуется (т.е. можно хоть 2 кадра в секунду тока обрабатывать). Как это всё можно сделать?
Pasha 111
Прочёл всю ветку, но большую частью не понял, так как никогда раньше эти вопросом не занимался.

Есть ли какие-нибудь примеры использования SAA7113H? Или можно каким-то другим способом получить кадр с камеры?
AlexandrY
У этого видео-АЦП выход сделан по стандарту ITU-R BT 656
Его вам и надо изучить чтобы понять как брать данные.
Но к сожалению там довольно большие скорости и в DSP процах как Blackfin для него есть специальные порты.
В процессорах общего применения такого порта нет и надо химичить.
У ST получилось, но они пока не публикуют эту инфу, но скоро наверно выложат.

Цитата(Pasha 111 @ Jun 12 2007, 17:35) *
Прочёл всю ветку, но большую частью не понял, так как никогда раньше эти вопросом не занимался.

Есть ли какие-нибудь примеры использования SAA7113H? Или можно каким-то другим способом получить кадр с камеры?
Pasha 111
Вот нашел кое-что:
http://www.cmucam.org/wiki/Hardware

Как я понял, там используется FIFO буфер на 1 МБ. Т.е. кадр идёт сначала туда, а потом вытягивается процессором. Для меня это наиболее подходящий вариант, т.к. не надо ставить никаких ПЛИС, как предлагают ставить в других ветках форума, которые я находил.


Во, и схемку нашел
http://www.cmucam.org/attachment/wiki/Docu...3_datasheet.pdf
rat
Цитата(Pasha 111 @ Jun 12 2007, 19:24) *
Объясните, пожалуйста, как работает SAA7113H. Не могу разобраться в доке.
http://www.nxp.com/pip/SAA7113H_V2.html

Каким образом кадр можно отцифровать и передать в проц? На выходе есть 8-ми битный интерфейс, но как это всё работает?

Задача стоит такая: получить монохромную картинку 320x240 (2 цвета, один кадр - 9600 байт), найти центр масс того белого пятна, что на ней будет и передать координаты (X, Y) по COM порту.

Памяти контроллера хватает, вычисления тоже вроде очень простые, real time не требуется (т.е. можно хоть 2 кадра в секунду тока обрабатывать). Как это всё можно сделать?


Работал с функциональным аналогом SAA7113 ADэшным видеодекодером ADV7181. В принципе можете использовать именно его, тогда смогу посоветовать что-то конкретное.
bzx
2 Pasha 111
Рекомендую AVR32. Мотивация в этой ветке
http://electronix.ru/forum/index.php?showt...id=260927&#
Pasha 111
Спасибо за ответы.

2 rat:
Решение должно быть максимально простым и дешевым. ADV7181 стоит в 2 раза дороже и конструктивно менее удобен (64 ножки против 44 и шаг 0.5 а не 0.65), хотя наверное даже лучше, чем у филипса smile.gif

2 bzx:
Есть долгий опыт программирования АРМ7 процессоров (плюс есть готовая плата с ним), и устройство хочется сделать побыстрее, поэтому разбираться а АВР32 не охота. Ну и >200 выводов - это перебор для тако задачки smile.gif

Мне вариант с FIFO очень понравился. По вышеупомянутой ссылке на схему платы CMUCAM'а нашёл, что буфер там от фирмы Averlogic.
http://www.averlogic.com/dualport_sarm.asp?protype=FIFOs

На eFinde нашел тот, что там стоит - al4v8m440. Стоит 600 рублей!

Он 8-ми мегабитный. Если кадр 720х625, то получается 1440*625*8 = 7.2 мегабита. Если брать только половину строк, то будет менее 4-х мегабит, но такой буфер в продаже не нашел. 3-х мегабитный есть (примерно 300 рублей), но его не хватает sad.gif

Собственно такой вопрос: а кто еще выпускает аналогичные FIFO буферы?
a3r3
Возьмите лучше ADSP-BF53x с внешней SDRAM - на такой задаче сделает любой из перечисленных процессоров и стоить будет копейки.
Saratan
Люди, поможите, у меня не записывается по I2C в регистр 0F (Chrominance gain control) SAA7113H ничего. sad.gif(( Во все остальные записывается а в этот - нед. Чё делать?
KAlex
Цитата(Saratan @ Nov 14 2007, 11:46) *
Люди, поможите, у меня не записывается по I2C в регистр 0F (Chrominance gain control) SAA7113H ничего.

Старший бит в 0? Если 1, то может и не писаться. Хотя странно.
Есть возможность проверить на другом кристалле?
Saratan
Цитата(KAlex @ Nov 14 2007, 14:03) *
Старший бит в 0? Если 1, то может и не писаться. Хотя странно.
Есть возможность проверить на другом кристалле?
Вроде как меняли камень, та же фикня. В этом регистре у меня число 15, т.е. старший бит на сколько я понимаю = 0.
Saratan
Ещё такой вопрос, я правильно понимаю, этот АЦП после конфигурации по И2Ц будет постоянно выдавать оцифрованные кадры по VPO0-7? В том плане, что ненада ему говорить мол захвати кадр какой-нить командой?
aaarrr
Правильно. Будет гнать поток постоянно, даже без сигнала на входе.

Цитата(Saratan @ Nov 14 2007, 11:46) *
Люди, поможите, у меня не записывается по I2C в регистр 0F (Chrominance gain control) SAA7113H ничего. sad.gif(( Во все остальные записывается а в этот - нед. Чё делать?

А читается из него что - значение по сбросу (0x2a)?
Saratan
Цитата(aaarrr @ Nov 19 2007, 14:15) *
Правильно. Будет гнать поток постоянно, даже без сигнала на входе.
А читается из него что - значение по сбросу (0x2a)?
Читается 15. У меня на VPO висит полуровня, AOUT = 0...
aaarrr
Странно: из регистра 0x0F читается 0x0F, а с остальными все в порядке. Похоже на программный глюк. После сброса там точно 0x2a должно быть.
Saratan
Цитата(aaarrr @ Nov 19 2007, 16:22) *
Странно: из регистра 0x0F читается 0x0F, а с остальными все в порядке. Похоже на программный глюк. После сброса там точно 0x2a должно быть.

Код
  
LPC2294CEClear(); //Ресет САА
  for(long i=1;i<1000000;i++)
  {}  
  LPC2294CESet();
  for(long i=1;i<10000000;i++)
  {}  
  
printf( "Tr1 \n\r" );


for(char i=1;i<=23;i++)
{
  saa7113WSub(i, Saa7113InitMass[i]); //Запись байта Saa7113InitMass[i] в регистр i
  
    for(long j=1;j<10000000;j++)
    {}  
    
    printf("%d = %d\n\r", Saa7113InitMass[i], saa7113RSub(i));
  

    while(saa7113RSub(i)!=Saa7113InitMass[i]) //Чтение байта из регистра i
    {
      printf("Error #%d\n\r", i);  
    saa7113WSub(i, Saa7113InitMass[i]);
      for(long j=1;j<1000000;j++)
      {}  
    }
  
  printf("%d\n\r",i);
}


//Функция чтения байта

unsigned char  saa7113RSub(unsigned char Sub)
  {
  I2CSub = Sub; // задать функцию
  wr_rd = 1; //установить признак чтения
  end_rd = 0; //сбросить признак окончания чтения
  I2CONCLR = 0xFF; // сбросить все флаги I2C
  I2CONSET = 0x40; // разрешение I2C
  I2CONSET = 0x20; // передать условие START I2C

  while (end_rd == 0); // ожидать окончания чтения
  return I2DAT; //возврат прочитанного байта
  }

//Функция записи байта

void saa7113WSub(unsigned char Sub, unsigned char data_I2C)
  {
  I2CSub = Sub; // задать функцию
  I2Cwr_byte = data_I2C; // задать байт данных для записи
  wr_rd = 0; //установить признак записи
  I2CONCLR = 0xFF; // сбросить все флаги I2C
  I2CONSET = 0x40; // разрешение I2C
  I2CONSET = 0x20; // передать условие START I2C
  }


//функция-обработчик прерывания от I2C --------------------------------------------
static void I2CInterrupt()
{
  switch(I2STAT)
       {
        case (0x08): // было передано условие START
             I2CONCLR = 0x20; //сброс флага START I2C
             I2DAT=72; //передача адреса устр на шине и признака записи (W)
        break;
        case (0x10): // было передано условие повторный START
             I2CONCLR = 0x20; //сброс флага START I2C
             I2DAT=73; //передача адреса устр на шине и признака чтения (R)
        break;
        case (0x18): // был передан адрес ведомого + W, получен ACK
             //передача адреса
             I2DAT=I2CSub;
        break;
        case (0x28): // был передан байт данных, получен ACK
                   switch(wr_rd)
                     {
                       case (0):
                       //передача байта данных
                       I2DAT=I2Cwr_byte;
                       break;
                       case (1):
                       // передать условие START I2C
                       I2CONSET = 0x20; // повторный START
                       break;
                       default:
                       break;
                     }

        break;
        
        case (0x40): // был передан адрес ведомого + R, получен ACK
        I2CONCLR = 0x04; //сброс флага ACC I2C, чтобы возвратить NOT ACK
        break;
        case (0x58): // был получен байт данных, возвращен ACK
        I2CONSET = 0x10; // передать условие STOP I2C
        end_rd = 1; //установить признак окончания чтения
        break;
        default:
        break;
       }
I2CONCLR = 0x08; // сброс прерывания от I2C
}

Вродебы всё идёт так как и должно итти, я имею в виду чтение там, запись...
Сергей Борщ
for(long volatile i=1;i<1000000;i++) {} Иначе оптимизатор выбросит весь цикл и задержки не будет.
Saratan
Цитата(Сергей Борщ @ Nov 19 2007, 17:25) *
for(long volatile i=1;i<1000000;i++) {} Иначе оптимизатор выбросит весь цикл и задержки не будет.
Да вроде есть... Меняю условие меняется задержка. У меня IAR.
Сергей Борщ
Цитата(Saratan @ Nov 20 2007, 08:56) *
Да вроде есть... Меняю условие меняется задержка. У меня IAR.
Включите оптимизацию и задержка скорее всего "магически" исчезнет. Ведь внутри этого цикла ничего не происходит, т.е. с точки зрения компилятора он не влияет на программу, значит его можно выкинуть. volatile указывает, что цикл вам все же нужен. А проверить можно не меняя задержку, а посмотрев листинг. А с SAA7113 не работал, по остальному не подскажу.
Saratan
Цитата(Сергей Борщ @ Nov 20 2007, 12:03) *
Включите оптимизацию и задержка скорее всего "магически" исчезнет. Ведь внутри этого цикла ничего не происходит, т.е. с точки зрения компилятора он не влияет на программу, значит его можно выкинуть. volatile указывает, что цикл вам все же нужен. А проверить можно не меняя задержку, а посмотрев листинг. А с SAA7113 не работал, по остальному не подскажу.
Спасибо, буду иметь в виду.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.