Este documento describe el conjunto de instrucciones del microcontrolador PIC16F628. Incluye cinco categorías de instrucciones: 1) instrucciones de byte que operan con registros, 2) instrucciones de byte que operan sobre W y literales, 3) instrucciones de bit, 4) instrucciones de control como GOTO y CALL, y 5) descripciones de los pines y bancos de registros del PIC16F628. Explica cada instrucción y cómo afectan los bits de estado.
NTP- Determinación de Cloruros en suelos y agregados (1) (1).pptx
pic-16F628 generalidades y prog 1y2.pdf
1. 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
RB6 / T1OSO / T1CKI 12 E/S/P TTL
RB7 / T1OSI 13 E/S/P TTL
VSS 5 P ----
VDD 14 P ----
DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 1
2. NIVEL 1 PIC 16F628 TEORIA Y PRACTICA
BANCOS DE REGISTROS DEL PIC 16F628
DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 2
3. NIVEL 1 PIC 16F628 TEORIA Y PRACTICA
CONJUNTO DE INSTRUCCIONES
El 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
4. 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
5. 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
6. 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
7. 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
8. 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
9. 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
10. 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
11. NIVEL 1 PIC 16F628 TEORIA Y PRACTICA
ENCENDER UN LED A TRAVES DEL PUERTOB DEL PIC
Puertos de Entrada y Salida
La 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 principal
El 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
12. 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
13. 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 f
Ejemplo: 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 f
Ejemplo: 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 LED
Como 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
14. 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
15. NIVEL 1 PIC 16F628 TEORIA Y PRACTICA
PROGRAMA PARA ENCENDER UN LED CON EL PIC 16F628
LIST P=16F628
INCLUDE <P16F628.INC>
ORG 00
GOTO INI
ORG 05
INI BSF STATUS,RP0 ;IREMOS AL BANCO1
BCF TRISB,7 ;EL PUERTO RB7 ESTARA COMO SALIDA
BCF STATUS,RP0 ;DEVUELTA AL BANCO0
CLRF PORTB ;PARA BORRAR EL PUERTO Y QUEDE EN CEROS
BSF PORTB,7 ;ENVIA UN 1(5V) A RB7 PARA ENCENDER LED
GOTO $ ;EL CONTADOR DEL PROGRAMA SE QUEDARÁ AQUI
END
DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 15
16. 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
17. NIVEL 1 PIC 16F628 TEORIA Y PRACTICA
RETARDO MOVLW .255 ;Se carga un registro CONTADOR
MOVWF 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 vez
RETURN ;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 = 1µseg.
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
¿CONTADO
R
= 0 ?
RETORNAR
SI
NO
18. 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
19. 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 fin , si no continué decrementando hasta que sea cero
MOVLW D`05
MOVWF NUMERO
SIGUE DECFSZ NUMERO,1
GOTO SIGUE
GOTO 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
20. NIVEL 1 PIC 16F628 TEORIA Y PRACTICA
DIAGRAMA DE FLUJO PARA EL LED INTERMITENTE
DIAGRAMA ESQUEMATICO DEL CIRCUITO
DIGIT ELECTRONIC CRA 9 23 – 49 LOCAL 207 TEL 2 86 36 72 20
CONFIGURACIÓN
DEL PUERTO
ENCENDER LED
LLAMAR RETARDO
LLAMAR RETARDO
APAGAR EL LED
INICIO
LIMPIAR PORTB