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

 
 
13 страниц V  « < 4 5 6 7 8 > »   
Reply to this topicStart new topic
> ARM. Энкодеры и акселерометры, Помогите решить задачу
aaarrr
сообщение Sep 2 2009, 12:30
Сообщение #76


Гуру
******

Группа: Свой
Сообщений: 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) *
Если Вы не против, могу Вас включить.

Спасибо, конечно, но не стоит smile.gif
Go to the top of the page
 
+Quote Post
Zliva
сообщение Sep 2 2009, 17:41
Сообщение #77


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

Группа: Участник
Сообщений: 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
Прикрепленные файлы
Прикрепленный файл  TimerCounter.rar ( 2.36 килобайт ) Кол-во скачиваний: 35
 


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


Гуру
******

Группа: Свой
Сообщений: 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? Так же все измерения лесом пойдут.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Sep 2 2009, 19:20
Сообщение #79


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

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


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

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



Подскажите пожалуйста (код выше). Дело в том что если LDRBS = 1 значение в В заноситься (спадающий фронт), LDRАS = 1 значение в А заноситься (нарастающий фронт). В чем может быть проблема? Что я делаю не так?


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 3 2009, 10:37
Сообщение #81


Гуру
******

Группа: Свой
Сообщений: 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 значение в А заноситься (нарастающий фронт). В чем может быть проблема? Что я делаю не так?

Постарайтесь описать проблему так, чтобы можно было понять.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Sep 3 2009, 15:02
Сообщение #82


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

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


Гуру
******

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

Правильно ли я понял?

Все равно ничего не понял. Прерывание возникает, когда оно уже разрешено.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Sep 3 2009, 15:51
Сообщение #84


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

Группа: Участник
Сообщений: 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. Но я могу ошибаться. Я вот еще что думаю. Возможнее все-таки переполнение счетчика. Как здесь быть?
Прикрепленные файлы
Прикрепленный файл  Encoder_v.01.rar ( 31.16 килобайт ) Кол-во скачиваний: 16
 


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


Гуру
******

Группа: Свой
Сообщений: 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 и получаем длительность импульса. На основании этих двух чисел получаем результат. И переполнение таймера не страшно, если, конечно, его период не выбран меньше периода ШИМ-сигнала.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Sep 3 2009, 19:18
Сообщение #86


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

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


Гуру
******

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



Цитата(Zliva @ Sep 3 2009, 23:18) *
Что делать?

Плюнуть на сообщения симулятора.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Sep 3 2009, 19:33
Сообщение #88


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

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



Цитата(aaarrr @ Sep 3 2009, 22:25) *
Плюнуть на сообщения симулятора.

Спасибо, так и заделаю. Буду дальше ШИМ душить


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


Гуру
******

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



Цитата(Zliva @ Sep 3 2009, 23:33) *
Спасибо, так и заделаю. Буду дальше ШИМ душить

Правильно: вообще не стоит полагаться на симуляцию периферии. Если таймеры настроены идентично, а ругается он только на один, то это явный косяк.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Sep 3 2009, 20:06
Сообщение #90


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

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

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

 


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


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