• No se han encontrado resultados

Figura 1 Diversos microcontroladores PIC.

N/A
N/A
Protected

Academic year: 2021

Share "Figura 1 Diversos microcontroladores PIC."

Copied!
29
0
0

Texto completo

(1)

3

CAPÍTULO I. RUTINAS BÁSICAS

1.1 CONFIGURACIÓN DE LOS PUERTOS COMO ENTRADA O SALIDA El primer ejercicio que se realiza con un microcontrolador es la de leer o escribir datos discretos (digitales) a través de sus puertos, por lo tanto, la primera actividad que tiene que realizarse, es la de configurar sus respectivos puertos ya sean como de entrada o de salida de datos.

Todos los microcontroladores poseen puertos que dependiendo de su estructura física relacionada con la cantidad de terminales, pueden poseer una cantidad de puertos igual a 1 ó 2 ó 3, etc.

Figura 1 Diversos microcontroladores PIC.

(2)

2

A continuación describiremos la manera en que tienen que ser configurados los puertos de un microcontrolador PIC, y para ello, nos basaremos en 4 microcontroladores PIC de diferentes tamaños, los cuales tomaremos como modelo y a partir de estos, podremos realizar cualquier aplicación, no importando la cantidad de terminales que posean los microcontroladores, ya que lo importante es aprender a configurarlos y obtener el máximo beneficio de sus herramientas internas.

Para configurar los puertos de entrada o salida de datos digital de los microcontroladores, se tiene que guardar un valor en el respectivo registro de configuración del puerto a ser empleado. El registro de configuración debe ser manipulado en el llamado ―tris‖, que dependiendo del puerto se complementa el nombre del registro a ―trisa‖ si se trata del puerto A, o ―trisb‖ si se trata del puerto B, o ―trisc‖ si se trata del puerto C, etc. Normalmente la mayor cantidad de puertos que posee un microcontrolador PIC es de 5 por lo que solo llegaría hasta el puerto E.

Cabe aclarar, que los microcontroladores que cuentan con un solo puerto como es el caso del PIC12F629, el registro de configuración de su puerto correspondiente, tan solo recibe el nombre de ―trisio‖, ya que no es necesario especificarle de que puerto se trata, por el hecho de que solo posee uno.

Los registros de configuración de los diferentes puertos de los microcontroladores PIC, se encuentran en el banco 1 del mapa de memoria de datos, siendo las localidades específicas para cada registro de configuración las siguientes:

(3)

3 Matrícula

del PIC Registro de Configuración trisa trisb trisc Trisd trise trisio PIC12F629 ---- ---- ---- ---- ---- 85h PIC16F628A 85h 86h ---- ---- ---- ---- PIC16F876 85h 86h 87h ---- ---- ---- PIC16F877 85h 86h 87h 88h 89h ----

Tabla 1. Ubicación de los registros de configuración de algunos microcontroladores PIC.

Todos los registros tris (configuración de puertos) de los diferentes puertos que poseen los microcontroladores PIC, se encuentran conformados por 8 bits, los cuales dependiendo del estado lógico en el que se encuentren, será la forma de como se configure su correspondiente puerto, ya sea como entrada o salida.

Para que un puerto de algún microcontrolador PIC sea configurado como entrada, en su correspondiente registro tris se debe de alojar un dato el cual debe estar compuesto por 1’s lógicos. Expresado de otra manera, sí se requiere que todos los bits de un puerto sean configurados como entradas, entonces a cada bit del correspondiente registro tris del puerto en cuestión se le tendrá que colocar en 1 lógico. Tal como se muestra a continuación:

Registro tris = 11111111(binario) ó tris = FF(hexadecimal) ó tris = 255(decimal)

De manera contraria, para que un puerto de algún microcontrolador PIC sea configurado como salida, en su correspondiente registro tris se debe de alojar un dato el cual debe estar constituido por 0’s lógicos. Expresando lo anterior de otra manera, sí se requiere que todos los bits de un puerto sean configurados como salidas, entonces a cada bit del correspondiente registro tris del puerto en cuestión se le tendrá que colocar en 0 lógico. Tal como se muestra a continuación:

Registro tris = 00000000(binario) ó tris = 00(hexadecimal) ó tris = 000(decimal)

Por otra parte, no es requisito indispensable configurar los bits de todo

(4)

4

un puerto ya sea como entrada o como salida, si no dependiendo de la aplicación un mismo puerto puede ser configurado por ejemplo mitad como entrada y mitad como salida, por lo tanto el registro tris podría quedar como:

Registro tris = 00001111(binario) ó al revés tris = 11110000(binario)

De manera general, la cantidad de bits de entrada o salida que se pueden configurar en un puerto, depende de las necesidades de la aplicación, pero lo que si debe de tomarse en cuenta es que los puertos cuentan con máximo 8 bits, los cuales deben ser distribuidos de manera adecuada, para considerar que microcontrolador es el que debemos de adquirir.

Para acceder a cualquiera de los registros tris se tiene que apuntar en primera instancia al banco 1 del mapa de memoria de datos, para ello se tienen que manipular los bits rp0 y rp1 del registro ―status‖. Por otra parte suponga que se requiere configurar al puerto A como entrada y en el puerto B el nible superior como entrada y el nible inferior como salida. A continuación se muestra a manera de sugerencia el código para realizar las acciones antes descritas, sobre microcontroladores que cuentan con más de un puerto.

bsf status,rp0 ;cambia al banco 1 bcf status,rp1

movlw b’11111111’ ;configura al puerto A como entrada movwf trisa

movlw b’11110000’ ;configura al puerto B bits del 0 a 3 como salida movwf trisb ;bits del 4 a 7 como entrada

Para microcontroladores que solo tienen un puerto, y además necesitamos que los bits 0,1 y 2 sean configurados como entradas, y los bits 3, 4 y 5 sean configurados como salidas, tomando en cuenta que el microcontrolador de un solo puerto puede ser el PIC12F629, se presenta el fragmento de código para configurar el puerto.

bsf status,rp0 ;cambia al banco 1

movlw b’00000111’ ;configura los bits del 0 al 2 como entrada, y los bits del 3 al 5

;como salida del único puerto.

movwf trisio

(5)

5

Aunque todos los registros de configuración tris son de 8 bits, en el PIC12F629 solo son empleados los 6 bits de más bajo peso, por lo que los bits 6 y 7 los colocamos en ―0‖ (de todas maneras son colocados en el estado lógico ―0‖ de manera automática).

Para finalizar el tema de la configuración de los registros de los puertos, podemos decir que es a través de los registros de configuración tris por donde se configuran los puertos de un microcontrolador, por lo tanto, son los primeros registros que deben ser manipulados cuando se diseña un programa.

1.2 LECTURA DE DATOS DE UN PUERTO

No importando la cantidad de bits que conformen a un puerto, este puede ser configurado para que pueda ―leer‖ algún dato del exterior, para ello, una vez que se tiene el correspondiente circuito de aplicación, se graba en el microcontrolador PIC el programa por medio del cual realizara la tarea de ingresar un dato digital al microcontrolador.

(6)

6

; Programa de prueba para leer el puerto B

LIST P=PIC16F876 ;Aquí se coloca la matricula del microcontrolador ;que vaya a emplearse

;=============================================================

; Declaración de registros

;=============================================================

portb equ 0x06 status equ 0x83 trisb equ 0x86 temporal equ 0x20

;=============================================================

; Declaración de bits

;=============================================================

rp0 equ 0x05 rp1 equ 0x06

;=============================================================

; Vector del reset

;=============================================================

reset

org 0

goto inicio

;=============================================================

; Inicio del programa principal

;=============================================================

inicio

bsf status,rp0 ;cambia al banco 1 bcf status,rp1

movlw b’11111111’ ;configura al puerto B como entrada movwf trisb

bcf status,rp0 ;cambia al banco 0 bcf status,rp1

movf portb,0 ;el dato del puerto es cargado al registro W movwf temporal ;el valor del registro W se aloja en el registro ;temporal.

goto inicio

Tabla 2. Utilización del puerto B de cualquier microcontrolador PIC para leer datos.

Para poder emplear un puerto como entrada en los microcontroladores PIC, se tiene que comenzar con la configuración del correspondiente registro ―tris‖, colocando todos sus bits en unos ―lógicos‖ (1’s). Posteriormente a la configuración del registro tris, se tiene que emplear el registro denominado ―port‖, llamando al puerto A como ―porta‖, al puerto B como ―portb‖, al puerto C como

―portc‖ y así sucesivamente para cada uno de los puertos con que cuente el microcontrolador.

(7)

7

; Programa de prueba para leer el puerto A

LIST P=PIC16F628A ;Aquí se coloca la matricula del microcontrolador ;que vaya a emplearse

;=============================================================

; Declaración de registros

;=============================================================

porta equ 0x05 cmcon equ 0x1f status equ 0x83 trisa equ 0x85 temporal equ 0x20

;=============================================================

; Declaración de bits

;=============================================================

rp0 equ 0x05 rp1 equ 0x06

;=============================================================

; Vector del reset

;=============================================================

reset

org 0

goto inicio

;=============================================================

; Inicio del programa principal

;=============================================================

inicio

bsf status,rp0 ;cambia al banco 1 bcf status,rp1

movlw b’11111111’ ;configura al puerto A como entrada movwf trisa

bcf status,rp0 ;cambia al banco 0 bcf status,rp1

movlw b’00000111’ ;selecciona 0 (cero) comparadores en el movwf cmcon ;registro cmcon (deshabilita los ;comparadores)

movf porta,0 ;el dato del puerto es cargado al registro W movwf temporal ;el valor del registro W se aloja en el registro

;temporal.

goto inicio

; Programa de prueba para leer el puerto A

LIST P=PIC16F876 ;Aquí se coloca la matricula del microcontrolador ;que vaya a emplearse

;=============================================================

; Declaración de registros

;=============================================================

porta equ 0x05 status equ 0x83 trisa equ 0x85 adcon1 equ 0x9f temporal equ 0x20

;=============================================================

; Declaración de bits

;=============================================================

rp0 equ 0x05 rp1 equ 0x06

;=============================================================

; Vector del reset

;=============================================================

reset

org 0

goto inicio

;=============================================================

; Inicio del programa principal

;=============================================================

inicio

bsf status,rp0 ;cambia al banco 1 bcf status,rp1

movlw b’11111111’ ;configura al puerto A como entrada movwf trisa

movlw b’00000111’ ;selecciona 0 (cero) comparadores en el movwf adcon1 ;registro adcon1 (deshabilita los ADC) bcf status,rp0 ;cambia al banco 0

bcf status,rp1

movf porta,0 ;el dato del puerto es cargado al registro W movwf temporal ;el valor del registro W se aloja en el registro

;temporal.

goto inicio

Tabla 3. Utilización del puerto A para leer datos de los microcontroladores PIC16F628A y PIC16F876.

Los registros ―port‖ prácticamente se comportan como un reflejo del estado lógico que se presenta en las terminales físicas del microcontrolador, siendo más específicos, diremos que el dato que alojemos en algún registro port, se transmitirá a las terminales que se encuentran relacionadas con el registro port correspondiente, recordando que el registro tris consecuente debe encontrarse configurado de tal forma que el puerto se comporte como entrada.

Todos los registros port se encuentran constituidos por 8 bits, los cuales indican el estado lógico en que se encuentran las terminales físicas del puerto en cuestión del microcontrolador PIC. Para leer todos los bits de un puerto se puede emplear el comando de lectura de un registro, indicando en la instrucción el puerto que tendrá que ser intervenido, para una mayor referencia observe el

(8)

8

ejemplo que se ilustra en la tabla 2. Este código es valido para todos los puertos exceptuando al puerto A de los microcontroladores PIC, por otra parte también se indica el direccionamiento del banco donde se encuentran los registros que serán empleados, actividad que se implementa por medio de la manipulación de los bits ―rp0‖ y ―rp1‖ del registro ―status‖.

En las terminales del puerto A de los microcontroladores PIC dependiendo de su estructura interna, pueden poseer ya sea convertidores analógico a digital (ADC), ó comparadores de voltaje, motivo por el cual como parte de la rutina de inicialización de los registros de los microcontroladores, se les tiene que indicar de manera adicional, que se van a emplear las terminales del puerto A para realizar lecturas de naturaleza digital. Posterior a la aplicación de un reset, las terminales del puerto A se configuran de manera predeterminada para que sean activados ya sea el ADC ó los comparadores de voltaje, por lo tanto, tendremos que recurrir al registro en donde se configura la cantidad de ADC’s o comparadores que serán empleados, pero en esta ocasión para deshabilitarlos.

Para realizar la actividad de deshabilitación de ADC ó comparadores, basta con seleccionar 0 (cero) ADC’s ó 0 (cero) comparadores de voltaje, tal como se ilustra en la código del programa de la tabla.

Hasta este punto hemos revisado de qué manera se leen los puertos A ó B ó C, etc., de microcontroladores que poseen más de un puerto (el PIC16F628A cuenta con 2 puertos y el PIC16F876 cuenta con 3 puertos) como entrada, pero también podemos encontrarnos con microcontroladores que posean tan solo un puerto único, por lo tanto debemos de ser capaces de poder trabajar con el microcontrolador de un solo puerto.

(9)

9

; Programa de prueba para leer el puerto de un PIC de 8 terminales LIST P=PIC12F629 ;Aquí se coloca la matricula del microcontrolador

;que vaya a emplearse

;=============================================================

; Declaración de registros

;=============================================================

w equ 00h status equ 0x03 gpio equ 0x05 cmcon equ 0x19 trisio equ 0x85 osccal equ 0x90 var1 equ 0x20

;=============================================================

; Declaración de Bits

;=============================================================

c equ 0 ;carry (acarreo) z equ 2 ;bit del cero

rp0 equ 5 ;registro de selección de banco

;=============================================================

; Inicio

;=============================================================

reset org 0 goto inicio

;=============================================================

; programa principal

;=============================================================

inicio

bcf status,rp0 ;cambiar al banco 0

movlw b’00000111’ ;selecciona 0 (cero) comparadores en el movwf cmcon ;registro cmcon (deshabilita los comparadores) bsf status,rp0 ;cambiar al banco 1

movlw b'00111111' ;configura los bits 0, 1, 2 , 3, 4 y 5 del puerto GPIO movwf trisio ;como entradas (solo contiene 6 bits).

movlw b'11111100' ;configura el oscilador interno en su velocidad movwf osccal ;máxima (4 Mhz).

ciclo

bcf status,rp0 ;cambiar al banco 0 movf gpio,w

movwf var1 goto ciclo

Tabla 4. Utilización del puerto GPIO de un PIC de 8 terminales para leer datos.

Dentro de los microcontroladores PIC, uno de los que cuenta con un solo puerto es el que se identifica por medio de la matricula PIC12F629, el cual posee 8 terminales de las cuales 2 son para alimentación, por lo que sobra un puerto de tan solo 6 bits. En este caso se trata de un microcontrolador que podemos considerar como ―enano‖ pero no por ello restringido en su operación, por el contrario todo depende de la aplicación que queramos realizar, y si esta no

(10)

10

requiere de muchas terminales de entrada, el PIC12F629 es muy adecuado.

Para emplear el puerto del microcontrolador PIC12F629 tenemos en primera instancia que configurar los bits de su correspondiente registro ―trisio‖ de tal manera que pueda leer datos, siguiendo la misma mecánica que se realizo para los demás microcontroladores, por lo tanto se debe de colocar unos (1´s) en los respectivos bits donde se pretende que la correspondiente terminal del microcontrolador sea configurada como entrada. Se tiene que considerar que la terminal identificada como GP3 (refiérase a la figura 1), siempre debe ser configurada como de entrada, ya que la arquitectura del microcontrolador PIC12F629 así la tiene diseñada.

En la tabla 4 se ilustra un fragmento de código para configurar al único puerto con el que cuenta un microcontrolador PIC de 8 terminales (en este caso un PIC12F629). En el registro ―trisio‖ se cargan 1’s en los bits 0, 1, 2, 3, 4 y 5 porque son los que se encuentran disponibles para el PIC12F629, los bits 6 y 7 no se encuentran disponibles para este PIC. Una vez que fue configurado el registro trisio, se procede a emplear el registro ―gpio‖ para ingresar el dato que se encuentra en las terminales del microcontrolador. Para emplear la totalidad de las terminales del PIC12F629, es necesario habilitar al oscilador interno del PIC, para que se puedan emplear las 2 terminales dedicadas al oscilador como entradas discretas (GP4 y GP5), además de deshabilitar la terminal del reset externo denominado MCLR, para contar con la terminal GP3 exclusivamente como entrada. Por otra parte, cuando se habilita al oscilador interno, se tiene que seleccionar la frecuencia de operación, por lo que en el registro ―osccal‖ se ingresa el valor binario ―11111100‖ que selecciona la frecuencia máxima de operación que es de 4 Mhz. El PIC12F629 en las terminales identificadas como GP0 y GP1 cuentan a la vez con comparadores de voltaje, mismos que tienen que ser deshabilitados para emplear dichas terminales como entradas digitales, siendo mediante la carga del valor binario ―00000111‖ en el registro ―cmcon‖.

Por último se tiene que recordar que para interactuar con algún registro, se

(11)

11

tiene que direccionar al banco adecuado. El PIC12F629 solo cuenta con 2 bancos, por lo tanto basta con manipular el bit ―rp0‖ del registro status para acceder al banco adecuado.

1.3 ESCRITURA DE DATOS EN UN PUERTO

Sin tomar en cuenta la cantidad de bits que conforman a los puertos de los microcontroladores PIC, estos pueden ser configurados para que se pueda

―escribir‖ algún dato hacia el exterior del microcontrolador, para ello, una vez que se tiene el correspondiente circuito de aplicación debidamente configurado, se graba en el microcontrolador PIC el programa por medio del cual realizara la tarea de enviar un dato digital hacia el exterior del microcontrolador.

Para poder utilizar cualquiera de los puertos de un microcontrolador PIC como salida, se tiene que considerar como primer paso el de la configuración del correspondiente registro ―tris‖, colocando todos sus bits en ceros ―lógicos‖ (0’s).

Una vez que fue configurado el registro tris, se tiene que proceder con el empleo del registro denominado ―port‖, y de acuerdo al puerto que se tenga que emplear se podrá seleccionar desde el puerto A como ―porta‖, al puerto B como ―portb‖, al puerto C como ―portc‖ y así sucesivamente para cada uno de los puertos con que cuente el microcontrolador.

Los registros denominados ―port‖ prácticamente se comportan como un reflejo del estado lógico que se presenta en las terminales físicas del microcontrolador, siendo más específicos, diremos que el dato que alojemos en algún registro port, se transmitirá a las terminales que se encuentran relacionadas con el registro port correspondiente, recordando que el registro tris consecuente debe encontrarse configurado de tal forma que el puerto se comporte como salida.

En los microcontroladores PIC todos los registros port se encuentran constituidos por 8 bits, los cuales indican el estado lógico en que se encuentran las terminales físicas del puerto en cuestión del microcontrolador PIC.

(12)

12

; Programa de prueba para escribir en el puerto B

LIST P=PIC16F876 ;Aquí se coloca la matricula del microcontrolador ;que vaya a emplearse

;=============================================================

; Declaración de registros

;=============================================================

portb equ 0x06 status equ 0x83 trisb equ 0x86 temporal equ 0x20

;=============================================================

; Declaración de bits

;=============================================================

rp0 equ 0x05 rp1 equ 0x06

;=============================================================

; Vector del reset

;=============================================================

reset

org 0

goto inicio

;=============================================================

; Inicio del programa principal

;=============================================================

inicio

bsf status,rp0 ;cambia al banco 1 bcf status,rp1

movlw b’00000000’ ;configura al puerto B como salida movwf trisb

bcf status,rp0 ;cambia al banco 0 bcf status,rp1

movf temporal,0 ;el dato del registro temporal es cargado a W movwf portb ;escribe el dato de W en el puerto B

goto inicio

Tabla 5. Utilización del puerto B de cualquier microcontrolador PIC para escribir datos.

Para escribir un dato en todos los bits de un puerto se puede emplear el comando de escritura sobre un registro, indicando en la instrucción el puerto que tendrá que ser intervenido, para una mayor referencia observe el ejemplo que se ilustra en la tabla 5. El código de la tabla 5 es valido para intervenir todos los puertos de un microcontrolador PIC exceptuando al puerto A de los PIC, por otra parte también se indica el direccionamiento del banco donde se encuentran los registros que serán empleados, por medio de la manipulación de los bits ―rp0 y rp1‖ del registro ―status‖, que de acuerdo al banco donde se ubiquen los diferentes registros de configuración, se tendrá que colocar la combinación adecuada en los bits rp0 y rp1.

(13)

13

; Programa de prueba para escribir un dato en el puerto A

LIST P=PIC16F628A ;Aquí se coloca la matricula del microcontrolador ;que vaya a emplearse

;=============================================================

; Declaración de registros

;=============================================================

porta equ 0x05 cmcon equ 0x1f status equ 0x83 trisa equ 0x85 temporal equ 0x20

;=============================================================

; Declaración de bits

;=============================================================

rp0 equ 0x05 rp1 equ 0x06

;=============================================================

; Vector del reset

;=============================================================

reset

org 0

goto inicio

;=============================================================

; Inicio del programa principal

;=============================================================

inicio

bsf status,rp0 ;cambia al banco 1 bcf status,rp1

movlw b’00000000’ ;configura al puerto A como salida movwf trisa

bcf status,rp0 ;cambia al banco 0 bcf status,rp1

movlw b’00000111’ ;selecciona 0 (cero) comparadores en el movwf cmcon ;registro cmcon (deshabilita los ;comparadores)

movf temporal,0 ;el dato del registro temporal es cargado a W movwf porta ;escribe el dato de W en el puerto A goto inicio

; Programa de prueba para escribir un dato en el puerto A

LIST P=PIC16F876 ;Aquí se coloca la matricula del microcontrolador ;que vaya a emplearse

;=============================================================

; Declaración de registros

;=============================================================

porta equ 0x05 status equ 0x83 trisa equ 0x85 adcon1 equ 0x9f temporal equ 0x20

;=============================================================

; Declaración de bits

;=============================================================

rp0 equ 0x05 rp1 equ 0x06

;=============================================================

; Vector del reset

;=============================================================

reset

org 0

goto inicio

;=============================================================

; Inicio del programa principal

;=============================================================

inicio

bsf status,rp0 ;cambia al banco 1 bcf status,rp1

movlw b’00000000’ ;configura al puerto A como salida movwf trisa

movlw b’00000111’ ;selecciona 0 (cero) comparadores en el movwf adcon1 ;registro adcon1 (deshabilita los ADC) bcf status,rp0 ;cambia al banco 0

bcf status,rp1

movf temporal,0 ;el dato del registro temporal es cargado a W movwf porta ;escribe el dato de W en el puerto A goto inicio

Tabla 6. Utilización del puerto A para escribir datos en los microcontroladores PIC16F628A y PIC16F876.

Sobre las terminales del puerto A de cualquiera de los microcontroladores PIC dependiendo de su estructura interna, pueden contar con convertidores analógico a digital (ADC), ó comparadores de voltaje, precedente para que sea implementada la correspondiente rutina de inicialización de los registros de los microcontroladores, para que de manera adicional se le indique a las terminales del puerto que serán empleadas para realizar la escritura de datos digitales en el puerto A. Cuando se aplica un reset, las terminales del puerto A se configuran siempre de manera predeterminada para que estas sean habilitadas como ADC ó los comparadores de voltaje, por lo tanto, se tendrá que recurrir al registro en donde se configura la cantidad de ADC’s o comparadores que serán empleados, pero en esta ocasión se tendrán que deshabilitar.

(14)

14

Para realizar la actividad de deshabilitación de ADC ó comparadores, basta con seleccionar 0 (cero) ADC’s ó 0 (cero) comparadores de voltaje, tal como se ilustra en los fragmentos de código de los programas de la tabla.

Hemos revisado la manera de escribir datos sobre los puertos A ó B ó C, etc., de microcontroladores que cuentan con más de un puerto (el PIC16F628A cuenta con 2 puertos y el PIC16F876 cuenta con 3 puertos), pero también podemos encontrarnos con microcontroladores que poseen tan solo un puerto único, por lo tanto se debe de contar con el conocimiento de poder trabajar con algún microcontrolador de un solo puerto.

Dentro de la familia de los microcontroladores PIC, uno de los que cuenta con un solo puerto es el que se identifica por medio de la matricula PIC12F629, el cual posee 8 terminales de las cuales 2 son para que sea energizado (terminales Vdd y Vss), por lo que sobra un puerto de tan solo 6 bits. En este caso se trata de un microcontrolador pequeño que pudiera ser considerado como restringido en cuanto a su cantidad de terminales, pero no en su operación, por el contrario todo depende de la aplicación que se tenga que realizar, ya que si esta no requiere de muchas terminales de salida, el PIC12F629 es un microcontrolador muy adecuado.

Para emplear el puerto del microcontrolador PIC12F629 tenemos en primera instancia que configurar los bits de su correspondiente registro ―trisio‖ de tal manera que se pueda escribir algún datos, siguiendo la misma mecánica que se realizo para los demás microcontroladores, por lo tanto, se debe de colocar ceros (0´s) en los respectivos bits donde se pretende que la correspondiente terminal del microcontrolador sea configurada como salida. Se tiene que considerar que de las terminales con que cuenta el PIC12F629, identificada como GP3 (refiérase a la figura 1), siempre tiene que ser configurada como de entrada, ya que la arquitectura del microcontrolador PIC12F629 así la tiene diseñada.

(15)

15

;Programa de prueba para escribir datos en un PIC de 8 terminales LIST P=PIC12F629 ;Aquí se coloca la matricula del microcontrolador

;que vaya a emplearse

;=============================================================

; Declaración de registros

;=============================================================

w equ 00h status equ 0x03 gpio equ 0x05 cmcon equ 0x19 trisio equ 0x85 osccal equ 0x90 var1 equ 0x20

;=============================================================

; Declaración de Bits

;=============================================================

c equ 0 ;carry (acarreo) z equ 2 ;bit del cero

rp0 equ 5 ;registro de selección de banco

;=============================================================

; Inicio

;=============================================================

reset org 0 goto inicio

;=============================================================

; programa principal

;=============================================================

inicio

bcf status,rp0 ;cambiar al banco 0

movlw b’00000111’ ;selecciona 0 (cero) comparadores en el movwf cmcon ;registro cmcon (deshabilita los comparadores) bsf status,rp0 ;cambiar al banco 1

movlw b'00001000' ;configura todos los bits (con excepción del 3) del movwf trisio ;puerto como salidas (solo contiene 6 bits).

movlw b'11111100' ;configura el oscilador interno en su velocidad movwf osccal ;máxima (4 Mhz).

ciclo

bcf status,rp0 ;cambiar al banco 0 movf var1,w

movwf gpio goto ciclo

Tabla 7. Utilización del puerto GPIO de un PIC de 8 terminales para escribir datos.

En la tabla 7 se ilustra un fragmento de código para configurar al único puerto con el que cuenta un microcontrolador PIC de 8 terminales (en este caso un PIC12F629) como salida. En el registro ―trisio‖ se cargan 0’s en los bits 0, 1, 2, 4 y 5 porque son los que se encuentran disponibles para el PIC12F629, los bits 6 y 7 no se encuentran disponibles para este PIC.

Una vez que fue configurado el registro trisio, se procede a emplear el

(16)

16

registro ―gpio‖ para enviar hacia el exterior del microcontrolador algún dato, para que se refleje en las terminales del microcontrolador. Para emplear la totalidad de las terminales del PIC12F629, es necesario habilitar al oscilador interno del PIC, para que se puedan emplear las 2 terminales dedicadas al oscilador como salidas discretas (GP4 y GP5), además de deshabilitar la terminal del reset externo denominado MCLR, para contar con la terminal GP3 exclusivamente como

―entrada‖. Por otra parte, cuando se habilita al oscilador interno, se tiene que seleccionar la frecuencia de operación, por lo que en el registro ―osccal‖ se ingresa el valor binario ―11111100‖ que selecciona la frecuencia máxima de operación que es de 4 Mhz. El PIC12F629 en las terminales identificadas como GP0 y GP1 cuentan a la vez con comparadores de voltaje, mismos que tienen que ser deshabilitados para emplear dichas terminales como salidas digitales, siendo mediante la carga del valor binario ―00000111‖ en el registro ―cmcon‖.

Por último se debe de tomar en cuenta que para interactuar con algún registro, se tiene que direccionar al banco adecuado. El PIC12F629 solo cuenta con 2 bancos, por lo tanto, basta con manipular el bit ―rp0‖ del registro status para acceder al banco adecuado.

1.4 ASIGNACIÓN DE DATOS A UN REGISTRO

Una de las tareas que tiene que realizar un microcontrolador, es la de ir almacenando datos, ya sea en sus registros de configuración, o en cualquier registro de memoria RAM, que es en donde finalmente se alojan los datos que resultan de una operación, o la lectura de un puerto, etc.

Si la aplicación así lo requiere, se tiene que manipular el dato de más de un registro, para ello, se tienen que distribuir todos los registros involucrados en el proyecto, para que en primera instancia se tengan que ubicar sobre los espacios de memoria RAM, que se encuentran constituidos sobre la memoria de datos, por lo tanto, se debe de conocer sobre que banco de memoria es sobre el que se alojara el dato en un registro.

(17)

17

Para comenzar a trabajar con los registros, la primera actividad a desarrollar es la que lleva por nombre ―declaración‖ de registros, o sea se le tiene que indicar al programa editor (que en el caso de los microcontroladores PIC es el MPLAB) que se va emplear por ejemplo el registro ―trisa‖.

w equ 00h status equ 0x03 trisa equ 0x85 trisb equ 0x86 porta equ 0x05 portb equ 0x06 cmcon equ 0x1f var1 equ 0x20 var2 equ 0x21 var3 equ 0x22 var4 equ 0x23 var5 equ 0x24 var6 equ 0x25 var7 equ 0x26 var8 equ 0x27 var9 equ 0x28 var10 equ 0x29 var11 equ 0x2a var12 equ 0x2b var13 equ 0x2c var14 equ 0x2d var15 equ 0x2e var16 equ 0x2f var17 equ 0x30

Tabla 8. Declaración de registros, para su empleo posterior.

Recordemos que se pueden clasificar de forma general en 2 conjuntos los registros que emplearemos, los cuales conocemos como registros de configuración y registros de propósito general, estos últimos también tienen la tarea de almacenar datos ya que se trata de registros que se encuentran implementados sobre memoria RAM. A continuación marcaremos un mayor énfasis sobre los registros de propósito general, sin olvidar a los registros de configuración.

Una vez que fueron declarados los registros con los que trabajaremos, ya los podemos emplear para escribirles o leerles el dato que contengan, por lo tanto, en el ejemplo que se muestra sobre un listado en el fragmento de programa descrito en la tabla 8, se declaran los registros que serán empleados, resaltando de

(18)

18

una manera particular a los registros de propósito general que son los que funcionaran como localidades de memoria RAM. De la tabla 8 se observa que se tienen que declara una serie de registros que se denominan ―var1‖, ―var2‖,

―var3‖, etc. Lo importante es que ocupan las localidades de los registros que van de la 20h a la 30 h, además de que son localidades continuas. Se debe de tener en cuenta que si por alguna razón se requiere insertar un nuevo registro por ejemplo entre los identificados como var7 y var8, posteriormente se tienen que enumerar nuevamente las localidades recorriendo los números de registro que a cada una le corresponde de tal manera, que de nueva cuenta queden ordenadas.

w equ 00h status equ 0x03 trisa equ 0x85 trisb equ 0x86 porta equ 0x05 portb equ 0x06 cmcon equ 0x1f

CBLOCK 0x20 ;Define donde comienza la declaración de registros var1

var2 var3 var4 var5 var6 var7 var8 var9 var10 var11 var12 var13 var14 var15 var16 var17

ENDC ;Define donde termina la declaración de registros

Tabla 9. Declaración de un bloque de registros, para asignación automática de localidades.

En la tabla 9 se muestra una manera mucho más práctica en lo correspondiente a la declaración de registros, en donde puede observarse que a partir del registro var1, nos olvidamos de indicar por medio de la directiva

(19)

19

―equ‖ la localidad que le corresponde a cada registro. Tan solo tenemos que enumerar a todos los registros que tenemos que emplear y al comienzo del bloque le colocamos el comando ―CBLOCK‖, indicándole cual será la primera localidad que tendrá que ocuparse, tal como se muestra en la ejemplo ―CBLOCK 0x20‖, tal como aparece en la tabla 9.

LIST P=PIC16F628A

;=========================================

; Declaración de registros

;=========================================

w equ 0x00 status equ 0x03 porta equ 0x05 portb equ 0x06 trisa equ 0x85 trisb equ 0x86 cmcon equ 0x1f

CBLOCK 0x20 ;define donde comienza la declaración de registros var1

var2 var3 var4 var5 var6 var7 var8 var9 var10 var11 var12 var13 var14 var15 var16 var17

ENDC ;define donde termina la declaración de registros

;==========================================

; Declaración de bits

;==========================================

rp0 equ 0x05 rp1 equ 0x06

;==========================================

; Vector del Reset

;==========================================

org 0x00 goto inicio

;==========================================

; Programa principal

;==========================================

inicio

bcf status,rp1 ;direcciona el banco 1 bsf status,rp0

movlw 0xff

movwf trisa ;los bits del Puerto a como entradas bcf status,rp1 ;direcciona el banco 0

bcf status,rp0 movlw 0x07 movwf cmcon ciclo

bcf status,rp1 ;direcciona el banco 0 bcf status,rp0

movf porta,0 movwf var1 movwf var2 movwf var3 movwf var4 movwf var5 movwf var6 movwf var7 movwf var8 movwf var9 movwf var10 movwf var11 movwf var12 movwf var13 movwf var14 movwf var15 movwf var16 movwf var17 goto ciclo end

Tabla 10. Empleo de los registros una vez declarados.

Para indicar en donde termina la declaración de registros, se tiene que colocar el comando ―ENDC‖ y hasta allí termina de realizar las declaraciones, por lo tanto, si se tiene que agregar un nuevo registro, tan solo se tiene que escribir

(20)

20

dentro del bloque y de manera automática le proporcionara una localidad.

Cuando ya fueron declarados los registros, posteriormente se procede a su empleo ya sea para guardarles un dato, o para leer el dato que contengan, en la tabla 10 se muestra un ejemplo en donde se emplea una gran cantidad de registros, los cuales durante el presente ejercicio serán empleados para alojarles un dato. El dato será leído a través del puerto A, posteriormente se guardara en el registro de trabajo ―W‖, y por último el dato que se encuentre en el registro W será colocado en todos los registros que van de var1 a var17, aquí es muy importante resaltar el hecho de que la declaración de los registros fue realizada mediante un bloque.

En el ejemplo mostrado en la tabla 10 se observa en la sección ―programa principal‖ después de la etiqueta ―ciclo‖, que de manera ordenada se tienen que ir alojando valores en cada uno de los registros identificados como ―var‖, mediante el empleo de una instrucción para cada uno de los registros, que en este caso se trata tan solo de 17; para cada uno de los registros se esta empleando un direccionamiento directo. Supóngase el caso en el que se requiera el manejo de 80 registros (no solo 17), la pregunta seria ¿se pondrán a escribir 80 instrucciones para cada uno de los registros? Seria una cuestión de nunca acabar, por lo que mejor recurrimos al método de direccionamiento indirecto, en el cual tan solo tenemos que indicar donde comienza la localidad de los registros que serán intervenidos, y controlar mediante un contador el acceso al siguiente registro, tal como es ilustrado en el ejemplo de la tabla 11.

El código del programa ilustrado en la tabla 11 es idéntico en cuanto a la actividad que realiza el programa que se muestra en la tabla 10, pero se tiene un cambio a la manera de guardar los datos en los registros, si observa detenidamente ambos programas, el que corresponde a la tabla 11, posee menos líneas de código porque se implemento en este el método de direccionamiento indirecto, para manipular a todos los registros.

(21)

21

LIST P=PIC16F628A

;=========================================

; Declaración de registros

;=========================================

w equ 0x00 indf equ 0x00 status equ 0x03 fsr equ 0x04 porta equ 0x05 portb equ 0x06 trisa equ 0x85 trisb equ 0x86 cmcon equ 0x1f

CBLOCK 0x20 ;Define donde comienza la declaración de registros

var1 var2 var3 var4 var5 var6 var7 var8 var9 var10 var11 var12 var13 var14 var15 var16 var17

ENDC ;Define donde termina la declaración de registros

;==========================================

; Declaración de bits

;==========================================

z equ 0x02

rp0 equ 0x05 rp1 equ 0x06

;==========================================

; Vector del Reset

;==========================================

org 0x00 goto inicio

;==========================================

; Programa principal

;==========================================

inicio

bcf status,rp1 ;Direcciona el banco 1 bsf status,rp0

movlw 0xff

movwf trisa ;Los bits del Puerto a como entradas movlw 0x00

movwf trisb ;Los bits del Puerto b como salidas bcf status,rp1 ;Direcciona el banco 0

bcf status,rp0 movlw 0x07 movwf cmcon otro

bcf status,rp1 ;Direcciona el banco 0 bcf status,rp0

movlw 0x20 ;indica la primera localidad a manipular movwf fsr

ciclo

movf porta,w ;lee un dato del puerto a

movwf indf ;aloja el dato en el registro indirecto movlw 0x30 ;verifica si se trata del ultimo registro xorwf fsr,w

btfsc status,z goto otro incf fsr,1 goto ciclo end

Tabla 11. Empleo de los registros mediante direccionamiento indirecto.

El direccionamiento indirecto consiste en obtener la dirección de una localidad de memoria (memoria RAM), por medio de otro registro (File Select Register

―FSR‖) que de manera intermedia es el primero que tiene que ser consultado.

El direccionamiento indirecto en los microcontroladores PIC se realiza por medio del empleo de los registros denominados en primer termino como: ―FSR‖

que es el que contendrá como dato a la localidad de memoria RAM que será manipulada, e ―INDF‖ que es el registro en el cual se encuentra la información

(22)

22

que será escrita o leída de la localidad de memoria RAM que se esta direccionando por medio del registro FRS. Para una mejor comprensión observe la figura 2, en la cual se muestra que con los bits del 0 al 6 del registro FSR se direcciona una localidad de memoria RAM, mientras que la combinación generada mediante los bits 7 del registro FSR y el bit IRP del registro STATUS se puede acceder a cualquiera de los 4 bancos de memoria que posee un microcontrolador PIC.

Figura 2. Direccionamiento Directo e Indirecto en un PIC.

Regresando de nuevamente al ejemplo de programa mostrado en la tabla 11, revisemos el fragmento de código que a continuación se muestra:

ciclo

movf porta,w ;lee un dato del puerto a

movwf indf ;aloja el dato en el registro indirecto movlw 0x30 ;verifica si se trata del ultimo registro xorwf fsr,w

btfsc status,z goto otro incf fsr,1 goto ciclo

Para poder emplear los registros ―indf‖ y ―fsr‖ tuvieron que ser declarados mediante el comando ―equ‖ con su respectiva localidad en el mapa de

(23)

23

memoria de registros del microcontrolador PIC, que para el registro ―indf‖ se trata de la localidad 00h, y para el registro ―fsr‖ de la localidad 04h.

Cuando se requiere alojar un dato de manera consecutiva en los registros de memoria RAM, se emplea la instrucción ―movwf indf‖ (previamente tuvo que ser cargado el dato en el registro de trabajo W) tal como se muestra en el programa de la tabla 11, pero cuando se requiere realizar la operación inversa, o sea leer de manera cíclica a los registros de memoria RAM, entonces la instrucción que tiene que ser empleada es ―movf indf,0‖ para que el dato que contenga la localidad de memoria RAM sea colocado en el registro de trabajo W. En cualquiera de los casos ya sea de escritura o lectura de una localidad de memoria RAM, lo primero que tiene que hacerse es ingresar en el registro FSR la localidad a ser intervenida.

1.5 INCREMENTO Y DECREMENTO DE DATOS DE LOS REGISTROS Incrementar o decrementar los datos de los registros, es una actividad que dependiendo de la aplicación se realiza con mucha frecuencia dentro de un programa, por ello, es que se tienen que revisar las diversas maneras de manipular la información que se encuentra alojada en los registros.

1.5.1 INCREMENTO O DECREMENTO DEL DATO DE UN REGISTRO EN UNA UNIDAD

Para incrementar o decrementar el dato de un registro en una unidad, se tienen las instrucciones ―incf‖ y ―decf‖ respectivamente, los cuales de manera simple realizan la operación que les corresponde, normalmente cuando observamos de manera aislada a este tipo de operaciones, en muchas ocasiones las consideramos como actividades triviales, pero debemos de estar seguros que si las empleamos de manera correcta, nuestros programas serán muy eficientes, la sintaxis completa de las instrucciones ―incf‖ y ―decf‖ son las siguientes:

(24)

24

a) incf registroX,1 ;Incrementa en una unidad el dato del registro X alojando el resultado final dentro del mismo registro X1.

b) decf registroX,1 ;Decrementa en una unidad el dato del registro X alojando el resultado final dentro del mismo registro X1.

Existen otras instrucciones que a parte de realizar la tarea de incrementar o decrementar en una unidad al valor del dato de algún registro, también verifican si el resultado de la operación fue cero, teniéndose la posibilidad de diseñar un contador con pocas líneas de código, y para ello se emplean las instrucciones que se muestran con su respectiva sintaxis de manera completa a continuación:

a) incfsz registroX,1 ;Incrementa en una unidad el dato del registro X alojando el resultado final dentro del mismo registro X1, y brinca si el resultado fue 0 (cero).

b) decfsz registroX,1 ;Decrementa en una unidad el dato del registro X alojando el resultado final dentro del mismo registro X1, y brinca si el resultado fue 0 (cero).

En los capítulos siguientes se mostraran ejemplos a cerca del empleo de estas instrucciones, en los cuales se muestran en aplicaciones prácticas.

1.5.2 INCREMENTO O DECREMENTO DEL DATO DE UN REGISTRO EN VALORES DIFERENTES A LA UNIDAD

En diversas ocasiones se necesita que se manipule el dato de un registro, para controlar una cierta variable, para lo cual los incrementos deben ser valores diferentes de la unidad, o simplemente se tiene que sumar o restar un valor de acuerdo con la aplicación que se esta implementando, pues bien, para incrementar o decrementar el dato de algún registro con valores diferentes de la

1 Refiérase a la explicación de las instrucciones que se encuentra en el capitulo ―instrucciones orientadas al control de registros dentro del Modulo I.

(25)

25

unidad, se tienen las instrucciones de suma o resta respectivamente, las cuales se muestran junto con su sintaxis completa:

a) addwf registroX,1 ;Suma el valor alojado en el registro W con el dato del registro X guardando el resultado final dentro del mismo registro X2.

b) subwf registroX,1 ;Resta el valor alojado en el registro W al dato del registro X guardando el resultado final dentro del mismo registro X2.

1.6 DISEÑO DE UN CONTADOR

Un contador es una de las primeras aplicaciones básicas que tienen que emplearse, por lo que en el desarrollo del presente capitulo se explicara la manera en que puede ser creado el código de un programa en le cual se tenga implementado un contador básico partiendo de registros de 8 bits, en el caso de que se requieran contadores de mas de 8 bits, la metodología mostrada en el presente capitulo será valida, pero se tendrá que recurrir a la suma o resta de registros con mas de 8 bits, y cuyas explicaciones se encuentran en los respectivos capítulos llamados ―suma aritmética‖ y ―resta aritmética‖ que se ubican dentro del presente capítulo.

La estructura de un contador se ilustra en el diagrama de flujo de la figura 3, en la cual se muestra que se tiene que guardar un dato en un registro, que será el que fungirá como el control del contador, el valor que se alojara en el registro contador dependerá de cómo se tiene que inicializar dicho contador. Ya inicializado el registro contador, se procede a realizar la actividad que tiene que controlar el contador, esto es, se realiza la actividad sustancial que por ejemplo puede una serie de sumas, una serie de lecturas a través de un puerto, etc.

Posteriormente a la realización de la actividad que controla el contador, se tiene que incrementar el valor del dato que se encuentra en el registro contador, para contabilizar la cantidad de eventos que se han realizado. Por último, se tiene

2 Refiérase a la explicación de las instrucciones que se encuentra en el capitulo ―instrucciones orientadas al control de registros dentro del Modulo I.

(26)

26

que revisar que no se haya rebasado la cantidad de eventos a realizarse, por lo que ahora, la actividad siguiente es la de comparar el valor que se encuentra dentro del registro contador, con el valor máximo de eventos que tienen que realizarse. Si el valor que se encuentra alojado en el registro contador, aun no alcanza el valor máximo, entonces el proceso tiene que repetirse una vez más, por lo tanto, se tendrá que realizar nuevamente el evento de la actividad que se esta controlando. De otra manera, si el valor del registro contador es igual al valor máximo de los eventos que tienen que realizarse, entonces el programa tendrá que realizar una actividad diferente de la que estaba controlado con el contador, dando por terminado el contador y accediendo a un nuevo proceso.

Figura 3. Diagrama de flujo de un contador.

En el diagrama de flujo del contador de la figura 3, los bloques que corresponden al control del contador son resaltados, para tener presente donde se realiza el control del contador. Los contadores pueden desarrollarse en forma general de dos maneras, dependiendo de si el contador se configurará como un

―contador ascendente‖ o un ―contador descendente‖, pero en ambos casos la

(27)

27

estructura del contador es la misma que se ha mostrado previamente, y a continuación se muestra la estructura de los distintos tipos de contador.

1.6.1 CONTADOR ASCENDENTE

El contador ascendente tiene como característica principal la de llevar un conteo ascendente en el registro contador, razón por la cual el registro contador se inicializa con un valor ―pequeño‖ que puede ser inclusive 0 (cero), dicho valor tiene que ser menor al valor máximo de eventos que tiene que controlar el contador.

Figura 4. Diagrama de flujo de un contador ascendente.

Después de haber realizado la actividad que corresponde al evento que se esta controlando, el registro contador tiene que ser incrementado para precisamente llevar a cabo el conteo de la cantidad de eventos que han sido efectuados, normalmente el incremento que se aplica al registro contador es de una unidad, pero en realidad se tiene que incrementar de acuerdo a la aplicación que se esta desarrollando.

Referencias

Documento similar

que hasta que llegue el tiempo en que su regia planta ; | pise el hispano suelo... que hasta que el

La primera opción como algoritmo de compresión para secuencias biológicas que sugirió la directora del proyecto fue la adaptación de los algoritmos de Lempel-Ziv al alfabeto formado

En esta sección se tratan las características que debe tener un compresor de secuencias biológicas para poder ser usado como herramienta en la construcción de los árboles de

[r]

SVP, EXECUTIVE CREATIVE DIRECTOR JACK MORTON

Social Media, Email Marketing, Workflows, Smart CTA’s, Video Marketing. Blog, Social Media, SEO, SEM, Mobile Marketing,

Missing estimates for total domestic participant spend were estimated using a similar approach of that used to calculate missing international estimates, with average shares applied

En su lugar, hecha la recusacion con causa en el acto de la comparecencia, el secretario recusado manifestará si tiene ó no por cierta la causa alegada, consignándolo en el acta, y