Advertisement
Guest User

Servotest

a guest
Jul 13th, 2012
607
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.84 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3.  
  4. #define F_CPU 8000000L
  5. #define baudrate 9600L
  6. #define bauddivider (F_CPU/(16*baudrate)-1)
  7. #define HI(x) ((x)>>8)
  8. #define LO(x) ((x)& 0xFF)
  9.  
  10. #define LED1 4
  11. #define LED2 5
  12. #define LED_PORT PORTD
  13. #define LED_DDR DDRD
  14.  
  15. #define PWM_OUT 3
  16. #define PWM_DDR DDRB
  17. #define PWM_PORT PORTB
  18.  
  19. #define TIMER_CLK_DIV64         0x03    ///< Timer clocked at F_CPU/64
  20. #define TIMER_PRESCALE_MASK     0x07    ///< Timer Prescaler Bit-Mask
  21.  
  22. #define TIMER0_PRESCALER TIMER_CLK_DIV64
  23. #define TIMER0_PRESCALER_VALUE (1<<(3*(TIMER0_PRESCALER-1)))
  24.  
  25. #define MIN_INTERVAL 1000 //microsecond
  26. #define MAX_INTERVAL 2000 //microsecond
  27. #define CLK_INTERVAL (1000000/(F_CPU/TIMER0_PRESCALER_VALUE)) //microseconds
  28. #define MIN_CLKTIMER (MIN_INTERVAL/CLK_INTERVAL) //timer ticks
  29. #define MAX_CLKTIMER (MAX_INTERVAL/CLK_INTERVAL) //timer ticks
  30. #define MID_CLKTIMER ((MAX_CLKTIMER+MIN_CLKTIMER)/2)
  31.  
  32. #define BV(bit) (1<<(bit))
  33. #define cbi(reg,bit) reg &= ~(BV(bit))
  34. #define sbi(reg,bit) reg |= (BV(bit))
  35. #define outb(addr, data) addr = (data)
  36. #define inb(addr) (addr)
  37.  
  38. volatile unsigned char pwm;
  39.  
  40. void init(void)
  41. {
  42.     initUSART();
  43.     initIO();
  44.     initOC0();
  45. }
  46.  
  47. void initIO(void)
  48. {
  49.     LED_DDR = 1<<LED1 | 1<<LED2;
  50. }
  51.  
  52. void initUSART(void)
  53. {
  54.     UBRRL = LO(bauddivider);
  55.     UBRRH = HI(bauddivider);
  56.     UCSRA = 0;
  57.     UCSRB = 1<<RXEN|1<<TXEN|1<<RXCIE|0<<TXCIE;
  58.     UCSRC = 1<<URSEL|1<<UCSZ0|1<<UCSZ1;
  59. }
  60.  
  61. void timer0SetPrescaler(unsigned char prescale)
  62. {
  63.     outb(TCCR0, (inb(TCCR0) & ~TIMER_PRESCALE_MASK) | prescale);
  64. }
  65.  
  66. void initOC0(void)
  67. {
  68.     sbi(PWM_DDR, PWM_OUT);
  69.     cbi(PWM_PORT, PWM_OUT);
  70.  
  71.     timer0SetPrescaler(TIMER0_PRESCALER); //start timer0 PWM
  72.  
  73.     sbi(TCCR0, WGM00);
  74.     sbi(TCCR0, WGM01);
  75.  
  76.     cbi(TCCR0, COM00);
  77.     sbi(TCCR0, COM01);
  78.  
  79.     pwm = MID_CLKTIMER;
  80.     OCR0 = pwm;
  81. }
  82.  
  83. ISR(USART_RXC_vect)
  84. {
  85. switch(UDR)
  86.     {
  87.     case '1': {
  88.         sbi(LED_PORT, LED2);
  89.         break;
  90.         }
  91.     case '0': {
  92.         cbi(LED_PORT, LED2);
  93.         break;
  94.         }
  95.     case 'q': {
  96.         if (pwm<MAX_CLKTIMER-1)
  97.             pwm += 1;
  98.         else
  99.             pwm = MAX_CLKTIMER;
  100.         OCR0 = pwm;
  101.         break;
  102.         }
  103.     case 'a': {
  104.         if (pwm>MIN_CLKTIMER+1)
  105.             pwm -= 1;
  106.         else
  107.             pwm = MIN_CLKTIMER;
  108.         OCR0 = pwm;
  109.         break;
  110.         }
  111.  
  112.     case 'w': {
  113.         if (pwm<MAX_CLKTIMER-10)
  114.             pwm += 10;
  115.         else
  116.             pwm = MAX_CLKTIMER;
  117.         OCR0 = pwm;
  118.         break;
  119.         }
  120.     case 's': {
  121.         if (pwm>MIN_CLKTIMER+10)
  122.             pwm -= 10;
  123.         else
  124.             pwm = MIN_CLKTIMER;
  125.         OCR0 = pwm;
  126.         break;
  127.         }
  128.     case 'e': {
  129.         pwm = MAX_CLKTIMER;
  130.         OCR0 = pwm;
  131.         break;
  132.         }
  133.     case 'd': {
  134.         pwm = MIN_CLKTIMER;
  135.         OCR0 = pwm;
  136.         break;
  137.         }
  138.     case 'r': {
  139.         pwm = MID_CLKTIMER;
  140.         OCR0 = pwm;
  141.         break;
  142.         }
  143.     default: {
  144.         break;
  145.         }
  146.     }
  147. }
  148.  
  149. int main(void)
  150. {
  151.     unsigned char i;
  152.     unsigned char j;
  153.     init();
  154.     sei();
  155.  
  156.     while (1)
  157.     {
  158.         i++;
  159.         if (i==64) {
  160.             j++;
  161.         }
  162.  
  163.         if (j>127) {
  164.             sbi(LED_PORT, LED1);   
  165.         } else {
  166.             cbi(LED_PORT, LED1);   
  167.         }
  168.     }
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement