PowerNan 发表于 2009-7-28 16:52:04

UART6接收中断问题

UART6 接收中断后,用IAR观察器检测接受中断标志没有置1,并且在中断函数里给全局变量复制,出中断函数后全局变量变为0,为什么?

sophie0403 发表于 2009-7-29 15:33:54

你是在中断函数里看的吧?进中断函数后可能IF位已经清零了.

全局变量是不是被优化掉了?

zhouli3339926 发表于 2009-7-29 15:53:23

应该是没有配置选项字节,没有设置看门狗或“喂狗”,程序被看门狗复位了

PowerNan 发表于 2009-7-30 14:37:30

是没有设置看门狗,但是同样的情况在AD中断函数中不存在。我把代码给大家贴上,大家帮我看看。谢谢!
#include "io78f0453.h"
#include "nec78f0xb.h"
#include <intrinsics.h>
#include "UART6_intal.h"

void UART6_inital(void);
void Clock_inital(void);
__interrupt void INTSR6_jieshou( void );

unsigned char jieshou_tem;
unsigned char jieshou_flag=0; //----------------接受完毕标志

unsigned char reciv_tem;//-------------------接受缓冲全局变量数组
float k=5;//------------------------------接受缓冲计数全局变量
// unsigned char a=0;


void main( void )
{
// unsigned char i;
unsigned int j;
Clock_inital();//---------------时钟模块初始话
UART6_inital();//---------------UART6初始化,波特率19200
__enable_interrupt();//---------中断使能

while(1)
{

    if( jieshou_flag==1)//--------判断数据是否接受完毕
    {
   
       TXB6=jieshou_tem; //--------发送数据
       for(j=0;j<600;j++);
       jieshou_flag=0;//-------------发送完毕,接受标志清零
   }
}
}

void UART6_inital(void)
{
/*    |------|------|------|------|------|------|------|------|*
       |7   |6   |5   |4   |3   |   2|1   |0   |
ASIM6 |------|------|------|------|------|------|------|------|
       |POWER6|TXE6|RXE6|PS61|PS60| CL6|SL6   |ISRM6 |
       |------|------|------|------|------|------|------|------|*/
POWER6=1;//-----------POWER6=0:禁止内部操作时钟操作POWER6=1:允许内部操作时钟操作
TXE6=1;//-----------TXE6=0:禁止发送,TXE6=1:允许发送
RXE6=1;//-----------RXE6=0:禁止接受,REX6=1:允许接受
PS61=0;//-----------| PS61 | PS60 |
PS60=1;//-----------|0   |0   |:发送不输出校验位,接收无校验接受
         //-----------|0   |1   |:发送输出零校验,接收按零校验接受
         //-----------|1   |0   |:发送输出奇校验,接收按奇校验判断
           //-----------|1   |1   |:发送输出偶校验,接收按偶校验判断
CL6=1;   //-----------CL6=0传输数据的字符宽度为7位,CL6=1传输数据的字符宽度为8位
SL6=0;   //-----------SL6=0发送数据停止位个数为1位,SL6=1:发送数据停止位个数为2位
ISRM6=1; //-----------ISRM6=0:出错时产生INTSRE6,ISRM6=1:出错时产生INTSR6

SBRF6=1;
SBRT6=0;
/*   |------|------|------|------|------|------|------|------|*
       |7   |6   |5   |4   |3   |   2|1   |0   |
ISC   |------|------|------|------|------|------|------|------|
       |   0|0   |ISC5|ISC4 |ISC3| ISC2 |ISC1|ISC0|
       |------|------|------|------|------|------|------|------|*/

ISC5=1;//-------------|ISC5|ISC4|
ISC4=0;//-------------| 0| 0|:输入源选择TXD6-P112,RXD6-P113
         //-------------| 1| 0|:输入源选择TXD6-P13,RXD6-P12
ISC3=0;//-------------ISC3=0:RXD6/113输入禁止,ISC3=1:RXD6/P113输入允许
ISC2=0;//-------------ISC2=0:不允许控制TI52输入(P34)ISC2=1:允许控制TI52输入(P34)
ISC1=0;//-------------TI000=0输入源选择P33,TI000=1输入源选择RXD6(P12或P113)
ISC0=0;//-------------ISC0=0:INTP0输入源选择为INTP0(P120),ISC0=1:INTP0输入源选择为RXD6(P12或P113)

PF13=1;//-------------USRT6的输出选择P13
PM13=0;//-------------选择P13为TXD6
PM12=1;//-------------选择P12为RXD6
P13=1;   //-----------预置P13为1
CKSR6=0X03;//---------选择串口基本时钟fxclk6为fPRS/8
BRGC6=0x1a;//---------设置分频系数k为52,波特率为9600
SRMK6=0;//------------SRMK6=0,打开UART6接收中断,SRMK6=1,屏蔽UART6接收中断
STMK6=1;//------------STMK6=0;打开UART6发送中断, STMK6=1,屏蔽UART6发送中断
}

void Clock_inital(void)
{
// AMPH=0;//---------------------------AMPH
         //---------------------------| 0 |主系统时钟小于10MHz
         //---------------------------| 1 |主系统时钟大于10MHz小于20MHz
EXCLK=0;//----------- |EXCLK|OSCSEL|
OSCSEL=0;//---------|0|   0|:X1振荡器停止
             //---------|0|   1|:X1振荡器运行,引脚接晶振
             //---------|1|   0|:X1振荡器停止,引脚为IO
             //---------|1|   1|:外部时钟输入模式,引脚P121为IO,P122为外部时钟输入
// XTSTART=0;//----------|XTSTART|EXCLKS|OSCSELS|
// EXCLKS=0;//-----------|0|0|0|:XT1副系统时钟关闭,连接引脚为IO
// OSCSELS=0;//----------|0|0|1|:XT1副系统时钟振荡,引脚连接32768Hz晶振
            //----------|0|1|0|:XT1副系统时钟关闭,引脚为IO
                        //----------|0|1|1|:XT1副系统时钟为外部时钟输入模式P123为IO ,P124为外部时钟输入引脚
                        //----------|1|*|*|:XT1副系统时钟振荡,引脚连接32768晶振
CLS=0;//--------------CLS=0:选择CPU时钟为主系统时钟,CSL=1:选择CPU时钟为副系统时钟
CSS=1;//--------------| CSS | PCC2 | PCC1 | PCC0 |
PCC2=0;//-------------|0|   0|0   |0   |:CPU时钟选择为fxp
PCC1=0;//-------------|0|   0|0   |1   |:CPU时钟选择为fxp/2
PCC0=0;//-------------|0|   0|1   |0   |:CPU时钟选择为fxp/4
         //-------------|0|   0|1   |1   |:CPU时钟选择为fxp/8
       //-------------|0|   1|0   |0   |:CPU时钟选择为fxp/16
       //-------------|1|   0|0   |0   |:CPU时钟选择为fsub/2
RSTS=0;//-------------RSTS=0:内部高速振荡器为精确稳定,RSTS=1:内部高速振荡器为稳定工作
LSRSTOP=1;//----------LSRSTOP=0:内部低速振荡器运行,LSRSTOP=1:内部低速振荡器停止运行
RSTOP=0;//------------RSTOP=0内部高速振荡器振荡,RSTOP=1:内部高速振荡器停止
MSTOP=1;//------------MSTOP=0:外部高速振荡器X1振荡,MSTOP=1:外部高速振荡器X1停止
MCS=0; //-------------MCS=0:主系统时钟选择为内部高速振荡器,MCS=1主系统时钟使用外部高速振荡时钟
XSEL=0;//-------------|XSEL|MCM0|
MCM0=0;//-------------| 0|0 |:主系统时钟fxp和外部硬件时钟fprs选择为内部高速振荡时钟frh
         //-------------| 0|1 |:主系统时钟fxp和外部硬件时钟fprs选择为内部高速振荡时钟frh
       //-------------| 1|0 |:主系统时钟fxp和选择为内部高速振荡时钟frh,外部硬件时钟fprs选择为fxh
       //-------------| 1|1 |:主系统时钟fxp和外部硬件时钟fprs选择为高速系统时钟fxh
         //---------------------------时钟fPRS选择为内部高速振荡
         //---------------------------时钟fRH

}

#pragma vector = INTSR6_vect
__interrupt void INTSR6_jieshou( void )
{

k=65;
SRIF6=0;
jieshou_flag=1;
jieshou_tem=RXB6;

}

PowerNan 发表于 2009-7-30 14:39:15

#include "nec78f0xb.h" 头文件是原头文件里没定义的选项
/*----------------------------------------------
* SFR bits (default names)
*--------------------------------------------*/

#ifndef __78K_BIT_STRUCTURE__
#define __78K_BIT_STRUCTURE__
typedef struct
{
    unsigned char no0:1;
    unsigned char no1:1;
    unsigned char no2:1;
    unsigned char no3:1;
    unsigned char no4:1;
    unsigned char no5:1;
    unsigned char no6:1;
    unsigned char no7:1;
} __BITS8;
#endif


#define P00            P0_bit.no0
#define P01            P0_bit.no1
#define P02            P0_bit.no2
#define P03            P0_bit.no3
#define P04            P0_bit.no4
#define P06            P0_bit.no6
#define P07            P0_bit.no7



#define PM00            PM0_bit.no0
#define PM01            PM0_bit.no1
#define PM02            PM0_bit.no2
#define PM03            PM0_bit.no3
#define PM04            PM0_bit.no4
#define PM05            PM0_bit.no5
#define PM06            PM0_bit.no6
#define PM07            PM0_bit.no7


#define P10            P1_bit.no0
#define P11            P1_bit.no1
#define P12            P1_bit.no2
#define P13            P1_bit.no3
#define P14            P1_bit.no4
#define P16            P1_bit.no6
#define P17            P1_bit.no7

#define PM10            PM1_bit.no0
#define PM11            PM1_bit.no1
#define PM12            PM1_bit.no2
#define PM13            PM1_bit.no3
#define PM14            PM1_bit.no4
#define PM15            PM1_bit.no5
#define PM16            PM1_bit.no6
#define PM17            PM1_bit.no7

#define P20            P2_bit.no0
#define P21            P2_bit.no1
#define P22            P2_bit.no2
#define P23            P2_bit.no3
#define P24            P2_bit.no4
#define P26            P2_bit.no6
#define P27            P2_bit.no7

#define PM20            PM2_bit.no0
#define PM21            PM2_bit.no1
#define PM22            PM2_bit.no2
#define PM23            PM2_bit.no3
#define PM24            PM2_bit.no4
#define PM25            PM2_bit.no5
#define PM26            PM2_bit.no6
#define PM27            PM2_bit.no7

#define P30            P3_bit.no0
#define P31            P3_bit.no1
#define P32            P3_bit.no2
#define P33            P3_bit.no3
#define P34            P3_bit.no4
#define P36            P3_bit.no6
#define P37            P3_bit.no7

#define PM30            PM3_bit.no0
#define PM31            PM3_bit.no1
#define PM32            PM3_bit.no2
#define PM33            PM3_bit.no3
#define PM34            PM3_bit.no4
#define PM35            PM3_bit.no5
#define PM36            PM3_bit.no6
#define PM37            PM3_bit.no7

#define P40            P4_bit.no0
#define P41            P4_bit.no1
#define P42            P4_bit.no2
#define P43            P4_bit.no3
#define P44            P4_bit.no4
#define P46            P4_bit.no6
#define P47            P4_bit.no7

#define PM40            PM4_bit.no0
#define PM41            PM4_bit.no1
#define PM42            PM4_bit.no2
#define PM43            PM4_bit.no3
#define PM44            PM4_bit.no4
#define PM45            PM4_bit.no5
#define PM46            PM4_bit.no6
#define PM47            PM4_bit.no7

#define P60            P6_bit.no0
#define P61            P6_bit.no1
#define P62            P6_bit.no2
#define P63            P6_bit.no3
#define P64            P6_bit.no4
#define P66            P6_bit.no6
#define P67            P6_bit.no7



#define PM60            PM6_bit.no0
#define PM61            PM6_bit.no1
#define PM62            PM6_bit.no2
#define PM63            PM6_bit.no3
#define PM64            PM6_bit.no4
#define PM65            PM6_bit.no5
#define PM66            PM6_bit.no6
#define PM67            PM6_bit.no7

#define P70            P7_bit.no0
#define P71            P7_bit.no1
#define P72            P7_bit.no2
#define P73            P7_bit.no3
#define P74            P7_bit.no4
#define P76            P7_bit.no6
#define P77            P7_bit.no7



#define PM70            PM7_bit.no0
#define PM71            PM7_bit.no1
#define PM72            PM7_bit.no2
#define PM73            PM7_bit.no3
#define PM74            PM7_bit.no4
#define PM75            PM7_bit.no5
#define PM76            PM7_bit.no6
#define PM77            PM7_bit.no7

#define P80            P8_bit.no0
#define P81            P8_bit.no1
#define P82            P8_bit.no2
#define P83            P8_bit.no3
#define P84            P8_bit.no4
#define P86            P8_bit.no6
#define P87            P8_bit.no7



#define PM80            PM8_bit.no0
#define PM81            PM8_bit.no1
#define PM82            PM8_bit.no2
#define PM83            PM8_bit.no3
#define PM84            PM8_bit.no4
#define PM85            PM8_bit.no5
#define PM86            PM8_bit.no6
#define PM87            PM8_bit.no7

#define PM110            PM11_bit.no0
#define PM111            PM11_bit.no1
#define PM112            PM11_bit.no2
#define PM113            PM11_bit.no3


//////////16位定时器控制寄存器位定义//////////

/*********16位定时器模式控制寄存器TMC00位补充定义********/
#define    TMC001          TMC00_bit.no1
#define    TMC002          TMC00_bit.no2
#define    TMC003          TMC00_bit.no3

/*********16位定时器捕捉/比较控制寄存器CRC00位补充定义********/
/*   |-----|------|------|------|------|------|------|------|*
       |7|6   |5   |4   |3   |   2|1   |0   |
CRC00 |-----|------|------|------|------|------|------|------|
       |0|   0|   0|   0|   0|CRC002|CRC001|CRC000|
       |-----|------|------|------|------|------|------|------|*/

#define    CRC000          CRC00_bit.no0
#define    CRC001          CRC00_bit.no1
#define    CRC002          CRC00_bit.no2

/****************16位定时器输出控制寄存器00(TOC00)位补充定义*************/
   /*|-----|------|------|------|------|-----|------|------|*
       |7|6   |5   |4   |3   |2|1   |0   |
TOC00 |-----|------|------|------|------|-----|------|------|
       |0|OSPT00|OSPE00|TOC004|LVS00 |LVR00|TOC001|TOE00 |
       |-----|------|------|------|------|-----|------|------|*/


#define TOC001             TOC00_bit.no1
#define TOC004            TOC00_bit.no4


/*************************预分频器模式寄存器00(PRM00)位补充定义*************/
/*   |-----|-----|-----|-----|-----|-----|------|------|*
       |7|6|5|4|3|2|1   |0   |
PRM00 |-----|-----|-----|-----|-----|-----|------|------|
       |ES101|ES100|ES001|ES000|0|0|PRM001|PRM000|
       |-----|-----|-----|-----|-----|-----|------|------|*/

#define PRM000PRM00_bit.no0
#define PRM001PRM00_bit.no1
#define ES000   PRM00_bit.no4
#define ES001   PRM00_bit.no5
#define ES100   PRM00_bit.no6
#define ES101   PRM00_bit.no7

/*   |-----|------|------|------|------|------|------|------|*
       |7|6   |5   |4   |3   |   2|1   |0   |
TMC50 |-----|------|------|------|------|------|------|------|
       |TCE50|TMC506|   0|   0|LVS50 |LVR50 |TMC501|TOE50 |
       |-----|------|------|------|------|------|------|------|*/
#define TMC501            TMC50_bit.no1
#define TMC506            TMC50_bit.no6



/*   |-----|------|------|------|------|------|------|------|*
       |7|6   |5   |4   |3   |   2|1   |0   |
TMC51 |-----|------|------|------|------|------|------|------|
       |TCE51|TMC516|   0|   0|LVS51 |LVR51 |TMC511|TOE51 |
       |-----|------|------|------|------|------|------|------|*/
#define TMC511            TMC51_bit.no1
#define TMC516            TMC51_bit.no6

/*   |-----|------|------|------|------|------|------|------|*
       |7|6   |5   |4   |3   |   2|1   |0   |
TCL50 |-----|------|------|------|------|------|------|------|
       |0    |   0|   0|   0|   0   TCL502|TCL501|TCL500|
       |-----|------|------|------|------|------|------|------|*/

#define TCL502               TCL50_bit.no2
#define TCL501               TCL50_bit.no1
#define TCL500               TCL50_bit.no0

/*   |-----|------|------|------|------|------|------|------|*
       |7|6   |5   |4   |3   |   2|1   |0   |
TCL51 |-----|------|------|------|------|------|------|------|
       |0    |   0|   0|   0|   0   TCL512|TCL511|TCL510|
       |-----|------|------|------|------|------|------|------|*/

#define TCL512            TCL51_bit.no2
#define TCL511            TCL51_bit.no1
#define TCL510            TCL51_bit.no0

//UART6
/*   |------|------|------|------|------|------|------|------|*
       |7   |6   |5   |4   |3   |   2|1   |0   |
ASIM6 |------|------|------|------|------|------|------|------|
       |POWER6|TXE6|RXE6|PS61|PS60| CL6|SL6   |ISRM6 |
       |------|------|------|------|------|------|------|------|*/

#define ISRM6;            ASIM6_bit.no0
#define SL6;            ASIM6_bit.no1
#define CL6;            ASIM6_bit.no2
#define PS60;             ASIM6_bit.no3
#define PS61;             ASIM6_bit.no4
#define RXE6            ASIM6_bit.no5

/*   |------|------|------|------|------|------|------|------|*
       |7   |6   |5   |4   |3   |   2|1   |0   |
ISC   |------|------|------|------|------|------|------|------|
       |   0|0   |ISC5|ISC4 |ISC3| ISC2 |ISC1|ISC0|
       |------|------|------|------|------|------|------|------|*/

#define ISC0            ISC_bit.no0
#define ISC1            ISC_bit.no1
#define ISC2            ISC_bit.no2
#define ISC3            ISC_bit.no3
#define ISC4            ISC_bit.no4
#define ISC5            ISC_bit.no5



/*   |------|------|------|------|------|------|------|------|*
       |7   |6   |5   |4   |3   |   2|1   |0   |
PF1   |------|------|------|------|------|------|------|------|
       |   0|0   |0   |0   |PF13| 0   |0    |0   |
       |------|------|------|------|------|------|------|------|   适用于0453以下芯片*/
#define PF13            PF1_bit.no3



//CLOCK
/*   |------|------|------|-------|------|------|------|------|*
       |7   |6   |5   |4    |3   |   2|1   |0   |
OSCCTL |------|------|------|-------|------|------|------|------|
       |EXCLK |OSCSEL|EXCLKS|OSCSELS| 0    |0   |0   |AMPH|
       |------|------|------|-------|------|------|------|------|   适用于0453以不含EXCLKS和AMPH*/
#define AMPH            OSCCTL_bit.no0
#define EXCLKS            OSCCTL_bit.no5


/*   |------|-------|------|-------|------|------|------|------|*
       |7   |6    |5   |4    |3   |   2|1   |0   |
PCC    |------|-------|------|-------|------|------|------|------|
       |0   |XTSTART|CLS |CSS| 0    | PCC2 | PCC1 | PCC0 |
       |------|-------|------|-------|------|------|------|------|   适用于0453以不含XTSTART*/
#define PCC0            PCC_bit.no0
#define PCC1            PCC_bit.no1
#define PCC2            PCC_bit.no2
#define XTSTART         PCC_bit.no6

PowerNan 发表于 2009-7-30 14:46:08

大家可以把上面的代码贴在自己的系统下试一下,编译器是IAR。

zhouli3339926 发表于 2009-7-30 16:28:35

初步判断就有没有设置选项字节的原因,AD中断没有出问题原因有可能是由于AD一次的时间很短,虽然在复位但是又不停地在AD所以看不出来,对于上面的程序有仿真器的话可以看看复位标志。
    在主函数前添加这样两行语句
#pragma location = "OPTBYTE"
__root const unsigned char option_bytes[]={0x6E,0x01,0x00,0x00};
关闭看门狗,在试一下。

PowerNan 发表于 2009-7-30 16:49:03

问题解决了,是狗没关的问题。谢谢!

PowerNan 发表于 2009-7-30 16:52:01

请问zhouli3339926老兄,有没有IAR for NEC的中文资料,给我发一个?好多关于软件的操作都不清楚!我的邮箱是n_q1998@126.com
谢谢!

zhouli3339926 发表于 2009-7-30 18:18:29

IAR    的安装目录里面自带有英文的实用说明手册,目前还没有中文的资料。

andy168 发表于 2009-9-28 20:58:59

楼3兄弟:
我是想设置9600bps用业UART6通信,也是和你的那样设置:

CKSR6=0X03;//---------选择串口基本时钟fxclk6为fPRS/8
BRGC6=0x1a;

为什么我的不能通信啊?但是我的1200bps,2400bps,4800bps,是可以能通信的。请你帮忙解决一下,谢谢啊!

wuhen404143668 发表于 2010-12-2 10:36:21

我用楼主的程序,可以跑起来,但是出现一个奇怪的现象。。。。
昨天晚上测试的时候我输入hello,串口输出hello
今天我输入hello,输出只有一个h
即一次只能输出一个字符了,昨天可以一次输出一个字符段。
哪位可以解释一下呢。
谢谢。。。。。。。。。。。。。。。。。。。。。。。。。。
页: [1]
查看完整版本: UART6接收中断问题