Re: UART
Добавлено: Пт ноя 05, 2010 15:58:09
Ну,что-же,терпения и удачи.У меня есть книжка,тоже в бумаге.Очень рекомендую.
http://easyelectronics.ru/revich-prakti ... blera.html
http://easyelectronics.ru/revich-prakti ... blera.html
Код: Выделить всё
.include "m8def.inc"
#define F_CPU (8000000)
.equ XTAL = F_CPU
.equ baudrate = 1200
.equ bauddivider = XTAL/(16*baudrate)-1
.dseg
.cseg
.ORG $0000 ; (RESET)
RJMP Reset
.ORG INT_VECTORS_SIZE ; Конец таблицы прерываний
.macro ua_send
ldi r16,@0
rcall USART_Transmit
.endm
Reset:
ldi r16, LOW(RAMEND)
out spl, r16
ldi r16, HIGH(RAMEND)
out sph, r16
uart_init: LDI R16, low(bauddivider)
OUT UBRRL,R16
LDI R16, high(bauddivider)
OUT UBRRH,R16
LDI R16,0
OUT UCSRA, R16
; Прерывания запрещены, прием-передача разрешен.
LDI R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
OUT UCSRB, R16
; Формат кадра - 8 бит, пишем в регистр UCSRC, за это отвечает бит селектор
LDI R16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
OUT UCSRC, R16
main:
ua_send '1'
ua_send ' '
ua_send ' '
ua_send '3'
rcall debug_wait_1_sec
rcall debug_wait_1_sec
got_byte:
LDI R16,0
OUT UCSRA, R16
rcall USART_Receive
cpi r16,'1'
breq byte_is
ua_send 'n'
ua_send 'o'
ua_send 't'
ua_send ' '
ua_send 'O'
ua_send 'N'
ua_send 'E'
ua_send ' '
ua_send ' '
ua_send ' '
rcall debug_wait_1_sec
rcall debug_wait_1_sec
rjmp got_byte
byte_is:
ua_send 'G'
ua_send 'o'
ua_send 'o'
ua_send 'd'
rcall debug_wait_1_sec
rcall debug_wait_1_sec
rjmp main
;=============
debug_wait_1_sec:
push r16
push r17
push r18
ldi r18,$aa
ldi r17,$b0
ldi r16,$28
L_D_1:
dec r18
brne L_D_1
dec r17
brne L_D_1
dec r16
brne L_D_1
pop r18
pop r17
pop r16
ret
;=============
USART_Transmit:
; Wait for empty transmit buffer
sbis UCSRA,UDRE
rjmp USART_Transmit
; Put data (r16) into buffer, sends the data
out UDR,r16
ret
;=============
USART_Receive:
; Wait for data to be received
sbis UCSRA, RXC
rjmp USART_Receive
; Get and return received data from buffer
in r16, UDR
ret
;=============
Код: Выделить всё
.equ bauddivider = XTAL/(16*baudrate)-1Код: Выделить всё
.equ bauddivider = ((XTAL+errdivider)/(16*baudrate))-1Код: Выделить всё
.include "m8def.inc"
#define F_CPU (8000000)
.equ XTAL = F_CPU
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1
.dseg
.cseg
.ORG $0000 ; (RESET)
RJMP Reset
.ORG INT_VECTORS_SIZE ; Конец таблицы прерываний
.macro ua_send
ldi r16,@0
rcall USART_Transmit
rcall debug_wait_0_1_sec
.endm
Reset:
ldi r16, LOW(RAMEND)
out spl, r16
ldi r16, HIGH(RAMEND)
out sph, r16
uart_init: LDI R16, low(bauddivider)
OUT UBRRL,R16
LDI R16, high(bauddivider)
OUT UBRRH,R16
LDI R16,0
OUT UCSRA, R16
; Прерывания запрещены, прием-передача разрешен.
LDI R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
OUT UCSRB, R16
; Формат кадра - 8 бит, пишем в регистр UCSRC, за это отвечает бит селектор
LDI R16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
OUT UCSRC, R16
main:
ua_send 'm'
ua_send 'a'
ua_send 'i'
ua_send 'n'
rcall debug_wait_1_sec
rcall debug_wait_1_sec
got_byte:
LDI R16,0
OUT UCSRA, R16
rcall USART_Receive
cpi r16,'1'
breq byte_is
ua_send 'n'
ua_send 'o'
ua_send 't'
ua_send ' '
ua_send 'O'
ua_send 'N'
ua_send 'E'
ua_send ' '
ua_send ' '
ua_send ' '
rcall debug_wait_1_sec
rcall debug_wait_1_sec
rjmp got_byte
byte_is:
ua_send 'G'
ua_send 'o'
ua_send 'o'
ua_send 'd'
rcall debug_wait_1_sec
rcall debug_wait_1_sec
rjmp main
;=============
debug_wait_1_sec:
push r16
push r17
push r18
ldi r18,$aa
ldi r17,$b0
ldi r16,$28
L_D_1:
dec r18
brne L_D_1
dec r17
brne L_D_1
dec r16
brne L_D_1
pop r18
pop r17
pop r16
ret
;=============
debug_wait_0_1_sec:
push r16
push r17
push r18
ldi r18,$aa
ldi r17,$11
ldi r16,$4
L_DD_1:
dec r18
brne L_DD_1
dec r17
brne L_DD_1
dec r16
brne L_DD_1
pop r18
pop r17
pop r16
ret
;=============
USART_Transmit:
; Wait for empty transmit buffer
sbis UCSRA,UDRE
rjmp USART_Transmit
; Put data (r16) into buffer, sends the data
out UDR,r16
ret
;=============
USART_Receive:
; Wait for data to be received
sbis UCSRA, RXC
rjmp USART_Receive
; Get and return received data from buffer
in r16, UDR
ret
;=============ну так 8000000/(16*9600)-1=51,083.equ bauddivider = XTAL/(16*baudrate)-1

