搜索
bottom↓
回复: 17

PIC12F629的部分I/O口不能用!(问题已解决,感谢:lyunlimit 兔斯基)

[复制链接]

出0入0汤圆

发表于 2008-7-31 17:05:55 | 显示全部楼层 |阅读模式
最近在玩PIC12F629,哎,被这玩意儿的寄存器弄得实在郁闷!
我的GPIO0、GPIO1、GPIO2都能正常使用,就是GPIO4、GPIO5死活不能用!
初始化我检查了N遍,结果还是一样!
__CONFIG(UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTEN & INTIO);

/**************************************************************************
*    函数原型: void ParaInit(void)
*    功                   能: 参数初始化
**************************************************************************/
void ParaInit(void){
        TMR0                    = TMR0_Value;
        time_10mS = vTime_10mS;
        time_100mS =vTime_100mS;
        time_1S = vTime_1S;
        time_1Min = vTime_1Min;
        time_1Hour= vTime_1Hour;
        time_10Hour = vTime_10Hour;       
}
/**************************************************************************
*    函数原型: void InitSys(void)
*    功                   能: 系统初始化
**************************************************************************/
void  InitSys(void){

        INTCON        =        0xd0;                //使能GP2/INT 外部中断,使能TMR0 溢出中断
        OPTION = 0x8f;
        CMCON  = 0x07;
        WPU    = 0x00;
        TRISIO = 0x00;
        GPIO   = 0xff;
        T1CON  = 0x08;
        TMR1IE          = 1;        //允许Timer1中断

        ParaInit();

}

/**************************************************************************
*    函数原型: void main(void)
*    功                   能: 主程序
**************************************************************************/
void main(void){
        InitSys();
        while(1){
                CLRWDT();
                GPIO=0xff;
                Delay_mS(100);
                GPIO=0x00;
                Delay_mS(100);
//                CommandDeal();
        }
}

就是上面这样直接置1或0,再延时也是毫无用处。
搞了2、3天了,还是一样!
期待大虾们的回复!

出0入0汤圆

发表于 2008-7-31 17:15:59 | 显示全部楼层

(原文件名:PIC12F629.jpg)


(原文件名:PIC16F29-1.jpg)

你设置的配置的参数是???

出0入0汤圆

 楼主| 发表于 2008-7-31 17:18:35 | 显示全部楼层
100 = INTOSC 振荡器: GP4/OSC2/CLKOUT 引脚为I/O 功能, GP5/OSC1/CLKIN 引脚为I/O 功能

出0入0汤圆

 楼主| 发表于 2008-7-31 17:20:31 | 显示全部楼层
我都检查N遍了,就是100,GPIO4、GPIO5均为数字IO口啊,还是不能用。

出0入0汤圆

发表于 2008-7-31 17:25:50 | 显示全部楼层
我帮仿真一下,就明白了.

出0入0汤圆

 楼主| 发表于 2008-7-31 17:27:49 | 显示全部楼层
非常感谢!

出0入0汤圆

 楼主| 发表于 2008-7-31 17:28:41 | 显示全部楼层
#include <pic.h>
#include <pic12f6x.h>

#define uchar         unsigned char
#define uint                 unsigned int

#define UV                GPIO0
#define L1                GPIO1
#define REM                GPIO2
#define RET                GPIO3
#define FAN                GPIO4
#define L2                GPIO5

#define Com_Addr        0x00
#define TMR0_Value          0x00         //195*256/100000=0.05s

#define         vTime_10mS        40//#define         vTime_1mS                10
#define         vTime_100mS        10
#define         vTime_1S                10
#define         vTime_1Min                60
#define         vTime_1Hour        60
#define         vTime_10Hour        10

uint  RCV_Command[2];         //接收到的命令字

uchar        time_10mS;
uchar        time_100mS;
uchar        time_1S;
uchar        time_1Min;
uchar        time_1Hour;
uchar        time_10Hour;

bit   RCV_End_Flag;             //接收结束标志
bit   Error_Flag;               //接收错误标志

__CONFIG(UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTEN & INTIO);

/**************************************************************************
*    函数原型: void delay(uint time)
*    功    能: 延时n mS
**************************************************************************/
void Delay_mS(uint time){
        uint i;
        for(;time > 0;time--){
                CLRWDT();
                i=196;
                while(i--);
        }
}

/**************************************************************************
*    函数原型: void DATA_WRITE(uchar ADDR, uchar DATA)
*    功                   能: 写EEPROM
**************************************************************************/
void DATA_WRITE(uchar ADDR, uchar DATA){
        WREN = 1;
        EEADR = ADDR;
        EEDATA = DATA;
        EECON2 = 0x55;
        EECON2 = 0xaa;
        WR = 1;
        Delay_mS(10);
}

/**************************************************************************
*    函数原型: uchar DATA_READ(uchar ADDR)
*    功                   能: 读EEPROM
**************************************************************************/
/*
uchar DATA_READ(uchar ADDR){
        EEADR = ADDR;
        RD = 1;
        DelayXms(10);
        return(EEDATA);
}

/**************************************************************************
*    函数原型: void CommandDeal(void)
*    功                   能: 遥控处理
**************************************************************************/
void CommandDeal(void){
        RCV_Command[0] &= 0x0FFF;
        RCV_Command[1] &= 0x0FFF;
        if((RCV_End_Flag == 1)&&(RCV_Command[0] == RCV_Command[1])){
UV = !UV;
                RCV_End_Flag = 0;
                switch(RCV_Command[0]){
                        case 0x8A0:         //电源键
                        break;
                       
                        case 0x890:         //时间设置键
                        break;
                       
                        case 0x888:         //时间调节,向上键
                        break;
                       
                        case 0x884:         //时间调节,向下键
                        break;
                       
                        case 0x860:         //风力调节键
                        break;
                       
                        case 0x850:         //定时设置键
                        break;
                       
                        case 0x848:         //显示键
                        break;
                       
                        case 0x844:         //保存键
                        break;
                       
                        default:
//                                Delay_mS(100);
//                                Error_Flag = 1;                                 
                        break;
                }
        }
}

/**************************************************************************
*    函数原型: void ParaInit(void)
*    功                   能: 系统初始化
**************************************************************************/
void ParaInit(void){
        TMR0                    = TMR0_Value;
        time_10mS = vTime_10mS;
        time_100mS =vTime_100mS;
        time_1S = vTime_1S;
        time_1Min = vTime_1Min;
        time_1Hour= vTime_1Hour;
        time_10Hour = vTime_10Hour;       
}
/**************************************************************************
*    函数原型: void InitSys(void)
*    功                   能: 系统初始化
**************************************************************************/
void  InitSys(void){

        INTCON        =        0xd0;                //使能GP2/INT 外部中断,使能TMR0 溢出中断
        OPTION = 0x8f;
        CMCON  = 0x07;
        WPU    = 0x00;
        TRISIO = 0x00;
        GPIO   = 0xff;
        T1CON  = 0x08;
        TMR1IE          = 1;        //允许Timer1中断

        ParaInit();

}

/**************************************************************************
*    函数原型: void main(void)
*    功                   能: 主程序
**************************************************************************/
void main(void){
        InitSys();
        while(1){
                CLRWDT();
                GPIO=0xff;
                Delay_mS(100);
                GPIO=0x00;
                Delay_mS(100);
//                CommandDeal();
        }
}

/**************************************************************************
*    函数原型: void interrupt INTServe(void)
*    功                   能: 中断处理
**************************************************************************/
/*
void interrupt INTServe(void){
        static uchar Bit_Cnt;       //接收位计数
        static uchar k;             //接收字计数

        if(Error_Flag == 1){
                Error_Flag = 0;
                Bit_Cnt = 0;
                k = 0;
        }

        if(INTF == 1){
                INTF = 0;
                TMR1H  = 0xFc;          //420*2us = 2a
                TMR1L  = 0xB8;
                TMR1ON = 1;
        }
       
        if(TMR1IF == 1){
                TMR1IF = 0;
                TMR1ON = 0;

                if(REM == 0){
                        RCV_Command[k] += 0x01;
                }
                RCV_Command[k] <<= 1;
               
                if(Bit_Cnt++ > 11){        //已接收到12位数据        
                        Bit_Cnt = 0;
                        if(k++ > 1){           // 2个字接收结束            
                                k = 0;
                                RCV_End_Flag = 1;
                        }
                }
        }
       
        if(T0IF){                //定时器0是否溢出
                T0IF = 0;
                TMR0 = TMR0_Value;

                if(--time_10mS == 0x00){
                        time_10mS = vTime_10mS;       

                        if(--time_100mS == 0x00){
                                time_100mS =vTime_100mS;

                                if(--time_1S == 0x00){
                                        time_1S = vTime_1S;       
//UV = !UV;
//L1 = !L1;
FAN=!FAN;
L2=!L2;
                                        if(--time_1Min== 0x00){
                                                time_1Min = vTime_1Min;       

                                                if(--time_1Hour== 0x00){
                                                        time_1Hour= vTime_1Hour;       

                                                        if(--time_10Hour== 0x00){
                                                                time_10Hour = vTime_10Hour;       
                                                               
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
}
/**************************************************************************
*    函数原型: END
*    功                   能: END
**************************************************************************/

出0入0汤圆

发表于 2008-7-31 17:55:02 | 显示全部楼层
有一个IO只能是作输入的 我记不清是哪个IO了,还有晶振公用脚要配置成内部震荡才能作普通IO 重复复位脚也是如此要配置成内部复位才能作普通IO用.

出0入0汤圆

发表于 2008-7-31 17:58:30 | 显示全部楼层

(原文件名:PIC.jpg)

现在可以确定是配置位的问题!

出0入0汤圆

发表于 2008-7-31 17:59:45 | 显示全部楼层
现在我通过仿真,只有GPIO3是输入外,其它的都可输出高低电平.

出0入0汤圆

发表于 2008-7-31 18:03:20 | 显示全部楼层

(原文件名:PIC.jpg)

出0入0汤圆

 楼主| 发表于 2008-8-1 08:32:42 | 显示全部楼层
昨晚,我两个月大的儿子咳嗽了,连夜送到医院了,没有时间看帖子,谢谢大虾们的回复,我今天再试试看!

出0入0汤圆

 楼主| 发表于 2008-8-1 08:37:01 | 显示全部楼层
我的配置位是这样的有什么问题呢?

(原文件名:未命名.jpg)

出0入0汤圆

发表于 2008-8-1 09:32:42 | 显示全部楼层
这里注意一下:

在OSC1(输入)和OSC2(放大器输出)引脚之间内
置有一个晶体振荡器电路。通过将控制位T1OSCEN
(T1CON<3>)置1 可使能该振荡电路。该振荡电路是
低功耗振荡电路,额定频率最高可达37 kHz。在休眠模
式中,它仍可继续工作。该振荡电路主要适用于32 kHz
晶振。表9-2 显示了Timer1 振荡器的可选电容。
Timer1 的振荡器与系统LP 振荡器共用。因此,只有当
系统时钟来自于内部振荡器时, Timer1 才能采用该模
式。与系统LP 振荡器相同,用户必须提供软件延时以
确保振荡器的正常起振。
当Timer1 振荡器被使能时,TRISIO4 和TRISIO5 置1。
GP4 和GP5 读作0,而TRISIO4 和TRISIO5 读作1。


你初始化里,有这句:T1CON  = 0x08:

你把LP振荡打开了。
结果就是:

当Timer1振荡器(就是指LP)被使能时,TRISIO4 和TRISIO5 置1。
GP4 和GP5 读作0,而TRISIO4 和TRISIO5 读作1。

出0入0汤圆

 楼主| 发表于 2008-8-1 10:00:04 | 显示全部楼层
楼上的果然厉害,问题确实在此处,非常感谢各位的帮助,哎!都怪我看资料不细心,再次感谢各位!

出0入0汤圆

发表于 2009-9-30 10:13:14 | 显示全部楼层
我是新手,请多多指教

请问楼主 pic12f629 这个单片机能自己制作ISP下载线吗? 像at89s52那样的,那学起来就简单多了。

我现在在DIY   LED小手电的电路, 里面用到这个单片机对LED进行调光,然后用mos管扩流加大LED的驱动电流。

出0入0汤圆

 楼主| 发表于 2009-9-30 12:59:04 | 显示全部楼层
不能哦!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 17:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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