📄 fourwireohemmeter.c
字号:
//ICC-AVR application builder : 12/4/2003 11:24:31 AM
// Target : 8535;
// Crystal: 6.0000Mhz
#include <math.h>
#include <macros.h>
#include <iom16v.h>
#define LCD_RS (1 << 5)
#define LCD_RW (1 << 7)
#define LCD_EN (1 << 6)
#define AD_OE (1 << 2)
#define AD_SC (1 << 3)
#define AD_HBE (1 << 4)
#define DG_A0 (1 << 0)
#define DG_A1 (1 << 1)
#define CURRENT_CH1 (1 << 0)
#define CURRENT_CH2 (1 << 1)
#define CURRENT_CH3 (1 << 2)
#define GAIN_1 (1 << 3)
#define GAIN_2 (1 << 4)
#define GAIN_3 (1 << 5)
#define GAIN_4 (1 << 2)
#define GAIN_5 (1 << 1)
#define GAIN_6 (1 << 0)
#define GAIN_7 (1 << 6)
#define GAIN_8 (1 << 7)
#define lcd_set_rs() (PORTB |= LCD_RS)
#define lcd_set_rw() (PORTB |= LCD_RW)
#define lcd_set_en() (PORTB |= LCD_EN)
#define ad_set_hbe() (PORTB |= AD_HBE)
#define ad_set_sc() (PORTB |= AD_SC)
#define ad_set_oe() (PORTB |= AD_OE)
#define dg_set_a0() (PORTB |= DG_A0)
#define dg_set_a1() (PORTB |= DG_A1)
#define gain_control_set_G1() (PORTC |= GAIN_1)
#define gain_control_set_G2() (PORTC |= GAIN_2)
#define gain_control_set_G3() (PORTC |= GAIN_3)
#define gain_control_set_G4() (PORTC |= GAIN_4)
#define gain_control_set_G5() (PORTC |= GAIN_5)
#define gain_control_set_G6() (PORTC |= GAIN_6)
#define gain_control_set_G7() (PORTD |= GAIN_7)
#define gain_control_set_G8() (PORTD |= GAIN_8)
#define set_current_ch1() (PORTC |= CURRENT_CH1)
#define set_current_ch2() (PORTC |= CURRENT_CH2)
#define set_current_ch3() (PORTC |= CURRENT_CH3)
#define lcd_clear_rs() (PORTB &= ~LCD_RS)
#define lcd_clear_rw() (PORTB &= ~LCD_RW)
#define lcd_clear_en() (PORTB &= ~LCD_EN)
#define ad_clear_hbe() (PORTB &= ~AD_HBE)
#define ad_clear_oe() (PORTB &= ~AD_OE)
#define ad_clear_sc() (PORTB &= ~AD_SC)
#define dg_clear_a0() (PORTB &= ~DG_A0)
#define dg_clear_a1() (PORTB &= ~DG_A1)
#define gain_control_clear_G1() (PORTC &= ~GAIN_1)
#define gain_control_clear_G2() (PORTC &= ~GAIN_2)
#define gain_control_clear_G3() (PORTC &= ~GAIN_3)
#define gain_control_clear_G4() (PORTC &= ~GAIN_4)
#define gain_control_clear_G5() (PORTC &= ~GAIN_5)
#define gain_control_clear_G6() (PORTC &= ~GAIN_6)
#define gain_control_clear_G7() (PORTD &= ~GAIN_7)
#define gain_control_clear_G8() (PORTD &= ~GAIN_8)
#define clear_current_ch1() (PORTC &= ~CURRENT_CH1)
#define clear_current_ch2() (PORTC &= ~CURRENT_CH2)
#define clear_current_ch3() (PORTC &= ~CURRENT_CH3)
char string1[]="*4-W-Meter(HDL)*" ; //*15*//
char string2[]="* Setting Curr *" ; //*15*//
char string3[]="ELG1:"; //*5*//
char string4[]="ELG1:"; //*5*//
char string5[]="ELG2:"; //*5*//
char string6[]="ELG2:"; //*5*//
char string7[]="Setting Up"; //*10*//
char string8[]="Cal";
char string9[]="S_T1"; //*10*//
char string10[]="S_T2";
char string11[]="@V1.7";
char number[]="0123456789"; //*10*//
char Rm_string[]="XXXXX"; //*5*//
unsigned int lower,higher;
long Vm;
char Resis[4][5]={"XXXXX","XXXXX","XXXXX","XXXXX"};
int Gain_change[4];
double Current,V,Rm;
double Gain;
int Channel;
int AutoGain;
int HardCalF;
int CalCF;
int Target;
int pre_gain[4]={10,10,10,10};
void delay_time(int count)
{ int i;
for(i=1;i<count;i++)
WDR();
}
void TransmitBit( unsigned int bit)
{
while( !(UCSRA & (1<<UDRE))){}
UDR=bit;
delay_time(5);
// Channel=bit;
}
unsigned char ReceiveBit()
{
while( !(UCSRA & (1<<RXC))){}
return UDR;
// Channel=bit;
}
void dis_lcd()
{
DDRB=0xFF;
lcd_clear_rs();
//lcd_clear_rw();
//lcd_clear_en();
lcd_clear_en();
lcd_set_rw();
}
void dis_ad679()
{
DDRB=0xFF; // Set PORTB to outport
ad_set_sc();
ad_set_hbe();
ad_set_oe();
}
double compare(double num[], int index)
{
unsigned int i,j;
double tmp;
for(i=0;i<index;i++)
{
for(j=i;j<index;j++)
{
if(num[j] < num[i])
{
tmp = num[j];
num[j]=num[i];
num[i]=tmp;
}
}
}
return ((int) index/2);
}
void ad_conv()
{
delay_time(30);
ad_set_hbe();
ad_set_sc();
ad_set_oe();
ad_clear_hbe();
ad_clear_sc();
delay_time(30);
ad_set_sc();
delay_time(3);
ad_clear_oe();
delay_time(30);
higher=PINA;
ad_set_oe();
ad_set_hbe();
ad_clear_sc();
delay_time(30);
ad_set_sc();
delay_time(3);
ad_clear_oe();
delay_time(30);
lower=PINA;
ad_set_hbe();
ad_set_sc();
ad_set_oe();
}
void check_LCD_busy()
{
DDRB=0xFF;
lcd_clear_rw();
lcd_clear_rs();
lcd_clear_en();
lcd_set_rw();
delay_time(2);
lcd_set_en();
delay_time(3);
DDRA=0x00;
delay_time(3);
while ( (PINA & 0x80) != 0 ) {} // Check the LCD BUSY bit, LCD_DB7 = 1 (LCD is Busy), LCD_DB =0 (LCD is ready for instruction)
lcd_clear_rs();
lcd_clear_en();
lcd_clear_rw();
}
void LCD_cmd(unsigned char lcd_command )
{
check_LCD_busy();
DDRA=0xFF ; //Set PORTA to outport
DDRB=0xFF ; //Set PORTB to outport
//delay_time(3000000);
delay_time(300);
lcd_clear_en();
lcd_clear_rs();
lcd_clear_rw();
PORTA = lcd_command ; // Outport the LCD Instruction
lcd_set_en();
delay_time(1);
lcd_clear_en(); // LCD_R/W'= 0 , LCD_EN=0, LCD_RS =0
}
void LCD_print_char(unsigned char a )
{
check_LCD_busy();
DDRA=0xFF ; //Set PORTA to outport
DDRB=0xFF ; //Set PORTB to outport
lcd_clear_en();
lcd_clear_rs();
lcd_clear_rw();
PORTA =a ;
delay_time(30);
lcd_set_rs();
lcd_set_en();
delay_time(1);
lcd_clear_en();
lcd_clear_rs();
delay_time(30) ;
//delay_time(3000) ;
}
void LCD_print(char string_print[])
{ int i;
i = 0;
while(string_print[i] != 0)
{
LCD_print_char(string_print[i++]);
}
}
void LCD_init()
{
check_LCD_busy();
LCD_cmd(0x38) ; // Function Set- set to 8 bits interface
LCD_cmd(0x01) ; //Display Clear
LCD_cmd(0x0c) ; // Display ON
LCD_cmd(0x06) ; // Address Counter Increment
}
void LCD_background()
{
LCD_init() ;
LCD_cmd((0x80 | 0x0C)); // Shift the Line 1 - 0EH
LCD_print(string1); // Print String 1
LCD_cmd((0x80 | 0x4C)); // Shift to Line 2 - 4EH
LCD_print(string2); // Print String 2
LCD_cmd((0x80 | 0x00)); // Shift to Line 1 - 00H
LCD_print(string4); // Print String 4
LCD_cmd((0x80 | 0x0A)); // Shift to Line 1 - 0DH
LCD_print_char(0xF4); // Print symbol of "ohm"
LCD_cmd((0x80 | 0x40)); // Shift to Line 2 - 40H
LCD_print(string6); // Print String 3
LCD_cmd((0x80 | 0x4A)); // Shift to Line 1 - 0DH
LCD_print_char(0xF4); // Print symbol of "ohm"
LCD_cmd((0x80 | 0x1D)); // Shift to Line 2 - 1BH
LCD_print(string3); // Print String 5
LCD_cmd((0x80 | 0x27)); // Shift to Line 1 - 27H
LCD_print_char(0xF4); // Print symbol of "ohm"
LCD_cmd((0x80 | 0x5D)); // Shift to Line 2 - 5AH
LCD_print(string5); // Print String 6
LCD_cmd((0x80 | 0x67)); // Shift to Line 2 - 67H
LCD_print_char(0xF4); // Print symbol of "ohm"
}
int get_info()
{
DDRC = 0xFF;
PORTC |= (1<<6);
PORTC |= (1<<7);
delay_time(2);
DDRC = 0x00;
delay_time(100);
return (PINC);
}
void set_current(int curr)
{
unsigned int current_get;
int check;
char curr1[]="*I=100uA-40~100*";
char curr2[]="*I=40uA -1k~3k *";
char curr3[]="*** I = 5uA ***";
char curr4[]="*I = 40uA (def)*";
DDRC = 0xFF;
PORTC &= (~(1<<6));
PORTC &= (~(1<<7));
switch(curr)
{
case 1:
// clear_current_ch1();
// set_current_ch2();
// set_current_ch3();
LCD_cmd((0x80 | 0x4C)); // Shift to Line 2 - 4EH
LCD_print(curr1); // Print String 2
break;
case 2:
// set_current_ch1();
// clear_current_ch2();
// set_current_ch3();
LCD_cmd((0x80 | 0x4C)); // Shift to Line 2 - 4EH
LCD_print(curr2); // Print String 2
break;
case 3:
// set_current_ch1();
// set_current_ch2();
// clear_current_ch3();
LCD_cmd((0x80 | 0x4C)); // Shift to Line 2 - 4EH
LCD_print(curr3); // Print String 2
break;
case 4:
// clear_current_ch1();
// set_current_ch2();
// clear_current_ch3();
LCD_cmd((0x80 | 0x4C)); // Shift to Line 2 - 4EH
LCD_print(curr4); // Print String 2
break;
}
}
void gain_control(int amp, int ch)
{
DDRC=0xFF;
DDRD |= (1 << DDD6);
DDRD |= (1 << DDD7);
switch(amp+ch)
{
case 11: Gain=16.6667;
gain_control_set_G1();
gain_control_set_G2();
break;
case 12: Gain=16.6667;
gain_control_set_G3();
gain_control_set_G4();
break;
case 13: Gain=16.6667;
gain_control_set_G5();
gain_control_set_G6();
break;
case 14: Gain=16.6667;
gain_control_set_G7();
gain_control_set_G8();
break;
case 101: Gain=100;
gain_control_clear_G1();
gain_control_set_G2();
break;
case 102: Gain=100;
gain_control_clear_G3();
gain_control_set_G4();
break;
case 103: Gain=100;
gain_control_clear_G5();
gain_control_set_G6();
break;
case 104: Gain=100;
gain_control_clear_G7();
gain_control_set_G8();
break;
case 1001: Gain=250;
gain_control_set_G1();
gain_control_clear_G2();
break;
case 1002: Gain=250;
gain_control_set_G3();
gain_control_clear_G4();
break;
case 1003: Gain=250;
gain_control_set_G5();
gain_control_clear_G6();
break;
case 1004: Gain=250;
gain_control_set_G7();
gain_control_clear_G8();
break;
}
}
void hard_config()
{ unsigned int config_index;
// determine the current setting
config_index = get_info();
switch((config_index & 0x03))
{
case 3: set_current(1);
Current = 0.0001;
Gain_change[0] = 60;
Gain_change[1] = 600;
HardCalF=40;
break;
case 2: set_current(2);
Current = 0.00004;
Gain_change[0] = 995;
Gain_change[1] = 2495;
Gain_change[2] = 1000;
Gain_change[3] = 2500;
HardCalF=1500;
break;
case 1: set_current(3);
Gain_change[0] = 50;
Gain_change[1] = 500;
Current = 0.000005;
break;
case 0: set_current(4);
Current = 0.00004;
Gain_change[0] = 100;
Gain_change[1] = 1000;
break;
}
AutoGain = 0;
Target = 0;
switch(((config_index & 0x3C)>>2))
{
case 0: Channel = 0;
AutoGain = 1;
CalCF=0;
break;
case 1: Channel = 1;
gain_control(10,1);
pre_gain[0]=10;
CalCF=0;
break;
case 2: Channel = 2;
gain_control(10,2);
pre_gain[1]=10;
CalCF=0;
break;
case 3: Channel = 3;
gain_control(10,3);
pre_gain[2]=10;
CalCF=0;
break;
case 4: Channel = 4;
gain_control(10,4);
pre_gain[3]=10;
CalCF=0;
break;
case 5: Channel = 1;
gain_control(100,1);
pre_gain[0]=100;
CalCF=0;
break;
case 6: Channel = 2;
gain_control(100,2);
pre_gain[1]=100;
CalCF=0;
break;
case 7: Channel = 3;
gain_control(100,3);
pre_gain[2]=100;
CalCF=0;
break;
case 8: Channel = 4;
gain_control(100,4);
pre_gain[3]=100;
CalCF=0;
break;
case 9: Channel = 1;
gain_control(1000,1);
pre_gain[0]=1000;
CalCF=0;
break;
case 10: Channel = 2;
gain_control(1000,2);
pre_gain[1]=1000;
CalCF=0;
break;
case 11: Channel = 3;
gain_control(1000,3);
pre_gain[2]=1000;
CalCF=0;
break;
case 12: Channel = 4;
gain_control(1000,4);
pre_gain[3]=1000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -