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

 
 
13 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> ARM. Энкодеры и акселерометры, Помогите решить задачу
aaarrr
сообщение Aug 24 2009, 13:51
Сообщение #31


Гуру
******

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



А pPIO правильно проинициализирован?

Пардон, вижу. Лучше так не делать - лишний оверхед по памяти и производительности. Пишите просто AT91C_BASE_PIOA->PIO_PDSR или *AT91C_PIOA_PDSR.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 14:09
Сообщение #32


Частый гость
**

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 16:20
Сообщение #33


Частый гость
**

Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318



Проанализировав все выше упомянутое, склоняюсь к мысли задействовать прерывания по двум каналам. Так как от смещения фазы не уйти.
Прав ли я?
Кто имеет алгоритм для обработки сигналов инкрементирующего энкодера с использованием маркера?

p.s. aaarrr, огромное человеческое СПАСИБО за помощь.


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 24 2009, 16:35
Сообщение #34


Гуру
******

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



Цитата(Zliva @ Aug 24 2009, 20:20) *
Проанализировав все выше упомянутое, склоняюсь к мысли задействовать прерывания по двум каналам. Так как от смещения фазы не уйти.

Так и задействуйте общее прерывание PIO - так Вы будете получать прерывание на каждый фронт каждого сигнала.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 18:17
Сообщение #35


Частый гость
**

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 24 2009, 19:23
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 19:34
Сообщение #37


Частый гость
**

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 24 2009, 19:37
Сообщение #38


Гуру
******

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



Цитата(Zliva @ Aug 24 2009, 23:34) *
Как сюда влепить для PIOA прерывания. Или я с терминологией путаюсь?

Это же просто универсальная обертка. Переименуйте irq0_nint и irq0_int, если хотите, и все.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 20:25
Сообщение #39


Частый гость
**

Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318



Цитата(aaarrr @ Aug 24 2009, 22:37) *
Это же просто универсальная обертка. Переименуйте irq0_nint и irq0_int, если хотите, и все.

Ничего не получается с прерыванием от PIOA. Все сделал как Вы говорили – НИЧЕГО. Что-то виснет микроконтроллер. Когда комментирую pioa_irq_init() все работает (прерывания не работают), лампочки дрыгаются. Вложу исподники. Посмотрите пожалуйста.
Прикрепленные файлы
Прикрепленный файл  Encoder_v.01.rar ( 12.03 килобайт ) Кол-во скачиваний: 17
 


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 24 2009, 20:29
Сообщение #40


Гуру
******

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



Дык __irq уберите.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 20:35
Сообщение #41


Частый гость
**

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 24 2009, 20:53
Сообщение #42


Гуру
******

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



Цитата(Zliva @ Aug 25 2009, 00:35) *
Убрал. Все равно висим. В симуляторе вроде ОК.

AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE - здесь фронт уже не нужен, т.е. вреден. Фронты отловит контроллер PIO.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 20:58
Сообщение #43


Частый гость
**

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 24 2009, 21:13
Сообщение #44


Гуру
******

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



Цитата(Zliva @ Aug 25 2009, 00:58) *
Все равно висим. Может что-то здесь AREA IRQ0, CODE, READONLY?

Ну, на зависании это и не должно было сказаться. Извините, если ввел в заблуждение.

Что-то не вижу в упор никаких проблем sad.gif Убрать только __irq из void irq_pioa_nin(void) - и все должно работать.

Цитата(Zliva @ Aug 25 2009, 00:58) *
Может что-то здесь AREA IRQ0, CODE, READONLY?

Нет, не может.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 21:34
Сообщение #45


Частый гость
**

Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318



Убрал строчку printf ("E1=%d\n",ENCODER1_Position); с тела прерывания. ЗАРАБОТАЛО


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post

13 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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