pic= 16f628

124
NIVEL 1 PIC 16F628 TEORIA Y PRACTICA MICROCONTROLADOR 16F628 DESCRIPCION DE PINES N o m b r e Pin # Tipo E/S/P Tipo Buffer RA0 / AN0 17 E/S ST RA1 / AN1 18 E/S ST RA2 / AN2 / VREF 1 E/S ST RA3 / AN3 / CMP1 2 E/S ST RA4 / TOCKI / CMP2 3 E/S ST RA5 / MCLR / THV 4 E/P ST RA6 / OSC2 / CLKOUT 15 E/S ST RA7 / OSC1 / CLKIN 16 E/S ST RB0 / INT 6 E/S TTL RB1 / RX / DT 7 E/S TTL RB2 / TX / CK 8 E/S TTL RB3 / CCP1 9 E/S TTL RB4 / PGM 10 E/S TTL RB5 11 E/S TTL DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 1

Upload: william-javier-nieto

Post on 08-Aug-2015

388 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

MICROCONTROLADOR 16F628

DESCRIPCION DE PINES

N o m b r e Pin # Tipo E/S/P Tipo Buffer

RA0 / AN0 17 E/S STRA1 / AN1 18 E/S STRA2 / AN2 / VREF 1 E/S STRA3 / AN3 / CMP1 2 E/S STRA4 / TOCKI / CMP2 3 E/S STRA5 / MCLR / THV 4 E/P STRA6 / OSC2 / CLKOUT 15 E/S STRA7 / OSC1 / CLKIN 16 E/S STRB0 / INT 6 E/S TTLRB1 / RX / DT 7 E/S TTLRB2 / TX / CK 8 E/S TTLRB3 / CCP1 9 E/S TTLRB4 / PGM 10 E/S TTLRB5 11 E/S TTLRB6 / T1OSO / T1CKI 12 E/S/P TTLRB7 / T1OSI 13 E/S/P TTLVSS 5 P ----VDD 14 P ----

BANCOS DE REGISTROS DEL PIC 16F628 DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 1

Page 2: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 2

Page 3: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

CONJUNTO DE INSTRUCCIONESEl conjunto de instrucciones de los microprocesadores PIC 16FXXX consiste en un pequeño repertorio de solo 35 instrucciones. En este curso se ha optado por clasificarlas, desde el punto de vista del programador, en cinco categorías bien definidas de acuerdo con la función y el tipo de operandos involucrados.

Instrucciones de Byte que operan con Registros

Estas instrucciones pueden ser de simple o doble operando de origen. El primer operando de origen será siempre el registro seleccionado en la instrucción, el segundo, en caso de existir, será el registro W.

El destino, es decir donde se guardara el resultado, será el registro seleccionado o el W, según se seleccione con un bit de la instrucción.

El formato genérico de estas instrucciones es el siguiente :

11 10 9 8 7 6 5 4 3 2 1 0 d f f f f f

Los bits 0 a 4 (5 bits), denominados “f” permiten seleccionar uno de 35 registros de la memoria interna. El bit 5, denominado “d”, permite especificar el destino del resultado. Si d = 1 el resultado se guardara en el registro seleccionado. Si d = 0 el resultado se guardara en W. Los bits 6 a 11 identifican la instrucción especifica a realizar.

Instrucciones de operaciones lógicas de doble operando :

ANDWF f,d ;operación AND lógica, destino = W Ù f

IORWF f,d ;operación OR lógica, destino = W Ú f

XORWF f,d ;operación XOR lógica, destino = W Å f

Los nombres mnemónicos de estas instrucciones provienen de : AND W con F, Inclusive OR W Con F y XOR W con F.

Instrucciones de operaciones aritméticas y lógicas sencillas de simple operando :

MOVF f,d ;movimiento de datos, destino = f

COMF f,d ;complemento lógico, destino = NOT f

INCF f,d ;incremento aritmético, destino = f + 1

DECF f,d ;decremento aritmético, destino = f - 1

Los mnemónicos de estas instrucciones provienen de : MOVe File, COMplement File, NCrement File y DECrement File. En las siete instrucciones anteriores el único bit afectado de la palabra de estado del procesador es el Z, que se pone en 1 si el resultado de la operación es 00000000, y se pone en 0 si el resultado tiene cualquier otro valor.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 3

Page 4: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Instrucciones de rotación de bits a través del CARRY :

RLF f,d ;rotación a la izquierda, destino = f ROT

RRF f,d ;rotación a la derecha, destino = f ROT

En estas operaciones (Rotate Left File y Rotate Right File) los bits son desplazados de cada posición a la siguiente, en sentido derecho o izquierdo. El desplazamiento es cerrado, formando un anillo, con el bit C (CARRY) de la palabra de estado.

En estas dos instrucciones, el único bit afectado de la palabra de estado del procesador es el bit C, que tomará el valor que tenia el bit 7 o el bit 0, según sea el sentido del desplazamiento.

Estas instrucciones son muy útiles para la manipulación de bits, y además para realizar operaciones aritméticas, ya que en numeración binaria, desplazar un número a la izquierda es equivalente a multiplicarlo por 2, y hacia la derecha, a dividirlo por 2.

Instrucción que realiza el intercambio de posiciones entre los cuatro bits menos significativos y los cuatro más significativos ( nibble bajo y nibble alto ).

SWAPF f,d ;intercambia nibbles, destino = SWAP f

Esta instrucción (SWAP File) no afecta ninguno de los bits de la palabra de estado del procesador. Esta instrucción es muy útil para el manipuleo de números BCD empaquetados, en los que en un solo byte se guardan dos dígitos BCD (uno en cada nibble).

Instrucciones de operaciones de la suma y la resta aritméticas :

ADDWF f,d ;suma aritmética, destino = f + W

SUBWF f,d ;resta aritmética, destino = f - W

Estas operaciones (ADD W a F y SUBstract W de F) afectan a los tres bits de estado C, DC y Z.

El bit Z se pone en 1 si el resultado de la operación es 00000000, y se pone en 0 si el resultado tiene cualquier otro valor.

La suma se realiza en aritmética binaria pura sin signo. Si hay un acarreo del bit 7, es decir que el resultado es mayor que 255, el bit C (carry) resulta 1, en caso contrario resulta 0.

Si hay un acarreo del bit 3, es decir que la suma de las dos mitades (nibbles) menos significativas (bits 0 a 3) resulta mayor que 15, se pone en 1 el bit DC (digit carry), en caso contrario se pone en 0.

Ejemplos :

1010 0010 1101 0000

+ 0100 1111 C DC Z + 0110 1111 C DC Z

1111 0001 0 1 0 0011 1111 1 0 0

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 4

Page 5: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

La resta se realiza sumando, en binario puro sin signo, el registro f más el complemento a dos de W (el complemento a 1, o complemento lógico, más 1)

Ejemplos :

f 0100 0100 0010 1000

W - 0010 1000 C DC Z - 0100 0100 C DC Z

0001 1100 1 0 0 1110 0100 0 1 0

equivalente a :

f 0100 0100 0010 1000

cmp.2 W + 1101 1000 C DC Z + 1011 1100 C DC Z

0001 1100 1 0 0 1110 0100 0 1 0

Los bits de estado C y DC toman el valor normal correspondiente a la suma de f con el complemento a 2 de W. De esta manera el significado para la operación de resta resulta invertido, es decir que C (carry) es 1 si no hubo desborde en la resta, o dicho de otra manera, si el contenido de W es menor que el de f.

El bit DC se comporta de manera similar, es decir que DC es 1 si no hubo desborde en la mitad menos significativa, lo que equivale a decir que el nibble bajo del contenido de W es menor que el del registrof.

Instrucciones de simple operando y el destino es siempre el registro seleccionado :

CLRF f ;borrado de contenido, f = 0

MOVWF f ;copia contenido W a f, f = W

La instrucción CLRF (CLeaR File) afecta solo al bit Z que resulta siempre 0. La instrucción MOVWF (MOVe W a F) no afecta ningún bit de la palabra de estado.

- Instrucciones de Byte que operan sobre W y Literales

Estas instrucciones se refieren todas al registro W, es decir que uno de los operandos de origen y el operando de destino son siempre el registro W. En las instrucciones de este grupo que tienen un segundo operando de origen, este es siempre una constante de programa literalmente incluida en la instrucción, llamada constante literal o simplemente literal.

El formato genérico de estas instrucciones es el siguiente :

11 10 9 8 7 6 5 4 3 2 1 0

k k k k k k k k

Los bits 0 a 7 especifican la constante literal de 8 bits que se utilizara en la operación.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 5

Page 6: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Las tres instrucciones que siguen son las operaciones lógicas tradicionales, similares a las que ya vimos anteriormente, pero realizadas entre una constante de programa y el registro W :

IORLW k ; operación OR lógica, W = W Ú k

ANDLW k ; operación AND lógica, W = W Ù k

XORLW k ; operación XOR lógica, W = W Å k

En estas tres instrucciones (Inclusive OR Literal W, AND Literal W y XOR Literal W) el único bit afectado de la palabra de estado del procesador es el Z, que se pone en 1 si el resultado de la operación es 00000000, y se pone en 0 si el resultado tiene cualquier otro valor. Instrucción que cargar una constante de programa en el registro W :

MOVLW k ;carga constante en W, W = K

Esta (MOVe Literal W) instrucción no afecta ninguno de los bits de estado del procesador. La instrucción que sigue (CLeaR W) no correspondería incluirla en este grupo, y pertenece en realidad al primero, el de las instrucciones que operan sobre registros, ya que se trata de un caso especial de la instrucción CLRF, con destino W, y f = 0.

La incluimos aquí porque como se le ha asignado un mnemónico particular referido específicamente al registro W, creemos que, desde el punto de vista del programador, es más útil verla dentro del grupo de instrucciones referidas a W. CLRW ;borra el contenido de W, W = 0

Al igual que en la instrucción CLRF, el único bit de estado afectado es el Z que resulta1

- Instrucciones de Bit

El formato genérico de estas instrucciones es el siguiente :

11 10 9 8 7 6 5 4 3 2 1 0

b b b F f f f f

Los bits 0 a 4 (5 bits), denominados “f”, permiten seleccionar uno de 35 registros de la memoria interna. Los bits 5 a 7, denominados “b”, permiten especificar el numero de bit (0 a 7) sobre el que se operara. Estas instrucciones operan solamente sobre el bit especificado, el resto de los bits del registro no son alterados.

Estas instrucciones no tienen especificación de destino, ya que el mismo es siempre el registro seleccionado.

BCF f,b ; borra el bit b de f ;bit f(b) = 0

BSF f,b ; coloca en uno el bit b de f ;bit f(b) = 1

Estas instrucciones (Bit Clear File y Bit Set File) no afectan ningún bit de la palabra de estado del procesador.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 6

Page 7: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

- Instrucciones de Control

GOTO k ;salto a la posición k (9 bits) del programa

Esta es la típica instrucción de salto incondicional a cualquier posición de la memoria de programa .

La constante literal k es la dirección de destino del salto, es decir la nueva dirección de memoria de programa a partir de la cual comenzarán a leerse las instrucciones después de ejecutar la instrucción GOTO.

Esta instrucción simplemente carga la constante k en el registro PC (contador de programa). La única complicación de esta instrucción es que la constante k es de solo 9 bits, mientras que el registro PC es de 11 bits, ya que en el 16F628 debe permitir direccionar una memoria de programa de 2 K.

Los dos bits faltantes, bit 9 y 10 del PC, son tomados respectivamente de los bits de selección de página PA0 y PA1 de la palabra de estado.

Este comportamiento particular hace que la memoria de programa aparezca como dividida en paginas de 512 posiciones como se vera más adelante.

El programador debe tener en cuenta que antes de ejecutar una instrucción GOTO es posible que haya que programar los bits PA0 y PA1.

CALL k ; salto a la subrutina en la posición k (8 bits)

Su comportamiento es muy similar al de la instrucción GOTO, salvo que además de saltar guarda en el stack la dirección de retorno de la subrutina (para la instrucción RETLW). Esto lo hace simplemente guardando en el stack una copia del PC incrementado, antes de que el mismo sea cargado con la nueva dirección k.

La única diferencia con la instrucción GOTO respecto de la forma en la que se realiza el salto, es que en la instrucción CALL la constante k tiene solo 8 bits en vez de 9. En este caso también se utilizan PA0 y PA1 para cargar los bits 9 y 10 del PC, pero además el bit 8 del PC es cargado siempre con 0.

Esto hace que los saltos a subrutina solo puedan realizarse a posiciones que estén en las primeras mitades de las paginas mencionadas.

El programador debe tener en cuenta este comportamiento y asegurarse de ubicar las posiciones de inicio de las subrutinas en las primeras mitades de las paginas.

La instrucción que aparece a continuación es la de retorno de subrutina:

RETLW k ; retorno de subrutina con constante k, W = k

Esta (RETurn con Literal in W) instrucción produce el retorno de subrutina con una constante literal k en el registro W. La operación que realiza consiste simplemente en sacar del stack un valor y cargarlo en el PC.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 7

Page 8: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Ese valor es el PC incrementado antes de realizar el salto, de la ultima instrucción CALL ejecutada, por lo tanto es la dirección de la instrucción siguiente a dicho CALL.

Dado que el stack es de 11 bits, el valor cargado en el PC es una dirección completa, y por lo tanto se puede retornar a cualquier posición de la memoria de programa, sin importar como estén los bits de selección de pagina.

Esta instrucción además carga siempre una constante literal en el registro W. Ya que esta es la única instrucción de retorno de subrutina de los PIC16FXXX, no hay en estos microprocesadores forma de retornar de una subrutina sin alterar el registro W.

Por otro lado, y con una metodología especial de programación, un conjunto de sucesivas instrucciones RETLW puede ser usado como una tabla de valores constantes incluida en el programa (Ej. : tablas BCD/7 seg.).

Instrucciones de “salto” (skip) condicional.

Estas instrucciones son los únicos medios para implementar bifurcaciones condicionales en un programa.

Son muy generales y muy poderosas ya que permiten al programa tomar decisiones en función de cualquier bit de cualquier posición de la memoria interna de datos, y eso incluye a los registros de periféricos, los puertos de entrada/salida e incluso la palabra de estado del procesador.

Estas dos instrucciones reemplazan y superan a todo el conjunto de instrucciones de salto condicional que poseen los microprocesadores sencillos convencionales (salto por cero, por no cero, por carry, etc.).

BTFSC f,b ;salta si bit = 0

BTFSS f,b ;salta si bit = 1

BTFSC (Bit Test File and Skip if Clear) saltea la próxima instrucción si el bit b del registro f es cero.

BTFSS (Bit Test File and Skip if Set) saltea si el bit es 1.

Estas instrucciones pueden usarse para realizar o no una acción según sea el estado de un bit, o, en combinación con GOTO, para realizar una bifurcación condicional.

Ejemplo 1 : Ejemplo 2:

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 8

Page 9: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Las instrucciones que siguen son casos especiales de las de incremento y decremento

Estas instrucciones podrían categorizarse dentro del grupo de instrucciones orientadas a byte sobre registros (primer grupo), ya que efectivamente operan sobre los mismos, y el formato del código de la instrucción responde al de ese grupo, pero, a diferencia de las otras, pueden además alterar el flujo lineal del programa y por eso se les incluyó en este grupo.

DECFSZ f,d ;decrementa y salta sí 0, destino= f - 1

INCFSZ f,d ;incrementa y salta sí 0, destino= f + 1

Estas dos instrucciones (DECrement File and Skip if Zero, e INCrement File and Skip if Zero) se comportan de manera similar a DECF e INCF, salvo que no afectan a ningún bit de la palabra de estado.

Una vez realizado el incremento o decremento, si el resultado es 00000000, el microprocesador salta la próxima instrucción del programa. Estas instrucciones se utilizan generalmente en combinación con una instrucción de salto (GOTO), para el diseño de ciclos o lazos (loops) de instrucciones que deben repetirse una cantidad determinada de veces.

- Instrucciones Especiales

Instrucciones que controlan funciones específicas del microprocesador o que actúan sobre registros especiales no direccionados como memoria interna normal. La instrucción que sigue es la típica NO OPERATION.

NOP ;no hace nada, consume tiempo

Esta instrucción solo sirve para introducir una demora en el programa, equivalente al tiempo de ejecución de una instrucción. No afecta ningún bit de la palabra de estado.

La instrucción que sigue borra el contador del watch dog timer.

Este registro tampoco esta accesible como memoria, y esta es la única instrucción que lo modifica.

CLRWDT ;borra el watch dog timer, WDT = 0

Esta instrucción, además, coloca en uno los bits PD (power down) y TO (time-out) de la palabra de estado. La siguiente es una instrucción especial de control del microcontrolador que lo pone en el modo power down. En este modo el microprocesador se detiene, el oscilador se apaga, los registros y puertos conservan su estado, y el consumo se reduce al mínimo. La única forma de salir de este estado es por medio de un reset o por time-out del watch dog timer.

SLEEP ;coloca el µC en modo sleep, WDT = 0

Esta instrucción, además, borra el bit PD (power down) y setea el bit TO (time-out) de la palabra de estado.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 9

Page 10: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 10

INSTRUCCIONES DEL PIC 16FXXX

Page 11: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

ENCENDER UN LED A TRAVES DEL PUERTOB DEL PICPuertos de Entrada y SalidaLa principal utilidad de las patitas que contiene un microcontrolador es soportar las líneas de E/S que comunican al computador interno con los periféricos exteriores.Según los controladores de periféricos de los microcontroladores, las líneas de E/S se destinan a proporcionar el soporte a las señales de entrada, salida y control.

Reloj principalEl oscilador genera una onda cuadrada de alta frecuencia, que configura los impulsos de reloj usados en la sincronización de las operaciones del sistema.

Generalmente, el circuito de reloj está incorporado en el microcontrolador y sólo se necesitan unos pocos componentes exteriores para seleccionar y estabilizar la frecuencia de trabajo. Dichos componentes suelen consistir en un cristal de cuarzo junto a elementos pasivos o bien un resonador cerámico o una red R-C.

Aumentar la frecuencia de reloj supone disminuir el tiempo en que se ejecutan las instrucciones pero lleva aparejado un incremento del consumo de energía

Para las personas que no están de todo familiarizados con el tema es bueno recordar que es el led. LED según sus siglas en ingles (Light Emitting Diode) se traduce como diodo emisor de luz, que es un dispositivo semiconductor (vea el dibujo de abajo) de dos terminales nominados como cátodo (terminal negativa) y ánodo (terminal positiva).

Si polarizamos nuestro led directamente este va a producir un haz de luz y con la polarización inversa va a permanecer apagado. A veces el funcionamiento de los diodos es comparado con los switches que se prenden y se apagan.

Polarización directa Polarización inversa

Una vez familiarizados con el hardware podemos proseguir con el software.Antes de ponerse a escribir el programa es aconsejable analizar primero los registros que se van a emplear en el dicho programa.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 11

Ánodo+

Cátodo

Ánodo--

+Cátodo

luz

PRACTICA 1

Page 12: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Registro STATUS

Nosotros respetaremos la nomenclatura inglesa, pero escribiremos las variables que nos interesan. El motivo es muy simple: en ese PIC16F628 no se ha considerado el problema de los bancos de memoria, que se deben intercambiar a través del registro de estado.

De este modo para nosotros PORTB representará al puerto B, TRISB será el mismo y W será el registro de trabajo.

El programa, por lo demás, es bastante evidente. Necesitamos sólo introducir el sentido de los TRIS. Este registro está asociado a los distintos puertos y en él cada bit representa un pin del puerto al que se refiera. Un 0 en uno de sus bits representará que el pin es de salida, y un 1 que es de entrada. De este modo cada pin será independiente, dándonos mayor flexibilidad para la implementación física de los diseños. Es posible incluso, aunque no habitual, cambiar la dirección del pin durante la ejecución del programa. Esta opción puede llegar a darnos la posibilidad de manejar varios dispositivos con un solo puerto.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 12

Page 13: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

SET DE INSTRUCCIONES UTILIZADAS EN LA PROGRAMACION

1. BCF f, b : Con esta instrucción se pone en 0 el bit b del registro fEjemplo: Si se tiene en el puerto A ( PORTA ) = 1010 y se quiere colocar en cero el tercer bit, la instrucción es la siguiente: BCF PORTA , 3.

2. BSF f, b : Con esta instrucción se pone en 1 el bit b del registro fEjemplo: Si se tiene en el puerto A ( PORTA ) = 1010 y se quiere colocar en UNO el tercer bit, la instrucción es la siguiente: BSF PORTA , 3.

3. GOTO K : realiza un salto incondicional a la dirección llamada k del programa Ejemplo: GOTO CONFIG quiere decir salte a la parte de configuración del programa.

4.CLRF F : Borra el contenido del registro, cuyo valor quedaría en 00000000

DESCRIPCIÓN DE NUESTRA PRACTICA

ENCENDER UN LEDComo inicio antes de empezar el programa en si, se deberá configurar el PIC, de forma que funciones a nuestras necesidades, esto quiere decir que debemos decirle como vamos a usar sus puertos, si van a ser de entrada o de salida, en nuestro caso solo requerimos de un solo puerto (puerto b7), y conectado a él, el respectivo led a encender con su resistencia para evitar un flujo de corriente muy grande, tal que pueda dañar nuestro pic.

Después de la configuración inicial, y haber pasado por los respectivos bancos como se ilustrará en el programa, aseguraremos de que el puertob este en ceros y para ello borraremos el contenido con la instrucción de borra registro (CLRF), en este caso dirigido al registro PORTB, que es el puerto b que

vamos a manipular. Luego sencillamente daremos la orden de encender el led, y esto se logra con enviar un uno o positivo por el puertob,7, y con ello se encenderá el led.

Se explica en cuadro los registros TRISB,PORTB Y el bit RP0 del registro STATUS

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 13

Page 14: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA ESQUEMATICO DEL CIRCUITO.

DIAGRAMA DE FLUJO DEL PROGRAMA DE ENCENDER EL LED

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 14

INICIO

BANCO1

TRIS,7 => 0

BANCO0

Borrar puertoB

Portb,7=> 1

Page 15: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

PROGRAMA PARA ENCENDER UN LED CON EL PIC 16F628

LIST P=16F628INCLUDE <P16F628.INC>

ORG 00GOTO INIORG 05

INI BSF STATUS,RP0 ;IREMOS AL BANCO1BCF TRISB,7 ;EL PUERTO RB7 ESTARA COMO SALIDABCF STATUS,RP0 ;DEVUELTA AL BANCO0CLRF PORTB ;PARA BORRAR EL PUERTO Y QUEDE EN CEROSBSF PORTB,7 ;ENVIA UN 1(5V) A RB7 PARA ENCENDER LEDGOTO $ ;EL CONTADOR DEL PROGRAMA SE QUEDARÁ AQUIEND

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 15

Page 16: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

El ENCENDIDO DE UN LED EN FORMA INTERMITENTE

Acordémonos que el objetivo esta vez no es solamente prender el led sino también apagarlo y volver a prender en una forma periódica o cíclica La pregunta es: ¿Cómo se logra la semejante operación?

La respuesta a esa pregunta es SUBRUTINA. La pregunta de inmediata que surge es: ¿y que es una subrutina? Una subrutina es una parte del programa principal que se dedica a una tarea especifica.

Ejemplos de subrutinas:- una subrutina que periódicamente me observa el estado lógico de un puerto- una subrutina que se encargue de realizar cálculos de determinadas variables

en fin es la libertad del programador de asignar una determinada tarea a la subrutina.

El uso de subrutinas, siendo sencillo y no requiriendo un apartado específico, es esencial, puesto que simplifica los programas, haciéndolos, además, más modulares. Llamaremos a una subrutina con la instrucción CALL, seguida de la etiqueta que la encabeza o su dirección en memoria. Para regresar a la siguiente instrucción tras el CALL bastará con situar, en la última línea de la subrutina, el comando RETURN; también será posible emplear RETLW k, el cuál se diferencia del anterior por situar en el registro W el valor k.

En el caso de nuestra practica vamos a desarrollar una subrutina que se conoce con el nombre de retardo. El retardo o subrutina se encarga de que el programa principal en un determinado momento se queda parada por un tiempo que nosotros queremos que se detenga.

Para ser mas concreto, al prender el led necesitamos que se quede prendido por un tiempo, después tenemos que apagarlo y mantenerlo apagado por otro rato y volver a hacer todo el procedimiento de nuevo.

Ahora, como se arma una subrutina en el lenguaje de programación que nosotros estamos usando o sea MPLAB? La forma mas clásica de armar una subrutina es usando las instrucciones CALL y RETURN.

Donde la instrucción CALL es usado por el programa principal para llamar la subrutina , donde esa a su vez realiza su tarea asignada ( en nuestro caso es un retardo en el tiempo) y retorna al programa principal de donde la llamaron usando la instrucción RETURN.

Ya sabiendo como se arma una subrutina necesitamos saber como se hace el dicho retardo del tiempo que es la tarea de la subrutina, para eso observamos la siguiente subrutina:

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 16

PRACTICA 2

Page 17: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

RETARDO MOVLW .255 ;Se carga un registro CONTADORMOVWF CONTADOR ;con un valor máximo decimal de 255

OTRAVEZ DECFSZ CONTADOR ;Se decrementa el dicho registro en uno GOTO OTRAVEZ ;Si CONTADOR no es cero se decrementa

;otra vezRETURN ;Al llegar a cero la subrutina RETARDO

;retorna al programa principal

Usando un diagrama de flujos la rutina anterior se puede representar de la siguiente forma.

Del ejemplo anterior lo que vemos es que la subrutina RETARDO se toma 255 veces haciendo la misma instrucción DECFSZ antes de retornar al programa principal.

Sí nos acordamos que estamos trabajando con un cristal de 4 MHz, donde esa frecuencia es dividida internamente por el C por cuatro, 4MHz/4 = 1MHz, eso quiere decir que el micro se demora 1 microsegundo para realizar una instrucción

T = 1/f = 1/1MHz = 1seg.

Por lo tanto la subrutina RETARDO lo que hace es hacer un retardo aproximadamente de 255 microsegundos. Desafortunadamente en la vida real un retardo de 255 microsegundos es demasiado rápido para el ojo humano y no es percibido.

Para solucionar este problema se recurre a una técnica llamada anidamiento, lo que hace es en si es manipular varias variables, y decrementarlas de forma que cuando termine una continúe con la otra, mejor que cuando una variable termine, decremente la otra en una unidad, y vuelva y se cargue de nuevo con un valor, lo que quiere decir que sus cantidades se multiplicarían.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 17

CONTADOR ←255

CONTADOR - 1

¿CONTADOR = 0 ?

RETORNAR

SI

NO

Page 18: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Veamos un ejemplo:

Cuando reg3 se va decrementando, ,lo sigue haciendo hasta que su valor establecido llegue a cero, y cuando esto pasa, decrementa a la siguiente variable (reg2), una unidad, y de nuevo se carga reg3 con el valor establecido, lo que quire decir que este anidamiento consumira aproximadamente 90.000 ciclos de instrucion aproximadamente, o quizas mucho mas si es implementado en un pic, pues las instrucciones aplicadas para estos decrementos según el caso en un pic, suelen consumir 2 ciclos de instruccion, por lo que quiere decir que si tenemos en cuenta estos retornos (el volver a un punto del anidamiento), podrian consumir con estos valores no 90.000 sino hasta casi 270.000 ciclos de instruccion aproximadamente, aunque los anidamientos se pueden hacer de muchas formas según el programador, por lo que no existe un solo metodo, sino muchos y cada cual se acomoda a varias

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 18

retardo

reg1=100

reg2=30

reg3=30

reg3 - 1=reg3

reg3=0

reg2 - 1=reg2

reg2=0

reg1 - 1=reg1

reg1=0

retorne

Page 19: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

necesidades, pero en nuestra practica se implementará una de las mas sencillas formas, e incluso de las mas usadas.

El anidamiento tiene como funcion mas comun la de crear retardos en el programa, esto es porque algunas actividades que hace el pic son muy rapidas, y para que los humanos las podamos percibir, debemos dilatar el tiempo para percibir lo que pasa.

Precisamente , el percibir o retener tiempo,será la aplicación en nuestra practica, pues el objetivo es el de encender y apagar el led, y entre el encendido y apagado, debemos dejar que dure un tiempo encendido y un tiempo apagado.

SET DE INSTRUCCIONES NUEVAS UTILIZADAS EN LA PROGRAMACION

DECFSZ f,d: decrementa el registro f en uno y salta si el resultado es cero, el valor lo almacena en el registro w o en el registro f.

Ejemplo: Se carga la variable numero con 5 y se desea decrementar la variable numero en 1 hasta que el resultado sea cero , si es así salte a la dirección f in , si no continué decrementando hasta que sea cero

MOVLW D`05MOVWF NUMERO

SIGUE DECFSZ NUMERO,1GOTO SIGUEGOTO FIN

DESCRIPCION DEL CIRCUITO

Como se había dicho anteriormente, el objetivo era el de encender un led de forma intermitente, para que se observara este efecto, de debe recurrir a los retardos por anidamiento.

Iniciamos primero configurando el pic, en el caso para que el pin RB7 nos funcione como salida.Después para asegurar de que empiece apagado, borraremos el puerto con la instrucción CLRF PORTB, luego si damos la orden que se encienda el led, y para que podamos ver si se enciende y se apaga, daremos un retardo de encendido, que durara mas o menos un segundo, si se usa un cristal de 4MHz, luego de que termine el retardo, apagaremos el led, y de nuevo llamaremos el retardo, y se repetirá este ciclo indefinidamente, por lo que no tiene final, a menos que quitemos la alimentación.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 19

Page 20: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA DE FLUJO PARA EL LED INTERMITENTE

DIAGRAMA ESQUEMATICO DEL CIRCUITO

PROGRAMA PARA EL LED INTERMITENTE CON EL PIC 16F628

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 20

CONFIGURACIÓNDEL PUERTO

ENCENDER LED

LLAMAR RETARDO

LLAMAR RETARDO

APAGAR EL LED

INICIO

LIMPIAR PORTB

Page 21: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

LIST P=16F628INCLUDE <P16F628.INC>

CONT1 EQU 20 ;REGISTROS PARA EL ANIDAMIENTOCONT2 EQU 21CONT3 EQU 22

ORG 00GOTO INICIOORG 05

INICIO BSF STATUS,RP0 ;SELECCIONA BANCO1BCF TRISB,7 ;PUERTO RB7 COMO SALIDABCF STATUS,RP0 ;AL BANCO0CLRF PORTB ;BORRAR EL PUERTOB

START BSF PORTB,7 ;LED ENCENDIDOCALL RETARDO ;TIEMPO PARA QUE EL LED DURE ENCENDIDOBCF PORTB,7 ;APAGAR EL LEDCALL RETARDO ;TIEMPO QUE DURA APAGADOGOTO START ;VUELVE A START PARA QUE REPITA EL CICLO

;***********************************RETARDO

MOVLW .6MOVWF CONT3MOVLW .250MOVWF CONT2MOVLW .250MOVWF CONT1

DECFSZ CONT1,F ;DECREMENTE LA VARIABLE CONT1-1 SALTA ;CUANDO LLEGA A 0

GOTO $-1 ;$-1 SIGNIFICA QUE RETROCEDA UNA LINEA ;ANTES

MOVLW .250MOVWF CONT1 ;SE RECARGA NUEVAMENTE EL REGISTRO POR EL

;ANIDAMINETODECFSZ CONT2,F ;DECREMENTE LA VARIABLE CONT2-1 SALTA

;CUANDO LLEGA A CEROGOTO $-5 ;$-5 RETROCEDE 5 LINEAS EN EL PROGRAMAMOVLW .250MOVWF CONT2 ;SE RECARGA CONT2 POR EL ANIDAMIENTODECFSZ CONT3,FGOTO $-9 ;RETROCEDE 9 LINEAS EN EL PROGRAMARETURN ;CUANDO CONT3 SEA CERO RETORNA DE DONDE

;se LLAMÓEND

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 21

Page 22: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

El ENCENDIDO DE UN LED CON UN PULSADORAhora, el encendido y apagado de un led, ya no va a ser controlado independientemente por el microcontrolador, sino que ahora esa orden de encendido o apagado se le asignara a un interruptor normalmente abierto que se conecta al puerto B, mas exactamente en el pin RB0 que se va a comportar como un puerto de entrada y en el pin RB7 del puerto B se va a conectar el led. La idea de este circuito es el manejo del estado del led a través de el interruptor. Al oprimir el interruptor el led tiene que apagarse sí estaba prendido ó prenderse sí estaba apagado.

Para que se cumpla este requisito es bueno antes que todo analizar de cómo vamos a saber cuando el interruptor ó pulsador esta oprimido ó suelto.

Sí analizamos con mas detalle el circuito del pulsador nos vamos a dar cuneta de que cuando el pulsador esta abierto vamos a tener un voltaje de 5 voltios el pin RB0 (un 1 lógico) y cundo el pulsador esta cerrado proporciona un voltaje de 0 voltios (un 0 lógico) en el mismo pin.

Entonces sí nos encargamos de monitorear el pin RB0 podemos realizar el objetivo de esta practica. Para efectuar el dicho monitoreo vamos a usar la instrucción BTFSC que se va encargar de informarnos cuando el pin RB0 esta con cero voltios o sea el pulsador oprimido.

Al saber eso lo que vamos a hacer es completar digitalmente ó en binario el estado lógico del puerto RB7.

El arreglo del pin RB0

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 22

5V

RB0

1 . BTFSC : Si el bit b del registro f es 0, se salta una instrucción y se continúa con la ejecución. En caso de salto, ocupará dos ciclos de reloj.

Ejemplo: REVISAR BTFSC PORTB,3 GOTO REVISAR

BTFSC PORTB,7GOTO LEDOFFGOTO LEDON

PRACTICA 3

Page 23: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

EL RETARDO DE ANTIREBOTE

Cuando un pulsador como el del ejemplo, no se encuentra pulsado(1), normalmente tendrá un nivel lógico estable (en el caso será de 5V), pero imaginando que pudiéramos percibir el tiempo en milisegundos, apenas pulsamos este suiche(2), no va a generar un 0V estable, mas bien una especie de onda, la cual no posee un nivel lógico estable, por lo que si no pusiéramos este retardo.

El PIC interpretaría esta onda como varias pulsaciones continuas, situación que en nuestra realidad es falsa, pues solo pulsamos el suiche una vez, por ello el PIC solo leerá el primer estado bajo que sensa (2A) Al cabo de algunos milisegundos (abarca un rango de 10mS hasta 300mS).

Este rebote se estabiliza y el nivel lógico ya se estabiliza a 0V(3). Entonces este retardo se encarga de ocupar al PIC este tiempo, para que no lea estas falsas lecturas, y vuelve a leer en este caso RB0 y ya tendrá un nivel lógico estable

EL DIAGRAMA DE FLUJO PRACTICA N° 3

NUESTRO CIRCUITO DE PRACTICAEsta vez el encendido y apagado corre por control del pulsador S1, el cual a través del puerto RB0 que funcionara como entrada, el PIC leerá su estado, y cuando sense un 0 (0v), ordenara al PIC que encienda el led y si estaba encendido, que lo apague.

En el diagrama de flujo se observa que después de que el pulsador envía un cero por primera vez, lo interpreta como pulso, luego se aplica el mencionado retardo de antirrebote, que en si no es mas que un retardo común por anidamiento, después de terminado el retardo de antirebote, procede a leer el estado del led por medio del pin RB7: si estaba encendido que lo apague y lo contrario, si estaba apagado, que lo encienda.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 23

5V

0V t (mS)

(1) (2A) (2) (3)

Situación ideal de lectura Para el PIC

Page 24: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA DE FLUJO

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 24

RETARDO ANTIREBOTE

CONT1 => .200 CONT2 => .80 CONT3 => .2

CONT1= CONT1-1

CONT1

= 0?

CONT1=.200

CONT2 = CONT2-1

CONT2

= 0 ?

CONT2 =.80

CONT3 = CONT3-1

CONT3

= 0 ?

RETURN

INICIO

CONFIGURA PUERTOS

RB0 = 0 ?

ANTIREBOTE

RB7 = 0 ?

PRENDER APAGAR

Page 25: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA ESQUEMATICO DEL CIRCUITO

PROGRAMA PARA ENCENDER Y APAGAR UN LED MEDIANTE UN PULSADOR

LIST P=16F628INCLUDE <P16F628.INC>

CONT1 EQU 20 ;REGISTROS PARA EL ANIDAMIENTOCONT2 EQU 21CONT3 EQU 22

ORG 00GOTO INICIOORG 05

INICIO BSF STATUS,RP0 ;SELECCIONA BANCO1MOVLW B'01111111'MOVWF TRISB ;RB7 COMO SALIDA Y COMO ENTRADAS (RB6 A RB0)BCF STATUS,RP0 ;AL BANCO0CLRF PORTB ;BORRAR EL PUERTOB

START BTFSC PORTB,0 ;PREGUNTA POR EL ESTADO DEL PULSADOR EN RB0GOTO START ;SI ES IGUAL A 1, VUELVA Y PREGUNTE HASTA

; QUE SEA CEROCALL REANTIR ;LLAMA UN RETARDO DE ANTIREBOTE PAR EL

; PULSADORBTFSC PORTB,7 ;PREGUNTA EN QUE ESTADO ESTA EL LED SI

;PRENDIDO O APAGADOGOTO OFF ;SI VA A OFF ES PORQUE EL LED ESTABA

. ;ENCENDIDO Y LO VA APAGARON BSF PORTB,7 ;LED ENCENDIDO

GOTO START ;VUELVE Y PREGUNTA ESTADO DEL PULSADOROFF BCF PORTB,7 ;APAGAR EL LED

GOTO START ;VUELVE Y PREGUNTA ESTADO DEL PULSADOR

;***********************************

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 25

Page 26: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

REANTIRMOVLW .3MOVWF CONT3MOVLW .180MOVWF CONT2MOVLW .200MOVWF CONT1

DECFSZ CONT1,F ;DECREMENTE CONT1-1 SALTA CUANDO LLEGA A 0GOTO $-1 ;$-1 SIGNIFICA QUE RETROCEDA UNA LINEA ANTESMOVLW .200MOVWF CONT1 ;SE RECARGA CONT1 POR EL ANIDAMIENTODECFSZ CONT2,F ;DECREMENTE CONT2-1 SALTA CUANDO LLEGA A . .

;CEROGOTO $-5 ;$-5 RETROCEDE 5 LINEAS EN EL PROGRAMAMOVLW .180MOVWF CONT2 ;SE RECARGA CONT2 POR EL ANIDAMIENTODECFSZ CONT3,FGOTO $-9 ;RETROCEDE 9 LINEAS EN EL PROGRAMARETURN ;CUANDO CONT3 SEA CERO RETORNA DE DONDE SE

;LLAMÓEND

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 26

Page 27: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

ENCENDIDO DE LEDS MEDIANTE LA LECTURA DE UN DIPSUICHE

El objetivo es esta vez es la se según la posición del dipsuiche, encenderá o apagara dos leds, uno para cada uno respectivamente. Esto se hace con el fin de según un dato especifico seleccionado en los dos dipsuiches, el PIC efectúe 4 acciones diferentes, sea un led encendido(RB0), y el otro apagado(RB1), situación contraria, RB0 apagado y RB1 encendido, ambos encendidos o ambos apagados.

Para estas situaciones, a pesar que el dipsuiche es un interruptor, no necesitamos retardo de antirrebote, debido a que su estado será absoluto, osea, una posición es solo encendido y la otra solo apagado.

ASPECTO FISICO DE ALGUNOS DIPSUICHES

Estos dipsuiches poseen internamente 8, 5 3 o varias cantidades de interruptores pequeños en un solo paquete lineal, a eso es su prefijo DIP (dual in line package), su ventaja es el poco espacio que usan en un circuito, y que relativamente son económicos, teniendo en cuenta la cantidad y espacio que ocupan.

NUESTRO CIRCUITO DE PRACTICA

El objetivo será el de que según estado de los dipsuiches, nos encenderá unos leds, un led por cada dipsuiche, en la practica se implementan dos dipsuiches, conectados por RB7 y RB6 y los leds de respuesta estarán conectados respectivamente por RB0 y RB1

El PIC funcionara de forma que siempre estará chequeando los estados de las entradas correspondientes a la conexión con los dipsuiches, y apenas detecta un cambio, entonces efectuará el encendido o apagado, estas operaciones se hacen tan rápido que para nuestros ojos parece inmediato.

Veamos el diagrama de flujo para entender mejor el como corre el programa

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 27

PRACTICA 4

Page 28: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA DE FLUJO DEL CIRCUITO

DIAGRAMA ESQUEMATICO DEL CIRCUITO

PROGRAMA PARA LA PRACTICA CON EL DIPSUICHE

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 28

INICIO

Configuración de . puertos Borra PORTB

RB7=0? 0 => RB0 RB6=0

? 0 => RB1

1 => RB1 1 => RB0

RB6=0?

0 => RB1

0 => RB1

SI SI

NO NO

NO

SI

Page 29: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

LIST P=16F628INCLUDE <P16F628.INC>ORG 00GOTO INICIOORG 05

INICIO BSF STATUS,RP0 ;SELECCIONA BANCO1MOVLW B'11111100'MOVWF TRISB ;RB7 Y RB6 ENTRADAS POR DIPSUICHE Y RB0 Y

;RB1 SALIDAS HACIALOS LEDSBCF STATUS,RP0 ;AL BANCO0CLRF PORTB ;BORRAR EL PUERTOB

START BTFSC PORTB,7 ;PREGUNTA POR EL ESTADO DEL DIPSUICHE EN . . ;RB7

GOTO RB0ONBCF PORTB,0 ;APAGA EL LED DE RB0 DEL DIP DE RB7BTFSC PORTB,6 ;PREGUNTA POR EL ESTADO DEL DIPSUICHE EN .

;RB6GOTO RB1ONBCF PORTB,1 ;APAGA EL LED DE RB0 DEL DIP DE RB6GOTO START

;*****************************RB0ON BSF PORTB,0

BTFSC PORTB,6 ;PREGUNTA POR EL ESTADO DEL DIPSUICHE EN .;RB6

GOTO RB1ONBCF PORTB,1 ;APAGA EL LED DE RB0 DEL DIP DE RB6GOTO START ;VUELVE A LEER ESTADO DE LOS DIPSUICHE

;*****************************RB1ON BSF PORTB,1

GOTO STARTEND

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 29

Page 30: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

MANEJO DE UNA TABLA DE DATOS PARA MANEJAR UN DISPLAY DE CATODO COMUN

El uso de las tablas en los programas con los PIC es muy usado, pues su principal función es la de un dato convertirlo en otro, parta hacer equivalencias o que un numero especial nos lo represente con otros valores, que este va a ser nuestro caso, pues si conectamos un display, que son 7 leds en un paquete, el cual tiene como función la de representar con iluminación los diferentes números decimales (0 al 9), y algunas letras que se pueden formar con este display.

Los displays existen de dos tipos, de cátodo común y de ánodo común, su diferencia radica en que los cátodos están todos unidos y en el otro son los ánodos respectivamente.

Ejemplos de conexión de LEDS (cátodo común y ánodo común)

Ahora teniendo en cuenta que los display son leds, entonces, si encendemos los leds adecuados, entonces formaremos un numero según el encendido, por lo que debemos conectar cada segmento a un puerto del pic, para poder coordinar según el encendido que numero deseamos visualizar

MANEJO O FUNCION DE UNA TABLA DE DATOS

Empezamos por mencionar que en los registros de 8 bits, el valor numérico de 5 por ejemplo seria en binario B’00000101’ y en hexadecimal 0X05, si conectáramos los 7 segmentos al puerto B, iniciando el segmento A del display con el pin RB1 y así hasta llegar a segmento G con el pin RB7

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 30

PRACTICA 5

ANODO DISPLAY CATODO

Page 31: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

TABLA DE DATOS DE UN DISPLAY C.C

PIC RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0DATO g f e d c b a

0 0 1 1 1 1 1 1 01 0 0 0 1 1 0 0 02 1 0 1 1 0 1 1 03 1 0 0 1 1 1 1 04 1 1 0 0 1 1 0 05 1 1 0 1 1 0 1 06 1 1 1 1 1 0 1 07 0 0 0 0 1 1 1 08 1 1 1 1 1 1 1 09 1 1 0 1 1 1 1 0

CONECCION ENTRE EL PIC Y EL DISPLAY

Para hacer esta conversión se implementan en este caso una tabla, pues en ella se establece el factor de conversión, el cual es fácil de manipular, eso si teniendo mucho cuidado al hacer estas supuestas conversiones, ahora veamos como funciona.

Ahora mencionare una instrucción que se encarga de retornar de una subrutina, y se llama RETLW, esta es muy semejante en su función al RETURN, solo que además se devuelve cargando al registro w con el valor que se le especificó, veamos un ejemplo:

RETLW B’00000001’

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 31

CATODO COMUN

Page 32: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Cuando el programa se encuentra con esta instrucción, la orden es que retorne del ultimo llamado de una subrutina (cuando se usa un CALL), cargando a W con el valor indicado en este caso, después de la orden, w tiene almacenado el valor de B’00000001’

Vamos a utilizar otra nueva instrucción, llamada ADDWF, que en si es encargada de sumar el valor contenido en el registro W mas el registro que se le indique, y el resultado puede destinarse al mismo W o al registro con el que se efectuó la suma.

Hagamos un ejemplo:

Digamos que en el registro REG1, esta almacenado un valor de 5 en decimal, y luego cargamos a W con un valor cualquiera comprendido entre 0 y 255, digamos que cargamos a W con 3, y cuando ejecuta la instrucción ADDWF REG,F, significa que el contenido de W se sumara con el contenido del registro REG1 y que lo almacene en el mismo registro REG1, lo que quiere decir que después de la suma, el contenido de REG1 ya no es 5 sino 8.

MOVLW .5 ;SE CARGA A W PARA LUEGO AL REGISTRO REG1 MOVWF REG1 ; AHORA REG1 VALE 5 MOVLW .3 ;SE CARGÓ A W CON 3 ADDWF REG1,F ;SE SUMA EL CONTENIDO DE REG1 CON W Y SE

;GUARDA EN EL REGISTO REG1

Bien ahora que sabemos como esta funcionando esta instrucción, ahora se comentara de un registro especial que implementa el PIC y se llama contador del programa, el cual consta de 2 registros de 8 bits, pero en total solo se manipulan 13 bits y no 16 como puede llegar a pensarse, el cual se llaman la parte menor PCL y la parte mayor PCLATH o PCH, la parte menor de 8 bits y la parte mayor de 5 bits, un poco mejor ejemplificado en la siguiente figura:

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 32

12 8 0

PCLATH <4:0> 8

7 4 0

12 11 10 0

11

2

DESDE EL CODIGO OP

PCLATH

PCLATH

PCH

PC

PC

PCL

PCL

RESULTADO DE LA ALU

PCH

Page 33: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

El nuestro caso se manipulara mas que todo el registro PCL, ya que direcciona la parte menor de la memoria del programa, y es importante aclarar que estas tablas siempre deben ubicarse al comienzo de programa (ORG 05), pues después de que el PCL supera a 255, vuelve a cero, y nuestra tabla quedaría fraccionada en dos partes y lo mas seguro es que no va a funcionar como debería, aunque existen técnicas para compensar esta situación, que tienen que ver al manipular el PCH o PCLATH, en nuestro caso están fuera del tema a tratar, quizás porque no vamos a implementar una tabla tan grande que abarque 255 líneas del programa.

.Ahora que mencionamos el registro especial PCL y comentamos sobre la instrucción de sumar ADDWF, trataremos de decir cual es el truco de las tablas para que funcionen y podamos visualizar en el display el numero que deseamos.

Digamos que el contenido del registro al que llamamos CONTA, posee como valor de contenido el numero 0, y deseamos visualizar en el display el numero cero, quiere decir que el valor binario de cero (b’00000000), debo pasarlo a un valor que encienda los respectivos segmentos, teniendo en cuenta que el segmento A del display esta conectado al puerto RB1, el valor seria así (b’01111110’), recordemos que en el caso el bit 0 (RB0) no se uso debido a que no esta conectado con el display, y lo colocaremos como valor de cero y movemos este valor al puerto B.

Ahora veamos que hizo en sí el programa para esta conversión:

Imaginemos que tenemos a CONTA con un valor de 0,

MOVLW .0 MOVWF CONTA

Ahora vamos a llamar la subrutina anterior llamada tabla:

CALL TABLA

Entonces cuando llegamos a la subrutina llamada tabla tendrá este aspecto

TABLA ADDWF PCL,F RETLW B'01111110' ;ENCIENDE EN EL DISPLAY EL CERO RETLW B'00001100' ;ENCIENDE EL UNO RETLW B'10110110' ;ENCIENDE EL DOS

RETLW B'10011110' ;ENCIENDE EL TRES RETLW B'11001100' ;ENCIENDE EL CUATRO RETLW B'11011010' ;ENCIENDE EL CINCO RETLW B'11111010' ;ENCIENDE EL SEIS RETLW B'00001110' ;ENCIENDE EL SIETE RETLW B'11111110' ;ENCIENDE EL OCHO RETLW B'11011110' ;ENCIENDE EL NUEVE

Ahora la instrucción que se encuentra frente a la etiqueta de tabla es la de sumar el contenido de w al PCL o contador del programa, que puede ser cualquier valor, no mayor que 240, y le sumara cero, en consecuencia, ejecutará la siguiente línea de instrucción, debido a que la suma no afecto el contenido de PCL y se encontrara con esta instrucción:

RETLW B'01111110' ;ENCIENDE EN EL DISPLAY EL CERO

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 33

Page 34: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

¿Recuerdan que valor se necesitaba para iluminar en el display el cero? Si observan bien w se cargara con este valor, y retornara de esta subrutina y ahora que tenemos el valor para encender los led que corresponden al cero, se hará esto:

MOVLW .0 MOVWF CONTA CALL TABLA MOVWF PORTB

Y así enviando esto se encenderá el display con el símbolo de cero, pero ¿que pasa si vale por ejemplo 7?

Hagámoslo nuevamente

MOVLW .7 MOVWF CONTA CALL TABLA

Bien, ahora que tenemos el valor de siete y se suma con el PCL, este apuntara 7 líneas abajo, mas exactamente a:

RETLW B'00001110' ;ENCIENDE EL SIETE

Y por consecuencia de la instrucción, volverá del llamado, pero esta vez con la información para encender el display y que se visualice el numero 7

MOVWF PORTB

NUESTRO PRIMER CIRCUITO DE PRUEBA

Esta vez vamos a hacer un circuito que nos muestre los números del 0 al 9 como si fuera un contador ascendente, y cuando llegue a 9 , vuelva a cero.

Esta función se llevara a cabo mediante otra instrucción que será nueva esta vez pero no difícil de entender, pues su misión es la de sumar +1 un registro o mas bien incrementarlo en una unidad, y su resultado se podrá guardar sea en el mismo registro que incrementamos (lo mas común) o dejarlo en el registro W. Esta es la instrucción: INCF.

Veamos un ejemplo:

si deseamos empezar a contar desde cero y que vaya mostrando los números, vamos encargar el trabajo de que lleve este control un registro al que llamaremos por ejemplo CONTA, recordemos que empieza de cero, y después de la instrucción va a quedar en su contenido 1

CLRF CONTA ;DEJAMOS CONTA EN CERO INCF CONTA,F ;INCREMENTA EN UNO EL REGISTRO CONTA

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 34

Page 35: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Otra comando a implementar, tiene como función mover el contenido de un registro al registro W o al mismo (esta función de moverlo al mismo registro se hace para que con este “movimiento” afecte las banderas de cero (Z) carry o acarreo (C), y las otras banderas implementadas en el registro status.), y esta se llama MOVF, lo que quiere decir mover al registro, y seleccionamos el destino, ya comentado, quiere decir w o el mismo registro, pero hagamos otro ejemplo:

CLRF CONTA ;CONTA =0 INCF CONTA,F ;CONTA +1 Y LO GUARDA EL RESULTADO EN CONTA MOVF CONTA,W ;EL CONTENIDO DE CONTA SE COPIO EN W

Bien hasta ahora se ha explicado como trabaja, pero si deseamos mover el contenido, por ejemplo del registro CONTA a PORTB, se haría esto:

MOVF CONTA,W ;CONTENIDO DE CONTA A W MOVWF PORTB ;EL CONTENIDO DE W SE COPIO EN EL PORTB

Observamos que entró otra instrucción, llamada MOVWF, ella hace que el contenido actual de W, sea destinado a un registro cualquiera que permita escribirse o los registros que cada uno de nosotros asignemos en la memoria RAM.

Ahora con estos “movimientos“ de datos, veamos en que ayudan a nuestro contador:

INCF CONTA,F ;INCREMENTA A CONTA +1 Y LO GUARDA EN CONTA MOVF CONTA,W ;COPIA EL CONTENIDO DE CONTA EN W CALL TABLA ;NUESTRA TABLA DE DATOS MOVWF PORTB ;EL DATO CONVERTIDO EN LA TABLA ESTA EN W Y ES

;LLEVADO AL PUERTOB

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 35

Page 36: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA DE FLUJO DEL CONTADOR ASCENDENTE

NO

SI

DIAGRAMA ESQUEMATICO PARA AMBOS CIRCUITOS

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 36

INICIO

CONFIGURAC. DEL PIC

BORRAR PORTB

BORRAR CONTA

CONTA => W

TABLA

W => PORTB

CONTA =CONTA+1

CONTA= 10?

BORRAR CONTA

RETARDO

TABLA

PCL= PCL + W

RETORNE B’01111110’

RETORNE B’00000110’

RETORNE B’10110110’

RETORNE B’10011110’

RETORNE B’11001100’

RETORNE B’11011010’

RETORNE B’00001110’

RETORNE B’11111010’

RETORNE B’11111110’

RETORNE B’11011110’

CATODO COMUN

Page 37: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

PROGRAMA EN MPLAB PARA EL CONTADOR ASCENDENTE

LIST P=16F628INCLUDE <P16F628.INC>

CONTA EQU 20CONT1 EQU 21CONT2 EQU 22CONT3 EQU 23

ORG 00GOTO INICIOORG 05

TABLA ADDWF PCL,FRETLW B'01111110' ;ENCIENDE EN EL DISPLAY EL CERORETLW B'00001100' ;ENCIENDE EL UNORETLW B'10110110' ;ENCIENDE EL DOSRETLW B'10011110' ;ENCIENDE EL TRESRETLW B'11001100' ;ENCIENDE EL CUATRORETLW B'11011010' ;ENCIENDE EL CINCORETLW B'11111010' ;ENCIENDE EL SEISRETLW B'00001110' ;ENCIENDE EL SIETERETLW B'11111110' ;ENCIENDE EL OCHORETLW B'11011110' ;ENCIENDE EL NUEVE

INICIO BSF STATUS,RP0 ;SELECCIONA BANCO1MOVLW B'00000001'MOVWF TRISB ;DE RB7 A RB1 SALIDAS Y RB0 ENTRADABCF STATUS,RP0 ;AL BANCO0CLRF PORTB ;BORRAR EL PUERTOBCLRF CONTA ;BORRAMOS EL REGISTRRO DEL CONTEO

START CALL RETARDOMOVF CONTA,W ;ENVIAMOS EL CONTENIDO A WCALL TABLA ;LLAMA LA TABLA PARA TRAER LOS DATOS PARA

;ENCENDER LOS LED DEL DISPLAY MOVWF PORTB ;LO DE LA TABLA VA AL PUERTO DONDE ESTA

;EL DISPLAY DE CATODO COMUNINCF CONTA,F ;SUMAMOS 1 A CONTAMOVLW .10SUBWF CONTA,W ;MIRAMOS SI CONTA ES IGUAL A 10, SI LO ES

;LA RESTA SERA IGUAL A CERO Y AFECTARA EL ;FLAG Z

BTFSS STATUS,Z ;PREGUNTAMOS SI LA OPERACION DIO CEROGOTO START ;SI NO VUELVA A STARTCLRF CONTAGOTO START

;*********************************************************************RETARDO

MOVLW .6MOVWF CONT3MOVLW .250MOVWF CONT2MOVLW .250MOVWF CONT1

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 37

Page 38: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DECFSZ CONT1,F ;DECREMENTE LA VARIABLE CONT1-1 SALTA ;CUANDO LLEGA A 0

GOTO $-1 ;$-1 SIGNIFICA QUE RETROCEDA UNA LINEA ;ANTES

MOVLW .250MOVWF CONT1 ;SE RECARGA NUEVAMENTE EL REGISTRO POR

; El ANIDAMINETODECFSZ CONT2,F ;DECREMENTE LA VARIABLE CONT2-1 SALTA

;CUANDO LLEGA A CEROGOTO $-5 ;$-5 RETROCEDE 5 LINEAS EN EL PROGRAMAMOVLW .250MOVWF CONT2 ;SE RECARGA CONT2 POR EL ANIDAMIENTODECFSZ CONT3,FGOTO $-9 ;RETROCEDE 9 LINEAS EN EL PROGRAMARETURN ;CUANDO CONT3 SEA CERO RETORNA DE DONDE

; SE LLAMÓEND

CONTADOR ASCENDENTE Y DESCENDENTE

A complemento del anterior circuito, vamos a añadir que haga la siguiente función: contara de cero a nueve y cuando llegue a 9 descienda a cero y vuelva y se repita el ciclo.

Hasta ahora estábamos observando solo incrementos de +1 (INCF), y su compañera que efectúa salto cuando el conteo se desborda a cero (INCFSZ), ahora vamos a usar sus antónimas, esto es que resta 1 (DECF) y su compañera que resta 1 y salta cuando llega a cero (DECFSZ).

Es de aclara que cuando me refiero a “salta” es que salta una línea del programa si las condiciones que exige este comando se dan. No se confundan, es mas fácil de lo que creen, y ahora se va a ejemplificar:

Primero volvamos a llamar a nuestro registro CONTA, solo que esta vez imaginaremos que tiene en su contenido el valor de nueve, y lo vamos a restar, solo que esta vez, se supervisara cuando este conteo llega a cero

OTRAVDECFSZ CONTA,F ;RESTE -1 DE CONTA Y GUARDA EN CONTAGOTO OTRAV ;SI LA RESTA NO DIO 0,DIRIJASE A LA ETIQUETA

;OTRAVGOTO FIN ;SI SE DIO EL SALTO ES POR QUE CONTA LLEGO A

;CERO Y POR LO TANTO SE DIRIGIRA A LA . ; ; ETIQUETA FIN

END

Es de mencionar que tanto el anterior ejemplo como en este se dio un retardo entre conteo y conteo, esto con el fin de que se puedan visualizar los retardos y ver los números , ya que si no se hace esto, los números no se verían de lo rápido que iría el conteo

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 38

Page 39: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA DE FLUJO

NO

SI

NO SI

PROGRAMA EN MPLAB PARA EL CONTADOR ASCENDENTE Y DESCENDENTE

LIST P=16F628INCLUDE <P16F628.INC>

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 39

INICIO

CONFIGURAC PIC

BORRAR PORTB

BORRAR CONTA

CONTA => W

TABLA

W => PORTB

CONTA=CONTA+1

CONTA= 10? RETARDO

W = .9

W => CONTA

CONTA => W

TABLA

W => PORTB CONTA=CONTA-1

CONTA= 10?

Page 40: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

CONTA EQU 20CONT1 EQU 21CONT2 EQU 22CONT3 EQU 23

ORG 00GOTO INICIOORG 05

TABLA ADDWF PCL,FRETLW B'01111110' ;ENCIENDE EN EL DISPLAY EL CERORETLW B'00001100' ;ENCIENDE EL UNORETLW B'10110110' ;ENCIENDE EL DOSRETLW B'10011110' ;ENCIENDE EL TRESRETLW B'11001100' ;ENCIENDE EL CUATRORETLW B'11011010' ;ENCIENDE EL CINCORETLW B'11111010' ;ENCIENDE EL SEISRETLW B'00001110' ;ENCIENDE EL SIETERETLW B'11111110' ;ENCIENDE EL OCHORETLW B'11011110' ;ENCIENDE EL NUEVE

INICIO BSF STATUS,RP0 ;SELECCIONA BANCO1MOVLW B'00000001'MOVWF TRISB ;DE RB7 A RB1 SALIDAS Y RB0 ENTRADA

BCF STATUS,RP0 ;AL BANCO0CLRF PORTB ;BORRAR EL PUERTOBCLRF CONTA ;BORRAMOS EL REGISTRRO DEL CONTEO

ARRIBA CALL RETARDOMOVF CONTA,W ;ENVIAMOS EL CONTENIDO A WCALL TABLA ;LLAMA LA TABLA PARA TRAER LOS DATOS PARA

;ENCENDER LOS LED DEL DISPLAYMOVWF PORTB ;LO DE LA TABLA VA AL PUERTO DONDE ESTA EL

;DISPLAY DE CATODO COMUNINCF CONTA,F ;SUMAMOS 1 A CONTAMOVLW .10SUBWF CONTA,W ;MIRAMOS SI CONTA ES IGUAL A 10, SI LO ES LA

;RESTA SERA IGUAL A CERO Y AFECTARA EL FLAG ZBTFSS STATUS,Z ;PREGUNTAMOS SI LA OPERACION DIO CEROGOTO ARRIBA ;SI NO VUELVA A STARTMOVLW .9 ;SE CARGA CON NUEVE PARA DESCENSOMOVWF CONTA ;HACIA CONTA

ABAJO CALL RETARDO ;RETARDO PARA VER NUMERO A NUMEROMOVF CONTA,W ;MOVEMOS EL CONTENIDO DE CONTA A WCALL TABLA ;PARA LLAMAR LA TABLAMOVWF PORTB ;HACIA EL DISPLAYDECFSZ CONTA,F ;RESTA -1 A CONTA SI ES CERO SALTAGOTO ABAJOGOTO ARRIBA

;*********************************************************************

RETARDOMOVLW .6MOVWF CONT3

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 40

Page 41: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

MOVLW .250MOVWF CONT2MOVLW .250MOVWF CONT1DECFSZ CONT1,F ;DECREMENTE LA VARIABLE CONT1-1 SALTA CUANDO

;LLEGA A 0GOTO $-1 ;$-1 SIGNIFICA QUE RETROCEDA UNA LINEA ANTESMOVLW .250MOVWF CONT1 ;SE RECARGA NUEVAMENTE EL REGISTRO POR EL

;ANIDAMINETODECFSZ CONT2,F ;DECREMENTE LA VARIABLE CONT2-1 SALTA CUANDO

;LLEGA A CEROGOTO $-5 ;$-5 RETROCEDE 5 LINEAS EN EL PROGRAMAMOVLW .250MOVWF CONT2 ;SE RECARGA CONT2 POR EL ANIDAMIENTODECFSZ CONT3,FGOTO $-9 ;RETROCEDE 9 LINEAS EN EL PROGRAMARETURN ;CUANDO CONT3 SEA CERO RETORNA DE DONDE SE

;LLAMÓEND

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 41

PRACTICA 6 666

Page 42: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

MANEJO DE UN DISPLAY DE ANODO COMUN CON UN DECODIFICADOR TTL 7447

A diferencia del manejo de una tabla, si observamos cuando el valor de un registro cuando lo movemos a un puerto, este valor esta en binario. Cuando este valor binario esta comprendido entre 0 y 15 (0000 y 1111), existe un decodificador que se encarga de manejar y manipular cada led del display, esto es el dato binario es enviado al decodificador, y este reconoce el valor binario y enciende el numero que representa, por ejemplo si enviamos en binario 0010 (2 en decimal) al decodificador, entonces este sabe que es el numero 2 y encenderá en el display en numero dos con los segmentos de este display.

Es de mencionar que a diferencia del display de cátodo común, con el cual los leds se activaban cuando llegaba un uno o 5V; en el de ánodo común ocurre lo contrario, sus ánodos están conectados en común con 5V y sus cátodos se activaran con cero o 0V.

DECODIFICADOR   BCD  /  7 SEGMENTOS - CI  TTL 7447

Una de las maneras mas usadas para mostrar datos numéricos y alfanuméricos  en electrónica digital utilizando un 'display de 7-segmentos' constituido por un arreglo de los diodos emisores de luz (LEDs), un diodo para cada segmento.

El arreglo de leds puede ser conectado como cátodo-común o ánodo-común como se muestra en la figura de abajo.

En los display de tipo  cátodo-común, todos los cátodos de leds son conectados a 0V. Los segmentos individuales son aplicados a 5V por ánodo de cada led. Para los display

ánodo-común, todos los ánodos son ligados a Vcc en general de 5V. Cada segmento individual puede conectarse de 0V por cátodo de led  de segmento seleccionado.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 42

CATODO COMUN ANODO COMUN DISPLAY

Page 43: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Las cuatro entradas binarias del circuito integrado 74LS47 permiten 16 combinaciones diferentes de entrada.

Pines del decodificador 7447, se ilustra en letras mayúsculas A,B,C,D, con referencia a las entradas binarias y las letras minúsculas a la salida a los respectivos segmentos del display de ánodo común

DECIMAL P O R T A B.C.D HEXADECRA3 RA2 RA1 RA0 D C B A

0 0 0 0 0 0 0 0 0 01 0 0 0 1 0 0 0 1 12 0 0 1 0 0 0 1 0 23 0 0 1 1 0 0 1 1 34 0 1 0 0 0 1 0 0 45 0 1 0 1 0 1 0 1 56 0 1 1 0 0 1 1 0 67 0 1 1 1 0 1 1 1 78 1 0 0 0 1 0 0 0 89 1 0 0 1 1 0 0 1 910 1 0 1 0 A11 1 0 1 1 B12 1 1 0 0 C13 1 1 0 1 D14 1 1 1 0 E15 1 1 1 1 F

Es importante aclarar que si se deseara conectar el PIC directamente con el display de ánodo común, simplemente debemos cambiar los valores de la tabla y cambiar los unos por ceros y viceversa, pero se sale del tema de esta practica, pues seria como repetir tema.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 43

ANODO COMUN

Page 44: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

NUESTRA PRACTICA

Esta vez a diferencia de la practica No 5, se efectuara un contador ascendente y descendente, solo que la salida va por el puerto A, pero en la lógica sigue siendo la misma, a diferencia es que esta vez no se implementara una tabla de datos, sino que el dato se enviara tal como esta al puerto A, eso si teniendo en cuenta que el 7447 solo maneja 4 bits, por lo que los otros cuatro bits mas significativos, no se podrán leer.

Pero es importante destacar, aunque no es el objetivo del modulo, de que para manipular el puerto A del PIC 16f628, se le debe decir al PIC que este puerto va a trabajar como puertos de entradas y salidas digitales, pues el PIC posee incorporado un modulo de manejo de los comparadores, el cual maneja el puerto A como puerto análogos, ,y si no especificamos primero que deseamos que estos puertos sean digitales, existirán conflictos y el programa no se ejecutara como deseamos. Se encontrara en el programa a iniciar la siguiente sentencia:

INICIO MOVLW .7 MOVWF CMCON

Esto quiere decir que el registro encargado de manipular estos comparadores es el registro CMCON, y se carga con el valor de 7, el cual identifica este valor como dejar el puerto A como entradas / salidas digitales. Mas información estará disponible en otra practica.

El programa va a ejecutar un contador ascendente y descendente, muy semejante a la practica anterior.

DIAGRAMA DE FLUJO DEL CONTADOR ASCENDENTE Y DESCENDENTE

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 44

INICIO

Page 45: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

NO

SI

NO SI

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 45

CONFIG PIC CMCON => .7

BORRAR PORTA

BORRAR CONTA

CONTA => W

W => PORTA

CONTA + 1

CONTA= 10? RETARDO

W = .9

W => CONTA

CONTA => W

W => PORTA CONTA=CONTA-1

CONTA= 10?

Page 46: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA ESQUEMATICO DEL CONTADOR ASCENDENTE Y DESCENDENTE CON DECODIFICADOR

PROGRAMA PARA EL CONTADOR CON EL DECODIFICADOR

LIST P=16F628INCLUDE <P16F628.INC>

CONTA EQU 20CONT1 EQU 21CONT2 EQU 22CONT3 EQU 23

ORG 00GOTO INICIOORG 05

INICIO MOVLW .7MOVWF CMCON ;ESTO SE HACE PARA QUE EL PUERTOA SIRVA COMO

;I/O DIGITALES INHABILITA EL MÓDULO DE ;COMPARADORES

BSF STATUS,RP0 ;SELECCIONA BANCO1MOVLW B'11110000'MOVWF TRISA ;DE RA3 A RA0 SALIDAS BCF STATUS,RP0 ;AL BANCO0CLRF PORTA ;BORRAR EL PUERTOACLRF CONTA ;BORRAMOS EL REGISTRRO DEL CONTEO

ARRIBA CALL RETARDOMOVF CONTA,W ;ENVIAMOS EL CONTENIDO A WMOVWF PORTA ;PUERTO DONDE ESTA EL DISPLAY DE ACINCF CONTA,F ;SUMAMOS 1 A CONTAMOVLW .10SUBWF CONTA,W ;SI CONTA ES IGUAL A 10, SI LO ES LA

;RESTA SERA = A CERO Y AFECTARA EL FLAG ZBTFSS STATUS,Z ;PREGUNTAMOS SI LA OPERACION DIO CERO

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

ANODO COMUN

46

Page 47: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

GOTO ARRIBA ;SI NO VUELVA A START

MOVLW .9 ;SE CARGA CON NUEVE PARA DESCENSOMOVWF CONTA ;HACIA CONTA

ABAJO CALL RETARDO ;RETARDO PARA VER NUMERO A NUMEROMOVF CONTA,W ;MOVEMOS EL CONTENIDO DE CONTA A WMOVWF PORTA ;HACIA EL DISPLAYDECFSZ CONTA,F ;RESTA -1 A CONTA SI ES CERO SALTAGOTO ABAJOGOTO ARRIBA

;*********************************************************************RETARDO

MOVLW .6MOVWF CONT3MOVLW .250MOVWF CONT2MOVLW .250MOVWF CONT1DECFSZ CONT1,F ;DECREMENTE CONT1-1 SALTA CUANDO

;LLEGA A 0

GOTO $-1 ;$-1 SIGNIFICA QUE RETROCEDA UNA LINEA ANTESMOVLW .250MOVWF CONT1 ;SE RECARGA NUEVAMENTE EL REGISTRO POR EL

;ANIDAMINETODECFSZ CONT2,F ;DECREMENTE LA VARIABLE CONT2-1 SALTA CUANDO

;LLEGA A CEROGOTO $-5 ;$-5 RETROCEDE 5 LINEAS EN EL PROGRAMAMOVLW .250MOVWF CONT2 ;SE RECARGA CONT2 POR EL ANIDAMIENTODECFSZ CONT3,FGOTO $-9 ;RETROCEDE 9 LINEAS EN EL PROGRAMARETURN ;CUANDO CONT3 SEA CERO RETORNA DE DONDE SE

;LLAMÓEND

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 47

Page 48: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

MULTIPLEXADO DE DISPLAY DE CATODO COMUN PARA CONTADOR DE 00 A 99

Si nos ponemos a pensar en que muchos equipos poseen varios displays, existen dos formas comunes de hacerlos trabajar: una es que por cada display tengamos un decodificador como el 7447 o el 7448, y otra es usando solo un decodificador y jugando con los comunes de los display, el cual es el objetivo, solo que no vamos a usar un decodificador, sino una tabla de datos para ahorrarnos este integrado.

El como funciona realmente tiene un poco de ciencia y física, esto porque ocurre lo siguiente al llamado refresco dinámico u otros nombres como se le conocen, pero realmente trata de esto: cuando vemos trabajar un par de displays de esta forma , se ve como si ambos estuvieran encendidos (que es la gracia), pero la realidad es muy diferente, pues si pudiéramos percibir el tiempo en milisegundos, nos daríamos de cuenta que esto es falso, debido a que cada display alumbraría de uno en uno intercaladamente y no todos al tiempo como aparentaba, esto se debe a un fenómeno óptico llamado a veces persistencia de visión, pues nuestros ojos solo pueden ver imágenes o acontecimientos separados una a una 24 imágenes por segundo, mas allá de esta velocidad va a aparentar que se esta observando una solo imagen. Este mismo efecto es usado en el televisor y el los proyectores de cine.

También este efecto puede ser aprovechado por nosotros, pues principalmente porque simplifica el circuito, economiza componentes y espacio.

Así funcionaria nuestros displays, primero entraríamos a manipular el pin común que posee estos displays en este caso de cátodo común, lo que se haría es estar encendiendo y apagando secuencialmente los displays de esta forma:

imaginemos que tenemos una subrutina, en la que poseemos 2 displays Llamados A y B. Al comienzo están apagados como muestra la imagen:

En ese momento RA1 y RA0 están en 1, por lo que no prenden por que el común para los de cátodo común, debe ser polarizado con un cero .

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

PRACTICA 7

DISPLAYS DE CATODO COMUN

48

Page 49: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Ahora el siguiente paso seria enviar el dato para visualizar el numero 35, para ello se debe hacer primero es enviar el primer dato ,sea el 3 o el 5, para nuestro ejemplo empezaremos a enviar el dato para el encendido del numero 5, por el puerto B, pero a pesar que ambos displays tienen este dato, por ahora ninguno esta encendido, porque el común no esta habilitado por ninguno de los pines de RA0 y RA1.

Digamos que a partir de ahora habilitaremos RA1 colocando un cero para que se alimenten los leds, y ahora si se encenderán los segmentos correspondientes al # 5.

Después de que se mando la orden de encender este display, se debe dar un tiempo de retardo (del orden de milisegundos), para que los leds se alcancen a encender lo suficiente para iluminar, después de este tiempo, se enviara un 1 por RA1 para apagar este display, y nos alistaremos para enviar el dato para encender el numero 3 en el display, y para ello de nuevo se llamará a la tabla para que se tenga el dato para encender los segmentos que forman el numero 3 y se enviaran al puerto B, pero en este momento tampoco se encenderá ningún display, solo hasta que se habilite el pin que controla el display (RA0).

A partir que se ha descargado el valor en el puerto b, procedemos a activar con cero a RA0, y encenderá el display de esta forma.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

DISPLAYS DE CATODO COMUN

DISPLAYS DE CATODO COMUN

49

Page 50: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Bien, después de este acontecimiento, se dará un retardo igual al anterior para que se enciendan bien los leds y se apagara cuando este retardo termine.

Lo descrito anteriormente fue por decirlo así en cámara lenta porque si pusiéramos a trabajar esta subrutina, se vería así:

Para que nos muestre estas cantidades, normalmente cada digito se almacena en un registro de la memoria, en la practica uno se llama UNID denotando las unidades, y DEC hace mención a las decenas.

FUNCIONAMIENTO DEL CONTADOR

Si analizamos y recordamos bien, nuestra tabla manipulada anteriormente en otras practicas solo manipulaba del cero al nueve, entonces ¿como hacemos para que nos lleve el conteo desde 00 hasta 99, mas exactamente cuando pasa de 9 a 10, etc.?

La respuesta es de esta forma. Cuando teníamos un registro desde cero (en este caso UNID), lo íbamos incrementando, pero cuando llega a 10, en decimal se requiere de otro digito para representar el 10, esto quiere decir que cuando incrementábamos y llegamos a 10, se preguntaba en el programa que si ya había llegado UNID a 10, si no, continuara incrementando, pero en caso contrario, sencillamente borrábamos UNID, y el registro DEC lo incrementábamos en una unidad, así se soluciona el problema, y podemos amplificar este método cuantos registros necesitemos.

Para ilustrarlo mas claro, se observará mejor en el diagrama de flujo

NUESTRO CIRCUITO DE PRACTICA

Esta vez nuestro contador se encargara de efectuar un conteo de 00 a 99 y volver a repetir este ciclo, y cada incremento lo hará cada segundo mas o menos. El objetivo de esta practica era la de aplicar el multiplexado de los displays, y entender su técnica.

Es de aclarar que existen muchas formas de lograr el multiplexado, pero todas parten del mismo principio por lo que esta técnica no es la única y absoluta.

Manipulará 3 subrutinas: una la ya conocida tabla de conversión, otra subrutina un retardo que servirá como tiempo de visualización entre dato y dato y también entre incremento e

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

DISPLAYS DE CATODO COMUN

50

Page 51: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

incremento, otro retardo tendrá la misión del tiempo de refresco entre display y display, y es menor que el anterior retardo en cuanto a tiempo.

Como caso especial en el programa del retardo de visualización, vemos que se encuentra la rutina de mostrar entre la del retardo, esto es porque si se hacen rutinas individuales, el efecto seria el de ver un breve tiempo los números en el display y mas o menos 1 segundo apagado, debido a que el PIC no puede hacer 2 actividades a la vez, entonces lo que se hace es por cada decremento del retardo de visualización, se repite la subrutina de mostrar, para que siempre estén iluminados.

También es de mencionar que por estar manipulando el puerto A, debemos escribir en el CMCON el dato de 7, para dejar los pines del puerto A como puertos digitales.

DIAGRAMA DE FLUJO DEL PROGRAMA

NO

NO

SI

SI

NO

NOSI

SI

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

INICIO

CONFIG DE BANCOS

BORRAR PORTB BORRAR PORTA BORRAR UNID BORRAR DEC

RETARDO

UNID= UNID+1

UNID = 10?

UNID = 0

DEC= DEC+1

DEC = 10?

DEC = 0

RETARDO

CONT1=> .250 CONT2 => .250

MOSTRAR

CONT1 = CONT1+1

CONT1 = 10?

CONT1 =>.250

CONT2 = CONT2+1

CONT1 = 10?

RETURN

51

Page 52: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA ESQUEMATICO DEL CIRCUITO

PROGRAMA EN MPLAB PARA LA PRACTICA DE MULTIPLEXADO

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

MOSTRAR

UNID => W

TABLA

W=> PORTB

1=> RA0

REFRSCO

0=> RA0

DEC => W

TABLA

W=> PORTB

1=> RA1

REFRESCO

0=> RA1

RETURN

52

Page 53: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Y EL CONTADOR DE 00 A 99

LIST P=16F628INCLUDE <P16F628.INC>

UNID EQU 20CONT1 EQU 21CONT2 EQU 22CONT3 EQU 23CONT4 EQU 24CONT5 EQU 25DEC EQU 26

ORG 00GOTO INICIOORG 05

TABLA ADDWF PCL,FRETLW B'01111110' ;ENCIENDE EN EL DISPLAY EL CERORETLW B'00001100' ;ENCIENDE EL UNORETLW B'10110110' ;ENCIENDE EL DOSRETLW B'10011110' ;ENCIENDE EL TRESRETLW B'11001100' ;ENCIENDE EL CUATRORETLW B'11011010' ;ENCIENDE EL CINCORETLW B'11111010' ;ENCIENDE EL SEISRETLW B'00001110' ;ENCIENDE EL SIETERETLW B'11111110' ;ENCIENDE EL OCHORETLW B'11011110' ;ENCIENDE EL NUEVE

INICIO MOVLW .7MOVWF CMCON ;PARA DESHABILITAR LOS COMPARADORES Y

;DEJAR DIGITAL EL PUERTO ABSF STATUS,RP0 ;SELECCIONA BANCO1MOVLW B'00000000'MOVWF TRISB ;DE RB7 A RB0 SALIDAS MOVLW B'00000000'MOVWF TRISA ;DE RA0 A RA4 COMO SALIDASBCF STATUS,RP0 ;AL BANCO0CLRF PORTB ;BORRAR EL PUERTOBCLRF PORTACLRF UNIDCLRF DEC

ARRIBA CALL RETARDO ;EN EL RETARDO SE INCLUYE LA VISUALIZACION ;MULTIPLEXADA

INCF UNID,F ;SUMAMOS 1 A UNID COMO UNIDADESMOVLW .10SUBWF UNID,W ;MIRAMOS SI CONTA ES IGUAL A 10, SI LO ES LA

;RESTA SERA IGUAL A CERO Y AFECTARA Z BTFSS STATUS,Z ;PREGUNTAMOS SI LA OPERACION DIO CEROGOTO ARRIBA ;SI NO VUELVA A STARTCLRF UNID ;DEJAMOS A UNID EN CEROINCF DEC,F ;INCREMENTO EN +1 A DEC COMO DECENASMOVLW .10SUBWF UNID,W ;MIRAMOS SI EL CONTENIDO DE DEC ES IGUAL A 10BTFSS STATUS,ZGOTO ARRIBACLRF DEC ;BORRA A DEC Y EL CONTEO VUELVE A CEROCLRF UNID ;BORRA TAMBIEN UNIDGOTO ARRIBA

RETARDOMOVLW .2

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 53

Page 54: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

MOVWF CONT3MOVLW .10MOVWF CONT2MOVLW .10MOVWF CONT1CALL MOSTRAR ;SUBRUTINA ENCARGADA DE VISUALIZAR LOS DATOS

;EN LOS DISPLAYSDECFSZ CONT1,F ;DECREMENTE LA VARIABLE CONT1-1 SALTA CUANDO

;LLEGA A 0GOTO $-2 ;$-2 SIGNIFICA QUE RETROCEDA DOS LINEA ANTESMOVLW .10MOVWF CONT1 ;SE RECARGA NUEVAMENTE EL REGISTRO POR EL

;ANIDAMINETODECFSZ CONT2,F ;DECREMENTE LA VARIABLE CONT2-1 SALTA CUANDO

;LLEGA A CEROGOTO $-6 ;$-7 RETROCEDE 7 LINEAS EN EL PROGRAMAMOVLW .10MOVWF CONT2 ;SE RECARGA CONT2 POR EL ANIDAMIENTODECFSZ CONT3,FGOTO $-.10 ;RETROCEDE 11 LINEAS EN EL PROGRAMA, EL

;PUNTO ES PARA DECIRLE QUE EL DATO ES EN ;DECIMAL

RETURN ;CUANDO CONT3 SEA CERO RETORNA DE DONDE SE ;LLAMÓ

;*****************************************************MOSTRAR

CLRF PORTAMOVF UNID,W ;SE MUEVE EL CONTENIDO DE UNID A WCALL TABLA ;SE LLAMA LA TABLAMOVWF PORTBBSF PORTA,1 ;SE ACTIVA EL DISPLAY DE UNIDADESCALL RETVER ;RETARDO DE VISUALIZACION Y REFRESCOBCF PORTA,1 ;SE APAGA DISPLAY DE UNIDADESMOVF DEC,W ;DE DEC A WCALL TABLA ;TABLA PARA EL ENCENDIDO DE LOS DISPLAYSMOVWF PORTBBSF PORTA,0 ;SE ENCIENDE DISPLAY DE DECENASCALL RETVER ;RETARDO DE VISUALIZACIONBCF PORTA,0RETURN

;**************************************RETVER ;RETARDO DE VISUALIZACION DE LOS DISPLAYS

MOVLW .100MOVWF CONT4MOVLW .10MOVWF CONT5DECFSZ CONT4,FGOTO $-1MOVLW .100MOVWF CONT4DECFSZ CONT5,FGOTO $-5RETURNEND

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

PRACTICA 8

54

Page 55: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

ROTACIÓN DE UN DATO A TRAVES DE UN REGISTRO

La practica en esta ocasión consistirá en la utilización de dos instrucciones, cuya acción es la de rotar el valor de un registro en sentido a la derecha o a la izquierda.

En esta practica se hará con 8 leds rotar la iluminación como si fuera las luces de KITT de esa serie de TV llamada el auto fantástico. Así tendrá ese efecto de luces secuenciales. Primero un led permanece encendido y luego cambiara al siguiente led continuo, luego después de ir al 8vo volverá.

Para lograr esto, veamos como funcionan estas instrucciones:

ROTAR EL DATO A LA IZQUIERDA:

Existe una instrucción llamada RLF, la cual significa rotar a la izquierda el valor registro en una posición, lo que quiere decir que el dato se correrá a la izquierda una posición. Esta instrucción esta acompañada con el bit del carry, lo que quiere decir que como todo el dato se corre una posición a la izquierda, el 7mo bit corre al carry, y el contenido del carry corrió al bit 0 del registro que se movió. El resultado de esta operación puede ser guardado en w o en el mismo registro que se solicito rotar

1 0 0 0 0 0 0 0

Ejemplo de la rotación:

MOVLW B’10000000’ ;SE CARGARA A REG1 CON ESTE VALORMOVWF REG1BCF STATUS,C ;ASEGURAMOS QUE EL CARRY ESTE EN CERORLF REG1,F ;SE ROTÓ EL REGISTRO REG1 A LA IZQUIERDA

DESPUÉS DE LA INTRUCCION REG1 = B’00000000’, Y EL CARRY VALE 1 .

HAGAMOS OTRA ROTACIÓN A LA IZQUIERDA:

RLF REG1,F ;SE ROTÓ DE NUEVO UNA POSICIO A LA DERECHA

DESPUÉS DE LA INSTRUCCIÓN REG1 =B’00000001’, Y EL CARRY VALE 0 .

ROTACION A LA DERECHA

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

CARRY

ROTACIÓN UNA POSICIÓN A LA IZQUIERDA

55

Page 56: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Existe la instrucción complementaria llamada RRF, la cual significa rotar a la derecha el valor registro en una posición, lo que quiere decir que el dato se correrá a la derecha una posición.

Esta instrucción esta acompañada con el bit del carry, lo que quiere decir que como todo el dato se corre una posición a la derecha, el bit0 corre al carry, y el contenido del carry corrió al bit 7 del registro que se movió. El resultado de esta operación puede ser guardado en w o en el mismo registro que se solicito rotar.

Ejemplo de la rotación:

MOVLW B’00000001’ ;SE CARGARA A REG1 CON ESTE VALORMOVWF REG1BCF STATUS,C ;ASEGURAMOS QUE EL CARRY ESTE EN CERORRF REG1,F ;SE ROTÓ EL REGISTRO REG1 A LA DERECHA

DESPUÉS DE LA INTRUCCION REG1 = B’01000000’, Y EL CARRY VALE 1 .

HAGAMOS OTRA ROTACIÓN A LA IZQUIERDA:

RRF REG1,F ;SE ROTÓ DE NUEVO UNA POSICIO A LA DERECHA

DESPUÉS DE LA INSTRUCCIÓN REG1 =B’10100000’, Y EL CARRY VALE 0 .

NUESTRO CIRCUITO DE PRACTICA

Como se había comentado antes, se hará unas luces secuenciales, usando el puerto B para este objetivo.

El circuito trabajara mas o menos así: Iniciara encendido el led del pin RB0, esperará mas o menos 1 segundo y rotará a la izquierda, quedando encendido el pin RB1, y se hará esta secuencia hasta que llegue al pin de RB7.

Cuando esto ocurre, espera un segundo y rotará pero a la derecha, osea a RB6 y esperara un segundo, este ciclo se repite hasta que el led encendido sea el de RB0, y de nuevo se repetirá esta secuencia.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

0 0 0 0 0 0 0 1

CARRY

ROTACIÓN UNA POSICION A LA IZQUIERDA

56

Page 57: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA DE FLUJO DEL PROGRAMA

NO

SI

NO

SI

DIAGRAMA ESQUEMATICO DEL CIRCUITO

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

INICIO

CONFIG DEL PIC

BORRAR PORTB

BORRAR CARRY

1=> RB0

RB7 = 1?

RETARDO 1SEG

ROTAR IZQ PORTB

RETARDO 1SEG

RB0 = 1?

ROTAR DER PORTB

RETARDO 1SEG

57

Page 58: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

PROGRAMA EN MPLAB PARA LAS LUCES SECUENCIALESLIST P=16F628INCLUDE <P16F628.INC>

CONT1 EQU 20 ;REGISTROS PARA EL ANIDAMIENTOCONT2 EQU 21CONT3 EQU 22

ORG 00GOTO INICIOORG 05

INICIO BSF STATUS,RP0 ;SELECCIONA BANCO1MOVLW B'00000000' ;PUERTO RB COMO SALIDAMOVWF TRISBBCF STATUS,RP0 ;AL BANCO0CLRF PORTB ;BORRAR EL PUERTOBBCF STATUS,C ;SE PONE A CERO EL BIT DEL CARRY PARA

;ASEGURAR QUE SEA CEROBSF PORTB,1 ;SE PONE ESTE ESTADO DEL BIT A ROTAR

STARTI BTFSS PORTB,7GOTO ROTAIZ

STARTD BTFSS PORTB,0GOTO ROTADERCALL RETARDOGOTO STARTI

;*******************************

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 58

Page 59: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

ROTADER CALL RETARDORRF PORTB,F ;ROTE A LA DERECHA EL PUERTOBGOTO STARTD

;********************************ROTAIZ CALL RETARDO ;TIEMPO PARA VISUALIZAR CADA POSICION

;DE ROTACIONRLF PORTB,F ;ROTA A LA IZQUIERDA EL CONTENIDO DE .

. ; PORTBGOTO STARTI

;***********************************RETARDO

MOVLW .6MOVWF CONT3MOVLW .250MOVWF CONT2MOVLW .250MOVWF CONT1

DECFSZ CONT1,F ;DECREMENTE LA VARIABLE CONT1-1 SALTA ;CUANDO LLEGA A 0

GOTO $-1 ;$-1 SIGNIFICA QUE RETROCEDA UNA LINEA ;ANTES

MOVLW .250MOVWF CONT1 ;SE RECARGA NUEVAMENTE EL REGISTRO POR

; EL ANIDAMINETODECFSZ CONT2,F ;DECREMENTE LA VARIABLE CONT2-1 SALTA

;CUANDO LLEGA A CEROGOTO $-5 ;$-5 RETROCEDE 5 LINEAS EN EL PROGRAMAMOVLW .250MOVWF CONT2 ;SE RECARGA CONT2 POR EL ANIDAMIENTODECFSZ CONT3,FGOTO $-9 ;RETROCEDE 9 LINEAS EN EL PROGRAMARETURN ;CUANDO CONT3 SEA CERO RETORNA DE DONDE

; SE LLAMÓEND

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 59

Page 60: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

LED INTERMITENTE POR MEDIO DEL REGISTRO TMR0

El programa permite encender y apagar un led en RB7 mediante la temporización por el registro TMRO.

En este programa vamos a conocer un nuevo recurso que posee el PIC 16F628 que se llama TMR0. TMR0 no es otra cosa que un registro de 8 bits que nosotros podemos cargar con un valor desde 00 hasta FF en hexadecimal.

El uso de la temporización se usa en casi todas las aplicaciones, semáforos, alarmas, acceso con clave, ascensores, comunicación, etc.

Al igual que teníamos dos registros TRISA y TRISB que configuraban los pines de los puertos como entradas o salidas. En la temporización tenemos el registro OPTION en el banco 1, que le configurará el registro TMR0 del banco 0, ya sea como temporizador o contador.

REGISTRO OPTION

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

PRACTICA 9

60

Page 61: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Medida de tiempo en un micro, está sujeta a tres temas:

Oscilador externo Registro TMR0

Divisor de Frecuencia

El oscilador externo creo que ya saben pero hago recordar, es el que me define la velocidad del ciclo de instrucción, y cuando usamos un oscilador de cristal de cuarzo (XT) de 4Mhz, tenemos 1 microsegundo de ciclo de instrucción.

El registro TMR0 de 8 bits se configura como temporizador para determinar intervalos concretos de tiempo o como contador de impulsos externos .

EL divisor de Frecuencia, como su nombre lo dice divide la frecuencia de reloj, que es lo mismo decir que aumenta la duración de los impulsos de reloj.La combinación binaria de los bits PS0, PS1 y PS2, del registro OPTION me definen el rango del divisor de frecuencias.

El valor cargado en el TMR0, es aquel valor que le falta a este registro para que llegue a 255 (valor máximo para un registro de 8 bits).

EJEMPLO:

Si por software cargo un valor de 125 en el registro TMR0, entonces el valor que interviene en la fórmula es 130, valor que falta para que sea desborde (llegue a 255) el registro TMR0 (255-125=130).

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

DIAGRAMA DE BLOQUES DE TMR0

61

Page 62: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Registro de Control de Interrupciones INTCON

Este registro ocupa la dirección 0BH del banco 0 y banco 1

DESBORDAMIENTO DEL TMR0

Cuando el TMR0 se desborda y pasa del valor de FFH a 00H, el señalizador o bandera TOIF se pone automáticamente en 1.Cuando se carga el TMR0 con un valor n en decimal, cuenta (256-n) impulsos, el tiempo se cuenta mediante la siguiente formula:

Temporizacion = 1Us X ( 256-n) X Rango del divisor de frecuencia.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 62

Page 63: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

SET DE INSTRUCCIONES UTILIZADAS EN LA PROGRAMACION

1. BSF f, b : Con esta instrucción se pone en 1 el bit b del registro f

Ejemplo: Si se tiene en el puerto A ( PTOA ) = 1010 y se quiere colocar en UNO el tercer bit, la instrucción es la siguiente: BSF PORTA , 3.

2. BTFSS f, b : ( BIT TEST FILE SKIP IF SET ) Explora un bit del registro f y salta . si vale uno.

Ejemplo : Explorar si el bit 0 del registro STATUS vale uno. si es así saltar a la dirección CONTINUAR si no salta a la dirección

SIGUE: BTFSS STATUS,0 GOTO SIGUE GOTO CONTINUAR

explicacion del programaAl carga el registro option se asigna como divisor de frecuencia 256. Al no asignar un valor al TMR0 el automaticamente cuenta de 0 a256. Significa que con un cristal de 4MHz la temporizacion tiene un valor de:

Temporizacion = CI x TMR0 x DF

Temporizacion = 1Us x 256 x 256 = 65.5ms

Fórmula para calcular tiempos mas amplios utilizando un contador

Se activa el registro de interrupciones por TMR0. La variable REG1 es cargada con 15 y se enciende el Led del puerto RB7; se mantiene en un ciclo hasta cuando se produce una interrupción la cual es originada por la temporización del TMR0, en el ejemplo anterior significa que cuando hayan transcurridos 65.5ms se produce una interrupción, este tiempo es multiplicado por 15 esto equivale a (15*65ms = 1segundo aprox); durante el cual se mantiene encendido el led ; Cuando el contador llega a cero y se genera una nueva interrupción, y se temporiza nuevamente pero para mantener el led apagado durante 1s .

T = (TMR0) (Divisor de Fecuencia) (Ciclos Instruc) (Contador)

Valor Max Valor Max 1 Valor Max256 256 1s 255

: EJEMPLO: Contador = 1 Segundo = 1.000.000 uS = 1.000.000 = 15,2 15

TMR0X D.F. 256 X 256 65.536

Tiempo (seg) 1 2 3 4 5Contador 15 30 45 60 75

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 63

Page 64: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

NUESTRO CIRCUITO PROPUESTO

Semejante a la practica numero 2, pero esta vez se empleara un retardo, pero no en forma de anidamiento, sino esta vez se efectuara empleando las características del TMR0.

Se empleara el TMR0 a su máximo división, quiere decir que su preescala o preescaler estará a una proporción de 1:256, y se esperará a que el flag o la bandera del registro INTCON, T0IF, se ponga a 1, indicando que ha ocurrido un desbordamiento del TMR0, por cada desbordamiento, decrementara la variable REG1, el cual al multiplicar 15 desbordamientos (valor del registro REG1 =.15) , se cumplirá un segundo aproximadamente. Cuando REG1 llegue a cero, entonces tomara acción sobre si encender o apagar el led, dependiendo de la condición en que lo encuentre.

El led estará conectado por RB7, y sera intermitente, pues empleara un retardo, luego enciende; un retardo y luego se apaga.

DIAGRAMA DE FLUJO DEL PROGRAMA

NO

SI

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

INICIO

CONFIG DEL PIC REGISTRO OPTION_REG

0 => INTCON, T0IF

REG1 = .15

BORRAR TMR0

T0IF=1?

REG1 = REG1-1

0 => INTCON, T0IF

REG1 = 0?

RB7 = 1

0 => RB7

1 => RB7

64

Page 65: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA ESQUEMATICO DEL CIRCUITO

PROGRAMA EN MPLAB PARA EL LED INTERMITENTE CON TMR0

LIST P=16F628INCLUDE <P16F628.INC>

REG1 EQU 20ORG 00GOTO INICIOORG 05

INICIO BSF STATUS,RP0 ;SELECCIONA BANCO1MOVLW B'00000000' ;PUERTO RB COMO SALIDAMOVWF TRISBMOVLW B'10000111' ;PARA PROGRAMAR EL TMR0, PREESCALER MOVWF OPTION_REG BCF STATUS,RP0 ;AL BANCO0CLRF PORTB ;BORRAR EL PUERTOBBCF INTCON,T0IF ;SE PONE A CERO EL FLAG DE TMR0 PARA SABER

CARGA MOVLW .15 ;SI SE DESBORDA, CUANDO SE PONE EN UNOMOVWF REG1 ;SE CARGA CON 15, PARA QUE LOS

;DESBORDAMIENTOS DEL TMR0 SUMEN APROX 1 SEGCLRF TMR0 ;BORRAMOS A TMR0 COMO UN RESET

START BTFSS INTCON,T0IF ;CHEQUEAMOS SI YA SE PUSO A UNO EL FLAG DE ;TMR0 POR DESBORDAMIENTO

GOTO $-1 ;SI NO VUELVA Y PREGUNTE BCF INTCON,T0IF ;BORRAMOS ESTE FLAG, PUES ES UN REQUISITO,

;PARA OTRO DESBORDAMIENTODECFSZ REG1,F ;POR CADA DESBORDAMIENTO SE DECREMENTA GOTO START ;REG1 (PARA QUE DURE 1 SEGUNDO)BTFSS PORTB,7 ;PREGUNTA ESTADO DE RB7, PARA ENCENDERLO O GOTO LEDON ;APAGARLO

LEDOFF BCF PORTB,7 ;SI ESTABA ENCENDIDO QUE LO APAGUEGOTO CARGA ;VUELVE A CARGAR CON 15 REG1 PARA OTRO

. ; CICLOLEDON BSF PORTB,7

GOTO CARGAEND

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 65

Page 66: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

USO DEL PUERTO RA4/T0CKI CON EL REGISTRO TMR0

Para mencionar las características de este pin, tiene como funciones ser un puerto de entradas / salidas digitales o ser la entrada de un reloj externo, el cual afectará directamente al registro TMR0, cuando se selecciona en el registro OPTION_REG, TOCS.

Esta señal hará que según el valor de preescaler del tmr0 , este se irá incrementando. Un uso común, es cuando que un registro se incremente a una velocidad lenta, y como los ciclos de instrucción son todavía muy rápidos, se usa una fuente osciladora mucho mas lenta. Pero en realidad, funciones para esto son limitadas solo a la imaginación del diseñador.

El objetivo de la practica será el de enviar una señal de reloj de un medio externo, en el caso se usará un LM555 para generar esta señal, u otra fuente, e incluso un pulsador, y cuando el registro del TMR0 alcance cierto valor, incrementará un contador que va de cero a 9 a través del puerto A.

A este puerto, que normalmente es de colector abierto cuando se usa como puerto de salida, (por decirlo así se requiere de una resistencia para que genere el estado alto), y cuando es entrada puede ser para entrada digital , o que se desea habilitar la característica de incrementar el tmr0 por cada flanco, sea de subida o de bajada, esto se determina en el bit de TOSE del registro OPTION_REG, (detallar en la hoja anterior), esto para que el TMR0 se incremente a cierta frecuencia, y como se menciono depende en gran parte del valor asignado al preescaler.

En el diagrama esquemático del circuito, se observará que la fuente del reloj usada ( en el caso del un 555 por el pin 3 que es su salida), su frecuencia externa no excederá mas 2KHz, por lo que no hay problema con el PIC, ya que si se ingresa una frecuencia muy grande incluso mas grande que la del oscilador del PIC, puede que existan algunas fallas , por lo que se recomienda no usar una frecuencia mas alta que los ¾ de la frecuencia del PIC, pero estos valores no son críticos y pueden variar según el diseño.

NUESTRO CIRCUITO DE PRACTICA

Nuestro circuito de practica consistirá en que por medio de un 555, se generará una señal de reloj (frecuencia), del orden de Hz hasta máximo 2KHz con el capacitor y resistencias dadas en el esquemático, y la salida de este pin (3) del 555 ira a la entrada del PIC por el puerto RA4, por ende afectara el registro TMR0 ya configurado, de tal forma que cada 8 ciclos del 555, el TMR0 se incrementará una vez (preescaler), y cuando el valor de TMR0 llegue a B’00000100’, entonces incrementará un contador en una unidad, este ilustrado a través del puerto A como salida y usando el decodificador 7447, y el conteo ira de cero a nueve. Luego se borrará el trm0 para que el ciclo se cumpla de nuevo.

Recordemos que por manipular el puerto A como salida para ver el conteo, se debe inhabilitar los comparadores como se había mencionado en otras guías, cargando el registro CMCON con .7.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

PRACTICA 10

66

Page 67: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA DE FLUJO DEL PROGRAMA

NO

SI

NO

SI

DIAGRAMA ESQUEMATICO DEL CIRCUITO

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

INICIO

CONFIGURAR EL PICY DEL TMR0 EN EL

REGIST OPTION

CONTA => 0

CONTA => W

W => PORTA

BORRAR TMR0

TMR0,3 = 1?

CONTA= CONTA+1

CONTA = 10?

67

Page 68: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

PROGRAMA EN MPLAB PARA LA MANIPULACIÓN DEL 555 CON EL PUERTO RA4/T0CKI.

LIST P=16F628INCLUDE <P16F628.INC>

CONTA EQU 20ORG 00GOTO INICIOORG 05

INICIO MOVLW .7MOVWF CMCON ;INHABILITAMOS LOS COMPARADORES INTERNOSBSF STATUS,RP0 ;SELECCIONA BANCO1MOVLW B'11110000' ;PUERTO RA0 A RA3 COMO SALIDA RA4 COMO

ENTRADAMOVWF TRISAMOVLW B'10100010' ;PARA PROGRAMAR EL TMR0, CON CICLOS DE

;RA4/TOCKI Y PREESCALER A 1:4 MOVWF OPTION_REGBCF STATUS,RP0 ;AL BANCO0CLRF PORTA ;BORRAR EL PUERTOA

START CLRF CONTA ;BORRA EL REGISTRO PARA INICIARAAA MOVF CONTA,W

MOVWF PORTA ;ESTAS INTRUCCIONES SON PARA VISUALIZAR EN ;DISPLAY A.COMUN

CLRF TMR0BTFSS TMR0,3 ;SE PREGUNTA SI ESTE BIT YA LLEGO A 1 POR

;LOS INCREMENTO DEL 555 POR RA4GOTO $-1INCF CONTA,F ;SI YA LLEGO A UNO EL TMR0,3 INCREMENTE EL

;DISPLAY EN 1MOVLW .10SUBWF CONTA,W ;SI YA LLEGO A 10, VUELVA A CERO EL CONTEOBTFSS STATUS,ZGOTO AAAGOTO STARTEND

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 68

Page 69: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

LED INTERMITENTE A TRAVES DE UNA INTERRUPCIONPOR EL REGISTRO TMR0

El programa permite encender y apagar un led en RB7 mediante la temporización por el registro TMRO ,pero esta temporizacion se llevará a cabo únicamente a través de una interrupción generada por el desbordamiento del registro TMR0.

TMR0 no es otra cosa que un registro de 8 bits que nosotros podemos cargar con un valor desde 00 hasta FF en hexadecimal. Lo que hace diferente a este registro de todos los demás es que nos puede generar una interrupción en el programa sí nosotros configuramos adecuadamente otro registro llamado INTCON (registro de control de interrupciones) que también va a ser el objeto de nuestro estudio, igual que el registro OPTION, todo con el fin de aprender a manejar la temporizacion en un programa de microcontrolador.

Al igual que teníamos dos registros TRISA y TRISB que configuraban los pines de los puertos como entradas o salidas. En la temporización tenemos el registro OPTION en el banco 1, que le configurará el registro TMR0 del banco 0, ya sea como temporizador o contador.

Fórmula para calcular tiempos

Al carga el registro option se asigna como divisor de frecuencia 256. Al no asignar un valor al TMR0 el automaticamente cuenta de 0 a256. Significa que con un cristal de 4MHz la temporizacion tiene un valor de:

Temporizacion = CI x TMR0 x DF

Temporizacion = 1Us x 256 x 256 = 65.5ms

La medida de tiempo en un micro, está sujeta a tres temas:

Oscilador externo Registro TMR0 Divisor de Frecuencia

El oscilador externo creo que ya saben pero hago recordar, es el que me define la velocidad del ciclo de instrucción, y cuando usamos un oscilador de cristal de cuarzo (XT) de 4Mhz, tenemos 1 microsegundo de ciclo de instrucción.El registro TMR0 de 8 bits se configura como temporizador para determinar intervalos concretos de tiempo o como contador de impulsos externos .EL divisor de Frecuencia, como su nombre lo dice divide la frecuencia de reloj, que es lo mismo decir que aumenta la duración de los impulsos de reloj.La combinación binaria de los bits PS0, PS1 y PS2, del registro OPTION me definen el rango del divisor de frecuencias.El valor cargado en el TMR0, es aquel valor que le falta a este registro para que llegue a 255 (valor máximo para un registro de 8 bits).

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

PRACTICA 11

69

Page 70: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

EJEMPLO: Si por software cargo un valor de 125 en el registro TMR0, entonces el valor que interviene en la fórmula es 130, valor que falta para que sea desborde (llegue a 255) el registro TMR0 (255-125=130).

DIAGRAMA DE BLOQUES DE TIMER 0

INTERRUPCIONES

AL igual que la instrucción call, una interrupción me genera un desvió del flujo normal del programa, pero la diferencia sustancial es que al generarse la interrupción, el PC no va a cualquier dirección de la memoria FLASH, sino a la posición 04, que es la posición reservada para la llamada al tratamiento de la interrupción.Qué es lo que genera interrupciones?

En este tipo de microcontrolador tenemos 5 fuentes de interrupción generales por decirlo, es decir son 5 las razones por las que puede ocurrir una interrupción estas razones son:

1.Desbordamiento del registro TMR0. 2.Cambio de estado en los pines RB4 - RB7 del puerto B 3.Fin de escritura de la EEPROM de datos 4.Por causa de una interrupción externa, pin RB0/INT 5. Causada por los periféricos del PIC (Comparadores, Comparación / captura-pwm, modulo de comunicaciones usart, etc.)

Registro de Control de Interrupciones INTCON

Primero tenemos que habilitar el GIE para poder hacer cualquier tipo de interrupción, luego consideramos las interrupciones pertinentes a nuestra aplicación con los correspondientes bits de permiso. Los bits de señalización son los encargados de avisar que evento de interrupción ha ocurrido poniéndose a 1.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

70

Page 71: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Para volver a ponerlo a 0 estos bits de señalización, debemos programar por software, porque de no se así no se podrá salir de ellos.Durante el tiempo que se esta ejecutando la interrupción, GIE se pone a cero para evitar tener en cuenta cualquier otro tipo de interrupción.Si se quiere retornar de la interrupción con el GIE nuevamente habilitado, se pone la instrucción RETFIE que pondrá a GIE automáticamente a 1.

INTERRUPCION POR DESBORDAMIENTO DEL TMR0

Cuando el TMR0 se desborda y pasa del valor de FFH a 00H, el señalizador o bandera TOIF se pone automáticamente en 1.

Cuando se carga el TMR0 con un valor n en decimal, cuenta (256-n) impulsos. El tiempo se cuenta mediante la siguiente formula

Temporizacion = 4 X Tosc X ( 256-n) X Rango del divisor de frecuencia.

SET DE INSTRUCCIONES UTILIZADAS EN LA PROGRAMACION

2. BTFSS f, b : ( BIT TEST FILE SKIP IF SET ) Explora un bit (b) del registro f y

salta si vale uno. Ejemplo : Explorar si el bit 0 del registro STATUS vale uno. si es así

saltar a la dirección CONTINUAR si no salta a la dirección

SIGUE: BTFSS STATUS,0

GOTO SIGUE

GOTO CONTINUAR

explicacion del programa

Al carga el registro option se asigna como divisor de frecuencia 256. Al no asignar un valor al TMR0 el automaticamente cuenta de 0 a256. Significa que con un cristal de 4MHz la temporizacion tiene un valor de:

temporizacion =4*T0sc*(256-n)*divisor de frecuencia

temporizacion = 4*250ns*256*256 = 65.5ms

Se activa el registro de interrupciones por TMR0. La variable REG1 es cargada con 15 y se enciende el Led del puerto RB7; se mantiene en un ciclo hasta cuando se produce una interrupción la cual es originada por la temporización del TMR0, en el ejemplo anterior significa que cuando hayan transcurridos 65.5ms se produce una interrupción, este tiempo es multiplicado por 15 esto equivale a (15*65ms = 1segundo aprox); durante el cual se mantiene encendido el led ; Cuando el contador llega a cero y se genera una nueva interrupción, y se temporiza nuevamente pero para mantener el led apagado durante 1 segundo .

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 71

Page 72: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA DE FLUJO DEL PROGRAMA POR INTERRUPCION DE TMR0

NO

SI

NO

SI

NO

SI

DIAGRAMA ESQUEMATICO DEL CIRCUITO

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

INICIO

CONFIGURACIÓN DEL PIC -

REGISTROS OPTION_REG Y

INTCON

CONTA => .15

BORRAR TMR0

INTCON,GIE => 1

ESPERA

INTERRUPCION

T0IF = 1?

RETFIE

0 => INTCON,T0IF

CONTA -1

CONTA = 0?

RETFIE

CONTA => .15

RB7 = 1? 1 => RB7

0 => RB7 RETFIE

72

Page 73: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

PROGRAMA EN MPLAB PARA UN LED INTERMITENTE POR TMRO

LIST P=16F628INCLUDE <P16F628.INC>

CONTA EQU 20ORG 00GOTO INICIOORG 04GOTO INTERR ;CUANDO HAY INTERRUPCION SE DIRIGE A LA

;ETIQUETA DEMARCADA AQUIORG 05

INICIO BSF STATUS,RP0 ;SELECCIONA BANCO1MOVLW B'00000000' ;PUERTO RB COMO SALIDAMOVWF TRISBMOVLW B'10000111' ;PARA PROGRAMAR EL TMR0, CON CICLOS DE

;INTRUCCION Y PREESCALER A 1:256 MOVWF OPTION_REGMOVLW B'00100000' ;GIE OFF, INTERRUPCION POR DESBORDAMIENTO

;DEL TMR0, FLAGS OFFMOVWF INTCONBCF STATUS,RP0 ;AL BANCO0MOVLW .15MOVWF CONTA ;SE CARGA CON 15, PARA QUE LOS

;DESBORDAMIENTOS DEL TMR0 (15 EN TOTAL), ;SUMEN APROX 1 SEG

CLRF TMR0 ;SE BORRA EL TMR0 PARA QUE EMPIECE DE CEROBSF INTCON,GIE ;HABILITAMOS APARTIR DE AHORA LA

;INTERRUPCION POR TMR0GOTO $ ;SE QUEDA EN ESPERA HASTA QUE OCURRA ALGO:

;UNA INTERRUPCION;******************************************************INTERR BTFSS INTCON,T0IF ;PREGUNTAMOS SI FUE INTERRUPCION POR TMR0

RETFIE ;ESTE TIPO DE RETORNO PONE AUTOMATICAMENTE ;EL GIE EN 1

BCF INTCON,T0IF ;BORRAMOS EL FLAG POR REQUISITODECFSZ CONTA,F ;POR CADA INTERRUCION VA DECREMENTANDO EL

;CONTARETFIE ;SALE Y ESPERA DE NUEVOMOVLW .15MOVWF CONTA ;RECARGAMOS CONTA PARA OTRO CICLOBTFSS PORTB,7 ;PREGUNTA ESTADO DE RB7 PARA ENCENDERLO O

;APAGARLOGOTO LEDON

LEDOFF BCF PORTB,7RETFIE

LEDON BSF PORTB,7RETFIEEND

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 73

Page 74: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

ENCENDIDO Y APAGADO DE UN LED POR EL PUERTO RB0/INT

En la practica anterior hemos fortalecido el manejo de un recurso llamado TMR0 realizando practicas con este. Mas exactamente hemos aprendido las interrupciones provocados por el desbordamiento del Timer 0.

Esta vez la idea es provocar una interrupción usando el recurso de la interrupción externa por el puerto RB0/INT. El puerto RB0 va a ser una entrada para la dicha interrupción externa usando un pulsador como es mostrado en la figura de arriba.

Y en el puerto RB7 vamos a poner un led que se va a apagar o prender cada vez que nosotros vamos a provocar una interrupción externa usando nuestro pulsador de interrupción.

Acordémonos que el microcontrolador tiene cinco formas genéricas de interrupción:

1.Desbordamiento del registro TMR0. 2.Cambio de estado en los pines RB4 - RB7 del puerto B 3.Fin de escritura de la EEPROM de datos 4.Por causa de una interrupción externa, pin RB0/INT 5. Por los periféricos o módulos accesorios del pic. Entonces vamos a usar los mismos registros INTCON y OPTION solo que esta vez tenemos que configurarlos un poco diferente. En registro INTCON se va a configurar de la siguiente manera.

Registro INTCON:

GIE PEIE TOIE INTE RBIE TOIF INTF RBIF1 0 0 1 0 0 0 0

El bit GIE lo vamos a poner en el 1 lógico para activar el permiso global para la ejecución de las interrupciones.

El bit INTE también hay que activarlo en 1 para habilitar la interrupciones externas por el pin RB0/INT de microcontrolador.

Es bueno también asegurarse que el bit de la señalización de interrupciones externas este borrado, así alistándolo para la interrupción externa que venga.En el registro OPTION también se van a presentar leves, pero importantes cambios.

Registro OPTION:

RPBU INTEDG TOCS TOSE PSA PS2 PS1 PS01 0 0 1 0 0 0 0

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

PRACTICA 12

74

Page 75: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA DE BLOQUES DE TIMER 0

NUESTRO CIRCUITO

Como siempre lo primero que vamos a hacer es configurar los puertos, RB0 como entrada donde vamos a conectar nuestro pulsador de interupciones y RB7 como salida donde conectamos nuestro led.

Despues configuramos el registro OPTION donde el bit INTEDG se pone en cero para configurar el flanco de bajada como interrupcion. Luego ajustamos el GIE y bit INTE del registro INTCON como 1 para activar el permiso global de las interrupciones, mas exacto las interrupcionesexternas por RB0/INT.

Una vez realizada la configuracion nos aseguramosa apagar el led y se procede a esperar la interrupcion externa. Cuando el programa detecta la interrupcion se pone a averiguar el estado del led sí este esta apagado se le enciende o viceversa y se retorna el programa a esperar la siguiente interrupcion.

DIAGRAMA DE FLUJO DEL PROGRAMA

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

75

Page 76: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

NO

SI

NO

SI

DIAGRAMA ESQUEMATICO DEL CIRCUITO

PROGRAMA PARA LA INTERRUPCION POR RB0/INT

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

INICIO

CONFIGURACIÓN DEL PIC, DEL REGISTRO

OPTION_REG Y INTCON, PARA INTERRUPCIÓN POR

RB0.

1=> INTCON,GIE

ESPERA

INTERRUPCION

INTCON,I NTF = 1?

RB7 = 1?

0 => RB7

0 => RB7

RETARDO ANTIRREBOTE

RETFIE

0 => INTCON, INTF

RETFIE

76

Page 77: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

LIST P=16F628INCLUDE <P16F628.INC>

CONTA EQU 20CONT3 EQU 21CONT2 EQU 22CONT1 EQU 23

ORG 00GOTO INICIOORG 04GOTO INTERR ;CUANDO HAY INTERRUPCION SE DIRIGE A LA AQUIORG 05

INICIO BSF STATUS,RP0 ;SELECCIONA BANCO1MOVLW B'00000001' ;PUERTO RB0 COMO ENTRADAMOVWF TRISBMOVLW B'10000000' ;PARA PROGRAMAR FLACO DEL RB0, EN ESTE CASO

;POR FLANCO DE BAJADA MOVWF OPTION_REGMOVLW B'00010000' ;GIE OFF, INTERRUPCION POR FLACO DE RB0MOVWF INTCONBCF STATUS,RP0 ;AL BANCO0BSF INTCON,GIE ;HABILITAMOS APARTIR DE AHORA LA INT/RB0GOTO $ ;ESPERA HASTA QUE OCURRA UNA INTERRUPCION

;******************************************************INTERR BTFSS INTCON,INTF ;PREGUNTAMOS SI FUE INTERRUPCION POR RB0

RETFIE ;RETORNO PONE AUTOMATICAMENTE EL GIE EN 1BCF INTCON,INTF ;BORRAMOS EL FLAG POR REQUISITOBTFSS PORTB,7 ;PREGUNTA POR RB7 PARA ENCENDERLO O APAGARLOGOTO LEDON

LEDOFF BCF PORTB,7CALL REANTIRRETFIE

LEDON BSF PORTB,7CALL REANTIRRETFIE

;***********************************REANTIR

MOVLW .3MOVWF CONT3MOVLW .180MOVWF CONT2MOVLW .200MOVWF CONT1DECFSZ CONT1,F ;DECREMENTE CONT1-1 SALTA CUANDO LLEGA A 0GOTO $-1 ;SIGNIFICA QUE RETROCEDA UNA LINEA ANTESMOVLW .200MOVWF CONT1 ;SE RECARGA NUEVAMENTE DECFSZ CONT2,F ;DECREMENTE CONT2-1 SALTA CUANDO LLEGA A CEROGOTO $-5 ;$-5 RETROCEDE 5 LINEAS EN EL PROGRAMAMOVLW .180MOVWF CONT2 ;SE RECARGA CONT2 POR EL ANIDAMIENTODECFSZ CONT3,FGOTO $-9 ;RETROCEDE 9 LINEAS EN EL PROGRAMARETURN ;CUANDO CONT3 SEA CERO RETORNA DE DONDE SE END ;LLAMÓ

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 77

Page 78: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

MANIPULACIÓN DE UN BUZZER POR MEDIO DEL PIC

Es común que a veces necesitemos de un medio auditivo para el reconocimiento de una actividad, sea por ejemplo se cuando un contador llegó a su fin, o como papel de alarma despertadora.

Los buzzer normalmente son elementos mecánicos, que en un encapsulado cilíndrico, (normalmente plástico negro), el cual solo tienen resonancia en frecuencias del rango de los 750 Hz hasta los 5KHz, ,pero estos valores realmente dependen del fabricante del elemento.

Aspecto común de un buzzer visto desde arriba.

Normalmente estos buzzer tiene una polarización , por la que debemos tener en cuenta antes de su conexionado con el PIC o circuito a tratar.

Su funcionamiento básico es sencillo: el PIC o microcontrolador se encarga de generar esta señal o tono (de 750Hz a 5KHz aproximadamente), y por medio de un transistor para manejar la carga, se conectara al buzzer.

Es de tener en cuenta que por ser un elemento electromecánico, generará ruido eléctrico, por lo que se recomienda usar filtros capacitivos en el circuito, y preferible en paralelo con el buzzer.

NUESTRO CIRCUITO

Nuestro circuito consistirá en que por cada vez que pulsemos un interruptor, incrementará un contador, manejado por un display de cátodo común y una tabla de datos, y también sonará el buzzer por medio de el puerto RA3, para mas detalles en el diagrama esquemático.

El funcionamiento principalmente del buzzer, se basa en la manipulación de un retardo (el que determina la frecuencia de trabajo), y un anidamiento de variables ,semejante en su estructura a un retardo , para el tiempo en que durará sonando el buzzer.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

PRACTICA 13

78

Page 79: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Veamos en el programa su funcionamiento:

BUZZERMOVLW .10MOVWF CONT2 ;VALORES QUE DIRAN POR CUANTO TIEMPO DURARA EL

;BUZZERMOVLW .40MOVWF CONT1

SOUNDBSF PORTA,3CALL RET1MSBCF PORTA,3DECFSZ CONT1,FGOTO SOUNDMOVLW .40MOVWF CONT1DECFSZ CONT2GOTO SOUNDRETURN

Al usar esta subrutina que hace sonar el buzzer ocurre lo siguiente:

Al llamado de esta subrutina, se cargan unos registros, encargados de determinar la duración del sonido (papel que desempeña CONT1 y CONT2).

A partir de la etiqueta SOUND, vemos que se activa el pin de RA3 (1), lo cual activará el buzzer, pero solo le envió corriente, por lo que solo al buzzer solo ha oscilado la mitad, después de lama un retardo, que en el caso dura 1 mS, por lo que al calcular la frecuencia, será de aproximadamente 1KHz.

Después para completar el otro ciclo de oscilación, enviamos un cero por RA3, y luego continua el anidamiento, por lo que a cada decremento, volverá a la etiqueta de sound y se repetirá hasta que CONT1 y CONT2 sean cero, por lo que su duración será lo suficiente para que parezca de duración como la pulsación.

El circuito en general funciona así: cuando existe pulsación en el pin RB0, ,envía un cero al PIC, cual al detectar la pulsación, llama la subrutina del buzzer, ,luego incrementa el contador de 0 a 9 en una unidad.

Es importante observar que no existe retardo de antirrebote, esto es debido a que la subrutina de buzzer consume el tiempo suficiente para ocupar al PIC mientras se disipa el rebote eléctrico.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 79

Page 80: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA DE FLUJO DEL PROGRAMA

NONO

SISI

SINO

NO SI

DIAGRAMA ESQUEMATICO DEL CIRCUITO

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

INICIO

CONFIG DEL PIC, COMPARADORES

PAGADOS.

BORRAR PORTB

BORRAR PORTA

BORRAR CONTA

RB0 = 0?

BUZZER

CONTA +1

CONTA = 10?

BORRA CONTA

CONTA => W

TABLA

W => PORTB

BUZZER

CONT1=> .40CONT2=> .10

1 => RA3

RETAR 1 mS

0=> RA3

CONT1-1

CONT1 = 0?

CONT1 <= .40

CONT2-1

CONT2 = 0?

RETURN

80

Page 81: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

MPLAB PARA USAR EL CONTADOR CON EL BUZZER.

LIST P=16F628INCLUDE <P16F628.INC>

CONTA EQU 20CONT3 EQU 21CONT2 EQU 22CONT1 EQU 23CONT4 EQU 24

ORG 00GOTO INICIOORG 05

TABLA ADDWF PCL,FRETLW B'01111110' ;ENCIENDE EN EL DISPLAY EL CERORETLW B'00001100' ;ENCIENDE EL UNORETLW B'10110110' ;ENCIENDE EL DOSRETLW B'10011110' ;ENCIENDE EL TRESRETLW B'11001100' ;ENCIENDE EL CUATRORETLW B'11011010' ;ENCIENDE EL CINCORETLW B'11111010' ;ENCIENDE EL SEISRETLW B'00001110' ;ENCIENDE EL SIETERETLW B'11111110' ;ENCIENDE EL OCHORETLW B'11011110' ;ENCIENDE EL NUEVE

INICIO MOVLW .7MOVWF CMCON ;INHABILITAMOS LOS COMPARADORESBSF STATUS,RP0 ;SELECCIONA BANCO1MOVLW B'00000001' ;PUERTO RB0 COMO ENTRADAMOVWF TRISBBCF TRISA,3 ;RA3 COMO SALIDA

BCF STATUS,RP0 ;AL BANCO0CLRF PORTA

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

DISPLAY C.C

81

Page 82: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

CLRF PORTBCLRF CONTA

START BTFSC PORTB,0 ;ESTADO DEL PULSADORGOTO $-1 ;VUELVA A PREGUNTAR POR ESTADO HASTA QUE

;SEA CEROCALL BUZZER ;SUBRUTINA PARA HACER SONAR EL BUZZER,

;SERVIRA COMO ANTIRREBOTEINCF CONTA,F ;INCREMENTAMOS EL CONTADOR +1MOVLW .10SUBWF CONTA,W ;PREGUNTAMOS SI YA ES 10, Y EL RESULTADO

;SE DEJA EN W, PARA NO ALTERAR EL ;CONTENIDO DE CONTA

BTFSC STATUS,Z ;FLAG DE CEROCLRF CONTAMOVF CONTA,WCALL TABLAMOVWF PORTBGOTO START

;****************************BUZZER

MOVLW .10MOVWF CONT2 ;VALORES QUE DIRAN POR CUANTO TIEMPO

;DURARA EL BUZZERMOVLW .40MOVWF CONT1

SOUND BSF PORTA,3CALL RET1MSBCF PORTA,3DECFSZ CONT1,FGOTO SOUNDMOVLW .40MOVWF CONT1DECFSZ CONT2GOTO SOUNDRETURN

;**************************RET1MS

MOVLW .3MOVWF CONT3MOVLW .111MOVWF CONT4

LOOP DECFSZ CONT4,FGOTO LOOPMOVLW .111MOVWF CONT4DECFSZ CONT3,FGOTO LOOPRETURNEND

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 82

Page 83: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

MANEJO DE LA MEMORIA EEPROM INTERNA

DEL PIC

En esta familia de microcontroladores la memoria EEPROM de datos puede ser modificada sin necesidad de utilizar un programador exterior y a la tensión nominal de VDD. Es decir, un programa dinámicamente puede generar información que se puede grabar en la memoria.

Se dispone de 4 registros de SFR para leer y escribir sobre la memoria no volátil, estos registros son: EECON1 , EECON2, EEDATA y EEADR . Para direccionar las 128 posiciones de memoria EEPROM de 8 bits del PIC16F628 basta con 8 bit, por ello para escribir o leer en la memoria EEPROM solo hacen faltan el registro EEADR para direccionar la posición y el registro EEDATA para colocar el dato leído o escrito. Además para controlar el proceso de lectura y escritura de la memoria EEPROM dispone de dos registros: el EECON1 y el EECON2.

REGISTROS EECON1 y EECON2

Seguidamente se describen los bit de control de registro EECON1

bit 7:4:No implementados: Se leen como “0”

bit 3: WRERR: Flag de error de escritura en la EEPROM

1 = El proceso de lectura se ha producido prematuramente(se ha producido un Reset por MCLR o un WDT durante el proceso)0 = Se ha producido el proceso de escritura con éxitobit 2: WREN: bit de habilitación de escritura1 = Permite inicializar el ciclo de escritura0 = Inhibe la escriturabit 1: WR: bit de inicio de escritura1 = Cuando se le pone a 1 comienza el ciclo de escritura de la memoria no volátil. (El bit se pone de nuevo a cero por hardware cuando la escritura se completa).0 = Toma este valor cuando completa el ciclo de escritura de la memoria no volátil.bit 0: RD: bit de inicio de lectura1 = Cuando se le pone a 1 se inicia un ciclo de lectura. El bit RD se pone a cero por hardware.0 = no ha comenzado el ciclo de lectura de la memoria no volátil. 

 El registro EECON2, no está implementado físicamente y sólo se utiliza para la operación de lectura, de igual forma que se hace con el PIC 16F84, es decir, antes de iniciar la escritura de un dato en la memoria, se debe escribir en el registro EECON2 primero el dato 55h y posteriormente el dato AAh.

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

--- --- ----- WRERR WREN WR RD Bit 7             Bit 0

PRACTICA 14

83

Page 84: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

Seguidamente se muestran una serie de subrutinas para la escritura y lectura de la memoria no volátil.

SUBRUTINA PARA LA ESCRITURA DE LA MEMORIA EEPROM DE DATOS

WR EEPROM

MOVF DIR,W ;mueve la dirección deseada en la EEPROM

BSF STATUS, RP0 ;Selección del banco 1 de memoria

MOVWF EEADR ;dirección que se quiere acceder

BCF STATUS,RP0 ;BANCO0

MOVF DATO,W ;Dato que se quiere escribir

BSF STATUS,RP0 ;BANCO1

MOVWF EEDATA ;DATO A ESCRIBIR

BCF INTCON, GIE ;Se Prohíben las interrupciones, OPCIONAL

BSF EECON1, WREN ;Habilita la escritura en la EEPROM

MOVLW 55h

MOVWF EECON2 ;Escribe 55h en EECON2

MOVLW AAh;

MOVWF EECON2 ;Escribe AAh en EECON2

BSF EECON1, WR ;Se da la orden de escritura

BTFSC EECON1,WR ;PREGUNTA SI YA TERMINÓ DE WRITE

BCF EECON1, WREN ;Prohibir la escritura de nuevos datos

BCF STATUS,RP0 ;BANCO0

 

 

SUBRUTINA PARA LA LECTURA DE LA MEMORIA EEPROM DE DATOS

RD_EEPROM

movf DIR ;Dirección a leer de EEPROM

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 84

Page 85: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

BCF STATUS,RP0 ;Selección del banco 0 de memoria

MOVWF EEADR ;SE ENVIA DIRECCIÓN AL REGISTRO

BSF EECON1,RD ;Se da la orden de efectuar la lectura

NOP

NOP

MOVF EEDATA,W ;Se recoge el dato leído y se deja en W

BCF STATUS,RP0

MOVWF DATO ;SE DESCARGA EL VALOR EN DATO

 

Para evitar escrituras indeseables en la EEPROM motivadas por espúreos en la inicialización del microcontrolador, se controla el bit WREN del registro EECON1, prohibiendo cualquier operación de escritura mientras duran los 72 ms que temporiza el Timer Power-up.

REGISTROS ASOCIADOS CON LA MEMORIA DE DATOS EEPROM

Leyenda: x = Indeterminado, u = Permanece Invariable, r = reservado; - = No implementado se lee como 0; No se usan las células sombreadas durante el acceso a EEPROM.Nota 1.- Área de memoria reservada; estos bits se mantienen siempre a cero

NUESTRO CIRCUITO

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 85

Page 86: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

  El circuito va a funcionar usando la memoria eeprom , de tal forma que cada vez que pulsamos un interruptor, se incrementará un registro que va de cero a nueve y si quitamos la alimentación y luego la volvemos a colocar, aparecerá en un display manejado por el decodificador 7447, el ultimo numero que visualizamos antes de apagarlo.

El circuito maneja dos posiciones de la memoria eeprom, la de la posición 0x00, se encargara de decirle al programa si hay un numero en memoria, y la dirección 0x01, estará el numero decimal que se almacenó por ultima vez.

La primera posición de memoria (0x00), se escribirá o estará el dato 0x55 indicando que si hay un dato en la memoria, pues normalmente los pics cuando no se ha manipulado esta memoria, estará en el valor de 0xFF, y si el programa cuando lee esta posición y el valor es diferente de 0x55, grabara como numero de arranque 0x00, esto con el fin de asegurar de que se va a mostrar en el display un numero decimal.

El papel de la otra parte de la memoria (dirección 0x01), será la de cada vez que pulsemos el interruptor, incrementará un registro de control, y luego este valor lo almacenará en la memoria eeprom, y así se repetirá este ciclo.

Para la escritura de datos en la eeprom del PIC, se hace uso de subrutinas, ya que esta actividad la haremos muy seguido, y manipularemos dos registros a los que se llamaron DIR para que almacene la dirección de la memoria eeprom a escribir y el registro DATO almacenara el dato a escribir. Ojo recordemos que estos registros están en el banco0, y los de manejo de la eeprom están en el banco1, por lo que en la subrutina se hace este traslado a EEADR Y EEDATA respectivamente, mas detalle en la subrutina.

Para la lectura, enviamos la dirección a leer en el registro al que se llamó DIR, y luego de ejecutada la subrutina, el dato que contenía esta posición llegara desde el registro EEDATA al registro DATO, este manejo también se dio en la misma subrutina anteriormente vista.

DIAGRAMA DE FLUJO DEL PROGRAMA

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

INICIO

CONFIGURACIÓN DEL PIC, APAGAR LOS COMPARADORES

0=> DIR

RD EEPROM

DATO = 0X55?

86

Page 87: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

SI

NO

NO

SI

NO

SI

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

DIR <= 0

0X55 => DATO

WR EEPROM

DIR <=0X01

0X00 => DATO

WR EEPROM

1

1 DIR <=0X01

RD EEPROM

DATO => PORTA

RB0=0?

RETARDO ANTIREBOTE

3

DATO = DATO+1

DATO = 10 ?

4

4

5

BORRAR DATO

DIR => 0X01

WR EEPROM

3

5

RD EEPROM

DIR => EEADR1=> EECON1, RDEEDATA => DATORETURN

WR EEPROM

DIR => EEADR

DATO => EEDATA

1 => EECON1, WREN

0X55 => EECON2

0XAA => EECON2

1 => EECON1,WREECON1, WR = 0?

87

Page 88: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

NO

SI

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72

0 => EECON1, WREN

RETURN

88

Page 89: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

DIAGRAMA ESQUEMATICO DEL CIRCUITO

1kS1

74LS476A32A21A17A0

3test5RBI

14g 15f 9e 10d 11c 12b 13a

4RBO

U2

5V

15pF

15pF4MHz

PIC 16F628

RA2RA3

RA4RA5/MCLRVSSRB0RB1

RB2

RB3 RB4

RB5

RB6RB7VDD

RA6/OSC2

RA7/OSC1RA0

RA1

U1

A

B

C

D

E

F

G

DP

A

BCDEFGDP

COMUN

U3

1k

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 89

Page 90: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

PROGRAMA EN MPLAB PARA LA PRACTICA CON LA MEMORIA EEPROM

LIST P=16F628INCLUDE <P16F628.INC>

CONTA EQU 20CONT3 EQU 21CONT2 EQU 22CONT1 EQU 23CONT4 EQU 24DIR EQU 25DATO EQU 26

ORG 00GOTO INICIOORG 05

INICIO MOVLW .7MOVWF CMCON ;INHABILITAMOS LOS COMPARADORESBSF STATUS,RP0 ;SELECCIONA BANCO1MOVLW B'00000001' ;PUERTO RB0 COMO ENTRADAMOVWF TRISBMOVLW B'11110000'MOVWF TRISA ;PORTA COMO SALIDABCF STATUS,RP0 ;AL BANCO0MOVLW .0MOVWF DIR ;SELECCIONANDO DIRECCION EEPROMCALL RDEEPROM ;SUBRUTINA PARA LEER LA EEPROM, RETORNA

;INFORMACIONMOVLW .55 ;EN EL REGISTRO DATOSUBWF DATO,W ;COMPARA SI ES 55,REFERENCIA PARA SABER SI

;HABIA GUARDADO ALGUN DATOBTFSS STATUS,ZGOTO FLAG

GRABAS1 MOVLW .1MOVWF DIR ;SE APUNTA A LA DIRECCION DEL ULTIMO DATO

;ESCRITOCALL RDEEPROM ;LEERÁ LA EEPROM PARA CARGAR EL ULTIMO

;VALORCARGA MOVF DATO,W ;CONTENIDO DE DATO A W

MOVWF PORTA ;MUESTRA DATO EN DISPLAYBTFSC PORTB,0 ;LEE ESTADO DEL PULSADOR, ESPERA QUE SEA

;CEROGOTO $-1CALL REANTIR ;RETARDO DE ANTIREBOTE DEL PULSADORINCF DATO,F ;INCREMENTA VALOR DE DATO +1MOVLW .10SUBWF DATO,W ;SI DATO ES IGUAL A 10BTFSC STATUS,Z ;SI ES 10 BORRE Y VUELVA A CEROCLRF DATOMOVLW .1 ;DIRECCION DE LE EEPROM PARA SALVAR ESTE

;NUEVO VALORMOVWF DIRCALL WREEPROM ;SUBRUTINA PARA GUARDAR ACTUALIZACION DE

;DATO GOTO CARGA ;VUELVA A CARGA PARA QUE ESPERE OTRA

;PULSACION

;******************************

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 90

Page 91: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

FLAGMOVLW .0MOVWF DIR ;DIRECCION DE LA EEPROMMOVLW .55 ;DATO DE REFERENCIA PARA SABER AHORA

;QUE SI HAY DATO ESCRITOMOVWF DATO ;DATO A ESCRIBIR EN LA EEPROMCALL WREEPROM ;SUBRUTINA PARA ESCRIBIR EN LA EEPROMMOVLW .1 ;DIRECCION DE LA EEPROMMOVWF DIR ;POSICION EN DONDE SE ALMACENA EL ULTIMO

;DATO ESCRITOMOVLW .0 ;DATO DE ARRANQUE, SERA DE CEROMOVWF DATOCALL WREEPROM ;ESCRIBE EN LA EEPROM EL CONTENIDO DE DATOGOTO GRABAS1

;***********************************REANTIR

MOVLW .3MOVWF CONT3MOVLW .180MOVWF CONT2MOVLW .200MOVWF CONT1DECFSZ CONT1,F ;DECREMENTE LA VARIABLE CONT1-1 SALTA

;CUANDO LLEGA A 0GOTO $-1 ;$-1 SIGNIFICA QUE RETROCEDA UNA LINEA

;ANTESMOVLW .200MOVWF CONT1 ;SE RECARGA NUEVAMENTE EL REGISTRO POR EL

;ANIDAMINETODECFSZ CONT2,F ;DECREMENTE LA VARIABLE CONT2-1 SALTA

;CUANDO LLEGA A CEROGOTO $-5 ;$-5 RETROCEDE 5 LINEAS EN EL PROGRAMAMOVLW .180MOVWF CONT2 ;SE RECARGA CONT2 POR EL ANIDAMIENTODECFSZ CONT3,FGOTO $-9 ;RETROCEDE 9 LINEAS EN EL PROGRAMARETURN ;CUANDO CONT3 SEA CERO RETORNA DE DONDE SE

;LLAMÓ;******************************RDEEPROM ;SUBRUTINA PARA LEER DATO DE LA EEPROM

MOVF DIR,WBSF STATUS,RP0 ;BANCO1MOVWF EEADR ;DIRECCION AL REGISTRO DE DIRECCIONAMIENTOBSF EECON1,RD ;COMANDO DE QUE LEA LA POSICION ASIGNADANOPNOP ;NOPS PARA ASEGURAR UNA CORRECTA LECTURAMOVF EEDATA,W ;EL DATO LEIDO SE MUEVE A WBCF STATUS,RP0 ;BANCO0MOVWF DATO ;EL DATO LEIDO QUEDA EN EL REGISTRO DATORETURN

;********************************WREEPROM

MOVF DIR,W ;MOVEMOS LA DIRECCION A WBSF STATUS,RP0 ;BANCO1MOVWF EEADR ;SE CARGO LA DIRECCIONBCF STATUS,RP0 ;BANCO0MOVF DATO,W ;DATO A ESCRIBIR A wBSF STATUS,RP0 ;BANCO1MOVWF EEDATA ;CARGO DATO A EEDATA

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 91

Page 92: pic= 16F628

NIVEL 1 PIC 16F628 TEORIA Y PRACTICA

BSF EECON1,WREN ;SE HABILITA LA ESCRITURAMOVLW 0X55 ;CARGA A W 55MOVWF EECON2 ;PASO REQUERIDO POR MICROCHIP PARA

;ESCRIBIRMOVLW 0XAA ;CARGA A W CON AAMOVWF EECON2 ;PASO REQUERIDO POR MICROCHIP PARA

;ESCRIBIRBSF EECON1,WR ;COMANDO DE ESCRIBIR, PUEDE DEMORARSE

;HASTA 10MSBTFSC EECON1,WR ;ESTE BIT SE PONE A CERO CUANDO YA TERMINA

;LA ESCRITURAGOTO $-1 ;ESPEREBCF EECON1,WREN ;INHABILTA LA ESCRITURABCF STATUS,RP0 ;BANCO CERO DESPUED DE FINALIZADA LA

;ESCRITURARETURNEND

DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 92