打印

求助AVR ICCAVR串口中断发送数据

[复制链接]
6131|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dcp|  楼主 | 2007-10-22 18:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//UART0 initialize
// desired baud rate: 2400
// actual: baud rate:2404 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
    UCSRB = 0x00; //disable while setting baud rate
    UCSRA = 0x00;
    
    UBRRL = 0x19; //set baud rate lo
    UBRRH = 0x00; //set baud rate hi
    //UCSRB = 0xD8;
    UCSRB = (1 << RXCIE) | (1 << TXCIE) | (1 << RXEN) | (1 << TXEN);
    UCSRC = BIT(URSEL) | 0x06;
}



//------------------------------------------------------------------------------
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{   
    //uart has received a character in UDR
  
    PutUartRx(UDR);//中数接收就OK!

}
//==============================================================================
//------------------------------------------------------------------------------
unsigned char a = 1;
#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
    //character has been transmitted    
    UDR = a;                         //这样发送数据错在哪里?串口助手收不到数据,

}
//==============================================================================


void main(void) 

    init_devices(); 
    while(1) 
    { 
        //putchar(a);这样查询发数就没有问题
    } 


请各位AVR高手帮忙,谢谢...

相关帖子

沙发
hotpower| | 2007-10-23 01:33 | 只看该作者

volatile unsigned char a = 1;

void UartObj::Init(void)
{
unsigned int i;
    for (i = 0; i < sizeof(ReceiveBuffer); i ++) {
        ReceiveBuffer = 0;
        SendBuffer = 0;
    }
    ReceiveWritePtr = 0;
    ReceiveReadPtr = 0;
    SendWritePtr = 0;
    SendReadPtr = 0;
    DDR_TXD = 1;
    DDR_RXD = 0;
    TXD = 1;
    RXD = 1;
    UCSRA &= ~(1 << U2X);
    UCSRB = (1 << RXCIE)
          | (1 << TXCIE)
          | (0 << UDRIE)//数据寄存器空中断使能
          | (1 << RXEN) | (1 << TXEN);//允许发送和接收(中断)//
    /* 设置波特率*/
    UBRRL = ((Fosc / 16 / (Baud + 1)) % 256);//9600
    UBRRH = ((Fosc / 16 / (Baud + 1)) / 256);
    UCSRC = (1 << URSEL)
          | (0 << UPM1) | (0 << UPM0)//无校验
          | (1 << USBS)//1位STOP位
          | (0 << UCSZ2) | (1 << UCSZ1) | (1 << UCSZ0);//8位数据
}

#pragma vector=USART_UDRE_vect
extern "C" __interrupt void UartTxUDREISR(void)
{
    if (Uart.SendWritePtr != Uart.SendReadPtr) {
        UDR = Uart.SendBuffer[Uart.SendReadPtr ++];
        UCSRB |= (1 << UDRIE);
    }
    else
    {
        UCSRB &= ~(1 << UDRIE);
    }
    System.UartTxExecFlag = 1;
}


#pragma vector=USART_TXC_vect
extern "C" __interrupt void UartTxISR(void)
{
    if (Uart.SendWritePtr != Uart.SendReadPtr) {
        UDR = Uart.SendBuffer[Uart.SendReadPtr ++];
        UCSRB |= (1 << UDRIE);
    }
    else
    {
        UCSRB &= ~(1 << UDRIE);
    }
    System.UartTxExecFlag = 1;
}

使用特权

评论回复
板凳
dcp|  楼主 | 2007-10-23 15:01 | 只看该作者

谢谢HOTPOWER:UCSRB &= ~(1 << UDRIE);

使用特权

评论回复
地板
dcp|  楼主 | 2007-10-23 15:08 | 只看该作者

再请教HOTPOWER双机串口通讯协议

发现两片M16用串口中断互相收发时,数据有时会出错,可能通讯协议做得不好,能否再帮个忙呢?

使用特权

评论回复
5
dcp|  楼主 | 2007-10-23 23:51 | 只看该作者

接收和发送都是用中断的,并且各自带有FIFO的,也是用字符处

正如您所言,中断没有处理好,数据出错了,现在调好了

不过还是希望能拜读您的串口双机通讯协议程序:),再次谢谢!

使用特权

评论回复
6
hotpower| | 2007-10-23 23:58 | 只看该作者

双机单机是一样的,只要把单机收发做好就不会出问题~~~

字符处理一定要有同步字符和终止字符,当然最好加校验.

使用特权

评论回复
7
dcp|  楼主 | 2007-10-24 00:08 | 只看该作者

现在是用正反码校验+同步字符+起止字符

使用特权

评论回复
8
hotpower| | 2007-10-24 00:15 | 只看该作者

应该同步(起始)字符+正反码校验+终止字符

正反码校验很常用,尤其在命令字节中.
例如:
命令0x00~0x0f,那么命令的半字节反码为0xf0,0xe1,...0x0f.

故你所采用的同步字符一定不能包含在正反码中!!!

否则将找不到同步字符!!!

哈哈~~~俺比较喜欢半字节反码校验~~~

使用特权

评论回复
9
dcp|  楼主 | 2007-10-24 00:17 | 只看该作者

那就来个例程吧:D

使用特权

评论回复
10
hotpower| | 2007-10-24 00:20 | 只看该作者

俺没什么例程~~~那都是随手做出来的东西,你帖大家改错~~~

使用特权

评论回复
11
dcp|  楼主 | 2007-10-24 00:23 | 只看该作者

AVR的MCU中断如何处理才算合理呢?

之前的产品要求较低,也没有用到双MCU通讯,现在双MCU系统发现中断的优先级处理尤其重要...

使用特权

评论回复
12
dcp|  楼主 | 2007-10-24 00:32 | 只看该作者

您写的的串口调试助手在哪可以下载呢?

使用特权

评论回复
13
hotpower| | 2007-10-24 00:36 | 只看该作者

哈哈~~~俺没舍得发布~~~再暖些日子吧

串口调试助手很容易~~~

俺做的是CVI的串口控件...用它做串口调试助手只是几分钟的事情~~~

使用特权

评论回复
14
hotpower| | 2007-10-24 00:39 | 只看该作者

AVR的MCU中断如何处理才算合理呢?---正确就是合理~~~

使用特权

评论回复
15
dcp|  楼主 | 2007-10-24 00:41 | 只看该作者

明白,正在睇M16的DATASHEET呢

使用特权

评论回复
16
hotpower| | 2007-10-25 20:27 | 只看该作者

结果如何???

使用特权

评论回复
17
dcp|  楼主 | 2007-10-25 22:39 | 只看该作者

还没有结论,只是错开时间发送

A 在0.5S处发送
B 在1S个发送   这时数据就没有错了

使用特权

评论回复
18
hotpower| | 2007-10-25 23:21 | 只看该作者

错开时间???难道2系统很同步吗???

使用特权

评论回复
19
dcp|  楼主 | 2007-10-26 00:31 | 只看该作者

用串口助手观察

发现报文的最后一位有时能发出去,有时不能,象是某个中断抢走CPU,返回来就不发最后一位了

只好多发送了一位冗余位,抢就抢吧

使用特权

评论回复
20
xlsbz| | 2009-12-11 13:18 | 只看该作者
~(1 << UDRIE); 这种写法有漏洞(不利于 8位机.16位机.32位机之间的移植), 建议加上8位强制转换

使用特权

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

本版积分规则

dcp

71

主题

720

帖子

1

粉丝