uuu000

oled_TCNT1 HP

Oct 18th, 2022
1,280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.77 KB | None | 0 0
  1. #define F_CPU 8000000UL // тактовая частота мк
  2. #include <avr/io.h>
  3. #include <avr/interrupt.h>
  4. #include <util/delay.h>
  5.  
  6. #include "oled_ssd1306.h"
  7. uint8_t tiki;// глобальные тики показывает число прерываний с 0 до 256
  8. uint8_t clk;// флаг клика
  9. uint8_t clk1;// флаг клика
  10. uint16_t i;// 16 разрядная переменная ,т.к. АЦП имеет разрядность 10 бит(1024) и 8 бит(255) недостаточно для работы АЦП
  11.  
  12. void adc_ini (void)
  13. {
  14.     /*** Настройка АЦП ***/
  15.     ADCSRA |= (1 << ADEN) // Включение АЦП
  16.     |(1 << ADPS1)|(1 << ADPS0);    // предделитель преобразователя на 8
  17.     ADMUX |= (0 << REFS1)|(1 << REFS0) // внешний ИОН
  18.     |(1 << MUX0)|(1 << MUX1); // вход PC3
  19. }
  20.  
  21. void adc (void)
  22. {
  23.     ADCSRA |= (1 << ADSC);  // Начинаем преобразование
  24.     while ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования
  25.     i = (ADCL|ADCH << 8); // Считываем  ADC
  26.    
  27.     if (i > 680)
  28.     {
  29.         PORTD |= (1<<PD0);
  30.         PORTD &= ~(1<<PD1);
  31.     }
  32.     else
  33.     {
  34.         PORTD |= (1<<PD1);
  35.         PORTD &= ~(1<<PD0);
  36.     }
  37.    
  38. }
  39.  
  40.  
  41. void Counter0_init()
  42. {
  43.     TCCR1B |= (1 << CS12);
  44.     TCCR1B &= ~(1 << CS11);
  45.  
  46.     TCCR1B &= ~(1 << WGM10);
  47.     TCCR1B &= ~(1 << WGM11);
  48.     TCCR1B |= (1 << WGM12);
  49.     TCCR1B &= ~(1 << WGM13);
  50.  
  51.     TCCR1A &= ~(1 << COM1A1);
  52.     TCCR1A |= (1 << COM1A0);
  53.     DDRB |= (1 << PB1);
  54.    
  55. }
  56.  
  57. // обработчик прерывания по переполнению. ~61гц ( 122)
  58. ISR(TIMER2_OVF_vect)
  59. {
  60.     tiki++;//инкрементируем с каждым прерыванием
  61. }
  62.  
  63.  
  64. // инициализация таймера
  65. void timer_ini(void)
  66. {
  67.     TCCR2B|=(1<<CS22);// запуск таймера 0 с делителем 256
  68.     TIMSK2|=(1<<TOIE0);// разрешить прерывание по переполнению
  69. }
  70.  
  71. uint8_t tikies(void) //функция получения тиков(8 битное число прерываний в любой момент)
  72. {
  73.     return tiki; //возвращает число прерываний (аналог времени между прерываниями умноженному на их число ,т.е. например при частоте 60гц -имеем
  74.     // время между двумя прерываниями 1/60= 17мс и текущее время меняется от 17мс*0 =0 ,до 17*256 =4,2сек)
  75. }
  76. // инициализация блинков
  77. void blink_ini(void)
  78. {
  79.     DDRB|=(1<<PB1);
  80.     DDRC|=(1<<PC0)|(1<<PC1) |(1<<PC2);
  81. }
  82.  
  83. void button_KA(void)
  84. {
  85.     static uint8_t status, press;// переменная тип static для того ,чтобы сохранять свое значение (полученное в результате переключений в теле этой функции)
  86.     //при последующем обращении к этой функции (при последующих иттерациях) ,а не начинать с первоначальгого значения (0) ,как с обычной локальной переменной
  87.     uint8_t now=tikies();// получаем текущее время(текущее возвращенного функцией now=tikies() значения переменной тики  (8битное значение)
  88.    
  89.     switch (status)
  90.     {
  91.         case 0:// опрос кнопки
  92.         if (!(PINB&(1<<PB0))) // если кнопка нажата
  93.         {
  94.             status=1;// уходим в статус 1
  95.             press=now;// запоминаем время нажатия например 25- это число прерываний (тики) назовем его "press"
  96.         }
  97.         break;
  98.        
  99.         case 1:// учет времени удеражания кнопки
  100.         if (PINB&(1<<PB0))// если кнопка уже отжата
  101.         {
  102.             if ((uint8_t) (now-press)>=3) clk=1;//NB!!! переменная tiki имеет 8 бит и примерно через каждые 17*256 =4,2сек переполняется ,что вызывает сбой в
  103.             //if ((now-press)>=3). чтобы избежать этого объявляем переменную (now-press) как 8 бит ,т.е. if ((uint8_t) (now-press)>=3)
  104.             // рассчитываем время удержания кнопки,например после запомненных 25(т.е. press)
  105.             //счетчик прераваний увеличился и стал now =press+число прерываний,прошедших после запоминания (что и является временем задержки (now-press)
  106.             //в данной строке =3 тика(число прерываний (тики))если этой задержки достаточно поднимаем флаг клика clk
  107.             //в случае частоты прерываний 60гц имеем задержку 3*17мс =51мс,что достаточно для антидребезга
  108.             status=0;// уходим в статус 0 ( 3x8.2=24.6b ms)
  109.            
  110.            
  111.            
  112.         }
  113.         break;
  114.        
  115.        
  116.     }
  117. }
  118.  
  119.  
  120. void button_KA1(void)
  121. {
  122.     static uint8_t status, press1;
  123.     uint8_t now1=tikies();// получаем текущее время
  124.    
  125.     switch (status)
  126.     {
  127.         case 0:// опрос кнопки
  128.         if (!(PINB&(1<<PB3))) // если кнопка нажата
  129.         {
  130.             status=1;// уходим в статус 1
  131.             press1=now1;// запоминаем время нажатия
  132.         }
  133.         break;
  134.        
  135.         case 1:// учет времени удеражания кнопки
  136.         if (PINB&(1<<PB3))// если кнопка уже отжата
  137.         {
  138.             if ((uint8_t) (now1-press1)>=3) clk1=1; //NB!!! переменная tiki имеет 8 бит и примерно через каждые 17*256 =4,2сек переполняется ,что вызывает сбой в
  139.             //if ((now1-press1)>=3). чтобы избежать этого объявляем переменную (now1-press1) как 8 бит ,т.е. if ((uint8_t) (now1-press1)>=3)
  140.             // рассчитываем время удержания кнопки, если достаточно поднимаем флаг клика
  141.             status=0;// уходим в статус 0
  142.         }
  143.         else// иначе, кнопка всё еще удерживается
  144.         {
  145.             if ((uint8_t) (now1-press1)>=61) {
  146.                 // если удерживается уже достаточно долго,т.е. разница между запомненным press1 и текущим now1 больше или
  147.                 //равно 61(счетчик тиков)(в этом примере) это и есть длинная задержка .И сейчас поднимается флаг длинного клика clk1=10
  148.                 clk1=10;// поднимаем флаг длинного клика
  149.                 status=2;// уходим в статус 2
  150.             }
  151.         }
  152.         break;
  153.        
  154.         case 2:// ждем пока кнопку отпустят
  155.         if (PINB&(1<<PB3)) status=0;// когда на пине 1 уходим в статус 0
  156.         break;
  157.        
  158.     }
  159. }
  160.  
  161. uint8_t button_stat(void)//При подъеме флага (clk=1) функция возвращает переменную а=clk,о флаг сбрасывает (clk=0) ,подготавливая к следующему нажатию кнопки
  162. {
  163.     uint8_t a=clk;
  164.     clk=0;
  165.     return a;
  166. }
  167. uint8_t button_stat1(void)
  168. {
  169. uint8_t a=clk1;
  170. clk1=0;
  171. return a;  
  172. }
  173.  
  174.  
  175.  
  176. void blink_click_KA(void)
  177. {
  178.     static uint8_t status;
  179.    
  180.     uint8_t but=button_stat();// получение событий от кнопки
  181.    
  182.     switch (status)
  183.     {
  184.         case 0:// светодиод выключен
  185.         TCCR1B&=~((1<<CS10)|(1<<CS12)|(1<<CS11));
  186.         TCCR1A &= ~(1 << COM1A1);
  187.         TCCR1A &= ~(1 << COM1A0);
  188.         PORTB&=~(1<<PB1);
  189.         oled_gotoxy(0,4);
  190.         oled_write(" POSITIV");
  191.         if (but)// если было нажатие меняем статус.
  192.         {
  193.             if (but==1)
  194.             status=1;
  195.            
  196.         }
  197.    
  198.         break;
  199.        
  200.        
  201.         case 1:// светодиод включен
  202.             TCCR1A &= ~(1 << COM1A1);
  203.             TCCR1A &= ~(1 << COM1A0);
  204.             PORTB|=(1<<PB1);
  205.            
  206.         if (but)// если было нажатие меняем статус.
  207.         {
  208.             if (but==1)
  209.             status=2;
  210.            
  211.         }
  212.        
  213.         oled_gotoxy(0,4);
  214.         oled_write(" NEGATIV");
  215.         break;
  216.        
  217.        
  218.         case 2:// светодиод мигает
  219.         OCR1A = 7813;
  220.         Counter0_init();
  221.         if (but)// если было нажатие меняем статус.
  222.         {
  223.             if (but==1)
  224.             status=3;
  225.            
  226.         }
  227.            
  228.          oled_gotoxy(0,4);
  229.          oled_write("  2 Hz  ");
  230.          
  231.         break;
  232.        
  233.        
  234.         case 3:// светодиод мигает
  235.         OCR1A = 2594;
  236.         Counter0_init();
  237.         if (but)// если было нажатие меняем статус.
  238.         {
  239.         if (but==1)
  240.             status=4;
  241.            
  242.         }
  243.    
  244.         oled_gotoxy(0,4);
  245.         oled_write(" 6 Hz  ");
  246.         break;
  247.        
  248.        
  249.         case 4:// светодиод
  250.        
  251.         OCR1A =520;
  252.         Counter0_init();
  253.         oled_gotoxy(0,4);
  254.         oled_write(" 30 Hz  ");
  255.        
  256.         if (but)// если было нажатие меняем статус.
  257.         {
  258.             if (but==1)
  259.             status=5;
  260.            
  261.         }
  262.        
  263.        
  264.         break;
  265.             case 5:// светодиод
  266.            
  267.             OCR1A =313;
  268.             Counter0_init();
  269.             oled_gotoxy(0,4);
  270.             oled_write(" 50 Hz  ");
  271.            
  272.             if (but)// если было нажатие меняем статус.
  273.             {
  274.                 if (but==1)
  275.                 status=6;
  276.                
  277.             }
  278.            
  279.            
  280.             break;
  281.        
  282.             case 6:// светодиод
  283.            
  284.             OCR1A =130;
  285.             Counter0_init();
  286.             oled_gotoxy(0,4);
  287.             oled_write("120 Hz  ");
  288.            
  289.             if (but)// если было нажатие меняем статус.
  290.             {
  291.                 if (but==1)
  292.                 status=0;
  293.                
  294.             }
  295.            
  296.            
  297.             break;
  298.        
  299.        
  300.        
  301.        
  302.        
  303.     }
  304. }
  305.  
  306.  
  307. void blink_click_KA1(void)
  308. {
  309.     static uint8_t status;
  310.     //uint8_t now1=tikies();// текущее "время"
  311.     uint8_t but1=button_stat1();// получение событий от кнопки
  312.    
  313.     switch (status)
  314.     {
  315.         case 0:
  316.         if (but1)// если было нажатие меняем статус.
  317.         {
  318.             //if (but1==1)
  319.             status=1;
  320.            
  321.         }
  322.         PORTC&=~(1<<PC0);
  323.         oled_gotoxy(0,1);
  324.         oled_write("   OFF ");
  325.         break;
  326.        
  327.        
  328.         case 1:
  329.         if (but1)// если было нажатие меняем статус.
  330.         {
  331.             //if (but1==1)
  332.             status=2;
  333.            
  334.         }
  335.         PORTC|=(1<<PC0);
  336.        
  337.        
  338.        
  339.         oled_gotoxy(0,1);
  340.         oled_write("   LOW");
  341.        
  342.         break;
  343.        
  344.        
  345.         case 2:
  346.         if (but1)// если было нажатие меняем статус.
  347.         {
  348.             //if (but1==1)
  349.             status=3;
  350.            
  351.         }
  352.         PORTC&=~(1<<PC0);
  353.         PORTC|=(1<<PC1);
  354.        
  355.        
  356.        
  357.        
  358.         oled_gotoxy(0,1);
  359.         oled_write(" MIDDLE");
  360.        
  361.         break;
  362.        
  363.        
  364.         case 3:
  365.         if (but1)// если было нажатие меняем статус.
  366.         {
  367.             //if (but1==1)
  368.             status=4;
  369.            
  370.         }
  371.         PORTC&=~(1<<PC1);
  372.        
  373.         PORTC|=(1<<PC2);
  374.        
  375.        
  376.         oled_gotoxy(0,1);
  377.         oled_write("  HIGH  ");
  378.        
  379.         break;
  380.        
  381.         case 4:
  382.         if (but1)// если было нажатие меняем статус.
  383.         {
  384.             //if (but1==1)
  385.             status=1;
  386.            
  387.         }
  388.         //if ( (uint8_t) (now1-change1)<1)
  389.         ////насчет (uint8_t) (now1-change1) смотри 198
  390.         //break;
  391.         PORTC&=~(1<<PC2);
  392.        
  393.         oled_gotoxy(0,1);
  394.         oled_write("   OFF ");
  395.        
  396.        
  397.        
  398.         //change1=now1;
  399.         break;
  400.        
  401.     }
  402. }
  403.  
  404.  
  405. int main(void)
  406. {
  407.     DDRD|=(1<<PD0)|(1<<PD1);
  408.     //timer_counter1_INIT();
  409.     adc_ini ();
  410.     blink_ini(); // инициализация блинков
  411.     timer_ini();// инициализация таймера
  412.     sei();// глобально разрешить прерывания
  413.    
  414.     oled_init();
  415.     oled_gotoxy(0,0);
  416.     //oled_font_size(0);
  417.     //oled_gotoxy(0,0);
  418.     //oled_write("12345");
  419.     while(1)
  420.     {
  421.         adc ();
  422.         oled_font_size(1);
  423.         blink_click_KA();
  424.         blink_click_KA1();
  425.         button_KA();
  426.         button_KA1();
  427.        
  428.         oled_font_size(0);
  429.         oled_gotoxy(3,7);
  430.         oled_write("*Tavger ltd*");
  431.        
  432.         //oled_gotoxy(0,0);
  433.         //oled_write("       current");
  434.        
  435.        
  436.        
  437.     }
  438. }
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
Advertisement
Add Comment
Please, Sign In to add comment