Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Три микросекунды или как убить в себе веру в добро (+)

Отправлено Двоешник (193.200.150.137) 14 сентября 2012, г. 16:32


Нужно получить импульсы некоторой определенной, меняющейся длины. Имеем ATMega32U4, 16ти разрядный третий таймер ,СТС режим, и алгоритм где я:
сбрасываю значения счетчиков, загружаю регистры сравнения (в смысле старший и младший их байт) и разрешаю счет таймеру, модуль сравнения А которого настроен на Toggle вывода OC3A. В прерывании совпадения с регистром сравнения запрещаю дальнейший счет.
Не врубаю откуда лишние три микросекунды на выходе данного формирователя берутся? Вот данные:
загружаю в OCR3A
0x01 на выходе импульс длиной 3,125 us
0x10 на выходе импульс длиной 5,000 us
0x20 на выходе импульс длиной 7,000 us

Невже так долго Create_Front выполняется? Пока писал родилась идея поставить
TCCR3C |= (1<<FOC3A); 

непосредственно перед разрешением счета!

Код:



...
static void Init_Timer3 (void) {
TCCR3A |= (1<<COM3A0);
TCCR3B |= (1<<WGM32)|(1<<CS30);
TIMSK3 |= (1<<OCIE3A);
}
...

#pragma vector=TIMER3_COMPA_vect
__interrupt void TIMER3_COMPA_vect_(void) {
TCCR3B &= !(1<<CS30); // запрещаем счет
}


void Create_Front(INT16U pulse_length) {
while (TEST_PORT_BIT(TCCR3B,CS30)) // ждем пока предыдущий интервал окончится
;
TCNT3 = 0;
OCR3A = pulse_length;
TCCR3B |= (1<<CS30); // разрешаем счет
}

void Create_Pulse (INT16U value) {
TCCR3C |= (1<<FOC3A); // создадим передний/первый фронт
Create_Front(value); //создадим задний фронт на расстоянии "value" от переднего
}



void main (void) {
InitDevice ();
while (1) {
if (UARTDataInReceiveBuffer()){ // если есть что-то в буфере приемника, то:
if (UARTReceiveByte() == 0x55){ // аля "синхронизация"
Create_Pulse((UARTReceiveByte()<<8) | UARTReceiveByte ()); //два следующих байта за 0x55 передадим в функцию создающую импульс
}
}
}
}


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
если прибавить четыре к четырём будет:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru