|
|
  |
AT91SAM7S не успевает читать данные с PIO!?, Кричу о помощи!!!!! |
|
|
|
Aug 11 2011, 12:26
|
Участник

Группа: Участник
Сообщений: 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; }
|
|
|
|
|
Aug 11 2011, 12:49
|
Участник

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

|
Пардон, виноват  Период следования импульсов HSYNC примерно 260 мкс, из которых высокий уровень занимает ~42мкс, в течении которых и надо успеть считать данные с PIO 256 раз
Сообщение отредактировал DAPA - Aug 11 2011, 12:58
|
|
|
|
|
Aug 11 2011, 13:00
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 11 2011, 13:04
|
Участник

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

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

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

|
Спасибо за развёрнутый ответ  Но считывание должно происходить в то время, когда HSYNC в высоком уровне. (Просто речь идёт о чтении данных с камеры  , HSYNC - синхронизация строк )
|
|
|
|
|
Aug 12 2011, 09:14
|

Профессионал
    
Группа: Участник
Сообщений: 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)  (Просто речь идёт о чтении данных с камеры  , HSYNC - синхронизация строк ) разумнее было бы ловить фронт (через IRQx) и считывать конкретное количество сэмплов. Похожая (по ловле HSYNC) задача была при реализации on screen display. Подумайте о применении АЦП с последовательным интерфейсом - и использовании ПДП на SSC.
Сообщение отредактировал Genadi Zawidowski - Aug 12 2011, 09:26
|
|
|
|
|
Aug 12 2011, 11:37
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Genadi Zawidowski @ Aug 12 2011, 13:14)  Хотелось бы узнать смысл квалификатора volatile во второй строчке. Ну и в первой, за одно. Смысла нет, но на скорость работы интересующего участка не влияет никак. Цитата(Genadi Zawidowski @ Aug 12 2011, 13:14)  Ещё, по недоброй традиции копипэймта, и pPIO как volatile обявили? Так Вы всё сделали для замедления программы. Ну, по косвенным признакам, этого нет. А тормоз получился бы знатный, да.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|