реклама на сайте
подробности

 
 
> проблемка с таймером T3 atmega1280, перестает работь при изменении регистров OCR3A/B
klen
сообщение Nov 16 2007, 09:46
Сообщение #1


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



по внешенму прерыванию сбрасывается счетный регистр запускается таймер 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();
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 04:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.0135 секунд с 7
ELECTRONIX ©2004-2016