uuu000

avtomat

Jan 30th, 2022
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.29 KB | None | 0 0
  1. /*
  2. * avtomat.c
  3. *
  4. * Created: 30.01.2022 20:15:03
  5. * Author : rockd
  6. */
  7.  
  8. #include <avr/io.h>
  9. #include <avr/interrupt.h>
  10. uint8_t tiki;// глобальные тики
  11.  
  12. // обработчик прерывания по переполнению. ~61гц
  13. ISR(TIMER0_OVF_vect)
  14. {
  15. tiki++;//инкрементируем с каждым прерыванием
  16. }
  17.  
  18. // инициализация таймера
  19. void timer_ini(void)
  20. {
  21. TCCR0|=(1<<CS01) | (1<<CS00);// запуск таймера 0 с делителем 64
  22. TIMSK|=(1<<TOIE0);// разрешить прерывание по переполнению
  23. }
  24.  
  25. // получить тики эта функция возвращает текущее значение тики
  26. uint8_t tikies(void)
  27. {
  28. return tiki;
  29. }
  30.  
  31.  
  32. // инициализация блинков
  33. void blink_ini(void){
  34. DDRB|=(1<<PB0) | (1<<PB1) | (1<<PB2)|(1<<PB3);
  35. }
  36.  
  37.  
  38. void blink_KA3(uint8_t on_time, uint8_t off_time){
  39. static uint8_t status, change;
  40. uint8_t now=tikies();
  41.  
  42. switch (status)
  43. {
  44. case 0:
  45. PORTB^=(1<<PB2);// переключаем состояние пина светодиода
  46. change=now;//запоминаем время переключения
  47. if (PINB&(1<<PB2)) status=1;// если на пине 1 уходим в статус 1
  48. else status=2;//иначе уходим в статус 2
  49. break;
  50.  
  51. case 1:// ждем когда кончится время включения
  52. if ( (uint8_t) (now-change)>=on_time) status=0;
  53. break;
  54.  
  55. case 2:// ждем когда кончится время выключения
  56. if ( (uint8_t) (now-change)>=off_time) status=0;
  57. break;
  58. }
  59. }
  60.  
  61. void blink_KA0(uint8_t on_time, uint8_t off_time){
  62. static uint8_t status, change;
  63. uint8_t now=tikies();
  64.  
  65. switch (status)
  66. {
  67. case 0:
  68. PORTB^=(1<<PB3);// переключаем состояние пина светодиода
  69. change=now;//запоминаем время переключения
  70. if (PINB&(1<<PB3)) status=1;// если на пине 1 уходим в статус 1
  71. else status=2;//иначе уходим в статус 2
  72. break;
  73.  
  74. case 1:// ждем когда кончится время включения
  75. if ( (uint8_t) (now-change)>=on_time) status=0;
  76. break;
  77.  
  78. case 2:// ждем когда кончится время выключения
  79. if ( (uint8_t) (now-change)>=off_time) status=0;
  80. break;
  81. }
  82. }
  83.  
  84. void blink_KA2(uint8_t on_time, uint8_t off_time){
  85. static uint8_t status, change;
  86. uint8_t now=tikies();
  87.  
  88. switch (status)
  89. {
  90. case 0:
  91. PORTB&=~(1<<PB1);// выключить светодиод
  92. change=now;//запомнить время выключения
  93. status=1;//уходим в статус 1
  94. break;
  95.  
  96. case 1:// ждем пока кончится время выключения и уходим в статус 2
  97. if ( (uint8_t) (now-change)>=off_time) status=2;
  98. break;
  99.  
  100. case 2:
  101. PORTB|=(1<<PB1);// включить свеиодиод
  102. change=now;//запомнить время включения
  103. status=3;//уходим в статус 3
  104. break;
  105.  
  106. case 3:// ждем пока кончится время включения и уходим в статус 0
  107. if ( (uint8_t) (now-change)>=on_time) status=0;
  108. break;
  109. }
  110. }
  111.  
  112. void blink_KA(void){
  113. static uint8_t status, change;
  114. uint8_t now=tikies();
  115.  
  116. switch (status)
  117. {
  118. case 0:
  119. if ( (uint8_t) (now-change)<60) break; // если время не вышло - выход
  120. PORTB|=(1<<PB0);// иначе включить светодиод
  121. change=now;// запомнить время включения
  122. status=1;// уходим в статус 1
  123. break;
  124.  
  125. case 1:
  126. if ( (uint8_t) (now-change)<60) break; // если время не вышло - выход
  127. PORTB&=~(1<<PB0);// иначе выключить светодиод
  128. change=now;// запомнить время выключения
  129. status=0;// уходим в статус 0
  130. break;
  131. }
  132. }
  133.  
  134.  
  135.  
  136.  
  137. int main(void)
  138. {
  139. blink_ini(); // инициализация блинков
  140. timer_ini();// инициализация таймера
  141. sei();// глобально разрешить прерывания
  142.  
  143. while (1)
  144. {
  145. blink_KA();
  146. blink_KA2(10,30);
  147. blink_KA3(10,10);
  148. blink_KA0(80,80);
  149. }
  150. }
  151.  
  152.  
  153.  
  154.  
Advertisement
Add Comment
Please, Sign In to add comment