Curso de Mcu - Proteus
Curso de Mcu - Proteus
Curso de Mcu - Proteus
Antes de empezar estos cursos de microcontroladores, les quiero dar las gracias por a ver
bajado este libro, a mi siempre me ha gustado compartir las ideas a los demás, ya que lo
que yo he aprendido es por la culpa de otros que han querido compartir sus
conocimientos, y de ahí proviene esta causa que es querer compartir.
“Un cambio de paradigma en nuestra vida, es un riesgo que hay que tomar para triunfar”
1.1 Programas a Manejar
Primero empezemos a saber que tipo de herramientas necesitamos para programar los
microcontroladores.
Software:
Para crear un proyecto en este entorno de mplab solo hay que ir donde dice <project> y
después damos click en <Project Wizard>
Y Después nos abrirá un ventana donde nos saluda, saltamos ese saludo donde dice
<Next> y nos avienta al paso uno.
Nos pedira que microcontrolador tenemos en mente a usar, y en este caso empecemos a
programar el PIC16F886.
Después nos pedirá, donde queremos grabar el proyecto, lo grabamos donde nosotros
queramos y después hacemos click <next> next y finish…!!!!
Después creamos una hoja en blanco y esa misma hoja la grabamos en la misma carpeta
donde se grabo el proyecto creado con la extensión “.c”, para referirnos que es lenguaje
C.
Hacemos click derecho en <Source File> y después <Add File> y agregamos la hoja en
blanco.
Primero que nada debemos tener en cuenta para comenzar a programar es un algoritmo
de programación, para cuando saber lo que estamos haciendo.
Para poder controlar tal display debemos manipular los 0’s y 1’s, por ejemplo para
mostrar un “0” en el display.
A,B,C,D,E,F
Conectamos de tal forma que el PIN C0 sea la letra “A” con una resistencia de 330Ohms,
el PIN C1 sea “B”, y etc.
Nos quedara así.
En este caso el microcontrolador tiene un RC interno que pude generar una frecuencia de
4Mhz o 8Mhz. Por esa razón no tenemos que colocar un cristal externo.
Bueno como había dicho antes la lógica para mostrar los números es el siguiente.
Se tiene que hacer un arreglo donde su contenido sea los números a mostrar en forma de
binario. Cada vez que te pida el numero que corresponda este envie el numero en binario
para después mostrarlo en el puerto b.
Ejemplo
VALOR=NUMERO[8];
Este causa que busque valor que se encuentra en la posición 8. Se debe de aclarar que
empieza el conteo desde 0 en el arreglo que hicimos arriba.
0
1
2
3
4
5
6
7
8 -> Aquí arroja el valor que se encuentre en el arreglo.
9
VALOR= 0b10000000
Y esa variable se saca por el puerto b para visualizar el numero decimal “8”.
A continuación se observa el programa en CCS.
//CONFIGURACION///////////////////
#include<16f886.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
//VARIBALES///////////////////////////
int mostrar[]={0b11000000,0b11111001,0b10100100,0b10110000,
0b10011001,0b10010010,0b10000011,0b11111000,
0b10000000,0b00011000};
int contador;
//CONFIGURACION E/S///////////////
set_tris_c(0x00);
do{
for(contador=0;contador<=9;++contador){
output_c(mostrar[contador]);
delay_ms(1000);
}
}while(TRUE);
}
Bueno empecemos otro programa ya algo que intervenga interrupciones en los pic, para
meternos más a fondo en la programación.
Interrupciones por:
RB0\INT0
Bueno ya conocemos el timer0, pero como opera este dichoso contador, para poder usar
correctamente esta interrupción, se debe de configurar de a cuerdo a la siguiente formula.
Entonces:
Despejando;
Con la instrucción
SET_TIMER0(217);
Configuracion
Se nota que el desbordamiento se hace cada 10ms con la interrupción, entonces damos
como conclusión que es muy eficiente usar las interrupciones.
Ahora bien como vimos en el primer ejemplo como usar un display, pero en este circuito
se usara dos, para ahorrar dinero y espacio en nuestros circuitos. Se usara una técnica de
multiplexor.
Consta simplemente hacer un switcheo entre varios elementos y cada elemento pude
visualizar o adquirir datos en un cierto tiempo programado.
La lógica que llevaremos es simplemente visualizar un numero a la vez en su
correspondiente display. Por ejemplo.
Para visualizar el numero 25, se tendrá que pedir el numero del primer display y
visualizarlo en el display que corresponde, y luego desactivar el display antes prendido, y
luego pedir el siguiente valor para mostrarlo en el segundo display y después activarlo. Y
así sucesivamente. Esto será a una velocidad moderadamente alta para que parezca que
están encendidos los dos al mismo tiempo, pero en realidad se están turnando muy rápido
.
Enciende el primer display y después el otro
Se desborda aprox. A
los 65mS
Bueno no entrare tan profundamente como opera un LCD, ya que si quiero explicar cada
detalle pues nos aburriríamos leyendo todo, por esa razón simplemente haremos un par de
programas y circuitos con LCD, ya que el compilador que estamos usando contiene una
librería especialmente para manejar este dispositivo.
ejemplo;
ejemplo:
1.-Aquí se debe de definir que puerto se va a usar en el micro, por default esta en puerto
D.
El circuito en proteus.
1.6 Reloj con LCD
Ya sabemos como usar la interrupción por timer0, y podemos usar el lcd 16x2, entonces
estamos capacitados para realizar un reloj digital.
Es simple hacer un reloj digital, y mas cuando usamos microcontroladores, ya que nos
proporciona mayor precisión en base del tiempo.
La idea para desarrollar este reloj, se basa en usar la interrupción del timer0 para que cada
10ms se produzca una interrupción, y con una variable, contemos esas interrupciones
para tener aproximadamente 1 segundo y podemos cambiar el segundero, a su valor
correspondiente.
Bien, para poder visualizar los números que se están incrementados con el tiempo.
Se usa una instrucción para hacer lo siguiente.
%u= se refiere que es un numero entero de 8 bit, ósea solo se pude visualizar números de
0 a 255.
Configuracion del
Lcd, cosa que ya
habiamos visto
Definimos los
botones de control
Cada 100
interrupciones se tiene
1 segundo
Mientras el boton
“SET” este presionado
Se debe estar
suelto para que
pueda contar
1.7 Cronometro con LCD
Ya realizamos algo muy difícil, que era un reloj digital con el LCD, un cronometro ya es
algo muy simple para hacer, ¿no?
Hay que tener un detalle muy presente en este proyecto, es que el LCD, necesita un cierto
tiempo para mostrar un digito la pantalla. Como se muestra en la tabla siguiente.
Vemos esto para que nuestro programa que vallamos a hacer tenga un rango de operación
para que en 10ms pueda mostrar correctamente todos los caracteres en la pantalla.
La logica que vamos a desarrollar es la siguiente, que muestre horas, minutos, segundos,
decimas de segundos, entonces lo máximo a proyectar es.
11 : 59 : 59 . 99
El programa es igual que el del reloj pero en este caso, solo tenemos dos botones, uno va
ser el RESET, y el otro va hacer PAUSA.
Y así cuando queramos empezar de nuevo, presionamos el boton RESET, y por lo
contrario queremos solo pausar el cronometro pues presionamos PAUSA.
Usaremos el reloj interno del Micro que trabaje a 8Mhz, para que las instrucciones se
ejecuten cada 0.5uS, que es la mitad de lo que trabajábamos anteriormente, y así sea mas
exacto los 10ms.
Pero si hacemos esto el timer0 que tenia un valor de 217, ya no será ese valor, ya que
cambiamos el oscilador, entonces tenemos que hacer nuevamente la operación antes
vista.
Despejamos el timer0.
Timer0= 177 ese valor tenemos que cargarlo siempre cuando se produzca la interrupción.
Como dije hace rato, que es igual que el proyecto anterior, que era el del reloj, aquí esta
el programa.
Configuaracion del
LCD, cosa que ya
vimos
Se cambia lo que
teniamos en el Se agrega dos
programa anterior variable mas
Valor obtenido en la
operacion anterior para
10ms
Se ve que ya no usamos
la variable overflow ya
que el conteo se muestra
desde los 10ms
Se carga otra vez
Se pone todo a
“0”
Vemos el circuito:
1.8 Contraseña con LCD y Teclado 4x4
He añadido una librería para un teclado 4x4, ya que el compilador tiene un driver para un
teclado 4x3, pero lo mas común es usar teclados 4x4, ya que tenemos mas botones para
llevar acabo mas cosas.
Como vemos el driver 4x4 consta con las siguientes funciones:
do{
c=kbd_getc();
if(c!=0) {
//acciones a desarrollar con la letra obtenida
}
}while(TRUE);
*Nota: Abrimos la carpeta de driver, donde esta instalado el compilador, y pegamos este
driver del teclado 4x4. Y listo para poder usarlo.
Al estar programando, se debe de agregar un “USE” más con el siguiente parámetro.
#use fast_io(b)
Esta directiva afecta al código que el compilador generará para las instrucciones de
entrada y salida. Este método rápido de hacer I/O ocasiona que el compilador realice
I/O sin programar el registro de dirección. El puerto puede ser A-G.
Se debe también activar las resistencias pullup en el puerto b, esto nos evita usar
resistencias externas para el uso del teclado.
port_b_pullups(0xF0);
El teclado funciona en el puerto b, pero ahí es donde teniamos el LCD, ahora debemos de
mover el LCD al puerto C, pero como en las configuraciones del driver del LCD, solo se
puede cambiar para el puerto B o D, he modificado, ese driver para poder usar el puerto
C.
Para poder usarlo se hace igual que el driver del teclado, solo lo copiamos y lo pegamos a
la carpeta que contiene todos los driver y listo.
#include<LCD_PORTC.C>
Se usara dos arreglos en este proyecto, uno será la clave para acceder, y el otro donde se
va a grabar nuestra clave, para compararse con la clave verdadera.
Unsigned char CLAVE[]= {0, ’1’ , ‘3’ , ‘6’ }; //Clave definida el valor de 0 no cuenta la
clave es “136”.
Observemos el programa
Función que te
devuelve el valor
presionado
Comparación de
cada numero
Con el verdadero
Se muestra el esquema del proyecto:
Propuesta:
Es muy común encontrar proyectos que emplean como sensor a un transistor LM35DZ
modelo TO-92, el cual es in sensor de temperatura con una buena presicion en escala
Celsius. Este dispositivo transforma la temperatura del ambiente en voltaje, del orden de
mV.
Este dispositivo tiene un rango de operación de -50 a 100 grados Celsius, que es mas que
suficiente para hacer pequeñas practicas.
Se pude usar amplificadores para cambiar la ganancia de este dispositivo, pero este
arreglo es usado más en sistemas PID.
Nosotros usaremos un microcontrolador para convertir la entrada análoga a digital
(CAD).
Nuestro primer proyecto con este sensor es visualizarlo en una pantalla LCD, que marque
la temperatura ambiente.
El CAD según su calibración te pude dar un rango muy amplio, por ejemplo usaremos
una conversión de 10 bit’s, este nos proporciona un rango de 0 a 1023.
Al medir voltaje, tenemos que:
0 volts = 0b0000000000 = 0
5 volts = 0b1111111111 = 1023
X= 5 / 1023
X= 4.88mV
Como estamos usando un sensor que tiene un incremento de 10mV por grado centígrado.
Usaremos una operación para convertir esa variación en la temperatura.
Por ejemplo:
( 270mV*1023 ) / 5 = 55.242
Casi exacto a la temperatura medida, con esta logica podemos crear un sensor de
temperatura ambiente y que se proyecte a un LCD.
El programa se da a continuación.
Para
valores
con
décimas
Se hace esta
comparación
para que no este
siempre
visualizando,
solo cuando hay
un cambio de
temperatura
Se muestra el diagrama a manejar:
Ya hemos trabajado con LCD, solo ahora hemos añadido el sensor de temperatura.
Propuesta:
-Haga un sistema donde tenga dos valores MÁXIMO Y MÍNIMO de temperatura, donde
la variable de TEMPERATURA al llegar al valor MÁXIMO prenda un abanico para que
enfríe el sensor, y cuando llegue al valor MÍNIMO apague el abanico.
Ejemplo:
Tenemos:
MAXIMO= 40 grados
MÍNIMO =20 grados
-Comunicación Serial
-Comunicación Paralela
-USB
En este proyecto se empezara la comunicación por puerto serial, aunque ya están mas
populares hacer circuitos con USB, vamos a exprimir este método de comunicaciones,
antes de pasar al USB.
Para conectar el PC a un microcontrolador por el puerto serie se utilizan las señales Tx,
Rx y GND. El PC utiliza la norma RS232, por lo que los niveles de tensión de los pines
están comprendidos entre +15 y -15 voltios. Los microcontroladores normalmente
trabajan con niveles TTL (0-5v). Es necesario por tanto intercalar un circuito que adapte
los niveles:
En los PCs hay conectores DB9 macho, de 9 pines, por el que se conectan los
dispositivos al puerto serie. Los conectores hembra que se enchufan tienen una
colocación de pines diferente, de manera que se conectan el pin 1 del macho con el pin 1
del hembra, el pin2 con el 2, etc...
PIC
Si por casualidad tienes una laptop, se pude comprar un adaptador de usb a serial,
recordar que solo este sirve para la comunicación no para programar PIC.
-Para el primero:
Esta directiva le dice al compilador la velocidad en baudios y los pines utilizados para la
I/O serie. Esta directiva tiene efecto hasta que se encuentra otra directiva RS232.
-Para el segundo.
Dice que se va usar el USART integrado del microcontrolador a tantos baud. La
diferencia entre el anterior, es que en este se puede usar las interrupciones de recepción
de datos o trasmisión.
La directiva #USE DELAY debe aparecer antes de utilizar #USE RS232. Esta directiva
habilita el uso de funciones tales como GETCH, PUTCHAR y PRINTF. Si la I/O no es
estándar es preciso poner las directivas FIXED_IO o FAST_IO delante de #USE RS232
Para hacer una comunicación virtual entre el prorama proteus y hyperterminal se debe de
usar una aplicación que te crea dos puertos viruales. Usaremos el Virtual Serial Port
Aquí se
seleccionamos el
par para ser
enlazados
Se creo dos
puertos
virtuales
Ahora si, pasemos al Hyperterminal, lo abrimos y le ponemos nombre a la conexión:
Después solo checamos que esten bien los baudios, que sean igual al que hallamos puesto
en nuestro programa
Y listo!
Se nota en el programa virtual serial port que en el COM1 esta conectado!
Y empezamos la simulación.
Propuesta:
FILA
COLUMNA
¿Como funciona?
Como dijimos antes, la pantalla está formada por una serie de filas y columnas. La
intersección entre ambas contiene un LED. Para que este encienda, tiene que recibir
simultáneamente un “0” en la fila, y un “1” en la columna. Cuando se dan estas
condiciones, la electrónica de la placa se encarga del encendido del LED en cuestión.
Por ejemplo:
0
0
1
1
0
0
1 1 0 0 0 0 1 1
Se nota que solo prenden los led que se intersectacon con 1 a 0, mientras cuando se
intersectan 0 y 1 no prenden por la polaridad del diodo.
Hay una técnica para mostrar figuras o letras, sin necesidad de estar de tener muchos
circuitos, una de ellas es por corrimiento.
011111111111111111
101111111111111111
110111111111111111
………………………
111111111111111110
Esta técnica es empleada a una gran velocidad de transición, por decir un número a 2mS,
para que el ojo humano no perciba el parpadeo.
Circuito 74HC164
Este circuito se encarga de mandar a todas las columnas el dato necesario, y lo recorre
cada vez que se da un pulso de reloj.
La letra “A” antes vista se tuvo que dibujar primero, y sacar los valores correspondientes
a cada fila.
Se usa el Puerto c
para la fila
Es el máximo de
columnas a limpiar.
Como vimos antes simplemente hay que en enviar un dato 0 para que cada vez se
proyecte la fila correspondiente.
Cuando el desplazamiento llegue la última columna enviara otra vez el dato para que
empiece otra vez.
Máximo de
columnas
Aun no se usa esta función
Y obtenemos:
Propuesta:
Bueno la lógica es mas simple que la anterior, ya que usaremos una función que nos
proporciona el dato requerido al momento en que se debe de empezar otra vez.
La función anterior que decía “aun no se usa” ahora es el momento para usarla.
Esta función será de gran utilidad para mandar el dato exactamente cuando se requiera.
Solo voy a mostrar el programa principal, ya que todo las funciones son las mismas de la
anterior.
Se agrega estos
parámetros para que
espere el momento,
Para resetear el dato Se observa que hemos
En la función quitado el SEND_DATA();
“HABILITO” Ya que la función
“HABILITO” es la que se
encarga de mandar el dato
al momento en que se
llegue al máximo de
columnas
Usted dirá que el traslado es de derecha a izquierda, eso!! Esta mal. El traslado es de
izquierda a derecha, para que se pueda leer correctamente. Debe de usted encontrar la
manera, para solucionar este error. Si lo hace es una mente maestra!!!
Se aprecia que no hay espacio, se tuvo que hacer sin espacios ya que en la simulación no
se apreciaría correctamente. Pero en la realidad al poner ese espacio se notara nítidamente
bien.
2.1 Controlador de un Motor CD
En esta sección se vera lo siguiente:
Para cambiar la dirección de giro en un motor de Corriente Continua tan solo tenemos
que invertir la polaridad de la alimentación del motor.
Así pues, vemos que poniendo a nivel alto la entrada de habilitación "EN" del driver, la
salida de este "OUT" pasa de alta impedancia al mismo nivel que se encuentre la entrada
del driver "IN" pero amplificado en tensión y en corriente, siendo esta de 1A máximo. La
tensión de alimentación del circuito integrado no es la misma que se aplica a las carga
conectada a las salidas de los drivers, y para estas salidas se a de alimentar el driver por
su patita número 8 (Vs), la tensión máxima aplicable a estas patitas es de 36V.
Tipica Aplicaciones:
Control Unidireccional: En la siguiente figura vemos las dos formas de conectar un motor
para control unidireccional, M1 se activa al poner la entrada del driver conectado a este, a
nivel bajo "0", mientras que M2 se activa al poner la entrada del driver a nivel alto "1" y
se para al ponerla a nivel bajo "0".
La entrada enable es como un interruptor general y deberá ponerse a nivel alto "1" para
poder operar con los drivers que controla, o a nivel bajo "0" si se quiere desconectar el
control de estos.
Los diodos modelo 1N4007 son para proteger el circuito de los picos de arranque y
parada de los motores debido a la corriente inversa inducida por estos.
Para tener el control de dos direcciones o bidireccional se usan dos de drivers del l293b
conectando sus salidas a los polos del motor, entonces podremos cambiar la polaridad de
alimentación del motor con tan solo cambiar de estado las entradas de los drivers.
Por ejemplo, para que el motor gire hacia la derecha pondremos la entrada "A" a nivel
alto "1" y "B" a nivel bajo "0" y para hacer girar el motor a la izquierda tendremos que
invertir las señales de entrada de tal manera, la entrada "A" a nivel bajo "0" y "B" a nivel
alto "1". Los diodos son como en el caso anterior para proteger el integrado de corrientes
inversas.
Haremos un pequeño circuito que por medio de vía serial, cambie el giro del motor:
Ya hemos trabajado con el UART, solo hay que hallar la lógica de lo que queremos,
deseamos que al recibir la letra “ I ” gire a la derecha, o cuando se reciba la letra “ D “
gire a la derecha y así.
Se da el programa para hacer lo antes dicho.
Para detectar lo blanco o negro de la línea a seguir, usaremos también los comparadores
internos que contiene el Micro, para comparar la señal obtenida de los CYN70.
He pegado los dos motores en el chasis del carrito, soldé las terminales a cables largos
para que entren en el proto.
Recuerde, que el para armarlo debe de colocar sensor CYN70 del comparador 1, debe ir a
la Izquierda del Robot, mientras que el otro debe de estar a la derecha. (Los dos bien
juntos)
Este a la derecha Motor debe de estar
a la izquierda
Motor debe de
estar a la
derehca
Este a la izquierda
He aquí el programa:
Vemos como quedo nuestro robot.
2.2 Temperatura y Display de 7 segmentos
Como vimos en las primeras practicas de cómo usar dos display de 7 segmentos,
intercalando cada display, ahora he añadido un sensor LM35, para mostrar la
temperatura. Con el uso de la interrupción por timer0, se sensara la temperatura, y el
valor obtenido se sacara las centésimas, décimas y unidades.
El rango de operación es de 0 grados a 106 grados, cada display esta prendido 2mS
suficiente para poder mostrarse a una intensidad que se vea.
El programa que contiene el PIC;
Nota: El display es ánodo común, y se usa un transistor 2N2222 para activar cada uno de
ellos, como se vio en el ejemplo de “Contador de 00 a 99”.
V1.4
03/01/2010 10:36:52