по внешенму прерыванию сбрасывается счетный регистр запускается таймер T3, при срабатывании прерывания OCRB подымается пин, при срабатывании прерывания OCR3B пин опускается, таймер останавливается. Все, ждем нового внешнего прерывания.
Тоесть задача - выставить импульс фиксированной длительность относительно внешнего(типа ШИМ такой у меня). Проблема втом что если в основном цикле произвести запись в OCR3A/B для двигания ипульса таймер не работает(вернее что происходит неизвестно но импульсы на пине пропадают вообще). В симуляторе код AVRStudio рабтает.
Код
uint16_t PWM_val = 0x1111;
//-------------------------------------------------------
void SetPWM_Value() __attribute__ (( noinline ));
void SetPWM_Value()
{
cli();
// ожидание окончания импульса открытия тиристора
if (PWM_val > PWM_MIN) PWM_val = PWM_MIN;
// запись значений Pl (время активации импульса открытия тиристора)
OCR3B = PWM_val;
// запись значений Ph (время снятия импульса открытия тиристора)
OCR3A = OCR3B + PWM_PULSE_TIME;
sei();
}
// инициализация ШИМ петли
void InitPWM()
{
// установка режима внешних прерываний
// по подъему сигнала
EICRA |= _BV(ISC11)| _BV(ISC10);
// разрешение внешнего прерывания INT1
EIMSK |= _BV(INT1);
// установка режима таймера T3
// разрешение прерываний OC1A OC1 OVF
TIMSK3 = 0;
TIMSK3 = _BV(OCIE3A) | _BV(OCIE3B);
SetPWM_Value();
// установка режима CTC таймера
TCCR3B = 0;
TCCR3B |= _BV(WGM32);
}
//-------------------------------------------------------
// запуск таймера T3
void StartPwmTimer()
{
TCCR3B |= _BV(CS30);
}
//-------------------------------------------------------
// останов таймера T3
void StopPwmTimer()
{
TCCR3B &= ~_BV(CS30);
}
void PWM_Update()
{
PWM_val = [b]расчитанное знпчение[/b];
SetPWM_Value();
}
//-------------------------------------------------------
// бработчик прерывания INT1 по
ISR(INT1_vect)
{
cli();
TCNT3L = 0x00;
TCNT3H = 0x00;
// запуск таймера T3, отсчет момета открытия тиристора TIMER3_COMPB
StartPwmTimer();
sei();
}
//-------------------------------------------------------
ISR(TIMER3_COMPA_vect)
{
cli();
// сброс импульса открытия тиристора
DownPWM();
// останов таймера
StopPwmTimer();
sei();
}
//-------------------------------------------------------
ISR(TIMER3_COMPB_vect)
{
cli();
// установка импулса открытия тиристора
UpPWM();
sei();
}