📄 fourwireohemmeter.c
字号:
CalCF=0;
break;
case 13: Channel = 5; // Only for initial Meter, channel 1 & channel 3 is read,
AutoGain = 1;
Target =1 ; // Target resistance = inital resistance * 80 / 2.05
CalCF=0;
break;
case 14: Channel = 6;
AutoGain = 1;
CalCF=0;
break;
case 15: Channel = 0;
AutoGain = 1;
CalCF=0;
break;
default: Channel = 0;
AutoGain = 1;
CalCF=0;
break;
}
}
void dec_to_char(double dec, char chr[])
{ int i,zero,demcial;
long long_dec;
char temp1[]=" ";
char temp2[]="-----";
char temp3[]=".";
if(dec >= 0)
{
if(dec >= 10000 && dec < 100000)
{
zero =0;
demcial=0;
}
else if(dec >= 1000 && dec < 10000)
{
zero =1;
demcial=0;
}
else if(dec >= 100 && dec < 1000)
{
zero =2;
demcial=0;
}
else if(dec >= 10 && dec < 100)
{
zero =0;
demcial=2;
}
else if(dec >= 5 && dec < 11)
{
zero =0;
demcial=2;
}
else if(dec >= 0 && dec < 5)
{
zero =0;
demcial=3;
}
if(demcial == 0)
{ long_dec = (long) dec;
for(i=4;i>0;i--)
{
chr[i]= number[long_dec%10];
long_dec-=(long_dec%10);
long_dec =long_dec/10;
}
chr[0]= number[long_dec];
for(i=0;i<zero;i++)
{
chr[i]=temp1[0];
}
}
else if(demcial == 2)
{
long_dec = dec*100;
for(i=4;i>2;i--)
{
chr[i]= number[long_dec%10];
long_dec-=(long_dec%10);
long_dec =long_dec/10;
}
chr[2]= temp3[0];
for(i=1;i>0;i--)
{
chr[i]= number[long_dec%10];
long_dec-=(long_dec%10);
long_dec =long_dec/10;
}
chr[0]= number[long_dec];
for(i=0;i<zero;i++)
{
chr[i]=temp1[0];
}
}
else if(demcial == 3)
{
long_dec = dec*1000;
for(i=4;i>1;i--)
{
chr[i]= number[long_dec%10];
long_dec-=(long_dec%10);
long_dec =long_dec/10;
}
chr[1]= temp3[0];
chr[0]= number[long_dec];
for(i=0;i<zero;i++)
{
chr[i]=temp1[0];
}
}
}
else
{
for(i=0;i<5;i++)
{
chr[i]= temp2[i];
}
}
}
void set_channel(int ch_num)
{
DDRB=0xFF;
dg_clear_a0();
dg_clear_a1();
switch(ch_num)
{
case 1: dg_clear_a0();
dg_set_a1();
break;
case 2: dg_set_a0();
dg_set_a1();
break;
case 3: dg_set_a0();
dg_clear_a1();
break;
case 4: dg_clear_a0();
dg_clear_a1();
break;
default: dg_clear_a0();
dg_clear_a1();
break;
}
delay_time(5);
}
void resis_cal()
{ long temp;
temp=0;
Vm = 0;
temp = (higher << 8);
temp |= lower;
Vm = (temp>>2) ;
V = (Vm*0.00061045)/Gain ;
Rm = V/Current;
}
double measure(int ch, int gain)
{ double R[30]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int i;
int index;
int tmp;
dis_lcd();
delay_time(2);
set_channel(ch);
delay_time(10);
gain_control(gain,ch);
delay_time(5);
PORTA=0x00;
DDRA=0x00;
//DDRB=0xFF;
delay_time(15);
for(i=0;i<30;i++)
{
higher =0x00;
lower=0x00;
ad_conv();
resis_cal();
R[i]=Rm;
delay_time(1);
}
dis_ad679();
index = compare(R,30);
return (R[index-13]+R[index-12]+R[index-11]+R[index-10]+R[index-9]+R[index-8]+R[index-7]+R[index-6]+R[index-5]+R[index-4]+R[index-3]+R[index-2]+R[index-1]+R[index]+R[index+1]+R[index+2]+R[index+3]+R[index+4]+R[index+5]+R[index+6]+R[index+7]+R[index+8]+R[index+9]+R[index+10]+R[index+11]+R[index+12]+R[index+13])/27;
}
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x86;
UBRRL = 0x0C; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x18;
}
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
uart0_init();
MCUCR = 0x0A;
GICR = 0xC0;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
char index[]="abcd";
int i,j;
DDRD |= (1 << DDD4);
PORTD |= (1 << DDD4);
delay_time(5);
PORTD &= ~(1 << DDD4);
delay_time(5);
for(i=0;i<4;i++)
{
TransmitBit(index[i]);
for(j=0;j<5;j++)
{
TransmitBit(Resis[i][j]);
}
}
}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
int i;
DDRD |= (1 << DDD5);
PORTD |= ( 1 << DDD5);
delay_time(3);
PORTD &= ~(1 << DDD5);
switch(ReceiveBit())
{
case 0x21:
DDRD |= (1 << DDD4);
PORTD |= (1 << DDD4);
delay_time(5);
PORTD &= ~(1 << DDD4);
delay_time(5);
for(i=0;i<5;i++)
{
TransmitBit(string11[i]);
}
//Channel =1;
break;
}
}
void main(void)
{ unsigned int a;
double R;
double CalR[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
double CalF[4]={1,1,1,1};
int ch,i,j,k;
int cal_ind;
LCD_background();
hard_config();
if(Target == 1)
{
LCD_cmd((0x80 | 0x00)); // Shift to Line 1 - 00H
LCD_print(string4); // Print String 4
LCD_cmd((0x80 | 0x40)); // Shift to Line 2 - 40H
LCD_print(string9); // Print String 3
LCD_cmd((0x80 | 0x1D)); // Shift to Line 2 - 1BH
LCD_print(string6); // Print String 5
LCD_cmd((0x80 | 0x5D)); // Shift to Line 2 - 5AH
LCD_print(string10); // Print String 6
}
switch (Channel)
{
case 0: ch= 1;j=0;break;
case 1: ch= 1;j=0;break;
case 2: ch= 2;j=0;break;
case 3: ch= 3;j=0;break;
case 4: ch= 4;j=0;break;
case 5: ch= 1;j=0;break;
case 6: ch= 2;j=1;break;
}
DDRC = 0xFF;
if( CalCF == 1)
{
LCD_cmd((0x80 | 0x05));
delay_time(10);
LCD_print(string8);
LCD_cmd((0x80 | 0x22));
delay_time(10);
LCD_print(string8);
LCD_cmd((0x80 | 0x45));
delay_time(10);
LCD_print(string8);
LCD_cmd((0x80 | 0x62));
LCD_print(string8);
while(j<4)
{
for(i=0;i<60;i++)
{
delay_time(1000000);
}
if(HardCalF == 40)
{
for(i=0;i<100;i++)
{
measure(j+1,1000);
}
for(i=0;i<20;i++)
{
CalR[i]=measure(j+1,1000);
}
cal_ind=compare(CalR,20);
}
else if(HardCalF == 1500)
{
for(i=0;i<100;i++)
{
measure(j+1,100);
}
for(i=0;i<20;i++)
{
CalR[i]=measure(j+1,100);
}
cal_ind=compare(CalR,20);
}
R = CalR[cal_ind];
CalF[j] = R /HardCalF;
dec_to_char(R,Rm_string);
if(Channel ==5 | Channel == 6)
{
j=j+2;
}
else
{
j++;
}
}
}
for(i=0;i<100;i++)
{
delay_time(10000000);
}
// enable watch dog
WDR();
WDTCR=0x0E;
//Loop - reading
while(1)
{
WDR();
R = measure(ch,pre_gain[ch-1])/CalF[ch-1];
if (AutoGain == 1)
{
if (R < Gain_change[0] && pre_gain[ch-1] !=1000)
{
R = measure(ch,1000)/CalF[ch-1];
pre_gain[ch-1] = 1000;
}
else if (R < Gain_change[1] && R >=Gain_change[2] && pre_gain[ch-1] != 100)
{
R = measure(ch,100)/CalF[ch-1];
pre_gain[ch-1] = 100;
}
else if( R >= Gain_change[3] && pre_gain[ch-1] !=10)
{
R = measure(ch,10)/CalF[ch-1];
pre_gain[ch-1] = 10;
}
}
dec_to_char(R,Rm_string);
for( i =0;i<5;i++)
{
Resis[ch-1][i] =Rm_string[i];
}
switch(ch)
{
case 1: if(Channel ==1)
{
LCD_cmd((0x80 | 0x05)); // Shift to Line 1 - 00H
LCD_print(Rm_string); // Print String 4
ch=1;
}
else if(Channel ==5)
{
LCD_cmd((0x80 | 0x05)); // Shift to Line 1 - 00H
LCD_print(Rm_string); // Print String 4
if(Target == 1)
{
if((R*80/2.05) > 9999)
{
dec_to_char(-1,Rm_string);
}
else
{
dec_to_char((R*80/2.05),Rm_string);
}
LCD_cmd((0x80 | 0x45)); // Shift to Line 1 - 00H
LCD_print(Rm_string);
}
ch=3;
}
else
{
LCD_cmd((0x80 | 0x05)); // Shift to Line 1 - 00H
LCD_print(Rm_string); // Print String 4
ch++;
}
break;
case 2: LCD_cmd((0x80 | 0x22)); // Shift to Line 1 - 00H
LCD_print(Rm_string); // Print String 4
if(Channel ==2)
{
ch=2;
}
else if(Channel ==6)
{
ch=4;
}
else
{
ch++;
}
break;
case 3: if(Channel ==3)
{
LCD_cmd((0x80 | 0x45)); // Shift to Line 1 - 00H
//delay_time(10);
LCD_print(Rm_string); // Print String 4
ch=3;
}
else if(Channel ==5)
{
LCD_cmd((0x80 | 0x22)); // Shift to Line 1 - 00H
//delay_time(10);
LCD_print(Rm_string); // Print String 4
if(Target == 1)
{
if((R*80/2.05) > 9999)
{
dec_to_char(-1,Rm_string);
}
else
{
dec_to_char((R*80/2.05),Rm_string);
}
LCD_cmd((0x80 | 0x62)); // Shift to Line 1 - 00H
LCD_print(Rm_string);
}
ch=1;
}
else
{
LCD_cmd((0x80 | 0x45)); // Shift to Line 1 - 00H
LCD_print(Rm_string); // Print String 4
ch++;
}
break;
case 4: LCD_cmd((0x80 | 0x62)); // Shift to Line 1 - 00H
LCD_print(Rm_string); // Print String 4
if(Channel ==4)
{
ch=4;
}
else if(Channel ==6)
{
ch=2;
}
else
{
ch=1;
}
break;
}
//Transmit Data
init_devices();
delay_time(300);
CLI();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -