微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 我做了个PIC的串口发送中断,但是停不下来。。

我做了个PIC的串口发送中断,但是停不下来。。

时间:10-02 整理:3721RD 点击:
程序如下:
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成功。

路过看看!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top