0% encontró este documento útil (0 votos)
2K vistas54 páginas

Microcontroladores

Microcontroladores

Cargado por

Croossver
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
2K vistas54 páginas

Microcontroladores

Microcontroladores

Cargado por

Croossver
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Contenido

Introducción................................................................................................. Error! Bookmark not defined.


2.1 Arquitectura de los puertos de E/S. .............................................................................................. 1
2.1 Configuración y características eléctricas de los puertos de E/S........................................ 9
2.3 Estructura de los programas para microcontrolador. ........................................................... 25
2.4 Programación de puertos con interfaces para el manejo de dispositivos periféricos
sin manejo de potencia. ........................................................................................................................ 31
2.4.1 Displays de 7 segmentos. ...................................................................................................... 32
2.4.2 Displays lcd. .............................................................................................................................. 36
2.4.3 Teclados (lineal y matricial). .................................................................................................. 40
2.5 Programación de puertos con interfaces de potencia con: ................................................. 45
2.5.1 Transistores. .............................................................................................................................. 45
2.5.2 Relevadores. .............................................................................................................................. 47
2.5.3 Optoacopladores. ..................................................................................................................... 48
2.5.4 Puentes h discretos e integrados. ....................................................................................... 49
2.6 Desarrollo de aplicaciones para el manejo de:........................................................................ 49
2.6.1 Lámparas. ................................................................................................................................... 49
2.6.2 Zumbadores, vibradores piezoeléctricos, bocinas, etc. ................................................ 49
2.6.3 Motores de cd. ........................................................................................................................... 49
2.6.4 Motores a pasos. ...................................................................................................................... 51
2.6.5 Servomotores. ........................................................................................................................... 52
Conclusión. .................................................................................................. Error! Bookmark not defined.
Bibliografía. .................................................................................................. Error! Bookmark not defined.
2.1 Arquitectura de los puertos de E/S.

Puertas de E/S Los microcontroladores PIC 16F87X encapsulados con 28 patas,


disponen de 3 puertas de E/S (A,B,C) mientras que los de 40 patas, alcanzan 5
(A,B,C,D,E).

PUERTA A
El puerto PORTA es un puerto bidireccional, de 8 bits de anchura. Los bits de los registros
TRISA y ANSEL controlan los pines del PORTA. Todos los pines del PORTA se
comportan como entradas/salidas digitales. Cinco de ellos pueden ser entradas
analógicas (denotadas por AN):

RA0 = AN0 (determinado por el bit ANS0 del registro ANSEL) RA1 = AN1 (determinado
por el bit ANS1 del registro ANSEL) RA2 = AN2 (determinado por el bit ANS2 del registro
ANSEL) RA3 = AN3 (determinado por el bit ANS3 del registro ANSEL) RA5 = AN4
(determinado por el bit ANS4 del registro ANSEL) Similar a que los bits del registro TRISA
determinan cuáles pines serán configurados como entradas y cuáles serán configurados
como salidas, los bits apropiados del registro ANSEL determinan si los pines serán
configurados como entradas analógicas o entradas/salidas digitales. Cada bit de este
puerto tiene una función adicional relacionada a algunas unidades periféricas integradas,
que vamos a describir en los siguientes capítulos. Este capítulo cubre sólo la función
adicional del pin RA0, puesto que está relacionado al puerto PORTA y a la unidad
ULPWU.
// El pin PORTA2 se configura como una entrada digital. Todos los demás pines del puerto
// PORTA son salidas digitales
...
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como digitales
PORTA = 0; // Todos los pines del puerto PORTA se ponen a cero
TRISA = 0b00000100; // Todos los pines del puerto PORTA excepto el

pág. 1
// PORTA2 se configuran como salidas
PUERTA B
El puerto PORTB es un puerto bidireccional, de 8 bits de anchura. Los bits del registro
TRISB determinan la función de sus pines.

Similar al puerto PORTA, un uno lógico (1) en el registro TRISB configura el pin apropiado
en el puerto PORTB y al revés. Los seis pines de este puerto se pueden comportar como
las entradas analógicas (AN). Los bits del registro ANSELH determinan si estos pines
serán configurados como entradas analógicas o entradas/salidas digitales: RB0 = AN12
(determinado por el bit ANS12 del registro ANSELH) RB1 = AN10 (determinado por el bit
ANS10 del registro ANSELH) RB2 = AN8 (determinado por el bit ANS8 del registro
ANSELH) RB3 = AN9 (determinado por el bit ANS9 del registro ANSELH) RB4 = AN11
(determinado por el bit ANS11del registro ANSELH) RB4 = AN11 (determinado por el bit
ANS11del registro ANSELH) Cada bit de este puerto tiene una función adicional
relacionada a algunas unidades periféricas integradas, que vamos a describir en los
siguientes capítulos. Este puerto dispone de varias características por las que se
distingue de otros puertos y por las que sus pines se utilizan con frecuencia:

 Todos los pines del puerto PORTB tienen las resistencias pull-up integradas, que
los hacen perfectos para que se conecten con los botones de presión (con el
teclado), interruptores y optoacopladores. Con el propósito de conectar las
resistencias a los puertos del microcontrolador, el bit apropiado del registro WPUB
debe estar a uno.*

pág. 2
Al tener un alto nivel de resistencia (varias decenas de kiloohmios), estas resistencias
"virtuales" no afectan a los pines configurados como salidas, sino que sirven de un
complemento útil a las entradas. Estas resistencias están conectados a las entradas de
los circuitos lógicos CMOS. De lo contrario, se comportarían como si fueran flotantes
gracias a su alta resistencia de entrada.

Además de los bits del registro WPUB, hay otro bit que afecta a la instalación de las
resistencias pull-up. Es el bit RBPU del registro OPTION_REG.
 Al estar habilitado, cada bit del puerto PORTB configurado como una entrada
puede causar una interrupción al cambiar su estado lógico. Con el propósito de
habilitar que los terminales causen una interrupción, el bit apropiado del registro
IOCB debe estar a uno.

pág. 3
Gracias a estas características, los pines del puerto PORTB se utilizan con frecuencia
para comprobar los botones de presión en el teclado ya que detectan cada apretón de
botón infaliblemente. Por eso, no es necesario examinar todas las entradas una y otra
vez.

Cuando los pines X,Y y Z se configuran como entradas de puesta a uno (1), sólo se
necesita esperar una petición de interrupción que aparece al apretar un botón. Más tarde,
se comprueba cuál botón fue activado al combinar ceros y unos en las entradas.
Pin RB0/INT.
El pin RB0/INT es la única fuente “verdadera” de la interrupción externa. Se puede
configurar de manera que reaccione al borde ascendente de señal (transición de cero a
uno) o al borde descendente de señal (transición de uno a cero). El bit INTEDG del
registro OPTION_REG selecciona la señal apropiada.

pág. 4
PINES RB6 Y RB7.
El PIC16F887 no dispone de ningún pin especial para la programación (el proceso de
escribir un programa en la ROM). Los pines que generalmente están disponibles como
los pines de E/S de propósito general, se utilizan para este propósito. Para decir con más
precisión, son los pines del puerto PORTB utilizados para la transmisión de señal de reloj
(RB6) y de datos (RB7) al cargar el programa. Además, es necesario suministrar el voltaje
de alimentación Vdd (5V) así como el voltaje apropiado Vpp (12-14V) para la
programación de memoria FLASH. Durante la programación, el voltaje Vpp se aplica al
pin MCLR. No se preocupe de los detalles relacionados a este proceso, tampoco se
preocupe de cuál voltaje se aplica primero puesto que los componentes del programador
se encargan de eso.
Lo que es muy importante es que el programa se puede cargar al microcontrolador aún
después de haber sido soldado en el dispositivo destino. Por supuesto, el programa
cargado se puede cambiar de la misma manera. Esta función se le denomina ICSP (In-
Circuit Serial Programming - Programación serial en circuito) Para utilizarlo
correctamente es necesario planificar con antelación. ¡Es pan comido! Sólo es necesario
instalar un conector miniatura de 5 pines en el dispositivo destino para suministrar al
microcontrolador un voltaje de programación necesario. Para evitar la interferencia entre
los voltajes y los componentes del dispositivo conectados a los pines del
microcontrolador, todos los periféricos adicionales deben estar desconectados durante la
programación (utilizando las resistencias o los puentes).

Como hemos visto, los voltajes aplicados a los pines del zócalo del programador son los
mismos que los utilizados durante la programación ICSP.
/* El pin PORTB.1 se configura como entrada digital. Se produce una interrupción con cualquier cambio de su
estado lógico. También tiene una resistencia pull-up. Todos los demás pines del puerto PORTB son entradas
digitales. */
...
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como digitales
PORTB = 0; // Todos los pines del puerto PORTB se ponen a cero
TRISB = 0b00000010; // Todos los pines del puerto PORTB excepto PORTB.1
// se configuran como salidas
RBPU = 0; // Se habilitan las resistencias pull-up
WPUB1 = 1; // La resistencia pull-up se conecta al pin PORTB.1
IOCB1 = 1; // El pin PORTB.1 puede causar una interrupción por el
// cambio del estado lógico
RBIE = GIE = 1; // Se habilita una interrupción

pág. 5
PUERTA C
El puerto PORTC es un puerto bidireccional, de 8 bits de anchura. Los bits del registro
TRISC determinan la función de sus pines. Similar a otros puertos, un uno lógico (1) en
el registro TRISC configura el pin apropiado del puerto PORTC como entrada.

Todas las funciones adicionales del puerto PORTC se describen en los siguientes
capítulos.

PUERTA D
El puerto PORTD es un puerto bidireccional de 8 bits de anchura. Los bits del registro
TRISD determinan la función de sus pines. Similar a otros puertos, un uno lógico (1) en
el registro TRISD configura el pin apropiado del puerto PORTD como entrada.

pág. 6
PUERTA E
El puerto PORTE es un puerto bidireccional, de 4 bits de anchura. Los bits del registro
TRISE determinan la función de sus pines. Similar a otros puertos, un uno lógico (1) en
el registro TRISE configura el pin apropiado del puerto PORTE como entrada.

La excepción es el pin RE3, que siempre está configurado como entrada. Similar a los
puertos PORTA y PORTB, en este caso los tres pines se pueden configurar como
entradas analógicas. Los bits del registro ANSEL determinan si estos pines serán
configurados como entradas analógicas (AN) o entradas/salidas digitales: RE0 = AN5
(determinado por el bit ANS5 del registro ANSEL); RE1 = AN6 (determinado por el bit
ANS6 del registro ANSEL); y RE2 = AN7 (determinado por el bit ANS7 del registro
ANSEL).
/* El pin PORTE.0 se configura como una entrada analógica mientras que los demás tres pines del mismo puerto
se configuran como digitales */
...
ANSEL = 0b00100000; // El pin PORTE.0 se configura como analógico
ANSELH = 0; // Todos los pines de E/S se configuran como digitales
TRISE = 0b00000001; // Todos los pines del puerto PORTE excepto el
// PORTE.0 se configuran como salidas
PORTE = 0; // Todos los bits del puerto PORTE se ponen a cero
...

Registros ANSEL y ANSELH.

Los registros ANSEL y ANSELH se utilizan para configurar el modo de entrada de un pin
de E/S como analógico o como digital.

pág. 7
La regla es la siguiente: Para configurar un pin como una entrada analógica, el bit
apropiado de los registros ANSEL o ANSELH se debe poner a uno (1). Para configurar
un pin como una entrada/salida digital, el bit apropiado se debe poner a cero (0). El estado
lógico de los bits del registro ANSEL no tiene influencia en las funciones de salidas
digitales. Al intentar a leer un pin de puerto configurado como una entrada analógica, el
resultado es siempre 0.

pág. 8
2.1 Configuración y características eléctricas de los puertos de E/S.

Puertos De Entrada/Salida.
• Mediante ellos, el micro PIC puede monitorizar y controlar otros dispositivos.
• Para añadir flexibilidad al micro, muchos de sus pines de entrada/salida están
multiplexados con funciones alternativas.
• Para la mayoría de los puertos, la dirección del pin I/O es controlada por el
registro de dirección de datos, llamado TRIS. TRISX<n> controla la dirección
del pin n del puerto X.
• Un 1 en el registro TRIS indica que el pin es entrada. Un 0 indica que es salida.

Estructura típica de un puerto de entrada/salida de propósito general.

El valor de RESET de los registros TRIS suele ser un ‘1’, de forma que por defecto los
pines estén configurados como entradas evitando posibles cortocircuitos en la
alimentación que podrían dañar el micro o el resto del sistema.
El registro PORT funciona como un latch para los datos de salida. Cuando el registro
PORT se lee (Ej, MOVF PORTB,W), el micro lee los niveles presentes en los pines de
I/O (no en los latches).
Cuando una función está multiplexada en un pin de I/O de proposito general, la
funcionalidad de un pin puede cambiar para acomodarse a los requisitos del módulo
periférico. Por ejemplo, si un micro tiene un conversor A/D, los pines asociados a este
módulo están configurados en un RESET como entradas analógicas para evitar un
consumo de corriente excesivo en el buffer de dicho pin si este estuviera configurado
como entrada digital y el valor de tensión en el pin estuviera a un nivel intermedio.

pág. 9
Puertos De Entrada/Salida – Características Eléctricas.

Los Microcontroladores PIC tienen terminales de entrada/salida (I/O, Input/Output)


divididos en puertos, que se encuentras nombrados alfabéticamente A, B, C, D, etc. Cada
puerto puede tener hasta 8 terminales que se pueden comportar como una I/O digital. El
PIC16F887 tiene hasta 35 I/O digitales de propósito general, y en dependencia de la
configuración de sus periféricos pueden estar disponibles como I/O de propósito general.
Por ejemplo, si utilizamos el módulo USART (Transmisión Serial) los pines
correspondientes a este periférico serán utilizados para atender las operaciones del
mismo y no podrán ser utilizados como I/O de propósito general.
Configuración De Los Puertos.
Los puertos pueden ser configurados como entradas o como salidas, es decir, dependen
del programador si un pin servirá como entrada o como salida y en qué momento ocurrirá
esto. Para realizar esto es necesario modificar el valor de los registros TRISx.
Por ejemplo:
TRISA=%00000000 'Todos los pines de PORTA son salidas
TRISB=%11111111 'Todos los pines de PORTB son entradas
TRISC=%00001111 'Los pines de PORTC 0 al 3 son entradas y los pines 4 al 7 son salidas
TRISD.3=0 'El pin 3 de PORTD se configura como salida sin afectar los demas pines.
TRISD.5=1 'El pin 5 de PORTD se configura como entrada sin afectar los demas pines.

Una forma fácil de recordar como configurar un pin como entrada o como salida es que
el 1 se parece a la "I" de Input y el "0" se parece a la "O" de output, así todos los bits de
los registros TRIS que tengan 1 serán entradas y los bits que tengan 0 serán salidas.

pág. 10
Muchas veces deseamos configurar una gran cantidad de pines sin modificar el resto
para ello se utilizan las operaciones bit a bit (and, or, xor), tambien llamadas operaciones
mascara.
TRISD=TRISD or %00001111 'Los pines PORTC<0..3> se configuran como entradas sin modificar los demas
pines.

TRISD=TRISD and %10100110 'Los pines PORTD<0,3,4,6> se configruan como entradas sin modificar el resto.

Lectura De Los Puertos.


Cuando configuramos un puerto o un pin como entrada podemos leerlo utilizando los
registros PORTx, esto no significa que no podemos leer un puerto si lo configuramos
como salida y deseamos saber su último valor para realizar modificaciones en
dependencia de este. Por ejemplo:
TRISA=%11111111 'Configuramos todos los PINES de PORTA como entrada

TRISB=%10101010 'Configuramos los pines PORTB<0,2,4,6> como salida el resto como entrada.

VAR1=PORTA 'El valor de PORTA se almacenará en la variable VAR1

VAR2=PORTB 'El valor de PORTB, incluyendo los pines de salida, se almacenan en la variable VAR2

Escritura De Puertos.
Cuando configuramos un puerto o pin como salida podemos escribirlo utilizando los
registros PORTx, pero si algún pin del puerto no fue configurado como salida no se
producirá ningún cambio al momento de escribirlo. Por ejemplo:
TRISA=%00000000 'Configuramos todos los pines de PORTA como salida
TRISB=%01010101 'Configuramos los pines PORTB<1,3,5,7> como salida el resto como entrada.
...
PORTA=%11110000 'A PORTA se le asignara el valor $11110000
PORTB=%11111111 'Solo los pines PORTB<1,3,5,7> sufriran cambio

Los microcontroladores cuentan con una serie de pines destinados a entrada y salida de
datos o señales digitales. A estos pines se les denomina “Puerto”.

pág. 11
RA0/AN0/ULPWU/C12IN0-

Este pin es configurable para funcionar como uno:


• Una E / S de propósito general
• Una entrada analógica para el ADC
• Una entrada analógica negativa al Comparador C1 o C2
• Una entrada analógica para el despertador de ultra baja potencia

RA1/AN1/C12IN1-

Este pin es configurable para funcionar como:


• Una E / S de propósito general
• Una entrada analógica para el ADC
• Una entrada analógica negativa al Comparador
C1 o C2

pág. 12
RA2/AN2/VREF-/CVREF/C2IN+

Este pin es configurable para funcionar como:


• Una E / S de propósito general
• Una entrada analógica para el ADC
• Una entrada de referencia de voltaje negativo
para el ADC y CVREF
• Una salida de referencia de voltaje del
comparador
• Una entrada analógica positiva al
Comparador C2

RA3/AN3/VREF+/C1IN+
Este pin es configurable para
funcionar como:
• Una entrada de propósito general
• Una entrada analógica para el ADC
• Una entrada de referencia de voltaje
positivo para el ADC y CVREF
• Una entrada analógica positiva al
Comparador C1

pág. 13
RA4/T0CKI/C1OUT

Este pin es configurable para funcionar


como:
• Una E / S de propósito general
• Una entrada de reloj para Timer0
• Una salida digital del Comparador C1

RA5/AN4/SS/C2OUT

Este pin es configurable para funcionar


como:
• Una E / S de propósito general
• Una entrada analógica para el ADC
• Una entrada de selección esclava
• Una salida digital del comparador C2

pág. 14
RA6/OSC2/CLKOUT
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una conexión de cristal / resonador
• Una salida de reloj

RA7/OSC1/CLKIN
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una conexión de cristal / resonador
• Una entrada de reloj

pág. 15
RB0/AN12/INT
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una entrada analógica para el ADC
• Una interrupción activada por un borde
externo

RB1/AN10/P1C(1)/C12IN3-
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una entrada analógica para el ADC
• Una salida PWM (1)
• Una entrada analógica al comparador C1 o
C2

RB2/AN8/P1B(1)
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una entrada analógica para el ADC
• Una salida PWM (1)

RB3/AN9/PGM/C12IN2-
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una entrada analógica para el ADC
• Habilitación de programación en serie en
circuito de bajo voltaje alfiler
• Una entrada analógica al comparador C1 o
C2

El siguiente diagrama engloba a todos los


anteriores:

pág. 16
RB4/AN11/P1D(1)
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una entrada analógica para el ADC
• Una salida PWM (1)

RB5/AN13/T1G
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una entrada analógica para el ADC
• Una entrada de puerta Timer1

RB6/ICSPCLK
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Reloj de programación en serie en circuito

RB7/ICSPDAT
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Datos de programación en serie en circuito

El siguiente diagrama engloba a todos los anteriores:

pág. 17
pág. 18
RC0/T1OSO/T1CKI
Este pin es configurable para funcionar
como:
• Una E / S de propósito general
• Una salida de oscilador Timer1
• Una entrada de reloj Timer1

RC1/T1OSI/CCP2
Este pin es configurable para funcionar
como:
• Una E / S de propósito general
• Una entrada de oscilador Timer1
• Una entrada de captura y una salida de
comparación / PWM para Comparador C2

pág. 19
RC2/P1A/CCP1
Este pin es configurable para funcionar
como:
• Una E / S de propósito general
• Una salida PWM
• Una entrada de captura y salida de
comparación para Comparador C1

RC3/SCK/SCL
Este pin es configurable para funcionar
como:
• Una E / S de propósito general
• Un reloj SPI
• Un reloj I2C ™

pág. 20
RC4/SDI/SDA
Este pin es configurable para
funcionar como:
• Una E / S de propósito general
• Una E / S de datos SPI
• Una E / S de datos I2C

RC5/SDO
Este pin es configurable para
funcionar como:
• Una E / S de propósito general
• Una salida de datos en serie

pág. 21
RC6/TX/CK
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una salida en serie asíncrona
• Un reloj síncrono de E / S

RC7/RX/DT
Este pin es configurable para funcionar
como:
• Una E / S de propósito general
• Una entrada serial asíncrona
• Una E / S de datos en serie síncrona

pág. 22
RD<4:0>
Los pines están configurados para funcionar
como un propósito general E / S.

RD5/P1B(1)
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una salida PWM

RD6/P1C(1)
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una salida PWM

RD7/P1D(1)
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una salida PWM

El siguiente diagrama engloba a todos los anteriores:

pág. 23
RE0/AN5(1)
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una entrada analógica para el ADC

RE1/AN6(1)
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una entrada analógica para el ADC

RE2/AN7(1)
Este pin es configurable para funcionar como:
• Una E / S de propósito general
• Una entrada analógica para el ADC

El siguiente diagrama engloba a todos los anteriores:

pág. 24
RE3/MCLR/VPP
Este pin es configurable para funcionar como:
• Una entrada de propósito general
• Master Clear Reset con pull-up débil

2.3 Estructura de los programas para microcontrolador.

Lenguaje De Programación.
El microcontrolador ejecuta el programa cargado en la memoria Flash. Esto se denomina
el código ejecutable y está compuesto por una serie de ceros y unos, aparentemente sin
significado. Dependiendo de la arquitectura del microcontrolador, el código binario está
compuesto por palabras de 12, 14 o 16 bits de anchura. Cada palabra se interpreta por
la CPU como una instrucción a ser ejecutada durante el funcionamiento del
microcontrolador. Todas las instrucciones que el microcontrolador puede reconocer y
ejecutar se les denominan colectivamente Conjunto de instrucciones. Como es más fácil
trabajar con el sistema de numeración hexadecimal, el código ejecutable se representa
con frecuencia como una serie de los números hexadecimales denominada código Hex.
En los microcontroladores PIC con las palabras de programa de 14 bits de anchura, el
conjunto de instrucciones tiene 35 instrucciones diferentes.

pág. 25
Lenguaje Ensamblador.
Como el proceso de escribir un código ejecutable era considerablemente arduo, en
consecuencia, fue creado el primer lenguaje de programación denominado ensamblador
(ASM). Siguiendo la sintaxis básica del ensamblador, era más fácil escribir y comprender
el código. Las instrucciones en ensamblador consisten en las abreviaturas con significado
y a cada instrucción corresponde una localidad de memoria. Un programa denominado
ensamblador compila (traduce) las instrucciones del lenguaje ensamblador a código
máquina (código binario).

Este programa compila instrucción a instrucción sin optimización. Como permite controlar
en detalle todos los procesos puestos en marcha dentro del chip, este lenguaje de
programación todavía sigue siendo popular.
Ventajas de lenguajes de programación de alto nivel
A pesar de todos los lados buenos, el lenguaje ensamblador tiene algunas desventajas:

pág. 26
 Incluso una sola operación en el programa escrito en ensamblador consiste en
muchas instrucciones, haciéndolo muy largo y difícil de manejar.
 Cada tipo de microcontrolador tiene su propio conjunto de instrucciones que un
programador tiene que conocer para escribir un programa
 Un programador tiene que conocer el hardware del microcontrolador para escribir
un programa
Programa escrito en C (El mismo programa compilado al código ensamblador):

Los lenguajes de programación de alto nivel (Basic, Pascal, C etc.) fueron creados con
el propósito de superar las desventajas del ensamblador. En lenguajes de programación
de alto nivel varias instrucciones en ensamblador se sustituyen por una sentencia. El
programador ya no tiene que conocer el conjunto de instrucciones o características del
hardware del microcontrolador utilizado. Ya no es posible conocer exactamente cómo se
ejecuta cada sentencia, de todas formas ya no importa.

pág. 27
Aunque siempre se puede insertar en el programa una secuencia escrita en ensamblador.
Si alguna vez ha escrito un programa para un microcontrolador PIC en lenguaje
ensamblador, probablemente sepa que la arquitectura RISC carece de algunas
instrucciones. Por ejemplo, no hay instrucción apropiada para multiplicar dos números.
Por supuesto, para cada problema hay una solución y éste no es una excepción gracias
a la aritmética que permite realizar las operaciones complejas al descomponerlas en un
gran número operaciones más simples. En este caso, la multiplicación se puede sustituir
con facilidad por adición sucesiva (a x b = a + a + a + ... + a). Ya estamos en el comienzo
de una historia muy larga... No hay que preocuparse al utilizar uno de estos lenguajes de
programación de alto nivel como es C, porque el compilador encontrará automáticamente
la solución a este problema y otros similares. Para multiplicar los números a y b, basta
con escribir a*b.

Estructura De Un Programa En Ensamblador Para PIC.


list p=16f877a
#include <[Link]>

El primer renglón define que PIC se usara, el segundo renglón es una librería que
contiene los nombres de los registros especiales del pic, tales como PORTA, PORTB,
STATUS, TRISA etc. Para podernos referir a éstos por sus nombres en lugar de su
posición de memoria, facilitándonos la edición del programa.
CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

Este renglón CONFIG se llama PALABRA DE CONFIGURACION, y está formada por


diferentes FUSIBLES. Estos FUSIBLES nos sirven para dar órdenes al programador de
cómo debe configurar el PIC para su correcto funcionamiento. A continuación, veamos
para la función de cada FUSIBLE.

CP Código de Protección de programa, si lo habilitamos (ON) evita que


otras personas puedan leer el programa contenido en el PIC.
Generalmente lo pondremos a OFF.

WDT Watch Dog Timer, o Temporizador Perro Guardián. Este


temporizador resetea el PIC cada determinado tiempo para evitar
enciclamientos por error en el programa. Preferentemente hay que
apagarlo (OFF).
BODEN Bit de Permiso para el Reseteo por Caída de Tensión.

PWRTE Bit de Permiso para el Timer de conexión de alimentación. Se usa


para resetear el PIC cada vez que se conecta la fuente de
alimentación de nuestra aplicación.

pág. 28
OSC Define que tipo de oscilador se usara. RC es para Capacitor y
resistencia, XT es para cristal de 4Mhz, HS para cristales mayores
a 4Mhz.
WRT Permiso para escritura en Modo FLASH. Se usa cuando en nuestro
programa accedemos a la memoria de datos EEPROM.

LVP Voltaje de programación bajo. Si esta en ON permite programar el


PIC con 5V, si esta en OFF programa el PIC con 14V, debemos
ponerlo a OFF.
CPD Código de Protección de Datos. Se usa para evitar que terceros
lean lo que
hemos escrito en la memoria EEPROM del PIC.

CBLOCK 0X20

ENDC
Los registros o variables que se usaran se declaran entre estos dos renglones, el 0X20
indica que usaremos los espacios disponibles para registros a partir de la posición 0x20
de la memoria.
ORG 0
goto inicio
ORG 5
La línea ORG 0 (Origen 0) es el VECTOR DE RESET, lo cual quiere decir que siempre
que se resetee, o se encienda el PIC, el programa se comenzara a ejecutar a partir de
esta posición. El goto inicio y debajo el ORG 5 nos indica que hemos saltado el ORG 4
que es el vector de interrupciones, este vector ORG 4 no se usara por el momento.

A partir de aquí comenzamos con el programa. Como siempre, lo primero es configurar


los puertos de entrada y salida:
Inicio
bsf STATUS,RP0 ;RP0 1 bcf
STATUS,RP1 ;RP1 0
Estas dos líneas nos indican que nos movemos al banco 1 que es el banco para
configurar los puertos de entrada y salida.

movlw b’00000111’ ;W b’00000111’ movwf ADCON1 ;


ADCON1 W
En estas dos líneas estamos mandando a ADCON1 el número 00000111 para configurar
todas las entradas analógicas del PIC como digitales. Nota, la b en b’00000111’ indica
que el numero dentro de las comillas es un numero binario.

movlw b’11111111’ ;W b’00000111’ movwf TRISA ; TRISA W

pág. 29
En estos dos renglones estamos mandando el numero binario 11111111 al registro
TRISA. El registro TRISA configura los pines del PORTA como entrada o salida. Si a un
bit del TRISA le mandamos un 1 entonces el mismo bit pero del PORTA será ENTRADA,
si a un bit del TRISA le mandamos un 0 entonces el mismo bit pero del PORTA será
SALIDA. En este caso todos los bits de TRISA les hemos mandado 1’s, asi que todos los
pines del PORTA serán ENTRADAS.
clrf TRISB ;
TRISB b’00000000’

En este renglón estamos limpiando el TRISB, es decir, le estamos mandando puros 0’s.
Lo cual quiere decir que estamos volviendo todos los pines del PORTB como SALIDAS.
bcf STATUS,RP0 ;RP0 0

bcf STATUS,RP1 ;RP1 0

En estos dos renglones estamos mandando un 0 al RP0 y 0 al RP1 para posicionarnos


en el Banco 0, que es el banco de trabajo, pues hemos terminado de configurar los
puertos en el Banco 1.
Ya configurados los puertos como digitales y configurado cuales son entradas y salidas
comenzamos con nuestro programa principal:
Inicio_principal
btfss PORTA,0 ; PORTA,0 = 1 ?
goto apagar ; NO, entonces Ir a apagar
bsf PORTB,0 ; SI, entonces PORTB,0 1
goto inicio_principal ; Ir a inicio_principal
apagar
Bcf PORTB,0 ; PORTB,0 0
goto inicio_principal ;Ir a inicio_principal

END ; FIN DEL PROGRAMA PARA EL COMPILADOR

pág. 30
Esquema De Un Programa En Ensamblador.
list p=16f877a
#include <[Link]>

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF &
_CPD_OFF

CBLOCK 0X20
ENDC INICIO

ORG 0 goto inicio


ORG 5

Inicio
bsf STATUS,RP0 ; Banco 1 para cofig. Puertos.
bcf STATUS,RP1 ;
movlw b’00000111’ ; Configuramos movwf ADCON1 ; todos Configurar FUSES
los pines como Digitales movlw b’11111111’ ; Configuramos movwf
TRISA ; PORTA como entradas clrf TRISB ;
Configuramos PORTB como salidas
bcf STATUS,RP0 ; Regresamos al Banco 0 bcf
STATUS,RP1 ;

Configurar Puertos
Inicio_principal
btfss PORTA,0 ; PORTA,0 = 1 ?
goto apagar ; NO, entonces Ir a apagar
bsf PORTB,0 ; SI, entonces PORTB,0 1 Programa Principal
goto inicio_principal ; Ir a inicio_principal apagar
Bcf PORTB,0 ; PORTB,0 0
goto inicio_principal ;Ir a inicio_principal

END

END ; FIN DEL PROGRAMA PARA EL COMPILADOR

2.4 Programación de puertos con interfaces para el manejo de


dispositivos periféricos sin manejo de potencia.

Cuando un microcontrolador controla un sistema, debe recibir información de entrada,


responder a ésta y producir señales de salida para realizar determinada acción de control.
Por ejemplo, los sensores envían al microcontrolador señales de entrada que contienen
datos que se deben guardar; por otra parte, el microprocesador envía señales de salida
a dispositivos externos tales como relevadores y motores.

pág. 31
El término dispositivo periférico, o periférico designa un dispositivo, que puede ser un
sensor, un teclado, un actuador, etc., el cual se conecta con un microcontrolador. Por lo
general, no es posible conectar en forma directa un dispositivo periférico a un
microcontrolador por la falta de compatibilidad en la forma y nivel de sus señales; para
lograr la compatibilidad necesaria se recurre a un circuito, que se conoce como interfaz,
que permite el acoplamiento entre los dispositivos periféricos y el microcontrolador.
La manera más sencilla de conectar un dispositivo periférico es considerando a este
como una ubicación de memoria. Lo anterior se conoce como sistema de mapeado de
memoria, en el cual los puertos de entrada/salida funcionan como si fueran parte de la
memoria, asignando a cada puerto una o varias direcciones.

2.4.1 Displays de 7 segmentos.

El display led de 7 segmentos es un componente electrónico que me permite


visualizar un valor numérico para una determinada aplicación. Cuando se quiere
mostrar datos en el display, existen dos opciones para hacerlo, una utilizar un
decodificador BCD a 7 segmentos después del microcontrolador, y otra es generar
con el mismo microcontrolador el código 7 segmentos equivalente a cada número
de 0 a 9.

Para que el microcontrolador maneje el display de 7 segmentos es necesario hacer


la siguiente conexión (Para un display 7 segmentos de cátodo común). La misma
conexión puede hacerse para un display led 7 segmentos de ánodo común, la
diferencia es que el común va a positivo y en la tabla de abajo intercambiar 1 por
0 y 0 por 1.

En el siguiente diagrama se muestra como conectar un display de 7 segmentos a


un PIC 16F877a o 16F887, pero que sirve como base para conectar un display 7
segmentos en cualquier microcontrolador PIC del mercado.

pág. 32
Para lograr este objetivo se necesita entender el manejo de estructuras en C, que
funcionan como una tabla donde el programa puede consultar el contenido de cada
posición. Lógicamente en cada posición se encuentra el código 7 segmentos de
cada número de 0 a 9.

Display 7 Segmentos Hexadecimal.


A continuación, te dejo la tabla del Display 7 Segmentos Hexadecimal para Cátodo
y Ánodo común:

pág. 33
Para Cátodo Común adicionar el siguiente arreglo:
Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};

Para Ánodo Común adicionar el siguiente arreglo:


Byte CONST display[10]=
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};

El número 10 indica la cantidad de posiciones de la estructura, los códigos 7


segmentos están en hexadecimal.

Antirebote Pic O Anti-Rebote Con Pic.


Cuando se trabaja con pulsadores o suiches o elementos mecánicos parecidos,
en el momento en que estos cambian de estado se genera una señal conocida
como REBOTE como la que se muestra en la figura:

pág. 34
Es decir, el suiche o pulsador genera unos y ceros (ruido) hasta que finalmente se
estabiliza.

El microcontrolador con su velocidad de trabajo (la cual es muy rápida) se da


cuenta de estas variaciones provocadas por los dispositivos electromecánicos y
puede pensar, por ejemplo, que el pulsador fue presionado varias veces, cuando
en realidad no fue así.
Para evitar errores en la detección de pulsadores y suiches al momento de
programar los microcontroladores PIC, se utiliza un código conocido como el
ANTIREBOTE PIC.
El antirebote pic es simplemente la utilización de retardos de 150 a 200ms
aproximadamente, en el momento en que se detecta que un pulsador o suiche
cambió de estado. Este tiempo es suficiente para que se estabilice la señal
proveniente del sistema mecánico para posteriormente preguntar por el estado del
suiche o pulsador.

Como Usar Display Led 7 Segmentos Y El Antirebote Con PIC.


Temporizador con PIC usando CCS C Compiler.
Realizar un temporizador con PIC de 0 a 9 utilizando un display de 7 segmentos
que incremente cada segundo.

pág. 35
El código de implementación del temporizador PIC usando la instrucción de
retardo o delay se muestra a continuación:
#INCLUDE <16F887.H>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP

BYTE CONST DISPLAY[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};


#BYTE PORTB=6
INT TEMPORIZADOR;

MAIN()
{
SET_TRIS_B(0B00000000); //Configura el puerto B
WHILE(TRUE) // Haga por siempre
{
TEMPORIZADOR = 0; // Inicializa temporizador en cero
WHILE(TEMPORIZADOR <10) // Mientras contador < 10
{
PORTB= DISPLAY[TEMPORIZADOR ]; // Muestre el valor en el display
TEMPORIZADOR ++; //Incrementa TEMPORIZADOR
DELAY_MS(1000); // Retardo de 1 segundo
}
}
}

2.4.2 Displays lcd.

Existe en el compilador un driver para manejar un display de cristal líquido (LCD)


de 2 líneas por 16 caracteres cada una.
El procedimiento para trabajar con el LCD 16×2 con PIC es parecido al
procedimiento del teclado telefónico. La conexión entre el LCD y el
microcontrolador es la siguiente:

pág. 36
Los pasos que se deben seguir para manejar el LCD son:
1. Incluir en el encabezado del programa el driver para manejar el teclado.
#INCLUDE<LCD.C>

2. Por defecto el LCD se conecta al puerto D, si se desea conectar el LCD en el


puerto B se incluye esta línea en el encabezado:
#DEFINE USE_PORTB_LCD TRUE

3. En el programa principal se inicializa el driver:


LCD_INIT();

4. Se usan las funciones del LCD que tiene implementadas el driver:


LCD_PUTC(c);// Muestra el caracter “C” en la próxima posición del LCD.
LCD_PUTC("/f”);//Borra todo lo que haya en el display.
LCD_PUTC(“/n”);// Va al inicio de la segunda línea.
LCD_PUTC(“/b”); //Se mueve una posición hacia atrás.
LCD_GOTOXY(x,y); //Ubica el cursor en la posición indicada por “X” y ”Y”.
//La posición de la esquina superior izquierda es (1,1).
LCD_GETC(x,y); //Retorna el carácter ubicado en la posición X,Y del LCD.

Ejemplo 1.
Mostrar un mensaje fijo en el LCD que en la primera fila diga “Control” y en la
segunda “Automatico”.

#INCLUDE <16F887.H>
#USE DELAY(CRYSTAL=4000000)
#INCLUDE <LCD.C>
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP,WRT
#BYTE PORTD= 8

MAIN()
{
LCD_INIT(); //Inicializa el LCD
LCD_PUTC("\f"); //Borrar el contenido del LCD
WHILE(TRUE)
{
LCD_GOTOXY(5,1); //Se ubica En la columna 5 fila 1
LCD_PUTC("Control"); //Muestre el mensaje “Control”
LCD_GOTOXY(3,2); //Ubicarse en la columna 3 fila 2
LCD_PUTC("Automatico"); // Sacar el mensaje “Automatico”
} //Cierra while true
}

pág. 37
Ejemplo 2.
Mostrar el siguiente mensaje en el LCD “Control Automatico Educacion”, de
manera que el mensaje sea animado. Es decir que el mensaje se desplace de
derecha a izquierda, y que ademas se desplace por las dos filas del lcd 16×2.

#include <16f887.h>
#fuses XT, NOPROTECT, NOWRT, NOPUT, NOWDT, NOLVP, NOCPD //Órdenes para el programador
#use delay (CRYSTAL=4000000)
#include <lcd.c> // Librería para el manejo del lcd

const char mensaje[]= {"Control Automatico Educacion"};

///PROGRAMA
void main(void)
{
char y=1; //índice fíla
signed char x=16; //índice columnas (posiciones)
lcd_init(); //inicializa lcd

while(TRUE){ //bucle...
lcd_gotoxy(x,y) ; //ubica cursor para escribir mensaje
lcd_putc(mensaje ) ; //muestra por pantalla el mensaje
delay_ms(100);
x--; //incremento indice de columnas
if(x<-28)
{
//¿se ha mostrado mensaje entero en la primera fila?
x=16; //SI, índice columna x=-16, para que inicie el último caracter en la primera posición
y++; //incremento índice fila (mostrar texto en segunda columna)
if(y>2) //¿se ha mostrado mensaje por segunda fila?
y=1; //SI, restaurar índice de fila
}
lcd_putc("\f" ) ; //borra pantalla

} //...infinito

Ejemplo 3.
El LCD puede ser utilizado en conjunto con un teclado matricial,
compartiendo el mismo puerto, permitiendome dejar libres los demas
puertos para mi aplicación. Esto puede ser posible conectando tanto el
teclado matricial como el LCD en el puerto B como se muestra en el
esquema siguiente:

pág. 38
Mostrar en el LCD los números digitados por el teclado telefónico, hasta completar
16 números.
#INCLUDE <16F887.H>
#USE DELAY(CRYSTAL=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD //Por defecto el teclado se conecta al puerto D,
//como el microcontrolador que se esta usando
//no tiene puerto D se conecta al puerto B.*/
#INCLUDE <LCD.C>
#INCLUDE <KBD.C> //Incluir en el encabezado el driver para
//manejar el teclado telefónico:*/

#BYTE WPUB= 0X95 // declarar registro option


#BYTE OPTION_REG = 0X81
CHAR K;
INT DIR;
VOID MAIN()
{
OPTION_REG = 0; //en el MAIN desactivas el registro OPTION
WPUB= 0B11111111;// y seleccionas los pullups q vas a utilizar
LCD_INIT();
KBD_INIT(); //Inicializar el driver del teclado en el //programa
//principal
LCD_PUTC("\f");
WHILE(1)
{
DIR=0;
LCD_PUTC("\f");
while (DIR<17)
{
k=kbd_getc(); //Llamar la función del teclado y almacenar el
//valor digitado en una variable tipo carácter. Si

pág. 39
//no se oprime ninguna tecla el teclado
//retornara el carácter nulo.*/
WHILE( (k=='\0')) //si no se oprime ninguna tecla sigue llamando al teclado.
{
k=kbd_getc();
}
if( (k!='*')&&(k!='#'))
{
lcd_putc(k);
DIR++;
}
}
}
}

2.4.3 Teclados (lineal y matricial).

En el compilador hay un driver para manejar un teclado telefónico, que es de gran


utilidad en algunas aplicaciones donde el usuario necesita digitar un número.
Los pasos que se deben seguir para manejar un teclado telefónico son:
1. Incluir en el encabezado el driver para manejar el teclado telefónico:
#INCLUDE<KBD.C>
2. Por defecto el teclado se conecta al puerto D, como el microcontrolador que se
usa no tiene puerto D se conecta al puerto B y se debe añadir al encabezado
la siguiente línea:
#DEFINE USE_PORTB_KBD
3. En el programa principal habilitar las resistencias pullup del puerto B, con esto
simplemente se habilitan internamente unas resistencias del puerto B a +V.
PORT_B_PULLUPS(TRUE);
Para el microcontrolador PIC16F887 esta instrucción no funciona, entonces
debemos agregar en el encabezado del programa:
#BYTE WPUB= 0X95 // declarar registro option
#BYTE OPTION_REG = 0X81

Y en el main() principal declaramos las pull up que queremos habilitar con


WPUB y debemos deshabilitar el registro OPTION_REG.OPTION_REG = 0;
//en el MAIN desactivas el registro OPTION WPUB= 0B11111111;// y
seleccionas los pullups que vas a utilizar.

5. Inicializar el driver del teclado en el programa principal.


KBD_INIT()

6. Llamar la función del teclado y almacenar el valor digitado en una variable tipo
carácter. Si no se oprime ninguna tecla el teclado retorna el carácter nulo.
K=KBD_GETC(); // K debe ser una variable tipo caracter (char).

pág. 40
NOTA: Si se utiliza otro microcontrolador y se conecta el teclado telefónico al
puerto D se debe poner resistencias a +5V en RD1, RD2, RD3 y RD4.
Teclado Matricial 4x3
#INCLUDE <16F887.H>
#FUSES XT,NOPROTECT,NOBROWNOUT,PUT,NOLVP,WRT
#USE DELAY(CLOCK=4000000)
#DEFINE USE_PORTB_KBD
#INCLUDE <KBD.C>
No existe una libreria lista para usar el teclado matricial 4×4 en PIC C Compiler,
pero podemos modificar la libreria del teclado 4×3 para poder manejar este
dispositivo sin problemas. En el video 2 de esta entrada explico como puedes
modificar la libreria y como puedes usar el teclado 4×4. Puedes descargar la
libreria modificada y la debes almacenar en tu computador en el directorio
(C:\Program Files (x86)\PICC\Drivers)
Descargar Libreria: KBD4x4.c
1. Incluir en el encabezado el driver para manejar el teclado telefónico:
#INCLUDE<KBD4x4.C>
Ejemplo:
Leer un teclado matricial PIC 4×4 y mostrar los numeros digitados en un LCD,
adicionalmente se debe leer un sensor de temperatura y también mostrarla en el
LCD, debes hacer que el PIC no se quede pegado unicamente leyendo el teclado,
si no que continue leyendo la temperatura y mostrandola independientemente si el
usuario digita o no el teclado telefonico 4×4.

pág. 41
#INCLUDE <16F887.H>
#device adc=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD //Por defecto el teclado se conecta al puerto D,
//como el microcontrolador que se esta usando
//no tiene puerto D se conecta al puerto B.*/
#INCLUDE <LCD.C>
#INCLUDE <KBD4x4.C> //Incluir en el encabezado el driver para
//manejar el teclado telefónico MODIFICADO
#use standard_io(b)
#define KEYHIT_DELAY 200 //Tiempo de espera del teclado en milisegundos
#byte PORTB= 6
#byte PORTC= 7
#BYTE PORTA= 5
#BYTE PORTD= 8
long bits; //Variable almacena los bits
float tem; //Almacena la temperatura
INT DIR;
/*========================================================================
===*/
/*======================= FUNCION TECLA =======================*/
/*========================================================================
===*/

pág. 42
//Funcion encargada de esperar a que se presione una tecla
char tecla(void)
{
char c;
do{ //espera hasta que se presione una tecla
c=kbd_getc(); //Captura valor del teclado
}
while(c=='\0');
return(c);
}

/*========================================================================
===*/
/*======================= FUNCION TECLA CON TIMER =======================*/
/*========================================================================
===*/
// Pregunta por una Tecla por un tiempo, si no hay actividad, deja de preguntar
// y deja que el PIC continue con su trabajo

char tecla_time(void) {
char c='\0';
unsigned int16 timeout;
timeout=0;
c=kbd_getc(); //Captura valor del teclado
while(c=='\0' && (++timeout< (KEYHIT_DELAY*100)))
{
delay_us(10);
c=kbd_getc(); //Captura valor del teclado
}
return(c);
}

/*========================================================================
===*/
/*======================= PROGRAMA PRINCIPAL =======================*/
/*========================================================================
===*/

VOID MAIN()
{
CHAR K;

port_b_pullups (0xFF); //Utiliza las resistencias PULL UP internas del puerto B

set_tris_a(0b00000001); //Pongo el RA0 como entrada


SET_TRIS_B(0);
SET_TRIS_C(0); //Puerto C como Salida

setup_adc_ports(sAN0); //Pongo RA0 como analogo


setup_adc(adc_clock_internal); //Selecciono reloj interno para conversion

LCD_INIT(); //Inicializar el driver del lcd


KBD_INIT(); //Inicializar el driver del teclado

pág. 43
LCD_PUTC("\f"); //Limpia el LCD

WHILE(1)
{
DIR=9;
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
LCD_PUTC("Teclas= ");
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
while (DIR<17)
{

if(k!='\0'){
LCD_GOTOXY(DIR,2);
lcd_putc(k);
k='\0';
DIR++;
}
//
==========================================================================
=== //
//A continuación se muestran diferentes formas para leer los valores
//del teclado matricial, descomenta la forma de almacenar el dato
//en la variable "k" y observa las diferencias de cada llamado

//k=tecla(); //Lee el valor del teclado y espera hasta que alguna tecla se pulse
k=tecla_time(); //Lee el valor del teclado pero solo espera un tiempo determinado
//k=kbd_getc(); //Función del ccs c para leer el valor del teclado (sin control)

//
==========================================================================
=== //
if(DIR>16)
LCD_PUTC("\f");
//Lectura ADC
set_adc_channel(0); //Selecciono el canal 0 (RA0)
delay_ms(1); //llamo retardo de 1 ms
bits=read_adc(); //Guarde el dato del LM en tempe

tem=bits*0.4882; //Conversion de bits a temperatura


lcd_gotoxy(1,1); //Ubiquese en la posicion 2,2
printf(lcd_putc,"Temp= %f ",tem); //Muestra el valor numerico de la conversionconversion

}
}
}

pág. 44
2.5 Programación de puertos con interfaces de potencia con:

Las interfaces de potencia son dispositivos intermedios entre nuestro microcontrolador y


aquellos aparatos que requieran cantidades de corriente mayores a los que pueden
manejar el microcontrolador (por lo general estamos hablando de una corriente de unos
40 miliamperios como máximo por pin).

Motores de paso, motores DC, servomotores, lámparas incandescentes, reflectores,


grupos o tiras de leds, son ejemplos de dispositivos que podríamos llegar a controlar
desde el microcontrolador a través de las interfaces de potencia. Es un grave error tratar
de conectar este tipo de dispositivos directamente a los pines del microcontrolador. Nos
ayudaremos de transistores, relés, puentes-H o interfaces electrónicas de control para
construirlas.
2.5.1 Transistores.
Los transistores pertenecen a la familia de los componentes electrónicos llamados
semiconductores, son componentes que pueden funcionar como amplificadores o
interruptores, si los utilizamos como interruptores pueden manejar corrientes altas,
controlados por corrientes bajas (al igual que los relés). Los transistores son
dispositivos de tres terminales y en el caso de los transistores bipolares sus
terminales se llaman emisor, base y colector, al poner una corriente pequeña en
la base, una corriente alta puede pasar del colector al emisor.
Entre los transistores bipolares podemos diferenciar dos tipos NPN y PNP.

En un transistor NPN:
La base controla el transistor.
El emisor es la conexión a tierra.
El colector conectará la parte de la carga a tierra.

La conexión base/emisor equivale a un diodo (Un LED que no emite luz). Siempre
que haya un voltaje positivo en la base habrá una diferencia de potencial de
0.7 volts, entre base y emisor.

pág. 45
Si hay cero voltios o menos de 0.7 voltios en la base del transistor el diodo no
conducirá y no habrá conducción (conexión) entre colector y emisor.

Si el voltaje es superior a 0.7 volts el diodo conducirá y el transistor se activará, la


corriente podrá pasar del colector al emisor.

Descripción de pines del transistor Tip 120 visto de frente.

Diagrama de conexión de un transistor, en este caso la carga es un motor y


necesita el diodo de protección, la batería puede ser reemplazada por una fuente
de voltaje o adaptador de corriente.

Diodo esquemático y componente real

pág. 46
2.5.2 Relevadores.

Son interruptores mecánicos controlados por una corriente eléctrica. Según el tipo
de relé, estos pueden ser activados con una corriente muy pequeña, por lo que
pueden ser disparados directamente por el microcontrolador (asegurarse que no
se sobrepasen los 20 miliamperios y que está conectado el diodo de protección).
El relé conectará una fuente de alimentación separada al circuito del
microcontrolador entregando la corriente necesaria para el funcionamiento del
dispositivo a controlar. Normalmente lo utilizaremos para conectar fuentes de
corriente alterna de alto voltaje (110 o 220 voltios).
Al ser un interruptor mecánico puede ser bastante lento, tarda un par de
milisegundos en cerrarse, si queremos "switchear" algo muy rápido el relé no será
el dispositivo más efectivo. Para este tipo de trabajos utilizaremos un relé de
estado sólido o un transistor.

Diferentes tipos de Relés y encapsulados.

Diagrama de funcionamiento de un Relé.

pág. 47
Circuito para disparar un Relé, en este circuito se comparte la fuente de
alimentación para el motor y la bobina del relé.

2.5.3 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 alto voltaje 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.

pág. 48
2.5.4 Puentes h discretos e integrados.
El puente H es un circuito electrónico que permite a un motor eléctrico DC girar en
ambos sentidos, avanzar y retroceder.
Los puentes H ya vienen hechos en algunos circuitos integrados, pero
también se pueden construir a partir de componentes eléctricos y/o
electrónicos.

2.6 Desarrollo de aplicaciones para el manejo de:

2.6.1 Lámparas.

mel es una compañía de semiconductores, fundada en 1984. Su línea de


productos

2.6.2 Zumbadores, vibradores piezoeléctricos, bocinas, etc.

El es una compañía de semiconductores, fundada en 1984. Su línea de productos

2.6.3 Motores de cd.

Los motores DC pueden ser utilizados para generar movimiento y locomoción. Por
lo general tienen muchas revoluciones por minuto RPM (velocidad), pero bajo
torque (fuerza), pero esto se soluciona poniendo engranajes reductores que
bajarán la velocidad, pero aumentarán la fuerza. Son los que se utilizan en
juguetes, teléfonos móviles (para dar la sensación de vibración), coches de
scalextrick, ventiladores, etc. Al aplicar un voltaje DC el motor empieza a girar, al
quitarlo se detiene, si se quiere cambiar la dirección del motor, se debe cambiar la
polaridad. Podemos controlarlos con el microcontrolador a través de un transistor
de potencia.

pág. 49
Motores DC (Corriente directa).

Motor DC con engranajes para bajar las RPM´s y subir el torque.

Puente H para controlar la dirección del movimiento de un motor.

pág. 50
2.6.4 Motores a pasos.

Pueden ser utilizados para locomoción, movimiento, dirección y posicionamiento.


Estos motores se encuentran en muchísimos equipos industriales y
computacionales, los escaners e impresoras utilizan este tipo de motores, también
las impresoras en 3D.
Son motores con una construcción especial ya que se puede controlar de forma
digital el grado de rotación de su eje enviando pulsos de 0's y 1's, permitiéndonos
posicionarlos con extremada precisión.
El stepper funciona con pulsos, si la secuencia de pulsos es la correcta el motor
dará un paso, cada motor tiene una especificación de grados por paso que
recorren.
Secuencia para moverlo un paso:
1000
delay (40);
0100
delay(40);
0010
delay(40);
0001
delay(40);

pág. 51
2.6.5 Servomotores.
Son motores DC con engranajes y un sistema de retroalimentación de posición,
que permite posicionarlos en un Angulo dado con mucha precisión. Su eje puede
rotar 180 grados y se utilizan mucho en aparatos de Hobby R/C para controlar
coches, aviones, barcos, helicópteros, en Animatrónicas para cine, marionetas,
etc.
Se controlan a través de tres cables, dos son para voltaje y tierra y el tercero para
una señal de posición de control que es un pulso. La posición central sería un
pulso de 1.5 milisegundos, que es enviado 50 veces por segundo al motor (cada
20 milisegundos). Un pulso de 1 ms rotará el eje totalmente a la izquierda y un
pulso de 2 ms rotará totalmente el eje a la derecha. Cualquier valor intermedio hará
posicionar el eje entre los +-/90 grados, con respecto al centro (1.5 ms) como
siempre es una aproximación dependiente del propio servo se ha de probar el
rango mínimo y máximo de la rotación del servo y la duración de los pulsos.

La alimentación del servo debe ser de 4 a 6 voltios y debe estar separada a la del
microcontrolador además de disponer una capacidad de 1 amperio, si se utiliza un
regulador de voltaje con suficiente capacidad se puede conectar a la misma fuente
de alimentación que el microcontrolador.

pág. 52

También podría gustarte