Envío Gratis en compras mínimas de $1200 mxn Enviamos a toda la Republica Mexicana
Buscar

Ensamblador 4: Convertidor analógico a digital (Miuva Pro)

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).

Posteriormente vamos a declarar el puerto J como salida ya que ahí están conectados los leds, y el puerto A como entrada ya que ahí recibiremos el valor analógico.

Ahora iremos a la hoja de especificaciones del PIC y en la sección 21 está toda la información para utilizar el ADC, encontraremos que los registros asociados serán:

  1. ADCON0 (Registro de control 0)
  2. ADCON1 (Registro de control 1)
  3. ANCON0 (Registro de configuración 0)
  4. ANCON1 (Registro de configuración 1)
  5. ADRESH y ADRESL (Registros de resultados)

Empezaremos configurando uno por uno:

ADON y GO/DONE estarán en 0 ya que el ADC estará inhabilitado, escogeremos el canal 0 para la lectura del ADC por lo tanto CHS0:CHS3 = “0000”, y las referencias de voltajes serán Vss y Vdd, por lo tanto VCFG1:VCFG0 = “00”, entonces en el registro ADCON0 escribiremos b’00000000′ = 0x00.

Ahora para ADCON1:

En este caso colocaremos para la velocidad la fosc/2 y el tiempo de adquisición 2TAD, entonces ADCS2:ADCS0 = “000” ACQT2:ACQT0 = “001”, el bit de calibración estará en “0” y justificado a la izquierda, por lo tanto ADCON1 = b’00001000 = 0x08.

Para ANCON0 y ANCON1:

 

Como el único pin analógico que utilizaremos será AN0 entonces todos menos PCFG0 tendrán que estar en “1”, por lo tanto ANCON0 = b’11111110′ = 0xFE y para ANCON1 = b’11111111′ = 0xFF.

Ahora habrá que habilitar el ADC poniendo ADON de ADCON0 en “1”.

movlw    0x00
movwf    TRISF    ;Puerto F como salida (Paso de MiuvaPro rev B)
movlw    0x00
movwf    TRISJ    ;Puerto J como salida
movlw    0x00
movwf    PORTJ    ;Puerto J como salida
movlw    0xFF
movwf    TRISA    ;Puerto A como entrada
movlw    b'11111110'
movwf    ANCON0    ;Configuramos AN0 como analógico
movlw    0xFF
movwf    ANCON1    ;Configuramos puertos digitales
movlw    b'00000000'
movwf    ADCON0    ;Configuración del ADC
movlw    b'00001000'
movwf    ADCON1    ;Configuración del ADC
bsf    ADCON0,ADON    ;ADC ENABLED

NOTA: En la revisión B de Miuva Pro (esta información la puedes encontrar en la parte posterior de tu tarjeta), es necesario colocar el puerto F como salida al utilizar el ADC, ya que por las conexiones del acelerómetro, éste causa un offset al valor leído por el convertidor. Si tienes la revisión C entonces no será necesario este paso.

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 = 18F87J50    ;PIC a utilizar
INCLUDE <P18F87J50.INC>
;************************************************************
;Configuración de fusibles
CONFIG  FOSC = HS   
CONFIG  DEBUG = OFF
CONFIG  XINST = OFF
;***********************************************************
;Código
CBLOCK 0x000
  valor1
  valor2
ENDC
ORG 0x00    ;Iniciar el programa en el registro 0x00
INICIO
  movlw    0x00
  movwf    TRISF    ;Puerto F como salida (Paso de MiuvaPro)
  movlw    0x00
  movwf    TRISJ    ;Puerto J como salida
  movlw    0x00
  movwf    PORTJ    ;Puerto J como salida
  movlw    0xFF
  movwf    TRISA    ;Puerto A como entrada
  movlw    b'11111110'
  movwf    ANCON0    ;Configuramos AN0 como analógico
  movlw    0xFF
  movwf    ANCON1    ;Configuramos puertos digitales
  movlw    b'00000000'
  movwf    ADCON0    ;Configuración del ADC
  movlw    b'00001000'
  movwf    ADCON1    ;Configuración del ADC
  bsf        ADCON0,ADON    ;ADC ENABLED
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
end