figura 1 diversos microcontroladores...

Post on 18-Oct-2018

213 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

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

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

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

; 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

; 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

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

; 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

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

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

; 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

; 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

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

;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

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

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

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

―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

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

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

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

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

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

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

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

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.

28

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 contador equ 0x20 ;========================================= ; 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 0x00 ;inicia el registro contador movwf contador conteo movf porta,w ;lee un dato del puerto a movwf portb incf contador,1 ;incrementa registro contador

movlw 0x05 ;verifica el valor máximo del contador xorwf contador,w btfsc status,z goto otro goto conteo

end

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 contador equ 0x20 ;========================================== ; 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 0x00 ;inicia el registro contador movwf contador conteo movf porta,w ;lee un dato del puerto a movwf portb movlw 0x01 addwf contador,1 ;incrementa registro contador movlw 0x05 ;verifica el valor máximo del contador xorwf contador,w btfsc status,z goto otro goto conteo end

Tabla 12. Ejemplos de programa para un contador ascendente.

Una vez que se ha incrementado el valor del registro contador, se procede a

comparar el valor del registro contador con el valor máximo de la cantidad de

eventos que tienen que desarrollarse, este valor puede encontrarse dentro de un

registro al que podemos llamar ―Valormaximo‖. Si después de

29

―incrementar‖ el dato del valor del registro contador aun no es igual al valor

máximo, entonces se tiene que aplicar un nuevo incremento al registro contador, y

así sucesivamente hasta que alcance su valor total.

En los ejemplos de programa ilustrados en la tabla 12, se propone el empleo

de un microcontrolador PIC16F628A, pero en realidad por el momento no es

relevante el microcontrolador PIC que sea empleado, ya que el código para

realizar el conteo es valido para cualquier PIC. Los programas mostrados en la

tabla 12 controlan un contador ascendente, realizando ambos programas idénticas

funciones, teniendo solo un cambio en cuanto a las líneas de sus respectivos

códigos. El cambio existente entre los programas radica en la instrucción que

efectúa el incremento del registro contador. En un programa se emplea la

instrucción ―incf contador,1‖ la cual indica que se incremente en una unidad el

valor del registro ―contador‖ guardando el resultado en el mismo registro. Por

otra parte en el segundo programa que también se encuentra en la tabla 12, se

emplea el par de instrucciones ―movlw 0x01‖ y ―addwf contador,1‖, las cuales

en primer instancia cargan el registro de trabajo W con el valor al cual tendrá que

ser incrementado el registro contador, siendo el valor de 01h para el presente

ejemplo, mientras que por medio de la instrucción addwf, se realiza la suma del

registro contador con el valor que fue cargado en el registro de trabajo W,

guardando el resultado de la suma en el mismo registro contador; si fuera

necesario que el incremento que será sumado al registro contador sea diferente

de 01h, tan solo se tiene que cargar el valor correspondiente en el registro de

trabajo W. Posterior al incremento del registro contador se tiene que verificar si

ya se llego al valor máximo de eventos realizados, para el presente ejemplo el

incremento se tiene que realizar hasta que se alcanza el valor máximo de 5 (el

proceso de comparación será mostrado con detalle en el capitulo de funciones

lógicas que se encuentra dentro del presente capítulo).

El evento que se esta controlando es el de leer el un dato a través del puerto a,

y escribir ese mismo dato en el puerto b.

top related