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:
- ADCON0 (Registro de control 0)
- ADCON1 (Registro de control 1)
- ANCON0 (Registro de configuración 0)
- ANCON1 (Registro de configuración 1)
- 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” y 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:
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