1. #define F_CPU 8000000UL
  2.  
  3. #include <avr/io.h>
  4. #include <avr/interrupt.h>
  5. #include <util/delay.h>
  6. #include <compat/deprecated.h>
  7.  
  8. void initialize(void);
  9.  
  10. //functions for left wheel
  11. void init_pwm_right(void);
  12. void start_pwm_right(void);
  13. void stop_pwm_right(void);
  14.  
  15. //functions for right wheel
  16. void init_pwm_left(void);
  17. void start_pwm_left(void);
  18. void stop_pwm_left(void);
  19.  
  20.  
  21. int main(void)
  22. {
  23. volatile int i = 0, j = 0, k = 0;
  24. initialize(); //call initialize routine, rest would be done by interrupts.
  25.  
  26. while(1) //main loop for LFR
  27. {
  28.  
  29. i = bit_is_set(PINB, PB0);
  30. if(!i)
  31. {
  32. //Steer to left
  33. stop_pwm_left();
  34. stop_pwm_right();
  35. start_pwm_right();
  36. }
  37. else
  38. {
  39. //Steer to right
  40. stop_pwm_left();
  41. stop_pwm_right();
  42. start_pwm_left();
  43. }
  44.  
  45. // Some delay
  46. for(j=0;j<255;j++)
  47. {
  48. for(k=0;k<255;k++)
  49. {
  50. }
  51. }
  52. }
  53. }
  54.  
  55. void initialize()
  56. {
  57. init_pwm_left();
  58. init_pwm_right();
  59.  
  60. start_pwm_left();
  61. start_pwm_right();
  62.  
  63. DDRB |= (0 << DDB0); //setting PORTB.0 as input
  64. }
  65.  
  66. void init_pwm_right(void)
  67. {
  68. TCCR2 |= 1 << CS22; //pre-scaler 256
  69. TCCR2 |= 1 << CS21; //pre-scaler 256
  70. TCCR2 |= 0 << CS20; //pre-scaler 256
  71.  
  72. TCCR2 |= 1 << WGM20; //fast pwm
  73. TCCR2 |= 1 << WGM21; //fast pwm
  74.  
  75. TCCR2 |= 0 << COM20; //non-inverting pwm
  76. TCCR2 |= 1 << COM21; //non-inverting pwm
  77. OCR2 = 255; //Initial value into OCR2
  78. DDRD |= (1 << DDD7); //setting PORTD.7 as output
  79. }
  80.  
  81. void init_pwm_left(void)
  82. {
  83. TCCR0 |= 1 << CS02; //pre-scaler 256
  84. TCCR0 |= 0 << CS01; //pre-scaler 256
  85. TCCR0 |= 0 << CS00; //pre-scaler 256
  86.  
  87. TCCR0 |= 1 << WGM00; //fast pwm
  88. TCCR0 |= 1 << WGM01; //fast pwm
  89.  
  90. TCCR0 |= 0 << COM00; //non-inverting pwm
  91. TCCR0 |= 1 << COM01; //non-inverting pwm
  92. OCR0 = 255; //Initial value into OCR0
  93. DDRB |= (1 << DDB3); //setting PORTB.3 as output
  94. }
  95.  
  96.  
  97.  
  98. void start_pwm_right(void)
  99. {
  100. TCCR2 |= (1 << CS22); //pre-scaler, 256
  101. TCCR2 |= (1 << CS21); //pre-scaler, 256
  102. TCCR2 |= (0 << CS20); //pre-scaler, 256
  103. }
  104.  
  105.  
  106. void start_pwm_left(void)
  107. {
  108. TCCR0 |= (1 << CS02); //pre-scaler 256
  109. TCCR0 |= (0 << CS01); //pre-scaler 256
  110. TCCR0 |= (0 << CS00); //pre-scaler 256
  111. }
  112.  
  113.  
  114. void stop_pwm_right(void)
  115. {
  116. TCCR2 &= ~(1 << CS22); //NO pre-scaler, timer stopped
  117. TCCR2 &= ~(1 << CS21); //NO pre-scaler, timer stopped
  118. TCCR2 &= ~(1 << CS20); //NO pre-scaler, timer stopped
  119. }
  120.  
  121.  
  122. void stop_pwm_left(void)
  123. {
  124. TCCR0 &= ~(1 << CS02); //NO pre-scaler, timer stopped
  125. TCCR0 &= ~(1 << CS01); //NO pre-scaler, timer stopped
  126. TCCR0 &= ~(1 << CS00); //NO pre-scaler, timer stopped
  127. }
  128.