首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ATMEGA32 usart安装程序集

ATMEGA32 usart安装程序集
EN

Stack Overflow用户
提问于 2013-09-20 22:27:31
回答 1查看 3.4K关注 0票数 1

您好,我一直在尝试使用Atmel studio 6.1和ATMEGA32单片机实现串行通信。我读了数据表和帖子:ATMEGA32 UART Communication

我想我或多或少知道它应该如何设置,但我做不到。我将URSEL的值设置为1以便写入它,但是当我运行模拟时,它似乎没有写入它,当我向它写入0并写入UBRRH时,我可以看到UCSRC和UBRRH都写入了相同的值。

这是代码的副本..。

代码语言:javascript
复制
 jmp RESET

 RESET:

    ldi r16, $12
    out UCSRA, r16
    ldi r17, $00
    ldi r16, $47

    out UBRRL,  r16
    out UBRRH,  r17
    ; Enable receiver and transmitter
    ldi r16,    (1<<RXEN) | (1<<TXEN)
    out UCSRB, r16

    ; Set frame format: 8 data, 1 stop bit
    ldi r16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
    out UCSRC, r16
    ldi r16, $80
    ldi r17, (0<<URSEL)
    out UBRRH,  r17
loop:
    ldi r16, $41
    jmp TX

TX:
    sbis UCSRA, UDRE
    rjmp TX
    ;move data to the buffer
    out UDR, r16
    jmp loop

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2015-01-11 03:00:40

我可以在你的代码中看到一些不一致的地方。您是否认真阅读了Atmega32数据手册,尤其是关于USART模块SFRs的部分?

代码语言:javascript
复制
ldi r16, $12
out UCSRA, r16

为什么要在UCSRA中设置FE位(位4)?这是只读位,数据手册上写道:“在写入UCSRA时,请始终将此位设置为零。”UCSRA的初始值是0x20,并且只有位0、1和6是读/写的,因此将0x22写入UCSRA以设置U2X位(我认为这是您的意图)。

代码语言:javascript
复制
ldi r16, $80
ldi r17, (0<<URSEL)
out UBRRH,  r17

我不太明白上面的几行话。您正在用r16编写代码,但从未使用过它(您将在接下来的几行中向r16编写另一个字符)。接下来,您将0写入r17 (0<<URSEL提供r17=0x00),并将其存储在UBRRH中。为什么?你写0x00到UBRRH上面的几行。只有当您想要在UBRRH或UBRSC中存储某些内容时,才需要更改URSEL。所以这3行没有任何意义。

init USART和在循环中发送字符的代码应该如下所示:

代码语言:javascript
复制
INIT:
    ldi r16, $22
    out UCSRA, r16
    ldi r17, $00
    ldi r16, $47
    out UBRRL, r16
    out UBRRH, r17
    ldi r16, (1<<RXEN) | (1<<TXEN)
    out UCSRB, r16
    ldi r16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
    out UCSRC, r16
LOOP:
    ldi r16, $41
TX:
    sbis UCSRA, UDRE
    rjmp TX
    out UDR, r16
    rjmp LOOP

需要注意的是,如果你使用的是模拟工具--它们有时会显示毫无意义的结果,如果你真的不了解处理器内部发生了什么,就不要相信它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18919213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档