ody67 0 7 июня, 2011 Опубликовано 7 июня, 2011 · Жалоба Выполняю следующий код: unsigned int duration = 2500; unsigned int freq_temp = 10000; ISR(SIG_OUTPUT_COMPARE1B) { TCCR1C = (1 << FOC1A); } // *********************************************************** // Main program // int main(void) { DDRB = 0xFF; PORTB = 0xFF; PORTB = 0; asm("sei"); TIMSK1 = (1<<OCIE1B); OCR1B = duration; OCR1A = freq_temp; TCCR1A = 0b01000000; TCCR1B = 0b00001001; while(1); } вывод OC1A настроен на изменение уровня при прерывании. Запись единицы в FOC1A ничего не дает( Как заставить его работать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 8 июня, 2011 Опубликовано 8 июня, 2011 · Жалоба Как заставить его работать?Какой режим таймера хотите использовать (назовите номер). Вы что хотите получить, одновибратор или ШИМ или... Напишите словами. Обычно пишут так: ISR(TIMER1_COMPB_vect) {...} SIGи - это устаревший и не рекомендуемый вариант. И в обработчике прерывания чаще всего либо перезапускают таймер, либо останавливают, либо не пишут обработчика вовсе. А Вы что делаете? И ещё, sei надо делать после окончания инициализации (непосредственно перед бесконечным циклом). А первой инструкцией процедуры main обычно идёт cli - запрет прерываний на время инициализации. Ну и вдобавок, если ваши переменные duration и freq_temp не переменные вовсе, а константы то так их и объявляйте - выиграете по памяти static const unsigned int duration = 2500; static const unsigned int freq_temp = 10000; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 8 июня, 2011 Опубликовано 8 июня, 2011 · Жалоба вывод OC1A настроен на изменение уровня при прерывании. Запись единицы в FOC1A ничего не дает( Как заставить его работать? The FOC1A/FOC1B bits are only active when the WGM13:0 bits specifies a non-PWM mode. А вообще код странный. Что вы хотите от него добиться? На выходе OC1B ШИМ есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ody67 0 8 июня, 2011 Опубликовано 8 июня, 2011 · Жалоба Проблему решил, сделал в другом режиме! (В примере режим CTC (сбрасывание при сравнении с OCR1A)) Но вопрос остался, для чего же нужны вообще флаги FOC1x?? В документации читаю: 13.7.1 Force Output Compare In non-PWM Waveform Generation modes, the match output of the comparator can be forced by writing a one to the Force Output Compare (FOC1x) bit. Forcing compare match will not set the OCF1x Flag or reload/clear the timer, but the OC1x pin will be updated as if a real compare match had occurred (the COM11:0 bits settings define whether the OC1x pin is set, cleared or toggled). Если я правильно понимаю выставив единицу в соответствующий FOC можно изменить состояние вывода OC1(A или B) согласно условиям указанным в битах COM11:0, так?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 8 июня, 2011 Опубликовано 8 июня, 2011 · Жалоба Если я правильно понимаю выставив единицу в соответствующий FOC можно изменить состояние вывода OC1(A или B) согласно условиям указанным в битах COM11:0, так?? Так. Force означает принудительно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться