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

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


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

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



Цитата(aaarrr @ Aug 23 2009, 19:11) *
Прерывание от IRQ0 является внешним источником, поэтому обратите внимание на такие строки в хидере:

Вижу в 232analyzer (утилита для работы с ком-портом), что при однократном нажатии кнопки (энкодер лежит с боку, пока не подключал), данные получаю и оны непрерывно поступают, пока кнопка нажата, а я хочу, чтобы происходило прерывание на переходе 0-1. Чем можете помочь? Неужели дребезг?
Манипулою так:
Прерывания от irq0 заведено на кнопку (симулирую линию энкодера А), а РА20 на кнопку B2(симулирую линию энкодера В). При однократном нажатии на B1 значение убывает, но их приходит очень много. Например, один раз нажал получил значение 9 десть раз. При удерживании В2 нажимаю на B1. Значения идут по возрастающей. Количество резолюций поставил 10 только для тестирования. В реальности энкодер имеет 1024 имп/об.

Цитата
А откуда это видно?

Утилита 232analyzer для работы с ком-портом
Цитата
Шапка с безобразным оверхедом. Нет никакой необходимости пихать все регистры на стек: R4-R11 и так никто не тронет.

Тогда как правильно сделать?


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


Гуру
******

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



Цитата(Zliva @ Aug 23 2009, 22:23) *
Вижу в 232analyzer (утилита для работы с ком-портом), что при однократном нажатии кнопки (энкодер лежит с боку, пока не подключал), данные получаю и оны непрерывно поступают, пока кнопка нажата, а я хочу, чтобы происходило прерывание на переходе 0-1. Чем можете помочь? Неужели дребезг?

А что Вас удивляет? Вполне естественно, что кнопка имеет дребезг.

Цитата(Zliva @ Aug 23 2009, 22:23) *
Утилита 232analyzer для работы с ком-портом

Вы не выложили ту часть кода, которая заведует отравкой данных, поэтому судить о наблюдаемой картине никто не возьмется.

Цитата(Zliva @ Aug 23 2009, 22:23) *
Тогда как правильно сделать?

Очевидно, не сохранять лишнее. Если обработчик написан на 'C' без всяких naked, то строки:
Код
                STMFD   SP!, {R0-R12, LR}    ; Save Workspace & LR to Stack
                ...
                LDMFD   SP!, {R0-R12, PC}^   ; Return to program

можно спокойно заменить на:
Код
                STMFD   SP!, {R0-R3, R12, LR}    ; Save Workspace & LR to Stack
                ...
                LDMFD   SP!, {R0-R3, R12, PC}^   ; Return to program

Но делать это стоит только при ясном понимании, почему так можно. В противном случае оставьте как есть - процедура все равно рабочая.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 23 2009, 19:41
Сообщение #18


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

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



Не могу понять, почему когда я удерживаю кнопку (как бы дребезга недолжно быть), возникает прерывание? Может здесь
pAIC->AIC_SMR[AT91C_ID_IRQ0] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE|0 что-то не так? Даже в симуляторе та же фича. Вот весь проект (на базе Hello.Uv2)
Прикрепленные файлы
Прикрепленный файл  Main.rar ( 56.24 килобайт ) Кол-во скачиваний: 19
 


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


Гуру
******

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



Цитата(Zliva @ Aug 23 2009, 23:41) *
Может здесь
pAIC->AIC_SMR[AT91C_ID_IRQ0] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE|0 что-то не так? Даже в симуляторе та же фича

Что там не так, я уже написал выше.

Работа с прерываниями по фронту вообще требует предельной внимательности - Вы уверены, что это действительно необходимо?
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 08:15
Сообщение #20


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

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



Цитата(aaarrr @ Aug 24 2009, 09: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, 10:37
Сообщение #21


Гуру
******

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



Цитата(Zliva @ Aug 24 2009, 12:15) *
Вы что-то можете предложить другое?

Для обработки энкодеров логично было бы использовать общее прерывание PIO. Выставляется по любому фронту на выводе (-ах), при этом является внутренним источником для AIC'а.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 11:32
Сообщение #22


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

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



Цитата(aaarrr @ Aug 24 2009, 13:37) *
Для обработки энкодеров логично было бы использовать общее прерывание PIO. Выставляется по любому фронту на выводе (-ах), при этом является внутренним источником для AIC'а.

Спасибо, Вам. Если можно, небольшой пример. Может есть смысл задействовать два прерывания на один энкодер?

Кажись настроил прерывание по фронту. Но сейчас появилась следующая проблема. Пропуск шагов(или неверный алгоритм работы). Суть такая (на картинке видно устройство и энкодер), рычаг вала энкодера поворачиваю в какое-то крайнее положение до упора. Затем делаю RESET устройства. Проворачиваю до следующего крайнего положения(до упора). Получаю следующую последовательность:
0 - 637
1020-633
1015-627
1010-622 и т.д.
Что не так?
Эскизы прикрепленных изображений
Прикрепленное изображение
 


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


Гуру
******

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



Цитата(Zliva @ Aug 24 2009, 15:32) *
Если можно, небольшой пример. Может есть смысл задействовать два прерывания на один энкодер?

Пример:
CODE
void pioa_irq_init(void)
{
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (unsigned int)irq_pioa;
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | PIOA_IRQ_PRIORITY;
AT91C_BASE_AIC->AIC_IECR = (1UL << AT91C_ID_PIOA);
AT91C_BASE_SYS->PIOA_IER = PINX_MASK | PINY_MASK;
}

__irq void irq_pioa(void)
{
unsigned int status = AT91C_BASE_SYS->PIOA_ISR;
if(status & PINX_MASK)
{
...
}
if(status & PINY_MASK)
{
...
}
AT91C_BASE_AIC->AIC_EOICR = status;
}

Смысла использовать более одного прерывания не вижу - фронты ведь разнесены по времени.

Цитата(Zliva @ Aug 24 2009, 15:32) *
Что не так?

Что-то не очень понятна последовательность. Что такое "1015-627"? Лучше напишите положение вала и насчитанное число для каждой точки.
Причина редактирования: Уменьшение видимого размера цитаты исходника.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 12:09
Сообщение #24


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

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



Цитата(aaarrr @ Aug 24 2009, 14:48) *
Что-то не очень понятна последовательность. Что такое "1015-627"? Лучше напишите положение вала и насчитанное число для каждой точки.

Попробую объяснить получше. Суть такая (на картинке видно устройство и энкодер), рычаг вала энкодера поворачиваю в какое-то крайнее положение до упора(соприкосновение двух винтов). Затем делаю RESET устройства (для того, чтобы начать отсчет с нуля). Проворачиваю до следующего крайнего положения рычаг вала энкодера до упора (соприкосновение винта рычага и винта на корпусе энкодера). Затем кручу рычаг в обратную сторону до упора. И так несколько раз. Получаю следующую последовательность в крайних положениях (как изменилось значение положения крайних положениях):
0 - 637
1020-633
1015-627
1010-622 и т.д.
Эта последовательность – им/обр. Так как винты размещены на одной оси с упорными винтами(грубо 180 градусов см.рис.), получается такая последовательность. Энкодер за 1 об. делает 1024 импульса. Надеюсь понятно.
Но куда деваются значения, непонятно. По правильному(я так думаю), должно быть:
0 - 637
637-0
0 - 637
637-0


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


Гуру
******

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



Ну, если даже направление теряется, то это похоже на косяк в алгоритме. Код приведите.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 12:30
Сообщение #26


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

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



Цитата(aaarrr @ Aug 24 2009, 15:15) *
Ну, если даже направление теряется, то это похоже на косяк в алгоритме. Код приведите.


<Здесь была цитата исходника>.
Удалено модератором (rezident).
Причина редактирования: Нарушение п.3.4 Правил форума.


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


Гуру
******

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



Получается, что Вы по заднему фронту сигнала B смотрите сигнал B. Естественно, код все время инкрементируется.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 12:56
Сообщение #28


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

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



Цитата(aaarrr @ Aug 24 2009, 15:49) *
Получается, что Вы по заднему фронту сигнала B смотрите сигнал B. Естественно, код все время инкрементируется.

Тыкните пальцем, слепой. 07.gif


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


Гуру
******

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



Цитата(Zliva @ Aug 24 2009, 16:56) *
Тыкните пальцем, слепой. 07.gif

Пардон, комментарий вместо кода прочитал:
Код
#define ENCODER1_A             (1<<20) // PA19
#define ENCODER1_B             (1<<19) // PA20

Но все равно проверьте.
И еще: тактирование PIO включить не забыли? Прерывания так будут работать, а из PDSR будут постоянно читаться нули. Очень похоже.

P.S. Пожалуйста, убирайте закомментированные куски из выкладываемого кода.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 24 2009, 13:27
Сообщение #30


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

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



Цитата(aaarrr @ Aug 24 2009, 16:12) *
Пардон, комментарий вместо кода прочитал:
Код
#define ENCODER1_A             (1<<20) // PA19
#define ENCODER1_B             (1<<19) // PA20

Но все равно проверьте.
И еще: тактирование PIO включить не забыли? Прерывания так будут работать, а из PDSR будут постоянно читаться нули. Очень похоже.

В main определил *AT91C_PMC_PCER = (1 << AT91C_ID_PIOA) | (1 << AT91C_ID_IRQ0) | (1 << AT91C_ID_US0);
Пробувал и по AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE
и по AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE ничего. Никаких изменений.


--------------------
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 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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