Перейти к содержанию
    

AT91SAM7S не успевает читать данные с PIO!?

Есть AT91SAM7S256 на один пин поступает сигнал синхронизации, по которому с нужно считать с других пинов в память данные(параллельная шина), но как ни крути больше в цикле считывания не удаётся, даже, инкрементировать переменную больше 100 раз, вместо положенных 256!!!

Вот фрагмент отвечающего за эото кода:

uint16_t MAS_DAT[LENTH];
...
__inline void Get_Data(void) {
    volatile uint16_t *poi = (uint16_t*) MAS_DAT;
    volatile uint16_t i = 0, l = 0;
    uint32_t tmp1,tmp2;
    while (pPIO->PIO_PDSR & VSYNC) {
        i = 0;
        while (pPIO->PIO_PDSR & HSYNC) {
            //i++;
            //while(pPIO->PIO_PDSR&(1<<30));//CLK
            tmp1 = (pPIO->PIO_PDSR>>5);
            tmp2 = (pPIO->PIO_PDSR>>5);
             *poi = (uint16_t)(tmp2<<8)|tmp1;
             poi++;
        }
        //asm("add %[value], %[value],#1" : [value] "=r" (l));
        l++;
        while (!(pPIO->PIO_PDSR & HSYNC) && (pPIO->PIO_PDSR & VSYNC));
    }
    poi = (uint16_t*)MAS_DAT;
    *poi = i;
    poi++;
    *poi = l;
}

:smile3046: :1111493779:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пардон, виноват:)

Период следования импульсов HSYNC примерно 260 мкс, из которых высокий уровень занимает ~42мкс, в течении которых и надо успеть считать данные с PIO 256 раз

Изменено пользователем DAPA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Период следования импульсов примерно 0.18 мкс

Это каких импульсов? Я правильно понимаю, что tHSYNC = 0.18 * 256 = 46.08us?

 

Если так, то полученное значение 100 проходов цикла очень похоже на суровую правду жизни:

Цикл выполняется за 22 такта; если процессор выполняет программу из RAM на частоте 48МГц, это составляет 458.33ns

46.08 / 0.45833 = 100.5

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дело в том что подобная задача решалась( не мной :) ) на atmega, и тот факт, что мега успевает а арм нет, не даёт покоя!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Период следования импульсов HSYNC примерно 260 мкс, из которых высокий уровень занимает ~42мкс, в течении которых и надо успеть считать данные с PIO 256 раз

ОК, 42 / 256 = 164нс на считывание, или 9 тактов процессора при MCK = 55MHz. Одно считывание занимает 4 такта + 1 такт на сдвиг + 2 такта на запись в память = 7 тактов.

То есть теоретически можно успеть, если развернуть цикл и не проверять состояние HSYNC во время считывания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за развёрнутый ответ:)

Но считывание должно происходить в то время, когда HSYNC в высоком уровне.

(Просто речь идёт о чтении данных с камеры :), HSYNC - синхронизация строк )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но считывание должно происходить в то время, когда HSYNC в высоком уровне.

Если частота постоянная, то можно только ловить фронт HSYNC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

    volatile uint16_t *poi = (uint16_t*) MAS_DAT;
    volatile uint16_t i = 0, l = 0;

Хотелось бы узнать смысл квалификатора volatile во второй строчке. Ну и в первой, за одно.

Ещё, по недоброй традиции копипэймта, и pPIO как volatile обявили? Так Вы всё сделали для замедления программы.

(Просто речь идёт о чтении данных с камеры :), HSYNC - синхронизация строк )

 

разумнее было бы ловить фронт (через IRQx) и считывать конкретное количество сэмплов.

Похожая (по ловле HSYNC) задача была при реализации on screen display.

Подумайте о применении АЦП с последовательным интерфейсом - и использовании ПДП на SSC.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотелось бы узнать смысл квалификатора volatile во второй строчке. Ну и в первой, за одно.

Смысла нет, но на скорость работы интересующего участка не влияет никак.

 

Ещё, по недоброй традиции копипэймта, и pPIO как volatile обявили? Так Вы всё сделали для замедления программы.

Ну, по косвенным признакам, этого нет. А тормоз получился бы знатный, да.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...