Manual Practicas V1.4

94
MANUAL DE PRÁCTICAS i Manual de Prácticas PROGRAMACIÓN DE SISTEMAS INTEGRADOS EMBEBIDOS OPTATIVA I. INGENIERÍA EN MECATRÓNICA Contenido INTRODUCCIÓN. .................................................................................................................................. 1 Conexión básica............................................................................................................................... 1 Alimentación ............................................................................................................................... 1 Señal de reinicio .......................................................................................................................... 2 Señal de reloj ............................................................................................................................... 2 Cristal de cuarzo .......................................................................................................................... 2 Resonador cerámico.................................................................................................................... 3 Oscilador RC ................................................................................................................................ 3 Oscilador externo ........................................................................................................................ 3 Componentes adicionales ............................................................................................................... 4 Interruptores y botones de presión ............................................................................................ 4 Relé .............................................................................................................................................. 5 Diodos LED................................................................................................................................... 6 Quemar con rapidez .................................................................................................................... 6 Quemar lentamente .................................................................................................................... 7 Algo para recordar ...................................................................................................................... 7 Display LED .................................................................................................................................. 7 Optoacopladores ....................................................................................................................... 10 Display LCD ................................................................................................................................ 10 Pines del display LCD ................................................................................................................. 11 Pantalla LCD............................................................................................................................... 11 Memoria LCD ............................................................................................................................. 12 Memoria DDRAM ...................................................................................................................... 12 Memoria CGROM ...................................................................................................................... 13 Memoria CGRAM ...................................................................................................................... 14

Transcript of Manual Practicas V1.4

Page 1: Manual Practicas V1.4

MANUAL DE PRÁCTICAS

i

Manual de Prácticas

PROGRAMACIÓN DE SISTEMAS INTEGRADOS EMBEBIDOS

OPTATIVA I. INGENIERÍA EN MECATRÓNICA

Contenido INTRODUCCIÓN. .................................................................................................................................. 1

Conexión básica ............................................................................................................................... 1

Alimentación ............................................................................................................................... 1

Señal de reinicio .......................................................................................................................... 2

Señal de reloj ............................................................................................................................... 2

Cristal de cuarzo .......................................................................................................................... 2

Resonador cerámico .................................................................................................................... 3

Oscilador RC ................................................................................................................................ 3

Oscilador externo ........................................................................................................................ 3

Componentes adicionales ............................................................................................................... 4

Interruptores y botones de presión ............................................................................................ 4

Relé .............................................................................................................................................. 5

Diodos LED................................................................................................................................... 6

Quemar con rapidez .................................................................................................................... 6

Quemar lentamente .................................................................................................................... 7

Algo para recordar ...................................................................................................................... 7

Display LED .................................................................................................................................. 7

Optoacopladores ....................................................................................................................... 10

Display LCD ................................................................................................................................ 10

Pines del display LCD ................................................................................................................. 11

Pantalla LCD............................................................................................................................... 11

Memoria LCD ............................................................................................................................. 12

Memoria DDRAM ...................................................................................................................... 12

Memoria CGROM ...................................................................................................................... 13

Memoria CGRAM ...................................................................................................................... 14

Page 2: Manual Practicas V1.4

MANUAL DE PRÁCTICAS

ii

Comandos básicos del visualizador LCD .................................................................................... 15

¿Qué es una bandera de ocupado (busy flag)? ......................................................................... 16

Conectar al visualizador LCD ..................................................................................................... 16

Inicializar al visualizador LCD ..................................................................................................... 17

Unidad I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES ............................................. 18

Práctica 1.1 Conexiones básicas y encendido de leds ................................................................... 18

Descripción P1.1: ....................................................................................................................... 18

Código P1.1: .............................................................................................................................. 18

Circuito P1.1: ............................................................................................................................. 19

Actividades P1.1: ....................................................................................................................... 19

Práctica 1.2 Oscilador interno y ciclos de repetición .................................................................... 19

Descripción P1.2: ....................................................................................................................... 19

Código P1.2: .............................................................................................................................. 20

Circuito P1.2: ............................................................................................................................. 21

Actividades P1.2 ........................................................................................................................ 21

Práctica 1.3 Ciclos anidados .......................................................................................................... 21

Descripción P1.3: ....................................................................................................................... 21

Código P1.3: .............................................................................................................................. 22

Circuito P1.3: ............................................................................................................................. 23

Actividades P1.3 ........................................................................................................................ 23

Práctica 1.4 Temporizador TMR0 e interrupciones ...................................................................... 23

Descripción P1.4: ....................................................................................................................... 23

Código P1.4: .............................................................................................................................. 23

Circuito P1.4: ............................................................................................................................. 25

Actividades P1.4 ........................................................................................................................ 25

Práctica 1.5 Uso de botones y subrutinas ..................................................................................... 25

Descripción P1.5: ....................................................................................................................... 25

Código P1.5: .............................................................................................................................. 26

Circuito P1.5: ............................................................................................................................. 27

Actividades P1.5 ........................................................................................................................ 27

Práctica 1.6 Temporizador TMR0 como contador, variables y relevadores ................................. 27

Descripción P1.6: ....................................................................................................................... 27

Page 3: Manual Practicas V1.4

MANUAL DE PRÁCTICAS

iii

Código P1.6: .............................................................................................................................. 28

Circuito P1.6: ............................................................................................................................. 29

Actividades P1.6 ........................................................................................................................ 29

Práctica 1.7 Macros y rutinas para evitar el rebote de botones ................................................... 29

Descripción P1.7: ....................................................................................................................... 29

Código P1.7: .............................................................................................................................. 30

Circuito P1.7: ............................................................................................................................. 32

Actividades P1.7 ........................................................................................................................ 32

Práctica 1.8 Temporizador TMR1 e interrupciones ...................................................................... 33

Descripción P1.8: ....................................................................................................................... 33

Código P1.8: .............................................................................................................................. 33

Circuito P1.8: ............................................................................................................................. 34

Actividades P1.8 ........................................................................................................................ 34

Práctica 1.9 Temporizador TMR2 y configuración del oscilador ................................................... 34

Descripción P1.9: ....................................................................................................................... 34

Código P1.9: .............................................................................................................................. 35

Circuito P1.9: ............................................................................................................................. 36

Actividades P1.9 ........................................................................................................................ 36

Práctica 1.10 Modulo CCP 1 como generador de señales tipo PWM ........................................... 36

Descripción P1.10: ..................................................................................................................... 36

Código P1.10: ............................................................................................................................ 37

Circuito P1.10: ........................................................................................................................... 39

Actividades P1.10 ...................................................................................................................... 39

Práctica 1.11 Uso del convertidor analógico-digital (ADC) .......................................................... 39

Descripción P1.11: ..................................................................................................................... 39

Código P1.11: ............................................................................................................................ 40

Circuito P1.11: ........................................................................................................................... 40

Actividades P1.11 ...................................................................................................................... 41

Práctica 1.12 Uso de la memoria EEPROM ................................................................................... 41

Descripción P1.12: ..................................................................................................................... 41

Código P1.12: ............................................................................................................................ 41

Circuito P1.12: ........................................................................................................................... 43

Page 4: Manual Practicas V1.4

MANUAL DE PRÁCTICAS

iv

Actividades P1.12 ...................................................................................................................... 43

Práctica 1.13 Contador de dos dígitos multiplexado .................................................................... 43

Descripción P1.13: ..................................................................................................................... 43

Código P1.13: ............................................................................................................................ 44

Circuito P1.13: ........................................................................................................................... 47

Actividades P1.13 ...................................................................................................................... 47

Práctica 1.14 Generación de sonidos usando macros .................................................................. 47

Descripción P1.14: ..................................................................................................................... 47

Código P1.14: ............................................................................................................................ 47

Circuito P1.14: ........................................................................................................................... 49

Actividades P1.14 ...................................................................................................................... 50

Práctica 1.15 Uso del display de cristal líquido (LCD) ................................................................... 50

Descripción P1.15: ..................................................................................................................... 50

Código P1.15: ............................................................................................................................ 50

Circuito P1.15: ........................................................................................................................... 54

Actividades P1.15 ...................................................................................................................... 54

Práctica 1.16 Comunicación serial RS232...................................................................................... 54

Descripción P1.16: ..................................................................................................................... 54

Código P1.16: ............................................................................................................................ 55

Circuito P1.16: ........................................................................................................................... 57

Actividades P1.16 ...................................................................................................................... 58

Unidad II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C .......... 59

Práctica 2.1 Encendido de leds y configuraciones básicas. ........................................................... 59

Descripción P2.1: ....................................................................................................................... 59

Circuito P2.1: ............................................................................................................................. 59

Código P2.1: .............................................................................................................................. 59

Práctica 2.2 Oscilador interno y mezcla de lenguaje ensamblador y C ............................................ 60

Descripción P2.2: ....................................................................................................................... 60

Circuito P2.2: ............................................................................................................................. 61

Código P2.2: .............................................................................................................................. 61

Práctica 2.3 Temporizador TMR0 como contador, variables y relevadores ................................. 62

Descripción P2.3: ....................................................................................................................... 62

Page 5: Manual Practicas V1.4

MANUAL DE PRÁCTICAS

v

Circuito P2.3: ............................................................................................................................. 62

Código P2.3: .............................................................................................................................. 63

Práctica 2.4 Temporizadores TMR0, TMR1 y TMR2 e interrupciones .......................................... 63

Descripción P2.4: ....................................................................................................................... 63

Circuito P2.4: ............................................................................................................................. 64

Código P2.4: .............................................................................................................................. 64

Práctica 2.5 Uso del “watchdog timer” (perro guardián) ............................................................. 67

Descripción P2.5: ....................................................................................................................... 67

Circuito P2.5: ............................................................................................................................. 67

Código P2.5: .............................................................................................................................. 67

Práctica 2.6 Modulo CCP 1 como generador de señales tipo PWM ............................................. 68

Descripción P2.6: ....................................................................................................................... 68

Circuito P2.6: ............................................................................................................................. 68

Código P2.6: .............................................................................................................................. 69

Práctica 2.7 Uso del convertidor analógico-digital (ADC) ............................................................ 69

Descripción P2.7: ....................................................................................................................... 69

Circuito P2.7: ............................................................................................................................. 70

Código P2.7: .............................................................................................................................. 70

Práctica 2.8 Uso de la memoria EEPROM ......................................................................................... 71

Descripción P2.8: ....................................................................................................................... 71

Circuito P2.8: ............................................................................................................................. 71

Código P2.8: .............................................................................................................................. 72

Práctica 2.9 Contador de dos dígitos multiplexado ...................................................................... 72

Descripción P2.9: ....................................................................................................................... 72

Circuito P2.9: ............................................................................................................................. 73

Código P2.9: .............................................................................................................................. 73

Práctica 2.10 Uso del display de cristal líquido (LCD) ................................................................... 74

Descripción P2.10: ..................................................................................................................... 74

Circuito P2.10: ........................................................................................................................... 75

Código P2.10: ............................................................................................................................ 75

Práctica 2.11 Comunicación serial RS232...................................................................................... 76

Descripción P2.11: ..................................................................................................................... 76

Page 6: Manual Practicas V1.4

MANUAL DE PRÁCTICAS

vi

Circuito P2.11: ........................................................................................................................... 77

Código P2.11: ............................................................................................................................ 77

Práctica 2.12 Generación de sonidos utilizando una librería ........................................................ 78

Descripción P2.12: ..................................................................................................................... 78

Circuito P2.12: ........................................................................................................................... 78

Código P2.12: ............................................................................................................................ 78

Unidad III CONTROL Y MONITOREO DE SISTEMAS AUTOMÁTICOS .................................................. 80

Práctica 3.1 Control de un motor de DC mediante un puente H .................................................. 80

Descripción P3.1: ....................................................................................................................... 80

Circuito P3.1: ............................................................................................................................. 80

Código P3.1: .............................................................................................................................. 81

Práctica 3.2 Control de un motor de pasos ................................................................................... 81

Descripción P3.2: ....................................................................................................................... 81

Circuito P3.2: ............................................................................................................................. 82

Código P3.2: .............................................................................................................................. 83

Prácticas 3.3 Control de un servo motor....................................................................................... 83

Descripción P3.3: ....................................................................................................................... 83

Circuito P3.3: ............................................................................................................................. 84

Código P3.3: .............................................................................................................................. 84

Práctica 3.4 Control de temperatura tipo ON/OFF ....................................................................... 85

Descripción P3.4: ....................................................................................................................... 85

Circuito P3.4: ............................................................................................................................. 85

Código P3.4: .............................................................................................................................. 85

Práctica 3.5 Modulo remoto de medición y control. 3 sensores, 2 actuadores, comunicación

mediante RS232, modo de control remoto mediante PC, modo de control local mediante

botones. ........................................................................................................................................ 85

Descripción P3.5: ....................................................................................................................... 85

Circuito P3.5: ............................................................................................................................. 86

Código P3.5: .............................................................................................................................. 86

Formato de reportes ......................................................................................................................... 87

Criterios y ponderaciones de evaluación .......................................................................................... 88

Page 7: Manual Practicas V1.4

INTRODUCCIÓN

1

INTRODUCCIÓN. El propósito de este manual es proporcionar la información básica que se necesita saber para ser

capaz de utilizar microcontroladores con éxito en la práctica. Por eso, este manual no contiene

ningún programa demasiado elaborado, tampoco dispone de un esquema de dispositivo con

soluciones extraordinarias. Por el contrario, la intensión de este manual es mostrar el gran

potencial y la facilidad con la que se programan y manejan los microcontroladores.

El manual contiene una serie de ejemplos cuyo objetivo es brindar de herramientas al lector para

el desarrollo de aplicaciones de propósito específico, como la realización de proyecto finales de

muy buena calidad.

Conexión básica Para que un microcontrolador funcione apropiadamente es necesario proporcionar lo siguiente:

Alimentación;

Señal de reinicio; y

Señal de reloj.

Como se muestra en la figura anterior, se trata de circuitos simples, pero no tiene que ser siempre

así. Si el dispositivo destino se utiliza para controlar máquinas costosas o para mantener funciones

vitales, todo se vuelve mucho más complicado.

Alimentación

Aunque el PIC16F887 es capaz de funcionar a diferentes voltajes de alimentación, no es

recomendable probar la ley de Murphy. Lo más adecuado es proporcionar un voltaje de

alimentación de 5V en CD. El circuito anterior, utiliza un regulador de voltaje positivo de tres

terminales LM7805. Es un regulador integrado y barato que proporciona una estabilidad de voltaje

Page 8: Manual Practicas V1.4

INTRODUCCIÓN

2

de alta calidad y suficiente corriente para habilitar el funcionamiento apropiado del controlador y

de los periféricos (aquí suficiente significa una corriente de 1A).

Señal de reinicio

Para que un microcontrolador pueda funcionar apropiadamente, un uno lógico (VCC) se debe

colocar en el pin de reinicio. El botón de presión que conecta el pin MCLR a GND no es necesario.

Sin embargo, este botón casi siempre está proporcionado ya que habilita al microcontrolador

volver al modo normal de funcionamiento en caso de que algo salga mal. Al pulsar sobre el botón

RESET, se lleva un voltaje de 0V al pin MCLR, el microcontrolador se reinicia y la ejecución de

programa comienza desde el principio. Se utiliza una resistencia de 10k para impedir un corto

circuito a tierra al presionar este botón.

Señal de reloj

A pesar de tener un oscilador incorporado, el microcontrolador no puede funcionar sin

componentes externos que estabilicen su funcionamiento y determinen su frecuencia (velocidad

de operación del microcontrolador). Dependiendo de los elementos utilizados así como de las

frecuencias el oscilador puede funcionar en cuatro modos diferentes:

LP - Cristal de bajo consumo;

XT - Cristal / Resonador;

HS - Cristal/Resonador de alta velocidad; y

RC - Resistencia / Condensador.

Como es casi imposible construir un oscilador estable que funcione a un amplio rango de

frecuencias, el microcontrolador tiene que “saber” a qué cristal está conectado, para poder ajustar

el funcionamiento de sus componentes internos. Ésta es la razón por la que todos los programas

utilizados para escribir un programa en el chip contienen una opción para seleccionar el modo de

oscilador.

Cristal de cuarzo

Al utilizar el cristal de cuarzo para estabilizar la frecuencia, un oscilador incorporado funciona a

una frecuencia determinada, y no es afectada por los cambios de temperatura y de voltaje de

alimentación. Esta frecuencia se etiqueta normalmente en el encapsulado del cristal. Aparte del

cristal, los condensadores C1 y C2 deben estar conectados como se muestra en el siguiente

esquema. Su capacitancia no es de gran importancia. Por eso, los valores proporcionados en la

siguiente tabla se deben tomar como recomendación y no como regla estricta.

Page 9: Manual Practicas V1.4

INTRODUCCIÓN

3

Resonador cerámico

Un resonador cerámico es más barato y muy similar a un cuarzo por la función y el modo de

funcionamiento. Por esto, los esquemas que muestran su conexión al microcontrolador son

idénticos. No obstante, los valores de los condensadores difieren un poco debido a las diferentes

características eléctricas. Refiérase a la tabla que está a continuación.

Estos resonadores se conectan normalmente a los osciladores en caso de que no sea necesario

proporcionar una frecuencia extremadamente precisa.

Oscilador RC

Si la frecuencia de operación no es de importancia, entonces no es necesario utilizar los

componentes caros y adicionales para la estabilización. En vez de eso, basta con utilizar una simple

red RC, mostrada en la siguiente figura. Como aquí es utilizada sólo la entrada del oscilador local,

la señal de reloj con la frecuencia Fosc/4 aparecerá en el pin OSC2. Ésta es la frecuencia de

operación del microcontrolador, o sea la velocidad de ejecución de instrucciones.

Oscilador externo

Si se requiere sincronizar el funcionamiento de varios microcontroladores o si por alguna razón no

es posible utilizar ninguno de los esquemas anteriores, una señal de reloj se puede generar por un

oscilador externo. Refiérase a la siguiente figura.

Page 10: Manual Practicas V1.4

INTRODUCCIÓN

4

A pesar del hecho de que el microcontrolador es un producto de la tecnología moderna, no es tan

útil sin estar conectado a los componentes adicionales. Dicho de otra manera, el voltaje llevado a

los pines del microcontrolador no sirve para nada si no se utiliza para llevar a cabo ciertas

operaciones como son encender/apagar, desplazar, visualizar, etc.

Componentes adicionales Esta parte trata los componentes adicionales utilizados con más frecuencia en la práctica, tales

como resistencias, transistores, diodos LED, visualizadores LED, visualizadores LCD y los circuitos

de comunicación RS-232.

Interruptores y botones de presión

Los interruptores y los botones de presión son dispositivos simples para proporcionar la forma

más simple de detectar la aparición de voltaje en un pin de entrada del microcontrolador. No

obstante, no es tan simple como parece... Uno de los principales problemas es el rebote de

contacto. El rebote de contacto es un problema común en los interruptores mecánicos.

Al tocarse los contactos, se produce un rebote por su inercia y elasticidad. Por consiguiente, la

corriente eléctrica es rápidamente pulsada en lugar de tener una clara transición de cero a la

corriente máxima. Por lo general, esto ocurre debido a las vibraciones, los desniveles suaves y la

suciedad entre los contactos. Este efecto no se percibe normalmente al utilizar estos componentes

en la vida cotidiana porque el rebote ocurre demasiado rápido para afectar a la mayoría de los

dispositivos eléctricos. Sin embargo, pueden surgir problemas en algunos circuitos lógicos que

responden lo suficientemente rápido de manera que malinterpreten los pulsos producidos al

tocarse los contactos como un flujo de datos. De todos modos, el proceso entero no dura mucho

(unos pocos micro o milisegundos), pero dura lo suficiente para que lo detecte el microcontrolador.

Al utilizar sólo un botón de presión como una fuente de señal de contador, en casi 100% de los

casos ocurren los errores.

El problema se puede resolver con facilidad al conectar un simple circuito RC (filtro) para suprimir

rápidos cambios de voltaje. Como el período del rebote no está definido, los valores de los

componentes no están precisamente determinados. En la mayoría de los casos es recomendable

utilizar los valores que se muestran en la siguiente figura.

Page 11: Manual Practicas V1.4

INTRODUCCIÓN

5

Si se necesita una estabilidad completa, entonces hay que tomar medidas radicales. La salida del

circuito, mostrado en la siguiente figura (biestable RS, también llamado flip flop RS), cambiará de

estado lógico después de detectar el primer pulso producido por un rebote de contacto. Esta

solución es más cara (interruptor SPDT), pero el problema es resuelto.

Aparte de estas soluciones de hardware, hay también una simple solución de software. Mientras

el programa prueba el estado de circuito lógico de un pin de entrada, si detecta un cambio, hay

que probarlo una vez más después de un cierto tiempo de retardo. Si el programa confirma el

cambio, esto significa que un interruptor/botón de presión ha cambiado de posición. Las ventajas

de esta solución son obvias: es gratuita, se borran los efectos del rebote de contacto y se puede

aplicar a los contactos de una calidad más baja también.

Relé

Un relé es un interruptor eléctrico que se abre y se cierra bajo el control de otro circuito

electrónico. Por eso está conectado a los pines de salida del microcontrolador y utilizado para

encender/apagar los dispositivos de alto consumo tales como: motores, transformadores,

calefactores, bombillas, etc. Estos dispositivos se colocan casi siempre lejos de los componentes

sensibles de la placa. Hay varios tipos de relés, pero todos funcionan de la misma manera. Al fluir

la corriente por la bobina, el relé funciona por medio de un electromagneto, abriendo y cerrando

uno o más conjunto de contactos. Similar a los optoacopladores no hay conexión galvánica

(contacto eléctrico) entre los circuitos de entrada y salida. Los relés requieren con frecuencia tanto

un voltaje más alto y una corriente más alta para empezar a funcionar. También hay relés

miniatura que se pueden poner en marcha por una corriente baja obtenida directamente de un

pin del microcontrolador.

Page 12: Manual Practicas V1.4

INTRODUCCIÓN

6

La figura que sigue muestra la solución utilizada con más frecuencia.

Para prevenir la aparición de un alto voltaje de autoinducción, causada por una parada repentina

del flujo de corriente por la bobina, un diodo polarizado invertido se conecta en paralelo con la

bobina. El propósito de este diodo es de “cortar” este pico de voltaje.

Diodos LED

Probablemente sepa todo lo que necesita saber sobre los diodos LED, pero también debe pensar

en los jóvenes... A ver, ¿cómo destruir un LED? Bueno... muy fácil.

Quemar con rapidez

Como cualquier otro diodo, los LED tienen dos puntas -un ánodo y un cátodo. Conecte un diodo

apropiadamente a la fuente de alimentación y va a emitir luz sin ningún problema. Ponga al diodo

al revés y conéctelo a la misma fuente de alimentación (aunque sea por un momento). No emitirá

luz - ¡nunca más!

Page 13: Manual Practicas V1.4

INTRODUCCIÓN

7

Quemar lentamente

Hay un límite de corriente nominal, o sea, límite de corriente máxima especificada para cada LED

que no se deberá exceder. Si eso sucede, el diodo emitirá luz más intensamente de lo normal, pero

sólo por un período corto de tiempo.

Algo para recordar

De manera similar, todo lo que tiene que hacer es elegir una resistencia para limitar la corriente

mostrada a continuación. Dependiendo del voltaje de alimentación, los efectos pueden ser

espectaculares.

Display LED

Básicamente, un display LED no es nada más que varios diodos LED moldeados en la misma caja

plástica. Hay varios tipos de display y algunos de ellos están compuestos por varias docenas de

diodos incorporados que pueden mostrar diferentes símbolos. No obstante, el display utilizado

con más frecuencia es el de 7 segmentos. Está compuesto por 8 LED. Los siete segmentos de un

dígito están organizados en forma de un rectángulo para visualizar los símbolos, mientras que el

segmento adicional se utiliza para el propósito de visualizar los puntos decimales. Para simplificar

la conexión, los ánodos y los cátodos de todos los diodos se conectan al pin común así que

tenemos display de ánodo común y display de cátodo común, respectivamente. Los segmentos

están etiquetados con letras de la a a la g y dp, como se muestra en la siguiente figura. Al

conectarlos, cada diodo LED se trata por separado, lo que significa que cada uno dispone de su

propia resistencia para limitar la corriente.

Aquí se presentan varias cosas importantes que se deben tener en cuenta al momento de comprar

un display LED:

1. Como se ha mencionado, dependiendo de si ánodos o cátodos están conectados al pin

común, tenemos display de ánodo común y display de cátodo común. Visto de afuera,

parece que no hay ninguna diferencia entre estos display, pues se le recomienda

comprobar cuál se va a utilizar antes de instalarlo.

Page 14: Manual Practicas V1.4

INTRODUCCIÓN

8

2. Cada pin del microcontrolador tiene un límite de corriente máxima que puede recibir o dar.

Por eso, si varios visualizadores están conectados al microcontrolador, es recomendable

utilizar así llamados LED de bajo consumo que utilizan solamente 2mA para su

funcionamiento.

Los segmentos del visualizador están normalmente etiquetados con letras de la a a la g, pero no

hay ninguna regla estricta de cuáles pines del display estarán conectados. Por eso es muy

importante comprobarlo antes de empezar a escribir un programa o diseñar un dispositivo.

Los visualizadores conectados al microcontrolador normalmente ocupan un gran número de los

pines de E/S valiosos, lo que puede ser un problema sobre todo cuando se necesita visualizar los

números compuestos por varios dígitos. El problema se vuelve más obvio si, por ejemplo, se

necesita visualizar dos números de seis dígitos (un simple cálculo muestra que en este caso se

necesitan 96 pines de salida). La solución de este problema se denominada multiplexión.

Aquí se produce una ilusión óptica basada en el mismo principio de funcionamiento de una

cámara de película. Un sólo dígito está activo a la vez, pero se tiene la impresión de que todos los

dígitos de un número están simultáneamente activos por cambiar tan rápidamente de las

condiciones de encendido/apagado.

Veamos la figura anterior. Primero se aplica un byte que representa unidades al puerto PORT2 del

microcontrolador y se activa el transistor T1 a la vez. Después de poco tiempo, el transistor T1 se

apaga, un byte que representa decenas se aplica al puerto PORT2 y el transistor T2 se activa. Este

proceso se está repitiendo cíclicamente a alta velocidad en todos los dígitos y transistores

correspondientes.

Lo decepcionante es que el microcontrolador es sólo un tipo de computadora miniatura diseñada

para interpretar el lenguaje de ceros y unos, lo que se pone de manifiesto al visualizar cualquier

dígito. Concretamente, el microcontrolador no conoce cómo son unidades, decenas, centenas, ni

Page 15: Manual Practicas V1.4

INTRODUCCIÓN

9

diez dígitos a los que estamos acostumbrados. Por esta razón, cada número a visualizar debe pasar

por el siguiente procedimiento:

Antes que nada, un número de varios dígitos debe ser dividido en unidades, centenas, etc.; en una

subrutina específica. Luego, cada uno de estos dígitos se debe almacenar en los bytes particulares.

Los dígitos se hacen reconocibles al realizar "enmascaramiento". En otras palabras, el formato

binario de cada dígito se sustituye por una combinación diferente de los bits por medio de una

subrutina simple. Por ejemplo, el dígito 8 (0000 1000) se sustituye por el número binario 0111

1111 para activar todos los LEDs que visualizan el número 8. El único diodo que queda inactivo

aquí está reservado para el punto decimal.

Si un puerto del microcontrolador está conectado al visualizador de tal manera que el bit 0 active

el segmento 'a', el bit 1 active el segmento 'b', el bit 2 active el segmento 'c' y así sucesivamente,

entonces la tabla que sigue muestra la "máscara" para cada dígito.

Además de los dígitos del 0 a 9, hay algunas letras -A, C, E, J, F, U, H, L, b, c, d, o, r, t - que se

pueden visualizar al enmascarar.

En caso de que se utilicen los display de ánodo común, todos los unos contenidos en la tabla

anterior se deben sustituir por ceros y viceversa. Además, los transistores PNP se deben utilizar

como controladores.

Page 16: Manual Practicas V1.4

INTRODUCCIÓN

10

Optoacopladores

Un optoacoplador es un dispositivo frecuentemente utilizado para aislar galvánicamente el

microcontrolador de corriente o voltaje potencialmente peligroso de su entorno. Los

optoacopladores normalmente disponen de una, dos o cuatro fuentes de luz (diodos LED) en su

entrada mientras que en su salida, frente a los diodos, se encuentra el mismo número de los

elementos sensibles a la luz (foto-transistores, foto-tiristores, foto-triacs). El punto es que un

optoacoplador utiliza una corta ruta de transmisión óptica para transmitir una señal entre los

elementos de circuito, que están aislados eléctricamente. Este aislamiento tiene sentido sólo si los

diodos y los elementos foto-sensitivos se alimentan por separado. Así, el microcontrolador y los

componentes adicionales y caros están completamente protegidos de altos voltajes y ruidos que

son la causa más frecuente de destrucción, daño y funcionamiento inestable de los dispositivos

electrónicos en la práctica. Los optoacopladores utilizados con más frecuencia son aquéllos con

foto-transistores en sus salidas. En los optoacopladores con la base conectada al pin 6 interno

(también hay optoacopladores sin ella), la base puede quedarse desconectada.

La red RC representada por una línea quebrada en la figura anterior indica una conexión opcional

de la base de transistores dentro del optoacoplador, que reduce los efectos de ruidos al eliminar

los pulsos muy cortos.

Display LCD

Este componente está específicamente fabricado para ser utilizado con los microcontroladores, lo

que significa que no se puede activar por los circuitos integrados estándar. Se utiliza para visualizar

los diferentes mensajes en un visualizador de cristal líquido miniatura. El modelo descrito aquí es

el más utilizado en la práctica por su bajo precio y grandes capacidades. Está basado en el

microcontrolador HD44780 (Hitachi) integrado y puede visualizar mensajes en dos líneas con 16

caracteres cada una. Puede visualizar todas las letras del alfabeto, letras de alfabeto griego, signos

de puntuación, símbolos matemáticos, etc. También es posible visualizar símbolos creados por el

usuario. Entre otras características útiles es el desplazamiento automático de mensajes (a la

izquierda y a la derecha), aparición del cursor, retroiluminación LED, entre otras.

Page 17: Manual Practicas V1.4

INTRODUCCIÓN

11

Pines del display LCD

A lo largo de la placa impresa del display LCD se encuentran los pines que le permiten estar

conectado al microcontrolador. Hay 14 pines en total marcados con números (16 si hay

retroiluminación). Su función se muestra en la tabla que sigue:

Pantalla LCD

Una pantalla LCD puede visualizar dos líneas con 16 caracteres cada una. Cada carácter consiste en

5x8 o 5x11 píxeles. En la imagen siguiente se muestra un display de 5x8 píxeles que es el más

común.

El contraste del visualizador depende del voltaje de alimentación y de si los mensajes se visualizan

en una o dos líneas. Por esta razón, el voltaje variable 0-Vdd se aplica al pin marcado como Vee.

Un potenciómetro trimer se utiliza con frecuencia para este propósito. Algunos de los display LCD

Page 18: Manual Practicas V1.4

INTRODUCCIÓN

12

tienen retroiluminación incorporada (diodos LED azules o verdes). Al utilizarlo durante el

funcionamiento, se debe de conectar una resistencia en serie a uno de los pines para limitar la

corriente (similar a diodos LED).

Si no hay caracteres visualizados o si todos los caracteres están oscurecidos al encender el

visualizador, lo primero que se debe hacer es comprobar el potenciómetro para ajustar el

contraste. ¿Está ajustado apropiadamente? Lo mismo se aplica si el modo de funcionamiento ha

sido cambiado (escribir en una o en dos líneas).

Memoria LCD

El display LCD dispone de tres bloques de memoria:

DDRAM Display Data RAM (RAM de datos de visualización);

CGRAM Character Generator RAM (generador de caracteres RAM); y

CGROM Character Generator ROM (generador de caracteres ROM)

Memoria DDRAM

La memoria DDRAM se utiliza para almacenar los caracteres a visualizar. Tiene una capacidad de

almacenamiento de 80 caracteres. Algunas localidades de memoria están directamente

conectadas a los caracteres en el visualizador.

Todo funciona muy simple: basta con configurar el display para incrementar direcciones

automáticamente (desplazamiento a la derecha) y establecer la dirección inicial para el mensaje

que se va a visualizar (por ejemplo 00 hex).

Luego, todos los caracteres enviados por las líneas D0-D7 se van a visualizar en el formato de

mensaje al que nos hemos acostumbrado -de la izquierda a la derecha. En este caso, la

visualización empieza por el primer campo de la primera línea ya que la dirección inicial es 00hex.

Si se envía más de 16 caracteres, todos se memorizarán, pero sólo los primeros 16 serán visibles.

Para visualizar los demás, se debe utilizar el comando shift. Virtualmente, parece como si el

visualizador LCD fuera una ventana, desplazándose de la izquierda a la derecha sobre las

localidades de memoria con diferentes caracteres. En realidad, así es cómo se creó el efecto de

desplazar los mensajes sobre la pantalla.

Page 19: Manual Practicas V1.4

INTRODUCCIÓN

13

Si se habilita ver el cursor, aparecerá en la localidad actualmente direccionada. En otras palabras,

si un carácter aparece en la posición del cursor, se va a mover automáticamente a la siguiente

localidad direccionada.

Esto es un tipo de memoria RAM así que los datos se pueden escribir en ella y leer de ella, pero su

contenido se pierde irrecuperablemente al apagar la fuente de alimentación.

Memoria CGROM

La memoria CGROM contiene un mapa estándar de todos los caracteres que se pueden visualizar

en la pantalla. A cada carácter se le asigna una localidad de memoria:

Page 20: Manual Practicas V1.4

INTRODUCCIÓN

14

Las direcciones de las localidades de memoria CGROM corresponden a los caracteres ASCII. Si el

programa que se está actualmente ejecutando llega al comando “enviar el carácter P al puerto”, el

valor binario 0101 0000 aparecerá en el puerto. Este valor es el equivalente ASCII del carácter P. Al

escribir este valor en un LCD, se visualizará el símbolo de la localidad 0101 0000 de la CGROM. En

otras palabras, se visualizará el carácter P. Esto se aplica a todas las letras del alfabeto (minúsculas

y mayúsculas), pero no se aplica a los números.

Como se muestra en el mapa anterior, las direcciones de todos los dígitos se desplazan por 48 en

relación con sus valores (dirección del dígito 0 es 48, dirección del dígito 1 es 49, dirección del

dígito 2 es 50 etc.). Por consiguiente, para visualizar los dígitos correctamente es necesario añadir

el número decimal 48 a cada uno antes de enviarlos en un LCD.

¿Qué es un código ASCII? Desde su aparición hasta hoy en día, las computadoras han sido capaces

de reconocer solamente números, y no las letras. Esto significa que todos los datos que una

computadora intercambia con un periférico, reconocidos como letras por los humanos, en

realidad están en el formato binario (el teclado es un buen ejemplo). En otras palabras, a cada

carácter le corresponde la combinación única de ceros y unos. El código ASCII representa una

codificación de caracteres basada en el alfabeto inglés. El ASCII especifica una correspondencia

entre los símbolos de caracteres estándar y sus equivalentes numéricos.

Memoria CGRAM

Además de los caracteres estándar, el visualizador LCD puede visualizar símbolos definidos por el

usuario. Esto puede ser cualquier símbolo de 5x8 píxeles. La memoria RAM denominada CGRAM

de 64 bytes lo habilita.

Page 21: Manual Practicas V1.4

INTRODUCCIÓN

15

Los registros de memoria son de 8 bits de anchura, pero sólo se utilizan los 5 bits más bajos. Un

uno lógico (1) en cada registro representa un punto oscurecido, mientras que 8 localidades

agrupadas representan un carácter. Esto se muestra en la siguiente figura:

Los símbolos están normalmente definidos al principio del programa por una simple escritura de

ceros y unos en la memoria CGRAM así se crean las formas deseadas. Para visualizarlos basta con

especificar su dirección. Preste atención a la primera columna en el mapa de caracteres CGROM.

No contiene direcciones de la memoria RAM, sino los símbolos de los que se está hablando aquí.

En este ejemplo ‘visualizar 0’ significa visualizar ‘sonrisa’, ‘visualizar 1’ significa - visualizar ‘ancla’,

etc.

Comandos básicos del visualizador LCD

Todos los datos transmitidos a un display LCD por las salidas D0-D7 serán interpretados como un

comando o un dato, lo que depende del estado lógico en el pin RS:

RS = 1 - Los bits D0 - D7 son direcciones de los caracteres a visualizar. El procesador LCD

direcciona un carácter del mapa de caracteres y lo visualiza. La dirección DDRAM

especifica la localidad en la que se va a visualizar el carácter. Esta dirección se define antes

de transmitir el carácter o la dirección del carácter anteriormente transmitido será

aumentada automáticamente.

RS = 0 - Los bits D0 - D7 son los comandos para ajustar el modo del visualizador.

Page 22: Manual Practicas V1.4

INTRODUCCIÓN

16

En la siguiente tabla se muestra una lista de comandos reconocidos por el LCD:

¿Qué es una bandera de ocupado (busy flag)?

En comparación al microcontrolador, el LCD es un componente extremadamente lento. Por esta

razón, era necesario proporcionar una señal que, al ejecutar un comando, indicaría que el display

estaba listo para recibir el siguiente dato. Esta señal denominada bandera de ocupado (busy flag)

se puede leer de la línea D7. El visualizador está listo para recibir un nuevo dato cuando el voltaje

en esta línea es de 0V (BF=0).

Conectar al visualizador LCD

Dependiendo de cuántas líneas se utilizan para conectar un LCD al microcontrolador, hay dos

modos de LCD, el de 8 bits y el de 4 bits. El modo apropiado se selecciona en el inicio del

funcionamiento en el proceso denominado “inicialización”. El modo de LCD de 8 bits utiliza los

pines D0-D7 para transmitir los datos, como hemos explicado anteriormente. El propósito

principal del modo de LCD de 4 bits es el ahorrar los valiosos pines de E/S del microcontrolador.

Sólo los 4 bits más altos (D4-D7) se utilizan para la comunicación, mientras que los demás pueden

quedarse desconectados. Cada dato se envía al LCD en dos pasos -primero se envían 4 bits más

altos (normalmente por las líneas D4 - D7), y luego los 4 bits más bajos. La inicialización habilita

que el LCD conecte e interprete los bits recibidos correctamente.

Page 23: Manual Practicas V1.4

INTRODUCCIÓN

17

Pocas veces se leen los datos del LCD (por lo general se transmiten del microcontrolador al LCD)

así que, con frecuencia, es posible guardar un pin de E/S de sobra. Es simple, basta con conectar el

pin L/E a Tierra. Este “ahorro” del pin tiene su precio. Los mensajes se visualizarán normalmente,

pero no será posible leer la bandera de ocupado ya que tampoco es posible leer los datos del

display. Afortunadamente, hay una solución simple. Después de enviar un carácter o un comando

es importante dar al LCD suficiente tiempo para hacer su tarea. Debido al hecho de que la

ejecución de un comando puede durar aproximadamente 1.64ms, el LCD tarda como máximo 2ms

en realizar su tarea.

Inicializar al visualizador LCD

Al encender la fuente de alimentación, el LCD se inicia automáticamente. Esto dura

aproximadamente 15ms. Después de eso, el LCD está listo para funcionar. Asi mismo, el modo de

funcionamiento está configurado por defecto de la siguiente manera:

Display está borrado.

Modo

o DL = 1 - Bus de datos de 8 bits

o N = 0 - LCD de una línea

o F = 0 - Carácter de 5 x 8 puntos

Visualizador/Cursor encendido/apagado

o D = 0 - Display apagado

o U = 0 - Cursor apagado

o B = 0 - Parpadeo del cursor apagado

Introducción de caracteres

o ID = 1 Direcciones visualizadas se incrementan automáticamente en 1

o S = Desplazamiento del visualizador desactivado

Page 24: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

18

Unidad I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

Práctica 1.1 Conexiones básicas y encendido de leds

Descripción P1.1:

El propósito de esta práctica es mostrar el circuito básico, también llamado sistema mínimo, y el

proceso de programación de un microcontrolador (uC) PIC16F887. El PIC16F887 es el uC que se

utilizará en todas las prácticas de este manual a menos que se indique lo contrario. Cabe resaltar

que los Microcontroladores PIC16F877, PIC16F877A, PIC16F887 y PIC16F917 son compatibles

entre sí. El PIC16F887 puede ser considerado como una nueva y mejor versión del PIC16F877, así

mismo el PIC16F917 es similar al PIC16F877A, pero además incorpora un módulo manejador de

LCD.

El circuito y el programa únicamente realizan la función de encender algunos “leds” conectados al

puerto B del microcontrolador (uC) PIC16F887.

Código P1.1: ;************************************************ ; Nombre : P1_1.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Prueba del microcontrolador ;************************************************ list p=16f887 #include <p16f887.inc> errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF __CONFIG _CONFIG2, _BOR40V & _WRT_OFF ORG 0x0000 Banksel TRISB clrf TRISB banksel PORTB movlw B'01010101' movwf PORTB end

Page 25: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

19

Circuito P1.1:

Actividades P1.1:

Explicar el código del programa comentando que hace y/o para que funcione cada línea, se puede

usar el simulador y buscar los comandos en internet. Por último implemente la práctica.

Práctica 1.2 Oscilador interno y ciclos de repetición

Descripción P1.2:

Esta práctica es una continuación de la práctica P1.1. En esta práctica se busca hacer que los “leds”

conectados al puerto B parpadeen (“blink”).

Para conseguir que los “leds” parpadeen se diseña el siguiente algoritmo:

1. En el puerto B se carga la combinación binaria 01010101

2. Se permanece en el ciclo 1 durante un tiempo determinado (delay)

3. Se reemplaza la combinación binaria existente en el puerto B con la combinación

10101010

4. Se permanece en el ciclo 2 durante un tiempo determinado

5. Por último se regresar al paso 1 y se repite todo el proceso nuevamente.

Al realizar los cambios de combinación binaria en el puerto B, se aprecia el efecto del parpadeo, el

proceso mencionado anteriormente se necesita llevar a cabo de una manera “lenta” para lograr

ser vista por el ojo humano. Esto se consigue utilizando el oscilador interno LFINTOSC del

microcontrolador el cual tiene una frecuencia de 31 kHz mucho más lenta que la del oscilador

externo, el cual tiene conectado el cristal de 8 MHz.

La fuente de la señal de reloj es cambiada durante la ejecución del programa, “on the fly”. Para

verificar que esto realmente está sucediendo, antes de energizar el uC es necesario desconectar el

cristal de 8 MHz. ¿Qué paso? El uC no debe de hacer nada ya que la configuración de este requiere

el uso del cristal al momento de iniciar a ejecutar el programa. En cambio, si el cristal se

Page 26: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

20

desconecta después de que el uC ya inicio la ejecución del programa esto no debe de afectar el

funcionamiento del uC de ninguna manera.

Código P1.2: ;************************************************ ; Nombre : P1_2.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripción : Parpadear leds Puerto B ;************************************************ list p=16f887 #include <p16f887.inc> errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF __CONFIG _CONFIG2, _BOR40V & _WRT_OFF ;************************************************************************ ;************* DEFINING VARIABLES *************************************** cblock 0x20 ; Bloque de variables inicia en dir. 20h counter1 ; La variable "counter1" en la dir. 20h endc ;************************************************************************ org 0x0000 ; Dirección de la primera instrucción banksel OSCCON ; Selecciona el banco de memoria que ; contiene el registro OSCCON bcf OSCCON,6 ; Selecciona el oscilador interno LFINTOSC bcf OSCCON,5 ; con la frecuencia de 31KHz bcf OSCCON,4 bsf OSCCON,0 ; uC usa el oscilador interno banksel TRISB ; Selecciona el banco que contiene a TRISB clrf TRISB ; Todos los pines del PORTB configurados ; como salidas banksel PORTB ; Selecciona el banco que contiene a PORTB loop ; etiqueta con el nombre de "loop" movlw B'01010101' ; Numero binario 01010101 se carga en W movwf PORTB ; Numero binario se mueve al PORTB movlw h'FF' ; Numero hFF se carga en W movwf counter1 ; Numero se mueve a la variable "counter1" loop1 ; etiqueta con el nombre de "loop1" decfsz counter1 ; Variable "counter1" se decrementa en 1 goto loop1 ; Si "counter1" es 0, continuar. ; de lo contrario volver a "loop1" movlw B'10101010' ; Numero BIN 10101010 se carga en W movwf PORTB ; Numero se mueve a PORTB movlw h'FF' ; Numero hFF se carga en W movwf counter1 ; Numero se mueve a la variable "counter1" loop2 ; etiqueta con el nombre de "loop2" decfsz counter1 ; Variable "counter1" se decrementa en 1 goto loop2 ; Si "counter1" es 0, continuar. ; de lo contrario volver a "loop2" goto loop ; Volver a la etiqueta "loop" end ; Fin del Programa

Page 27: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

21

Circuito P1.2:

Actividades P1.2

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Práctica 1.3 Ciclos anidados

Descripción P1.3:

En la práctica anterior se pudo observar que el microcontrolador ejecuta las instrucciones muy

rápido y en ocasiones es necesario hacerlo que vaya más lento. El uso del oscilador interno LF,

como se hace en la práctica P1.2, debe de ser la última opción. Una mejor manera de realizarlo es

utilizar ciclos anidados en el programa. En esta práctica, la variable “counter1” se decrementa una

unidad 255 veces, es decir el programa contará de 255 a 0 antes de salir del ciclo interior “loop1”.

El programa contará 255 veces de 255 a 0 en cada ciclo exterior “loop”. Lo anterior quiere decir

que entre dos parpadeos consecutivos de “leds” hay 255 x 255 pulsos del cristal oscilador.

De manera más precisa el número de pulsos entre dos parpadeos consecutivos es de

aproximadamente de 196000, esto es debido a que la ejecución de las instrucciones de brinco

(goto) y de decremento requieren de un cierto número de pulsos para ser ejecutadas.

La instrucción de decremento DECFSZ se realiza en 1 o 2 ciclos. La instrucción de brinco GOTO se

realiza en 2 ciclos también. Si suponemos que la instrucción DECFSZ se realiza en un ciclo y la

instrucción GOTO en 2 ciclos, eso son tres ciclos. Si estas dos instrucciones, que se realizan en 3

Page 28: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

22

ciclos, se realizan 255*255 veces eso equivale: 255 * 255 * 3 = 195075, aproximadamente 196000

instrucciones como se había comentado antes.

Código P1.3: ;************************************************ ; Nombre : P1_3.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Parpadear leds Puerto B , Ciclos anidados ;************************************************ list p=16f887 #include <p16f887.inc> errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF __CONFIG _CONFIG2, _BOR40V & _WRT_OFF ;************* DEFINING VARIABLES ***************************************** cblock 0x20 ; Block of variables starts at address 20h counter1 ; Variable "counter1" at address 20h counter2 ; Variable "counter2" at address 21h endc ;************************************************************************** org 0x0000 ; Address of the first program instruction banksel TRISB ; Selects bank containing register TRISB clrf TRISB ; Clears TRISB banksel PORTB ; Selects bank containing register PORTB loop movlw B'11110000' ; Binary number 11110000 is moved to W movwf PORTB ; Number is moved to PORTB movlw h'FF' ; Number hFF is moved to W movwf counter2 ; Number is moved to variable "counter2" loop2 movlw h'FF' ; Number hFF is moved to W movwf counter1 ; Number is moved to "counter1" loop1 decfsz counter1 ; Decrements "counter1" by 1. If result is 0 goto loop1 ; skip next instruction decfsz counter2 ; Decrements "counter2" by 1. If result is 0 goto loop2 ; skip next instruction movlw B'00001111' ; Binary number 00001111 is moved to W movwf PORTB ; Number is moved to PORTB movlw h'FF' ; Number hFF is moved to W movwf counter2 ; Number is moved to variable "counter2" loop4 movlw h'FF' ; Number hFF is moved to W movwf counter1 ; Number is moved to variable "counter1" loop3 decfsz counter1 ; Decrements "counter1" by 1. If result is 0 ; skip next instruction goto loop3 decfsz counter2 ; Decrements "counter2" by 1. If result is 0 goto loop4 ; skip next instruction goto loop ; Jump to label loop end ; End of program

Page 29: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

23

Circuito P1.3:

Igual al de la práctica P1.2

Actividades P1.3

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Práctica 1.4 Temporizador TMR0 e interrupciones

Descripción P1.4:

En la práctica anterior se puede apreciar la desventaja de realizar retardos de tiempo (“delays”)

utilizando ciclos. En casos como el de la práctica anterior, el microcontrolador está captivo y no

hace nada más que esperar a que pase el tiempo. Esa pérdida de tiempo es inaceptable y es

necesario encontrar otro método para realizar retardos de tiempo.

En este ejemplo se hace uso de los temporizadores (“timers”) y de interrupciones (“interrupts”) y

se hace un vínculo entre ambos de manera práctica. Para este ejemplo es necesario realizar un

retardo de tiempo lo suficientemente largo para apreciar el cambio en los leds del PORTB. En esta

ocasión el temporizador TMR0, con un pre-escalador (“prescaler”), es utilizado para ese propósito.

La interrupción ocurre cada vez que ocurre un sobre-flujo (“overflow”) el registro del

temporizador. La interrupción incrementa el valor mostrado en el PORTB en uno. Todo el proceso

es realizado detrás de cámaras (“behind the scenes”), esto permite que el microcontrolador haga

otras cosas mientras espera a que en el registro del temporizador se genere una interrupción por

sobre-flujo y se interrumpa momentáneamente la ejecución del programa principal.

En este ejemplo hay que poner atención a ciertos detalles:

Aun y cuando no es necesario en este caso, los contenidos de los registros más

importantes (W, STATUS and PCLATH) deben de guardarse al inicio de cada rutina de

interrupción.

La interrupción causa que la bandera apropiada se active (“set”), en este ejemplo la

bandera que se activa es TMR0IF, y que el bit GIE se desactive (“clear”). Al finalizar la

rutina de interrupción no hay que olvidar regresar el bit GIE y la bandera a los valores que

tenían anteriormente.

Finalmente es crucial que los registros importantes sean devueltos a los valores que tenían

antes de entrar a la rutina de interrupción.

Código P1.4: ;************************************************ ; Nombre : P1_4.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Temporizador TMR0 e interrupciones ;************************************************ list p=16f887

Page 30: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

24

#include <p16f887.inc> errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF __CONFIG _CONFIG2, _BOR40V & _WRT_OFF ;**************** DEFINING VARIABLES **************************************** cblock 0x20 ; Block of variables starts at address 20h w_temp ; Variable at address 20h pclath_temp ; Variable at address 21h status_temp ; Variable at address 22h endc ;************************ START OF PROGRAM ********************************** org 0x0000 ; Address of the first program instruction goto main ; Go to label "main" ;************************ INTERRUPT ROUTINE ********************************* org 0x0004 ; Interrupt vector movwf w_temp ; Saves value in register W movf STATUS ; Saves value in register STATUS movwf status_temp movf PCLATH ; Saves value in register PCLATH movwf pclath_temp banksel PORTB ; Selects bank containing PORTB incf PORTB ; Increments register PORTB by 1 banksel INTCON ; Selects bank containing INTCON bcf INTCON,TMR0IF ; Clears interrupt flag TMR0IF movf pclath_temp,w ; PCLATH is given its original content movwf PCLATH movf status_temp,w ; STATUS is given its original content movwf STATUS swapf w_temp,f ; W is given its original content swapf w_temp,w bsf INTCON,GIE ; Global interrupt enabled retfie ; Return from interrupt routine ;************************ MAIN PROGRAM ************************************** main ; Start of the main program banksel ANSEL ; Bank containing register ANSEL clrf ANSEL ; Clears registers ANSEL and ANSELH clrf ANSELH ; All pins are digital banksel TRISB ; Selects bank containing register TRISB clrf TRISB ; All port B pins are configured as outputs banksel OPTION_REG ; Bank containing register OPTION_REG bcf OPTION_REG,T0CS ; TMR0 counts pulses from oscillator bcf OPTION_REG,PSA ; Prescaler is assign to timer TMR0 bsf OPTION_REG,PS0 ; Prescaler rate is 1:256 bsf OPTION_REG,PS1 bsf OPTION_REG,PS2 banksel INTCON ; Bank containing register INTCON bsf INTCON,TMR0IE ; TMR0 interrupt overflow enabled

Page 31: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

25

bsf INTCON,GIE ; Global interrupt enabled banksel PORTB ; Bank containing register PORTB clrf PORTB ; Clears port B loop goto loop ; Remain here end ; End of program

Circuito P1.4:

Actividades P1.4

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, de preferencia con la hoja de datos del microcontrolador

para identificar que hace cada registro, por último implemente el sistema en físico.

Práctica 1.5 Uso de botones y subrutinas

Descripción P1.5:

En los ejemplos anteriores el microcontrolador simplemente ejecuta el programa sin la posibilidad

de poder interactuar de alguna manera con este. En la realidad dispositivos trabajando de esta

manera, son poco comunes. Para agregarle más funcionalidad al programa que ejecuta un

microcontrolador es necesario utilizar las entradas con las que este cuenta.

Este ejemplo es bastante sencillo en realidad. Al inicio del programa, justo después de definir las

variables, los pines del microcontrolador son configurados utilizando los registros TRISA y TRISB.

Los pines del PORTA son configurados como entrada utilizando el registro TRISA, aun y cuando

esto no es necesario ya que la configuración inicial de los pines del PORTA es de entradas.

Page 32: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

26

El programa inicia activando un bit del PORTB y luego el contenido de este registro es

constantemente desplazados un lugar hacia la izquierda (utilizando la instrucción RLF, “Rotate Left

f through Carry”). Esto produce la impresión de que el diodo “led” encendido se mueve.

Presionando el botón “STOP” detiene el movimiento y el programa se mantiene en el “loop3”. El

retardo de tiempo en esta ocasión es realizado en una subrutina llamada “DELAY”.

Código P1.5: ;************************************************ ; Nombre : P1_5.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Uso de botones y subrutinas ;************************************************ list p=16f887 #include <p16f887.inc> errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF __CONFIG _CONFIG2, _BOR40V & _WRT_OFF ;************* DEFINING VARIABLES ******************************************* cblock 0x20 ; Block of variables starts at address 20h counter1 ; Variable "counter1" at address 20h counter2 ; Variable "counter2" at address 21h endc ; Block of variables ends ;************************ MAIN PROGRAM ************************************** org 0x0000 ; Address of the first program instruction banksel ANSEL ; Selects bank containing register ANSEL clrf ANSEL ; Clears registers ANSEL and ANSELH to clrf ANSELH ; configure all inputs as digital banksel TRISB ; Selects bank containing register TRISB clrf TRISB ; All port B pins are configured as outputs movlw B'00000010' movwf TRISA ; Pin RA1 is input banksel PORTB ; Selects bank containing register TRISB movlw B'00000001' ; Writes 1 to register W movwf PORTB ; Number is moved to PORTB loop rlf PORTB ; Port B bits rotates by one place left call DELAY ; Calls subroutine "DELAY" loop3 btfss PORTA,1 ; Tests the first port A bit goto loop3 ; "0" is applied to pin.Go to label "loop3" goto loop ; "1" is applied to pin.Go to label "loop" ;************************ SUBROUTINES *************************************** DELAY clrf counter2 ; Clears variable "counter2" loop1 clrf counter1 ; Clears variable "counter1" loop2 decfsz counter1 ; Decrements variable "counter1" by 1

Page 33: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

27

goto loop2 ; Result is not 0. Go to label loop2 decfsz counter2 ; Decrements variable "counter2" by 1 goto loop1 ; Result is not 0. Go to lab loop1 return ; Return from subroutine "DELAY" end ; End of program

Circuito P1.5:

Actividades P1.5

Implementar la práctica en el simulador y vea cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Práctica 1.6 Temporizador TMR0 como contador, variables y relevadores

Descripción P1.6:

En este ejemplo el temporizador TMR0 es usado como contador. La idea es conectar la entrada del

contador a un botón de tal manera que se cuente un pulso cada vez que se presione el botón.

Cuando el número de pulsos contados es igual al número en el registro “TEST”, un nivel lógico de 1

(5 V DC) aparece en el pin 3 del PORTD. Dado que este voltaje activa un relevador electromecánico,

este bit es llamado “Relay”.

En este ejemplo, el registro “TEST” contiene el número 5. En realidad, puede ser cualquier número.

En lugar del relevador, el microcontrolador puede activar algún otro dispositivo y en lugar de

botones se pueden usar sensores.

Page 34: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

28

Código P1.6: ;************************************************ ; Nombre : P1_6.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Temporizador TMR0 como contador, variables y relevadores ;************************************************ list p=16f887 #include <p16f887.inc> errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF __CONFIG _CONFIG2, _BOR40V & _WRT_OFF ;************* DEFINING VARIABLES ******************************************* TEST equ B'00000101' ; 00000101 = TEST #define RELAY PORTD,3 ; Pin PORTD,3 = RELAY ;************************ MAIN PROGRAM ************************************** org 0x0000 ; Address of the first program instruction banksel TRISB ; Selects bank containing register TRISB clrf TRISB ; All port B pins are configured as outputs clrf TRISD ; All port D pins are configured as outputs movlw B'00010000' ; This number is written to W register movwf TRISA ; Only the forth pin of port A is input banksel OPTION_REG ; Bank containing OPTION_REG register bsf OPTION_REG,T0CS ; Pin RA4 is supplied with pulses bsf OPTION_REG,PSA ; Prescaler rate is 1:1 banksel PORTB ; Selects bank containing PORTB register clrf TMR0 ; Clears timer register bcf PORTD,3 ; Pin PORTD,3 = 0 loop movfw TMR0 ; Timer register is moved to W register movwf PORTB ; W register is moved to PORTB xorlw TEST ; Operation exclusive OR between ; W register and number TEST (00000101) btfsc STATUS,Z ; If numbers are equal, result is 0 and bsf PORTD,3 ; bit STATUS,Z = 1. Bit PORTD,3 is set goto loop ; and jump to label loop is executed end ; End of program

Page 35: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

29

Circuito P1.6:

Actividades P1.6

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Práctica 1.7 Macros y rutinas para evitar el rebote de botones

Descripción P1.7:

Probablemente se habrá dado cuenta en el ejemplo anterior, que el microcontrolador no siempre

funciona como se espera. Es decir, cuando pulsaba el botón, el número en el puerto B no siempre

se incrementaba en 1. Esto se debe a que los botones mecánicos hacen varios contactos sucesivos

(rebote) cuando se activan. Como usted bien supone, el microcontrolador registra y cuenta cada

uno de ellos.

Hay varias maneras de resolver este problema. En esta práctica se utiliza un retardo en el

programa para evitar el conocido rebote. Básicamente, se trata de un procedimiento simple: Si se

detecta el cambio de entrada (se pulsa el botón), el programa ofrece una demora breve, es decir,

el programa espera a que el botón sea liberado, omitiendo los rebotes producto del botón

mecánico. Sólo después de esto, el programa llega a la conclusión de que el botón fue activado e

incrementa la variable en 1.

En este mismo caso, el pulsador se pone a prueba por medio de un macro llamado botón. Además,

esta macro contiene un retardo de programa que se proporciona por medio de otro macro

llamado pausems.

Page 36: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

30

El programa principal es relativamente simple y permite que la variable "CNT", se incremente y

decremente mediante dos pulsadores (push-bottons). Esta variable se copian al puerto B y afecta

el LED (El 1 lógico enciende el LED, mientras que el 0 lógico lo apaga).

Código P1.7: ;************************************************ ; Nombre : P1_7.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Macros y rutinas para evitar el rebote de botones ;************************************************ ;************* DEFINING VARIABLES ************************* cblock 0x20 ; Block of variables starts at address 20hex HIcnt LOcnt LOOPcnt cnt endc ; End of block of variables ;********************************************************************** ORG 0x000 ; Reset vector nop goto main ; Go to program start (label "main") ;********************************************************************** include "pause.inc" include "button.inc" ;********************************************************************** main banksel ANSEL ; Selects bank containing ANSEL clrf ANSEL ; All pins are digital clrf ANSELH banksel TRISB bsf TRISA, 0 bsf TRISA, 1 clrf TRISB banksel PORTB clrf cnt Loop button PORT,0,0,Increment button PORT,1,0,Decrement goto Loop Increment incf cnt, f movf cnt, w movwf PORTB goto Loop Decrement decf cnt, f movf cnt, w movwf PORTB goto Loop end ; End of program

Page 37: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

31

Macro pausems ARCHIVO: pause.inc

; Todo este código va en un archivo llamado pause.inc ;********************************************************************** pausems MACRO arg1 local Loop1 local dechi local Delay1ms local Loop2 local End movlw High(arg1) ; Higher byte of argument is moved to HIcnt movwf HIcnt movlw Low(arg1) ; Lower byte of argument is moved to LOcnt movwf LOcnt Loop1 movf LOcnt, f ; Decrements HIcnt and LOcnt while btfsc STATUS, Z ; needed and calls subroutine Delay1ms goto dechi call Delay1ms decf LOcnt, f goto Loop1 dechi movf HIcnt, f btfsc STATUS, Z goto End call Delay1ms decf HIcnt, f decf LOcnt, f goto Loop1 Delay1ms: ; Delay1ms provides delay of movlw .100 ; 100*10us=1ms movwf LOOPcnt ; LOOPcnt<-100 Loop2: nop nop nop nop nop nop nop decfsz LOOPcnt, f goto Loop2 ; Execution time of Loop2 return ; is 10 us End ENDM ;**********************************************************************

Macro button ARCHIVO: button.inc

; Todo este código va en un archivo llamado button.inc ;**************************************************** button MACRO port,pin,hilo,label local Pressed1 ; All labels are local local Pressed2 local Exit1 local Exit2

Page 38: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

32

IFNDEF debouncedelay ; Enables debounce time to be defined in main program #define debouncedelay .10 ENDIF IF (hilo == 0) ; If pull-up used btfsc port, pin ; If "1", push-button is pressed goto Exit1 pausems debouncedelay ; Wait for 10ms debounce Pressed1 btfss port, pin goto Pressed1 pausems debouncedelay ; Wait until released and goto label ; jump to specified address Exit1 ELSE ; If pull-down used btfss port, pin goto Exit2 ; If "0", push-button is released pausems debouncedelay ; Wait for 10ms debounce Pressed2 btfsc port, pin goto Pressed2 pausems debouncedelay ; Wait until released and goto label ; jump to specified address Exit2 ENDIF ENDM ;**********************************************************************

Circuito P1.7:

Actividades P1.7

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Page 39: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

33

Práctica 1.8 Temporizador TMR1 e interrupciones

Descripción P1.8:

El temporizador TMR1 de 16-bit se utiliza en este ejemplo. Al usar los registros TMR1L y TMR1H,

se produce una interrupción y el número en el puerto B se incrementa. Esto ya se ha visto en los

ejemplos anteriores. La diferencia está en el retraso del programa, que es un poco más largo en

esta ocasión porque la tasa de prescaler es ajustada en 1:8.

Código P1.8: ;************************************************ ; Nombre : P1_8.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Temporizador TMR1 e interrupciones ;************************************************ ;************* DEFINING VARIABLES ******************************************* cblock 0x20 ; Block of variables starts at address 20h w_temp ; Variable at address 20h pclath_temp ; Variable at address 21h status_temp ; Variable at address 22h endc ;************************ PROGRAM START ************************ org 0x0000 ; Address of the first program instruction goto main ; Jump to label "main" ;************************ INTERRUPT ROUTINE ********************************** org 0x0004 ; Interrupt vector movwf w_temp ; Save register W movf STATUS ; Save register STATUS movwf status_temp movf PCLATH ; Save register PCLATH movwf pclath_temp banksel PORTB ; Selects bank containing PORTB incf PORTB ; Register PORTB is incremented by 1 movf pclath_temp,w ; PCLATH is given its original content movwf PCLATH movf status_temp,w ; STATUS is given its original content movwf STATUS swapf w_temp,f ; W is given its original content swapf w_temp,w banksel PIR1 ; Selects bank containing PIR1 bcf PIR1,TMR1IF ; Clears interrupt flag TMR1IF bsf INTCON,GIE ; Global interrupt enabled retfie ; Return from interrupt routine ;************************ MAIN PROGRAM *************************************** main ; Start of main program banksel ANSEL ; Selects bank containing register ANSEL clrf ANSEL ; Clears registers ANSEL and ANSELH

Page 40: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

34

clrf ANSELH ; All pins are digital banksel TRISB ; Selects bank containing register TRISB clrf TRISB ; All port B pins are configured as outputs banksel T1CON ; Selects bank containing register T1CON bcf T1CON,TMR1CS ; TMR1 counts pulses generated by oscillator bsf T1CON,T1CKPS0 ; Prescaler rate is 1:8 bsf T1CON,T1CKPS1 bsf T1CON,TMR1ON ; Turns on timer TMR1 banksel PIE1 ; Selects bank containing register PIE1 bsf PIE1,TMR1IE ; TMR1 interrupt overflow enabled bsf INTCON,PEIE ; Peripheral modules interrupt enabled Timer TMR1 belongs to peripheral modules bsf INTCON,GIE ; Global interrupt enabled banksel PORTB ; Selects bank containing register PORTB clrf PORTB ; Clears port B loop goto loop ; Remain here end ; End of program

Circuito P1.8:

Actividades P1.8

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Práctica 1.9 Temporizador TMR2 y configuración del oscilador

Descripción P1.9:

Este ejemplo ilustra el uso del temporizador TMR2. El microcontrolador utiliza el oscilador interno

HFINTOSC con la frecuencia de 500 kHz. Todo el programa funciona de la siguiente manera:

Después del período de tiempo definido por el registro PR, el prescaler y postscaler han expirado,

Page 41: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

35

lo cual produce una interrupción. La rutina de la interrupción decrementa el contenido del registro

PR y simultáneamente incrementa el contenido del puerto B. Puesto que el número en el registro

PR, el cual determina cuando se producen las interrupciones, está constantemente

decrementando su valor, las interrupciones se producirán cada vez durante períodos más cortos

de tiempo. En otras palabras, la cuenta se lleva a cabo cada vez más rápido. Un nuevo ciclo de

conteo más corto comienza después de cada desbordamiento del registro PR.

Código P1.9: ;************************************************ ; Nombre : P1_9.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Temporizador TMR2 y configuración del oscilador ;************************************************ ;************* DEFINING VARIABLES ************************************************ cblock 0x20 ; Block of variables starts at address 20h w_temp ; Variable at address 20h pclath_temp ; Variable at address 21h status_temp ; Variable at address 22h endc ;************************ PROGRAM START ****************************************** org 0x0000 ; Address of the first program instruction goto main ; Jump to label "main" ;************************ INTERRUPT ROUTINE ************************************** org 0x0004 ; Interrupt vector movwf w_temp ; Save register W movf STATUS ; Save register STATUS movwf status_temp movf PCLATH ; Save register PCLATH movwf pclath_temp banksel PORTB ; Selects bank containing PORTB incf PORTB ; Increments PORTB register by 1 banksel PR2 ; Selects bank containing PR2 decf PR2 ; PR2 is decremented by 1 movf pclath_temp,w ; PCLATH is given its original state movwf PCLATH movf status_temp,w ; STATUS is given its original state movwf STATUS swapf w_temp,f ; W is given its original state swapf w_temp,w banksel PIR1 ; Selects bank containing PIR1 bcf PIR1,TMR2IF ; Clears interrupt flag TMR2IF bsf INTCON,GIE ; Global interrupt enabled retfie ; Return from interrupt routine ;************************ MAIN PROGRAM ******************************************* main ; Start of the main program banksel OSCCON ; Selects bank containing register OSCCON bcf OSCCON,6 ; Selects internal oscillator HFINTOSC with bsf OSCCON,5 ; frequency of 500KHz bsf OSCCON,4

Page 42: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

36

bsf OSCCON,0 ; Microcontroller uses internal oscillator banksel ANSEL ; Selects bank containing register ANSEL clrf ANSEL ; Clears registers ANSEL and ANSELH clrf ANSELH ; All pins are digital banksel TRISB ; Selects bank containing register TRISB clrf TRISB ; All port B pins are configured as outputs clrf PR2 banksel T2CON ; Selects bank containing register T2CON movlw H'FF' ; Sets all control register bits movwf T2CON ; prescaler=1:16, postscaler=1:16 TMR2=ON clrf PORTB banksel PIE1 ; Selects bank containing register PIE1 bsf PIE1,TMR2IE ; TMR2 interrupt enabled bsf NTCON,PEIE ; Peripheral modules interrupt enabled ; Timer TMR2 belongs to peripheral modules bsf INTCON,GIE ; Global interrupt enabled loop goto loop ; Remain here end ; End of program

Circuito P1.9:

Actividades P1.9

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Práctica 1.10 Modulo CCP 1 como generador de señales tipo PWM

Descripción P1.10:

Puesto que los módulos CCP tienen una amplia gama de posibilidades que se utilizan

habitualmente en la práctica. Este ejemplo ilustra el uso del módulo CCP1 en modo PWM. Los bits

Page 43: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

37

del registro CCP1CON determinan que el módulo funciona como un PWM de salida única. Los

mismos bits determinan la frecuencia PWM para ser de 4.88 kHz. Para hacer las cosas más

interesantes, la duración de los pulsos en la salida P1A (PORTC, 2) se puede cambiar por medio de

“push-buttons” simbólicamente llamado "OSCURO" y "BRILLO". Los push-buttons son probados en

una rutina de interrupción iniciada por el temporizador TMR1. Cualquier cambio afecta el diodo

LED para que la intensidad de la luz de este cambie. Es importante tener en cuentan que el puerto

B no utiliza resistencias externas, porque utiliza las resistencias internas “pull-up”. Todo el proceso

de generación de la señal PWM se lleva a cabo "detrás de bambalinas", lo cual permite que el

microcontrolador haga otras cosas.

Código P1.10: ;************************************************ ; Nombre : P1_10.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Modulo CCP 1 como generador de señales tipo PWM ;************************************************ ;************* DEFINING VARIABLES ******************************************* cblock 0x20 ; Block of variables starts at address 20h w_temp ; Variable at address 20h pclath_temp ; Variable at address 21h status_temp ; Variable at address 22h endc #define DARK PORTB,0 ; Push-button "DARK" is connected to PORTB,0 pin #define BRIGHT PORTB,1 ; Push-button "BRIGHT" is connected to PORTB,1 pin ;************************ PROGRAM START ************************************* org 0x0000 ; First program instruction address goto main ; Jump to label "main" ;************************ INTERRUPT ROUTINE ********************************* org 0x0004 ; Interrupt vector movwf w_temp ; Save register W movf STATUS ; Save register STATUS movwf status_temp movf PCLATH ; Save register PCLATH movwf pclath_temp banksel CCPR1L btfss DARK ; Tests push-button "DARK" decf CCPR1L ; Push-button is pressed - decrement CCP1L by 1 btfss BRIGHT ; Testing push-button "BRIGHT" incf CCPR1L ; Push-button is pressed - increment CCP1L by 1 movf pclath_temp,w ; PCLATH is given its original content movwf PCLATH movf status_temp,w ; STATUS is given its original content movwf STATUS swapf w_temp,f ; W is given its original content swapf w_temp,w banksel PIR1 ; Selects bank containing PIR1 bcf PIR1,TMR1IF ; Clears interrupt flag TMR1IF

Page 44: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

38

bsf TMR1H,7 ; Accelerates timer TMR0 counting bsf TMR1H,6 ; bsf INTCON,GIE ; Global interrupt enabled retfie ; Return from interrupt routine ;************************ MAIN PROGRAM ************************************** main ; Start of the main program banksel ANSEL ; Selects bank containing register ANSEL clrf ANSEL ; Clears registers ANSEL and ANSELH clrf ANSELH ; All pins are digital banksel OPTION_REG ; Selects bank containing register ANSEL bcf OPTION_REG,7 ; Pull-up resistors enabled bsf WPUB,0 ; Pull-up resistors enabled bsf WPUB,1 ; on port B pins 0 and 1 banksel TRISC ; Selects bank containing register TRISC clrf TRISC ; All port C pins are configured as outputs banksel T1CON ; Selects bank containing register T1CON bcf T1CON,TMR1CS ; TMR1 operates as a timer bcf T1CON,T1CKPS0 ; Prescaler rate is 1:8 bcf T1CON,T1CKPS1 bsf T1CON,TMR1ON ; Activates timer TMR1 banksel PIE1 ; Selects bank containing register PIE1 bsf PIE1,TMR1IE ; Interrupt TMR1 is enabled bsf INTCON,PEIE ; Peripheral modules interrupts are enabled bsf INTCON,GIE ; Global interrupt enabled movlw B'11111101' ; Prescaler TMR2 = 1:4 banksel T2CON movwf T2CON movlw B'11111111' ; Number in register PR2 banksel PR2 movwf PR2 banksel CCP1CON movlw B'00001100' ; Bits to configure CCP1 module movwf CCP1CON loop goto loop ; Remain here end ; End of program

Page 45: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

39

Circuito P1.10:

Actividades P1.10

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Práctica 1.11 Uso del convertidor analógico-digital (ADC)

Descripción P1.11:

El convertidor A/D del PIC16F887 es usado en este ejemplo. Todo es muy simple. Una señal

analógica variable se aplica en el pin AN2, mientras que el resultado de la conversión se muestra

en el puerto B como un número binario. Con el fin de simplificar el programa tanto como sea

posible, sólo se muestran los 8 bits menos significativos del resultado de la conversión. La tierra

GND se utiliza como tensión de referencia Vref- (negativa), mientras que la tensión de referencia

positiva es aplicada sobre la entrada AN3. Esto permite escalar la medición de voltaje, es decir,

permite "estirar y encoger" el rango de voltaje a medir.

Para aclarar esto, el convertidor A/D siempre genera un resultado binario de 10-bits, lo que

significa que se detectan un total de 1024 niveles de voltaje. La diferencia entre los dos niveles de

voltaje no es siempre la misma. Cuanto menor sea la diferencia entre Vref+ y Vref-, menor será la

diferencia entre dos de los niveles de 1024. En consecuencia, el convertidor A/D será capaz de

detectar pequeños cambios en el voltaje.

Page 46: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

40

Código P1.11: ;************************************************ ; Nombre : P1_11.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Uso del convertidor analógico-digital (ADC) ;************************************* ;************************ PROGRAM START ************************************* org 0x0000 ; Address of the first program instruction banksel TRISB ; Selects bank containing register TRISB clrf TRISB ; All port B pins are configured as outputs movlw B'00001100' movwf TRISA ; Pins RA2 and RA3 are configured as inputs banksel ANSEL ; Selects bank containing register ANSEL movlw B'00001100' ; Inputs AN2 and AN3 are analog while movwf ANSEL ; all other pins are digital clrf ANSELH banksel ADCON1 ; Selects bank including register ADCON1 bsf ADCON1,ADFM ; Right justification of result bcf ADCON1,VCFG1 ; Voltage Vss is used as Vref bsf ADCON1,VCFG0 ; RA3 pin voltage is used as Vref+ banksel ADCON0 ; Selects bank containing register ADCON0 movlw B'00001001' ; AD converter uses clock Fosc/2, AD channel movwf ADCON0 ; on RA2 pin is used for conversion and AD converter is enabled loop banksel ADCON0 btfsc ADCON0,1 ; Tests bit GO/DONE goto loop ; Conversion in progress, remain in loop banksel ADRESL movf ADRESL,w ; Lower byte of conversion result is copied to W banksel PORTB movwf PORTB ; Byte is copied to PORTB bsf ADCON0,1 ; Starts new conversion goto loop ; Jump to label "loop" end ; End of program

Circuito P1.11:

Page 47: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

41

Actividades P1.11

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Práctica 1.12 Uso de la memoria EEPROM

Descripción P1.12:

Este ejemplo se muestra como escribir y leer en la memoria incorporada EEPROM. El programa

trabaja de la siguiente manera. El programa principal lee constantemente lo que hay alojado en la

dirección 5 (decimal) de la memoria EEPROM. El valor alojado en la memoria es mostrado en el

puerto D. El programa principal además verifica el estado de tres push-buttons (botones)

conectados al puerto A. Los botones "INCREMENT" y "DECREMENT" tienen el mismo propósito,

que los del programa 7 – El incremento y decremento de la variable "cnt" que después se visualiza

en el puerto B. El tercer botón "MEMO" permite que la variable sea escrita en la memoria

EEPROM. Para comprobarlo, basta con pulsar este botón y apagar el dispositivo. Cuando el

dispositivo se vuelva a encender, el programa mostrará el valor de la variable en el puerto D (en el

momento de la escritura, este valor se mostraba en el puerto B).

Código P1.12: ;************************************************ ; Nombre : P1_12.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Uso de la memoria EEPROM ;************************************* ;*********** Defining variables in program ********************************** cblock 0x20 ; Block of variables starts at address 20h HIcnt LOcnt LOOPcnt cnt endc ; End of block ;**************************************************************************** ORG 0x000 ; Reset vector nop goto main ; Go to start of the program (label "main") ;**************************************************************************** include "pause.inc" include "button.inc" ;**************************************************************************** main banksel ANSEL ; Selects bank containing ANSEL clrf ANSEL clrf ANSELH ; All pins are digital banksel TRISB bsf TRISA, 0 ; Input pin bsf TRISA, 1 ; Input pin bsf TRISA, 2 ; Input pin clrf TRISB ; All port B pins are outputs clrf TRISD ; All port D pins are outputs banksel PORTB clrf PORTB ; PORTB=0

Page 48: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

42

clrf PORTD ; PORTD=0 clrf cnt ; cnt=0 Loop banksel PORTA button PORTA,0,0,Increment button PORTA,1,0,Decrement button PORTA,2,0,Save banksel EEADR movlw .5 ; Reads EEPROM memory location movwf EEADR ; at address 5 banksel EECON1 bcf EECON1,EEPGD bsf EECON1,RD ; Reads data from EEPROM memory banksel EEDATA movfw EEDATA ; Moves data to W banksel PORTD movwf PORTD ; Data is moved from W to PORTD goto Loop Increment ; Increments number on port B incf cnt, f movf cnt, w movwf PORTB goto Loop Decrement ; Decrements number on port B decf cnt, f movf cnt, w movwf PORTB goto Loop Save ; Copies data from port B to EEPROM banksel EEADR ; memory location at address 5 movlw .5 movwf EEADR ; Writes address banksel PORTB movfw PORTB ; Copies port B to register W banksel EEDAT movwf EEDAT ; Writes data to temporary register banksel EECON1 bcf EECON1,EEPGD bsf EECON1,WREN ; Write enabled bcf INTCON,GIE ; All interrupts disabled btfsc INTCON,GIE goto $-2 movlw 55h movwf EECON2 movlw H'AA' movwf EECON2 bsf EECON1,WR btfsc EECON1,WR ; Wait for write to complete goto $-1 bsf INTCON,GIE ; Interrupt enabled bcf EECON1,WREN goto Loop ; Tests push-buttons again end ; End of program

Page 49: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

43

Circuito P1.12:

Actividades P1.12

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Práctica 1.13 Contador de dos dígitos multiplexado

Descripción P1.13:

En este ejemplo, el microcontrolador funciona como un contador de dos dígitos. Concretamente,

la variable Dval se decrementa (lo suficientemente lento como para ser visible) y su valor se

muestra en 2 displays de 7 segmentos (99-0). El desafío es convertir el número binario a decimal

en los 2 displays (decenas y unidades). Además, puesto que los segmentos de los displays de LED

están conectados en paralelo (al mismo puerto del PIC), es necesario asegurar un cambio rápido

con el fin de dar la impresión de que ambos displays emiten luz simultánea (multiplexación por

división de tiempo). Es importante recordar que en electrónica, la multiplexación permite que

varias señales analógicas sean procesadas por un solo convertidor analógico-digital (ADC).

En este caso, la multiplexación por división de tiempo se lleva a cabo por el temporizador TMR0,

mientras que la conversión de número binario a número decimal se realiza en un macro "digbyte".

Page 50: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

44

El contador puede ponerse en su valor inicial (99) en cualquier momento pulsando el botón

"RESET COUNTER".

Código P1.13: ;************************************************ ; Nombre : P1_13.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Contador de dos dígitos multiplexado ;************************************* ;**************************************************************************** ; DEFINING VARIABLES IN PROGRAM w_temp EQU 0x7D ; Variable for saving W register status_temp EQU 0x7E ; Variable for saving STATUS register pclath_temp EQU 0x7F ; Variable for saving PCLATH register CBLOCK 0x20 ; Block of variables starts at address 20h Digtemp Dig0 ; Variables for displaying digits - LSB Dig1 Dig2 Dig3 ; Variables for displaying digits - MSB Dval ; Counter value One ; Auxiliary variable which determines which display is to be switched on ENDC ; End of block of variables poc_vr EQU .99 ; Initial counter value is 99 include "Digbyte.inc" ;**************************************************************************** ORG 0x0000 ; First instruction address goto main ; Jump to label "main" ;**************************************************************************** ORG 0x0004 ; Interrupt vector address movwf w_temp ; Move w register to w_temp register movf STATUS,w ; Move STATUS register to status_temp movwf status_temp ; register movf PCLATH,w ; Move PCLATH register to pclath_temp movwf pclath_temp ; register ; Start of interrupt routine... BANKSEL TMR0 movlw .100 movwf TMR0 bcf INTCON, T0IF bcf PORTA, 0 bcf PORTA, 1 btfsc One, 0 goto Lsdon goto Msdon Lsdon incf One, f

Page 51: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

45

movlw HIGH (Bcdto7seg) movwf PCLATH digbyte Dval movf Dig1, w call Bcdto7seg ; Place L1 mask on the PORTD movwf PORTD bsf PORTA, 1 goto ISR_end Msdon incf One, f movlw HIGH (Bcdto7seg) movwf PCLATH digbyte Dval movf Dig0, w call Bcdto7seg ; Place LO mask on the PORTD movwf PORTD bsf PORTA, 0 goto ISR_end ; End of interrupt routine... ISR_end movf pclath_temp,w ; PCLATH register is given its original movwf PCLATH ; state movf status_temp,w ; STATUS register is given its original movwf STATUS ; state swapf w_temp,f ; W register is given its original ; state swapf w_temp,w retfie ; Return from interrupt routine main banksel ANSEL ; Selects bank containing ANSEL clrf ANSEL ; All pins are digital clrf ANSELH BANKSEL TRISA movlw b'11111100' ; RA0 and RA1 are configured as outputs and used for 7-segment display multiplexing RA2 is input ;push-button for initialization movwf TRISA clrf TRISD BANKSEL OPTION_REG movlw b'10000110' ; TMR0 is incremented each 32us (Fclk=8MHz) movwf OPTION_REG BANKSEL PORTA movlw poc_vr movwf Dval ; Dval contains counter value movlw b'00000001' ; Initializes variable specifying display movwf One ; to switch on movwf PORTA movlw .100 movwf TMR0 ; TMR0 interrupt appr.every 10ms bsf INTCON, GIE ; Global interrupt enabled bsf INTCON, T0IE ; Timer TMR0 interrupt enabled bcf INTCON, T0IF Loop btfss One, 3 ; Falling edge encountered? goto Dec ; Yes! Go to Dec btfss PORTA, 2 ; Counter reset button pressed? goto Reset ; Yes! Go to Reset goto Loop ; Decrement Dval counter by 1

Page 52: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

46

Dec btfss One, 3 goto Dec movf Dval, f btfsc STATUS, Z ; Is Dval equal to 0? goto Loop ; If it is, go to loop and wait for T2 decf Dval, f ; If Dval not equal to 0, decrement it by 1 goto Loop Reset btfss PORTA, 2 ; Wait for rising edge goto Reset movlw poc_vr movwf Dval ; Write initial value to counter goto Loop ;**************************************************************************** ORG 0x0300 ; Lookup table is at the top of third page, but can be placed at some other place, it is important to have it ; all on one page Bcdto7seg addwf PCL, f DT 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f ;**************************************************************************** END ; End of program

Macro digbyte Archivo:Digbyte.inc

; Todo este código va en un archivo llamado Digbyte.inc ;**************************************************** digbyte MACRO arg0 LOCAL Exit0 LOCAL Exit1 LOCAL Exit2 clrf Dig0 clrf Dig1 clrf Dig2 clrf Dig3 movf arg0, w movwf Digtemp movlw .100 Exit2 incf Dig2, f subwf Digtemp, f btfsc STATUS, C goto Exit2 decf Dig2, f addwf Digtemp, f Exit1 movlw .10 incf Dig1, f subwf Digtemp, f btfsc STATUS, C goto Exit1 decf Dig1, f addwf Digtemp, f Exit0 movf Digtemp, w movwf Dig0 ENDM

Page 53: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

47

Circuito P1.13:

Actividades P1.13

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Práctica 1.14 Generación de sonidos usando macros

Descripción P1.14:

La generación de sonido es una tarea comúnmente asignada al microcontrolador. Básicamente,

todo se trata de generar una secuencia de pulsos en el pin de salida. Al hacer esto, la proporción

de la duración del cero lógico (0) contra el uno lógico (1) determina la altura del tono y cambiando

los diferentes tonos, surgen diferentes melodías.

En este ejemplo, cualquier acción de los push-buttons T1 y T2 genera un sonido. Las instrucciones

correspondientes se almacenan en una macro "beep" que contiene dos argumentos: la frecuencia

y la duración.

Código P1.14: ;************************************************ ; Nombre : P1_14.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Generación de sonidos usando macros ;************************************* ;******************* Defining variables in program ******************** cblock 0x20 HIcnt ; Auxiliary variables for macro pausems LOcnt LOOPcnt PRESCwait Beep_TEMP1 ; Belongs to macro "BEEP" Beep_TEMP2 Beep_TEMP3

Page 54: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

48

endc #define BEEPport PORTD, 2 ; Speaker pin #define BEEPtris TRISD, 2 expand ;********************************************************************** ORG 0x0000 ; RESET vector address goto main ; Jump to program start (label - main) ;********************************************************************** ; remaining code goes here include "pause.inc" include "button.inc" include "beep.inc" main banksel ANSEL ; Selects bank containing ANSEL clrf ANSEL ; All outputs are digital clrf ANSELH banksel TRISD movlw b'11111011' ; PORTA D initialization movwf TRISD banksel PORTD BEEPinit ; Macro "Beep" Loop button PORTD,0,0,Play1 ; Push-button 1 button PORTD,1,0,Play2 ; Push-button 2 goto Loop Play1 ; First tone BEEP 0xFF, 0x02 BEEP 0x90, 0x05 BEEP 0xC0, 0x03 BEEP 0xFF, 0x03 goto Loop Play2 ; Second tone BEEP 0xBB, 0x02 BEEP 0x87, 0x05 BEEP 0xA2, 0x03 BEEP 0x98, 0x03 goto Loop ;********************************************************************** END ; End of program

Macro beep Archivo: beep.inc

BEEPinit MACRO bcf STATUS, RP0 bcf STATUS, RP1 bcf BEEPport bsf STATUS, RP0 bcf STATUS, RP1 bcf BEEPtris movlw b'00000111' ; TMR0 prescaler rate 1:256 movwf OPTION_REG ; OPTION <- W bcf STATUS, RP0 bcf STATUS, RP1 ENDM BEEP MACRO freq, duration bcf STATUS, RP0

Page 55: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

49

bcf STATUS, RP1 movlw freq movwf Beep_TEMP1 movlw duration movwf Beep_TEMP2 call BEEPsub ENDM ;********************************************************************** ; Subroutines BEEPsub clrf TMR0 ; Counter initialization bcf INTCON, T0IF bcf BEEPport BEEPa bcf INTCON, T0IF ; Clears TMR0 Overflow Flag BEEPb bsf BEEPport call B_Wait ; Logic one "1" duration bcf BEEPport call B_Wait ; Logic zero "0" duration btfss INTCON, T0IF ; Check TMR0 Overflow Flag, goto BEEPb ; skip next if set decfsz Beep_TEMP2, f ; Is Beep_TEMP2 = 0 ? goto BEEPa ; Go to BEEPa again return B_Wait movf Beep_TEMP1, w movwf Beep_TEMP3 B_Waita decfsz Beep_TEMP3, f goto B_Waita return

Circuito P1.14:

Page 56: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

50

Actividades P1.14

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Práctica 1.15 Uso del display de cristal líquido (LCD)

Descripción P1.15:

Este ejemplo ilustra el uso de la pantalla LCD alfanumérica. El programa en sí es muy simple ya que

se utilizan las macros (por lo general el esfuerzo de crear macros vale la pena al final).

Se muestran dos mensajes escritos en 2 líneas en la pantalla LCD. El segundo mensaje se destina a

mostrar la temperatura actual. Dado que no hay ningún sensor instalado, la medición no se lleva a

cabo realmente, simplemente el valor de la variable "temp" aparece en la pantalla.

Código P1.15: ;************************************************ ; Nombre : P1_15.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Utilización del display de cristal líquido (LCD) ;************************************* ; DEFINING VARIABLES IN PROGRAM CBLOCK 0x20 ; Block of variables starts at address 20h HIcnt ; Belongs to macro "pausems" LOcnt LOOPcnt LCDbuf ; Belongs to functions "LCDxxx" LCDtemp LCDportBuf ; LCD Port Buffer Digtemp ; Belongs to macro "digbyte" Dig0 Dig1 Dig2 Dig3 temp ENDC ; End of block LCDport EQU PORTB ; LCD is on PORTB (4 data lines on RB0-RB3) RS EQU 4 ; RS line connected to RB4 EN EQU 5 ; EN line connected to RB5 ;********************************************************************** ORG 0x0000 ; Reset vector address nop goto main ; Go to beginning of the program (label "main") ;********************************************************************** include "LCD.inc" include "digbyte.inc" include "pause.inc" ;********************************************************************** main banksel ANSEL ; Selects bank containing ANSEL

Page 57: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

51

clrf ANSEL ; All pins are digital clrf ANSELH bcf STATUS,RP0 ; Bank0 active only bcf STATUS,RP1 movlw .23 movwf temp ; Move arbitrary value to variable is to be displayed on LCD lcdinit ; LCD initialization Loop lcdcmd 0x01 ; Instruction to clear LCD lcdtext 1, "UTCH" ; Write text from the beginning of the first line lcdtext 2, "CAZADORES" ; Write text from the beginning of the second line pausems .2000 ; 2 sec. delay lcdcmd 0x01 ; Instruction to clear LCD lcdtext 1, "Temperatura1" ; Write text from the beginning of the first line lcdtext 2, "temp=" ; Write text from the beginning of the second line lcdbyte temp ; Write variable (dec.) lcdtext 0, " C" ; Write text after cursor pausems .2000 ; 2 sec. delay goto Loop ;********************************************************************** end ; End of program

Archivo LCD.inc

; Esto va en un archivo que lleva el nombre de LCD.inc ;********************************************************************** ; Initialization must be done by using macro lcdinit before accessing LCD ;********************************************************************** lcdinit MACRO bcf STATUS, RP0 ; Bank0 bcf STATUS, RP1 clrf LCDportBuf movf LCDportBuf, w movwf LCDport bsf STATUS, RP0 ; Bank1 bcf STATUS, RP1 clrf TRISB ; LCDport with output LCD bcf STATUS, RP0 ; Bank0 bcf STATUS, RP1 ; Function set (4-bit mode change) movlw b'00100000' movwf LCDbuf swapf LCDbuf, w movwf LCDportBuf bcf LCDportBuf, RS movf LCDportBuf, w movwf LCDport bsf LCDportBuf, EN movf LCDportBuf, w movwf LCDport bcf LCDportBuf, EN movf LCDportBuf, w movwf LCDport call Delay1ms ; 1 ms delay ; Function set (display mode set) lcdcmd b'00101100' call Delay1ms ; 1 ms delay ; Display ON/OFF Control lcdcmd b'00001100'

Page 58: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

52

call Delay1ms ; 1 ms delay ; Entry Mode Set lcdcmd b'00000110' call Delay1ms ; 1 ms delay ; Display Clear lcdcmd b'00000001' pausems .40 ; 40 ms delay ; Function set (4-bit mode change) movlw b'00100000' movwf LCDbuf swapf LCDbuf, w movwf LCDportBuf bcf LCDportBuf, RS movf LCDportBuf, w movwf LCDport bsf LCDportBuf, EN movf LCDportBuf, w movwf LCDport bcf LCDportBuf, EN movf LCDportBuf, w movwf LCDport call Delay1ms ; 1 ms delay ; Function set (display mode set) lcdcmd b'00101100' call Delay1ms ; 1 ms delay ; Display ON/OFF Control lcdcmd b'00001100' call Delay1ms ; 1 ms delay ; Entry Mode Set lcdcmd b'00000110' call Delay1ms ; 1 ms delay ; Display Clear lcdcmd b'00000001' pausems .40 ; 40 ms delay ENDM ;********************************************************************** ; lcdcmd sends command to LCD (see the table on the previous page) ; lcdclr is the same as lcdcmd 0x01 ;********************************************************************** lcdcmd MACRO LCDcommand ; Send command to LCD movlw LCDcommand call LCDcomd ENDM LCDcomd movwf LCDbuf bcf LCDportBuf, RS movf LCDportBuf, w movwf LCDport goto LCDwr LCDdata movwf LCDbuf bsf LCDportBuf, RS movf LCDportBuf, w movwf LCDport goto LCDwr LCDwr swapf LCDbuf, w

Page 59: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

53

call SendW movf LCDbuf, w call SendW return SendW andlw 0x0F movwf LCDtemp movlw 0xF0 andwf LCDportBuf, f movf LCDtemp, w iorwf LCDportBuf, f movf LCDportBuf, w movwf LCDport call Delay1ms bsf LCDportBuf, EN movf LCDportBuf, w movwf LCDport bcf LCDportBuf, EN movf LCDportBuf, w movwf LCDport call Delay1ms return ;********************************************************************** ; lcdtext writes text containing 16 characters which represents a ; macro argument. The first argument select selects the line in which ; text writing is to start. If select is 0, text writing starts from ; cursor current position. ;********************************************************************** lcdtext MACRO select, text ; This macro writes text from cursor current position. Text is specified in argument consisting ;of 16 characters local Message local Start local Exit local i=0 goto Start Message DT text ; Create lookup table from arguments DT 0 Start IF (select == 1) lcdcmd b'10000000' ELSE IF (select == 2) lcdcmd b'11000000' ENDIF ENDIF WHILE (i<16) ; Repeat conditional program compiling 16 times call Message+i ; Read lookup table and place value in W addlw 0 bz Exit ; until 0 is read call LCDdata ; Call routine displaying W on LCD i=i+1 ENDW Exit ENDM ;********************************************************************** ; This macro writes value in size of 1 byte on LCD excluding leading zeros ;********************************************************************** lcdbyte MACRO arg0 digbyte arg0 ; A hundred is in Dig2, A ten is in Dig1 and one in Dig0 movf Dig2, w addlw 0x30 call LCDdata

Page 60: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

54

movf Dig1, w ; If digit is 0 move cursor addlw 0x30 call LCDdata movf Dig0, w ; If digit is 0 move cursor addlw 0x30 call LCDdata ENDM ;********************************************************************** ; 1ms Delay Delay1ms: movlw .200 movwf LOOPcnt Delay10us: nop ;1us nop ;1us nop ;1us nop ;1us nop ;1us nop ;1us nop ;1us decfsz LOOPcnt, f ;1us goto Delay10us ;2us return

Circuito P1.15:

Actividades P1.15

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Práctica 1.16 Comunicación serial RS232

Descripción P1.16:

Este ejemplo ilustra el uso del módulo EUSART del microcontrolador. La conexión al PC se activa a

través de protocolo estándar de comunicación RS232 (serie). El programa trabaja de la siguiente

manera: Cada byte recibido a través de la comunicación en serie se muestra mediante diodos LED

conectados al puerto B y se devuelve automáticamente al transmisor. Si se produce un error en la

recepción, se indica poniendo a todos los LED encendidos. La forma más fácil de probar el

Page 61: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

55

funcionamiento del dispositivo en la práctica es utilizar el programa estándar de Windows llamado

Hyper Terminal.

Código P1.16: ;************************************************ ; Nombre : P1_16.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Comunicación serial RS232 ;************************************* ; DEFINING VARIABLES IN PROGRAM w_temp EQU 0x7D ; Variable for saving W register status_temp EQU 0x7E ; Variable for saving STATUS register pclath_temp EQU 0x7F ; Variable for saving PCLATH w register cblock 0x20 ; Block of variables starts at address 20 h Port_A ; Variable at address 20 h Port_B ; Variable at address 21 h RS232temp ; Variable at address 22 h RXchr ; Variable at address 23 h endc ; End of block of variables ;********************************************************************** ORG 0x0000 ; Reset vector nop goto main ; Go to beginning of program (label "main") ;********************************************************************** ORG 0x0004 ; Interrupt vector address movwf w_temp ; Save value of W register movf STATUS,w ; Save value of STATUS register movwf status_temp movf PCLATH,w ; Save value of PCLATH register movwf pclath_temp ;********************************************************************** ; This part of the program is executed in interrupt routine banksel PIE1 btfss PIE1, RCIE goto ISR_Not_RX232int banksel PIE1 btfsc PIR1, RCIF call RX232_int_proc ISR_Not_RX232int movf pclath_temp,w movwf PCLATH ; PCLATH is given its original value movf status_temp,w movwf STATUS ; STATUS is given its original value swapf w_temp,f swapf w_temp,w ; W is given its original value retfie ; Return from interrupt routine ;********************************************************************** RX232_int_proc ; Check if error has occurred banksel RCSTA movf RCSTA, w movwf RS232temp btfsc RS232temp, FERR goto RX232_int_proc_FERR btfsc RS232temp, OERR goto RX232_int_proc_OERR

Page 62: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

56

goto RX232_int_proc_Cont RX232_int_proc_FERR bcf RCSTA, CREN ; To clear FERR bit, receiver is first ; switched off and on afterwards nop ; Delay ... nop bsf RCSTA, CREN movf RCREG, w ; Reads receive register and clears FERR bit bsf Port_A, 0 ; Switches LED on ( UART error indicator) movf Port_A, w movwf PORTA goto RS232_exit RX232_int_proc_OERR bcf RCSTA, CREN ; Clears OERR bit nop ; Delay ... nop bsf RCSTA, CREN movf RCREG, w ; Reads receive register and clears FERR bit bsf Port_A, 1 ; Switches LED on ( UART error indicator) movf Port_A, w movwf PORTA goto RS232_exit RX232_int_proc_Cont movf RCREG, W ; Reads received data movwf RXchr movwf PORTB movwf TXREG ; Sends data back to PC RS232_exit return ; Return from interrupt routine ;********************************************************************** ; Main program main banksel ANSEL ; Selects bank containing ANSEL clrf ANSEL ; All inputs are digital clrf ANSELH ;--------------------------------------- ; Port configuration ;--------------------------------------- banksel TRISA movlw b'11111100' movwf TRISA movlw b'00000000' movwf TRISB ;--------------------------------------- ; Setting initial values ;--------------------------------------- banksel PORTA movlw b'11111100' movwf PORTA movwf Port_A movlw b'00000000' movwf PORTB movwf Port_B ;--------------------------------------- ; USART - setting for 38400 bps ;--------------------------------------- banksel TRISC bcf TRISC, 6 ; RC6/TX/CK = output bsf TRISC, 7 ; RC7/RX/DT = input

Page 63: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

57

banksel BAUDCTL bsf BAUDCTL, BRG16 banksel SPBRG movlw .51 ; baud rate = 38400 ( Fosc/(4*(SPBRG+1)) ) Error +0.16% movwf SPBRG clrf SPBRGH banksel TXSTA bcf TXSTA, TX9 ; Data is 8-bit wide bsf TXSTA, TXEN ; Data transmission enabled bcf TXSTA, SYNC ; Asynchronous mode bsf TXSTA, BRGH ; High-speed Baud rate banksel RCSTA bsf RCSTA, SPEN ; RX/DT and TX/CK outputs configuration bcf RCSTA, RX9 ; Select mode for 8-bit data receive bsf RCSTA, CREN ; Receive data enabled bcf RCSTA, ADDEN ; No address detection, ninth bit may be used as parity bit movf RCSTA, W movf RCREG, W ;--------------------------------------- ; Interrupts enabled ;--------------------------------------- banksel PIE1 bsf PIE1, RCIE ; USART Rx interrupt enabled bsf INTCON, PEIE ; All peripheral interrupts enabled bsf INTCON, GIE ; Global interrupt enabled ;--------------------------------------- ; Remain here ;--------------------------------------- goto $ end ; End of program

Circuito P1.16:

Page 64: Manual Practicas V1.4

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

58

Actividades P1.16

Implementar la práctica en el simulador y ver cuales registros son modificados para la

configuración y operación de la práctica, por último implemente el sistema en físico.

Page 65: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

59

Unidad II PROGRAMACIÓN DE MICROCONTROLADORES CON

ELEMENTOS DE LENGUAJE C

Práctica 2.1 Encendido de leds y configuraciones básicas.

Descripción P2.1:

El propósito de esta práctica es encender varios diodos LED en el puerto B del microcontrolador.

Utilice este ejemplo para examinar cómo es un programa real en lenguaje C. La siguiente figura

muestra el esquema de conexión eléctrico.

Circuito P2.1:

Al encender la fuente de alimentación, los diodos LED en el puerto B emiten luz y se apagan

contantemente (11 veces), luego encienden de forma intercalada (efecto serie navideña), lo que

indica que el microcontrolador está conectado correctamente y que funciona normalmente.

En este ejemplo se muestra cómo escribir una cabecera correctamente. Lo mismo se aplica a

todos los programas descritos en esta sección. Para no repetir, en los siguientes ejemplos no

vamos a escribir la cabecera. Se considera estar en el principio de cada programa, marcada como

"Cabecera".

Código P2.1: /* * Este es el Header * Nombre del programa : p2_1.c * Grupo: IMEC81N * Descripcion: Programa simple para demostrar el funcionamiento de un uC encendiendo y apagando leds conectados al puerto B. * Configuracion:

Page 66: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

60

* Microcontroladores: PIC16F887 * Kit de desarrollo: sistema mínimo * Oscilador: HS, 8.0 MHz * Notas: Construir el sistema mínimo en un protoboard */ int k; void main() { //Aquí inicia el programa ANSEL = 0; ANSELH = 0; TRISB = 0; PORTB = 0XFF; delay_ms(1000); PORTB = 0; for(k=1; k<20; k++) { switch(PORTB) { //Revisamos el estado del puerto case 0x00: //Si está apagado PORTB = 0xFF; //Encendemos los leds delay_ms(400); break; case 0XFF://Si está encendido PORTB = 0x00; //Apagamos los leds delay_ms(600); } } PORTB = 0b01010101; //Encendemos los leds de forma intercalada while(1) { PORTB = ~PORTB; //Se invierte el estado del puerto, efecto serie navideña delay_ms(200); } }

Práctica 2.2 Oscilador interno y mezcla de lenguaje ensamblador y C

Descripción P2.2:

En realidad, esto es una continuación del ejemplo anterior, pero se ocupa de un problema un poco

más complicado. El propósito es hacer que los LEDs en el puerto B parpadeen más lentamente. Se

puede realizar al introducir un valor suficientemente grande para el parámetro del tiempo de

retardo en la función “Delay”. No obstante, hay otra manera más eficiente para ejecutar el

programa lentamente. Es importante recordar que este microcontrolador tiene un oscilador

incorporado LFINTOSC que funciona a una frecuencia de 31kHz. Ahora llegó la hora de “darle una

oportunidad”.

El programa se inicia con el bucle do-while y se queda allí por 20 ciclos. Después de cada iteración,

llega el tiempo de retardo de 100ms, indicado por un parpadeo relativamente rápido de los LED en

el puerto B. Cuando el programa salga de este bucle, el microcontrolador se inicia al utilizar el

oscilador LFINTOSC como una fuente de señal de reloj. Los LEDs parpadean más lentamente

Page 67: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

61

aunque el programa ejecuta el mismo bucle do-while con un tiempo de retardo 10 veces más

corto.

Con el propósito de hacer evidentes algunas situaciones potencialmente peligrosas, se activan los

bits de control por medio de las instrucciones en ensamblador. Dicho de manera sencilla, al entrar

o salir una instrucción en ensamblador en el programa, el compilador no almacena los datos en un

banco actualmente activo de la RAM, lo que significa que en esta sección de programa, la

selección de bancos depende del registro SFR utilizado. Al volver a la sección de programa escrito

en C, los bits de control RP0 y RP1 deben recuperar el estado que tenían antes de “la aventura en

ensamblador”. En este programa, el problema se resuelve utilizando la variable auxiliar saveBank,

lo que guarda el estado de estos dos bits.

Circuito P2.2:

Código P2.2: /* ***Header *********************************************/ int k = 0; char saveBank; void main() { ANSEL = 0; // Todos los pines I/O configurados como digitales ANSELH = 0; //Analog select register/high register TRISB = 0; // Todo el Puerto B se configura como salida PORTB = 0; // Todo el Puerto B se inicializa en 0 do { PORTB = ~PORTB; // Se invierte el estado lógico del puerto B Delay_ms(100); // Retardo de 100ms k++; // Se incrementa el contador k } while(k<20); // Se repite el ciclo mientras k<20

Page 68: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

62

k=0; // Se reinicia la variable k saveBank = STATUS & 0b01100000; // Se guarda el estado de RP0 y RP1 (bits 5 y 6 del registro status) únicamente asm { // Se inicia secuencia en ensamblador bsf STATUS,RP0 // Se selecciona el banco de memoria que contiene el registro OSCCON bcf STATUS,RP1 bcf OSCCON,6 // Se selecciona el oscilador interno LFINTOSC bcf OSCCON,5 // de 31KHz de frecuencia bcf OSCCON,4 bsf OSCCON,0 // El microcontrolador usa el oscilador interno } // Fin de la secuencia en ensamblador STATUS &= 0b10011111; // Los bits RP0 y RP1 regresan a su estado original STATUS |= saveBank; do { PORTB = ~PORTB; // Invierte el estado lógico del puerto Delay_ms(10); // Retardo de 10 ms k++; // Se incrementa k } while(k<20); // Se repite mientras que k<20 }

Práctica 2.3 Temporizador TMR0 como contador, variables y relevadores

Descripción P2.3:

En cuanto a los ejemplos anteriores, el microcontrolador ha ejecutado el programa sin haber sido

afectado de ninguna forma por su entorno. En la práctica, hay pocos dispositivos que funcionen de

esta manera (por ejemplo, un simple controlador de luz de neón). Los pines de entrada se utilizan

también en este ejemplo. El temporizador Timer0 se utiliza como un contador. La entrada del

contador está conectada a un botón externo, así que cada vez que se presiona el botón, el

temporizador Timer0 cuenta un pulso.

Cuando el número de pulsos coincida con el número almacenado en el registro TEST, un 1 lógico

(5V) aparecerá en el pin PORTD.3. Este voltaje activa un relé electromecánico, y por eso este bit se

le denomina “RELÉ” en el programa.

Circuito P2.3:

Page 69: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

63

Código P2.3: /*Header******************************************************/ void main() { char TEST = 5; // Constante TEST = 5 enum outputs {RELAY = 3}; // Constante RELAY = 3 ANSEL = 0; // Todos los pines I/O configurados como digitales ANSELH = 0; TRISA = 0xFF; // Se configuran los pines del puerto A como entradas TRISD = 0b11110111; //El Pin RD3 se configura como salida, mientras que el resto como entradas PORTD = 0; // Se inicializa el puerto D OPTION_REG.F5 = 1; // El contador TMR0 recibe pulsos a través del pin RA4 OPTION_REG.F3 = 1; //El prescaler se establece a razón 1:1 TMR0 = 0; // Se reinicia el timer/contador TMR0 do { if (TMR0 == TEST) // Es igual el número del timer con la constante TEST? (PORTD.RELAY = 1); // Si es así. Activa la salida del Relay } while (1); // Ciclo infinito }

Sólo una constante de enumeración RELÉ se utiliza en este ejemplo. Se le asigna un valor mediante

la declaración.

enum salidas {RELÉ = 3}; // Constante RELÉ = 3

Si varios pines del puerto PORTD están conectados a los relés, la expresión anterior se puede

escribir de la siguiente manera también:

enum salidas {RELÉ=3, CALENTADOR, MOTOR=6, SURTIDOR};

A todas las constantes, precedidas por las constantes con valores asignados (RELÉ=3 y MOTOR=6),

se les asignan automáticamente los valores de las constantes precedentes, incrementados en 1. En

este ejemplo, a las constantes CALENTADOR y SURTIDOR se les asignan los valores 4 y 7, es decir

(CALENTADOR=4 y SURTIDOR=7), respectivamente.

Práctica 2.4 Temporizadores TMR0, TMR1 y TMR2 e interrupciones

Descripción P2.4:

Al analizar los ejemplos anteriores, es importante notar la desventaja de proporcionar tiempo de

retardo por medio de la función “delay”. En estos casos, el microcontrolador se queda “estático” y

no hace nada. Simplemente espera que transcurra una cierta cantidad de tiempo. Tal pérdida de

tiempo es un lujo inaceptable, por lo que se deberá aplicar otro método.

Al igual que en las prácticas 1.4 y 1.8, en este ejemplo se utilizarán los temporizadores y las

interrupciones. El esquema se queda inalterado, y el desafío sigue siendo presente. Es necesario

Page 70: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

64

proporcionar un tiempo de retardo suficiente largo para darse cuenta de los cambios en el puerto.

Para este propósito se utiliza el temporizador Timer0 con el pre-escalador asignado. Siempre que

se genere una interrupción con cada desbordamiento en el registro del temporizador, la variable

cnt se aumenta automáticamente en 1 al ejecutarse cada rutina de interrupción. Cuando la

variable llega al valor 400, el puerto PORTB se incrementa en 1. Todo el procedimiento se lleva a

cabo “entre bastidores”, lo que habilita al microcontrolador para hacer otra tarea.

Circuito P2.4:

Código P2.4:

/*Cabecera******************************************************/ unsigned cnt; // Definir la variable cnt void interrupt() { cnt++; // Con una interrupción la cnt se incrementa en 1 TMR0 = 96; // El valor inicial se devuelve en el temporizador TMR0 INTCON = 0x20; // Bit T0IE se pone a 1, el bit T0IF se pone a 0 } void main(){ OPTION_REG = 0x84; // Pre-escalador se le asigna al temporizador TMR0 ANSEL = 0; // Todos los pines de E/S se configuran como digitales ANSELH = 0; TRISB = 0; // Todos los pines de puerto PORTB se configuran como salidas PORTB = 0x0; // Reiniciar el puerto PORTB TMR0 = 96; // Temporizador T0 cuenta de 96 a 255 INTCON = 0xA0; // Habilitada interrupción TMR0 cnt = 0; // A la variable cnt se le asigna un 0 do { // Bucle infinito if (cnt == 400) { // Incrementar el puerto PORTB después 400 interrupciones

Page 71: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

65

PORTB = PORTB++; // Incrementar número en el puerto PORTB en 1 cnt = 0; // Reiniciar la variable cnt } } while(1); }

Siempre que se produzca un desbordamiento en el registro del temporizador TRM0, ocurre una

interrupción.

/*Cabecera******************************************************/ unsigned short cnt; // Definir la variable cnt void interrupt() { cnt++ ; // Con una interrupción la cnt se incrementa en 1 PIR1.TMR1IF = 0; // Reiniciar el bit TMR1IF TMR1H = 0x80; // El valor inicial se devuelve en los registros TMR1L = 0x00; // del temporizador TMR1H y TMR1L } void main() { ANSEL = 0; // Todos los pines de E/S se configuran como digitales ANSELH = 0; TRISB = 0; // Pines del puerto PORTB se configuran como salidas PORTB = 0xF0; // Valor inicial de los bits del puerto PORTB T1CON = 1; // Configurar el temporizador TMR1 PIR1.TMR1IF = 0; // Reiniciar el bit TMR1IF TMR1H = 0x80; // Ajustar el valor inicial del temporizador TMR1 TMR1L = 0x00; PIE1.TMR1IE = 1; // Habilitar la interrupción al producirse un desbordamiento cnt = 0; // Reiniciar la variable cnt INTCON = 0xC0; // Interrupción habilitada (bits GIE y PEIE) do { // Bucle infinito if (cnt == 76) { // Cambiar el estado del puerto PORTB después de 76 interrupciones PORTB = ~PORTB; // Número en el puerto PORTB está invertido cnt = 0; // Reiniciar la variable cnt } } while (1); }

Page 72: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

66

En este caso, una interrupción se habilita después de que se produce un desbordamiento en el

registro del temporizador TMR1 (TMR1H, TMR1L). Además, la combinación de los bits que varía en

el puerto POTRB difiere del ejemplo anterior.

/*Cabecera******************************************************/ unsigned short cnt; // Definir la variable cnt void Reemplazar() { PORTB = ~PORTB; // Definir nueva función “Reemplazar” } // Función invierte el estado del puerto void interrupt() { if (PIR1.TMR2IF) { // Si el bit TMR2IF = 1, cnt++ ; // Incrementar variable la cnt en 1 PIR1.TMR2IF = 0; // Reiniciar el bit y TMR2 = 0; // Reiniciar el registro TMR2 } } void main() { // main cnt = 0; // Reiniciar la variable cnt ANSEL = 0; // Todos los pines de E/S se configuran como digitales ANSELH = 0; TRISB = 0; // Todos los pines del puerto PORTB se configuran como salidas PORTB = 0b10101010; // Estado lógico en los pines del puerto PORTB T2CON = 0xFF; // Configurar el temporizador T2 TMR2 = 0; // Valor inicial del registro del temporizador TMR2 PIE1.TMR2IE = 1; // Interrupción habilitada INTCON = 0xC0; // Bits GIE y PEIE se ponen a 1 while (1) { // Bucle infinito if (cnt > 30) { // Cambiar el estado del puerto PORTB después de más de 30 interrupciones Reemplazar(); // Función Reemplazar invierte el estado del puerto PORTB cnt = 0; // Reiniciar la variable cnt } } }

En este ejemplo, una interrupción ocurre después de que se produce un desbordamiento en el

registro del temporizador TMR2. Para invertir el estado lógico de los pines del puerto se utiliza la

función Reemplazar.

Page 73: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

67

Práctica 2.5 Uso del “watchdog timer” (perro guardián)

Descripción P2.5:

Este ejemplo muestra cómo NO se debe utilizar el temporizador perro-guardián. Un comando

utilizado para reiniciar este temporizador se omite a propósito en el bucle del programa principal,

lo que habilita al temporizador perro guardián “ganar la batalla del tiempo” y reiniciar al

microcontrolador. Por consiguiente, el microcontrolador se va a reiniciar sin parar, lo que indicará

el parpadeo de los LED del puerto B.

Circuito P2.5:

Código P2.5: /*Cabecera******************************************************/ void main() { OPTION_REG = 0x0E; // Pre-escalador se le asigna al temporizador WDT (1:64) asm CLRWDT; // Comando en ensamblador para reiniciar el temporizador WDT TRISB = 0; // Todos los pines del puerto PORTB se configuran como salidas PORTB = 0x0F; // Valor inicial del registro PORTB Delay_ms(300); // Tiempo de retardo de 30mS PORTB = 0xF0; // Valor del puerto PORTB diferente del inicial while (1); // Bucle infinito. El programa se queda aquí hasta que el temporizador WDT reinicie al microcontrolador }

Para que este ejemplo funcione apropiadamente, es necesario habilitar al temporizador perro-

guardián al seleccionar la opción Tools/mE Programmer/Watchdog Timer - Enabled.

Page 74: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

68

Práctica 2.6 Modulo CCP 1 como generador de señales tipo PWM

Descripción P2.6:

Este ejemplo muestra el uso del módulo CCP1 en modo PWM. Para hacer las cosas más

interesantes, la duración de los pulsos en la salida P1A (PORTC,2) se puede cambiar por medio de

los botones de presión simbólicamente denominados “OSCURO” y “CLARO”. La duración ajustada

se visualiza como una combinación binaria en el puerto PORTB. El funcionamiento de este módulo

está bajo el control de las funciones pertenecientes a la librería especializada PWM. Aquí se

utilizan las tres de ellas:

1. PWM1_init tiene el prototipo: void Pwm1_Init(long freq);

El parámetro freq ajusta la frecuencia de la señal PWM expresada en hercios. En este

ejemplo equivale a 5kHz.

2. PWM1_Start tiene el prototipo: void Pwm1_Start(void);

3. PWM1_Set_Duty tiene el prototipo: void Pwm1_Set_Duty(unsigned short duty_ratio);

El parámetro duty_ratio ajusta la duración de pulsos en una secuencia de pulsos.

La librería PWM también contiene la función PWM_Stop utilizada para deshabilitar este modo. Su

prototipo es: void Pwm1_Stop(void);

Circuito P2.6:

Page 75: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

69

Código P2.6: /*Cabecera******************************************************/ // Definir las variables ciclo_de_trabajo_actual, // ciclo_de trabajo_anterior unsigned short ciclo_de_trabajo_actual; unsigned short ciclo_de trabajo_anterior; void initMain() { ANSEL = 0; // Todos los pines de E/S se configuran como digitales ANSELH = 0; TRISA = 255; // Todos los pines del puerto PORTA se configuran como entradas PORTA = 255; // Estado inicial del puerto PORTA TRISB = 0; // Todos los pines del puerto PORTB se configuran como salidas PORTB = 0; // Estado inicial del puerto PORTB TRISC = 0; // Todos los pines del puerto PORTC se configuran como salidas PORTC = 0; // Estado inicial del puerto PORTC PWM1_Init(5000); // Inicialización del módulo PWM (5KHz) } void main() { initMain(); ciclo_de_trabajo_actual = 16; // Valor inicial de la variable ciclo_de_trabajo_actual ciclo_de trabajo_anterior = 0; // Reiniciar la variable ciclo_de trabajo_anterior PWM1_Start(); // Iniciar el módulo PWM1 while (1) { // Bucle infinito if (Button(&PORTA, 0,1,1)) // Si se presiona el botón conectado al RA0 ciclo_de_trabajo_actual++ ; // incrementar el valor de la variable current_duty if (Button(&PORTA, 1,1,1)) // Si se presiona el botón conectado al RA1 ciclo_de_trabajo_actual-- ; // decrementar el valor de la variable current_duty if (old_duty != ciclo_de_trabajo_actual) { // Si ciclo_de_trabajo_actual y ciclo_de trabajo_anterior no son iguales PWM1_Set_Duty(ciclo_de_trabajo_actual); // ajustar un nuevo valor a PWM, ciclo_de trabajo_anterior = ciclo_de_trabajo_actual; // Guardar el nuevo valor PORTB = ciclo_de trabajo_anterior; // y visualizarlo en el puerto PORTB } delay_ms(200); // Tiempo de retardo de 200mS } }

Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes librerías en la

ventana Library Manager antes de compilar el programa:

PWM

Button

Práctica 2.7 Uso del convertidor analógico-digital (ADC)

Descripción P2.7:

El convertidor A/D del microcontrolador PIC16F887 se utiliza en este ejemplo. ¿Hace falta decir

que todo es pan comido? Una señal analógica variable se aplica al pin AN2, mientras que el

resultado de la conversión de 10 bits se muestra en los puertos PORTB y PORTD (8 bits menos

significativos en el puerto PORTD y 2 bits más significativos en el puerto PORTB). La Tierra (GND)

Page 76: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

70

se utiliza como voltaje de referencia bajo Vref-, mientras que el voltaje de referencia alto se aplica

al pin AN3. Esto habilita que la escala de medición se estire y encoja.

En otras palabras, el convertidor A/D siempre genera un resultado binario de 10 bits, lo que

significa que reconoce 1024 niveles de voltaje en total (210=1024). La diferencia entre dos niveles

de voltaje no es siempre la misma. Cuanto menor sea la diferencia entre Vref+ y Vref-, tanto

menor será la diferencia entre dos de los 1024 niveles. Como hemos visto, el convertidor A/D es

capaz de detectar pequeños cambios de voltaje (investigue cual es el mínimo).

Circuito P2.7:

Código P2.7: /*Cabecera******************************************************/ unsigned int temp_res; void main() { ANSEL = 0x0C; // Pines AN2 y AN3 se configuran como analógicos TRISA = 0xFF; // Todos los pines del puerto PORTA se configuran como entradas ANSELH = 0; // Los demás pines se configuran como digitales TRISB = 0x3F; // Pines del puerto PORTB, RB7 y RB6 se configuran como salidas TRISD = 0; // Todos los pines del PORTD se configuran como salidas ADCON1.F4 = 1 ; // Voltaje de referencia es llevado al pin RA3. do { temp_res = ADC_Read(2); // Resultado de la conversión A/D es copiado a temp_res PORTD = temp_res; // 8 bits menos significativos se mueven al puerto PORTD PORTB = temp_res >> 2; // 2 bits más significativos se mueven a los bits RB6 y RB7 } while(1); // Bucle infinito }

Page 77: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

71

Para que este ejemplo funcione apropiadamente, es necesario marcar la librería ADC en la

ventana Library Manager antes de compilar el programa:

ADC

Práctica 2.8 Uso de la memoria EEPROM

Descripción P2.8:

Este ejemplo muestra cómo escribir y leer la memoria EEPROM incorporada. El programa funciona

de la siguiente manera. El bucle principal lee constantemente el contenido de localidad de la

memoria EEPROM en la dirección 5 (decimal). Luego el programa entra en el bucle infinito en el

que el puerto PORTB se incrementa y se comprueba el estado de entradas del puerto PORTA.2. En

el momento de presionar el botón denominado MEMO, un número almacenado en el puerto

PORTB será guardado en la memoria EEPROM, directamente leído y visualizado en el puerto

PORTD en forma binaria.

Circuito P2.8:

Page 78: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

72

Código P2.8: /*Cabecera******************************************************/ void main() { ANSEL = 0; // Todos los pines de E/S se configuran como digitales ANSELH = 0; TRISB = 0; // Todos los pines del puerto PORTB se configuran como salidas PORTB = 0; // Valor inicial del puerto PORTB TRISD = 0; // Todos los pines del puerto PORTD se configuran como salidas PORTD = 0; // Valor inicial del puerto PORTD TRISA = 0xFF; // Todos los pines del puerto PORTA se configuran como entradas PORTD = EEPROM_Read(5); // Leer la memoria EEPROM en la dirección 5 do { PORTB = PORTB++; // Incrementar el puerto PORTB en 1 Delay_ms(100); // Tiempo de retardo de 100mS if (PORTA.F2) EEPROM_Write(5,PORTB); // Si se pulsa el botón MEMO, guardar el puerto PORTB PORTD = EEPROM_Read(5); // Leer el dato escrito do { while (PORTA.F2); // Quedarse en este bucle hasta que el botón esté pulsado } } while(1); // Bucle infinito }

Para comprobar el funcionamiento de este circuito, basta con pulsar el botón MEMO y apagar el

dispositivo. Después de reiniciar el dispositivo, el programa visualizará el valor guardado en el

puerto PORTD. Acuérdese de que en el momento de escribir, el valor fue visualizado en el puerto

PORTB.

Para que este ejemplo funcione apropiadamente, es necesario marcar la librería EEPROM en la

ventana Library Manager antes de compilar el programa:

EEPROM

Práctica 2.9 Contador de dos dígitos multiplexado

Descripción P2.9:

En este ejemplo el microcontrolador funciona como un contador de dos dígitos. La variable i se

incrementa (suficientemente lenta para ser visible) y su valor se visualiza en un display de dos

dígitos LED (99-0). El punto es habilitar una conversión de un número binario en uno decimal y

partirlo en dos dígitos (en decenas y unidades). Como los segmentos del visualizador LED se

conectan en paralelo, es necesario asegurar que alternen rápidamente para tener una impresión

de que emiten la luz simultáneamente (multiplexión por división en tiempo).

En este ejemplo, el temporizador TMR0 está encargado de la multiplexión por división en tiempo,

mientras que la función mask convierte un número binario a formato decimal.

Page 79: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

73

Circuito P2.9:

Código P2.9: /*Cabecera******************************************************/ unsigned short mask(unsigned short num); unsigned short digit_no, digit10, digit1, digit, i; void interrupt() { if (digit_no == 0) { PORTA = 0; // Apagar ambos visualizadores PORTD = digit1; // Colocar máscara para visualizar unidades en el puerto PORTD PORTA = 1; // Encender el visualizador para las unidades (LSD) digit_no = 1; }else{ PORTA = 0; // Apagar ambos visualizadores PORTD = digit10; // Colocar máscara para visualizar decenas en el puerto PORTD PORTA = 2; // Encender el visualizador para las decenas (MSD) digit_no = 0; } TMR0 = 0; // Reiniciar el contador TMRO INTCON = 0x20; // Bit T0IF=0, T0IE=1 } void main() { OPTION_REG = 0x80; // Ajustar el temporizador TMR0 TMR0 = 0; INTCON = 0xA0; // Deshabilitar las interrupciones PEIE,INTE,RBIE,T0IE PORTA = 0; // Apagar ambos visualizadores TRISA = 0; // Todos los pines del puerto PORTA se configuran como salidas PORTD = 0; // Apagar todos los segmentos del visualizador TRISD = 0; // Todos los pines del puerto PORTD se configuran como salidas do { for (i = 0; i<=99; i++) { // Contar de 0 a 99 digit = i % 10u; digit1 = mask(digit); // Preparar la máscara para visualizar unidades digit = (char)(i / 10u) % 10u; digit10 = mask(digit); // Preparar la máscara para visualizar decenas delay_ms(1000); } } while (1); // Bucle infinito }

Page 80: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

74

Archivo : mask.c

/*Cabecera******************************************************/ unsigned short mask(unsigned short num) { switch (num) { case 0 : return 0x3F; //Aquí se guardan las combinaciones para que los números del 0 – 9 se muestren en los displays case 1 : return 0x06; case 2 : return 0x5B; case 3 : return 0x4F; case 4 : return 0x66; case 5 : return 0x6D; case 6 : return 0x7D; case 7 : return 0x07; case 8 : return 0x7F; case 9 : return 0x6F; } }

Para que este ejemplo funcione apropiadamente, es necesario incluir el archivo mask.c en el

proyecto (aparte del archivo example9.c) en la ventana Project Manager antes de compilar el

programa:

Example9.mcppi - Sources - Add File To Project

mask.c

example9.c

Práctica 2.10 Uso del display de cristal líquido (LCD)

Descripción P2.10:

Este ejemplo muestra cómo utilizar un visualizador LCD alfanumérico. Las librerías de funciones

simplifican este programa, lo que significa que al final el esfuerzo para crear el software vale la

pena.

Un mensaje escrito en dos líneas aparece en el visualizador:

UTCH Optativa I

Ejemplo LCD

Page 81: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

75

Dos segundos más tarde, el mensaje en la segunda línea cambia, y se visualiza el voltaje presente

en la entrada del convertidor A/D (el pin RA2). Por ejemplo:

UTCH Optativa I

voltage:3.141V

En un dispositivo real se puede visualizar temperatura actual o algún otro valor medido en vez de

voltaje.

Circuito P2.10:

Código P2.10:

/*Cabecera*****************************************************/ sbit LCD_RS at RB4_bit; // Conexiones del módulo LCD sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; // Final de las conexiones del módulo LCD unsigned char ch; // Declarar variables unsigned int adc_rd; char *text; long tlong; void main() { INTCON = 0; // Todas las interrupciones deshabilitadas ANSEL = 0x04; // Pin RA2 se configura como una entrada analógica TRISA = 0x04; ANSELH = 0; // Los demás pines se configuran como digitales Lcd_Init(); // Inicialización del visualizador LCD Lcd_Cmd(_LCD_CURSOR_OFF); // Comando LCD (apagar el cursor)

Page 82: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

76

Lcd_Cmd(_LCD_CLEAR); // Comando LCD (borrar el LCD) text = "UTCH Optativa I"; // Definir el primer mensaje Lcd_Out(1,1,text); // Escribir el primer mensaje en la primera línea text = "Ejemplo LCD"; // Definir el segundo mensaje Lcd_Out(2,1,text); // Escribir el segundo mensaje en la segunda línea ADCON1 = 0x82; // Voltaje de referencia para la conversión A/D es VCC TRISA = 0xFF; // Todos los pines del puerto PORTA se configuran como entradas delay_ms(2000); text = "voltaje:"; // Definir el tercer mensaje while (1) { adc_rd = ADC_Read(2); // Conversión A/D. Pin RA2 es una entrada. Lcd_Out(2,1,text); // Escribir el resultado en la segunda línea tlong = (long)adc_rd * 5000; // Convertir el resultado en milivoltios tlong = tlong / 1023; // 0..1023 -> 0-5000mV ch = tlong / 1000; // Extraer voltios (miles de milivoltios) del resultado Lcd_Chr(2,9,48+ch); // Escribir resultado en formato ASCII Lcd_Chr_CP('.'); ch = (tlong / 100) % 10; // Extraer centenas de milivoltios Lcd_Chr_CP(48+ch); // Escribir resultado en formato ASCII ch = (tlong / 10) % 10; // Extraer decenas de milivoltios Lcd_Chr_CP(48+ch); // Escribir resultado en formato ASCII ch = tlong % 10; // Extraer unidades de milivoltios Lcd_Chr_CP(48+ch); // Escribir resultado en formato ASCII Lcd_Chr_CP('V'); delay_ms(1); } }

Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes librerías en la

ventana Library Manager antes de compilar el programa:

ADC

LCD

Práctica 2.11 Comunicación serial RS232

Descripción P2.11:

Este ejemplo muestra cómo utilizar el módulo USART del microcontrolador. La conexión a una PC

se habilita por medio del estándar de comunicación RS-232. El programa funciona de la siguiente

manera. Cada byte recibido por medio de la comunicación serial se visualiza al utilizar los LED

conectados al puerto B y después se devuelve automáticamente al transmisor. Si ocurre un error

en recepción, se lo indicará al encender el diodo LED. La manera más fácil es comprobar el

funcionamiento del dispositivo en la práctica utilizando un programa estándar de Windows

denominado Hyper Terminal.

Page 83: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

77

Circuito P2.11:

Código P2.11:

/*Cabecera******************************************************/ unsigned short i; void main() { UART1_Init(19200); // Inicializar el módulo USART (8 bits, tasa de baudios 19200, no hay bit de paridad) while (1) { if (UART1_Data_Ready()) { // si se ha recibido un dato i = UART1_Read(); // leerlo UART1_Write(i); // enviarlo atrás } } }

Para que este ejemplo funcione apropiadamente, es necesario marcar la librería UART en la

ventana Library Manager antes de compilar el programa:

UART

Page 84: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

78

Práctica 2.12 Generación de sonidos utilizando una librería

Descripción P2.12:

Las señales de audio se utilizan con frecuencia cuando se necesita llamar la atención del usuario,

confirmar que alguno de los botones se ha pulsado, avisar que se ha llegado hasta los valores

mínimos o máximos, etc. Pueden ser una simple señal de pitido así como melodías de una

duración más larga o más corta. En este ejemplo se muestra la generación de sonido por medio de

funciones que pertenecen a la librería Sound.

Además de estas funciones, la función Button que pertenece a la misma librería se utiliza para

probar los botones de presión.

Circuito P2.12:

Código P2.12: /*Cabecera******************************************************/ void Tone1() { Sound_Play(659, 250); // Frecuencia = 659Hz, duración = 250ms } void Tone2() { Sound_Play(698, 250); // Frecuencia = 698Hz, duración = 250ms } void Tone3() { Sound_Play(784, 250); // Frecuencia = 784Hz, duración = 250ms } void Melody1() { // Componer una melodía divertida 1 Tone1(); Tone2(); Tone3(); Tone3(); Tone1(); Tone2(); Tone3(); Tone3(); Tone1(); Tone2(); Tone3();

Page 85: Manual Practicas V1.4

UNIDAD II PROGRAMACIÓN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

79

Tone1(); Tone2(); Tone3(); Tone3(); Tone1(); Tone2(); Tone3(); Tone3(); Tone3(); Tone2(); Tone2(); Tone1(); } void ToneA() { // Tono A Sound_Play( 880, 50); } void ToneC() { // Tono C Sound_Play(1046, 50); } void ToneE() { // Tono E Sound_Play(1318, 50); } void Melody2() { // Componer una melodía divertida 2 unsigned short i; for (i = 9; i > 0; i--) { ToneA(); ToneC(); ToneE(); } } void main() { ANSEL = 0; // Todos los pines de E/S son digitales ANSELH = 0; TRISB = 0xF0; // Pines RB7-RB4 se configuran como entradas Sound_Init(&PORTB, 3); // RB3 se configura como salida Sound_Play(1000, 500); while (1) { if (Button(&PORTB,7,1,1)) // RB7 genera Tono1 Tone1(); while (PORTB & 0x80) ; // Esperar que se suelte el botón if (Button(&PORTB,6,1,1)) // RB6 genera Tono2 Tone2(); while (PORTB & 0x40) ; // Esperar que se suelte el botón if (Button(&PORTB,5,1,1)) // RB5 genera melodía 2 Melody2(); while (PORTB & 0x20) ; // Esperar que se suelte el botón if (Button(&PORTB,4,1,1)) // RB4 genera melodía 1 Melody1(); while (PORTB & 0x10) ; // Esperar que se suelte el botón } }

Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes librerías en la

ventana Library Manager antes de compilar el programa:

Button

Sound

Page 86: Manual Practicas V1.4

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMÁTICOS

80

Unidad III CONTROL Y MONITOREO DE SISTEMAS AUTOMÁTICOS

Práctica 3.1 Control de un motor de DC mediante un puente H

Descripción P3.1:

Control de la velocidad y dirección de un motor de DC. El control es por medio de un puente H

construido con transistores tipo MOSFET y sus drivers respectivos.

El control del motor debe de ser remoto y local.

Control local por medio de 7 botones:

Ir en la dirección de las manecillas del reloj (ClockWise, CW)

Ir en la dirección contraria a las manecillas del reloj (Counter ClockWise , CCW)

Aumentar velocidad (límite máximo 100%)

Disminuir velocidad (límite mínimo 0%)

Arrancar motor , CW, velocidad 50%

Detener motor de manera inmediata.

Detener motor suavemente (descenso gradual).

Control remoto por medio del puerto series (protocolo RS232), por medio de las siguientes

secuencias de bytes:

ATINT, arrancar motor

ATSTx , detener motor, donde si x=0 detener suavemente, x=1 detener inmediatamente.

ATDCW, dirección del motor CW

ATDCC, dirección del motor CCW

ATSxyz, La velocidad se fija al xyz%, donde xyz es un número en el rango del 000 al 100.

Circuito P3.1:

[Dibuje aquí el circuito esquemático. El circuito debe de estar completo]

Page 87: Manual Practicas V1.4

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMÁTICOS

81

Transistor: IRF640 o Transistor MOSFET canal N o equivalente.

Driver: 4011 CMOS Quad NAND Gate IC, alimentado con +12 V DC.

4049 CMOS Hex Inverting Buffer IC.

NOTA: Los transistores MOSFET canal N se activa con un voltaje positivo en la terminal de “Gate”.

Código P3.1:

[Escriba aquí el código que implemento]

Práctica 3.2 Control de un motor de pasos

Descripción P3.2:

Control del movimiento, la dirección y el número de pasos a avanzar de un motor de pasos.

El control del motor debe de ser remoto y local.

Control local por medio de 5 botones:

Ir en la dirección de las manecillas del reloj (ClockWise, CW) continuamente.

Ir en la dirección contraria a las manecillas del reloj (Counter ClockWise , CCW)

continuamente.

Avanzar un paso CW

Avanzar un paso CCW

Detener motor, solo si esta en modo continuo.

Control remoto por medio del puerto series (protocolo RS232), por medio de las siguientes

secuencias de bytes:

ATCMx, modo continuo, donde si x=0 avanzar CW, x=1 avanzad CCW.

ATSTP, detener motor.

ATMxyz, El motor se mueve en la dirección (x=0 CW, x=1 CCW) un número de pasos yz,

donde yz es un número en el rango de 0-99.

Page 88: Manual Practicas V1.4

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMÁTICOS

82

Circuito P3.2:

[Dibuje aquí el circuito esquemático. El circuito debe de estar completo]

Step wire 1 wire 2

1 low high

2 high high

3 high low

4 low low

Page 89: Manual Practicas V1.4

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMÁTICOS

83

Step wire 1 wire 2 wire 3 wire 4

1 High low high low

2 low high high low

3 low high low high

4 high low low high

Código P3.2:

[Escriba aquí el código que implemento]

Prácticas 3.3 Control de un servo motor

Descripción P3.3:

Control del movimiento de un servo motor.

El control del motor debe de ser remoto y local.

Control local por medio de 3 botones:

Movimiento en dirección de las manecillas del reloj (ClockWise, CW), el servo motor debe

de avanzar solo un grado, o la mínima resolución posible.

Movimiento en dirección contraria a las manecillas del reloj (Counter ClockWise , CCW), el

servo motor debe de avanzar solo un grado, o la mínima resolución posible.

Volver a la posición central o neutral. NOTA: Suponer que el movimiento del servo motor

está limitado a 180 grados, 90 grados en sentido positivo y 90 grados en sentido negativo.

NOTA: Verificar esto, cada servo es diferente el servo que utilice puede estar limitado a

solo 120 grados, entonces se tendrían 60 grados en cada sentido.

Control remoto por medio del puerto series (protocolo RS232), por medio de las siguientes

secuencias de bytes:

ATSIP, el servo motor regresa a su posición central o neutral.

ATMxyz, El motor se mueve en la dirección (x=0 CW, x=1 CCW) un numero de grados yz,

donde yz es un numero en el rango de 0-90 (0-60 según sea el caso).

El siguiente diagrama de tiempos de una señal tipo PWM para el control de un servo motor es solo

ilustrativa. Las señales de control de los servos motores no siguen un estándar verdadero. Lo único

Page 90: Manual Practicas V1.4

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMÁTICOS

84

estandarizado es que el circuito de control del servo motor espera recibir un pulso cada 20 ms

(periodo). La duración del pulso debe de ser entre 0.7 ms y 2.0 ms. Si la duración del pulso está

entre 0.7 y 1.0 ms el servo se moverá hacia la derecha (CW). Si la duración del pulso está entre 1.7

y 2.0 ms el servo se moverá hacia la izquierda (CCW). Si la duración del pulso está entre 1.3 y 1.5

ms el servo se moverá a su posición central o neutral.

Para más información consultar: http://www.ermicro.com/blog/?p=771

Circuito P3.3:

[Dibuje aquí el circuito esquemático. El circuito debe de estar completo]

Código P3.3:

[Escriba aquí el código que implemento]

Page 91: Manual Practicas V1.4

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMÁTICOS

85

Práctica 3.4 Control de temperatura tipo ON/OFF

Descripción P3.4:

Control de temperatura tipo ON/OFF con histéresis de una caja.

La temperatura baja (TLow) y la temperatura alta (THigh) podrán ser ajustadas mediante dos

botones cada una. Los botones harán las siguientes funciones:

Botón “TLow_Up” aumenta el valor de la temperatura baja.

Botón “TLow_Down” disminuye el valor de la temperatura baja.

Botón “THigh_Up” aumenta el valor de la temperatura alta.

Botón “THigh_Down” disminuye el valor de la temperatura alta.

Botón “On/Off” el control de temperatura se activa/desactiva

Se debe de usar un sensor de temperatura (sugerencia LM35) para realizar las mediciones, un foco

incandescente (pudiera ser una resistencia) como fuente de calor y un ventilador que sirva para

disminuir la temperatura de la caja.

El control debe comparar la temperatura medida en el interior de la caja, en caso de que la

temperatura sea mayor THigh se debe encender el ventilador, este debe estar encendido hasta

que la temperatura sea menor a TLow, y así sucesivamente.

Circuito P3.4:

[Dibuje aquí el circuito esquemático. El circuito debe de estar completo]

Código P3.4:

[Escriba aquí el código implementado]

Práctica 3.5 Modulo remoto de medición y control. 3 sensores, 2

actuadores, comunicación mediante RS232, modo de control remoto

mediante PC, modo de control local mediante botones.

Descripción P3.5:

Se debe de realizar un circuito y programa que permita realizar la medición remota de 3 variables

o sensores (pueden ser cualquier tipo de sensores pero cada uno de diferente variable,

prepárense para justificar la selección de estos sensores). La medición de estos tres sensores

permitirá realizar el control de algún tipo de proceso (el proceso ustedes lo pueden idear, pero de

igual manera hay que preparar una justificación de este) mediante dos actuadores. Los actuadores

deben de ser de tipos diferentes, es decir, eléctricos, electroneumáticos, electrohidráulicos, o

electromecánicos.

El control de los dos actuadores puede realizarse de manera remota mediante la comunicación

con una PC utilizando el protocolo RS232, o localmente mediante el uso de botones.

Page 92: Manual Practicas V1.4

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMÁTICOS

86

Las mediciones de los sensores de deben de mostrar localmente utilizando un display tipo LCD o

display tipo 7 segmentos.

Circuito P3.5:

[Dibuje aquí el circuito esquemático. El circuito debe de estar completo]

Código P3.5:

[Escriba aquí el código que implemento]

Page 93: Manual Practicas V1.4

REPORTE Y EVALUACIÓN

87

Formato de reportes Todas las prácticas deben de ir acompañadas de un reporte. El reporte debe de entregarse escrito

a mano (diagramas y código fuente también). Cada reporte debe de contener los siguientes

componentes:

El reporte también lleva su contraparte electrónica. Esta es una carpeta comprimida, en formato

ZIP, que contenga las siguientes subcarpetas:

SourceCode, aquí va la carpeta del proyecto generado por la IDE y el compilador

utilizados.

Schematics, aquí van los diagramas esquemáticos de los circuitos realizados. Deben

de estar en formato PDF.

Este reporte deberá de ser subido a la sección del curso en la plataforma.

Page 94: Manual Practicas V1.4

REPORTE Y EVALUACIÓN

88

Criterios y ponderaciones de evaluación

Unidad I

Calificación = ((Calif. Examen) * (Prácticas_Realizadas /16) * 0.5) + ((Reportes_Revisados/16) * 0.5)

Unidad II

Calificación = ((Calif. Examen) * (Prácticas_Realizadas /12) * 0.5) + ((Reportes_Revisados/12) * 0.5)

Unidad III

Calificación = ((Calif. Examen) * (Prácticas_Realizadas /5) * 0.5) + ((Reportes_Revisados/5) * 0.5)