lenguaje basic wilber pinilla

372
BASIC PARA BASIC PARA BASIC PARA BASIC PARA MICROCONTROLADORES PIC MICROCONTROLADORES PIC MICROCONTROLADORES PIC MICROCONTROLADORES PIC Christian Bodington Esteva Ingeniero en Electrónica

Upload: sena

Post on 30-Jun-2015

316 views

Category:

Technology


1 download

DESCRIPTION

programador de PIC´S

TRANSCRIPT

  • 1. BASIC PARABASIC PARABASIC PARABASIC PARA MICROCONTROLADORES PICMICROCONTROLADORES PICMICROCONTROLADORES PICMICROCONTROLADORES PIC Christian Bodington Esteva Ingeniero en Electrnica

2. i CONTENIDO Prlogo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Captulo I. Herramientas de Diseo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Captulo II. MicroCode Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 Capitulo III. Microcontroladores PIC. 3.1.- Que es un PIC? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21 3.2.- El Oscilador Externo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25 3.3.- El Circuito de Reset. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.4.- Consideraciones tcnicas de diseo. . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.4.1.- Estado Lgico de un pin I/O. . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.4.2. Lectura de un estado lgico en un pin I/O. . . . . . . . . . . . . . . 33 3.4.3. El Opto-acoplador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.4.4. Fuente de poder, 5Vdc / 3.3Vdc. . . . . . . . . . . . . . . . . . . . . . . 37 Captulo IV. Estructura de un programa. Componentes y operadores en PicBasic. 4.1.- Estructura de un programa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.2.- Subrutinas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 4.3.- Componentes y operadores en PicBasic. . . . . . . . . . . . . . . . . . . . . . . .41 3. ii 4.3.1.- Define. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4.3.2.- Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42 4.3.3.- Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.3.4.- Constantes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.3.5.- Smbolos o Alias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.3.6.- Operadores Aritmticos. . . . . . . . . . . . . . . . . . . . . . . . . . . . .45 4.3.7.- Operadores Binarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45 4.3.8.- Operadores de Comparacin. . . . . . . . . . . . . . . . . . . . . . . . 46 4.3.9.- Operadores Lgicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Capitulo V. Primeros Programas con el PIC16F84. 5.1.- Proyecto #1. Implementacin de las instrucciones de programa High, Low Goto y Pause. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47 5.2.- Proyecto #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.3.- Proyecto #3. Implementacin de la instruccin If-Them-Else. . . . . . . .60 5.4.- Proyecto #4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 5.5.- Proyecto #5. Implementacin de la instruccin For-Next. . . . . . . . . . . 65 5.6.- Proyecto #6. Implementacin de la instruccin Frecout. . . . . . . . . . . . 68 5.7.- Proyecto #7. Implementacin de la instruccin Button . . . . . . . . . . . . .76 5.7.1.- Proyecto #7.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 5.7.2.- Proyecto #7.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 5.7.3.- Proyecto #7.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4. iii 5.8.- Proyecto #8. Implementacin de la instruccin Branch . . . . . . . . . . . . 91 5.9.- Proyecto #9. Implementacin de la instruccin PWM . . . . . . . . . . . . . 94 Capitulo VI. Mdulos LCD. 6.1.- Pantallas LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 6.2.- Identificacin de los pines de una pantalla LCD . . . . . . . . . . . . . . . . . 98 6.3.- Conexin de una pantalla LCD en Pic Basic. . . . . . . . . . . . . . . . . . . . 99 6.4.- Proyecto #10. Implementacin de la instruccin Lcdout . . . . . . . . . . 103 6.5.- Proyecto #11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 6.6.- Proyecto #12. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .109 6.7.- Proyecto #13. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .111 6.8.- Proyecto #14. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .114 6.9.- Proyecto #15. Implementacin de la instruccin Count. . . . . . . . . . . 115 6.10.- Proyecto #16. Implementacin de la instruccin Pulsin. . . . . . . . . . 122 6.11.- Proyecto #17. Implementacin de la instruccin Pot. . . . . . . . . . . . 124 6.12.- Memoria CGRAM en la Pantalla LCD. . . . . . . . . . . . . . . . . . . . . . . .127 6.13.- Proyecto #18. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .130 6.14.- Proyecto #19. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .137 Capitulo VII. Teclado Matricial. 7.1.- Teclado Matricial. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149 7.2.- Proyecto #20. Aplicacin de un teclado 3x4. . . . . . . . . . . . . . . . . . . .154 5. iv Capitulo VIII. Memoria de Datos. 8.1.- Memoria de Datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .157 8.2.- Proyecto #21. Implementacin de la instruccin Read. . . . . . . . . . . .161 8.3.- Proyecto #22. Implementacin de la instruccin Write. . . . . . . . . . . .163 8.4.- Proyecto #23. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .165 8.5.- Proyecto #24. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .168 Capitulo IX. Interrupciones. 9.1.- Qu son las Interrupciones?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175 9.2.- Fuentes de Interrupciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175 9.3.- Registro INTCON. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175 9.4.- Activacin de interrupcin a travs del pin RB0/INT. . . . . . . . . . . . . . 177 9.5.- Proyecto #25. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 9.6.- Interrupcin TMR0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .180 9.7.- Registro OPTION. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .181 9.8.- Proyecto #26. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 9.9.- Interrupcin por cambio de estado de uno de los pines ms significativos del puerto B (RB4-RB7). . . . . . . . . . . . . . . . . . . . . . . . . . . . .186 9.10.- Proyecto #27. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .187 Capitulo X. Memoria Serial I2C. 10.1.- Qu es el bus I2C?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .190 10.2.- Proyecto #28. Implementacin de las instrucciones I2Cwrite, I2Cread . . 192 6. v 10.3.- Proyecto #29. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .196 10.4.- Proyecto #30. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .198 Capitulo XI. Conversor A/D en el PIC16F877. 11.1.- Conversor A/D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .202 11.2.- El registro ADCON0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .209 11.3.- El registro ADCON1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .210 11.4.- Proyecto #31. Implementacin de la instruccin ADCin. . . . . . . . . . 214 Capitulo XII. Comunicacin Serial. Transmisin y Recepcin de Datos. 12.1.- Comunicacin Serial. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 12.2.- Instruccin SerIn. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 12.3.- Proyecto #32. Implementacin de la instruccin SerIn. . . . . . . . . . . 221 12.4.- Instruccin SerOut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .233 12.5.- Proyecto #33. Implementacin de la instruccin SerOut. . . . . . . . . .233 12.6.- Proyecto #34 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .240 Capitulo XIII. Servomotor. 13.1.- Qu es un Servomotor?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .268 13.2.- Proyecto #35. Implementacin de la instruccin PauseUs. . . . . . . . .272 13.3.- Proyecto #36. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .276 13.4.- Proyecto #37. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .280 13.5.- Proyecto #38. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .283 7. vi Capitulo XIV. Mdulos RF para comunicaciones. 14.1.- Mdulos RF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .293 14.2.- Proyecto #39. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .296 14.3.- Proyecto #40. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .300 14.4.- Proyecto #41. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .305 Capitulo XV. Instrucciones de programa de PicBasic. @. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 ADCin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 Asm EndAsm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .311 Branch. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .312 Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 Call. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 Clear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .315 ClearWDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .316 Count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 DTMFout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 EEPROM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .321 End. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 FreqOut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .321 For Next. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .323 Gosub. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 8. vii Goto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .324 High. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .324 I2Cread. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 I2Cwrite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .326 IF-Then-Else. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 Input. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .328 LCDin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .329 LCDout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .330 Low. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .331 NAP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Output. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 Pause. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .333 PauseUs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .333 Pot. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 PulsIn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 PulsOut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 Random . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .337 Read . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 Return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 Reverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .340 Select Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .340 SerIn. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .342 9. viii SerOut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .343 Sleep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .344 Swap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .344 Toggle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .345 While-Wend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 Write . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .347 Apndice A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .348 Apndice B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .358 Apndice C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .360 Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .362 10. Prlogo Emprender el estudio de microcontroladores para el desarrollo de proyectos electrnicos que sean la base para nuevas ideas es el objetivo primordial de esta primera edicin, en la cual nos hemos concentrado en dar al lector algunas herramientas fundamentales con las cuales esperamos abrir un campo de conocimiento en la electrnica de control, a travs de un sin numero de posibilidades de diseo a partir de una serie de ejemplos prcticos desarrollados en lenguaje Basic para Microcontroladores PIC. De toda la gama de posibilidades entre las familias de microcontroladores PIC que ofrece Microchip Inc., hemos elegido para empezar el microcontrolador ms popular de toda la serie, el PIC16F84, que ser utilizado en este libro para estudiar algunas de sus caractersticas a travs del desarrollo de actividades que en principio no requieren un nivel de conocimiento elevado y a travs del cual daremos los pasos necesarios para adentrarnos en las gamas mas altas, de las que se ha seleccionado el microcontrolador PIC16F877 para la realizacin de proyectos electrnicos de nivel medio y avanzado, y en los que podremos manejar dispositivos perifricos que le dan un gran valor agregado a cada uno de nuestros proyectos y abren posibilidades de desarrollo muy interesantes al lector. Adems, hemos considerado proporcionar la informacin adecuada referente a las herramientas de desarrollo ms importantes en la actualidad, para programacin en lenguaje Basic para microcontroladores PIC. En esta ocasin iniciamos con el estudio del compilador PicBasic Pro, de la empresa microEngineering Labs, Inc., la cual ofrece una de las herramientas mas populares en el rea, debido a que cuenta con una gran variedad de instrucciones que hacen de la programacin de microcontroladores una tarea fcil y muy productiva a la hora de desarrollar proyectos que involucren perifricos como pantallas LCD, teclados matriciales, sensores de temperatura, presin, gas, humedad, memorias de datos entre otros, y donde una de las caractersticas ms relevantes es el considerable ahorro de tiempo, lo que se traduce en efectividad y menos lneas de programa, de tal 11. 2 manera que el diseador puede prestar mayor atencin a los detalles, logrando as perfeccionar su desempeo en cualquiera de las funciones que desee programar. Otra de las herramientas que hemos decidido incorporar a la obra, es el programador de microcontroladores PIC P16Pro/PicAll, de la pgina oficial de PicallW, de Boban Dobaj, Diseador. Este programador soporta una gran cantidad de modelos de las series 12, 16 y 18 de Microchip. Su construccin es sumamente sencilla y de muy bajo costo, adems de una serie de ventajas entre las cuales podemos mencionar la alta velocidad de transferencia de datos hacia el dispositivo al momento de ser grabado. Cada captulo contiene teora sobre la cual se pretende estudiar el funcionamiento de los microcontroladores y perifricos conectados a l. Para ello hemos desarrollado una serie de prcticas en las que el lector deber hacer montajes de circuitos en base a los diagramas esquemticos siguiendo las instrucciones y leyendo detenidamente los comentarios de cada lnea de programa. Esperamos con esto proporcionar al lector una base slida de conocimientos para el desarrollo de proyectos electrnicos, proyectos de robtica y todo aquello que represente una innovacin cientfica en este campo. Finalmente, el agradecimiento para todos nuestros colaboradores en la edicin de esta publicacin, quienes se han encargado de revisar cada detalle, proyectos e ideas plasmadas en cada capitulo. Ingeniero en Informacin, Maria del Carmen Lara T. Ingeniero en Electrnica, Jess Frank Phorlakis. Tcnico Superior en Electricidad, Ral Mastropasqua. 12. 3 Herramientas de Diseo Capitulo I En la elaboracin de proyectos electrnicos con microcontroladores PIC, resulta muy importante considerar una serie de herramientas, las cuales vamos a describir a continuacin: Software: para la programacin en Lenguaje Basic, contamos con una gran variedad de posibilidades en el mercado, y entre las cuales hemos elegido para esta primera edicin, el Ambiente Integrado de Desarrollo Microcode Studio (IDE) de microEngineering Labs, Inc., adems del compilador Basic, PICBasic Compiler, o PICBasic Pro Compiler. Con estas dos herramientas estaremos realizando la programacin en cada uno de los proyectos propuestos a partir del captulo V. Figura 1.1. (Fuente: http://www.microengineeringlabs.com) 13. 4 Programador de Microcontroladores PIC: es una herramienta indispensable con la cual podemos grabar el cdigo generado por el compilador PicBasic para poner en funcionamiento cada uno de los proyectos propuestos en cada captulo. Existen en internet una gran cantidad de modelos de programadores para microcontroladores PIC, de muy bajo costo y fcil construccin. Consideramos una buena experiencia realizar el montaje de cualquiera de estos diseos, aunque en esta oportunidad nuestra recomendacin es el programador P16Pro/Picallw. Los detalles para la construccin de este programador estn contenidos en el apndice A. Figura 1.2. 14. 5 Placa de prototipos: proporciona al diseador conexiones sin soldaduras, con lo cual se hace ms prctico el desarrollo de los proyectos electrnicos propuestos a lo largo de cada captulo. Figura 1.3. Multmetro digital: este instrumento de medicin ser muy til durante la elaboracin de los circuitos propuetos en cada captulo. Figura 1.4. 15. 6 Fuente de poder regulada con salida de voltaje variable. En el captulo III se propone la construccin de una fuente de poder regulada a 5 Vdc y 3.3 Vdc. Figura 1.5. Herramientas de corte, extractor de circuitos integrados, cable rgido para conexiones en la placa de prototipos. Figura 1.6. 16. 7 Osciloscopio: este instrumento se requiere para el desarrollo de algunas prcticas en las cuales se hace necesario medir las seales generadas desde el microcontrolador. Figura 1.7. Componentes electrnicos: microcontroladores PIC en los modelos definidos en cada ejemplo prctico, resistencias, diodos, servomotores, condensadores, cristales y otros componentes de fcil adquisicin. Cada proyecto cuenta con una tabla en la cual se decriben los componentes electrnicos que debern ser utilizados en el cada montaje. Figura 1.7. 17. 8 Microcode Studio Capitulo II Microcode Studio (IDE), es un Ambiente Integrado de Desarrollo de MECANIQUE, diseado especialmente para microEngineering Labs, Inc., de libre adquisicin a travs de la pgina Web http://www.microengineeringlabs.com Figura 2.1. (Fuente: http://www.microengineeringlabs.com) Descargar este programa es muy sencillo y esto lo podemos hacer ingresando a la siguiente direccin: http://www.microengineeringlabs.com/resources/win_ide.htm En esta pgina se puede encontrar una seccin destinada para la descarga del archivo instalador, como se observa en la figura 2.2: 18. 9 Figura 2.2. (Fuente: http://www.microengineeringlabs.com) Adems de esta herramienta, es necesario adquirir el compilador PicBasic, (Figura 2.3). Se puede acceder directamente a la pgina de productos de microEngineering Labs a travs de la direccin: http://www.melabs.com/products/index.htm Figura 2.3. (Fuente: http://www.microengineeringlabs.com) Es posible descargar una versin DEMO del compilador PIC Basic, con la cual se pueden compilar programas con un mximo de 31 lneas de cdigo, a travs de la direccin: http://www.melabs.com/pbpdemo.htm 19. 10 Figura 2.4. (Fuente: http://www.melabs.com) Para empezar la descarga del archivo de instalacin del compilador, solo hay que hacer clic en el link sealado en la figura 2.4, e indicar la ruta en la cual se desea que el archivo de instalacin sea almacenado. Nota Importante: Es necesario adquirir una de las versiones completas del compilador Basic, para no tener lmites en la cantidad de lneas del programa a compilar. En la figura 2.5 se puede observar el archivo descargado para la versin disponible del software Microcode Studio, y en la figura 2.6 se puede observar el archivo del compilador PicBasic Pro en su versin de prueba. Figura 2.5. Figura 2.6. Haga clic en el Link aqu sealado, para descargar la versin Demo de PicBasic. Pro 20. 11 El proceso de instalacin es muy sencillo. El primer paso ser ejecutar el archivo mcsinstall.exe, el cual es el responsable de iniciar el proceso de instalacin de Microcode Studio: Figura 2.7. Seguidamente Microcode Studio le da la bienvenida en la ventana que se muestra a continuacin: Figura 2.8. 21. 12 Haga clic en el botn Next y podr ver en la siguiente ventana el acuerdo de licencia para Microcode Studio: Figura 2.9. La ruta por defecto para la instalacin de Microcode Studio es C:Archivos de programaMecaniqueMCS. Esta ruta puede ser cambiada haciendo clic en el botn Browse, a travs del cual se podr ubicar la nueva carpeta en la cual deber ser instalado el software: Figura 2.10. Nombre de la carpeta en la cual se encontrar el archivo ejecutable de Microcode Studio. 22. 13 Pulse Next para iniciar la copia de archivos (figura 2.11), y finalmente espere que se complete la instalacin (figura 2.12). Figura 2.11. Figura 2.12. 23. 14 Una vez instalado Microcode Studio, es importante tomar en cuenta que antes de iniciar este software, es necesario instalar el compilador Basic, el cual es indispensable para la generacin del cdigo que ser cargado en el microcontrolador PIC. Instalacin del compilador PicBasic Pro: Para dar inicio a la instalacin del compilador Pic Basic, ser necesario ejecutar el archivo denominado pbpdemo.exe para el caso de la versin de demostracin. La figura 2.13 muestra la ventana de inicio del proceso de instalacin, en la cual se da la bienvenida al usuario y le invita a cerrar cualquier otra aplicacin que se encuentre en uso en ese momento. Figura 2.13. En la siguiente ventana se debe especificar la unidad de disco duro en la cual se instalar el compilador y el nombre de la carpeta que va a contener los archivos a ser instalados. El software de instalacin del compilador establece por defecto la ruta indicada en la figura 2.14. 24. 15 Figura 2.14. Seguidamente se debe especificar el nombre de la carpeta que va a contener los accesos directos a los archivos que ofrecen informacin adicional acerca del compilador PicBasic. Este paso puede ser omitido seleccionando la opcin Dont create a Start Menu Folder: Figura 2.15. 25. 16 Una vez seleccionadas las rutas de instalacin del compilador, se debe hacer clic en el botn Install (figura 2.16), para dar inicio a la copia de archivos. Figura 2.16. Figura 2.17. 26. 17 Figura 2.18. Finalmente se puede ver en la ventana de la figura 2.18, un mensaje en el cual se confirma que el compilador PICBasic Pro ha sido instalado satisfactoriamente. Deshabilite la opcin Install Microcode Studio IDE y seguidamente haga clic en el botn Finish. Nota: Puede descargar la documentacin completa del compilador PicBasic a travs de la direccin: http://www.melabs.com/support/index.htm 27. 18 Integracin de Microcode Studio y Pic Basic Pro: Es importante integrar Microcode Studio con el compilador PicBasic Pro, indicando la ruta en la cual se encuentra instalado. Para esto debemos iniciar el software y seguir las siguientes instrucciones: 1. Desde el men de Inicio de Windows ejecute Microcode Studio. Figura 2.19. 2. Haga clic en el men View y seleccione la opcin Compile and Program Options. Figura 2.20. 28. 19 3. En la pestaa Compiler haga clic en el botn Find Automatically para una ubicacin automtica del compilador, o si lo prefiere haga clic en Find Manually para ubicar el compilador manualmente. Figura 2.21. 4. En la pestaa Programmer se pide la ubicacin del software del programador que estaremos utilizando para grabar los microcontroladores. Figura 2.22. 29. 20 Se debe ubicar en la lista el programador PICALL Programmer, haciendo clic en el botn denominado Add New Programmer (Figura 2.22), y seguidamente se debe seleccionar de la lista de opciones, como se puede observar en la figura 2.23: Figura 2.23. Por ltimo, al hacer clic en el botn Next, el software realizar la bsqueda automtica de la carpeta que contiene el archivo ejecutable del programador Picall, el cual ha debido ser instalado segn el procedimiento descrito en el Apndice A. 30. 21 Microcontroladores PIC Capitulo III 3.1. Que es un PIC? Los PIC son una familia de microcontroladores desarrollados y fabricados por la empresa Microchip Technologies Inc., los cuales cuentan con una tecnologa tipo RISC (Reduced Instruction Set Computer) y poseen en su arquitectura interna caractersticas especiales que varan segn el modelo de PIC que deseamos utilizar. Podramos decir que estos dispositivos se asemejan a una computadora pero de tamao muy reducido, ya que cuentan con casi los mismos recursos que stas, es decir, poseen memoria de programa, memoria RAM, memoria de datos, puertos de entrada o salida, temporizadores y en algunos casos cuentan con recursos adicionales como convertidores A/D, comparadores, USART (Universal Synchronous/Asynchronous Receiver/Transmitter), comunicacin serie I2C, entre otros. Con todas estas caractersticas es lgico pensar que este dispositivo pasa a ser el corazn del circuito a ser controlado. Esto significa que el microcontrolador es el encargado de dirigir todos los procesos de un circuito electrnico, en base a las instrucciones de programa o rutinas que definen funciones especficas de control, donde las mismas sern realizadas en lenguaje Basic para microcontroladores PIC. Es por esta razn que consideramos muy importante estudiar la arquitectura interna del microcontrolador que se desea programar y aunque esta tarea pueda parecer difcil, el Lenguaje Basic para microcontroladores PIC la hace sumamente sencilla. El diseo de programas para microcontroladores PIC va acompaado normalmente con un previo estudio del diseo del hardware que har que nuestros proyectos se pongan en marcha. Es decir, resulta absolutamente necesario saber cual ser la funcin especfica de cada pin; por ejemplo, en el caso de los puertos I/O (IN/OUT) a ser utilizados en el microcontrolador, es importante definir sus funciones antes de empezar a programar, ya que stos pueden ser configurados a conveniencia como entrada o como salida de datos de forma independiente. Tambin podemos destinar un puerto completo 31. 22 del microcontrolador para el control de dispositivos perifricos como pantallas LCD, teclados, motores paso a paso, leds, servomotores entre otros. De ah la importancia de establecer cual ser la funcin de cada puerto del microcontrolador PIC elegido para nuestros proyectos. Otra decisin importante ser elegir convenientemente el modelo de microcontrolador a ser utilizado, ya que hay una gran gama de modelos que pueden ser adaptados a necesidades especficas de diseo. Figura 3.1. Los microcontroladores PIC comnmente ms utilizados son los siguientes: PIC12C508 y PIC12C509, tienen memoria de programa EPROM, oscilador interno, y son muy utilizados en diseos de pequeos circuitos. PIC16F84A, tiene memoria de programa tipo FLASH, oscilador externo, 13 pines I/O entre otras caractersticas que estaremos estudiando a lo largo del contenido de esta obra. Este PIC ha resultado ser uno de los ms populares de toda la serie. PIC16F87X, incluyen un gran nmero de mejoras en comparacin con el PIC16F84, debido principalmente a que cuentan con un numero de pines I/O superior a ste, adems de otras caractersticas relevantes. Por ejemplo, con esta serie de microcontroladores contamos con una mayor capacidad en cuanto a memoria de programa y memoria de datos. 32. 23 PIC18F4XX, estos microcontroladores resultan muy tiles cuando deseamos disear proyectos ms avanzados. Cada uno de estos microcontroladores cuenta con una completa hoja de datos que puede ser descargada de la pgina oficial de Microchip: http://www.microchip.com Estas caractersticas influyen directamente al momento de decidir que modelo de microcontrolador PIC deseamos utilizar en nuestros proyectos, segn sea el objetivo de diseo del circuito que deseamos realizar. El microcontrolador PIC16F84 es uno de los microcontroladores ms populares y en algunos casos, el preferido por estudiantes para dar inicio al estudio de la programacin de microcontroladores, seguido del PIC16F877 el cual posee ms recursos importantes que estaremos estudiando a continuacin. Antes de empezar a revisar todo lo referente a la programacin de microcontroladores PIC, consideramos importante recordar algunas de las caractersticas de stos dispositivos, para tener una base de conocimientos bsicos para poder realizar un programa de control de un diseo completamente personalizado. Para empezar, veamos algunas caractersticas del microcontrolador PIC16F84: Microcontrolador de 8 Bits. Memoria de programa tipo Flash de 1024 palabras de 14 bits. Memoria RAM de 68 bytes. Memoria EEPROM de datos de 64 bytes. Velocidad de operacin de hasta 20 Mhz. Cuatro fuentes de interrupcin. Posee 13 pines I/O (pines de entrada o salida). 33. 24 Diagrama de pines del PIC16F84: Figura 3.2. PIN Identificacin Descripcin del Pin 1 RA2 Pin de Entrada/Salida (I/O) del puerto A 2 RA3 Pin de Entrada/Salida (I/O) del puerto A 3 RA4/TOCKI Pin de Entrada/Salida (I/O) del puerto A 4 MCLR Reset y entrada de voltaje de programacin. 5 Vss Pin de Alimentacin a Tierra (GND) 6 RB0/INT Pin de Entrada/Salida (I/O) del puerto B 7 RB1 Pin de Entrada/Salida (I/O) del puerto B 8 RB2 Pin de Entrada/Salida (I/O) del puerto B 9 RB3 Pin de Entrada/Salida (I/O) del puerto B 10 RB4 Pin de Entrada/Salida (I/O) del puerto B 11 RB5 Pin de Entrada/Salida (I/O) del puerto B 12 RB6 Pin de Entrada/Salida (I/O) del puerto B 13 RB7 Pin de Entrada/Salida (I/O) del puerto B 14 Vdd Pin de Alimentacin de 5Vdc 15 OCS2/CLKOUT Salida del oscilador a cristal. 16 OSC1/CLKIN Entrada del oscilador a cristal o fuente externa de reloj. 17 RA0 Pin de Entrada/Salida (I/O) del puerto A 18 RA1 Pin de Entrada/Salida (I/O) del puerto A Tabla 3.1 34. 25 El microcontrolador PIC16F84 cuenta con dos puertos I/O, el puerto A, el cual consta de cinco pines I/O y el puerto B, el cual consta de ocho pines I/O como se puede observar en la figura 3.3: Figura 3.3. En total se cuenta con trece pines I/O, los cuales pueden ser programados como entrada o salida segn convenga al momento de disear un circuito de control. Los pines correspondientes al oscilador (OSC1 y OSC2) y al reset (MCLR) deben ser siempre tomados en cuenta en el diseo de nuestros proyectos. Es por este motivo que damos inicio al estudio de algunos circuitos indispensables para el correcto funcionamiento del microcontrolador PIC. 3.2. El Oscilador Externo. Es un circuito indispensable para el funcionamiento del microcontrolador y el cual adems, define la velocidad a la cual va a trabajar. Para hacer funcionar nuestro diseo podemos elegir entre las siguientes cuatro opciones: Oscilador LP: Oscilador de bajo consumo (Low Power). Oscilador XT: Cristal / Resonador. 35. 26 Oscilador HS: Oscilador de alta velocidad (High Speed). Oscilador RC: Resistencia / Condensador. En los modos de oscilador LP, XT y HS el cristal debe ser conectado a los pines 15 y 16, Osc2/CLKout y Osc1/CLKin respectivamente, como se muestra en la figura 3.4. Figura 3.4. Los valores de los condensadores cermicos vienen dados segn la tabla que se muestra a continuacin: Modo Frecuencia Osc1/CLKin Osc2/CLKout LP 32 kHz 200 kHz 68 - 100 pF 15 - 33 pF 68 - 100 pF 15 - 33 pF XT 2 MHz 4 MHz 15 - 33 pF 15 - 33 pF 15 - 33 pF 15 - 33 pF HS 4 MHz 10 MHz 15 - 33 pF 15 - 33 pF 15 - 33 pF 15 - 33 pF Tabla 3.2 36. 27 Por ejemplo, para un oscilador tipo XT, podemos utilizar un cristal de cuarzo como el de la figura 3.5. Figura 3.5. Al conectar el microcontrolador a la fuente de alimentacin de 5 Vdc y medir la seal de salida del oscilador XT con un osciloscopio, en el pin 15 (Osc2/CLKout) del microcontrolador, podremos ver la onda generada bajo los siguientes parmetros de medicin seleccionados en el equipo: Voltios/Div: 200mV Time/Div: 100ns Figura 3.6. 37. 28 La lectura de la frecuencia y perodo en este caso sera la siguiente: Frecuencia: 3,972 Mhz Perodo: 251,71 ns Cristal de cuarzo TTL: Este tipo de cristal consta de cuatro pines, de los cuales solo tres estn implementados de la siguiente manera: Figura 3.7. Pin 1: NC (Este pin no se encuentra conectado internamente) Pin 7: GND Pin 8: Salida TTL Pin 14: +5Vdc En su salida se obtiene un tren de pulsos como se puede observar en la figura 3.8, bajo los siguientes parmetros de medicin seleccionados en un osciloscopio: Voltios/Div: 2V Time/Div: 100ns 38. 29 Figura 3.8. La lectura de la frecuencia y perodo en este caso sera la siguiente: Frecuencia: 3,999 Mhz Perodo: 250,013 ns El oscilador externo en modo RC resulta ser el ms sencillo de todos y por ende el ms econmico. Su configuracin lo hace menos preciso debido a que existe una tolerancia de error en sus componentes, sin olvidar tambin que la temperatura puede afectar la operacin de este tipo de oscilador. Los valores recomendados para este oscilador son los siguientes: 5 Kohm R1 100 Kohm C1 > 20 pF 39. 30 Figura 3.9. 3.3. Circuito de Reset: El Pin denominado MCLR (Master Clear), siempre debe ser tomado en cuenta cuando se disea un circuito con microcontroladores PIC. A travs de este Pin se podr reiniciar el dispositivo, si a ste se le aplica un nivel lgico bajo (0V), por lo tanto resulta importante destacar que para que un programa cargado en un microcontrolador se mantenga en ejecucin, el Pin MCLR debe estar siempre en un nivel lgico alto (5V). Si deseamos tener control externo del reset de un microcontrolador PIC, debemos considerar el circuito de la figura 3.10: 40. 31 Figura 3.10. Este circuito permite reiniciar el microcontrolador cada vez que el pulsador P1 es presionado. 3.4. Consideraciones tcnicas de diseo: A continuacin veremos algunos circuitos bsicos que deben ser tomados en cuenta para el desarrollo de prcticas con microcontroladores PIC. Estos circuitos son muy tiles cuando deseamos visualizar el resultado de una accin programada en el microcontrolador. 3.4.1. Estado Lgico de un pin I/O: Una manera muy sencilla de ver el estado lgico de un pin configurado como salida en cualquiera de los puertos de microcontrolador es a travs del uso de LEDs, como se observa en los circuitos de la figura 3.11. 41. 32 En el primer circuito, el LED se iluminar solo cuando el estado lgico del pin de salida del puerto sea igual a 1, es decir, 5 voltios. En el segundo circuito, el LED se iluminar solo cuando el estado lgico de la salida del puerto sea igual a 0, es decir, 0 voltios. Figura 3.11. Esto significa que si deseamos realizar un programa en Lenguaje Basic encargado de cambiar el estado lgico de un pin especfico, en cualquiera de los puertos de un microcontrolador, una forma bsica de visualizar este cambio es a travs del uso de LEDs. 42. 33 3.4.2. Lectura de un estado lgico en un pin I/O: El microcontrolador tambin nos permite capturar datos o seales externas para luego ser procesadas y convertidas en respuestas que pueden definir una accin especfica en nuestros circuitos de prueba. Un ejemplo comn podra ser el uso de un pulsador para hacer destellar un led cada vez que ste sea presionado. Si deseamos introducir un nivel lgico bajo (0V), o alto (5V), a una de las entradas de un microcontrolador a travs de un pulsador, podramos considerar los circuitos de la figura 3.12, los cuales nos proporcionan dos formas diferentes de hacerlo: Figura 3.12. 43. 34 El primer circuito en la figura 3.12 mantiene un nivel lgico alto (5V) mientras el pulsador permanece abierto. Al presionar el pulsador, el nivel lgico en el pin I/O del puerto pasa a ser bajo (0V). El segundo circuito de la figura 3.12 mantiene un nivel lgico bajo (0V) mientras el pulsador permanece abierto. Al presionar el pulsador, el nivel lgico en el pin I/O del puerto pasa a ser alto (5V). 3.4.3. El Opto-acoplador: El opto-acoplador es un componente muy til cuando se requiere acoplar circuitos electrnicos digitales con etapas de manejo de potencia o con otros circuitos. Este componente en una de sus versiones, se compone bsicamente de un diodo LED el cual se encarga de iluminar un fototransistor, para que ste conduzca corriente a travs del colector. Figura 3.13. 44. 35 En la configuracin de la figura 3.13, cuando en el pin I/O aplicamos un 1 lgico (5V), el LED del opto-acoplador enciende y el fototransistor conduce la corriente a tierra; por lo tanto, en la salida tendremos un 0 lgico (0V). Si apagamos el LED, el transistor no conduce, de tal manera que en la salida tendremos un 1 lgico (5V). En la configuracin de la figura 3.14, cuando en el pin I/O aplicamos un 1 lgico (5V), el LED del opto-acoplador enciende y el fototransistor conduce para poner en la salida un 1 lgico (5V). Mientras haya un 0 lgico en la entrada, el fototransistor permanecer abierto entre el emisor y colector, dando como resultado un 0 lgico (0V) en la salida. Figura 3.14. Una configuracin muy comn para el control de dispositivos de potencia como motores elctricos, luces incandescentes, solenoides, etc., se puede ver en la figura 3.15, la cual se basa en cualquiera de los dos circuitos antes mencionados (figura 3.13 y figura 3.14), en la cual se ha incluido un rel a 45. 36 travs del cual circular la corriente necesaria entre sus contactos, para hacer funcionar cualquiera de estos dispositivos de potencia. Figura 3.15. 46. 37 3.4.4. Fuente de poder, 5Vdc / 3.3Vdc: En caso de no disponer de una fuente de poder regulada, proponemos la construccion de un diseo sencillo que podemos implementar en todos los proyectos propuestos. En la figura 3.16 se puede observar el diseo de una fuente regulada con salidas de voltaje de +5 Vdc y +3.3 Vdc: Figura 3.16. 47. 38 Estructura de un programa. Componentes y operadores en PicBasic. Capitulo IV 4.1.- Estructura de un programa: Para que nuestros programas tengan una apariencia ordenada y se facilite la comprensin del mismo ante otros programadores que deseen realizar mejoras a ste, es necesario establecer una estructura que nos permita identificar fcilmente cada una de las partes que lo componen. Figura 4.1. En la figura 4.1 se puede observar la estructura bsica de un programa hecho en Microcode Studio, y en la cual hemos identificado las cuatro secciones que consideramos ms importantes para lograr un programa bien estructurado. A B C D 48. 39 Seccin A: Corresponde al encabezado del programa, en el cual se debe considerar informacin bsica del mismo, como el nombre, la identificacin de autor, Copyright, fecha de elaboracin o fecha de los ltimos cambios realizados, versin del programa que se est realizando, e incluso una breve descripcin acerca del objetivo del programa y su aplicacin en un determinado circuito electrnico. Es importante resaltar que cada lnea del encabezado debe empezar con una comilla simple, en forma de comentario (ver Seccin D). Seccin B: Esta seccin empieza en la columna cero del editor de texto de Microcode Studio, y en ella se pueden declarar las definiciones (concepto que estudiaremos mas adelante) y las etiquetas de cada una de las subrutinas que sern programadas. Las etiquetas identifican puntos especficos o subrutinas dentro de un programa. Son definidas por el programador y deben tener al final de cada una de ellas el smbolo de dos puntos, que definen el final de la misma. Seccin C: Estar destinada para las instrucciones de programa y la misma est separada de la columna cero del editor de texto por una tabulacin, es decir, cuando el cursor se encuentra en la columna cero, presionamos una vez la tecla TAB, y de esta manera establecemos un espacio mnimo, siempre igual o superior entre la seccin B y C. Seccin D: Esta destinada para realizar comentarios acerca de la funcin que estar cumpliendo una instruccin especfica en nuestro programa. Cada comentario debe empezar siempre con una comilla simple como se muestra a continuacin: ' Define el Oscilador para un Cristal ' de 4 Mhz. Cuando un comentario es demasiado extenso, podemos continuar el mismo en la siguiente lnea, siempre que la frase comience con su respectiva comilla. 49. 40 Los comentarios ayudan al diseador a identificar cada lnea de programa o cada una de las funciones de cada subrutina, garantizando as una buena documentacin en cada uno de los programas que realizamos. 4.2.- Subrutinas: Una subrutina se presenta como un algoritmo separado del algoritmo principal, y estar destinado a resolver una tarea especfica. Las subrutinas pueden ser referidas cada vez que sea necesario, llamando a la etiqueta que corresponde a sta, la cual debe ir siempre al inicio de la misma. Led1: For Z = 0 To 9 LED = Encendido Pause 1000 LED = Apagado Pause 1000 Next Z GoTo Inicio End Subrutina Etiqueta 50. 41 4.3.- Componentes y operadores en PicBasic. PIC Basic cuenta con una serie de herramientas de programacin entre las cuales podemos mencionar las etiquetas, variables, identificadores, constantes, comentarios, smbolos entre otras. Algunas de estas herramientas son de uso obligatorio a la hora de realizar un programa, y otras que no son de uso obligatorio, nos facilitarn el trabajo considerablemente. 4.3.1.- Define: La directiva Define resulta muy importante en la programacin de microcontroladores con PicBasic, ya que establece una serie de parmetros que de no ser tomados en cuenta, causar que nuestros programas sencillamente no funcionen en la mayora de los casos. Esta serie de parmetros estn directamente relacionados con dispositivos externos al microcontrolador. Por ejemplo, si deseamos utilizar un oscilador de diferente frecuencia al valor establecido por defecto (4 Mhz), ser conveniente entonces definir la velocidad del mismo utilizando la directiva: Define Osc {frecuencia} De igual forma deben ser considerados estos parmetros para el uso de dispositivos como pantallas LCD, donde se debern definir los puertos de conexin para el bus de datos y bus de control. As mismo ocurre para el caso de las comunicaciones seriales o I2C, donde los parmetros tambin deben ser definidos. Veamos a continuacin la tabla de parmetros para el uso de la instruccin Define. 51. 42 Parmetro Descripcin OSC {frecuencia} Frecuencia del Oscilador en Mhz LCD_DREG {puerto} Puerto de datos LCD LCD_DBIT {bit} Bit inicial del puerto de datos LCD_RSREG {puerto} Puerto para RS (Register Select) LCD_RSBIT {bit} Pin del Puerto para RS LCD_EREG {puerto} Puerto para E (Enable) LCD_EBIT {bit} Pin del Puerto para E LCD_RWREG {puerto} Puerto para RW (Read/Write) LCD_RWBIT {pin} Pin del puerto para RW LCD_LINES {lneas} Nmero de lneas de la LCD (1,2 o 4) I2C_SCLOUT 1 Interface de Reloj I2C Bipolar I2C_SLOW 1 Cuando en la transferencia es utilizado un oscilador mas lento que 8 Mhz. Tabla 4.1. 4.3.2.- Variables: En las variables podemos almacenar datos temporalmente, los cuales podrn ser consultados o modificados cada vez que sea necesario. Regularmente la definicin de variables se hace al inicio del programa y para ello se utiliza la palabra VAR seguida por el tipo de variable segn la tabla que mostramos a continuacin: Nombre de la Variable VAR Tipo de Variable Descripcin A1 Var Bit Toma los valores 0 y 1 unicamente Temp Var Byte Toma valores entre 0 y 255 (8 bits) dig1 Var Word Toma valores entre 0 y 65535 (16 bits) Tabla 4.2. El nombre de la variable es elegido por el programador y el tipo de variable se define segn el tipo de dato que se desea almacenar temporalmente. 52. 43 4.3.3.- Arrays: Las variables Arrays tienen un determinado nmero de elementos, definido segn el tamao de la variable. Las variables Arrays tipo Bit, pueden almacenar 256 elementos; las variables Arrays tipo Byte pueden almacenar hasta 96 elementos y las variables Arrays tipo Word hasta 48 elementos, los cuales a su vez pueden ser accesados en cualquiera de los tres casos a travs de un ndice. Este ndice se especfica entre corchetes como se muestra en los siguientes ejemplos: Para declarar una variable Array utilizamos el siguiente formato: Dato Var Byte[7] El primer elemento de esta variable es Dato[0] y el ltimo elemento es Dato[7], lo cual significa que hemos declarado una variable array de 8 elementos. En este caso podemos almacenar un byte en cada elemento, siempre especificando el ndice. Ejemplo: Almacenar en cada elemento de la variable Dato los valores 200, 15, 56, 75, 80, 20, 33, 45. Dato[0] = 200 Dato[1] = 15 Dato[2] = 56 Dato[3] = 75 Dato[4] = 80 Dato[5] = 20 Dato[6] = 33 Dato[7] = 45 En algunos casos se debe verificar la hoja de datos del microcontrolador, ya que la cantidad de elementos que se pueden almacenar en variables arrays tipo Byte o Word puede variar segn el modelo del mismo. 53. 44 4.3.4.- Constantes: Ayudan a identificar un valor constante en nuestro programa, facilitando an ms la comprensin del mismo a la hora de verificar su funcionamiento. En la tabla 4.3 se puede observar la forma de declarar una constante. Nombre de la Constante CON Valor de la Constante Temp_Max CON 150 Temp_Min CON 55 Tabla 4.3. 4.3.5.- Smbolos o Alias: Proveen un nombre nico y especfico a elementos o variables dentro de nuestro programa. Para definir un smbolo, utilizamos la palabra Symbol, seguida del alias del elemento, el smbolo de igualdad =, y por ltimo el elemento en cuestin: Symbol {alias} = {elemento} Por ejemplo, si deseamos controlar un motor DC a travs de uno de los pines del puerto A de un microcontrolador, resultara mucho mas sencillo referirse a este pin como Motor, en vez de referirse a l como PortA.0. Entonces, Symbol Motor = PORTA.0 Veamos otros ejemplos: Symbol Relay = PORTB.0 Symbol Sensor = PORTA.0 Symbol LED = PORTA.1 Symbol RC0 = PORTC.0 54. 45 4.3.6.- Operadores Aritmticos: Entre los operadores aritmticos ms utilizados tenemos los que se muestran en la siguiente tabla: Operador Descripcin Operador Descripcin + Suma ABS Valor Absoluto - Resta SIN Seno del Angulo * Multiplicacin COS Coseno del Angulo / Divisin MIN Minimo de un nmero // Residuo MAX Mximo de un nmero > Desplaza a la Derecha DIG Valor de un digito para un nmero decimal = Asignacin de Valores Tabla 4.4. 4.3.7.- Operadores Binarios: En la siguiente tabla veremos los operadores binarios proporcionados para el Lenguaje PicBasic: Operrador Descripcin & AND Lgico | OR Lgico ^ XOR Lgico NOT Lgico &/ NAND Lgico |/ NOR Lgico ^/ NXOR Lgico Tabla 4.5. Con estos operadores resulta muy sencillo realizar operaciones binarias, como lo demuestra el siguiente ejemplo: Si aplicamos una AND lgica, donde deseamos filtrar los siete bits ms significativos del valor almacenado en la siguiente variable: Var1 = %00101001 Entonces, Var1 = Var1 & %00000001 55. 46 El resultado de esta operacin es Var1 = %00000001 4.3.8.- Operadores de Comparacin: Los operadores de comparacin normalmente son utilizados con la instruccin IfThem para realizar comparaciones entre variables o datos extrados de alguna operacin aritmtica. Operador Descripcin = Igual Diferente < Menor que > Mayor que = Mayor o igual que Tabla 4.6. 4.3.9.- Operadores Lgicos: Los operadores lgicos son utilizados para establecer condiciones entre variables y son utilizados de la misma manera que los operadores de comparacin. Operador Descripcin AND AND Lgico OR OR Lgico XOR XOR Lgico NOT NOT Lgico NOT AND NAND Lgico NOT OR NOR Lgico NOT XOR NXOR Lgico Tabla 4.7. Ejemplo: If Var1 = 1 and Var2 = 3 And Var3 = 5 Then Goto inicio La condicin saltar a la etiqueta inicio solo si se cumplen las tres condiciones. 56. 47 Primeros Programas con el PIC16F84 Capitulo V Para aprender a programar un microcontrolador resulta importante dar inicio al tema con ejemplos prcticos y sencillos, que nos ayuden a comprender el funcionamiento de la arquitectura del PIC y las instrucciones de programa que se estn empleando. El primer paso entonces ser realizar el montaje del circuito con base en los conocimientos adquiridos en las pginas anteriores. Se debe tomar en cuenta que aunque en los diagramas de los circuitos que se muestran a continuacin, no estn presentes los pines de alimentacin Vcc y Gnd, stos deben ser conectados debidamente a la fuente de alimentacin de 5 Voltios. A medida que se van proponiendo ejemplos de aplicacin prctica, estaremos estudiando la sintaxis de las instrucciones empleadas en cada proyecto para facilitar la comprensin general de ste, referente a la programacin y diseo electrnico. 5.1.- Proyecto #1: A continuacin realice el montaje de la figura 5.1, en base al cual realizaremos la programacin necesaria para encender dos Leds conectados a los puertos del microcontrolador: Figura 5.1. 57. 48 Proyecto # 1 Componentes Cantidad PIC16F84A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 pF 2 LED 2 Resistencia de 220 Ohm 2 Fuente regulada de 5 Vdc 1 Tabla 5.1. El Led 1 se encuentra conectado en el pin RA0 del puerto A, el cual deber ser configurado como Salida. El Led 2 se encuentra conectado en el pin RB0 del puerto B, el cual deber ser configurado igualmente como Salida. Note que el nodo del diodo LED se encuentra conectado al pin de salida del puerto, por lo tanto para que encienda el LED debemos hacer salir un 1 lgico por el pin correspondiente. Como los pines de los puertos pueden ser configurados como entradas o como salidas, es importante tomar en cuenta los registros de configuracin de puertos, los cuales para el caso especfico del PIC16F84 son dos: TrisA (registro de configuracin I/O del puerto A), es un registro de 8 bits, de los cuales los tres ms significativos no se encuentran implementados en este modelo de microcontrolador, ya que como se puede observar en el diagrama de pines del dispositivo (figura 3.2), el puerto A solo cuenta con 5 pines (RA0, RA1, RA2, RA3 y RA4). 58. 49 Un ejemplo de configuracin de los pines I/O del puerto A es el siguiente: 1 1 1 1 0 RA4 RA3 RA2 RA1 RA0 Registro TrisA Figura 5.2. 1 = Entrada (Al configurar un bit del registro TrisA en 1, ste se comporta como entrada). 0 = Salida (Al configurar un bit del registro TrisA en 0, ste se comporta como salida). Al ver la figura 5.2, se puede observar que el pin RA0 ha sido configurado como salida y el resto de los pines como entrada. En PicBasic, este paso se realiza de la siguiente manera: TrisA = %11110 (% para expresar la configuracin en Binario), : TrisA = $1E ($ para expresar la configuracin en Hexadecimal) TrisB, es un registro de 8 bits en el cual se configuran los pines del puerto B, ya sea como entrada o como salida, por ejemplo: 1 1 1 1 1 1 1 0 RB7 RB6 RB5 RA4 RA3 RA2 RA1 RA0 Registro TrisB Figura 5.3. 1 = Entrada (Al configurar un bit del registro TrisB en 1, ste se comporta como entrada). 0 = Salida (Al configurar un bit del registro TrisB en 0, ste se comporta como salida). Bit menos significativo Bit menos significativo Recordemos entonces que como el Led 1 se encuentra conectado en el pin RA0, el bit correspondiente a este pin en el registro TrisA ha sido configurado como salida. 59. 50 Para el caso particular del puerto B, se puede observar que el pin RB0 ha sido configurado como salida y el resto de los pines como entrada. Consideramos importante configurar los pines que no estarn en uso como entrada, ya que de esta forma podemos evitar daos en el hardware interno del microcontrolador al experimentar con ste en un tablero de pruebas. La configuracin en PicBasic para el registro TrisB, ajustada al ejemplo de la figura 5.3 sera entonces la siguiente: TrisB = %11111110 (si se desea hacer la notacin en binario), : TrisB = $FE (si se desea hacer la notacin en hexadecimal) Antes de verificar el programa propuesto para este ejemplo, veremos la sintaxis de las instrucciones utilizadas en l, para tener una idea clara de la funcin que cumple cada instruccin. Esta informacin puede ser complementada en el captulo XV, en el cual encontrar la descripcin de cada una de las instrucciones utilizadas en cada proyecto planteado en esta edicin. Sintaxis de las Instrucciones empleadas en el programa: HIGH Sintaxis: HIGH pin La instruccin High pone en uno lgico un pin I/O especfico. 60. 51 LOW Sintaxis: LOW pin La instruccin LOW coloca en cero lgico un pin I/O especfico. GOTO Sintaxis: GOTO etiqueta La instruccin Goto contina la ejecucin de un programa a partir de la etiqueta especificada (Esta instruccin no tiene retorno). PAUSE Sintaxis: PAUSE periodo La instruccin Pause realiza una pausa en el programa por un periodo definido en milisegundos. Veamos el programa en PicBasic: '**************************************** '* Nombre : Proyecto1.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Ao) * '* Fecha : Fecha * '* Versin : 1.0 * '**************************************** Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. 61. 52 TRISA = %11110 ' Configuracin el Puerto A TRISB = %11111110 ' Configuracin el Puerto B PORTA = 0 ' Inicializa el puerto "A", es decir, ' se ponen todos los pines en cero. PORTB = 0 ' Inicializa el puerto "B". Inicio: ' Etiqueta de Inicio del programa High PORTA.0 ' Enciente el Led conectado en el pin RA0 Pause 1000 ' Hace una pausa de 1000 milisegundos = 1 ' Seg. Low PORTA.0 ' Apaga el Led conectado en el pin RA0 Pause 1000 ' Hace una pausa de 1000 milisegundos = 1 ' Seg. High PORTB.0 ' Enciente el Led conectado en el pin RB0 Pause 1000 ' Hace una pausa de 1000 milisegundos = 1 ' Seg. Low PORTB.0 ' Apaga el Led conectado en el pin RB0 Pause 1000 ' Hace una pausa de 1000 milisegundos = 1 ' Seg. GoTo Inicio ' Salta a la etiqueta "Inicio" y se repite el ' proceso. End La instruccin High se encarga de poner un nivel lgico alto en el pin especificado seguidamente. En este caso, primero se escribe el puerto y seguido de un punto, se especifica el nmero del pin en el puerto que deseamos utilizar. La instruccin Low es responsable en este caso de poner el pin especificado en un nivel lgico bajo. Al igual que en la instruccin High, se debe especificar el puerto y el pin del puerto a ser utilizado. La instruccin GoTo realiza un salto hacia una etiqueta especfica; en este caso el programa salta a la etiqueta Inicio para empezar de nuevo todo el proceso. 62. 53 Al escribir el programa en el editor de texto de Microcode Studio, se debe grabar el mismo con el nombre de su preferencia para que ste pueda ser compilado y al mismo tiempo pueda ser enviado al microcontrolador. Observe que para este programa, hemos designado el nombre Proyecto1.pbp (figura 5.4). Figura 5.4. Antes de compilar el programa, se debe asegurar de seleccionar el modelo apropiado de microcontrolador PIC, como se observa en la figura 5.5. Luego se compila el programa y se verifica que ste no tenga errores. 63. 54 Figura 5.5. Seguidamente, se debe proceder a cargar el programa compilado en el microcontrolador con la ayuda del programador de microcontroladores Pic. Al hacer clic en el icono Compilar y Grabar en el PIC (ver figura 5.5), el compilador habr generado un archivo de nombre Ejemplo1.hex y seguidamente se abrir el software Picall/P16Pro, como se observa en la figura 5.6: Figura 5.6. En este momento el microcontrolador deber estar montado en la base del programador en la posicin indicada por la figura 5.6. Compilar Compilar y Grabar en el PIC Modelo del uC. 64. 55 Antes de programar el microcontrolador, tambin resulta conveniente verificar los fusibles de programacin, accediendo al botn Config, el cual puede ser visualizado en la figura 5.6. En esta seccin se debe configurar el tipo de oscilador utilizado en nuestro circuito, as como otras opciones disponibles que comentaremos a continuacin (ver figura 5.7). Figura 5.7. En la figura 5.7 se pueden observar tres secciones llamadas Oscillator, Hardware y Protection: En la seccin Oscillator, debemos seleccionar el tipo de oscilador utilizado en nuestro circuito electrnico, el cual en este caso es del tipo XT, debido a que el cristal que hemos elegido es de 4 Mhz. En la seccin Hardware es posible activar el temporizador Perro Guardin, el cual se encarga de reiniciar el microcontrolador en caso de fallas o bloqueos en el programa. Para utilizar el Watchdog es necesario disear el programa bajo ciertos parmetros, de forma que podamos reiniciar el temporizador Watchdog antes de que ste se desborde y provoque un Reset en el sistema. Si nuestro programa llegara a fallar, el temporizador Watchdog completara su conteo y se desbordara, provocando un Reset del sistema. 65. 56 En la seccin Hardware tambin disponemos de la opcin Power Up Timer, la cual una vez activada en el microcontrolador, har que ste no pueda iniciar el programa hasta tanto el voltaje aplicado al circuito sea estable y seguro (ver figura 5.8). 0 1 2 3 4 5 6 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 Tiempo Voltios Figura 5.8. En la seccin Protection, tenemos la posibilidad de proteger el cdigo de programa almacenado en la memoria del microcontrolador. Finalmente hacemos clic en el botn Program (ver figura 5.6), para descargar el programa Proyecto1.hex en el microcontrolador; inmediatamente se podr ver el proceso de grabacin y verificacin de datos, para luego culminar con el montaje del microcontrolador en el circuito de prueba. Estos pasos se deben aplicar en cada uno de los proyectos aqu planteados, o cada vez que se desee realizar una modificacin a un programa para obtener siempre mejores resultados sobre el objetivo propuesto en cada actividad. 66. 57 5.2.- Proyecto #2: En este ejemplo conectaremos un Led en cada pin del puerto B, el cual a su vez deber ser configurado como salida para garantizar el correcto funcionamiento del mismo. En la figura 5.9 podemos observar en detalle la conexin del circuito elctrico que deber ser montado. Figura 5.9. Proyecto # 2 Componente Cantidad PIC16F84A 1 Cristal de 4 Mhz 1 Capacitor de 33 pF 2 LED 8 Resistencia de 220 Ohm 8 Fuente regulada de 5 Vdc 1 Tabla 5.2. 67. 58 En el proyecto #1 se pudo observar como es posible encender un led conectado a un pin del puerto A o B en un PIC16F84A, utilizando las instrucciones High y Low. Tambin existen otras formas de poner un 1 o un 0 lgico en un pin configurado como salida; esto se puede lograr de varias maneras: PORTA.0 = 1 ' RA0 = 1 -> (es igual a High PortA.0) PORTA.0 = 0 ' RA0 = 0 -> (es igual a Low PortA.0) Cuando deseamos poner varios pines de un mismo puerto en 1, podemos utilizar las siguientes opciones: PORTB = %10101010 ' RB7 = 1, RB5 = 1, RB3 = 1, RB1 = 1 ' RB6 = 0, RB4 = 0, RB2 = 0, RB0 = 0 Este mismo ejemplo de configuracin en hexadecimal: PORTB = $AA ' RB7 = 1, RB5 = 1, RB3 = 1, RB1 = 1 ' RB6 = 0, RB4 = 0, RB2 = 0, RB0 = 0 Recordemos que el smbolo % expresa la notacin en binario, por lo cual se deben expresar los ocho bits a ser cargados en el registro PortB. Otra forma de expresar este ejemplo sera colocando la notacin en hexadecimal con el smbolo $, seguido del valor calculado. Basados en esta informacin podemos lograr encender y apagar varios leds simultneamente conectados a uno de los puertos del microcontrolador como lo muestra el montaje de la figura 5.9. Veamos el siguiente programa: '**************************************** '* Nombre : Proyecto2.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Ao) * '* Fecha : Fecha * '* Versin : 1.0 * '**************************************** 68. 59 Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. TRISB = %00000000 ' Configura el Puerto B como Salida PORTB = %00000000 ' Inicializa el puerto "B". Inicio: ' Etiqueta de Inicio del programa PORTB = %01010101 ' Enciente las salidas RB0, RB2, RB4 y RB6, al ' mismo tiempo apaga RB1, RB3, RB5 y RB7. Pause 1000 ' Hace una pausa de 1000 milisegundos = 1 Seg. PORTB = %10101010 ' Enciente las salidas RB1, RB3, RB5 y RB7, al ' mismo tiempo apaga RB0, RB2, RB4 y RB6. Pause 1000 ' Hace una pausa de 1000 milisegundos = 1 Seg. GoTo Inicio ' Salta a la etiqueta "Inicio" y se repite el ' proceso. End Este programa enciende primero las salidas pares del puerto B y apaga las salidas impares, genera una pausa de 1 segundo (1000 ms) y seguidamente hace el proceso inverso en las salidas, es decir, enciende las salidas impares y apaga las salidas pares para generar nuevamente otra pausa de 1 segundo y as repetir el proceso completo al generar un salto a la etiqueta Inicio. 69. 60 5.3.- Proyecto #3: Los pines en los puertos de un microcontrolador pueden ser configurados tambin como entradas, como se detalla en el contenido del proyecto #1, donde se explica claramente que al poner un 1 en un bit de un registro de configuracin de puerto, ya sea TRISA o TRISB, para el caso del PIC16F84A, ste se comportar como entrada. Realice el montaje de la figura 5.10 y analice el programa que se muestra a continuacin. Figura 5.10. Proyecto # 3 Componente Cantidad PIC16F84A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 pF 2 LED 1 Resistencia de 220 Ohm 1 Resistencia de 10K Ohm 1 Pulsador Normalmente Abierto 1 Fuente regulada de 5 Vdc 1 Tabla 5.3. 70. 61 IF THEM ELSE Sintaxis: If expresin 1 {AND / OR expresin 2} Then etiqueta Con la instruccin If Them podemos tomar decisiones a lo largo de un programa, basadas en condiciones especficas definidas por el programador. El siguiente programa hace destellar un LED conectado en RB0, solo cuado el pulsador es activado: '**************************************** '* Nombre : Proyecto3.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Ao) * '* Fecha : Fecha * '* Versin : 1.0 * '**************************************** Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. TRISA = %11111 ' configura el Puerto A como Entrada TRISB = %00000000 ' Configura el Puerto B como Salida PORTB = $00 ' Inicializa el puerto B Inicio: If PORTA.0 = 1 Then PORTB.0 = 1 ' Pregunta si RA0 = 1, si se cumple ' la condicin entonces enciende el Led. Pause 1000 ' Hace una pausa de 1 segundo (1000 ms) Low PORTB.0 ' Apaga el Led Pause 1000 ' Hace una pausa de 1 segundo (1000 ms) GoTo inicio ' Salta a la etiqueta "Inicio" End Para verificar si el pulsador est activado, se pregunta si RA0 = 1. Esto es posible gracias a la instruccin IF la cual genera un resultado siempre que la condicin planteada se cumpla, y para lo cual debemos utilizar necesariamente su complemento Then seguido de la accin a ser tomada. 71. 62 En este caso si el pulsador ha sido activado, entonces RA0 = 1, es decir, se cumple la condicin y por lo tanto RB0 = 1, es decir, el LED enciende. 5.4.- Proyecto #4: En este ejemplo empleamos un microcontrolador PIC16F877A, con el cual nos hemos planteado la lectura de ocho pulsadores conectados al puerto B, de tal manera que al activar uno de ellos podemos mostrar un dgito decimal en un Display de siete segmentos. Figura 5.11. 72. 63 Proyecto # 4 Componente Cantidad PIC16F877A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 pF 2 Resistencia de 220 Ohm 8 Resistencia de 10K Ohm 8 Pulsador Normalmente Abierto 8 Display de 7 Segmentos - Ctodo comn 1 Fuente regulada de 5 Vdc 1 Tabla 5.4. En el diagrama esquemtico de la figura 5.11 se pueden observar ocho pulsadores normalmente abiertos, los cuales una vez activados generan un estado lgico alto en el puerto seleccionado (puerto B), el cual ha sido configurado como entrada. El display de 7 segmentos de ctodo comn, se encuentra conectado al puerto D, donde el bit menos significativo RB0 corresponde al segmento a del display, RB1 corresponde al segmento b, RB2 corresponde al segmento c, RB3 corresponde al segmento d, RB4 corresponde al segmento e, RB5 corresponde al segmento f y RB6 corresponde al segmento g. El siguiente programa es una forma bsica de tomar una lectura de cada pulsador conectado al puerto B y generar un resultado en el puerto de salida al cual hemos conectado un display de 7 segmentos: '**************************************** '* Nombre : Proyecto4.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Ao) * '* Fecha : Fecha * '* Versin : 1.0 * '**************************************** 73. 64 Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. TRISB = $FF ' Configura el Puerto B como Entrada TrisD = $00 ' Configura el Puerto D como Salida Inicio: ' A continuacin se verifica cada pin del puerto B, ' si hay un 1 lgico en alguna de las entradas el ' puerto D se actualiza con el dato correspondiente ' para generar en el Display un dgito decimal. ' gfedcba ' ||||||| If PORTB.0 = 1 Then PortD = %00111111 ' Enciende los segmentos correspondientes ' al dgito cero en el display. If PORTB.1 = 1 Then PortD = %00000110 ' Enciende los segmentos correspondientes ' al dgito uno en el display. If PORTB.2 = 1 Then PortD = %01011011 ' Enciende los segmentos correspondientes ' al dgito dos en el display. If PORTB.3 = 1 Then PortD = %01001111 ' Enciende los segmentos correspondientes ' al dgito tres en el display. If PORTB.4 = 1 Then PortD = %01100110 ' Enciende los segmentos correspondientes ' al dgito cuatro en el display. If PORTB.5 = 1 Then PortD = %01101101 ' Enciende los segmentos correspondientes ' al dgito cinco en el display. If PORTB.6 = 1 Then PortD = %01111101 ' Enciende los segmentos correspondientes ' al dgito seis en el display. If PORTB.7 = 1 Then PortD = %00000111 ' Enciende los segmentos correspondientes ' al dgito siete en el display. GoTo Inicio ' Salta a la etiqueta "Inicio" End 74. 65 5.5.- Proyecto #5: En el ejemplo a continuacin se realiza un conteo ascendente desde cero hasta nueve en un display de 7 segmentos conectado al puerto D de un PIC16F877A. Figura 5.12. Proyecto # 5 Componente Cantidad PIC16F877A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 pF 2 Resistencia de 220 Ohm 8 Display de 7 Segmentos - Ctodo comn 1 Fuente regulada de 5 Vdc 1 Tabla 5.5. 75. 66 FOR NEXT Sintaxis: For variable = inicio to final {step {-} incremento} * * Instrucciones * * Next { variable} La instruccin ForNext se encarga de hacer repeticiones de instrucciones que permanecen dentro del lazo For Next. El parmetro Step afecta el incremento segn el valor asignado despus de esta palabra. Si este parmetro es omitido, el incremento es en una unidad. Analice el siguiente programa: '**************************************** '* Nombre : Proyecto5.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Ao) * '* Fecha : Fecha * '* Versin : 1.0 * '**************************************** Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. I Var Byte ' Declaracin de la Variable "I" tipo Byte ' Constantes para definir cada dgito decimal en el Display: ' gfedcba ' ||||||| Cero CON %00111111 Uno CON %00000110 Dos CON %01011011 Tres CON %01001111 Cuatro CON %01100110 Cinco CON %01101101 Seis CON %01111101 Siete CON %00000111 76. 67 Ocho CON %01111111 Nueve CON %01100111 ' Configuracin del Puerto de Salida: TrisD = $00 ' Configura el Puerto D como Salida Inicio: For I = 0 To 9 ' Repeticin de Instrucciones dentro del Lazo ' For - Next Call Digito ' Salto con Retorno hacia la etiqueta "Digito" Pause 1000 ' Pausa de 1 segundo (1000 ms) Next I GoTo Inicio ' Salta a la etiqueta "Inicio" Digito: ' Verificacin del dgito a ser mostrado en el Display el cual ' se corresponde con el valor almacenado en la variable "I". If I = 0 Then PortD = cero If I = 1 Then PortD = Uno If I = 2 Then PortD = dos If I = 3 Then PortD = tres If I = 4 Then PortD = cuatro If I = 5 Then PortD = cinco If I = 6 Then PortD = seis If I = 7 Then PortD = siete If I = 8 Then PortD = ocho If I = 9 Then PortD = nueve Return ' Retorna una lnea despus del salto con retorno (Call) End Al iniciar el conteo en el display de 7 segmentos, se puede observar un conteo ascendente que da inicio en cero y se va incrementando en una unidad cada segundo hasta llegar a nueve. Si deseamos realizar el incremento en ms de una unidad por vez, tan solo debemos incluir la directiva Step, seguido del incremento, es decir, si queremos realizar un incremento de dos unidades por vez, entonces el lazo For Next se compone de la siguiente manera: 77. 68 For I = 0 To 9 Step 2 ' Repeticin de Instrucciones dentro del Lazo ' For Next con incremento en dos unidades. Call Digito ' Salto con Retorno hacia la etiqueta "Digito" Pause 1000 ' Pausa de 1 segundo (1000 ms) Next I Esto significa que el conteo arranca en cero y cada segundo transcurrido se podrn ver los dgitos: 2, 4, 6 y 8. Para realizar un conteo regresivo, el lazo For Next se compone de la siguiente forma: For I = 9 To 0 Step -1 ' Repeticin de Instrucciones dentro del Lazo ' For Next. Call Digito ' Salto con Retorno hacia la etiqueta "Digito" Pause 1000 ' Pausa de 1 segundo (1000 ms) Next I En este caso en conteo inicia en nueve y decrece en una unidad hasta llegar a cero. 5.6.- Proyecto #6: PicBasic cuenta con una instruccin capaz de generar tonos DTMF (Dual Tone Multifrecuency - Multifrecuencia de doble tono), tonos que se utilizan en telefona para marcar una serie de nmeros y as poder establecer la comunicacin entre dos o ms personas. Una aplicacin interesante para esta instruccin podra ser el discado de nmeros telefnicos en sistemas de alarma cuando ha sido activado un dispositivo de supervisin, para luego generar un mensaje de voz que nos alerte de dicho evento. Realice el montaje de la figura 5.13 y analice el programa que se muestra a continuacin, el cual genera tonos DTMF consecutivos de una serie de dgitos predefinidos. Es muy importante considerar que para generar los tonos adecuadamente el oscilador externo debe ser de 10 Mhz o superior. 78. 69 Figura 5.13. Proyecto # 6 Componente Cantidad PIC16F84A 1 Cristal de 10 Mhz 1 Capacitor cermico de 33 pF 2 Capcitor Electroltico de 10 uF 2 Parlante de 8 Ohm 1 Fuente regulada de 5 Vdc 1 Tabla 5.6. En la tabla 5.7 se puede observar la frecuencia baja y la frecuencia alta de cada digito entre cero y quince, los cuales se corresponden a su vez con cada uno de los dgitos de un teclado telefnico, como se puede observar en la segunda columna de la misma tabla. Esto quiere decir que si generamos las frecuencias correspondientes al dgito 1 utilizando la instruccin DTMFout, obtendremos las mismas frecuencias baja y alta que se generan al pulsar el dgito 1 de cualquier telfono de tonos DTMF. Si deseramos generar desde el microcontrolador el tono DTMF 79. 70 correspondiente al dgito 0 de un teclado telefnico, entonces, segn la tabla 5.7, el dgito a introducir en la instruccin DTMFout deber ser el 10. Dgito en la Instruccin DTMFout Dgito en un Teclado Telefnico Frecuencias Bajas Frecuencias Altas 1 1 697 HZ 1209 HZ 2 2 697 HZ 1336 HZ 3 3 697 HZ 1477 HZ 4 4 770 HZ 1209 HZ 5 5 770 HZ 1336 HZ 6 6 770 HZ 1477 HZ 7 7 852 HZ 1209 HZ 8 8 852 HZ 1336 HZ 9 9 852 HZ 1477 HZ 10 0 941 HZ 1209 HZ 11 * 941 HZ 1336 HZ 12 # 941 HZ 1477 HZ 13 A 697 HZ 1633 HZ 14 B 770 HZ 1633 HZ 15 C 852 HZ 1633 HZ 0 D 941 HZ 1633 HZ Tabla 5.7. Figura 5.14. 80. 71 Antes de empezar a programar, vamos a verificar la sintaxis de la instruccin DTMFout: DTMFout Sintaxis: DTMFout pin, {On-ms, Off-ms}, [tono, tono,...tono] La instruccin DTMFout genera tonos DTMF en secuencia y a travs de un puerto cualquiera del microcontrolador. Pin: especifica el pin del puerto en el cual se emitirn los tonos DTMF. On-ms: es una variable o constante que especifica la duracin de cada tono en milisegundos. En caso de no utilizar este parmetro, el tiempo por defecto de cada tono es de 200 ms. Off-ms: es una variable o constante que especifica el tiempo en milisegundos del silencio que hay entre cada tono. En caso de no utilizar este parmetro, el tiempo en silencio entre cada tono por defecto ser de 50 ms. Tono: puede ser una variable o constante entre 0 y 15, que especifica el tono que debe ser generado. 81. 72 Programa en Pic Basic: '**************************************** '* Nombre : Proyecto6.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Ao) * '* Fecha : Fecha * '* Versin : 1.0 * '**************************************** Define Osc 10 ' Define el Oscilador en 10 Mhz. TRISA = $FE ' Configura el pin RA0 como Salida ' y el resto de los pines como entrada. Inicio: DTMFOut PORTA.0, [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] Pause 2000 ' Genera una pausa de 2 segundos. DTMFOut PORTA.0, 400, 150, [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] Pause 2000 ' Genera una pausa de 2 segundos. GoTo Inicio ' Salta a la etiqueta "Inicio". End 82. 73 Observe que en la primera instruccin DTMFout, despus de la etiqueta Inicio, no se especifica la duracin de cada tono y el tiempo en silencio entre cada tono. Esto significa que el microcontrolador genera cada tono con una duracin de 200 milisegundos por defecto, y un tiempo en silencio entre cada tono de 50 milisegundos como se muestra en las figuras 5.15 y 5.16 respectivamente: Figura 5.15. 83. 74 Figura 5.16. La segunda instruccin DTMFout, despus de la etiqueta Inicio, tiene definido un tiempo de duracin para cada tono de 400 milisegundos (figura 5.17), y un tiempo de espera entre cada tono de 150 milisegundos (figura 5.18). Estos tiempos pueden ser ajustados a conveniencia cada vez que sea necesario. 84. 75 Figura 5.17. Figura 5.18. 85. 76 5.7.- Proyecto #7: En este proyecto estudiaremos la instruccin Button, la cual es utilizada para la eliminacin de rebotes en pulsadores o para efectuar repeticiones en un botn, como sucede en el caso de los teclados de las computadoras, en las cuales si dejamos presionado un botn o tecla, la misma se repite indefinidamente a una frecuencia especfica, la cual puede ser variada fcilmente como lo demostraremos a continuacin. Antes de empezar, veamos la sintaxis de la instruccin Button: Button Sintaxis: Button pin, estado, retardo, rango, variable, accin, etiqueta La instruccin Button elimina los rebotes de un pulsador o switch, y genera auto-repeticin. Pin: especifica el pin del puerto en el cual ser conectado el pulsador. Estado: indica cual es estado lgico que debe ocurrir cuando el pulsador es presionado (0 o 1). Si es 0, el pulsador deber ser activo-bajo y si es 1, el pulsador deber ser activo-alto (Ver figura 5.19). 86. 77 Figura 5.19. Retardo: es una variable o constante (0 255) que especifica cuantos ciclos deben pasar antes de efectuar la auto-repeticin. Este campo tiene dos funciones especiales: si el campo retardo es igual 0, no permite anti-rebote y no permite auto-repeticin. Si el campo retardo es igual a 255, permite el anti- rebote pero no permite la auto-repeticin. Rango: es una variable o constante (0 255) que especifica el nmero de ciclos entre auto-repeticiones. Variable: es una variable auxiliar tipo Byte, definida tambin al inicio del programa para uso exclusivo de la instruccin Button, por lo cual no deber ser utilizada con otro fin en el programa. Siempre debe ser inicializada antes del comando Button. Accin: indica el estado del botn cuando ste no es presionado. 87. 78 Etiqueta: la instruccin realiza un salto a la etiqueta definida en este campo cuando el pulsador no ha sido presionado. Adicionalmente utilizaremos la instruccin Pulsout en el ejemplo, para generar pulsos de tiempo definido. PULSout Sintaxis: PULSout pin, nivel, variable La instruccin PULSout, genera pulsos con una duracin definida en decenas de microsegundos. (Tiene una resolucin de 10 microsegundos para un oscilador de 4 Mhz, y una resolucin de 2 microsegundos para un oscilador de 20 Mhz). 88. 79 Para este proyecto hemos preparado tres ejemplos los cuales estn basados en el circuito de la figura 5.20. Figura 5.20. Proyecto # 7 - 7.1 - 7.2 - 7.3 Componente Cantidad PIC16F877A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 pF 2 Resistencia de 10K Ohm 1 Pulsador Normalmente Abierto 1 Fuente regulada de 5 Vdc 1 Tabla 5.8. 89. 80 Se puede observar en el diagrama esquemtico, que mientras el pulsador permanece abierto, hay un cero lgico en el pin RB0, el cual debemos configurar como entrada en el programa. Cuando el pulsador sea presionado, el estado lgico en el pin RB0 ser un uno lgico. La salida a travs de la cual se van a generar los pulsos ser el pin RB1, en el cual hemos conectado un osciloscopio para poder ver el resultado de las seales generadas a partir de las especificaciones dadas en cada ejemplo a continuacin. 5.7.1.- Proyecto #7.1: Para el primer ejemplo, se pide generar un pulso de 1.5 milisegundos una vez presionado el botn. Luego, pasados 20 milisegundos con el botn presionado, debe empezar una auto-repeticin de este pulso cada 10 milisegundos. Veamos el siguiente programa: Define Osc 4 TRISB = %11111101 ' Configuracin del puerto B A Var Byte ' declaracin de la variable A para la instruccin Button. A = 0 ' inicializa la variable A PORTB.1 = 0 ' Inicializa la Salida RB0 Inicio: Button PORTB.0,1,2,1,A,0,Tiempo PulsOut PORTB.1,150 ' Genera un pulso de 1.5ms o 150 decenas de ' microsegundos. Tiempo: Pause 10 ' Pausa de 10 milisegundos GoTo Inicio ' Salta a inicio End 90. 81 Ahora analicemos la secuencia del programa: Mientras el pulsador permanece abierto, la instruccin Button salta a la etiqueta especificada, la cual en este caso hemos denominado Tiempo. Seguidamente el programa completa el ciclo ejecutando las instrucciones que siguen, y finalmente retorna a la etiqueta inicio. Si es presionado el pulsador, se genera el primer pulso a travs de la instruccin Pulsout PortB.1, 150 (figura 5.21), y el programa contina su curso hasta completar el primer ciclo. En este punto la auto- repeticin an no comienza, ya que hemos especificado en la instruccin Button, que sta debe comenzar al terminar el segundo ciclo: Button PORTB.0,1,2,1,A,0,Tiempo Figura 5.21. 91. 82 Al terminar el primer ciclo de programa, han transcurrido los primeros 10 milisegundos. Con el segundo ciclo de programa ocurre nuevamente el salto a la etiqueta Tiempo, producindose una nueva pausa de 10 milisegundos, para un tiempo de espera antes de ejecutar la auto-repeticin de 20 milisegundos. Figura 5.22. Cumplidos los dos ciclos especificados en el campo retardo de la instruccin Button, la instruccin empieza la auto-repeticin cada un ciclo, ya que as lo hemos especificado en el campo rango de la instruccin: Button PORTB.0,1,2,1,A,0,Tiempo 92. 83 En la figura 5.22 se puede apreciar la lectura de la seal producida por el programa al activar el pulsador. Observe que el tiempo entre el primer pulso y la auto-repeticin es de 20 milisegundos, y que el tiempo entre cada auto- repeticin es de 10 milisegundos (figura 5.23). Figura 5.23. 93. 84 En la figura 5.24 se puede observar la seal generada al activar el pulsador, en la cual se ve la auto-repeticin del pulso de 1.5 milisegundos, la cual permanecer hasta que el pulsador sea liberado. Figura 5.24. 94. 85 5.7.2.- Proyecto #7.2: Para el siguiente ejemplo se pretende generar el mismo pulso de 1.5 milisegundos indefinidamente cada 20 milisegundos, siempre y cuando el pulsador permanezca activado. Analice el siguiente programa: Define Osc 4 TRISB = %11111101 ' Configuracin del puerto B A Var Byte ' declaracin de la variable A A = 0 ' inicializa la variable A PORTB.1 = 0 ' Inicializa la Salida RB0 Inicio: Button PORTB.0,1,2,2,A,0,Tiempo PulsOut PORTB.1,150 ' Genera un pulso de 1.5ms o 150 decenas de ' microsegundos. Tiempo: Pause 10 ' Pausa de 10 milisegundos GoTo Inicio ' Salta a inicio End Observe en el programa que el nico cambio para lograr el objetivo, ha sido aumentar en una unidad el campo rango de la instruccin Button, lo cual significa que se deben esperar dos ciclos de programa entre cada auto- repeticin para producir el pulso de 1.5 milisegundos. Button PORTB.0,1,2,2,A,0,Tiempo La secuencia para este programa es la siguiente: Mientras el pulsador permanece abierto, al igual que en el ejemplo anterior, la instruccin Button hace un salto a la etiqueta Tiempo por cada ciclo de programa. Cuando activamos el pulsador, se genera el primer pulso de 1.5 milisegundos gracias a la instruccin Pulsout; luego se genera una 95. 86 pausa de 10 milisegundos y finaliza el primer ciclo con un salto a la etiqueta Inicio. En el segundo ciclo, la instruccin Button verifica el conteo de los ciclos, el cual es controlado por la variable A, determinando que an no se puede empezar la auto-repeticin hasta tanto no haya culminado el segundo ciclo, de tal manera que ocurre nuevamente el salto a la etiqueta Tiempo, y se produce una nueva pausa de 10 milisegundos. Culminados los dos ciclos definidos en el campo retardo de la instruccin Button para el anti-rebote, se produce el primer pulso de 1.5 milisegundos de la auto-repeticin. Ahora podemos ver en el osciloscopio (figura 5.25), la seal generada al activar el pulsador, y en la cual se produce un pulso de 1.5 milisegundos, cada 20 milisegundos. Figura 5.25. 96. 87 5.7.3.- Proyecto #7.3: En este ejemplo se debe generar un pulso de 2.5 milisegundos, con un tiempo para anti-rebotes en el pulsador de 30 milisegundos, y un tiempo entre cada auto-repeticin de 10 milisegundos. Analice el siguiente programa: Define Osc 4 TRISB = %11111101 ' Configuracin del puerto B A Var Byte ' declaracin de la variable A A = 0 ' inicializa la variable A PORTB.1 = 0 ' Inicializa la Salida RB0 Inicio: Button PORTB.0,1,3,1,A,0,Tiempo PulsOut PORTB.1,250 ' Genera un pulso de 2.5ms o 250 decenas de ' microsegundos. Tiempo: Pause 10 ' Pausa de 10 milisegundos GoTo Inicio ' Salta a inicio End En este caso se puede observar que los parmetros en la instruccin Button han sido configurados para que el tiempo en anti-rebote dure tres ciclos de programa, y para la auto-repeticin un ciclo de programa. Entonces, la secuencia de programa es la siguiente: Al activar el botn, se genera un pulso de 2.5 milisegundos. Debido a que el campo retardo en la instruccin Button es igual a tres, la instruccin ejecutar la auto-repeticin despus de cumplir con los tres ciclos de programa, pasando por la subrutina Tiempo en cada ciclo, lo cual da como resultado un retardo de 30 milisegundos. Al culminar el tercer ciclo de programa, empieza la auto-repeticin, generando un pulso de 2.5 milisegundos por cada ciclo de programa, 97. 88 es decir, aproximadamente cada 10 milisegundos. La auto-repeticin se mantiene siempre y cuando el pulsador permanezca activo. En la figura 5.26 se puede observar la seal generada al activar el pulsador, al igual que la medicin del tiempo en el pulso generado por la instruccin Pulsout, igual a 2.5 milisegundos. Figura 5.26. 98. 89 En la figura 5.27, se puede apreciar el tiempo de espera generado por la instruccin Button, igual a 30 milisegundos, para evitar los rebotes en el pulsador. Tambin se puede observar claramente, que una vez culminado este tiempo, se genera una auto-repeticin del pulso, la cual se mantiene siempre que el pulsador se encuentre presionado. Figura 5.27. 99. 90 Observe en la figura 5.28 la medicin del tiempo entre cada auto-repeticin. Figura 5.28. 100. 91 5.8.- Proyecto #8: En este proyecto estudiaremos la instruccin Branch, con un ejemplo sencillo basado en el circuito de la figura 5.29, en el cual se debe iluminar cada Led en forma consecutiva por cada segundo transcurrido. Figura 5.29. Proyecto # 8 Componente Cantidad PIC16F84A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 pF 2 LED 3 Resistencia de 220 Ohm 3 Fuente regulada de 5 Vdc 1 Tabla 5.9. 101. 92 Branch Sintaxis: Branch Variable,[Etiqueta1, Etiqueta2,EtiquetaN] La instruccin Branch hace un salto a una etiqueta dependiendo del valor de la variable, es decir, si la variable es igual a 0, el salto se hace a la etiqueta 1; si la variable es igual a 1, el salto se hace a la etiqueta 2; si la variable es igual a 2, el salto se hace a la etiqueta 3, y as sucesivamente. Analice el siguiente programa: '**************************************** '* Nombre : Proyecto8.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Ao) * '* Fecha : Fecha * '* Versin : 1.0 * '**************************************** I var Byte ' Declaracin de la variable I TRISB = $00 ' Configura el puerto B como salida PORTB = $00 ' Inicializa el puerto B I = 0 ' Inicializa la variable I Inicio: Branch I,[Led1,Led2,Led3] Led1: PORTB = %00000001 ' enciende el led en RB0 Pause 1000 ' pause de 1 segundo PORTB = %00000000 ' apaga el led I = I + 1 ' suma 1 a la variable I GoTo inicio ' salta a inicio Led2: PORTB = %00000010 ' enciende el led en RB1 Pause 1000 ' pause de 1 segundo PORTB = %00000000 ' apaga el Led I = I + 1 ' suma 1 a la variable I GoTo inicio ' salta a inicio 102. 93 Led3: PORTB = %00000100 ' enciende el led en RB2 Pause 1000 ' pause de 1 segundo PORTB = %00000000 ' apaga el Led I = 0 ' Inicializa la variable I GoTo Inicio ' salta a inicio End Observe en el programa que a partir de la etiqueta Inicio, la instruccin Branch hace un salto a la etiqueta especificada segn el valor cargado en la variable I, que se corresponde con la posicin de la etiqueta que hemos designado entre los corchetes. Entonces, si I = 0, la instruccin hace un salto a la etiqueta Led1; si I = 1, la instruccin hace un salto a la etiqueta Led2; si I = 2, entonces la instruccin hace un salto a la etiqueta Led3. 103. 94 5.9.- Proyecto #9: La instruccin PWM, puede ser usada para generar voltajes analgicos implementando el circuito conectado al pin RB0 de la figura 5.30. A continuacin realizaremos un ejemplo de aplicacin de la instruccin PWM para generar un voltaje determinado, aplicando una serie de clculos sencillos. Figura 5.30. Proyecto # 9 Componente Cantidad PIC16F84A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 pF 2 Resistencia de 10K Ohm 1 Capcitor Electroltico de 10 uF 1 Fuente regulada de 5 Vdc 1 Tabla 5.10. 104. 95 PWM Sintaxis: PWM pin, nivel, ciclo La instruccin PWM enva pulsos PWM (Pulse Width Modulation) a un pin especfico. Pin: especifica el pin del puerto en el cual se genera PWM. Nivel: es una variable o constante que determina la duracin del pulso en su nivel alto, es decir, partiendo de nivel = 1, si se incrementa este valor, el ancho de pulso positivo se incrementa, hasta nivel = 254, donde el ciclo de trabajo es aproximadamente 100%. Cuando nivel = 0, la salida se mantiene en cero lgico; cuando nivel = 255, la salida se mantiene en uno lgico. Ciclo: es una variable o constante en el cual se define el nmero de ciclos en un pin especfico. PWM es una abreviacin de Pulse Width Modulation, o modulacin por ancho de pulso, y es un mtodo utilizado normalmente para el control de velocidad de motores elctricos, o para regular voltajes en fuentes conmutadas entre otras aplicaciones. Este control se lleva a cabo modificando el ancho de pulso o ciclo de trabajo de la seal generada. En nuestro ejemplo, para generar un voltaje especfico en una de las salidas de un microcontrolador a travs de la