|
|
  |
ARM. Энкодеры и акселерометры, Помогите решить задачу |
|
|
|
Sep 2 2009, 12:30
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Zliva @ Sep 1 2009, 14:29)  В режиме симулятора timer1 работает. Дергаю PIN15 в симуляторе работает. Но когда дергаю PIN0 (смотрите схему), появляется You have tried to modify a port pin which is configured as output! Что делать? PIN0 - TIOA0, и относится к нулевому таймеру, его сконфигурировать не забыли? Цитата(Zliva @ Sep 1 2009, 14:29)  Как после прерывания сбросить после считывания в 0? Не понял вопрос. Цитата(Zliva @ Sep 1 2009, 14:29)  Что означает эта запись «dummy = dummy»? Это достаточно некрасивый трюк для подавления warning'а компилятора. Код dummy = TC_pt->TC_SR; dummy = dummy; можно заменить на Код TC_pt->TC_SR; Цитата(Zliva @ Sep 1 2009, 14:29)  Если Вы не против, могу Вас включить. Спасибо, конечно, но не стоит
|
|
|
|
|
Sep 2 2009, 17:41
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Sep 2 2009, 15:30)  PIN0 - TIOA0, и относится к нулевому таймеру, его сконфигурировать не забыли? Как его настроить? Цитата Не понял вопрос. У меня сначала прога в прерывание заходила один раз и все. Но когда закомментировал AT91C_TC_LDBDIS, все вроде заработало. Верно ли я сконфигурировал TC_CMR? И еще. Сегодня пробовал тестировать на осциллографе дачик ускорения. Все вроде ок. ШИМ генерируется, аналоговый выход работает, но когда я кручу плату в плоскости X, Y(плоскость перпендикулярна земле) -. Взял контактор на 220В для эксперимента. Прикрепил дачки к якорю. Придерживая контактор отверткой изменяю его амплитуду. Изменений ШИМ и аналога нет. Тряс, крутил, что только не делал(по нем не прыгал) ничего. Можно считать что механика в нутрии датчика умерла? Кто нибудь работал с серией ADXL202/210? Думаю приобрести такой же датчик (просто все под него сделано) и парочку LIS302DL с интерфейсом SPI и на три оси. Что народ скажет?
Сообщение отредактировал Zliva - Sep 2 2009, 18:02
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Sep 2 2009, 18:23
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Zliva @ Sep 2 2009, 21:41)  Как его настроить? Понятно, это была только часть кода. Что-то не вижу настройки PIO для TIOAx. Старайтесь не копировать "библиотечные" функции типа AT91F_ - получаете набор маразмов (типа dummy) и просто ошибок как здесь: Код void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId) { ... TC_pt->TC_CMR = Mode;
TC_pt->TC_CMR = ((unsigned int) 0x0 << 15) /*0 -режим захвата разрешен.*/ Mode пишется в никуда. Цитата(Zliva @ Sep 2 2009, 21:41)  У меня сначала прога в прерывание заходила один раз и все. Но когда закомментировал AT91C_TC_LDBDIS, все вроде заработало. Верно ли я сконфигурировал TC_CMR? А зачем запрещать или останавливать (как это сделано сейчас) таймер по LDRB? Так же все измерения лесом пойдут.
|
|
|
|
|
Sep 2 2009, 19:20
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Sep 2 2009, 21:23)  Понятно, это была только часть кода. Что-то не вижу настройки PIO для TIOAx.
Старайтесь не копировать "библиотечные" функции типа AT91F_ - получаете набор маразмов (типа dummy) и просто ошибок как здесь: Mode пишется в никуда. Что именно здесь не так? Вот так инициализирую. Больше нигде не используется TIOA. Или нужно где-то прописать TIOA еще? Код #define TIOA0 (1<<0) #define TIOA1 (1<<15) #define TIOA0_MASK (1<<0) #define TIOA1_MASK (1<<15) #define TIOA_MASK (TIOA0_MASK|TIOA1_MASK) ……. int main (void) { *AT91C_PMC_PCER = (1UL << AT91C_ID_PIOA) | (1UL << AT91C_ID_IRQ0) | (1UL << AT91C_ID_US0) | (1UL << AT91C_ID_TC1);
pPIO->PIO_PER = LED_MASK; pPIO->PIO_OER = LED_MASK; pPIO->PIO_SODR = LED_MASK;
init_timer (); pioa_irq_init(); init_serial(); timer_init ();
while (1) { pPIO->PIO_CODR = LED1; wait(10); printf ("E1=%8.2f",accel_X); pPIO->PIO_SODR = LED1; wait(10); } } Что скажете насчет работоспособности датчика. Пост выше?
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Sep 3 2009, 10:37
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Zliva @ Sep 2 2009, 23:20)  Вот так инициализирую. Больше нигде не используется TIOA. Или нужно где-то прописать TIOA еще? Тут только дефайны, где инициализация? Нужно перевести TIOAx в режим Peripheral. Цитата(Zliva @ Sep 3 2009, 12:37)  Подскажите пожалуйста (код выше). Дело в том что если LDRBS = 1 значение в В заноситься (спадающий фронт), LDRАS = 1 значение в А заноситься (нарастающий фронт). В чем может быть проблема? Что я делаю не так? Постарайтесь описать проблему так, чтобы можно было понять.
|
|
|
|
|
Sep 3 2009, 15:02
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Sep 3 2009, 13:37)  Тут только дефайны, где инициализация? Нужно перевести TIOAx в режим Peripheral. Как это можно сделать? Что-то не встречал примеров, или просто не туда смотрю. Цитата Постарайтесь описать проблему так, чтобы можно было понять. Имелось ввиду, что когда возникает прерывание по фронтам, нужно его разрешить Код AT91C_BASE_TC1->TC_IER = AT91C_TC_LDRAS|AT91C_TC_LDRBS; Правильно ли я понял?
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Sep 3 2009, 15:12
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Zliva @ Sep 3 2009, 19:02)  Как это можно сделать? Что-то не встречал примеров, или просто не туда смотрю. Смотреть надо документацию: 10.4 PIO Controller A Multiplexing 27. Parallel Input/Output Controller (PIO) На все случаи примеров не найдете. Код *AT91C_PIOA_BSR = TIOA_MASK; *AT91C_PIOA_PDR = TIOA_MASK; Цитата(Zliva @ Sep 3 2009, 19:02)  Имелось ввиду, что когда возникает прерывание по фронтам, нужно его разрешить Код AT91C_BASE_TC1->TC_IER = AT91C_TC_LDRAS|AT91C_TC_LDRBS; Правильно ли я понял? Все равно ничего не понял. Прерывание возникает, когда оно уже разрешено.
|
|
|
|
|
Sep 3 2009, 15:51
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Sep 3 2009, 18:12)  Смотреть надо документацию: 10.4 PIO Controller A Multiplexing 27. Parallel Input/Output Controller (PIO) На все случаи примеров не найдете. Посмотрите пожалуйста полностью все исподники. Может будут какие-то комментарии. Не могу с *AT91C_PIOA_BSR = TIOA_MASK и с *AT91C_PIOA_PDR = TIOA_MASK разобраться. Цитата Все равно ничего не понял. Прерывание возникает, когда оно уже разрешено. Вот что имелось в виду (см. картинку). В момент появления нарастающего фронта Та возникает прерывание по нарастающему фронту (LDRАS = 1), значение заносится в RА и сохраняем его в Var_Та. Когда возникает прерывание (LDRВS = 1) по спадающему фронту в момент Тb значение заносится в RВ и сохраняется Var_Тb. При появление нарастающего фронта Те возникает прерывание по нарастающему фронту снова, и мы сохраняем его в Var_Те. Вот (я так думаю) нужна эта запись AT91C_BASE_TC1->TC_IER = AT91C_TC_LDRAS|AT91C_TC_LDRBS. Но я могу ошибаться. Я вот еще что думаю. Возможнее все-таки переполнение счетчика. Как здесь быть?
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Sep 3 2009, 16:12
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Zliva @ Sep 3 2009, 19:51)  Посмотрите пожалуйста полностью все исподники. Может будут какие-то комментарии. Не могу с *AT91C_PIOA_BSR = TIOA_MASK и с *AT91C_PIOA_PDR = TIOA_MASK разобраться. Я тоже не могу все досконально проверить и еще пересказать документацию. Просто изучите даташит, ничего сложного в этом не вижу. Цитата(Zliva @ Sep 3 2009, 19:51)  Вот что имелось в виду (см. картинку). В момент появления нарастающего фронта Та возникает прерывание по нарастающему фронту (LDRАS = 1), значение заносится в RА и сохраняем его в Var_Та. Когда возникает прерывание (LDRВS = 1) по спадающему фронту в момент Тb значение заносится в RВ и сохраняется Var_Тb. При появление нарастающего фронта Те возникает прерывание по нарастающему фронту снова, и мы сохраняем его в Var_Те. Вот (я так думаю) нужна эта запись AT91C_BASE_TC1->TC_IER = AT91C_TC_LDRAS|AT91C_TC_LDRBS. Но я могу ошибаться. Я вот еще что думаю. Возможнее все-таки переполнение счетчика. Как здесь быть? Ну да, чтобы получать прерывания по факту загрузки RA и RB их нужно предварительно разрешить. В этом и состоял вопрос? С логикой все немного не так: по каждой загрузке RA смотрим разницу с предыдущим значением и получаем таким образом период ШИМ, по загрузке RB - смотрим разницу RB-RA и получаем длительность импульса. На основании этих двух чисел получаем результат. И переполнение таймера не страшно, если, конечно, его период не выбран меньше периода ШИМ-сигнала.
|
|
|
|
|
Sep 3 2009, 19:18
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Вот так инициализирую Код #define LED1 (1<<17) #define LED2 (1<<18) #define NB_LED 2 #define LED_MASK (LED1|LED2)
#define SW1_MASK (1<<20) #define SW2_MASK (1<<19) #define SW_MASK (SW1_MASK|SW2_MASK) #define SW1 (1<<20) #define SW2 (1<<19) #define TIOA0 (1<<0) #define TIOA1 (1<<15) #define TIOA0_MASK (1<<0) #define TIOA1_MASK (1<<15) #define TIOA_MASK (TIOA0_MASK|TIOA1_MASK)
#define ENCODER1_A_MASK (1<<26) #define ENCODER1_B_MASK (1<<28) #define ENCODER2_A_MASK (1<<29) #define ENCODER2_B_MASK (1<<30) #define ENCODER_A_MASK (ENCODER1_A_MASK|ENCODER1_B_MASK|ENCODER2_A_MASK|ENCODER2_B_MASK)
#define ENCODER1_A (1<<26) #define ENCODER1_B (1<<28) #define ENCODER2_A (1<<29) #define ENCODER2_B (1<<30) …. /*OUTPUT*/ pPIO->PIO_PER = LED_MASK; pPIO->PIO_OER = LED_MASK; pPIO->PIO_SODR = LED_MASK; /*INPUT*/ pPIO->PIO_ODR = SW_MASK; pPIO->PIO_PER = SW_MASK; pPIO->PIO_IER = ENCODER_A_MASK; /*INPUT peripheral*/ pPIO->PIO_BSR = TIOA_MASK; pPIO->PIO_PDR = TIOA_MASK; Вся периферия работает. Но вот эта ошибка достала. Что делать? --------------------------- PIOA Error --------------------------- You have tried to modify a port pin which is configured as output!
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Sep 3 2009, 19:33
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Sep 3 2009, 22:25)  Плюнуть на сообщения симулятора. Спасибо, так и заделаю. Буду дальше ШИМ душить
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Sep 3 2009, 20:06
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Sep 3 2009, 22:52)  Правильно: вообще не стоит полагаться на симуляцию периферии. Если таймеры настроены идентично, а ругается он только на один, то это явный косяк. Что вы имеете ввиду? И еще, когда пины 27, 28, 29, 30 энкодера настраиваю на вход, в симуляции пин 27 выдает коварное сообщение (которое выше), которое я игнорирую, но когда пины 26, 28, 29, 30 энкодера настраиваю на вход, в симуляции пин 26 работает нормально.
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|