Advertisement
SaFteiNZz

USART

Apr 3rd, 2020
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.97 KB | None | 0 0
  1. .EQU Clock = 16000000 ;frecuencia de reloj, en Hz
  2. .EQU Baud = 9600 ;velocidad de transmisión deseada (bits por segundo)
  3. .EQU UBRRvalue = Clock / ( Baud * 16 ) - 1 ;formula para calcula el valor que se colocará en UBRR0H:L
  4.  
  5. .EQU PIN_LED = 5 ;Pin de Led de ejemplo, Pin 13 de arduino
  6.  
  7. .ORG 0x0000 ;punto de entrada en el inicio del sistema
  8. JMP PPrincipal ;ir al programa princiapal para saltar el Vector de Interrupciones
  9.  
  10. .ORG 0x0032 ;puntos de entrada en vectores de interrupción para USART0
  11. JMP USART0_reception_completed ;saltar a la rutina de manejo de interrupciones cuando ocurre este INT
  12. RETI ;saltar a la rutina de manejo de interrupciones cuando ocurre este INT
  13. RETI ;saltar a la rutina de manejo de interrupciones cuando ocurre este INT
  14.  
  15. .org 0x0100 ;Fin del espacio reservado para el Vector de Interrupciones
  16. /************************************************************************************
  17. Programa principal
  18. ************************************************************************************/
  19. PPrincipal:
  20. ldi r16, (1 << PIN_LED) ;Carga el registro R16 con 0b00100000
  21. out DDRB, r16 ;Configuracion IN/OUT del puerto B
  22. sbi PORTB, PIN_LED ;instruccion que enciende el led directamente
  23. cbi PORTB, PIN_LED ;instruccion que apaga el led directamente
  24.  
  25. RCALL init_USART0 ;llamada a la funcion de configuración de la USART
  26. SEI ;habilitar interrupciones glovales
  27.  
  28. loop:
  29. ; Cuerpo principal del programa.
  30. ; Bucle infinito de la actividad principal del programa.
  31. ; espacio para hacer otras tareas
  32. ; en este caso, la CPU está totalmente disponible
  33.  
  34. RJMP loop
  35.  
  36. /************************************************************************************
  37. Funcion para configurar la comunicacion USART
  38. ************************************************************************************/
  39. init_USART0:
  40. ;cargar en UBRR el valor para obtener la velocidad de transmisión deseada
  41. PUSH r16
  42. LDI R16, LOW(UBRRvalue) ; Low byte of Vaud Rate
  43. STS UBRR0L, R16 ; UBRR0L - USART Baud Rate Register Low Byte
  44. LDI R16, HIGH(UBRRvalue) ; High byte of Vaud Rate
  45. STS UBRR0H, R16 ; UBRR0H - USART Baud Rate Register High Byte
  46. ;habilitar recibir y transmitir, habilitar interrupcion USART0 "Rx terminado" (No las: UDR vacío, Tx terminado)
  47. ldi r16, (1<<RXCIE0) ; RX Complete Interrupt Enable
  48. ori r16, (1<<RXEN0) ; Receiver Enable
  49. ;ori r16, (1<<TXEN0) ; Transmitter Enable
  50. STS UCSR0B, R16 ; UCSR0B - USART Control and Status Register B
  51. ; configure USART 0 como asíncrono, establezca el formato de trama ->
  52. ; -> 8 bits de datos, 1 bit de parada, sin paridad
  53. ldi r16, (3<<UCSZ00) ; Character Size = 8 bits
  54. STS UCSR0C, R16 ; UCSR0C - USART Control and Status Register C
  55. POP r16
  56. RET
  57.  
  58. /************************************************************************************
  59. Funcion de atencion de la interrupcion de Dato recibido por USART
  60. Se dispara cuando un nuevo byte está listo en el registro UDR0
  61. ************************************************************************************/
  62. USART0_reception_completed:
  63. PUSH R16
  64. IN R16, SREG ; Copia de seguridad SREG. OBLIGATORIO en las rutinas de manejo de interrupciones
  65. PUSH R16
  66. ; **** Aqui empieza el cuerpo de la funcion de atencion de la interrupcion
  67. LDS R16, UDR0 ; recoger el byte recibido para procesarlo
  68. principio_if:
  69. andi r16, 0x01 ;Limpiamos el valor recibido, nos quedamos con el último bit
  70. brne else_if ;Si es uno nos vamos al else
  71. cbi PORTB, PIN_LED ;Apagamos el led integrado Ard.UNO
  72. rjmp fin_if ;desde el then saltamos el else
  73. else_if: ;Parte ELSE
  74. sbi PORTB, PIN_LED ;Encendemos el LED integrado Ard.Uno
  75. fin_if:
  76. ; **** Fin del cuerpo de la funcion de atencion de la interrupcion
  77. POP R16
  78. OUT SREG, R16 ; Recuperar SREG de la copia de seguridad anterior
  79. POP R16
  80. RETI ; RETI es OBLIGATORIO al regresar de una rutina de manejo de interrupciones
  81.  
  82.  
  83. /*****************************************************************************************
  84. Funcion envia un caracter por Puerto
  85. El caracter se pasa por registro r30.
  86. * Esta funcion esta muy mal hecha a proposito.
  87. * No la tomeis como ejemplo de funcion.
  88. *****************************************************************************************/
  89. EnviarCaracter:
  90. LoopTX:
  91. ; Esperar a que se termine de transmitir el caracter anterior.
  92. lds r17, UCSR0A ;Cargamos en r17 el UCSR0A (USART Control and Status Register A)
  93. sbrs r17, UDRE0 ;Si el bit "USART Data Register Empty" esta activo, el bufer esta vacio
  94. ; y se puede transmitir el dato. Por tanto saltamos la instruccion siguiente
  95. rjmp LoopTX ;Si el bit esta "no marcado" repetimos la comprobacion en espera.
  96. ; Enviar dato por puerto USART
  97. sts UDR0, r30 ; UDR0 - USART I/O Data Register
  98. ret
  99.  
  100. /****************************************************************************************/
  101. MalDelay1s:
  102. ldi r18, 82
  103. ldi r19, 43
  104. ldi r20, 0
  105. L1: dec r20
  106. brne L1
  107. dec r19
  108. brne L1
  109. dec r18
  110. brne L1
  111. lpm
  112. nop
  113. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement