打印
[AVR单片机]

atmega88pa板 在有定时器中断的情况下程序无法进入串口中断

[复制链接]
2031|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
uucallu|  楼主 | 2015-4-26 11:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单独的串口中断和定时器中断都没有问题,但是放在一块的时候,无论如何程序都不会进入串口中断,而是进入定时器中断,而且会跑飞。
#include <iom88v.h>
#include <macros.h>
#include <Serial_Communication.h>

unsigned char Data;
unsigned char temp;
/*
** =========================================================
**       名称:void USART_Init(void)
**       完成功能:串口初始化
**       参数:无
**       返回值:无
** =========================================================
*/
void USART_Init(void)
{


UBRR0L = 0x0c;//设置波特率
UBRR0H = 0x00;
UCSR0B = 0X98;//允许发送和接收,发送结束中断和接收结束中断使能
UCSR0C = 3<<UCSZ00;//模式选择:异步操作,1位停止位,8位字符长度
}
/*
** =========================================================
**       名称:unsigned char USART_Receive(void)
**       完成功能:发送数据
**       参数:无
**       返回值:UDR0缓冲器中数据
** =========================================================
*/
unsigned char USART_Receive(void)
{
while(!(UCSR0A&(1<<RXC0)))//判断缓冲器中是否有未读出数据
;
return UDR0;
}
/*
** =========================================================
**       名称:USART_Transmit(unsigned char data)
**       完成功能:接收数据
**       参数:unsigned char data:待发送的数据
**       返回值:无
** =========================================================
*/
void USART_Transmit(unsigned char data)
{
while(!(UCSR0A&(1<<UDRE0)))//判断缓冲器是否准备好接收新数据
;
UDR0=data;
}

void timer1_init(void)
{
   
    TCNT1H = 0xE3;  //设置 TC1 的 计数寄存器 高8位值,基于8M晶振
    TCNT1L = 0xE1;  //设置 TC1 的 计数寄存器 低8位值,基于8M晶振

    TCCR1A = 0x00;
    TCCR1B = 0x05;  //设置TC1 为 CLK/1024分频,启动TC1

    TIMSK1 = 0x01;  //设置 定时计数器 的 屏蔽寄存器
}


void main(void)
{
DDRB=0XFF;
PORTB=0XFF;
CLI();
timer1_init();
Serial_Communication();//初始化串口通信模块标志位和数据               
USART_Init();          //串口初始化
SEI();                 //开中断
while(1)
{
  if(temp==1)           //判断标志位是否为1
  {  
     Transmit_Buffer_Update();//更新数组
         for(Transmit_Count=0;Transmit_Count<16;Transmit_Count++)
          {
           USART_Transmit(Transmit_Buffer[Transmit_Count]);
          }  
       Transmit_Count=0;
       temp=0;            //标志位清零
  }
}

}

/*
** =========================================================
**       名称:USART0_rxc_isr(void)
**       完成功能:串口接收中断子程序
**       参数:无
**       返回值:无
** =========================================================
*/
#pragma interrupt_handler USART0_rxc_isr:19
void USART0_rxc_isr(void)
{
unsigned char temp1=0;
PORTB=~PINB;
Receive_Buffer[Receive_Count]=USART_Receive();
Receive_Count++;
  if(Receive_Count>7)
  {
   temp1=CRC16_Check(Receive_Buffer,6,6,7);
   if(temp1==1)
   {
    Command_Decode(Receive_Buffer);
   }
    Receive_Count=0;
   
  }

  SEI();
}


#pragma interrupt_handler timer1_ovf_isr:14
void timer1_ovf_isr(void)
{
     
     TCNT1H = 0xE3;  //reload counter high value
     TCNT1L = 0xE1;  //reload counter low value
         //PORTB=~PINB;
         temp=1;
         SEI();
         
}

相关帖子

沙发
uucallu|  楼主 | 2015-4-26 12:33 | 只看该作者
定时一秒在发数据,串口中断接收数据

使用特权

评论回复
板凳
JY-DX-JY| | 2015-5-6 12:00 | 只看该作者
你定时器中断里temp=1,可是在主程序 temp1=CRC16_Check(Receive_Buffer,6,6,7);加了个这,就不一定是1了。
  所以这一句不执行。 if(temp1==1)

使用特权

评论回复
地板
XIAO肖| | 2015-5-14 11:38 | 只看该作者
请问你用MEGA88做什么项目?

使用特权

评论回复
5
qin552011373| | 2015-5-20 09:57 | 只看该作者
AVR的中断没有优先级,你要好好优化一下相关的中断程序了。中断程序尽量短小,不要占用CPU时间。

使用特权

评论回复
6
hai_pingzi| | 2016-2-18 16:26 | 只看该作者
楼主能否上传关于Atmel mega88PA 的两个头文件给我:iom88v.h 和 macros.h ?如能帮忙,非常感谢!

使用特权

评论回复
7
daobushidao| | 2016-2-23 18:49 | 只看该作者
不要占用CPU时间!不要占用CPU时间。不要占用CPU时间。
重要的事情说三遍

jsdkfpiao.wikidot.com gddkfp.wikidot.com gddkfp.wikidot.com gddkfp.wikidot.com guizdkfp.wikidot.com yunndkfp.wikidot.com sicdkfp.wikidot.com sicdkfp.wikidot.com

使用特权

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

本版积分规则

2

主题

8

帖子

0

粉丝