PIC12F675的电平变化中断

[复制链接]
 楼主| xueweianying 发表于 2012-8-15 12:11 | 显示全部楼层 |阅读模式
下面的程序用的芯片是PIC12F675。功能:GPIO2输入一个方波,在GPIO5口驱动LED闪烁。
但是GPIO5口接的LED灯为什么没有闪烁???求大家答疑-----
#include <pic.h>  
__CONFIG(0X3F24);
bit sign;
void init()
{
  CMCON=0Xff;
  ADON = 0;       //A/D转换关闭
  ANSEL=0;       //设置成数据口

  TRISIO=0x06;
  GPIO = 0xff ;         
  OPTION = 0x0f;     //T0不分频,内部定时器,A口上拉使能

  GPIE=1;      //电平中断允许
  IOCB2=1;   //允许GP2 GP5电平变化中断
// IOCB5=1;
  PEIE=1;
  GIE = 1 ;
  T0IE=1;
  TMR0=0XCF;
// INTEDG=1;
}
void interrupt isr_deal(void)
{
  if(GPIE&&GPIF)
    {
      GPIF=0;
      sign=1;
      GPIO5=!GPIO5;
    }
}
  
void main()
{

init();

while(1);
}

我是土匪 发表于 2012-8-15 12:48 | 显示全部楼层
分别来做:
1、IO能否受控
2、中断能否正常工作

为什么使能定时器中断?无关代码一律屏蔽
 楼主| xueweianying 发表于 2012-8-15 14:33 | 显示全部楼层
2# 我是土匪
谢谢!!!
中断能正常工作的。对应的IO口设置成数据口,然后GPIO2设置为输入,GPIO5设置为输出,然后进行相关寄存器的操作,灯就是不闪烁。
我是土匪 发表于 2012-8-15 15:21 | 显示全部楼层
只用GPIO5闪烁LED.
这个做到了再和中断揉到一起。
yewuyi 发表于 2012-8-15 17:38 | 显示全部楼层
基础问题,自己搞定,不要求人来解决这些基本的东西。
 楼主| xueweianying 发表于 2012-8-15 17:47 | 显示全部楼层
4# 我是土匪
折腾了一下午,找出问题了,把中断子程序里的GPIF=0;放到最后,就是改成
void interrupt isr_deal(void)
{
  if(GPIE&&GPIF)

{

sign=1;

  GPIO5=!GPIO5;



GPIF=0;

}

}
这样灯就闪了。
 楼主| xueweianying 发表于 2012-8-15 17:48 | 显示全部楼层
结帖了。
我是土匪 发表于 2012-8-16 09:25 | 显示全部楼层
楼主是否想过,这条语句放在2个不同位置的差异在于哪里?
 楼主| xueweianying 发表于 2012-8-16 14:38 | 显示全部楼层
8# 我是土匪
土匪哥的想法呢?我认为GPIF(端口电平变化时中断标志位)清0以后,就跳出了中断子程序,继续下一个 中断了,不知道是不是???请土匪哥说说看法-----
dogglove 发表于 2013-7-9 23:30 | 显示全部楼层
觉得你理解的不全面
liuqiwei85 发表于 2013-7-11 16:31 | 显示全部楼层
本帖最后由 liuqiwei85 于 2013-7-11 16:32 编辑

请帮忙看看我的
#include<pic.h>
//******************配置位定义*******************
__CONFIG(MCLRE_OFF&WDTE_OFF&FOSC_INTRCIO);
//*****************频率校准**********************
const unsigned char cs @ 0x50;

void port_int(void);
void delay_ms(int ms);
void interrupt LED_BLINK();
//#define GP5_blink() (GP5=!GP5)
//#define GP2_blink() (GP2=!GP2)


//***********************延时函数**************
void delay_ms(int ms) //100ms延时函数
{
        int i=0,j=0;
        for(i=0;i<ms;i++)
                for(j=0;j<58;j++) // 不同频率下j需要修改
                 {;}

}
void port_int()
        {

        GPIO=0B00000000;
        TRISIO=0B00000000;
//*********TMR0**********
        OPTION_REG=0b10000011;
        TMR0=1;
        T0IF=0;
        T0IE=1;
//***********TMR1********        
        T1CON=0B00110101;
        TMR1IE=1;                                        //启用TMR1中断使能位        
        PEIE=1;                                                //使能所有外设中断
        TMR1H=0x05;
        TMR1L=0x0D;
        TMR1IF=0;
        GIE=1;
        }


void main()
{
        OSCCAL=cs;
        port_int();
        while(1);
        
        
}

void interrupt LED_BLINK()
{

        if(T0IF==1)
                {
                        
                        TMR0=1;
                        //GP5_blink();
                        GP5=!GP5;
                        delay_ms(1000);
                        T0IF=0;        
                }

        if(TMR1IF)
                {
                        TMR1H=0x05;
                        TMR1L=0x0D;
                        
                        //GP2_blink();
                        GP2=!GP2;
                        delay_ms(1000);
                        TMR1IF=0;
                }

}
*
*
*
*
*
我要加上延时才会闪,是什么原因呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

249

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部