domingo, 17 de noviembre de 2013

UART0 Y ENSAMBLADOR

    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

 PROGRAMA

/*
 * 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 TCCR0A (0x44)


REGISTRO TCCR0B (0x45)




GENERADOR DE FUNCIONAMIENTO DEL TIMER0















 PREESCALADOR DEL TIMER0



















 REGISTRO OCR0A (0x47)





 
 TIMSK0
  

BAUD RATE PARA DIFERENTES FRECUENCIAS DE PROCESAMIENTO  Y SU VALOR EN UBRRn CORRESPONDIENTE


 

 PRUEBA DE FUNCIONAMIENTO DEL PROGRAMA

SIMULACION EN ATMEL STUDIO 6



 SIMULACION EN PROTEUS




LINK
https://mega.co.nz/#!MtsX1Q7J!QUB9JDmIRdW_N-I6UBTXQymfb3k2hnWcloA50m-Afc8

No hay comentarios:

Publicar un comentario