uuu000

Atmega8_KA2 11 44

Feb 7th, 2022
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.93 KB | None | 0 0
  1. /*
  2. * avtomat.c
  3. *
  4. * Created: 30.01.2022 20:15:03
  5. * Author : rockd
  6. */
  7. #define F_CPU 8000000UL// тактовая частота мк
  8. #include <avr/io.h>
  9. #include <avr/interrupt.h>
  10. uint8_t tiki;// глобальные тики
  11. uint8_t clk;// флаг клика
  12. uint8_t clk1;// флаг клика
  13.  
  14. // обработчик прерывания по переполнению. ~61гц
  15. ISR(TIM0_OVF_vect)
  16. {
  17. tiki++;//инкрементируем с каждым прерыванием
  18. }
  19. ISR(TIM1_OVF_vect)
  20.  
  21. {
  22. unsigned int u;
  23. TCNT1=64536;
  24. ADCSRA |= (1 << ADSC); // Начинаем преобразование
  25. while ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования
  26.  
  27. u = (ADCL|ADCH << 8); // Считываем ADC
  28.  
  29. if (u > 1)
  30. {
  31. PORTA |= (1<<PA4);
  32. PORTA &= ~(1<<PA5);
  33. }
  34.  
  35.  
  36. if (u > 740)
  37. {
  38. PORTA |= (1<<PA5);
  39. PORTA &= ~(1<<PA4);
  40. }
  41.  
  42.  
  43. }
  44. // инициализация таймера
  45. void timer_ini(void)
  46. {
  47. TCCR0B|=(1<<CS01)|(1<<CS00);// запуск таймера 0 с делителем 64
  48. TIMSK0|=(1<<TOIE0);// разрешить прерывание по переполнению
  49.  
  50. TCCR1B|=(1<<CS11);
  51. TIMSK1|=1<<TOIE1;
  52. }
  53.  
  54. void adc_ini(void)
  55. {
  56. /*** Настройка АЦП ***/
  57. ADCSRA |= (1 << ADEN) // Включение АЦП
  58. |(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
  59. ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
  60. |(1 << MUX0)|(1 << MUX1); // вход PA3
  61.  
  62. }
  63. // получить тики эта функция возвращает текущее значение тики
  64. uint8_t tikies(void)
  65. {
  66. return tiki;
  67. }
  68.  
  69.  
  70. // инициализация блинков
  71. void blink_ini(void)
  72. {
  73. DDRB|=(1<<PB2);
  74. DDRA|=(1<<PA0)|(1<<PA1) |(1<<PA2) | (1<<PA4)|(1<<PA5)| (1<<PA6)|(1<<PA7);
  75. }
  76. void button_KA(void)
  77. {
  78. static uint8_t status, press;
  79. uint8_t now=tikies();// получаем текущее время
  80.  
  81. switch (status)
  82. {
  83. case 0:// опрос кнопки
  84. if (!(PINB&(1<<PB0))) // если кнопка нажата
  85. {
  86. status=1;// уходим в статус 1
  87. press=now;// запоминаем время нажатия
  88. }
  89. break;
  90.  
  91. case 1:// учет времени удеражания кнопки
  92. if (PINB&(1<<PB0))// если кнопка уже отжата
  93. {
  94. if ((uint8_t) (now-press)>=3) clk=1;// рассчитываем время удержания кнопки, если достаточно поднимаем флаг клика
  95. status=0;// уходим в статус 0
  96. }
  97. else// иначе, кнопка всё еще удерживается
  98. {
  99. if ((uint8_t) (now-press)>=61) {// если удерживается уже достаточно долго
  100. clk=10;// поднимаем флаг длинного клика
  101. status=2;// уходим в статус 2
  102. }
  103. }
  104. break;
  105.  
  106. case 2:// ждем пока кнопку отпустят
  107. if (PINB&(1<<PB0)) status=0;// когда на пине 1 уходим в статус 0
  108. break;
  109.  
  110. }
  111. }
  112.  
  113.  
  114.  
  115. void button_KA1(void)
  116. {
  117. static uint8_t status, press1;
  118. uint8_t now1=tikies();// получаем текущее время
  119.  
  120. switch (status)
  121. {
  122. case 0:// опрос кнопки
  123. if (!(PINB&(1<<PB1))) // если кнопка нажата
  124. {
  125. status=1;// уходим в статус 1
  126. press1=now1;// запоминаем время нажатия
  127. }
  128. break;
  129.  
  130. case 1:// учет времени удеражания кнопки
  131. if (PINB&(1<<PB1))// если кнопка уже отжата
  132. {
  133. if ((uint8_t) (now1-press1)>=3) clk1=1;// рассчитываем время удержания кнопки, если достаточно поднимаем флаг клика
  134. status=0;// уходим в статус 0
  135. }
  136. else// иначе, кнопка всё еще удерживается
  137. {
  138. if ((uint8_t) (now1-press1)>=61) {// если удерживается уже достаточно долго
  139. clk1=10;// поднимаем флаг длинного клика
  140. status=2;// уходим в статус 2
  141. }
  142. }
  143. break;
  144.  
  145. case 2:// ждем пока кнопку отпустят
  146. if (PINB&(1<<PB1)) status=0;// когда на пине 1 уходим в статус 0
  147. break;
  148.  
  149. }
  150. }
  151.  
  152. uint8_t button_stat(void)
  153. {
  154. uint8_t a=clk;
  155. clk=0;
  156. return a;
  157. }
  158. uint8_t button_stat1(void)
  159. {
  160. uint8_t a=clk1;
  161. clk1=0;
  162. return a;
  163. }
  164.  
  165.  
  166.  
  167. void blink_click_KA(void){
  168. static uint8_t status, change;
  169. uint8_t now=tikies();// текущее "время"
  170. uint8_t but=button_stat();// получение событий от кнопки
  171.  
  172. switch (status)
  173. {
  174. case 0:// светодиод выключен
  175. if (but)// если было нажатие меняем статус.
  176. {
  177. if (but==1) status=1;
  178. if (but==10) status=2;
  179. }
  180. PORTB&=~(1<<PB2);
  181. break;
  182.  
  183. case 1:// светодиод включен
  184. if (but)// если было нажатие меняем статус.
  185. {
  186. if (but==1) status=2;
  187. //if (but==10) status=2;
  188. }
  189. PORTB|=(1<<PB2);
  190. break;
  191.  
  192. case 2:// светодиод мигает
  193. if (but)// если было нажатие меняем статус.
  194. {
  195. if (but==1) status=3;
  196. if (but==10) status=1;
  197. }
  198. if ( (uint8_t) (now-change)<50) break;
  199. PORTB^=(1<<PB2);
  200. change=now;
  201. break;
  202.  
  203. case 3:// светодиод мигает
  204. if (but)// если было нажатие меняем статус.
  205. {
  206. if (but==1) status=0;
  207. if (but==10) status=1;
  208. }
  209. if ( (uint8_t) (now-change)<25) break;
  210. PORTB^=(1<<PB2);
  211. change=now;
  212. break;
  213. }
  214. }
  215. void blink_click_KA1(void){
  216. static uint8_t status, change1;
  217. uint8_t now1=tikies();// текущее "время"
  218. uint8_t but1=button_stat1();// получение событий от кнопки
  219.  
  220. switch (status)
  221. {
  222. case 0:// светодиод выключен
  223. if (but1)// если было нажатие меняем статус.
  224. {
  225. if (but1==1) status=1;
  226. //if (but==10) status=5;
  227. }
  228. PORTA&=~(1<<PA0);
  229. //PORTA&=~(1<<PA3);
  230. break;
  231.  
  232. case 1:// светодиод включен
  233. if (but1)// если было нажатие меняем статус.
  234. {
  235. if (but1==1) status=2;
  236. //if (but==10) status=2;
  237. }
  238. PORTA|=(1<<PA0);
  239. //PORTA|=(1<<PA3);
  240. break;
  241. case 2:// светодиод включен
  242. if (but1)// если было нажатие меняем статус.
  243. {
  244. if (but1==1) status=3;
  245. //if (but==10) status=2;
  246. }
  247. PORTA&=~(1<<PA0);
  248. //PORTA&=~(1<<PA3);
  249. PORTA|=(1<<PA1);
  250. //PORTA|=(1<<PA4);
  251. break;
  252. case 3:// светодиод включен
  253. if (but1)// если было нажатие меняем статус.
  254. {
  255. if (but1==1) status=4;
  256. //if (but==10) status=2;
  257. }
  258. PORTA&=~(1<<PA1);
  259. //PORTA&=~(1<<PA4);
  260. PORTA|=(1<<PA2);
  261. //PORTA|=(1<<PA5);
  262. break;
  263.  
  264. case 4:// светодиод мигает
  265. if (but1)// если было нажатие меняем статус.
  266. {
  267. if (but1==1) status=1;
  268. if (but1==10) status=1;
  269. }
  270. if ( (uint8_t) (now1-change1)<1) break;
  271. PORTA&=~(1<<PA2);
  272. //PORTA&=~(1<<PA5);
  273. change1=now1;
  274. break;
  275.  
  276. }
  277. }
  278.  
  279. int main(void)
  280. {
  281. /*** Настройка АЦП ***/
  282. ADCSRA |= (1 << ADEN) // Включение АЦП
  283. |(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
  284. ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
  285. |(1 << MUX0)|(1 << MUX1); // вход PA3
  286.  
  287. //TCCR1A = 0b00000000;
  288. //TCCR1B|=1<<CS11;
  289. //TIMSK1|=1<<TOIE1;
  290.  
  291. adc_ini();
  292. blink_ini(); // инициализация блинков
  293. timer_ini();// инициализация таймера
  294. sei();// глобально разрешить прерывания
  295.  
  296. while (1)
  297. { blink_click_KA();
  298. blink_click_KA1();
  299. button_KA();
  300. button_KA1();
  301. }
  302.  
  303. }
  304.  
  305.  
  306.  
  307.  
Advertisement
Add Comment
Please, Sign In to add comment