Ensamblador 4: Convertidor analógico a digital

Ahora que ya conocemos algunas cosas básicas para trabajar con ensamblador, vamos a aprender como utilizar los recursos que ofrece el microcontrolador, para esto es necesario tener a mano la hoja de datos del mismo.

El primer recurso a utilizar será el convertidor analógico a digital (ADC) que lo que hace es convertir información analógica del mundo real en algo digital que nuestro microcontrolador pueda procesar. Tanto Miuva (PIC 18F4550) como Miuva Pro (PIC 18F87J50) cuentan con un ADC que puede ser configurado para hasta 10 bits. En la práctica vamos a leer una información analógica y vamos a mostrar el valor leído en unos leds (para Miuva en el puerto B y para Miuva Pro en el puerto J).

Lo primero será declarar que el puerto B será utilizado como salidas, por lo tanto habrá que asignarle al registro TRISB el valor 0x00, posteriormente revisamos en la sección 21 de la hoja de datos todo lo relacionado al ADC, y encontraremos que los registros asociados al mismo son:

  1. ADRESH (Parte alta del resultado del ADC)
  2. ADRESL ( Parte baja del resultado del ADC)
  3. ADCON0 (Registro de control)
  4. ADCON1 (Registro de control)
  5. ADCON2 (Registro de control)

Empezaremos configurando cada uno de los registros de control según sean nuestras necesidades, para ADCON0:

Imagen1. Registro ADCON0

El canal que vamos a utilizar será el canal 0, por lo tanto de CHS3:CHS0 = “0000”, por el momento tendremos que tener desactivado el ADC, por lo tanto ADON = “0”GO/DONE = “0”, por lo tanto el valor para ADCON0 será b’00000000′ = 0x00.

Ahora con ADCON1:

Imagen2. Registro ADCON1

Vamos a utilizar solo un pin de forma analógica (AN0), por lo tanto en PCFG3:PCFG0 = “1110”, las referencias de los voltajes del ADC serán Vss y Vdd, por lo tanto VCFG1:VCFG0 = “00”, por lo tanto el valor para ADCON1 será b’00001110′ = 0x0E.

Ahora para ADCON2:

Imagen3. Registro ADCON2

Para la velocidad utilizaremos fosc/2 por lo tanto ADCS2:ADCS0 = “000”, para el tiempo de adquisición utilizaremos 2 Tad por lo tanto ACQT2:ACQT0 = “001” y para el formato seleccionaremos justificado a la izquierda por lo tanto ADFM = “0”, por lo tanto el valor para ADCON2 será b’00001000′ = 0x08.

Y por último encenderemos el ADC poniendo en “1” el bit ADON de ADCON0.

movlw	0x00
movwf	TRISB
movlw	0x0E
movwf	ADCON1
movlw	0x00
movwf	ADCON0
movlw	0x08
movwf	ADCON2
bsf	ADCON0,ADON

Para la lectura del ADC necesitamos esperar hasta que el bit GO_DONE se ponga en 0, en ese momento significa que el ADC terminó el tiempo de conversión, para esto comenzamos lo conversión poniendo GO_DONE en 1 usando la instrucción bsf, después utilizamos la instrucción btfsc, la cual saltará la siguiente instrucción cuando el bit indicado sea “0”, en caso de que no sea “0” (lo que quiere decir que todavía no está listo el dato) regresará a la etiqueta ESPERA, cuando ya está el dato listo solamente habrá que leer los registros correspondientes a la parte alta y baja del ADC y guardarla en otras dos variables que tuvimos que haber declarado anteriormente y enviar la parte que queramos visualizar a los leds.

BUCLE
  bsf		ADCON0,GO_DONE 	;Comienza la conversión
ESPERA
  btfsc	ADCON0,GO_DONE	;Esperamos a que esté lista la conversión
  goto	ESPERA			;Si no está lista regresamos a ESPERA
  movff	ADRESL,valor1	;Cargamos valor1 con el valor del ADC LSB
  movff	ADRESH,valor2	;Cargamos valor2 con el valor del ADC MSB
  movff	valor2,PORTJ	;Mostramos la parte más significativa en los leds
  goto BUCLE				;Volvemos a empezar la conversión

Nos queda el siguiente código:

LIST    P = 18F4550	;PIC a utilizar
INCLUDE <P18F4550.INC>

;************************************************************
;Configuración de fusibles
CONFIG  FOSC = HS   
CONFIG  PWRT = ON
CONFIG  BOR = OFF
CONFIG  WDT = OFF
CONFIG  MCLRE = ON
CONFIG  PBADEN = OFF
CONFIG  LVP = OFF
CONFIG  DEBUG = OFF
CONFIG  XINST = OFF

;***********************************************************
;Código

CBLOCK  0x000
    adclecturaH
    adclecturaL
ENDC

ORG 0x00    ;Iniciar el programa en el registro 0x00
    goto    INICIO

    INICIO
    movlw	0x00
    movwf	TRISB
    movlw	0x0E
    movwf	ADCON1
    movlw	0x00
    movwf	ADCON0
    movlw	0x08
    movwf	ADCON2
    bsf		ADCON0,ADON

    BUCLE  
    bsf		ADCON0, GO_DONE
    btfsc	ADCON0, GO_DONE
    goto	BUCLE
    movff	ADRESL,adclecturaL
    movff	ADRESH,adclecturaH
    movff	adclecturaH, PORTB
    goto	BUCLE

END
Menú