Redfern_89

speedommetr.c (igor efremenko)

Dec 23rd, 2017
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 14.38 KB | None | 0 0
  1. /*
  2.   Подход измерения:
  3.     после первого импульса засекается время до следующего импульса
  4.     после чего производится расчёт скорости.
  5. */
  6.  
  7. #include <mega8.h>
  8. #include <delay.h>
  9. #include <stdio.h>
  10. #include <string.h>     // работа со строками
  11. #include <my_usart.c>
  12.  
  13. #include "Variables.c" // Переменные и константы
  14.  
  15. interrupt [EXT_INT0] void ext_int0_isr(void)
  16. {// External Interrupt 0 service routine SPEEDOMETR
  17.  // Принцип измерения: Измеряем время между импульсами.
  18.   CNT_Impuls_S++;
  19.  
  20.   if (CNT_Impuls_S>=CountImpuls) // меряем время CountImpuls импульсов
  21.    {
  22.     TMP_TCNT_S=TCNT0;           // запоминаем для дальнейшей обработки
  23.     TMP_CNT_OVF_S=CNT_OVF_S;
  24.    
  25.     CNT_OVF_S=0;                // обнуляем счётчики
  26.     TCNT0=0;
  27.     CNT_Impuls_S=0;             // Обнуляем счётчик имульсов
  28.     Flag_Speed=1;               // Выставляем признак обработки скорости
  29.    }
  30. }
  31.  
  32. interrupt [EXT_INT1] void ext_int1_isr(void)
  33. {// External Interrupt 1 service routine TAXOMETR
  34.   CNT_Impuls_T++;
  35. }
  36.  
  37. interrupt [TIM0_OVF] void timer0_ovf_isr(void)
  38. {
  39. // Clock value: 7,813 kHz
  40.   CNT_OVF_S++;                  // подсчитываем количество переполнений
  41. }
  42.  
  43. interrupt [TIM1_OVF] void timer1_ovf_isr(void)
  44. {
  45. // Reinitialize Timer1 value
  46. TCNT1H=0xE17A >> 8;               //1 раз в сек
  47. TCNT1L=0xE17A & 0xff;
  48. //TCNT1H=0xF0BC >> 8;                 //2 раза в сек
  49. //TCNT1L=0xF0BC & 0xff;
  50. // Timer/Counter 1 initialization
  51. // Clock value: 7,813 kHz
  52.     TMP_CNT_Impuls_T=CNT_Impuls_T;  // запоминаем для дальнейшей обработки
  53.     CNT_Impuls_T=0;                 // обнуляем счетчик импульсов тахометра
  54.  
  55. //теоретически значение CNT_Impuls_T не может быть больше 100  
  56. }
  57.  
  58. void SetSpeed(int _Speed)
  59. {  // Установить СКОРОСТЬ  -  разряды [7-9]
  60.   Digits[6]=NumbersCA[(_Speed/100)%10];  
  61.   Digits[7]=NumbersCA[(_Speed/10)%10];  
  62.   Digits[8]=NumbersCA[(_Speed%10)];  
  63.  
  64. };
  65.  
  66. void SetOdometr(unsigned int _Length)
  67. { // Установить КИЛОМЕТРАЖ - разряды [1-6]
  68. /*long D0,D1,D2,D3,D4,D5;
  69. long int X;
  70. X=_Length;
  71.   D0=(X/100000)%10;  
  72.   D1=(X/10000)%10;  
  73.   D2=(X/1000)%10;  
  74.   D3=(X/100)%10;  
  75.   D4=(X/10)%10;  
  76.   D5=(X%10);  */
  77.  
  78.   Digits[0]=NumbersCA[(_Length/100000)%10];  
  79.   Digits[1]=NumbersCA[(_Length/10000)%10];  
  80.   Digits[2]=NumbersCA[(_Length/1000)%10];  
  81.   Digits[3]=NumbersCA[(_Length/100)%10];  
  82.   Digits[4]=NumbersCA[(_Length/10)%10]&DP;// и точку  
  83.   Digits[5]=NumbersCA[(_Length%10)];      // десятые
  84. };
  85.  
  86. void SetAdvLED(char A, char B, char C)
  87. { PORT_SH=0;
  88.   if (A) PORT_DS=1; else PORT_DS=0; // установить значение
  89.   PORT_SH=1; delay_ms(5);           //записать в порт / сдвинуть
  90.   PORT_SH=0;
  91.   if (B) PORT_DS=1; else PORT_DS=0; // установить значение
  92.   PORT_SH=1; delay_ms(5);           //записать в порт / сдвинуть
  93.   PORT_SH=0;
  94.   if (C) PORT_DS=1; else PORT_DS=0; // установить значение
  95.   PORT_SH=1; delay_ms(5);           //записать в порт / сдвинуть
  96. }
  97.  
  98. void SetDotBar(char level)
  99. {volatile int i;
  100.    for (i=60; i>=0; i--)
  101.      { PORT_SH=0;    
  102.        if (i<level) PORT_DS=0; // установить значение
  103.                else PORT_DS=1;
  104.        PORT_SH=1;              //записать в порт / сдвинуть
  105.      }  
  106. };
  107.  
  108. void ShowNumbers()
  109. {int i;
  110.   for (i=8;i>=0;i--)
  111.     {  //           установить значение                 записать в порт / сдвинуть
  112.          PORT_SH=0; PORT_DS=(Digits[i]& 0b10000000)>>7; PORT_SH=1;  
  113.          PORT_SH=0; PORT_DS=(Digits[i]& 0b01000000)>>6; PORT_SH=1;
  114.          PORT_SH=0; PORT_DS=(Digits[i]& 0b00100000)>>5; PORT_SH=1;  
  115.          PORT_SH=0; PORT_DS=(Digits[i]& 0b00010000)>>4; PORT_SH=1;  
  116.          PORT_SH=0; PORT_DS=(Digits[i]& 0b00001000)>>3; PORT_SH=1;  
  117.          PORT_SH=0; PORT_DS=(Digits[i]& 0b00000100)>>2; PORT_SH=1;  
  118.          PORT_SH=0; PORT_DS=(Digits[i]& 0b00000010)>>1; PORT_SH=1;  
  119.          PORT_SH=0; PORT_DS=(Digits[i]& 0b00000001)>>0; PORT_SH=1;  
  120.     }    
  121. };
  122.  
  123. void RefreshDisplay(char A, char B, char C, char DB)
  124. {
  125.   PORT_ST=0;       //Prepare
  126.   ShowNumbers();   //Speed and Odometr  
  127.   SetAdvLED(A,B,C);//Advenced LED status  
  128.   SetDotBar(DB);   //Tahometr
  129.   PORT_ST=1;       //Показать всё
  130. }
  131.  
  132. void DEMO(void)
  133. {volatile int i;
  134.   Digits[0]=NumbersCA[11];  // H
  135.   Digits[1]=NumbersCA[22];  // E
  136.   Digits[2]=NumbersCA[26];  // L
  137.   Digits[3]=NumbersCA[26];  // L
  138.   Digits[4]=NumbersCA[ 0];  // O
  139.   Digits[5]=NumbersCA[18];  //
  140.   Digits[6]=NumbersCA[13];  // P
  141.   Digits[7]=NumbersCA[01];  // I
  142.   Digits[8]=NumbersCA[22];  // E
  143.   RefreshDisplay(0,1,0,0);
  144.   delay_ms(1000);
  145.  
  146.  for (i=0; i<=61; i++)
  147.    {
  148.      RefreshDisplay(1,0,1,i);   //Show
  149.      delay_ms(20);    
  150.      switch (i){
  151.        case 0: {
  152.                 Digits[2]=NumbersCA[17];
  153.                 Digits[3]=NumbersCA[17];
  154.                 break;
  155.                }
  156.        case 15:{
  157.                 Digits[1]=NumbersCA[17];
  158.                 Digits[2]=NumbersCA[17];
  159.                 Digits[3]=NumbersCA[17];
  160.                 Digits[4]=NumbersCA[17];
  161.                 break;
  162.                }
  163.        case 30:{
  164.                 Digits[0]=NumbersCA[17];
  165.                 Digits[1]=NumbersCA[17];
  166.                 Digits[2]=NumbersCA[17];
  167.                 Digits[3]=NumbersCA[17];
  168.                 Digits[4]=NumbersCA[17];
  169.                 Digits[5]=NumbersCA[17];
  170.                 break;
  171.                }
  172.        case 45:{
  173.                 Digits[0]=NumbersCA[17];
  174.                 Digits[1]=NumbersCA[17];
  175.                 Digits[2]=NumbersCA[28];
  176.                 Digits[3]=NumbersCA[29];
  177.                 Digits[4]=NumbersCA[17];
  178.                 Digits[5]=NumbersCA[17];
  179.                 break;
  180.                }
  181.        case 60:{
  182.                 Digits[0]=NumbersCA[17];
  183.                 Digits[1]=NumbersCA[28];
  184.                 Digits[2]=NumbersCA[30];
  185.                 Digits[3]=NumbersCA[30];
  186.                 Digits[4]=NumbersCA[29];
  187.                 Digits[5]=NumbersCA[17];
  188.                 break;
  189.                }  
  190.      }
  191.    }  
  192.  delay_ms(30);
  193.  for (i=61; i>=0; i--)
  194.    {
  195.      RefreshDisplay(0,1,0,i);   //Show
  196.      delay_ms(20);
  197.      switch (i){
  198.        case 60:{
  199.                 Digits[0]=NumbersCA[28];
  200.                 Digits[1]=NumbersCA[30];
  201.                 Digits[2]=NumbersCA[30];
  202.                 Digits[3]=NumbersCA[30];
  203.                 Digits[4]=NumbersCA[30];
  204.                 Digits[5]=NumbersCA[29];
  205.                 break;
  206.                }
  207.        case 45:{
  208.                 Digits[0]=NumbersCA[30];
  209.                 Digits[1]=NumbersCA[30];
  210.                 Digits[2]=NumbersCA[17];
  211.                 Digits[3]=NumbersCA[17];
  212.                 Digits[4]=NumbersCA[30];
  213.                 Digits[5]=NumbersCA[30];
  214.                 Digits[6]=NumbersCA[17];  // P
  215.                 Digits[7]=NumbersCA[17];  // I
  216.                 Digits[8]=NumbersCA[17];  // E
  217.                 break;
  218.                }
  219.        case 30:{
  220.                 Digits[0]=NumbersCA[30];
  221.                 Digits[1]=NumbersCA[17];
  222.                 Digits[2]=NumbersCA[18];
  223.                 Digits[3]=NumbersCA[18];
  224.                 Digits[4]=NumbersCA[17];
  225.                 Digits[5]=NumbersCA[30];
  226.                 Digits[6]=NumbersCA[28];  // P
  227.                 Digits[7]=NumbersCA[30];  // I
  228.                 Digits[8]=NumbersCA[29];  // E
  229.                 break;
  230.                }
  231.        case 15:{
  232.                 Digits[0]=NumbersCA[17];
  233.                 Digits[1]=NumbersCA[18];
  234.                 Digits[2]=NumbersCA[18];
  235.                 Digits[3]=NumbersCA[18];
  236.                 Digits[4]=NumbersCA[18];
  237.                 Digits[5]=NumbersCA[17];
  238.                 Digits[6]=NumbersCA[17];  // P
  239.                 Digits[7]=NumbersCA[17];  // I
  240.                 Digits[8]=NumbersCA[17];  // E
  241.                 break;
  242.                }
  243.        case  0:{
  244.                 Digits[0]=NumbersCA[18];
  245.                 Digits[1]=NumbersCA[18];
  246.                 Digits[2]=NumbersCA[18];
  247.                 Digits[3]=NumbersCA[18];
  248.                 Digits[4]=NumbersCA[18];
  249.                 Digits[5]=NumbersCA[18];
  250.                 Digits[6]=NumbersCA[18];  // P
  251.                 Digits[7]=NumbersCA[18];  // I
  252.                 Digits[8]=NumbersCA[18];  // E
  253.                 break;
  254.                }  
  255.      }
  256.    }  
  257.  // BEPC. 1.0  
  258.   Digits[0]=NumbersCA[ 8];
  259.   Digits[1]=NumbersCA[22];
  260.   Digits[2]=NumbersCA[13];
  261.   Digits[3]=NumbersCA[14]&DP;// и точку
  262.   Digits[4]=NumbersCA[01]&DP;// и точку
  263.   Digits[5]=NumbersCA[00];
  264.   Digits[6]=NumbersCA[17];  // P
  265.   Digits[7]=NumbersCA[17];  // I
  266.   Digits[8]=NumbersCA[17];  // E
  267.    
  268.  RefreshDisplay(0,1,0,0);   //Show
  269. };
  270.  
  271. void TestDisplay1(void)
  272. {char i;
  273.  
  274.  for (i=0; i<=136; i++)
  275.  {
  276.    PORT_ST=0;       //Prepare
  277.    
  278.      PORT_SH=0;
  279.      
  280.      PORT_DS=1;
  281.      
  282.      PORT_SH=1;  
  283.  
  284.    PORT_ST=1;       //Показать всё    
  285.    delay_ms(200);
  286.  }
  287.  
  288. delay_ms(2000);
  289.  
  290.  for (i=0; i<=136; i++)
  291.  {
  292.    PORT_ST=0;       //Prepare
  293.    
  294.      PORT_SH=0;
  295.      
  296.      PORT_DS=0;
  297.      
  298.      PORT_SH=1;  
  299.  
  300.    PORT_ST=1;       //Показать всё    
  301.    delay_ms(200);
  302.  }
  303. }
  304.  
  305.  
  306. void main(void)
  307. {
  308. #include "Chip_Setting.c" // инициализация МК
  309. USART_Init();                   // Инициализация СОМ порта
  310.  
  311. printf("Begin\n\r");
  312.  
  313.   Digits[0]=NumbersCA[11];  // H
  314.   Digits[1]=NumbersCA[22];  // E
  315.   Digits[2]=NumbersCA[26];  // L
  316.   Digits[3]=NumbersCA[26];  // L
  317.   Digits[4]=NumbersCA[ 0];  // O
  318.   Digits[5]=NumbersCA[18];  //
  319.   Digits[6]=NumbersCA[13];  // P
  320.   Digits[7]=NumbersCA[01];  // I
  321.   Digits[8]=NumbersCA[22];  // E
  322.   RefreshDisplay(0,1,0,0);
  323. //  delay_ms(1000);
  324.  
  325. // Обнулить значение счётчика, если при включении нажата кнопка Х
  326.   if (~BTN1 && ~BTN3)
  327.     {
  328.       ee_LengthAll=0;
  329.       Digits[0]=NumbersCA[17];   // -
  330.       Digits[1]=NumbersCA[24];   // n
  331.       Digits[2]=NumbersCA[31];   // U
  332.       Digits[3]=NumbersCA[26];   // L
  333.       Digits[4]=NumbersCA[26];   // L
  334.       Digits[5]=NumbersCA[17];   // -
  335.       Digits[6]=NumbersCA[ 0];   // 0
  336.       Digits[7]=NumbersCA[21]&DP;// d
  337.       Digits[8]=NumbersCA[18];   //
  338.       RefreshDisplay(0,0,0,0);
  339.       delay_ms(1000);
  340.     }
  341.  
  342.   LengthAll=ee_LengthAll;
  343.  
  344.  
  345.  
  346. //  DEMO();
  347.  
  348. //  delay_ms(1500);
  349.   SetSpeed(0);
  350.   SetOdometr(LengthAll);
  351.   RefreshDisplay(1,1,1,0);  
  352.  
  353. while (1)
  354. {// delay_ms(100);    // Ждём и считаем импульсы 1 сек.  
  355.  
  356.   //  === СПИДОМЕТР и ОДОМЕТР ===    
  357.    if (Flag_Speed)
  358.     {            
  359.       Flag_Speed=0;         // Обнуляем флаг обработки скорости
  360. //    #asm("cli");    // Останавливаем прерывания для расчёта
  361. //    #asm("sei");    // Снова запускаем прерывания  
  362.     /*
  363.      Расчитываем скорость:   V = S / t                    
  364.      
  365.           количество импульсов                    
  366.       ---------------------------  * длину колеса
  367.       количество имп. на 1 оборот                  
  368.       \_________________________________________/
  369.        пройденное расстояние за дельта t (в см.)                 прошло времени (в сек.)                      км/ч
  370.     */
  371.     Speed  = ( ((CountImpuls/ImpulsInOne)*LengthCircle) / ((TMP_CNT_OVF_S*256+TMP_TCNT_S)/7813.0F) ) * 0.036F;  
  372.     SetSpeed(Speed);                            //Устанавливаем разряды для отображения
  373.     //                           S = ((S'/t)*0.036)*t                           десятичные
  374.     printf("LengthAll: %10.4f\n\r",LengthAll);
  375.     tmp_LengthAll=LengthAll+((CountImpuls/ImpulsInOne)*LengthCircle)*0.00001;            //Расчитываем новое пройденное расстояние
  376.     SetOdometr((unsigned int) (tmp_LengthAll*10));   //Устанавливаем разряды для отображения
  377.     if (tmp_LengthAll!=LengthAll)               //Проверяем нужноли записать (для экономии ресурса чтения/записи)
  378.        {ee_LengthAll=tmp_LengthAll;             //Записываем пройденное расстояние в паять
  379.         LengthAll=ee_LengthAll;                 //Проверяем и запоминаем новое пройденное расстояние
  380.        }
  381.  
  382.     //Выводим значение на экран
  383.     RefreshDisplay(1,0,1,TMP_CNT_Impuls_T);  
  384.      
  385. /*    
  386. //    sprintf(lcd_buffer,"L:%6.2f T:%6.2f",Len,Time);
  387. //    sprintf(lcd_buffer,"O:%6.3f C:%6d",tt,TMP_TCNT1);
  388.  
  389. //    sprintf(lcd_buffer,"V = %5.1f см/сек",Speed);  
  390. //    sprintf(lcd_buffer,"V = %5.1f м/мин",(Speed*0.60F);  
  391.     sprintf(lcd_buffer,"V = %5.1f км/ч",Speed*0.036F);  
  392.     lcd_gotoxy(0,0); lcd_puts(lcd_buffer);
  393.  
  394.     //sprintf(lcd_buffer,"I:%04d L:%6.2d",TMP_CNT_Impuls_S,((TMP_CNT_Impuls_S/ImpulsInOne) * LenthCircle));
  395. //    sprintf(lcd_buffer,"V = %5.1f см/сек",Speed);  
  396. //    lcd_gotoxy(0,1); lcd_puts(lcd_buffer);
  397.  
  398.     sprintf(lcd_buffer,"Всего: %06d км",(int)LengthAll);
  399.     lcd_gotoxy(0,1); lcd_puts(lcd_buffer);  
  400.  
  401.     */
  402.     }
  403.   else
  404.     { // 1 км/ч = 0,1875 Hz
  405.       if ( CNT_OVF_S > 80 )
  406.         {
  407.          SetSpeed(0);
  408.          RefreshDisplay(1,1,1,TMP_CNT_Impuls_T);
  409.         }
  410.     }
  411.  
  412.   //  === ТАХОМЕТР ===
  413.   if (TMP_CNT_Impuls_T!=OLD_CNT_Impuls_T)
  414.    {
  415.                   //A B C  DotBar
  416.      RefreshDisplay(1,1,1,TMP_CNT_Impuls_T);
  417.    
  418.      OLD_CNT_Impuls_S=TMP_CNT_Impuls_S;  
  419.      OLD_CNT_Impuls_T=TMP_CNT_Impuls_T;  
  420.    }      
  421.  
  422.   //  === КНОПКИ ===
  423.   if (~BTN2)
  424.    { delay_ms(50);          // антидребезг
  425.      DEMO();
  426.    }  
  427.    
  428.   if (~BTN1)
  429.    {delay_ms(50);
  430.     TestDisplay1();
  431.    }
  432. }
  433.    
  434. } //main
Advertisement
Add Comment
Please, Sign In to add comment