Вот предоставляю измерителька сожратого бензина на моно или инж двигатель
при включённом зажигании кнопка РЕС сбрасывает количество сожратого бензина ( обнуление )
установка коэффициента форсунки происходит при выключенном зажигании !!! нажать РЕС и кнопками + и - установить желаемое значение
исходник, может кто что добавит
/*****************************************************
Chip type : ATmega8
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <stdlib.h>
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#define ADC_VREF_TYPE 0x00
unsigned char digit;
unsigned char heat[3];
unsigned char convert[10] = {0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
#define tochka 0x80
#define segment PORTB
#define LED_digit PORTC
eeprom unsigned long int eepromPrFors; // производительность форсунки (время в мкс, за которое наливается 0,01л)/1000
unsigned long int i=0;
unsigned long int PrFors=0;
unsigned int v_bake = 0;
unsigned int v_bake1 = 0;
//unsigned int adc_data_display;
//unsigned int adc_data;
bit bylo_dlinnoe_nazatie=0;
char rezhim=1;
unsigned int key_interval;
// таймер времени
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
};
interrupt [EXT_INT0] void ext_int0_isr(void)
{
};
// Прерывание по форсунке
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if ( PIND.3 )
{
// Закрытие форсунки, считаем время открытия
MCUCR=0x0B;// разрешаем прерывание по спаду
TCCR1B=0x00; // останавливаем таймер
i=i+TCNT1; // имеем тики таймера
TCNT1=0;
if (i>PrFors)
{
i=0;
v_bake=v_bake+1;
};
}
else // Открытие форсунки
{MCUCR=0x0F; // разрешаем прерывание по нарастанию
TCCR1B=0x02;// 1 кгц // запускаем таймер
} }
//interrupt [ADC_INT] void adc_isr(void)
//{
//adc_data=ADCW;
//ADCSRA|=0x00;
//}
// =========================7-сегментный индикатор =====================================
void scanLED()
{
char i;
digit = 0x4;
for( i = 0; i < 3; i++) /* 4-DIGIT scanning */
//{
// LED_digit = ~digit; /* send complement[digit] */ //anod LED_digit = digit;
// segment = heat
; /* send complement[segment] */ //anod segment = ~heat;
// delay_ms(1); /* delay a while */
// segment = 0x00; /* off LED */ // anod segment = 0xff;
// digit>>=1; /* next digit */
//}
{
LED_digit = digit; /* send complement[digit] */ //anod LED_digit = digit;
segment = ~heat; /* send complement[segment] */ //anod segment = ~heat;
delay_ms(1); /* delay a while */
segment = 0xff; /* off LED */ // anod segment = 0xff;
digit>>=1; /* next digit */
}
}
//=======================================================================================
void main(void)
{
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x7;
PORTD=0x00;
PORTD |= (1<<5)|(1<<6)|(1<<7);// подтяжка к Vcc
DDRD=0x00;
TCCR0=0x05;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
GICR|=0xC0;
MCUCR=0x0B;
GIFR=0xC0;
TIMSK=0x01;
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: AREF pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x83;
#asm("sei")
PrFors=eepromPrFors*1000;
v_bake=0;
while (1)
{
v_bake1=v_bake/2;
//====запалення он ===================
if (PINC.4==1)
{
scanLED();
heat[2]= convert[v_bake1/1000];
heat[1]= convert[(v_bake1/100)%10]|tochka;
heat[0]= convert[(v_bake1/10)%10];
//Сброс
//if (PIND.7==0)
//{
//delay_ms(15);
//v_bake= 0;
//}
while (PIND.7==0)
{
key_interval++;
delay_ms(100);
if (key_interval>20)
{
key_interval=0;
v_bake= 0; //сбросссссссссс
bylo_dlinnoe_nazatie=1;
};
};
}
//=====запалення off ================
if (PINC.4==0)
{
//========================================================
if (rezhim==1)
{
}
//========================================================
if (rezhim==2)
{
scanLED();
heat[2]= convert[PrFors/100000];
heat[1]= convert[(PrFors/10000)%10];
heat[0]= convert[(PrFors/1000)%10];
//}
if ( PIND.6==0)
{
if (PrFors > 999999){ PrFors = 0;}
PrFors=PrFors+1000;
eepromPrFors=PrFors/1000;
delay_ms(150);
}
if ( PIND.5==0)
{
PrFors=PrFors-1000;
eepromPrFors=PrFors/1000;
delay_ms(150);
}
}
//кнопашки
if (rezhim==1)//=======================111111111111======================
{
if (PIND.7==0)
{
while (PIND.7==0)
{
key_interval++;
delay_ms(100);
if (key_interval>20)
{
key_interval=0;
rezhim=2;
bylo_dlinnoe_nazatie=1;
};
};
};
};
if (rezhim==2)//==========================222222222222=====================
{
if (PIND.7==0)
{
while (PIND.7==0)
{
key_interval++;
delay_ms(100);
if (key_interval>20)
{
key_interval=0;
rezhim=1;
bylo_dlinnoe_nazatie=1;
};
};
};
};
if (rezhim==3) {rezhim=1;};
}
};
}