Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Подход измерения:
- после первого импульса засекается время до следующего импульса
- после чего производится расчёт скорости.
- */
- #include <mega8.h>
- #include <delay.h>
- #include <stdio.h>
- #include <string.h> // работа со строками
- #include <my_usart.c>
- #include "Variables.c" // Переменные и константы
- interrupt [EXT_INT0] void ext_int0_isr(void)
- {// External Interrupt 0 service routine SPEEDOMETR
- // Принцип измерения: Измеряем время между импульсами.
- CNT_Impuls_S++;
- if (CNT_Impuls_S>=CountImpuls) // меряем время CountImpuls импульсов
- {
- TMP_TCNT_S=TCNT0; // запоминаем для дальнейшей обработки
- TMP_CNT_OVF_S=CNT_OVF_S;
- CNT_OVF_S=0; // обнуляем счётчики
- TCNT0=0;
- CNT_Impuls_S=0; // Обнуляем счётчик имульсов
- Flag_Speed=1; // Выставляем признак обработки скорости
- }
- }
- interrupt [EXT_INT1] void ext_int1_isr(void)
- {// External Interrupt 1 service routine TAXOMETR
- CNT_Impuls_T++;
- }
- interrupt [TIM0_OVF] void timer0_ovf_isr(void)
- {
- // Clock value: 7,813 kHz
- CNT_OVF_S++; // подсчитываем количество переполнений
- }
- interrupt [TIM1_OVF] void timer1_ovf_isr(void)
- {
- // Reinitialize Timer1 value
- TCNT1H=0xE17A >> 8; //1 раз в сек
- TCNT1L=0xE17A & 0xff;
- //TCNT1H=0xF0BC >> 8; //2 раза в сек
- //TCNT1L=0xF0BC & 0xff;
- // Timer/Counter 1 initialization
- // Clock value: 7,813 kHz
- TMP_CNT_Impuls_T=CNT_Impuls_T; // запоминаем для дальнейшей обработки
- CNT_Impuls_T=0; // обнуляем счетчик импульсов тахометра
- //теоретически значение CNT_Impuls_T не может быть больше 100
- }
- void SetSpeed(int _Speed)
- { // Установить СКОРОСТЬ - разряды [7-9]
- Digits[6]=NumbersCA[(_Speed/100)%10];
- Digits[7]=NumbersCA[(_Speed/10)%10];
- Digits[8]=NumbersCA[(_Speed%10)];
- };
- void SetOdometr(unsigned int _Length)
- { // Установить КИЛОМЕТРАЖ - разряды [1-6]
- /*long D0,D1,D2,D3,D4,D5;
- long int X;
- X=_Length;
- D0=(X/100000)%10;
- D1=(X/10000)%10;
- D2=(X/1000)%10;
- D3=(X/100)%10;
- D4=(X/10)%10;
- D5=(X%10); */
- Digits[0]=NumbersCA[(_Length/100000)%10];
- Digits[1]=NumbersCA[(_Length/10000)%10];
- Digits[2]=NumbersCA[(_Length/1000)%10];
- Digits[3]=NumbersCA[(_Length/100)%10];
- Digits[4]=NumbersCA[(_Length/10)%10]&DP;// и точку
- Digits[5]=NumbersCA[(_Length%10)]; // десятые
- };
- void SetAdvLED(char A, char B, char C)
- { PORT_SH=0;
- if (A) PORT_DS=1; else PORT_DS=0; // установить значение
- PORT_SH=1; delay_ms(5); //записать в порт / сдвинуть
- PORT_SH=0;
- if (B) PORT_DS=1; else PORT_DS=0; // установить значение
- PORT_SH=1; delay_ms(5); //записать в порт / сдвинуть
- PORT_SH=0;
- if (C) PORT_DS=1; else PORT_DS=0; // установить значение
- PORT_SH=1; delay_ms(5); //записать в порт / сдвинуть
- }
- void SetDotBar(char level)
- {volatile int i;
- for (i=60; i>=0; i--)
- { PORT_SH=0;
- if (i<level) PORT_DS=0; // установить значение
- else PORT_DS=1;
- PORT_SH=1; //записать в порт / сдвинуть
- }
- };
- void ShowNumbers()
- {int i;
- for (i=8;i>=0;i--)
- { // установить значение записать в порт / сдвинуть
- PORT_SH=0; PORT_DS=(Digits[i]& 0b10000000)>>7; PORT_SH=1;
- PORT_SH=0; PORT_DS=(Digits[i]& 0b01000000)>>6; PORT_SH=1;
- PORT_SH=0; PORT_DS=(Digits[i]& 0b00100000)>>5; PORT_SH=1;
- PORT_SH=0; PORT_DS=(Digits[i]& 0b00010000)>>4; PORT_SH=1;
- PORT_SH=0; PORT_DS=(Digits[i]& 0b00001000)>>3; PORT_SH=1;
- PORT_SH=0; PORT_DS=(Digits[i]& 0b00000100)>>2; PORT_SH=1;
- PORT_SH=0; PORT_DS=(Digits[i]& 0b00000010)>>1; PORT_SH=1;
- PORT_SH=0; PORT_DS=(Digits[i]& 0b00000001)>>0; PORT_SH=1;
- }
- };
- void RefreshDisplay(char A, char B, char C, char DB)
- {
- PORT_ST=0; //Prepare
- ShowNumbers(); //Speed and Odometr
- SetAdvLED(A,B,C);//Advenced LED status
- SetDotBar(DB); //Tahometr
- PORT_ST=1; //Показать всё
- }
- void DEMO(void)
- {volatile int i;
- Digits[0]=NumbersCA[11]; // H
- Digits[1]=NumbersCA[22]; // E
- Digits[2]=NumbersCA[26]; // L
- Digits[3]=NumbersCA[26]; // L
- Digits[4]=NumbersCA[ 0]; // O
- Digits[5]=NumbersCA[18]; //
- Digits[6]=NumbersCA[13]; // P
- Digits[7]=NumbersCA[01]; // I
- Digits[8]=NumbersCA[22]; // E
- RefreshDisplay(0,1,0,0);
- delay_ms(1000);
- for (i=0; i<=61; i++)
- {
- RefreshDisplay(1,0,1,i); //Show
- delay_ms(20);
- switch (i){
- case 0: {
- Digits[2]=NumbersCA[17];
- Digits[3]=NumbersCA[17];
- break;
- }
- case 15:{
- Digits[1]=NumbersCA[17];
- Digits[2]=NumbersCA[17];
- Digits[3]=NumbersCA[17];
- Digits[4]=NumbersCA[17];
- break;
- }
- case 30:{
- Digits[0]=NumbersCA[17];
- Digits[1]=NumbersCA[17];
- Digits[2]=NumbersCA[17];
- Digits[3]=NumbersCA[17];
- Digits[4]=NumbersCA[17];
- Digits[5]=NumbersCA[17];
- break;
- }
- case 45:{
- Digits[0]=NumbersCA[17];
- Digits[1]=NumbersCA[17];
- Digits[2]=NumbersCA[28];
- Digits[3]=NumbersCA[29];
- Digits[4]=NumbersCA[17];
- Digits[5]=NumbersCA[17];
- break;
- }
- case 60:{
- Digits[0]=NumbersCA[17];
- Digits[1]=NumbersCA[28];
- Digits[2]=NumbersCA[30];
- Digits[3]=NumbersCA[30];
- Digits[4]=NumbersCA[29];
- Digits[5]=NumbersCA[17];
- break;
- }
- }
- }
- delay_ms(30);
- for (i=61; i>=0; i--)
- {
- RefreshDisplay(0,1,0,i); //Show
- delay_ms(20);
- switch (i){
- case 60:{
- Digits[0]=NumbersCA[28];
- Digits[1]=NumbersCA[30];
- Digits[2]=NumbersCA[30];
- Digits[3]=NumbersCA[30];
- Digits[4]=NumbersCA[30];
- Digits[5]=NumbersCA[29];
- break;
- }
- case 45:{
- Digits[0]=NumbersCA[30];
- Digits[1]=NumbersCA[30];
- Digits[2]=NumbersCA[17];
- Digits[3]=NumbersCA[17];
- Digits[4]=NumbersCA[30];
- Digits[5]=NumbersCA[30];
- Digits[6]=NumbersCA[17]; // P
- Digits[7]=NumbersCA[17]; // I
- Digits[8]=NumbersCA[17]; // E
- break;
- }
- case 30:{
- Digits[0]=NumbersCA[30];
- Digits[1]=NumbersCA[17];
- Digits[2]=NumbersCA[18];
- Digits[3]=NumbersCA[18];
- Digits[4]=NumbersCA[17];
- Digits[5]=NumbersCA[30];
- Digits[6]=NumbersCA[28]; // P
- Digits[7]=NumbersCA[30]; // I
- Digits[8]=NumbersCA[29]; // E
- break;
- }
- case 15:{
- Digits[0]=NumbersCA[17];
- Digits[1]=NumbersCA[18];
- Digits[2]=NumbersCA[18];
- Digits[3]=NumbersCA[18];
- Digits[4]=NumbersCA[18];
- Digits[5]=NumbersCA[17];
- Digits[6]=NumbersCA[17]; // P
- Digits[7]=NumbersCA[17]; // I
- Digits[8]=NumbersCA[17]; // E
- break;
- }
- case 0:{
- Digits[0]=NumbersCA[18];
- Digits[1]=NumbersCA[18];
- Digits[2]=NumbersCA[18];
- Digits[3]=NumbersCA[18];
- Digits[4]=NumbersCA[18];
- Digits[5]=NumbersCA[18];
- Digits[6]=NumbersCA[18]; // P
- Digits[7]=NumbersCA[18]; // I
- Digits[8]=NumbersCA[18]; // E
- break;
- }
- }
- }
- // BEPC. 1.0
- Digits[0]=NumbersCA[ 8];
- Digits[1]=NumbersCA[22];
- Digits[2]=NumbersCA[13];
- Digits[3]=NumbersCA[14]&DP;// и точку
- Digits[4]=NumbersCA[01]&DP;// и точку
- Digits[5]=NumbersCA[00];
- Digits[6]=NumbersCA[17]; // P
- Digits[7]=NumbersCA[17]; // I
- Digits[8]=NumbersCA[17]; // E
- RefreshDisplay(0,1,0,0); //Show
- };
- void TestDisplay1(void)
- {char i;
- for (i=0; i<=136; i++)
- {
- PORT_ST=0; //Prepare
- PORT_SH=0;
- PORT_DS=1;
- PORT_SH=1;
- PORT_ST=1; //Показать всё
- delay_ms(200);
- }
- delay_ms(2000);
- for (i=0; i<=136; i++)
- {
- PORT_ST=0; //Prepare
- PORT_SH=0;
- PORT_DS=0;
- PORT_SH=1;
- PORT_ST=1; //Показать всё
- delay_ms(200);
- }
- }
- void main(void)
- {
- #include "Chip_Setting.c" // инициализация МК
- USART_Init(); // Инициализация СОМ порта
- printf("Begin\n\r");
- Digits[0]=NumbersCA[11]; // H
- Digits[1]=NumbersCA[22]; // E
- Digits[2]=NumbersCA[26]; // L
- Digits[3]=NumbersCA[26]; // L
- Digits[4]=NumbersCA[ 0]; // O
- Digits[5]=NumbersCA[18]; //
- Digits[6]=NumbersCA[13]; // P
- Digits[7]=NumbersCA[01]; // I
- Digits[8]=NumbersCA[22]; // E
- RefreshDisplay(0,1,0,0);
- // delay_ms(1000);
- // Обнулить значение счётчика, если при включении нажата кнопка Х
- if (~BTN1 && ~BTN3)
- {
- ee_LengthAll=0;
- Digits[0]=NumbersCA[17]; // -
- Digits[1]=NumbersCA[24]; // n
- Digits[2]=NumbersCA[31]; // U
- Digits[3]=NumbersCA[26]; // L
- Digits[4]=NumbersCA[26]; // L
- Digits[5]=NumbersCA[17]; // -
- Digits[6]=NumbersCA[ 0]; // 0
- Digits[7]=NumbersCA[21]&DP;// d
- Digits[8]=NumbersCA[18]; //
- RefreshDisplay(0,0,0,0);
- delay_ms(1000);
- }
- LengthAll=ee_LengthAll;
- // DEMO();
- // delay_ms(1500);
- SetSpeed(0);
- SetOdometr(LengthAll);
- RefreshDisplay(1,1,1,0);
- while (1)
- {// delay_ms(100); // Ждём и считаем импульсы 1 сек.
- // === СПИДОМЕТР и ОДОМЕТР ===
- if (Flag_Speed)
- {
- Flag_Speed=0; // Обнуляем флаг обработки скорости
- // #asm("cli"); // Останавливаем прерывания для расчёта
- // #asm("sei"); // Снова запускаем прерывания
- /*
- Расчитываем скорость: V = S / t
- количество импульсов
- --------------------------- * длину колеса
- количество имп. на 1 оборот
- \_________________________________________/
- пройденное расстояние за дельта t (в см.) прошло времени (в сек.) км/ч
- */
- Speed = ( ((CountImpuls/ImpulsInOne)*LengthCircle) / ((TMP_CNT_OVF_S*256+TMP_TCNT_S)/7813.0F) ) * 0.036F;
- SetSpeed(Speed); //Устанавливаем разряды для отображения
- // S = ((S'/t)*0.036)*t десятичные
- printf("LengthAll: %10.4f\n\r",LengthAll);
- tmp_LengthAll=LengthAll+((CountImpuls/ImpulsInOne)*LengthCircle)*0.00001; //Расчитываем новое пройденное расстояние
- SetOdometr((unsigned int) (tmp_LengthAll*10)); //Устанавливаем разряды для отображения
- if (tmp_LengthAll!=LengthAll) //Проверяем нужноли записать (для экономии ресурса чтения/записи)
- {ee_LengthAll=tmp_LengthAll; //Записываем пройденное расстояние в паять
- LengthAll=ee_LengthAll; //Проверяем и запоминаем новое пройденное расстояние
- }
- //Выводим значение на экран
- RefreshDisplay(1,0,1,TMP_CNT_Impuls_T);
- /*
- // sprintf(lcd_buffer,"L:%6.2f T:%6.2f",Len,Time);
- // sprintf(lcd_buffer,"O:%6.3f C:%6d",tt,TMP_TCNT1);
- // sprintf(lcd_buffer,"V = %5.1f см/сек",Speed);
- // sprintf(lcd_buffer,"V = %5.1f м/мин",(Speed*0.60F);
- sprintf(lcd_buffer,"V = %5.1f км/ч",Speed*0.036F);
- lcd_gotoxy(0,0); lcd_puts(lcd_buffer);
- //sprintf(lcd_buffer,"I:%04d L:%6.2d",TMP_CNT_Impuls_S,((TMP_CNT_Impuls_S/ImpulsInOne) * LenthCircle));
- // sprintf(lcd_buffer,"V = %5.1f см/сек",Speed);
- // lcd_gotoxy(0,1); lcd_puts(lcd_buffer);
- sprintf(lcd_buffer,"Всего: %06d км",(int)LengthAll);
- lcd_gotoxy(0,1); lcd_puts(lcd_buffer);
- */
- }
- else
- { // 1 км/ч = 0,1875 Hz
- if ( CNT_OVF_S > 80 )
- {
- SetSpeed(0);
- RefreshDisplay(1,1,1,TMP_CNT_Impuls_T);
- }
- }
- // === ТАХОМЕТР ===
- if (TMP_CNT_Impuls_T!=OLD_CNT_Impuls_T)
- {
- //A B C DotBar
- RefreshDisplay(1,1,1,TMP_CNT_Impuls_T);
- OLD_CNT_Impuls_S=TMP_CNT_Impuls_S;
- OLD_CNT_Impuls_T=TMP_CNT_Impuls_T;
- }
- // === КНОПКИ ===
- if (~BTN2)
- { delay_ms(50); // антидребезг
- DEMO();
- }
- if (~BTN1)
- {delay_ms(50);
- TestDisplay1();
- }
- }
- } //main
Advertisement
Add Comment
Please, Sign In to add comment