Assembly arduino组件发送和接收
我一直在尝试在汇编中创建一个简单的代码,它从串行端口接收一个字符作为输入,并将相同的字符输出回来。我已经能够让它工作,但似乎我无法阻止输出写相同的字符一遍又一遍。应该有一点,我需要设置/重置,但似乎无法找到它。代码如下。我知道我可以用C轻松地完成它,但我一直在对自己说:)Assembly arduino组件发送和接收,assembly,arduino,avr,Assembly,Arduino,Avr,我一直在尝试在汇编中创建一个简单的代码,它从串行端口接收一个字符作为输入,并将相同的字符输出回来。我已经能够让它工作,但似乎我无法阻止输出写相同的字符一遍又一遍。应该有一点,我需要设置/重置,但似乎无法找到它。代码如下。我知道我可以用C轻松地完成它,但我一直在对自己说:) ************************************ ; serial.asm ;************************************ 诺利斯先生 .包括“/m328Pdef.inc”
************************************
; serial.asm
;************************************
诺利斯先生
.包括“/m328Pdef.inc”
列表
.cseg
;
; 将中断向量设置为0x0000
;
; 我们在这个程序中只使用一个中断,即复位
; 打断
;
.org 0x0000
jmp复位;PC=0x0000重置
;======================
; 初始化
.org 0x0034
重置:
clr-r1;将SREG设置为0
输出SREG,r1
本地设计院r28,低(拉芒);初始化指向RAMEND的堆栈指针
本地设计院r29,高(拉芒)
输出SPL,r28
苏黎世保护海港协会,r29
rcall USART_Init;初始化串行通信
软件工程研究所;启用全局中断
rjmp总管
;=======================
; 初始化USART
;
USART_Init:
; 这些值适用于带有16MHz时钟的9600波特
本地设计院R16103
clr r17
; 设置波特率
sts UBRR0H,r17
sts UBRR0L,r16
; 启用接收器和发射器
ldi r16,(嗯,如果你想发送r19
,为什么你的指令是sts UDR0,r17
?为什么你的接收没有等待可用的输入而不是空的发送缓冲区?如果你看到我正在接收r17中的输入字符,r19是一个错误的注释(在USART\U receive中)并将其放入USART_传输。我如何检查可用的输入?我认为空的传输缓冲区表示数据已准备好接收?UCSRA0的MSB是“USART接收已完成”。您可能需要等待。jester先生,笑话是我:)。成功了。感谢您的时间。您正在启用全局中断,而无需完整的中断向量表。为什么?嗯,如果您想发送r19
,为什么您的指令是sts UDR0,r17
?还有,为什么您的接收没有等待可用的输入而不是空的传输缓冲区?如果您看到我正在将输入字符接收到r17(在USART_接收中)并将其输出到USART_传输中,那么r19是一个错误的注释。如何检查可用输入?我认为空的传输缓冲区表示数据已准备好接收。UCSRA0
的MSB是“USART接收完成”。杰斯特先生,笑话是我开的:)。成功了。感谢您的时间。您正在启用全局中断,而无需完整的中断向量表。为什么?
;************************************
; serial.asm
;************************************
.nolist
.include "./m328Pdef.inc"
.list
.cseg
;
; Set up the Interrupt Vector at 0x0000
;
; We only use 1 interrupt in this program, the RESET
; interrupt.
;
.org 0x0000
jmp reset ; PC = 0x0000 RESET
;======================
; initialization
.org 0x0034
reset:
clr r1 ; set the SREG to 0
out SREG, r1
ldi r28, LOW(RAMEND) ; init the stack pointer to point to RAMEND
ldi r29, HIGH(RAMEND)
out SPL, r28
out SPH, r29
rcall USART_Init ; initialize the serial communications
sei ; enable global interrupts
rjmp main
;=======================
; Initialize the USART
;
USART_Init:
; these values are for 9600 Baud with a 16MHz clock
ldi r16, 103
clr r17
; Set baud rate
sts UBRR0H, r17
sts UBRR0L, r16
; Enable receiver and transmitter
ldi r16, (1<<RXEN0)|(1<<TXEN0)
sts UCSR0A, r16
; Enable receiver and transmitter
ldi r16, (1<<RXEN0)|(1<<TXEN0)
sts UCSR0B, r16
; Set frame format: Async, no parity, 8 data bits, 1 stop bit
ldi r16, 0b00001110
sts UCSR0C, r16
ret
;=======================
; send a byte over the serial wire
; byte to send is in r19
USART_Transmit:
; wait for empty transmit buffer
lds r16, UCSR0A
sbrs r16, UDRE0
rjmp USART_Transmit
; Put data (r19) into buffer, sends the data
sts UDR0, r17
ret
USART_Receive:
lds r16,UCSR0A ; load UCSR0A into r16
sbrs r16,UDRE0 ; wait for empty transmit buffer
rjmp USART_Receive ; repeat loop
lds r17, UDR0 ; get received character
rcall USART_Transmit
ret
delay:
ldi r18, 41
ldi r19, 150
ldi r20, 128
L1: dec r20
brne L1
dec r19
brne L1
dec r18
brne L1
;======================
; Main body of program:
main:
loop:
rcall USART_Receive ; send the character in r19 to the USART
rcall delay
rjmp loop ; else go back and to reset the value in r19