打印

PIC12F675的电平变化中断

[复制链接]
7045|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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.
这个做到了再和中断揉到一起。

使用特权

评论回复
5
yewuyi| | 2012-8-15 17:38 | 只看该作者
基础问题,自己搞定,不要求人来解决这些基本的东西。

使用特权

评论回复
6
xueweianying|  楼主 | 2012-8-15 17:47 | 只看该作者
4# 我是土匪
折腾了一下午,找出问题了,把中断子程序里的GPIF=0;放到最后,就是改成
void interrupt isr_deal(void)
{
  if(GPIE&&GPIF)

{

sign=1;

  GPIO5=!GPIO5;



GPIF=0;

}

}
这样灯就闪了。

使用特权

评论回复
7
xueweianying|  楼主 | 2012-8-15 17:48 | 只看该作者
结帖了。

使用特权

评论回复
8
我是土匪| | 2012-8-16 09:25 | 只看该作者
楼主是否想过,这条语句放在2个不同位置的差异在于哪里?

使用特权

评论回复
9
xueweianying|  楼主 | 2012-8-16 14:38 | 只看该作者
8# 我是土匪
土匪哥的想法呢?我认为GPIF(端口电平变化时中断标志位)清0以后,就跳出了中断子程序,继续下一个 中断了,不知道是不是???请土匪哥说说看法-----

使用特权

评论回复
10
dogglove| | 2013-7-9 23:30 | 只看该作者
觉得你理解的不全面

使用特权

评论回复
11
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

粉丝