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

 
 
> Работа с таймерами в Xmega, Проблема с настройкой режима захвата
Nosaer
сообщение Feb 8 2015, 03:37
Сообщение #1


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

Группа: Свой
Сообщений: 85
Регистрация: 6-02-15
Пользователь №: 84 967



Добрый день.
Помогите пожалуйста с настройкой таймеров Xmega32A4.
Что то я в этих регистрах настройки совсем запутался... wacko.gif
По задумке, 3 таймера счетчика активированы на PC0, PD0, PE0.
Настроены на захват длительности импульса по падающему фронту.
Ну и соответственно при запуске все три ничего не считают.

Работоспособность проверяю в AVR Studio 6.

Надеюсь на вашу помощь. Спасибо)
CODE
void StartTimers(void) // Запускаем режим захвата по трем каналам таймера
{
TCC0.CTRLA = TC_CLKSEL_EVCH0_gc; // Выбираем источником тактов нулевой канал порта
TCD0.CTRLA = TC_CLKSEL_EVCH0_gc;
TCE0.CTRLA = TC_CLKSEL_EVCH0_gc;
}

void StopTimers(void) // Останавливаем работу таймеров
{
TCC0.CTRLA = TC_CLKSEL_OFF_gc;
TCD0.CTRLA = TC_CLKSEL_OFF_gc;
TCE0.CTRLA = TC_CLKSEL_OFF_gc;
}

int main(void)
{
// Настройка работы от внешнего кварца в 4МГц
cli(); // Отключение прерываний
OSC.XOSCCTRL = 0x4B; // 2-9 МГц без режима сбережения и со стабильной частотой во время запуска (01001011)
OSC.CTRL = 0x08; // Разрешение работы внешнего генератора
while((OSC.STATUS & 0x08) == 0); // Ожидание сигнала о включении внешнего генератора

// Настройка портов
PORTC.DIR = 0x1C; // PC0 - T/C-X
PORTD.DIR = 0x00; // PD0 - T/C-Y
PORTE.DIR = 0x00; // PE0 - T/C-Z

PORTC.PIN0CTRL = PORT_OPC_WIREDORPULL_gc | PORT_ISC_FALLING_gc; // Установка чувствительности по заднему фронту
PORTD.PIN0CTRL = PORT_OPC_WIREDORPULL_gc | PORT_ISC_FALLING_gc;
PORTE.PIN0CTRL = PORT_OPC_WIREDORPULL_gc | PORT_ISC_FALLING_gc;

PORTC.INTCTRL = PORT_INT0LVL_HI_gc; // Настройка высокого уровня прерываний
PORTD.INTCTRL = PORT_INT0LVL_HI_gc;
PORTE.INTCTRL = PORT_INT0LVL_HI_gc;
PORTR.INTCTRL = PORT_INT0LVL_HI_gc;
PMIC.CTRL|=PMIC_HILVLEN_bm|PMIC_MEDLVLEN_bm|PMIC_LOLVLEN_bm; // Разрешаем все уровни прерываний

//Единоразовая настройка таймеров
TCC0.CTRLB = 0x00; // Выбрали режим: Normal
TCD0.CTRLB = 0x00;
TCE0.CTRLB = 0x00;
TCC0.CTRLD = 0xC8; // Захват длительности импульса по 0 каналу
TCD0.CTRLD = 0xC8; // EVACT = 110 - захват длительности; 001 - входной захват
TCE0.CTRLD = 0xC8; // EVSEL = 1000 - выбор 0 канала для захвата
TCC0.INTCTRLA = 0x01; // Разрешаем прерывания низкого уровня по переполнению
TCD0.INTCTRLA = 0x01; // 0x01 - низкий уровень; 0x02 - средний; 0x03- высокий уровень...
TCE0.INTCTRLA = 0x01;

sei(); // Включение прерываний


Сообщение отредактировал IgorKossak - Feb 8 2015, 12:04
Причина редактирования: [codebox] для длинного кода, [code] - для короткого
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:08
Рейтинг@Mail.ru


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