打印
[PIC®/AVR®/dsPIC®产品]

有朋友能否帮忙看一下PIC12F675定时程序问题

[复制链接]
7086|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xpl129|  楼主 | 2014-7-17 16:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个程序是实现GPIO0端口每隔1s输出高电平,但编译烧制后用示波器检测不到信号,有朋友可以帮忙看一下问题出在那么?或者有偿求购编写此类程序
#include "pic.h"
bit bFlag=0;
unsigned int count=0;
void interrupt ISR(void)
{
if(T0IE && T0IF)       
{
   T0IF=0;
   TMR0=0x06;
   if(bFlag==0)
   {
         GPIO=0x01;
     bFlag=1;
   }
        else
        {
          GPIO=0x00;
          count++;
          if(count==999)
          {
            count=0;
            bFlag=0;
          }
        }
  }
}
void main(void)
{
        T0CS=0;
        PSA=0;
        PS2=0;
        PS1=0;
        PS0=1;
        T0IF=0;
        T0IE=1;
        GIE=1;
        TMR0=0x06;
        TRISIO=0xFE;
        GPIO=0x00;
        while(1){}
}
沙发
xpl129|  楼主 | 2014-7-17 16:24 | 只看该作者
有懂这方面的朋友可否指导一下?

使用特权

评论回复
板凳
zhouthat| | 2014-7-17 17:13 | 只看该作者
把AD关了试试?ANSEL=OXOO;

使用特权

评论回复
地板
zhouthat| | 2014-7-17 17:21 | 只看该作者
没用过这款芯片,不知道你的配置是否有误,其实你可以先用delay来实现IO口的跳变,验证下是否是硬件问题。。。

使用特权

评论回复
5
zhouthat| | 2014-7-17 17:24 | 只看该作者
汗,你貌似连__CONFIG(xxxx);都没写

使用特权

评论回复
6
xpl129|  楼主 | 2014-7-17 17:51 | 只看该作者
zhouthat 发表于 2014-7-17 17:21
没用过这款芯片,不知道你的配置是否有误,其实你可以先用delay来实现IO口的跳变,验证下是否是硬件问题。 ...

初次接触这些,正在尝试,感谢您的建议,待会试一下

使用特权

评论回复
7
xpl129|  楼主 | 2014-7-17 17:53 | 只看该作者
zhouthat 发表于 2014-7-17 17:24
汗,你貌似连__CONFIG(xxxx);都没写

朋友,能否给解释一下?

使用特权

评论回复
8
zhaor| | 2014-7-17 21:16 | 只看该作者
有空我给你写个。你用的什么IDE?

使用特权

评论回复
9
zhouthat| | 2014-7-18 08:48 | 只看该作者
xpl129 发表于 2014-7-17 17:53
朋友,能否给解释一下?

需要先配置单片机的配置位啊,当然你也可以在编程器里面配置,具体看看资料书吧
bit 13-12 BG1:BG0: BOD 和POR 电压的带隙校准位(1)
00 = 最低带隙电压
11 = 最高带隙电压
bit 11-9 未用位: 读作0
bit 8 CPD: 数据代码保护位(2)
1 = 禁止数据存储器代码保护
0 = 使能数据存储器代码保护。
bit 7 CP: 代码保护位(3)
1 = 禁止程序存储器代码保护
0 = 使能程序存储器代码保护
bit 6 BODEN: 欠压检测使能位(4)
1 = 使能BOD
0 = 禁止BOD
bit 5 MCLRE: GP3/MCLR 引脚功能选择(5)
1 = GP3/MCLR 引脚功能为MCLR
0 = GP3/MCLR 引脚功能为数字I/O, MCLR 内部连接到VDD
bit 4 PWRTE: 上电延时定时器使能位
1 = 禁止PWRT
0 = 使能PWRT
bit 3 WDTE: 看门狗定时器使能位
1 = 使能WDT
0 = 禁止WDT
bit 2-0 FOSC2:FOSC0: 振荡器选择位
111 = RC 振荡器: GP4/OSC2/CLKOUT 引脚为CLKOUT 功能, GP5/OSC1/CLKIN 引脚上连接RC
110 = RC 振荡器: GP4/OSC2/CLKOUT 引脚为I/O 功能, GP5/OSC1/CLKIN 引脚连接RC
101 = INTOSC 振荡器: GP4/OSC2/CLKOUT 引脚为CLKOUT 功能, GP5/OSC1/CLKIN 引脚为I/O 功能
100 = INTOSC 振荡器: GP4/OSC2/CLKOUT 引脚为I/O 功能, GP5/OSC1/CLKIN 引脚为I/O 功能
011 = EC: GP4/OSC2/CLKOUT 引脚为I/O 功能, GP5/OSC1/CLKIN 引脚上为CLKIN
010 = HS 振荡器: GP4/OSC2/CLKOUT 和GP5/OSC1/CLKIN 引脚连接高速晶振/ 谐振器
001 = XT 振荡器: GP4/OSC2/CLKOUT 和GP5/OSC1/CLKIN 引脚连接晶振/ 谐振器
001 = LP 振荡器: GP4/OSC2/CLKOUT 和GP5/OSC1/CLKIN 引脚上连接低功耗晶振
注1:带隙校准位在出厂时已被编程,必须按照PIC12F629/675 编程规范中的规定,在擦除

使用特权

评论回复
10
xpl129|  楼主 | 2014-7-18 08:57 | 只看该作者
zhaor 发表于 2014-7-17 21:16
有空我给你写个。你用的什么IDE?

朋友您好,我用的是MPLAB IDE,谢谢

使用特权

评论回复
11
xpl129|  楼主 | 2014-7-18 08:59 | 只看该作者
zhouthat 发表于 2014-7-18 08:48
需要先配置单片机的配置位啊,当然你也可以在编程器里面配置,具体看看资料书吧
bit 13-12 BG1:BG0: BOD ...

好的,谢谢,我学习学习

使用特权

评论回复
12
伏尔加的鱼| | 2014-7-18 09:03 | 只看该作者
最新版的集成开发环境对于设置配置位比较方便

使用特权

评论回复
13
yklstudent| | 2014-7-18 09:09 | 只看该作者
PEIE记得一并打开

使用特权

评论回复
14
zhouthat| | 2014-7-18 09:10 | 只看该作者
#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int
__CONFIG(0x01b4);//内部RC

uchar bFlag=0;
unsigned int count=0;

void delay(uint x)//4M晶振延时1ms,大概
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=115;b>0;b--);
}
void interrupt ISR(void)
{
        if(T0IE && T0IF)        
        {
          
           TMR0=0x06;
       
                   if(bFlag==0)
                   {
                         GP0=1;
                              bFlag=1;
                   }
       
                    else
                        {
                          GPIO=0x00;
                          count++;
                                  if(count>998)
                                  {
                                    count=0;
                                    bFlag=0;
                                  }
                        }
    }
    T0IF=0;
}
void main(void)
{
        OPTION_REG=0x01;
        T0IF=0;
        
        GIE=1;
        TMR0=0x06;
        TRISIO=0x00;
        GP0=1;
        delay(1000);
        GP0=0;//1秒的脉冲,看看程序是否正常运行
                T0IE=0;
        while(1);
}
/////////////**************************//试试看吧

使用特权

评论回复
15
zhaor| | 2014-7-18 10:54 | 只看该作者
编译器用的是PICC9.83
你试试吧,一定要关闭AD才行哦。
//***************************************************
//           __________________
//       VDD-| 1            14 |-VSS
//   电机GP5-| 2            13 |-GP0/AN0/DAT  LED
//   AN3/GP4-| 3            12 |-GP1/AN1/CLK  
//GP3/RMCLR--| 4            11 |-GP2/AN2  
//           |________________ |
//               16F675
//***************************************************


#include <pic.h>

#define uchar unsigned char
#define uint  unsigned int


#ifndef OPEN
#define OPEN  1
#endif

#ifndef OFF
#define OFF  0
#endif


#define        SET                                1
#define        CLEAR                        0
#define        TRUE                        1
#define        FALSE                        0


__CONFIG(FOSC_EXTRCIO & WDTE_OFF & MCLRE_OFF  & BOREN_OFF  & CP_OFF & PWRTE_ON);
  //内部RC 看门狗关闭 GP3为IO 代码不保护
//#pragma config BOREN = OFF, CPD = OFF, FOSC = XT, MCLRE = OFF, WDTE = OFF, CP = OFF, PWRTE = OFF


#define   KEY     GPIO3
#define   LED     GPIO0
#define   BEEP    GPIO1
#define   SCR     GPIO5
#define   GHG     GPIO4


  /*********程序声明****************/
void  InitAPP(void);

//void  ScanKey();



void InitAPP()
{
        /* Comment out if using simulator, ICD2, or ICE2000
        #asm                                                                  //Load Factory Calibration Value Into OSCCAL
                call 0x3FF
                bsf        _STATUS,5                                                                        
                movwf _OSCCAL                                               
        #endasm
        */
       
    TRISIO=0x00;                    //Set All I/O's As OUT  
        VRCON = 0;                         //参考电压断电
        CMCON = 0x07;                     // configure comparator inputs as digital I/O                  
        ANSEL =  0;                                  // configure A/D inputs as digital I/O
        ADON=  0;       
        GIE = 1;

       
                             //Enable All Interrupts
  //  RAPU=0;         //上拉总使能
  //  WPUA5=1;            //RA5使能  
   // RAIE=1;
     IOCB5=1;        //管脚中断使能

}
/*********定时器初始化***************/
void  TimeInt()  
{
    OPTION_REG  &= 0x80;                   //
    TMR0  = 0x14;                    //  250uS
    T0IE = 1;                          //Timer0 Overflow Interrupt Enabled
    T0IF = 0;                        //Clear Timer0 Overflow Interrupt Flag

}   

//***************************************************************************
//Isr() - Interrupt Service Routine
//      - Timer0 Overflow & GP3 Pin Change Are Used
//***************************************************************************
   
void interrupt Isr()
{     static  uint  count;
        if ( (T0IE & T0IF) == 1)            //If A Timer0 Interrupt, Then
        {     
                 TMR0  = 0x14;
                 if(++count==40)  
                    {
                     count=0;
                 LED=~LED;
                      }
                                                  
                    T0IF = 0;                 //Clear Timer0 Interrupt Flag
      }
/*
   else if ( (GPIE & GPIF) == SET)          //If A GP3 Pin-Change Interrupt
    {
     if(GHG==0)
      {
       SCR = 1;  //关闭电机
       BEEP=0; //打开蜂鸣器   
      }
     else if(GHG==1)
     {
      SCR=0;//打开电机
      BEEP=1; //关闭蜂鸣器   
     }
       GPIF=0;
   
    }

        else if ( (INTE & INTF) == SET)   //If A GP2/INT External Intrrupt
        {

        }
        else if ( PEIE == SET)                          //If Peripheral Interrupts Enabled, Check Peripheral
        {                                 //Interrupts

                if ( (EEIE & EEIF) == SET)          //If A EEPROM Interrupt
                {

                }
                else if ( (ADIE & ADIF) == SET) //If A A/D Converter Interrupt
                {

                }

                else if ( (CMIE & CMIF) == SET) //If A Comparator Interrupt
                {

                }
                else if ( (TMR1IE & TMR1IF) == SET) //If A Timer1 Interrupt
                {

                }
        }


***************************/

}


//*****************************************************************************
//Main() - Main Routine
//*****************************************************************************

void  main()
{   
    InitAPP();
    TimeInt();         
        while(1)                             
          {

      }               

}




使用特权

评论回复
16
xpl129|  楼主 | 2014-7-18 11:24 | 只看该作者
yklstudent 发表于 2014-7-18 09:09
PEIE记得一并打开

好的

使用特权

评论回复
17
xpl129|  楼主 | 2014-7-18 11:28 | 只看该作者
zhouthat 发表于 2014-7-18 09:10
#include
#define uchar unsigned char
#define uint  unsigned int

感谢您发来的程序,我试试,师兄也帮着鼓捣,感觉在MPLAB编译和RF-1848烧制器配置上出了问题,连续烧制了几个单片机,一点反应也没有,很是纳闷

使用特权

评论回复
18
xpl129|  楼主 | 2014-7-18 11:29 | 只看该作者
zhaor 发表于 2014-7-18 10:54
编译器用的是PICC9.83
你试试吧,一定要关闭AD才行哦。
//********************************************** ...

谢谢您朋友,我试了下,没啥反应,感觉在MPLAB编译和RF-1848烧制器配置上出了问题,连续烧制了几个单片机,一点反应也没有,很是纳闷

使用特权

评论回复
19
xpl129|  楼主 | 2014-7-18 12:39 | 只看该作者
本帖最后由 xpl129 于 2014-7-18 12:42 编辑
zhouthat 发表于 2014-7-18 09:10
#include
#define uchar unsigned char
#define uint  unsigned int


朋友您好,可能是我表达的不清晰,程序是为了实现GP0端口在1s周期内出现1ms高电平,然后再是999ms的低电平,您修改后的程序void delay以及 void main中先是GP0=1;delay(1000);又GP0=0?还有就是T0IE=0,那就是禁止TMR0溢出中断,T0IF=1会使void interrupt ISR运行,但感觉矛盾。 刚刚接触,有很多不懂的地方,还请赐教:handshake

使用特权

评论回复
20
zhouthat| | 2014-7-18 17:12 | 只看该作者
xpl129 发表于 2014-7-18 12:39
朋友您好,可能是我表达的不清晰,程序是为了实现GP0端口在1s周期内出现1ms高电平,然后再是999ms的低电 ...

我写这里是为了让你跑一下,GP0是否有输出变化,从而确定是定时器的问题还是单片机根本没有起振或者别的~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

16

帖子

0

粉丝