Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .EQU Clock = 16000000 ;frecuencia de reloj, en Hz
- .EQU Baud = 9600 ;velocidad de transmisión deseada (bits por segundo)
- .EQU UBRRvalue = Clock / ( Baud * 16 ) - 1 ;formula para calcula el valor que se colocará en UBRR0H:L
- .EQU PIN_LED = 5 ;Pin de Led de ejemplo, Pin 13 de arduino
- .ORG 0x0000 ;punto de entrada en el inicio del sistema
- JMP PPrincipal ;ir al programa princiapal para saltar el Vector de Interrupciones
- .ORG 0x0032 ;puntos de entrada en vectores de interrupción para USART0
- JMP USART0_reception_completed ;saltar a la rutina de manejo de interrupciones cuando ocurre este INT
- RETI ;saltar a la rutina de manejo de interrupciones cuando ocurre este INT
- RETI ;saltar a la rutina de manejo de interrupciones cuando ocurre este INT
- .org 0x0100 ;Fin del espacio reservado para el Vector de Interrupciones
- /************************************************************************************
- Programa principal
- ************************************************************************************/
- PPrincipal:
- ldi r16, (1 << PIN_LED) ;Carga el registro R16 con 0b00100000
- out DDRB, r16 ;Configuracion IN/OUT del puerto B
- sbi PORTB, PIN_LED ;instruccion que enciende el led directamente
- cbi PORTB, PIN_LED ;instruccion que apaga el led directamente
- RCALL init_USART0 ;llamada a la funcion de configuración de la USART
- SEI ;habilitar interrupciones glovales
- loop:
- ; Cuerpo principal del programa.
- ; Bucle infinito de la actividad principal del programa.
- ; espacio para hacer otras tareas
- ; en este caso, la CPU está totalmente disponible
- RJMP loop
- /************************************************************************************
- Funcion para configurar la comunicacion USART
- ************************************************************************************/
- init_USART0:
- ;cargar en UBRR el valor para obtener la velocidad de transmisión deseada
- PUSH r16
- LDI R16, LOW(UBRRvalue) ; Low byte of Vaud Rate
- STS UBRR0L, R16 ; UBRR0L - USART Baud Rate Register Low Byte
- LDI R16, HIGH(UBRRvalue) ; High byte of Vaud Rate
- STS UBRR0H, R16 ; UBRR0H - USART Baud Rate Register High Byte
- ;habilitar recibir y transmitir, habilitar interrupcion USART0 "Rx terminado" (No las: UDR vacío, Tx terminado)
- ldi r16, (1<<RXCIE0) ; RX Complete Interrupt Enable
- ori r16, (1<<RXEN0) ; Receiver Enable
- ;ori r16, (1<<TXEN0) ; Transmitter Enable
- STS UCSR0B, R16 ; UCSR0B - USART Control and Status Register B
- ; configure USART 0 como asíncrono, establezca el formato de trama ->
- ; -> 8 bits de datos, 1 bit de parada, sin paridad
- ldi r16, (3<<UCSZ00) ; Character Size = 8 bits
- STS UCSR0C, R16 ; UCSR0C - USART Control and Status Register C
- POP r16
- RET
- /************************************************************************************
- Funcion de atencion de la interrupcion de Dato recibido por USART
- Se dispara cuando un nuevo byte está listo en el registro UDR0
- ************************************************************************************/
- USART0_reception_completed:
- PUSH R16
- IN R16, SREG ; Copia de seguridad SREG. OBLIGATORIO en las rutinas de manejo de interrupciones
- PUSH R16
- ; **** Aqui empieza el cuerpo de la funcion de atencion de la interrupcion
- LDS R16, UDR0 ; recoger el byte recibido para procesarlo
- principio_if:
- andi r16, 0x01 ;Limpiamos el valor recibido, nos quedamos con el último bit
- brne else_if ;Si es uno nos vamos al else
- cbi PORTB, PIN_LED ;Apagamos el led integrado Ard.UNO
- rjmp fin_if ;desde el then saltamos el else
- else_if: ;Parte ELSE
- sbi PORTB, PIN_LED ;Encendemos el LED integrado Ard.Uno
- fin_if:
- ; **** Fin del cuerpo de la funcion de atencion de la interrupcion
- POP R16
- OUT SREG, R16 ; Recuperar SREG de la copia de seguridad anterior
- POP R16
- RETI ; RETI es OBLIGATORIO al regresar de una rutina de manejo de interrupciones
- /*****************************************************************************************
- Funcion envia un caracter por Puerto
- El caracter se pasa por registro r30.
- * Esta funcion esta muy mal hecha a proposito.
- * No la tomeis como ejemplo de funcion.
- *****************************************************************************************/
- EnviarCaracter:
- LoopTX:
- ; Esperar a que se termine de transmitir el caracter anterior.
- lds r17, UCSR0A ;Cargamos en r17 el UCSR0A (USART Control and Status Register A)
- sbrs r17, UDRE0 ;Si el bit "USART Data Register Empty" esta activo, el bufer esta vacio
- ; y se puede transmitir el dato. Por tanto saltamos la instruccion siguiente
- rjmp LoopTX ;Si el bit esta "no marcado" repetimos la comprobacion en espera.
- ; Enviar dato por puerto USART
- sts UDR0, r30 ; UDR0 - USART I/O Data Register
- ret
- /****************************************************************************************/
- MalDelay1s:
- ldi r18, 82
- ldi r19, 43
- ldi r20, 0
- L1: dec r20
- brne L1
- dec r19
- brne L1
- dec r18
- brne L1
- lpm
- nop
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement