您好我一直在尝试使用Atmel studio 6.1实现串行通信 和ATMEGA32 mcu。 我阅读了数据表和帖子: 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
感谢您的帮助!
答案 0 :(得分:0)
我可以看到您的代码中存在一些不一致之处。您是否努力阅读Atmega32数据表,尤其是关于USART模块SFR的部分?
ldi r16, $12
out UCSRA, r16
为什么要在UCSRA中设置FE位(第4位)?这是只读位,数据表说:“总是 写入UCSRA时将此位设置为零。“UCSRA的初始值为0x20,只有0,1和6位为R / W,因此将U盘写入0x22以设置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和循环中发送char的代码应如下所示:
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
如果您正在使用模拟工具,那么有一点需要注意 - 它们有时会显示无意义的结果,如果您真的不明白处理器内部会发生什么,请不要相信它。