查看: 2247|回复: 20
|
我的PIC会停顿。。。
[复制链接]
|
|
求助
我的PIC会停顿。。。
当我连续性不停开关POWER做TESTING,PIC会停顿,不在工作了,也不能POWER ON RESET。。。NEED TO REBURN。。。
我的PIC是16F877A,双稳压POWER,有用ADC,RS-232。。。
哪里出问题啊?? |
|
|
|
|
|
|
|
发表于 20-9-2005 07:48 AM
|
显示全部楼层
1。请放电路图上来看。(必须和你所作的一样)
2。你的电源是什么?
3。怎样“连续性不停开关”?
4。读(Read)你的PIC, 得到什么?和原来的 Hex 比较? |
|
|
|
|
|
|
|
楼主 |
发表于 20-9-2005 08:02 PM
|
显示全部楼层
HEX FILES = all 3FFF AFTER FAIL。。。它好像自我牺牲了。。。
电路图,很难画。。。
电源:AC TO DC 12V TO 5v
是software的问题。。。
[size=-2]
#include <16F877a.h>
#device adc=10
#device *=16
#include <STDLIB.H> // needed for division routine
#include <math.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000) // 4 MhZ
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#byte tris_analog =0x85 //tris-A on datasheet,register address=bank1=0x85h
#byte pb =0x06 //b // spi & sensor controls tris B
#byte lcd =0x08 //portD
#byte tris_lcd =0x88 //tris-D on datasheet,register address=bank1=0x88h
#bit TC77_CS =pb.7 // RB7 pin40, TC77 !CS output
#bit TC77_SIO =pb.6 // RB6 pin39, TC77 S I/O I/O
#bit TC77_SCK =pb.5 // RB5 pin38, TC77 SCK output
#bit LM71_CS =pb.4 // RB4 pin37, LM71 !CS output
#bit LM71_SIO =pb.2 // RB2 pin35, LM71 S I/O I/O
#bit LM71_SCK =pb.1 // RB1 pin34, LM71 SCK output
#bit running =pb.0
// NOKIA_LCD bits
#bit nok_sclk =lcd.6 // RD6
#bit nok_sda =lcd.7 // RD7
#bit nok_dc =lcd.0 // RD0
#bit nok_cs =lcd.3 // RD3
#bit nok_res =lcd.1 // RD1
#bit hs15p_vcc =lcd.4 //RD4
#bit hs15p_gnd =lcd.5 //RD5
#bit testing =lcd.2
void mpx4115a_read(int16 *reading); // for pressure sensor MPX4115A
void lm71_read(signed int16 *lm71); // fot SPI temperature sensor TC77
void lm71_write(short bitforlm71);
//void lm71_write(short bitforlm71);
float t_in_hi2,t_in_lo2,t_in_temp2;
void HS15P_read(int16 *humudity);
void main(){
int16 preasure;
float kpa_pressure,p_mmHg_float;
int16 read_lm71;
float lm71_in_float;
int16 read_of_humidity;
float hs15p;
float v_R1,v_hs15p,R_kilo_ohm_hs15p,log_10_R_kilo_ohm_hs15p,pow2,pow3,RH;
do{
SET_TRIS_B(0x44); // oioo oiii 0x47 oio o o io i 0x45
TC77_CS=1; // deselect the TC77 (RB7)
LM71_CS=1; // deselect the TC77 (RB7)
mpx4115a_read(&preasure);
kpa_pressure=(((float)preasure*0.02713336)+10.55555556);
p_mmHg_float=(kpa_pressure*7.500615); // convert to mmHg
printf("|%f|",kpa_pressure); // RS232 test
printf("\n");
printf("|%f|",p_mmHg_float); // RS232 test
printf("\n");
///////////////////////////////////////////////////////////////////////////
lm71_read(&read_lm71);
read_lm71&=0xfffc; // reset lowest 2 bits 1111 1111 1111 1100 last 2-bit no used
lm71_in_float=((float)read_lm71*0.0078125);//-2.1; // bit2 represents 0.03125癈
// bit0 equals 0.0078125癈
printf("|%f|",lm71_in_float); // RS232 test
printf("\n");
//////////////////////////////////////////////////////////////////////////////
HS15P_read(&read_of_humidity);
v_R1=read_of_humidity*5/1023;
v_hs15p= 5-v_R1; //
R_kilo_ohm_hs15p=(5-(read_of_humidity*5/1023))*5442.36/read_of_humidity;
log_10_R_kilo_ohm_hs15p=log10 (R_kilo_ohm_hs15p);
pow2 = log_10_R_kilo_ohm_hs15p*log_10_R_kilo_ohm_hs15p;
pow3 = pow2*log_10_R_kilo_ohm_hs15p;
RH=0.18*pow3+3*pow2-31*log_10_R_kilo_ohm_hs15p+81-0.75*lm71_in_float+34;
printf("|%f|",RH); // RS232 test
printf("\n");
SET_TRIS_D(0xfb);//iiiii0ii
testing=1;
delay_ms(10);
testing=0;
delay_ms(10);
testing=1;
delay_ms(10);
testing=0;
delay_ms(10);
testing=1;
delay_ms(10);
testing=0;
delay_ms(10);
testing=1;
delay_ms(10);
testing=0;
delay_ms(200);
}while(1);
}//end main
void mpx4115a_read(int16 *reading){
int n;
*reading=0; // reset value
setup_adc(ADC_CLOCK_DIV_32);
setup_adc_ports( RA0_RA1_RA3_ANALOG );
delay_ms(1); // module warm-up time
set_adc_channel(1); // set & read adc ch 1 (RA1)
delay_ms(1); // to prevent erroneous result at boot
for(n=4;n>=1;n--){
delay_ms(1);
*reading+=read_adc();
}
setup_adc( ADC_OFF );
if (*reading>4095)return;
}
//////////////////////////////////////////////////////////////////////////////////////////
void lm71_read(signed int16 *lm71){ // emulated SPI read
char lm71_ready;
char c;
lm71_ready=0; // reset
//lm71_write(0); // power-up the tc77
SET_TRIS_B(0x45); // oioo oiii oio o o io i 0x45
//if lm71_ready=0,do below
while (!lm71_ready){
LM71_CS=0; // select (chip enable)
*lm71=0;
for(c=16;c!=0;c--){ // 16-bit read get data
LM71_SCK=0;
delay_ms(2);
LM71_SCK=1;
if (LM71_SIO){bit_set(*lm71,c-1);}
delay_ms(2);
}
LM71_CS=1;
// deselect (chip disable)
//if lm71_ready=1,then stop get data
if(bit_test(*lm71,1)==1){lm71_ready=1;break;} // status of adc (lm77 ready?) takes 300mS after each power up
}
//lm71_write(1); // power-down the tc77 (consumes only 0,1礎 in shutdown-mode)
}
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void lm71_write(short bitforlm71){
signed int16 t_unused2;
char w_lm71_ready;
char d;
t_unused2=0;
//SET_TRIS_B(0x47); // oioo oiii oio o o io i 0x45
SET_TRIS_B(0x45); // oioo oiii oio o o io i 0x45
// 765 4 3 21 0
LM71_CS=0; // select (chip enable)
w_lm71_ready=0;
while (!w_lm71_ready){
for(d=16;d!=0;d--){ // 16-bit read
LM71_SCK=0;
delay_ms(2);
LM71_SCK=1;
if (LM71_SIO){bit_set(t_unused2,d-1);}
delay_ms(2);
}
w_lm71_ready=bit_test(t_unused2,1); // status of adc (lm71 ready?) takes 300mS after each power up
}
//SET_TRIS_B(0x07); // oooo oiii // ooo o o oo i 0x01
SET_TRIS_B(0x01); // oooo oiii // ooo o o oo i 0x01
// 7654 3210 765 4 3 21 0
if (!bitforlm71){LM71_SIO=0;} //if bitforlm71=0, do LM71_SIO=0 continuous conversion
else if (bitforlm71){LM71_SIO=1;} //if bitforlm71=1, do LM71_SIO=1 shutdown
for(d=16;d!=0;d--){ // 16-bit write
LM71_SCK=0;
delay_ms(2);
LM71_SCK=1;
delay_ms(2);
}
LM71_SCK=0;
LM71_CS=1; // deselect (chip disable)
//SET_TRIS_B(0x47); // oioo oiii 0x45
SET_TRIS_B(0x45); // oioo oiii 0x45
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void HS15P_read(int16 *humudity){
int8 n;
float pow2;
float pow3;
SET_TRIS_D(0xcb);//iiooi0ii
setup_adc(ADC_CLOCK_DIV_32);
setup_adc_ports( RA0_RA1_RA3_ANALOG );
set_adc_channel(0); // set & read adc ch 0 (RA0)
*humudity=0; // reset value
hs15p_vcc =0;
hs15p_gnd =0;
for(n=5;n!=0;n--){
hs15p_vcc =0;
hs15p_gnd =1;
delay_ms(2);///////
hs15p_vcc =1;
hs15p_gnd =0;
delay_ms(2);///////
}
delay_ms(1);///////
*humudity = read_adc();
setup_adc( ADC_OFF );
hs15p_vcc =0;
hs15p_gnd =0;
if (*humudity>1023)return; // error detection
} |
|
|
|
|
|
|
|
发表于 21-9-2005 08:50 AM
|
显示全部楼层
当然需要 re-program 啦,它都自我 erase 了。。。
我觉得应该是 hardware 问题吧,须看看你的 circuit diagram。。。 |
|
|
|
|
|
|
|
发表于 21-9-2005 12:16 PM
|
显示全部楼层
原帖由 hi--520 于 20-9-2005 08:02 PM 发表
HEX FILES = all 3FFF AFTER FAIL。。。它好像自我牺牲了。。。
电路图,很难画。。。
电源:AC TO DC 12V TO 5v
是software的问题。。。
不是firmware的问题。。。应该是power surge。
1. 改为 #fuses XT,NOWDT,NOPROTECT,NOLVP, PUT, NoBrownout
2. Pin 1 (MCLR),接104 Cap,4.7K pull high
3. 在两组的VDD, VSS, 接104 Cap, 要接近。
4. 告诉我port_b6, B7, b3, MCLR,你现在接什么?
5. 有用 bootloader 吗?
6. 电源,transformer? DC adaptor? Switch mode power supply? 有接地吗(earth)?
7.行不行都请回报结果。 |
|
|
|
|
|
|
|
楼主 |
发表于 21-9-2005 02:28 PM
|
显示全部楼层
原帖由 pic 于 21-9-2005 12:16 PM 发表
不是firmware的问题。。。应该是power surge。
1. 改为 #fuses XT,NOWDT,NOPROTECT,NOLVP, PUT, NoBrownout
2. Pin 1 (MCLR),接104 Cap,4.7K pull high
3. 在两组的VDD, VSS, 接104 Cap, 要接近。
4. 告诉我port_b6, B7, b3, MCLR,你现在接什么?
5. 有用 bootloader 吗?
6. 电源,transformer? DC adaptor? Switch mode power supply? 有接地吗(earth)?
7.行不行都请回报结果。
i know is power surge problem,
因为我有时开风扇它也会自我牺牲。。。
当然我不停开关power也会产生power surge。。。
1.ok,我试试看
2.ok,我试试看
3.ok,我试试看,now is 1 of the 两组的VDD, VSS, 接104 Cap
4.
RB6-->10kohm-->TC77 spi port:SI/O
and RB6-->programmer(i used in-circuit program)
RB7-->10kohm-->TC77 spi !CS
and RB7-->programmer(i used in-circuit program)
RB3-->10kohm-->GND
MCLR-->10kohm--> -1n4148+ -->VCC5V
and MCLR-->programmer(no power under testing but still connected in circuit,rs-232 is unplugged)
5.no use
6.电源,=DC adaptor+LM317(12V)-->LM1086(5V)
i don't understand why it自我牺牲....
later i give u result... |
|
|
|
|
|
|
|
发表于 21-9-2005 04:12 PM
|
显示全部楼层
我想,问题是ICSP。你的ICSP是接去PC的parallel/serial port。你的PC应该有漏电, 也是说你的circuit Gnd 带电。(AC)
请做一个实研,保留现在的状况,但不接parallel/serial port。还有, ICSP的电源,和主电路一样吗?(Same Source?)再回报结果。 |
|
|
|
|
|
|
|
楼主 |
发表于 21-9-2005 06:20 PM
|
显示全部楼层
原帖由 pic 于 21-9-2005 04:12 PM 发表
我想,问题是ICSP。你的ICSP是接去PC的parallel/serial port。你的PC应该有漏电, 也是说你的circuit Gnd 带电。(AC)
请做一个实研,保留现在的状况,但不接parallel/serial port。还有, ICSP的电源,和主 ...
ICSP的电源is direct from PC serial port,but when i run the circuit,ICSP 的serial port was unplugged,so should be no current...
when i open/close the power many time, the PIC would calculate wrong value at power-up,and after that it like program run away...and stop responding... maybe it write some value into program memory... |
|
|
|
|
|
|
|
楼主 |
发表于 21-9-2005 06:23 PM
|
显示全部楼层
原帖由 pic 于 21-9-2005 04:12 PM 发表
我想,问题是ICSP。你的ICSP是接去PC的parallel/serial port。你的PC应该有漏电, 也是说你的circuit Gnd 带电。(AC)
请做一个实研,保留现在的状况,但不接parallel/serial port。还有, ICSP的电源,和主 ...
ICSP的电源is direct from PC serial port,but when i run the circuit,ICSP 的serial port was unplugged,so should be no current...
when i open/close the power many time, the PIC would calculate wrong value at power-up,and after that it like program run away...and stop responding... maybe it write some value into program memory... |
|
|
|
|
|
|
|
发表于 22-9-2005 10:03 AM
|
显示全部楼层
加这一个电路,在DCAdaptor 之后。回报结果.
|
|
|
|
|
|
|
|
发表于 22-9-2005 04:14 PM
|
显示全部楼层
PIC:
有放 brownout 会比较好吧,不然在应该 reset 的时候不 reset lei~~。。。 |
|
|
|
|
|
|
|
发表于 22-9-2005 08:59 PM
|
显示全部楼层
原帖由 tjtan81 于 22-9-2005 04:14 PM 发表
PIC:
有放 brownout 会比较好吧,不然在应该 reset 的时候不 reset lei~~。。。
brownout 开了, 如果电源不稳定,会制造很多问题.
先关brownout,少一个trouble-shooting 的variable, 问题解决了在开回。 |
|
|
|
|
|
|
|
楼主 |
发表于 22-9-2005 09:47 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 22-9-2005 10:07 PM
|
显示全部楼层
大家有听过power surge会导致PIC自我erase吗?? 我在internet search不到
我的PIC在一开始就进行大量运算会是问题的根源吗??
有时我开风扇它好象会reset,因为我看见led闪的timing会跳,RS-232 printf 的data有时会出错,有时关power又开回它就牺牲了。。。
power on reset不是会把之前的错误reset掉吗?? |
|
|
|
|
|
|
|
发表于 23-9-2005 06:20 PM
|
显示全部楼层
大家有听过power surge会导致PIC自我erase吗?? 我在internet search不到
没听说过。
我的PIC在一开始就进行大量运算会是问题的根源吗??
不是。
有时我开风扇它好象会reset,因为我看见led闪的timing会跳,RS-232 printf 的data有时会出错,有时关power又开回它就牺牲了。。。
再一次说,你的PC应该有漏电 (DC Adaptor 也可能), 也是说你的circuit Gnd 带AC电。
1。不要接RS232 to PC,你看看问题是不是不见了。
2。不然你用DC12V电池, 不要用DC Adaptor。
PIC会自我erase,当MCLR收到 >12V, 进入programming mode,就有很大机会被erase。
或RB3 有5V, 如果有set LVP fuse。
有漏电时,Gnd 可能是负压 < -V (不是0V),MCLR就有可能是>12V, 而不是你认为的5V。RB3,6,7 也是一样。 |
|
|
|
|
|
|
|
发表于 13-10-2005 10:53 AM
|
显示全部楼层
楼主,难题解决了吗?
可以分享解决办法吗?也为这贴请做一个结论,让帮助你的人知道结果。 |
|
|
|
|
|
|
|
楼主 |
发表于 13-10-2005 01:40 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 13-10-2005 03:17 PM
|
显示全部楼层
加这个 Errors。
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7,errors) |
|
|
|
|
|
|
|
楼主 |
发表于 13-10-2005 08:33 PM
|
显示全部楼层
原帖由 pic 于 13-10-2005 03:17 PM 发表
加这个 Errors。
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7,errors)
我加看看。。。不过我过后要加 RC filter to power,signal path。。。
上次我玩USB sound card 时,家RC filter在D+,D- 就把power surge 解决了,power比较不用担心。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 13-10-2005 09:05 PM
|
显示全部楼层
|
|
|
|
|
|
| |
本周最热论坛帖子
|