here is the full code incase i am missing any thing?
Code:
#include <16f876.h>
#include <stdlib.h>
#include <math.h>
#use delay (CLOCK = 4000000)
#use RS232 (BAUD = 9600,parity = n, bits = 8, xmit=PIN_c6, rcv = PIN_c7, ERRORS)
#use fixed_io (b_outputs=PIN_B0, PIN_B1, PIN_B2, PIN_B3, PIN_B4, PIN_B7)
#use fixed_io (a_outputs=PIN_A5)
#define RELAY_A PIN_B0
#define RELAY_B PIN_B1
#define INC PIN_B2
#define UD PIN_B3
#define CS PIN_B4
#define A_B_SELECT PIN_B5
#define START_UP PIN_B6
#define BUZZER PIN_B7
#define LED PIN_A5
// Test Limits
#define TARGET_VALUE 0.320
#define VARIANCE1 -0.01
#define VARIANCE2 0.01
double strtod(const char *s,char **endptr) {
float pow10 = 1.0;
float result = 0.0;
int sign = 0, point = 0;
char c;
int ptr = 0;
if(s)
{
c=s[ptr++];
}
while((c>='0' && c<='9') || c=='+' || c=='-' || c=='.') {
if(c == '-') {
sign = 1;
c = s[ptr++];
}
while((c >= '0' && c <= '9') && point == 0) {
result = 10*result + c - '0';
c = s[ptr++];
}
if (c == '.') {
point = 1;
c = s[ptr++];
}
while((c >= '0' && c <= '9') && point == 1) {
pow10 = pow10*10;
result += (c - '0')/pow10;
c = s[ptr++];
}
if (c == '+') {
c = s[ptr++];
}
}
if (sign == 1)
result = -1*result;
if(endptr)
{
if (ptr) {
ptr--;
*endptr = (char *)s+ptr;
//*endptr=s+ptr;
//*((const char *)endptr)=s+ptr;
}
else
*endptr = (char *)s;
//*endptr=s;
//*((const char *)endptr)=s;
}
return(result);
}
void select_relay()
{
output_low (RELAY_A);
output_low (RELAY_B);
if (input(A_B_SELECT))
output_high (RELAY_B);
else
output_high (RELAY_A);
delay_us (10);
}
void set_up_digilux()
{
putc('M');
delay_ms(5);
putc('B');
delay_ms(5);
putc(' ');
delay_ms(5);
putc('2');
delay_ms(5);
putc(13);
delay_ms(10);
}
void increment_intensity()
{
output_high (CS);
output_low (UD);
output_low (INC);
delay_ms (50);
output_high (INC);
delay_ms (50);
output_low (INC);
}
void decrement_intensity()
{
output_high (CS);
output_high (UD);
output_low (inc);
delay_ms (50);
output_high (INC);
delay_ms (50);
output_low (INC);
}
void store_pot_value()
{
output_high (CS);
output_low (INC);
delay_ms (100);
output_low (CS);
}
void main()
{
float result;
char a;
char b;
char incoming[50];
char *ptr2;
char *ptr = 0;
float mantissa;
char error_read;
float measurement;
unsigned int exit_loop =0;
char count;
output_low (RELAY_A);
output_low (RELAY_B);
output_low (BUZZER);
output_low (LED);
do
{
select_relay();
exit_loop = 0;
delay_ms(2000);
delay_ms(2000);
delay_ms(2000);
set_up_digilux();
delay_ms(1000);
do
{
do
{
putc('S');
delay_ms(5);
putc('T');
putc(13);
// delay_ms(5);
a=0;
b=0;
do
{
a=getch();
incoming[b++] = a;
} while (a !=13 & b<40);
error_read = (incoming[19] - 0x30);
}while((incoming[1] != 'S' && incoming [2] != 'T') || bit_set(error_read,0));
ptr2 = incoming + 4;
result = strtod(ptr2,&ptr);
a = (incoming[12] - 0x30) * 10;
a += (incoming[13] - 0x30);
mantissa = pow(10,a);
if (incoming[11] == '-')
result /= mantissa;
else
result *= mantissa;
// read_measurement(measurement);
measurement = 0;
measurement = result - TARGET_VALUE;
if(measurement < VARIANCE1)
increment_intensity();
else if(measurement > VARIANCE2)
decrement_intensity();
else
do
{
delay_ms(40000);
do
{
do
{
putc('S');
delay_ms(5);
putc('T');
putc(13);
// delay_ms(5);
a=0;
b=0;
do
{
a=getch();
incoming[b++] = a;
} while (a !=13 & b<40);
error_read = (incoming[19] - 0x30);
}while((incoming[1] != 'S' && incoming [2] != 'T') || bit_set(error_read,0));
ptr2 = incoming + 4;
result = strtod(ptr2,&ptr);
a = (incoming[12] - 0x30) * 10;
a += (incoming[13] - 0x30);
mantissa = pow(10,a);
if (incoming[11] == '-')
result /= mantissa;
else
result *= mantissa;
measurement = 0;
measurement = result - TARGET_VALUE;
// read_measurement(measurement);
if (measurement < VARIANCE1)
increment_intensity();
else if (measurement > VARIANCE2)
decrement_intensity();
else
exit_loop = true;
if(abs(measurement) > 0.1)
delay_ms(200);
else if (abs(measurement) > 0.05)
delay_ms(500);
else
delay_ms(1000);
}while (!exit_loop);
}while (!exit_loop);
if(abs(measurement) > 0.1)
delay_ms(200);
else if (abs(measurement) > 0.05)
delay_ms(500);
else
delay_ms(1000);
}while (!exit_loop);
exit_loop = 0;
store_pot_value();
count = 0;
do
{
output_high (BUZZER);
delay_ms(25);
output_low (BUZZER);
delay_ms(100);
count = count + 1;
} while (count < 6);
output_high (LED);
do
{
output_low (RELAY_A);
output_low (RELAY_B);
}while (input(START_UP));
}while (!input(START_UP));
}