首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

请教一下这个程序

请教一下这个程序

/* Including used modules for compilling procedure */
#include "Cpu.h"
#include "Events.h"
#include "AS1.h"
/* Include shared modules, which are used for whole project */
#include "PE_Types.h"
#include "PE_Error.h"
#include "PE_Const.h"
#include "IO_Map.h"

void main(void)
{

  /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  PE_low_level_init();
  /*** End of Processor Expert internal initialization.                    ***/

  /* Write your code here */
  AS1_SendChar('H');
  while(AS1_GetTxComplete()==0){};
 
  AS1_SendChar('e');
  while(AS1_GetTxComplete()==0){};
 
  AS1_SendChar('l');
  while(AS1_GetTxComplete()==0){};
 
  AS1_SendChar('l');
  while(AS1_GetTxComplete()==0){};
 
  AS1_SendChar('o');
  while(AS1_GetTxComplete()==0){};
 
  AS1_SendChar('\r');
  while(AS1_GetTxComplete()==0){};
 
  AS1_SendChar('');
  while(AS1_GetTxComplete()==0){};
  
  for(;;)
  {
   
  }
}

以上程序是主程序,以下程序中断程序

/** ###################################################################
**     Filename  : Events.C
**     Project   : serial
**     Processor : 56F801FA80
**     Beantype  : Events
**     Version   : Driver 01.02
**     Compiler  : Metrowerks DSP C Compiler
**     Date/Time : 2005-12-10, 15:12
**     Abstract  :
**         This is user's event module.
**         Put your event handler code here.
**     Settings  :
**     Contents  :
**         AS1_OnRxChar - void AS1_OnRxChar(void);
**
**     (c) Copyright UNIS, spol. s r.o. 1997-2004
**     UNIS, spol. s r.o.
**     Jundrovska 33
**     624 00 Brno
**     Czech Republic
**     http      : www.processorexpert.com
**     mail      : info@processorexpert.com
** ###################################################################*/
/* MODULE Events */

#include "Cpu.h"
#include "Events.h"

/*
** ===================================================================
**     Event       :  AS1_OnRxChar (module Events)
**
**     From bean   :  AS1 [AsynchroSerial]
**     Description :
**         This event is called after a correct character is
**         received.
**         DMA mode:
**         If DMA controller is available on the selected CPU and
**         the receiver is configured to use DMA controller then
**         this event is disabled. Only OnFullRxBuf method can be
**         used in DMA mode.
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/
#pragma interrupt called /* Comment this line if the appropriate 'Interrupt preserve                 registers' property */
                         /* is set to 'yes' (#pragma interrupt saveall is generated before the ISR)      */
unsigned char *order;
void AS1_OnRxChar(void)
{
 
  /* Write your code here ... */
  if(!AS1_RecvChar(order))
   if(*order == 'a' || *order =='A')
       {
      AS1_SendChar('H');while(AS1_GetTxComplete()==0){};
        AS1_SendChar('e');while(AS1_GetTxComplete()==0){};
        AS1_SendChar('l');while(AS1_GetTxComplete()==0){};
        AS1_SendChar('l');while(AS1_GetTxComplete()==0){};
        AS1_SendChar('o');while(AS1_GetTxComplete()==0){};
        AS1_SendChar('\r');while(AS1_GetTxComplete()==0){};
        AS1_SendChar('\n');while(AS1_GetTxComplete()==0){};
       }
    else
       {
         AS1_SendChar('e');while(AS1_GetTxComplete()==0){};
         AS1_SendChar('r');while(AS1_GetTxComplete()==0){};
         AS1_SendChar('r');while(AS1_GetTxComplete()==0){};
         AS1_SendChar('o');while(AS1_GetTxComplete()==0){};
         AS1_SendChar('r');while(AS1_GetTxComplete()==0){};
         AS1_SendChar('\r');while(AS1_GetTxComplete()==0){};
         AS1_SendChar('\n');while(AS1_GetTxComplete()==0){};
       }
}

/* END Events */

运行结果看图。

当输入a或A时,总是显示H;当输入其他字符时总是显示e.

我原意是当输入a或A时显示Hello;当输入其他字符时显示error.

 

光是这两段程序似乎还看不出问题。
海纳百川  有容乃大
我在收中断程序中发送字符,编译程序内部在调用发送程序时是使用的发送结束产生一个中断,在此中断中将发送寄存器满的状态改为空.我发现我的程序中发送寄存器满的状态没有改变.我想是不是因为收中断的优先级高于发送结束产生的中断,所以在收中断没有退出之前发送结束产生的中断不能进入?
中断一般是不能嵌套的,除非软件特意去打开中断屏蔽位。但我们一般不推荐这样做。
海纳百川  有容乃大
我修改了中断优先级怎么还是不能嵌套呢?
中断优先级一般只是表示当多个中断同时发生时,优先级最高的中断最先得到响应。
海纳百川  有容乃大
那就是说只要进入一个中断在退出之前即使有高级的中断产生也不会响应这个中断了?
一般的单片机都是这样的。但801我没用过,不是很确定,你可以仔细看一下它的使用手册关于中断功能的介绍。
海纳百川  有容乃大
返回列表