Beruflich Dokumente
Kultur Dokumente
CURSO INTEGRAL
PIC
Disfrtenlo!!!!!
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
CURSO INTEGRAL
PIC
Captulo 1
Introduccin a los microcontroladores PIC
el PIC (en este caso un PIC16F84A) posee una apariencia externa que no lo
diferencia de otro integrado TTL o CMOS, pero internamente dispone de todo lo
correspondiente a un sistema de microprocesadores:
* Una CPU (Central Processor Unit) la cual es la unidad central que esta en
capacidad de interpretar las instrucciones del programa.
* Una memoria FLASH en donde se memoriza de manera permanente las
instrucciones del programa a seguir.
* Una memoria RAM (Random Access Memory) utilizada para memorizar las
variables utilizadas en el programa.
* Una serie de lneas de I/O (Input/Output) que permite el ingreso y la lectura de
dispositivos externos o para recibir seales de sensores, pulsadores, etc.
* Una serie de dispositivos auxiliaries al funcionamiento como la generacin de reloj,
buses, contadores, etc.
La presencia de todos estos dispositivos en un espacio tan supremamente reducido,
nos proporciona una gran ventaja frente a sistemas basados en microprocesadores.
Los microcontroladores PIC se encuentran disponibles en una amplia gama de
modelos, que se diferencian por el nmero de lneas I/O y los perifricos internos del
dispositivo.
Cada modelo posee su referencia, los ms bsicos se identifican por las siglas
PIC12C5xx y solo poseen 8 pines, y los ms avanzados se identifican por la sigla
PIC18Cxx y est dotados de hasta 40 pines.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Parta este curso vamos a trabajar con los PIC16F84A, los cuales estn dotados de 18
pines.
Los pines mostrados en azul corresponden a pines I/O diponibles para nuestra
aplicacin, los pines en rojo y negro corresponden a los de alimentacin y los verdes
son reservados para el funcionamiento del microcontrolador (MCLR para el reset, y
los OSC1-2 son para el reloj).
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
ATENCION
Gracias a la circuitera interna del reset interna del microcontrolador, no es necesario
colocar un pulsador para el reset o un circuito RC, pero nunca est dems.
El pin OSC1/CLKIN (pin 16) y el pin OSC2/CLKOUT (pin 15) se conectan con un
circuito interno que genera la frecuencia de reloj utilizada para temporizar todo el
ciclo de funcionamiento interno en el chip. De esta frecuencia depende casi todas las
operaciones internas del microcontrolador, especialmente la velocidad con que el PIC
ejecuta las instrucciones del programa.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
El pin RB0 (pin 6) es la lnea I/O que vamos a utilizar para este primer ejercicio. All
se encuentra conectada una resistencia para limitar la corriente y un LED.
Cada instruccin se representa por un cdigo operative (en ingles operation code o
abreviadamente opcode) compuesto de 14 bits y que se memoriza en una posicin
de la memoria donde se almacena el programa. En el PIC16F84A posee 1024
posiciones de memoria y el PIC16f877 posee 8K, cada una de las cuales puede
contener una sola instruccin o un dato.
0x100
El opcode 0x100 del ejemplo anterior, efecta el borrado del registro W (enseguida
veremos que significa esto) que en ingles viene indicado con la frase CLEAR W
REGISTER, o sea, borrar el registro W, o en su forma abreviada CLRW. Una
secuencia de estas siglas de acuerdo a ciertas reglas, forman un programa completo
en LENGUAJE ENSAMBLADOR.
5
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Es posible generar este archivo desde un programa sofisticado como WORD o Star
Office, pero no lo recomiendo mucho, debido a que el formato nativo de estos
programas es .DOC, lo cual puede traer algunos problemas en el formato de los
programas que el compilador puede entender.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Como se muestra en la figura anterior, adems del archive .ASM, es necesario otro
archivo .INC, el cual es proporcionado por la Microchip. En el caso del PIC84 se
denomina P16F84.INC. Este archivo contiene las definiciones del chip utilizado.
Los archivos .LST y .ERR sirven para controlar lo hecho en la compilacin. Solo el
.HEX se utilize para programar el microcontrolador.
RADIX DEC
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
La directiva RADIX sirve para informar al compilador cual es la notacin por defecto
que van a tener los diferentes nmeros que se escriban dentro del programa. En este
caso, debido a la palabra DEC, establecemos que los valores numricos se deben
entender como decimales.
ERRORLEVEL -302
Esta directiva sirve para excluir algunos mensajes de error resultantes de la
compilacin. En este caso sirve para evitar que el compilador arroje estos dos tipos
de errores:
Message[302] C:\EPIC\LED.ASM 37 :
Register in operand not in bank 0.
Ensure that bank bits are correct.
Message[302] C:\EPIC\LED.ASM 40 :
Register in operand not in bank 0.
Ensure that bank bits are correct.
INCLUDE "P16F84.INC"
Esta es una directiva muy importante y que vamos a utilizar mucho en nuestros
programas.
Con esta directiva le manifestamos al compilador nuestra intencin de incluir un
segundo archivo a nuestro cdigo fuente denomiando P16F84.INC. El compilaador se
limitar a sustituir la lnea que contiene la directiva INCLUDe con el contenido del
archivo especificado.
LED EQU 0
Otra directiva ! Cuando entraremos a las instrucciones ? Paciencia mi amigo,
paciencia....
La directiva EQU es muy importante, pues nos permite constantes simblicas dentro
de nuestro programa. En este caso la palabra LED en cualquier punto del programa
ser equivalente al valor 0.
El objetivo principal de la directiva EQU es facilitar la lectura y entendimiento de los
programas a un lector desprevenido. Es muy utilizada cuando manejemos banderas,
ms adelante explicaremos este concepto.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Esta rea no es otra cosa que la localizacin de la RAM disponible para el usuario y
se encuentra a partir de la direccin 0x0C. Las direcciones de memoria anterioras a
esta no pueden ser utilizadas como casillas de memoria de propsito generalm pues
all se han asignado previamente otros registros especializados para uso interno del
microcontrolador.
Count RES 2
En esta lnea encontramos una etiqueta: Count y una directiva: RES.
La directiva RES le indica al compilador que queremos reservar un cierto nmero de
bytes en el interior del rea de datos; en este caso 2 bytes.
La etiqueta Count, donde Count es un nombre, es una marcacin que en el resto del
cdigo fuente asumir el valor de la direccin donde se ha insertado. Dado que
previamente habamos definido como direccin de inicio la 0x0C (con la directiva
ORG), Count partir desde 0x0C. Si por ejemplo, insertamos una etiqueta en la lnea
inmediatamente sucesiva, esa variable se ubicar en 0x0C + 2, es decir 0x0E.
Una etiqueta se distingue de una constante simblica porque su valor viene calculado
en la fase de compilacin.
ORG 0x00
Esta segunda directiva nos permite sealar una direccin en el rea de la memoria
de programa (FLASH). Desde all se alamacenarn las instrucciones mnemonicas que
el compilador deber convertir em opcodes para el PIC. El primer opcode que el
microcontrolador va a seguir despus de un RESET se memoriza en la posicin 0, por
eso es el valor 0x00 escrito en la ORG.
bsf STATUS,RP0
Al fin la primera instruccin mnemnica completa. El microcontrolador PIC posee una
CPU interna de tipo RISC, donde cada una de sus instrucciones ocupa una sola
posicin de memoria, opcode e incluso parmetros.
En este caso la instruccin bsf (BIT SET FILE REGISTER) pone un uno (estado lgico
alto) el bit contenido en la posicin de RAM especificada. El parmetro STATUS viene
definido en el archivo P16F84.INC a travs de una directiva EQU.
10
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
movlw B'00011111'
Esta instruccin significa: MOVE LITERAL TO W REGISTER, es decir, mueva un valor
constante hacia el acumulador.
En la instruccin siguiente:
movwf TRISA
el valor 00011111 se memoriza en el registro TRISA (al igual que el registro
STATUS, TRISA esta definido en el mismo archivo inc mediante otra directiva EQU)
el cual define el funcionamiento de cada una de las lneas I/O del puerto A.
En particular, cada bit en uno del registro TRISA configura como entrada la
respectiva lnea del puerto A, mientras un 0 lo configura como salida.
En la siguiente tabla se muestra la configuracin realizada en el PIC despus de
ejecutada esta instruccin:
Como podemos ver, los bits 5, 6 y 7 no corresponde a ninguna lnea I/O por lo tanto
el valor con que se configuren no importa.
11
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Las dos instrucciones que siguen determinan el funcionamiento del puerto B del
microcontrolador:
movlw B'11111110'
movwf TRISB
En este caso la definicin de las lneas ser la siguiente:
Note como el valor 0 en el bit 0 del registro TRISB determina la configuracin como
salida de la respectiva lnea del PIC.
En nuestra aplicacin esta lnea se utiliza para manejar el LED.
bcf STATUS,RP0
Esta instruccin es muy similar a la bsf vista en uno de los prrafos anteriores. La
diferencia es que en este caso el bit respectivo se pone en uno. La sigla en este caso
quiere decir (en ingls) BIT CLEAR FILE REGISTER.
Desde el punto de vista funcional de este programa, esta instruccin nos permite el
acceso a los registros internos del banco 0. Una descripcin ms detallada de este
proceso lo veremos ms adelante.
bsf PORTB,LED
Con esta instruccin llevamos a cabo la primera operacin en el entorno externo del
PIC, especificamente en la lnea RB0 del integrado. PORTB es una constante definida
en el archivo P16F84.INC que nos permite referenciar el registros correspondiente a
las lneas I/O del puerto B. En cuanto a la palabra LED, recordemos que al inicio del
programa la definimos como 0, por lo que en esta lnea nos estamos refiriendo a la
lnea RB0.
12
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
MainLoop
Esta lnea contiene una etiqueta esto es, una referencia simblica hacia una posicin
de memoria. EL valor de la etiqueta se calcula en la fase de compilacin en base al
nmero de instruccin, a la directiva ORG y a la instruccin que hace reservar
espacio en la memoria del micro. En este caso, si contamos las instrucciones
insertadas a partir de la ltima directiva ORG podriamos calcular que el valor que se
asignar a MainLopp ser 0x07.
El valor que asume la etiqueta es importante pues su objetivo real es el de conocer
la posicin precisa su opcode en la memoria del PIC permitiendo referenciarla en una
determinada posicin de memoria.
En este caso la etiqueta MainLoop se utiliza como punto de ingreso a un ciclo ( del
ingls loop) de encendido y apagado de un LED, es decir, una porcin de cdigo que
se repetir cclica e idefinidamente.
call Delay
Esta instruccin determina una llamada (de ingles call) a una subrutina que inicia en
correspondencia con la etiqueta Delay.
La subrutina es una parte del programa especializada en una funcin muy especfica
que pueda necesitarse repetidamente dentro de un programa. Cada vez que
necesitemos ejecutar esta funcin basta invocar la funcin. En este caso la subrutina
inserta un retardo para darle tiempo al LED de prendido y apagado. Las instrucciones
que componen la subrutina Delay se encuentran ms adelante en el cdigo fuente.
btfsc PORTB,LED
El significado de esta instruccin es BIT TEST FLAG, SKIP IF CLEAR, es decir,
controla el estado de un bit interno de un registro y se salta la instruccin sucesiva si
el valor de dicho bit es cero. El bit que estamos controlando corresponde a la salida
en donde se encuentra conectado el LED. A travs de este test podemos determinar
el estado del led para poder invertirlo, es decir, si se encuentra apagado se prende y
si se encuentra prendido se apaga.
goto SetToZero
Esta instruccin es un salto incondicional (del ingls GO TO, ir a) a la etiqueta
SetToZero donde tenemos las instrucciones para prender el led. Esta instruccin se
saltar las instrucciones sucesivas que sirven para apagar el led.
bsf PORTB,LED
goto MainLoop
Esta dos instrucciones activan el led y retorna el programa al ciclo de parpadeo.
SetToZero
bcf PORTB,LED
goto MainLoop
Esta dos instrucciones apagan el led y retorna el programa al ciclo de parpadeo.
La subrutina Delay
Como se dijo anteriormente, esta subrutina inserta un retardo de casi un segundo y
puede ser llamada desde nuestro cdigo fuente mediante la instruccin call Delay.
Veamos como funciona:
13
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
retlw 0
Delay y DelayLoop son dos etiquetas. Delay identifica la direccin de inicio de la
subrutina y se utiliza para llamar el cuerpo principal del programa. DelayLoop se
invoca internamente dentro de la subrutina y sirve como punto de entrada al ciclo (
del ingls loop) de retardo. En la prctica el retardo se obtiene ejecutando una serie
de instrucciones que no hacen absolutamente nada!
Este tipo de retardo se denomina retardo por software o retardo por programa. Es el
tipo de retardo mas sencillo de implementar y puede ser utilizado cuando podemos
darnos el lujo de que el PIC no tenga que ejecutar otras tareas mientras se
encuentra desarrollando el retardo.
Las instrucciones:
clrf Count
clrf Count+1
CLEAR FILE REGISTER, borran las dos posiciones de RAM que se han reservado
previamente mediante la instruccin:
Count RES 2
Estas dos posiciones son consecutivas y se ubican paratir de la direccin referenciada
por la etiqueta Count.
decfsz Count,1
Esta instruccin significa DECREMENT FILE REGISTER, SKIP IF ZERO, es decir,
decrementa el contenido de un registro (en este caso Count) y se salta la siguiente
instruccin si el valor obtenido es cero. Si el valor obtenido no es cero, se ejecuta la
instruccin consecutiva:
goto DelayLoop
Nos dirige hacia la ejecucin de un ciclo de retardo. Una vez el contador Count ha
llegado a cero, se tienen las instrucciones:
decfsz Count+1,1
goto DelayLoop
que decremetan el registro siguiente hasta que este llegue a cero. El registro
Count+1 en particular se decrementer en una unidad por cada 256 decrementos de
Count. Cuando Count+1 llegue a cero se ejecuta la instruccin:
return
el significado de esta instruccin es RETURN FROM SUBROUTINE, es decir, nos dar
la salida de la rutina de retardo y la posibilidad de continuar con la ejecucin de la
instruccin consecutiva a la instruccin call Delay.
Para finalizar END es una directiva que indica al compilador el fin del cdigo en
asembler.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
15
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Todos los ejercicios analizados en este curso a exepcin del manejo del tiempo real,
utilizan la siguiente configuracin:
16
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
17
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
El software del programador est escrito en C para DOS, y puede ejecutarse desde
un prompt o lnea de comandos DOS en el ambiente Windows 3.1/95/98 y en
mquinas que poseen procesadores Intel de 286 en adelante.
Interfaz interactiva
Acepta la variedad de familias de microcontroladores PIC 16xxx
Lectura y escritura de archivos en formato IN8HEX
Chequeo de memoria vaca
18
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Instalacin de la tarjeta
PC
Programador prototipo
Para la conexin con el prototipo, la tarjeta cuenta con un conector de seis pines,
cada uno de los cuales deben ser conectados con el PIC objetivo as:
1. MCLR.
2. DATA. Por este pin van los datos de programacin y debe conectarse al pin RB7
del PIC objetivo.
3. CLOCK. Es la seal de reloj, debe conectarse al pin RB6 del PIC a programar.
4. GND. Es la tierra del programador, debe conectarse a la tierra del prototipo.
5. KEY.
6. VCC. En este pin van los voltajes de programacin. Debe conectarse a los pines
12,6 o 14,6 del PIC.
19
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Para instalar el programa debe crear una carpeta en el disco duro del computador
llamada WELGOS y copiar los archivos en esta carpeta, no altera ningn registro de
Windows y de la misma manera, para desinstalarlo solo basta borrar el archivo.
Si la conexin con la tarjeta y el cable serial est bien instalado, se podr entrar al
pantallazo inicial del programa:
En este pantallazo se indica el PIC actualmente seleccionado, el contenido del buffer
de memoria ( si este an no se ha cargado aparecer el aviso de no definido) , la
palabra de configuracin y un men de opciones. Para seleccionar cada una de las
posibilidades de este men, basta con teclear la letra que se encuentra a la izquierda
de cada opcin entre parntesis, a continuacin analicemos cada uno de los items de
este men.
Leer PIC
Al oprimir la tecla R, se puede leer el contenido de la memoria del micro. Este
proceso se demora unos cuantos segundos. Al cabo de ls cuales aparece un nuevo
men, en el cual aparecen nuevas opciones. La lectura del programa del chip a
quedado almacenado en un espacio de memoria llamado la imagen de entrada.
Entre las nuevas opciones que aparecen se encuentran la de abrir un archivo de
disco, la de escribir en el PIC, establecer palabra de configuracin.
40
20
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Mostrar Buffer
En el buffer se encuentra almacenado un programa en hexadecimal, el cual puede
provenir de la lectura del PIC o de un archivo grabado en disco. Este buffer se puede
visualizar con esta opcin, con la cual se muestran todas las direcciones de
memoria y su contenido.
Con esta opcin se realizan una serie de pruebas para comprobar que la tarjeta est
funcionando correctamente. Aqu se entra a un nuevo men en el cual se permite
variar los voltajes del conector que va hasta el pic objetivo.
Se muestran cinco tipos de pruebas distintas las cuales modifican los voltajes en
cada uno de los pines del conector, de manera que si el aparato presenta alguna falla
en la programacin, el usuario puede llevar a cabo estas pruebas con un multmetro.
21
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
22
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;**************************************************
; Programa
; LED.ASM
;
;
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
ERRORLEVEL -302
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 0x3FF1
LED EQU 0
ORG 0x0C
Count RES 2
;Reset Vector
;Start point at CPU reset
ORG 0x00
bsf STATUS,RP0
movlw B'00011111'
movwf TRISA
movlw B'11111110'
movwf TRISB
bcf STATUS,RP0
bsf PORTB,LED
MainLoop
call Delay
btfsc PORTB,LED
goto SetToZero
bsf PORTB,LED
goto MainLoop
SetToZero
bcf PORTB,LED
goto MainLoop
;Subroutines
;Software delay
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END
23
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
LIST
; P16F84.INC Standard Header File, Version 2.00 Microchip Technology,
Inc.
NOLIST
; This header file defines configurations, registers, and other useful
bits of
; information for the PIC16F84 microcontroller. These names are taken to
match
; the data sheets as closely as possible.
; Note that the processor must be selected before this file is
; included. The processor may be selected the following ways:
; 1. Command line switch:
; C:\ MPASM MYFILE.ASM /PIC16F84
; 2. LIST directive in the source file
; LIST P=PIC16F84
; 3. Processor Type entry in the MPASM full-screen interface
;=======================================================================
===
;
; Revision History
;
;=======================================================================
===
;Rev: Date: Reason:
;2.00 07/24/96 Renamed to reflect the name change to PIC16F84.
;1.01 05/17/96 Corrected BADRAM map
;1.00 10/31/95 Initial Release
;=======================================================================
===
;
; Verify Processor
;
;=======================================================================
===
IFNDEF __16F84
MESSG "Processor-header file mismatch. Verify selected processor."
ENDIF
;=======================================================================
===
;
; Register Definitions
;
;=======================================================================
===
W EQU H'0000'
F EQU H'0001'
;----- Register Files---------------------------------------------------
---
INDF EQU H'0000'
TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
EEDATA EQU H'0008'
EEADR EQU H'0009'
PCLATH EQU H'000A'
INTCON EQU H'000B'
OPTION_REG EQU H'0081'
24
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
CURSO INTEGRAL
PIC
Captulo 2
Arquitectura interna del PIC16F84A
26
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
27
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
La capacidad de memoria en este caso es de 1024 posiciones, cada una de las cuales
puede contener un cdigo operativo (opcode) de 14 bits, es decir, una instruccin del
microcontrolador, por lo tanto el microcontrolador puede almacenar un programa de
1024 instrucciones.
Las direcciones reservadas para la memoria de programa van desde la 0x000 hasta
la 0x3FF (0x3FF en hexadecimal equivale a 1023 en decimal).
ORG 0x00
Para sealizar el inicio del programa. Esta directiva establece el hecho de que la
ejecucin del programa despus de un reset parte desde la direccin 0x000 del rea
de memoria de programa. Despus de la directiva ORG 0x00 se tiene:
bsf STATUS,RP0
que ser la primera instruccin que se ejecuta enseguida.
28
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
ORG 0x0C
Indica la direccin de inicio del rea
de datos de nuestro programa. La
directiva siguiente:
Count RES 2
Reserva un espacio de dos
posiciones, que el programa utilizar oara memoriza el contador de retardo de la
subrutina Delay.
Los registros especializados del PIC se utilizan de un modo diferente dentro del
programa.
Por ejemplo, se recurre a la copia del registro especializado TRISA (0x85) y TRISB
(0x86) para definir cuales de las lneas I/O son entradas y cuales sern salidas. El
estado lgico de las lneas I/O dependen del valor de los registros PORTA (0x05) y
PORTB (0x06). Algunos registros sirven para reportar el estado del funcionamiento
de los dispositivos internos del microcontrolador o el resultado de operaciones
aritmticas y lgicas. Es necesario conocer exactamente cual es la funcin de cada
uno de los registros especializados y cual es el efecto que se obtiene de manipular
sus contenidos. Para facilitar la manipulacin de los registros especializados,
29
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
2.3 La ALU
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
circuitera necesaria para llevar a cabo las funciones de calculo y manipulacin de los
datos durante la ejecucin del programa.
La ALU del PIC16F84A puede operar con valores de 8 bit, es decir valores
numricos hasta 255. Existen microprocesadores con una ALU de 16, 32, 64, y ms.
La familia Intel 80386, 486 y Pentium por ejemplo, disponen de una ALU de
32 bits. Naturalmente estos microprocesadores poseen una capacidad de clculo
muy superior a los PIC.
31
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
32
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Una de estas instrucciones es la GOTO (del ingls GO TO, ir a), la cual nos permite
cambiar la secuencia de la ejecucin y saltar directamente a otro punto de la
memoria de programa y continuar la ejecucin desde ese punto.
Miremos un ejemplo:
ORG 0x00
Point1
movlw 10
goto Point1
Durante este ciclo o lazo (loop) para determinar cual es la instruccin siguiente que
se debe ejcutar, el PIC utiliza un registro especial denominado el Contador de
Programa (PROGRAM COUNTER, PC) el cual posee la direccin de la prxima
instruccin que se debe ejecutar.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
goto Point1
Point2
movlw 11
return
En este caso el PIC despus de ejecutar MOVLW 10, pasa a la instruccin CALL
Point2. Antes de saltar memoriza en la pila la direccin 0x002, que es la direccin
que le sigue a la direccin donde se encuentra CALL. Luego se ejecuta la instruccin
MOVLW 11 y la instruccin RETURN (del ingls retorno). Esta instruccin, como su
nombre lo indica, permite retornar a la instruccin siguiente desde donde se invoc
a CALL, es decir, al punto exacto donde se abond el flujo normal del programa,
acudiendo a la informacin almacenada en la pila.
La pila recibe ese nombre debido a que en realidad lo podemos asemejar a una
canasta donde apilamos, una sobre otra, distintas direcciones de retorno que se
deben recuperar en un programa, debido al uso de una o varias instrucciones CALL.
Este tipo de memorizacin se denomina LIFO (Last In First Out), en donde el ltimo
elemento almacenado (last in) es necesariamente el primero en salir ( First Out).
Gracias a esta caracterstica, es posible efectuar una serie de instrucciones CALL
anidadas sin perder el flujo normal en el momento en que se encuentre una
instruccin RETURN.
34
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Las lneas utilizadas son RB0 para el primer LED, RB1 para el segundo, RB2 para el
tercero y RB3 para el cuarto. Estos pines debe ser configurados como salidas en el
inicio del programa cambiando las siguientes instrucciones:
movlw B'11111110'
movwf TRISB
por
movlw B'11110000'
movwf TRISB
35
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
en donde los cuatro bits menos significativos, corresponden a las lneas RB0, RB1,
RB2 y RB3. las cuales se configuran como salidas.
En el rea de memoria del archivo de registros (en el cdigo fuente inicia con la
directiva ORG 0x0C) de nuevo se tienen dos bytes reservados para la variable Count
y se reservan otros dos para la etiqueta Shift, la cual utioizaremos para determinar
la secuencia del movimiento del LED. La directiva adicionada es:
Shift RES 1
movf Shift,W
movwf PORTB
para efectuar el secuenciamiento de la iluminacin de los LED necesitamos rotar el
contenido del registro Shift, con las siguientes instrucciones :
bcf STATUS,C
rlf Shift,F
la primera instruccin borra el bit CARRY del registro de estado, esto se analizar en
la siguiente leccin. La instruccin RLF (Rotate Left F through Carry: rota el registro
a travs del carry) se encarga de rotar hacia la izquierda el contenido del registro. Es
decir, el bit de la posicin 7 pasa a la posicin 6, el de la posicin 6 pasa a la cinco y
as sucesivamente. El bit 0 pasa a ocupar el bit de carry (acarreo) que es un bit
pertenciente a un registro de la CPU denominado STATUS (estado) y el contenido del
carry pasa al bit 7. Es por esta razn que inicialmente borramos el contenido del
carry mediante la instruccin BCF STATUS,C.
Cuando el bit 4 de Shift valga 1, podemos deducir que ya se han activado los cuatro
LED, por lo tanto debemos repetir el ciclo para que se vuelva a ctivar el LED 1.
Miremos las siguientes instrucciones:
btfsc Shift,4
swapf Shift,F
La instruccin BTFSC Shift,4 detecta el momento en que el bit 4 del registro Shift
vale 1. Si detecta un cero se salta la instruccin siguiente que en este caso es
SWAPF Shift,F.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;**************************************************
; Curso integral de microcontroladores Pic
; SEQ.ASM
;
; (c) 2003, WELGOS electronica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
ERRORLEVEL -302
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 0x3FF1
ORG 0x0C
Count RES 2
Shift RES 1
;Reset Vector
;Program start point at CPU reset
ORG 0x00
bsf STATUS,RP0
movlw B'00011111'
movwf TRISA
movlw B'11110000'
movwf TRISB
bcf STATUS,RP0
movlw B'00000001'
movwf Shift
MainLoop
movf Shift,W
movwf PORTB
bcf STATUS,C
rlf Shift,F
btfsc Shift,4
swapf Shift,F
call Delay
goto MainLoop
; Subroutines
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END
CURSO INTEGRAL
PIC
Captulo 3
37
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Las lneas de cada uno de los puertos poseen una arquitectura interna determinada
dentro del microcontrolador. Para la gestin de la lneas I/O, el PIC dispone de dos
registros internos, uno para cada puerto. Ellos se denominan TRISA para determinar
el funcionamiento del puerto A y el registro TRISB para configurar el puerto B.
38
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Cada uno de los bits contenidos en los registros anteriores tienen una
correspondencia unvoca con una de las lneas I/O. Por ejemplo, el bit 0 del registro
PORTA y del regsitro TRISA corresponde a la lnea RA0, el bit 1 a la lnea RA1 y as
sucesivamente.
Si el bit 0 del regsitro TRISA se pone en cero, la lnea RA0 se configura como salida y
el valor que se ponga en el bit 0 de PORTA se ver reflejado en el estado lgico de
dicha lnea (0= 0 voltios, 1 = 5 voltios).
Si en el bit 0 del registro TRISA se pone un uno, la lnea RA0 se configurar como
entrada, en este caso, el estado lgico depender de la circuitera externa conectada
a la lnea RA0 y dicha entrada externa se ver reflejasa en el estado del bit 0 del
registro PORTA.
movlw 00010000B
tris B
estamos poniendo un 0 en el bit 0 (RB0 como entrada) y un 1 en el bit 4 (lnea RB4)
para que sea una entrada. Si recordamos la notacin binaria del lenguaje
ensamblador, podremos recordar que el bit menos significativo corresponde al bit 0
(el que se encuentra en la primera posicin de derecha a izquierda).
btfss PORTB,4
goto SwitchAMassa
goto SwitchAlPositivo
39
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
La salida Q del TRIS latch se conecta a la entrada de una compuerta lgica OR. Esto
significa que, independientemente del valor presente en la otra entrada, la salida de
la compuerta OR siempre ser 1. En esta condicin el transistor P se activa y
mantiene la lnea RA0 conectada al positivo de la alimentacin.
40
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
La salida negada del TRIS latch se conecta a la entrada de una compuerta AND, cuya
salida siempre valdr cero debido a que una de sus entradas esta en cero. En esta
condicin el transistor N no se activar y mantendr la lnea RA0 desconectada de la
tierra. El estado lgico de la lnea RA0 depender exclusivamente de la circuitera
externa que se le conecte.
La salida negada viene enviada a la entrada de las dos compuertas lgicas OR y AND
y de estas a la base de los transistores P y N. Si ponemos un 0 en el bit 0 del
registro PORTA con la instruccin:
bcf PORTA,0
obtenemos la conduccin del transistor N con la consiguiente conexin a tierra de la
lnea RA0. Si por el contrario ponemos un 1 en el bit 0 con la instruccin:
bsf PORTA,0
obtenemos la conduccin del transistor P y la conexin de RA0 con los +5 voltios.
En esta condicin siempre es posible leer nuevamente el valor enviado sobre la lnea
a travs de la circuitera de entrada.
41
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Esto significa, en trminos prcticos, que cuando la lnea RA4 viene programada
como salida y tiene un 1, no viene conectada al positivo.
42
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
La lnea RB0 presenta una caracterstica muy particular. Cuando viene configurada
como entrada, puede generar, en correspondencia con un cambio de estado lgico,
una interrupcin, esto es, como su nombre lo indica, una interrupcin inmediata del
programa que se est ejecutando y una llamada a una subrutina especial
denominada servicio de interrupcin. Hablaremos de este importante tema ms
adelante.
43
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Esquema elctrico
Cada uno de los pulsadores conecta a tierra las lneas de entrada, las cuales
normalmente se mantienen a +5 voltios mediante una resistencia (de R6 a R9). Por
ejemplo, el pin 10 del PIC16F84A se mantendr en +5 voltios hasta que el pulsadro
SW1 no se active. Cuando esto ocurra el pin ver 0 voltios. Realizemos un programa
44
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
45
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;**************************************************
; Curso integral de microcontroladores Pic
; INPUT.ASM
;
; (c) 2003, WELGOS electrnica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
LED1 EQU 0
LED2 EQU 1
LED3 EQU 2
LED4 EQU 3
SW1 EQU 4
SW2 EQU 5
SW3 EQU 6
SW4 EQU 7
ORG 0CH
46
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;Reset Vector
;Punto di inizio del programma al reset della CPU
ORG 00H
;Commuta al segundo banco de registros para acceder al registro TRISA y
TRISB
bsf STATUS,RP0
;Definicion del las lineas de I/O (0=salida, 1=Entrada)
;Definicion del puerto A
movlw 00011111B
movwf TRISA & 7FH
;Definicion del puerto B
;Las lineas de RB0 a RB3 vienen programadas como salida para conectar
los cuatro led
;Las lineas de RB4 a RB7 viene programadas como entradas para conectar
los cuatro pulsadores
movlw 11110000B
movwf TRISB & 7FH
;Commuta el primer banco de registros
bcf STATUS,RP0
MainLoop
;apaga las led
clrf PORTB
;se se oprime SW1 se enciende el LED1
btfss PORTB,SW1
bsf PORTB,LED1
CURSO INTEGRAL
PIC
Captulo 4
47
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
48
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
a medida que las instrucciones del programa se van ejecutando, el contenido del
registro comienza a incrementarse 11, 12, 13 en pasos de a uno en directa
correspondencia con los ciclos de mquina empleados. Si por ejemplo, despus de
haber cargado el TMR0 con algn valor, se plantea un ciclo infinito:
movlw 10
movwf TMR0
loop
goto loop
el registro TMR0 se incrementa de manera infinita a la para con el loop. Como el
TMR0 es un registro de 8 bits, solo puede incrementarse hasta 255. Cuando esto
ocurre y los ciclos de mquina siguen andando, el registro se reinicia y toma el valor
de 0.
Los bloques Fosc/4 y TOCKI (en azul) representan las dos posibilidades que se
tienen para incrementar el valor del TMR0. Fosc/4 es una seal generada
internamente en el PIC a partir del circuito de reloj y equivale a la frecuencia del
reloj dividio por cuatro (esto recibe el nombre de ciclo de mquina).
TOCKI es una seal generada desde un eventual circuito externo que se aplica sobre
el pin TOCKI, que en el caso del PIC16F84A corresponde al pin 3.
Los bloques TOCS y PSA (resaltados en verde) son dos conmutadores que
determinan las caractersticas de la seal que entra el TMR0. Estos conmutadores se
configuran en base a los valores de los bits TOCS y PSA del registro OPTION.
Veamos como funcionan estos bloques para obtener las distintas modalidades de
conteo por parte del TMR0.
49
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
En rojo se muestra la ruta que sigue la seal hasta llegar al TMR0. Como se habia
mencionado, la frecuencia Fosc/4 equivale a un cuarto de la frecuencia del reloj. Si
utilizamos un cristal de 4 Mhz obtendremos una frecuencia interna de 1 MHz. Tal
frecuencia se envia directamente al registro TMR0 sin ninguna modificacin. El
incremento que se obtiene equivale a 1 milln de incrementos por segundo a partir
del valor presente en el TRM0.
En este caso la seal de entrada es la que se aplica externamente al pin TOCKI y esa
frecuencia es la que le entra al TMR0. Esta configuracin nos brinda la posibilidad de
efectuar el conteo automtcio de un evento externo. Si por ejemplo aplicamos al pin
TOCKI una frecuencia de 100 Hz, obtendremos una frecuencia de conteo de 100 por
segundo.
La presencia de la compuerta lgica XOR (OR exclusiva) en la entrada TOCKI del PIC
tiene como funcin permitir que el bit TOSE del registro OPTION regule el
funcionamiento del TMR0 para determinar cual de las dos posibles entradas es la que
queremos habilitar. Si queremos que funciones con el ciclo interno del reloj
(T0SE=1) o mediante la seal externa (T0SE=0).
50
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
4.2 El Prescaler
El ltimo bloque que falta por analizar es el PRESCALER. Si configuramos el bit PSA
del registro OPTION en 0 enviamos al registro TMR0 una seal que primero pasa por
el PRESCALER come se muestra en la siguiente figura:
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
1 0 0 32 31.250
1 0 1 64 15.625
1 1 0 128 7.813
1 1 1 256 3.906
Podemos hacer un experimento para comprobar el funcionamiento del PRESCALER.
;**************************************************
; Curso integral de microcontroladores Pic
; SEQTMR0.ASM
; Luces secuenciales con temporizacion via TIMER 0
;
; (c) 2003, WELGOS electronica
52
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
ORG 0CH
Count RES 1
Shift RES 1
;Reset Vector - Punto de inicio del programa al reset de la CPU
ORG 00H
;Conmuta al segundo banco de registros
bsf STATUS,RP0
;Definicion de la linea de I/O (0=salida, 1=entrada)
movlw 00011111B
movwf TRISA & 7FH
movlw 11110000B
movwf TRISB & 7FH
;Asigna el PRESCALER al TMR0 y lo configura a 1:32
;Ver la subroutina Delay
movlw 00000100B
movwf OPTION_REG & 0x7F
;Conmuta al primer banco de registros
bcf STATUS,RP0
;el registro Shift viene utilizado para representar internamente
;el estado de la linea de salida del puerto B donde se conectan los led
;el bit 0 del registro Shift viene inciado en 1 para iniciar el ciclo
;del primer led.
movlw 00000001B
movwf Shift
;Lazo de corrimiento
MainLoop
;envia sobre el puerto B el registro Shift de manera que cada bit en
;uno activar el led respectivo.
movf Shift,W
movwf PORTB
;Para rotar las luces se utiliza la instruccin rlf la cual hace
; rotar a la izquierda los bit contenidos en el registro e inserta en
;el bit 0 el estado del bit carry.Por este motivo primero se debe
;limpiar el carry con la instruccin: bcf STATUS,C.
bcf STATUS,C
rlf Shift,F
;Cuando con la rotacion el 1 llega al bit 4 se debe invertir los
;primeros cuatro bits con los segundos cuatro bits de modo que se pueda
;reiniciar el ciclo desde el bit 0.
;Esto sucede con los bits del registro Shift durante la ejecucion de
;este lazo:
;
; 00000001 <--- Valor inicial (primer led activado)
; 00000010 rlf
; 00000100 rlf
; 00001000 rlf
; 00010000 rlf en este punto se utiliza la instruccin swapf
;obteniendo:
; 00000001 ...
btfsc Shift,4
53
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
swapf Shift,F
;Insertar un retardo
call Delay
;Retorna a seguir nuevamente el lazo
goto MainLoop
;**************
; Subrutinas
;**************
; Retardo de un segundo
; utilizando el registro TMR0
;
; el ritardo viene obtenido de la frecuencia en la salida del PRESCALER
; por:
; 4Mhz / 4 / 32 = 31.250 Hz
; ... divide por 250 del TMR0 32.250 / 250 = 125 Hz
; ... y por 125 del contador Count 125 / 125 = 1Hz
Delay
; Inicializa el TMR0 para obtener 250 conteo antes de llegar a cero.
; El registro TMR0 es un registro de 8 bit que se incrementa
; nuevamentre cuando llega a 255 vuelve a cero.
; Si se inicializa en 6 debera llegar hasta 256 - 6 = 250
; incrementos antes de llegar a cero.
movlw 6
movwf TMR0
;el registro Count viene inicializado a 125
movlw 125
movwf Count
;Lazo de conteo
DelayLoop
;TMR0 vale 0 ?
movf TMR0,W
btfss STATUS,Z
goto DelayLoop ;No, espera...
movlw 6 ;Si, carga de nuevo TMR0 y controla si
movwf TMR0 ;ha pasado por 125
decfsz Count,1
goto DelayLoop
return
END
CURSO INTEGRAL
PIC
Captulo 5
Las interrupciones
Las interrupciones es una caracterstica muy especial en los microcontroladores PIC (
y de los microprocesadores en general) que permite la atencin inmediata de un
evento externo, interrumpiendo momentaneamente el programa en curso para
54
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
ejecutar otra porcin especializada del programa para el manejo de dicho evento y
una vez ejecutada esta se retorna al programa principal.
Podemos hacer un parangn con el mundo real, podemos hacer una analoga y decir
que las interrupciones son para el PIC lo que el timbre del telfono para nosotros.
Para poder una llamada telefnica no necesitamos tomar el auricular
permanentemente, simplemente hacemos nuestras labores normales y solo las
interrumpimos si suena el timbre del telfono. Cuando terminamos de hablar
volvemos de nuevo a nuestras actividades normales.
Existe un bit que acta como habilitador general de todas las interrupciones. Esto
quiere decir que para que cualquiera de las interrupciones se habilite debe estar este
bit activo. Se trata del bit GIE (Global Interrupt Enable bit) ubicado en el bit 7 del
registro INTCON.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
56
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
ORG 0x00
goto Start
seguido de otra directiva:
ORG 0x04
Que inidica la direccin de la subrutina que maneja la interrupcin:
bsf PORTB,LED2
movlw 3
movwf nTick
bcf INTCON,RBIF
retfie
Como se haba mencionado en la leccin anterior, el manejador de la interrupcin
debe necesariamente ubicarse a partir de la posicin 0x04; para evitar que se
encuentre enseguida del reset debemos saltarlo mediante una instruccin de salto
incondicional.
57
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;**************************************************
; Curso integral de microcontroladores Pic
; INTRB.ASM
;
; (c) 2003, WELGOs electrnica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
LED1 EQU 0
LED2 EQU 1
58
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
LED3 EQU 2
LED4 EQU 3
ORG 0CH
Count RES 2
nTick RES 1 ;Registro utilizado para contar el numero de
;encendidas del LED 1
;Reset Vector
;Punto de inicio del programa al reset de la CPU
ORG 00H
;Salta al cuerpo principal del programa. Este salto es necesario
;para evitar toda la parte de codigo para el manejo de la
;interrupcion.
goto Start
;Interrupt vector
;Punto de inicio para toda la subrutina de manejo de la interrupcion
ORG 04H
;**********************************************************************
; Servicio de Interrupcion
;**********************************************************************
;Activa el led 2 para sealar que se ha dado una interrupcion
bsf PORTB,LED2
;Inicializa el contador del parpadeo del LED1
movlw 3
movwf nTick
;Borra la bandera RBIF para permitir nuevas interrupciones
bcf INTCON,RBIF
;Retorna al programa principal
retfie
;**********************************************************************
; Programa principal
;**********************************************************************
Start:
;Conmuta al segundo banco de registros para acceder al registro TRISA y
;TRISB
bsf STATUS,RP0
;Definicion de las lineas de I/O (0=salida, 1=Entrada)
;Definicion del puerto A
movlw 00011111B
movwf TRISA & 7FH
;Definicion del puerto B
;Las lineas de RB0 a RB3 viene programadas como salida para
;conectar los cuatro led
;Las lineas de RB4 a RB7 vienen programadas como entradas para
;conectar los cuatro pulsadores
movlw 11110000B
movwf TRISB & 7FH
;Conmuta al primer banco de registros
bcf STATUS,RP0
;apaga los led del puerto B
bcf PORTB,LED1
bcf PORTB,LED2
bcf PORTB,LED3
bcf PORTB,LED4
;Habilita la interupcion del cambio de estado en las lineas RB4,5,6,7
movlw 10001000B
movwf INTCON
;**********************************************************************
; Lazo principal
;**********************************************************************
MainLoop
call Delay ;Retardo por software
59
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;Spegnimento led
TurnOffLed1
bcf PORTB,LED1 ;Spegne LED 1
goto MainLoop ;Continua a lampeggiare
;**********************************************************************
; Subrutina
;**********************************************************************
;Subrutina de retardo por software
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END
;**************************************************
; Curso integral de microcontroladores Pic
; DBLINT.ASM
;
; (c) 2003, WELGOS electronica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
ERRORLEVEL -302
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
LED1 EQU 0
LED2 EQU 1
LED3 EQU 2
LED4 EQU 3
ORG 0CH
Count RES 2
nTick RES 1
;Reset Vector
60
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
movlw 11110000B
movwf TRISB & 7FH
;Assegna il PRESCALER a TMR0 e lo configura a 1:256
movlw 00000111B
movwf OPTION_REG & 7FH
;Commuta sul primo banco dei registri
bcf STATUS,RP0
;Spegne tutti i led collegati sulla porta B
bcf PORTB,LED1
bcf PORTB,LED2
bcf PORTB,LED3
bcf PORTB,LED4
;Abilita l'interrupt sul TMR0 e sul cambiamento di stato delle linee
RB4,5,6,7
movlw 10101000B
movwf INTCON
;**********************************************************************
; Loop principale
;**********************************************************************
MainLoop
call Delay ;Ritardo software
btfss PORTB,LED1 ;Led acceso ?
goto TurnOnLed1 ;No, lo accende
goto TurnOffLed1 ;Si, lo spegne
;Accensione led e decremento del contatore di lampeggi
TurnOnLed1
bsf PORTB,LED1
;Controlla se LED 2 di segnalazione dell'interrupt e' gia acceso.
;Se e' acceso decrementa il contatore nTick ad ogni lampeggio di
;LED1. Quando nTick vale 0 spegne LED 2
btfss PORTB,LED2 ;LED2 acceso ?
goto MainLoop ;No, continua a lampeggiare
decf nTick,1 ;Si, decrementa nTick
btfss STATUS,Z ;nTick = 0 ?
goto MainLoop ;No, continua a lampeggiare
bcf PORTB,LED2 ;Si, spegne LED2
goto MainLoop ;Continua a lampeggiare
;Spegnimento led
TurnOffLed1
bcf PORTB,LED1 ;Prende LED 1
goto MainLoop ;Continua el parpadeo
;**********************************************************************
; Subrutina
;**********************************************************************
;Subrutina de retardo por software
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END
62
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
CURSO INTEGRAL
PIC
Captulo 6
El modo Power Down
El modo Power Down o modo Sleep es un estado muy particular del funcionamiento
del microcontrolador PIC utilizado para reducir el consumo de corriente en el
momento en que el microcontrolador no se est utilizando o solo esta a la espera de
que ocurra un evento externo.
Tomemos por ejemplo, el caso del control remoto del televisor. La mayor parte del
tiempo el microcontrolador interno no se encuentra desarrollando ninguna tarea, solo
63
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
espera a que un usuario oprima una de las teclas. Para ahorrar la energa de la
batera, es conveniente ponerlo en Sleep. El tiempo efectivo en que trabaja la CPU se
limita a los milisegunos necesarios para efectuar la transmisin, el resto del tiempo
no se encuentra desarrollando ninguna funcin en particular.
Para causar la salida del modo Power Down del PICmicro, bastar oprimir SW1 para
generar una interrupcin y retomar la ejecucin del programa.
64
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;**************************************************
; Curso integral de microcontroladores Pic
;
; PDM.ASM
; Power Down Mode example
;
; (c) 2003, WELGOS electronica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Set chip configuration
;Disable watch dog timer
;Enable power up timer
;XT oscillator
;Disable code protect
__CONFIG 3FF1H
SWITCH1 EQU 0
SWITCH2 EQU 1
LED1 EQU 2
ORG 0CH
;contador de 16 bit utilizado en la subrutina delay
Count RES 2
;Reset Vector
;Start point at CPU reset
ORG 00H
;Jump to main body of program.
goto Start
;**********************************************************************
; Interrupt vector
; Start point for every interrupt handler
;**********************************************************************
ORG 04H
;**********************************************************************
; Interrupt handler
;**********************************************************************
bcf INTCON,INTF ;Reset INTF flag
retfie ;Return to the main body
;**********************************************************************
; Main body
;**********************************************************************
Start:
bsf STATUS,RP0 ;Swap to data bank 1
;I/O lines definition on port A (0=output, 1=input)
movlw 00011111B ;Definition of port a
movwf TRISA & 0x7F
;I/O lines definition on port B (0=output, 1=input)
bsf TRISB & 0x7F,SWITCH1 ;Switch 1
bsf TRISB & 0x7F,SWITCH2 ;Switch 2
bcf TRISB & 0x7F,LED1 ;Led 1
;Set to 0 the INTEDG bit on OPTION register
;to have an interrupt on the falling edge of RB0/INT
bcf OPTION_REG & 0x7F,INTEDG
bcf STATUS,RP0 ;Swap to data bank 0
bsf INTCON,GIE ;Enables interrupts
bsf INTCON,INTE ;Enables RB0/INT interrupt
bcf PORTB,LED1 ;Turn off LED1
;**********************************************************************
65
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
; Main loop
;**********************************************************************
MainLoop
btfss PORTB,SWITCH2 ;If switch2 is down enter in
sleep ;Power Down Mode
call Delay ;Software delay
;If LED1 in on then turn it off and viceversa
btfss PORTB,LED1 ;Led on ?
goto TurnOnLed1 ;No, turn it on
goto TurnOffLed1 ;Yes, turn it off
;Turn LED1 on
TurnOnLed1
bsf PORTB,LED1
goto MainLoop
;Turn LED1 off
TurnOffLed1
bcf PORTB,LED1
goto MainLoop
;**********************************************************************
; Software delay
;**********************************************************************
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END
CURSO INTEGRAL
PIC
Captulo 7
El temporizador watch dog (WDT)
El Watch Dog es un oscilador interno al PIC pero con una circuitera completamente
independiente y su objetivo es el de evitar un posible bloqueo de la CPU del micro y
reiniciar el PIC para retornar a la ejecucin normal del programa.
66
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Si oprimimos SW2, la CPU entra en un loop infinito (StopLoop) antes de seguir con la
instruccin CLRWDT.
Transcurridos alrededor de 2.3 segundos, el Watch Dog Timer efecta el reset de la
CPU y el led comienza nuevamente a parpadear.
Podriamos ahora reprogramar el PIC16F84A con el siguiente programa y habiliat el
WDTe desde nuestro programador. Note que oprimiento SW2 el parapadeo se
bloquea y luego se desbloquea.
;**************************************************
67
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
; lazo principal
;**********************************************************************
MainLoop
btfss PORTB,SWITCH2 ;Si switch2 esta cerrado entre en
StopLoop
goto StopLoop ;Detiene la CPU
clrwdt ;Clear wtach dog timer
call Delay ;retardo por Software
;Si el LED1 esta prendido apaguelo y viceversa
btfss PORTB,LED1 ;Led on ?
goto TurnOnLed1 ;No, prendalo
goto TurnOffLed1 ;Si, apaguelo
;Turn LED1 on
TurnOnLed1
bsf PORTB,LED1
goto MainLoop
;Turn LED1 off
TurnOffLed1
bcf PORTB,LED1
goto MainLoop
;**********************************************************************
; Retardo por Software
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END
CURSO INTEGRAL
PIC
Captulo 8
Manejo de un display LCD
En las lecciones pasadas hicimos algunos experimentos sencillos con diodos led y
pulsadores. EN esta leccin vamos a desarrollar la interfaz entre nuestro PIC16F84A
y una serie de dispositivos ms complejos.
Inicaremos con un display de cristal lquido o LCD (del ingls Liquid Crystal Display)
dotado de dos lneas y 16 caracteres, que es muy fcil de conseguir en el comercio.
El esquema elctrico del circuito es el siguiente:
69
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
En la tabla siguiente se describe la funcin de cada una de las lneas del LCD. Las
descripciones que se encuentran en negrilla nos indican que se utilizan efectivamente
en nuestra aplicacin de ejemplo.
Para maximizar la utilizacin de los pines del PIC y el LCD, en esta leccin
utilizaremos la modalidad de intercambio de datos a 4 bits, para lo cual solo
utilizaremos las lneas DB4, DB5, DB6 y DB7. Las lneas DB0, DB1, DB2 y DB3 no las
utilizaremos por lo cual las podemos conectar a tierra. La lnea R/W del LCD tampoco
la utilizaremos por lo que tambin la conectaremos a tierra. De esta manera se
seleccionar el modo de trabajo solo en modo de escritura. Esto quiere decir que en
la prctica solo podremos enviar datos al LCD pero no recibirlos.
70
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
71
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;**************************************************
; Curso integral sobre microcontroladores Pic
; LCD1.ASM
;
; (c) 2003, WELGOS electrnica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Suppres MPASM warning message 302:
;"Register in operand not in bank 0. Ensure that bank bits are correct"
ERRORLEVEL -302
;Lineas de control del LCD
LCD_RS equ 2 ;Register Select
LCD_E equ 3 ;Enable
;bus de datos del LCD
LCD_DB4 equ 4 ;LCD linea de datos db4
LCD_DB5 equ 5 ; LCD linea de datos db5
LCD_DB6 equ 6 ; LCD linea de datos db6
LCD_DB7 equ 7 ; LCD linea de datos db7
ORG 0CH
tmpLcdRegister res 2
msDelayCounter res 2
;Reset Vector
ORG 00H
Start
bsf STATUS,RP0 ;salto al banco 1
movlw 00011111B ;configuro puerto A
73
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
movwf TRISA
movlw 11111111B ;configuro puerto B
movwf TRISB
bcf PORTB,LCD_DB4 ;como salidas las lineas del lcd
bcf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bcf PORTB,LCD_E
bcf PORTB,LCD_RS
bcf STATUS,RP0 ;Salto al banco 0
;inicializacin del LCD
call LcdInit
;Localizar el cursro del LCD em la fila 0, columna 0
movlw 10H
call LcdLocate
;mostrar "HELLO WORLD"
movlw 'H'
call LcdSendData
movlw 'E'
call LcdSendData
movlw 'L'
call LcdSendData
movlw 'L'
call LcdSendData
movlw 'O'
call LcdSendData
movlw ' '
call LcdSendData
movlw 'W'
call LcdSendData
movlw 'O'
call LcdSendData
movlw 'R'
call LcdSendData
movlw 'L'
call LcdSendData
movlw 'D'
call LcdSendData
movlw ' '
call LcdSendData
movlw '!'
call LcdSendData
foreverLoop
goto foreverLoop
;**********************************************************************
; subrutina de retardo
;
; W = tiempo de retardo requerido en ms (clock = 4MHz)
;**********************************************************************
msDelay
movwf msDelayCounter+1
clrf msDelayCounter+0
; lazo interno de 1 ms (alrededor)
msDelayLoop
nop
decfsz msDelayCounter+0,F
goto msDelayLoop
nop
decfsz msDelayCounter+1,F
goto msDelayLoop
return
74
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;**********************************************************************
; Init LCD
; Esta subrutina debe invocarse antes de cualquier otra del lcd
;**********************************************************************
LcdInit
movlw 30 ;espera 30 ms
call msDelay
;****************
; secuencia de Reset
;****************
bcf PORTB,LCD_RS ;LCD en modo de comando
;envia una secuencia de reset al LCD
bsf PORTB,LCD_DB4
bsf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bsf PORTB,LCD_E ;habilito lcd
movlw 5 ;espero 5 ms
call msDelay
bcf PORTB,LCD_E ;deshabilito LCD
movlw 1 ;Wait 1ms
call msDelay
bsf PORTB,LCD_E ; habilito LCD
movlw 1 ;Wait 1ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;Wait 1ms
call msDelay
bsf PORTB,LCD_E ;Enables E
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ;Disables E
movlw 1 ;Wait 1ms
call msDelay
bcf PORTB,LCD_DB4
bsf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bsf PORTB,LCD_E ; habilito LCD
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;espero 1ms
call msDelay
; configuro el bus de datos en 4 bits
movlw 28H;
call LcdSendCommand
;entro en mos de incremento no de desplazamiento
movlw 06H;
call LcdSendCommand
;Display ON, Curson OFF, Blink OFF
movlw 0CH
call LcdSendCommand
;Clear display
call LcdClear
movlw 30 ;Wait 30 ms
call msDelay
75
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;****************
; Secuencia de Reset
;****************
bcf PORTB,LCD_RS ;LCD en modo de comando
;envio secuencia de reset al LCD
bsf PORTB,LCD_DB4
bsf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bsf PORTB,LCD_E ; habilito LCD
movlw 5 ;espero 5 ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;eseperp 1ms
call msDelay
bsf PORTB,LCD_E ; habilito LCD
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;espero 1ms
call msDelay
bsf PORTB,LCD_E ;Enables E
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ;Disables E
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_DB4
bsf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bsf PORTB,LCD_E ; habilito LCD
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;espero 1ms
call msDelay
;bus a cuatro bits
movlw 28H;
call LcdSendCommand
;Entry mode set, incremento no desplazamiento
movlw 06H;
call LcdSendCommand
;Display ON, Curson OFF, Blink OFF
movlw 0CH
call LcdSendCommand
;Clear display
call LcdClear
;**********************************************************************
LcdSendByte
;guardo valor a enviar
movwf tmpLcdRegister
;envio cuatro bits altos
bcf PORTB,LCD_DB4
bcf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
btfsc tmpLcdRegister,4
bsf PORTB,LCD_DB4
76
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
btfsc tmpLcdRegister,5
bsf PORTB,LCD_DB5
btfsc tmpLcdRegister,6
bsf PORTB,LCD_DB6
btfsc tmpLcdRegister,7
bsf PORTB,LCD_DB7
bsf PORTB,LCD_E ; habilito LCD
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;espero 1ms
call msDelay
;envio cuatro bits bajos
bcf PORTB,LCD_DB4
bcf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
btfsc tmpLcdRegister,0
bsf PORTB,LCD_DB4
btfsc tmpLcdRegister,1
bsf PORTB,LCD_DB5
btfsc tmpLcdRegister,2
bsf PORTB,LCD_DB6
btfsc tmpLcdRegister,3
bsf PORTB,LCD_DB7
bsf PORTB,LCD_E ; habilito LCD
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;espero 1ms
call msDelay
return
END
CURSO INTEGRAL
PIC
Captulo 9
Manejo de una conexin RS232
77
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Como podemos apreciar estamos y=trabjando sobre la base del circuito del ejercicio
anterior pero aadiendo el circuito integrado U3 y el conector DB9 donde se
pegamos el puerto serial de la computadora y algunos componentes adicionales.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Para utilizar el RS232 para conectar entre s dos computadores sin la intervencin de
ningun modem, debemos simular de alguna manera la conexin intermedia
realizando un cable NULL MODEM para poder intercambiar directamente las seales
entre ambos equipos DTE.
79
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Una vez transmitido el octavo bit (bit 7), el PC enviar automticamente un ltimo
bit en 1 denominado STOP BIT con el que se indica la terminacin de la transmisin
del byte completo. Esta secuencia se repite para cada uno de los bytes que se
transmitan sobre la lnea.
Si en nuestro cable de comunicacin conectamos el pin TXD del receptor (pin 3) con
el pin RXD (pin 2) del PC trasmisor, podremos efectuar una transmisin RS232
bidireccional.
81
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
82
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
ser la lnea de recepcin. Con el pin 18 del PIC (RA1) podemos hacer la analoga
con la lnea TXD del PC.
De la misma manera, a travs del pin 17 (RA0) el PIC genera las seales que se
deben enviar al PC. Como vienen en niveles TTL se deben convertir a seales RS232
por medio de U3, para lo cual se conecta al pin 11 (entrada TTL) y por el pin 14
(salida RS232) se envian al PC a travs del pin 2 del conector J2.
83
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
En donde se asignan las constantes para establecer las lneas del PIC que se van a
utilizar como TX y RX. En este caso solo utilizaremos la lnea de recepcin pues el
mini-terminal solo servir para recibir y visualizar los datos. Estas dos constantes se
utilizan respectivamente en las subrutinas de transmisin y recepcin de caracteres
via RS232: TxChar (lnea 421) y RxChar (lnea 483). Estas dos subrutinas permiten
en la prctica transmitir y recibir bytes en modalidad seral asincrona a 9600 bps, 8
bit de datos, 1 stop bit y sin paridad. Para transmitir un caracter sobre la lnea TX
basta cargar el registro W con el valor que se va a transmitir y efectuar una llamda a
la subrutina TxChar. Por ejemplo, si queremos transmitir el caracter 'A' al PC
debemos escribir:
movlw 'A'
call TxChar
Para recibir caracteres la operacin es un poco ms compleja. Observemos en
nuestro ejemplo la lnea 129:
MainLoop
btfsc PORTA,RX
goto MainLoop
call RxChar
En la prctica en nuestro programa se hace un loop infinito hasta que no se detecte
el estado lgico 0 sobre la lnea RX. Cuando esto ocurre, se deduce que es probable
que sea un START BIT desde el PC y que en consecuencia siga una serie de bits de
datos transmitidos desde el PC. En este punto se debe invocar a RxChar quien se
ocupar de leer cada uno de los bits recibidos, los compila y los almacena en el
registro ShiftReg. Una vez invocada RxChar se debe borrar el registro ShiftReg en
donde se memorizan los bits recibidos.
RxChar
clrf ShiftReg
el registro BitCount se usa para contar el nmero de bits que deben llegar
movlw 8
movwf BitCount
en este momento se debe hacer una espera de alrededor del periodo de 1 bit para
recibir justo a tiempo el valor del BIT 0 despus de recibido el start bit
DELAY BIT_DELAY+BIT_DELAY/2 ;Espera 1.5 bit
ahora si se puede leeer el estado de la lnea de RX e inserta este valor en la bandera
de CARRY (C) del registro STATUS para luego efectuar una operacin de ROTATE
RIGHT F TROUGHT CARRY (RRF) con el registro ShiftReg, de modo que todos los bits
recibidos se acomodan ordenadamente rotando y partiendo desde el menos
significativo, como se muestra en la siguiente figura:
esta lectura se prepra para otra vuelta a intervalos de tiempo pares a la duracin de
un bit de manera que se logre tener el valor de la lnea de RX siempre en el centro
del bit en recepcin.
wDB
btfss PORTA,RX
84
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
goto RxBitL
RxBitH
nop
bsf STATUS,C
goto RxShift
RxBitL
bcf STATUS,C
goto RxShift
RxShift
nop
rrf ShiftReg,F
retardo por un periodo de tiempo par a 1 bit
DELAY BIT_DELAY
continua leyendo cada uno de los bits
decfsz BitCount,F
goto wDB
RxChar debe haber ledo el ltimo bit
return
en este punto en el registro ShiftReg debemos escribir el byte a transmitir al PC.
Una vez se ha leido el byte proveniente del PC, nuestro programa de ejemplo
controla si el byte recibido es un caracter de control o simplemente se trata de un
caracter para visualizar en el LCD.
El nico caracter de control implementado en nuestro miniterminal es el Form Feed
(FF) correspondiente al cdigo ASCII decimal 12. La transmisin de este caracter
equivale a lo que haciamos en las mquinas de escribir cuando corriamos el carro
para avanzar una lnea. En nuestro caso se limpia el contenido del LCD. El form feed
puede ser trnasmitido desde nuestro simulador de terminal desde el PC oprimiendo
la tecla CTRL seguido de la letra L. La siguiente es la parte del cdigo en donde se
maneja la recepcin de un Form Feed:
CheckFormFeed
movlw 12
xorwf ShiftReg,W
btfss STATUS,Z
goto _CheckFormFeed
clrf xCurPos
clrf yCurPos
call LcdClear
goto MainLoop
_CheckFormFeed
en la prctica se controla si el valor recibido de la subrutina RxChar equivale a 12. En
caso afirmativo se borran los registros xCurPos y yCurPos en donde se mantienen los
valores de de X y Y del cursor en el display. En este punto se llama la subrutina
LcdClear la cual se encarga de enviar el comando correcto al LCD para borrar su
contenido. Si el PC no ha transmitido un FF desde el PC, el caracter recibido se envia
al display mediante el siguiente cdigo:
movf ShiftReg,W
call putchar
y luego se retorna a atender el START BIT del prximo caracter con la siguiente
instruccin:
goto MainLoop
La subrutina putchar en la prctica envia el valor contenido en el registro W al
display LCD en la posicin en donde se encuentra el cursor (xCurPos y yCurPos). Los
registros xCurPos y yCurPos apuntan a la prxima posicin en donde se puede
escirbir el siguiente caracter recibido desde el PC.
85
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Este programa a pesar de ser muy sencillo puede tener muchas aplicaciones. Por
ejemplo, lo podemos utilizar para visualizar mensajes durante el inicio de Windows
95, insertando el comando en el interior del archivo AUTOEXEC.BAT.
86
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
87
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Cuando el PIC recibe este comando desde el RS232, lee el estado de los bist RB4,
RB5, RB6 y RB7 y envia un nico cdigo al PC que refleja el estado de los cuatro
pulsadores. De este cdigo solo los bits 0,1,2,3 indican el estado de los pulsadores
segn la siguiente tabla.
88
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Programa de prueba
El programa de prueba RS232IO.EXE nos permite probar el circuito inmediatamente.
El programa funciona en ambiente MS/DOS o prompt MS/DOS sobre Win 95/98.
Si hemos conectado el circuito en el COM2, para prender el LED 1 se deber digitar:
RS232IO /COM2 /LED1=ON
Si ahora lo queremos apagar el LED 1 y prender el LED 4 podemos digitar:
RS232IO /COM2 /LED1=OFF /LED4=ON
Si ahpra queremos activar solo el LED 3 sin modificar el estado de los otros LED:
RS232IO /COM2 /LED3=ON
Podemos conocer el estado actual de los interruptores cun el comando:
RS232IO /COM2 /SWITCH
El programa responder con lo siguiente:
Switch 1: off
Switch 2: off
Switch 3: ---> Active
Switch 4: off
En este supuesto caso, nos indica que solo el SWITCH 3 est oprimido.
;**************************************************
; Curso integral de microcontroladores Pic
; LCDTERM.ASM
;
; (c) 2003, WELGOS electronica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Suppress the following MPASM warning message [# 302]:
;"Register in operand not in bank 0. Ensure that bank bits are correct"
ERRORLEVEL -302
;Flag configuration
__CONFIG 3FF1H
;RS232 lines
TX equ 0 ;Tx data
RX equ 1 ;Rx data
;LCD Control lines
LCD_RS equ 2 ;seleccion de registro
LCD_E equ 3 ;Enable
;LCD data line bus
LCD_DB4 equ 4 ;linea de datos db4 de lcd
LCD_DB5 equ 5 ; linea de datos db5de lcd
LCD_DB6 equ 6 ; linea de datos db6 de lcd
LCD_DB7 equ 7 ; linea de datos db7de lcd
;**********************************************************************
; frecuencia del reloj (4 MHz)
;**********************************************************************
BIT_DELAY equ 23 ;Bit delay a 9600 bps
;**********************************************************************
; MACRO subrutina de retardo con el watch dog
; parametros del macro:
89
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;
; VALUE: retardo obtenico=((VALUE-1)*4+5)*(1/(Fosc/4))
;
;**********************************************************************
DELAY MACRO VALUE
LOCAL REDO
movlw VALUE
movwf TmpRegister
REDO
clrwdt ;Clear watch dog timer
decfsz TmpRegister,F
goto REDO
ENDM
;**********************************************************************
; FILE REGISTER
;**********************************************************************
ORG 0CH
tmpLcdRegister res 2
msDelayCounter res 2
TmpRegister res 1
;Registro usado por las subrutinas rs232
ShiftReg res 1 ;registro de desplazamiento
BitCount res 1 ;contador de bits
;ubicacion del cursor
xCurPos res 1
yCurPos res 1
putTempReg res 1
;Reset Vector
;**********************************************************************
; RESET VECTOR
;**********************************************************************
ORG 00H
Start
bsf STATUS,RP0 ;Swap al banco de registros 1
movlw 00011111B ;
movwf TRISA
movlw 11111111B ;
movwf TRISB
bcf PORTA,TX ;liena TX como salida
bcf PORTB,LCD_DB4 ;
bcf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bcf PORTB,LCD_E
bcf PORTB,LCD_RS
bcf STATUS,RP0 ;
;LCD inizializacion
call LcdInit
;Put terminal cursor on 0,0 position
clrf xCurPos
clrf yCurPos
;Wait until receives a start bit from RS232 line
MainLoop
btfsc PORTA,RX ;Received a start bit ?
goto MainLoop ;No, wait.
call RxChar ;Yes, read the byte on receiving...
CheckFormFeed
movlw 12
xorwf ShiftReg,W
btfss STATUS,Z
90
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
goto _CheckFormFeed
clrf xCurPos
clrf yCurPos
call LcdClear
goto MainLoop
_CheckFormFeed
movf ShiftReg,W
call putchar
goto MainLoop
;**********************************************************************
; Delay subroutine
;
; W = Requested delay time in ms (clock = 4MHz)
;**********************************************************************
msDelay
movwf msDelayCounter+1
clrf msDelayCounter+0
; 1 ms (about) internal loop
msDelayLoop
nop
decfsz msDelayCounter+0,F
goto msDelayLoop
nop
decfsz msDelayCounter+1,F
goto msDelayLoop
return
;**********************************************************************
; Put a char to xCurPos, yCurPos position on LCD
;
; W = Char to show
; xCurPos = x position
; yCurPos = y position
;
; xCurPos and yCurPos will be increase automaticaly
;**********************************************************************
putchar
movwf putTempReg
swapf yCurPos,W
iorwf xCurPos,W
call LcdLocate
movf putTempReg,W
call LcdSendData
incf xCurPos,F
movlw 16
xorwf xCurPos,W
btfss STATUS,Z
goto moveLcdCursor
clrf xCurPos
incf yCurPos,F
movlw 2
xorwf yCurPos,W
btfss STATUS,Z
goto moveLcdCursor
clrf yCurPos
moveLcdCursor
swapf yCurPos,W
iorwf xCurPos,W
call LcdLocate
return
;**********************************************************************
; Init LCD
91
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
movlw 2 ;Wait 2 ms
call msDelay
;DD RAM address set 1st digit
movlw 80H;
call LcdSendCommand
return
;**********************************************************************
; Locate cursor on LCD
; W = D7-D4 row, D3-D0 col
;**********************************************************************
LcdLocate
movwf tmpLcdRegister+0
movlw 80H
movwf tmpLcdRegister+1
movf tmpLcdRegister+0,W
andlw 0FH
iorwf tmpLcdRegister+1,F
btfsc tmpLcdRegister+0,4
bsf tmpLcdRegister+1,6
movf tmpLcdRegister+1,W
call LcdSendCommand
return
;**********************************************************************
; Send a data to LCD
;**********************************************************************
LcdSendData
bsf PORTB,LCD_RS
call LcdSendByte
return
;**********************************************************************
; Send a command to LCD
;**********************************************************************
LcdSendCommand
bcf PORTB,LCD_RS
call LcdSendByte
return
;**********************************************************************
; Send a byte to LCD by 4 bit data bus
;**********************************************************************
LcdSendByte
;Save value to send
movwf tmpLcdRegister
;Send highter four bits
bcf PORTB,LCD_DB4
bcf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
btfsc tmpLcdRegister,4
bsf PORTB,LCD_DB4
btfsc tmpLcdRegister,5
bsf PORTB,LCD_DB5
btfsc tmpLcdRegister,6
bsf PORTB,LCD_DB6
btfsc tmpLcdRegister,7
bsf PORTB,LCD_DB7
bsf PORTB,LCD_E ;Enables LCD
movlw 1 ;Wait 1ms
call msDelay
bcf PORTB,LCD_E ;Disabled LCD
movlw 1 ;Wait 1ms
call msDelay
93
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;**************************************************
; Curso integral de microcontroladores Pic
; RS232IO.ASM
;
; (c) 2003, WELGOS electronica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Suppress the following MPASM warning message [# 302]:
95
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;"Register in operand not in bank 0. Ensure that bank bits are correct"
ERRORLEVEL -302
;Flag configuration
__CONFIG 3FF1H
;RS232 lines
TX equ 0 ;Tx data
RX equ 1 ;Rx data
;I/O lines on PORTB
LED1 equ 0
LED2 equ 1
LED3 equ 2
LED4 equ 3
SWITCH1 equ 4
SWITCH2 equ 5
SWITCH3 equ 6
SWITCH4 equ 7
;Command code from PC
LED1_ON equ 00h
LED2_ON equ 01h
LED3_ON equ 02h
LED4_ON equ 03h
LED1_OFF equ 10h
LED2_OFF equ 11h
LED3_OFF equ 12h
LED4_OFF equ 13h
GET_SWITCH equ 20h
;**********************************************************************
; Clock frequency related constant (4 MHz)
;**********************************************************************
BIT_DELAY equ 23 ;Bit delay a 9600 bps
;**********************************************************************
; MACRO - Delay subroutine with watch dog timer clearing
;
; Macro parameters:
;
; VALUE: Delay obtained = ((VALUE-1)*4+5)*(1/(Fosc/4))
;
;**********************************************************************
DELAY MACRO VALUE
LOCAL REDO
movlw VALUE
movwf TmpRegister
REDO
clrwdt ;Clear watch dog timer
decfsz TmpRegister,F
goto REDO
ENDM
;**********************************************************************
; FILE REGISTER
;**********************************************************************
ORG 0CH
;Register used by msDelay subroutine and DELAY macro
msDelayCounter res 2
TmpRegister res 1
;Register used by RS232 subroutines
ShiftReg res 1 ;Shift register
BitCount res 1 ;Bit counter
DummyReg res 1
;**********************************************************************
; RESET VECTOR
;**********************************************************************
ORG 00H
96
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Start
bsf STATUS,RP0 ;Swap to register bank 1
movlw 00011111B ;Sets the whole PORTA as input
movwf TRISA
movlw 11111111B ;Sets the whole PORTB as input
movwf TRISB
bcf PORTA,TX ;Sets TX line as output
bcf TRISB,LED1 ;Set output line on PORTB
bcf TRISB,LED2
bcf TRISB,LED3
bcf TRISB,LED4
bcf STATUS,RP0 ;Swap to register bank 0
bcf PORTB,LED1 ;Turn off each leds
bcf PORTB,LED2
bcf PORTB,LED3
bcf PORTB,LED4
;Wait until receives a start bit from RS232 line
MainLoop
btfsc PORTA,RX ;Received a start bit ?
goto MainLoop ;No, wait.
call RxChar ;Yes, read the byte on receiving...
;***********************
; Check for PC commands
;***********************
;***********************
; LED1_ON
;***********************
Led1On
movlw LED1_ON
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led1On
bsf PORTB,LED1
goto MainLoop
_Led1On
;***********************
; LED2_ON
;***********************
Led2On
movlw LED2_ON
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led2On
bsf PORTB,LED2
goto MainLoop
_Led2On
;***********************
; LED3_ON
;***********************
Led3On
movlw LED3_ON
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led3On
bsf PORTB,LED3
goto MainLoop
_Led3On
;***********************
; LED4_ON
;***********************
Led4On
97
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
movlw LED4_ON
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led4On
bsf PORTB,LED4
goto MainLoop
_Led4On
;***********************
; LED1_OFF
;***********************
Led1Off
movlw LED1_OFF
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led1Off
bcf PORTB,LED1
goto MainLoop
_Led1Off
;***********************
; LED2_OFF
;***********************
Led2Off
movlw LED2_OFF
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led2Off
bcf PORTB,LED2
goto MainLoop
_Led2Off
;***********************
; LED3_OFF
;***********************
Led3Off
movlw LED3_OFF
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led3Off
bcf PORTB,LED3
goto MainLoop
_Led3Off
;***********************
; LED4_OFF
;***********************
Led4Off
movlw LED4_OFF
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led4Off
bcf PORTB,LED4
goto MainLoop
_Led4Off
;***********************
; GET_SWITCH
;***********************
GetSwitch
movlw GET_SWITCH
xorwf ShiftReg,W
btfss STATUS,Z
goto _GetSwitch
swapf PORTB,W ;Read the switch state and send
98
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;**********************************************************************
; Delay subroutine
;
; W = Requested delay time in ms (clock = 4MHz)
;**********************************************************************
msDelay
movwf msDelayCounter+1
clrf msDelayCounter+0
; 1 ms (about) internal loop
msDelayLoop
nop
decfsz msDelayCounter+0,F
goto msDelayLoop
nop
decfsz msDelayCounter+1,F
goto msDelayLoop
return
;***********************************************************************
***
; Send a character on RS232
; (9600 baud,8 data bit, 1 stop bit, No parity)
;
; Input: W = Character to send
;***********************************************************************
***
TxChar
movwf ShiftReg
movlw 8 ;Data lenght
movwf BitCount
bcf PORTA,TX ;Send start bit
nop
nop
nop
nop
nop
nop
nop
DELAY BIT_DELAY
;Tx loop
TxLoop
btfss ShiftReg,0
goto TxLo
nop
bsf PORTA,TX
goto cTx
TxLo
bcf PORTA,TX
goto cTx
cTx
nop
rrf ShiftReg,F
DELAY BIT_DELAY
decfsz BitCount,F
goto TxLoop
99
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
nop
nop
nop
nop
bsf PORTA,TX ;Stop bit
DELAY BIT_DELAY
DELAY 2
nop
bsf PORTA,TX
DELAY BIT_DELAY
DELAY 2
return
;***********************************************************************
***
; Receive a character from RS232
; (9600 baud,8 data bit, 1 stop bit, No parity)
;
; Return code:
;
; ShiftReg: Received character
;***********************************************************************
***
RxChar
clrf ShiftReg
movlw 8 ;Data lenght
movwf BitCount
DELAY BIT_DELAY+BIT_DELAY/2 ;Wait 1.5 bit
;Loop di lettura dei bit dati
wDB
btfss PORTA,RX
goto RxBitL
RxBitH
nop
bsf STATUS,C
goto RxShift
RxBitL
bcf STATUS,C
goto RxShift
RxShift
nop
rrf ShiftReg,F
DELAY BIT_DELAY
decfsz BitCount,F
goto wDB
return
END
100
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
CURSO INTEGRAL
PIC
Captulo 10
Prcticas con el entrenador
101
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
102
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Otro aspecto que no se puede olvidar, son los rebotes causados por la
pulsacin de una tecla. Cuando una tecla se oprime, sus contactos actan
como resortes y la unin elctrica no es etsbale; se generan una serie de
uniones y desuniones mecnicas durante un intervalo significativo de tiempo.
Estos rebotes pueden dar lugar a que, en una aplicacin real, el programa los
interprete como si hubieran generado muchas pulsaciones, si es queno se
toman los correctivos del caso. La solucin para este problema es que
despus de la deteccin de la tecla pulsada se genere un retardo (entre 100
y 125 ms) en la lectura del teclado, de tal manera que se ignoren los
contactos subsiguientes debido a los rebotes.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Este tipo de motores poseen la ventaja de que pueden operar con una sola
fuente, mientras que los motores de dos bobinas requieren polaridad positiva
y negativa, hacindose necesario utilizar circuito en puente. En la figura
anterior se muestra la forma de conectar el motor de ocho cables. Debe
notarse que los cables rojos y negros se unen para conectarlos a la fuente
positiva. De aqu se puede deducir como sera la conexin para 5 y 6 cables.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
activar una sola bobina a la vez (manejo por ola), la segunda es el manejo
de dos fases o bobbinas al mismo tiempo. Con este ltimo mtodo se puede
conseguir mayor torque. En la siguiente figura se muestran los diagramas de
tiempo de los dos mtodos anteriores.
107
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
108
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
;**********************************
; Curso integral de microcontroladores PIC *
; WWW.WELLGOS.COM *
; MOTOR PASO A PASO *
;**********************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84A.INC"
ORG 0x0C
CONTAD RES 1
CONTAD1 RES 1
CONTAD2 RES 1
ORG 0
109
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
INICIO
BTFSC PORTA,0 ; En este puerto va el pulsador de giro a la
izquierda
GOTO INICIO1
GOTO IZQUIER
INICIO1 BTFSC PORTA,1 ;En este puerto va el pulsador de giro a la
derecha
GOTO INICIO
IZQUIER
MOVLW B'00001001'
MOVWF PORTB
CALL DIEZ
CALL DIEZ
CALL DIEZ
MOVLW B'00000011'
MOVWF PORTB
CALL DIEZ
CALL DIEZ
CALL DIEZ
MOVLW B'00000110'
MOVWF PORTB
CALL DIEZ
CALL DIEZ
CALL DIEZ
110
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
MOVLW B'00001100'
MOVWF PORTB
CALL DIEZ
CALL DIEZ
CALL DIEZ
GOTO INICIO
;*********************************
; RUTINA DE RETARDO
;*********************************
UNSEG
MOVLW .10
MOVWF CONTAD2
UNSEG1
CALL CIEN
DECFSZ CONTAD2,1
GOTO UNSEG1
RETURN
CIEN
MOVLW .100
MOVWF CONTAD
CLRF CONTAD1
UNSEG2
NOP
DECFSZ CONTAD1,1
GOTO UNSEG2
DECFSZ CONTAD,1
GOTO UNSEG2
RETURN
DIEZ
MOVLW .10
MOVWF CONTAD
CLRF CONTAD1
UNSEG3
NOP
DECFSZ CONTAD1,1
GOTO UNSEG3
DECFSZ CONTAD,1
GOTO UNSEG3
RETURN
END
111
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
NOTA Si utilize reles, recuerde colocar un diodo en paralelo a la bobina del rele
para controlar corrientes de fuga que puedan afectar los circuitos.
Ambos circuitos solo permiten que gire en un solo sentido, hacia adelante en
el primer caso y hacia atrs en el Segundo.
112
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Velocidad de Motor
113
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Para invetir el sentido de giro, se deben activar los reles superior izquierdo e
inferior izquierdo, esto es, 0 en A, 1 en B, 1 en C, y 0 en D.
114
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
PRECAUCION: No debe activar la secuencia para que gire hacia ambos lados,
puede causar un corto circuito que puede afectar el sistema, por ejemplo
activar A y C o B y D.
Puente H Semiconductores
El Puente H se puede implementer con transistores normales o transistores
de efecto de campo (FETs).
Los drivers superiors necesitan ser Fuentes de corriente para lo cual son
buenos los transistores PNP y los P-channel FETs. Los dirvers inferiores
deben ser Buenos sumideros de corriente, por lo que se utilizar transistores
NPN y N-channel FETs.
115
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Para cuidar los transistores, conviene adicionar diodos que controlen las
corriente de fuga generadas por las bobinas del motor en los momentos de la
conmutacin de la potencia.
116
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
117
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Para disear una figura se deben poner los datos deseados en la fila en el
puerto B y mandar un flanco de subida para activar el reloj del 374 por el
puerto A (RA1). Ahora se colocan los datos de la columna en el puerto B y se
manda el pulso de activacin del flip flop por el puerto A (RA0). Antes de
movernos a la siguiente fila, se debe poner FF en las lneas de las columnas
para limpiar el display y evitar problemas de fantasmeo.
118
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Para obtener la base de tiempos basta desarrollar una interrupcin por TMR0
por cada segundo. En la primera parte del programa se tiene las
instrucciones normales del vector de reser donde se direcciona el cuerpo
principal del programa y la direccin de la subrutina de interrupcin.
119
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
120
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
121
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Auto rango
Visualizacin en cuatro displays de siete segmentos
Rango de frecuencias de 0 Hz a 50 MHz
Porttil
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
123
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
ANEXOS
CURSO INTEGRAL
PIC
124
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
ANEXO Ae
Descripcin de pines del PIC16F84A
1 RA2
Es una lnea de I/O programable como entrada o salida.
Corresponde al BIT 2 del PUERTO A.
2 RA3
Es una lnea de I/O programable como entrada o salida.
Corresponde al BIT 3 del PUERTO A.
3 RA4 / RTCC
Es un pin multifuncional que puede ser programado como lnea normal de I/O o como lnea
de reloj para la entrada del contador RTCC.
Si se programa como lnea de I/O corresponde al BIT 4 del PUERTO A. A diferencia de los
otros pines, cuando esta lnea funciona como salida, trabaja en configuracin de colector
abierto.
4 MCLR / VPP
En condiciones de normal funcionamento su funcin es la de Master CLeaR es decir, el reset
el cual se activa con un nivel 0. All se puede conectar un circuito externo de reset o
simplemente conectarlo al voltaje positivo.
Cuando el PIC se va a programar "Program Mode" se utiliza como entrada para el voltaje de
programacin Vpp.
5 VSS
Este pin se connecta al negativo de la tensin de alimentacion.
6 RB0
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 0 del PUERTO B y puede ser programado para generar interrupcin.
7 RB1
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 1 del PUERTO B.
8 RB2
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 2 del PUERTO B.
9 RB3
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 3 del PUERTO B.
125
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
1 RB4
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 4 del PUERTO B.
11 RB5
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 5 del PUERTO B.
12 RB6
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 6 del PUERTO B.
13 RB7
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 7 del PUERTO B.
14 VDD
Es el terminal positivo de la alimentacin del PIC. En todas las versiones disponibles del
PIC16F84 (comercial, industrial y automotriz) la tensin puede puede tener un valor mnimo
de 2.0 voltios y un mximo de 6.0 voltios.
5 OSC2 / CLKOUT
Es un pin de conexin en el caso que se este trabajando con quarzo para generar el reloj. Es
una salida en el caso de que se utilize un oscilador RC u otro oscilador externo.
16 OSC1 / CLKIN
Es un pin de conexin en el caso que se este trabajando con quarzo o un circuito RC para
generar el reloj. Es una entrada en el caso de que se utilize un oscilador externo.
17 RA0
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 0 del PUERTO A.
18 RA1
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 1 del PUERTO A.
126
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
ANEXO B
Conjunto de instrucciones del PIC 16F84
Sintaxis, Descripcin Microchip Operacin equivalente
ADDLW k Suma un literal y W, W = W + k
ADDWF f,d Suma W con f, d = W + f (donde d puede ser W o f)
ANDLW k AND Literal con W, W = W AND k
ANDWF f,d AND W con f, d = W AND f (donde d puede ser W o f)
BCF f,b Bit Clear f, f(b) = 0
BSF f,b Bit Set f, f(b) = 1
BTFSC f,b Bit Test f, Skip if Clear, f(b) = 0 ? Si, salta una instruccin
BTFSS f,b Bit Test f, skip if Set, f(b) = 1 ? Si, salta una instruccin
CALL k llamada a la subrutina en la posicin k
CLRF f Clear f, f = 0
CLRW Clear W Register, W = 0
CLRWDT Clear Watchdog Timer, Watchdog timer = 0
COMF f,d Complement f, d = not f (donde d puede ser W o f)
DECF f,d Decrement f, d = f -1 (donde d puede ser W o f)
DECFSZ f,d Decrement f, Skip if 0, d = f -1 (donde d puede ser W o f)
si d = 0 salta
GOTO k Go to address, salta a la direccin k
INCF f,d Increment f, d = f +1 (donde d puede ser W o f)
INCFSZ f,d Increment f, Skip if 0 d = f +1 (donde d puede ser W o f)
si d = 0 salta
IORLW k Inclusive OR Literal with W, W = W OR k
IORWF f,d Inclusive OR W with f, d = f OR W (donde d puede ser W o f)
MOVLW k Move literal to W, W = k
MOVF f,d Move f, d = f (donde d puede ser W o f)
MOVWF f Move W to f, f = W
NOP No Operation, ninguna operacin
OPTION Load Option Register, OPTION = W
RETFIE Return from Interrupt. Retorna del servicio de interrupcin
RETLW k Return Literal to W. Retorna de una subrutina con W = k
RETURN Return from Subroutine. Retorna de una subrutina
RLF f,d Rotale Left f through Carry, d = f << 1 (donde d puede ser W o f)
RRF f,d Rotale Right f through Carry, d = f >> 1 (donde d puede ser W o f)
SLEEP Go into Standby Mode. Pone el PIC en standby
SUBLW k Subtract W from Literal, W = k - W
SUBWF f,d Subtract W from f, d = f - W (donde d puede ser W o f)
SWAPF f Swap f, f = intercambia los bits 0123 con los bits 4567 del registro f
TRIS f Load TRIS. Carga el registro TRIS del registro f, f = W
XORLW k Exclusive OR Literal with W, W = W XOR k
XORWF f,d Exclusive OR W with f, d = f XOR W (donde d puede ser W o f)
127
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
C vale 1 si el resultado es positivo o si el bit 7 del registro que contiene el resultado vale 0
128
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
C vale 1 si el resultado es positivo o si el bit 7 del registro que contiene el resultado vale 0
129
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
130
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
131
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
132
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
133
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
134
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
135
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
136
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
137
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
138
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
139
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
COMF COMplement F
Efecta el complemento del registro F
Sintaxis:
comf f,d
Operacin equivalente:
d = NOT f (donde d puede ser W o f)
Descripcin:
Esta instruccin efecta el complemento del valor contenido en el registro indiricado en el
parmetro f. El parmetro d determina el destino del valor obtenido.
Con d = W el valor viene memorizado en el registro W
Con d = F el valor viene memorizado en el registro f.
Ejemplo:
parm1 equ 0CH
org 00H
movlw 01010101B
movwf parm1
comf parm1,F
...
Al terminar la ejecucin del programa el valor del registro parm1 ser 10101010B.
Nota:
Esta instruccin influencia el bit Z del registro STATUS.
Z vale 1 si el resultado de la operacin vale 0.
140
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
141
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
142
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
GOTO GO TO address
Lleva la ejecucin a la direccin k
Sintaxis:
goto k
Descripcin:
Determina un salto del programa en ejecucin en la posicin k. El parmetro k puede
especificarse utilizando directamente el valore numrico de la posicin relativa a la etiqueta.
Ejemplo:
org 00H
loop
goto loop
Este programa sigue un ciclo (loop) infinito.
Nota:
Esta instruccin no modifica ningn bit del registro de estado.
143
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
INCF INCrement F
Incrementa el valore del registro indicado F
Sintaxis:
incf f,d
Operacin equivalente:
d = f +1 (donde d puede ser W o f)
Descripcin:
Incrementa el contenido del registro indicado en f y memoriza el resultado en este registro o
en el acumulador W de acuerdo al valor de la bandera d:
Con d = W el resultado viene memorizado en el registro W
Con d = F el resultado viene memorizado en el registro f
Nota:
Esta instruccin altera el bit Z del registro STATUS..
Z vale 1 si el resultado de la operacin vale 0.
144
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
145
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
146
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
147
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
148
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
MOVF MOVe F
Mueve el contenido del registro F
Sintaxis:
movf f,d
Operacin equivalente:
d = f (donde d puede ser W o f)
Descripcin:
Esta instruccin copia el contenido del registro indiricado por el parmetro f en el
acumulador W o en el mismo registro F. El parmetro d determina el destino.
Con d = W el resultado viene memorizado en el registro W
Con d = F el resultado viene memorizado en el registro f . En este caso la instruccin altera
el bit Z del registro STATUS de acuerdo al valor contenido en el registro f.
Ejemplo:
El siguiente ejemplo copia el valor contenido en el registro con direccin 0CH en el
acumulador W:
movf 0CH,W
149
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
MOVWF MOVe W to F
Mueve el contenido del registro W hacia el registro F
Sintaxis:
movwf f
Operacin equivalente:
f=W
Descripcin:
Esta instruccin copia el contenido del registro W en el registro indiricado en el parmetro f.
Ejemplo:
Si por ejemplo vamos a escribir el valor 10H en el registro TMR0. La instrucciones a seguir
seran las siguientes:
movlw 10H ;escribe en el registro W el valore 10H
movwf 01H ;y lo memoriza en el registro TMR0
Si hemos incluido el archivo P16F84.INC, el cdigo es el siguiente:
movlw 10H ;escribe en el registro W el valor 10H
movwf TMR0 ;y lo memoriza en el registro TMR0
Nota:
Esta instruccin no altera ningn bit de estado.
150
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
NOP No OPeration
Ninguna operacin
Sintaxis:
nop
Descripcin:
Esta intruccin no ejecuta ninguna operacin ms que hacer un retardo de un ciclo de
mquina.
Ejemplo:
Utilizando un quarzo de 4MHz podremos obtener un retardo de 1s para una instruccin
NOP insertada en nuestro cdigo fuente.
nop ;hace un retardo de 1s
Nota:
Esta instruccin no altera ningn bit de estado.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
org 00H
start
bsf STATUS,RP0 ;Activa el banco de registros 1
movlw 01000100B
movwf OPTION_REG
...
En la prctica se aconseja escribir directamente en el registro OPTION del banco 1 mediante
la instruccin MOVWF en lugar de la instruccin OPTION que e el futuro es probable que
no la podamos implementar.
152
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Sintaxis:
retfie
Descripcin:
Esta instruccin debe insertarse al terminar el cdigo del servicio de interrupcin para
retornar el control al programa principal.
Ejemplo:
org 00H
loop
goto loop ;Loop infinito
org 04H ;Interrupt vector
intHandler
retfie ;Retorna de la interrupcin
En este cdigo el programa principal sigue un lazo infinito. Si habilitamos una de las
interrupciones del PIC16F84 el control del programa se entregar automticamente al
programa ubicado en la posicin 04H (en el ejemplo: intHandler), la instruccin RETFIE
permitir el retorno al lazo principal.
Nota:
Esta instruccin no altera ningn bit de estado.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
155
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
El contenido del bit CARRY del registro status rota hacia el bit D0 mientras que el valor en
la salida del bit D7 se rota hacia el CARRY. El valor del parmetro d determina el destino
del resultado obtenido al termino de la rotacin:
Con d = W el resultado viene memorizado en el registro W dejando tal cual el valor de f
Con d = F el resultado viene memorizado en el registro f .
Ejemplo:
parm1 equ 0CH
org 00H
clrf C,STATUS ;borra el CARRY
movlw 01010101B ;Valor inicial
movwf parm1
rlf parm1,F
Al termino del programa el registro parm1 valdr 10101010B mientras el CARRY valdr 0.
Nota:
Esta intruccin solo altera el bit CARRY.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
El contenido del bit CARRY del registro status rota hacia el bit D7 mientras que el valor en
la salida del bit D0 se rota hacia el CARRY. El valor del parmetro d determina el destino
del resultado obtenido al termino de la rotacin:
Con d = W el resultado viene memorizado en el registro W dejando tal cual el valor de f
Con d = F el resultado viene memorizado en el registro f .
Ejemplo:
parm1 equ 0CH
org 00H
clrf C,STATUS ;borra el CARRY
movlw 01010101B ;Valor inicial
movwf parm1
rrf parm1,F
Al termino del programa el registro parm1 valdr 00101010B mientras el CARRY valdr 1.
Nota:
Esta intruccin solo altera el bit CARRY.
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Sintaxis:
sleep
Descripcin:
Esta instruccin bloquea la ejecucin programa en curso y pone el PIC en estado de standby
(sleep del ingls to sleep, dormir).
Ejemplo:
org 00H
start
sleep
Nota:
Esta instruccin no altera ningn bit de estado.
158
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
C vale 1 si el resultado es positivo o si el bit 7 del registro que contiene el resultado vale 0
159
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Ejemplo:
Analizemos un ejemplo extraido de las hojas de datos de la Microchip:
Si insertamos la instruccin:
subwf REG1,F
Donde reg1 es la direccin de cualquier registro especificado mediante la directiva:
REG1 RES 1
Para un valor inicial de REG1=3 y W=2, despus de la ejecucin tendremos REG1=1 y C=1
debido a que el resultado es positivo.
Para un valor inicial de REG1=2 y W=2, despus de la ejecucin tendremos REG1=0 y C=1
debido a que el resultado es positivo.
Para un valor inicial de REG1=1 y W=2, despus de la ejecucin tendremos REG1=FFH y
C=0 debido a que el resultado es negativo.
Nota:
Esta instruccin altera los bits Z, DC y C del registro STATUS.
Z vale 1 si el resultado de la operacin vale 0.
C vale 1 si el resultado es positivo o si el bit 7 del registro que contiene el resultado vale 0
SWAPF SWAP F
160
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Nota:
Esta instruccin no altera ningn bit de estado.
161
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Nota:
Esta instruccin no altera ningn bit de estado.
162
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
Esta instruccin altera el bit Z del registro STATUS que valdr 1 si el resultado de la
operacin es 0.
Ejemplo:
Si fueramos a efectuar la XOR entre el registro W y el registro REG1 que se ha definido en
la posicin 0CH con la direttiva:
REG1 EQU 0CH
Podriamos utilizar la instruccin IORWF en dos formas dependiendo de donde queremos
tener el resultado:
xorwf COUNTER,F ;COUNTER = COUNTER XOR W
o:
xorwf COUNTER,W ;W = COUNTER XOR W
Nota:
La OR exclusiva (XOR) es una operacin entre dos bit en donde el bit resultante vale 0 si los
dos bits son iguales. En lenguaje ensamblador la XOR se utiliza para comparar dos valores y
determinar su igualdad. Veamos como:
Si fueramos a determinar si el valor en el registro REG1 es igual a 57H, las instrucciones a
seguir son las siguientes:
movlw 57H ;W = Valor a comparar = 57H
;Resultado. W = 57H
xorwf REG1,W ;W = W XOR REG1 Efectua la XOR con
;el valor en REG1
btfss STATUS,Z ;Salta la instruccin siguiente si el
;resultato de la XOR vale 0, osea
;si el valor de REG1 es igual a 57H
goto diverso ;Salta si es diferente a 57H
goto uguale ;Salta si es igual a 57H
164
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
165
www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES
166
www.welgos.net