Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Antologia Micros Con Pic 16f84a PDF
Antologia Micros Con Pic 16f84a PDF
ANTOLOGÍA
Microcontroladores
Es así que esta asignatura tiene por objeto estudiar los fundamentos de los
microcontroladores, proponiendo el siguiente contenido:
En ambos esquemas es posible observar como elemento rector al CPU (Central Processing
Unit, unidad central de procesamiento) el cual se compone fundamentalmente de:
Todos los microcontroladores PIC utilizan una arquitectura Harvard, lo que quiere decir
que su memoria de programa está conectada a la CPU por más de 8 líneas. Hay
microcontroladores de 12, 14 y 16 bits, dependiendo de la anchura del bus.
Hasta hace algunos años el PIC16F84A era más frecuentemente utilizado en el aprendizaje
de estos dispositivos, hoy día es considerado obsoleto, aunque aún existe una amplia
documentación respecto a aplicaciones del mismo.
En la figura 2.2 mostramos la arquitectura básica del 16F84A, en el que veremos diversos
elementos que al momento de la programación resultarán vitales en el funcionamiento
correcto de nuestras aplicaciones.
Otro microcontrolador muy útil en el aprendizaje, pero con más recursos y prestaciones es
el PIC16F877A, que en general es una mejora del 84A, contando con cinco puertos de
entrada y salida optimizadas para comunicación serial, conversiones analógica-digital entre
otras prestaciones. El fabricante en fechas recientes informa que este dispositivo será
descontinuado proponiendo el uso del PIC16887.
16
Existen dos posiciones de memoria que son de particular importancia: la dirección 0 que es
la posición de reinicio del microcontrolador (RESET) y a la posición 4 que es una posición
de redirección a la que se apunta tras una interrupción de programa cualquiera.
22
Registro INDF (00h y 80h). El registro INDF (Indirect File) que ocupa la posición
00 no tiene existencia física, por lo que no se podrá acceder a él. En realidad, este
registro sirve únicamente para especificar la utilización del direccionamiento
indirecto junto con el registro FSR.
Registro TMR0 (01h). El registro TMR0 (Timer 0) almacena el valor del contador
TMR0, que como ya sabemos, está funcionando continuamente e incrementando el
valor que tiene almacenado. Las opciones que controlan este contador residen en el
registro OPTION. El registro TMR0 se incrementa en una unidad con cada impulso
de reloj seleccionado mediante el registro OPTION. Cada vez que llega al valor FF,
vuelve a 00 generando una interrupción, si se ha autorizado, y continúa su ciclo
indefinidamente. El registro TMR0 se puede leer o escribir directamente con
cualquier instrucción, con el fin de conocer su posición actual, o para inicializarlo
en un estado determinado. Es importante saber que después de cualquier escritura
en este registro, es necesario un retardo de dos ciclos de instrucción para que se
retome la incrementación, independientemente de la fuente de reloj usada. Las 23
instrucciones concernidas son MOVF TMR0 o CLRF TMR0. El reloj interno deja
de funcionar en el modo SLEEP, por lo que no se puede contar con sus
interrupciones en este modo ni por consiguiente, que salga de este modo de
funcionamiento por medio de dicha interrupción. Obsérvese que todas las
instrucciones que escriben en el TMR0 ponen a cero al prescaler (divisor), cuando
éste está asignado al temporizador.
Contador de programa PC (02h y 82h). Este registro, normalmente denominado
PC (Program Counter), es equivalente al de todos los microprocesadores y contiene
la dirección de la próxima instrucción a ejecutar. Se incrementa automáticamente al
ejecutar cada instrucción, de manera que la secuencia natural de ejecución del
programa es lineal, una instrucción después de la otra. Algunas instrucciones (que
llamaremos de control) cambian el contenido del PC alterando la secuencia lineal de
ejecución. Otras instrucciones de control como los saltos condicionales, que
producen un incremento adicional del PC si se cumple una condición específica,
haciendo que el programa salte, sin ejecutar, la instrucción siguiente. El PC está
implementado por dos registros, PCLATH (5 bits) y PCL (8 bits)
o Los 8 bits de menor peso del PC los proporciona el registro PCL (02h) y a
diferencia de la mayoría de los microprocesadores convencionales, es
también un registro accesible al programador como registro de memoria
interna de datos. Es decir que cualquier instrucción común que opere sobre
registros puede ser utilizada para alterar el PCL y desviar la ejecución del
programa.
o Los 5 bits de mayor peso del PC que no pueden leerse ni escribirse
directamente proceden del registro PCLATH en la dirección 0Ah y 8Ah.
En la instrucción de salto relativo, el resultado de las mismas sólo afecta a los 8 bits
de menor peso. Los 5 bits de mayor peso se suministran desde PCLATH (figura
2.11 (a)). En las instrucciones GOTO y CALL se efectúa la misma operación
teniendo presente que el PC se codifica mediante 11 bits y se suministran en la
propia instrucción, desde el código OP. Los dos bits de más peso del PC de cargan
con los bits 4 y 3 del registro PCLATH (figura 2.11 (b)).
Dado que la memoria de programa se organiza en páginas de 2 K, la posición de la
memoria la indican los 11 bits de menor peso del PC y los 2 bits de mayor peso
indican la página. El reset pone a 0 todos los bits de PCL y PCLATH haciendo que
el reinicio comience en la dirección 0000h.
24
(a) (b)
Figura 2.11. Carga del PC: (a) Por salto relativo; (b) Por salto absoluto.
Los ocho registros de pila no están situados en el mismo espacio de memoria que
los demás (figura 2.12). Son registros de trece bits capaces de contener íntegramente
al PC. Su utilización es automática, ya que el PC se introduce en la pila durante la
ejecución de una instrucción CALL o de una interrupción, y se extrae de la pila
durante la ejecución del retorno correspondiente.
o Bit 4 (flag), TO: Time Out. Tiempo de término o acabado, es una bandera
o señalador:
1. Se pone a 1 tras conectar la alimentación o al ejecutar CLRWDT o
SLEEP.
0. Se pone a 0 por desbordamiento del Perro Guardián WDT.
o Bit 3 (flag), PD: Power Down. Apagado, también es una bandera:
1. Se pone automáticamente a 1 tras conectar la alimentación VDD o
ejecutar CLRWDT, que resetea el contador WatchDog.
0. Se pone a 0 al ejecutar la instrucción SLEEP.
o Bit 2 (flag), Z. Bandera indicadora de cero (Zero) aritmético:
1 = El resultado de una operación aritmética o lógica es 0.
0 = El resultado es distinto de 0.
o Bit 1 (flag), DC (Digit Carry). Acarreo en el 4º bit de menos peso.
Funciona igual que el bit de Carry descrito a continuación. De interés en
operaciones en BCD.
o Bit 0 (flag), C (Carry). Acarreo en el 8º bit o bit de más peso. Es el bit de
"acarreo" en operaciones de suma AADWF y ADDLW, así como también el 26
bit de "préstamo" en las instrucciones de sustracción SUBWF y SUBLW.
También lo emplean las instrucciones RLF y RRF de rotación de bits.
Suma:
1. Se pone a 1 cuando se ha producido acarreo en la suma en
el bit de mayor peso con las operaciones AADWF y
ADDLW.
0. Se pone a 0 si en la suma no se ha producido acarreo.
Resta:
1. Se pone a 1 si en la resta no se ha producido préstamo.
0. Se pone a 0 cuando se ha producido préstamo en la resta
con las operaciones SUBWF y SUBLW.
Registro FSR (04h y 84h). El contenido del FSR se utiliza para el
direccionamiento indirecto junto con el registro INDF. Este registro contiene 8 bits.
Registros PORTA y PORTB (05h y 06h). Estos registros contienen los niveles
lógicos de las patillas de E/S. Cada bit se puede leer o escribir según la patilla
correspondiente se haya configurado como entrada o como salida. Conviene
recordar que cualquier línea puede funcionar como entrada o como salida. Sin
embargo, si actúa como entrada la información que se introduce no se memoriza,
por lo que la información debe ser mantenida hasta que sea leída. Si la línea actúa
como salida, el bit que procede del bus de datos se guarda en la báscula, con lo que
la información que ofrece esta patilla permanece invariable hasta que se reescriba
este bit.
Registro TRISA y TRISB (85h y 86h). Estos son registros de idéntica longitud
que PORTA y PORTB, respectivamente, debido a que sirven para configurar si los
bits de cada puerto serán de entrada o de salida:
o 1: La patilla del puerto correspondiente será de entrada
o 0: En este caso la patilla actuará como una salida.
Cuando se produce un reset, todos los bits de los registros TRIS pasan a tener el
valor 1 y todas las líneas de E/S actúan como entrada por evidentes motivos de
seguridad para evitar daños irreparables. Todas las patillas de E/S que no se
empleen deben ser llevadas a +5v, regla de las entradas CMOS, preferiblemente a
través de una resistencia para evitar que si por error se configurasen como salidas
puedan darse problemas si presentan un estado bajo.
Registro EECON1 (88h). Este registro contiene configuraciones importantes
acerca de la escritura y la lectura de la EEPROM de datos. En concreto tiene 5 bits
de control, cuya distribución se presenta en la figura 2.19.
W - xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
INDF 00 h ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
TMR0 01 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
PCL 02 h 0000 0000 0000 0000 0000 0000 0000 0000 PC+1 PC+12
STATUS 03 h 0001 1xxx 000u uuuu 0001 0uuu 0000 1uuu uuu0 0uuu uuu1 0uuu
FSR 04 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
PORT A 05 h ---x xxxx ---u uuuu ---u uuuu ---u uuuu ---u uuuu ---u uuuu
PORT B 06 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
EEDATA 08 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
EEADR 09 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
PCLATCH 0A h ---0 0000 ---0 0000 ---0 0000 ---0 0000 ---u uuuu ---u uuuu
INTCON 0B h 0000 000x 0000 000u 0000 000u 0000 000u uuuu uuuu1 uuuu uuuu1
INDF 80 h ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
OPTION 81 h 1111 1111 1111 1111 1111 1111 1111 1111 uuuu uuuu uuuu uuuu
PCL 82 h 0000 0000 0000 0000 0000 0000 0000 0000 PC+1 PC+12
STATUS 83 h 0001 1xxx 000u uuuu 0001 0uuu 0000 1uuu uuu0 0uuu uuu1 0uuu
FSR 84 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
TRIS A 85 h ---1 1111 ---1 1111 ---1 1111 ---1 1111 ---u uuuu ---u uuuu
TRIS B 86 h 1111 1111 1111 1111 1111 1111 1111 1111 uuuu uuuu uuuu uuuu
EECON1 88 h ---0 x000 ---0 ?000 ---0 ?000 ---0 ?000 ---u uuuu ---u uuuu
EECON2 89 h ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
PCLATCH 8A h ---0 0000 ---0 0000 ---0 0000 ---0 0000 ---u uuuu ---u uuuu
INTCON 8B h 0000 000x 0000 000u 0000 000u 0000 000u uuuu uuuu1 uuuu uuuu1
2.3. Recursos especiales
Cada fabricante oferta numerosas versiones de una arquitectura básica de microcontrolador.
En algunas amplía las capacidades de las memorias, en otras incorpora nuevos recursos, en
otras reduce las prestaciones al mínimo para aplicaciones muy simples, etc. La labor del
diseñador es encontrar el modelo mínimo que satisfaga todos los requerimientos de su
aplicación. De esta forma, minimizará el costo, el hardware y el software.
Los principales recursos específicos (algunos ya comentados muy brevemente) que
incorporan los microcontroladores son:
Temporizadores (Timers). Se emplean para controlar periodos de tiempo 33
(temporizadores) y para llevar la cuenta de acontecimientos que suceden en el
exterior (contadores). Para la medida de tiempos se carga un registro con el valor
adecuado y a continuación dicho valor se va incrementando o decrementando al
ritmo de los impulsos de reloj o algún múltiplo hasta que se desborde y llegue a 0,
momento en el que se produce un aviso. Cuando se desean contar acontecimientos
que se materializan por cambios de nivel o flancos en alguna de las patitas del
microcontrolador, el mencionado registro se va incrementando o decrementando al
ritmo de dichos impulsos.
Perro guardián (Watchdog). Cuando el computador personal se bloquea por un
fallo del software u otra causa, se pulsa el botón del reset y se reinicializa el sistema.
Pero un microcontrolador funciona sin el control de un supervisor y de forma
continuada las 24 horas del día. El Perro guardián consiste en un temporizador que,
cuando se desborda y pasa por 0, provoca un reset automáticamente en el sistema.
Se debe diseñar el programa de trabajo que controla la tarea de forma que refresque
o inicialice al Perro guardián antes de que provoque el reset. Si falla el programa o
se bloquea, no se refrescará al Perro guardián y, al completar su temporización,
“ladrará y ladrará” hasta provocar el reset.
Protección ante fallo de alimentación (Brownout). Se trata de un circuito que
resetea al microcontrolador cuando el voltaje de alimentación (VDD) es inferior a un
voltaje mínimo (“brownout”). Mientras el voltaje de alimentación sea inferior al de
brownout el dispositivo se mantiene reseteado, comenzando a funcionar
normalmente cuando sobrepasa dicho valor.
Estado de reposo o de bajo consumo. Son abundantes las situaciones reales de
trabajo en que el microcontrolador debe esperar, sin hacer nada, a que se produzca
algún acontecimiento externo que le ponga de nuevo en funcionamiento. Para
ahorrar energía, (factor clave en los aparatos portátiles), los microcontroladores
disponen de una instrucción especial (SLEEP en los PIC), que los pasa al estado de
reposo o de bajo consumo, en el cual los requerimientos de potencia son mínimos.
En dicho estado se detiene el reloj principal y se “congelan” sus circuitos asociados,
quedando sumido en un profundo “sueño” el microcontrolador. Al activarse una
interrupción ocasionada por el acontecimiento esperado, el microcontrolador se
despierta y reanuda su trabajo.
Conversor A/D (ADC). Los microcontroladores que incorporan un Conversor A/D
(Analógico/Digital) pueden procesar señales analógicas, tan abundantes en las
aplicaciones. Suelen disponer de un multiplexor que permite aplicar a la entrada del
CAD diversas señales analógicas desde las patitas del circuito integrado.
Conversor D/A (DAC). Transforma los datos digitales obtenidos del
procesamiento del computador en su correspondiente señal analógica que saca al
exterior por una de las patitas de la cápsula. Existen muchos efectores que trabajan
con señales analógicas.
Comparador analógico. Algunos modelos de microcontroladores disponen 34
internamente de un Amplificador Operacional que actúa como comparador entre
una señal fija de referencia y otra variable que se aplica por una de las patitas de la
cápsula. La salida del comparador proporciona un nivel lógico 1 ó 0 según una señal
sea mayor o menor que la otra. También hay modelos de microcontroladores con un
módulo de tensión de referencia que proporciona diversas tensiones que se pueden
aplicar en los comparadores
Modulador de anchura de pulsos (PWM). Son circuitos que proporcionan en su
salida pulsos de anchura variable, que se ofrecen al exterior a través de las patitas
del encapsulado.
Puertas de E/S digitales. Todos los microcontroladores destinan algunas de sus
patitas a soportar líneas de E/S digitales. Por lo general, estas líneas se agrupan de
ocho en ocho formando Puertas. Las líneas digitales de las Puertas pueden
configurarse como Entrada o como Salida cargando un 1 ó un 0 en el bit
correspondiente de un registro destinado a su configuración.
Puertas de comunicación. Con objeto de dotar al microcontrolador de la
posibilidad de comunicarse con otros dispositivos externos, otros buses de
microprocesadores, buses de sistemas, buses de redes y poder adaptarlos con otros
elementos bajo otras normas y protocolos. Algunos modelos disponen de recursos
que permiten directamente esta tarea, entre los que destacan:
o UART, adaptador de comunicación serie asíncrona.
o USART, adaptador de comunicación serie síncrona y asíncrona
o Puerta paralela esclava para poder conectarse con los buses de otros
microprocesadores.
o USB (Universal Serial Bus), que es un moderno bus serie para los PC.
o Bus I2C, que es un interfaz serie de dos hilos desarrollado por Philips.
o CAN (Controller Area Network), para permitir la adaptación con redes de
conexionado multiplexado desarrollado conjuntamente por Bosch e Intel
para el cableado de dispositivos en automóviles. En EE.UU. se usa el
J185O.
Figura 2.22. Vista del software programador IC-Prog. El recuadro rojo muestra la zona
donde se implementa la palabra de configuración.
Como podemos ver los nombres de las etiquetas son bastante intuitivos. Este código
debe situarse al principio del programa, después del tipo de PIC a usar y de la
definición de las etiquetas. La línea de configuración siempre comienza con la
directriz __CONFIG y cada opción debe estar separada de otra con el carácter &.
Por ejemplo: 38
Por defecto el PIC tendrá todos los I/O port's (es decir los puertos RA y RB), colocados
como entrada de datos, y si queremos cambiarlos habrá que configurarlos en los registros
correspondientes. Para lograrlo debemos tener en cuenta que:
Si se asigna un CERO (0) a un pin, éste quedará como salida.
Si se asigna un UNO (1), quedará como entrada.
Y que ésta asignación se hace en:
TRISA para los pines del PUERTO A (5 bits), por ejemplo, si TRISA es igual a
11110 todos sus pines serán entradas salvo RA0 que esta como salida.
TRISB para los pines del PUERTO B (8 bits), por ejemplo, si TRISB es igual a
00000001 todos sus pines serán salidas salvo RB0 que esta como entrada.
Ahora bien, cuando el PIC arranca se encuentra en el BANCO 0, pero TRISA y TRISB
están en el BANCO 1, por lo que deberemos cambiar de banco para hacer el cambio. Esto
se logra a través del Registro STATUS:
Colocando un CERO (0) en RP0 estaremos en el BANCO 0.
Colocando un UNO (1) en RP0, estaremos en el BANCO 1.
Ejercicio 2.1. Escribir las instrucciones necesarias para lograr que los tres bits menos
significativos del puerto A funcionen como salidas, y los cuatro bits más significativos del
puerto B deben comportarse como salidas, el resto en ambos puertos deben ser entradas.
Solución: En primer lugar, debemos cambiar de banco:
bsf 0x03,5
Cargamos en el acumulador el valor en binario necesario para configurar el
puerto A:
movlw b'11000'
Trasladamos el dato hacia el registro TRISA:
movwf 0x85
Cargamos el valor binario correspondiente:
movlw b'00001111'
Trasladamos el valor hacia el registro TRISB
movwf 0x86
Finalmente, volvemos al banco 0:
bcf estado,5
Aunque el ejercicio 2.1 ejemplifica como gestionar los registros de la memoria del
microcontrolador para configurar los puertos, no es aún un código ejecutable en el circuito
integrado. El siguiente ejercicio presenta un programa ejecutable por el microcontrolador
que implementa las acciones del ejercicio 2.1.
41
Ejercicio 2.2. En el siguiente código identifique el segmento en el que se han incluido las
instrucciones del ejercicio 2.1. Busque en las hojas de datos o en la bibliografía la
finalidad de las instrucciones que desconozca, o asesórese de su docente.
;-------------------------------------------------------------------
; PROGRAMA DE CONFIGURACIÓN DE PUERTOS
;-------------------------------------------------------------------
#include p16f84a.inc
;--------------------Variables------------------------------------
ESTADO equ 0x03
CONFIGPTOA equ 0x05
CONFIGPTOB equ 0x06
;----------------Configuración de reset------------------------
org 0x00
RESET goto INICIO
;--------------Configuración de puertos-----------------------
org 0x05
INICIO bsf ESTADO,5
movlw b'11000'
movwf CONFIGPTOA
movlw b'00000000'
movwf CONFIGPTOB
bcf ESTADO,5
;-------------------------------------------------------------------
end
;-------------------------------------------------------------------
3. Características eléctricas del microcontrolador
En esta unidad el alumno:
Analiza las características eléctricas del microcontrolador.
Existen 4 modos de oscilador para el PIC16F84A. Tres utilizan cristal de cuarzo (LP, XT y
HS) y la cuarta utiliza una resistencia y un condensador (RC).
Relacionados con los modos de oscilador y la frecuencia máxima a la que el PIC podrá
trabajar tenemos 3 versiones del PIC16F84A:
Los valores de R deben estar comprendidos entre 5 y 100 KΩ, mientras que los valores de
C no deben ser inferiores a 20 pF. Es importante saber que, para valores de resistencia
menor a 5 KΩ, el sistema se hace inestable o se podría detener la oscilación
completamente. Para valores de resistencias mayores a 100 KΩ (por ejemplo 1 MOhmio),
el oscilador se hace muy susceptible al ruido, humedad y a la temperatura por lo tanto se
recomienda que este tipo de oscilador se encuentre en el siguiente rango (5KΩ < R < 100
KΩ. Por otro lado, se recomienda utilizar un condensador no polarizado mayor de 20 pF
para disminuir el ruido y aumentar la estabilidad del sistema. La frecuencia del oscilador,
dividida por 4, está disponible en el terminal OSC2/CLKOUT y puede utilizarse para
comprobar la frecuencia o para sincronizar otros dispositivos.
A continuación, se muestran algunos gráficos que muestran valores de frecuencia de
oscilación según el condensador y la resistencia. También es importante saber que la
tensión de alimentación que tendrá el microcontrolador influye directamente en la
frecuencia final. Las siguientes figuras muestran la frecuencia obtenida en base al voltaje de
alimentación y la configuración de resistencias y condensador.
46
Figura 3.6. Frecuencias obtenidas para varias resistencias y un capacitor de 100 pF.
47
Si nos damos cuenta, para algunos valores del voltaje, el valor de frecuencia se hace
verdadero para la expresión de la frecuencia que da la fórmula: 𝑓 = 𝑅 ∙ 𝐶. Donde C está
expresado en Faradios y R en Ohmios. Por desgracia el punto en el que coincide la
frecuencia y el voltaje no es lineal para todos los valores de V.
Señal de reloj externa: En ciertas ocasiones disponemos una fuente de reloj que proviene
de una fuente externa como puede ser un oscilador TTL o CMOS. La onda generada por
esta fuente externa puede servir para poner en funcionamiento el PIC. En la siguiente figura
tenemos la forma de conexionar la entrada digital a través de un inversor lógico.
El oscilador TTL es un dispositivo basado en un cristal que contiene toda la circuitería para
generar una onda cuadrada. Al incluir toda la circuitería esto lo convierte en la opción más
costosa; pero permite una precisión óptima en la señal de reloj emitida.
Estos tipos de cristales están diseñados especialmente para tecnologías TTL. Las
frecuencias disponibles para esta versión de cristal son muy amplias y las más usuales son 48
1, 1.8432, 2, 4, 8, 10, 11.059, 12, 14.31818, 16, 20, 25, 32, 33, 40, 50, 80 y 100 MHz. En la
figura 3.9 se muestra como debe conectarse este dispositivo al microcontrolador.
En todos los casos, salvo en el quinto, el contador de programa PC se pone a 0000 h (vector
de reset), donde debe encontrarse la primera instrucción ejecutable del programa. Además,
todos los registros específicos (SFR) son colocados en estados predeterminados (ver Estado
predeterminado de los registros específicos en Registros del PIC16F84A, sección 2.2.4). 49
En el quinto caso, cuando se produce un desbordamiento del WDT mientras el PIC está en
modo SLEEP, no se produce un reset propiamente dicho, sino que el PIC se sale del modo
SLEEP, se "despierta" mediante el temporizador watchdog y el PC se incrementa en una
unidad para pasar a la instrucción que sigue a la instrucción SLEEP, igual que cuando se
sale de este modo mediante una interrupción, si el bit GIE del registro INTCON está a uno.
Teniendo en cuenta lo que hemos visto sobre POR, PWRT y OST, la secuencia que se
sigue si PWRT y OST están habilitados es:
PWRT actúa después de que POR termine.
OST actúa después de que PWRT termine.
El tiempo total variará según el modo del oscilador y la configuración de PWRTE. Por
ejemplo, en el modo RC con PWRT deshabilitado el tiempo de reset será mínimo. Lo
anterior se expresa mejor en la siguiente tabla.
Tabla 8. Secuencias del Reset.
Configuración oscilador Alimentación Despertar desde SLEEP
PWRT habilitado PWRT deshabilitado
XT, HS, LP 72 ms + 1024 TOSC 1024 TOSC 1024 TOSC
RC 72 ms - -
50
Nota: Si en MCLR se aplica una tensión por debajo de VSS se pueden inducir corrientes
mayores de 80 mA, que pueden causar problemas. Para solucionar esto se coloca una
resistencia de 50 a 100 ohmios para aplicar un nivel bajo a la patilla MCLR en lugar de
llevar esta patilla directamente a VSS. En nuestro caso esta resistencia es R2.
Para terminar, habría que decir que, en la mayoría de los casos será más que suficiente con
conectar MCLR a la alimentación positiva (VCC) y usar los dispositivos de reset del PIC.
3.3.2. Reset manual
En el caso de que sea necesario se puede aplicar un reset manual a la patilla MCLR
mediante un pulsador y una resistencia. La figura 3.11 muestra una configuración básica
para realizar un reset manual.
51
La resistencia de 100 ohmios puede eliminarse del circuito al no existir peligro de que en
MCLR aparezcan tensiones menores de VSS. Pero debería mantenerse si se coloca un
condensador en paralelo al pulsador.
Ejercicio 3.1. Retome la teoría del diseño secuencial de su curso de Electrónica Digital
para diseñar un circuito contado ascendente desde 0 hasta 9 que cuente con las siguientes
características:
Emplear circuitos osciladores 555 para generar la señal de reloj a una frecuencia
adecuada para la visualización de los valores.
Emplear dispositivos TTL de preferencia y CMOS en su defecto.
Poseer dos señales de control:
o E (ENABLE). Habilitador de conteo.
E=0, conteo ascendente, desde el número en retención por pausa.
E=1, pausa el conteo.
o R (RESET). Reinicio del conteo.
R=0, conteo normal (ascendente).
R=1, reinicia el conteo desde 0.
Visualizar las salidas en un display de 7 segmentos, se permite el uso del CI
decodificador BCD correspondiente.
56
(a) (b)
(c)
(d)
Figura 4.1. Diversos IDE’s para microcontroladores PIC: (a) Proteus VSM Studio; (b) PIC
Simulator IDE; (c) MPLABX; (d) CCSC Compiler
Normalmente, un IDE consiste de un editor de código fuente, herramientas de construcción
automáticas y un depurador. La mayoría de los IDE tienen auto-completado inteligente de
código (IntelliSense) y pueden incluir un compilador. En el caso de los microcontroladores
existen varios IDE que además de las prestaciones comentadas pueden incluir simuladores.
Así podemos citar a Proteus VSM Studio, PIC Simulator IDE, MPLABX IDE, (figura 4.1).
59
El fabricante de los PIC’s oferta grabadores oficiales que tienen completa compatibilidad
con sus diversas familias, a los cuales ha denominado PIC kit (figura 4.5).
Existen grabadores fabricados por terceros que tienen una funcionalidad limitada por ser
compatibles sólo con algunos modelos de microcontroladores, o por las continuas
actualizaciones que realiza el fabricante sobre el lenguaje y las directivas de configuración 60
del microcontrolador. Sin embargo, siempre es posible adecuar el código de tal forma que
estos dispositivos sean utilizables, lo que representa una ventaja al considerar su costo.
Ejemplos de estos grabadores, disponibles a la fecha de elaboración de este texto (Junio de
2016) se visualizan en la figura 4.6.
62
Ejemplo:
movlw .100 Significa cargar el número 100 decimal en el registro W.
Los nombres pueden aparecer en el campo de operando; éstos son tratados como el dato
que representan.
Por ejemplo:
REG1 EQU 05h
VALOR EQU 20h
movlw VALOR+2
addwf REG1,1
addwf REG1+1,1
Material y equipo:
Computadora personal.
Software PIC Simulator IDE.
Tarjeta grabadora de PICs.
Software de grabación de PIC.
65
Microcontrolador PIC 16F84A.
Leds.
Resistencias de 330 Ω , 1 kΩ, 10 kΩ.
Capacitores de 22 pF.
Cristal de 4 MHz.
Cable UTP y caimanes.
Fuente de voltaje.
Multímetro.
Protoboard.
Introducción
En las sesiones teóricas se han dado los requerimientos teóricos y prácticos para la
programación de los PICs. Se ha descrito el lenguaje ensamblador como la base de
programación de un PIC. Se dieron ejemplos acerca de la configuración de los
registros especiales del microcontrolador, que permiten entre otras cosas definir los
pines que servirán de entrada y salida del PIC, declarar los registros que serán
usados como la RAM del sistema. Como tal entonces se está preparado para tener la
primera experiencia programando PICs, la cual consiste solamente en programar el
puerto B del PIC en su pin 0 para lograr que éste encienda y apague un led en un
ciclo infinito.
Desarrollo
a) Programación. En esta parte seguiremos los siguientes pasos:
i. Abriremos el programa PIC Simulator IDE que nos permitirá tener un
compilador de lenguaje ensamblador y al mismo tiempo un simulador visual
básico de programas PIC. Con la asesoría de su docente reconozca los
componentes básicos del mismo.
ii. Configure el simulador para utilizar el PIC 16f84A.
iii. Una vez conocido el entorno abra el editor de código de ensamblador y
proceda a capturar el código que se muestra en la figura 4.9. Compile y
corrija los posibles errores cometidos.
iv. Abra el simulador de arreglo de leds y confirme que se encuentran
“conectados” al puerto B del microcontrolador y simule el programa. Dibuje
el diagrama de flujo que describa el funcionamiento del programa (figura
4.9).
66
Figura 4.9. Distintas vistas del uso del PIC Simulator IDE.
b. Grabado del PIC y armado del circuito de prueba. Con la asesoría de su docente
realizará lo siguiente:
i. De los archivos generados por la simulación obtendrá el archivo *.hex.
ii. El archivo hex será cargado al grabador de PICs y se hará lo propio,
instalando la tarjeta y el microcontrolador en ella.
iii. Proceda al armado del circuito de la figura 4.10 y disponga en su posición al
microcontrolador.
iv. Encienda la fuente de alimentación y observe el resultado.
67
Material y equipo:
Computadora personal.
Software PIC Simulator IDE.
Tarjeta grabadora de PICs.
Software de grabación de PIC.
Microcontrolador PIC 16F84A.
68
Leds.
Resistencias de 330 Ω , 1 kΩ, 10 kΩ.
Capacitores de 22 pF.
Cristal de 4 MHz.
Cable UTP y caimanes.
Fuente de voltaje.
Multímetro.
Protoboard
Introducción
Los lenguajes de programación de alto nivel se distinguen por la facilidad con que
se pueden implementar en ellos bloques de decisión. De la misma manera
establecer una tarea repetitiva resulta sencilla en esos lenguajes. El lenguaje de bajo
nivel en cambio no tiene implementadas instrucciones que nos faciliten esa tarea
porque la lógica que se maneja en él es la de la lógica de registros que supone
manipular directamente direcciones de memoria contenidas en un dispositivo
electrónico. Sin embargo, la lista de instrucciones que poseen los
microcontroladores incluyen algunas que permiten probar la validez de la
comparación de valores booleanos a través operaciones aritméticas, realizando
condicionalmente un salto de las líneas de instrucción dejando sin ejecutar la que
sigue inmediatamente y ejecutando la que sigue una línea después. La utilización
ingeniosa de tales instrucciones nos permitirá realizar saltos entre rutinas y
programar ciclos y/o retardos. El código que se ofrece en ésta práctica ilustra este
hecho, con el objetivo de generar un programa que permita encender
secuencialmente cada uno de los leds conectados al puerto B de nuestro
microcontrolador.
Desarrollo
Realice las siguientes tareas:
i. Capture el siguiente código en el PIC Simulator IDE y simúlelo. Revise el
código y haga un bosquejo de su diagrama de flujo. Resalte las
instrucciones que llaman subrutinas, distinga etiquetas de bloques de
programa, reconozca las instrucciones de salto condicional y diga cuantos
ciclos hay en el programa. Diga cuál es la finalidad de implementar esos
retardos.
69
En esta arquitectura el valor de RESET de los registros TRIS suele ser un ‘1’, de forma que
por defecto los pines estén configurados como entradas evitando posibles cortocircuitos en
la alimentación que podrían dañar el micro o el resto del sistema.
El registro PORT funciona como un latch para los datos de salida. Cuando el registro
PORT se lee (por ejemplo: movf PORTB,W), el micro lee los niveles presentes en los
pines de I/O (no en los latches).
El puerto B tiene internamente unas resistencias de pull-up conectadas a sus pines (sirven
para fijar el pin a un nivel de cinco voltios), su uso puede ser habilitado o deshabilitado
bajo control del programa. Todas las resistencias de pull-up se conectan o se desconectan a
la vez, usando el bit llamado RBPU que se encuentra en el registro (posición de memoria
RAM) llamado OPTION. La resistencia de pull-up es desconectada automáticamente en un
pin si este se programa como salida. El pin RB0/INT se puede configurar por software para
que funcione como interrupción externa, para configurarlo se utilizan unos bits de los
registros INTCON y OPTION.
El pin RA4/TOCKI del puerto A puede ser configurado como un pin de entrada/salida o
como entrada del temporizador/contador. Cuando este pin se programa como entrada
digital, funciona como un disparador de Schmitt (Schmitt trigger), puede reconocer señales
un poco distorsionadas y llevarlas a niveles lógicos (cero y cinco voltios). Cuando se usa
como salida digital se comporta como colector abierto, por lo tanto, se debe poner una
resistencia de pull-up (resistencia externa conectada a un nivel de cinco voltios). Como
salida, la lógica es inversa: un "0" escrito al pin del puerto entrega en el pin un "1" lógico.
Además, como salida no puede manejar cargas como fuente, sólo en el modo sumidero.
Como este dispositivo es de tecnología CMOS, todos los pines deben estar conectados a
alguna parte, nunca dejarlos al aire porque se puede dañar el integrado. Los pines que no se
estén usando se deben conectar a la fuente de alimentación de +5V, como se muestra en la
figura 5.3.
72
73
Cada elemento del display tiene asignado una letra que identifica su posición en el arreglo
del display (ver la figura 5.5):
De ánodo común, todos los ánodos de los diodos LED unidos y conectados a la
fuente de alimentación (figura 5.6). En este caso para activar cualquier elemento
hay que poner el cátodo del elemento a tierra a través de una resistencia para
limitar la corriente que pasa por el elemento.
Figura 5.6. Arreglo de leds para el display en ánodo común.
De cátodo común, tiene todos los ánodos de los diodos LED unidos y
conectados a tierra (figura 5.7). Para activar un segmento de estos hay que poner
el ánodo del segmento a encender a Vcc (tensión de la fuente) a través de una 74
resistencia para limitar el paso de la corriente.
Ejercicio 5.1. Tablas, Timer Interno y display de 7 segmentos de cátodo común. Diseño de
un contador de 0 a 9 de pulsos externos. Los pulsos se generan de modo manual.
Objetivos:
Conocer cómo se pueden almacenar valores direccionados (arreglos tipo lista)
en la memoria del PIC y la manera en que se extraen de ella para su proceso en
el programa.
Emplear el Timer interno del microcontrolador como un receptor de disparos
externos.
Emplear el compilador MPLAB y el simulador PROTEUS.
Material y equipo:
Computadora personal.
Software Microchip MPLAB.
Software Proteus.
Tarjeta grabadora de PICs.
Software de grabación de PIC.
75
Microcontrolador PIC 16F84A.
Display de siete segmentos de cátodo común.
Resistencias de 330 Ω , 1 kΩ, 10 kΩ.
Push buttons.
Capacitores de 22 pF.
Cristal de 4 MHz.
Cable UTP y caimanes.
Fuente de voltaje.
Multímetro.
Protoboard.
Introducción
Una manera de implementar “tablas” es incluyendo posiciones de memoria
debidamente direccionadas. Esto se realiza a través del registro contador de
programa (PCL) que es quien direcciona las posiciones de memoria que almacenan
códigos hexadecimales de instrucción y/o de valores. Entender cómo ocurre este
proceso nos devolverá a las sesiones teóricas donde se explora el Lenguaje de la
Lógica de Registros.
Ahora bien, un microcontrolador puede mantener un ciclo de reloj para la ejecución
de programas basado en el cristal que es implementado en el arreglo del circuito,
por lo que para ejecutar instrucciones en el tiempo divide la frecuencia del cristal
en 4. Así si el cristal es de 4 MHz cada instrucción (exceptuando las de salto
condicional) se ejecuta en un ciclo de 1 MHz o en un tiempo de 1 microsegundo.
Pero también es capaz de tomar un reloj externo como referencia, para lo cual se
puede emplear el pin TOCK del puerto A para conectarlo físicamente y configurar
el registro TMR0 para que lea los flancos desde aquel pin.
En ésta práctica lo que se busca es almacenar los códigos hexadecimales necesarios
para encender un display de 7 segmentos que muestre los números dígitos del
sistema hexadecimal. El cambio de número a número se efectuará manualmente
pulsando valores desde el pin TOCK.
Desarrollo
Con la asesoría de su docente realizará lo siguiente:
i. Abrirá y conocerá el entorno de programación del MPLAB.
ii. Creará un nuevo proyecto en él mediante un asistente interactivo.
iii. Escribirá en código convencional de Ensamblador el programa de la práctica (el
PIC Simulator IDE escribe algunas líneas por nosotros, el MPLAB no). A
continuación, mostramos el código a capturar, denote las partes del código
donde se configura el Timer, donde se declaran los valores de la tabla, y la
manera en que son procesados por el programa principal. Compile el programa
para obtener el archivo *.hex.
76
#include <p16F84A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC
;declaración de variables
TIMER0 EQU 0x01
CONTPROG EQU 0x02
ESTADO EQU 0x03
OPCION EQU 0x81
PUERTOB EQU 0x06
CONFIGPTOB EQU 0x86
;vector de reseteo
ORG 0x00
Reset GOTO INICIO
;rutina de tabla
TABLA movf TIMER0,0
andlw 0x0F
addwf CONTPROG,1
retlw 0x3F
retlw 0x06
retlw 0x5B
retlw 0x4F
retlw 0x66
retlw 0x6D
retlw 0x7D
retlw 0x07
retlw 0x7F
retlw 0x67
retlw 0x77
retlw 0x7C
retlw 0x39
retlw 0x5E
retlw 0x79
retlw 0x71
;entradas y salidas
INICIO bsf ESTADO,5
clrf CONFIGPTOB
bcf ESTADO,5
;configuración del TMR0
bsf ESTADO,5
bsf OPCION,5
bsf OPCION,4
bcf ESTADO,5
clrf TIMER0
;programa principal
PROGRAMA call TABLA
movwf portb
goto PROGRAMA 77
;=================================================
goto $
END
78
79
Introducción
Un modo simple de detectar la tecla presionada es incrementar una variable con la
cuenta de las teclas revisadas, de este modo al detectaruna pulsación el valor de la
cuenta será el valor de la tecla presionada. Si al final no se presionó ninguna tecla
la variable se pone a cero y la cuenta vuelve a comenzar. El puerto B del
microcontrolador 16f628 (así como en el 16f877) viene preparado especialmente
para el control de un teclado matricial 4x4. Para tener siempre un valor de 1 lógico
en las colúmnas del teclado (parte alta del puerto B del pic) es necesario conectar
resistencias de pull-up, sin embargo, el puerto B cuenta con resistencias de pull-up
integradas, de ese modo es posible trabajar con un teclado matricial sin necesidad
de ningún componente externo.
Desarrollo
Realizar los siguientes pasos con la asesoría de su docente:
i. Realizar el circuito de la figura 5.13 en ISIS Proteus. Observe el
microcontrolador en uso.
81
processor 16F628
include <p16f628.inc>
__config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF
ORG 00H 86
GOTO INICIO
ORG 0X4
CAMBIO CALL MOMENTO
bcf INTCON,1;quitar bandera INTF
BSF INTCON,7 ;habilitacion global GIE
MOVWF CUMULO ;se guarda el acumulador en un registro
MOVF STATUS,W ;el status tambien se va a guardar
BANCO0 ;se asegura que esta en banco cero
MOVWF ESTABLO ;aqui se guarda el estatus
btfss PORTB,4
GOTO FARO ;1a opcion, enciende ~ 1 seg
BTFSS PORTB,5
GOTO VELA ;2a opcion, enciende ~ 10 seg
ALTERNA BCF PENDON,0
MOVLW 0X3 ;3a opcion, enciende o apaga alternado
MOVWF PAU
CLRF PENDON
bsf PENDON,3
GOTO ACABA
FARO CLRF PENDON
MOVLW 0X3
MOVWF PAU
BSF PENDON,1
GOTO ACABA
VELA CLRF PENDON
MOVLW 0X37
MOVWF PAU
BSF PENDON,2
GOTO ACABA
ACABA MOVF ESTABLO,W
MOVWF STATUS
SWAPF CUMULO,F
SWAPF CUMULO,W
RETFIE
INICIO BANCO1
movlw 0xFD ;RB1 salida, RB0,4,5 y 6 entradas
movwf TRISB
bcf OPTION_REG,7 ;para Pull Up en puerto B
bsf PCON,3 ;para OSCF a 4 MHz
movlw 0xFE ;RA0 salida, RA2 entrada
movwf TRISA
BANCO0
MOVLW 0X3
MOVWF PAU
BSF PENDON,3
MOVLW 0X90
MOVWF INTCON
LUZ BSF PORTB,1 ;enciende L.I.R.
call MOMENTO
MOVLW 0X4
MOVWF EVE
TRENES movlw 0X5
movwf CONT
CALL MOMENTO
PULSOS bcf PORTB,1
call PICO
bsf PORTB,1
call PICO
decfsz CONT
goto PULSOS
BTFSS PORTA,4
GOTO PASA 87
BTFSS PENDON,3
GOTO DESACTI
GOTO LUZ
PASA DECFSZ EVE
GOTO TRENES
VIBRA btfsc PENDON,0
GOTO DESACTI
BTFSC PENDON,1
GOTO ACTIVA ;1a opcion
btfsc PENDON,2
GOTO ACTIVA ;2a opcion
BTFSS PENDON,3 ;3a opcion
GOTO APAGA
BTFSC PENDON,4
GOTO APAGA
bsf PENDON,4
BSF PORTA,0
MISMO call PAUSA
goto LUZ
APAGA BCF PENDON,4
BCF PORTA,0
goto MISMO
ACTIVA bsf PORTA,0
call PAUSA
goto LUZ
DESACTI bcf PORTA,0
call MOMENTO
goto LUZ
PICO movlw 0x06
movwf P
PE decfsz P,f
goto PE
return
MOMENTO movlw 0x3
movwf M
MOM movlw 0xFA
movwf L
MOL decfsz L
goto MOL
decfsz M,f
goto MOM
return
PAUSA movfw PAU
movwf L
PAL movlw 0xFF
movwf M
PAM MOVLW 0XFF
MOVWF P
PAN DECFSZ P,F
GOTO PAN
decfsz M,F
goto PAM
decfsz L,f
goto PAL
return
end
89
Figura 5.16. Circuito básico de interfaz de potencia con indicador de relé polarizado.
Ejercicio 5.4. Aplicación de interfaz de potencia: Inversión del giro de un motor DC.
Objetivo:
Observar la implementación de interfaces de potencia para el control de
motores de DC.
Documentarse sobre el funcionamiento de los puentes H.
Material y equipo:
Computadora personal.
Software Microchip MPLAB.
Software Proteus.
90
Tarjeta grabadora de PICs.
Software de grabación de PIC.
Microcontrolador PIC16F84A.
CI Decodificador BCD a 7 segmentos TTL o CMOS.
Display de siete segmentos de cátodo común.
Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
Transistores, cuatro BC548 (usar TIP41 si se usan motores de más potencia.
Motor DC pequeño.
Push buttons.
Capacitores de 22 pF.
Cristal de 4 MHz.
Cable UTP y caimanes.
Fuente de voltaje.
Multímetro.
Protoboard.
Introducción
Un Puente en H es un circuito electrónico que permite a un motor eléctrico DC
girar en ambos sentidos, avance y retroceso. Son ampliamente usados en robótica y
como convertidores de potencia. Los puentes H están disponibles como circuitos
integrados, pero también pueden construirse a partir de componentes discretos.
El término "puente H" proviene de la típica representación gráfica del circuito
(figura 5.18).
91
Desarrollo:
En robótica se emplea mucho el control de motores DC para hacer la inversión de
giro. Como sabemos un motor de corriente continua tiene 2 polos: positivo y
negativo. Para lograr la inversión del giro del motor solo tenemos que invertir la
polaridad de la fuente. Una solución con la implementación de un microcontrolador
se muestra en la figura 5.20.
; Reset 92
org 0x00
Reset goto inicio
; Configuración de puertos
org 0x05
inicio bsf status,5
movlw b'0000001'
movwf trisb
bcf status,5
; Programa principal
Principal btfsc puertob,0
goto izquierda
goto derecha
izquierda bsf puertob,1
bcf puertob,2
goto inicio
derecha bcf puertob,1
bsf puertob,2
goto inicio
end
Como ejemplo suponga que W=0x0A y ESTADO=0xAF en el momento que ocurre una
interrupción. Entonces, la forma de guardarlos y recuperar estos registros sería la que se
muestra en el siguiente código.
En el código anterior Reg_W y Reg_S son registros alternativos para guardar los valores
del registro W y del registro de estado respectivamente. 95
96
Figura 6.1. Circuito para una interrupción por pulso externo en RBO/INT.
Materiales y Equipo:
Computadora personal.
Software Microchip MPLAB.
Software Proteus.
Tarjeta grabadora de PICs.
Software de grabación de PIC.
Microcontrolador PIC16F84A.
Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
Push button.
Capacitores de 22 pF.
Cristal de 4 MHz.
Cable UTP y caimanes.
Fuente de voltaje.
Multímetro.
Protoboard.
Introducción
Fundamentalmente estudiamos y ponemos en práctica la configuración del
microcontrolador para aceptar y controlar las interrupciones externas durante la
ejecución de un programa. En particular se busca configurar la lectura de flancos
descendentes por el pin RB0. Así que se trabajaremos con el registro OPTION y el
INTCON.
Desarrollo
Los pasos a seguir son:
i. Implementar en Proteus ISIS el circuito de la figura 6.1.
ii. Generar el código mostrado a continuación ya sea en MPLABX o en el
editor ASM de Proteus VSM. Corregir lo necesario y generar el
hexadecimal correspondiente.
;---------------------------------------------------
; Programa ejemplo de interrupciones externas
;---------------------------------------------------
#include p16f84a.inc
;-------Habilitación de interrupciones-------
bsf INTCON,GIE ; habilitamos todas las interrupciones
bsf INTCON,INTE ; que sean interrupciones externas
clrf PORTB ; limpia el puerto B
DORMIR sleep
goto DORMIR ; modo pasivo
Introducción
En la siguiente práctica se muestra el funcionamiento de la interrupción del Timer
interno. Dicha interrupción se presenta cuando se sobrepasa el limite del valor
máximo que se puede contener en el registro TMR0.
Observe el proceso que se sigue para implementar las interrupciones del Timer para
que cumpla los objetivos solicitados.
Pasos:
I. Configurar el hardware del contador. Se configurará el registro
OPTION_REG y en concreto los bits siguientes:
El bit 4, llamado TOSE, nos da la elección de elegir el tipo de flanco:
ascendente o descendente. Un 1= flanco descendente y un 0= flanco
ascendente.
El bit 5, llamado TOCS, nos da la opción de elegir el tipo de reloj: un 1
significan pulsos introducidos por el pin nº 3 (T0KI) y un 0 significan
pulsos de reloj interno de frecuencia a un cuarto de la frecuencia del
cristal usado. En este caso será pulso exterior.
II. Configurar el software: Se configura el registro INTCON.
o El bit 7 (GIE) se pone a 1 para habilitar el permiso general de
interrupciones.
o El bit 5 (T0IE) se carga con 1 para habilitar el permiso particular de
la interrupción por desbordamiento del contador.
¿Cómo se sabe si se ha producido una interrupción debido al desbordamiento del
contador?
Dicha interrupción tiene asociada una bandera o flag, el bit 2 (T0IF) del registro
INTCON. Esta bandera hay que borrarla por software para liberar el desborde. 100
Desarrollo:
i. Realice el siguiente circuito en Proteus ISIS.
ii. Capture, compile y corrija el siguiente código para obtener el hexadecimal. Simule
en Proteus ISIS. Observe que se usa el PIC16F877A
;====================================================================
;ASIGNANDO REGISTROS
;------------------------------
TEMPINT equ 0x01 ;TEMPINT=TMR0 Registro Temporizador interno
ESTADO equ 0x03
OPCION equ 0x81 ;OPCION=OPTION Registro de config de estado
CONFIGDIGA equ 0x9F
PUERTOB equ 0x06
CONFIGPTOB equ 0x86
INTCONFIG equ 0x0B ;INTCONFIG=INTCON
;------------------------------
;RESET
;------------------------------
org 0x00
RESET goto INICIO
;------------------------------
;INTERRUPCION (CONTROL DE)
101
;------------------------------
org 0x04
goto ISR
;------------------------------
;INICIO
;------------------------------
org 0x05
INICIO
;-----------------------------------------------------
;CONFIGURACIÓN DE PUERTOS
;-----------------------------------------------------
movlw 0x07
movwf CMCON
clrf ESTADO
bsf ESTADO,5
movlw 0x00
movwf CONFIGPTOB
bcf ESTADO,5
;------------------------------------------------------
;Configurar el contador TMR0
;------------------------------------------------------
;TMR0 = contador de flanco descendente cargado con el dato ffh.
;Registro OPTION_REG
;Contador= bit5=T0CS= 1= pulsos exteriores.
;Flanco Descendente= bit4=T0SE= 1
movlw 0xFF
movwf TEMPINT
clrf PUERTOB
bsf ESTADO,5
bsf OPCION,4 ;Se configura lectura flanco de bajada
bsf OPCION,5 ;Se configura lectura por pin T0CKI
;---------------------------------------------
;Preparar interrupciones.
;---------------------------------------------
bcf INTCONFIG,2
bsf INTCONFIG,5 ;Habilitar interrupción por desborde del TMR0.
bsf INTCONFIG,7 ;Habilitar interrupción global
;Espera hasta rebosar el TMR0.
ESPERA btfss INTCONFIG,2 ;salta si es 1. Al dar el flanco
;el contador se desborda al
;pasar de ffh a 00h. La bandera
;se pone a 1 y salto a la interrup-
;ción y luego al programa principal.
;El puerto B se encenderá y apagará
;en un bucle indefinido.
goto ESPERA
bcf ESTADO,5
;-----------------------------------
;PROGRAMA PRINCIPAL
;-----------------------------------
PRINC clrf PUERTOB ;apaga el puerto B
call RETARDO
movlw 0xFF ;enciende el puerto B
movwf PUERTOB
call RETARDO
102
goto PRINC
;-------------------------------------------
;INTERRUPCION DEL TMR0
;-------------------------------------------
ISR bcf INTCONFIG,2 ;Poner a cero el flag
retfie ;retorno subrutina de interrupción
;------------------------------------------------------------------
;Retardos: Explicación de tiempos
;------------------------------------------------------------------
;c1h=193 goto=2 useg. decfsz=1 useg.( salta si es 0 ), 1005723 useg.
RETARDO movlw 0xC1
movwf 0x20
movwf 0x21
movlw 0x01
movwf 0x22
salto1
decfsz 0x20,1
goto salto1
decfsz 0x21,1
goto salto1
decfsz 0x22,1
goto salto1
retlw 0x00
;-----------------------------------------------------
end
iii. Con asesoría de su docente realice la adaptación del código para el 16F84A, a
continuación, implemente físicamente el circuito y realice las pruebas pertinentes.
iv. Realice el reporte correspondiente.
7. Programación del microcontrolador con aplicaciones
En esta unidad el estudiante:
Resuelve problemas mediante la programación en alto nivel de microcontroladores.
Conecta y controla motores con microcontroladores.
Hablar de las distintas técnicas de programación aplicables a este software saldría de los
fines que persigue este texto, por lo que remitimos al estudiante a documentarse con la
variada información existente en libros y en internet sobre este tópico.
En cambio, dado que el estudiante ha tenido un curso de Programación Básica,
fundamentada precisamente en el lenguaje C, creemos factible proponer una serie de
ejemplos que ilustrarán a grandes rasgos la manera de usar el código.
Material y equipo:
Computadora personal.
Software IDE PIC C Compiler.
Software Proteus.
Tarjeta grabadora de PICs.
Software de grabación de PIC.
Microcontrolador PIC16F84A.
Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
Push button.
Capacitores de 22 pF.
Cristal de 4 MHz.
Cable UTP y caimanes.
Fuente de voltaje.
Multímetro.
Protoboard.
104
Introducción
Repetiremos el ejercicio 4.1 para verificar la eficiencia de la codificación en CCS C
y encontrar los puntos de equivalencia con el Ensamblador. Será importante tomar
nota de los aspectos más relevantes y de hacer las preguntas que se crean
pertinentes a su docente.
El proceso que seguiremos será en primer lugar generar el código en PIC C
Compiler. Luego obtendremos los archivos *.hex y *.cof , que serán utilizados en el
simulador de Proteus, sobretodo el segundo que permite hacer depuración del
código.
Desarrollo:
i. En primer lugar, con la guía de su docente conocerá el entorno gráfico
ofrecido por el software.
ii. A continuación, deberá capturar el código mostrado a continuación. Se
aconseja que el estudiante agregue comentarios sobre el código para su
posterior estudio.
105
iii. Compile y obtenga los archivos hex y cof. Luego vuelva a rehacer en
Proteus ISIS el circuito de la figura 4.10 y cargue el archivo cof. Rehalice la
simulación.
iv. Compruebe físicamente su archivo hex y realice las pruebas pertinentes.
v. Realice el reporte correspondiente.
Materiales y equipo:
Computadora personal.
Software IDE PIC C Compiler.
Software Proteus.
Tarjeta grabadora de PICs.
Software de grabación de PIC.
Microcontrolador PIC16F84A.
Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
Push button.
Capacitores de 22 pF.
Cristal de 4 MHz.
Cable UTP y caimanes.
Fuente de voltaje.
Multímetro.
Protoboard.
Introducción
De nuevo provocaremos en el PIC un desborde en el registro TMR0 para provocar
una interrupción. Tendremos ligeras modificaciones sobre el circuito que se ilustran
en la figura 7.1. Se ha incluido en vez de un pulsador un inyector de secuencias para
simular los pulsos externos. Un osciloscopio permite verificar el tiempo con el que
oscila entre encendido y apagado el LED.
106
Desarrollo:
i. Realice el diseño de circuito en Proteus.
ii. Capture el código en PIC C Compiler. Aunque ofrecemos el código al
completo, advertimos al estudiante que es importante que prepare el código
con asesoría de su docente, quien debe hacer diversas consideraciones sobre
la manera de implementar recursos del software que facilitarán la tarea de
programar.
#include <16F877A.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
108
Pines de Bus de datos: El Bus de datos bidireccional comprende desde los pines D0 a D7.
Para realizar la comunicación con el LCD podemos hacerlo utilizando los 8 bits del bus de
datos (D0 a D7) o empleando los 4 bits más significativos del bus de datos (D4 a D7).
Tabla 16. Especificación de terminales del LCD
Pin Símbolo Descripción
1 VSS Voltaje de masa
2 VDD Alimentación CD +5 Volts
3 VO Ajuste del contraste: 0 a 5 Volts
4 RS Control de datos. RS=0 direcciona Control, RS=1 direcciona Datos
5 R/W Lectura/Escritura en LCD: R/W=0 escritura; R/W=1 lectura.
6 E Habilitación
7 D0
8 D1 109
9 D2 Bus de datos para el LCD.
10 D3 Aquí:
11 D4 D0 es el bit menos significativo.
12 D5 D1 es el bit más significativo.
13 D6
14 D7
15 A Alimentación de backlight (+3.5 a +5 Volts, según fabricante)
16 K Masa del backligth
Materiales y equipo:
Computadora personal.
Software IDE PIC C Compiler.
Software Proteus.
Tarjeta grabadora de PICs.
Software de grabación de PIC.
Microcontrolador PIC16F877A.
Pantalla de cristal líquido compatible con el modelo LM016L
Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
Push button.
Capacitores de 22 pF.
Cristal de 20 MHz.
Cable UTP y caimanes.
Fuente de voltaje.
Multímetro.
Protoboard.
Introducción
El lenguaje CCS C incluye una librería para controlar el funcionamiento de una
pantalla de cristal líquido denominada lcd.c.
Ésta librería viene predefinida para conectar el LCD a través del puerto D y E de un
microcontrolador que incluyan dichos puertos (en nuestro caso el 16F877A). Esto
se realiza en el código de la misma como:
Sin embargo, se puede hacer que se redirijan éstas señales hacia otros puertos, por
ejemplo, para el puerto D:
Ejemplo:
printf(lcd_putc,"\n %2.2f la temperatura es: ",temp); //temp es una variable
Desarrollo:
i. Realizar en Proteus el circuito de la figura 7.4.
ii. Con la asesoría de su docente capture, compile y simule el código que se presenta a
continuación. Realizar las correcciones pertinentes.
#include <16f877a.h>
#fuses hs,nowdt
#use delay(clock=20M)
void main()
{
lcd_init();
while(true)
{
lcd_gotoxy(1,1);
printf(lcd_putc," HOLA ITSZ ");
delay_ms(1000);
lcd_gotoxy(1,1);
printf(lcd_putc," BIENVENIDOS ");
delay_ms(1000);
lcd_gotoxy(1,1);
}
}
Ejercicio 7.4. Considere la realización en CCS C del ejercicio 6.1. Deberá documentarse y
plantear la solución. Demuestre el cumplimiento de la actividad entregando:
Circuito físico funcionando.
Reporte incluyendo:
o Hoja de presentación.
o Introducción.
o Planteamiento del problema.
o Desarrollo de la solución, contiendo: sustento documental; listado de
material utilizado en la implementación física; evidencias de la operación
óptima de la implementación física (fotografías).
o Conclusiones.
Ejercicio 7.5. Repita el ejercicio 5.4 con lenguaje CCS C. Entregar:
Circuito físico funcionando.
Reporte incluyendo:
o Hoja de presentación.
o Introducción.
o Planteamiento del problema.
o Desarrollo de la solución, contiendo: sustento documental; listado de
material utilizado en la implementación física; evidencias de la operación
óptima de la implementación física (fotografías). 113
o Conclusiones
8. Convertidores ADC y DAC
En esta unidad el estudiante:
Utiliza el convertidor ADC para fines de control.
Este cociente se realiza en binario. El resultado exacto sería un número infinito de bits, por
lo que se comete un error de cuantificación al tomar solamente una cantidad finita de ellos.
Si llamamos n a la cantidad real de bits, del conversor se tendrá 2n niveles posibles y el
error máximo cometido es de la mitad de la distancia entre dos niveles, o sea:
𝑉𝑘 𝑁 1 𝑉𝑟𝑒𝑓
= 𝐾, o bien, 𝐸𝑚á𝑥 = 2
𝑉𝑟𝑒𝑓 2𝑛
Los conversores A/D, admiten señales analógicas de entrada, pudiendo ser de corriente o
tensión, de una única polaridad o bipolar.
El proceso de conversión digital-analógica, (D/A) es el proceso de tener el valor expresado
en código binario (digital), y convertirlo en un voltaje o corriente equivalente. La
transformación se realiza mediante una correspondencia entre las 2n combinaciones binarias
posibles a la entrada y las 2n valores de tensión (o corriente) obtenidas a partir de una
tensión de referencia (Vref)
El proceso consiste en hacer una ponderación de cada bit y sumar el resultado de todas las
ponderaciones multiplicadas por el valor del bit correspondiente
Las señales digitales, b0, b1, b2, …, derivan generalmente del registro de salida de un
sistema digital.
La resolución de una conversión D/A se define como la menor variación que puede ocurrir
en la salida analógica menor resultado de un cambio en la entrada digital, lo cual se puede
cuantificar en corriente o voltaje, sin embargo, es más útil medirlo en porcentaje:
1 𝛥𝑉
𝑅[%] = 100 𝑛
≈
2 𝑉𝑟𝑒𝑓
Por supuesto, la resolución porcentual se hace menor cuando el número de bits de entrada
se incrementa.
En un microcontrolador es posible encontrar modelos que incorporan la conversión
analógico-digital en su arquitectura, mientras que la conversión digital-analógica requeriría
de dispositivos externos que realizaran la interpretación de las palabras digitales que el
microcontrolador puede entregar por sus puertos. Nosotros ilustraremos con una práctica
básica como realizar una conversión analógica-digital utilizando lenguaje de alto nivel. 115
Dejamos al estudiante el investigar la incorporación de un microcontrolador en un sistema
de decodificación digital-analógica.
En la figura 8.2:
(1) El reloj RC tiene un valor tipico de Tad = 4us
(2) Estos valores violan el mínimo tiempo requerido (1.6us) de Tad
(3) Para conversiones más rápidas se recomienda otro tipo de reloj
(4) Cuando se usa osciladores mayores de 1MHz, el modo RC es recomendable
cuando se está en el modo SLEEP
La figura 8.3 presenta un esquema de configuración para los canales, lo cual se realiza en el
registro ADCON1.
117
Material y Equipo:
Computadora personal.
Software IDE PIC C Compiler.
Software Proteus.
Tarjeta grabadora de PICs.
Software de grabación de PIC.
Microcontrolador PIC16F877A.
Pantalla de cristal líquido compatible con el modelo LM016L
Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
Potenciómetro de 5 kΩ.
Push button.
Capacitores de 22 pF.
Cristal de 20 MHz.
Cable UTP y caimanes.
Fuente de voltaje.
Multímetro. 118
Protoboard.
Introducción
Para manipular el módulo analógico digital en CCS C tenemos las siguientes
instrucciones.
Para configurar el puerto: setup_adc_ports(valor)
Para la lectura del valor y su almacenamiento mediante una variable entera que
depende de la directiva “#DEVICE ADC=” empleada: valor=read_adc().
Desarrollo:
i. Considere el mismo circuito de la figura 7.4.
ii. Con asesoría de su docente compile y simule el siguiente código.
#include <16f877a.h>
#device adc=10
#fuses hs,nowdt
#use delay(clock=20M)
#define lcd_data_port getenv("sfr:portb")
#define lcd_rs_pin pin_b0
#define lcd_rw_pin pin_b1
#define lcd_enable_pin pin_b2
#include <lcd.c>
void main()
{
int16 q;
float p;
setup_adc_ports(an0);
setup_adc(adc_clock_internal);
lcd_init();
while(true)
{
set_adc_channel(0);
delay_us(20);
lcd_gotoxy(1,1);
q=read_adc();
p=(5.0*q)/1024.0;
printf(lcd_putc," ADC = %4Ld",q);
printf(lcd_putc,"\n voltaje = %1.2f",p);
}
}
Características:
o La frecuencia del reloj se acuerda antes de la transmisión
o La sincronización se realiza durante la transmisión
o Transmisión es full-duplex (se utilizan dos lineas, una de transmisión (Tx) y otra de
recepción (Rx).
o Cada trama de datos tiene un tamaño fijo y posee un bit de arranque(inicio) y un bit
de parada(final).
Ejemplo:
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=N,bits=8)
Para la transmisión de datos:
o putc(data) y putchar(data), data es un carácter de 8 bits.
o puts(string), string es una cadena de caracteres constante o una matriz de
caracteres terminada con un cero.
o printf(fname,cstring,values); name, función a utilizar para escribir la
cadena indicada, por defecto se utiliza putc(); cstring, cadena de caracteres
o matriz de caracteres terminada en 0; values, valores a indicar en la cadena,
se debe indicar %nt.
Para la recepción de datos: 123
o value=getc(); value=getch(); value=getchar(); value es un carácter de 8
bits. Espera recibir un carácter por la línea RS232 y devuelve su valor.
o valor=kbhit(); valor=0 (false) si getc() debe esperar a que llegue un
carácter; valor=1 (true) si ya hay un carácter para ser leído por getc().
Material y Equipo:
Computadora personal.
Software IDE PIC C Compiler.
Software Proteus.
Tarjeta grabadora de PICs.
Software de grabación de PIC.
Microcontrolador PIC16F877A.
Pantalla de cristal líquido compatible con el modelo LM016L
Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
Potenciómetro de 5 kΩ.
Push button.
Capacitores de 22 pF.
Cristal de 20 MHz.
Cable UTP y caimanes.
Fuente de voltaje.
Multímetro.
Protoboard.
Introducción
En base a la teoría vista en la sección 9.3 y al objetivo de éste ejercicio proponemos
124
un arreglo como el mostrado en la figura 9.5.
Desarrollo
i. Realice el circuito de la figura 9.5 en Proteus.
ii. Con asesoría de su docente capture, compile y depure los códigos correspondientes
a emisor y receptor de datos según se muestra a continuación.
void main()
{
set_tris_b(0b11111111);
while(true)
{
if(input(pin_b0)==0)
{
putc('1');
while(input(pin_b0)==0);
}
if(input(pin_b1)==0)
{
putc('2');
while(input(pin_b1)==0);
}
if(input(pin_b2)==0)
{
putc('3');
while(input(pin_b2)==0);
}
if(input(pin_b3)==0)
{
putc('4');
while(input(pin_b3)==0);
}
}
}
//Código de Receptor=Rx.c
#include <16f877a.h>
#fuses hs,nowdt,noprotect,noput
#use delay (clock=20M)
#USE RS232(baud=9600,rcv=pin_c7,bits=8,parity=N)
#use standard_io(c)
void main()
{
char valor;
set_tris_b(0b00000000);
output_b(0b00000000);
while(true)
{
valor=getc();
switch(valor) 126
{
case '1': output_toggle(pin_b0);break;
case '2': output_toggle(pin_b1);break;
case '3': output_toggle(pin_b2);break;
case '4': output_toggle(pin_b3);break;
}
}
}
iii. Implemente el arreglo físico. Considere realizar una investigación documental que
garantice la comunicación óptima de los dispositivos.
iv. Realice su reporte correspondiente.