我做了个PIC的串口发送中断,但是停不下来。。
int i=0;
int RXnum=0,TXnum=0,flag=0;
/*-------------异步通信终端设置-----------------*/
#pragma code high_vector_section=0x08
/*高优先级转跳至0x08*/
void high_vector (void)
{
_asm goto PIC18F_HIGH_isr _endasm/*转跳*/
}
#pragma code/*回到默认代码段*/
#pragma code low_vector_section=0x18
/*低优先级跳转到0x18处*/
void low_vector (void)
{
_asm goto PIC18F_LOW_isr _endasm/*转跳*/
}
#pragma code/*回到默认代码段*/
/*---高优先级中断服务程序---*/
#pragma interrupt PIC18F_HIGH_isr
void PIC18F_HIGH_isr (void)
{
if(PIR1bits.RCIF&&PIE1bits.RCIE)/*将输入的数据存入data数组*/
{
data[RXnum]=RCREG;
//PIR1bits.RCIF=0;
RXnum++;
if(RXnum>15)
{
RXnum=0;/*计数器清零*/
flag=1;/*标志位置1表示收满16个数*/
PIE1bits.RCIE=0;/*关闭接收防止溢出*/
}
}
if(PIR1bits.TXIF&&PIE1bits.TXIE)
{
TXREG=i;
//while(!TXSTAbits.TRMT);
i++;
if(i>255)
{
i=0;
flag=0;/*标志清零*/
PIE1bits.TXIE=0;/*关闭中断*/
//PIR1bits.TXIF=0;
}
//PIE1bits.TXIE=0;
}
}
/*---低优先级中断服务程序---*/
#pragma interrupt PIC18F_LOW_isr
void PIC18F_LOW_isr (void)
{
}
/*初始化串口*/
void usart_init()
{
INTCONbits.GIE=0;/*关全局中断*/
TRISC=0xdf;/*初始化C端口输出*/
RCSTA=0x90;/*@输入引脚初始化*/
TXSTA=0x24;/*@输出引脚初始化*/
IPR1=0x30;/*@设定串口接收发送中断高优先级*/
PIE1=0x20;/*@串口中断设置*/
INTCONbits.PEIE=1;/*@外设中断允许*/
SPBRG=10000000/64*(1*3+1)/9600-1;/*@波特率寄存器置值,设置波特率*/
//INTCONbits.GIEL=1;/*@低优先中断*/
INTCONbits.GIE=1;/*@开总中断*/
}
/*串口发送*/
void usart_tx()
{
PIE1bits.TXIE=1;
}
void main(void)
{
toppic_init();/*TOPPIC开发板初始化*/
usart_init();/*eusart异步通讯初始化*/
while(1)
{
usart_tx();/*写输出*/
delay(5);
}
}
小弟初学PIC,程序要求发送00到FF然后停止等下一个5S内再打开串口发送00到FF,现在数字是发送了但是程序跑飞了,连续传送停不下来。 PIE1bits.TXIE=0; 不是应该能关闭发送中断麽。为什么我停不下来啊?求教。
我试过用TXIF,TXIE和TXEN来关闭串口了,都没有成功。
if(PIR1bits.TXIF&&PIE1bits.TXIE)
{
PIR1bits.TXIF=0;
TXREG=i;
//while(!TXSTAbits.TRMT);
i++;
if(i>255)
{
i=0;
flag=0;/*标志清零*/
PIE1bits.TXIE=0;/*关闭中断*/
//PIR1bits.TXIF=0;
}
//PIE1bits.TXIE=0;
}
此处应该在进入中断时就清0标志位
还有你这有些语句不应该注释掉的;如//while(!TXSTAbits.TRMT);//PIR1bits.RCIF=0;
不行欸程序还是飞得不要不要的T.T
BOSS说中断不要添加任何查询、延时来降低效率。让单片机根据中断自己工作。
搞定问题了。程序没有问题,主程序的头文件里忘记include delay了。多谢大家的帮助。
另外,PIC18F里读取完一个数RCIF会自动清零,所以我这里加了这句语句同时注释掉让自己心里有个数罢了
已解决,主函数里没include delay.h,导致延迟函数无法使用。
没有#include“delay.h”程序也能编译通过吗?,你main函数里调用了delay函数啊
确实很奇怪。没考虑过会是这方面问题。感觉MPlab挺奇怪的,经常有些build和program的错误检测不出来。之前接的实验版的GND坏掉了竟然也是program成功。
路过看看!