pav256 (16.11.2011 14:52, просмотров: 6000)
Синхронизация счетчиков на ATxmega. На ATmega осуществляется генерация нескольких синхронизированных импульсных последовательностей (частоты кратны, скважность и фазы различны). Вопрос синхронизации решается просто:
GTCCR |= 1<<TSM; // остановка предделителей
... // инициализация таймеров
//пример, инициализация Т3:
TIMSK3 = 0x00;
TCCR3A = 1<<COM3A1 | 1<<COM3A0 | 1<<WGM31; // 14 режим,
TCCR3B = 1<<WGM33 | 1<<WGM32 | 1<<CS30; // 14 режим, предделитель на 1
TCCR3C = 0x00;
//частота
ICR3H = 0x01; // 40КГц
ICR3L = 0x8F;
//длительность импульса
OCR3AH = 0x00; // ((2clk * 16) + 3) - 1
OCR3AL = 0x22;
//фаза (смещение относительно базовой фазы)
TCNT3H = 0x00;
TCNT3L = 0x22;
//устанавливаем порт на выход
CONVST_CONTROL |= 1<<CONVST_BIT;
... // инициализация таймеров
GTCCR &= ~(1<<TSM); // пуск предделителей
Требуется переписать ПО под ATxmega, где отсутствует аппаратная возможность как остановки так и сброса предделителей. Если кто сталкивался с аналогичной задачей на ATxmega подскажите, можно ли реализовать синхронизацию таймеров более изящным методом, чем учет длительности кода при инициализации фазы таймера.