M ikroE ikroElec lectt ron ika
Pro gram a ció iónn d e M ic icrr o co n t r o lado ladorr es PIC en M ikro Ba sic Nebojsaa M atic Nebojs Trad raducc ucció iónn al españo españo l po r Roger Guachall uachallaa Narv áez
[email protected]
2008 Ed ició iciónn en línea www.mikroe.com
Pro gram and andoo m ic icro ro co nt ro lado res PIC en BASIC BASIC Tabla de cont cont enidos Prefacio Capít apítulo ulo 1: Lo básico básico Capítulo 2: Elem Elem ent os de lenguaje Basic Basic Capituló 3: Operadores Capituló 4: Es Estr ucturas de cont rol Capítulo 5: Rut Rut inas incor incor por adas y de libr ería (NO TRADUCIDO) Capítulo 6: Ejem Ejem plos con per ifér icos int egrados PIC PIC Capit uló 7: Ejem Ejem plos para desplegar desplegar dat os Capí apítu tu lo 8: Ejemp Ejemp los con m emo ria y medios de almacenamient o Capituló 9: Ejemp Ejemp los de com unicac unicación ión (INCONCLUSO) Apénd ice A: IDE de m ikroBasic
Prefacio Para simplificar las cosas y eliminar algunos prejuicios, me permitiré darte algunos consejos antes de leer este libro. Deberías empezar leyendo desde el capítulo que más te interesa, en cualquier orden que encuent res convenient convenient e. A m edida que p asa asa el t iemp o, lee las partes que p uedes neces necesitar itar en el momento exacto. Si algo empieza a funcionar sin que tú sepas exactamente como, no debería m olestart olestart e demasiado. demasiado. De todas form as, as, es m ejor q ue tu pro grama tr abaje a que n o lo haga. Siemp re m antent e en el lado práctico de la vida. Es mejor ter m inar la aplicaci aplicación ón a t iem po, que sea confiable y, por supuesto, que se te pague lo m ejor po sible. En ot ras palabras, palabras, no imp ort a sisi la m anera exacta exacta en qu e los electrones electrones se se m ueven dent ro d e la unión PN, escapa a tu conocimiento. No se supone que sepas toda la historia de la electrónica para que puedas as asegurar un ingreso para ti o tu fam ilia. ilia. No esperes encontr ar tod o lo que necesitas necesitas en un solo libro. La información está dispersada literalmente en todo lugar alrededor nuestro, así que es necesario necesario coleccionar la y orden arla diligent e y cuid cuid adosamen te. Si Si haces esto, el éxito es inevit able. Tengo to da la esperanz esperanzaa de haber hecho algo que valga la la pena para que tú inviertas t u t iemp o en ello. Atentamente Nebojsa Nebojsa M atic Traducido y revisado revisado po r: Ing. Roger Roger R. Guachalla Nar váez
[email protected] Septiem br e – 2008 La Paz – Bolivi Bo livi a
Capit ul ulóó 1: l o b ás ásic icoo Introducción 1.1 ¿Por ¿Por qu é Basic? Basic? 1.2 Es Escogiendo el PIC adecuado para la t area 1.3 Una palabra acerca de la esc escrit rit ura de cód igo 1.4 Es Escribiendo y com pilando t ú pro grama 1.5 Carga Cargando ndo un p rograma al m icrocontro lador 1.6 Hac Haciendo iendo correr u n program a 1.7 Resolviendo errores
Introducción La simplicidad y facilidad que traen los lenguajes de programación de alto nivel, así como las amplias aplicaciones con microcontroladores hoy en día, fueron las razones para estimular a algunas compañías para ajustar y mejorar el lenguaje de programación BASIC y así acomodar mejor sus necesidades de programación. ¿Qué es lo que nosotros obtuvimos? Principalmente, que el desarrollo de aplicaciones es más rápido y más fácil con todas las rutinas predefinidas que trae el Basic, siendo que la programación en lenguaje ensamblador tomaría muchísimo más tiempo. Esto permite al programado r concentrarse en resolver resolver las tareas im port antes sin sin perder su tiem po en, por ejemp lo, el código para im prim ir en un display LC LCD. Para evitar cualquier confusión en el texto, necesitamos clarificar algunos términos que estaremos usando usando fr ecuentem ente a lo largo largo del libro: es un conjunto de comandos y de reglas con las cuales escribimos el programa. Existen varios lenguajes de programación como ser BASIC, C, Pascal, etc. Existe mucha información del lenguaje de programación BASIC en Internet, por lo que nos enfocaremos especí específica ficam m ente en la programación de m icrocontr oladores. oladores.
Lenguaje de Programación
es una secuencia de comandos escritos en un lenguaje de programación que el microcontrolador ejecuta uno después de otro. El Capítulo 2 trata con la estructura de un programa Basic Basic en det alle. Programa
es un p rogram a que corre en la com com put adora y su tarea es tr aducir el código original Bas Basic en un lenguaje de ceros y unos que puede ser introducido al microcontrolador. El proceso de tr aducción aducción d e un pr ograma Basic Basic a un código ejecutable HEX HEX* * * ( 1 ) se muestra en la figura inferior. El program a escrito escrito en BASIC BASIC y grabado con el nom bre program.pbas es traducido por el compilador al código ensamb ensamb lador ( program.asm ). El El código ensamblador generado luego es traducido en un código ejecutable HEX HEX que puede ser ser escrit escrit o a la m emo ria del m icrocontro lador. Compilador
es un dispositivo que usamos para transferir nuestros archivos HEX desde el computador hacia la m em oria del m icrocontro lador. Programador
Estrictam ente h ablando el archivo HEX no es código en lenguaje máquina sino un archivo ASC ASCII en un f orm ato estándar * * * ( 1 ) Nota del traductor : Estrictam del cual los circuitos Programador Programador es extraen el código ejecutable.
1.1 ¿Por ¿Por qu é Basic? Basic? Originalmente creado como una herramienta de fácil uso, BASIC se hizo popular en computadoras hogareñas en los 1980s, y se mantiene popular hoy en día en varios dialectos altamente evolucion ados. El El nom bre BASIC BASIC,, de acuer acuer do a un a tr adición cient ífica com put acional viene de la sigla, sigla, Beginner's All-purpose Symbolic Instruction Code (Código de Instrucciones Simbólicas de Propósito General para Principiant es). es).
BASIC sigue siendo considerado por muchos usuarios de PC como el lenguaje de programación más
fácil de usar. Hoy en día, esta reputación está siendo ampliada al mundo de los microcontroladores. BASIC BASIC perm ite u n desarro llo m ás rápido y f ácil de las aplicaciones aplicaciones para PIC PIC com parado con el len guaje ensam ensam blador de M icrochip icrochip M PASM ASM . Cuando Cuando se escribe escribe código para los M CUs (microcontr oladores), oladores), los programadores frecuentemente tratan con las mismos tareas, como ser comunicación serial, im presión en d isplays isplays LC LCD, generación de señales PW M (m odu lación lación de ancho d e pu lso), lso), etc. Con Con el propósito de facilitar la programación, BASIC provee un número de librerías y rutinas incorporadas destinadas a resolver estos prob lem as. as. En lo refer ente a la velocidad velocidad de ejecución ejecución y el t amaño de program a, M PASM ASM t iene una pequeña vent aja con respecto del Basic. Basic. Es Esa es la razón razón para qu e exist exist a una o pción d e com binar BASIC BASIC y código ensamblador - el ensamblador es usado comúnmente para partes del programa cuya ejecución de tiempo es crítica o siendo que los mismos comandos son ejecutados un gran número de veces. Los m icrocont icrocont roladores m odern os como ser el PIC, PIC, ejecutan instrucciones en en un solo ciclo. ciclo. Si Si el reloj de u n m icrocont icrocont rolador es de 4 M Hz, Hz, enton ces una instrucción instrucción en ensamblador requiere 250 n seg x 4 = 1 µseg. Ya Ya que cada com ando Basic Basic es t écnicament e una secuencia de inst ru cciones cciones en ensam blador , el tiem po exacto necesario necesario para su su ejecución ejecución puede ser ser calculado calculado sim sim plement e sumando los tiempo s de ejecución de las instru cciones cciones en ensamblad or.
1.2 Es Escogiend o el PIC adecuad o p ara la t area Actualmente, las mejores opciones para el desarrollo de aplicaciones usando Basic son: el famoso PIC16F84, su nuevo reemplazo el PIC16F628A, los PIC PIC16F87x, PIC16F62x y PIC18Fxxx. Estos controladores tienen memoria de programa incorporada con tecnología FLASH que proveen un borrado y repr ogramación rápida, rápida, permit iendo así así una depuración tamb ién rápida. rápida. M ediante un sim sim ple clic del ratón en el software de programación, el programa del microcontrolador puede ser borrado instant instant áneament e y luego recargado recargado sin sin rem over el chip. Tam bién el program a que ha sido sido grabado en la memoria flash permanece después de quitar la energía. Además de la memoria de código flash, los microcontroladores de las series PIC16F87x y PIC16F6x, también poseen entre 64 a 256 bytes de m emo ria EE EEPROM intern a, que puede ser usada usada para guardar guardar dat os del programa y ot ros parámet ros cuando la energía est est á apagada. BAS BASIC IC t iene in stru cciones cciones de lectur a y escrit escrit ura d e EE EEPROM que pued en ser usadas para cargar cargar y guardar dat os al EE EEPROM . Familias de microcontroladores PIC más antiguas (12C67x, 14C000, 16C55x, 16C6xx, 16C7xx, and 16C92x) 16C92x) tienen me m oria de program a basada basada en tecnología tecnología EP EPROM / ROM , de m anera tal que pued en ser pr ogramadas solament solament e una vez (versión (versión OTP con m emo ria ROM ROM ) o t ienen una vent ana de vidrio (versión (versión con m em oria EE EEPROM ) que perm iten el bo rrado a t ravés de unos cuant cuant os minu to s de exposición a luz UV (ultravioleta). Las versiones OTP son usualmente más económicas y son elegidas para la fabricac fabricación ión en serie de pr oducto s ter m inados. inados. Para poder tener una información completa acerca de un modelo específico del microcontrolador en una aplicación, aplicación, debes obtener su hoja de d atos (Datasheet) (Datasheet) de la página página web www.microchip.com. Los ejemplos de programas desarrollados a lo largo del libro están diseñados para correr en microcontroladores PIC16F84 o PIC6F877, pero con ajustes menores, pueden ser ejecutados en cualquier otro microcontrolador PIC.
1.3 Una p alabra acerca acerca de la esc escrit ur a de código Técnicamente, cualquier editor de texto que pueda grabar un archivo como texto ASCII puro (sin símbolos especiales para el formato) puede ser usado para escribir tu código BASIC. Aún así, no hay necesidad de hacerlo "a mano" — existen entornos especializados que se ocupan de la sintaxis del código, código, la m emo ria libre y p roveen t odas las las herram ientas neces necesarias arias para escribir escribir un program a. El IDE (entorno de desarrollo integrado) de mikroBasic incluye un editor de código altamente configurable, diseñado para satisfacer las necesidades de usuarios novicios o experimentados. El uso de color para sintaxis, plantillas de código, asistentes de código y parámetros, autocorrección para errores com com unes, y ot ras opciones proveen un ent orno cóm odo para escribir escribir un pro grama. Si tú no has tenido experiencia previa con IDEs avanzados, de seguro te preguntarás que hacen los asistentes de código y de parámetros. Estas son utilidades que facilitan la escritura de código. Por ejemplo, si escribes la primera letra de una palabra en el editor de código y luego presionas CTR TRLL+SPA +SPACCE, t odo s los ident ificador es que con cuerdan con las letr as que escribiste aparecerán en un panel flotante. Puedes seguir escribiendo para reducir las opciones, o puedes seleccionar uno de la lista lista u sando sando las t eclas de dir ección y Ent Ent er. En combinación con la ayuda comprensiva, herramientas integradas, extensas librerías, y el Explorador de Código Código (Code (Code Explorer) Explorer) el cuál te p erm ite m onit orear fácilm fácilm ente los ítem ítem s de t u pro grama, todas las las her ram ient as necesarias necesarias est est án a tu disposición.
1.4 Es Escribiend o y comp ilando t ú pr ograma El prim er paso es escribir escribir el código. Cada Cada archivo archivo f uent e es grabado grabado en un archivo de t exto único qu e tiene la extensión extensión .pbas. Aquí tienes un ejem plo de un programa sim ple en BASIC BASIC,, blink.pbas . program LED_Blink main: TRISB = 0 bucle: PORTB = $FF Delay_ms(1000) PORTB = 0 Delay_ms(1000) goto bucle
' Configurar los pines del PORTB como salida ' ' ' ' '
Encender los leds en el PORTB Esperar 1 segundo Apagar los leds en el PORTB Esperar 1 segundo Regresar al bucle infinito
. end
Cuando el pro grama está com com pletado y ha sido sido grabado com o un archivo .pbas, puede ser ser com pilado haciendo un clic en el icono de comp ilación (C (Com pile Icon) Icon) (o sim plem ent e digitand o CTR CTRLL+F9) +F9) en el IDE de m ikro Basic. Basic. El pro cedim ient o de com pilación ocur re en dos pasos pasos consecutivo consecutivo s: 1. El compila compilador dor convertirá convertirá el arc archivo hivo .pbas al código ensamb ensamb lador y lo grabará como blink.asm
2. Entonces, ntonces, el comp comp ilador ilador autom áticam áticam ente llamará al al ensamblador, ensamblador, que convierte convierte el archivo archivo .asm a un código ejecutable HEX HEX list list o para ser ser pro gramado en el m icrocontro lador. En realidad no se puede ver la diferencia entre los dos pasos, ya que el proceso es automático e indivisible. En caso de tener errores de sintaxis en el código del programa, este no será compilado y el archivo HEX no será generado. Los errores deben ser cor regidos en el archivo original .pbas y luego el archivo archivo f uent e debe ser compilado ot ra vez. vez. La La técnica más recom endada es escribir escribir y pr obar part es lógicas pequ eñas de un pr ogram a para hacer hacer la dep uración m ás sencilla.
1.5 Carga Cargando ndo u n pro grama al m ic icro ro cont ro lador Como resultado de una compilación exitosa del código anterior, mikroBasic generará los siguientes archivos: blink.asm blink.asm -archivo -archivo ensam ensam blador blink.lst -archivo del listado blink.mcl -librería de com pilación pilación m ikro blink.hex -archivo -archivo ejecutable que es escrito escrito en la mem oria del m icrocontro lador El archivo M CL (mikro comp ile library) es creado para cada mó dulo q ue hayas incluido en el p royect o. En el proceso de compilación, los archivos .mcl serán enlazados para generar los archivos de salida .asm .asm , .lst .lst y .hex. Si Si deseas distribuir tu m ódulo sin dar a conocer el código fuent e, puedes enviar su librería com com pilada (con (con la extensión extensión de archivo .m cl). cl). Ento Ento nces ot ro u suario p odrá u sar tu librería como si tuviese el código fuente. Aunque el compilador es capaz de determinar qué rutinas están im plement adas en la librería, es una práctica común proveer los prot ot ipos de las rut inas en un archivo de text o separado. separado. El archivo HEX HEX es el qu e necesit necesit as para pr ogram ar al m icrocon t ro lador . Com Com únm ent e, el archivo HEX HEX se genera usando usando un estánd estánd ar de 8 bit s en en fo rm ato Intel HEX, HEX, que es aceptado aceptado p or un a gran mayoría del soft w are de programación. El El dispositivo dispositivo d e program ación ación (Program (Program ador) con un sof sof tw are de interf ace ace instalado en el PC PC está a cargo cargo d e escribir escribir los conte nido s físic físicos os del archivo HEX HEX en la m em or ia int erna del m icrocontro lador. Los Los cont cont enidos del archivo blink.hex se ven abajo : •
•
•
•
:100000000428FF3FFF3FFF3F031383168601FF30A5 :10001000831286000630F000FF30F100FF30F2005E :10002000F00B13281A28F10B16281928F20B1628A2 :10003000132810281A30F000FF30F100F00B2128AF :100040002428F10B21281E284230F000F00B26282E :1000500086010630F000FF30F100FF30F200F00BB7 :1000600032283928F10B35283828F20B3528322868 :100070002F281A30F000FF30F100F00B4028432801 :10008000F10B40283D284230F000F00B45280428B1 :100090004828FF3FFF3FFF3FFF3FFF3FFF3FFF3F3E :02400E007A3FF7 :00000001FF
Además de cargar el código de programa en la memoria de programación, el Programador también configur configur a el microcontr olador destino, incluyendo el tipo d e oscila oscilador, dor, las prot ecciones ecciones de la la mem oria contra las lecturas lecturas,, el tem porizador porizador perro guardián guardián ( watchdog timer ), etc. La La siguient siguient e figura m uestr a la conexión conexión en tr e el PC, PC, el Programado Programado r y el M CU.
Te en cuenta qu e el soft soft w are de pro gramación gramación debe ser usado usado solament solament e para la comunicación comunicación con el disposi dispositivo tivo Program Program ador — no está diseñado diseñado p ara escritu escritu ra de código.
1.6 Hac Haciendo iendo corr er un pro grama energía , Para el funcionamiento apropiado de microcontrolador, es necesario proveer una fuent e de energía u n oscilador , y un circuito d e reset .
La fuente puede ser construida con un rectificador diodo puente simple juntamente con un regulador de voltaje LM LM 7805 tal y com o se muestra en la figura de abajo
El oscila oscilador dor puede ser un cristal cristal d e 4 M Hz y 2 capacitores capacitores de 22 pF. pF. La La t asa asa de f uncionamient o del m icrocont icrocont rolador , es decir la velocida velocidadd a la cual el programa corre, depend e altament e de la frecuencia del oscilador. Durante el desarrollo de una aplicación, la cosa más sencilla de hacer es usar el circuito de reset interno — el pin M CLR se conecta a +5V a tr avés de una resisten resisten cia de 10K. 10K. La La figura in fer ior m uestr uestr a el es esquem a de una configuración configuración m ínim ínim a para la operación de un m icrocont icrocont roladorPIC roladorPIC.
Para ver los efectos efectos del program a BLINK, BLINK, la resistencia y el di odo LED LED están conect ada s al pin RB7 RB7 del uerto B
Después de conectar la energía eléctrica en el circuito mostrado, en microcontrolador PIC debería hacer par padear al diodo LED LED cada segund segund o. Si Si el LED no parp adea ent onces revisa la siguient siguient e sección sección del libro libro .
1.7 Res Resolvi olvi end o erro res Existen algunos problemas comunes encontrados a la hora de hacer funcionar un microcontrolador PIC. Necesitas revisar que los componentes externos estén funcionando y revisar si sus valores corresponden a los requeridos y finalmente ver si todas las conexiones están correctas. Te presentaré algunas not as que pu edes encont rar út iles. iles. •
•
•
•
•
Revisa si si el pin M CLR está cone ctado a +5V, a tr avés de la resistencia de 10 K. Si el pin se deja desconectado, desconectado, estará estará en un nivel " flot ante" y pu ede qu e funcione algunas veces pero usualmen te no lo hará. El chip tiene un circuito de reset al encendido (power-on-reset), de manera tal que la resistencia pull-up en el p in M CLR debería ser ser suficiente. Revisa evisa si la conexión con el o scilador scilador es estable. estable. Para la mayor ía de los micro contr oladores es adecuado adecuado comenzar con una frecuencia de 4 M Hz. Hz. Revisa la fuente de energía. Los microcontroladores PIC consumen muy poca energía pero la fuente tiene q ue estar bien filt rada. A la salida salida del rectificador, la corrient e es directa per o pued e ser ser pulsante, y de esta form a no es convenient convenient e para dar energía al micro contro lador. Para Para evitar la pulsación, pulsación, coloca un capacitado capacitado r electr olítico con u na capacitada capacitada alta (470 uF) a la salida salida del rect ificador. Si el m icrocontr olador PIC supervisa supervisa dispositivos dispositivos que requieren m ucha energía, energía, ésto ésto s pueden p rovo car car un mal funcionamiento en las líneas de energía y causar que el microcontrolador empiece a comp ort arse de una fo rm a extraña. Aún Aún u n display de siete siete segment os puede inducir caídas caídas de t ensión (el peor caso caso es cuando t odos los leds del display están están en cendidos), si si es que la fu ent e no es capaz capaz de prod ucir la corr corr iente necesaria necesaria (por ejem plo si estam estam os alim alim entand o el circuito con una batería de 9 V). V). Algunos Algunos m icrocontro icrocontro ladores tienen pines I/O m ultifuncionales ultifuncionales * * * ( 2 ) , por ejemplo la familia PIC16F62x (PIC (PIC16F 16F628A). 628A). Los Los m icrocontr oladores de esta f amilia están p rovistos con comp rador es análogos análogos en el puerto A. Después de poner estos chips en funcionamiento, el puerto A está configurado en el modo análogo, lo que trae un comportamiento inesperado en las funciones de los pines de este puerto. Cuando se hace hace un reset, cualquier pin que t enga entr adas análogas ingresará ingresará al m odo análogo (si (si los m ism ism os pines son son u sados sados como líneas digitales ésto ésto s necesitan necesitan ser configurado s en en el m odo digital). Una fuente posible de errores es que el quint o pin d el puerto A (RA4) (RA4) exhibe exhibe un comport amiento singular ingular
•
•
•
cuando se usa usa como salida, debido a que este pin t iene salida salida open collecto r en vez del estado estado bipo lar usual. Esto implica que si apagamos este bit irá al nivel bajo, pero si encendemos el pin éste estará flot ando en vez de ir al nivel alto. Para que el pin se com com por te de m anera esperada, se debe colocar una resistencia resistencia pull-up entr e RA4 RA4 y +5V. El El valor d e la resisten resisten cia está está ent re 4.7K y 10K dependiendo de la corrient e necesa necesaria ria para entrada en esta esta for m a, el pin funciona como cualquier o tro p in de entr ada. M uchas uchas veces veces el pr oblema no radica en el hardware sino en el softw are. Siempre Siempre depura t us programas paso a paso, revisando que los valores de las variables son las esperadas. Recuerda que si bien el comp ilador t e avisa avisa acerca acerca de los erro res de sintaxis, sintaxis, los erro res de sem sem ántica (es decir “ de significado” ) solo pu eden ser detectados por simulación. Un programa bien comentado vale por dos. Es fácil recordar el algoritmo utilizado cuando el programa es pequeño o si lo revisas nuevamente después de un par de días. Sin embargo cuando mires tu programa después de un par de meses y si este ronda por algunos cientos de líneas, entonces agradecerás agradecerás haber coment ado las part part es relevant relevant es de tu código. Cuando empieces a realizar proyectos “serios”, comienza por un diagrama en bloques, especificando clarament e la asignac asignación, ión, nom bres y función de lo s pines de I/ O. A cont cont inuación realiza un d iagram iagram a de flujo general. Finalmen Finalmen te codifica el pro grama en lenguaje BASIC BASIC..
Más problemas aparecerán si planificas trabajar con los PICs de manera seria. Algunas veces parece que el programa va a funcionar pero no lo hace sin importar cuántas veces los revises. Sólo recuerda que existe más de una forma para resolver un problema, y que un algoritmo distinto puede ser la solución. Recuerda Recuerda la ley de M urph y "si algo algo puede salir salir m al, norm alment e saldrá saldrá m al" qu e ha aplicado aplicado al campo campo de los microcont rolador es diría "si "si un pr ograma corre la prim era vez, vez, algo algo está mal" * * * ( 2 ) PIC 16F628A Puerto B:
Este modelo e s el reemplazo directo del PIC16F84 PIC16F84 (comparten el mismo pat illaje). Tiene 16 bit de I/ O (Puertos A y B).
Posee resistencias pull-up internas Activar pull-u p: OPTION_RE OPTION_REG.NOT_R G.NOT_RBP BPU=0 U=0 Desactivar Desactivar pull-u p: OPTION_RE OPTION_REG.NOT_R G.NOT_RBPU=1 BPU=1 (valor por omi sión) • •
Puerto A:
RA0, RA1, RA2, RA2, RA3: Pines Pines de d oble f unción : Comparador analógico (AN0, AN1,AN2,AN3) AN1,AN2,AN3) valor por omisión d espués de un Reset Reset Pines Pines de I/O: desactivar desactivar el comparador (CM (CM CON = 7) RA4: Pin de I/O de salida salida en en drenaje abierto (Opendrain): para su funcionam iento requiere una resistencia resistencia (10k) a +5V) +5V) y además además funciona con LOGICA NEGADA. (0=5v, 1=0v) Ver el Circuito ejemplo . RA5: RA5: Pin de doble fu nción: _M CLR o Rese t (Conf (Co nf igur ig ur ar en De vi ce Fl ags : M CLRE_O CLRE_ON) N) puer to d igital de ENTRADA solame nte (Conf igurar en Device Flags: Flags: M CLRE CLRE_OFF _OFF).). RA6,RA7: RA6,RA7: Pines de dob le funció n: Entr ada y Salida Salida d e Reloj (clock) Pines de I/O: Habilitar el oscilador interno sin salida de reloj (Configurar en Device Flags: INTRC_OSC_NOCLKOUT). El oscilador interno, en base a una Resistencia y un Capacitor, tiene una frecuencia de 4MHz. La precisión del RC interno NO es buena y no es recomendable para aplicaciones aplicaciones que requiere un cálculo de t iempo estable. • •
•
• •
• •
VCC
U1
VCC 16 15
R1 10k
4
RA7/OSC1/CLKIN
RA0/AN0
RA6/OSC2/CLKOUT
RA1/AN1
RA2/AN2/VREF RA5/MCLR
RA3/AN3/CMP1 RA4/T0CKI/CMP2
RB0/INT RB1/RX/DT Reset
RB2/TX/CK RB3/CCP1 RB4 RB5 RB6/T1OSO/T1CKI RB7/T1OSI PIC16F628A
17 18
R2
1
10k
Circuito ejemp lo:
2 3 •
6 7 8 9
R3
•
330
10 11
Led
12 13
D1 VCC
Pin RA4 RA4 com o salida digital con lógica negada. Pin RA5 RA5 com o Reset
Capit ul uloo 2: Elem Elem ent os del lenguaje l enguaje BASIC BASIC Introducción 2.1 Identificadores 2.2 Operadores 2.3 Expresiones 2.4 Instrucciones 2.5 Tipos Tipos de dat os 2.6 Constantes 2.7 Variables 2.8 Símb Símb olos 2.9 Directivas 2.10 Com Com entar ios 2.11 Et Et iquetas 2.12 Procedim Procedim ientos y Funciones 2.133 Mód ulos 2.1
Introducción Este capítulo tiene que ver con los elementos del lenguaje BASIC y las formas para usarlos eficient eficient em ent e. Apren Apren der a program ar no es com plicado, plicado, pero se requiere habilidad y experiencia experiencia para escribir escribir código que se eficiente, legible, legible, y fácil de m anejar. Ante t odo, se supone supone que el p rograma deb e ser comp rensible, rensible, de manera t al que el mismo program ador, o alguien alguien m ás que está trabajando en la aplicación aplicación , pueda realizar las corr ecciones y/ o m ejor as necesarias necesarias.. Te Te pro veo un cód igo ejem plo escrit o de m anera clara clara y ordenada para dart e una idea de cóm o deb erían erían escribirse escribirse los programas: programas: '****************************************************************************** ' Microcontrolador : P16F877A ' ' Proyecto: Led_Blinking (leds parpadeando) ' Este proyecto esta diseniado para trabajar con el PIC 16F877A ' con ajustes menores, debería trabajar con cualquier otro MCU PIC ' ' El codigo muestra diodos leds parpadeando conectados al PORTB ' Los diodos se encienden y apagan cada segundo '******************************************************************************
program LED_Blinking main: TRISB = 0 PORTB = %11111111 Delay_ms(1000) PORTB = %00000000 Delay_ms(1000) goto main
end.
' ' ' ' ' ' ' '
Inicio del programa Configurar los pines del PORTB como salida Encender los leds del PORTB Esperar 1 segundo Apagar los leds del PORTB Esperar 1 segundo Bucle infinito Final del programa
A través del uso adecuado de comentarios, símbolos, etiquetas y otros elementos usados en BASIC, el programa puede generarse de manera más clara y entendible, ofreciendo al programador una gran ayuda. También es aconsejable dividir programas grandes en entidades lógicas separadas (como ser rutinas y m ódulos) que p ueden ser usadas usadas cuando cuando se las necesi necesite. te. Es Esto tam bién increm enta la reu sabilidad del código. Los nombres de las rutinas y etiquetas que indican un segmento del programa deberían tener un sentido común. Por ejemplo, un segmento de programa que intercambia (swap) los valores de 2 variables variables,, podría tener el nom bre “ Sw ap” , etc.
2.1 Ident ifica ificador dor es Los identificadores son nombres usados para referenciar valores almacenados, tal como variables y constantes. Cada programa, módulo, procedimiento o función debe estar identificada (de ahí el nom bre) por un identificador. identificador. Un ident ificador ificador válido: 1. Debe empezar empezar con una letra letra del alfabeto alfabeto Ingles Ingles ó con el carác carácter ter ‘subrayado’ ‘subrayado’ ( underscore underscore ) ( _ ) 2. Consiste onsiste de carac caracteres teres alfanum alfanum éricos y el underscore underscore ( _ ) 3. No puede puede contener contener carac caracteres teres especi especiales ales:: ~ ! @ # $ % ^ & * ( ) + ` - = { } [ ] : " ; ' < > ? , . / | \
4. Puede ser ser escrito escrito en una m ezcla ezcla de mayúsculas mayúsculas// m inúsculas inúsculas ya que el BAS BASIC IC no los diferen cia (case (case insensitive); insensitive); ej. Primero , PR PRIM ERO, prim ero, pRiM pRiM eRo eRo r epresentan a 1 ú nico iden tifi cador.
Los elementos que son ignorados por el compilador incluyen espacios, nuevas líneas, y tabulaciones. Todos estos elementos son conocidos colectivamente como “espacio en blanco”. El espacio en blanco sirve únicament e para hacer el código m ás legible legible – no tiene n ingún efecto sobre la compilación. Algunos identificadores están reservados en BASIC, lo que significa que no los puedes usar como tus propios identificadores (ej. Las palabras function, byte, if, etc.) Para Para más inform ación, por f avor Referencia Rápida p ara el lengua je Basic Basic (Quick Reference Reference Guide for Bas Basic ic langu age) revisa la Guía de Referencia de MIKROBASIC. También, BASIC tiene un número de identificadores predefinidos que están listados en el Capítu Capítu lo 4: Instru ccion ccion es. es.
2.2. Operador Operador es El lenguaje BASIC posee un conjunto de operadores que son usados para asignar y comparar valores, además de realizar otras operaciones. Los objetos manipulados para este propósito se llaman oper andos (los cuales cuales a su vez pued en ser variables, constant es, u ot ros elemen to s). s). Los operado res en BAS BASIC IC deben t ener p or lo m enos dos operand os, con la excepción excepción d e los operado res unitar ios. ios. Los operador es sirven sirven para crear expresiones expresiones e instrucciones que comp onen el pr ograma. Existen xisten cuatr o t ipos de o perad ores en BASIC BASIC:: 1. 2. 3. 4.
Oper Operad adore oress aritmétic aritméticos os Opera Operadore doress boole booleaanos Operad Operadores ores Lógic ógicos os (bit (bit a bit) Operadores Operadores relacio relacionales nales (Operadore (Operadoress de com com paración) paración)
Los operado res son son exp licados licados en det alle en el capítu capítu lo 3.
2.3 Expresiones Una expresión es una constr ucción qu e ret or na un valor . La La sint sint axis de BASIC BASIC te r estrin ge a expresiones de una sola línea, donde el carácter ‘Retorno de Carro’ (carriage return) marca el final de la expresión. Las expresiones m ás sim ples son variables y const const ant es, m ient ras que expresiones m ás com plejas pueden ser construidas de expresiones más simples usando operadores, llamadas a función, índices, y asignaciones asignaciones de ti po (typ ecast ecast s). s). Aquí t ienes una expresión simp le:
A = B + C
' Esta expresion suma los valores de las variables B y C ' y almacena el resultado en la variable A.
Necesitas prestar atención a que la suma debe estar dentro del rango de la variable A para evitar el rebalse (overflow) y el error computacional evidente. Si el resultado de la expresión es de 428, y la variable A es del tipo byte (con un rango de 0 a 255), el resultado obtenido será de 172, que es obviam obviam ente erróneo.
2.4 Instr Instr ucc uccion ion es Cada inst inst rucción d et erm ina una acción acción a ser ser realizada. Com Com o un a regla, las instr ucciones se ejecut ejecut an en el orden exacto en e l cual fueron escritos en el pro grama. Sin Sin em bargo, el orden de su ejecución ejecución pu ede ser cambiada m ediante saltos, saltos, llamadas a rut inas, inas, o una in terr upción.
if Tiempo = 60 then goto Minuto
' Si la variable Tiempo es igual a 60, ' entonces saltar a la etiqueta Minuto
end if
La instrucción if..then contiene expresión Time = 60 compuesta de dos operandos, la variable Tiempo, la constant constant e 60 y el operador de com paración paración (=). (=). Generalm Generalm ente, las instr instr ucciones ucciones pueden ser divididas en instrucciones condicionales (toma de decisiones), bucles (loops) (bloques repetitivos), saltos (ju m ps), e instrucciones instrucciones incorpor adas (built-in) (ej. Para acceder a los periféricos del microcontrolador). El conjunto de instrucciones esta explicado en detalle en el Capítulo 4: Instrucciones.
2.5 Tipo Tipo s de Dat os El tipo determina el rango permitido de valores para una variable, y además que operaciones se pueden realizar realizar con estas. estas. También También determ ina la cantid cantid ad de m em oria u sada para cada cada instancia de esa variable. Los tipos de dat os sim sim ples incluyen: Tipo
Tamaño
Rango de valores
byte
8-bit
0 .. 255
char***
8-bit
0 .. 255
word
16-bit
0 .. 65535
short
8-bit
-128 .. 127
integer
16-bit
-32768 .. 32767
longint
32-bit
-2147483648 .. 2147483647
* * * char puede ser tratada como un b yte en to do aspecto. aspecto.
Los tip os estr estr uctur ados incluyen: Arreglo (Array) , que representan una colección indexada de elementos del mismo tipo, a menudo
llamado t ipo base. El t ipo base puede ser cualquier cualquier t ipo simp le. secuencia de caracteres. Es Es un ar reglo qu e cont iene caracteres y el Cadena (String) que rep resent a una secuencia prim er element o de la cadena cadena mant iene el núm ero de caracteres caracteres de est est a (m (m áxim áxim o núm ero es de 255). El signo es un atributo importante de los tipos de datos, y afecta la forma en la que la variable es tratada por el com pilador. pilador. Las variables sin sin signo signo (un signed signed ) pueden cont ener el siguient e rango de nú m ero s:
byte word
0 .. 255 0 .. 65535
Las variables con con signo pueden co nt ener nú m eros positivo s y negativo s: short integer longint
-128 .. +127 -32768 .. +32767 -2147483648 .. +214748364
2.6 Con Con st ant es Constantes son datos cuyo valor no puede ser cambiado durante el tiempo de ejecución (runtime). Cada constante constante se declara declara usando usando u n nom bre ún ico que debe ser un ident ificador ificador válido. Una buena pr áct áct ica consist consist e en escribir escribir l os nom br es de constant es en m ayúsculas. ayúsculas. Si usas usas frecuent em ente el m ism ism o valor fijo a lo largo del program a, deberías deberías declararlo declararlo com o constante (por ejemplo, si el máximo número permitido es 1000). Esto constituye una buena práctica ya que el valor puede ser cam cam biado sim sim plem ente m odificando la declaración, declaración, en vez de ir a lo largo de t odo el program a y ajust ajust ando cada ocurrencia ocurrencia m anualment e. Es Es tan simple com o: const MAX = 1000
Las constantes pueden ser declaradas en forma decimal, hexadecimal o binaria. Las constantes decimales se escriben sin ningún prefijo. Las constantes hexadecimales comienzan con un signo $, m ient ras que las binar ias lo hacen con el signo signo %. const A = 56 const B = $0F const C = %10001100
' 56 decimal ' 15 hexadecimal ' 140 binario
Es impor tant e ent ender p orqu e las constantes deben ser usadas usadas y como est est o afecta al M CU. El El usar una constant constant e en un program a no consume consume m em oria RAM RAM . Es Esto es muy im port ante debido al espaci espacioo RAM limit ado (PIC (PIC16F 16F877 877 t iene 368 b ytes/ localidades localidades).).
2.7 Variables Las variables son datos cuyo valor puede ser cambiado durante el tiempo de ejecución. Cada variable se declara bajo un nombre único que debe ser un identificador válido. Este nombre es usado para acceder a una localidad de memoria ocupada por la variable. Se puede ver a la variable como un
contenedor de datos y, debido que tiene un t ipo, le instruye instruye al compilador como interpretar los datos que cont cont iene. En BASIC BASIC,, las variables requ ieren ser declaradas ant es de p oder ser usadas. usadas. Es Es obligat ori o especificar un t ipo de d ato s para cada cada variab le. Las Las variables se declaran declaran así: así: dim identicador as tipo
Donde identificador es cualquier cualquier ident ificador válido y tipo es de cualquier t ipo de dat os. Por ejempl o: dim temperatura as byte dim voltaje as word
' Declarar variable temperatura del tipo byte ' Declarar variable voltaje del tipo word
Los bits in dividu ales de las variables byt e (incluyen do a los registro s SF SFR com com o ser PORT PORTA, et c.) pueden ser accedidos accedidos mediant e el pu nt o (.), en en los extrem os derecho o izquierdo d e una expresión. expresión. Por ejemplo: Data_Port.3 = 1
' Encender el bit 3 de la variable byte Data_Port
2.8 Símb Símb olo s Los símbolo símbolo s hacen hacen po sible r eemp lazar lazar un a expresión con un alias de id ent ificación ificación ú nico. El El uso de símbolo s puede increm entar la legibilidad del código. La sintaxis del BASIC BASIC te restringe a expresiones de línea única, perm itiend o at ajos para constant es, expresiones expresiones simples, llamadas a función, etc. El El alcance alcance (scope) (scope) de un ident ificador de sím sím bolo es todo el archivo fu ente en el cual está declarado. Por ejem plo: symbol MaxPermitido = 234 ' Simbolo como un alias para un valor numerico
symbol PUERTO = PORTC ' Simbolo como un alias par un Registro de Funcion Especial
symbol RETARD1S = Delay_ms(1000) ' Simbolo como un alias para una llamada a procedimiento ...
if
teA > MaxPermitido then teA = teA - 100
end if PUERTO.1 RETARD1S ...
= 0
Nota que el usar un símbolo en un programa técnicamente no consume memoria RAM – el compilador simplem ent e reem plaza plaza cada cada ocurrencia del símbo símbo lo con el código apropiado de la declaración. declaración.
2.9 Direct Direct ivas Las Las directivas son palabr as de signifi cado especial para el BASIC BASIC,, pero a di fer encia de o tr as palabr as reservadas, estas aparecen solam solam ente en cont extos donde los identificadores definido s por el usuario no p ueden ocurr ir. No puedes definir un ident ificador qu e sea sea igual a una directiva. Directiva
Significado
Absolute
especifica una dirección exacta de una variable en RAM
Org
especifica la dirección exacta de una rutina en ROM
especifica especifica la dirección dirección de in icio en RAM RAM para una variable (si la variable variable es mult i-byte, los bytes más alto s son almacenad os en localidad es consecutiv as). as). Absolute
La directiva Absolute es añadida a la declaración declaración de la variable: dim rem as byt byte e ab abso solu lute te $22 ' La variable rem ocupara 1 byte en la direccion $22
dim dot as wor word d ab abso solu lute te $23 ' La variable dot ocupara 2 bytes en las direcciones $23 and $24
especifica especifica la dirección dirección de inicio d e la rut ina en ROM ROM . Para Para la fam ilia PIC PIC16, 16, la rut ina debe caber en una página página – de ot ra form a, el el compilador r eportará un error. La directiva directiva Org es añadida a la declaración de la rutina: Org
sub procedure Prueba org $200 ' El procedimiento Prueba empezara en la direccion $200 ...
end sub
2.10 Com Com ent arios Los com com entario s son son t extos que se añaden al código con el p ropó sito sito de realizar una descripción descripción o aclaración, aclaración, y son completam ente ignorados por el compilador. ' Cualquier texto entre el apostrofe y el final de la ' linea constituye un comentario. Su alcance es de una línea solamente.
Constituye una buena práctica comentar tu código, de manera tal que tú o cualquier otra persona pueda volver a usarla usarla posteriorm posteriorm ente. De otro m odo, a m enudo es útil com entar partes del código código que t engan engan pro blemas, blemas, de manera que puedan ser reparadas o modificadas luego. Los comentarios deben dar información acerca del
propósito de lo que h ace ace el pro grama. Com Com entar algo como ‘ Encender Pin0 ’ simplem ent e explica la sintaxis sintaxis pero falla a indicar el pro pósito de la instr ucción. Algo similar similar a ‘ Activa r el Rele Rele ’ puede ser ser m ucho más útil. Los editores especializados poseen resalte en colores de sintaxis (syntax highlighting) – es fácil de distinguir comentarios del código debido al color diferente, además los comentarios usualmente aparecen en letras cursivas.
2.11 Et Et iquet as Las etiquetas representan la forma más directa de controlar el flujo del programa. Cuando marcas cierta línea del programa con una etiqueta, puedes saltar a esa línea a través de la instrucción goto y gosub. Es conveniente pensar en las etiquetas como marcas de libro (bookmarks). Nota que la etiqueta main debe ser declarada en cada cada pro grama BASIC BASIC debido a que m arca el inicio del m ódulo principal. es una instrucción de salto incondicional. Salta a la etiqueta especificada y la ejecución del programa continua norm almente desde ese ese punto . Goto
es una instr instr ucción ucción d e salt salt o similar al Goto, con la excepción excepción de que está ligada a la palabra palabra return. Al saltar a la etiqueta especificada, la dirección previa es almacenada en la pila (stack). El programa continuará ejecutándose normalmente desde la etiqueta, hasta alcanzar la instrucción return – esta terminará la subrutin a y regresará regresará al la prim era línea línea del programa inm ediatam ente después de la instrucción gosub que la llamó. Gosub
Aquí tienes un ejem plo simple: program prueba main: ' algunas instrucciones... ' simple bucle infinito usando una etiqueta
mi_bucle: ' algunas instrucciones... ' ahora saltamos nuevamente a la etiqueta mi_bucle
goto mi_bucle end.
Nota: Aunque puede parecer una buena idea para los principiantes el programar usando saltos y etiquetas,
deberás tratar de no depender de estas. Esta forma de pensamiento se desvía de la programación procedimental y te puede enseñar malos hábitos. Es mucho mejor usar procedimientos y funciones, haciendo que el código sea más legible y más fácil fácil de m antener.
2.12 Pro Pro ce cedim dim ient os y Fun Fun cion es Los procedimientos y funciones, referidas como rutinas, son bloques de instrucciones auto-contenidos que pued en ser ser llamado s desde diferent es lugares en un pr ogram a. Una función es una rut ina que devuelve un valor al ejecutarse. ejecutarse. Un procedimi ento es una rut ina que no devuelve un valor. Una vez que las rutinas han sido definidas, puedes llamarlas cualquier número de veces. El procedimiento es llamado para realizar realizar un cierta t area, m ient ras que la función es llam llam ada para calcula calcularr un cierto valor . La declarac declaración ión de un procedimiento tiene la for ma: sub procedure NombreProcedimiento(ListaParametros) DeclaracionesLocales Instrucciones
end sub
Donde NombreProcedimento es cualquier identificador válido, Instrucciones son una secuencia de instrucciones que son ejecutadas al llamarse el procedimiento, y ListaParametros juntamente con DeclaracionesLocales son declaraciones opcion ales de las variabl es y/ o las constant es. sub procedure pr1_procedimiento (dim par1 as byte, dim par2 as byte, dim byref vp1 as byte, dim byref vp2 as byte) dim locS as byte par1 = locS + par1 + par2 vp1 = par1 or par2 vp2 = locS xor par1
end sub
y par2 son pasadas pasadas al pro cedimient o po r valor , pero las variables marcadas con la palabra clave byref son so n pasadas pasadas por r eferencia ó dirección (address). (address). par1
Esto significa significa que la llamada al pr ocedimient o pr1_procedure(tA, tB, tC, tD)
pasa tA y tB por valor: crea par1 =tA; y par2 =tB luego manipula par1 y par2 de manera tal que perm anecen sin camb camb io;
tA
y
tB
pasa tC y tD por d irección: cualquier cualquier camb io realizado realizado en vp1 y vp2 es tam bién reflejado en tC y tD. La declaración de funciones es similar a la declaración de procedimientos, con la excepción de que la función posee posee un t ipo de ret orno y valor de ret orno especi especifica ficados. dos. La declaración declaración de fun ciones tiene la form a: sub function NombreFuncion(ListaParametros) as TipoRetorno DeclaracionesLocales Instrucciones
end sub
donde
es cualquier identificador válido, TipoRetorno es cualquier tipo simple, Instrucciones son una secuencia de instrucciones a ser ejecutadas cuando se llama a la función, y ListaParametros juntamente con DeclaracionesLocales son declaraciones opcionales de las variables y/ o las constantes. constantes. NombreFuncion
En BASIC BASIC,, usam os la palab ra clav e Result para asignar asignar un valor de reto rno a la función. Por Por ejem plo: ) as word sub function Calc( dim par1 as byte, dim par2 as word dim locS as word locS = par1 * (par2 + 1) Result = locS
end sub
Ya que las funciones ret ornan valores, valores, las llamadas a función son t écnicament écnicament e expresiones. Por Por ejemplo , sisi has definido una función llamada Calc, la cual recibe dos argumentos enteros y retorna un entero, entonces la llamada a función Calc(24, 47) es una expresión entera. Si I y J son variables enteras, entonces I+Calc(J,8) es tam bién una expresión entera.
2.13 2. 13 M ódulos Los programas grandes pueden ser divididos en módulos que permitan un mantenimiento más sencillo del código. Cada módulo es un archivo, que puede ser compilado separadamente; los módulos compilados son enlazados enlazados para crear una aplicación. aplicación. Nota qu e cada archivo archivo d e código fuent e debe t erm inar con la palabra clave end seguida de un punto . Los módulos te perm iten: 1. Separar eparar programas grandes grandes en segmentos segmentos que pueden pueden ser ser editados separa separadamente, damente, 2. Crear librerías librerías que pueden ser ser usada usadass en diferentes programas, programas, 3. Distribuir Distribuir librerías librerías a otros des desarrolladores arrolladores sin sin entregar el el código código fuente. En el IDE de mikroBasic, todo el código fuente incluyendo al programa principal se almacena en archivos ( .pbas). Cada Cada proyecto consiste consiste d e un archivo d e pro yecto ún ico, y uno o m ás archivos mód ulos. Para Para constr constr uir (build) un pro yecto, el com pilador n ecesita ecesita ya sea sea un archivo fuent e o un archivo com com pilado para cada cada mód ulo. Cada aplicación aplicación en BASIC BASIC tiene un m ódulo principal y cualquier núm ero de archivos m ódulo s adicionales adicionales.. Todos los archivos fuente tienen la misma extensión ( pbas). El archivo principal es identificado por la palabra clave archivos tienen la palabra clave module. Si Si deseas incluir u n m ódu lo, program al inicio, mient ras que los otro s archivos añade la palabr a clave include seguido seguido del nom bre del archivo entre comi llas. llas. Por ejem plo: program proyecto_de_prueba include "math2.pbas" dim tA as word dim tB as word main: tA = sqrt(tb) . end
La palabr a clave include indica al comp ilador que archivo com com pilar. El ejemp lo de arriba incluye incluye el m ódulo archivo del program a. Obviamen te, la rut ina sqrt usada usada en el ejemp lo está declarada declarada dent ro math2.pbas en el archivo del módulo math2. pbas. Si deseas deseas distr distr ibuir tu m ódulo sin sin ent regar el código fuent e, puedes enviar tu librería compil ada (extensión (extensión de archivo .mcl). El El usuario usuario po drá usar tu librer ía tal y com o si tu viera el código código fuent e. Aunque el compilado r es capaz de deter m inar que ru tinas están están im plem entadas en la librer ía, ía, es una práctica com com ún pr oveer los pro to tipos de las rut inas en un archivo texto separado. Los archivos archivos mó dulos deben estar estar o rganizados rganizados de la siguient siguient e for m a: module nombre_unidad include ... symbol ... const ... dim ...
' nombre del Modulo ' incluir otros modulos si es necesario ' declaracion de Simbolos ' declaracion de Constantes ' declaration de Variables
sub procedure nombre_procedimiento ' declaracion de Procedimientos ...
end sub sub function nombre_function
' declaracion de Funciones
...
end sub . end
' fin del Modulo
Not a que no exis existe te una sección de “cuer po” en el m ódulo – los archivos m ódulo s sirven para declarar funcion es, es, procedim ient os, constant constant es y variables globales. globales.
Capit ulo 3: Operado res Introducción 3.1 Operadores Operadores Arit Arit m éticos 3.2 Operadores Booleanos 3.3 Operado res Lógicos (bit a bit ) 3.4 Operado res Relacionales (Operad (Operad ores de Com Com paración)
Introducción En las expresiones complejas, los operadores con precedencia superior son evaluados antes que los operadores con p recedencia inferio inferio r; los op eradores de igual precedencia precedencia son evaluados de acuerdo a su posición posición en la expresión em pezando d esde esde la izquier izquier da. Operator
Prioridad
not
primera (más superior)
*, div, mod, and, <<, >>
segunda
+, -, or, xor
tercera
=, <>, <, >, <=, >=
cuarta
(más inferior)
3.1 Operadores Arit m éticos Revisión de l os oper ador es aritm ét icos en BASIC BASIC:: Operator
Operación
Tipos de Operandos
Tipo del Resultado
+
adición
byte, short, integer, words, longint
byte, short, integer, words, longint
-
subs substr trac acci ción ón
byte byte, , shor short, t, integer, words, longint
byte, short, integer, words, longint
multiplicación byte, short, integer, words
integer, words, long
*
div
división
byte, short, integer, words
byte, short, integer, words
mod
resto
byte, short, integer, words
byte, short, integer, words
es el valor de A dividido entre B redondeado hacia abajo al entero más cercano. El operador palabras, mod reto rna el residuo ob tenid o al dividir los operandos. En ot ras palabras, A div B
X mod Y = X - (X div Y) * Y
Si se utiliza utiliza 0 (cero) explícitament explícitament e com o el segund segund o o perando (ej. X div 0), el com com pilador report a un error y no genera código. Pero en caso de división implícita por cero: X div Y, donde Y es 0 (cero), el resultado es el máxim o valor para el t ipo aprop iado (por ejem plo, si X y Y son w ords, el resultado resultado es $FFFF). Si el núm ero es convert convert ido de un tipo m enos com com plejo a uno m ás comp lejo, los bytes superiores superiores son son llenados con ceros. Si el número es convertido de un tipo más complejo a uno menos complejo, los datos sim sim plem ente se t runcan (los bytes superior superior es se se pierden). Si el núm ero es convert convert ido de un tipo m enos com com plejo a uno m ás comp lejo, los bytes superiores superiores son son llenado s con un os sisi el bit de signo es igual a 1 (el núm ero es negativo ). Los Los byt es superio res se se llenan con ceros si el bit de signo signo es igual igual a 1 (el núm ero es positivo). Si Si el núm ero es convertid o de un t ipo más complejo a uno menos complejo, los datos simplemente se truncan (los bytes superiores se pierden). BASIC BAS IC tam bién po see dos oper ador es arit m ét icos unar ios: Operador
Operación
Tipos de Operandos
Tipo del Resultado
+ (unar (unario io) )
Iden Identi tida dad d de signo
short, integer, longint
short, integer, longint
- (un (unar ario io) )
Nega Negaci ción ón de signo
short, integer, longint
short, integer, longint
Los operado res ari ari tm éti cos unar ios pueden ser usados para cam cam biar el signo signo d e las variables: va = 3 vb = -va 'asignar el valor de -3 a la variable vb
3.2 Oper Oper ador es Booleano s Los opeadores booleanos no son operadores verdaderos, debido a que no existe un tipo de datos boo leano d efini do en BASIC BASIC.. Estos Estos operado res cor cor responde n a la lógica Booleana estándar . No pu eden ser usados con ningún tipo de datos, sinó solamente para construir expresiones condicionales complejas.
Operador
Operación
not
negación
and
conjunción
or
disjunción
Por ejempl o: if (astr > 10) and (astr < 20) then PORTB = 0xFF
end if
3.3 Oper ador es Lógicos (B (Bitit a bit ) Revisión d e los op erad or es lógicos en BASIC BASIC:: Operador
Operación
Tipos de Operandos
Tipo del Resultado
not
negación bit a bit
byte, word, short, integer, long
byte, word, short, integer, long
and
and bit a bit
byte, word, short, integer, long
byte, word, short, integer, long
or
or bit a bit
byte, word, short, integer, long
byte, word, short, integer, long
xor
xor bit a bit
byte, word, short, integer, long
byte, word, short, integer, long
<<
desplazamiento byte, word, a la izquierda short, de bit integer, long
byte, word, short, integer, long
>>
desplazamiento byte, word, a la derec derecha ha de short, bit integer, long
byte, word, short, integer, long
: desplaz desplazar ar el o perando hacia la la izquierda izquierda u n n úm ero de bits especifica especificado do a la derecha del oper ando (debe ser ser positivo y m enor q ue 255). <<
: desplaz desplazar ar el oper ando hacia la derecha un núm ero de b its especi especificado ficado a la derecha del operand o (debe ser ser positivo y m enor q ue 255). >>
Por ejem plo, si neces necesitas itas extraer el nib ble superior de un a variable tipo byte, pu edes hacerlo hacerlo así: así: dim temp as byte main: temp=$35 temp=temp >>4
valor inicial de temp $35 extraer el nibble superior, ahora temp tiene el valor $03
end.
3.4 Oper ador es Relac elacion ion ales (Operado res de Com Com par ac ación ión ) Los operadores relacionales (operadores de Comparasión) son usados comunmente en bucles condi cionales par a contr olar el fl ujo d el progr am a. Revisión Revisión de los operad ores relacionales enBAS enBASIC IC:: Operador
Operación
Tipos de Operandos
Tipo del Resultado
=
igual a
Todos los tipos simples
Verdadero ó Falso
<>
distinto de
Todos los tipos simples
Verdadero ó Falso
<
menor que
Todos los tipos simples
Verdadero ó Falso
>
mayor que
Todos los tipos simples
Verdadero ó Falso
<=
menor o igual que
Todos los tipos simples
Verdadero ó Falso
>=
mayor o igual que
Todos los tipos simples
Verdadero ó Falso
Capit ul uloo 4: Es Est ru ct ur as de Con Con t ro l Introducción 4.1 Expresiones Condicion ales 4.1.1. In str ucción I F..THE ..THENN 4.1.2 4.1 .2 Inst ru cció cciónn SELE LECCT..C T..CAS ASEE 4.1.3 Instru cción GOTO GOTO 4.2 Bucles 4.2.1 Instru cción FOR FOR 4.2.2 Instr ucción DO..L DO..LOOP OOP 4.2.3 Inst Inst rucción W HIL HILEE 4.3 Instr ucción AS ASM M
Introducción Las expresiones definen acciones algorítmicas dentro de un programa. Expresiones simples – como asignaciones y llamadas a procedimientos – pueden ser combinadas para formar bucles, expresiones condicion ales, ales, y ot ras expresiones est est ru ctur adas. adas. Las expresiones simples no contienen a otras expresiones. Estas incluyen asignaciones, y llamadas a procedim ientos y funciones. funciones. Las expresiones estructuradas son construidas en base a otras expresiones. Usa expresiones est est ructur adas cuando cuando desees desees ejecut ejecut ar ot ras expresiones expresiones de m anera secuencia secuencial,l, condicional, ó r epet ida.
4 .1 Expresiones Condicionales Condicionales Las expresiones condicionales son usadas para cambiar el flujo de ejecución de un programa al encontrar una condición específica. La instrucción básica para realizar esta bifurcación ó cambio de flujo (branching) en el lenguaje BASIC es la inst inst rucción IF, con con algunas variantes que pr oveen la flexibil idad necesaria.
4.1.1 Instr ucción IF IF..T ..THE HEN N Sintaxis
– bifurcaci bifurcación ón condicional condicional de pro gram a
if Expresion then Instrucciones1 [ else Instrucciones2 ]
end if
Descripción
Esta instrucción selecciona una de dos posibles rutas de programa. La instrucción if.. then es la instrucción fundamental de bifurcación de programa en PIC BASIC y puede usada en distintas formas que perm it en la flexibilidad necesaria para la realización realización de tom a lógica de decisiones. ret orn a un valor Verdadero (True) ó Falso Falso (Fals (False) e) * * * . Si Expresion es Verdadero, entonces cláusula opcional else está presente, Instrucciones1 son ejecutadas; de otra form a, si la cláusula adas. Instrucciones2 son ejecut adas. Expresion
Instrucciones1
***
Ejemplo
e Instrucciones2 pueden ser instrucciones de cualquier tipo.
Se considera Falso Falso al valo r 0 (cero) y Verda Verda dero a cua lquier va lor distin to de cero.
La forma más simple de esta instrucción se muestra en la figura inferior. El ejemplo prueba el botón conect ado a RBO RBO – cuando el bo tó n está presionado, el program a salta salta a la eti quet a ‘Sum ‘Sum a’ donde el valor de la variable ‘j’ es incrementado. Si el botón no está presionado, el programa salta de regreso a la etiqueta ‘M ain’. ain’.
dim j as byte Main:
if PORTB.0 = 0 then goto Suma end if
goto Main Suma: j = j + 1 . end
La for m a más com pleja de esta instr ucción es la bifurcación de progr ama con la clausula ELS ELSEE: Si el bot ón está está presionado, se increm ent a el el valor valor de la variable ‘j’ de otr a for m a el valor valor de la variable se decrementa.
dim j as byte Main:
if PORTB.0 = 0 then j = j + 1
else j = j - 1
endif goto Main . end
4.1.2 4.1 .2 In st stru ru cció n SELE LEC CT..CAS T..CASE E – bifurcación condicional múlt iple de programa Sintaxis
sele select ct case case Selector case Valor_1 Instrucciones1 case Valor_2 Instrucciones2 ... case Valor_N Instrucciones_N [ case else Instrucciones_else ]
end select
Descripción
La instrucción select case es usada para seleccionar una de varias bifurcaciones disponibles en la tr ayector ia del progr ama. Consiste de una variable Selector que funciona como una condición de conmutación (switch), y una lista de valores posibles. Estos valores pueden ser constantes, números, o expresiones. Eventualmente, puede existir una instrucción corresponde al valor del selector. Tan pronto como la instrucción
else
que es ejecutada si ninguna de las etiquetas
case es ejecutada, solo una de las instrucciones será ejecutada. El Valor que coincide con el Selector
select
Instrucciones1..Instrucciones_N
determina que instrucciones serán ejecutadas. Si ningun o de los ítem ítem s de Valor coincide con el clausula else (si es que existe) serán ejecutadas.
Ejemplo
select case W case 0 B = 1 PORTB = B case 1 A = 1 PORTA = A
case else PORTB = 0
end select ...
select case Identificacion case pruebaA PORTB = 6 Res = T mod 23 case pruebaB + pruebaC T = 1313
case else T = 0
end select
Selector,
ent onces las las Instrucciones_Else en la
4.1.3 Instr ucción GOT GOTO O Sintaxis
Descripción
– Salt o incondicional a la et iquet a especificada especificada
goto Etiqueta
La instrucción goto salta a la etiqueta especificada incondicionalmente, y la ejecución del programa continúa norm almente desde ese ese punto. Evita usar goto con demasiada frecuencia, debido a que los programa sobre-etiquetados tienden a ser m enos legibles. legibles.
Ejemplo
program prueba main: ' algunas instrucciones ...
goto miEtiqueta ' algunas instrucciones ...
miEtiqueta: ' algunas instrucciones ...
end.
4.2 Bucles Las expresiones de bucle (loop) permiten repetir una o más instrucciones un número de veces. La expresión conductora determina el número de iteraciones que tendrá el bucle.
4.2.1 Instr ucción FOR Sintaxis
– Repetic epetición ión de un segment o de progra ma
for Contador = ValorInicial to ValorFinal [ step ValorPaso] Instruccion_1 Instruccion_2 ... Instruccion_N next Contador
Descripción
La instru cción
for requier e
que se especifiqu especifiqu e el núm ero de it eraciones en que se se ejecutará el bucle.
Contador es una variable; ValorInicial y ValorFinal son expresiones compatibles con Contador ; Instrucción es cualquier instrucción que no cambie el valor de Contador ; ValorPaso es el valor añadido al Contador en cada iteración. ValorPaso es opcional, y su valor por omisión (default ) es 1 si no se incluye la clausula step. Ten cuidado si usas valores grandes para ValorPaso , pues
pueden ocurrir errores de desbordamient desbordamient o (overflow). Cada instrucción entre
Ejemplo
for y next será ejecutada una vez por ite ración.
Aquí tienes un ejemplo simple de un bucle for usado para sacar código hexadecimal en el PORTB conectado a un decodificador cátodo común de display de 7 segmentos. Nueve dígitos saldrán por el display con ret ardos de 1 segundo. segundo. for i = 1 to 9 portb = i delay_ms(1000) next i
4.2.2 Instr ucción DO..L DO..LOOP OOP – Cont inuar el b ucle (loop) ha st a que la condición sea sea verda dera Sintaxis
do Instruccion_1 ... Instruccion_N loop until Expresion
Descripción
(True) ó Falso (False) * * * . La instrucción do.. loop ejecuta continuamente, revisando la Expresion después de cada iter ación. La La instr instr ucción do.. loop term ina cuando la Expresion se t orna Verdadero. Expresion retorna un valor Verdadero Instruccion_1 ; ...; Instruccion_N
La secuencia secuencia es ejecutada ejecutada po r lo m enos una vez debido a que la revisión de
Expresion se
***
Se considera Falso al valor 0 (cero) y Verdadero a cualquier valor distinto de cero.
Ejemplo
I = 0
do ' ejecutar estas 2 instrucciones I = I + 1 ' hasta que I sea igual a 10 (diez) PORTB = I loop until I = 10
realiza al al fin al.
4.2.3 Instr ucción W HILE – Cont inuar el bucle mient ras la condición sea sea verdad era Sintaxis
while Expresion Instruccion_1 Instruccion_2 ... Instruccion_N
wend
Descripción
es revisado primero. Si el valor es Verdadero * * * , todas las instrucciones siguientes entre while y wend serán ejecutadas (ó altern ativam ent e, solam ent e una instrucción ). Las instru cciones continuarán ejecutándose hasta hasta que Expresion ret orn e Fals Falso. o. Expresion
while term inará
cuando cuando
Expresion retorne
Falso.
while es
sim sim ilar a do.. loop, con excepción que la revisión se realiza al inicio del bu cle. Si Si Expresion ret orn a Fals Falsoo en la r evisión, las Instrucciones no serán ejecutadas. ***
Se considera Falso al valor 0 (cero) y Verdadero a cualquier valor distinto de cero.
Ejemplo
while I < 90 I = I + 1
wend ...
while I > 0 I = I div 3 PORTA = I
wend
Insert ert ar blo que de instrucciones en lengua je Ensambla Ensambla dor 4.3 Instr Instr ucc ucción ión A SM – Ins Sintaxis
asm ListaInstrucciones
end asm
Descripción
Algunas veces es útil escribir parte de un programa en ensamblador * * * 1 . La instru cción usada para insert ar instr ucciónes en lenguaje ensamb lador PIC en el cód igo BASIC BASIC..
asm puede
ser
Nota que no puedes usar números como direcciones absolutas para las variables SFR ó GPR * * * 2 para las variables en las instrucciones en ensamblador. En vez de esto, puedes usar nombres simbólicos (el archivo de listado m ostr ará esto esto s nomb res así así com com o sus direcciones). Ten cuidado al insertar código ensamblador – BASIC no revisará si las instrucciones en ensamblador han cambiado las localizaciones localizaciones de m em oria ya antes ut ilizadas por la variables BASIC BASIC.. ***1 Las principales razones para incluir ensamblador son: El lenguaje BASIC no posee las instrucciones requeridas para un tarea específica, ó si las •
• •
posee el código resultante resultante es sumamente sumamente complicado o confuso. Se requiere la máxima velocidad de ejecución posible para esa parte del programa El máximo ahorro en tamaño de código para esa parte del programa programa
El lenguaje Ensamblador (Assembler) (Assembler) es el más eficaz de todos los lenguajes en lo referente a tamaño de código y en velocidad de ejecución. Sin embargo la curva de aprendizaje de dicho dicho lenguaje es alta comparada comparada con el BASIC. El Ensamblador nos acerca acerca profundamente al hardware hardware del PIC. Te recomiendo recomiendo que lo aprendas una vez que hayas aprendido el BASIC. Para ello existen una infinidad de cursos y tutoriales en Internet. Un excelente libro para aprender ensamblador con los PIC es Microcontrolador PIC16F84 Desarrollo de Proyectos Proyectos de los autores Enrique Palacios, Fernando Ramiro y Lucas J. López.
***2
SFR: Registros de Función Especial; GPR: Registros de propósito general
Ejemplo
asm movlw 67 movwf TMR0
end asm
'mover al acumulador (W) el número 67 'mover el valor en el W al registro del Timer0
Capit ulo 6: Ejem Ejem pl plos os con peri f éricos in intt eg egrad rados os PIC PIC Introducción 6.1 M eca ecanis nism m o de Int Int errupción 6.2 Convers Conversor or AD inter no 6.3 Tem Tem porizador TM R0 6.4 Tem Tem porizador TM R1 6.5 M ódulo PW PW M 6.6 M ódulo UAR UARTT en hardw are (Com (Com unicac unicación ión RS-232)
Introducción Se dice dice comúnm ente que un m icrocontrolador icrocontrolador es “ una com com putadora completa en un solo chip”, lo qu e implica que tiene más que ofrecer que simplemente un CPU (microprocesador). Esta funcionalidad adicional se encuentra localizada en los subsistemas del microcontrolador, llamados también los “periféricos integrados”. Estos (sub)dispositivos básicamente tienen dos funciones principales: expanden las posibilidades del MCU haciéndolo más versátil, y ellos liberan al CPU de las tareas que son repetit ivas y “t ont as” as” (pr incipalm incipalm ente com unicación). unicación). Cada microcontrolador contiene por lo menos un par de periféricos integrados – comúnmente, estos incluyen temporizadores, mecanismos de interrupción y conversores AD. Microcontroladores más potentes pueden comandar un número mayor y más diverso de periféricos. En este capítulo, cubriremos algunos sistemas comunes y las formas de poder utilizarlos desde el lenguaje de programación BASIC.
6.1 M ec ecanis anism m os de Int erru pción Las int errupciones son son m ecanis ecanism m os que perm iten una r espues espuesta ta cas casi instant instant ánea a eventos tales com com o el desbordamiento de un contador, el cambio de estado en un pin, datos recibidos, etc. En el modo norm al, el el microcont rolador ejecut ejecut a el programa principal m ientras no existan existan event os que caus causarí arían an una interrupción. Al llegar la interrupción, el microcontrolador detiene la ejecución del programa principal y com ienza ienza la part e especial especial del program a que analiz analizaa y m aneja la interru pción. Es Esta p arte del servicio de interr upción. program a se se conoce com com o la rut ina de servicio En BASIC, la rutina de servicio de interrupción es definida con la palabra interrupt. Cualquier código que se alm alm acene acene en este procedim iento , será será ejecut ejecut ado cuando exista exista u na inter rupción. Primero, necesitamos determinar que evento provocó la interrupción, ya que el microcontrolador PIC llama a la m ism ism a rut ina de interru pción sin sin im port ar la fuen te de int errupción. Después Después de eso eso viene el manejo de la interrupción, que significa la ejecución del código apropiado para el evento de disparo (trigger) de la la interr upción.
Aquí tenemo s un ejem plo sencillo: sencillo: En el bucle principal, el programa mantiene el diodo led LED_run encendido y el diodo led LED_int apagado. apagado. Si Si pr esionamo esionamo s el bot ón T se genera la interru pción – el m icrocontr olador para de ejecutar el program a principal e inicia inicia el procedim iento de int errupción. program TestearInterrupcion symbol LED_run = PORTB.7 symbol LED_int = PORTB.6
' LED_run se conecta al pin 7 del PORTB ' LED_int se conecta al pin 6 del PORTB
sub procedure interrupt if INTCON.RBIF = 1 then
' Rutina de Servicio de Interrupcion ' Hubo cambio en los pines RB4-RB7?
INTCON.RBIF = 0
else if INTCON.INTF = 1 then LED_run = 0 LED_int = 1 Delay_ms(500) INTCON.INTF = 0 else if INTCON.T0IF = 1 then INTCON.T0IF = 0 else if INTCON.EEIF = 1 then INTCON.EEIF = 0
' Hubo una interrupcion Externa(pin RB0)?
' Hubo una interrupcion del Timer0? ' El ciclo de escritura EEPROM termino?
end if end if end if end if end sub main: TRISB = %00111111 OPTION_REG = %10000000 INTCON = %10010000 PORTB = 0 eloop: LED_run = 1 LED_int = 0 goto eloop . end
' ' ' ' '
Pines RB6 y RB7 son salida Desactivar resistencias pull-up internas y configurar la interrupcion por flanco de bajada en RB0 Habilitar interrupciones externas Valor inicial en PORTB
' Mientras no hay interrupcion, el bucle es infinito ' LED_run esta encendido ' LED_int esta apagado
Ahora, ¿Que ocurre cuando presionamos el botón? Nuestra rutina de interrupción primero analiza la interrupción revisando los bits bandera (flag) con las instrucciones if..then, debido a que existen distint distint as causa causass posibles posibles para una inter rupción. En nuestro cas caso, ocurr ió un a inter rupción externa (el pin RBO/INT cambió de estado) y por lo tanto el bit INTF del registro INTCON se puso en 1 (set). Ent onces el m icrocontr olador camb ia el estado estado de LED_run y LED_Int, y provee un retardo de m edio segundo para que podamos ver el cambio. Posteriormente limpia el bit INTF para poder habilitar nuevas interrup ciones, ciones, y regresa regresa a ejecutar el pro grama p rincipal. rincipal. En situ situ aciones aciones donde el m icrocontro lador debe r esponder esponder a event os no relacionados relacionados con con el pr ogram a principal, es sumam ente ú til t ener una rut ina de servici servicioo de int errup ción. Tal Tal vez, vez, uno de los mejor es ejem plos es la m ult iplexaci iplexación ón d e displays de 7 segment os – sisi el código d e m ult iplexación iplexación está ligado a la interrupción del temporizador, el programa principal estará mucho menos saturado ya que el pr oceso oceso d e refr esco esco (ref resh) de los displays displays se realizará realizará en el fon do (b ackground ).
6.2 Con Con versor AD Int Int ern o Algunos microcontroladores poseen un Conversor Análogo Digital (ADC) incorporado. Comunmente esto esto s conversores conversores tienen u na resolución resolución de 8-bit ó 10-bit perm itiéndo les tener una sensitividad sensitividad de 19.5 m V ó 4.8mV respectivament respectivament e (as (asum iendo un vo ltaje de alim alim entación de +5V). +5V). El program a de conversión AD m ás simple sería sería usar usar la r esolución esolución de 8-bit y un voltaje de referen cia cia de +5V (valor (valor con el cuál, el valor “ leído” leído” desde desde el pin del m icrocont icrocont rolador se compara). En En el siguiente siguiente ejemplo medimos el voltaje en el pin RA0 el cual está conectado a un potenciómetro (ve la figura abajo).
El potenciómetro da 0V en un extremo y +5V en el otro – debido a que usamos conversión de 8-bit, nuestro voltaje digitalizado puede tener 256 pasos. El siguiente programa lee el voltaje en el pin RA0 y lo m uest uest ra en los diodos led del puert o B. Si Si ningún led esta encendido, el result result ado es cero cero y si to dos los diodos se se encienden , el result result ado es 255.
program ADC_8 main: TRISA = %111111 PORTD = 0 TRISD = %00000000
' Pu Puerto A co configurado como entrada ' Puerto D configurado como salida
1000 0001 010 0 ADCON1 = %10
' P Pue uert rto o A con confi figu gura rado do en mo modo do an anal alog ogo, o, ' 0 y 5V son valores de voltaje de referencia, ' y el resultado esta alineado a la derecha ' (6 bits más altos de ADRESH son cero).
11010 10001 001 ADCON0 = %110
' Reloj Reloj del ADC es gen genera erado do por por cir circui cuito to RC RC inte intern rno; o; ' voltaje es medido en RA2 y ' permite el uso del conversor AD
Delay_ms (500)
' Pausa de 500 ms
eloop: ADCON0. 2 = 1
' Inicio de conversion
wait: ' Esperar que el ADC termine Delay_ms( 5) if ADCON0.2 = 1 then goto wait
end if PORTD = ADRESL Delay_ms( 500) goto eloop . end
' ' ' '
Mostrar 8 bits inferiores en el puerto D Pausa de 500 ms Repetir todo otra vez Final del programa
Prim ero, necesitam os inicializar inicializar adecuadam ent e los registr registr os ADCON1 ADCON1 y ADCON0. ADCON0. Después, Después, pon em os a 1 (set (set ) el bit ADCON0.2 el cuál cuál inicializa inicializa la conver conver sión y luego revisam revisam os ADCON0.2 ADCON0.2 para det erm inar sisi la conversión ha terminado. Si terminó, el resultado se almacena en ADRESH y ADRESL desde donde puede ser copiado copiado al puert o D.
El ejem plo ant erior tam bién podr ía realiz realizarse arse utilizando utilizando la instrucción ADC_R ADC_Read. ead. El El siguient siguient e ejem plo ut iliza iliza una resolución resolución de 10-bit:
program ADC_10 dim AD_Res as word
main: TRISA
= %11111111
' PORTA configurado como entrada
TRISD
= %00000000
' PORTD configurado como salida
ADCON1 = %1000010
eloop: AD_Res = ADC_read(2)
PORTD = Lo(AD_Res) Delay_ms(500) goto eloop . end
' PORTA configurado en modo analogo, ' 0 y 5V son valores de voltaje de referencia, ' y el resultado esta alineado a la derecha ' Ejecutar la conversion y guardar el resultado ' en la variable AD_Res ' ' ' '
Mostrar el byte inferior del resultado en PORTD Pausa de 500 ms Repetir todo otra vez Final del programa
Ya que un puerto es insuficiente para mostrar el resultado completo, podemos usar un LCD para desplegar los 10 bits del resultado. El esquema de conexión y el programa correspondiente se m uestr an a cont cont inu ación. Para Para m ás info rm ación acerca de las rut inas LC LCD, revisa revisa el Capítu Capítu lo 5: Rutinas de Librerías.
program ADC_con_LCD dim AD_Res as word ] dim dummyCh as char[6 main: TRISA TRISB
= %1111111 = 0
' PORTA configurado como entrada ' PORTB configurado como salida (para el LCD)
ADCON1 = %10000010
'PORTA configurado en modo analogo, ' 0 y 5V son valores de voltaje de referencia, ' y el resultado esta alineado a la derecha
Lcd_Init(PORTB) Lcd_Cmd(LCD_CLEAR) Lcd_Cmd(LCD_CURSOR_OFF)
' Inicializar LCD ' Limpiar LCD ' y apagar el cursor
eloop: AD_Res = ADC_Read( 2)
' Ejecutar la conversion y guardar el resultado ' en la variable AD_Res ' Limpiar el resutado previo en el LCD LCD_Out( 1, 1, " ") WordToStr(AD_Res, dummyCh) ' Convertir el resultado a texto, ' e imprimirlo en linea 1, columna 1 LCD_Out( 1, 1, dummyCh)
Delay_ms( 500) goto eloop . end
' Pausa de 500 ms ' Repetir todo otra vez ' Final del programa
6.3 Tem Tem por iz izador ador TRM 0 El temporizador (timer) TMR0 es un registro de función especial de 8-bit con un rango de trabajo de 256. Asumiendo que usamos un oscilador de 4MHz, TMR0 puede medir un rango de 0-255 microsegundos (a 4MHz, TMR0 se incrementa cada microsegundo). Este periodo puede ser increm ent ado si se se ut iliza el pr e-escala e-escalador dor . El El pre-escalador pre-escalador d ivide el r eloj en una rel ación ación específica (la configu ración del pre-escalador pre-escalador se realiza realiza en el r egist egist ro OP OPTI TION_RE ON_REG). G). El siguiente siguiente pr ograma m uestra como generar 1 segundo segundo utilizando utilizando el tim er TM R0. Para Para prop ósito ósito s de visualización, visualización, el pr ogram a inviert e el estado de los leds en PORTB PORTB cada segund segund o. Antes del pr ograma p rincipal, TM TM R0 se debe habilit ar inter rupciones. Es Es decir, decir, el bit 2 y e l bit 7 (GIE) (GIE) del registro INTC INTCON deb en estar a 1(set). Esto Esto hab ilit a las int err upcio nes globales. globales.
program Timer0_1segundo dim cnt as byte dim a as byte dim b as byte sub procedure interrupt cnt = cnt + 1 TMR0 = 96 INTCON = $20
' Incrementar el valor de cnt en cada interrupcion ' Setear (poner a 1) T0IE, limpiar (poner en 0) T0IF
end sub main: a = 0 b = 1 OPTION_REG = $84 TRISB = 0 PORTB = $FF cnt = 0 TMR0 = 96 INTCON = $A0
' ' ' '
Asignar pre-escalador al TMR0 PORTB configurado como salida Inicializar PORTB Inicializar cnt
' Habilitar interrupcion para TMRO ' Si cnt es 200, entonces invertir los leds en PORTB, ' y resetear cnt
do if cnt = 200 then PORTB = not(PORTB) cnt = 0
end if loop until 0 = 1
' Repe Repetir tir infi infinita nitament mente e
end.
' Final del programa
El pre-escalador se configura en 32, de manera tal que el reloj interno se divide en 32 y el TMR0 se incrementa cada 31 microsegundos. Si el TMR0 se inicializa en 96, el desbordamiento ocurre en (256-96)*31 us = 5 ms. El programa incrementa cnt por cada interrupción, midiendo el tiempo transcurrido de acuerdo al valor de esta variable. Cuando cnt alcanza 200, el total de tiempo tr anscurrido anscurrido es de 200* 5 m s = 1 segundo. segundo.
6.4 Tem Tem por iz izador ador TRM 1 El tem porizador porizador (tim er) TM R1 es un regist regist ro d e función especial especial de 16-bit con u n rango de t rabajo de 65536. Asumiendo que usamos un oscilador de 4MHz, TMR1 puede medir un rango de 0-65535 microsegundos (a 4MHz, TMR1 se incrementa cada microsegundo). Este periodo puede ser increm ent ado si se se ut iliza el pr e-escala e-escalador dor . El El pre-escalador pre-escalador d ivide el r eloj en una rel ación ación específica (la configu ración de l pre-escalador pre-escalador se realiza en el registro T1CON). 1CON). Antes del programa principal, TMR1 debe ser habilitado configurando el primer bit (b0) del registro T1CON. Este primer bit define el reloj interno para TMR1 – lo pondremos a cero. Otros registros importantes para trabajar con el TMR1 son PIR1 y PIE1. El primero contiene la bandera de rebalse (overflow flag) (bit 0) y el otro es usado para habilitar la interrupción del TMR1 (bit 0). Teniendo la interrupción del TMR1 habilitada y habiendo limpiado su bandera, solo requerimos habilitar las interrupciones globales y las interrupciones de periféricos en el registro INTCON (bits 7 y 6 respectivamente).El siguiente programa de ejemplo muestra como generar 10 segundos usando el TM R1. Para Para pro pósit os de visualización, visualización, el p ro gram a inviert e el estado de lo s leds en PORTB PORTB cada 10 sg. sg. . program Timer1_10sec dim cnt as byte sub procedure interrupt cnt = cnt + 1 pir1.0 = 0
' Limpiar bandera de interrupcion del TMR1
end sub main: TRISB = 0 T1CON = 1 PIR1.TMR1IF = 0 PIE1 = 1 PORTB = $F0 cnt = 0 INTCON = $C0
' Limpiar TMR1IF ' Habilitar interrupciones ' Inicializar cnt
' Si cnt es 152, entonces invertir los leds en PORTB, ' y resetear cnt
do if cnt = 152 then PORTB = not(PORTB) cnt = 0
end if loop until 0 = 1 end.
' Rep Repetir etir infi infinita nitament mente e ' Final del programa
El pre-escalador es seteado a 00 de manera tal que no existe división interna del reloj y el rebalse ocurre cada 65536 ms. El programa incrementa cnt por cada interrupción, midiendo el tiempo transcurrido de acuerdo al valor de esta variable. Cuando cnt alcanza 152, el total de tiempo tr anscurrido anscurrido es de 152* 65536 m s = 9.96 segundos. segundos.
6.55 M ódulo PWM 6. PWM Los microcont roladores de la serie serie PIC16F PIC16F87X 87X t ienen 1 o 2 salidas PW M incorporadas (empaquet aduras de 40-pin tienen 2, empaquetaduras de 28-pin tienen 1). Las salidas PWM están localizadas en los pines RC1 RC1 y RC2 (M CUs de 40-pin ), ó en el pin RC2 (M CUs de 28-pin). Consulta con la libr ería PW PW M (Capítulo (Capítulo 5 .2: Rut Rut inas de Libr Libr erías) erías) para m ás info rm ación. El siguiente siguiente ejem plo u sa la librería PWM PWM para obt ener varias inten inten sidades de luz en en el led conectado al pin RC2. La variable que representa la relación de señales en 1 (On) y 0 (Off) se incrementa continuam ent e en el bucle, to m ando valores entr e 0 a 255. Es Esto result result a en una variación variación en el nivel de inten sidad de lu z em em it ida por el d iodo LED. Después Después de alcanza alcanzarr el valor 255, el p roceso roceso com ienza ot ra vez. program Prueba_PWM_LED dim j as byte main: TRISB = 0 PORTB = 0 j = 0 TRISC = 0 PORTC = $FF PWM_Init(5000) PWM_Start
' PORTB configurado como salida ' Limpiar PORTB ' ' ' '
PORTC configurado como salida Setear PORTC a $FF Inicializar modulo PWM Iniciar PWM
while true
' ' ' ' '
Bucle infinito Esperar 10ms Incrementar j Configura nueva relacion de trabajo (duty ratio) Enviar valor de CCPR1L al PORTB
Delay_ms(10) j = j + 1 PWM_Change_Duty(j) PORTB = CCPR1L
wend end.
6.6 M ód ulo U AR ART T en h ard w are (Com (Com un ica icacción RS-232) La forma más simple de transferir datos entre el microcontrolador y otro dispositivo, ej. Computador PC u otro microcontrolador, es la comunicación RS-232 (también referida como EIA RS-232C ó V.24).
RS-232 es un estándar para el int ercambio serial binario d e dato s entre u n DTE (Equipo (Equipo Term inal de Dato s) y un DC DCEE (Equip (Equip o de Com Com un icación icación de Datos), com únm ent e usado en los puer t os seriales de un computador personal. Es una comunicación serial asíncrona de 2-lineas (Tx para transmisión y Rx para recepción) recepción) con con u n rango efectivo de 10 m etr os. El microcontrolador puede establecer comunicación con la línea serial RS-232 a través de un USART (Transmisor (Transmisor Recepto Recepto r Síncrono Síncrono Asíncrono Asíncrono Un iversal) en hardw are que es una parte int egral de los microcontroladores PIC16F87X. El USART contiene registros buffer especiales para recibir y transmitir dat os así así com o un gener ador de Tas Tasaa de Baudios para conf conf igurar la t asa asa de tr ansferencia. Este ejemplo muestra la transferencia de datos entre el microcontrolador y el computador PC conectados con un chip de interface de línea RS-232 MAX232 (Ver * * * Nota del del Traduc Traductor tor al final del capítulo) capítulo) que cump le el papel papel de ajustar ajustar los niveles de señales señales en el lado lado de l microcont rolado r (conviert e niveles de vo ltaje RS-232 +/ - 12V a nive les TT TTL de 0-5V y viceversa). viceversa).
El siguiente siguiente program a de ejemp lo ilust ilust ra el uso uso de comun icación icación serial serial hardw hardw are. El dato recibido desde el PC es almacenado en la variable dat y luego es retornada al PC como confirmación de transferencia exitosa. Por lo tanto es fácil revisar si la comunicación trabaja adecuadamente. El formato de transferencia es 8N1 (8 bits de datos, sin paridad y 1 bit de parada) y la tasa de t ransferen cia es de 2400 b audio s.
program Eco_USART dim dat as byte main: USART_Init(2400)
while true if USART_Data_Ready = 1 then dat = USART_Read USART_Write(dat)
' Inicializar el modulo USART con una ' velocidad de 2400 Baud ' Si el dato es recibido entonces ' Leer el dato ' y enviarlo de Nuevo por el USART
end if wend end.
Para poder establecer comunicación, el PC debe tener un software de comunicación instalado (un programa denom inado Term Term inal). Un sof sof tw are Term Term inal es parte del IDE IDE de M ikroBas ikroBasic. Puede ser ser accedido a través del menú ‘Tools>USART Terminal´ ó por la combinación de teclas ‘Control+T’. El Terminal te permite monitorear la transferencia y configurar todos los parámetros de transferencia. Primero necesitamos configurar la velocidad de transferencia a 2400 Baudios para igualar a la velocidad programada en el microcontrolador. Luego, seleccionar el puerto de comunicación serial adecuado seleccionan seleccionan do u no d e los 4 disponib les (revisa que el cable serial serial esté conect ado al PC). PC). Después de realizar estos ajustes, al hacer Click en ‘Connect’ (Conectar) se inicia la comunicación. Digita Digita u n m ensaje ensaje y luego haz Click Click en ‘Send ‘Send M ess essage’ age’ – el m ensaje ensaje será enviado enviado al m icrocontr olador y luego retor nará mo st rándose en la pantalla. Not a que la comun icación icación serial serial puede tam bién estar basada basada en soft soft w are en 2 pi nes cuales cualesquiera quiera del m icrocont icrocont rolador – para m ás infor m ación, ación, revisa revisa el Capítulo Capítulo 9: Com unicaciones unicaciones.. * * * Nota del del traductor: traductor:
M ira con cuidado el esquema de conexión ent re el PIC PIC y el PC PC. Not arás que el M AX AX232 232 requier e de 4 capacitores electrolíticos de igual valor para su funcionamiento. Este chip se alimenta con +5V, sin embargo provee voltajes de +/- 12V. El secreto está en que los capacitores funcionan como dup licadores de volta je. Si Si observas la po larida d y la conexión de do s de estos capacito res, not ará s que, en uno de ellos, el polo negativo se conecta a +5V y en el otro, el polo positivo a Tierra. Esta config uración es COR CORR RECTA debid o a las razones explicadas ant eriorm ente. Adicionalm ent e, el cable cable serial solo requiere 3 líneas líneas conectada s: Rx Rx (pin 2), Tx(pin 3) y Tierra(pin 5 ). El El esquema muestra algunos pines puenteados entre sí esto no es estrictamente necesario pues por lo general no realizam realizam os un cont rol de handshake (protocolo d e sincroniz sincronización) ación)..
Capit uló 7: Ejem Ejem pl plos os para despl despleg egar ar dat d atos os Introducción 7.1 Dio do LED 7.2 Display Display de 7-Segmen 7-Segmen t os 7.3 Display LC LCD, Inter faces de 4-bit y 8-bit 7.4 LCD Gráf ico 7.5 Señaliza Señalización ción por Sonid o
Introducción Los microcont roladores trabajan m uy bien con 1’ s y 0’s, 0’s, pero los humanos no. Nosotr os neces necesitam itam os luces indicadoras, números, letras, gráficos, sonidos… Para poder comprender la información presentada de una m ejor y m ás rápida m anera, neces necesitam itam os que esa esa infor m ación ación se nos m uestr uestr e en diferent es form as. as. En En la práctica, la com com unicación unicación hu m ano–m áquina requiere recursos (de part e de la máquina) substanciales, así que algunas veces es mejor dedicar un microcontrolador entero a esa tarea. Es Este t ipo de dispositivo dispositivo se denom ina Interface Humano-M áquina ó sim sim plem ente HM I. Ento nces se requiere que el segundo microcontrolador obtenga los “deseos” humanos del HMI, que “haga el tr abajo” y luego ponga los resultados ot ra vez en el HM I, de maner a tal que el operador h um ano pueda verlos. Claramente, la forma más importante de comunicación entre el sistema microcontrolador y un humano es la comunicación visual. En este capítulo discutiremos varias formas de desplegar datos, desde los más simples hasta los más elaborados. Verás cómo utilizar diodos leds, displays de 7-segmentos, LCDs de caracteres y LCDs gráficos. También consideraremos usar el BASIC para la señalización señalización po r sonido necesaria necesaria en ciert as aplicaciones. Solo r ecuerda: cuanto cuanto m ás “ amigable” sea la comu nicación, nicación, se se requ erirán m ás recursos recursos del M CU.
7.1 Di od o LED Sin duda alguna uno de los componentes más usados en electrónica es el diodo led (Light Emitting Diode (Diod o Em Em isor isor de Luz)). Luz)). Algunas de las características de los dio dos led incluyen : tam año, fo rm a, color, voltaje de trabajo (voltaje de diodo) Vd y corriente de diodo I d . Los leds pueden tener bases de form as circulares circulares,, rectangulares, rectangulares, ó tr iangulares iangulares,, aunque los fabricantes fabricantes de estos com ponent es pueden producir cualquier forma requerida para propósitos específicos. El tamaño, es decir el diámetro para leds de base base circular, circular, tiene un rango rango de 3 a 12 m m , siendo siendo los tamaños de 3 – 5 mm los más común m ente ut ilizados ilizados.. Los colores m ás comu nes incluyen incluyen al rojo , amarillo, verde , naranja, azul, azul, etc. El El voltaje de t rabajo es de 1.7V para para el ro jo, 2.1V para el verde y 2.3 para el naranja. Es Este voltaje pu ede ser superior dependiendo del fabricante. Normalmente, la corriente I d a través del led es de 10mA,
m ientras que la máxima corrient e alcanz alcanzaa los 25m A. El El alto consumo de corrient e puede repr esent esent ar un problema para dispositivos con fuente de poder en base a baterías, en ese caso se deben utilizar diodos led de baja corriente de consumo (Id 1 – 2 mA). Para que un led emita luz a capacidad m áxima, es es necesario necesario conectarlo adecuadament e o pod ría resultar resultar d añado (ó peor aún , el M CU po dría dañarse).
El polo positivo se conecta al ánodo, mientras que tierra está conectada al cátodo. Para fines de diferenciación, el cátodo está marcado con una sección plana en la empaquetadura siendo el pin de m enor longitu d. El El led emit irá luz solament e sisi la corrient e fluye del ánodo ánodo al cátodo; de ot ra form a no existirá corriente. Se añade una resistencia en serie con el led, limitando así la máxima corriente que fluye a través del diodo y protegiéndolo de un daño irreparable. El valor de la resistencia puede ser calcula calculado do a p artir de la ecuación ecuación m ostr ostr ada en la figura, donde Vr representa el voltaje en la resis resisten ten cia. cia. Si usam usam os una fuent e de +5V y quer em os una corriente de 10 m A a t ravés de la resisten resisten cia, cia, se se debe usar usar un valor de 330 . El led puede ser conectado al microcontrolador de dos formas. La primera es hacer que el MCU “ encienda” encienda” al led led con con un uno lógico y la segunda es con un cero cero lógico. lógico. La La primer a for m a no es es m uy frecuente (lo que no significa que no tenga aplicaciones) debido a que requiere que el microcontrolador sea la fuente de corriente I d . La segunda forma trabaja con corrientes de led más altas.
Led se enciend e con un 1 ló gico gico
Led se enciend e Con u n 0 lógico
Los leds est est án conect ados al puert o B y se se encienden con un 1 lógico
El siguiente siguiente ejem plo conm ut a los leds en el puer to B cada cada segundo. segundo. program LEDs_Parpadeando main: TRISB = 0 PORTB = %11111111 Delay_ms(1000) PORTB = %00000000 Delay_ms(1000) goto main
' ' ' ' ' '
PORTB configurado como salida Encender leds en PORTB Esperar 1 segundo Apagar leds en PORTB Esperar 1 segundo Bucle infinito
end.
7.2 Display Display de 7-Segmen 7-Segmen t os Los dígitos dígitos de 7-segment 7-segment os representan una for m a m ás avanzada avanzada de com unicación unicación visual. El El no m bre proviene de los 7 leds (existe un octavo led para mostrar el punto (.)) conectados para formar los dígitos decimales del 0 al 9. La La apariencia de un dígito de 7-segm 7-segm ent os se se m uestr a en la figura.
Hacia Hacia el el pin del microcontr olador que contr ola este este segment segment o
Ya que los dígitos de 7-segmentos poseen mejor tolerancia de temperatura que los displays LCD, son muy comunes en aplicaciones industriales. Su uso satisface todos los criterios incluyendo los de orden financiero. Son Son comú nm ente ut ilizados ilizados para mo str ar los valores obt enidos de los sens sensores, ores, etc. Una de las formas de conexión de los displays de 7-segmentos se muestra en la figura inferior. El sistema está conectado par usar dígitos de 7-segmentos de cátodo común. Esto significa que los segment os emit en luz cuando cuando u n 1 ló gico gico llega a sus sus term inales inales,, y que la salida salida de t odo s los segmen to s debe estar conectada por un transistor al cátodo común, tal como se muestra en la figura. Si el tr ansis ansisto to r se encuentr a en el m odo de conducción, cualquier cualquier segm segm ent o con un 1 lógico emit irá luz, y sisi no está en m odo d e conducción, ningún segment segment o em itirá luz, sin sin im port ar es estado estado de los pines. pines. Digito Digito de Decenas
Digit Digit o de Unidades
Las bases de los transistores T1 y T2 están conectadas al pin0 y el pin1 del PORTA. Poniendo un 1 en estos pines activan los transistores, permitiendo que cualquier segmento, desde el “a” hasta el “h”, em ita luz con un 1 ló gico. gico. Si Si po nem os un 0 en la base base de los tran sisto isto res, ninguno d e los segment segment os em itirá luz, sin sin im port ar es estado estado de los pines. pines.
Usando Usando el esquem esquem a previo, pod em os mostrar una secuencia secuencia de nueve dígit dígit os de esta esta m anera: program Siete_seg_1_digito dim i as byte ' La function mask retorna una mascara del parametro 'num' ' para un display catodo comun de 7-seg
sub function mask(dim num as byte) as byte select case num case 0 result case 1 result case 2 result case 3 result case 4 result case 5 result case 6 result case 7 result case 8 result case 9 result end select end sub
= = = = = = = = = =
$3F $06 $5B $4F $66 $6D $7D $07 $7F $6F
main: INTCON TRISA TRISB PORTB PORTA
= = = = =
0 0 0 0 2
' Deshabilitar interrupciones PEIE, INTE, RBIE, T0IE ' Puertos A y B configurados como salida
' Habilitar display Digito de unidades
do for i = 0 to 9
' Barrer digitos del 0 al 9 PORTB = mask(i) ' Mostrar la mascara del digito en puerto B Delay_ms(1000) ' Esperar 1 segundo next i ' Bucle infinito loop until false
end.
El prop ósit ósit o d el program a es de desplegar desplegar los números del 0 al 9 en el display display “ Digito Digito de unidades”, con un ret ardo de 1 segundo. segundo. Para Para po der m ostrar u n nú m ero, su máscara máscara debe ser ser colocada en POR PORTTB. Por ejem plo, sisi necesitam necesitam os m ostrar el “ 1” , los segm segm ent os b y c deben estar en 1 y el r esto esto en 0. Si Si (de acuerdo al esquema anterior) los segmentos b y c están conectados a los pines segundo (RB.1) y t ercero (RB. (RB.2) 2) del PORTB ORTB,, ent onces los valores 0000 y 0110 d eben ser colocados en el PORTB ORTB.. Por lo tanto, la máscara para el número “1” es el valor 0000 0110 ó 06 en hexadecimal. La siguiente tabla cont iene los corr corr espond ient es valores de máscaras máscaras para los núm ero s 0 – 9:
Dígito Seg. h Seg. g Seg. f Seg. e Seg. d Seg. c Seg. b Seg. a
HEXADECIMAL
0
0
0
1
1
1
1
1
1
$3F
1
0
0
0
0
0
1
1
0
$06
2
0
1
0
1
1
0
1
1
$5B
3
0
1
0
0
1
1
1
1
$4F
4
0
1
1
0
0
1
1
0
$66
5
0
1
1
0
1
1
0
1
$6D
6
0
1
1
1
1
1
0
1
$7D
7
0
0
0
0
0
1
1
1
$07
8
0
1
1
1
1
1
1
1
$7F
9
0
1
1
0
1
1
1
1
$6F
Sin embargo no estás limitado a desplegar solamente dígitos. Puedes utilizar el decodificador de displays de 7seg ( Tools>7 Segment Decoder ), un herram ienta int egrada en el IDE de M ikroBas ikroBasic, para obt ener el código hexadecim hexadecim al de cualquier cualquier o tr a com binación posible de los segm segm ento s que qu isieras isieras desplegar. Pero, ¿Qué hacemos si necesitamos mostrar más de un dígito en dos o más displays? Debemos poner, lo suficientemente rápido, una máscara en el primer dígito y luego activar su transistor , posteriorm ent e ponem os la segunda segunda m ásca áscara ra y activamos el segundo segundo t ransis ransisto r (por supu esto esto , sisi un o de los transis transisto res es está en el m odo d e conducción, conducción, el otr o no deberá est est arlo por que sino ambo s dígitos dígitos desplegarán el mismo valor). Este proceso se conoce como “multiplexación”: los dígitos son desplegados en forma tal que el ojo humano tiene la impresión de que ambos dígitos están funcionando simultáneamente – en realidad solo uno de los displays esta activado en cualquier instante. Ahora, digamos que necesitamos mostrar el número 38. Primero, el número debe ser separado en decenas y unidades (en este caso, dígitos 3 y 8) y sus máscaras deben ser enviadas al PORTB. El resto
del program a es m uy similar al últim o ejemp lo, con excepc excepción ión de t ener un a transición transición causada causada por el despliegue despliegue de un d ígito ígito después después del ot ro:
program Siete_seg_2_digitos dim dim dim
v as byte por1 as byte por2 as byte
sub procedure interrupt begin if v = 0 then PORTB = por2 PORTA = 1 v = 1
' Enviar la mascara de decenas al PORTB ' Activar 1er display de 7seg, desactivar 2do
else PORTB = por1 PORTA = 2 v = 0
' Enviar la mascara de unidades al PORTB ' Activar 2do display de 7seg, desactivar 1ero
end if TMR0 = 0 INTCON = $20
' Limpiar TMRO ' Limpiar TMR0IF y activar TMR0IE
end sub main: OPTION_REG TRISA TRISB PORTB PORTA TMR0 por1 por2 INTCON
while true nop
= = = = = = = = =
$80 0 0 0 0 0 $7F $4F $A0
' ' ' ' ' ' ' ' '
Activar resistencias Pull-up internas PORTA configurado como salida PORTB configurado como salida Limpiar PORTB (asegurar que los LEDs esten apagados) Limpiar PORTA (desactivar ambos displays) Limpiar TMRO Mascara para '8' (revisa la tabla arriba) Mascara para '3' (revisa la tabla arriba) Habilitar T0IE
' Bucle infinito, esperar la interrupción ' hacer nada (perder tiempo)
wend end.
El problema de mu ltiplexac ltiplexación ión está está resuelto resuelto p or ahora, ahora, pero prob ablem ablem ente t u programa no tiene el único pr opósito de desplega desplegarr valores constantes constantes en d isplays isplays de 7seg. 7seg. Usualment Usualment e es solo solo una subrut ina para mostrar cierta información. Sin embargo, esta forma de mostrar datos en un display ha probado ser m uy conveniente para pro gramas m ás comp licados. licados. También p uedes mover la parte del pro grama que realiza realiza el barrido de los dígitos dígitos (manejo de m ásca áscaras ras)) a la rutin a de int errup ción.
El siguiente ejemplo incrementa la variable i desde 0 hasta 99 mostrando los valores en displays. Después Después de llegar llegar al 99, la cuenta em pieza nuevament e. program Siete_seg_Contador dim dim dim dim dim
i as byte j as byte v as byte por1 as byte por2 as byte ' Esta funcion retorna mascaras para display 7-seg catodo comun sub function mask(dim num as byte) as byte select case num case 0 result = $3F case 1 result = $06 case 2 result = $5B case 3 result = $4F case 4 result = $66 case 5 result = $6D case 6 result = $7D case 7 result = $07 case 8 result = $7F case 9 result = $6F
end select end sub sub procedure interrupt if v = 0 then PORTB = por2 PORTA = 1 v = 1
' Preparar mascara para digito de decenas ' Activar 1ero, desactivar 2ndo display 7-seg
else PORTB = por1 PORTA = 2 v = 0
' Preparar mascara para digito de unidades ' Activar 2ndo, desactivar 1er display 7-seg
end if TMR0 = 0 INTCON = $20
end sub main: OPTION_REG por2 j TMR0 INTCON TRISA TRISB PORTB PORTA
= $80 = $3F = 0 = 0 = $A0 = 0 = 0 = 0 = 0
do for i = 0 to 99 j = i mod 10 por1 = mask(j)
' Deshabilitar PEIE, INTE, RBIE, T0IE
' Contar desde 0 a 99 ' Preparar digito de unidades
j = (i div 10) mod 10 ' Preparar digito de decenas por2 = mask(j) Delay_ms(1000) next i loop until false
end.
' Retardo de 1 segundo ' Bucle infinito
En el curso del programa principal, el programador no necesita preocuparse para actualizar (refr eshin eshin g) el display. Bas Basta ta con llam ar a la subr subr ut ina mask cada vez que el display necesit necesit a cam cam biar.
7.3 Display Display LCD, Int erf ac aces es de 4-bit y 8-bi t Una de las mejores soluciones para dispositivos que requieren visualizar datos es el Display de Cristal Líquido (LC (LCD) “ inteligent e” . Es Este tipo de display consis consiste te en segment os de punt os de 7x5 or denados en filas. Una fi la puede con sistir d e 8, 16, 20, ó 40 segmen t os, y el display display LCD LCD pued e t ener 1 , 2, ó 4 filas.
Ejem plo d e conexió n a un d isplay LC LCD
El LCD se conecta al microcontrolador a través de un bus de 4-bit u 8-bit (4 u 8 líneas). La señal R/W está a tierr a, debido a qu e la com unicación es en un sent ido (hacia el LC LCD). Alguno Alguno s displays displays tienen luz de fon do (backlight (backlight ) incorporada qu e puede ser encendida con el pin RD1 a través de u n t ransis ransisto to r PNP BC557. El siguiente siguiente ejemp lo im prim e texto en el LC LCD a través de una interface de 4-bit. 4-bit. Se Se asum asum e que usam usam os la configuración configuración de p ines por om isión. isión.
program Prueba_LCD_4bit dim Text as char[20] main: TRISB = 0 LCD_Init(PORTB) LCD_Cmd(LCD_CURSOR_OFF) Text = "mikroelektronika" LCD_Out(1, 1, Text)
' PORTB configurado como salida ' Inicializar LCD en PORTB ' Apagar cursor ' Imprimir texto en el LCD
. end
El segundo segundo ejem plo imp rim e text o en el LC LCD a tr avés de una int erface de 8-bit, con una configuración de pines definida por el usuario. usuario. program Prueba_Lcd_8bit dim text as char[20] main: TRISB = 0 TRISD = 0 Lcd8_Init(PORTB, PORTD) Lcd8_Cmd(Lcd_CURSOR_OFF) text = "mikroElektronika" Lcd8_Out(1, 1, text) . end
' ' ' '
PORTB configurado como salida PORTD configurado como salida Inicializar LCD en PORTB y PORTD Apagar cursor
' Imprimir texto en el LCD
7.4 LCD Gráf ico El LCD gráfico (GLCD) más comúnmente usado tiene una resolución de 128x64 pixeles. Esto permite crear mensajes visuales más elaborados que los que puede proveer un LCD, involucrando dibujos y m apas de bit s. La siguient siguient e figura m uestr a la conexión en h ardw are del GLC GLCD con la inicializa inicialización ción po r om isión isión (usando la rutina GLCD_LCD_Init); si requieres una configuración de pines diferente, refiérete a la rutina GLCD_LCD_Config.
BASIC ofrece una librería comprensiva para los GLCD – refiérete al “ Capítulo 5: Rutinas de Librerías Incorporadas” para más información. El siguiente ejemplo demuestra las posibilidades del GLCD y la librería mencionada. Not a que la librería solo solo f unciona con m icrocontr oladores PIC PIC18. 18.
program GLCD_test include "GLCD_128x64.pbas"
' Para microcontroladores PIC18 ' Libreria requerida
dim text as string[25] main: PORTC PORTB PORTD TRISC TRISD TRISB
= = = = = =
0 0 0 0 0 0
GLCD_LCD_Init(PORTC, PORTD) GLCD_Set_Font(FONT_NORMAL1)
' configuracion por omision
while true GLCD_Clear_Screen ' dibujar circulos text = "Circle" GLCD_Put_Text(0, 7, text, NONINVERTED_TEXT) GLCD_Circle(63,31,10)
Delay_Ms(4000) ' dibujar rectangulos GLCD_Clear_Screen text = "Rectangle" GLCD_Put_Text(0, 7, text, NONINVERTED_TEXT) GLCD_Rectangle(10, 0, 30, 35)
Delay_Ms(4000) ' dibujar lineas GLCD_Clear_Screen text = "Line" GLCD_Put_Text(55, 7, text, NONINVERTED_TEXT) GLCD_Line(0, 0, 127, 50) GLCD_Line(0,63, 50, 0)
Delay_Ms(5000) ' Fonts Demo ' demostración de tipos de letra GLCD_Clear_Screen text = "Fonts DEMO" GLCD_Set_Font(FONT_TINY) GLCD_Put_Text(0, 4, text, NONINVERTED_TEXT) GLCD_Put_Text(0, 5, text, INVERTED_TEXT) GLCD_Set_Font(FONT_BIG) GLCD_Put_Text(0, 6, text, NONINVERTED_TEXT) GLCD_Put_Text(0, 7, text, INVERTED_TEXT) Delay_ms(5000)
wend end.
7.5 Señal Señaliz ización ación p or Son id idoo Algunas aplicaciones requier en la señalización señalización po r sonid o en ad ición a la visual o en vez de esta. Se Se usa comú nm ente p ara alertar alertar o anunciar la culminación de algún algún pr oceso oceso de largo consum consum o de t iemp o. La La inform ación ación presentada por este med io es relativamen te simple, pero aliviana aliviana al usuario usuario el tener que est est ar m onitor eando constantem ente el display o los sinto sinto nizadores. nizadores. La librería de sonido de BASIC facilita la generación y salida de señales sonoras por un puerto especí específico. fico. Pres Presentarem entarem os una dem ostración sim sim ple ut ilizando ilizando u n parlant e piezo-m piezo-m étr ico conectado conectado al puerto del m icrocontrolador. icrocontrolador. program Sound
' Los siguientes 3 tonos son calculados de un cristal de 4MHz
sub procedure Tone1 Sound_Play(200, 200)
' Periodo = 2ms <=> 500Hz, Duracion = 200 periodos
end sub sub procedure Tone2 Sound_Play(180, 200)
' Period0 = 1.8ms <=> 555Hz
end sub sub procedure Tone3 Sound_Play(160, 200)
' Periodo = 1.6ms <=> 625Hz
end sub sub procedure Melody
' Tocar una melodia
Tone1 Tone2 Tone3 Tone3
end sub main: TRISB = $F0 Sound_Init(PORTB, 2) Sound_Play(50, 100)
while true if Button(PORTB,7,1,1) then Tone1
' Conectar parlante entre los pins RB2 y GND
' Si se presiona el boton en RB7 ' se toca el Tono1
end if while TestBit(PORTB,7) = 1
' Esperar a que el boton sea liberado
nop
wend if Button(PORTB,4,1,1) then Melody
end if while TestBit(PORTB,4) = 1 nop
wend wend . end
' Si se presiona el botón RB4 ' se toca la melodia ' Esperar a que el boton sea liberado
Capit uló 8: Ejem Ejem plos con M em oria y M edios de Almacenamiento Introducción 8.1 M em or ia EE EEPROM 8.2 M emo ria Flas Flashh 8.3 Flas Flashh com pacta
Introducción No existe un programa en el mundo que no interactué con la memoria de alguna forma. Primero, dur ant e su ejecución, obt iene los dat os oper acionales desde, usa, alter a, vuelve a alm acenarla en, la memoria de programa. Segundo, a menudo es necesario guardar y manejar grandes cantidades de dato s que son son o bt enidos desde desde distintas fuent es, es, ya sea sea desde desde un m ódulo de adquisición adquisición de datos de la tem peratur a de un m ot or ó para una im agen agen en m apa de bit s a ser ser desplegada desplegada en un GLC GLCD. En En este capítulo nos enfocaremos en lo problemas referidos a la segunda forma, es decir repasaremos las técnicas técnicas para la manipulación de dato s en los denom inados dispositivos dispositivos y sis sistem tem as de almacenam almacenam iento de memor ia. ia.
8.1 M em or ia EE EEPROM Los dato s usados usados por el m icrocont icrocont rolador son alm acenados acenados en la m em oria RAM RAM m ientr as la fuent e de energía esté presente. Si necesitamos mantener los datos para un uso posterior, debe ser almacenada en una memoria permanente. Un dispositivo EEPROM (E2 PROM) (Electrically Erasable Programmable Read-Only Memory) es un chip de almacenamiento no-volátil, comúnmente usado en los microcontroladores PIC para ese propósito. Una EEPROM puede ser programada y borrada muchas veces veces de manera eléctrica – puede ser borr ada y reprogram ada una cierta cantidad de veces, veces, dentr o de un rango de 100 000 a 1 000 000, pero puede ser leída leída un núm ero ilim itado d e veces. veces.
8.1.1 EE EEPROM in t ern a Algunos m icrocontro ladores PIC PIC poseen una EE EEPROM int erna que les perm ite almacenar almacenar i nfor m ación ación sin ningún hardw are extern extern o adicional. adicional. BASIC tien e una libr ería para tr abajar con la EE BASIC EEPROM int erna q ue hace que la escrit escrit ura y lect ura d e los dat os sea sea m uy sencilla. sencilla. La La fun ción de lib rería EEPROM_Read lee datos desde una dirección especificada, m ientras que el procedimiento EEPROM_Write escribe escribe un d ato en la dirección especificada.
Nota: Ten en cuenta que todas las interrupciones estarán deshabilitadas durante la ejecución de la
rutina EEPROM_Write (el bit GIE del regist regist ro INTCON será limp iado (puesto (puesto en 0)). La La rut ina repon drá (pondrá a 1) el bit cuando acabe. acabe. Asegura Asegura un ret ardo m ínim ínim o de 20ms entr e usos usos suces sucesivos ivos de las rutinas EEPROM_Write y EEPROM_Read .Aunque la EEPROM escribirá el valor correcto, EEPROM_Read podría retornar un resultado resultado indefinido. En el siguiente ejemplo, escribiremos una secuencia de números a localizaciones sucesivas de la EEPROM . Poster Poster iorm ent e, los leerem os y los saca sacarem rem os por el POR PORTB par a verificar el p ro ceso. ceso. program EEPROM_test dim i as byte dim j as byte main: TRISB = 0
for i = 0 to 20 EEPROM_Write(i, i + 6)
next i Delay_ms(30)
for i = 0 to 20 PORTB = EEPROM_Read(i) for j = 0 to 200 Delay_us(500) next j next i . end
8.1.2 8.1 .2 EE EEPR PROM OM Ser ial Ocasionalmente, nuestros requerimientos excederán la capacidad de la EEPROM interna del PIC. Cuando n ecesi ecesitam tam os almacenar almacenar una cantidad m ayor de dat os obt enidos por el PIC PIC, tenem os la opción de u sar sar u na EE EEPROM serial exter na. Serial Serial significa que la EE EEPROM ut iliza uno d e los pr ot ocolos seriales (I2C, (I2C, SP SPI, microw ire) para la comunicación comunicación con el m icrocont icrocont rolador . En En nu est est ro ejem plo, t rabajaremos con un EEPROM de la familia 24Cxx que usa dos líneas y el protocolo I2C para la comunicación con el MCU.
Dirección I2C de la EEPROM EEPROM e s $A2
Ejemplo de conexión de un a EEPROM EEPROM SERIAL SERIAL
La EE EEPR PROM OM serial se co nect a la m icro cont ro lado r a t ravés d e las líneas SCL SCL y SDA. SDA. SC SCL (Seri (Seri al CL CLock) es una señal de reloj que sincroniza la transferencia de datos por la línea SDA (Serial DAta), con fr ecuencias que van h ast ast a 1 M Hz.
La comunicación I2C perm ite la conexión conexión d e m últ iples dispositivos dispositivos en una línea única. única. Por Por lo t anto, los bit s A1 y A0 ti enen la opció n de asignar asignar d irecciones a ciert ciert os dispositivo dispositivo s I2C conectan do lo s pines A1 A1 y A0 a tierra y +5V (una línea I2C puede ser una EEPROM en la dirección $A2 y, digamos, un reloj de tiem po real PC PCF8583 en la dirección dirección $A0). El El bit R/ W del byt e de dirección selecc selecciona iona la op eración eración de lectura o escritu escritu ra de dato s de m em oria. M ás det alles alles de la com unicación unicación I2C puede ser encont rada en PIC16F84 84 Desarro Desarro llo de Proyecto Proyecto s de Palacios, e l Capítulo 21. BUS I2C de libro M icrocont rolad or PIC16F
Rem iro y López. López.
El siguiente programa envía datos a la EEPROM en la dirección 2. Para verificar la transferencia, leeremos los datos a través del I2C de la EEPROM y enviaremos el valor al PORTD. Para más info rm ación acerca de la Librer Librer ía I2C consulta el Capítulo 5: Rut Rut inas Incorp Incorp orad as y de Librería
program Prueba_EEPROM dim EE_adr as byte dim EE_data as byte dim jj as word main: I2C_init(100000) TRISD = 0 PORTD = $ff I2C_Start I2C_Wr($a2) EE_adr = 2 I2C_Wr(EE_adr) EE_data = $aa I2C_Wr(EE_data) I2C_Stop
for jj = 0 to 65500
' ' ' ' '
Inicializar modo maestro completo PORTD configurado como salida Inicializar PORTD Secuencia de inicio I2C Enviar byte a traves de I2C(commando al 24cO2)
' Enviar byte(direccion de EEPROM) ' Enviar dato(dato a ser escrito) ' Secuencia de parada I2C ' Pausa mientras la EEPROM escribe los datos
nop
next jj I2C_Start I2C_Wr($a2) EE_adr = 2 I2C_Wr(EE_adr) I2C_Repeated_Start I2C_Wr($a3) EE_data = I2C_Rd(1) I2C_Stop PORTD = EE_data SinFin: goto SinFin . end
' Secuencia de inicio I2C ' Enviar byte a traves de I2C ' ' ' ' ' ' '
Enviar byte(direccion de EEPROM) Secuencia de Reinicio I2C Enviar byte (requerir datos de la EEPROM) Leer el dato Secuencia de parada I2C Mostrar dato en PORTD Bucle infinito
8.2 M emo ria Flas Flashh La m em oria Flas Flashh es una f orm a de EEP EEPROM que perm ite qu e m últ iples localiz localizac aciones iones de m em oria sean borradas o escritas en una sola operación de programación. La EEPROM normal solo permite que una localización sea borrada o escrita a la vez, lo que significa que la Flash puede operar a velocidades superiores cuando el sist sist em a requiere leer y escribir escribir a difer entes localiz localizaciones al m ism ism o t iemp o. La memoria Flash almacena la información en un chip de silicio de manera tal que no necesita alimentación para mantener la información en el chip. Esto significa que si apagamos la fuente de aliment ación, ación, la info rm ación ación es retenida en el chip sin consumir energía energía alguna. alguna. Adicionalment e, Flas Flashh ofrece tiempos de acceso a lectura rápidos y resistencia a vibraciones y choques de estado-sólido. Estas características hacen que sea muy popular para aplicaciones con microcontroladores y también para aplicac aplicaciones iones que requieren almacenamiento en dispositivos dispositivos aliment ados por bater ía como ser los teléfonos celulares. Muchos microcontroladores PIC modernos utilizan memoria Flash, usualmente en adición al alm acenaje en chip de EE EEPROM no rm al. Por Por lo t ant o, BAS BASIC pr ovee una lib rería para acceder acceder y t rabajar
directam ente con el Flas Flashh del M CU. Nota: Las rut inas difier en par a las familias PIC PIC16 16 y PIC18, PIC18, por favo r ref iéret e al Capítu Capítu lo 5: Rut Rut inas Incorp Incorp orad as y de Librer Librer ía. ía. El siguiente siguiente código d em uestr uestr a el uso de las rut inas de la libr ería de M em oria Flas Flash: h: program Prueba_flash_pic18 const FLASH_ERROR = $FF = $AA const FLASH_OK dim toRead as byte dim i as byte dim toWrite as byte[64] main: TRISB = 0
for i = 0 to 63
' Para PIC18
' PORTB configurado como salida ' Inicializar arreglo
toWrite[i] = i
next i Flash_Write($0D00, toWrite)
PORTB = 0 toRead = FLASH_ERROR for i = 0 to 63 toRead = Flash_Read($0D00+i)
if toRead <> toWrite[i] then PORTB = FLASH_ERROR Delay_ms(500)
' ' ' ' '
escribir contenidos del arreglo empezando en la direccion 0x0D00 Verificar la escritura apagar PORTB inicializar estado como Error
' ' ' '
leer 64 localizacioes consecutivas empezando desde 0x0D00 Parar al primer error Indicar error
else PORTB = FLASH_OK
' Indicar que no existe error
end if next i
Para la fam ilia PIC PIC16, 16, el código cor respond ient e es el siguient siguient e: program Prueba_flash_pic16 const FLASH_ERROR = $FF = $AA const FLASH_OK dim toRead as word dim i as word main: TRISB = 0
' Para PIC16
' PORTB configurado como salida
for i = 0 to 63 Flash_Write(i+$0A00, i)
next I PORTB = 0 toRead = FLASH_ERROR for i = 0 to 63 toRead = Flash_Read($0A00+i)
if toRead <> i then i = i + $0A00 PORTB = FLASH_ERROR Delay_ms(500)
' ' ' ' '
escribir el valor de i empezando de la direccion 0x0A00 Verificar la escritura apagar PORTB inicializar estado como Error
' ' ' ' ' '
leer 64 localizacioes consecutives empezando desde 0x0A00 Parar al primer error i contiene la direccion de la localicacion erronea Indicar error
else PORTB = FLASH_OK
end if next i . end
' Indicar que no existe error
8.3 Flash Flash Com Com pact a Flash Compacta (Compact Flash) (CF) originalmente fue un tipo de dispositivo de almacenaje de datos, usado en dispositivos electrónicos portátiles. Como dispositivo de almacenaje, típicamente utiliza memoria Flash en un encapsulado estandarizado. En la actualidad, este formato físico es utilizado en computadores portátiles, cámaras digitales, y una gran variedad de otros dispositivos, incluyendo compu tador es de escritor escritor io. Una gran gran capacidad capacidad (8M B ~ 8GB, y más) y un excelente tiempo de acceso (típicamente de algunos microsegundos) hacen que la CF sea muy atractiva para aplicaciones con microcontroladores. Los dispositivos de memoria Flash son no-volátiles y de estado sólido, siendo, por lo tanto, más rob ustos que los discos discos du ros. Consum en solamen te cerca del 5% de la energía requerid a por lo s discos pequeños. Operan con 3.3 volts ó 5 volts, y pueden ser intercambiados de sistema a sistema. Las tarjet as CF pueden soport ar cam cam bios extr extr emadam ente r ápidos en t em peratu ra – versiones versiones industr industr iales de tarjet as de m em oria Flas Flashh pueden operar en un rango de -45°C a +85 °C. BASIC incluye una librería para acceder y manejar datos en una tarjeta CF. En esta, los datos están divididos en sectores. Un sector tiene usualmente 512 bytes (algunos modelos antiguos tienen sectores de 256B). Las operaciones de Lectura (Read) y Escritura (Write) no son realizadas directam ente, sino suces sucesivament e a t ravés de u n buffer de 512B. Es Estas rut inas están están configuradas para usarse con tarjetas CF que están formateadas con un sistema de archivos FAT16 y FAT32. Nota: Las CF_File_Write_Byte, rutinas para manejo de archivos ( CF_File_Write_Init, CF_File_Write_Complete ) solamente pueden ser usadas con el sistema de archivos FAT16, y ¡Únicam ent e con la fam ilia PIC PIC18! 18!
Las rutinas de acceso a archivos pueden escribir (grabar) un archivo. Los nombres de archivo deben t ener exact exact am ent e 8 caract caract eres de longit ud y ser escrit escrit os en M AY AYUS USCCULAS. ULAS. El El usuario d ebe asegur asegur arse que cada archivo tenga un nombre diferente, ya que las rutinas CF no revisan si existen archivos con nombres repetidos. Antes de realizar una operación de escritura, asegúrate que no sobre escribas (overwrite) el sector de Arranque (Boot) ó FAT ya que esto podría hacer que tu tarjeta no pueda ser
leída en la PC ó cámara digital. Herramientas de mapeo de discos, como ser Winhex, pueden ser de gran utilidad.
Aquí tienes un ejem plo en BASIC BASIC del uso de una t arjeta CF. CF. Un gru po d e archivos es escrito escrito en la t arjeta CF. Esto puede ser revisado posteriormente conectando la tarjeta CF en una PC ó cámara digital. Observa Observa la form a en qu e el archivo se graba: graba: •
• •
Primero, se inicializa el ciclo write-to-file (escribir a archivo), indicándole al PIC que todas las instrucciones CF_File_Write_Byte consecutivas serán serán escritas a un nuevo archivo ; Luego, la escrit escrit ura d e dat os se se realiza (usando CF_File_Write_Byte ); Finalment e, se señaliz señalizaa la fin alizac alización ión d el ciclo de escritura a archivo (w rit e-to-file) m ediante una llamada a la rutina CF_File_Write_Complete . En ese instante, se le da un nombre al archivo acabado de crear.
program Archivo_CompactFlash
'Para PIC18
dim i1 as word dim index as byte dim fname as char[9] dim ext as char[4] sub procedure Inicio TRISC = 0
CF_Init_Port(PORTB, PORTD)
'Procedimiento de inicio 'PORTC configurado como salida. 'Sera usado solamente para indicar 'el final del programa. 'Inicializar puertos
do nop
loop until CF_DETECT(PORTB) = true Delay_ms(50)
end sub
'Esperar hasta que se inserte tarjeta CF 'Esperar hasta que la CF se estabilice, 'es decir :fuente de poder estable y el 'controlador tarjeta CF este encendido
main: 'Extension de archive sera "txt" ext = "txt" index = 0 'Indice de archivo a ser escrito while index < 5 PORTC = 0 Inicio PORTC = index CF_File_Write_Init(PORTB, PORTD) 'Inicializacion para escribir 'el nuevo archivo i1 = 0 while i1 < 50000 CF_File_Write_Byte(PORTB,PORTD,48+index) 'Escribe 50000 bytes al archivo inc(i1)
wend fname = "RILEPROX"
'Nombre de longitud 8 caracteres y 'en MAYUSCULAS fname[8] = 48 + index 'Asegurar que los archivos tienen nombres 'diferentes 'Cerrar el archivo CF_File_Write_Complete(PORTB,PORTD, fname, ext) Inc(index)
wend PORTC = $FF . end
Si no requieres usar tu tarjeta CF para conectarla a un PC o cámara digital, sino solamente como un simple dispositivo de almacenaje para el microcontrolador PIC, entonces puedes ignorar todo el siste siste m a FAT FAT y guardar los datos direct am ent e en los secto secto res de la m em or ia CF CF:
program Prueba_CF dim i as word
main: TRISC = 0 CF_Init_Port(PORTB,PORTD)
'PORTC configurado como salida 'Inicializar puertos
do nop
loop until CF_Detect(PORTB) = true
Delay_ms(500) CF_Write_Init(PORTB, PORTD, 590, 1)
for i = 0 to 511 CF_Write_Byte(PORTB, PORTD, i + 11) next i PORTC = $FF Delay_ms(1000) CF_Read_Init(PORTB, PORTD, 590, 1)
'Esperar hasta que se inserte CF
'Inicializar escritura en el sector 'con direccion 590 '1 sector de 512 bytes 'Escribir 512 bytes al sector (590)
'Inicializar escritura en el sector 'con direccion 590 '1 sector de 512 bytes 'Leer 512 bytes del sector (590) for i = 0 to 511 PORTC = CF_Read_Byte(PORTB, PORTD) 'y mostrar datos en PORTC Delay_ms(1000) next i . end
Capit uló 9: Ejem Ejem pl plos os de Com Com un ica icacció iónn Introducción 9.1 USAR USARTT y UART po r Sof Sof t w are 9.2 SPI SPI y SPI SPI por Sof t w are 9.3 I2C e I2C po r Soft Soft w are 9.4 Código Código M anches anchester ter 9.5 RS485 9.6 OneWir e 9.7 CAN & CANSP ANSPII
Introducción Cuando empieces a escribir programas ‘reales’ con los PIC, pronto encontrarás una sensación de no ten er suficient suficient e ‘espacio’, ‘espacio’, de q ue lo que n ecesitas ecesitas son son solament e alguno alguno s pines extra y algunos bytes de m em oria adicionales adicionales para term inar el tr abajo. Quizás Quizás puedas resolver resolver este problem a cam cam biando a un PIC m ás grande, grande, esto fu ncionará, al menos po r un t iem po. Ó q uizás uizás acabas acabas de en contrar el sensor sensor perfecto que ‘realiza todo el trabajo por si solo’, lo único que necesitas es conectarlo al PIC para transferir los datos. Eso es, si es que sabes cómo conectarlo. Si te han ocurrido estos problemas o algunos bastante similares, es hora de que le enseñes al PIC y a ti mismo algunas lecciones de comunicación. Existen muchas maneras de que dos dispositivos se comuniquen hoy en día, y los PICs están bien equipados para es est a tarea. Dependiendo del t rabajo que se tiene que r ealizar, ealizar, el intercamb io de d atos – lo q u e b ásicam ási cam en t e r ep r ese n t a la com co m u n icac ic ació ió n – p u ed e ser real re aliza izadd a d e u n a m an er a r e lat la t ivam iv am en t e simple, tal como la comunicación SPI, ó puede extenderse a una red entera de varios dispositivos – M CUs, PCs, cámar as, as, sensores sensores “ int eligent es”, et c. Con u na m ayor de m anda de com unicación, las reglas del comportamiento de los dispositivos deben enmarcarse en un conjunto más amplio de escenarios posibles posibles y, por lo t anto , los los prot ocolos de comu nicación nicación crecerán crecerán dram áticam áticam ente en com plejidad (por ejemplo, CAN). Considera tus necesidades cuidadosamente antes de lanzarte a una solución basada en CAN. Existen diferentes métodos de comunicación, que ofrecen muchas posibilidades en distintos niveles de complejidad. La regla básica de “mantenlo lo más simple posible” se aplica aquí bastante bien: ¡No uses uses herramient as de com unicación unicación m ás com plejas de lo que r ealment e necesitas! necesitas! En este capítu capítu lo, te en contr arás con varios medio s de com com unicación unicación q ue están siendo siendo usados usados por los M CUs PIC PIC,, y las for m as en las cuales cuales pued es accederlas accederlas y usarlas en el l enguaje d e p rogr am ación BASIC BASIC.. Quizás hayas notado que algunos de los dispositivos de comunicación tienen su contraparte en software, lo que significa que puedes tener la misma funcionalidad de comunicación en hardware a
través de un conjunto de rutinas en software que pueden ser usadas a través del lenguaje BASIC. Deberías usar estas rutinas de comunicación en software una vez que hayas utilizado los recursos ‘reales’ en hardw are pero aú n así así necesit necesit as una línea de com unicación adicional.
9.1 USAR USART T y UART UART po r Sof Sof t w are 9.1.1 9.1 .1 US U SART USART significa Transmisor/Receptor Síncrono/Asíncrono Universal ( Universal Synchronous/Asynchronou ynchronous/Asynchronou s Receiver/Transmitter ). Puede Puede sonar m ister ister ioso, pero en realidad es el dispositivo dispositivo de com unicación unicación m ás frecuentemente usado hoy en día a través del mundo de los computadores: Microcontroladores, celulares (alguno (alguno s), s), lecto res de cód igo de barr as, as, PCs… PCs… Prim ero veam os que signif signif ican cada cada un a de esas esas palabr as: as: • •
•
ignifica que puede ser usada usada por u n am plio conjunt o de d ispositivos ispositivos Universal significa Síncrono/ Asíncron Asíncron o indica si es que los dispositivos que desean comunicarse entre ellos requ ieren ó n o, una línea de sincro sincro nización nización ext erna (Reloj (Reloj (Clock)). (Clock)). Es Est e dispositivo p resent e en la mayoría de los PICs, puede comunicarse de ambas formas. El modo Asíncrono (sin línea de Reloj) es m ás fácil fácil de im plem entar, aunqu e po r lo general general es más lent lent o que el m odo Síncrono. Es t am bién la fo rm a m ás ant igua de com unicación – las pri m eras versiones versiones de PIC PICss no t enían la posibilidad posibilidad de t rabajar en el m odo síncrono íncrono , por lo que lo s dispositivos dispositivos se denom inaban UART UART (sin la ‘S’) Receptor/Transmisor significa que este dispositivo puede recibir y enviar (transmitir) datos sim ult áneament e. También También se denom ina com com unicación unicación de do ble vía vía ó dúplex.
El USART en si mismo puede ser configurado para comunicarse en muchas formas. La más frecuente es, por supuesto, la qu e perm it e al PIC PIC ‘hablar ’ con l a PC PC. Es Est e ant iguo estánd ar, con con ocido com o RS232, RS232, es enten dido por u n 99.9% de las PCs, aunque úl tim ament e est est á siendo siendo r eem plazado plazado por el estánd estánd ar USBB. Puedes US Puedes ver, en la im agen inf erior , cómo conect ar el PIC PIC al PC PC. Tienes Tienes que añadir un ch ip adicion al ent re am bos (M AX AX232) 232) que simp lemen te ajusta ajusta los niveles de volt aje el USAR USARTT a los niveles niveles requeridos por el estánd ar RS232. RS232.
Com o pu edes ver, neces necesitas itas dos líneas líneas para para este t ipo d e com unicación: unicación: una p ara la recepción de d atos (llamada Rx), y la otra para la transmisión (Tx). Aquí tienes un programa simple en BASIC en el que el PIC recibe dat os desde el PC y lu ego los vuelve a e nviar: program RS232com dim received_byte as byte main: USART_Init(2400) while true if USART_Data_Ready = 1 then received_byte = USART_Read USART_Write(Received_byte)
' Inicializar modulo USART ' Si se recibe un dato: ' leer dato recibido, ' enviarlo de Nuevo al USART
end if wend . end
Cuando compiles este programa y lo escribas en el PIC, puedes abrir algún programa de comunicación serial en tu PC (programa Terminal), tal como el Windows Terminal, configurar los parámetros de conexión , abrir la conexión , y enviar al gunos caracteres al PIC PIC.. Si Si to do está bien, el PIC t e devol verá los m ism ism os datos.
9.1.2 UART UART po r Sof Sof t w are Si ya has ut ilizado el USAR USARTT en h ardw are y necesitas otr o canal de com unicación (po r ejem plo si deseas com unicart e con d os PC PCs) o qu izás izás no t ienes un di spo sit ivo USAR USARTT (en lo PIC PICs más pequeñ os), ento nces puedes usar usar el UART UART por softw are. Tal Tal y com com o im plica su n om bre, ut iliza iliza un conjunt o de r ut inas en
program soft_uart_test dim received_byte as byte dim rec_ok as byte main: Soft_UART_Init(PORTB, 1, 2, 2400)
' inicializar UART por software ' debes indicar que pines ' usar como Rx y Tx
while true do received_byte = Soft_UART_Read(Rec_ok)
' leer dato recibido
loop until rec_ok Soft_UART_write(received_byte)
' enviarlo de nuevo al UART
wend . end
soft w are para simular el d ispo ispo sit ivo USAR USARTT real en har dw are. Trabajar Trabajar con el U AR ARTT en soft w are es cas casii idéntico que con el USART hardware, la única diferencia es la inicialización. Puedes ver esto en el siguiente ejemp lo:
9.2 SP SPI y SP SPI po r sof t w are SPI o Interface Serial de Periféricos (Serial Peripheral Interface) es probablemente el estilo de comunicación más simple entre tu PIC y el mundo exterior. Sin embargo está limitado a la comunicación entre chips, lo que significa que los cables deben ser tan cortos como sea posible. La idea básica es permitir que dos chips intercambien información de una manera maestro-esclavo (master-slave), el maestro inicializa la comunicación, selecciona con que esclavo se va a comunicar, y pro vee un relo j (clock) para la sincro sincro nización nización . En En la m ayoría de los casos casos el PIC PIC será el m aest aest ro y ped irá datos a los otros chips menos “ int eligentes” eligentes” , les dará comand os para ejecut ejecut ar, etc. El siguien siguien t e ejem plo usa las rut inas SP SPI del BAS ASIC IC para acceder al chip m ax7219, el cual es usado par a controlar hasta ocho displays de 7 segmentos. Todo esto se logra usando un único pin del PIC (RC1) para la com uni cación cación . Para Para pr opó sitos de selección selección del chip y sincron ización ización de relo j, los pins SD0, SD0, SDI SDI y SCK en am bos PIC PICss tam bién d eben estar int er-conect ados. program SPI include "m7219.pbas" dim i as byte main: SPI_Init TRISC = TRISC and $FD max7219_init PORTC.1 = 0 SPI_Write(1) SPI_Write(7) PORTC.1 = 0 . end
' Configuracion estandard ' ' ' ' '
Inicializar max7219 Seleccionar max7219 Enviar direccion (1) al max7219 Enviar datos (7) al max7219 Desactivar max7219
Y el m ódulo m 7219.bas t iene la siguiente siguiente codificación: codificación: module m7219 sub procedure max7219_init ' SELECCIONAR MAX PORTC = PORTC and $FD SPI_Write($09) SPI_Write($FF) PORTC = PORTC or 2 PORTC = PORTC and $FD SPI_Write($0A) SPI_Write($0F) PORTC = PORTC or 2 PORTC = PORTC and $FD SPI_Write($0B) SPI_Write($07) PORTC = PORTC or 2 PORTC = PORTC and $FD SPI_Write($0C) SPI_Write($01) PORTC = PORTC or 2 PORTC = PORTC and $FD SPI_Write($00) SPI_Write($FF) PORTC = PORTC or 2
' modo BCD para la decodificacion de digitos ' DESACTIVAR MAX ' SELECCIONAR MAX ' intensidad de luminosidad de segmentos ' DESELECT MAX ' SELECCIONAR MAX ' Acutalización del Display (refresh) ' DESACTIVAR MAX ' SELECCIONAR MAX ' Encender el display ' DESACTIVAR MAX ' SELECCIONAR MAX ' No realizar prueba (test) ' DESACTIVAR MAX
end sub . end
Usar Usar el softw are SP SPI es similar a cualquier cualquier com unicación unicación po r soft w are – el soft soft w are contenido en las rutinas BASIC simula al dispositivo real. Tomando esto en cuenta, debes ser cuidadoso con las rutinas de inicialización. Aquí hay un ejemplo que utiliza el SPI por software para “hablar” con otro chip (el conversor conversor A/ D de 12-bit de canal múlt iple LT LTC1290) , est est a vez por m edio del p in RD1. RD1.
'******************************************************************************* ' Proyecto: LTC1290 ' Este codigo demuestra el uso de las rutinas software para la comunicacion SPI. ' Tambien, este ejemplo demuestra el trabajo con el ADC LTC1290. ' el pin CS del LTC1290 debe estar conectado al pin RD1 ' y los pines DSO, SDI, SCKL deben estar conectados apropiadamente. ' El resultado de la conversion AD se muestra en el display LCD. ' Probado en los chips 16F877A y 18F452 '******************************************************************************* program ltc1290
dim low_res as byte dim high_res as byte dim t as char[17] 'Formatea y muestra el resultado en el LCD sub procedure Display_ADval dim tmp as word dim value as longint tmp = word ((high_res << 4)) + word ((high_res (low_res
>> 4) (low_res
value = (5000*tmp) >> 12 tmp = word (value) (value) t[1]= 48 + word (tmp div 1000) (tmp t[3]= 48 + word ((tmp div 100) mod 10) ((tmp t[4]= 48 + word ((tmp div 10) mod 10) ((tmp t[5]= 48 + word (tmp mod 10) (tmp t[2]= 46 'el largo del string esta en el elemento cero t[0]= 5 LCD_out(2, 1, t)
end sub main: PIE1 = 0 INTCON = 0 TRISB = 0 LCD_Init(PORTB) LCD_Cmd(LCD_CURSOR_OFF) low_res = 110 high_res = 1 Display_ADval
' ' ' '
Soft_SPI_Config(PORTD,7,6,5) SetBit(PORTD,1) ClearBit(TRISD,1) t = "mikroElektronika" LCD_Out(1, 1, t) while true ClearBit(PORTD,1) high_res = Soft_SPI_Read(255) low_res = Soft_SPI_Read(0) SetBit(PORTD,1) Display_ADval Delay_ms(1)
wend . end
deshabilitar interrupciones configurar PORTB como salida inicializar LCD en el PORTB cursor LCD apagado
' pin RD1 es salida ' mostrar "mikroElektronika" en el LCD ' ' ' ' ' '
seleccionar LTC1290 obtener byte alto de la conversion AD obtner 4 bits lsb de la conversion AD desactivar LTC1290 formatear y mostrar valor en el LCD esperar 1 ms para la siguiente conversion
9.3 I2C e I2C po r soft w are BASIC tien e una libr ería para tr abajar con la EE BASIC EEPROM int erna q ue hace que la escrit escrit ura y lect ura d e los dat os sea sea m uy sencilla. sencilla. La La fun ción de lib rería EEPROM_Read lee datos desde una dirección especificada, m ientras que el procedimiento EEPROM_Write escribe escribe un d ato en la dirección especificada. Nota: Ten en cuenta que todas las interrupciones estarán deshabilitadas durante la ejecución de la
rutina EEPROM_Write (el bit GIE del regist regist ro INTCON será limp iado (puesto (puesto en 0)). La La rut ina repon drá (pondrá a 1) el bit cuando acabe. acabe. Asegura Asegura un ret ardo m ínim ínim o de 20ms entr e usos usos suces sucesivos ivos de las rutinas EEPROM_Write y EEPROM_Read .Aunque la EEPROM escribirá el valor correcto, EEPROM_Read podría retornar un resultado resultado indefinido. En el siguiente ejemplo, escribiremos una secuencia de números a localizaciones sucesivas de la EEPROM . Poster Poster iorm ent e, los leerem os y los saca sacarem rem os por el POR PORTB par a verificar el p ro ceso. ceso.