lecutus
Joined: 12 Aug 2009 Posts: 40
|
So why bother with all these other input/output pins? |
Posted: Fri Oct 16, 2009 4:05 pm |
|
|
In my case I'm using rs232 for input/output. So why bother with all these other input/output pins?
Second question. The proper use of input_a or the strategy of port = input_a(). Why? This can be found in get_swi_status(), it's listed at the very bottom of this post.
I inherited this program, and I'm in the middle of a rewrite. I usually write at a higher level, not to say i'm a bad [spam] or anything, it's more like fourth gen languages like C++, C#, and Delphi. So this bit shifting thing is still a little new. I've received extremely helpful advice from this site.
Here we go again.
I am using PCWHD 4.079
The Preprocessor:
Code: | #include <18F258.h>
//#fuses HS,PROTECT,NOLVP,WDT32,nowdt// original
#fuses HS,PROTECT,NOLVP,nowdt,brownout,BORV42,noprotect
#use delay(clock=20000000)
#use rs232(baud=115200, xmit=PIN_C6, rcv=PIN_C7, stream=rs_str) // Jumpers: 8 to 11, 7 to 12
#include <can-18xxx8.c>
#byte pir1=0x0F9E
#define TMR1iF 0X00
#rom int 0xf00000={0x00,0x00,0x00,0x00}
#define offset_id 0x00
#define offset_e 0x02// original
#define offset_t 0x03// original
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <input.c>
//char* str1;
//char str1[100];
int1 tf_rs232=false,tf_data_ok=false,tf_send_can=false,tf_send_232=false,tf_lube_ovr=false;
int8 swi_status=0,loop_cnt=0,conv_lok,req_gear; //buffer counter
int8 sel_gear,cur_gear,gear, fuel_psi,oil_psi,water,rm_volts,rm_hrs,alr_pump,fmi,spn_count=0,fmi_count=0,k_char,x=0;
int buffer[8],rx_len,rxstat;
int16 rpm,outspeed,inspeed,pressure_out,lube_psi,lube_temp,pressure_max,crpm,volts,injt_psi,spn,x_cnt;
int32 rx_id,rx_ad,hrs;
float bpm;
//int16 rpm_rs=740,ov_press_rs=7500,pump_id=0,id_num; //original
int16 rpm_rs=740,ov_press_rs=750,pump_id=0,id_num;
int8 swi_rs=0,gear_rs=124,cnt_send_can=0,engine=0,trans=0;
|
PIC18F258 Pins used
PIN_C6 transmit via rs232/serial
Used by: Rs232()
PIN_C7 Receive via rs2232/serial
Used by: Rs232()
pin_b4
Set high & low
Digital I/O, interrupt-on-change pin
Used by: RS232()
pin_b5
Set high & low
Digital I/O, interrupt-on-change pin, Low-voltage ICSP programming enable
Used by: ck_rs232()
pin_c4
if (!input(pin_c4)) rx_id=300; //remote swi interface C4=0
if (input(pin_c4)) rx_id=301; //local switch interface C4=1
Digital I/O
Used by: send_swi_status()
The context/modules in which they're used
Code: | void RS232()
{
//printf("inside RS232()>>>>>>");line_feed();
output_low(pin_b4);//for blinking light?
printf("I%04lu",id_num);
rpm=rpm>>3; //rpm
printf("R%04lu",rpm);
switch (cur_gear) //gear
{
case (124) : gear = 1; printf("G0%u", gear); break;
case (125) : gear = 2; printf("G0%u", gear); break;
case (126) : gear = 3; printf("G0%u", gear); break;
case (127) : gear = 4; printf("G0%u", gear); break;
case (128) : gear = 5; printf("G0%u", gear); break;
case (129) : gear = 6; printf("G0%u", gear); break;
case (130) : gear = 7; printf("G0%u", gear); break;
case (131) : gear = 8; printf("G0%u", gear); break;
case (132) : gear = 9; printf("G0%u", gear); break;
case (133) : gear = 10; printf("G%u", gear); break;
default : {}; break;
}
//oil pressure
printf("O%03u", oil_psi);
//water temp
printf("C%03u",water);
//battery volts
printf("V%02lu.%u", volts, rm_volts);
//pump speed
printf("W%04lu",outspeed);
//fuel pressure
printf("F%03u", fuel_psi);
//convertor lock
printf("L%u",conv_lok);
//ov pressure set
printf("S%05lu", pressure_max);
//pump output pressure
if (pressure_out>15000) pressure_out=15000;
printf("P%05lu", pressure_out);
//pump lube pressure
printf("X%03lu", lube_psi);
//pump lube temperature
printf("Y%03lu", lube_temp);
//barrels per min
if (bpm<1) printf("B0%02.2f",bpm);
if ((bpm>=1)&&(bpm<10)) printf("B0%2.2f",bpm);
if (bpm>=10) printf("B%2.2f",bpm);
//engine hrs
printf("H%05lu", hrs);
printf("E01T01");//this is how to dummy the info
//diagnostics spn
printf("D%04lu", spn);
//diagnostics fmi
//printf("Z%04lu",pump_id);
printf("_%02u", fmi);
printf("!\r\n"); //delimiter
tf_send_232=false;
output_high(pin_b4);
//printf("LEAVING RS232()<<<<<<<<<<");
line_feed();
}
void ck_rs232()
{
int1 val;
//int8 x, k;
val = kbhit();
// printf(">>>> ENTERING ck_rs232() kbhit = %u >>>>>>", val ); line_feed();
if (kbhit() /*|| getc()== '!'*/ )
{
k_char=getc();
//printf("k_char=%c" , k_char); line_feed();
if (k_char =='!' || k_char == 0x21) // ! = exclamation = 0x21
{
tf_rs232=true;
//printf("tf_RS232 = %u", tf_RS232,);line_feed();
x=0; x_cnt=0;
tf_data_ok=false;
output_low(pin_b5);
}
if ((k_char=='i') | (k_char=='I'))
{get_setup();}
}
if (tf_rs232)
{
//get_info_rs232_2();
get_info_rs232_3();
tf_rs232=false;
//tf_data_ok=true;
output_high(pin_b5); // this maybe it!!!!!!!!!!!!! Nope leave alone
}
}
void send_swi_status()
{
if (tf_send_can) //if true send this data via
{
buffer[0]=swi_rs; //swi status packet
buffer[1]=0x00;
buffer[2]=*(&rpm_rs);
buffer[3]=*(&rpm_rs+1);
buffer[4]=*(&ov_press_rs);
buffer[5]=*(&ov_press_rs+1);
buffer[6]=gear_rs;
buffer[7]=0xff;
}
else //else only send swi_status
{
buffer[0]=swi_status;
buffer[1]=0x00;
buffer[2]=0xff;
buffer[3]=0xff;
buffer[4]=0xff;
buffer[5]=0xff;
buffer[6]=0xff;
buffer[7]=0xff;
}
if (tf_lube_ovr) buffer[1]=0x08; //bit4 buffer[1]=1 to override auto lube
if (!input(pin_c4)) rx_id=300; //remote swi interface C4=0
if (input(pin_c4)) rx_id=301; //local switch interface C4=1
rx_id=rx_id<<8;
can_putd(rx_id,&buffer[0],8,1,TRUE,FALSE);
if (tf_send_can) cnt_send_can++; //setup to send 232 data 3 times
if (cnt_send_can==3) tf_send_can=false; //then revert to normal mode
}
void get_swi_status()
{
int8 port;
swi_status=0; //assume all switches off
tf_lube_ovr=0; //assume lube override=false
port=input_a();
delay_ms(1);
if (!bit_test(port,0)) swi_status=1; //throttle up
if (!bit_test(port,1)) swi_status=2; //throttle down
if (!bit_test(port,2)) swi_status=3; //shift up
if (!bit_test(port,3)) swi_status=4; //shift down
if (!bit_test(port,4)) swi_status=5; //max up
if (!bit_test(port,5)) swi_status=6; //max down
port=input_c();
delay_ms(1);
if (!bit_test(port,0)) swi_status=7; //start
if (!bit_test(port,1)) swi_status=8; //stop
if (!bit_test(port,2)) swi_status=9; //e-stop
if (!bit_test(port,3)) swi_status=10;//neutral/idle
if (!bit_test(port,5)) tf_lube_ovr=true; //lube override=true;
}
|
Thanks L. |
|