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

 
 
> ARM. Энкодеры и акселерометры, Помогите решить задачу
Zliva
сообщение Jul 29 2009, 20:01
Сообщение #1


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

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



Всем привет!
Нужна помощь.
Есть виброплощадка с двумя дебалансными валами, с одной стороны которой через эластические муфты приделаны двигатели, а с другой – инкрементные энкодеры. Площадка крепится через пружины к станине. Двигатели прикручены к станине жестко. Валы площадки не синхронизированы. К площадке крепится датчик ускорения ADXL210 с выходным сигналом ШИМ. Двигатель вращается с частотой 1500 об/мин, следовательно это равно 25об/сек. Энкодер имеет разрешение 1024им/об, это равно 1024*25=25600Гц. Начальное положение определяться перед пуском. Поскольку дебалансный вал имеет эксцентриситет, то соответственно он направлен в низ. Это и есть его начальное положение. Контролер и комп НЕ УПРАВЛЯЕТ ДВИГАТЕЛЯМИ, а они запускаются отдельно через рубильник.
Точность измерения:
  • угловое положение +/-0,4градуса;
  • угловую скорость(+/-1.0град/сек);
  • угловое ускорение (после интерполяции графика скорости. Зависит от метода);
  • линейное ускорение(+/-0,1g);

Нужно периодично опрашивать датчики, чтобы знать его положение, ускорение в каждый момент времени. Данные через USB от датчиков должны заливаться на комп.

Нужно измерять положения дебалансных валов и их скорость, ускорение, а также ускорение, скорость, положение площадки. Ловить сдвиг фаз между положениями валов.

Здесь нимного обсуждалось и здесь
Что уже есть: изготовлена площадка, на ней стоят энкодеры. Уже запускал, работает.
Прикупил ARM отладочную плату AT91SAM7S64_DBoard для ARM микроконтроллеров фирмы ATMEL и программатор J-Link - USB JTAG adapter. Хочу на базе этого дивайса решить эту задачу. Опит программирования только AVR. Знаю немного Си и Delphi. Очень нужно. Помогите пожалуйста.


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Aug 15 2009, 22:08
Сообщение #2


Гуру
******

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



Возможно. Другое дело, что фрейм USB равен 1 мс, поэтому на низкую латентность при работе рассчитывать не приходится.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 23 2009, 15:35
Сообщение #3


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

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



Вот код обработки по прерыванию положения первого энкодера.
CODE
#include <AT91SAM7S128.H> /* AT91SAM7S64 definitions */
#include "..\Board.h"

volatile unsigned int ENCODER1_Position = 0; /* Текуща позиция энкодера 1*/
volatile unsigned long int ENCODER1_Count = 0; /* Текуща позиция энкодера 1*/
#define ENCODER1_A_MASK (1<<20) /* PA19 */
#define ENCODER1_B_MASK (1<<19) /* PA20 */
#define ENCODER2_A_MASK (1<<15) /* PA15 */
#define ENCODER2_B_MASK (1<<14) /* PA14 */
#define ENCODER_A_MASK (ENCODER1_A_MASK|ENCODER1_B_MASK|ENCODER2_A_MASK|ENCODER2_B_MASK)

#define ENCODER1_A (1<<20) // PA19
#define ENCODER1_B (1<<19) // PA20
#define ENCODER2_A (1<<15) // PA15
#define ENCODER2_B (1<<14) // PA14


#define ENCODER1_resolution 1024
#define ENCODER2_resolution 1024


extern AT91S_PIO * pPIO; /* Global Pointer to PIO */

extern __irq void irq0_int (void); /* IRQ0 Function */


void irq0_nint (void) { /* Nested IRQ0 (Push button SW2) */

if ((pPIO->PIO_PDSR & ENCODER1_A) == 0) { /* Проверяем активный уровень на входе А энкодера 1*/
if ((pPIO->PIO_PDSR & ENCODER1_B) == 0) { /* Определяем направление вращения энкодера 1*/
if (ENCODER1_Position == (ENCODER1_resolution-1)) {/*Проверяем не прывисл ли
ENCODER1_Position значения полосок на энкодере*/
ENCODER1_Position = 0;/*Если превысил то отсчитываем с 0*/
// ENCODER1_Count++; /*Увеличиваем на 1 значения оборотов */
}
ENCODER1_Position++;} /* Если за часовой стрелкой то увеличиваем на 1*/
else {
if (ENCODER1_Position == 0) { /* Проверяем не прывисл ли ENCODER1_Position значения 0*/
ENCODER1_Position = (ENCODER1_resolution-1);/*Если 0 то отсчитываем с ENCODER1_resolution-1*/
ENCODER1_Count++; /*Уменьшаем на 1 значения оборотов */
}
ENCODER1_Position--; } /* Если против часовой стрелкой то уменьшаем на 1*/
}

*AT91C_AIC_EOICR = 0; /* End of Interrupt*/
}


void init_extint (void) { /* Setup IRQ 0 Interrupt */
AT91S_AIC * pAIC = AT91C_BASE_AIC; /* Setup IRQ0 Interrupt Mode and Vector with Priority 0 and Enable it */
/*
AIC_SMR - Регистр источника прерывания 0
AT91C_ID_IRQ0 - ID Прерывание для IRQ0
AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE - Internal Sources Code Label Positive
Edge triggered - Положительный фронт */
pAIC->AIC_SMR[AT91C_ID_IRQ0] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 0;// AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE
/* Вектор прерывания. AIC_SVR0..AIC_SVR31 - В эти регистры записываются
адреса соответствующих процедур обработки прерывания для каждого источника.*/
pAIC->AIC_SVR[AT91C_ID_IRQ0] = (unsigned long) irq0_int; /*Регистр разрешения прерываний*/
pAIC->AIC_IECR = (1 << AT91C_ID_IRQ0);
}

Вроде все правильно, но почему дважды вызывается прерывание? Все значения пересылаю через USART.
CODE
#include <AT91SAM7S128.H> /* AT91SAM7S64 definitions */
#include "..\Board.h"

#define BR 115200 /* Baud Rate */

#define BRD (MCK/16/BR) /* Baud Rate Divisor */


AT91S_USART * pUSART = AT91C_BASE_US0; /* Global Pointer to USART0 */


void init_serial (void) { /* Initialize Serial Interface */

*AT91C_PIOA_PDR = AT91C_PA5_RXD0 | /* Enable RxD0 Pin */
AT91C_PA6_TXD0; /* Enalbe TxD0 Pin */

pUSART->US_CR = AT91C_US_RSTRX | /* Reset Receiver */
AT91C_US_RSTTX | /* Reset Transmitter */
AT91C_US_RXDIS | /* Receiver Disable */
AT91C_US_TXDIS; /* Transmitter Disable */

pUSART->US_MR = AT91C_US_USMODE_NORMAL | /* Normal Mode */
AT91C_US_CLKS_CLOCK | /* Clock = MCK */
AT91C_US_CHRL_8_BITS | /* 8-bit Data */
AT91C_US_PAR_NONE | /* No Parity */
AT91C_US_NBSTOP_1_BIT; /* 1 Stop Bit */

pUSART->US_BRGR = BRD; /* Baud Rate Divisor */

pUSART->US_CR = AT91C_US_RXEN | /* Receiver Enable */
AT91C_US_TXEN; /* Transmitter Enable */
}


int sendchar (int ch) { /* Write character to Serial Port */

if (ch == '\n') { /* Check for CR */
while (!(pUSART->US_CSR & AT91C_US_TXRDY)); /* Wait for Empty Tx Buffer */
pUSART->US_THR = '\r'; /* Output CR */
}
while (!(pUSART->US_CSR & AT91C_US_TXRDY)); /* Wait for Empty Tx Buffer */
return (pUSART->US_THR = ch); /* Transmit Character */
}


int getkey (void) { /* Read character from Serial Port */

while (!(pUSART->US_CSR & AT91C_US_RXRDY)); /* Wait for Full Rx Buffer */
return (pUSART->US_RHR); /* Read Character */
}

Вот шапка.
CODE
AREA IRQ0, CODE, READONLY
ARM

PRESERVE8
ALIGN
IMPORT irq0_nint
EXPORT irq0_int
irq0_int FUNCTION

SUB LR, LR, #4 ; Update Link Register
STMFD SP!, {R0-R12, LR} ; Save Workspace & LR to Stack
MRS R0, SPSR ; Copy SPSR to R0
STMFD SP!, {R0, R1} ; Save SPSR to Stack (8-byte)
MSR CPSR_c, #0x1F ; Enable IRQ (Sys Mode)
STMFD SP!, {R0, LR} ; Save LR_sys to Stack (8-byte)
LDR R0, =irq0_nint ; Get IRQ Function Address
MOV LR, PC ; Return Address
BX R0 ; Call IRQ Function
LDMFD SP!, {R0, LR} ; Restore LR_sys
MSR CPSR_c, #0x92 ; Disable IRQ (IRQ Mode)
LDMFD SP!, {R0, R1} ; Restore SPSR to R0
MSR SPSR_cxsf, R0 ; Copy R0 to SPSR
LDMFD SP!, {R0-R12, PC}^ ; Return to program

ENDFUNC

END


Модератор. Zliva, в следующий раз буду просто удалять такие цитаты из сообщения. Либо форматируйте их сами, оформляя тэгами [ codebox ] и урезая по ширине, либо прилагайте к сообщению в виде текстовых файлов, как это рекомендуют Правила форума.
С уважением, 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 23 2009, 16:11
Сообщение #4


Гуру
******

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



Цитата(Zliva @ Aug 23 2009, 19:35) *
Код
        /* Setup IRQ0 Interrupt Mode and Vector with Priority 0 and Enable it */
          /*
          AIC_SMR        -    Регистр источника прерывания 0
          AT91C_ID_IRQ0 -    ID Прерывание для IRQ0
          AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE    -     Internal Sources Code Label Positive
                                                  Edge triggered - Положительный фронт
          */
  pAIC->AIC_SMR[AT91C_ID_IRQ0] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 0;            //     AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE

Прерывание от IRQ0 является внешним источником, поэтому обратите внимание на такие строки в хидере:
Цитата
#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered
#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered


Цитата(Zliva @ Aug 23 2009, 19:35) *
Вроде все правильно, но почему дважды вызывается прерывание? Все значения пересылаю через USART.

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

Цитата(Zliva @ Aug 23 2009, 19:35) *
Вот шапка.

Шапка с безобразным оверхедом. Нет никакой необходимости пихать все регистры на стек: R4-R11 и так никто не тронет.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 23 2009, 18:23
Сообщение #5


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

Группа: Участник
Сообщений: 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
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #7


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

Группа: Участник
Сообщений: 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
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #9


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

Группа: Участник
Сообщений: 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
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #11


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

Группа: Участник
Сообщений: 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
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #13


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

Группа: Участник
Сообщений: 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
Zliva
сообщение Aug 24 2009, 14:09
Сообщение #14


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

Группа: Участник
Сообщений: 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
Сообщение #15


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

Группа: Участник
Сообщений: 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
Сообщение #16


Гуру
******

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


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #19


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

Группа: Участник
Сообщений: 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
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #21


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

Группа: Участник
Сообщений: 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

Сообщений в этой теме
- Zliva   ARM. Энкодеры и акселерометры   Jul 29 2009, 20:01
- - _Pasha   Я бы все-таки энкодеры обрабатывал простеньким AVR...   Jul 30 2009, 08:17
|- - Zliva   Цитата(_Pasha @ Jul 30 2009, 11:17) Я бы ...   Jul 30 2009, 08:44
|- - Zliva   С программированием ARM разобрался. Программируетс...   Aug 15 2009, 20:01
- - aaarrr   1. Первые три - классы устройств USB; usbser.sys -...   Aug 15 2009, 20:36
|- - Zliva   Цитата(aaarrr @ Aug 15 2009, 23:36) 3. За...   Aug 15 2009, 20:47
- - aaarrr   Если гарантия доставки обязательна, то в качестве ...   Aug 15 2009, 20:52
|- - Zliva   Цитата(aaarrr @ Aug 15 2009, 23:52) Если ...   Aug 15 2009, 20:57
|- - aaarrr   Цитата(Zliva @ Aug 16 2009, 00:57) А скор...   Aug 15 2009, 21:01
|- - Zliva   Цитата(aaarrr @ Aug 16 2009, 00:01) Нет, ...   Aug 15 2009, 21:30
|- - aaarrr   Цитата(Zliva @ Aug 16 2009, 01:30) Так ка...   Aug 15 2009, 21:39
|- - Zliva   Цитата(aaarrr @ Aug 16 2009, 00:39) Остав...   Aug 15 2009, 22:02
- - aaarrr   Ну, если даже направление теряется, то это похоже ...   Aug 24 2009, 12:15
|- - Zliva   Цитата(aaarrr @ Aug 24 2009, 15:15) Ну, е...   Aug 24 2009, 12:30
- - aaarrr   Получается, что Вы по заднему фронту сигнала B смо...   Aug 24 2009, 12:49
|- - Zliva   Цитата(aaarrr @ Aug 24 2009, 15:49) Получ...   Aug 24 2009, 12:56
|- - aaarrr   Цитата(Zliva @ Aug 24 2009, 16:56) Тыкнит...   Aug 24 2009, 13:12
|- - Zliva   Цитата(aaarrr @ Aug 24 2009, 16:12) Пардо...   Aug 24 2009, 13:27
- - aaarrr   А pPIO правильно проинициализирован? Пардон, вижу...   Aug 24 2009, 13:51
- - aaarrr   Дык __irq уберите.   Aug 24 2009, 20:29
|- - Zliva   Цитата(aaarrr @ Aug 24 2009, 23:29) Дык _...   Aug 24 2009, 20:35
|- - aaarrr   Цитата(Zliva @ Aug 25 2009, 00:35) Убрал....   Aug 24 2009, 20:53
|- - Zliva   Цитата(aaarrr @ Aug 24 2009, 23:53) AT91C...   Aug 24 2009, 20:58
|- - aaarrr   Цитата(Zliva @ Aug 25 2009, 00:58) Все ра...   Aug 24 2009, 21:13
|- - Zliva   Убрал строчку printf ("E1=%d\n",ENC...   Aug 24 2009, 21:34
- - aaarrr   Я грешным делом думал, что printf у Вас под прерыв...   Aug 24 2009, 21:40
|- - Zliva   Попробовал несколько вариантов обработки сигналов ...   Aug 25 2009, 19:07
- - aaarrr   У Вас получается одинаковая обработка вне зависимо...   Aug 25 2009, 19:45
|- - Zliva   Цитата(aaarrr @ Aug 25 2009, 22:45) У Вас...   Aug 25 2009, 19:53
|- - aaarrr   Цитата(Zliva @ Aug 25 2009, 23:53) Тогда ...   Aug 25 2009, 19:54
|- - Zliva   aaarrr СПАСИБО. ЗАРАБОТАЛО!!! Цитата(...   Aug 25 2009, 20:22
|- - aaarrr   Цитата(Zliva @ Aug 26 2009, 00:22) Не пой...   Aug 25 2009, 20:32
|- - Zliva   aaarrr СПАСИБО. Заменил volatile int ENCODER1_Pos...   Aug 25 2009, 20:50
|- - aaarrr   Цитата(Zliva @ Aug 26 2009, 00:50) Давайт...   Aug 25 2009, 21:07
|- - Zliva   Цитата(aaarrr @ Aug 26 2009, 00:07) Давай...   Aug 26 2009, 05:52
|- - aaarrr   Цитата(Zliva @ Aug 26 2009, 09:52) Тут во...   Aug 26 2009, 10:55
|- - Zliva   Цитата(aaarrr @ Aug 26 2009, 13:55) Ее да...   Aug 26 2009, 12:08
- - @Ark   ЦитатаЕе даже не обязательно вводить - можно прост...   Aug 26 2009, 13:44
|- - Zliva   Спасибо за наставление. Но я как-то другого пути н...   Aug 26 2009, 14:24
- - @Ark   ЦитатаНо я как-то другого пути не вижу кроме намеч...   Aug 26 2009, 15:18
|- - Zliva   Цитата(@Ark @ Aug 26 2009, 18:18) Собстве...   Aug 26 2009, 15:30
- - @Ark   Это Вам решать как делать. Советы Вы все равно не ...   Aug 26 2009, 15:42
|- - Zliva   @Ark Спасибо за комментарии! Согласен. Опыта м...   Aug 26 2009, 15:58
|- - aaarrr   Цитата(Zliva @ Aug 26 2009, 19:58) Поскол...   Aug 26 2009, 16:20
|- - Zliva   Цитата(aaarrr @ Aug 26 2009, 19:20) Ох. З...   Aug 26 2009, 20:03
|- - aaarrr   Цитата(Zliva @ Aug 26 2009, 23:35) Понял....   Aug 26 2009, 20:07
|- - Zliva   Возникла новая проблема. С PIT вроде разобрался. Т...   Aug 26 2009, 20:36
|- - Zliva   Цитата(Zliva @ Aug 26 2009, 23:36) Возник...   Aug 30 2009, 14:55
|- - Zliva   Скопировал пример с ИАР и компильнул его под свою ...   Aug 30 2009, 21:19
|- - aaarrr   Цитата(Zliva @ Aug 31 2009, 01:19) Скопир...   Aug 30 2009, 21:46
|- - Zliva   С прерываниями разобрался. Записал инициализацию т...   Aug 31 2009, 18:21
|- - aaarrr   Цитата(Zliva @ Aug 31 2009, 22:21) С прер...   Aug 31 2009, 20:33
|- - Zliva   Прерывания работают. Все заделал как Вы писали. Ве...   Aug 31 2009, 20:48
|- - aaarrr   Цитата(Zliva @ Sep 1 2009, 00:48) Верно л...   Aug 31 2009, 21:03
|- - Zliva   Цитата(aaarrr @ Sep 1 2009, 00:03) Нет. И...   Sep 1 2009, 10:29
|- - aaarrr   Цитата(Zliva @ Sep 1 2009, 14:29) В режим...   Sep 2 2009, 12:30
|- - Zliva   Цитата(aaarrr @ Sep 2 2009, 15:30) PIN0 -...   Sep 2 2009, 17:41
|- - aaarrr   Цитата(Zliva @ Sep 2 2009, 21:41) Как его...   Sep 2 2009, 18:23
|- - Zliva   Цитата(aaarrr @ Sep 2 2009, 21:23) Понятн...   Sep 2 2009, 19:20
|- - Zliva   Подскажите пожалуйста (код выше). Дело в том что е...   Sep 3 2009, 08:37
- - aaarrr   Цитата(Zliva @ Sep 2 2009, 23:20) Вот так...   Sep 3 2009, 10:37
|- - Zliva   Цитата(aaarrr @ Sep 3 2009, 13:37) Тут то...   Sep 3 2009, 15:02
|- - aaarrr   Цитата(Zliva @ Sep 3 2009, 19:02) Как это...   Sep 3 2009, 15:12
|- - Zliva   Цитата(aaarrr @ Sep 3 2009, 18:12) Смотре...   Sep 3 2009, 15:51
|- - aaarrr   Цитата(Zliva @ Sep 3 2009, 19:51) Посмотр...   Sep 3 2009, 16:12
- - Zliva   Вот так инициализирую Код#define LED1 (1...   Sep 3 2009, 19:18
|- - aaarrr   Цитата(Zliva @ Sep 3 2009, 23:18) Что дел...   Sep 3 2009, 19:25
|- - Zliva   Цитата(aaarrr @ Sep 3 2009, 22:25) Плюнут...   Sep 3 2009, 19:33
|- - aaarrr   Цитата(Zliva @ Sep 3 2009, 23:33) Спасибо...   Sep 3 2009, 19:52
|- - Zliva   Цитата(aaarrr @ Sep 3 2009, 22:52) Правил...   Sep 3 2009, 20:06
|- - aaarrr   Цитата(Zliva @ Sep 4 2009, 00:06) Что вы ...   Sep 3 2009, 20:13
- - Zliva   Есть проблемка с ADXL210AQC – он не работает. На У...   Sep 4 2009, 19:45
- - Zliva   Настало время USB. Пока доставят акселерометры, не...   Sep 5 2009, 22:38
|- - head_sk   Цитата(Zliva @ Sep 6 2009, 01:38) Может у...   Sep 6 2009, 06:47
|- - aaarrr   Цитата(Zliva @ Sep 6 2009, 02:38) Впринци...   Sep 6 2009, 10:05
- - head_sk   Советую использовать libusb   Sep 6 2009, 11:04
- - Zliva   Вот здесь скачал реализацию CDC, в IAR-е получил б...   Sep 7 2009, 19:43
- - aaarrr   Здесь можете скачать атмеловские примеры для IAR, ...   Sep 8 2009, 08:24
|- - Zliva   Может кто-то имеет нормальную, работоспособную вер...   Sep 8 2009, 12:17
- - aaarrr   Боюсь, бесплатно будут только "кучерявые...   Sep 8 2009, 12:20
2 страниц V   1 2 >


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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