MICROPROCESADORES Y MICROCONTROLADORES PARTE 1
ANTECEDENTES.
1.- MICROCONTROLA MI CROCONTROLADORES DORES PIC. 2.- ESTRUCTURA INTERNA DE LOS MICROCONTROLADORES PIC. 3.- PINES DE LOS MICROCONTROLADORES MICROCONTROLADORES PIC. 4.-PROGRAMACIÓN 4.-PROGRAMACIÓN DE LOS MICROCONTROLADORES MICROCONTROLADORES PIC 5.-FORMATO GENERAL GENERAL DE UN PROGRAMA EN PICC 6.- DESCRIPCIÓN DEL DISPLAY LCD. 7 – EMPLEO DE MOTOR DRIVERS: BA62XX Y L293.
1
1.-MICROCONTROLADORES 1.-MICROCONTR OLADORES PIC Dentro del mundo de los microcontroladores, existen una gran variedad de dispositivos de varias marcas que ofrecen características muy variadas. Algunos tienen periféricos integrados tales como Convertidores Análogo - Digital, Convertidores Digital - Análogo, Módulos de Modulación PWM o SPWM, puertos seriales, etc; en cambio otros se ven mas ampliados o mas limitados en cuanto a sus periféricos integrados en la misma pastilla de circuito integrado.
Dentro de las principales diferencias entre los microcontroladores de la familia MICROCHIP, que es a la que pertenecen los PIC, y los de MOTOROLA, ATMEL, INTEL, ZILOG, ALTERA, ALTERA, entre otros, se encuentran las siguientes ventajas:
VENTAJAS DE LOS PIC EN RELACIÓN A OTROS MICROCONTROLADORES: PROCESAMIENTO DE FUNCIONES LÓGICAS Y ARITMÉTICAS COMPLEJAS, tales como funciones seno, coseno, tangente, punto flotante (potencias con entero y decimal), logaritmos, etc; así como funciones lógicas OR, AND, XOR, ETC. •MANEJO EN LENGUAJES DE ALTO ALTO NIVEL: C, PASCAL, BASIC. MAYOR NÚMERO DE MÓDULOS TEMPORIZADORES (TIMERS). •MAYOR •CONVERTIDOR ANÁLOGO – DIGITAL DE 8 o 10 BITS Y 8 CANALES. 2
1.-MICROCONTROLADORES 1.-MICROCONTR OLADORES PIC Dentro del mundo de los microcontroladores, existen una gran variedad de dispositivos de varias marcas que ofrecen características muy variadas. Algunos tienen periféricos integrados tales como Convertidores Análogo - Digital, Convertidores Digital - Análogo, Módulos de Modulación PWM o SPWM, puertos seriales, etc; en cambio otros se ven mas ampliados o mas limitados en cuanto a sus periféricos integrados en la misma pastilla de circuito integrado.
Dentro de las principales diferencias entre los microcontroladores de la familia MICROCHIP, que es a la que pertenecen los PIC, y los de MOTOROLA, ATMEL, INTEL, ZILOG, ALTERA, ALTERA, entre otros, se encuentran las siguientes ventajas:
VENTAJAS DE LOS PIC EN RELACIÓN A OTROS MICROCONTROLADORES: PROCESAMIENTO DE FUNCIONES LÓGICAS Y ARITMÉTICAS COMPLEJAS, tales como funciones seno, coseno, tangente, punto flotante (potencias con entero y decimal), logaritmos, etc; así como funciones lógicas OR, AND, XOR, ETC. •MANEJO EN LENGUAJES DE ALTO ALTO NIVEL: C, PASCAL, BASIC. MAYOR NÚMERO DE MÓDULOS TEMPORIZADORES (TIMERS). •MAYOR •CONVERTIDOR ANÁLOGO – DIGITAL DE 8 o 10 BITS Y 8 CANALES. 2
•MEMORIA EEPROM DE GRAN CAPACIDAD. •MEMORIA FLASH DE GRAN CAPACIDAD Y VELOCIDAD. •VARIOS MÓDULOS DE CAPTURA Y MODULACIÓN POR ANCHO DE PULSO
(PWM Y SPWM). •MÓDULOS DE INTERRUPCIONES DE TIPOS: EXTERNA, DE TIEMPOS, DE COMUNICACIÓN PARALELA Y SERIAL, DE ESCRITURA Y LECTURA DE MEMORIA EEPROM, DE FIN DE CONVERSIÓN ANÁLOGA – DIGITAL,etc. CAPACIDAD DE EROGACIÓN (SALIDA) DE CORRIENTE, que le permite •GRAN CAPACIDAD no emplear buffers externos para cada pin de puerto. •MANEJO DE GRANDES VELOCIDADES DE PROCESAMIENTO, QUE VAN DESDE 1MHZ HASTA VERSIONES QUE TRABAJAN A 100MHZ. PI C. •MANEJO DE PUERTO USB EN ALGUNAS VERSIONES DE PIC. •MANEJO DE MODULACIÓN POR RADIOFRECUENCIA DIGITAL PARA TRANSIMISIÓN Y RECEPCIÓN. •Watch Dog Timer o temporizadores auto reseteables para bajo consumo (funciona análogamente como el “protector de pantalla” de una PC comercial) •Entre otras. Así, podemos ver que los microcontroladores PIC ofrecen grandes ventajas en relación a otros microcontroladores más modestos, aunque siempre dependerá de la aplicación particular el que se elija un tipo de micro en particular. 3
Dentro de la familia MICROCHIP, EXISTEN 4 SUBFAMILIAS que se caracterizan de la siguiente manera PICS PEQUEÑOS: Su nomenclatura comienza con el número 12, tal que se definen como PIC12FXX o PIC12CXX. Son de 8 a 12 pines, trabajan normalmente con comunicación serial al carecer prácticamente de pines de puertos, y tienen un consumo de corriente muy bajo, ya que son alimentados con solo 3 volts. Internamente manejan registros de 8 o 12 bits, por lo que son microcontroladores de 8 o 12 bits (de ahí su nomenclatura). PICS MEDIANOS: Su nomenclatura comienza con el número 16, tal que se definen como PIC16FXXX o PIC16CXXX. Son de 16 a 40 pines, trabajan con 2 a 4 puertos paralelos, tienen un consumo de corriente bajo, ya que son alimentados con 3 a 5 volts. Internamente manejan registros de 8 a 14 bits, por lo que son microcontroladores de 8 a 14 bits. Estos cuentan con capacidades de memoria interna tipo medio y cuentan con algunos periféricos complejos como CAD, módulos PWM, Serial, entre otros. PICS GRANDES: Su nomenclatura comienza con el número 18, tal que se definen como PIC18FXXX o PIC18CXXX. Son de 40 pines, trabajan con 2 a 6 puertos paralelos, tienen un consumo de corriente regular. Internamente manejan registros de 16 bits, por lo que son microcontroladores de 16 bits. Estos cuentan con capacidades de memoria interna grande, lo que permite trabajar en lenguajes de alto nivel y cuentan con varios periféricos complejos como CAD, módulos PWM, Serial, entre otros. 4
DSPICS: Son grandes procesadores digitales de señales en un microcontrolador. Manejan hasta 32 bits de datos y velocidades hasta los 100MHz. Cuentan con un gran soporte de funciones matemáticas para realizar cálculos complejos como Transformada Rápida de Fourier (FFT) para realizar filtros digitales, matrices, determinantes, variables de estado, integrales, ecuaciones diferenciales, Transformada Z, entre otras. Cuentan con varios timers, varias interrupciones internas y externas, varios módulos de PWM, Conversión A/D de alta resolución y alta velocidad, entre otros. *En cu alquiera de estos pics , la no m enclatura ind ica si tienen un a m emo ria d e tip o Flas h (F) (m uy rápi do s) o s on de tec no lo gía de m em or ia co m plementaria tipo MOSFET o CMOS (C) (de mu y bajo co nsu m o)
2.- ESTRUCTURA INTERNA DE LOS MICROCONTROLADORES PIC La estructura interna de un microcontrolador tipo PIC está basada en buses bidireccionales internos que están interconectados a un ACUMULADOR DE TRABAJO o REGISTRO WORK (W), que es en el que se almacenan los resultados de las operaciones de lógica y aritmética realizados. Además cuenta con cierta cantidad de registros de memoria interna tipo flash para acceder a un código de programa. A éstos bloques les acompañan otros bloques ya conocidos como los puertos paralelos y seriales, así como los del convertidor AD y módulos de PWM, entre otros. La figura siguiente muestra la estructura interna de un PIC:5
ESTRUCTURA INTERNA DE LOS MICROCONTROLADORES PIC
6
EJERCICIO: COLOQUE LOS NÚMEROS CORRECTOS QUE REPRESENTAN LA DESCRIPCIÓN DE LOS BLOQUE DEL PIC EN RELACIÓN A LA SIGUENTE TABLA:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
DECODIFICADOR DE INSTRUCCIONES. REGISTRO DE INSTRUCCIONES. MÓDULO DEL CONVERTIDOR ANÁLOGO – DIGITAL. PUERTOS ANALÓGICOS DE ENTRADA Y DIGITALES DE I/O. PUERTOS DIGITALES DE I/O. GENERADOR DE TIEMPO DE CICLO MÁQUINA. MÓDULOS DE TEMPORIZADORES. STACK O ALMACEN INTERNO. MEMORIA DE PROGRAMA. MEMORIA DE DATOS. REGISTRO DE TRABAJO (ACUMULADOR). UNIDAD DE ARITMÉTICA Y LÓGICA. MÓDULO DE PUERTO SERIAL. MÓDULO DE M ODULACIÓN POR ANCHO DE PULSO (PWM). MEMORIA ELÉCTRICAMENTE BORRABLE Y PROGRAMABLE. 7
El PIC16F877 (Pic de tipo medio) como el mostrado en su estructura interna en ésta figura, tiene además las siguientes características generales:
Así como las características de periféricos siguientes:
EJERCICIO: TRADUCIR A ESPAÑOL ESTAS DOS
TABLAS DE CARACTERÍSTICAS
8
3.- PINES DE LOS MICROCONTROLADORES PIC Todos los pines del PIC son de niveles TTL (“0”= 0V y “1” = 5V), excepto los pines del Convertidor Análogo Digital que pueden admitir voltajes entre 0 y 5V de forma contínua (analógica).En las siguientes figuras se observa una tabla descriptiva de las terminales del PIC 16F877.
9
3.- PINES DE LOS MICROCONTROLADORES PIC Terminales del PIC 16F877. o PIC 18F452
10
4.- PROGRAMACIÓN DE LOS MICROCONTROLADORES PIC Todos los microcontroladores PIC pueden programarse en LENGUAJE MÁQUINA ENSAMLADOR (LENGUAJE DE BAJO NIVEL), y en LENGUAJES DE ALTO NIVEL, tales como el PASCAL, C++, BASIC, etc. Sin embargo, algunos no soportan grandes programas hechos en lenguajes de alto nivel debido a que el compilador emplea estructuras predefinidas que ocupan mucha memoria y tiempo de ejecución. Así, en la siguiente figura podemos ver las consecuencias de emplear lenguajes de bajo o alto nivel para estos microcontroladores:
Lenguaje de BAJO NIVEL Tiempo de elaboración del código y algoritmo por el programador. Velocidad de Lenguaje de ALTO NIVEL trabajo del micro-1 Capacidad de memoria ocupada en el micro En general, si se tiene una aplicación grande pero se dispone de un PIC también grande, es preferible trabajar con un lenguaje de alto nivel, tal como el C++, ya que su estructura facilita bastante la programación, sobre todo para módulos como el display LCD o el CAD, que programarlos en ensamblador es demasiado complicado; en cambio en lenguaje C++, es muy sencillo usarlos. 11
La programación en lenguaje “C++” o “PICC” es muy sencilla, ya que define estructuras preestablecidas en la sintaxis muy similar al C++ de uso común. Veamos ahora algunas estructuras sencillas de sintaxis en PICC:
4.1. ESTRUCTURAS PARA MANEJO DE PUERTOS: DE SALIDA POR BIT:
Salida en nivel bajo: Salida en nivel alto:
sintaxis:
output_low(pin_nom bre del pin ); output_high(pin _n o m b re d el p in );
Ejemplos: output_low(pin_b0); output_high(pin_a3); DE ENTRADA POR BIT:
//manda un “cero” por el pin RB0. //manda un “uno” por el pin RA3.
sintaxis:
variable=input(pin_ nombre del pin);//La variable debe ser de tipo booleana de 1 bit //Esta función normalmente se emplea como condición de una acción dependiente del valor de la entrada de ese pin particular, y viene acompañada por la estructura “if ”, cuya sintaxis es: if (input(pin_n o m b r e d el p i n )) { acciones a realizar si el pin indicado entra como un “1” lógico }
O bien la sintaxis: if (!input(pin_n o m b r e d el p i n ) )
{ acciones a realizar si el pin indicado entra como un “0” lógico }
Ejemplo: if (!input(pin_b5)) // pregunta por un “0” en el pin RB5 y si es verdad ... {output_high(pin_b7);} // saca un “1” por el pin RB7; Si no... Entonces saca un 12 else {output_low(pin_b7); } // ”0” por el pin RB7.
DE SALIDA POR BYTE:
sintaxis:
output_n o m b r e d el p u e r t o (dato a salir); //manda un F0 hexadecimal por el puerto RB. Ejemplos: output_b (0xF0); output_c (255); //manda un 255 decimal por el puerto RC. DE ENTRADA POR BYTE O REGISTRO: sintaxis: variable= input_n o m b r e d e l p u e r to ( ) ; Ejemplos: dato=input_ b (); //guarda en la variable el valor leído en el puerto RB. entradas=input_ c (); //guarda en la variable el valor leído en el puerto RC. 4.2. ESTRUCTURAS PARA MANEJO DE TIEMPOS: TIEMPOS:
sintaxis:
delay_ms(t i em p o e n m i l i s e g u n d o s ); delay_us(t i em p o en m i c r o s e g u n d o s ); Ejemplos:
output_low(pin_b0);
//manda un “cero” por el pin RB0.
delay_ms(3000); // mantiene 3 segundos este pin en cero. output_high(pin_b0);
//manda un “uno” por el pin RB0.
delay_us(100); // mantiene 100 microsegundos este pin en uno. output_low(pin_b0);
//manda un “cero” por el pin RB0. 13
4.3. ESTRUCTURAS PARA MANEJO DE INTERRUPCIONES: Las interrupciones son un elemento muy útil en el diseño de programas, ya que permiten “distraer” la atención del procesador sólo cuando ocurre un evento determinado y no se requiere estar constantemente preguntando por dicho evento. Por ejemplo, cuando alguien presiona el botón de un elevador, el procesador se da cuenta de eso y actúa, pero no está preguntando constantemente por cada botón todo el tiempo. Las interrupciones son ejecutadas en subrutinas especiales que, obviamente, s e realizan sólo si se generó la interrupción que las manda llamar. Dentro del conjunto de interrupciones que puede responder el PIC se encuentran: INTERRUPCIONES EXTERNAS. Generadas por flanco o por nivel, según sea predefinida en el programa. Las interrupciones externas son las más comunes. Se clasifican en: 1.- INTERRU PCIONES DE R ECEPC IÓN S ERIA L , cuando es recibido un dato por el puerto serial, entra a una subrutina que en PI CC se llama #int_rda noclear // interrupción para el uso del serial. Para emplearla basta con declarar en el programa principal la habilitación global de las interrupciones como: enable_interrupts(global); y habilitar la interrupción particula, que para la del serial es: enable_interrupts(int_rda); Luego se define la r utina de servicio de interrupción (isr) en una llamada (void) y se ejecutará el código que se encuentre dentro de esa llamada, como el siguiente ejemplo: void serial_isr()// subrutina de interrupción del serial { //aqui irá lo que hará cuando detecte una interrupción en el serial al recibir, 14 // por ejemplo getc(). }
2.- INTERRUPCIÓN POR CA MB IO DE VA L OR EN EL PUERTO B . Esta es
muy usada cuando se lee un teclado matricial, ya que con cualquier tecla que se oprima se llama la atención del procesador para leer la tecla particular y de paso realizar otras acciones como lo pueden ser el encender una lámpara para ver dicho teclado en la oscuridad (como lo hacen la mayoría de los celulares). 3.- INTERRUPCIÓN POR CA MB IO DE VA L OR EN EL P IN DE PUERTO RA 4 . Este pin del puerto A, es empleado no sólo como pin de entrada/salida digital común, sino que también es utilizado como entrada de conteo por flancos. Cada vez que sucede un flanco (de subida o bajada según se programe) puede activar esta interrupción. Puede ser empleada no solo para llevar la cuenta de un evento y registrarla en un contador interno, sino también sirve para darse cuenta que “algo” está presente en el exterior, como por ejemplo, un automóvil que desea entrar a un estacionamiento o una persona que entra a una tienda. INTERRUPCIONES INTERNAS: Las más comunes son: INTERRUPCIÓN DE TERMINACIÓN DE ESCRITURA DE LA EEPROM, INTERRUPCIÓN DE FIN DE CONVERSIÓN ANÁLOGA – DIGITAL, INTERRUPCIÓN DE FIN DE CONTEO DE TIEMPO EN TIMERS, entre otras. Investigación: Lea las hojas de datos del PIC18F877 y encuentre que otras fuentes de interrupción contiene. 15
4.4. ESTRUCTURAS PARA MANEJO DE DISPLAY LCD Y TECLADO MATRICIAL: DISPLAY LCD: Primeramente, se debe declarar el uso del display LCD en la parte de las declaratorias en el encabezado del programa, colocando la sintaxis siguiente: #include , o bien: #include // DECLARA EL USO DE UN DISPLAY TIPO LCD DE CARACTERES UNSIGNED O SIN SIGNO. ES EL MÁS COMÚN DE LOS DISPLAYS DE 16X2. ASEGÚRESE DE TENER ESTE ARCHIVO (lcd_us.c) o (lcd.c) DENTRO DEL SUBDIRECTORIO DE "DRIVERS".RECUERDE INICIALIZAR EL DISPLAY AL COMENZAR EL PROGRAMA PRINCIPAL, EMPLEANDO: lcd_init();//inicializa lcd MANEJO POR POSICIONAMIENTO EN COORDENADAS: sintaxis: lcd_gotoxy(coordenada en x, coordenada en y); Esto mueve el cursor del display a la posición señalada. Los rangos para “x” son de 1 a 16 y para “y” de 1 a 2. Ejemplo: lcd_gotoxy(3,2);// posiciona al cursor en la coordenada x=3, y=2. Y=1 Y=2 X=
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
16
PONER UN CARÁCTER EN UNA COORDENADA:
sintaxis: lcd_putc(“caracter ");
Ejemplo: lcd_gotoxy(3,2);// posiciona al cursor en la coordenada x=3, y=2. lcd_putc(“*"); // “imprime” en el display el carácter asterisco.
CONSIDERACIONES DE SIGNO Y RESULUCIÓN. Formato general de salida: Sintaxis: printf(lcd_putc,“letrero o caracteres %w t ",valor1,valor2,valoretc);
El formato de salida toma la forma general %wt , donde w es opcional y puede ser de 1 a 9 para especificar la cantidad de caracteres que serán sacados, o de 01 a 09 indicando la cantidad de ceros cargados, o de 1.1 a 9.9 para datos de punto flotante. Aquí, t es el tipo y puede ser uno de los siguientes: C=Character. S=String or character. U=Unsigned int. x=Hex int (lower case output). X=Hex int (upper case output). D=Signed int.
17
e=Float in exp format. LX=Hex long int (upper case). ld=signed decimal long.
f =Float, Lx=Hex long int (lower case), lu=unsigned decimal long.
EJEMPLO: printf(lcd_putc,"DATO: %03u",i);// imprime la palabra DATO: y enseguida imprime el valor de la variable i (que puede ser por ejemplo el valor leído de un puerto o de un convertidor A/D en un formato de 3 caracteres o dígitos enteros sin signo. TECLADO MATRICIAL: En PICC el uso de un teclado matricial es muy similar a como se vió en la teoría de uso de un teclado común de 3 x 4. La diferencia aquí radica en que es factible almacenar los valores de los números tecleados y su orden o peso en forma fácil y eficiente,-al m eno s m ás f ác il q u e ens am b lad o r d i r e c t o -. Considere el ejemplo de leer un teclado numérico de 3 x 4 puesto en el puerto B, donde B0,B1 y B2 son empleados para las columnas, y de B4 a B7 para los renglones respectivos. Considere también que se pretende almacenar los valores tecleados y asumir un peso de 100 para la primer tecla presionada, un peso de 10 para la segunda y un peso de 1 para la tercera. Considere que para almacenar dichos valores debe declararse una variable en forma de array. Así, para este ejemplo la variable puede ser declarada como: 18
Y dentro del código del programa principal, se puede escribir lo siguiente: //para preguntar por 1,4,7,ó * : output_low(pin_b1);delay_ms(10); output_high(pin_b2);delay_ms(10); output_high(pin_b3);delay_ms(10); if (!input(pin_b4)) //si presiona tecla 1, {digito=digito +1;dato[digito]=1;} if (!input(pin_b5)) //si presiona tecla 4, {digito=digito +1;dato[digito]=4;} if (!input(pin_b6)) //si presiona tecla 7, {digito=digito +1;dato[digito]=7;} if (!input(pin_b7)) //si presiona tecla *, {digito=digito +1;dato[digito]=*; Enseguida, para preguntar si alguien presionó las teclas 2,5,8, ó 0, el código es muy similar al anterior, pero las condiciones de B1, B2 y B3 cambian: output_high(pin_b1);delay_ms(10); output_low(pin_b2);delay_ms(10); output_high(pin_b3);delay_ms(10); etc…., Ahora, con el valor del número tecleado almacenado en el array dato[], puede usted multiplicarlo por 1, por 10 o 100 según sea 19 necesario para representar unidades, decena o centenas.
5. FORMATO GENERAL DE UN PROGRAMA EN PICC ESTE APARTADO TIENE LA FINAL IDAD DE ESTA BL ECER LOS LINEA MIENTOS Y SINTAXIS PA RA LA EL AB ORA CIÓN DE UN PROGRA MA EN L ENGUA JE C PARA MICROCONTROLA DORES PIC DE MICROCHIP. A SÍ, LOS PA SOS G ENERA L ES A SEGU IR SON: 1.-TECLEE EL PRO GRA MA DESEA DO EN EL EDITOR DE PICC. 2.- SALVE SU PROGRAMA . 3.- EN EL NOMB RE DEL ARCHIVO, DELE CL ICK DERECHO Y SELECCIONE MA KE FILE PROJECT. Ver figu ra sig uien te. 4.- PRESIONE EL ÍCONO DE CO MPILA R Y VERIFIQUE QUE NO TENG A ERR ORES DE COMPILA CIÓN. El com pilado r d e PICC tiene en el m enú un ico no de “help” . Ve r
figu ra sigu iente. Dar click derecho y Presionar Make file project
Botón de compilación
20
FORMATO GENERAL . EJEMPLO DE UN PROGRAMA COMPLETO:
1.- COMENTARIOS:LOS COMENTARIOS SE ESCRIBEN DESPUÉS DE DOBLE DIAGONAL (//) Y PUEDEN TAMBIÉN IR A LA DERECHA DE CUALQUIER INSTRUCCIÓN. NO SON COMPILABLES. CONVIENE COLOCAR UN ENUNCIADO AL INICIO INDICANDO QUÉ HACE EL PROGRAMA Y QUÉ TERMINALES DE ENTRADA Y SALIDA EMPLEA Y PARA QUÉ. EJEMPLO: //PROGRAMA EN EL PIC 18F452 QUE LEE EL ESTADO DE 2 INTERRUPTORES Y MUEVE UN //MOTOR DE CD CONSTANTEMENTE DE UN SENTIDO A OTRO SIMULANDO UN SISTEMA DE //VIGILANCIA CON UNA CÁMARA ROTATORIA;ENTRADAS:RB0=SENSOR IZQ,RB1=SENSOR DER, //RB2=BOTÓN DE ACTIVACIÓN,RB3=BOTÓN DE PARO TOTAL;//SALIDAS:RB4=ACTIVACIÓN SMR, //RB5=ACTIVACIÓN SCMR,EMPLEANDO UN MOTOR DRIVER BA6209 Y UN MOTOR DE 12V DE CD 2.- LA INSTRUCCIÓN SIGUIENTE VA SIEMPRE AL INICIO Y DEFINE EL TIPO DE MICROCONTROLADOR A EMPLEAR. Ejemplo: #include <18f452.h> 3.- A PARTIR DE AQUÍ SE COLOCAN LAS DECLARACIONES DE LOS DISPOSITIVOS, USOS, INCLUSIONES Y TIPOS DE FUSIBLES DE PROGAMACIÓN QUE SE EMPLEARÁN DURANTE EL PROGRAMA. NO TERMINAN CON PUNTO Y COMA. PUEDEN COLOCARSE AÚN CUANDO NO SE EMPLEEN, PERO SI SE EMPLEAN EN EL PROGRAMA DEBEN DE ESTAR FORZADAMENTE. SE DESCRIBE DE PREFERENCIA A SU DERECHA UN COMENTARIO DE SUS PARÁMETROS, COMO EN EL SIGUIENTE EJEMPLO:
21
#device adc=8 //USO DE CONVERTIDOR ANÁLOGO DIGITAL DE 8 BITS. PUEDEN SER 10 BITS. #use delay(clock=12000000) //SE DEFINE EL USO DEL CRISTAL EMPLEADO EN HERTZ, //PUEDE SER DE 12000000=12MHZ, DE 4000000=4MHZ o 455000 = 455KHz.. #fuses HS,NOWDT,NOPROTECT,NOLVP //HS=FUSIBLES DE ALTA VELOCIDAD,NOWDT=NO USO DEL FUSIBLE DEL WATCH DOG TIMER, NOPROTECT=FUSIBLE DE NO PROTECCIÓN YA QUE SI SE DEJA PROTEGIDO JAMÁS SE VOLVERÁ A REGRABAR EL PIC(CUIDADO CON ESTO), //FUSIBLE ACTIVO DE NOT LOW VOLTAGE PROGRAMMING O DE NO ACTIVA LA PROGRAMACIÓN DE USO A BAJO VOLTAJE. #include // DECLARA EL USO DE UN DISPLAY TIPO LCD DE CARACTERES //UNSIGNED O SIN SIGNO. ES EL MÁS COMÚN DE LOS DISPLAYS DE 16X2. ASEGÚRESE DE //TENER ESTE ARCHIVO (lcd.c) DENTRO DEL SUBDIRECTORIO DE "DRIVERS". #use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7) // SE DECLARA EL USO DE LA UNIDAD //DE COMUNICACIÓN SERIAL TIPO RS232, DONDE SE DEFINE SU VELOCIDAD Y LOS PINES //QUE SE EMPLEARÁN PARA TRANSMISIÓN (xmit=PIN_C6) Y RECEPCIÓN (rcv=PIN_C7 ). #include //DEFINE EL USO DE LA LIBRERÍA ESTANTAR, QUE ES LA QUE //PERMITE TRABAJAR EN LENGUAJE "C" Y NO EN ENSAMBLADOR DIRECTO. #include //DEFINE EL EMPLEO DE ENTRADAS DEFINIDAS EN EL PROGRAMA. #include DEFINE EL EMPLEO DE FUNCIONES MATEMÁTICAS.
22
--CABE MENCIONAR QUE CUALQUIER INSTRUCCIÓN PUEDE CONSULTARSE EN CUANTO A SU USO Y SINTAXIS EN LA PESTAÑA "HELP" (PARTE SUPERIOR DE ESTE EDITOR) Y LUEGO EN EL SUBMENÚ LLAMADO "BUILT IN FUNCTIONS", SELECCIONANDO LUEGO LA INSTRUCCIÓN, O BIEN POSICIONANDOSE EN CUALQUIER INSTRUCCIÓN Y DAR CLICK DERECHO PARA OBSERVAR EL “HELP” . 4.- AQUÍ SE DECLARARÁN LAS CONSTANTES Y VARIABLES A USAR. SE DECLARA PRIMERO EL TIPO; ES DECIR, SI SON DE TIPO CARACTER (CHAR), DE TIPO ENTERO (INT), DEL CUAL POR CIERTO HAY VARIOS SUBTIPOS COMO EL INT16 O ENTERO LARGO, ETC. PARA CADA TIPO SE PUEDEN DEFINIR SUBGRUPOS O VECTORES, LOS CUALES SE DEFINEN CON UN PAR DE PARÉNTESIS CUADRADOS [] INDICANDO QUE LA VARIABLE ES UN VECTOR O UNA MATRIZ BIDIMENSIONAL, TAL QUE P.EJ: DATO[4] DEFINE A LA VARIABLE DATO COMO UN VECTOR DE 5 ELEMENTOS INDEPENDIENTES LLAMADOS DATO[0], DATO[1], DATO[2],DATO[3],Y DATO[4] USABLES EN EL PROGRAMA COMO 5 ESPACIOS DE MEMORIA REGISTRABLE Y MODIFICABLE PARA TRABAJAR. char datoin,entrada,hola; int i,j,k,digito,dato[4],tecleados,oportunidades,clave[4]; int vector1[4]; 5.- AQUÍ SE COLOCARÁN LAS RUTINAS DE INTERRUPCIONES QUE SE VAYAN A EMPLEAR , COMO LO PUEDEN SER LA INTERRUPCIÓN DE TRANSMISIÓN Y RECEPCIÓN SERIAL, LAS INTERRUPCIONES EXTERNAS, LAS INTERRUPCIONES DEL CONVERTIDOR ANÁLOGODIGITAL, Y TODAS LAS QUE SE USEN PARA UN PROGRAMA ESPECÍFICO.
23
TAMBIÉN SE COLOCA AQUÍ EL GRUPO DE SUBRUTINAS DE USO PROPIO (GENERADAS POR EL PROGRAMADOR SEGÚN SEAN SUS NECESIDADES), QUE SUELEN COLOCARSE CUANDO EN EL PROGRAMA SE VA A TENER LA NECESIDAD DE REPETIR EN MÚLTIPLES OCASIONES UN GRUPO DE INSTRUCCIONES. LA PALABRA RESERVADA VOID ES UNA "LLAMADA" A QUE SE GENERE YA SEA UNA SUBRUTINA DE INTERRUPCIÓN O UNA SUBRUTINA DEL PROGRAMADOR. ENTRE EL PARÉNTESIS QUE LE SIGUE A LA PALABRA VOID Y EL NOMBRE DE LA SUBRUTINA, SE COLOCAN SI SE REQUIERE UN PARÁMETRO QUE ES COLOCADO PARA REALIZAR LA INTERFASE ENTRE UNA PARTE DEL PROGRAMA Y LA SUBRUTINA. #int_rda noclear // interrupción para el uso del serial void serial_isr()// subrutina de interrupción del serial { //aqui irá lo que hará cuando detecte una int en el serial al recibir, // por ejemplo getc(). } EJEMPLO DE SUBRUTINA: void borrar()// ESTE ES PRECISAMENTE UN EJEMPLO DE SUBRUTINA GENERADA POR EL //PROGRAMADOR. LO QUE SE ENCUENTRA ENTRE LLAVES ES LO QUE EJECUTA LA SUBRUTINA //CADA VEZ QUE ES LLAMADA EN CUALQUIER PARTE DEL PROGRAMA. SI NO HAY NECESIDAD //DE USO DE PARÁMETROS DE TRANSFERENCIA, SE DEJA VACÍO EL ESPACIO ENTRE LOS //PARÉNTESIS DESPUÉS DEL NOMBRE DE LA SUBRUTINA.. EJEMPLO: void rojo() { output_high(pin_c0);output_low(pin_c1);output_low(pin_c2); } void ambar() { output_low(pin_c0);output_high(pin_c1);output_low(pin_c2); } void verde() { output_low(pin_c0);output_low(pin_c1);output_high(pin_c2); }
24
7.- AQUÍ COMIENZA EL PROGRAMA PRINCIPAL, CON LA INSTRUCCIÓN VOID MAIN() TENGA MUCHO CUIDADO EN NO OLVIDAR QUE POR CADA RUTINA, SUBRUTINA, SENTENCIA IF , SENTENCIA WHILE, SENTENCIA WAIT, SENTENCIA FOR, ETC, DEBE HABER UNA LLAVE ABIERTA Y UNA CERRADA. TENGA LA BUENA COSTUMBRE DE ESCRIBIR EL COMENTARIO DE QUIÉN ES CADA LLAVE QUE SE CIERRA. void main()// begin principal EJEMPLO DE UN PROGRAMA PRINCIPAL: void main()// begin del programa principal { configuraciones(); while(true) { if (input(pin_c5)) { rojo(); delay_ms(2000); ambar(); delay_ms(1000); verde(); delay_ms(3000); } else { apagatodo(); } }//del while }// final
25
6.- DISPLAYS LCD. Los Displays de Cristal Líquido (LCD) son muy empleados en la actualidad gracias a su facilidad de uso (al menos manejándolo en lenguajes de alto nivel), bajo consumo de energía, buen manejo de exhibición de caracteres alfanuméricos y fácil conectividad a microcontroladores. En la siguiente figura se muestran algunos tipos de LCD más comunes: LCD PARALELOS
LCD SERIAL
26
Tabla de caracteres de exhibición del LCD tipo 16X2
PDF DISPLAY LCD 16X2 TM162ABA6
27
Para un LCD en general, la descripción de sus siglas es como se muestra en la siguiente figura, colocando como ejemplo el mostrado en la página anterior. Así mismo, se exhibe la descripción de sus terminales.
28
En la figura siguiente se exhibe el diagrama de conexión de las terminales de un LCD de 16 x 2 hacia un microcontrolador PIC.
En la sección de pro gramación en PICC se analizan las instrucciones para manejar el LCD. 29
7.-MOTOR DRIVERS: BA62XX Y L293 a.- MOTOR DRIVER BA62XX: El Motor Driver o manejador de motores tipo BA, tiene 3 tipos de circuitos: el BA6209, BA6219 y BA62298. Los tres tipos son idénticos en su configuración y funcionamiento; varían en cuanto el voltaje y corrientes manejadas. Consulte de tarea sus especificaciones. El manejador de motores tipo BA, funciona como un “PUENTE H”, donde a través de la activación de transistores se logra la conducción de energía hacia el motor. Observe la siguiente figura, la cual es un puente H con transistores. Si activamos los transistores A y B, desactivando los C y D, el motor girará en un sentido. Al desactivar A y B y activando C y D, el motor girará en sentido contrario. Si desactivamos los 4 transistores el motor se apagará. La condición de “todos encendidos” nunca debe ocurrir, ya que existirá un corto circuito con la fuente de alimentación.
PDF DEL BA 6229
30
Para activar el Motor Driver o manejador de motores tipo BA, se tiene que considerar que al cambiar de giro, deben apagarse los transistores que estaban activos y dejar un “tiempo muerto” antes de activar el otro par de transistores, ya que los transistores no se apagan de forma inmediata. Con unos 10 milisegundos de tiempo muerto entre activaciones es suficiente. En la figura siguiente se observa una configuración típica del BA6229 para controlar el sentido de giro de un motor de CD de 12 o 24 volts a 1 Ampere. En las terminales A y B se controla digitalmente el sentido de giro, de acuerdo a la tabla que se muestra. Este circuito está protegido ante la condición A=1 y B=1, que no es posible en el puente H tradicional, como ya se explicó. La terminal 4 de éste circuito puede ser usada para regular la velocidad del motor, ya que es la terminal de control de voltaje de salida. Esta puede colocarse a través de un potenciómetro como divisor de voltaje, a través de un zener (voltaje de salida fijo a VZ), o a través de un circuito de Modulación por Ancho de Pulso (PWM).
BA6229
A 0 0 1 1
B 0 1 0 1
MOTOR MOTOR MOTOR MOTOR MOTOR
1 2 3 4 5 6 7 8 9 10
Resistencia de disipación 47Ω 5W
A B
Terminal de control de voltaje Terminales de control de giro
+ 0.1uF
+ 0.1uF
+12v +12v
+12v
Motor o carga 31