Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Atmega16 - tym razem 4 PWMy (prośba o kod w C)

kotu 03 Apr 2006 00:25 894 2
  • #1
    kotu
    Level 14  
    Hej!
    Może jestem trochę monotematyczny jeśli chodzi o te PWM'y ale z moim
    poprzednim problemem odnośnie uruchomienia 2 PWMów na Atmedze8 sobie
    poradziłem.
    Nie mogę niestety poradzić sobie z uruchomieniem aż 4 PWMów w
    Atmedze16. Chcę mieć tylko różne wypełnienie, ale mogą chodzić na tej
    samej częstotliwości. Czy ktoś się może zna i zapisał mi fragment kodu do
    skonfigurowania 4 PWM'ów? (Udało mi się na Atmedze16 odpalić już 2,
    zrobiłem analogicznie jak w Atmedze8:
    //do Atmegi8:
    TCCR1A = _BV(WGM10) | _BV(WGM11) | _BV(COM1A0) | _BV(COM1B0) |
    _BV(COM1A1) | _BV(COM1B1);
    TCCR1B = _BV(CS10);

    DDRB = _BV(PB1) | _BV(PB2);

    // i potem w kodzie zmiana wypełnienia:
    OCR1A = jakas_wartosc_pwm;
    OCR1B = jakas_wartosc_pwm_2;

    //KONIEC

    W Atmedze16 2 pierwsze PWMy zaprogramowałem analogicznie,
    oczywiście uwzględniając zmiany położenia PWMów (są na innych pinach)
    Na rejestrach OCR1A i OCR1B wszystko działa idealnie;
    Nie wiem jednak, jak pobudzić do działania dwa pozostałe.
    Co muszę dopisać do tego, co mam wyżej?

    /* zmiany w kodzie do PWMów Atmegi16 w porównaniu do 8'ki:/*
    //zamiast DDRB = _BV(PB1) | _BV(PB2);
    //DDRD = _BV(PD4) | _BV(PD5);

    --> kolejne PWMy znajdują się z tego co pamiętam na PD7 i PB3.
    Proszę o odzew i dziękuję za ew. pomoc.
    KoTu
  • Helpful post
    #2
    GienekS
    Level 32  
    kotu wrote:
    --> kolejne PWMy znajdują się z tego co pamiętam na PD7 i PB3.
    Proszę o odzew i dziękuję za ew. pomoc.
    Podobnie jak te na T1 tylko dotyczą odpowiednio T2 i T0
    A to przykładowe inicjacje
    /********************************
      Init timer T2
      */
    void InitT2 (void)
    {
     	 TCCR2 = (0<<FOC2) |		 				//forsowanie
     	 	   	 (0<<WGM21)|(1<<WGM20) |			//wybór generatora
     	 	   	 (1<<COM21)|(1<<COM20) |			//rodzaj wyjścia PD7
     	 	   	 (1<<CS22)|(1<<CS21)|(1<<CS20);		//preskaler T2 0;1;8;32;64;128;256;1024
     	 OCR2 =  0x20;								//wartość porównania
     	 DDRD |= 1<<PD7;							//PD7 out
     	 TIMSK |= (0<<OCIE2)|						//interapt od porównania
     	 	   	  (1<<TOIE2);						//interapt od przepełnienia T2
    }
    
    oraz T0
    /********************************
      Init timer T0
      */
    void InitT0 (void)
    {
     	 TCCR0 = (0<<FOC0) |		 				//forsowanie
     	 	   	 (0<<WGM01)|(1<<WGM00) |			//wybór generatora
     	 	   	 (1<<COM01)|(1<<COM00) |			//rodzaj wyjścia PB3
     	 	   	 (1<<CS02)|(0<<CS01)|(1<<CS00);		//preskaler T0 0;1;8;32;256;1024;FinT0;RinT0
     	 OCR0 =  0xa0;								//wartość porównania
     	 DDRB |= 1<<PB3;							//PB3 out
     	 TIMSK |= (0<<OCIE0) |						//interapt od porównania
     	 	   	  (1<<TOIE0);						//interapt od przepełnienia T0
    }
    
  • #3
    kotu
    Level 14  
    Dzięki wielkie!
    Teraz działa elegancko :D