A continuación el siguiente programa tiene como fin hacer uso de la transmisión de datos con ayuda del microcontrolador, este tipo de actividad es de gran ayuda dentro de la ingeniería debido a su extenso uso dentro de las diversas aplicaciones en las que se puede utilizar este tipo de comunicaciones.
DESCRIPCION
El programa realizado realiza el envió de datos únicamente, lo cual realiza cada 10ms aproximadamente haciendo uso del timer0 en modo CTC y de la interrupción por coincidencia donde además de realizar el envió de datos también cambia el estado de PD6 para observar la velocidad de funcionamiento de la interrupción.
Dejare el link de la simulacion y el programa al final para que puedan descargarlo
Alguna pregunta o sigerencia ingresela en los comentarios
/*
* usart0.asm
*
* Created: 17/11/2013 12:04:29
* Author: NEBURESS.KYLL
*/
.include "m48def.inc"
.def var1 = r16
.def var0 = r17
.def temp = r18
.def retraso = r19
.org 0x000
rjmp init
.org OC0Aaddr
rjmp TIM0_COMPA ; Timer0 CTC
init:
sbi DDRD,6 ;DECLARA A PD6 COMO SALIDA
;INICIALIZA LA PILA
ldi r20,0xFF
ldi temp,high(RAMEND)
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp
;INICIALIZA EL TIMER
call init_timer
;HABILITA LA INTERRUPCION GLOBAL
sei
;INICIALIZA EL USART
call ini_usart
main:
;BUCLE INFINITO
rjmp main
;INICIALIZA EL TIMER EN MODO CTC
init_timer:
ldi retraso,(5<<CS00)
sts 0x45,retraso ;PREESCALER 1024.....0x45=TCCR0B
ldi retraso,0x4E
sts 0x47,retraso ;0x47=OCR0A.......CARGA A OCR0A=4E
ldi retraso,(1<<COM0A0)|(1<<WGM01)
sts 0x44,retraso ;ESTABLECE A COM0A0 EN CAMBIO DE ESTADO EN COINCIDENCIA Y ESTABLECE A TIMER0 EN
;MODO CTC
clr retraso
ldi retraso,(1<<OCIE0A) ;SETEA LA MASCARA DE COINCIDENCIA OCIE0A
sts TIMSK0,retraso
ret ;RETORNA
ini_usart:
;ESTABLECER BAUD RATE A 9600 PARA F_CPU=8MHz SIN PREESCALAMIENTO
ldi var1,0x00
sts UBRR0H,var1
ldi var0,0x33
sts UBRR0L,var0
;HABILITAR RECEPCION Y TRANSMISION
ldi temp,(1<<RXEN0)|(1<<TXEN0)
sts UCSR0B,temp
;ESTABLECER EL FORMATO: 8 BITS DE DATOS, 2 BITS DE STOP
ldi temp,(1<<USBS0)|(3<<UCSZ00)
sts UCSR0C,temp
ret
transmit:
;ESPERA A QUE EL BUFFER DE TRASNMISION SE ENCUENTRE VACIO
lds var1,UCSR0A
sbrs var1,5
rjmp transmit
;COLOCA EL DATO DE temp Y LO ENVIA
sts UDR0,r20
ret
;RETORNA
TIM0_COMPA:
push temp ;COLOCA A temp EN LA PILA
in temp,SREG ;GUARDA EL VALOR DE SREG en temp
call transmit ;TRANSMITE EL VALOR DEL REGISTRO r20
dec r20 ;DECREMENTA EL VALOR DEL REGISTRO r20
lds var0,SREG ;CARGA EL VALOR DE SREG EN var0
sbrc var0,1 ;SI r20==0 ENTONCES
ldi r20,0xFF ;r20=0XFF
out SREG,temp ;RETORNA EL VALOR DE SREG ANTES DE INGRESAR A LA INTERRUPCION
pop temp ;RETIRA LA INTERRUPCION DE LA PILA
reti
A continuacion se mostraran los registros que se usaron para este programa ademas de que se indicara la direccion nde aquellos donde su direccion en el .include "m48def.inc" no son las indicadas
por lo cual se cambiaron, dependiendo del microcontrolador que utilicen esto podria no ser verdad por lo que si usan un microcontrolador diferente revisen las direcciones de los registros para que el programa funcione como se espera.
REGISTRO TCCR0B (0x45)
GENERADOR DE FUNCIONAMIENTO DEL TIMER0

PREESCALADOR DEL TIMER0

REGISTRO OCR0A (0x47)

BAUD RATE PARA DIFERENTES FRECUENCIAS DE PROCESAMIENTO Y SU VALOR EN UBRRn CORRESPONDIENTE
SIMULACION EN ATMEL STUDIO 6
LINK
https://mega.co.nz/#!MtsX1Q7J!QUB9JDmIRdW_N-I6UBTXQymfb3k2hnWcloA50m-Afc8
No hay comentarios:
Publicar un comentario