Перейти к содержанию
    

atmega88 не работает FOC1A

Выполняю следующий код:

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 ничего не дает(

Как заставить его работать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как заставить его работать?
Какой режим таймера хотите использовать (назовите номер).

Вы что хотите получить, одновибратор или ШИМ или... Напишите словами.

 

Обычно пишут так:

ISR(TIMER1_COMPB_vect) {...}

SIGи - это устаревший и не рекомендуемый вариант.

И в обработчике прерывания чаще всего либо перезапускают таймер, либо останавливают, либо не пишут обработчика вовсе. А Вы что делаете?

 

И ещё, sei надо делать после окончания инициализации (непосредственно перед бесконечным циклом).

А первой инструкцией процедуры main обычно идёт cli - запрет прерываний на время инициализации.

 

Ну и вдобавок, если ваши переменные duration и freq_temp не переменные вовсе, а константы то так их и объявляйте - выиграете по памяти

static const unsigned int duration = 2500;
static const unsigned int freq_temp = 10000;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вывод OC1A настроен на изменение уровня при прерывании. Запись единицы в FOC1A ничего не дает(

Как заставить его работать?

The FOC1A/FOC1B bits are only active when the WGM13:0 bits specifies a non-PWM mode.

 

А вообще код странный. Что вы хотите от него добиться? На выходе OC1B ШИМ есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблему решил, сделал в другом режиме! (В примере режим 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, так??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если я правильно понимаю выставив единицу в соответствующий FOC можно изменить состояние вывода OC1(A или B) согласно условиям указанным в битах COM11:0, так??

Так. Force означает принудительно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...