Страница 1 из 1

шим atmega16

Добавлено: Вс июн 26, 2011 15:07:31
romanF1

Код: Выделить всё

#include "iom16.h"

unsigned char pwm = 1;
unsigned char inc = 1; // inc = 0 - уменьшать, inc = 1 - увеличивать яркость

void timer2_init()
{
  OCR2 = 1; //ШИМ почти выключена
  // Быстрая ШИМ, переключать OC2 (PD7), увеличение таймера каждые 64 такта
  TCCR2 |= (1 << WGM20) | ( 1 << WGM21) | (1 << COM21) | (1 << CS22);
}

void timer1_init()
{
  OCR1A = 43200; //Прерывание 32 раза в секунду
  TCCR1A = 0;
  // СТС режим, увеличение таймера каждые 8 тактов
  TCCR1B |= (1 << WGM12) | (1 << CS11);
  // Прерывание по совпадению А таймера1
  TIMSK |= (1 << OCIE1A);
  SREG |= (1 << 7); //Разрешить прерывания
}

void io_init() //Инициализация портов ввода-вывода
{
  DDRD = (1 << PD7);
  PORTD = 0;
}

void main ()
{
  timer2_init();
  timer1_init();
  io_init();
  while(1)
  {
  }
}


#pragma vector = TIMER1_COMPA_vect  //объясните пожалуйста участок кода из примера что это за                      
                                                            прерывание и как оно запускается?
__interrupt void PWM_change()
{
  if (inc == 1) 
  {
    if (pwm < 254)
    {
      pwm++;  // Увеличиваем яркость лампы, пока не достигнем максимума
      OCR2 = pwm;
    }
    else
    {
      inc = 0;
    }
  }
  else
  {
    if (pwm > 1)
    {
      pwm--;  // Уменьшаем яркость лампы, пока не остигнем минимума
      OCR2 = pwm;
    }
    else
    {
      inc = 1;
    }
  }
}
подскажите как рассчитывать ШИМ на микроконтроллере Atmega16?

Re: шим atmega16

Добавлено: Вс июн 26, 2011 16:44:08
Goldsmith
В фирменном даташите на ATmega16 и ATmega16L (2466P–AVR–08/07):

Таймер 0 - стр. 77-80.
Таймер 1 - стр. 102-108.
Таймер 2 - стр. 123-125.