SOFTWARE PARA LA UART |
DESCRIPCIÓN |
Esta aplicación se puede utilizar en todos los dispositivos AVR y contiene un código eficiente para la UART. Este programa recibe un carácter y lo devuelve. |
.incluye "1200def.inc" |
;***** Definición de pines |
.equ RxD = 0 | ;El pin de recepción es PD0 |
.equ TxD = 1 | ;El pin de Transmisión es PD1 |
;***** Variables de registro global |
.def bitcnt = R16 | ;contador de bit |
.def temp = R17 | ;registro de almacenamiento temporal |
.def Txbyte = R18 | ;Dato que va a transmitirse |
.def RXbyte = R19 | ;Dato recibido |
.cseg | |
.org 0 | |
;* | |
;* "putchar" | |
;* |
;* Esta subrutina transmite el byte almacenado en el registro "Txbyte" |
;* El número de bits de stop usados se determina con la constante sb |
;* |
;* Número de words: 14 incluyendo el return |
;* Número de ciclos: Depende del "bit rate" |
;* Registros bajos usados: None |
;* Registros altos usados: 2 (bitcnt,Txbyte) |
;* Punteros usados: Ninguno |
;* |
.equ sb = 1 | ;Número de bits de stop (1, 2, ...) |
putchar: | |
ldi bitcnt,9+sb | ;1+8+sb |
com Txbyte | ;Invertir todo |
sec | ;Bit de start |
putchar0: | |
brcc putchar1 | ;desvío si carry está borrado |
cbi PORTD,TxD | ;enviar un '0' |
rjmp putchar2 | ;sino |
putchar1: | |
sbi PORTD,TxD | ;enviar un '1' |
nop | |
putchar2: | |
rcall UART_delay | ;Demora de un bit |
rcall UART_delay | |
lsr Txbyte | ;Obtener el bit siguiente |
dec bitcnt | ;Si todos los bits no se han enviado |
brne putchar0 | ;enviar siguiente |
;sino | |
ret | ;return |
;* | |
;* "getchar" | |
;* |
;* Esta subrutina recibe un byte y lo devuelve en el registro "Rxbyte" |
;* |
;* Número de words: 14 incluyendo el return |
;* Número de ciclos: Depende de cuando llegue el dato |
;* Registros bajos usados: Ninguno |
;* Registros altos usados: 2 (bitcnt,Rxbyte) |
;* Punteros usados: Ninguno |
;* |
getchar: |
ldi bitcnt,9 | ;8 bit de datos + 1 bit de stop |
getchar1: | |
sbic PIND,RxD | ;Esperar a un bit de start |
rjmp getchar1 | |
rcall UART_delay | ;Retardo de 0.5 bit |
getchar2: | |
rcall UART_delay | ;Retardo de 1 bit |
rcall UART_delay | |
clc | ;borrar carry |
sbic PIND,RxD | ;Si el pin RX está a nivel alto |
sec | |
dec bitcnt | ;Si el bit es el bit de stop |
breq getchar3 | ;return |
;else | |
ror Rxbyte | ;Desplazar bit a Rxbyte |
rjmp getchar2 | ;ir a recibir el siguiente |
getchar3: | |
ret | |
;* |
;* "UART_delay" |
;* |
;* Esta subrutina de retardo genera el retardo requerido entre los bits cuando se |
;* transmiten y reciben bytes. El tiempo total de ejecución se determina con la |
;* constante "b": |
;* |
;* 3·b + 7 ciclos (incluidos rcall y ret) |
;* |
;* Número de words: 4 incluyendo el return |
;* Registros bajos usados: Ninguno |
;* Registros altos usados: 1 (temp) |
;* Punteros usados: Ninguno |
;* |
; Algunos valores de b: |
; |
; Cristal a 1 MHz: |
; 9600 bps - b = 14 |
; 19200 bps - b = 5 |
; 28800 bps - b = 2 |
; |
; Cristal a 2 MHz: |
; 19200 bps - b = 14 |
; 28800 bps - b = 8 |
; 57600 bps - b = 2 |
; |
; Cristal a 4 MHz: |
; 19200 bps - b = 31 |
; 28800 bps - b = 19 |
; 57600 bps - b = 8 |
; 115200 bps - b = 2 |
.equ b = 31 | ;19200 bps con el cristal a 4 MHz |
UART_delay: | |
ldi temp,b | |
UART_delay1: | |
dec temp | |
brne UART_delay1 | |
ret |
;***** La ejecución del programa empieza aquí |
;***** Test del programa |
reset: | |
sbi PORTD,TxD | ;Inicializar los pines del puerto |
sbi DDRD,TxD | |
ldi Txbyte,12 | |
rcall putchar | |
forever: | |
rcall getchar | |
mov Txbyte,Rxbyte | |
rcall putchar | ;Devolver carácter recibido |
rjmp forever | |