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

PIC18F4520进不到中断函数

[复制链接]
4626|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ak283616|  楼主 | 2013-10-10 17:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
编写了一个定时器程序,检查了很多遍还是进不了中断函数里面,求高手帮忙检查
PICC18编译器
#include <htc.h>

#define uchar unsigned char
#define uint unsigned int

uint counter=0;//计数

void init(void)
{
INTCON=0xC0;      //总中断使能
INTCON2=0;
INTCON3=0;
PIE1=0x03;        //使能定时器1 2中断
PIE2=0;
IPR1=0x23;
TMR1L=(65536-6250)%256;  //定时器1高位装数
TMR1H=(65536-6250)/256;  //定时器1低位装数
T1CON=0x31;     //1:8分频,启动定时器1   
T2CON=0x04;  //打开定时器2,不分频
PR2=43;   //模拟115200波特率
}

void main(void)
{
  uchar k=0;
  init();
while(1)
{
/* if(TMR1IE&&TMR1IF)
{
  TMR1IF=0;
  TMR1L=(65536-6250)%256;   
  TMR1H=(65536-6250)/256;
  counter++;
}*/
    if(counter>=30)//每0.3秒显示一次
   {
    counter=0;
    picture_display(k);  //显示图片子函数
    k++;
    if(k>=85)
        k=0;  
    }
   }
}

void interrupt serve(void)     //中断服务
{
    if(TMR1IE&&TMR1IF)
{   
  TMR1IF=0;   
  TMR1L=(65536-6250)%256;   
  TMR1H=(65536-6250)/256;  //10ms时基
  counter++;
}
}

程序的基本内容如上,程序目的是每隔0.3秒更新一次图片,这样图片无法显示,如果把主函数里的/**/去掉使用查询法,图片能正常显示
试过各种情况觉得觉得问题就是进不去中断函数里,求高手指点!!!
如果有18F4520的定时器PICC18编译器下的例子分享一个也感激不尽
沙发
理工大小薛| | 2013-10-10 19:51 | 只看该作者
我的18F4520开发板例程里有这样一段,具体我也说不大明白,你加上试试/*****************************************中断****************************************/

#pragma code high_vector_section=0x8       
void high_vector (void)
        {
           _asm goto PIC18F_High_isr _endasm
        }

#pragma code low_vector_section=0x18

void low_vector (void)
        {
           _asm goto PIC18F_Low_isr _endasm
        }

#pragma code       

/******************************---高优先级中断服务程序---*************************/
#pragma interrupt PIC18F_High_isr

void PIC18F_High_isr (void)
        {
                TMR2=9;
                PIR1bits.TMR2IF=0;/*清除中断标志*/       
                timer1++;
                timer2++;
                timer3++;
                timer4++;
                timer5++;
        }

/******************************---低优先级中断服务程序---**************************/
#pragma interruptlow PIC18F_Low_isr
void PIC18F_Low_isr (void)
        {

使用特权

评论回复
板凳
ak283616|  楼主 | 2013-10-11 09:40 | 只看该作者
理工大小薛 发表于 2013-10-10 19:51
我的18F4520开发板例程里有这样一段,具体我也说不大明白,你加上试试/********************************** ...

这段代码是MMC18编译器的,我用的是PICC18编译器,不想改变编译器,改代码比较麻烦
还是谢谢你了

使用特权

评论回复
地板
Rain_King| | 2013-10-11 09:51 | 只看该作者
ak283616 发表于 2013-10-11 09:40
这段代码是MMC18编译器的,我用的是PICC18编译器,不想改变编译器,改代码比较麻烦
还是谢谢你了 ...

能不能进中断函数,要测出来,不能凭借感觉,你可以在中断里面加一个测试脚,用来测试是否进入到中断函数了....

使用特权

评论回复
5
Rain_King| | 2013-10-11 09:54 | 只看该作者
至于怎么加嘛,我是这样加的,不过有些人说我的是错误的,我自己用是没有问题的;
if(Tem==1)
{
  Tem=0;
}
else
{
  Tem=1;
}
Tem是一个脚,然后你测这脚是否有波形出来,或者电压变化,等等.......我一般就用这样的方法来测试是否运行到我需要的地方,或者用来测试时间...

使用特权

评论回复
6
ak283616|  楼主 | 2013-10-11 10:56 | 只看该作者
Rain_King 发表于 2013-10-11 09:54
至于怎么加嘛,我是这样加的,不过有些人说我的是错误的,我自己用是没有问题的;
if(Tem==1)
{

类似的方法我也试过了,在中断函数里不加判断,让一个计数+1,刚才也按你说的在中断加了个脚的变化的代码,也是测不出波形,同样的代码移植到PIC16F877A里能正常运行

使用特权

评论回复
7
Rain_King| | 2013-10-11 11:27 | 只看该作者
ak283616 发表于 2013-10-11 10:56
类似的方法我也试过了,在中断函数里不加判断,让一个计数+1,刚才也按你说的在中断加了个脚的变化的代码,也 ...

我看了一下....18系列的头文件好像是pic18.h......16系列的才是htc.....不知道我说的对不对...还有18系列的有些定义和16的不一样...

使用特权

评论回复
8
ak283616|  楼主 | 2013-10-11 13:06 | 只看该作者
Rain_King 发表于 2013-10-11 11:27
我看了一下....18系列的头文件好像是pic18.h......16系列的才是htc.....不知道我说的对不对...还有18系列 ...

其实htc.h里面包含了16 18 32系列的头文件,之后我再加了pic18.h这个头文件,还是没效果

使用特权

评论回复
9
Rain_King| | 2013-10-11 15:00 | 只看该作者
ak283616 发表于 2013-10-11 13:06
其实htc.h里面包含了16 18 32系列的头文件,之后我再加了pic18.h这个头文件,还是没效果 ...

你确定芯片没有坏???

使用特权

评论回复
10
Rain_King| | 2013-10-11 15:11 | 只看该作者
本帖最后由 Rain_King 于 2013-10-11 15:12 编辑
ak283616 发表于 2013-10-11 13:06
其实htc.h里面包含了16 18 32系列的头文件,之后我再加了pic18.h这个头文件,还是没效果 ...

我在看看..........

使用特权

评论回复
11
ak283616|  楼主 | 2013-10-11 15:17 | 只看该作者
Rain_King 发表于 2013-10-11 15:00
你确定芯片没有坏???

还有其他程序的,而且其他程序运行良好,虽然中断进不去,但是用查询法来定时是可以运行的,但是整个工程用到3个中断源,全部用查询比较麻烦.
整个工程内有比较耗时间的子程序,某些条件下一个子程序能耗掉30ms的时间,全部用查询法随着时间的积累定时时间越来越不准...

使用特权

评论回复
12
Rain_King| | 2013-10-11 15:21 | 只看该作者
ak283616 发表于 2013-10-11 13:06
其实htc.h里面包含了16 18 32系列的头文件,之后我再加了pic18.h这个头文件,还是没效果 ...

我认真的看了看,貌似没有问题,不过我要提示一个问题是:对TMRxH 的任何直接写入请求都不会清零Timer1/3/5预分频值。预分频值只能通过对TMRxL寄存器的写请求来清零。也就是说,你的预分频值在中断里已经改变了...需要重新设置....

使用特权

评论回复
13
Rain_King| | 2013-10-11 15:32 | 只看该作者
这里还有一个提示:虽然 TMRxH:TMRxL 寄存器对可以赋值,但是我觉得,应该将TMRxIF清零,在允许中断前。。。这只是数据手册的提示而已....

QQ截图20131011153030.png (9.04 KB )

QQ截图20131011153030.png

使用特权

评论回复
14
Rain_King| | 2013-10-11 15:34 | 只看该作者
其他的我看了看,应该没有问题了...我也没法找出问题来了......

使用特权

评论回复
15
ak283616|  楼主 | 2013-10-11 15:58 | 只看该作者
Rain_King 发表于 2013-10-11 15:21
我认真的看了看,貌似没有问题,不过我要提示一个问题是:对TMRxH 的任何直接写入请求都不会清零Timer1/3 ...

即使预分频值改变了,定时器计数满也会益出中断吧,现在是在中断里的任何代码都没有执行,尝试其他中断源也是中断函数没反应...

使用特权

评论回复
16
ak283616|  楼主 | 2013-10-11 15:58 | 只看该作者
Rain_King 发表于 2013-10-11 15:32
这里还有一个提示:虽然 TMRxH:TMRxL 寄存器对可以赋值,但是我觉得,应该将TMRxIF清零,在允许中断前。。 ...

这个我试试吧

使用特权

评论回复
17
ak283616|  楼主 | 2013-10-11 15:59 | 只看该作者
Rain_King 发表于 2013-10-11 15:34
其他的我看了看,应该没有问题了...我也没法找出问题来了......

谢谢你这么用心回答啊,再不行用查询法也是可以的

使用特权

评论回复
18
追梦的阿土哥| | 2015-6-6 21:29 | 只看该作者
理工大小薛 发表于 2013-10-10 19:51
我的18F4520开发板例程里有这样一段,具体我也说不大明白,你加上试试/********************************** ...

你好,请问ccp1中断跟usart的接收、传送中断谁的优先级高?

使用特权

评论回复
19
shubo365| | 2016-1-31 21:21 | 只看该作者
遇到了和你一样的问题,不知你解决没有

使用特权

评论回复
20
廖雪超哦也| | 2016-9-21 17:39 | 只看该作者
中断入口地址错了  应该是这个地址void interrupt pic18_int (void)

使用特权

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

本版积分规则

2

主题

9

帖子

0

粉丝