|
|
  |
ARM. Энкодеры и акселерометры, Помогите решить задачу |
|
|
|
Aug 24 2009, 14:09
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Решил сделать просто: Код void irq0_nint (void) { if ((pPIO->PIO_PDSR & ENCODER1_B) == 0) { ENCODER1_Position++;} else { ENCODER1_Position--; } *AT91C_AIC_EOICR = 0; AT91C_BASE_PIOA->PIO_ISR;} и посмотреть, что получилось. Так вот. Цитата(Zliva @ Aug 24 2009, 15:09)  .....рычаг вала энкодера поворачиваю в какое-то крайнее положение до упора(соприкосновение двух винтов). Затем делаю RESET устройства (для того, чтобы начать отсчет с нуля). Проворачиваю до следующего крайнего положения рычаг вала энкодера до упора (соприкосновение винта рычага и винта на корпусе энкодера). Затем кручу рычаг в обратную сторону до упора. И так несколько раз. Получаю следующую последовательность в крайних положениях (как изменилось значение положения крайних положениях): 0-205->{Вращаю влево} 205-1->{Вращаю вправо} 1-206->{Вращаю влево} 206-2->{Вращаю вправо} 2-207 ->{Вращаю влево} 207-3->{Вращаю вправо} 3-208->{Вращаю влево} и т.д. Значение постоянно смещается на 205. Где грабли непойму.
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Aug 24 2009, 18:17
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Aug 24 2009, 19:35)  Так и задействуйте общее прерывание PIO - так Вы будете получать прерывание на каждый фронт каждого сигнала. Это меня устраивает. Помогите пожалуйста сконфигурировать стартап irq_pioa.s для прерывания irq_pioa с использованием Ваших функций, которые Вы приводили немного выше. И кстати, переменную PIOA_IRQ_PRIORITY Вы как определили?
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Aug 24 2009, 19:23
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Zliva @ Aug 24 2009, 22:17)  Это меня устраивает. Помогите пожалуйста сконфигурировать стартап irq_pioa.s для прерывания irq_pioa с использованием Ваших функций, которые Вы приводили немного выше. Не совсем понял, в чем состоит вопрос. Просто уберите модификатор __irq для использования с вложенными вызовами. Цитата(Zliva @ Aug 24 2009, 22:17)  И кстати, переменную PIOA_IRQ_PRIORITY Вы как определили? Это просто макрос. Код #define PIOA_IRQ_PRIORITY 7
|
|
|
|
|
Aug 24 2009, 19:34
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Aug 24 2009, 22:23)  Это просто макрос. Код #define PIOA_IRQ_PRIORITY 7 Спасибо. Цитата Не совсем понял, в чем состоит вопрос. Просто уберите модификатор __irq для использования с вложенными вызовами. Есть у меня файл с названием IRQ0.s. Там прописано Код AREA IRQ0, CODE, READONLY ARM PRESERVE8 ALIGN IMPORT irq0_nint EXPORT irq0_int irq0_int FUNCTION SUB LR, LR, #4 STMFD SP!, {R0-R3, R12, LR} MRS R0, SPSR STMFD SP!, {R0, R1} MSR CPSR_c, #0x1F STMFD SP!, {R0, LR} LDR R0, =irq0_nint MOV LR, PC BX R0 LDMFD SP!, {R0, LR} MSR CPSR_c, #0x92 LDMFD SP!, {R0, R1} MSR SPSR_cxsf, R0 LDMFD SP!, {R0-R3, R12, PC}^ ; ENDFUNC END Как сюда влепить для PIOA прерывания. Или я с терминологией путаюсь?
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Aug 24 2009, 20:25
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Aug 24 2009, 22:37)  Это же просто универсальная обертка. Переименуйте irq0_nint и irq0_int, если хотите, и все. Ничего не получается с прерыванием от PIOA. Все сделал как Вы говорили – НИЧЕГО. Что-то виснет микроконтроллер. Когда комментирую pioa_irq_init() все работает (прерывания не работают), лампочки дрыгаются. Вложу исподники. Посмотрите пожалуйста.
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Aug 24 2009, 20:35
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Aug 24 2009, 23:29)  Дык __irq уберите. Убрал. Все равно висим. В симуляторе вроде ОК.
Сообщение отредактировал Zliva - Aug 24 2009, 20:39
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Aug 24 2009, 20:58
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Aug 24 2009, 23:53)  AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE - здесь фронт уже не нужен, т.е. вреден. Фронты отловит контроллер PIO. Все равно висим. Может что-то здесь AREA IRQ0, CODE, READONLY?
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Aug 24 2009, 21:13
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Zliva @ Aug 25 2009, 00:58)  Все равно висим. Может что-то здесь AREA IRQ0, CODE, READONLY? Ну, на зависании это и не должно было сказаться. Извините, если ввел в заблуждение. Что-то не вижу в упор никаких проблем  Убрать только __irq из void irq_pioa_nin(void) - и все должно работать. Цитата(Zliva @ Aug 25 2009, 00:58)  Может что-то здесь AREA IRQ0, CODE, READONLY? Нет, не может.
|
|
|
|
|
Aug 24 2009, 21:34
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Убрал строчку printf ("E1=%d\n",ENCODER1_Position); с тела прерывания. ЗАРАБОТАЛО
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|