Parte 4 – Introducción a la programación en assembler con el PIC16F877A
Tiempo total: 33 días con 9:38:16 hrs
En la última parte de este tutorial, se explicara cómo realizar una conversión análogo digital CAD; básicamente consiste en conocer el funcionamiento de los registros ADCON0 y ADCON1, almacenando el resultado de la conversión en los registros ADRESH y ADRESL.
Código assembler
El siguiente código convierte las patitas de PORTA como entradas, de las cuales únicamente el bit 0 servirá como entrada analógica, las demás serán digitales. El resultado de la conversión lo traslada a los 8 bits del puerto B, y los últimos dos bits en el puerto D.
Explicación del código (por último, la explicación del error en ADCON0)
Las instrucciones básicas han sido explicadas, en esta publicación observamos los registros ADCON0 y ADCON1, que son utilizados para controlar la conversión análogo-digital.
ADCON0
Para ver la descripción de este registro, es necesario consultar la página 19 de la URL http://www.utp.edu.co/~eduque/arquitec/PIC16F877.pdf; En el código assembler observamos que todos los bits, menos el 0 son 1. El bit 0 ADON indica que el modulo va a estar activo, esperando a iniciar la operación al establecer el bit 2 GO/DONE a 1.
Los bits 3, 4 y 5 sirven para seleccionar el canal a convertir, es decir que entrada de PORTA (o PORTE) será utilizado como entrada analógica. En la página 18 observamos la siguiente imagen, por lógica simple los tres bits los convertimos a decimal seleccionando la entrada analógica 0-7.
Regresando a la página 19, observamos que los bits 6 y 7 son ADCS0 y ADCS1, en el código ejemplo la selección es Fosc/2.
ADCON1
En primer lugar, observamos que este registro utiliza los bits 0,1,2 y 3 para configurar los pines de PORTA y PORTE como analógico o digital. Estos bits son llamados PCFG0-PCFG3; básicamente, la configuración 1111 es la siguiente (página 20):
Según la hoja de datos, el otro bit que se utiliza es el 7, ADFM; Si ADFM=0 entonces el resultado se justifica a la izquierda, caso contrario se justifica a la derecha.
La explicación del datasheet (página 19 y 20) me resulta un poco confusa, de primero es necesario recordar que el bit menos significativo es el de la derecha, y el más significativo (de más valor) está a la izquierda; pero si utilizamos ADFM=0 la lectura de los registros ADRESL (Low) y ADRESH (High) se torna confusa, para esto realice la siguiente imagen (problema solucionado).
Conversión
La primera línea de la página 22 indica que antes de iniciar la primera conversión es necesario asegurar el tiempo de muestreo requerido, eso lo observamos en la siguiente imagen:
Después, con la instrucción BSF cambiamos el bit GO/DONE a 1, es decir que iniciamos la conversión. La primera instrucción de la etiqueta ESPERA se asegura que la conversión haya terminado; bien, con las demás instrucciones únicamente mueven el resultado a los puertos B y D. Este proceso entra en un ciclo interminable.
MOVF
Esta instrucción puede tener la siguiente sintaxis, MOVF registro, N en donde N puede ser 0 o 1; si es 0, el valor de registro se mueve a W, pero si es 1, el valor de registro (que es F) se mueve a F (registro=registro); la única diferencia es que cuando es N es 1, si registro es cero la bandera Z se activa. N=1 puede utilizarse para ver si el valor es 0 sin afectar otro registro.
La instrucción MOVF es innecesaria en este código, se puede utilizar la instrucción MOVLW pero ambas instrucciones hacen uso de un solo ciclo.
Error de los bits 6 y 7 de ADCON0
El código de este ejemplo es del siguiente sitio web:
Los bits 6 y 7 significan la selección de la frecuencia de conversión Fosc / 2 (página 16 de la hoja de datos), dado que el TAD mínimo debe de ser de 1.6us y el cristal oscilador es de 4MHz, entonces se tiene que 4MHz/2 = 2000kHz = 5ps (que es muy inferior a 1.6us). Teóricamente este es un error, pero se sabe que la capacidad máxima de un cristal oscilador de 4MHz es de 1/4 motivo por el cual cada ciclo es equivalente a 1us (1MHz = 1us), esto significa que en realidad Fosc/2 es (500kHz=2us).
Retardo
El PIC16F877A requiere de un mínimo de 10 TAD para realizar la conversión (página 21, selección de la frecuencia de conversión) más una espera mínima de 2 TAD para la siguiente conversión, entonces si 1 TAD=1.6us significa que 12TAD=19.2us.
El retardo presentado aquí, muestra un contador con el numero hexadecimal 0x15, lo cual significa que tarda (1+1+[1(16-1)+2]+[2(16-1)]) 49 ciclos, es decir 49us para un cristal de 4MHz; en teoría, debiera de tardarse no más de 20us (o 25us). En este caso, el valor asignado puede ser 0x06 para 22us (porque si es 0x05 el retardo seria de 19us).
Parte 3
Para ver la parte 3, por favor sigue el siguiente enlace:
Referencias
[http://www.utp.edu.co/~eduque/arquitec/PIC16F877.pdf]
[http://perso.wanadoo.es/luis_ju/pic3/pic3_reg.html]
[http://www.circuitoselectronicos.org/2009/04/ejemplos-sencillos-para-el.html]
[http://micropic.galeon.com/instrucciones.htm]
[https://es.wikipedia.org/wiki/PIC16F87X]
[http://perso.wanadoo.es/luis_ju/pic/pic04.html]
[https://es.wikipedia.org/wiki/Se%C3%B1al_anal%C3%B3gica]
[https://www.youtube.com/watch?v=5xvxQvLghW0]
[https://www.youtube.com/watch?v=k3w2F857jq4]
[https://www.youtube.com/watch?v=iwGHgkpRUew]
[https://www.youtube.com/watch?v=O_6NIm6encw]
[https://www.youtube.com/watch?v=sEfSu9Szjv8]
[https://carlosalbertosainz.wordpress.com/2014/04/28/practica-4-manejo-del-convertidor-analogico-digital/]
[http://tutor.al-williams.com/pic-inst.html]
[http://www.circuitoselectronicos.org/2011/02/retardos-por-software-en-los.html]
[http://es.ncalculators.com/digital-computation/hex-decimal-converter.htm]
[http://es.ncalculators.com/digital-computation/binary-decimal-converter.htm]
[http://www.binaryhexconverter.com/hex-to-binary-converter]
[http://www.wolframalpha.com]
[http://www.todopic.com.ar/foros/index.php?topic=36505.0]
[http://www.solodrivers.com/manuales/programacion_ensamblador8]
[http://www.tutoelectro.com/tutoriales/electronica-basica/%C2%BFque-resistencia-utilizar-al-usar-un-led/]
[http://iesmachado.org/web%20insti/depart/electr/apuntes/files/dpe/curso2/proyectos/pic_f_877/TEMA_20_conversor_AD.pdf]
[https://www.unitjuggler.com/frequency-convertir-kHz-a-s(p).html?val=500]
[http://www.todopic.com.ar/foros/index.php?topic=27929.0]