INICIO WEB

                       

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.

    

123.gif (858 bytes)

.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
                         
                                         

ARRIBA