реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> AT91SAM7S не успевает читать данные с PIO!?, Кричу о помощи!!!!!
DAPA
сообщение Aug 11 2011, 12:26
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664



Есть 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.gif 1111493779.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 11 2011, 12:31
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Хоть бы длительность HSYNC написали для порядка.
Go to the top of the page
 
+Quote Post
DAPA
сообщение Aug 11 2011, 12:49
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664



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

Сообщение отредактировал DAPA - Aug 11 2011, 12:58
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 11 2011, 13:00
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(DAPA @ Aug 11 2011, 16:49) *
Период следования импульсов примерно 0.18 мкс

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

Если так, то полученное значение 100 проходов цикла очень похоже на суровую правду жизни:
Цикл выполняется за 22 такта; если процессор выполняет программу из RAM на частоте 48МГц, это составляет 458.33ns
46.08 / 0.45833 = 100.5
Go to the top of the page
 
+Quote Post
DAPA
сообщение Aug 11 2011, 13:04
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664



Дело в том что подобная задача решалась( не мной sm.gif ) на atmega, и тот факт, что мега успевает а арм нет, не даёт покоя!!!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 11 2011, 13:04
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(DAPA @ Aug 11 2011, 16:49) *
Период следования импульсов HSYNC примерно 260 мкс, из которых высокий уровень занимает ~42мкс, в течении которых и надо успеть считать данные с PIO 256 раз

ОК, 42 / 256 = 164нс на считывание, или 9 тактов процессора при MCK = 55MHz. Одно считывание занимает 4 такта + 1 такт на сдвиг + 2 такта на запись в память = 7 тактов.
То есть теоретически можно успеть, если развернуть цикл и не проверять состояние HSYNC во время считывания.
Go to the top of the page
 
+Quote Post
DAPA
сообщение Aug 11 2011, 13:20
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664



Спасибо за развёрнутый ответsm.gif
Но считывание должно происходить в то время, когда HSYNC в высоком уровне.
(Просто речь идёт о чтении данных с камеры sm.gif, HSYNC - синхронизация строк )
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 11 2011, 13:24
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(DAPA @ Aug 11 2011, 17:20) *
Но считывание должно происходить в то время, когда HSYNC в высоком уровне.

Если частота постоянная, то можно только ловить фронт HSYNC.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 12 2011, 09:14
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



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

Хотелось бы узнать смысл квалификатора volatile во второй строчке. Ну и в первой, за одно.
Ещё, по недоброй традиции копипэймта, и pPIO как volatile обявили? Так Вы всё сделали для замедления программы.
Цитата(DAPA @ Aug 11 2011, 17:20) *
(Просто речь идёт о чтении данных с камеры sm.gif, HSYNC - синхронизация строк )


разумнее было бы ловить фронт (через IRQx) и считывать конкретное количество сэмплов.
Похожая (по ловле HSYNC) задача была при реализации on screen display.
Подумайте о применении АЦП с последовательным интерфейсом - и использовании ПДП на SSC.

Сообщение отредактировал Genadi Zawidowski - Aug 12 2011, 09:26
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 12 2011, 11:37
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Genadi Zawidowski @ Aug 12 2011, 13:14) *
Хотелось бы узнать смысл квалификатора volatile во второй строчке. Ну и в первой, за одно.

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

Цитата(Genadi Zawidowski @ Aug 12 2011, 13:14) *
Ещё, по недоброй традиции копипэймта, и pPIO как volatile обявили? Так Вы всё сделали для замедления программы.

Ну, по косвенным признакам, этого нет. А тормоз получился бы знатный, да.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 02:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01438 секунд с 7
ELECTRONIX ©2004-2016