Advertisement
MagnusArias

AVR | (ATtiny24a) PWM

Sep 2nd, 2015
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.63 KB | None | 0 0
  1. #define F_CPU 1000000UL
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4.  
  5. #define SW_DOWN (1<<PA0)
  6. #define SW_DOWN_ON !(PINA & SW_DOWN)
  7.  
  8. #define SW_UP (1<<PA3)
  9. #define SW_UP_ON !(PINA & SW_UP)
  10.  
  11. #define MAX 0xFF
  12.  
  13.  
  14. //płynna zmiana częstotliwości PWM
  15.  
  16. int main(void)
  17. {
  18.     unsigned int PWM_val = 0;               // PWM main value
  19.    
  20.     DDRA &= ~(SW_DOWN | SW_UP);             // Switch input UP & DOWN
  21.     PORTA |= (SW_DOWN | SW_UP);
  22.    
  23.     DDRA    |= ((1<<PA5) | (1<<PA6) | (1<<PA7));    // PWM output on PA6 (OC1A), PA7 (OC0B), PA5 (OC1B)
  24.     DDRB    |= (1 << PB2);                          // PWM output on PB2 (OC0A)
  25.    
  26.     TCCR0A = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00);      // phase correct PWM mode (OCR0x outputs)
  27.     TCCR1A = (1 << COM1B1) | (1 << COM1A1) | (1 << WGM10);      // phase correct PWM mode (OCR1x outputs)
  28.    
  29.     TCCR0B = (1 << CS01);               // clock source = CLK/8, start PWM, for OC0x
  30.     TCCR1B = (1 << CS11);               // clocl source = CLK/8, start PWM, for OC1x
  31.    
  32.     while(1)
  33.     {
  34.         if (SW_UP_ON)
  35.             {
  36.             _delay_ms(30);
  37.            
  38.             if (PWM_val < (MAX*4))  PWM_val+=5;
  39.             else PWM_val = MAX*4;
  40.             }
  41.         else if (SW_DOWN_ON)
  42.             {
  43.             _delay_ms(30);
  44.            
  45.             if (PWM_val > 0) PWM_val-=5;
  46.             else PWM_val = 0;
  47.             }
  48.            
  49.         if ( (PWM_val > 0) && (PWM_val < MAX) )
  50.             {
  51.                 OCR0A = PWM_val;
  52.             }
  53.         else if ( (PWM_val > MAX) && (PWM_val < (MAX*2)) )
  54.             {
  55.                 OCR0A = 0xFA;
  56.                 OCR0B = PWM_val - MAX;
  57.             }
  58.         else if ( (PWM_val > (MAX*2)) && (PWM_val < (MAX*3)) )
  59.             {
  60.                 OCR0B = 0xFA;
  61.                 OCR1A = PWM_val - (MAX*2);
  62.             }
  63.         else if ( (PWM_val > (MAX*3)) && (PWM_val < (MAX*4)) )
  64.             {
  65.                 OCR1A = 0xFA;
  66.                 OCR1B = PWM_val - (MAX*3);
  67.             }
  68.        
  69.     }
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement