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

 
 
 
Reply to this topicStart new topic
> Работа с системой событий Xmega32A4, Event System,PORTC, Timer/Counter 0|1
evsx1
сообщение Jun 25 2013, 09:03
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 1-11-10
Пользователь №: 60 586



Здравствуйте, возник вопрос по работе с системой событий в Xmega. Необходимо считать импульсы по 4 каналам, приходящие на PORTC, в контроллере можно считать по прерыванию всего по 2м пинам на порту, поэтому было решено под эти задачи использовать Таймер/Счетчик'и. Для этого настраиваю необходимые пины PORTC на вход, генерация события по спадающему фронту с передачей их таймеру счетчику. И вот тут вопрос: мне придется использовать также 4ре счетных канала для счета P TCC0&1 TCD0&1, просто на таймере 0 по PORTC мне это можно каким-нибудь образом сделать? Сейчас я выбираю четыре раздельных источника для каждого таймера.

Код
int CH1,CH2,CH3,CH4;
void CHANNEL_COUNT(void)
{  
  PORTC.DIR&=~0x78;
  //PORTC.DIRTGL=0x78;
  PORTC.PIN0CTRL = PORT_ISC_FALLING_gc; //обнаружение низкого уровня
  PORTC.PIN1CTRL = 0x03; //обнаружение низкого уровня
  EVSYS.CH0MUX = 0x66;   // передача  в первый мультемплексканал Count_CH1
  EVSYS.CH1MUX = 0x65;   // передача  в второй мультемплексканал Count_CH2
  EVSYS.CH2MUX = 0x64;   // передача  в третий мультемплексканал Count_CH3
  EVSYS.CH3MUX = 0x63;   // передача  в четвертый мультемплексканал Count_CH4
  EVSYS.CH1CTRL = 0x07; //
  EVSYS.CH2CTRL = 0x07;  //
  EVSYS.CH3CTRL = 0x07;  //максимальный цифровой фильтр на все каналы
  EVSYS.CH0CTRL = 0x07; //
  TCC0.PER = 0xFFFF;
  TCD0.PER = 0xFFFF;
  TCC1.PER = 0xFFFF;      // переполнение после полного заполнения 16бит
  TCD1.PER = 0xFFFF;
  TCD0.CTRLA = TC_CLKSEL_EVCH0_gc;    // CNT таймера Д0 содержит счет CH1
  TCC0.CTRLA = TC_CLKSEL_EVCH1_gc;    // CNT таймера C0 содержит счет CH2
  TCC1.CTRLA = TC_CLKSEL_EVCH2_gc;    // CNT таймера C1 содержит счет CH3
  TCD1.CTRLA = TC_CLKSEL_EVCH3_gc;    // CNT таймера Д1 содержит счет CH4
  
  CH1=TCD0.CNT;  
  CH2=TCD0.CNT;
  CH3=TCD0.CNT;      // запись значения
  CH4=TCD0.CNT;
  
}


Сообщение отредактировал evsx1 - Jun 25 2013, 09:53
Go to the top of the page
 
+Quote Post
bob1
сообщение Jun 25 2013, 09:48
Сообщение #2


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

Группа: Свой
Сообщений: 82
Регистрация: 17-09-06
Пользователь №: 20 471



Если Вам нужен раздельный счет, то придется использовать 4 канала событий и 4 счетчика.
Если результаты потом складываются , то 4 канала и 1 счетчик.
Go to the top of the page
 
+Quote Post
evsx1
сообщение Jun 25 2013, 09:53
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 1-11-10
Пользователь №: 60 586



Цитата(bob1 @ Jun 25 2013, 13:48) *
Если Вам нужен раздельный счет, то придется использовать 4 канала событий и 4 счетчика.
Если результаты потом складываются , то 4 канала и 1 счетчик.

Да необходим раздельный счет.
Спасибо а возможно ли реализовать счет до 32бит слова.?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 25 2013, 09:59
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(evsx1 @ Jun 25 2013, 12:53) *
Спасибо а возможно ли реализовать счет до 32бит слова.?

Цитата
Two timer/counters can be used together to enable 32-bit counter operation. By using two timer/counters, the overflow
event from one timer/counter (least-significant timer) can be routed via the event system and used as the clock input for
another timer/counter (most-significant timer).
Go to the top of the page
 
+Quote Post
evsx1
сообщение Jun 25 2013, 11:00
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 1-11-10
Пользователь №: 60 586



Это мы знаем,но чтобы считать 4 канала по 32 необходимо 8 таймеров,а у XmegaA4 5. Думаю стоит ли делать два канала по прерыванию по порту и два 32 разрядных счетчика или считать переполнение таймера?

Сообщение отредактировал evsx1 - Jun 25 2013, 11:01
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jun 25 2013, 11:22
Сообщение #6


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Переполнение 16-разрядных счетчиков вполне можно считать по-старинке - разрешить им прерывание по переполнению, а в обработчике этого прерывания инкрементировать переменную, предназначенную для старших разрядов счетчика (17-32). Такие прерывания уже не будут слишком частыми и производительности МК не снизят.

Метод же "стыковки таймеров" не только угробил бы все свободные таймеры под этот счет, но и все каналы событий. А то и другое обычно бывает жалко тратить дочиста.
Go to the top of the page
 
+Quote Post

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

 


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


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