Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly arduino组件发送和接收_Assembly_Arduino_Avr - Fatal编程技术网

Assembly arduino组件发送和接收

Assembly arduino组件发送和接收,assembly,arduino,avr,Assembly,Arduino,Avr,我一直在尝试在汇编中创建一个简单的代码,它从串行端口接收一个字符作为输入,并将相同的字符输出回来。我已经能够让它工作,但似乎我无法阻止输出写相同的字符一遍又一遍。应该有一点,我需要设置/重置,但似乎无法找到它。代码如下。我知道我可以用C轻松地完成它,但我一直在对自己说:) ************************************ ; serial.asm ;************************************ 诺利斯先生 .包括“/m328Pdef.inc”

我一直在尝试在汇编中创建一个简单的代码,它从串行端口接收一个字符作为输入,并将相同的字符输出回来。我已经能够让它工作,但似乎我无法阻止输出写相同的字符一遍又一遍。应该有一点,我需要设置/重置,但似乎无法找到它。代码如下。我知道我可以用C轻松地完成它,但我一直在对自己说:)

************************************
; 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