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:
- ADRESH (Parte alta del resultado del ADC)
- ADRESL ( Parte baja del resultado del ADC)
- ADCON0 (Registro de control)
- ADCON1 (Registro de control)
- ADCON2 (Registro de control)
Empezaremos configurando cada uno de los registros de control según sean nuestras necesidades, para 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” y GO/DONE = “0”, por lo tanto el valor para ADCON0 será b’00000000′ = 0x00.
Ahora con 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:
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:
CÓDIGO FINAL
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