您好,我一直在尝试使用Atmel studio 6.1和ATMEGA32单片机实现串行通信。我读了数据表和帖子:ATMEGA32 UART Communication
我想我或多或少知道它应该如何设置,但我做不到。我将URSEL的值设置为1以便写入它,但是当我运行模拟时,它似乎没有写入它,当我向它写入0并写入UBRRH时,我可以看到UCSRC和UBRRH都写入了相同的值。
这是代码的副本..。
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谢谢你的帮助!
发布于 2015-01-11 03:00:40
我可以在你的代码中看到一些不一致的地方。您是否认真阅读了Atmega32数据手册,尤其是关于USART模块SFRs的部分?
ldi r16, $12
out UCSRA, r16为什么要在UCSRA中设置FE位(位4)?这是只读位,数据手册上写道:“在写入UCSRA时,请始终将此位设置为零。”UCSRA的初始值是0x20,并且只有位0、1和6是读/写的,因此将0x22写入UCSRA以设置U2X位(我认为这是您的意图)。
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和在循环中发送字符的代码应该如下所示:
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需要注意的是,如果你使用的是模拟工具--它们有时会显示毫无意义的结果,如果你真的不了解处理器内部发生了什么,就不要相信它。
https://stackoverflow.com/questions/18919213
复制相似问题