[PIC®/AVR®/dsPIC®产品] 有朋友能否帮忙看一下PIC12F675定时程序问题

[复制链接]
zhouthat 发表于 2014-7-18 17:21 | 显示全部楼层
如果烤了程序进去了,上电后GP0有1秒输出(接个LED灯什么的)的话再把T0IE=0,改为T0IE=1,记得PEIE也要置1.打开定时器中断,再看看GP0是否输出连续脉冲。
我一般都是这样调程序的,我也是学了没多久,相互探讨咯~~~
逍遥派掌门 发表于 2014-7-18 18:15 | 显示全部楼层
建议使用CCS来写代码吧,简单。

如果楼主只是简单输出高低电平,完全可以不用定时器。

CCS代码如下:

#include <12F675.h>


#define PPY   PIN_A0

#use delay(clock=10000000)     // 根据晶振来改变,和 delay_ms() 有重大关系

void main()
{
    set_tris_a(0xFE);

    while(1)
    {
       output_high(PPY);        // 输出高电平
       delay_ms(1);             // 延时1ms
       output_low(PPY);         // 输出低电平
       delay_ms(999);           // 延时999ms
    }
}

以上所有函数为CCS自带,够简洁吧?

另外,在烧写芯片的时候要注意配置,晶振类型要选择正确。
yklstudent 发表于 2014-7-19 08:59 | 显示全部楼层
#include <pic.h>

__CONFIG(HS & WDTDIS & PWRTDIS & MCLREN & BORDIS);

#define true                        1
#define false                        0

#define Enable_AllInt()                        PEIE=1;GIE=1;
#define Disable_AllInt()                PEIE=0;GIE=0;

#ifndef _XTAL_FREQ
#define _XTAL_FREQ                        4000000ul
#endif

volatile bit LED_Port        @ (unsigned)&GPIO*8+0;

typedef struct
{
        unsigned char t0_overflow        :1;
        unsigned char led_status        :1;
        unsigned char direction                :1;
        unsigned char blank                        :5;
}SysStatys_T;

SysStatys_T SysStatus;

extern void Init_Sys(void);
extern void Init_Port(void);
extern void Init_Timer0(void);
extern void Task_Run_Led(void);

void main(void)
{
        unsigned int rti_cnt = 0;
        unsigned int count = 0;
        Init_Sys();
        Enable_AllInt();
        while( true )
        {
                if( SysStatus.t0_overflow )
                {
                        SysStatus.t0_overflow = 0;
                        if( SysStatus.led_status )
                                count = 1;
                        else
                                count = 999;
                        if(rti_cnt >= (count-1))
                        {
                                rti_cnt = 0;
                                Task_Run_Led();
                        }
                        else
                        {
                                rti_cnt++;
                        }
                }
        }
}

void interrupt ISR(void)
{
        if( T0IE && T0IF )
        {
                T0IF = 0;
                TMR0 = 0x85;
                SysStatus.t0_overflow = 1;
        }
}

void Init_Sys(void)
{
        Init_Port();
        Init_Timer0();
}

void Init_Port(void)
{
        TRISIO = 0x00;
        GPIO = 0x00;
}

//1ms interrupt
void Init_Timer0(void)
{
        T0IF = 0;
        T0IE = 1;
        TMR0 = 0x83;
        OPTION = 0b10000010;        //1:8       
}

void Task_Run_Led(void)
{
        SysStatus.led_status ^= 1;
        LED_Port = (SysStatus.led_status)?1:0;
}
Rain_King 发表于 2014-7-19 09:52 | 显示全部楼层
都是大神级别的任务啊...............
MOn51 发表于 2014-7-19 11:11 | 显示全部楼层
1:软件模拟运行,看是否正确。2:烧片运行。这类片子烧片要注意啊!要用PIC的专用编程器!
dogglove 发表于 2014-7-19 11:12 | 显示全部楼层
我觉得大家已经解释的很清楚啦,楼上各位已经给你了一个编写程序,开发过程的一个思路,及例程.你当整理思路,认真研读DATASHEET.
阳光的味道3121 发表于 2014-7-19 11:42 | 显示全部楼层
你把你的程序这块调整下
if(count==999)
{
   count=0;
   bFlag=0;
}
if里面更改为if(count>=999)就可以了。
更改后就好了。
zhaor 发表于 2014-7-19 17:34 | 显示全部楼层
1ms亮或者暗你是看不出来的。应该加大些,先验证程序下载了,并且能运行。然后再1ms,999ms。
 楼主| xpl129 发表于 2014-7-20 19:23 | 显示全部楼层
zhouthat 发表于 2014-7-18 17:21
如果烤了程序进去了,上电后GP0有1秒输出(接个LED灯什么的)的话再把T0IE=0,改为T0IE=1,记得PEIE也要置1 ...

谢谢朋友,我试试
 楼主| xpl129 发表于 2014-7-20 19:25 | 显示全部楼层
逍遥派掌门 发表于 2014-7-18 18:15
建议使用CCS来写代码吧,简单。

如果楼主只是简单输出高低电平,完全可以不用定时器。

感谢层主指导:handshake
 楼主| xpl129 发表于 2014-7-20 19:26 | 显示全部楼层
yklstudent 发表于 2014-7-19 08:59
#include

__CONFIG(HS & WDTDIS & PWRTDIS & MCLREN & BORDIS);

谢谢朋友
 楼主| xpl129 发表于 2014-7-20 19:27 | 显示全部楼层
阳光的味道3121 发表于 2014-7-19 11:42
你把你的程序这块调整下
if(count==999)
{

我试试,朋友
阳光的味道3121 发表于 2014-7-20 19:40 | 显示全部楼层
xpl129 发表于 2014-7-20 19:27
我试试,朋友

那个解决了没有?
 楼主| xpl129 发表于 2014-7-20 19:45 | 显示全部楼层
阳光的味道3121 发表于 2014-7-20 19:40
那个解决了没有?

没呢,朋友,感觉问题还是出在编译和烧制上,无论程序如何改,单片机都没有信号,所以感觉还是编译和烧纸的问题
逍遥派掌门 发表于 2014-7-21 12:04 | 显示全部楼层
本帖最后由 逍遥派掌门 于 2014-7-21 12:07 编辑
xpl129 发表于 2014-7-20 19:25
感谢层主指导

1、用示波器看看有没有输出。

2、用仿真软件proteus来看编程的效果。

3、将亮的时间和暗的时间均分,看看有没有效果。
panchunjiang 发表于 2014-10-14 22:34 | 显示全部楼层
我用的汇编,也在用PIC12F675教你个小技术 365495130
十月风城 发表于 2014-10-15 12:41 来自手机 | 显示全部楼层
先测试定时器中断有没有问题,然后再调时间长短。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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