佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2247|回复: 20

我的PIC会停顿。。。

[复制链接]
发表于 18-9-2005 05:28 PM | 显示全部楼层 |阅读模式
求助
我的PIC会停顿。。。
当我连续性不停开关POWER做TESTING,PIC会停顿,不在工作了,也不能POWER ON RESET。。。NEED TO REBURN。。。
我的PIC是16F877A,双稳压POWER,有用ADC,RS-232。。。
哪里出问题啊??
回复

使用道具 举报


ADVERTISEMENT

发表于 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...
回复

使用道具 举报

Follow Us
发表于 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...
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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 | 显示全部楼层
原帖由 pic 于 22-9-2005 10:03 AM 发表
加这一个电路,在DCAdaptor 之后。回报结果.



对不起,我要等拜五晚上才能test,有考试

我只是想不通power surge会导致它自我erase 。。。
不过我加delay 100ms 在开始,它会比较慢自我erase当我开关power多次。。。
回复

使用道具 举报

 楼主| 发表于 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 | 显示全部楼层
楼主,难题解决了吗?
可以分享解决办法吗?也为这贴请做一个结论,让帮助你的人知道结果。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 13-10-2005 01:40 PM | 显示全部楼层
原帖由 pic 于 13-10-2005 10:53 AM 发表
楼主,难题解决了吗?
可以分享解决办法吗?也为这贴请做一个结论,让帮助你的人知道结果。



啊,对不起,PIC,我的网速很慢。。。9架电脑都在bt下载。。。
要进cari都要几分钟。。。

问题有改善,是加delay_ms(300)再开始。。。
电路还没改。。。没时间买材料。。。还要写final year report。。。每个星期都有exam。。。


我开fan的时候它好象会restart,不过不会self erase。。
回复

使用道具 举报

发表于 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 | 显示全部楼层
真惨,nokia 3310 LCD 搞不定 。。。下次改用3.3V看看。。

爱上了microchip PIC,不过PIC16F877 已经不够用了,只有8k 的program rom。。。 到现在都用了98%了 不能再加东西了。。。

下次要玩MMC memory card and sms
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 3-1-2025 12:49 PM , Processed in 0.134896 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表