打印
[AVR单片机]

关于mega8 USART通讯与定时器1中断,2者一起用程序就死

[复制链接]
937|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
avrgb|  楼主 | 2016-3-12 13:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
avrgb|  楼主 | 2016-3-14 13:00 | 只看该作者
:(

使用特权

评论回复
板凳
avrgb|  楼主 | 2016-3-14 13:01 | 只看该作者
#include<iom8v.h>
#include<macros.h>
#define uchar unsigned char
#define uint  unsigned int
#define  mclk   1000000
#pragma interrupt_handler uart_rx:12
#pragma interrupt_handler deng:9
void uart_init(uint baud);
void uart_sendB(uchar data);
void uart_rx(void);
uchar flag,r;
void ConfigTimer0(unsigned int ms);
unsigned long tmp;
void delay(uint MS)                  
{
        uint m,n;
             for( m=0;m<MS;m++)
                     for(n=0;n<500;n++);
}
void main()
{
    DDRC|=BIT(4);
        DDRD|=BIT(2);
        PORTD&=~BIT(2);//设为接收
        ConfigTimer0(500);
        uart_init(4800);
       
        while (1)
    {
                
               
        if(flag)
                {
                         flag=0;
                         uart_sendB(r);  //调用串口驱动
                }
    }
}
uchar flag=0;
uchar r;

void uart_init(uint baud)
{
   UCSRB=0x00;
   UCSRA=0x00;                     //控制寄存器清零
   UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);   
                                                        //选择UCSRC,异步模式,禁止                        
                                                     //   校验,1位停止位,8位数据位
   baud=mclk/16/baud-1        ;   //波特率最大为65K
   UBRRL=baud;                                                        
   UBRRH=baud>>8;                    //设置波特率
   UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
                                                       //接收、发送使能,接收中断使能
   SREG|=BIT(7);                        //全局中断开放
   DDRD|=0X02;                        //配置TX为输出(很重要)

}

void uart_sendB(uchar buf)
{
   PORTD|=BIT(2);//PD2 RS485方向控制端,1为发送;0为接收;
   while(!(UCSRA&(BIT(UDRE)))) ;//判断UDR是否为空,UDRE为1时为空
   UDR=buf;//发送一个字节数据
   while(!(UCSRA&(BIT(TXC))));//发送结束时置位
   UCSRA|=BIT(TXC);//通过写1清除
   PORTD&=~BIT(2);
}


void uart_rx()
{
    UCSRB&=~BIT(RXCIE);//关闭接收结束终中断使能
        r=UDR;
        flag=1;
        UCSRB|=BIT(RXCIE);//打开接收结束终中断使能
}
void ConfigTimer0(unsigned int ms)
{
         TCCR1B=0x03;
         tmp=15625;//定时器计数频率
     tmp=(tmp*ms)/1000;//计算所需的计数值
     tmp=65536-tmp;//计算定时器重载值
         TCNT1H=(unsigned char)(tmp>>8);
         TCNT1L=(unsigned char)tmp;
         TIMSK|=BIT(2);
         SREG|=BIT(7);
}
void deng()
{
        PORTC=~PORTC;
        TCNT1H=(unsigned char)(tmp>>8);
        TCNT1L=(unsigned char)tmp;
        //UartRxMonitor(1);
}

使用特权

评论回复
地板
avrgb|  楼主 | 2016-3-14 13:02 | 只看该作者
求大神分析

使用特权

评论回复
5
avrgb|  楼主 | 2016-3-17 14:16 | 只看该作者
解决了 各位~

使用特权

评论回复
6
21zzj| | 2016-7-12 09:33 | 只看该作者
怎么解决的?我遇到类似问题了

使用特权

评论回复
7
avrgb|  楼主 | 2016-10-9 11:01 | 只看该作者
mega8应该是RAM溢出了

使用特权

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

本版积分规则

9

主题

29

帖子

0

粉丝