DAPA 0 11 августа, 2011 Опубликовано 11 августа, 2011 · Жалоба Есть 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 11 августа, 2011 Опубликовано 11 августа, 2011 · Жалоба Хоть бы длительность HSYNC написали для порядка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DAPA 0 11 августа, 2011 Опубликовано 11 августа, 2011 (изменено) · Жалоба Пардон, виноват:) Период следования импульсов HSYNC примерно 260 мкс, из которых высокий уровень занимает ~42мкс, в течении которых и надо успеть считать данные с PIO 256 раз Изменено 11 августа, 2011 пользователем DAPA Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 11 августа, 2011 Опубликовано 11 августа, 2011 · Жалоба Период следования импульсов примерно 0.18 мкс Это каких импульсов? Я правильно понимаю, что tHSYNC = 0.18 * 256 = 46.08us? Если так, то полученное значение 100 проходов цикла очень похоже на суровую правду жизни: Цикл выполняется за 22 такта; если процессор выполняет программу из RAM на частоте 48МГц, это составляет 458.33ns 46.08 / 0.45833 = 100.5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DAPA 0 11 августа, 2011 Опубликовано 11 августа, 2011 · Жалоба Дело в том что подобная задача решалась( не мной :) ) на atmega, и тот факт, что мега успевает а арм нет, не даёт покоя!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 11 августа, 2011 Опубликовано 11 августа, 2011 · Жалоба Период следования импульсов HSYNC примерно 260 мкс, из которых высокий уровень занимает ~42мкс, в течении которых и надо успеть считать данные с PIO 256 раз ОК, 42 / 256 = 164нс на считывание, или 9 тактов процессора при MCK = 55MHz. Одно считывание занимает 4 такта + 1 такт на сдвиг + 2 такта на запись в память = 7 тактов. То есть теоретически можно успеть, если развернуть цикл и не проверять состояние HSYNC во время считывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DAPA 0 11 августа, 2011 Опубликовано 11 августа, 2011 · Жалоба Спасибо за развёрнутый ответ:) Но считывание должно происходить в то время, когда HSYNC в высоком уровне. (Просто речь идёт о чтении данных с камеры :), HSYNC - синхронизация строк ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 11 августа, 2011 Опубликовано 11 августа, 2011 · Жалоба Но считывание должно происходить в то время, когда HSYNC в высоком уровне. Если частота постоянная, то можно только ловить фронт HSYNC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 12 августа, 2011 Опубликовано 12 августа, 2011 (изменено) · Жалоба 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. Изменено 12 августа, 2011 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Хотелось бы узнать смысл квалификатора volatile во второй строчке. Ну и в первой, за одно. Смысла нет, но на скорость работы интересующего участка не влияет никак. Ещё, по недоброй традиции копипэймта, и pPIO как volatile обявили? Так Вы всё сделали для замедления программы. Ну, по косвенным признакам, этого нет. А тормоз получился бы знатный, да. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться