|
|
View previous topic :: View next topic |
Author |
Message |
lecutus
Joined: 12 Aug 2009 Posts: 40
|
Can't get my Write_eeprom to work. |
Posted: Thu Aug 13, 2009 4:01 pm |
|
|
Yes it's me again, same program, different section.
This time I can't write the engine id or the transmission id to the eeprom.
the activity log:
08/13/2009 16:25:14.753 --> .......inside main XXXXXX>>>>>>>>>>>>XXXX
08/13/2009 16:25:14.769 --> id_num=e_data[0]=0,id_num=e_data[1]=0, engine=e_data[2]=0, trans=e_data[3]=0, count=5
08/13/2009 16:25:14.769 --> This from - read_e_data() Id_Num= 0000 Engine=00 Trans=00
08/13/2009 16:25:14.878 --> get_setup()>>>>>>>>>>>>>>>>>>>>>>>
08/13/2009 16:25:14.878 --> ID=1548
08/13/2009 16:25:18.472 --> Cat=01 Cummins=02 Detroit=03 Enter Engine Number=1
The line below is a printf to show if the variable engine recv'd the informatio
08/13/2009 16:25:20.347 --> engine=01
08/13/2009 16:25:20.347 --> Cat=01 Twin Disk=02 Allison=03 Enter Trans Number=3
The line below is a printf to show if the variable trans recv'd the informatio
08/13/2009 16:25:22.581 --> trans=03
Now starts the writing to the eeprom
08/13/2009 16:25:22.581 --> inside write_data()
08/13/2009 16:25:22.581 --> data_msb=6, data_lsb=12, offset=0, data =1548
08/13/2009 16:25:22.597 --> id_num=e_data[0]=12,id_num=e_data[1]=6, engine=e_data[2]=0, trans=e_data[3]=0, count=5
08/13/2009 16:25:22.597 --> This from - read_e_data() Id_Num= 1548 Engine=00 Trans=00
08/13/2009 16:25:22.597 --> write_eeprom_16bit - offset_id=0 ,id_num=1548
08/13/2009 16:25:22.613 --> write_eeprom - offset_e=4 ,engine=00
08/13/2009 16:25:22.613 --> write_eeprom - offset_t=5 ,trans=0
08/13/2009 16:25:22.628 --> LEAVING write_data()
these last statements are just reading the eeprom, verification
08/13/2009 16:25:22.628 --> This from - get_setup() Id_Num= 1548 Engine=00 Trans=00
08/13/2009 16:25:22.628 --> <<<<<<<<<<<<<<<<<<<<<<<<<<LEAVING get_setup()
08/13/2009 16:25:23.175 --> .......inside main XXXXXX>>>>>>>>>>>>XXXX
Now for the code in its entirety, I learned from last time:
Code: |
//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
#include <18F258.h>
#fuses HS,PROTECT,NOLVP,WDT32,nowdt
#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
#define offset_e 0x04// original
#define offset_t 0x05
#include <stdlib.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_send_status=false,*/tf_lube_ovr=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 s1[30];
int16 rpm_rs=740,ov_press_rs=7500,pump_id=0,id_num;
int8 swi_rs=0,gear_rs=125,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("This from - read_e_data() 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();
}
[b]The problem seems to be here/below, but I don't see it. And I still could be wrong. [/b]
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("This from - get_setup() 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);
}
void get_input_232(char* s, int max)
{
int len;
char c;
printf("inside get_input_232() >>>>>>>>>>>>>>>.........>>>>>>");
line_feed();
--max;
len=0;
do {restart_wdt();
c=getc();
if(c==8) { // Backspace
if(len>0) {
len--;
putc(c);
putc(' ');
putc(c);
}
} else if ((c>=' ')&&(c<='~'))
if(len<max) {
s[len++]=c;
//putc(c);
}
} while(c!=38);
s[len]=0;
printf("LEAVING get_input_232()<<<<<<<<<<<<<...........<<<<<<<<<<");
line_feed();
}
void ck_rs232()
{
//printf("inside ck_rs232() >>>>>>");
//line_feed();
if (kbhit())
{
k_char=getc();
if (k_char=='!')
{
tf_RS232=true;
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_input_232(s1, 30);
tf_rs232=false;
tf_data_ok=true;
output_high(pin_B5);
//x=0;while (x<24) {putc(s1[x]);x++;}
}
//printf("LEAVING ck_rs232() <<<<<<<<<<");
//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;
x=0;x1=0; while (s1[x1]<0x3a)
{ x1++;
if (s1[x1]>0x2f) {r[x]=s1[x1];x++;x1++;} //get rpm string
}
r[x]=0; //add null to end of string
x=0;x1++; while (s1[x1]<0x3a)
{if (s1[x1]>0x2f) {g[x]=s1[x1];x++;x1++;} }//get gear string
g[x]=0; //add null to end of string
x=0;x1++; while (s1[x1]<0x3a)
{if (s1[x1]>0x2f) {op[x]=s1[x1];x++;x1++;}} //get over pressure string
op[x]=0; //add null to end of string
x=0;x1++; while (s1[x1]<0x3a)
{if (s1[x1]>0x2f) { sw[x]=s1[x1];x++;x1++;}} //get switch status string
sw[x]=0; //add null to end of string
x=0;x1++; while (s1[x1]<0x3a)
{if (s1[x1]>0x2f) {id[x]=s1[x1];x++;x1++;}}//get pump_id string
id[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("RPM=%lu Gear=%u OP=%lu SWI=%u ID=%lu\r\n",rpm_rs,gear_rs,ov_press_rs,swi_rs,pump_id);
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
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);
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 end 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;
line_feed();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
bit_clear(pir1,tmr1if);
// 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();
va = bit_test(pir1,tmr1if);
//printf("Bit_test = value = %x, pir1 = %x, tmr1if = %x ", va,pir1,tmr1if );
/* printf("Bit_test = value = %2x ", bit_test(pir1,tmr1if));
line_feed();
printf(" pir1 = %x ", pir1);
line_feed();
printf("tmr1if = %x", tmr1if);
*/
//line_feed();
while (!bit_test(pir1,tmr1if)) //sample j1939 rX for 100ms
{
//printf("inside !bit_test pir1,tmr1if, inside while (true)");//line_feed();
ck_j1939_input();
ck_rs232();
}
if (tf_data_ok) process_rs232(); //PROCESS RS232 IF DATA IS OK
if (tf_send_232) rs232(); //SEND DATA STRING AFTER ANALYZING RS232 COMMANDS
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
bit_clear(pir1,tmr1if);
//printf("leaving <<<<<<< inside while (true)");
//line_feed();
}
printf(".........LEAVING main <<<XXXXXXXXXXXX");
line_feed();
}
|
Once again, it's gonna be something simple. Blearyeyed I go into the long night.
Thnx
L. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Aug 13, 2009 4:41 pm |
|
|
Your program is much too large. Cut out about 90% of it, re-test,
confirm that it still shows the problem, and post the short program.
Don't do a "code dump" on the forum. Trouble-shoot it yourself first. |
|
|
Wayne_
Joined: 10 Oct 2007 Posts: 681
|
|
Posted: Fri Aug 14, 2009 2:04 am |
|
|
Basically, in you write_data routine you call write_eeprom_16bit_1 to store the id_num.
In write_eeprom_16bit_1 you call read_e_data which overwrites the engine and trans value you have entered with the values stored in eeprom which are curently 0.
Now as for PCM programmer's comment, he is quite correct, it is good that you have posted a complete (although I havn't tried to compile it) program, it is quite large.
If you made a copy of your project and then stripped out all the bits you didn't need to try and trace the problem you may have caught this yourself. If not then you would have had a smaller piece of code to post which would make our life much easier.
Have fun. |
|
|
lecutus
Joined: 12 Aug 2009 Posts: 40
|
We have a winner |
Posted: Fri Aug 14, 2009 8:19 am |
|
|
Mr Wayne_
You nailed it was the read, after looking in the context of a new day. It was the second bug of a long day.
Yes to PCM ok next time I'll the minimum the info, yes it compiles, everything works. I end up not worrying about what works and work on the parts that don't.
And now that everything is working as it should and I have a better grasp of the architechture I'm dealing with. The rest of what I have to do is plain programming, yeah
So you won't hear from me for awhile.
Thanx
L. |
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
a minor point but i see this all the time |
Posted: Fri Aug 14, 2009 9:09 am |
|
|
one comment - perhaps it will help you
it is about the 115200 baud rate - we both know why you are using it .
i use that rate and higher but the 20mhz crystal is a bad choice for that particular baud with or without the BRG16 register settings
while the change i am suggesting to you will have an impact on your internal timer1 intialization count values - you can drive the baud error percentage to zero if you just change to a crystal of 18.432 mhz instead of 20mhz -and set your OSC statement , and timer 1 init values for rollover - in code to match
once you make that hardware and couple of lines software change -
then your baud error percentage will be 0.0%
this matters a lot especially at higher and higher baud rates - of which your code is a prime example
just my 2 cents |
|
|
lecutus
Joined: 12 Aug 2009 Posts: 40
|
Never say never |
Posted: Fri Aug 14, 2009 9:15 am |
|
|
Never say never.
I'll take that into consideration, since we're still developing the hardware and software concurrently.
Great head up, that's why I like this place
Thanks |
|
|
|
|
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
|