unsigned short freq=0; i[10]; i2[10]; //переменная частоты, вольтаж и 2 массива для хранения результатов
int t=0, j=0, t1=0, sum=0, avg_i=0, avg_i2=0, t2=0, i3, i1=0, j1=6,c3=0; // t и t1-для прохода по массиву, h-заглушка
bit timer; // переключаемся между счетчиками
float volt=0;
unsigned int bak[40],c2=0, sobr_znachenie=0;
unsigned short v2,k1,k,ml_bait=0, st_bait=0,a=105;
/* Start Функция отображения кубиков процесса тарировки датчика*/
const unsigned short polosa1[]={0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}; // Code for char num #0
const unsigned short polosa2[]={0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}; // Code for char num #1
const unsigned short polosa3[]={0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c}; // Code for char num #2
const unsigned short polosa4[]={0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e}; // Code for char num #3
const unsigned short polosa5[]={0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f}; // Code for char num #4
const unsigned short strela_right[]={0x08, 0x0C, 0x06, 0x1F, 0x1F, 0x06, 0x0C, 0x08}; // Code for char num #3
const unsigned short strela_left[]={0x02, 0x06, 0x0C, 0x1F, 0x1F, 0x0C, 0x06, 0x02}; // Code for char num #3
// Lcd module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End Lcd module connections
char txt1[13], txt7[4], txt8[4];
char txt2[13];
char txt3[6], sobr_znachenie_txt[7];
char txt4[13];
char txt5[]="V_bat=";
char txt6[]="C2=";
void load_char() // Функция отображения процесс-бара тарировки
{
int i4;
LCD_Cmd(64);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(polosa1[i4]);
LCD_Cmd(72);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(polosa2[i4]);
LCD_Cmd(80);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(polosa3[i4]);
LCD_Cmd(88);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(polosa4[i4]);
LCD_Cmd(96);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(polosa5[i4]);
LCD_Cmd(104);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(strela_right[i4]);
LCD_Cmd(112);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(strela_left[i4]);
}
void Zapis_eeprom_tarirovka(unsigned short k){ // Функция записи данных в ипром
/*пересылаем данные в ипром старт */
st_bait=c2››8;
ml_bait=c2;
I2C1_Init(100000); //инициалицация шины для работы с ипром
I2C1_Start();
I2C1_Wr(0xA2);
I2C1_Wr(2*k+2);
I2C1_Wr(ml_bait);
I2C1_Stop(); // Выдать комбинацию STOP
Delay_ms(100);
I2C1_Start();
I2C1_Wr(0xA2);
I2C1_Wr(2*k+3);
I2C1_Wr(st_bait);
I2C1_Stop(); // Выдать комбинацию STOP
Delay_ms(100);
I2C1_Start();
I2C1_Wr(0xA2);
I2C1_Wr(2*k+2);
I2C1_Repeated_Start();
I2C1_Wr(0xA3);
ml_bait=I2C1_Rd(0u);
I2C1_Stop();
Delay_ms(200);
I2C1_Start();
I2C1_Wr(0xA2);
I2C1_Wr(2*k+3);
I2C1_Repeated_Start();
I2C1_Wr(0xA3);
st_bait=I2C1_Rd(0u);
I2C1_Stop();
sobr_znachenie=(st_bait‹‹8)+ml_bait;
IntToStr(sobr_znachenie,sobr_znachenie_txt);
Lcd_Out(1,10,sobr_znachenie_txt);
Delay_ms(2000);
Lcd_Out(1,10,"rabotaet");
Delay_ms(2000);
Lcd_Out(1,10," ");
}
/* Stop Функция отображения кубиков процесса тарировки датчика*/
void InitTimer2(){ //функция таймера
T2CON=0x4E;
PR2=250;
TMR2IE_bit=1;
//INTCON=0xc0;
//INTCON=0xC0;
}
void delay2S(){ // 2 seconds delay function
Delay_ms(1000);
}
void interrupt(){ // обработка прерывания
if (TMR2IF_bit){ // проверка бита переполнения таймера
TMR2IF_bit = 0;
if (t1›0){ // обработка только на каждое второе прерывание
TMR2ON_bit=0;
T1CON.B0=0; // stop счетчика по внешнему тактируемому сигналу
freq=((TMR1H‹‹8)+TMR1L); //заносим показания насчитанные счетчиком
if (t‹10){
i[t]=freq; // массивы данных из которых будем формировать среднее
i2[t]=TMR0; // массивы данных из которых будем формировать среднее
t++;
sum=0;
for (t2=0;t2‹10;t2++){
sum=sum+i[t2];
}
avg_i=sum/10; // первое среднее значение
sum=0;
t2=0;
for (t2=0;t2‹10;t2++){
sum=sum+i2[t2];
}
avg_i2=sum/10; // второе среднее значение
sum=0;
}
else {
t=0;
}
freq=0; // зануляем переменные для нового счета
TMR1L=0;
TMR1H=0;
TMR2IF_bit = 0;
T1CON.B0=1; // старт счетчика по внешнему тактируемому сигналу
TMR0=0;
TMR2ON_bit=1;
t1=0;
}
else{t1++;}
}
}
void main() {
TRISC.RC1=1; // RC1- настраиваем как вход
PORTC.RC1=0; // Значение на входе 0
PORTC.RC2=0; // Значение на входе 0
TMR1L=0;
TMR1H=0;
ADRESL=0;
/*START работа модуля АЦП измеряем напряжение*/
ADCON1=0b00000100; //RA3,1,0 - аналоговые входы
ADCON0=0b11011001; // конфигурируем под RA3
/*STOP работа модуля АЦП измеряем напряжение*/
Lcd_Init(); // Initialize Lcd
LCD_Cmd(_LCD_RETURN_HOME);
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Load_char();
//
T1CON=0b00010111; // старт счетчика по внешнему тактируемому сигналу
InitTimer2();
TMR0=0;
OPTION_REG=0b00100000;
TRISB = 0; // Configure PORTB pins as digital
//
delay_ms(2000);
while(1){
TMR2IE_bit=0;
T2CON=0x74;
PR2=250;
//INTCON=0x00;
Lcd_Init(); // Initialize Lcd
LCD_Cmd(_LCD_RETURN_HOME);
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
//ADCON0=0b11011101; // бит старта преобразования
//Delay_ms(100);
//volt=((ADRESH‹‹8)+ADRESL)/13240.7; //заносим показания насчитанные счетчиком
//ADCON0=0b11011001; // конфигурируем под RA3
Delay_ms(1000);
c2=(avg_i2*50.4)/avg_i; // c2 - емкость эталонного конденсатора = 50,4 pf
IntToStr(avg_i2,txt1); //выводим первое среднее значение
Lcd_Out(1,1,txt1);
IntToStr(avg_i,txt2);// выводим второе среднее значение
Lcd_Out(1,10,txt2);
Delay_ms(2000);
IntToStr(c2,txt3);
Lcd_Out(2,1,txt3);
Lcd_Out(2,1,txt6);
Delay_ms(200);
// пробуем тарировку сюды поставить
if(portc.rc1==1){ // Нажали кнопку, начали процесс тарировки бака.
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF);
LCD_out(1,2,"Tarirovka baka");
LCD_out(2,1,"1of2");
LCD_chr(2,5,5);
LCD_chr(2,16,6);
Delay_ms(3000);
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF);
for(k=0;k‹99;k++){ // основной цикл тарировки по шагам 1
k1=((1+k)*2)/10;
v2=((1+k)*2)%10;
byteToStr(v2,txt8);
byteToStr(k1,txt7);
LCD_out(1,3,txt8);
LCD_out(1,1,txt7);
LCD_out(1,4,".");
LCD_out(1,7,"Lt=");
LCD_out(2,1,"1of2");
LCD_chr(2,5,5);
LCD_chr(2,16,6);
LCD_out(1,12," ");
a:
Delay_ms(1000);
if (portc.rc5==1){
c2=(avg_i2*50.4*100)/avg_i; // c2 - емкость эталонного конденсатора = 50,4 pf *100 для получения нужной точности датчика.
//пишем данные тарировки в ипром
Zapis_eeprom_tarirovka(k);
LCD_chr(2,j1,i1);
i1++;
if (i1›4) {
i1=0;
j1++;}
if(j1›15){
j1=6;
i1=0;
LCD_out(2,1,"2of2");
}
}
if (portc.rc5==0) {goto a;}
Delay_ms(1000);
}
}
/*Стартуем счетчик снова*/
freq=0; // зануляем переменные для нового счета
TMR1L=0;
TMR1H=0;
TMR2IF_bit = 0;
T1CON.B0=1; // старт счетчика по внешнему тактируемому сигналу
TMR0=0;
TMR2ON_bit=1;
t1=0;
/*Стартуем счетчик снова*/
T2CON=0x4E;
PR2=250;
TMR2IE_bit=1;
//INTCON=0xC0;
Delay_ms(2000);
}
} |