T
treez
Guest
Please check this microchip XC8 C code?...
Code:
// * File: 3 CHANNEL LED CONTROL SOFTWARE
//Clear is not implemented, the reasons for it is unknown.
//;WE ARE TRUNCATING THE ADC REGISTER SO JUST USE UPPER 8 BITS
//This code assumes LED MCPCB thermistors with B=3970 and 10K @ 25degC
//Makes sure the current level is never changed more than about 4 times
//per second.
//Does not go below 0.6A in current
//if a led driver is enabled, and turned on (external mode), but there is no
//current flowing approx 2 seconds after being turned on, then you go into
//fault mode, and can only get out of it by...........
//1..Turning equipment off then on
//2..pressing reset and then releasing reset
//3..setting both dipswitchs 2 and 3 to off
//;DEFINE INPUTS FROM DIPSWITCH
//;Note that the new board has pullups on the dipswitch,
//;whereas 550587 PCB had pull downs, thus logic is reversed.
//; XXX DIPSWITCH POLARITY:- XXX
//;DIP 1...ON = EXTERNAL CONNECTOR CONTROL
//;DIP 2...ON = LOGIC HIGH (note 'ON' gives a low input)
//;DIP 3...ON = LOGIC HIGH
//;DIP 4...OFF = 10V is for max current
//;DIP 5...OFF = 80degC, ON = 90degC
//;DIP 6... UNUSED
//;DIP 7... UNUSED
//;DIP 8...ON = NO FAN FITTED, OFF = FAN FITTED
//
//; XXX EXTERNAL CONTROL CONNECTOR POLARITY:- XXX
//;CLEAR = ACTIVE HIGH (ie high clears it)
//;RESET = ACTIVE HIGH (ie high resets it)
//;CH1...HIGH = ON, LOW = OFF
//;CH2...HIGH = ON, LOW = OFF
//;CH3...HIGH = ON, LOW = OFF
//
//;List of input ports:
//; ************** DIPSWITCH INPUTS:
//;DIP1 = RB0
//;DIP2 = RB1
//;DIP3 = RB2
//;DIP4 = RB3
//;DIP5 = RB4
//;DIP6 = RB5
//;DIP7 = RC5
//;DIP8 = RE6
//
//;************* External connector INPUTS:
//;clear = RC1 clears when high
//;ch3 on/off = RC7 channel on when high
//;RESET = RD5 reset when high
//;CH1 on/off = RD6 channel on when high
//;ch2 on/off = RD7 channel on when high
//
//;Other inputs (DIGITAL I/O
//;Fan tacho = RG2
//;mclr = RG5
//
//;Inputs that are ADC inputs:
//;RA2 = AN2
//;RA3 = AN3
//;RA5 = AN4 ADCON0=0x10
//;RF1 = AN6 ADCON0=0x18
//;RF2 = AN7 ADCON0=0x1C
//;RF3 = AN8 ADCON0=0x20
//;RF4 = AN9 ADCON0=0x24
//;RF5 = AN10 ADCON0=0x28
//;RF6 = AN11 ADCON0=0x2C
//;RF7 = AN5 ADCON0=0x14
//
//;**********ADC INPUTS:
//;AN0 = NC
//;AN1 = NC
//;AN2 = VREF- (0V)
//;AN3 = VREF+ (3V)
//;AN4 = Therm ch1
//;AN5 = I_CH1
//;AN6 = 0-10V control input
//;AN7 = PCB thermistor
//;AN8 = I_ch2
//;AN9 = I_ch3
//;AN10 = Therm-ch2
//;AN11 = Therm-ch3
//
//;OOOOOOOOOOO LIST OF OUTPUTS:
//;Trip = RA4
//;Indicator LED = RC2
//;MCP4013_CS = RC3
//;MCP4013_UD = RC4
//;Shutdown-Ch2 = RE0
//;Shutdown-Ch1 = RE1
//;Fancon PWM = RE4
//;Shutdown-Ch3 = RG0
//
//;NCNCNCNCNCNCNCNCNC LIST OF NON CONNECTED PINS:
//;RA0
//;RA1
//;RA6
//;RA7
//; RB6 = PGC
//; RB7 = PGD
//;RC0
//;RC6
//; RD0
//; RD1
//; RD2
//; RD3
//; RD4
//;RE2
//;RE3
//;RE5
//;RE7
//; RG1
//; RG3
//; RG4/*
#include <xc.h>
// CONFIG1L
#pragma config RETEN = OFF // VREG Sleep Enable bit (Disabled - Controlled by SRETEN bit)
#pragma config INTOSCSEL = HIGH // LF-INTOSC Low-power Enable bit (LF-INTOSC in High-power mode during Sleep)
#pragma config SOSCSEL = HIGH // SOSC Power Selection and mode Configuration bits (High Power SOSC circuit selected)
#pragma config XINST = OFF // Extended Instruction Set (Disabled)
// CONFIG1H
#pragma config FOSC = INTIO2 // Oscillator (Internal RC oscillator)
#pragma config PLLCFG = OFF // PLL x4 Enable bit (Disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor (Disabled)
#pragma config IESO = OFF // Internal External Oscillator Switch Over Mode (Disabled)
// CONFIG2L
#pragma config PWRTEN = OFF // Power Up Timer (Disabled)
#pragma config BOREN = NOSLP // Brown Out Detect (Enabled while active, disabled in SLEEP, SBOREN disabled)
#pragma config BORV = 0 // Brown-out Reset Voltage bits (3.0V)
#pragma config BORPWR = ZPBORMV // BORMV Power level (ZPBORMV instead of BORMV is selected)
// CONFIG2H
#pragma config WDTEN = OFF // Watchdog Timer (WDT disabled in hardware; SWDTEN bit disabled)
#pragma config WDTPS = 1048576 // Watchdog Postscaler (1:1048576)
// CONFIG3L
#pragma config RTCOSC = INTOSCREF// RTCC Clock Select (RTCC uses INTRC)
// CONFIG3H
#pragma config CCP2MX = PORTC // CCP2 Mux (RC1)
#pragma config MSSPMSK = MSK7 // MSSP address masking (7 Bit address masking mode)
#pragma config MCLRE = OFF // Master Clear Enable (MCLR Disabled, RG5 Enabled)
// CONFIG4L
#pragma config STVREN = ON // Stack Overflow Reset (Enabled)
#pragma config BBSIZ = BB2K // Boot Block Size (2K word Boot Block size)
// CONFIG5L
#pragma config CP0 = OFF // Code Protect 00800-01FFF (Disabled)
#pragma config CP1 = OFF // Code Protect 02000-03FFF (Disabled)
#pragma config CP2 = OFF // Code Protect 04000-05FFF (Disabled)
#pragma config CP3 = OFF // Code Protect 06000-07FFF (Disabled)
// CONFIG5H
#pragma config CPB = OFF // Code Protect Boot (Disabled)
#pragma config CPD = OFF // Data EE Read Protect (Disabled)
// CONFIG6L
#pragma config WRT0 = OFF // Table Write Protect 00800-017FF (Disabled)
#pragma config WRT1 = OFF // Table Write Protect 01800-03FFF (Disabled)
#pragma config WRT2 = OFF // Table Write Protect 04000-05FFF (Disabled)
#pragma config WRT3 = OFF // Table Write Protect 06000-07FFF (Disabled)
// CONFIG6H
#pragma config WRTC = OFF // Config. Write Protect (Disabled)
#pragma config WRTB = OFF // Table Write Protect Boot (Disabled)
#pragma config WRTD = OFF // Data EE Write Protect (Disabled)
// CONFIG7L
#pragma config EBRT0 = OFF // Table Read Protect 00800-017FF (Disabled)
#pragma config EBRT1 = OFF // Table Read Protect 01800-03FFF (Disabled)
#pragma config EBRT2 = OFF // Table Read Protect 04000-05FFF (Disabled)
#pragma config EBRT3 = OFF // Table Read Protect 06000-07FFF (Disabled)
// CONFIG7H
#pragma config EBRTB = OFF // Table Read Protect Boot (Disabled)
#include <stdint.h>
#define _XTAL_FREQ 4000000
void set_ana_dig_ports(void);
void disable_interrupts(void);
void disable_pullups(void);
void disable_opendrain(void);
void disable_comparators(void);
void setup_adc(void);
void setup_ports(void);
void NC_pins_low(void); //make all NC pins low.
void read_dips(void);
void read_extreg5(void); //reads the five digital inputs of the ext conn.
void pre_internal(void); //Go here before going into internal mode
void pre_external(void);
void set_initials_int(void); //Read dips, set comparison for change of dip
//set current.
void set_initials_ext(void); //Read dips, set comparison for change of dips
//& change of ext conn,and change of 0-10v
//& set current.
void externalmode(void); //this is where leds get driven in ext mode
void internalmode(void); //this is where leds get driven in internal mode.
void set_current_int(void); // set current for internal mode
void set_current_ext_AH(void); //set current in ext mode, 10V = highest curr
void set_current_ext_AL(void); //set current in ext mode, 0V = highest curr
void top_mcp4013(void);
void read_temps(void);
void read_analog(void);
void read_current(void);
void fault_int(void);
void fault_ext(void);
//CONFIGS
/*DEFINE OUTPUTS*/
#define ch1out LATEbits.LATE1
#define ch2out LATEbits.LATE0
#define ch3out LATGbits.LATG0
#define ind_ledout LATCbits.LATC2
#define fanconout LATEbits.LATE4
#define tripout LATAbits.LATA4
#define mcp4013_csout LATCbits.LATC3
#define mcp4013_udout LATCbits.LATC4
//DIPSWITCH INPUTS
#define dip1pin PORTBbits.RB0
#define dip2pin PORTBbits.RB1
#define dip3pin PORTBbits.RB2
#define dip4pin PORTBbits.RB3
#define dip5pin PORTBbits.RB4
#define dip6pin PORTBbits.RB5
#define dip7pin PORTCbits.RC5
#define dip8pin PORTEbits.RE6
//DEFINE INPUTS FROM EXT. CONNECTOR
#define resetext PORTDbits.RD5
#define ch1ext PORTDbits.RD6
#define ch2ext PORTDbits.RD7
#define ch3ext PORTCbits.RC7
#define clearext PORTCbits.RC1
/* TURN LEDS ON AND OFF*/
#define ON1 LATEbits.LATE1 = 1 /*Turn on chan1*/
#define OFF1 LATEbits.LATE1 = 0 /*Turn off chan1*/
#define ON2 LATEbits.LATE0 = 1 /*Turn on chan2*/
#define OFF2 LATEbits.LATE0 = 0 /*Turn off chan2*/
#define ON3 LATGbits.LATG0 = 1 /*Turn on chan2*/
#define OFF3 LATGbits.LATG0 = 0 /*Turn off chan2*/
#define FANON LATEbits.LATE2 = 1 /*Turn fan on*/
#define FANOFF LATEbits.LATE2 = 0 /*Turn fan off*/
/*DEFINE INPUTS FROM DIPSWITCH*/
/*Note that the new board has pullups on the dipswitch,*/
/*whereas 550587 PCB had pull downs, thus logic is reversed.*/
uint8_t dipsw1;
uint8_t dipsw2;
uint8_t dipsw3;
uint8_t dipsw4;
uint8_t dipsw5;
uint8_t dipsw8;
uint8_t dip8; //bit0=dip1...
uint8_t dip8_init; //comparison register to see if dips changed.
uint8_t extreg5; //bit0=reset,bit1=ch1...etc, to bit4=clear
//external connector pins
uint8_t extreg5_init;
uint8_t extp3; //reset
uint8_t extp4; //ch1
uint8_t extp5; //ch2
uint8_t extp6; //ch3
uint8_t extp9; //an in
uint8_t extp10; //clear
uint8_t extp11; //TRIP OUT
uint8_t temp1;
uint8_t temp2;
uint8_t temp3;
uint8_t tempb;
uint8_t ana8; //holds ADRESH
uint8_t ana8_init;
uint8_t max_led_temp;
uint8_t max_pcb_temp;
uint8_t board_90c; //max board temp value
uint8_t board_80c;
uint8_t led_90c;
uint8_t led_80c; //max led temp value
uint8_t ledthermopen; //trip value when thermistor open
uint8_t pcbthermopen;
uint8_t currentint; //represents 0A, 1.76A, 2.64A, 3.52A
//bit0=0,bit1=1a76...etc
uint8_t mcp4013pulses; //number of down pulses needed to get current.
uint8_t i;
uint8_t extreg5; //holds state of digital inputs of external connectoe
uint8_t extp3; //reset pin of external connector
uint8_t extp4; //channel 1 en/disable
uint8_t extp5; //channel 2 en/disable
uint8_t extp6; //channel 3 en/disable
uint8_t extp10; //clear pin of external connector...not implemented.
uint8_t triptempled; //either for 80degc or 90degc
uint8_t triptempboard; //90degc
uint8_t tripledthermopen; //not implemented as could be zero degc
uint8_t ch1temp;
uint8_t ch2temp;
uint8_t ch3temp;
uint8_t boardtemp;
uint8_t analog_in; //0-10v signal input
uint8_t analog_in_init; //for comparison, to see if need to change it.
uint8_t i_ch1; //current in channel 1...is it running current or not?
uint8_t i_ch2;
uint8_t i_ch3;
uint8_t count; //used for delay after enabling led driver..see if current
//actually is flowing.
uint8_t fault_internal; //fault flag, fault = 1, no_fault = 0
uint8_t fault_external;
uint8_t extreg5_debounce; //debounce comparison checker
uint8_t dip8_debounce;
void main(void) {
OSCCON = 0x56; //4mhz internal oscillator.
disable_interrupts();
disable_pullups();
disable_opendrain();
disable_comparators();
setup_adc();
setup_ports();
NC_pins_low(); //make all NC pins low.
here:
while(1){
OFF1;
OFF2;
OFF3;
FANOFF;
read_dips();
read_temps();
if (currentint == 1) {goto here;}
if (boardtemp > triptempboard) {goto here;}
here_1:
if (dipsw1 == 1) pre_internal(); //OFF (actually high) = INTERNAL MODE
if (currentint == 1) {goto here;}
if (dipsw1 == 1) internalmode(); //*************************
if (fault_internal == 1) {fault_int();}
if (currentint == 1) {goto here;}
if (boardtemp > triptempboard) {goto here;}
if (dipsw1 == 1) {goto here_1;}
if (dipsw1 == 0) pre_external(); //External mode selected
if (currentint == 1) {goto here;}
if (dipsw1 == 0) externalmode(); //**************************
if (fault_external == 1) {fault_ext();}
if (currentint == 1) {goto here;}
if (boardtemp > triptempboard) {goto here;}
goto here_1;
}
return;
}
void set_ana_dig_ports(void){
ANCON0 = 0xFC;
ANCON1 = 0x0F;
ANCON2 = 0x00;
return;
}
void disable_interrupts(void) {
INTCON =0x00;
INTCON2 =0x80;
INTCON3 = 0x00;
PIE1 = 0x00;
PIE2 = 0x00;
PIE3 = 0x00;
PIE4 = 0x00;
PIE5 = 0x00;
PIE6 = 0x00;
return;
}
void disable_pullups(void){
PADCFG1 = 0;
return;
}
void disable_opendrain(void){
ODCON1 = 0;
ODCON2 = 0;
ODCON3 = 0;
return;
}
void disable_comparators(void){
CM1CON = 0;
CM2CON = 0;
CM3CON = 0;
return;
}
void setup_adc(void){
ADCON0 = 0;
ADCON1 = 0x10; //VREF
ADCON2 = 0x3E; // Left jus/Tacq
return;
}
void setup_ports(void){
TRISA = 0x2C;
TRISB = 0x3F;
TRISC = 0xA2;
TRISD = 0xD0;
TRISE = 0x40;
TRISF = 0xFE;
TRISG = 0x24;
return;
}
void NC_pins_low(void){
//Make all NC pins low (they are already made to outputs)
//They are outputs for noise immunity reasons.
LATAbits.LATA0 = 0;
LATAbits.LATA1 = 0;
LATAbits.LATA6 = 0;
LATAbits.LATA7 = 0;
LATBbits.LATB6 = 0; //PGC
LATBbits.LATB7 = 0; //PGD
LATCbits.LATC0 = 0;
LATCbits.LATC6 = 0;
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
LATDbits.LATD4 = 0;
LATEbits.LATE2 = 0;
LATEbits.LATE3 = 0;
LATEbits.LATE5 = 0;
LATEbits.LATE7 = 0;
LATGbits.LATG1 = 0;
LATGbits.LATG3 = 0;
LATGbits.LATG4 = 0;
return;
}
void read_extreg5(void){
//Read just the five digital inputs from ext conn.
//put them in extreg5;
//There is debounce here....you only get the reading if two consecutive
//readings 300ms apart, are the same.
here_extreg:
extreg5 = 0x00; //first 5 bits of ext5 holds ext conn res,1,2,3,cl
if (resetext) {extp3 = 0x01; extreg5 = extreg5 || 0x01;}
else {extp3 = 0x00;}
if (ch1ext) {extp4 = 0x01; extreg5 = extreg5 || 0x02;}
else {extp4 = 0x00;}
if (ch2ext) {extp5 = 0x01; extreg5 = extreg5 || 0x04;}
else {extp5 = 0x00;}
if (ch3ext) {extp6 = 0x01; extreg5 = extreg5 || 0x08;}
else {extp6 = 0x00;}
if (clearext) {extp10 = 0x01; extreg5 = extreg5 || 0x10;}
else {extp10 = 0x00;}
extreg5_debounce = extreg5;
__delay_ms(100); //debounce delay
__delay_ms(100);
__delay_ms(100);
extreg5 = 0x00; //first 5 bits of ext5 holds ext conn res,1,2,3,cl
if (resetext) {extp3 = 0x01; extreg5 = extreg5 || 0x01;}
else {extp3 = 0x00;}
if (ch1ext) {extp4 = 0x01; extreg5 = extreg5 || 0x02;}
else {extp4 = 0x00;}
if (ch2ext) {extp5 = 0x01; extreg5 = extreg5 || 0x04;}
else {extp5 = 0x00;}
if (ch3ext) {extp6 = 0x01; extreg5 = extreg5 || 0x08;}
else {extp6 = 0x00;}
if (clearext) {extp10 = 0x01; extreg5 = extreg5 || 0x10;}
else {extp10 = 0x00;}
if (extreg5 != extreg5_debounce ) {goto here_extreg;}
return;
}
void read_dips(void){
//dip8 register holds the state of dipswitch in corresponding bit places.
//There is debounce here..if two consecutive dipswitch readings, 300ms
//apart are not the same, then you keep reading the dipswitchs, until
//they are the same.
here_dip8:
dip8 = 0x00;
if (dip1pin) {dipsw1 = 0x01; dip8 = dip8 || 0x01;}
else {dipsw1 = 0x00;}
if (dip2pin) {dipsw2 = 0x01; dip8 = dip8 || 0x02;}
else {dipsw2 = 0x00;}
if (dip3pin) {dipsw3 = 0x01; dip8 = dip8 || 0x04;}
else {dipsw3 = 0x00;}
if (dip4pin) {dipsw4 = 0x01; dip8 = dip8 || 0x08;}
else {dipsw4 = 0x00;}
if (dip5pin) {dipsw5 = 0x01; dip8 = dip8 || 0x10;}
else {dipsw5 = 0x00;}
if (dip8pin) {dipsw8 = 0x01; dip8 = dip8 || 0x80;}
else {dipsw8 = 0x00;}
dip8_debounce = dip8;
__delay_ms(100); //debounce delay
__delay_ms(100);
__delay_ms(100);
dip8 = 0x00;
if (dip1pin) {dipsw1 = 0x01; dip8 = dip8 || 0x01;}
else {dipsw1 = 0x00;}
if (dip2pin) {dipsw2 = 0x01; dip8 = dip8 || 0x02;}
else {dipsw2 = 0x00;}
if (dip3pin) {dipsw3 = 0x01; dip8 = dip8 || 0x04;}
else {dipsw3 = 0x00;}
if (dip4pin) {dipsw4 = 0x01; dip8 = dip8 || 0x08;}
else {dipsw4 = 0x00;}
if (dip5pin) {dipsw5 = 0x01; dip8 = dip8 || 0x10;}
else {dipsw5 = 0x00;}
if (dip8pin) {dipsw8 = 0x01; dip8 = dip8 || 0x80;}
else {dipsw8 = 0x00;}
if(dip8 != dip8_debounce) {goto here_dip8;}
if ((dipsw2 == 0) && (dipsw3 ==0)) {currentint = 4;} //3.52A
if ((dipsw2 == 1) && (dipsw3 ==0)) {currentint = 3;} //2.64A
if ((dipsw2 == 0) && (dipsw3 ==1)) {currentint = 2;} //1.76A
if ((dipsw2 == 1) && (dipsw3 ==1)) {currentint = 1;} //SHUTDOWN (0A)
if (dipsw5 == 0) {triptempled = 200;} //90degc (Thermistor)
if (dipsw5 == 1) {triptempled = 200;} //decimal 168 for 80degc (Thermistor)
triptempboard = 184; //90degC = board trip temperature. MCP9701A
tripledthermopen = 10; //For when LED thermistor goes open...not used as
//similar to zero degC.
return;
}
void read_analog(void){
//Read the 0-10V signal
ADCON0 = 0x18; //Select ADC module FOR AN6 (0-10v)
ADCON0bits.ADON = 1; //Turn on ADC module
ADCON0bits.GODONE = 1; //START ADC CONVERSION
while(GODONE) {;} //Wait till conversion complete.
ana8 = ADRESH;
analog_in = ana8;
ADCON0bits.ADON = 0; //turn off ADC MODULE.
return;
}
void read_temps(void){
ADCON0 = 0x10; //Select ADC module FOR AN4 (therm ch1)
ADCON0bits.ADON = 1; //Turn on ADC module
ADCON0bits.GODONE = 1; //START ADC CONVERSION
while(GODONE) {;} //Wait till conversion complete.
ana8 = ADRESH;
ch1temp = ana8;
ADCON0bits.ADON = 0; //turn off ADC MODULE.
ADCON0 = 0x28; //Select ADC module FOR AN10 (therm ch2)
ADCON0bits.ADON = 1; //Turn on ADC module
ADCON0bits.GODONE = 1; //START ADC CONVERSION
while(GODONE) {;} //Wait till conversion complete.
ana8 = ADRESH;
ch2temp = ana8;
ADCON0bits.ADON = 0; //turn off ADC MODULE.
ADCON0 = 0x2C; //Select ADC module FOR AN11 (therm ch3)
ADCON0bits.ADON = 1; //Turn on ADC module
ADCON0bits.GODONE = 1; //START ADC CONVERSION
while(GODONE) {;} //Wait till conversion complete.
ana8 = ADRESH;
ch3temp = ana8;
ADCON0bits.ADON = 0; //turn off ADC MODULE.
ADCON0 = 0x1C; //Select ADC module FOR AN7 (Board thermistor,MCP9701A)
ADCON0bits.ADON = 1; //Turn on ADC module
ADCON0bits.GODONE = 1; //START ADC CONVERSION
while(GODONE) {;} //Wait till conversion complete.
ana8 = ADRESH;
ch3temp = ana8;
ADCON0bits.ADON = 0; //turn off ADC MODULE.
return;
}
void read_current(void){
//This reads the current from the LTC6101's via ADC, to see if the
//current has gone to zero....ie below 130mA.
ADCON0 = 0x14; //Select ADC module FOR AN5 (I ch1)
ADCON0bits.ADON = 1; //Turn on ADC module
ADCON0bits.GODONE = 1; //START ADC CONVERSION
while(GODONE) {;} //Wait till conversion complete.
ana8 = ADRESH;
if (ana8 < 7) {i_ch1 = 0;} //No current in chan 1..ie its less than 130mA
else {i_ch1 = 1;} //Current is in chan 1, so i_ch1 = 1
ADCON0bits.ADON = 0; //turn off ADC MODULE.
ADCON0 = 0x20; //Select ADC module FOR AN8 (I ch2)
ADCON0bits.ADON = 1; //Turn on ADC module
ADCON0bits.GODONE = 1; //START ADC CONVERSION
while(GODONE) {;} //Wait till conversion complete.
ana8 = ADRESH;
if (ana8 < 7) {i_ch2 = 0;} //No current in chan 2..ie its less than 130mA
else {i_ch2 = 1;}
ADCON0bits.ADON = 0; //turn off ADC MODULE.
ADCON0 = 0x24; //Select ADC module FOR AN9 (I ch3)
ADCON0bits.ADON = 1; //Turn on ADC module
ADCON0bits.GODONE = 1; //START ADC CONVERSION
while(GODONE) {;} //Wait till conversion complete.
ana8 = ADRESH;
if (ana8 < 7) {i_ch3 = 0;} //No current in chan 3..ie its less than 130mA
else {i_ch3 = 1;}
ADCON0bits.ADON = 0; //turn off ADC MODULE.
return;
}
void set_initials_int(void){
read_dips();
dip8_init = dip8; //for comparison later
return;
}
void set_initials_ext(void){
read_dips();
dip8_init = dip8; //for comparison later
read_extreg5();
extreg5_init = extreg5;
read_analog(); //read the 0-10v signal.
analog_in_init = analog_in; //0-10V signal for comparison
return;
}
void pre_internal(void){
set_initials_int();
set_current_int();
return;
}
void pre_external(void){
set_initials_ext();
if (dipsw4 == 1) {set_current_ext_AH();}
if (dipsw4 == 0) {set_current_ext_AL();}
return;
;}
// **********************************************************
void internalmode(void){
//If after about 2 seconds of the led drivers being enabled, no LED
//current is detected, and the channel is switched on, then you go into
//a fault routine.
FANON;
fault_internal = 0; //clear internal mode fault flag
count = 0;
while(1){
read_dips();
if (dip8 != dip8_init) {break;}
read_temps();
if (boardtemp > triptempboard){break;}
if (ch1temp <= triptempled) {ON1;}
if (ch2temp <= triptempled) {ON2;}
if (ch3temp <= triptempled) {ON3;}
if (ch1temp > triptempled) {OFF1;}
if (ch2temp > triptempled) {OFF2;}
if (ch3temp > triptempled) {OFF3;}
count = count + 1;
if (count > 20) {count = 0; read_current();}
if (i_ch1 == 0) {fault_internal = 1;}
if (i_ch2 == 0) {fault_internal = 1;}
if (i_ch3 == 0) {fault_internal = 1;}
if (fault_internal == 1) {break;}
}
return;}
void externalmode(void) {
//If after about 2 seconds of the led drivers being enabled, no LED
//current is detected, and the channel is switched on, then you go into
//a fault routine.
count = 0;
fault_external = 0;
FANON;
while(1){
read_dips();
if (dip8 != dip8_init) {break;}
read_extreg5();
if (extreg5 != extreg5_init){break;}
read_analog();
if (analog_in != analog_in_init) {break;}
read_temps();
if (boardtemp > triptempboard) {break;}
if ((extp4 == 1) && (ch1temp < triptempled )) {ON1;}
if ((extp5 == 1) && (ch2temp < triptempled )) {ON2;}
if ((extp6 == 1) && (ch3temp < triptempled )) {ON3;}
if ((extp4 == 0) || (ch1temp >= triptempled)) {OFF1;}
if ((extp5 == 0) || (ch2temp >= triptempled)) {OFF2;}
if ((extp6 == 0) || (ch3temp >= triptempled)) {OFF3;}
count = count + 1;
if (count >20) {count = 0; read_current();}
if (i_ch1 == 0 && extp4 == 1){fault_external =1; break;}
if (i_ch2 == 0 && extp5 == 1){fault_external =1; break;}
if (i_ch3 == 0 && extp6 == 1){fault_external =1; break;}
}
return;
}
void fault_int(void){
//You will have been sent to fault because the led current went to zero
//when in internal mode. ie the led current in any channel went to zero
//when it should have been running.
//To get out of this fault routine requires either switching the equipment
//off then on, or setting the dipswitchs 2 & 3 to OFF,OFF.
ind_ledout = 1;
OFF1;
OFF2;
OFF3;
while(1){
read_dips();
if (dipsw2 && dipsw3){break;} //these dips allow you to get out of fault
}
ind_ledout = 0;
fault_internal = 0;
return;
}
void fault_ext(void){
//You will have been sent to fault because the led current went to zero
//when in external mode. ie the led current in any channel went to zero
//when it should have been running.
//To get out of this fault routine requires either switching the equipment
//off then on, or setting the dipswitchs 2 & 3 to OFF,OFF....or,
//pressing the reset button.
ind_ledout = 1;
OFF1;
OFF2;
OFF3;
while(1){
read_dips();
read_extreg5();
if ((dipsw2 == 1) && (dipsw3 == 1)) {break;} //these dips allow
//you to get out of fault
if (extp3 == 1) {break;} //reset pressed means get out of
//this fault routine
}
while(1){
read_extreg5();
if (extp3 == 0) {break;} //Start again but only when the reset button is
//released.
}
ind_ledout = 0;
fault_external = 0;
return;
}
//***************************************************************
void set_current_int(void){
//set mcp4013 by topping the mcp4013, then decrementing
if (currentint == 2) mcp4013pulses = 31; //no. of downpulses for 1.76A.
if (currentint == 3) mcp4013pulses = 17; //no. of downpulses for 2.54A.
if (currentint == 4) mcp4013pulses = 4; //no. of downpulses for 3.52A
top_mcp4013(); //top out the mcp4013
mcp4013_csout = 1; //disable mcp4013
mcp4013_csout = 1;
mcp4013_udout = 0; //ready to decrement
mcp4013_udout = 0;
mcp4013_csout = 0; //enable mcp4013
mcp4013_csout = 0;
for (i== 0; i== mcp4013pulses; i++){
mcp4013_udout = 1; //pulse it to the level
mcp4013_udout = 1;
mcp4013_udout = 0;
mcp4013_udout = 0;
}
mcp4013_csout = 1;
mcp4013_csout = 1; //disable mcp4013
return;
}
void top_mcp4013(void) {
mcp4013_csout = 1;
mcp4013_csout = 1; //disable mcp4013
mcp4013_udout = 1; //ready to increment wiper
mcp4013_udout = 1;
mcp4013_csout = 0; //enable mcp4013
mcp4013_csout = 0;
for(i==64;i==0;i--){
mcp4013_udout = 0;
mcp4013_udout = 0;
mcp4013_udout = 1;
mcp4013_udout = 1;
}
mcp4013_csout = 1; //disable mcp4013
mcp4013_csout = 1;
return;
}
void set_current_ext_AH(void){
//This is to set the current in external mode when the 4th dipswitch
//asks for the 0-10V signal to be "10V = Highest current"
//["AH" stands for Active High"]
//MCP4013pulses will here be the number of downpulses to pulse the digital
//pot with. (starting from the top of the resistor 'chain')
//Never go below 11 POT steps (ie, never below 0.176V -> 300mA)
//Make max current correspond to 235bits to 255bits on the 0-10V input
//(9.2V)
//CALCULATING NUMBER OF DOWNPULSES.
if (currentint == 2) {
//9 apart
if (analog_in >= 235) {mcp4013pulses = 31;}
if ((analog_in >= 225) && (analog_in <= 234)) {mcp4013pulses = 32;}
if ((analog_in >= 215) && (analog_in <= 224)) {mcp4013pulses = 33;}
if ((analog_in >= 205) && (analog_in <= 214)) {mcp4013pulses = 34;}
if ((analog_in >= 195) && (analog_in <= 204)) {mcp4013pulses = 35;}
if ((analog_in >= 185) && (analog_in <= 194)) {mcp4013pulses = 36;}
if ((analog_in >= 175) && (analog_in <= 184)) {mcp4013pulses = 37;}
if ((analog_in >= 165) && (analog_in <= 174)) {mcp4013pulses = 38;}
if ((analog_in >= 155) && (analog_in <= 164)) {mcp4013pulses = 39;}
if ((analog_in >= 145) && (analog_in <= 154)) {mcp4013pulses = 40;}
if ((analog_in >= 135) && (analog_in <= 144)) {mcp4013pulses = 41;}
if ((analog_in >= 125) && (analog_in <= 134)) {mcp4013pulses = 42;}
if ((analog_in >= 115) && (analog_in <= 124)) {mcp4013pulses = 43;}
if ((analog_in >= 105) && (analog_in <= 114)) {mcp4013pulses = 44;}
if ((analog_in >= 95) && (analog_in <= 104)) {mcp4013pulses = 45;}
if ((analog_in >= 85) && (analog_in <= 94)) {mcp4013pulses = 46;}
if ((analog_in >= 75) && (analog_in <= 84)) {mcp4013pulses = 47;}
if ((analog_in <= 74)) {mcp4013pulses = 48;}
}
if (currentint == 3) {
//6 apart
if (analog_in >= 235) {mcp4013pulses = 17;}
if ((analog_in >= 228) && (analog_in <= 234)) {mcp4013pulses = 18;}
if ((analog_in >= 221) && (analog_in <= 227)) {mcp4013pulses = 19;}
if ((analog_in >= 214) && (analog_in <= 220)) {mcp4013pulses = 20;}
if ((analog_in >= 207) && (analog_in <= 213)) {mcp4013pulses = 21;}
if ((analog_in >= 200) && (analog_in <= 206)) {mcp4013pulses = 22;}
if ((analog_in >= 193) && (analog_in <= 199)) {mcp4013pulses = 23;}
if ((analog_in >= 186) && (analog_in <= 192)) {mcp4013pulses = 24;}
if ((analog_in >= 179) && (analog_in <= 185)) {mcp4013pulses = 25;}
if ((analog_in >= 172) && (analog_in <= 178)) {mcp4013pulses = 26;}
if ((analog_in >= 165) && (analog_in <= 171)) {mcp4013pulses = 27;}
if ((analog_in >= 158) && (analog_in <= 164)) {mcp4013pulses = 28;}
if ((analog_in >= 151) && (analog_in <= 157)) {mcp4013pulses = 29;}
if ((analog_in >= 144) && (analog_in <= 150)) {mcp4013pulses = 30;}
if ((analog_in >= 137) && (analog_in <= 143)) {mcp4013pulses = 31;}
if ((analog_in >= 130) && (analog_in <= 136)) {mcp4013pulses = 32;}
if ((analog_in >= 123) && (analog_in <= 129)) {mcp4013pulses = 33;}
if ((analog_in >= 116) && (analog_in <= 122)) {mcp4013pulses = 34;}
if ((analog_in >= 109) && (analog_in <= 115)) {mcp4013pulses = 35;}
if ((analog_in >= 102) && (analog_in <= 108)) {mcp4013pulses = 36;}
if ((analog_in >= 95) && (analog_in <= 101)) {mcp4013pulses = 37;}
if ((analog_in >= 88) && (analog_in <= 94)) {mcp4013pulses = 38;}
if ((analog_in >= 81) && (analog_in <= 87)) {mcp4013pulses = 39;}
if ((analog_in >= 74) && (analog_in <= 80)) {mcp4013pulses = 40;}
if ((analog_in >= 67) && (analog_in <=73)) {mcp4013pulses = 41;}
if ((analog_in >= 60) && (analog_in <= 66)) {mcp4013pulses = 42;}
if ((analog_in >= 53) && (analog_in <= 59)) {mcp4013pulses = 43;}
if ((analog_in >= 46) && (analog_in <= 52)) {mcp4013pulses = 44;}
if ((analog_in >= 39) && (analog_in <= 45)) {mcp4013pulses = 45;}
if ((analog_in >= 32) && (analog_in <= 38)) {mcp4013pulses = 46;}
if ((analog_in >= 25) && (analog_in <= 31)) {mcp4013pulses = 47;}
if ((analog_in <= 24)) {mcp4013pulses = 48;}
}
if (currentint == 4){
//4 apart
if (analog_in >= 235) {mcp4013pulses = 4;}
if ((analog_in >= 230) && (analog_in <= 234)) {mcp4013pulses = 5;}
if ((analog_in >= 225) && (analog_in <= 229)) {mcp4013pulses = 6;}
if ((analog_in >= 220) && (analog_in <= 224)) {mcp4013pulses = 7;}
if ((analog_in >= 215) && (analog_in <= 219)) {mcp4013pulses = 8;}
if ((analog_in >= 210) && (analog_in <= 214)) {mcp4013pulses = 9;}
if ((analog_in >= 205) && (analog_in <= 209)) {mcp4013pulses = 10;}
if ((analog_in >= 200) && (analog_in <= 204)) {mcp4013pulses = 11;}
if ((analog_in >= 195) && (analog_in <= 199)) {mcp4013pulses = 12;}
if ((analog_in >= 190) && (analog_in <= 194)) {mcp4013pulses = 13;}
if ((analog_in >= 185) && (analog_in <= 189)) {mcp4013pulses = 14;}
if ((analog_in >= 180) && (analog_in <= 184)) {mcp4013pulses = 15;}
if ((analog_in >= 175) && (analog_in <= 179)) {mcp4013pulses = 16;}
if ((analog_in >= 170) && (analog_in <= 174)) {mcp4013pulses = 17;}
if ((analog_in >= 165) && (analog_in <= 169)) {mcp4013pulses = 18;}
if ((analog_in >= 160) && (analog_in <= 164)) {mcp4013pulses = 19;}
if ((analog_in >= 155) && (analog_in <= 159)) {mcp4013pulses = 20;}
if ((analog_in >= 150) && (analog_in <= 154)) {mcp4013pulses = 21;}
if ((analog_in >= 145) && (analog_in <= 149)) {mcp4013pulses = 22;}
if ((analog_in >= 140) && (analog_in <= 144)) {mcp4013pulses = 23;}
if ((analog_in >= 135) && (analog_in <= 139)) {mcp4013pulses = 24;}
if ((analog_in >= 130) && (analog_in <= 134)) {mcp4013pulses = 25;}
if ((analog_in >= 125) && (analog_in <= 129)) {mcp4013pulses = 26;}
if ((analog_in >= 120) && (analog_in <= 124)) {mcp4013pulses = 27;}
if ((analog_in >= 115) && (analog_in <= 119)) {mcp4013pulses = 28;}
if ((analog_in >= 110) && (analog_in <= 114)) {mcp4013pulses = 29;}
if ((analog_in >= 105) && (analog_in <= 109)) {mcp4013pulses = 30;}
if ((analog_in >= 100) && (analog_in <= 104)) {mcp4013pulses = 31;}
if ((analog_in >= 95) && (analog_in <= 99)) {mcp4013pulses = 32;}
if ((analog_in >= 90) && (analog_in <= 94)) {mcp4013pulses = 33;}
if ((analog_in >= 85) && (analog_in <= 89)) {mcp4013pulses = 34;}
if ((analog_in >= 80) && (analog_in <= 84)) {mcp4013pulses = 35;}
if ((analog_in >= 75) && (analog_in <= 79)) {mcp4013pulses = 36;}
if ((analog_in >= 70) && (analog_in <= 74)) {mcp4013pulses = 37;}
if ((analog_in >= 65) && (analog_in <= 69)) {mcp4013pulses = 38;}
if ((analog_in >= 60) && (analog_in <= 64)) {mcp4013pulses = 39;}
//3 apart
if ((analog_in >= 56) && (analog_in <= 59)) {mcp4013pulses = 40;}
if ((analog_in >= 52) && (analog_in <= 55)) {mcp4013pulses = 41;}
if ((analog_in >= 48) && (analog_in <= 51)) {mcp4013pulses = 42;}
if ((analog_in >= 44) && (analog_in <= 47)) {mcp4013pulses = 43;}
if ((analog_in >=40) && (analog_in <= 43)) {mcp4013pulses = 39;}
if ((analog_in >= 36) && (analog_in <= 39)) {mcp4013pulses = 40;}
if ((analog_in >= 32) && (analog_in <= 35)) {mcp4013pulses = 41;}
if ((analog_in >= 28) && (analog_in <= 31)) {mcp4013pulses = 42;}
if ((analog_in >= 24) && (analog_in <= 27)) {mcp4013pulses = 43;}
if ((analog_in >= 20) && (analog_in <= 23)) {mcp4013pulses =44;}
if ((analog_in >= 16) && (analog_in <= 19)) {mcp4013pulses = 45;}
if ((analog_in >= 12) && (analog_in <= 15)) {mcp4013pulses = 46;}
if ((analog_in >= 8) && (analog_in <= 11)) {mcp4013pulses = 47;}
if (analog_in <= 7) {mcp4013pulses =48;}
}
top_mcp4013(); //top out the mcp4013
mcp4013_csout = 1; //disable mcp4013
mcp4013_csout = 1;
mcp4013_udout = 0; //ready to decrement
mcp4013_udout = 0;
mcp4013_csout = 0; //enable mcp4013
mcp4013_csout = 0;
for (i== 0; i== mcp4013pulses; i++){
mcp4013_udout = 1; //pulse it to the level
mcp4013_udout = 1;
mcp4013_udout = 0;
mcp4013_udout = 0;
}
mcp4013_csout = 1;
mcp4013_csout = 1; //disable mcp4013
return;
}
void set_current_ext_AL(void){
//This is to set the current in external mode when the 4th dipswitch
//asks for the 0-10V signal to be "0V = Highest current"
//["AL" stands for Active Low"]
//MCP4013pulses will here be the number of downpulses to pulse the digital
//pot with. (starting from the top of the resistor 'chain')
//Never go below 11 POT steps (ie, never below 0.176V -> 300mA)
//Make max current correspond to 0 bits to 9 bits on the 0-10V input
//(ie anything below 0.3V will be max)
if (currentint == 2) {
//12 apart
if (analog_in <= 9) {mcp4013pulses = 31;}
if ((analog_in >= 10 ) && (analog_in <= 22)) {mcp4013pulses = 32;}
if ((analog_in >= 23 ) && (analog_in <= 35)) {mcp4013pulses = 33;}
if ((analog_in >= 36 ) && (analog_in <= 48)) {mcp4013pulses = 34;}
if ((analog_in >= 49 ) && (analog_in <= 61)) {mcp4013pulses = 35;}
if ((analog_in >= 62 ) && (analog_in <= 74)) {mcp4013pulses = 36;}
if ((analog_in >= 75 ) && (analog_in <= 87)) {mcp4013pulses = 37;}
if ((analog_in >= 88 ) && (analog_in <= 100)) {mcp4013pulses = 38;}
if ((analog_in >= 101 ) && (analog_in <= 113)) {mcp4013pulses = 39;}
if ((analog_in >= 114 ) && (analog_in <= 126)) {mcp4013pulses = 40;}
if ((analog_in >= 127 ) && (analog_in <= 139)) {mcp4013pulses = 41;}
if ((analog_in >= 140 ) && (analog_in <= 152)) {mcp4013pulses = 42;}
if ((analog_in >= 153 ) && (analog_in <= 165)) {mcp4013pulses = 43;}
if ((analog_in >= 166 ) && (analog_in <= 178)) {mcp4013pulses = 44;}
if ((analog_in >= 179 ) && (analog_in <= 191)) {mcp4013pulses = 45;}
if ((analog_in >= 192 ) && (analog_in <= 204)) {mcp4013pulses = 46;}
if ((analog_in >= 205 ) && (analog_in <= 217)) {mcp4013pulses = 47;}
if (analog_in >= 218 ) {mcp4013pulses = 48;}
}
if (currentint == 3) {
//7 apart
if (analog_in <= 9) {mcp4013pulses = 17;}
if ((analog_in >= 10 ) && (analog_in <= 17)) {mcp4013pulses = 18;}
if ((analog_in >= 18 ) && (analog_in <= 25)) {mcp4013pulses = 19;}
if ((analog_in >= 26 ) && (analog_in <= 33)) {mcp4013pulses = 20;}
if ((analog_in >= 34 ) && (analog_in <= 41)) {mcp4013pulses = 21;}
if ((analog_in >= 42 ) && (analog_in <= 49)) {mcp4013pulses = 22;}
if ((analog_in >= 50 ) && (analog_in <= 57)) {mcp4013pulses = 23;}
if ((analog_in >= 58 ) && (analog_in <= 65)) {mcp4013pulses = 24;}
if ((analog_in >= 66 ) && (analog_in <= 73)) {mcp4013pulses = 25;}
if ((analog_in >= 74 ) && (analog_in <= 81)) {mcp4013pulses = 26;}
if ((analog_in >= 82 ) && (analog_in <= 89)) {mcp4013pulses = 27;}
if ((analog_in >= 90 ) && (analog_in <= 97)) {mcp4013pulses = 28;}
if ((analog_in >= 98 ) && (analog_in <= 105)) {mcp4013pulses = 29;}
if ((analog_in >= 106 ) && (analog_in <= 113)) {mcp4013pulses = 30;}
if ((analog_in >= 114 ) && (analog_in <= 121)) {mcp4013pulses = 31;}
if ((analog_in >= 122 ) && (analog_in <= 129)) {mcp4013pulses = 32;}
if ((analog_in >= 130 ) && (analog_in <= 137)) {mcp4013pulses = 33;}
if ((analog_in >= 138 ) && (analog_in <= 145)) {mcp4013pulses = 34;}
if ((analog_in >= 146 ) && (analog_in <= 153)) {mcp4013pulses = 35;}
if ((analog_in >= 154 ) && (analog_in <= 161)) {mcp4013pulses = 36;}
if ((analog_in >= 162 ) && (analog_in <= 169)) {mcp4013pulses = 37;}
if ((analog_in >= 170 ) && (analog_in <= 177)) {mcp4013pulses = 38;}
if ((analog_in >= 178 ) && (analog_in <= 185)) {mcp4013pulses = 39;}
if ((analog_in >= 186 ) && (analog_in <= 193)) {mcp4013pulses = 40;}
if ((analog_in >= 194 ) && (analog_in <= 201)) {mcp4013pulses = 41;}
if ((analog_in >= 202 ) && (analog_in <= 209)) {mcp4013pulses = 42;}
if ((analog_in >= 210 ) && (analog_in <= 217)) {mcp4013pulses = 43;}
if ((analog_in >= 218 ) && (analog_in <= 225)) {mcp4013pulses = 44;}
if ((analog_in >= 226 ) && (analog_in <= 233)) {mcp4013pulses = 45;}
if ((analog_in >= 234 ) && (analog_in <= 241)) {mcp4013pulses = 46;}
if ((analog_in >= 242 ) && (analog_in <= 249)) {mcp4013pulses = 47;}
if (analog_in >= 250 ) {mcp4013pulses = 48;}
}
if (currentint == 4) {
//4 apart
if (analog_in <= 9) {mcp4013pulses = 4;}
if ((analog_in >= 10 ) && (analog_in <= 14)) {mcp4013pulses = 5;}
if ((analog_in >= 15 ) && (analog_in <= 19)) {mcp4013pulses = 6;}
if ((analog_in >= 20 ) && (analog_in <= 24)) {mcp4013pulses = 7;}
if ((analog_in >= 25 ) && (analog_in <= 29)) {mcp4013pulses = 8;}
if ((analog_in >= 30 ) && (analog_in <= 34)) {mcp4013pulses = 9;}
if ((analog_in >= 35 ) && (analog_in <= 39)) {mcp4013pulses = 10;}
if ((analog_in >= 40 ) && (analog_in <= 44)) {mcp4013pulses = 11;}
if ((analog_in >= 45 ) && (analog_in <= 49)) {mcp4013pulses = 12;}
if ((analog_in >= 50 ) && (analog_in <= 54)) {mcp4013pulses = 13;}
if ((analog_in >= 55 ) && (analog_in <= 59)) {mcp4013pulses = 14;}
if ((analog_in >= 60 ) && (analog_in <= 64)) {mcp4013pulses = 15;}
if ((analog_in >= 65 ) && (analog_in <= 69)) {mcp4013pulses = 16;}
if ((analog_in >= 70 ) && (analog_in <= 74)) {mcp4013pulses = 17;}
if ((analog_in >= 75 ) && (analog_in <= 79)) {mcp4013pulses = 18;}
if ((analog_in >= 80 ) && (analog_in <= 84)) {mcp4013pulses = 19;}
if ((analog_in >= 85 ) && (analog_in <= 89)) {mcp4013pulses = 20;}
if ((analog_in >= 90 ) && (analog_in <= 94)) {mcp4013pulses = 21;}
if ((analog_in >= 95 ) && (analog_in <= 99)) {mcp4013pulses = 22;}
if ((analog_in >= 100 ) && (analog_in <= 104)) {mcp4013pulses = 23;}
if ((analog_in >= 105 ) && (analog_in <= 109)) {mcp4013pulses = 24;}
if ((analog_in >= 110 ) && (analog_in <= 114)) {mcp4013pulses = 25;}
if ((analog_in >= 115 ) && (analog_in <= 119)) {mcp4013pulses = 26;}
if ((analog_in >= 120 ) && (analog_in <= 124)) {mcp4013pulses = 27;}
if ((analog_in >= 125 ) && (analog_in <= 129)) {mcp4013pulses = 28;}
if ((analog_in >= 130 ) && (analog_in <= 134)) {mcp4013pulses = 29;}
if ((analog_in >= 135 ) && (analog_in <= 139)) {mcp4013pulses = 30;}
if ((analog_in >= 140 ) && (analog_in <= 144)) {mcp4013pulses = 31;}
if ((analog_in >= 145 ) && (analog_in <= 149)) {mcp4013pulses = 32;}
if ((analog_in >= 150 ) && (analog_in <= 154)) {mcp4013pulses = 33;}
if ((analog_in >= 155 ) && (analog_in <= 159)) {mcp4013pulses = 34;}
if ((analog_in >= 160 ) && (analog_in <= 164)) {mcp4013pulses = 35;}
if ((analog_in >= 165 ) && (analog_in <= 169)) {mcp4013pulses = 36;}
if ((analog_in >= 170 ) && (analog_in <= 174)) {mcp4013pulses = 37;}
if ((analog_in >= 175 ) && (analog_in <= 179)) {mcp4013pulses = 38;}
if ((analog_in >= 180 ) && (analog_in <= 184)) {mcp4013pulses = 39;}
if ((analog_in >= 185 ) && (analog_in <= 189)) {mcp4013pulses = 40;}
if ((analog_in >= 190 ) && (analog_in <= 194)) {mcp4013pulses = 41;}
if ((analog_in >= 195 ) && (analog_in <= 199)) {mcp4013pulses = 42;}
if ((analog_in >= 200 ) && (analog_in <= 204)) {mcp4013pulses = 43;}
if ((analog_in >= 205 ) && (analog_in <= 209)) {mcp4013pulses = 44;}
if ((analog_in >= 210 ) && (analog_in <= 214)) {mcp4013pulses = 45;}
if ((analog_in >= 215 ) && (analog_in <= 219)) {mcp4013pulses = 46;}
if ((analog_in >= 220 ) && (analog_in <= 224)) {mcp4013pulses = 47;}
if (analog_in >= 225) {mcp4013pulses = 48;}
}
top_mcp4013(); //top out the mcp4013
mcp4013_csout = 1; //disable mcp4013
mcp4013_csout = 1;
mcp4013_udout = 0; //ready to decrement
mcp4013_udout = 0;
mcp4013_csout = 0; //enable mcp4013
mcp4013_csout = 0;
for (i== 0; i== mcp4013pulses; i++){
mcp4013_udout = 1; //pulse it to the level
mcp4013_udout = 1;
mcp4013_udout = 0;
mcp4013_udout = 0;
}
mcp4013_csout = 1;
mcp4013_csout = 1; //disable mcp4013
return;
}