martes, 21 de mayo de 2013

Sensor de Temperatura con ADC

Objetivo

Nuestro objetivo en este proyecto es la aplicación simple del Convertidor Analógico-Digital de nuestro Microcontrolador MC9S08SE8.
La forma de Aplicación será a través de un sensor de temperatura de precisión, dicha interpretación de la entrada análoga se hará por medio de 2 display en un formato decimal.

Material

  • Microcontrolador MC9S08SE8
  • USBDM
  • TTL 7448 (decodificador a 7 segmentos)
  • Display Catodo Comun
  • Sensor LM35-TO92 (sensor termico de presición)

Desarrollo

Para este programa se diseñara en una salida al Puerto B de nuestro Microcontrolador y configurado el canal 1 como la entrada analógica de nuestra implementación.
Para esto también configuraremos nuestro Microcontrolador para que los datos enviados al puerto B sean en el sistema decimal, esto para que nuestros drivers puedan mostrarnos en el display la información explícita.

Programación




;-------------------------------------------------------------------------------------------------------
;Inicializamos nuestras variables a Utilizar
;-------------------------------------------------------------------------------------------------------

ExampleVar: DS.B   1
Corregido:  equ     $83
Convertido: equ     $84
Comparador: equ     $85
Tope:       equ     $86


            ORG    ROMStart
;-------------------------------------------------------------------------------------------------------
;Configuramos los registros para habilitar el ADC de nuestro Microprocesador con salida a puerto B
;-------------------------------------------------------------------------------------------------------
_Startup:
            LDHX   #RAMEnd+1        ; initialize the stack pointer
            TXS
            CLI                     ; enable interrupts
           ;-------------------------------------------------------------------------------------------------------             
           ;Declaramos Puerto B como Salida
           ;-------------------------------------------------------------------------------------------------------
            LDA #$FF          
            STA PTBDD         ;lo colocamos en el registro PTBDD para hacer PTBD la Salida
            
           ;-------------------------------------------------------------------------------------------------------
           ;Configuracion del ADC
           ;-------------------------------------------------------------------------------------------------------
            LDA #$90          ;Cargamos $90=10010000
            STA ADCCFG        ;Colocamos en registro ADCCFG con la siguiente configuracion
                              ;Bajo Poder, clock /1,largo tiempo muestreo, resolucion 8 bits, 
             
            LDA #$00
            STA ADCSC2       
             
            LDA #$21          ;$21=00100001, COCO y AIEN desactivados, Activada conversion continua, Canal 1 seleccionado
            STA ADCSC1
             
           ;-------------------------------------------------------------------------------------------------------
           ;Inicializamos nuestras variables
           ;-------------------------------------------------------------------------------------------------------
            LDA #$00
            STA Corregido
            STA Convertido
            STA Comparador
            STA Tope
;-------------------------------------------------------------------------------------------------------
;Programa Principal
;-------------------------------------------------------------------------------------------------------
MainLoop:
            BSR ConvertidorAD       ;Realizamos la adquision de datos del canal 1              
            BSR Conversor           ;Realiza la conversion del sistema hexagesimal a decimal
            LDA Corregido           ;Carga nuestro valor corregido 
            STA PTBD                ;Manda la Informacion al puerto B
            BSR Retardo             ;Llama al ciclo de retardo para la apreciación de datos en tiempo real
            feed_watchdog
            BRA MainLoop
;-------------------------------------------------------------------------------------------------------
;Programa convertidor
;-------------------------------------------------------------------------------------------------------
ConvertidorAD:
            LDA ADCSC1              ;Se carga el contenido de ADCSC1 para verificar COCO
            CMP #$A1                ;Comparamos con $A1=%10100001 si igual Z=1,(COCO activado, AIEN desactivado, Conversion continua activada, Canal 1), 
            BNE ConvertidorAD       ;si COCO no esta activado (Z=0), regresa (Branch) a main, con COCO debe ser: 
            LDA ADCRL               ;Cargamos la entrada convertida del Canal 1 
            STA Convertido          ;La mandamos a variable para realizar el arreglo decimal
            feed_watchdog
            RTS
;-------------------------------------------------------------------------------------------------------
;Programa que realiza la conversion del sistema hexagesimal al decimal
;-------------------------------------------------------------------------------------------------------
Conversor:
            LDA Convertido
            ADD #$A
            STA Tope 
             
            LDA #$00
            STA Corregido
            STA Comparador
             
for:
            feed_watchdog
            LDA Comparador
            CMP Tope
            BEQ Salir_Ciclo
            LDA Corregido
            ADD #$01
            DAA
            STA Corregido
            INC Comparador
            BRA for
             
Salir_Ciclo:
            RTS                      
            
;-------------------------------------------------------------------------------------------------------
;Programa de Retardo
;-------------------------------------------------------------------------------------------------------                 
Retardo:
            LDA #$A            
            STA $100
            STA $101
            STA $102
             
Retardomain:
             
            feed_watchdog
            LDA $100             
            CMP #$00
            BEQ Retorno
            DECA                
            STA $100
            LDA #$78            
            STA $101
             
Subretardo_1:
            feed_watchdog 
            LDA $101
            CMP #$00
            BEQ Retardomain
            DECA
            STA $101
            LDA #$78
            STA $102            
             
Subretardo_2:
             
            LDA $102
            CMP #$00
            BEQ Subretardo_1
            DECA
            STA $102
            BRA Subretardo_2
             
 Retorno:
            RTS     





Como se puede apreciar, este programa es una aplicación básica del ADC, la cual puede servir como base para proyectos futuros. Esto porque no es exclusiva del diseño, sino es una programación general del ADC, es posible conectar casi cualquier entrada análoga para su cuantización digital.
Otra aplicación adicional es que puede programarse alguna entrada de control para procesos de automatización.

miércoles, 8 de mayo de 2013

Secuencia Auto Increíble

Descripción 

Una efecto de luces muy conocido es la de KITT, el auto increible, el cual se distinguia por asemejar un haz de luz que recorria toda la parte inferior de su cofre de lado a lado y luego formada dos haces que se cruzaban y asi sucesivamente 

Material necesario

  • Interfase BDM
  • Microcontrolador MC9S08SE8
  • 8 LEDs (preferiblemente rojos dado a que ese es el color original)

Programación

Para esta secuencia se realizara un deslizamiento del bit activo hacia un lado y luego hacia el otro y posteriormente dos haces de luz que se cruzaran 2 veces

Codigo:

_Startup:
            LDHX   #RAMEnd+1        ; initialize the stack pointer
            TXS
            CLI                     ; enable interrupts
            
            MOV #$FF,PTBDD          ;Habilitar puerto PTBD como salida
            CLR PTBD
            
mainLoop:
            LDA #$C0
            BSR CICLO_1
            LDA #$03
            BSR CICLO_2
            BSR CICLO_3
            BSR CICLO_3
            feed_watchdog
            BRA    mainLoop
                        
CICLO_1:
            STA PTBD
            BSR RETARDO
            LSRA
            BNE CICLO_1
            RTS
CICLO_2:
            STA PTBD
            BSR RETARDO
            LSLA
            BNE CICLO_2
            RTS
CICLO_3:     
            LDA #$81
            STA PTBD
            BSR RETARDO
            LDA #$42
            STA PTBD
            BSR RETARDO
            NSA
            STA PTBD
            BSR RETARDO
            LDA #$18
            STA PTBD
            BSR RETARDO
            LDA #$24
            STA PTBD
            BSR RETARDO
            NSA
            STA PTBD
            BSR RETARDO
            LDA #$81
            STA PTBD
            BSR RETARDO
            RTS
             
RETARDO:
            CLR $80
            CLR $81
            MOV #1,$82              ; Podemos acelerar el proceso de conteo cambiando "MOV #[numero],$82"
            
            VOLVER:
            DBNZ    $80,VOLVER
            feed_watchdog
            DBNZ    $81,VOLVER
            feed_watchdog
            DBNZ    $82,VOLVER
            feed_watchdog
             
            RTS

Conclusion

Como se puede apreciar solo con ver el codigo es una secuencia muy sencilla, mas que nada nos ayuda a practicar el uso de llamado de subrutinas, manipulación y movimiento de bits con un menos numero de instrucciones.

Lo ideal es que ustedes tomen este código e intenten innovarlo, ya sea desarrollando secuencias mas conplejas, usando los demas puertos o simplificandolo y asi ahorrandonos espacio en la memoria, lo cual a la larga sera de gran ayuda en proyectos futuros.

Contador 0-99 con Conexion Directa a Display

Descripción

Como se vio en el proyecto Contador 0-99 usando CI 7448 se realizara un circuito que realice la misma función; sin embargo, en esta ocasión relizaremos una conexion directa de nuestro microcontrolador a ambos Display de 7 segmentos.

Material necesario

  • Interfase BDM
  • Microcontrolador MC9S08SE8
  • 2 Display a 7 segmentos (Cátodo Común)

Programación

En esta ocasión utilizaremos las memorias disponibles para almacenar el codigo hexagesimal que se requiere para activar los segmentos correspondientes de nuestro display para que proyecte los numeros.

Para esta programación realizaremos las siguientes asignaciones de puertos:

  • Puerto B se conectara al display de las decenas
  • Puerto C se conectara al display de las unidades
Código

; variable/data section
;
            ORG    RAMStart         ; Insert your data definition here
ExampleVar: DS.B   1
unidades:    equ $A0
decenas:     equ $A1
unidadesbcd: equ $A2
decenasbcd:  equ $A3
limite:      equ $A4

;
; code section
;
            ORG    ROMStart

_Startup:
                        LDHX   #RAMEnd+1        ; initialize the stack pointer
            TXS
            CLI                     ; enable interrupts
            
PROG_PORTS:            
            MOV   #$FF,PTBDD         ;puerto B salida (DECENAS)
            MOV   #$FF,PTCDD         ;puerto C salida (UNIDADES)
                       
            CLR   unidades
            CLR   decenas
            CLR   unidadesbcd
            CLR   decenasbcd
            CLR   limite
;---------------------------------------------------------------------------------            
;SE ENVIAN LOS SIGUIENTES CODIGOS DE ACOMODO DE PINES A LAS TERMINALES B Y C
;ESTO PARA NO TENER MAYOR PROBLEMA AL MOMENTO DE LA IMPLEMENTACION
;---------------------------------------------------------------------------------
            ;PUERTO B
            ;--------------------------------------
            MOV   #%01111110,$80      ;ajuste del 0
            MOV   #011000,$81      ;ajuste del 1
            MOV   #%10110110,$82      ;ajuste del 2
            MOV   #%10111100,$83      ;ajuste del 3
            MOV   #%11011000,$84      ;ajuste del 4
            MOV   #%11101100,$85      ;ajuste del 5
            MOV   #%11101110,$86      ;ajuste del 6
            MOV   #111000,$87      ;ajuste del 7
            MOV   #%11111110,$88      ;ajuste del 8
            MOV   #%11111000,$89      ;ajuste del 9
            ;--------------------------------------
            ;PUERTO C
            ;--------------------------------------            
            MOV   #%10011111,$90      ;ajuste del 0
            MOV   #000110,$91      ;ajuste del 1
            MOV   #%10101101,$92      ;ajuste del 2
            MOV   #101111,$93      ;ajuste del 3
            MOV   #110110,$94      ;ajuste del 4
            MOV   #111011,$95      ;ajuste del 5
            MOV   #%10111011,$96      ;ajuste del 6
            MOV   #001110,$97      ;ajuste del 7
            MOV   #%10111111,$98      ;ajuste del 8
            MOV   #111110,$99      ;ajuste del 9
            ;--------------------------------------
           
            
main:
            BSR   CUENTA_UNIDADES
            BSR   BUSQUEDA_UNIDADES
            LDA   unidadesbcd
            STA   PTCD
            BSR   BUSQUEDA_DECENAS
            LDA   decenasbcd
            STA   PTBD 
            BSR   RETARDO             
                     
            BRA    main
;-------------------------------------------
            
; ESTA SUBRUTINA LLEVA A CABO LA CUENTA 0-99
;-------------------------------------------
CUENTA_UNIDADES:
            INC unidades  
            LDA unidades
            CMP #$A
            BEQ CUENTA_DECENAS
            RTS
            
CUENTA_DECENAS            
            MOV #$00, unidades
            INC decenas
            LDA decenas
            CMP #$A
            BEQ REINICIO
            RTS

REINICIO:
            MOV   #$00,unidades
            MOV   #$00,unidadesbcd
            MOV   #$00,decenas
            MOV   #$00,decenasbcd
            RTS
;--------------------------------------------------------            

;ESTA SUBRUTINA REALIZA LA CONVERSION BCD DE LAS UNIDADES
;--------------------------------------------------------
BUSQUEDA_UNIDADES:
            LDHX  #$90
            MOV   #$90,limite
            LDA   unidades
            ADD   limite
            STA   limite

CONVERSION_BCD1:
            CPX   limite
            BEQ   SALIDA_UNIDADES
            INCX
            BRA   CONVERSION_BCD1

SALIDA_UNIDADES
            LDA ,X
            STA unidadesbcd
            RTS

;--------------------------------------------------------            

;ESTA SUBRUTINA REALIZA LA CONVERSION BCD DE LAS DECENAS
;-------------------------------------------------------- 
BUSQUEDA_DECENAS:
            LDHX  #$80
            MOV   #$80,limite
            LDA   decenas
            ADD   limite
            STA   limite

CONVERSION_BCD2:
            CPX   limite
            BEQ   SALIDA_DECENAS
            INCX
            BRA   CONVERSION_BCD2

SALIDA_DECENAS
            LDA ,X
            STA decenasbcd
            RTS
;---------------------
            
;SECUENCIA DE RETARDO  
;---------------------
RETARDO:
            CLR $A5
            CLR $A6
            MOV #2,$A7              ; Podemos acelerar el proceso de conteo cambiando "MOV #[numero]"
            
            VOLVER:
            DBNZ    $A5,VOLVER
            feed_watchdog
            DBNZ    $A6,VOLVER
            feed_watchdog
            DBNZ    $A7,VOLVER
            feed_watchdog
            RTS 


Implementación

Si se habrán dado cuenta, el código de salida a los Display es diferente al usual, esto es por que se ajustaron para que al momento de la implementación no cruzar cables y nuestro proyecto quede mas estético.

Les anexo el arreglo de los pines entre el Microcontrolador y los Display


Contador 0-99 Usando CI 7448

Descripcion

En este proyecto Básico de programación se realizara un contador binario con salida en el puerto B de nuestro microcontrolador, dicha salida ira a dar a dos CI 7448 conectados a 2 display de 7 segmentos. 

El programa realizara un conteo de forma decimal de 0 al 99 y reiniciándose al terminar la cuenta. Por ser un programa básico de programación lo realizará de manera automatica al correrlo.

Material Necesario

  • Protoboard
  • Microcontrolador MC9S08SE8
  • CI 7448 (datasheed)
  • Display a 7 segmentos de cátodo común(datasheed)

Programación


_Startup:
            LDHX   #RAMEnd+1        ; initialize the stack pointer
            TXS
            CLI                     ; enable interrupts
           
            LDA #$FF
            STA PTBDD               ; se declara PTBD como salida
            CLR PTBD
            LDA #$FF
            CLR $83
            
            
; Insert your code here
Conteo: LDA $83 ; se utilizara registro 0x10000011=$83 como almacen del conteo ADD #$1 ; se realiza la suma sin acarreo al acumulador A DAA ; se corrige la salida hexagesimal a decimal STA $83 ; se guarda operación en el registro $83, esto para guardar el conteo LDA $83 ; se carga acumulador A con el dato guardado en el registro $86 STA PTBD ; se carga el acumulador A en la salida PTBD JSR RETARDO ; llama a secuencia de retardo RETARDO: CLR $80 CLR $81 MOV #1,$82 ; Podemos acelerar el proceso de conteo cambiando "MOV #[numero],$82" VOLVER: DBNZ $80,VOLVER feed_watchdog DBNZ $81,VOLVER feed_watchdog DBNZ $82,VOLVER feed_watchdog NOP BRA Conteo

Implementación

Para la implementación del proyecto únicamente realizaremos las conexiones del BDM al Microcontrolador, de ahí conectaremos las salidas [3:0] al primer CI que nos indicara las unidades y las salidas[4:7] al segundo CI que actuara como las decenas. 

Realizamos las conexiones necesarias a los display y corremos el programa normalmente.

Nota: no hay que olvidar conectar la resistencia de 330 ohm al cátodo común de cada unos de los display, de preferencia alimentar el circuito con una fuente externa de 5v, esto para evitar baja corriente en el circuito