| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| lecutus 
 
 
 Joined: 12 Aug 2009
 Posts: 40
 
 
 
			    
 
 | 
			
				| Trying to understand how  information is passed to and from |  
				|  Posted: Fri Sep 11, 2009 3:00 pm |   |  
				| 
 |  
				| Trying to understand how  information is passed to and from a PIC18F258. 
 I'm using rs-232 as the means of transmission.  I've looked at the pin diagram, PIN 17/ C6/RC6/TX/CK and PIN18/C7/RC7/RX/DT are the trans  and recv respectively. But the program I inherited this project so I'm trying to educate myself in this format as much as possible. The program uses couple of mechanisms that I need to clarify, for my benefit.
 
 Pins b4 are used in rs232() and ck_rs232() in output_low mode and output_high.
 
 I've read on the use of getc and how its tied to the RCV, which I think would be pin18, in this case. Is this correct? The getc is used with srt1, a char variable array: used in get_input_232().
 
 Next question, the use of kbhit(), I've looked at the C Compiler book, pg.117 built in functions, and the explanation is very sparse. How is it tied to getc()?
 
 The output seems to work, but to be through. I don't see at all in the program, where the  output goes to, pin wise. I have printfs scattered through the  program to check the behaviour of the program. The printf's work.
 
 
 
 Now for the program snippets that are in question:
 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)  // 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 <stdlib.h>
 #include <stdio.h>
 #include <input.c>
 
 int8 swi_status=0,loop_cnt=0,/*tmp_port,*/conv_lok,req_gear;       //buffer counter
 int8 sel_gear,cur_gear,gear, fuel_psi,oil_psi,water;
 int buffer[8],rx_len,rxstat;
 int32 rx_id,rx_ad,hrs;
 int1 tf_lube_ovr=false/*tf_send_status=false, tf_eng_run=false*/;
 //int1 tf_psi_lo=false,tf_temp_hi=false;
 
 int16 rpm,outspeed,inspeed,pressure_out,lube_psi,lube_temp;
 int16 pressure_max,crpm,volts,injt_psi,spn/*rpm_pre,rpm_total=0,rpm_temp*/;
 float bpm;
 int8 rm_volts,rm_hrs,alr_pump,fmi, spn_count=0,fmi_count=0/*,rpm_cnt*/;
 //int32 spn_fmi;
 int8 k_char,x=0;
 int16 x_cnt;
 int1 tf_rs232=false,tf_data_ok=false,tf_send_can=false,tf_send_232=false;
 char str1[30];
 //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;
 
 
 
 | 
 
 The sections  I'm having trouble with:
 
  	  | Code: |  	  | void get_input_232(char* s, int8 max)
 {
 int len;
 char c;
 --max;
 len=0;
 
 printf("inside   get_input_232() >>>>>>>>.........>>>>>>");  line_feed();
 /*do {
 restart_wdt();
 c = getc();
 printf("c =  %x in hex  %d in dec %c in char",c,c,c );line_feed();
 if(c==8)// Backspace= bs = 0x08
 {
 if(len>0)
 {
 len--;
 putc(c);
 putc(' ');
 putc(c);
 }
 }
 else if ((c>=' ')&&(c<='~'))
 if(len<max)
 {
 s[len++]=c;
 //putc(c);
 }
 } while(c!=38);// & = ampersans = 0x26*/
 
 
 
 //while(c!=38);// & = ampersans = 0x26 = 38 // orginal
 while(c!= '&');
 {
 restart_wdt();
 c = getc();
 printf("c =  %x in hex  %d in dec %c in char",c,c,c );line_feed();
 if(c==8)// Backspace= bs = 0x08
 {
 if(len>0)
 {
 len--;
 putc(c);
 putc(' ');
 putc(c);
 }
 }
 else if ((c>=' ')&&(c<='~'))// '  ' = space = 0x20, '~' = tilde = 0x7e
 if(len<max)
 {
 s[len++]=c;
 //putc(c);
 }
 }
 
 s[len]=0;
 printf("LEAVING  get_input_232()<<<    S=%s  <<<<<<<<<<", s);  line_feed();
 }
 
 void ck_rs232()
 {
 int1 val;
 val = kbhit();
 printf(">>>> ENTERING ck_rs232() kbhit = %u >>>>>>",  val  );   line_feed();
 if (kbhit())
 {
 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();}
 }
 
 //tf_rs232 = true;
 printf("XXX tf_rs232=%U xxx",tf_rs232);   line_feed();
 if (tf_rs232)
 {
 //printf("B4 -- str1=%S --",str1);   line_feed();
 get_input_232(str1, 30);
 printf("afta -- str1 = %S",str1);   line_feed();
 tf_rs232=false;
 tf_data_ok=true;
 output_high(pin_b5);
 //x=0;while (x<24) {putc(str1[x]);x++;}
 }
 
 printf("<<< LEAVING ck_rs232()^^^ tf_rs232= %u  tf_data_ok= %u <<<<<", tf_rs232, tf_data_ok );   line_feed();
 }
 
 void process_rs232()
 {
 //char r[5],g[5],op[6],sw[5],id[5];// this also shows original order
 char id[5],r[5],g[5],op[6],sw[5];
 int8 x1=0;
 tf_data_ok=false;
 //printf("ENTERING   process_rs232() ^^^^^^^");   line_feed();
 x=0;x1=0;
 printf("str1 = %S",str1);   line_feed();
 // 0x2f  = '/' = forward slash, < 0-9 are between these symbols >, 0x3a = ':' = colon  0x3b = ';' = semicolon;
 while (str1[x1]<0x3a)//get pump_id string
 {
 x1++;
 if (str1[x1]>0x2f) {id[x]=str1[x1];x++;x1++;}
 }
 id[x]=0;  //add null to end of string
 pump_id=atol(id);
 printf(" ID=%lu, RPM=%lu Gear=%u OP=%lu SWI=%u \r\n",pump_id, rpm_rs,gear_rs,ov_press_rs,swi_rs);
 
 //if (pump_id == id_num)
 //{
 x=0;x1++;
 while (str1[x1]<0x3a)
 {
 if (str1[x1]>0x2f)  {g[x]=str1[x1];x++;x1++;}
 }//get gear string
 g[x]=0;   //add null to end of string
 
 x=0;x1++;
 while (str1[x1]<0x3a)
 {
 if (str1[x1]>0x2f) {op[x]=str1[x1];x++;x1++;}
 } //get over pressure string
 op[x]=0;    //add null to end of string
 
 x=0;x1++;
 while (str1[x1]<0x3a)
 {
 if (str1[x1]>0x2f) { sw[x]=str1[x1];x++;x1++;}
 } //get switch status string
 sw[x]=0;  //add null to end of string
 
 x=0;x1++;
 while (str1[x1]<0x3a)
 {
 if (str1[x1]>0x2f)  {r[x]=str1[x1];x++;x1++;}   //get rpm string
 }
 r[x]=0; //add null to end of string
 
 
 // pump_id=atol(id);
 rpm_rs=atol(r);      //convert string to number
 gear_rs=atoi(g);
 ov_press_rs=atol(op);
 swi_rs=atoi(sw);
 //pump_id=atol(id); // original place
 printf(" ID=%lu, RPM=%lu Gear=%u OP=%lu SWI=%u \r\n",pump_id, rpm_rs,gear_rs,ov_press_rs,swi_rs);
 if (pump_id==id_num)
 {
 tf_send_can=true;   //set true to send received command via j1939
 cnt_send_can=0;     //init number of times to send j1939 packet with 232 com.
 tf_send_232=true;   //set true to return data string
 }
 }
 
 
 void ck_j1939_input()
 {
 int16 a;
 printf("inside  ck_j1939_input() >>>>>>");  line_feed();
 if (can_kbhit())
 {
 restart_wdt();
 can_getd(rx_id, &buffer[0],rx_len,rxstat);
 rx_ad=rx_id&0x000000Ff;       //get source address
 if (rx_ad==05) req_gear=buffer[2];   //if source address=05 buffer[2]=req_gear;
 if (rx_ad==44) {crpm=crpm=make16(buffer[2],buffer[1]); //store req spd buffer
 crpm=crpm>>3;               //calculate speed received rpm/8
 }
 rx_id=rx_id&0x00ffff00;  //mask out irrevllant data
 rx_id=rx_id>>8;          //shift data to right 8 times
 printf("rx_id = %4lu", rx_id);
 switch (rx_id)
 {
 case (61442) : {conv_lok=buffer[0] & 0x04;
 outspeed=make16(buffer[2],buffer[1]);
 outspeed=outspeed>>3;            //divide by 8
 inspeed=make16(buffer[6],buffer[5]);
 inspeed=inspeed>>3;              //divide by 8
 }break;
 
 case (65226) : {fmi=buffer[4]&0x1f;
 spn=buffer[2];
 spn_count = 20;
 fmi_count = 20;
 }break;
 
 case (61444) : {*(&rpm)=buffer[3];
 *(&rpm+1)=buffer[4];
 }
 break;                 //correct by dividing by 8
 
 case (61445) : {sel_gear=buffer[0];
 cur_gear=buffer[3];}break;
 
 case (65271) : {volts=make16(buffer[5],buffer[4]);
 rm_volts=(volts%20)>>1;volts=volts/20;
 }break;
 
 case (65263) : {a=(long)buffer[3]*58;oil_psi=a/100;
 a=(long)buffer[0]*58;fuel_psi=a/100;}break;
 
 case (65262) : {a=buffer[0]-40;
 a=(long)a*9;
 a=a/5;
 water=a+32;}break;
 
 case (65253) : {hrs=make32(buffer[3],buffer[2],buffer[1],buffer[0]);
 rm_hrs=(hrs%20)>>1;hrs=hrs/20;
 }break;
 
 case(65143)  : {pressure_out=make16(buffer[1],buffer[0]);
 lube_psi=make16(buffer[3],buffer[2]);
 lube_temp=make16(buffer[5],buffer[4]);
 }break;
 
 case(302)    : pressure_max=make16(buffer[1],buffer[0]);break;
 
 case(303)    :{alr_pump=buffer[0];
 *(&bpm)=buffer[1];
 *(&bpm+1)=buffer[2];
 *(&bpm+2)=buffer[3];
 *(&bpm+3)=buffer[4];
 if (bpm>99) bpm=0;}break;
 
 case (65243) : {*(&injt_psi) =buffer[2];
 *(&injt_psi+1)=buffer[3];
 injt_psi = (injt_psi*58)/100;}
 break;
 
 default :{//spn=0;
 };
 }
 }
 printf("LEAVING   ck_j1939_input() <<<<<<<<<<"); line_feed();
 }
 
 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");
 //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_spn_fmi()
 {
 if (spn_count > 0) spn_count--; else spn = 0;
 if (fmi_count > 0) fmi_count--; else fmi = 99;
 }
 
 void main()
 {
 int1 va;
 int8 while_cnt=0;
 //line_feed();
 printf(".......inside main XXXXXX>>>>>>>>>>>>XXXX");     line_feed();
 
 set_tris_a(0xff);
 set_tris_c(0xBF);
 setup_timer_1(t1_internal|t1_div_by_8);  //setup timer #1
 can_init();                    //init can module
 setup_wdt(wdt_on);
 set_timer1(0xBDC);             //init timer #1
 printf("b4 pir1 = %x, tmr1if = %x ",pir1,tmr1if );  line_feed();
 bit_clear(pir1,tmr1if);
 printf("afta  pir1 = %x, tmr1if = %x ",pir1,tmr1if );  line_feed();
 //printf("just b4 read_E_data");line_feed();
 read_e_data();  //reads stored values from eeprom
 //printf("just afta read_E_data");line_feed();
 
 while(TRUE)
 {
 //printf("ENTERING  >>>>>>>>>>>>>> , inside while (true)"); line_feed();
 line_feed();
 va = !bit_test(pir1,tmr1if);
 printf("!Bit_test = value = %x, pir1 = %x, tmr1if = %x ", va,pir1,tmr1if );  line_feed();
 printf("ENTERING   small while");line_feed();
 while (!bit_test(pir1,tmr1if))    //sample j1939 rX for 100ms, original
 {
 printf("while_cnt = %u",++while_cnt);   line_feed();
 printf("!Bit_test = value = %x, pir1 = %x, tmr1if = %x ", !bit_test(pir1,tmr1if),pir1,tmr1if );  line_feed();
 ck_j1939_input();
 ck_rs232();
 printf("AFTA CHECKING !Bit_test = value = %x, pir1 = %x, tmr1if = %x ", !bit_test(pir1,tmr1if),pir1,tmr1if );  line_feed();
 
 }
 printf("LEAVING  small while");line_feed();
 printf("vvvvvv afta checking tf_data_ok=%u , tf_send_232=%u",tf_data_ok,tf_send_232);line_feed();
 while_cnt = 0;
 tf_data_ok = true;
 if (tf_data_ok) //PROCESS RS232 IF DATA IS OK
 {
 process_rs232();
 }
 //tf_send_232 = true;
 if (tf_send_232)//SEND DATA STRING AFTER ANALYZING RS232 COMMANDS
 {
 //process_rs232();//
 rs232();
 }
 // printf("^^^^^^^^^^^^^^^^^^^^^^  tf_data_ok=%u , tf_send_232=%u",tf_data_ok,tf_send_232);line_feed();
 loop_cnt++;
 ck_spn_fmi();
 if (loop_cnt>=3)          //send swi status every 300ms
 {
 get_swi_status();
 send_swi_status();
 loop_cnt=0;
 }
 
 set_timer1(0xBDC);           //init timer #1
 printf("at the end b4 clear----- pir1 = %u ,tmr1if  = %u",pir1,tmr1if); line_feed();
 bit_clear(pir1,tmr1if);
 printf("at the end afta clear----- pir1 = %u ,tmr1if  = %u",pir1,tmr1if); line_feed();
 //printf("leaving <<<<<<< inside while (true)");
 //line_feed();
 
 }
 printf(".........LEAVING main <<<XXXXXXXXXXXX");  line_feed();
 }
 | 
 
 Map of the trouble:
 
 When in main(),  the “while (!bit_test(pir1,tmr1if)”, does go into the ck-j1939 and the ck_rs232, but nothing happens. If nothing happens here, the rest is not turned on to do any processing.
 
 It all seems pretty straight forward, send an info packet, to the Pic18F258, it send along the CANBUS route to the engine, engine sends its form of info packet back to the PIC18F258. This information is then sent, via rs232, to a computer for further processing.
 
 Form of the packets:
 
 sent from from computer to PIC to CANBUS/J1939 is:
 Packet format looks like this:
 !!!5000 ;2000;125;7400;0&&&
 !!!.TRUCK_ID:rpm;gear;over_pressure_setpt;switch_status&&&
 
 sent from CANBUS/J1939 to PIC to computer   is:
 
 I5000R0740G02O099C060V23.3W2442F099L4S00500P00000X126Y057B27.10H65253E01T01D0000_99!
 
 The above form/packet is defined in rs232().
 
 
 I'm using PIC18F258 and PCHWD 4.079
 
 There other parts to this program, but I left them out as  I didn't feel they were germain to the problem. For completeness I will post the the entire thing  seperately for completeness.
 
 Thanks.
 
 L.
 |  |  
		|  |  
		| lecutus 
 
 
 Joined: 12 Aug 2009
 Posts: 40
 
 
 
			    
 
 | 
			
				| The entire progam |  
				|  Posted: Fri Sep 11, 2009 3:03 pm |   |  
				| 
 |  
				| Here it is folks in all its gore. 
 
 
  	  | Code: |  	  | 
 //X361 RS232 THRL_SHFT
 //
 //PROGRAM TO SEND SWITCH STATUS TO LOCAL CONTROL
 //
 //WAITS FOR REQUEST FROM LOCAL CONTROL
 //    PGN300 IF LOCAL SWITCHES
 //        BUFFER[0] SWI STATUS
 //        BUFFER[1] PLUNGER LUBE AUTO/MAN
 //     IF BUFFER[2,3] LESS THAN 0XFF THEN VALUE IS REQUESTED RPM
 //     IF BUFFER[4,5] LESS THAN 0XFF THEN VALUE IS REQESTED OVER PRESSURE
 //     IF BUFFER[6] LESS THAN 0XFF THEN VALUE IS REQESTED GEAR
 //        BUFFER[7] NOT USED
 //    PGN301 IF REMOTE SWITCHES
 //
 //
 // 0=NO ACTIVITY
 // 1=THROTTLE UP
 // 2=THROTTLE DOWN
 // 3=SHIFT UP
 // 4=SHIFT DOWN
 // 5=SET PRESSURE UP
 // 6=SET PRESSURE DONW
 // 7=START ENGINE
 // 8=STOP ENGINE
 // 9=E-STOP ENGINE
 //10=NEUTRAL & IDLE ENGINE
 //11=SPARE#1
 //12=SPARE#2
 // 01/30/07 clean up problem with momentary rpm going to 0000
 //          missing break after spn detection
 //01/20/09 eliminate the retrun of rpm/gear/ovp/swi
 //         add E and T for eng and trans equiped
 //01/31/09 add id to incoming string
 //7.23.09 - added id parse routine id_num at the begining to keep truks other than the one
 // that's suppose to have info
 //7.31.09 - checking all routines for protocol, form, and definitions
 //8.03.09 - From this date on there will be modification no tof the orignal plan
 //8.13.09 - Reached out to CCS community for help. Going to save this as reference
 //  still having conversion problems - X361 RS232 THRL_SHFT_ID.N.0803.2
 //8.13.09 -  using X361 RS232 THRL_SHFT_ID.N.0813.09.1
 //8.14.09 - Fixed the ID, engine, and trans id's they stick. Now working on Id matching truck/pump id
 //   to process the rest of the input
 
 
 #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)  // 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 <stdlib.h>
 #include <stdio.h>
 #include <input.c>
 
 int8 swi_status=0,loop_cnt=0,/*tmp_port,*/conv_lok,req_gear;       //buffer counter
 int8 sel_gear,cur_gear,gear, fuel_psi,oil_psi,water;
 int buffer[8],rx_len,rxstat;
 int32 rx_id,rx_ad,hrs;
 int1 tf_lube_ovr=false/*tf_send_status=false, tf_eng_run=false*/;
 //int1 tf_psi_lo=false,tf_temp_hi=false;
 
 int16 rpm,outspeed,inspeed,pressure_out,lube_psi,lube_temp;
 int16 pressure_max,crpm,volts,injt_psi,spn/*rpm_pre,rpm_total=0,rpm_temp*/;
 float bpm;
 int8 rm_volts,rm_hrs,alr_pump,fmi, spn_count=0,fmi_count=0/*,rpm_cnt*/;
 //int32 spn_fmi;
 int8 k_char,x=0;
 int16 x_cnt;
 int1 tf_rs232=false,tf_data_ok=false,tf_send_can=false,tf_send_232=false;
 char str1[30];
 //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;
 
 void line_feed()
 {printf("\r\n");}
 
 void read_e_data()   //reads stored values from eeprom
 {
 int8 count=0,address=0;
 int8 e_data[4]; //original
 
 for(address=0; address<=4; ++address)
 {  e_data[count++]=READ_EEPROM(address); } // LOADS E_DATA ARRAY, then feeds the parts
 //printf(" id_num=e_data[0]=%u,id_num=e_data[1]=%u,  engine=e_data[2]=%u, trans=e_data[3]=%u, count=%u",e_data[0],e_data[1],e_data[2], e_data[3], count);
 //line_feed();
 id_num=make16(e_data[1],e_data[0]);
 engine=e_data[2];
 trans=e_data[3];
 printf(" Id_Num= %04lu  Engine=%02u Trans=%02u",id_num,engine,trans);
 line_feed();
 }
 
 
 void write_eeprom_16bit(int offset, int16 data)
 {
 int8 i;
 for (i=0;i<2;i++)
 {
 write_eeprom(i+offset,*((char *)&data + i));
 printf("i=%u, offset=%u, data =%lu",i, offset , data);
 line_feed();
 read_e_data();
 }
 }
 
 void write_eeprom_16bit_1(int offset, int16 data)
 {
 int8 data_lsb, data_msb;
 data_msb = make8(data,1); // gets msb of data
 data_lsb = make8(data,0); // gets lsb of data
 
 write_eeprom(offset, data_lsb);
 write_eeprom(offset+1, data_msb);
 
 printf("data_msb=%u, data_lsb=%u, offset=%u, data =%lu",data_msb, data_lsb, offset , data);
 line_feed();
 
 //read_e_data();
 
 }
 
 void write_data()  //store operating prarmeters in eeprom
 {
 printf(" inside  write_data()");
 line_feed();
 write_eeprom_16bit_1(offset_id,id_num);// this works
 //write_eeprom_16bit(offset_id,id_num); //this works too!!!!
 printf(" write_eeprom_16bit - offset_id=%u ,id_num=%lu ", offset_id,id_num);
 line_feed();
 
 write_eeprom(offset_e,engine);// orginal
 printf(" write_eeprom - offset_e=%u ,engine=%02u ", offset_e,engine);
 line_feed();
 write_eeprom(offset_t,trans);//original
 printf(" write_eeprom - offset_t=%u ,trans=%u ", offset_t,trans);
 line_feed();
 printf(" LEAVING write_data()");
 line_feed();
 }
 
 void get_setup()
 {
 //printf("get_setup()>>>>>>>>>>>>>>>>>>>>>>>");
 //line_feed();
 setup_wdt(wdt_off);
 line_feed();
 printf("ID=");    //enter id number for pumper
 id_num = get_long(); //orignal statement
 
 line_feed();
 printf("Cat=01 Cummins=02 Detroit=03 Enter Engine Number=");
 //printf("crap");
 
 engine = get_int();
 line_feed();
 printf("engine=%02u", engine);
 line_feed();
 
 printf("Cat=01 Twin Disk=02 Allison=03 Enter Trans Number=");
 trans = get_int();
 line_feed();
 printf("trans=%02u",trans);
 
 line_feed();
 write_data();//<<<<<<<<<<<<<<<<<<<<<<<<<<
 printf("Id_Num= %04lu  Engine=%02u Trans=%02u",id_num,engine,trans);
 line_feed();
 //setup_wdt(wdt_on);
 //printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<LEAVING get_setup()");
 //line_feed();
 setup_wdt(wdt_on);
 }
 
 //From this point up, all worx don't touch.
 
 void get_input_232(char* s, int8 max)
 {
 int len;
 char c;
 --max;
 len=0;
 
 printf("inside   get_input_232() >>>>>>>>.........>>>>>>");  line_feed();
 /*do {
 restart_wdt();
 c = getc();
 printf("c =  %x in hex  %d in dec %c in char",c,c,c );line_feed();
 if(c==8)// Backspace= bs = 0x08
 {
 if(len>0)
 {
 len--;
 putc(c);
 putc(' ');
 putc(c);
 }
 }
 else if ((c>=' ')&&(c<='~'))
 if(len<max)
 {
 s[len++]=c;
 //putc(c);
 }
 } while(c!=38);// & = ampersans = 0x26*/
 
 
 
 //while(c!=38);// & = ampersans = 0x26 = 38 // orginal
 while(c!= '&');
 {
 restart_wdt();
 c = getc();
 printf("c =  %x in hex  %d in dec %c in char",c,c,c );line_feed();
 if(c==8)// Backspace= bs = 0x08
 {
 if(len>0)
 {
 len--;
 putc(c);
 putc(' ');
 putc(c);
 }
 }
 else if ((c>=' ')&&(c<='~'))// '  ' = space = 0x20, '~' = tilde = 0x7e
 if(len<max)
 {
 s[len++]=c;
 //putc(c);
 }
 }
 
 s[len]=0;
 printf("LEAVING  get_input_232()<<<    S=%s  <<<<<<<<<<", s);  line_feed();
 }
 
 void ck_rs232()
 {
 int1 val;
 val = kbhit();
 printf(">>>> ENTERING ck_rs232() kbhit = %u >>>>>>",  val  );   line_feed();
 if (kbhit())
 {
 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();}
 }
 
 //tf_rs232 = true;
 printf("XXX tf_rs232=%U xxx",tf_rs232);   line_feed();
 if (tf_rs232)
 {
 //printf("B4 -- str1=%S --",str1);   line_feed();
 get_input_232(str1, 30);
 printf("afta -- str1 = %S",str1);   line_feed();
 tf_rs232=false;
 tf_data_ok=true;
 output_high(pin_b5);
 //x=0;while (x<24) {putc(str1[x]);x++;}
 }
 
 printf("<<< LEAVING ck_rs232()^^^ tf_rs232= %u  tf_data_ok= %u <<<<<", tf_rs232, tf_data_ok );   line_feed();
 }
 
 void process_rs232()
 {
 //char r[5],g[5],op[6],sw[5],id[5];// this also shows original order
 char id[5],r[5],g[5],op[6],sw[5];
 int8 x1=0;
 tf_data_ok=false;
 //printf("ENTERING   process_rs232() ^^^^^^^");   line_feed();
 x=0;x1=0;
 printf("str1 = %S",str1);   line_feed();
 // 0x2f  = '/' = forward slash, < 0-9 are between these symbols >, 0x3a = ':' = colon  0x3b = ';' = semicolon;
 while (str1[x1]<0x3a)//get pump_id string
 {
 x1++;
 if (str1[x1]>0x2f) {id[x]=str1[x1];x++;x1++;}
 }
 id[x]=0;  //add null to end of string
 pump_id=atol(id);
 printf(" ID=%lu, RPM=%lu Gear=%u OP=%lu SWI=%u \r\n",pump_id, rpm_rs,gear_rs,ov_press_rs,swi_rs);
 
 //if (pump_id == id_num)
 //{
 x=0;x1++;
 while (str1[x1]<0x3a)
 {
 if (str1[x1]>0x2f)  {g[x]=str1[x1];x++;x1++;}
 }//get gear string
 g[x]=0;   //add null to end of string
 
 x=0;x1++;
 while (str1[x1]<0x3a)
 {
 if (str1[x1]>0x2f) {op[x]=str1[x1];x++;x1++;}
 } //get over pressure string
 op[x]=0;    //add null to end of string
 
 x=0;x1++;
 while (str1[x1]<0x3a)
 {
 if (str1[x1]>0x2f) { sw[x]=str1[x1];x++;x1++;}
 } //get switch status string
 sw[x]=0;  //add null to end of string
 
 x=0;x1++;
 while (str1[x1]<0x3a)
 {
 if (str1[x1]>0x2f)  {r[x]=str1[x1];x++;x1++;}   //get rpm string
 }
 r[x]=0; //add null to end of string
 
 // putc(10);putc(13);
 //x=0;while (x<strlen(r)) {putc(r[x]);x++;} putc(10);putc(13);
 //x=0;while (x<strlen(g)) {putc(g[x]);x++;} putc(10);putc(13);
 //x=0;while (x<strlen(op)) {putc(op[x]);x++;} putc(10);putc(13);
 //x=0;while (x<strlen(sw)) {putc(sw[x]);x++;} putc(10);putc(13);
 // pump_id=atol(id);
 rpm_rs=atol(r);      //convert string to number
 gear_rs=atoi(g);
 ov_press_rs=atol(op);
 swi_rs=atoi(sw);
 //pump_id=atol(id); // original place
 printf(" ID=%lu, RPM=%lu Gear=%u OP=%lu SWI=%u \r\n",pump_id, rpm_rs,gear_rs,ov_press_rs,swi_rs);
 if (pump_id==id_num)
 {
 tf_send_can=true;   //set true to send received command via j1939
 cnt_send_can=0;     //init number of times to send j1939 packet with 232 com.
 tf_send_232=true;   //set true to return data string
 }
 }
 
 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;
 }
 
 void ck_j1939_input()
 {
 int16 a;
 printf("inside  ck_j1939_input() >>>>>>");  line_feed();
 if (can_kbhit())
 {
 restart_wdt();
 can_getd(rx_id, &buffer[0],rx_len,rxstat);
 rx_ad=rx_id&0x000000Ff;       //get source address
 if (rx_ad==05) req_gear=buffer[2];   //if source address=05 buffer[2]=req_gear;
 if (rx_ad==44) {crpm=crpm=make16(buffer[2],buffer[1]); //store req spd buffer
 crpm=crpm>>3;               //calculate speed received rpm/8
 }
 rx_id=rx_id&0x00ffff00;  //mask out irrevllant data
 rx_id=rx_id>>8;          //shift data to right 8 times
 printf("rx_id = %4lu", rx_id);
 switch (rx_id)
 {
 case (61442) : {conv_lok=buffer[0] & 0x04;
 outspeed=make16(buffer[2],buffer[1]);
 outspeed=outspeed>>3;            //divide by 8
 inspeed=make16(buffer[6],buffer[5]);
 inspeed=inspeed>>3;              //divide by 8
 }break;
 
 case (65226) : {fmi=buffer[4]&0x1f;
 spn=buffer[2];
 spn_count = 20;
 fmi_count = 20;
 }break;
 
 case (61444) : {*(&rpm)=buffer[3];
 *(&rpm+1)=buffer[4];
 }
 break;                 //correct by dividing by 8
 
 case (61445) : {sel_gear=buffer[0];
 cur_gear=buffer[3];}break;
 
 case (65271) : {volts=make16(buffer[5],buffer[4]);
 rm_volts=(volts%20)>>1;volts=volts/20;
 }break;
 
 case (65263) : {a=(long)buffer[3]*58;oil_psi=a/100;
 a=(long)buffer[0]*58;fuel_psi=a/100;}break;
 
 case (65262) : {a=buffer[0]-40;
 a=(long)a*9;
 a=a/5;
 water=a+32;}break;
 
 case (65253) : {hrs=make32(buffer[3],buffer[2],buffer[1],buffer[0]);
 rm_hrs=(hrs%20)>>1;hrs=hrs/20;
 }break;
 
 case(65143)  : {pressure_out=make16(buffer[1],buffer[0]);
 lube_psi=make16(buffer[3],buffer[2]);
 lube_temp=make16(buffer[5],buffer[4]);
 }break;
 
 case(302)    : pressure_max=make16(buffer[1],buffer[0]);break;
 
 case(303)    :{alr_pump=buffer[0];
 *(&bpm)=buffer[1];
 *(&bpm+1)=buffer[2];
 *(&bpm+2)=buffer[3];
 *(&bpm+3)=buffer[4];
 if (bpm>99) bpm=0;}break;
 
 case (65243) : {*(&injt_psi) =buffer[2];
 *(&injt_psi+1)=buffer[3];
 injt_psi = (injt_psi*58)/100;}
 break;
 
 default :{//spn=0;
 };
 }
 }
 printf("LEAVING   ck_j1939_input() <<<<<<<<<<"); line_feed();
 }
 
 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");
 //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 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 ck_spn_fmi()
 {
 if (spn_count > 0) spn_count--; else spn = 0;
 if (fmi_count > 0) fmi_count--; else fmi = 99;
 }
 
 void main()
 {
 int1 va;
 int8 while_cnt=0;
 //line_feed();
 printf(".......inside main XXXXXX>>>>>>>>>>>>XXXX");     line_feed();
 
 set_tris_a(0xff);
 set_tris_c(0xBF);
 setup_timer_1(t1_internal|t1_div_by_8);  //setup timer #1
 can_init();                    //init can module
 setup_wdt(wdt_on);
 set_timer1(0xBDC);             //init timer #1
 printf("b4 pir1 = %x, tmr1if = %x ",pir1,tmr1if );  line_feed();
 bit_clear(pir1,tmr1if);
 printf("afta  pir1 = %x, tmr1if = %x ",pir1,tmr1if );  line_feed();
 //printf("just b4 read_E_data");line_feed();
 read_e_data();  //reads stored values from eeprom
 //printf("just afta read_E_data");line_feed();
 
 while(TRUE)
 {
 //printf("ENTERING  >>>>>>>>>>>>>> , inside while (true)"); line_feed();
 line_feed();
 va = !bit_test(pir1,tmr1if);
 printf("!Bit_test = value = %x, pir1 = %x, tmr1if = %x ", va,pir1,tmr1if );  line_feed();
 printf("ENTERING   small while");line_feed();
 while (!bit_test(pir1,tmr1if))    //sample j1939 rX for 100ms, original
 {
 printf("while_cnt = %u",++while_cnt);   line_feed();
 printf("!Bit_test = value = %x, pir1 = %x, tmr1if = %x ", !bit_test(pir1,tmr1if),pir1,tmr1if );  line_feed();
 ck_j1939_input();
 ck_rs232();
 printf("AFTA CHECKING !Bit_test = value = %x, pir1 = %x, tmr1if = %x ", !bit_test(pir1,tmr1if),pir1,tmr1if );  line_feed();
 
 }
 printf("LEAVING  small while");line_feed();
 printf("vvvvvv afta checking tf_data_ok=%u , tf_send_232=%u",tf_data_ok,tf_send_232);line_feed();
 while_cnt = 0;
 //tf_data_ok = true;
 if (tf_data_ok) //PROCESS RS232 IF DATA IS OK
 {
 process_rs232();
 }
 tf_send_232 = true;
 if (tf_send_232)//SEND DATA STRING AFTER ANALYZING RS232 COMMANDS
 {
 //process_rs232();//
 rs232();
 }
 // printf("^^^^^^^^^^^^^^^^^^^^^^  tf_data_ok=%u , tf_send_232=%u",tf_data_ok,tf_send_232);line_feed();
 loop_cnt++;
 ck_spn_fmi();
 if (loop_cnt>=3)          //send swi status every 300ms
 {
 get_swi_status();
 send_swi_status();
 loop_cnt=0;
 }
 
 set_timer1(0xBDC);           //init timer #1
 printf("at the end b4 clear----- pir1 = %u ,tmr1if  = %u",pir1,tmr1if); line_feed();
 bit_clear(pir1,tmr1if);
 printf("at the end afta clear----- pir1 = %u ,tmr1if  = %u",pir1,tmr1if); line_feed();
 //printf("leaving <<<<<<< inside while (true)");
 //line_feed();
 
 }
 printf(".........LEAVING main <<<XXXXXXXXXXXX");  line_feed();
 }
 
 
 
 | 
 
 Thanks
 
 L.
 |  |  
		|  |  
		| asmboy 
 
 
 Joined: 20 Nov 2007
 Posts: 2128
 Location: albany ny
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Fri Sep 11, 2009 5:18 pm |   |  
				| 
 |  
				| you have a fuse set for NO_WDT 
 then you set up the WDT in main
 
 so these two lines of code are not something i think i would ever use together  in your "trouble code"
 
 restart_wdt();
 c = getc();
 
 what happens if NO RS-232 chars  come in during the wdt interval ?
 
 seems like an awfully strong cure for not using KBHIT(); function
 
 
  |  |  
		|  |  
		| ckielstra 
 
 
 Joined: 18 Mar 2004
 Posts: 3680
 Location: The Netherlands
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Sep 14, 2009 6:20 am |   |  
				| 
 |  
				| I wouldn't use the given code as a basis for new developments. It will take you lots of time trying to understand the original coder's intentions, especially because the code is poorly written, has a terrible layout, meaningless variable names and bugs. 
 Here is an example of a bug I spotted:
 This worked correctly in the v3 compiler but version4 handles this ANSI compliant and will calculate with a 16bit pointer, not with the 8bit pointer as intended. Correct code would now be: 	  | Code: |  	  | buffer[3]=*(&rpm_rs+1); 
 | 
 But as this is difficult to read code I would set up the whole function different and use a structure instead. 	  | Code: |  	  | buffer[3]=*(((int8*)&rpm_rs)+1); | 
 
 In my experience you will get faster and better results by rewriting the code. Take the known requirements and write a new program from scratch.
 |  |  
		|  |  
		| lecutus 
 
 
 Joined: 12 Aug 2009
 Posts: 40
 
 
 
			    
 
 | 
			
				| Where to go to see the latest technique of Compiler 4? |  
				|  Posted: Mon Sep 14, 2009 7:46 am |   |  
				| 
 |  
				| Where do I go to see the latest technique of Compiler 4? 
 As ckielstra pointed out rewriting to the code is best. But the question remains, how is information in general passed to and from this particular chip?
 
 Now I am going to rewrite using structures, this is what I did on the computer side, and had pretty good luck.
 
 Thanks
 
 L.
 |  |  
		|  |  
		| Mike Walne 
 
 
 Joined: 19 Feb 2004
 Posts: 1785
 Location: Boston Spa UK
 
 
			    
 
 | 
			
				| Using RS2323 & Compiler 4 |  
				|  Posted: Mon Sep 14, 2009 1:15 pm |   |  
				| 
 |  
				| Maybe I don't understand what your real problem is. 
 CCS provides a sample code "EX_STR.C" with their compiler.
 
 This shows your how to go about getting RS232 data in and out.
 
 I agree with  the other replies. It's easier to write your own code than try to decipher someone elses.
 
 Mike W
 |  |  
		|  |  
		| lecutus 
 
 
 Joined: 12 Aug 2009
 Posts: 40
 
 
 
			    
 
 | 
			
				| I'm doing at that right now |  
				|  Posted: Mon Sep 14, 2009 2:21 pm |   |  
				| 
 |  
				| As to the example thanks 
 L.
 |  |  
		|  |  
		| lecutus 
 
 
 Joined: 12 Aug 2009
 Posts: 40
 
 
 
			    
 
 | 
			
				| Let me see if I got this right. |  
				|  Posted: Tue Sep 15, 2009 1:26 pm |   |  
				| 
 |  
				| I've studied the EX_STR.C and  the get_string seems to be my best bet. As to the mechanics, is the get_string is tied logically to what ever pin I have designated as receiver pin for rs232. In my case, rcv=pinc7. One other related question, what are these and their purpose,  jumpers 8 to 11 and 7 to 12 
 
 
 I've also looked at http://www.ccsinfo.com/forum/viewtopic.php?t=39007, this is a lot like what I'm going through.
 
 The big picture is I want to read what's coming in, rcv pin, see if it's the right length and process.
 
 pcwhd 4.079
 
 Thanks
 L.
  	  | Code: |  	  | #use delay(clock=20000000)
 #use rs232(baud=115200, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12
 
 | 
 |  |  
		|  |  
		| Mike Walne 
 
 
 Joined: 19 Feb 2004
 Posts: 1785
 Location: Boston Spa UK
 
 
			    
 
 | 
			
				| Jumpers & pin settings |  
				|  Posted: Mon Sep 21, 2009 3:49 pm |   |  
				| 
 |  
				| The Jumpers refer to CCS prototyping boards. If you are using your own hardware the jumper settings are irrelevant. 
 The pin selection settings are needed for PICs without a hardware UART.
 
 PIC16c56 for example needs a software UART to achieve RS232 comms.
 
 It doesn't make sense to use a software UART on a PIC with a hardware one built in.
 
 I haven't tried the effect of setting xmit & rcv to anything other than the dedicated pin_C6 & pin_C7, but I suppose it may be interesting.
 
 The microchip data sheet tells you which pins are dedicated to the UART function.
 
 The EX_STR.C example shows you how to use standard 'C' functions for character counting etc.
 
 Mike W
 |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |