Vous êtes sur la page 1sur 450

Christian Bodinton EstevagChristian Bodinton Estevag B BBBBA AAAAS SSSSI IIIIC CCCCP PPPPA AAAAR RRRRA AAAA MICROCONTROLADORESPICMICROCONTROLADORESPICMICROCONTROLADORESPICMICROCONTROLADORE

SCPI Ingeniero en Electrnica

CONTENIDO Prlogo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Captulo I. Herramientas de DiseoCaptulo II. MicroCode StudioCapitulo III.Microcontr oladores PIC. 3.3.-El Circuito de Reset. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.2.-El Oscilador Externo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25 3.1.-Que es un PIC? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 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.4. Fuente de poder, 5Vdc / 3.3Vdc. . . . . . . . . . . . . . . . . . . . . . . 37 3.4.3. El Opto-acoplador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 IV. Estructura de un programa. Componentes y operadores en Captulo PicBasic. 4.1.-Estructura de un programa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.2.-Subrutinas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 4.3.-Componentes yoperadores en PicBasic. . . . . . . . . . . . . . . . . . . . . . . .41 i

5.2.-Proyecto #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.3.-Proyecto #3. Implementacin de la instruccin If-Them-Else. . . . . . . .60 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. 5.1.-Proyecto #1. Low Goto y Pause. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47 Implementacin de las instrucciones de programa High, Primeros Programas con el PIC16F84. 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 6 5.7.1.-Proyecto #7.1 . . . . . . . . . . . . 80 5.7.2.-Proyecto #7.2 . . . . . . . . . . . . 85 5.7.3.-Proyecto #7.3 . . . . . . . . . . . . 87 ii de la instruccin Button . . . . . . . . . . . . .7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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.14.-Proyecto #19. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .137 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.4.-Proyecto #10. Implementacin de la instruccin Lcdout . . . . . . . . . . 103 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.5.-Proyecto #11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 6.13.-Proyecto #18. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .130 6.12.-Memoria CGRAM en la Pantalla LCD. . . . . . . . . . . . . . . . . . . . . . . .127 Capitulo VII.Teclado Matricial. 7.1.-Teclado Matricial. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149 7.2.-Proyecto #20. Aplicacin de un teclado 3x4. . . . . . . . . . . . . . . . . . . .154 iii

X.Memoria Serial I2C. Capitulo Capitulo VIII. Memoria de Datos. 8.1.-Memoria de Datos. . . . . . . . . . . . . . . . . .157 8.2.-Proyecto #21. Implementacin de 8.3.-Proyecto #22. Implementacin de 8.4.-Proyecto #23. . . . . . . . . . . . . . . . . . . . . .165 . . . . . . . . . . . . . . . . . . . . . . la instruccin Read. . . . . . . . . . . .161 la instruccin Write. . . . . . . . . . . .163 . . . . . . . . . . . . . . . . . . . . . .

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. . . . . . . . . . . . . . 17 7 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 10.1.-Qu es el bus I2C?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .190 10.2.-Proyecto #28. Implementacin de las instrucciones I2Cwrite, I2Cread . . 192 iv

10.3.-Proyecto #29. . . . . . . . . . . 10.4.-Proyecto #30. . . . . . . . . . .

. . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .196 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .198

Capitulo XI. Conversor A/D en el PIC16F877. 11.1.-Conversor A/D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .202 11.2.-El registro ADCON0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .209 11.4.-Proyecto #31. Implementacin de la instruccin ADCin. . . . . . . . . . 214 11.3.-El registro ADCON1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .210 Capitulo XII. 12.1.-Comunicacin Serial. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 Comunicacin Serial. Transmisin y Recepcin de Datos. 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 13.3.-Proyecto #36. . . . . . . . . . . . . . . . . . . . . . .276 13.4.-Proyecto #37. . . . . . . . . . . . . . . . . . . . . . .280 13.5.-Proyecto #38. . . . . . . . . . . . . . . . . . . . . . .283 v . . . . . . . . . . . . . . . . . . . . . . . la instruccin PauseUs. . . . . . . . .272 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Capitulo XIV. Mdulos RF para comunicaciones. 14.1.-Mdulos RF. . . . . . . . . . . . 14.2.-Proyecto #39. . . . . . . . . . . 14.3.-Proyecto #40. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .293 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .296 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .300

14.4.-Proyecto #41. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .305 Capitulo @. . . . . . . . ADCin. . . . . . XV. . . . . . . . . Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . de programa de PicBasic. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311

Asm EndAsm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .311 Branch. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .312 Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 Call. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315Clear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .315

ClearWDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .316 Count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 DTMFout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 EEPROM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .321 End. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 FreqOut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .321 For Next. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .323 Gosub. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 vi

Goto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .324 High. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .324 I2Cread. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 Input. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .328 Pause. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .333 Output. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 NAP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Low. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .331 LCDout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .330 LCDin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .329 IF-Then-Else. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 I2Cwrite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .326 PauseUs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .333 Pot. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 PulsIn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 PulsOut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 Random . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .337 Read . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 Return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 Reverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .340 Select Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .340 SerIn. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .342 vii

SerOut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .343 Sleep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .344 Swap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .344 Apndice A Apndice B Apndice C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .360 Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .362 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .358 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .348 Write . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .347 While-Wend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 Toggle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .345 viii

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, travs de un sin De toda la gama de posibilidades entre las familias de microcontroladores PIC a travs caractersticas ms popular de toda la serie, el PIC16F84, que ser utilizado en este libro que ofrece Microchip Inc., hemos elegido para empezar el microcontrolador desarrollados en lenguaje Basic para Microcontroladores PIC. numero de posibilidades de diseo a partir de una serie de ejemplos prcticos a para estudiar algunas de sus del desarrollo de que se 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 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 en el rea, debido a que cuenta con una gran variedad de instrucciones que hacen de la programacin de microcontroladores una tarea populares 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

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 se la cual 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 aquello que represente una innovacin cientfica en este campo. para el desarrollo de proyectos electrnicos, proyectos de robtica y todo Finalmente, el quienes publicacin, agradecimiento para todos nuestros colaboradores en la edicin de esta se han encargado de revisar cada detalle, proyectos e ideas plasmadas en cada capitulo. Ingeniero en Informacin, Maria del Carmen Lara T. Tcnico Superior en Electricidad, Ral Mastropasqua. Ingeniero en Electrnica, Jess Frank Phorlakis. 2

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 uno de los proyectos propuestos a partir del captulo V. Figura 1.1. (Fuente: http://www.microengineeringlabs.com) cada 3

una programador buena programador buena 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 experiencia realizar el montaje de cualquiera de estos diseos, aunque en esta oportunidad nuestra recomendacin es el P16Pro/Picallw. Los detalles para la construccin de este programador estn contenidos en el apndice A. Figura 1.2. 4

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. la elaboracin de los circuitos propuetos en cada captulo. Multmetro digital: este instrumento de medicin ser muy til durante Figura 1.3. Figura 1.4. 5

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.

Herramientas de corte, extractor de circuitos integrados, cable rgido para conexiones en la placa de prototipos. Figura 1.5. Figura 1.6. 6

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: de fcil adquisicin. componentes microcontroladores PIC en los modelos definidos en cada ejemplo prctico, resistencias, diodos, servomotores, condensadores, cristales y otros Cada proyecto cuenta con que una tabla en la cual se decriben los componentes electrnicos debern ser utilizados en el cada montaje. Figura 1.7. 7

Microcode Studio Capitulo II Microcode Studio (IDE), es un Ambiente Integrado de MECANIQUE, diseado especialmente para microEngineering Labs, pgina Inc., de libre adquisicin a travs de la Web http://www.microengineeringlabs.com Desarrollo de 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: 8

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 9

Haga clic en el Link aqu sealado, para descargar la versin Demo de PicBasic. Haga clic en el Link aqu sealado, para descargar la versin Demo de PicBasic. 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. 10

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. 11

Haga clic en el botn Next y podr ver en la siguiente ventana el acuerdo de licencia para Microcode Studio: Figura 2.9. C:\Archivos de programa\Mecanique\MCSNombre de la carpeta en la cual se encontrar el archivo ejecutable de Microcode Studio. deber ser instalado el software: . Esta ruta puede ser cambiada haciendo clic en el botn Browse , a travs del cual se podr ubicar la nueva carpeta en la cual La ruta por defecto para la instalacin de Microcode Studio es Figura 2.10. 12

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. 13

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. 14

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 Don t create a Start Menu Folder : Figura 2.15. 15

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. 16

compilador Finalmente se puede ver en la ventana de la figura 2.18, un mensaje en el Figura 2.18. cual se confirma que el PICBasic Pro ha sido instalado satisfactoriamente. Deshabilite la opcin Install Microcode Studio IDE seguidamente haga clic en el botn Finish . travs de la direccin: http://www.melabs.com/support/index.htm Nota: Puede descargar la documentacin completa del compilador PicBasic a 17 y

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 . 2. Haga clic en el y seleccione la opcin Compile and Program Options . men View Figura 2.19. Figura 2.20. 18

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 estaremos se pide la ubicacin del software del programador que utilizando para grabar los microcontroladores. Figura 2.22. 19

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. 20

cuentan una poseen en su con poseen en su con 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 tecnologa tipo RISC (Reduced Instruction Set Computer) y arquitectura interna caractersticas especiales que varan segn el modelo de PIC que deseamos utilizar. USART (Universal Receiver/Transmitter), comunicacin serie I2C, entre otros. 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 A/D, comparadores, Synchronous/Asynchronous convertidores Con todas estas caractersticas es lgico pensar que este dispositivo pasa a aser el corazn del circuito 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 muy de control, donde las mismas sern realizadas en lenguaje Basic para microcontroladores PIC. Es por esta razn que consideramos 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 21

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. Los microcontroladores PIC comnmente ms utilizados son los siguientes: Figura 3.1. PIC12C508 y PIC12C509, tienen memoria de programa EPROM, oscilador interno, y son muy utilizados en diseos de pequeos circuitos. estudiando PIC16F84A, tiene memoria de programa tipo FLASH, oscilador externo, 13 pines I/O entre otras caractersticas que estaremos 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. 22

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 que 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 estaremos estudiando a continuacin. Antes de empezar a revisar un lo todo 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 programa de control de un diseo completamente personalizado. Para Microcontrolador de 8 Bits. veamos empezar, algunas caractersticas del microcontrolador PIC16F84: 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). 23

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 24

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. motivo 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 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. 25

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 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 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. se muestra a continuacin: Los valores de los condensadores cermicos vienen dados segn la tabla que Tabla 3.2 26

Por ejemplo, para un oscilador tipo XT, podemos utilizar un cristal de cuarzo como el de la figura 3.5. Figura 3.5. un Al conectar el microcontrolador a la fuente de alimentacin de 5 Vdc y medir la seal de salida del oscilador XT con 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. 27

Pin 14: +5Vdc 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 Pin 1: Pin 7: Pin 8: 3.7. NC (Este pin no se encuentra conectado internamente) GND Salida TTL

En su salida se obtiene un tren de pulsos como se puede observar en la figura los 3.8, osciloscopio: bajo siguientes parmetros de medicin seleccionados en un Voltios/Div: 2V Time/Div: 100ns 28

La lectura de la frecuencia y perodo en este caso sera la siguiente: Figura 3.8. 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 Los valores recomendados para este oscilador son los siguientes: que la temperatura puede afectar la operacin de este tipo de oscilador. 5 Kohm = R1 = 100 Kohm C1 > 20pF 29

Figura 3.9. tomado 3.3. Circuito de Reset: El Pin denominado MCLR (Master Clear), siempre debe ser 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: 30

Figura 3.10. Este circuito permite reiniciar el microcontrolador cada vez que el pulsador P1 es presionado. 3.4. Consideraciones tcnicas de diseo: son A continuacin veremos algunos circuitos bsicos que deben ser tomados en cuenta para el desarrollo de prcticas con microcontroladores PIC. Estos circuitos 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. 31

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. 32

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 podramos considerar los circuitos de la figura 3.12, los cuales nos proporcionan dos pulsador, formas diferentes de hacerlo: Figura 3.12. 33

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. conduzca corriente a travs del colector. diodo LED el cual se encarga de iluminar un fototransistor, para que ste Este componente en una de sus versiones, se compone bsicamente de un Figura 3.13. 34

entre el emisor y colector, 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 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 35

travs del cual circular la corriente necesaria entre sus contactos, para hacer funcionar cualquiera de estos dispositivos de potencia. Figura 3.15. 36

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. 37

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. A B C D 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. 38

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 subrutinas dentro de un o programa. Son definidas por el programador y deben tener al final de cada especficos una de ellas el smbolo de dos puntos , que definen el final de la misma. vez la tecla TAB , y de esta manera establecemos un espacio mnimo, siempre igual o superior entre la seccin B y C. Seccin C: Estar destinada para las instrucciones de programa y la misma decir, cuando el cursor se encuentra en la columna cero, presionamos una est separada de la columna cero del editor de texto por una tabulacin, es Seccin D: Esta destinada para realizar comentarios acerca de la funcin que una estar cumpliendo instruccin especfica en nuestro programa. Cada comentario debe empezar siempre con una comilla simple como se muestra a continuacin: Cuando un comentario es demasiado extenso, podemos continuar el mismo en la siguiente lnea, siempre que la frase comience con su respectiva comilla. ' Define el Oscilador para un Cristal ' de 4 Mhz. 39

etiqueta que corresponde a sta, la cual debe ir siempre al inicio de la misma. 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 Led1:

For Z=0 To 9 LED = Encendido Etiqueta Pause 1000

Subrutina LED = Apagado Pause 1000 Next Z GoTo Inicio End

40

Define resulta programacin de microcontroladores con PicBasic, que establece una programas sencillamente no funcionen en la mayora de los casos. Esta serie de parmetros estn directamente relacionados con dispositivos si deseamos utilizar un oscilador serie de parmetros que de no ser tomados en cuenta, causar que nuestros muy ya 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 importante en la externos al microcontrolador. Por ejemplo, de diferente frecuencia al valor por defecto (4 Mhz), ser conveniente entonces definir la velocidad del mismo utilizando la directiva: establecido 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. 41

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} LCD_RWBIT {pin} Pin del puerto para RW LCD_LINES {lneas} I2C_SCLOUT 1 I2C_SLOW 1 oscilador mas lento que 8 Mhz. Cuando en la transferencia es utilizado un Interface de Reloj I2C Bipolar Nmero de lneas de la LCD (1,2 o 4) Puerto para RW (Read/Write) 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} LCD_RWBIT {pin} Pin del puerto para RW LCD_LINES {lneas} I2C_SCLOUT 1 I2C_SLOW 1 oscilador mas lento que 8 Mhz. Cuando en la transferencia es utilizado un Interface de Reloj I2C Bipolar Nmero de lneas de la LCD (1,2 o 4) Puerto para RW (Read/Write) 4.3.2.-Variables: En las variables podemos almacenar datos temporalmente, ello se utiliza la palabra VAR seguida por el tipo de variable segn la tabla que mostramos a continuacin: 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 Tabla 4.1. 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. 42

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 una Dato[0] y el ltimo elemento es Dato[7], lo cual significa que hemos declarado 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 15, 56, 75, 80, 20, 33, 45. Dato los valores 200,

Dato[0] Dato[1] Dato[2] Dato[3] Dato[4] Dato[5] Dato[6] Dato[7]

= = = = = = = =

200 15 56 75 80 20 33 45

En algunos casos se debe verificar la hoja de datos del microcontrolador, ya tipo Byte o Word puede variar segn el modelo del mismo. que la cantidad de elementos que se pueden almacenar en variables arrays 43

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 44

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 Izquierda REV Invertir un Bit >> 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 & | ^ NOT Lgico &/ NAND Lgico |/NOR Lgico ^/NXOR Lgico Tabla 4.5. OR Lgico XOR Lgico AND Lgico Descripcin 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 45

El resultado de esta operacin es Var1 = %00000001 4.3.8.-Operadores de Comparacin: Los operadores de comparacin normalmente son utilizados con la instruccin If Them para realizar comparaciones entre variables o datos extrados de alguna operacin aritmtica. Operador Descripcin = Igual <> Diferente < Menor que > Mayor que <= Menor o igual 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. Descripcin AND Lgico OR Lgico XOR Lgico NOT Lgico NOT AND NAND Lgico NOT OR NOR Lgico NOT XOR NXOR Lgico OR XOR NOT AND Operador 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. 46

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. 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. estudiando la sintaxis de las instrucciones empleadas en cada proyecto para facilitar la comprensin general de ste, referente a la programacin y diseo A medida que se van proponiendo ejemplos de aplicacin prctica, estaremos conocimientos adquiridos en las pginas anteriores. Se debe tomar en cuenta El primer paso entonces ser realizar el montaje del circuito con base en los 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. 47

Proyecto # 1 Componentes Cantidad PIC16F84A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 LED 2 Resistencia de 220 Ohm 2 Fuente regulada de 5 Vdc Proyecto # 1 Componentes Cantidad PIC16F84A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 LED 2 Resistencia de 220 Ohm 2 Fuente regulada de 5 Vdc Tabla 5.1.

pF 2 1

pF 2 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). 48

ya sea como entrada o como salida, por ejemplo: TrisB, es un registro de 8 bits en el cual se configuran los pines del puerto B, 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 . Un ejemplo de configuracin de los pines I/O del puerto A es el siguiente: Registro TrisA 1 1 1 1 0 RA4 RA3 RA2 RA1 RA0 Figura 5.2. Bit menos significativo 1 = Entrada (Al configurar un bit del registro TrisA en 1 , ste se comporta como ent rada). 0 = Salida (Al configurar un bit del registro TrisA en 0 , ste se comporta como sali da). 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 ( $ Registro TrisB 1 1 1 1 1 1 1 0 RB7 RB6 RB5 RA4 RA3 RA2 RA1 RA0 Bit menos significativo Figura 5.3. 1 = Entrada (Al configurar un bit del registro TrisB en 1 , ste se comporta como ent rada). 0 = Salida (Al configurar un bit del registro TrisB en 0 , ste se comporta como sali da). 49 para expresar la configuracin en Hexadecimal)

La configuracin en PicBasic para el registro TrisB, ajustada al ejemplo de la 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. figura 5.3 sera entonces la siguiente: TrisB = %11111110 (si se desea hacer la notacin en binario), : TrisB = $FE Esta (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. informacin puede ser cada una de las instrucciones utilizadas en cada proyecto planteado en esta complementada en el captulo XV, en el cual encontrar la descripcin de 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.

50

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. 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.

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 RA0Pause 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 ' proceso. ' Salta a la etiqueta "Inicio" y se repite el End

La instruccin encarga de poner un nivel lgico alto en el pin especificado se seguidamente. HighEn este caso, primero se escribe el puerto y seguido de un punto, se especifica el nmero del pin en el puerto que

La deseamos utilizar. 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. 52

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 Proyecto1.pbp (figura 5.4). nombre 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. 53

Compilar Modelo del uC. Compilar Modelo del uC. Compilar y Grabar en el PIC 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 compilador habr generado un archivo de Ejemplo1.hex y seguidamente se abrir el software figura 5.6: nombre 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. 54 (ver figura 5.5), el

Picall/P16Pro , como se observa en la

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). pueden tres secciones llamadas Oscillator , observar Figura 5.7. En la figura 5.7 se Hardware y Protection : En la seccin XT, debido a que el cristal que hemos elegido es de 4 Mhz. Oscillator , debemos seleccionar el tipo de oscilador utilizado en nuestro circuito electrnico, el cual en este caso es del tipo 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. 55

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 programa clic en el botn Program (ver figura 5.6), para descargar el 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. 56

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 Cristal de 4 Mhz Capacitor de 33 pF LED Resistencia de 220 Ohm Fuente regulada de 5 Vdc 1 1 2 8 8 1 Tabla 5.2. 57

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)

1 , podemos utilizar las siguientes opciones: PORTB = %10101010 ' RB6 = 0, RB4 = 0, RB2 = 0, RB0 = 0 ' RB7 = 1, RB5 = 1, RB3 = 1, RB1 = 1 Cuando deseamos poner varios pines de un mismo puerto en 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 *

'**************************************** 58

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

PORTB = %10101010 Pause 1000 GoTo Inicio ' proceso. End ' Hace una pausa de 1000 milisegundos = 1 Seg. ' Salta a la etiqueta "Inicio" y se repite el ' Hace una pausa de 1000 milisegundos = 1 Seg. ' mismo tiempo apaga RB0, RB2, RB4 y RB6. ' Enciente las salidas RB1, RB3, RB5 y RB7, al 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 . 59

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 Cristal de 4 Mhz Capacitor cermico de 33 pF LED Resistencia de 220 Ohm Resistencia de 10K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc 1 1 2 1 1 1 1 1 Tabla 5.3. 60

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. 61

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. 62

El display de 7 segmentos de ctodo comn, 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 Fuente regulada de 5 Vdc 1 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. 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 *

'**************************************** 63

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 ' al dgito cero en el display. ' Enciende los segmentos correspondientes 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 If PORTB.7 = 1 Then GoTo Inicio ' Salta a la etiqueta "Inicio"

PortD = %00000111 ' Enciende los segmentos correspondientes ' al dgito seis en el display. ' Enciende los segmentos correspondientes ' al dgito siete en el display. End

64

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. 65

FOR

NEXT

Sintaxis: For variable = inicio to final {step {-} incremento} * * Instrucciones * * Next { variable} La instruccin For Next 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 '* Copyright '* Fecha : Fecha '* Versin : 1.0 * '**************************************** Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz.

* * * * : Copyright (Ao) : Nombre del Autor '**************************************** 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 66

unidad cada segundo hasta llegar a nueve. unidad cada segundo hasta llegar a nue ve. 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 e l valor almacenado en la variable "I". If If If If If If If If If If I=0 I=1 I=2 I=3 I=4 I=5 I=6 I=7 I=8 I=9 Then Then Then Then Then Then Then Then Then Then PortD PortD PortD PortD PortD PortD PortD PortD PortD PortD = = = = = = = = = = cero Uno dos tres cuatro cinco seis siete ocho nueve

Return ' Retorna una lnea despus del salto con retorno (Call) End

Al iniciar conteo en el display de 7 segmentos, se puede observar un conteo el ascendente que da inicio en cero y se va incrementando en una 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: 67

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 ' For Next.

' Repeticin de Instrucciones dentro del Lazo 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. 68

Figura 5.13. Figura 5.13. Proyecto # 6 Componente Cantidad PIC16F84A Cristal de 10 Mhz Capacitor cermico de 33 pF Capcitor Electroltico de 10 uF Parlante de 8 Ohm Fuente regulada de 5 Vdc 1 1 2 2 1 1 Tabla 5.6. baja y la frecuencia alta de segunda columna de la misma tabla. Esto quiere decir que si generamos las frecuencias correspondientes al dgito uno de los dgitos de un teclado telefnico, como se puede observar en la En la tabla 5.7 se puede observar la frecuencia cada digito entre cero y quince, los cuales se corresponden a su vez con cada 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 69

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 6 6 770 HZ 7 7 852 HZ 8 8 852 HZ 9 9 852 HZ 10 0 941 HZ 1209 HZ 11 * 941 HZ 1336 HZ 12 # 1477 HZ 13 A 1633 HZ 14 B 1633 HZ 15 C 1633 HZ 0 D 941 HZ 1633 HZ Tabla 5.7. 852 HZ 697 HZ 770 HZ 941 HZ 1336 HZ 1477 HZ 1209 HZ 1477 HZ 1336 HZ Figura 5.14. 70

Antes de empezar a programar, vamos a verificar la sintaxis de la instruccin DTMFout: DTMFout La instruccin DTMFout genera tonos DTMF en secuencia y a travs de un Sintaxis: DTMFout pin, {On-ms, Off-ms}, [tono, tono,...tono] puerto cualquiera del microcontrolador. PinOn-ms: es una variable o constante que especifica la duracin de cada tono de cada tono es de 200 ms. Off-ms: 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 es una variable o constante que especifica el tiempo en milisegundos en milisegundos. En caso de no utilizar este parmetro, el tiempo por defecto : especifica el pin del puerto en el cual se emitirn los tonos DTMF. que debe ser generado. 71

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

72

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 durac in 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. 73

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. 74

Figura 5.17. Figura 5.17. Figura 5.18. 75

Pin: especifica el pin del puerto en el cual ser conectado el pulsador. 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. 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). 76

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 antirebote 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. 77

Etiqueta: la instruccin realiza un salto a la etiqueta definida en este campo cuando el pulsador no ha sido presionado. Adicionalmente utilizaremos la instruccin generar pulsos de tiempo definido. Pulsout en el ejemplo,

para PULSout Sintaxis: PULSout pin, nivel, variable La instruccin PULSout , genera pulsos con duracin definida en decenas de microsegundos. oscilador de 20 Mhz). para un oscilador de 4 Mhz, y una resolucin de 2 microsegundos para un (Tiene una resolucin de 10 microsegundos una 78

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 Cristal de 4 Mhz Capacitor cermico de 33 pF Resistencia de 10K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc 1 1 2 1 1 1 Tabla 5.8. 79

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: End Pause 10 ' Pausa de 10 milisegundos GoTo Inicio ' Salta a inicio

80

Ahora analicemos la secuencia del programa: Mientras el pulsador permanece abierto, la instruccin Button salta a la su curso hasta completar el primer ciclo. este En punto la autorepeticin an no comienza, ya que hemos especificado en la instruccin Button, que sta debe comenzar al terminar el segundo ciclo: etiqueta especificada, la cual en este caso hemos denominado instruccin Pulsout PortB.1, 150 (figura 5.21), y el programa contina Si es presionado el pulsador, se genera el primer pulso a travs de la instrucciones que siguen, y finalmente retorna a la etiqueta inicio. Tiempo . Seguidamente el programa completa el ciclo ejecutando las Button PORTB.0,1,2,1,A,0,Tiempo Figura 5.21. 81

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 ciclo , ya que as lo hemos especificado en el campo rango de la instruccin: Button PORTB.0,1,2,1,A,0,Tiempo 82

un

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 autorepeticin es de 10 milisegundos (figura 5.23). Figura 5.23. 83

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. 84

' Pausa de 10 milisegundos ' Pausa de 10 milisegundos 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 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 autorepeticin 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

85

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. 86

' Pausa de 10 milisegundos ' Pausa de 10 milisegundos 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:

End Pause 10 GoTo Inicio ' Salta a inicio

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, 87

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. 88

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. 89

Observe en la figura 5.28 la medicin del tiempo entre cada auto-repeticin. Figura 5.28. 90

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. 91

Branch Sintaxis: Branch Variable,[Etiqueta1, Etiqueta2, EtiquetaN] La la ta si instruccin Branch hace un salto a una etiqueta dependiendo del valor de variable, es decir, si la variable es igual a 0, el salto se hace a la etique 1; 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 TRISB = $00 PORTB = $00 * * ' Inicializa el puerto B ' Configura el puerto B como salida ' Declaracin de la variable I I=0 ' Inicializa la variable I

Inicio: Led1: Branch I,[Led1,Led2,Led3] PORTB = %00000001 Pause 1000 PORTB = %00000000 I = I + 1 GoTo inicio ' enciende el led en RB0 ' pause de 1 segundo ' apaga el led ' suma 1 a la variable I ' salta a inicio

Led2: PORTB = %00000010 Pause 1000 PORTB = %00000000 I = I + 1 GoTo inicio ' enciende el led en RB1 ' pause de 1 segundo ' apaga el Led ' suma 1 a la variable I ' salta a inicio 92

Led3: PORTB = %00000100 Pause 1000 PORTB = %00000000 I = 0 ' enciende el led en RB2 ' pause de 1 segundo ' apaga el Led ' Inicializa la variable I GoTo Inicio End ' salta a inicio Observe en el programa que a partir de la etiqueta hace un salto a la etiqueta Led3 . Inicio , la instruccin

variable Idesignado entre los corchetes. Entonces, si II= 1, la instruccin hace un salto a la etiqueta Led2 ; si I= 2, entonces la instruccin = 0, la instruccin hace un salto a la etiqueta Led1 ; si , que se corresponde con la posicin de la etiqueta que hemos Branch hace un salto a la etiqueta especificada segn el valor cargado en la 93

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 Cristal de 4 Mhz Capacitor cermico de 33 pF Resistencia de 10K Ohm Capcitor Electroltico de 10 uF Fuente regulada de 5 Vdc 1 1 2 1 1 1 Tabla 5.10. 94

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 instruccin PWM, podemos aplicar la siguiente frmula: Vfuente * nivel Vout = 255 donde, Vout: voltaje de salida. Vfuente: voltaje de la fuente de alimentacin del circuito. Nivel: constante entre 0 y 255. 95

Por ejemplo, si deseamos obtener Vout = 3.5V, entonces, Vout * 255 3.5V * 255 nivel === 178,5 179 Vfuente 5V se aproxima al valor deseado de 3.5 voltios. voltaje en la salida del circuito de la figura 5.30, podemos comprobar que ste El valor a ser cargado en el campo nivel de la instruccin es 179. Al medir el El programa a ser cargado en el microcontrolador es el siguiente: DEFINE OSC 4 ' Define el oscilador en 4 Mhz Inicio: PWM PORTB.0,179,100 ' Seal PWM GoTo Inicio ' Salto a inicio End 96

Mdulos LCD Capitulo VI 6.1.-Pantallas LCD: Las pantallas LCD alfanumricas, son las ms utilizadas hoy en da en el desarrollo de proyectos o equipos electrnicos en los cuales pantallas se hace necesario visualizar mensajes de texto cortos, que proporcionen la informacin adecuada sobre un evento determinado. Las ms comunes suelen ser de 1x16, de 2x16 y de 4x16 (Filas x Columnas). Todas que estas configuraciones tambin se encuentran para 20 columnas y hasta para 40 columnas. Aunque en esta edicin solo estudiaremos el uso de pantallas alfanumricas, tambin resulta interesante mencionar existen en el mercado pantallas grficas (GLCD), como la que se observa en la figura 6.3, y donde se debe aplicar un mtodo de control diferente al de las pantallas alfanumricas. Figura 6.1. Pantalla LCD 2x16. Figura 6.2. Pantalla LCD 4x16. Figura 6.3. Pantalla GLCD (Graphic Liquid Crystal Display) de 128x64 pixel. 97

6.2.-Identificacin de los pines de una pantalla LCD: Veamos a continuacin la descripcin de cada uno de los pines de una pantalla LCD: Control de contraste. Figura 6.4. Pinout de un mdulo LCD con conexin a Vcc, Gnd y Pin 1, 2 y 3: como se puede observar en la figura 6.4, en la mayora de las pantallas LCD, el Pin No. 1 y 2 corresponden a la alimentacin de la pantalla, GND y Vcc, donde el voltaje mximo comnmente soportado es de 5 Vdc. El Pin No.3 corresponde al control de contraste de la pantalla. Pin 4: "RS" (trabaja paralelamente al Bus de datos del modulo LCD, Pines 7 al 14, es decir, cuando RS es cero, el dato presente en el bus corresponde a un registro de control o instruccin, pero cuando RS es uno, el dato presente en el bus corresponde a un registro de datos o caracter alfanumrico. Pin 5: "R/W" (Read/Write), este pin es utilizado para leer un dato desde la pantalla LCD o para escribir un dato en la pantalla LCD. Si R/W = 0, esta condicin indica que podemos escribir un dato en la pantalla. Si R/W = 1, esta condicin nos permite leer un dato desde la pantalla LCD. Pin 6: "E" (Enable), este es el pin de habilitacin, es decir, si E = 0 el mdulo LCD se encuentra inhabilitado para recibir datos, pero si E = 1, el mdulo LCD se encuentra habilitado para trabajar, de tal manera que podemos escribir o leer desde el modulo LCD. 98

Pin 7 al14: "Bus de Datos , el Pin 7 hasta el Pin 14 representan 8 lneas que se utilizan para colocar el dato que representa una instruccin para el modulo LCD o un carcter alfanumrico. Pin 15-16: "BackLight", en muchos modelos de LCD, los pines 15 y 16 son respectivamente el nodo y el Ctodo , aunque se pueden encontrar en el Jumpers , mercado modelos de pantallas LCD donde esta condicin es configurable desde la parte posterior del circuito impreso a travs de o conexiones donde podemos invertir los Pines, de manera tal que el Pin 15 sea el Ctodo y el Pin 16 el nodo , como se muestra en la figura 6.5. Figura 6.5. en 6.3.-Conexin de una pantalla LCD en Pic Basic: Una pantalla LCD puede ser conectada a un microcontrolador utilizando los ocho bits del bus de datos (D0 a D7) o solamente los cuatro bits mas significativos del bus de datos (D4 a D7). Al emplear los ocho bits, estos debern estar conectados en un solo puerto y nunca puertos diferentes. Si deseamos trabajar solo con los cuatro bits ms significativos del bus, estos debern ser conectados en los cuatro bits menos significativos de un puerto o en los cuatro bits ms significativos del puerto seleccionado. Los pines E (Pin 6) y RS (Pin 4) pueden estar conectados en cualquier puerto del microcontrolador. Por ltimo, el Pin R/W deber estar conectado a tierra (GND) para indicar a la pantalla LCD que estaremos escribiendo, esto debido a que estaremos trabajando inicialmente solo con la instruccin Lcdout . 99

Un dato interesante resulta ser el hecho de que las pantallas LCD pueden ser controladas utilizando dos configuraciones distintas para el bus de datos: La primera configuracin es a 8 bits de datos, lo cual requiere que conectemos todos los pines del bus (D0 hasta D7 en la pantalla LCD), en uno de los puertos disponibles de un microcontrolador PIC. La segunda configuracin posible es a 4 bits de datos, lo cual reduce a la mitad la cantidad de pines a ser utilizados en un puerto de un microcontrolador PIC, pero sta deber ser definida al inicio del programa para garantizar que la pantalla funcione correctamente. Nota Importante: PIC Basic asume por defecto que el conexionado entre un mdulo LCD alfanumrico y un microcontrolador, se ha realizado como se muestra en el diagrama esquemtico de la figura 6.6. En este caso no ser necesario definir estas conexiones en el programa; sin

embargo, es conveniente saber que el funcionamiento de un programa para el manejo de una pantalla LCD, no se ver afectado si decidimos definir cada una de las conexiones como se muestran a continuacin:

DEFINE LCD_DREG PORTA ' Indica que el Bus de datos estar conectado ' en el Puerto A.

DEFINE LCD_BITS 4 ' El bus de datos de la LCD ser de cuatro bits.

DEFINE LCD_DBIT 0 ' Seleccin del Bit de inicio del puerto en el uC para el ' bus de datos de la LCD DEFINE LCD_RSREG PORTA ' Indica al uC que el pin RS estar en el Puerto A DEFINE LCD_RSBIT 4 ' RS estar conectado en RA4 DEFINE LCD_EREG PORTB ' Indica al uC que el pin E estar en el Puerto B DEFINE LCD_EBIT 3 ' E estar conectado en RB3 Compare estas definiciones con el diagrama esquemtico de la figura 6.6, y podr notar que las conexiones entre la pantalla LCD y el microcontrolador PIC coinciden exactamente con cada lnea de programa de la nota anterior.

100

Figura 6.6. Proyecto # 10 Cantidad 1PIC16F84A Cristal de 4 Mhz 1 Capacitor cermico de 33 pF 2 Pantalla LCD 16x4 1 Resistencia de 1K Ohm 1 Potencimetro de 5K Ohm 1 Fuente regulada de 5 Vdc 1 Componente Tabla 6.1. 101

Aunque esta configuracin es la que PicBasic asume por defecto, la misma puede ser cambiada segn convenga, pero siempre tomando en cuenta las definiciones anteriormente mencionadas; en ellas se especifica la disposicin de los pines de la pantalla LCD con respecto a su conexin en los puertos del microcontrolador. LCDout Sintaxis: LCDout comando, dato La instruccin Lcdout enva datos especficos a una pantalla LCD

Alfanumrica para que puedan ser mostrados en la misma. La instruccin Lcdout va acompaada de un comando de control el cual opera segn la tabla 6.2: Comando Accin $FE, 1 $FE, 2 $FE, $0C $FE, $0E Cursor bajo (Underline "_") activo $FE, $0F Cursor intermitente activo $FE, $10 Mueve el cursor un espacio a la izquierda Mueve el cursor un espacio a la derecha Mueve el cursor al inicio de la segunda lnea Mueve el cursor al inicio de la tercera lnea Mueve el cursor al inicio de la cuarta lnea $FE, $D0 $FE, $C0 $FE, $90 $FE, $14 Apaga el Cursor Retorna al inicio de la primera lnea Limpia la pantalla Tabla 6.2. Estos comandos son indispensables para especificar en la pantalla LCD la accin que deseamos tomar. Para el caso especfico de la primera lnea en una pantalla LCD, bastar solo con escribir la instruccin Lcdout , seguida del mensaje o variable que se desea mostrar. 102

En la figura 6.7 se muestran las direcciones de cada caracter en las lneas 2, 3 y4: Pantalla LCD 16x4 Lnea Lnea Lnea Lnea 1 2 3 4

---------------$C0 $C1 $C2 $C3 $C4 $C5 $C6 $C7 $C8 $C9 $CA $CB $CC $CD $CE $CF $90 $91 $92 $93 $94 $95 $96 $97 $98 $99 $9A $9B $9C $9D $9E $9F $D0 $D1 $D2 $D3 $D4 $D5 $D6 $D7 $D8 $D9 $DA $DB $DC $DD $DE $DF Figura 6.7. Entonces, para escribir un mensaje en cada lnea de una pantalla LCD, tenemos que: Lcdout Lcdout Lcdout Lcdout "Mensaje $fe,$C0, $fe,$90, $fe,$D0, Linea 1" "Mensaje Linea 2" "Mensaje Linea 3" "Mensaje Linea 4"

cambiando la direccin en el comando de control de la instruccin. Tambin es posible iniciar un mensaje en otra posicin en las lneas 2, 3 y 4, 6.4.-Proyecto #10. En el siguiente programa se puede ver que no ha sido utilizado ningn tipo de definicin de parmetros de conexin para los pines de control entre la pantalla y el microcontrolador, por lo cual se asume que el conexionado entre ambos dispositivos deber ser igual al planteado en el Realice el montaje y haga modificaciones al programa mostrado a continuacin, con el fin de comprobar la tabla 6.2. diagrama de la figura 6.6. ' Programa en PIC Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. Pause 500 LCDOut $fe, 1 ' Limpia la pantalla LCDOut $fe, 2 ' Posiciona el cursor en el inicio LCDOut "* Pantalla LCD *" 103

LCDOut $fe,$C0, "* Alfanumerica *" LCDOut $fe,$90, "* 1234567890 *" LCDOut $fe,$D0, "* AaBbCcDdEeFf *" Inicio: GoTo Inicio ' Salta a la etiqueta inicio End

Al conectar el circuito de la figura 6.6 y el programa cargado en el microcontrolador, podremos ver como se despliega en la pantalla LCD de cuatro lneas, cada frase preestablecida en el programa, como se muestra en las figuras 6.8 y 6.9. Figura 6.8. Figura 6.9. 104

6.5.-Proyecto #11. En el diagrama de la figura 6.10 se puede observar que la conexin entre el modulo LCD y el microcontrolador ha cambiado con respecto al proyecto #10, con el fin de utilizar en el programa la definicin de conexiones anteriormente mencionada. Para este ejemplo se ha realizado un programa que muestra el valor cargado en una variable a la cual hemos denominado Dato , y la cual incrementada al accionar el pulsador P1 conectado en RB0; el valor de esta podr ser variable tambin podr decrecer al accionar el pulsador P2 conectado en RB1. Los puertos han sido configurados de la siguiente manera: Puerto B: se configura como entrada ya que en los pines RB0 y RB1 estarn conectados los pulsadores P1 y P2. Puerto D: se configura como salida ya que ste ser utilizado para control de la pantalla LCD. La variable Dato ha sido inicializada con un valor cargado igual a lgico. aumentar o disminuir este valor, simplemente se pregunta si en RB0 o hay un cambio de estado Adicionalmente se establecen dos condiciones que se deben cumplir para que la variable pueda aumentar valor o disminuir:

el 25. Para en RB1 su

La primera condicin al pulsar P1 para el incremento es: solo podr ser incrementado el valor cargado en la variable Dato , si sta es menor ( < ) a cincuenta (50). La segunda condicin al pulsar P2 para disminuir el valor cargado en la variable es: solo se podr disminuir el valor cargado en la variable Dato si sta es mayor ( > ) a cero (0). 105

Para mostrar el valor decimal cargado en la variable Dato a travs de la pantalla LCD, se debe utilizar la directiva Dec o el smbolo # antes de la variable, como se muestra a continuacin: Lcdout $fe,$C0,"Dato: ",Dec Dato ' Escribe el mensaje en la lnea 2 ' seguido del valor cargado en la ' variable "Dato" en Decimal. , Lcdout $fe,$C0,"Dato: ",#Dato Figura 6.10. 106

Proyecto # 11 -12 Componente Cantidad PIC16F877A Cristal de 8 Mhz Capacitor cermico de 33 pF Pantalla LCD 16x2 Resistencia de 10K Ohm Potencimetro de 5K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc 1 1 2 1 2 1 2 1 Tabla 6.3. ' Programa en Pic Basic Pro: '**************************************** '* Nombre : Proyecto11.pbp *

'* '* '* '*

Autor : Nombre del Autor * Copyright : Copyright (Ao) * Fecha : Fecha * Versin : 1.0

* '****************************************

DEFINE LCD_DREG PORTD ' Indica que el Bus estar conectado en el Puerto D DEFINE LCD_BITS 4 ' El bus ser de cuatro bits. DEFINE LCD_DBIT 4 ' Seleccin del Bit de inicio del puerto en el uC para el ' bus de datos de la LCD DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estar en el Puerto D DEFINE LCD_RSBIT 2

' "RS" estar conectado en RD2 DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estar en el Puerto D DEFINE LCD_EBIT 3 ' "E" estar conectado en RD3

Define Osc 8 ' Define el Oscilador para un Cristal

' de 8 Mhz. TRISB = $FF ' Configura el puerto B como entrada. TRISD = $00 ' Configura el puerto D como salida. Dato Var Byte ' Declaracin de la Variable "Dato" tipo Byte. Dato = 25 ' Inicializa la Variable Dato = 25. Lcdout $fe, 1 ' Limpia la pantalla Inicio: 107

Lcdout $fe,2 ' Inicio de la primera lnea. Lcdout "P1 Suma P2 Resta" ' Escribe mensaje en la primera lnea. Lcdout $fe,$C0,"Dato: ",Dec Dato," " ' Escribe el mensaje en la 2da lnea ' seguido del valor cargado en la ' variable "Dato" en Decimal. ' La siguiente instruccin pregunta si hay un "1" en RB0 y si la variable ' "Dato" es menor a 50. Si se cumplen estas dos condiciones, hace un salto ' con retorno a la subrutina "Suma".

If PORTB.0 = 1 And Dato < 50 Then Call Suma ' La siguiente instruccin pregunta si hay un "1" en RB1 y si la variable ' "Dato" es mayor a 0. Si se cumplen estas dos condiciones, hace un salto ' con retorno a la subrutina "Resta".

If PORTB.1 = 1 And Dato > 0 Then Call Resta GoTo Inicio ' Salta a la etiqueta "Inicio".

Suma: Dato = Dato + 1 ' Incrementa en una unidad la variable "Dato". Pause 350 ' Realiza una pausa de 350 milisegundos para evitar ' que el incremento de la variable sea muy acelerado ' mientras el pulsador "P1" est presionado. Return ' Retorna una lnea despus del llamado "Call Suma". Resta:

Dato = Dato -1 ' Decrementa en una unidad la variable "Dato". Pause 350 ' Realiza una pausa de 350 milisegundos para evitar' que el decremento de la var iable sea muy acelerado ' mientras el pulsador "P2" est presionado. Return ' Retorna una lnea despus del llamado "Call Resta". End

Note que en la lnea de programa encargada de imprimir el mensaje Dato: adems del valor cargado en la variable, hay un espacio en blanco entre comillas ( ) para imprimir en la pantalla: Lcdout $fe,$C0,"Dato: ",Dec Dato,"" Analice la razn por la cual ha sido considerado este espacio en blanco. 108

" 6.6.-Proyecto #12. En este proyecto nos hemos basado en el diagrama de la figura 6.10 para efectuar la programacin del microcontrolador. La idea principal en este ejemplo, ser mostrar un men inicial en la pantalla LCD, como se muestra a continuacin: "P1: Ver Mensaje1" "P2: Ver Mensaje2"

Figura 6.11.

Al accionar el pulsador P1 , se deber mostrar el siguiente sub-men (figura 6.12), el cual deber permanecer visible durante 5 segundos para luego retornar al men inicial: " Menu #1 "Mensaje #1 aqui!" Figura 6.12. Al accionar el pulsador P2 , se deber mostrar el siguiente sub-men (figura 6.13), el cual tambin deber permanecer visible durante 5 segundos para luego retornar al men inicial: " Menu #2 " "Mensaje #2 aqui!"

Figura 6.13. Lea detenidamente los comentarios de cada lnea del programa. Observe que en esta oportunidad hemos utilizado un alias para cada una de las entradas utilizadas en el puerto B (RB0 se llamar P1, y RB1 se llamar P2). ' Programa en Pic Basic Pro: '**************************************** '* '* '* '* '* Nombre : Proyecto12.pbp * Autor : Nombre del Autor * Copyright : Copyright (Ao) * Fecha : Fecha * Versin : 1.0 *

'****************************************

109

DEFINE LCD_DREG PORTD ' Indica que el Bus estar conectado en el Puerto D DEFINE LCD_BITS 4 ' El bus ser de cuatro bits. DEFINE LCD_DBIT 4 ' Seleccin del Bit de inicio del puerto en el uC para el ' bus de datos de la LCD DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estar en el Puerto D DEFINE LCD_RSBIT 2 ' "RS" estar conectado en RD2 DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estar en el Puerto D DEFINE LCD_EBIT 3 ' "E" estar conectado en RD3 Symbol P1 = PORTB.0 ' Alias para RB0 Symbol P2 = PORTB.1 ' Alias para RB1 Define Osc 8 ' Define el Oscilador para un Cristal ' de 8 Mhz. TRISB = $FF ' Configura el puerto B como entrada. TrisD = $00 ' Configura el puerto D como salida. LCDOut $fe, 1 ' Limpia la pantalla Inicio: LCDOut $fe, 2 ' Posiciona el cursor en el inicio LCDOut "P1: Ver Mensaje1" LCDOut $fe,$C0, "P2: Ver Mensaje2"

If P1 = 1 Then Call Mensaje1 ' Pregunta si RB0 = 1If P2 = 1 Then Call Mensaje2 ' Pregunta si RB1 = 1 GoTo Inicio

Mensaje1: LCDOut $fe, 2 Menu #1' Posiciona el cursor en el inicio LCDOut " " LCDOut $fe,$C0, "Mensaje #1 aqui!" Pause 5000 ' Pausa de 5 segundos. Return ' Retorna una lnea despus del llamado "Call" Mensaje2:

LCDOut $fe, 2 ' Posiciona el cursor en el inicio LCDOut

" Menu #2 " LCDOut $fe,$C0, Return "Mensaje #2 aqui!" Pause 5000 ' Pausa de 5 segundos. ' Retorna una lnea despus del llamado "Call" End 110

6.7.-Proyecto #13. En el siguiente ejemplo explicamos la forma de visualizar en la pantalla LCD un valor decimal y sus equivalentes en hexadecimal, binario y el cdigo ASCII correspondiente, de un dato almacenado en una variable tipo Byte. Para lograr este objetivo, hemos declarado en el programa la variable Dato , en la cual cargaremos un valor igual a 64, como ejemplo inicial. Ya es conocido por un ejemplo anterior a ste, que si deseamos mostrar el contenido de la variable en decimal, debemos anteponer la directiva Dec o el smbolo # a sta, como se puede ver a continuacin: LCDOut "Decimal: ", Dec Dato LCDOut "Decimal: ", #Dato

El equivalente en Hexadecimal para este valor (64) es 40 , y el equivalente en binario para este mismo valor es 1000000 . Entonces, para mostrar estos valores en la pantalla LCD en su formato correspondiente, debemos utilizar las siguientes directivas: Hexadecimal: LCDOut "Hexadecimal: ",Hex Dato Binario: LCDOut "Binario: ",Bin Dato

El cdigo ASCII equivalente a este valor ( 64 ), corresponde al smbolo se muestra de la siguiente forma: LCDOut "Cdigo ASCII: ", Dato

@ , y

Realice el montaje de la figura 6.14, y analice el programa que se muestra a continuacin: 111

Figura 6.14. Figura 6.14. Proyecto # 13 -14 Componente Cantidad PIC16F877A Cristal de 8 Mhz Capacitor cermico de 33 pF Pantalla LCD 16x2 Potencimetro de 5K Ohm Fuente regulada de 5 Vdc 1 1 2 1 1 1 Tabla 6.4. 112

' Programa en Pic Basic Pro: '**************************************** '* Nombre : Proyecto13.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Ao) * '* Fecha : Fecha * '* Versin : 1.0 * '****************************************

DEFINE LCD_DREG PORTD ' Indica que el Bus estar conectado en el Puerto D DEFINE LCD_BITS 4 ' El bus ser de cuatro bits. DEFINE LCD_DBIT 4 ' Seleccin del Bit de inicio del puerto en el uC para el

' bus de datos de la LCD DEFINE DEFINE DEFINE DEFINE LCD_RSREG PORTD LCD_RSBIT 2 LCD_EREG PORTD LCD_EBIT 3 ' "E" estar conectado en RD3

' "RS" estar conectado en RD2 ' Indica al uC que el pin "E" estar en el Puerto D ' Indica al uC que el pin "RS" estar en el Puerto D Define Osc 8 ' Define el Oscilador para un Cristal ' de 8 Mhz. TrisD = $00 Dato Var Byte Dato = 64 ' Carga la variable "Dato" con el Valor 64. ' Configura el puerto D como salida. LCDOut $fe, 1 ' Limpia la pantalla. Inicio:

LCDOuT $fe, 2 LCDOut " LCDOut $fe,$C0, "Hexadecimal: ",HEX Dato," " ,Dec Dato,""Decimal: " ' Posiciona el cursor en el inicio. Pause 4000 ' Hace una pausa de 4 segundos. LCDOuT $fe, 2 LCDOut

' Posiciona el cursor en el inicio. "Binario:",BIN Dato LCDOut $fe,$C0, "Codigo ASCII: ", Dato," " Pause 4000 ' Hace una pausa de 4 segundos. GoTo Inicio ' Salta a la etiqueta "Inicio". End 113

6.8.-Proyecto #14: Analice el programa propuesto a continuacin, el cual est basado en el diagrama esquemtico de la figura 6.14. En este caso se desea mostrar en la pantalla LCD los valores entre 33 y 125 en decimal, adems de sus equivalentes en hexadecimal y cdigo ASCII correspondiente. ' Programa en Pic Basic Pro:

'****************************************

'* '* '* '* '*

Nombre : Proyecto14.pbp * Autor : Nombre del Autor * Copyright : Copyright (Ao) * Fecha : Fecha * Versin : 1.0 *

'****************************************

DEFINE LCD_DREG PORTD ' Indica que el Bus estar conectado en el Puerto DDEFINE LC D_BITS 4 ' El bus ser de cuatro bits. DEFINE LCD_DBIT 4 ' Seleccin del Bit de inicio del puerto en el uC para el ' bus de datos de la LCD DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estar en el Puerto D DEFINE LCD_RSBIT 2 ' "RS" estar conectado en RD2 DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estar en el Puerto D DEFINE LCD_EBIT 3 ' "E" estar conectado en RD3 Define Osc 8 ' Define el Oscilador para un Cristal ' de 8 Mhz. TrisD = $00 ' Configura el puerto D como salida. ' Declaracin de la variable "I" topo Byte. ' Limpia la pantalla. Var Byte LCDOut $fe, 1 Inicio: ' ' ' ' A continuacin se carga la variable "I" con un valor inicial igual a 33, el cual se ir incrementando hasta llegar a 125. Por cada incremento se muestran los valores equivalentes en hexadecimal y su respectivo cdigo ASCII en la pantalla LCD.

For I = 33 To 125

Lcdout $fe,2 Lcdout "Dec:",#I," Hex:",HEX I," " Lcdout $fe,$C0,"ASCII: ", I," " Pause 1000 ' Realiza una pausa de 1 segundo. Next I Fin: GoTo Fin ' Bucle infinito. End 114

6.9.-Proyecto #15: Con la ayuda de la instruccin Count , estaremos realizando un contador de pulsos, el cual se compone bsicamente de un PIC16F877A y una pantalla LCD 2x16. El tren de pulsos cuadrados de frecuencia variable, ser generado desde un microcontrolador PIC16F84A utilizando la instruccin Pulsout , y el cual deber ser programado para que utilizando la instruccin Pulsout , y el cual deber ser programado para que sea posible aumentar o disminuir la frecuencia a travs de dos pulsadores conectados a l, P1 para aumentar la frecuencia y P2 para disminuir la frecuencia, como se muestra en el diagrama de la figura 6.15. Figura 6.15. 115

Proyecto # 15 -16 Componente Cantidad PIC16F877A 1 PIC16F84A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 pF 2 Pantalla LCD 16x4 1 Resistencia de 10K Ohm 2 Potencimetro de 5K Ohm 1 Pulsador Normalmente Abierto Fuente regulada de 5 Vdc Tabla 6.5. 1 2 En el circuito de la figura 6.15 se observar puede un microcontrolador PIC16F877A, en el cual cargaremos el programa encargado de realizar el conteo de pulsos enviados desde un microcontrolador PIC16F84A, el cual tambin dispone de su propia programacin para poder generar un tren de pulsos variables. El tren de pulsos de frecuencia variable desde los pulsadores P1 y P2, sale desde el pin RB1 del PIC16F84A hacia el pin RB1 del PIC16F877A, el cual a su vez realiza el conteo de pulsos, durante un tiempo definido, que en este caso ha sido de 1000 milisegundos. Seguidamente el constantemente resultado del conteo de pulsos en este perodo de tiempo es almacenado en una variable la cual hemos denominado Pulsos , para luego ser mostrado en la pantalla LCD. Veamos a continuacin la sintaxis de la nueva instruccin y seguidamente los programas propuestos para este ejemplo. 116

Count Sintaxis: Count pin, duracin, variable Con esta instruccin se puede medir la frecuencia de una seal simple, contando el nmero de pulsos durante un tiempo determinado, definido en el campo duracin de la instruccin. Se pueden medir frecuencias de hasta 25 khz con un oscilador de 4 MHz. Para un oscilador de 20 MHz la frecuencia mxima a ser medida ser de 125 khz. Pin: especifica el pin del puerto en el cual se introducirn los pulsos. Este pin Count. Duracin: es el tiempo en milisegundos, durante el cual se realizar el conteo es designado como entrada automticamente por la instruccin de pulsos sobre el pin especificado. Variable: es una variable definida por el programador en la cual se grabar el resultado del conteo. Programa para el contador de pulsos (PIC16F877A): DEFINE LCD_DREG PORTD ' Indica que el Bus estar conectado en el Puerto D DEFINE LCD_BITS 4 ' El bus ser de cuatro bits. DEFINE LCD_DBIT 4 ' Seleccin del Bit de inicio del puerto en el uC para el

' bus de datos de la LCD DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estar en el Puerto D DEFINE LCD_RSBIT 2

' "RS" estar conectado en RD2 DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estar en el Puerto D DEFINE LCD_EBIT 3 ' "E" estar conectado en RD3 Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz.

Pulsos Var Word ' declaracin de la variable "Pulsos" tipo Word Lcdout $fe, 1 ' Limpia la pantalla Inicio: Count PORTB.1, 1000, Pulsos ' Cuenta los pulsos introducidos a travs ' del pin RB1, durante 1000 milisegundos y el ' resultado del conteo es almacenado en la 117

' variable "Pulsos". Lcdout $fe,2 ' Inicio de la primera lnea. Lcdout "Frecuencia " ' Escribe mensaje en la primera lnea. LcdOut $FE,$C0,"Medida = ",#Pulsos," Hz " ' Escribe dato en pantalla. GoTo Inicio ' Salta a la etiqueta "Inicio" End

Anlisis del programa:

Para empezar, se han definido los pines de control y bus de datos de la pantalla LCD, al igual que la frecuencia del oscilador externo. Seguidamente se define la variable Pulsos , en la cual se cargar el resultado del conteo de los pulsos introducidos a travs del pin RB1. Se limpia la pantalla LCD. La instruccin Count , cuenta los pulsos introducidos por el pin RB1, y el resultado es almacenado en la variable Pulsos . Por ltimo se muestra el valor cargado en la variable Pulsos , en la pantalla LCD y se retorna a la etiqueta Inicio . Programa para el generador de pulsos (PIC16F84A): Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz.

' Configuracin del puerto B ' Declaracin de la variable "Base" tipo Word ' Inicializa la Salida RB0 Base = 100 ' Inicializa la variable Base = 100 Espera = 1 Inicio: If PORTB.0 = 1 Then Call Suma ' Si RB0 = 1 llama a la subrutina "Suma" 118 TRISB Word Word PORTB.1 = 0 Espera VAR Base Var = %11111101

propuesto. configuracin el configuracin el If PORTB.2 = 1 Then Call Resta ' Si RB2 = 1 llama a la subrutina "Resta" PulsOut PORTB.1,Base ' Genera un pulso de duracin definida por la variable ' "Base". pause Espera ' Pausa de "Base/100" milisegundos GoTo Inicio ' Salta a inicio Suma:

Pause 300 ' Pausa de 300 milisegundos Base = Base + 100 ' Incrementa la variable "Base" If Base = 10100 Then Base = 10000 ' Establece un lmite mximo al valor cargado ' en la variable "Base". Espera = Base / 100 ' Divide el valor cargado en la variable ' "Base" entre 100 y lo carga en la variable ' "Espera", para que la pausa que se genera ' despus de cada pulso sea igual al tiempo ' del pulso. Return ' Retorna una lnea despus del llamado "Call" Resta: Pause 300 Base = Base -100 ' decrementa la variable "Base" ' Pausa de 300 milisegundosIf Base = 0 Then Base = 100 ' Establece un lmite mximo al valor cargado ' en la variable "Base". Espera = Base / 100 ' Divide el valor cargado en la variable ' "Base" entre 100 y lo carga en la variable ' "Espera", para que la pausa que se genera ' despus de cada pulso sea igual al tiempo ' del pulso. Return

' Retorna una lnea despus del llamado "Call"

End

Anlisis del programa: En programa se puede observar que se han dado los pasos necesarios en lo que respecta a la definicin del tipo de oscilador y la del puerto que estamos utilizando en el diseo

Seguidamente, ha sido declarada la variable Base y la variable Espera , las cuales sern necesarias para almacenar la base de tiempo de los pulsos generados por la instruccin Pulsout, adems de la pausa generada entre cada pulso. 119

ltimo, el y el resultado es cargado en la variable Por

Espera .

Inicializamos la variable Base con un valor igual a 100 y la variable Espera con un valor igual a 1. A partir de la etiqueta Inicio , el primer paso de la subrutina ha sido preguntar si los pulsadores P1 y P2 han sido activados. Si el pulsador P1 es activado, el programa hace un salto con retorno a la subrutina Suma , incrementando el valor de la variable Base en 100 unidades. Si el pulsador P2 es activado, el programa hace un salto con retorno a la subrutina Resta , haciendo decrecer en 100 unidades el valor cargado en la variable Base . En estas dos subrutinas (Suma y Resta), se establecen lmites para la variable Base , de manera tal que si la suma llega a ser igual a 10100, la variable Base mantiene su valor igual a 10000. En el caso especfico de la resta, si el valor de la variable Base llega a ser igual a 0, entonces la variable mantiene siempre su valor igual a 100. Seguidamente se carga la variable Espera , tanto en la subrutina Suma como en la subrutina Resta , valor que ser utilizado para realizar la pausa entre pulsos. La instruccin Pulsout, genera un pulso en el pin RB1, con una duracin definida por el valor cargado en la variable Base . Por ejemplo, si Base = 100, entonces el pulso generado ser de 100 decenas de microsegundos, es decir, 1 milisegundo. Recuerde que la instruccin Pulsout tiene una resolucin de 10 microsegundos para un oscilador de 4 Mhz.

Seguidamente el programa realiza una pausa la cual depende tambin del valor cargado en la variable Espera . Entonces, observe que si la variable Base = 100, la pausa generada es de 1 milisegundo, debido a que se est dividiendo el valor cargado en la variable Base entre 100 programa hace un salto a la etiqueta Inicio para empezar el proceso. 120

El tren de pulsos generado por el microcontrolador PIC16F84A en el pin RB1, se puede observar en la siguiente figura: Figura 6.16. Observe que la frecuencia de la seal generada cuando alimentamos el circuito es de 480 Hz, debido a que el valor cargado en la variable Base es igual a 100, y el valor cargado en la variable Espera es igual a 1. Compare el valor de la frecuencia medido en el osciloscopio, con el valor obtenido por la instruccin Count , en el programa cargado en el microcontrolador PIC16F877A. En este caso, el valor mostrado en la pantalla LCD, debe ser igual a 480 pulsos por segundo. las pruebas necesarias con la ayuda de un osciloscopio, para visualizar la seal generada cada vez que aumenta o disminuye el valor de la variable Base , a travs de los pulsadores P1 y P2 respectivamente. Compare el valor de la frecuencia medido en el osciloscopio, con el valor obtenido en el conteo de pulsos por cada segundo transcurrido a travs de la instruccin Count . Realice 121

6.10.-Proyecto #16: El siguiente proyecto est basado en el montaje de la figura 6.15. En esta oportunidad estudiaremos el funcionamiento de la instruccin Pulsin , con la cual mediremos la duracin de los pulsos generados por el microcontrolador PIC16F84A, programado en el proyecto #15. PULSIN Sintaxis: PULSIN pin, nivel, variable La instruccin PULSIN almacenado en una variable definida de 8 bits (byte) o 16 bits (Word). de 2 microsegundos para un oscilador de 20 Mhz, y el valor obtenido es resolucin de 10 microsegundos para un oscilador de 4 Mhz, o una resolucin mide la duracin de un pulso alto o bajo con una PinNivel: define si la medicin se hace en nivel alto o bajo. (1 = alto, 0 = bajo) . : especifica el pin del puerto en el cual se introducir el pulso a ser medido. Variable: es una variable de 8 bits (variable tipo byte) o 16 bits (variable tip o word) definida por el programador en la cual se grabar el resultado de la Analice el siguiente programa: lectura. DEFINE LCD_DREG PORTD ' Indica que el Bus estar conectado en el Puerto D DEFINE LCD_BITS 4

' El bus ser de cuatro bits. DEFINE LCD_DBIT 4 ' Seleccin del Bit de inicio del puerto en el uC para el DEFINE LCD_RSREG PORTD ' bus de datos de la LCD ' Indica al uC que el pin "RS" estar en el Puerto D DEFINE LCD_RSBIT 2 ' "RS" estar conectado en RD2 PORTD ' Indica al uC que el pin "E" estar en el Puerto D DEFINE LCD_EBIT DEFINE LCD_EREG 3 ' "E" estar conectado en RD3

Define OSC 4 ' Define el oscilador en 4 Mhz LECTURA VAR Word ' Definicin de variable de 16 bits Pause 200 ' Pausa de 200 milisegundos LCDOut $fe, 1 ' Limpia la pantalla 122

Inicio: LECTURA = 0 ' Inicializa la variable "Lectura". PulsIn PORTB.1,1,LECTURA ' Mide la duracin de un pulso. LCDOut $fe, 2 ' Posiciona el cursor en el inicio. LCDOut "Lectura: ",#LECTURA," " ' Muestra mensaje y dato por pantalla.

Lcdout $fe,$C0,"decenas de uS. " ' Muestra el mensaje de la segunda lnea. Pause 1000 ' Pausa de 1 segundo GoTo Inicio ' Salta a inicio

End

Al compilar y grabar el programa en diagrama de la figura 6.15, podremos observar en la pantalla LCD el resultado de la lectura generada por la instruccin Pulsin , la cual mide el tiempo de cada pulso que ingresa a travs del pin RB1, en decenas de microsegundos. Entonces, su generamos un pulso cuya duracin es igual a 1 milisegundo, el valor cargado en la variable Lectura ser igual o aproximado a 100. el microcontrolador PIC16F877A del 123

6.11.-Proyecto #17: Realice el montaje para el circuito la figura 6.17, con el cual estudiaremos la instruccin POT a travs de un ejemplo de programacin, con el cual se pretende tomar lectura de un elemento resistivo, el cual en este caso ser un potencimetro de 10Kohm. Figura 6.17. 124

Proyecto # 17 Componente Cantidad PIC16F877A Cristal de 4 Mhz Capacitor cermico de 33 pF Pantalla LCD 16x2 Potencimetro de 5K Ohm Potencimetro de 10K Ohm Capacitor cermico de 0,1 uF Fuente regulada de 5 Vdc 1 1 2 1 1 1 1 1 Escala: Es una variable o constante que aumenta o disminuye el rango de lectura en un porcentaje determinado. Esta escala es utilizada para ajustar el rango de salida en la lectura del dispositivo, y es afectada directamente por las constantes RC. El valor de la escala ser correcto cuando el valor cargado Tabla 6.6. POT Sintaxis: POT La instruccin POT otro dispositivo capaz de su valor resistivo. Bsicamente esta segn el valor resistivo presente en la resistencia variable. Pin: especifica el pin del puerto en el cual se va a conectar el potencimetro. instruccin calcula el tiempo de descarga del condensador C1 el cual vara variar lee un potencimetro, foto celda, termistor, o cualquier pin, escala, variable en la variable se aproxime a cero, cuando la resistencia medida sea mnima; y tambin cuando el valor de la variable se aproxime a 255, cuando la resistencia medida sea mxima. 125

" " Variable: es una variable en la cual se almacena el resultado obtenido de la lectura del potencimetro o componente resistivo. Analice el siguiente programa, y experimente sobre el valor de C1, y el valor de la escala en la instruccin POT, hasta lograr el rango ms aceptable para una resistencia variable (P1) de 10K. DEFINE LCD_DREG PORTD ' Indica que el Bus estar conectado en el Puerto D DEFINE LCD_BITS 4 ' El bus ser de cuatro bits. DEFINE LCD_DBIT 4 ' Seleccin del Bit de inicio del puerto en el uC para el ' bus de datos de la LCD

DEFINE DEFINE DEFINE DEFINE Define

LCD_RSREG PORTD ' Indica al uC que el pin "RS" estar en el Puerto D LCD_RSBIT 2 ' "RS" estar conectado en RD2 LCD_EREG PORTD ' Indica al uC que el pin "E" estar en el Puerto D LCD_EBIT 3 ' "E" estar conectado en RD3 OSC 4 ' Define el oscilador en 4 Mhz

ESCALA VAR Byte DATO Var Byte Pause 200 ' Pausa de 200 milisegundos

ESCALA = 127 ' Asigna valor a la escalaLCDOut $fe, 1 ' Limpia la pantalla Inicio: Pot PORTB.0,ESCALA,DATO ' Toma lectura del Potencimetro

LCDOut $fe, 2 ' Posiciona el cursor en el inicio LCDOut "Lectura: ",#DATO," ' Muestra dato por pantalla GoTo inicio

' Salto a inicio End

126

6.12.-Memoria CGRAM en la Pantalla LCD. La pantalla LCD posee una memoria llamada CGRAM (Character Generator RAM), destinada para que el usuario pueda almacenar hasta un mximo de 8 caracteres o figuras personalizadas como lo demostraremos a continuacin. Cada carcter es representado como un bloque constituido normalmente por 5 columnas y 8 filas, cada una de 8 bits (1 byte)*, es decir, cada carcter se compone de ocho bytes. C5C4C3C2C1C5C4C3C2C1C5C4C3C2C1C5C4C3C2C1Fila1Fila2Fila3Fila4............. Fila5Fila6Fila7Fila8* Nota: caracter. Las direcciones correspondientes a cada posicin son: En cada posicin de la CGRAM se almacenan los 8 bytes que forman un cada fila), son tomados como ceros. Los 3 bits ms significativos de cada byte (3 bits ms significativos de Figura 6.18. C5C4C3C2C1 Posicin en la CGRAM Byte 0 Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Byte 7 Posicin 0 $40 $41 $42 $43 $44 $45 $46 $47 Posicin 1 $48 $49 $4A $4B $4C $4D $4E $4F Posicin 2 $50 $51 $52 $53 $54 $55 $56 $57 Posicin 3 $58 $59 $5A $5B $5C $5D $5E $5F Posicin 4 $60 $61 $62 $63 $64 $65 $66 $67 Posicin 5 $68 $69 $6A $6B $6C $6D $6E $6F Posicin 6 $70 $71 $72 $73 $74 $75 $76 $77 Posicin 7 $78 $79 $7A $7B $7C $7D $7E $7F Tabla 6.7. 127

Veamos el siguiente ejemplo en el cual almacenaremos el smbolo de un parlante en la posicin 0 de la CGRAM. DatoDatoBytesenlaHEXSmboloBinarioCGRAM$0200000010$40$0600000110$41$1A00011010$42$ 1A00011010$43$1A00011010$44$0600000110$45$0200000010$0000000000$47Tabla 6.8. $46 Note que cada cuadro representa un bit el cual corresponde a un 1 o un 0 segn sea el caso o la figura que deseamos realizar, donde 1 es encendido y 0 es apagado. La instruccin para desplegar este smbolo en la pantalla sera la siguiente: la correspondientes al caracter. sentencia LCDOUT $fe,$40,$02,$06,$1A,$1A,$1A,$06,$02,$00 Observe que hemos especificado la direccin inicial de la posicin cero despus de de comando $fe, seguido de los datos Una vez almacenado los datos correspondientes a la figura en la posicin cero de la memoria CGRAM, LCD. podemos desplegar el smbolo en la pantalla Esto se hace especificando la posicin de la CGRAM que se desea mostrar despus del comando de control, como se muestra a continuacin: LCDOUT $FE,1, 0 ' Limpia la pantalla y luego muestra el smbolo ' almacenado en la posicin 0 de la CGRAM 128

En este caso la figura aparece en la primera lnea de la pantalla LCD. Para mostrar esta misma figura en una posicin diferente de la pantalla, simplemente nos basamos en la tabla de comandos de la instruccin Lcdout (Tabla 6.2) y en la figura 6.7, en la cual podremos encontrar la direccin de la posicin de visualizacin deseada en la pantalla LCD. Por ejemplo; Para visualizar la figura cargada en la posicin cero de la CGRAM en la lnea 2, posicin $C0 de la pantalla LCD, la sintaxis sera la siguiente: LcdOut $fe,$C0, 0

Para visualizar una figura cargada en la posicin cuatro de la CGRAM en la lnea 2, posicin $C7 de la pantalla LCD, la sintaxis sera la siguiente: LcdOut $fe,$C7, 4 lnea 1 de la pantalla LCD sera el siguiente: El programa para visualizar entonces la figura ya creada anteriormente en la ' Programa en PIC Basic Pro LCDOut $fe, 2LCDOut $fe, 1 Pause 500 ' Pausa de 500 milisegundos ' Limpia la pantalla ' Posiciona el cursor en el inicio

LCDOut $fe,$40,$02,$06,$1A,$1A,$1A,$06,$02,$00 ' Cargamos el caracter en la posicin cero: Inicio: ' Muestra el caracter en la pantalla: LCDOut $fe,1, 0 GoTo Inicio ' Salta a la etiqueta Inicio End 129 (Lazo infinito).

6.13.-Proyecto #18. A continuacin realizaremos la simulacin de un control digital de volumen, basados en el diagrama de la figura 6.19. El pulsador P1 ser el encargado de aumentar el nivel de volumen, mientras que el pulsador P2 ser el encargado de disminuir el nivel. Figura 6.19. Proyecto # 18 Componente Cantidad PIC16F877A Cristal de 8 Mhz Capacitor cermico de 33 pF Pantalla LCD 16x2 Resistencia de 10K Ohm Potencimetro de 5K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc 1 1 2 1 2 1 2 1 Tabla 6.9. 130

Las pantallas que veremos representadas en este ejemplo son las mostradas en las figuras 6.20, 6.21, 6.22 y 6.23. Se puede observar en ellas la representacin de un pequeo parlante y cuatro rectngulos, encargados de indicar el nivel de volumen. Figura 6.20. Figura 6.21. Figura 6.22. Figura 6.23. 131

El primer paso en la elaboracin de este ejercicio, es crear las figuras que deseamos mostrar en la pantalla LCD basados en la explicacin dada anteriormente: Figura 1: Dato Dato Bytes en la HEX Smbolo Binario CGRAM

$02

00000010 $40 $06 00000110 $1A 00011010 $41$42 $1A

00011010 $1A 00011010 $4300000000$44 $06

00000110 $45 $02 00000010 $46 $00 $47 Palabra 0: $02, $06, $1A, $1A, $1A, $06, $02, $00

Figura 2: Dato Smbolo Dato Bytes en la HEX

Binario CGRAM $00 00000000 $48 $00 00000000

$49 $00 00000000 $4A

$00

00000000 $4B $00 00000000 $4C

$00 00000000 $4D

$1F

00011111 $4E $1F 00011111 $4F Palabra 1: $00, $00, $00, $00, $00, $00, $1F, $1F 132

Figura 3: Dato Dato Bytes en la HEX Smbolo Binario CGRAM $00

00000000 $50 $00 00000000 $51 $00 00000000 $52 $00 00000000 $53 $1F 00011111 $54 $1F $1F $1F

00011111$550001111100011111$57Palabra2:$00,$00,$00,$00,$1F,$1F,$1F,$1F$56 Figura 4: Dato

Dato Bytes en la HEX

Smbolo Binario CGRAM $00

00000000 $58 $00

00000000 $59

$1F

00011111 $5A $1F 00011111 $5B

$1F

00011111 $5C $1F 00011111 $5D

$1F 00011111 $5E

$1F

00011111 $5F Palabra 3: $00, $00, $1F, $1F, $1F, $1F, $1F, $1F 133

Figura 5: Dato Dato Bytes en la HEX Smbolo Binario CGRAM $1F

00011111 $60 $1F 00011111 $61 $1F 00011111 $62 $1F 00011111 $63 $1F 00011111 $64 $1F 00011111 $1F 00011111 $1F $65$66 00011111

$67 Palabra 4: $1F,

$1F, $1F, $1F, $1F, $1F, $1F, $1F A continuacin analice el siguiente programa, leyendo detenidamente los comentarios: ' Programa en PIC Basic Pro

'* Nombre * '* Autor *: Nombre del Autor '**************************************** : Proyecto18.pbp '* Copyright : Copyright (Ao) * '* Fecha : Fecha

* '* Versin : 1.0 * '**************************************** ' Indica que el Bus estar conectado en el Puerto D ' El bus ser de cuatro bits. ' Seleccin del Bit de inicio del puerto en el uC para el ' bus de datos de la LCD ' Indica al uC que el pin "RS" estar en el Puerto D ' "RS" estar conectado en RD2 DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estar en el Puerto D DEFINE LCD_EBIT 3 ' "E" estar conectado en RD3 Define Osc 8 ' Define el Oscilador para un Cristal ' de 8 Mhz. 134 PORTD 4

4 DEFINE DEFINE DEFINE DEFINE DEFINE

LCD_RSREG PORTD LCD_RSBIT 2 LCD_BITS LCD_DBIT LCD_DREG

Symbol P1 = PORTB.0 ' Alias para RB0. Symbol P2 = PORTB.1 ' Alias para RB1. Volumen Var Byte ' Declaracin de la variable "Volumen" tipo Byte. Volumen = 1 ' Inicializa la variable Volumen con el valor "1". ' A continuacin se cargan las cinco figuras creadas a partir de la ' posicin cero de la memoria CGRAM:

LCDOut LCDOut LCDOut LCDOut LCDOut

$fe, $fe, $fe, $fe, $fe,

$40, $48, $50, $58, $60,

$02, $00, $00, $00, $1F,

$06, $00, $00, $00, $1F,

$1A, $00, $00, $1F, $1F,

$1A, $00, $00, $1F, $1F,

$1A, $00, $1F, $1F, $1F,

$06, $00, $1F, $1F, $1F,

$02, $1F, $1F, $1F, $1F,

$00 $1F $1F $1F $1F

'Figura 'Figura 'Figura 'Figura 'Figura

1. 2. 3. 4. 5.

LCDOut $fe, 1 ' Limpia la pantalla LCDOut " Volumen: " ' Escribe "Volumen:" en la lnea 1 de la pantalla. Inicio: LCDOut $fe, 2 ' Posiciona el cursor en el inicio

LCDOut $fe,$C5, 0 ' Muestra la Figura almacenada en la Posicin 0 ' de la CGRAM.

LCDOut $fe,$C6, 1 ' Muestra la Figura almacenada en la Posicin 1 ' de la CGRAM. ' A continuacin se verifica si alguno de los pulsadores ha sido activado. ' Si P1 es activado y la variable "Volumen" es menor a cinco, llama a la ' subrutina "SubeVol". ' Si P2 es activado y la variable "Volumen" es mayor a cero, llama a la ' subrutina "BajaVol". If P1 = 1 And Volumen < 5 Then Call SubeVol If P2 = 1 And Volumen > 0 Then Call BajaVol GoTo Inicio ' Salta a la etiqueta "Inicio". SubeVol: Volumen = Volumen + 1 ' Suma 1 al contenido de la variable "Volumen".

If Then Call Nivel1 If Then Call Nivel2 Volumen = 3 Volumen = 2 If Volumen = 4 Then Call Nivel3

Return Nivel1: LCDOut $fe,$C7, 2 ' Muestra la Figura almacenada en la Posicin dos (2) ' de la CGRAM. Pause 350 ' Pausa de 350 milisegundos, mientras se suelta P1. Return 135

Nivel2: LCDOut $fe,$C8, 3 ' Muestra la Figura almacenada en la Posicin tres (3) ' de la CGRAM. Pause 350 ' Pausa de 350 milisegundos, mientras se suelta P1. Return Nivel3: LCDOut $fe,$C9, 4 ' Muestra la Figura almacenada en la Posicin cuatro (4) ' de la CGRAM. Pause 350 ' Pausa de 350 milisegundos, mientras se suelta P1.

Return

BajaVol: Volumen = Volumen -1 ' Resta 1 al contenido de la variable "Volumen". If Volumen = 3 Then Call Borra1 If Volumen = 2 Then Call Borra2 If Volumen = 1 Then Call Borra3 Return

Borra1:

LCDOut $fe,$C9," " ' Borra la figura colocando un espacio en blanco en la' posic in $C9 de la pantalla LCD. Pause 350 ' Pausa de 350 milisegundos, mientras se suelta P2. Return

Borra2: LCDOut $fe,$C8," " Pause 350 Return

' Pausa de 350 milisegundos, mientras se suelta P2. ' posicin $C8 de la pantalla LCD. ' Borra la figura colocando un espacio en blanco en la Borra3: LCDOut $fe,$C7," " ' Borra la figura colocando un espacio en blanco en la ' posicin $C7 de la pantalla LCD. Pause 350 ' Pausa de 350 milisegundos, mientras se suelta P2. Return End 136

6.14.-Proyecto #19. Realice el siguiente ejercicio en el cual se podr visualizar un pequeo caballo que corre a lo largo de la pantalla LCD, como se muestra en las figuras 6.25 y 6.26. El programa ha sido diseado en base al diagrama esquemtico de la figura 6.24: Figura 6.24. Proyecto # 19 Componente Cantidad PIC16F877A Cristal de 8 Mhz Capacitor cermico de 33 pF Pantalla LCD 16x4 Potencimetro de 5K Ohm Fuente regulada de 5 Vdc 1 1 2 1 1 1 Tabla 6.10. 137

A continuacin podr ver una secuencia numerada de cada una de las pantallas que debe generar el programa propuesto: Figura 6.25. 138

Figura 6.26. 139

Un paso fundamental es hacer el diseo de cada figura en una matriz cuadriculada de 8 filas por 5 columnas, como se muestra en la figura 6.27. Figura 6.27. Rellenando los adecuados podemos llegar a realizar una gran cuadros cantidad de figuras, las cuales podrn ser almacenadas en la CGRAM de una pantalla LCD o incluso en la memoria de datos del microcontrolador, para luego ser consultadas y almacenadas en la CGRAM. Una vez hecho el diseo de la figura, procedemos a sacar los datos correspondientes a cada posicin en la CGRAM. 140

Los datos a ser almacenados en las ocho posiciones de la CGRAM son los siguientes: Figura 1: Dato Dato Bytes en la HEX Figura A Binario CGRAM $00

00000000 $40 $00 00000000 $41

$10

00010000 $42 $0F 00001111 $43 $0F 00001111

$44 $0D

00001101 $18 00011000 $45$46 $10 00010000 $47

Palabra0:$00,$00,$10,$0F,$0F,$0D,$18,$10 Figura 2: Dato

Dato Bytes en la HEX Figura B

Binario CGRAM

$04

00000100 $48 $0E 00001110 $49 $1F

00011111 $4A

$1C

00011100 $4B $1C 00011100 $4C $1C 00011100 $4D $06 00000110 $4E

$05 00000101 $4F Palabra 1: $04,$0E,$1F,$1C,$1C,$1C,$06,$05

141

Figura 3: Dato Dato Bytes en la HEX Figura C Binario CGRAM $00 00000000 $50 $00 00000000 $51 $10 00010000 $52 $0F 00001111 $53 $0F 00001111 $54

$0D

00001101 $55 $04 00000100 $56 $06 00000110 $57 Palabra 2: $00,$00,$10,$0F,$0F,$0D,$04,$06 Figura 4: Dato

DatoBinario Bytes en la HEX Figura D CGRAM

$04

00000100 $58

$0E

00001110 $59 $1F 00011111 $5A $1C 00011100 $5B $1C 00011100 $5C

$1C

00011100 $5D $08

00001000 $5E

$18

00011000 $5F Palabra 3: $04,$0E,$1F,$1C,$1C,$1C,$08,$18

142

Figura 5: Dato Dato Bytes en la HEX Figura E Binario CGRAM $04 00000100 $60 $0E 00001110 $61 $1F 00011111 $62 $07 00000111 $63 $07 00000111 $64

$07

00000111 $65 $02 00000010 $66 $03 00000011 $67 Palabra 4: $04,$0E,$1F,$07,$07,$07,$02,$03 Figura 6: Dato

DatoBinario Bytes en la HEX Figura F CGRAM

$00

00000000 $68

$00

00000000 $69 $01 00000001 $6A $1E 00011110 $6B $1E 00011110 $6C $16 00010110 $6D

$04 00000100 $6E

$0C

00001100 $6F $00,$00,$01,$1E,$1E,$16,$04,$0CPalabra5: 143

Figura 7: Dato Dato Bytes en la HEX Figura G Binario CGRAM $04 00000100 $70 $0E 00001110 $71 $1F 00011111 $72 $07 00000111 $73 $07 00000111 $74

$07

00000111 $75 $0C 00001100 $76 $14 00010100 $77 Palabra 6: $04,$0E,$1F,$07,$07,$07,$0C,$14 Figura 8: Dato

DatoBinario Bytes en la HEX Figura H CGRAM

$00

00000000 $78

$00

00000000 $79 $01 00000001 $7A $1E 00011110 $7B $1E 00011110 $7C $16 00010110 $7D

$03 00000011 $7E

$01

00000001 $7F Palabra 7: $00,$00,$01,$1E,$1E,$16,$03,$01

144

En esta oportunidad pondremos a correr nuestro caballo en la segunda lnea de la pantalla, y lo ubicaremos de la siguiente manera: La primera mitad de nuestro caballo estar en la direccin $C0 y la otra mitad estar en la direccin $C1, nos referimos respectivamente a las figuras A y B de nuestro diseo. desde la direccin $C4. Cuando la figura D llegue a la direccin $CF, estaremos listos para repetir Pantalla LCD 16x4 todo el proceso de forma inversa con las figuras E , F , G y H . milisegundos y comenzamos el proceso, solo que esta vez ser partiendo y $C3 respectivamente de la pantalla LCD; luego hacemos otra pausa de 300 Para ver el efecto que deseamos, hacemos una pausa de 300 milisegundos, borramos la pantalla y mostramos las figuras C y D en las posiciones $C2 Lnea 1 Lnea 2 Lnea 3 Lnea 4 $80 $C0 $90 $D0 $81 $C1 $91 $D1 $82 $C2 $92 $D2 $83 $C3 $93 $D3 $84 $C4 $94 $D4 $85 $C5 $95 $D5 $86 $C6 $96 $D6 $87 $C7 $97 $D7 $88 $C8 $98 $D8 $89 $C9 $99 $D9 $8A $CA $9A $DA $8B $CB $9B $DB $8C $CC $9C $DC $8D $CD $9D $DD $8E $CE $9E $DE $8F $CF $9F $DF

Figura 6.28. pantalla LCD. 16 columnas y 4 filas. Esta tabla de direcciones resulta muy til al momento de establecer la ubicacin de cada figura en cualquiera de las lneas de la En la figura 6.28 se pueden observar las direcciones en una pantalla LCD de 145

Veamos el programa que hace posible esta representacin: ' Programa en PIC Basic Pro '**************************************** '* Nombre : Proyecto19.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Ao) * '* Fecha : Fecha * '* Versin : 1.0 * '**************************************** DEFINE LCD_DREG PORTD ' Indica que el Bus estar conectado en el Puerto D DEFINE LCD_BITS 4 ' El bus ser de cuatro bits.

DEFINE LCD_DBIT 4 ' Seleccin del Bit de inicio del puerto en el uC para el' bus d e datos de la LCD

DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estar en el Puerto DDEFINE LCD_RSBIT 2 ' "RS" estar conectado en RD2 DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estar en el Puerto D DEFINE LCD_EBIT 3 ' Define el Oscilador para un Cristal ' "E" estar conectado en RD3 ' Programa en PIC Basic Pro Define Osc 8 ' de 8 Mhz. ' Declaracin de Variables POS1 POS2 POS3 POS4 var var var var Byte Byte Byte Byte

' Inicializamos las Variables correspondientes a la posicin de la figura' en la p antalla LCD

POS1 = $C0 ' Ver figura 6.13POS2 = $C1 ' POS3 = $C2 ' POS4 = $C3 Pause 500 ' Tiempo de inicializacin de la Pantalla LCD

' ' Cargamos las 8 figuras en la CGRAM: LCDOUT LCDOUT LCDOUT LCDOUT LCDOUT LCDOUT LCDOUT LCDOUT inicio: 146 $FE,$40,$00,$00,$10,$0F,$0F,$0D,$18,$10 $FE,$48,$04,$0E,$1F,$1C,$1C,$1C,$06,$05 $FE,$50,$00,$00,$10,$0F,$0F,$0D,$04,$06 $FE,$58,$04,$0E,$1F,$1C,$1C,$1C,$08,$18 $FE,$60,$04,$0E,$1F,$07,$07,$07,$02,$03 $FE,$68,$00,$00,$01,$1E,$1E,$16,$04,$0C $FE,$70,$04,$0E,$1F,$07,$07,$07,$0C,$14 $FE,$78,$00,$00,$01,$1E,$1E,$16,$03,$01 ' ' ' ' ' ' ' ' Palabra Palabra Palabra Palabra Palabra Palabra Palabra Palabra 0 1 2 3 4 5 6 7 de de de de de de de de la la la la la la la la CGRAM CGRAM CGRAM CGRAM CGRAM CGRAM CGRAM CGRAM

LCDOUT $fe, 1 ' Limpia la pantalla LCD LCDOUT $FE,POS1, 0 ' Muestra Palabra 0 LCDOUT $FE,POS2, 1 ' Muestra Palabra 1 Pause 300 LCDOUT $fe, 1 ' Limpia la pantalla LCD LCDOUT $FE,POS3, 2 ' Muestra Palabra 2 LCDOUT $FE,POS4, 3 ' Muestra Palabra 3 Pause 300

en la LCD en la LCD en la LCD en la LCD

' Aumentamos la posicin de cada smbolo en la pantalla para dar el efecto ' de movimiento:

POS1 POS2 POS3 POS4

= = = =

POS1 POS2 POS3 POS4

+ + + +

3 3 3 3

If POS4 > $CF Then RETRO ' Pregunta si llega al tope derecho de la LCD ' si POS4 = $CF salta a la etiqueta "RETRO" GoTo inicio ' Salta a la etiqueta "inicio"

' Antes de retroceder nos aseguramos de que las figuras E,F,G y H tengan una' po sicin inicial en la pantalla LCD:

RETRO: POS1 POS2 POS3 POS4 = = = = $CF $CE $CD $CC

RETROCEDE: LCDOUT $fe, 1 LCDOUT $FE,POS1, 7 LCDOUT $FE,POS2, 6 Pause 300

' Muestra Palabra 6 en la LCD ' Limpia la pantalla LCD ' Muestra Palabra 7 en la LCD LCDOUT $fe, 1

' Limpia la pantalla LCD LCDOUT $FE,POS3, 5

' Muestra Palabra 5 en la LCD LCDOUT $FE,POS4, 4 ' Muestra Palabra 4 en la LCD Pause 300

POS3 = POS3 -3 POS1 = POS1 -3 POS2 = POS2 -3 POS4 = POS4 -3 ' de movimiento en sentido contrario: ' Disminuimos la posicin de cada smbolo en la pantalla para dar el efecto If POS4 < $C0 Then REINICIA ' Pregunta si llega al tope Izquierdo de la LCD GoTo RETROCEDE ' Nos aseguramos de que las figuras A,B,C y D tengan una posicin inicial en la ' pantalla LCD: 147

REINICIA: POS1 POS2 POS3 POS4 = = = = $C0 $C1 $C2 $C3

GoTo inicio ' Se repite el proceso saltando a la etiqueta "inicio" End

148

Teclado Matricial Capitulo VII 7.1.-Teclado Matricial: Para introducir datos de forma manual en un microcontrolador, nada mejor que un teclado matricial para este fin. Los teclados matriciales ms comunes son de 3 columnas por 4 filas, y de 4 columnas por 4 filas, como los mostrados en la figura 7.1: 149 Figura 7.1. Figura 7.2.

El principio de funcionamiento de un teclado matricial es muy sencillo. Bsicamente cuando pulsamos un botn en el teclado, estamos uniendo una fila con una columna. Por ejemplo, al presionar la tecla 1 , estaremos conectando la columna 1 con la fila 1; si pulsamos la tecla 4 , estaremos conectando conectando la columna 3 con la fila 3. matricial 3x4 conectado a los pines del puerto B, los cuales se han distribuido teclado matricial. En el diagrama de la figura 7.3 se puede apreciar un teclado Existen diversas formas de conectar e interpretar el funcionamiento de un columna 1, esta ves con la fila 2; si pulsamos la tecla 9 , entonces estaremos la nuevamente y configurado de la siguiente manera: Puerto B TrisB Teclado 3x4 RB0 0 (Salida) Columna 1 RB1 0 (Salida) Columna 2 RB2 0 (Salida) Columna 3 RB3 1 (Entrada) Fila 1 RB4 1 (Entrada) Fila 2 RB5 1 (Entrada) Fila 3 RB6 1 (Entrada) Fila 4 RB7 1 (Entrada) Sin Conexin Tabla 7.1. Observe en el diagrama esquemtico que los pines RB3, RB4, RB5 y RB6 tienen una resistencia Pull-up , lo cual significa que si leemos cualquiera de estas entradas, asumiendo que ninguna tecla ha sido presionada, entonces siempre habr un uno lgico presente en cada una de ellas. 150

Figura 7.3. Entonces para saber si una tecla a sido presionada, podemos aplicar elhsiguiente anlisis: 1. Enviamos un cero columnas 2 y 3. PORTB.0 = 0 0 por la columna 1, y enviamos un 1 por las

' Columna 1 = 0 PORTB.1 = 1 ' Columna 2 = 1 PORTB.2 = 1 ' Columna 3 = 1 2. Leemos las filas 1, 2, 3 y 4 para verificar si alguna de ellas cambi su estado a cero 0 . Si esto sucede, quiere decir que una de las teclas en la columna 1 ha sido presionada, entonces: Si PORTB.3 = 0 La tecla "1" fue presionada. Si PORTB.4 = 0 La tecla "4" fue presionada. Si PORTB.5 = 0 La tecla "7" fue presionada. Si PORTB.6 = 0 La tecla "*" fue presionada. 151

3. Enviamos un cero 0 por la columna 2, y enviamos un columnas 1 y 3. PORTB.0 = 1 ' Columna 1 = 1 PORTB.1 = 0 ' Columna 2 = 0 PORTB.2 = 1 ' Columna 3 = 1

por las

4. Leemos las filas ero 0 . Si esto las teclas en la Si PORTB.3 = 0 La tecla "2" fue Si La Si La PORTB.4 = tecla "5" PORTB.5 = tecla "8"

1, 2, 3 y 4 para verificar si alguna de ellas cami subestado a c sucede, en este caso quiere decir que una de columna 2 ha sido presionada, entonces: presionada.

0 fue presionada. 0 fue presionada.

Si PORTB.6 = 0 La tecla "0" fue presionada. 5. Enviamos un cero 0 por la columna 3, y enviamos un columnas 1 y 2. PORTB.0 = 1 ' Columna 1 = 1 PORTB.1 = 1 ' Columna 2 = 1 PORTB.2 = 0 ' Columna 3 = 0 6. Leemos nuevamente las filas 1, 2, 3 y 4 para verificar si alguna de ellas cambi su estado a cero 0 . Si esto sucede, entonces quiere decir que una de las teclas en la columna 3 ha sido presionada. Si PORTB.3 = 0 La tecla "3" fue presionada. La tecla "6" fue presionada. La tecla "9" fue presionada. La tecla "#" fue presionada. Si PORTB.4 = 0 Si PORTB.5 = 0 Si PORTB.6 = 0 A continuacin veremos el algoritmo capaz de leer el teclado matricial conectado al puerto B, y el cual a su vez genera el digito correspondiente a la tecla presionada en un display de 7 segmentos conectado al puerto D. 152 1 por las

Observe que el display de 7 segmentos es de nodo comn, lo cual significa que para encender un segmento ser necesario enviar un cero 0 a travs del pin que corresponda a ste, en el puerto D. ' Programa en PIC Basic Pro Define Osc 8 ' Define el Oscilador para un Cristal ' de 8 Mhz.

TRISB = %01111000 ' Configura los pines del puerto B. TRISD = %00000000 ' Configura los pines del puerto D. Inicio: Call Teclado ' Llama a la rutina barrido del teclado matricial. Pause 300 ' Hace una pausa de 300 ms. GoTo Inicio ' Salta a la etiqueta Inicio .

Teclado:

PORTB.0 = 0 ' Columna 1 = 0 PORTB.1 = 1 ' Columna 2 = 1 PORTB.2 = 1 ' Columna 3 = 1

If If If If

PORTB.3 PORTB.4 PORTB.5 PORTB.6

= = = =

0 0 0 0

Then Then Then Then

PORTD PORTD PORTD PORTD

= = = =

%11111001 %10011001 %11111000 %10011100

' ' ' '

tecla tecla tecla tecla

"1" "4" "7" "*"

PORTB.0 = 1 ' Columna 1 = 1 PORTB.1 = 0 ' Columna 2 = 0 PORTB.2 = 1 ' Columna 3 = 1

If If If If

PORTB.3 PORTB.4 PORTB.5 PORTB.6

= = = =

0 0 0 0

Then Then Then Then

PORTD PORTD PORTD PORTD

= = = =

%10100100 %10010010 %10000000 %11000000

' ' ' '

tecla tecla tecla tecla

"2" "5" "8" "0"

PORTB.0 = 1 ' Columna 1 = 1 PORTB.1 = 1 ' Columna 2 = 1 PORTB.2 = 0 ' Columna 3 = 0

If PORTB.3 = 0 Then PORTD = %10110000 ' tecla "3" If PORTB.4 = 0 Then PORTD = %10000010 ' tecla "6" If PORTB.5 = 0 Then PORTD = %10011000 ' tecla "9" If PORTB.6 = 0 Then PORTD = %10100011 ' tecla "#" Return

End 153

7.2.-Proyecto #20. En el siguiente proyecto utilizaremos una pantalla LCD 16x2, y un teclado matricial 3x4, conectados segn el diagrama esquemtico de la figura 7.4. El objetivo de este proyecto ser visualizar el valor o smbolo correspondiente a cada una de las teclas. Figura 7.4. Proyecto # 20 -21 -22 -23 Componente Cantidad PIC16F877A Cristal de 4 Mhz Capacitor cermico de 33 pF Pantalla LCD 16x2 Resistencia de 1K Ohm Potencimetro de 5K Ohm Teclado Matricial 3x4 Fuente regulada de 5 Vdc 1 1 2 1 4 1 1 1 Tabla 7.2. 154

Utilizaremos la tcnica de lectura de teclado mostrada anteriormente para la programacin de este proyecto. Realice un anlisis detallado del siguiente programa, y compare el algoritmo de lectura del teclado matricial con el algoritmo comentado anteriormente. ' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. TRISA = %00000000 ' Configuracin del puerto A TRISB = %00000000 ' Configuracin del puerto B TRISD = %01111000 ' Configuracin del puerto D

VAR1 VAR Byte ' Declaramos la Variable VAR1 var1 = 0 ' Inicializamos la variable VAR1 Pause 200 ' Pausa de 200 milisegundos Lcdout $fe, 1 ' Limpia la pantallaLcdout $fe, 2 ' Posiciona el cursor en el inic io Lcdout "* Pantalla LCD *" Lcdout $fe,$C0, "* Teclado Mat. *"

PAUSE 3000 ' Pausa de 3 segundos Inicio:

Call Teclado

Lcdout $fe, 2 ' Posiciona el cursor en el inicio Lcdout "Tecla Pulsada: " Lcdout $fe,$C0, "--> ",#var1," " GoTo Inicio

Teclado:

PORTD.0 = 0 ' Columna 1 = 0 PORTD.1 = 1 ' Columna 2 = 1

PORTD.2 = 1 ' Columna 3 = 1 If If If If PORTD.3 PORTD.4 PORTD.5 PORTD.6 = = = = 0 0 0 0 Then Then Then Then VAR1 VAR1 VAR1 VAR1 = = = = 1 ' tecla "1" 4 ' tecla "4" 7 ' tecla "7" 10 ' tecla "*"

PORTD.0 = 1 ' Columna 1 = 1 PORTD.1 = 0 ' Columna 2 = 0 PORTD.2 = 1 ' Columna 3 = 1 155

If If If If

PORTD.3 PORTD.4 PORTD.5 PORTD.6

= = = =

0 0 0 0

Then Then Then Then

VAR1 VAR1 VAR1 VAR1

= = = =

2 ' tecla "2" 5 ' tecla "5" 8 ' tecla "8" 11 ' tecla "0"

PORTD.0 = 1 ' Columna 1 = 1 PORTD.1 = 1 ' Columna 2 = 1 PORTD.2 = 0 ' Columna 3 = 0 If If If If PORTD.3 PORTD.4 PORTD.5 PORTD.6 = = = = 0 0 0 0 Then Then Then Then VAR1 VAR1 VAR1 VAR1 = = = = 3 ' tecla "3" 6 ' tecla "6" 9 ' tecla "9" 12 ' tecla "#"

Return ' Retorna una lnea despus del llamado "Call" End

156

Memoria de Datos Capitulo VIII

8.1.-La Memoria de Datos: La memoria EEPROM de datos resulta muy esta memoria vara segn el modelo de microcontrolador que escojamos, y no todos cuentan con esta caracterstica. Por ejemplo, el PIC16F84 cuenta con una memoria de datos de 64 bytes y el puede ser verificada directamente en la hoja de caractersticas tcnicas de cada microcontrolador. Sin embargo, haremos un mapa de memoria de datos PIC16F877 cuenta con una memoria de datos de 256 bytes. Esta informacin se pierda al desconectar la energa de nuestros proyectos. La capacidad de importante cuando necesitamos almacenar informacin que no queremos que para estos dos microcontroladores PIC: 0000: 00 01 02 03 04 05 06 0008: 08 09 0A 0B 0C 0D 0E 0010: 10 11 12 13 14 15 16 18 19 1A 1B 1C 1D 1E 1F 0020: 20 21 22 23 24 25 26 28 29 2A 2B 2C 2D 2E 2F 0030: 30 21 32 33 34 35 36 0038: 38 39 3A 3B 3C 3D 3E Memoria de Datos PIC16F84 0028: 0018: Tabla 8.1. 07 0F 17 27 37 3F

Podemos ver claramente en la tabla de memoria de datos, que tenemos 64 bytes que podemos utilizar para almacenar informacin, a partir de la posicin 00 hasta la posicin 3F. 157

continuacin. En un microcontrolador PIC16F877 la capacidad de almacenamiento aumenta considerablemente y lo podemos ver en el siguiente mapa: Memoria de Datos PIC16F877 0000: 0008: 0010: 0018: 0020: 0028: 0030: 0038: 0040: 0048: 0050: 0058: 0060: 0068: 0070: 0078: 0080: 0088: 0090: 0098: 00A0: 00A8: 00B0: 00B8: 00C0: 00C8: 00D0: 00D8: 00E0: 00E8: 00F0: 00F8: 93 7C 7D Tabla 00 08 10 18 20 28 30 38 40 48 50 58 60 68 70 78 80 88 90 98 A0 A8 B0 B8 C0 C8 D0 D8 E0 E8 F0 F8 01 09 11 19 21 29 21 39 41 49 51 59 61 69 71 79 81 89 91 99 A1 A9 B1 B9 C1 C9 D1 D9 E1 E9 F1 F9 02 0A 12 1A 22 2A 32 3A 42 4A 52 5A 62 6A 72 7A 82 8A 92 9A A2 AA B2 BA C2 CA D2 DA E2 EA F2 FA 03 0B 13 1B 23 2B 33 3B 43 4B 53 5B 63 6B 73 7B 83 8B 94 9B A3 AB B3 BB C3 CB D3 DB E3 EB F3 FB 04 0C 14 1C 24 2C 34 3C 44 4C 54 5C 64 6C 74 7E 84 8C 95 9C A4 AC B4 BC C4 CC D4 DC E4 EC F4 FC 05 0D 15 1D 25 2D 35 3D 45 4D 55 5D 65 6D 75 7F 85 8D 96 9D A5 AD B5 BD C5 CD D5 DD E5 ED F5 FD 06 0E 16 1E 26 2E 36 3E 46 4E 56 5E 66 6E 76 86 8E 97 9E A6 AE B6 BE C6 CE D6 DE E6 EE F6 FE 07 0F 17 1F 27 2F 37 3F 47 4F 57 5F 67 6F 77 87 8F 9F A7 AF B7 BF C7 CF D7 DF E7 EF F7 FF

8.2.

Guardar y leer datos resulta muy sencillo al trabajar en PicBasic. Este compilador tiene instrucciones muy especficas las cuales estudiaremos a Si deseamos grabar algunos datos, ser necesario saber la posicin en la cual estarn almacenados para luego poder ser consultados. La instruccin 158

en PicBasic para grabar datos en la memoria de datos EEPROM es la estructura de la sentencia es la siguiente: WRITE direccin, dato

Write

WRITE Sintaxis: WRITE direccin, variable La instruccin WRITE almacena datos en la memoria EEPROM de un microcontrolador en una direccin especfica. Ejemplo: Write $00,1 ' graba el dato o valor 1 en la direccin $00Write $21,155 ' graba el da to o valor 155 en la direccin $21 Write $A0,VAR1 ' graba el dato almacenado en la variable VAR1, ' en la direccin $A0 Si deseamos leer alguno de los datos almacenados, la instruccin en PicBasic para este fin es Read , y la estructura de la sentencia es la siguiente: Read direccin, variable READ Sintaxis: READ direccin, variable La instruccin READ permite leer datos desde la memoria EEPROM de datos de un microcontrolador almacenndolos en una variable previamente definida. 159

Ejemplo: Read $00, VAR1 ' lee el dato de la direccin especificada y lo guarda ' en la variable VAR1 Read $21, VAR2 ' lee el dato de la direccin especificada y lo guarda' en la variable VAR2 Read $A0, VAR3 ' lee el dato de la direccin especificada y lo guarda ' en la variable VAR3

A continuacin realizaremos una serie de ejercicios, en los cuales debern ser aplicados los todos conocimientos adquiridos en los captulos anteriores. La idea principal en cada proyecto ser familiarizarse con el uso de la memoria de datos, almacenando en ella informacin que deber poder ser consultada aunque el circuito sea reiniciado o apagado. Como se puede observar en la figura 8.1, se requiere el uso de un teclado matricial 3x4 para el ingreso de datos y una pantalla LCD, con la cual se podr visualizar toda la informacin a ser consultada. Figura 8.1. 160

8.2.-Proyecto #21. En este proyecto vamos a almacenar datos en la memoria EEPROM, para luego ser consultados y mostrados uno por uno en la pantalla LCD. Basados en el diagrama esquemtico de la figura 8.1, empezamos el programa asegurando que los puertos A, B y D estn configurados de acuerdo a los dispositivos conectados a l: ' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. ' Configuracin de Puertos:

TRISA = %00000000

TRISB = %00000000 TRISD = %01111000 VAR1 VAR Byte ' Declaramos la variable VAR1

Seguidamente generamos una pausa de 200 milisegundos y damos un mensaje de entrada el cual deber permanecer durante 3 segundos: Pause 200 ' Pausa de 200 milisegundos

Lcdout $fe, 1 ' Limpia la pantalla Lcdout $fe, 2 ' Posiciona el cursor en el inicio

Lcdout "Memoria de Datos" Lcdout $fe,$C0, "****************"

Pause 3000

' Pausa de 3 segundos Para almacenar un dato es necesario especificar una direccin en la memoria de datos. En este ejemplo, veamos a almacenar el valor 1 en la posicin de memoria $00; memoria $02:

2 en la posicin de memoria $01 y Write $00,1 ' Escribe el valor Write $01,2 ' Escribe el valor Write $02,3 ' Escribe el valor 161 1 2 3

3 en la posicin de en la posicin $00 en la posicin $01 en la posicin $02

La siguiente subrutina lee el valor almacenado en la direccin $00 y lo muestra en la pantalla LCD, espera tres segundos y lee el segundo valor almacenado en la posicin $01, lo muestra en la pantalla LCD y nuevamente hace una pausa de tres segundos. Por ltimo se lee el valor almacenado en la posicin $02 y lo muestra en la pantalla LCD durante tres segundos, para luego volver a empezar el proceso de lectura. Inicio: Read $00,VAR1

Lcdout $fe, 2 " ' Posiciona el cursor en el inicio Lcdout "Direccin 00: " Lcdout $fe,$C0, "Dato: ",#VAR1," Pause 3000

Read $01,VAR1 Lcdout $fe, 2 " ' Posiciona el cursor en el inicio Lcdout "Direccin 01: Lcdout $fe,$C0, "Dato: ",#VAR1," "

Pause 3000 Read $02,VAR1

Lcdout $fe, 2 ' Posiciona el cursor en el inicio Lcdout "Direccin 02: " Lcdout $fe,$C0, ,#VAR1,""Dato: " " Pause 3000 GoTo inicio End

Para comprobar que estos datos estn en la memoria de datos EEPROM del

microcontrolador, tambin es posible utilizar el programador P16Pro para este fin, desde el cual podemos extraer el contenido completo de la memoria de datos sin problemas, debido a que el software del programador cuenta con una pequea ventana llamada Data Memory , en la cual se pueden ver los datos almacenados como se muestra en la figura 8.2: 162

Figura 8.2. 8.3.-Proyecto #22. En el ejemplo presentado especfica continuacin direccin a se desea almacenar una serie de datos a partir de una en la memoria de programa. Se puede experimentar cambiando las direcciones y datos a ser almacenados. Veamos el siguiente programa, el cual est basado en el diagrama de la figura 8.1: ' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal' de 4 Mhz. ' Configuracin de Puertos:

TRISA = %00000000 TRISB = %00000000 TRISD = %01111000

DIRECCION var DATO var Pause 200 Byte Byte I VAR Byte ' Declaramos la Variable I VAR1 var Byte ' Declaramos la Variable VAR1 ' Declaramos la Variable DIRECCION ' Declaramos la Variable DATO ' Pausa de 200 milisegundos

Lcdout $fe, Lcdout $fe, ' Limpia la ' Posiciona

1 2 pantalla el cursor en el inicio

Lcdout "Memoria de Datos" Lcdout $fe,$C0, "****************"

Pause 3000 ' Pausa de 3 segundos

DIRECCION = $00 ' Asignamos una direccin inicial DATO = 1 ' Primer dato que ser almacenado 163

' Almacenaremos a continuacin 20 datos en 20 direcciones ' consecutivas; los datos a almacenar sern: 1,3,5,7,9,11,13 ' 15,17,19,21,23,25,27,29,31,33,35,37 y 39. For I=1 To 20 ' ejecuta la subrutina 20 veces Write DIRECCION,DATO ' escribe el dato en la direccin especificada DIRECCION = DIRECCION + 1 ' aumenta en una unidad la posicin de la Mem. DATO = DATO + 2 ' aumenta en dos unidades el valor del dato a almacenar. Next I

Inicio: DIRECCION = $00 For I=1 To 20 ' ejecuta la subrutina 20 veces Read DIRECCION,VAR1 ' lee el dato y lo almacena en VAR1

Lcdout $fe, 2 ' Posiciona el cursor en el inicioLcdout "Direccin ",#DIRECCION,": " ' muestra la direccin Lcdout $fe,$C0, "Dato: ",#var1," " ' muestra el dato DIRECCION = DIRECCION + 1 ' aumenta en uno la posicin de la memoria Pause 2000 ' Pausa de 2 segundos para poder visualizar la informacin Next I GoTo Inicio ' inicia el proceso de lectura de la memoria de datos End Si apagamos el circuito y leemos la memoria de datos, podremos observar los valores almacenados en el siguiente mapa de la memoria: Figura 8.3. Se puede ver en la figura 8.3 que estn almacenados 20 valores (el equivalente de cada valor o dato en hexadecimal). 164

8.4.-Proyecto #23. En el siguiente ejemplo vamos a utilizar la rutina para el control de un teclado matricial, ya que con ella podremos insertar valores que sern almacenados en la memoria de datos. Analice el siguiente programa, el cual ha sido desarrollado en base al diagrama de la figura 8.1. ' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. ' Configuracin de Puertos: TRISA = %00000000 TRISB = %00000000 TRISD = %01111000 I VAR Byte ' Declaramos la Variable I VAR1 VAR Byte ' Declaramos la Variable VAR1 DIRECCION VAR Byte DATO VAR Byte ' Declaramos la Variable DATO Pause 200 ' Pausa de 200 milisegundos Lcdout $fe, 1 Lcdout $fe, 2 Lcdout "Memoria de Datos" Lcdout $fe,$C0, "****************" Pause 3000 DIRECCION = $00 Inicio: Lcdout $fe, 1 Lcdout $fe, 2 ' Posiciona el cursor en el inicio Lcdout "Direccion: ",#DIRECCION," " "Dato?: " espera1: Call If Then espera1 ' Si ninguna tecla fue pulsada salta a espera1 If Then espera1 ' Si pulsamos la tecla asterisco salta a espera1 If VAR1 = 11 Then VAR1 = 0 ' Si pulsamos la tecla 0 , entonces VAR1 = 0 If VAR1 = 12 Then espera1 ' Si pulsamos la tecla numeral salta a espera1 VAR1 = 0 VAR1 = 10 Teclado Lcdout $fe,$C0, ' Limpia la pantalla ' Asignamos una direccin inicial ' Pausa de 3 segundos ' Limpia la pantalla ' Posiciona el cursor en el inicio ' Declaramos la Variable DIRECCION Lcdout $fe,$C0, "Dato?: ",#VAR1," " Write DIRECCION,VAR1 ' Escribe el valor en la memoria de datos DIRECCION = DIRECCION + 1 ' Aumentamos la posicin en una unidad Pause 1000 ' Espera 1 segundo para simular un tiempo de grabacin 165

Lcdout $fe,$C0, "Dato Almacenado" Pause 1000 ' Espera 1 segundo para visualizar el mensaje If DIRECCION = $0F Then Aviso ' Revisa si llegamos al lmite asignado por ' el programador en la memoria de datos GoTo inicio Aviso:

Lcdout $fe, 1 ' Limpia la pantalla Lcdout $fe, 2 ' Posiciona el cursor en el inicio Lcdout " Memoria llena! " Lcdout $fe,$C0, "****************"

Parada: GoTo Parada Teclado:

VAR1 = 0 PORTD.0 = 0 ' Columna 1 = 0 PORTD.1 = 1 ' Columna 2 = 1 PORTD.2 = 1 ' Columna 3 = 1

If If If If

PORTD.3 PORTD.4 PORTD.5 PORTD.6

= = = =

0 0 0 0

Then Then Then Then

VAR1 VAR1 VAR1 VAR1

= = = =

1 4 ' tecla "4" 7 ' tecla "7" 10

' tecla "1" ' tecla "*"

PORTD.0 = 1 ' Columna 1 = 1 PORTD.1 = 0 ' Columna 2 = 0 PORTD.2 = 1 ' Columna 3 = 1 If PORTD.3 = 0 Then If PORTD.4 = 0 If PORTD.5 = 0 Then VAR1 = 8 Then VAR1 = 5 VAR1 = 2

' tecla "2" ' tecla "5" ' tecla "8" If PORTD.6 = 0 Then VAR1 = 11 ' tecla "0" PORTD.0 = 1 ' Columna 1 = 1 PORTD.1 = 1 ' Columna 2 = 1 PORTD.2 = 0 ' Columna 3 = 0

If If If If

PORTD.3 PORTD.4 PORTD.5 PORTD.6

= = = =

0 0 0 0

Then Then Then Then

VAR1 VAR1 VAR1 VAR1

= = = =

3 ' tecla "3" 6 ' tecla "6" 9 ' tecla "9" 12 ' tecla "#"

Return ' Retorna una lnea despus del llamado "Call" End 166

uno de los 16 una de de ser mxima capacidad los 16 una de de ser mxima capacidad Una vez compilado y puesto a prueba el programa, los valores podrn ser introducidos a la memoria de datos a travs del teclado matricial, y el lmite de datos a ser grabados ser de 16 registros, ya que hemos fijado como lmite la direccin $0F en la memoria de datos, para luego mostrar un mensaje en la pantalla LCD que nos indicar que hemos llenado cada registros disponibles. Recuerde que un microcontrolador PIC16F877 tiene memoria de datos de 256 bytes, por lo tanto el lmite que hemos fijado en el programa anterior puede ser llevado a su capacidad necesario. 167

8.5.-Proyecto #24: En el siguiente ejemplo hemos desarrollado un sistema de control de acceso, en el cual el usuario deber introducir una contrasea previamente almacenada en la memoria de datos. Si la contrasea es correcta, se genera un mensaje de confirmacin y sonido ( Beep ). Si la contrasea es incorrecta, se genera un mensaje de intermitente ( Beep, Beep, Beep ). error y un sonido se encuentra El dispositivo encargado de generar el sonido (Buzzer), conectado al pin RC0. Figura 8.4. 168

Proyecto # 24 Componente Cantidad PIC16F877A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 pF 2 Pantalla LCD 16x2 1 Resistencia de 1K Ohm 4 Potencimetro de 5K Ohm 1 Teclado Matricial 3x4 1 Transistor 2N3904 Buzzer 5 Vdc Fuente regulada de 5 Vdc 1 1 1 Proyecto # 24 Componente Cantidad PIC16F877A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 pF 2 Pantalla LCD 16x2 1 Resistencia de 1K Ohm 4 Potencimetro de 5K Ohm 1 Teclado Matricial 3x4 1 Transistor 2N3904 Buzzer 5 Vdc Fuente regulada de 5 Vdc 1 1 1 Antes de empezar a programar, es importante tomar en cuenta cuales sern las posiciones en la memoria de datos para guardar la contrasea. Para un sistema de acceso donde la contrasea ser de seis dgitos, y donde cada dgito deber ser almacenado en una posicin especfica, convenientemente podemos tomar las posiciones en el mapa de la memoria de datos a partir de la direccin $10 por ejemplo, hasta la direccin $15 , como se puede apreciar en la siguiente tabla: Tabla 8.3. 169

Memoria de Datos PIC16F877 0000: 0008: 0010: 0018: 0020: 0028: 0030: 0038: 0040: 0048: 0050: 0058: 0060: 0068: 0070: 0078: 0080: 0088: 0090: 0098: 00A0: 00A8: 00B0: 00B8: 00C0: 00C8: 00D0: D9 DA 00E0: 00E8: 00F0: 00F8: 00D8: B3 87 Tabla 00 08 10 18 20 28 30 38 40 48 50 58 60 68 70 78 80 88 90 98 A0 A8 B0 B8 C0 C8 D0 DB E0 E8 F0 F8 D8 01 09 11 19 21 29 21 39 41 49 51 59 61 69 71 79 81 89 91 99 A1 A9 B1 B9 C1 C9 D1 DC E1 E9 F1 F9 02 0A 12 1A 22 2A 32 3A 42 4A 52 5A 62 6A 72 7A 82 8A 92 9A A2 AA B2 BA C2 CA D2 DD E2 EA F2 FA 03 0B 13 1B 23 2B 33 3B 43 4B 53 5B 63 6B 73 7B 83 8B 93 9B A3 AB B4 BB C3 CB D3 DE E3 EB F3 FB 04 0C 14 1C 24 2C 34 3C 44 4C 54 5C 64 6C 74 7C 84 8C 94 9C A4 AC B5 BC C4 CC D4 DF E4 EC F4 FC 05 0D 15 1D 25 2D 35 3D 45 4D 55 5D 65 6D 75 7D 85 8D 95 9D A5 AD B6 BD C5 CD D5 E5 ED F5 FD 06 0E 16 1E 26 2E 36 3E 46 4E 56 5E 66 6E 76 7E 86 8E 96 9E A6 AE B7 BE C6 CE D6 E6 EE F6 FE 07 0F 17 1F 27 2F 37 3F 47 4F 57 5F 67 6F 77 7F 8F 97 9F A7 AF BF C7 CF D7 E7 EF F7 FF

8.4.

Ahora analice detenidamente el siguiente programa tomando en cuenta cada comentario. Notar que la clave que hemos establecido en el programa es una serie de dgitos consecutivos 123456 . Tambin podr notar que seguimos utilizando la misma rutina para el control del teclado matricial. 170

' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. ' Configuracin de Puertos: TRISA = %00000000 TRISB = %00000000 TRISD = %01111000 ' Declaramos las variables:

' Guardamos cada digito de la clave en las posiciones elegidas previamente: X VAR Byte VAR1 VAR Byte DIGITO VAR Byte[7] CLV VAR Byte[7] Write Write Write Write Write Write 10, 11, 12, 13, 14, 15, 1 2 3 4 5 6 ' ' ' ' ' ' Primer dgito de la clave Segundo dgito de la clave Tercer dgito de la clave Cuarto dgito de la clave Quinto dgito de la clave Sexto dgito de la clave

' Iniciamos el sistema con una bienvenida: Inicio: LCDOut $fe, 2 ' Posiciona el cursor en el inicio LCDOut "Cont. de Acceso" LCDOut $fe,$C0, "** Bienvenido **" Pause 2000 ' Hacemos una pausa de 2 segundos Call Beep ' Generamos un sonido Clave:

X=0 ' inicializamos la variable X = 0 Read 10, CLV[1] ' leemos el primer dgito y lo guardamos en CLV[1] Read 11, CLV[2] ' leemos el segundo dgito y lo guardamos en CLV[2] Read 12, CLV[3] ' leemos el tercer dgito y lo guardamos en CLV[3] Read 13, CLV[4] ' leemos el cuarto dgito y lo guardamos en CLV[4] Read 14, CLV[5] ' leemos el quinto dgito y lo guardamos en CLV[5] Read 15, CLV[6] ' leemos el sexto dgito y lo guardamos en CLV[6] LCDOut LCDOut LCDOut LCDOut $fe, 1 ' Limpia la LCD $fe, 2 ' Posiciona el cursor en el inicio "Introduzca su " $fe,$C0, "Clave de Acceso:"

Call Beep ' Generamos un sonido 171

Consulta: Call Teclado ' Consultamos el teclado If VAR1 = 0 Then consulta ' Si no hay una tecla pulsada vuelve a consultar ' Si VAR1 es diferente de cero, significa que pulsamos una tecla, por lo ' tanto generamos un sonido y continuamos Call Beep ' Generamos un sonido ' ' ' ' ' ' Seguidamente lo que hacemos es almacenar en seis variables definidas por el programador los dgitos introducidos desde el teclado matricial para luego ser comparados con los valores almacenados en la memoria de datos.

X=X+1 DIGITO[X] = VAR1 ' teclado matricial ' esperando el siguiente valor a ser ' ingresado desde el teclado ' Si X es diferente de 6 continuamos ' El valor de la tecla pulsada lo ' guardamos en la variable correspondiente If X=6 Then comprobar ' Si X = 6 estamos guardando en DIGITO[6] ' el ltimo valor introducido desde el GoTo consulta ' A partir de la siguiente etiqueta empezamos la comprobacin, ' y el formato es: '

' Si DIGITO[X] es igual a CLV[X] el digito es correcto, ' y salta a la etiqueta paseX , ' si es diferente salta a la subrutina error ; veamos Comprobar:

If DIGITO[1] = CLV[1] Then pase1:GoTo error pase1:

If DIGITO[2] = CLV[2] Then pase2:GoTo error pase2: If DIGITO[3] = CLV[3] Then pase3:GoTo error pase3: If DIGITO[4] = CLV[4] Then pase4:GoTo error pase4: If DIGITO[5] = CLV[5] Then pase5:GoTo error pase5: If DIGITO[6] = CLV[6] Then correcto:GoTo error ' Si los seis dgitos han sido correctos ' se ejecuta la subrutina correspondiente.

172

Correcto: Pause 500 LCDOut $fe, 1 ' Limpia la LCD LCDOut $fe, 2 ' Posiciona el cursor en el inicio LCDOut " ****** " LCDOut $fe,$C0, "Clave Correcta!" Call beep ' Generamos un sonido Pause 3000 ' Pausa para visualizar el mensaje GoTo inicio Error: Pause 500 LCDOut $fe, 1 ' Limpia la LCD LCDOut " ****** " LCDOut $fe,$C0, " ERROR! " Call beep ' Generamos un sonido Call beep ' Generamos un sonido Call beep ' Generamos un sonido Pause 1500

LCDOut $fe, 2 ' Posiciona el cursor en el inicio ' Pausa para visualizar el mensaje GoTo clave ' Salta a clave para nueva oportunidad ' La siguiente subrutina genera un Beep en el Buzzer ' Estado Lgico Alto para RC0 ' Pausa de 100 milisegundos ' Pausa de 100 milisegundos ' conectado en RC0. Beep: High portc.0 Pause 100 Low portc.0 Pause 100 Return ' Estado Lgico Bajo para RC0 ' Retorna una lnea despus del llamado "Call" Teclado: VAR1 = 0 PORTD.0 = 0 ' Columna 1 = 0 PORTD.1 = 1 ' Columna 2 = 1

PORTD.2 = 1 ' Columna 3 = 1 If PORTD.3 = 0 Then VAR1 = 1 ' tecla "1" If PORTD.4 = 0 Then VAR1 = 4 ' tecla "4" If PORTD.5 = 0 Then VAR1 = 7 ' tecla "7" If PORTD.6 = 0 Then VAR1 = 10 ' tecla "*" 173

PORTD.0 = 1 ' Columna 1 = 1 PORTD.1 = 0 ' Columna 2 = 0 PORTD.2 = 1 ' Columna 3 = 1 If If If If PORTD.3 PORTD.4 PORTD.5 PORTD.6 = = = = 0 0 0 0 Then Then Then Then VAR1 VAR1 VAR1 VAR1 = = = = 2 ' tecla "2" 5 ' tecla "5" 8 ' tecla "8" 11 ' tecla "0"

PORTD.0 = 1 ' Columna 1 = 1 PORTD.1 = 1 ' Columna 2 = 1 PORTD.2 = 0 ' Columna 3 = 0 If If If If PORTD.3 PORTD.4 PORTD.5 PORTD.6 = = = = 0 0 0 0 Then Then Then Then VAR1 VAR1 VAR1 VAR1 = = = = 3 6 9 12

Return End

' tecla "3" ' tecla "6" ' tecla "9" ' tecla "#" ' Retorna una lnea despus del llamado "Call" 174

habilitar podremos podremos Interrupciones Capitulo IX 9.1.-Qu son las Interrupciones? Las interrupciones son cambios de trayectorias del flujo de un causadas por agentes externos de mayor prioridad. Cuando esto ocurre, el programa microcontrolador detiene el programa en curso, almacena la direccin en la A continuacin mencionaremos cuatro posibles fuentes de interrupcin en un cual se ha detenido y salta a un vector de interrupcin previamente definido en el programa. 9.2.-Fuentes de Interrupciones: microcontrolador PIC16F84: 1. Activacin de interrupcin por el pin RB0/INT. 2. 3. Cambio de estado de uno de los pines ms significativos del puerto B (RB4-RB7). 4. Finalizacin de la escritura en la EEPROM de datos. Desbordamiento del temporizador TMR0. Estas 9.3.-Registro INTCON: fuentes posibles de interrupcin pueden aumentar en microcontroladores mas avanzados. Para aprender a controlar una de estas fuentes de interrupcin, debemos el estudiar registro de control de interrupciones INTCON , con el cual el inspector de interrupciones, seleccionar el tipo de interrupcin y consultar las banderas de interrupciones. Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 GIE EEIE TOIE INTE RBIE TOIF INTF RBIF Figura 9.1. 175

Este bit debe ponerse a cero por software. Este bit debe ponerse a cero por software. RBIF: (Bandera de interrupcin por puerto B) 1 = cuando las entradas RB7 a RB4 cambian de estado. GIE: 1 = habilita todas las interrupciones. 0 = deshabilita las interrupciones. EEIE: 1 = habilita la interrupcin por escritura de la EEPROM. 0 = deshabilita la interrupcin por escritura de la EEPROM. TOIE: 1 = habilita la interrupcin por temporizador TMR0. 0 = deshabilita la interrupcin por temporizador TMR0. INTE: 1 = habilita la interrupcin por RB0/INT. 0 = deshabilita la interrupcin por RB0/INT. RBIE: 1 = habilita la interrupcin por puerto B (RB4-RB7). 1 = cuando TMR0 pasa de FFh a 00h. TOIF: (Bandera de interrupcin por desborde del TMR0) 0 = deshabilita la interrupcin por puerto B. INTF: (Bandera de interrupcin por RB0/INT) Este bit debe ponerse a cero por software. 1 = cuando ocurre una interrupcin en RB0/INT. 176

9.4.-Activacin de interrupcin a travs del pin RB0/INT: Para activar esta interrupcin, lo primero que debemos tomar en cuenta es la configuracin del bit 4 (INTE) del registro INTCON, el cual deber estar en 1 . Otro paso importante antes de empezar a ejecutar la rutina principal de un programa, ser definir el vector de interrupcin y habilitar el inspector de interrupciones. Estos pasos se pueden ver claramente en el programa propuesto para el proyecto que presentamos a continuacin. 9.5.-Proyecto #25. una una En el siguiente circuito hemos conectado un diodo LED en el pin RA0, el cual deber destellar a frecuencia de 1 Hz. La interrupcin ocurre cuando activamos P1, lo cual produce un salto hacia el vector de interrupcin, en el cual habr rutina encargada de hacer destellar un LED conectado en el pin RA1. Figura 9.2. 177

del programa y del registro INTCON: del programa y del registro INTCON: Proyecto # 25 Componente Cantidad PIC16F84A Cristal de 4 Mhz Capacitor cermico de 33 pF LED Resistencia de 220 Ohm Resistencia de 10K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc 1 1 2 2 2 1 1 1 Tabla 9.1. Figura 9.3. Lea detenidamente los comentarios en cada lnea y analice el funcionamiento ' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. 178

TRISA = %00000000 ' Configura el Puerto A como salida TRISB = %00000000 ' Configura el Puerto B como salida I VAR Byte Symbol LED1 = PORTA.0 Symbol LED2 = PORTA.1 Symbol INTEDG = OPTION_REG.6 ' Bit 6 del registro Option

' El bit 6 (INTEDG) del registro Option define si la interrupcin ser ' activada por flanco positivo o negativo.

On Interrupt GoTo Interrup ' Define el vector de interrupcin.

INTCON = %10010000 ' Activa el inspector de interrupciones y ' habilita la interrupcin RB0/INT. PORTA = $00 ' Inicializa el puerto A.

LED1 = 0 ' Apaga el Led1 LED2 = 0 ' Apaga el Led2

INTEDG = 0 ' Cero (0) para activacin de RB0/INT en flanco descendente' Uno (1) para activacin de RB0/INT en flanco ascendente Inicio: ' Pausa de 1000 ms (1 segundo) ' Enciende el Led1 LED1 = 1 Pause 1000 ' Salta a la etiqueta inicio ' Apaga el Led1 ' Pausa de 1000 ms (1 segundo) LED1 = 0 Pause 1000 GoTo Inicio ' Rutina de interrupcin:

Interrup:

Disable ' Detiene al inspector de interrupciones mientras ' ejecuta las siguientes lneas: For I=1 To 6 LED2 = 1

' Enciende el Led2 Pause 200 ' Pausa de 200 ms

LED2 = 0

' Apaga el Led1 Pause 200 ' Pausa de 200 ms

Next I INTCON = %10010000 ' Habilita las interrupciones (GIE=1) ' Habilita la interrupcin RB0/INT (INTE=1) ' Inicializa la interrupcin (INTF=0)

Enable ' Habilita el inspector de interrupciones. Resume ' GIE = 1 y retorna al punto donde haba quedado ' antes de la interrupcin. End

179

9.6.-Interrupcin TMR0: El registro TMR0 es un contador ascendente de ocho bits, el cual tambin puede ser configurado como temporizador. Este registro produce una interrupcin cuando su conteo pasa de 255 ($FF) a 0 ($00). Cuando esto ocurre, la bandera de interrupcin TOIF en el registro INTCON se activa, es decir, TOIF = 1. La Figura 9.4 representa el funcionamiento del registro TMR0: Figura 9.4. 180

El Bit TOSE del registro OPTION, elige el tipo de flanco activo cuando el contador TMR0 es incrementado a travs del pin RA4/TOCKI, es decir, determina si el incremento se har con el flanco de bajada o con el flanco de subida de la seal aplicada. TOCKI es una seal generada por un circuito externo aplicada al pin RA4/TOCKI. A travs de esta entrada es posible contar el nmero de pulsos que lleguen a ella, y producir una interrupcin por desborde cuando el contador pasa de 255 ($FF) a 0 ($00). Se utiliza cuando deseamos que el registro TMR0 se comporte como contador, y esto es posible configurando el Bit TOCS del registro OPTION (TOCS = 1). FOSC/4 TMR0 es una seal de reloj interna que genera pulsos que tienen una frecuencia conocida y la cual depende del oscilador principal. FOSC/4 se utiliza cuando queremos que el registro se comporte como temporizador, y esto se logra configurando el Bit TOCS del registro OPTION (TOCS = 0). PRESCALER el un divisor programable de frecuencia el cual se configura seleccionando los bits PS2, PS1 y PS0 (bits menos significativos del Registro OPTION). Para programar el PRESCALER, contamos con una tabla que define los valores del Divisor (ver tabla 9.2). PSA asigna el divisor de frecuencias y tambin puede ser programado a travs del bit 3 del registro OPTION. 9.7.-Registro OPTION: Bit 7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 RBPO# INTEDG TOCS TOSE PSA PS2 PS1 PS0 Figura 9.5. RBP0#: 1 = resistencias Pull-Up del puerto B activadas. 0 = resistencias Pull-Up del puerto B desactivadas. 181

INTEDG: (Flanco activo de interrupcin externa) 1 = activacin de la interrupcin con flanco ascendente 0 = activacin de la interrupcin con flanco descendente TOCS: 1 = seal de reloj introducida a travs de RA4/TOCKI 0 = seal de reloj interno FOSC/4 TOSE: 0 = incrementa TMR0 con flanco ascendente de RA4/TOCKI 1 = incrementa TMR0 con flanco descendente de RA4/TOCKI PSA: 1 = asigna el divisor de frecuencia a WDT 0 = asigna el divisor de frecuencia a TMR0 PS2,PS1,PS0:

PS2 PS1 PS0 Divisor de TMR0 Divisor de WDT 0 0 0 1:2 1:1 0 0 1 1:4 1:2 0 1 0 1:8 1:4 0 1 1 1:16 1:8 1 0 0 1:32 1:16 1 0 1 1:64 1:32 1 1 0 1:128 1:64 1 1 1 1:256 1:128 Tabla 9.2. 182

Temporizacin TMR0 = 4 / Fosc x (256 -Valor a cargar en TMR0) x Prescaler 9.8.-Proyecto #26. Para dar un ejemplo de aplicacin del Registro TMR0 como temporizador, crearemos un programa que haga destellar un Led con una frecuencia de 1 Hz. Este proceso se debe cumplir de la siguiente manera: 1. Encender el Led. 2. Esperar un segundo (1000 milisegundos). 3. Apagar el Led. 4. Esperar un segundo (1000 milisegundos). 5. Repetir todo el proceso. En este punto resulta importante saber cuanto es la temporizacin mxima que se puede lograr con TMR0. Para esto, ser necesario aplicar una frmula sencilla: Fosc: Depende del Oscilador que usemos, y en este ejemplo utilizamos un cristal de 4 Mhz, por lo tanto Fosc = 4000000. Valor a cargar en TMR0: es el valor desde el cual se inicia el conteo para caso generar el desborde. En este cargaremos cero, para garantizar que cuente los 256 ciclos completos. Prescaler: segn la tabla 9.2, el valor mximo para el divisor del TMR0 es 256. Entonces; Temporizacin TMR0 = (4 / 4000000) x (256 -0) x (256) Temporizacin TMR0 = 0,065536 Segundos 65,536 milisegundos Obviamente este tiempo no es suficiente para generar el retardo deseado de 1000 milisegundos, por lo cual proponemos entonces calcular el valor a cargar en el registro TMR0, para un tiempo de desborde de 50 milisegundos, el cual repetiremos 20 veces, dando como resultado un retardo de 1000 milisegundos, es decir, 1 segundo. 183

Entonces, aplicando la formula tenemos: Temporizacin TMR0 = (4 / Fosc) x (256 Valor a cargar en TMR0) x Prescaler 50 ms= (4 / 4000000) x (256 Valor a cargar en TMR0) x 256 Despejando la incgnita tenemos que: Valor a cargar en TMR0 = 256 Valor a cargar en TMR0 = 256 Valor a cargar en TMR0 = 61 (50ms / (256 x 0,000001)) 195

El valor a cargar en el registro TMR0 para que se produzca un desborde cada 50 milisegundos es 61. analice detenidamente el programa que se muestra a continuacin: Realice el montaje correspondiente al diagrama esquemtico de la figura 9.6 y Figura 9.6. 184

Proyecto # 26 Componente Cantidad PIC16F84A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 LED 1 Resistencia de 220 Ohm 1 Fuente regulada de 5 Vdc Proyecto # 26 Componente Cantidad PIC16F84A 1 Cristal de 4 Mhz 1 Capacitor cermico de 33 LED 1 Resistencia de 220 Ohm 1 Fuente regulada de 5 Vdc Tabla 9.3.

pF 2 1

pF 2 1

' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. I var Byte ' Declaracin de la variable I tipo Byte. On Interrupt GoTo retardo ' Define el vector de Interrupcin Symbol TOIF = INTCON.2 ' Alias para el bit 2 del registro INTCON. Symbol GIE = INTCON.7

' Alias para el bit 7 del registro INTCON. Symbol LED = PORTA.0 ' Alias para el pin RA0 OPTION_REG = %0000111 ' Configuracin del Registro OPTION INTCON = %10100000 ' Configuracin del Registro INTCON Disable Inicio: High LED

' Enciende el Led Call Retardo ' Llama a la rutina de retardo Low LED

' Apaga el Led Call Retardo ' Llama a la rutina de retardo GoTo Inicio ' Salta a la etiqueta inicio .

Retardo: For I=1 To 20 ' Repetimos la interrupcin 20 veces para ' obtener un retardo de 1 segundo. Call Retardo1 Next I Return

Retardo1: ' Retardo de 50 ms ' TMR0 se desborda cada 50 ms. Para calcular este valor ' Utilizamos la formula: ' Tiempo = 4 x Periodo x Valor a cargar en TMR0 x Valor del Divisor ' El clculo del dato a cargar en TMR0 es: 185

' TMR0 = 256 -(0.050/0.000256) = 60,68 = 61 TMR0 = 61 ' Cargamos el dato en TMR0 Espera:

If TOIF = 1 Then Reseteo ' pregunta si TOIF es igual a 1, es decir, ' pregunta si TMR0 se desbordo. GoTo Espera ' Salta a la etiqueta Espera . Reseteo: TOIF = 0 ' Inicializa la bandera TOIF Return Resume

End

9.9.-Interrupcin por cambio de estado de uno de los pines ms significativos del puerto B (RB4-RB7): Activar la interrupcin por cambio de estado en los pines RB4, RB5, RB6 y RB7 es muy sencillo, y lo podemos hacer a travs del registro INTCON, donde contamos con un bit llamado RBIE, que activa o desactiva este tipo de interrupcin, es decir, podemos configurar este registro de la siguiente manera: Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 GIE EEIE TOIE INTE RBIE TOIF INTF RBIF Figura 9.7. GIE = 1, con este bit en estado lgico 1 , habilitamos las interrupciones. con este bit en estado lgico 1 , habilitamos las interrupciones por RBIE = 1, INTCON = %10001000 cambio de estado en el puerto B. 186

Es importante tomar en cuenta el registro de configuracin del puerto B (TrisB), en el cual debemos configurar los bits ms significativos como entrada. TRISB = %1111XXXX, donde las X representan cualquier estado I/O debido a que estos pines no sern utilizados. 9.10.-Proyecto #27. Para verificar el funcionamiento de estas interrupciones, realice el circuito de la figura 9.8. En esta oportunidad el LED conectado en el pin RA0 destella a una frecuencia de 1 Hz. Cuando se produce una interrupcin en cualquiera de los pines RB4, RB5 RB6 y RB7, el LED conectado en el pin RA1 destella seis veces a una frecuencia de 1 Hz. Figura 9.8. 187

Proyecto # 27 Componente Cantidad PIC16F84A Cristal de 4 Mhz Capacitor cermico de 33 pF LED Resistencia de 220 Ohm Resistencia de 10K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc 1 1 2 2 2 4 4 1 Tabla 9.4. En este circuito las entradas RB4, RB5, RB6 y RB7 estn normalmente en bastar para producir una interrupcin con activar cualquiera de los pulsadores, para poner un 1 en la entrada correspondiente. ' Programa en Pic Basic Pro 0 ;

Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. TRISA = %00000000 ' Configura el puerto A como salida. TRISB = %11110000 ' Configura los 4 bits ms significativos como ' entrada.

I VAR Byte

' Declaracin de la variable "I" tipo Byte ' Alias para el pin RA0 Symbol Symbol LED1 = PORTA.0 LED2 = PORTA.1 ' Alias para el pin RA1 On Interrupt GoTo Interrup ' Define el vector de interrupcin INTCON = %10001000 ' habilita la interrupcin RB4-RB7

Inicio: LED1 = 1 ' Enciende el Led 1 Pause 1000 ' Pausa de 1 segundo LED1 = 0 ' Apaga el Led 1 Pause 1000 ' Pausa de 1 segundo GoTo Inicio ' Salta a la etiqueta "Inicio" 188

Interrup: Disable For I=1 To 6 LED2 = 1 ' Pause 1000 LED2 = 0 ' Pause 1000 Next I Enciende el Led 2 ' Pausa de 1 segundo Apaga el Led 2 ' Pausa de 1 segundo

INTCON = %10001000 ' habilita las interrupciones (GIE=1) ' habilita la interrupcin RB4-RB7 (RBIE=1) ' Inicializa la interrupcin (RBIF=0)

Resume Enable

End

189

Memoria Serial I2C Capitulo X 10.1.-Qu es el bus I2C? de Se puede definir al Bus I2C como un puente de comunicaciones a dos hilos entre los circuitos integrados de un sistema, desarrollado por la empresa Philips y el cual se ha convertido en un estndar mundial para el control de dispositivos como memorias EEPROM, sensores temperatura, convertidores A/D y D/A, entre otros dispositivos. La tasa de transferencia de datos llega a niveles que van desde los 100 Khz directiva deber ser definida al inicio del programa: deseamos utilizar una taza de transferencia inferior a 100 Khz la siguiente para un oscilador de 4 Mhz, hasta 400 khz para un oscilador de 20 Mhz. Si DEFINE I2C_SLOW 1 Tambin es importante mencionar que el bus I2C tiene una capacidad de conexin mxima de carga de 400 pF, que se traduce en aproximadamente 25 dispositivos entre memorias, sensores, convertidores A/D, etc. En el bus I2C es necesario que al menos exista un chip maestro, que en nuestro caso ser un microcontrolador. A l podrn conectarse varios dispositivos I2C esclavos a travs del bus, donde cada uno de ellos se puede comunicar con el dispositivo maestro, transmitiendo informacin de un lado a otro. En el bus I2C tambin puede haber ms de un chip maestro, todos con las mismas prioridades. Cada dispositivo I2C cuenta con una nica direccin de 7 bits, de tal manera que el microcontrolador podr saber exactamente a cual de ellos transferir informacin y a cual de ellos solicitar informacin en cualquier momento. Los cuatro bits ms significativos de esta direccin regularmente siempre estarn fijos y su estado depende del tipo de dispositivo a ser conectado. Por ejemplo, para una memoria EEPROM serial, los cuatro bits mas significativos en la direccin siempre ser 1010. 190

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 1 0 1 0 A2 A1 A0 R/W Figura 10.1. Los Bits 1, 2 y 3 son programables a travs de los pines A0, A1 y A2 (ver figura 10.2), con ellos seleccionamos la direccin de cada memoria EEPROM conectada al Bus: Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 1 0 1 0 A2 A1 A0 R/W Figura 10.2. Bit 0 Figura 10.3. escritura . El Pin WP (Write Protection) debemos conectarlo a tierra (Gnd) si deseamos escribir datos en la memoria. El bit 0 es una bandera que indica el estado actual de la memoria, lectura El Pin SDA (Serial Data) es bi-direccional y es utilizado para transferir direcciones y datos a un dispositivo I2C. El Pin SCL (Serial Clock) se utiliza para sincronizar la transferencia de datos y los dispositivos conectados al bus I2C. Las instrucciones de programa en PicBasic para el control del bus I2C son I2Cread e I2CWrite , con las cuales realizaremos los siguientes proyectos, y 191

en los cuales podremos almacenar datos y extraer datos de una memoria serial 24LC256. 10.2.-Proyecto #28. En el siguiente ejemplo hemos empleado como dispositivo maestro un microcontrolador PIC16F877, el cual tiene conectado una memoria EEPROM 24LC256, adems de una pantalla LCD para visualizar los datos al momento de realizar la lectura de la memoria (figura 10.4). Figura 10.4. 192

Proyecto # 28 -29 Componente Cantidad PIC16F877A Cristal de 4 Mhz Capacitor cermico de 22 pF Pantalla LCD 16x2 Resistencia de 4,7K Ohm Potencimetro de 5K Ohm Memoria EEPROM 24LC256 Fuente regulada de 5 Vdc 1 1 2 1 2 1 1 1 Tabla 10.1. I2CWRITE Sintaxis: I2CWrite La instruccin I2CWrite enviar el dato de control y la direccin en la cual se almacenar el dato cargado en la variable previamente cargada. SDA, SCL, Control, Direccin, [dato], {etiqueta de salto opcional} La primera actividad consiste en escribir un dato en una direccin especfica de la memoria de datos EEPROM conectada al bus I2C. Analice el siguiente programa: Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. Symbol SDA = PORTB.0 ' Alias para RB0 Symbol SCL = PORTB.1 ' Alias para RB1 193

Direc VAR Word ' Declaracin de variable "Direc" Control VAR Byte ' Declaracin de variable "Control" Dato VAR Byte ' Declaracin de variable "Dato" Pause 200 ' Pausa de 200 milisegundos para la LCD LCDOut $fe, 1 ' Limpia la LCD Inicio: Control = $A0 ' Dato de Control Direc = $10 ' Direccin en la memoria externa Dato = $23 ' Dato a ser cargado en la direccin ' especificada ($23 = 35 Decimal) I2Cwrite SDA, SCL, Control, Direc, [dato] ' Escribe la memoria

Pause 10 ' Pausa de 10 milisegundos LCDOUT $fe, 2, "Dato Grabado" ' Muestra mensaje por la LCD Loop: GoTo Loop End

A partir de la etiqueta Inicio , asignamos valores a las variables declaradas. El dato de control, el cual contiene la direccin de la memoria 24LC256 es $A0 ; la direccin en la cual vamos a almacenar un dato en este ejemplo ser $10 ; y por ltimo el dato a ser almacenado ser $23 . Si se pregunta porqu el dato de control es $A0, podr obtener la respuesta verificando la conexin de la memoria en el circuito de la figura 10.4. Observe que los pines A2, A1 y A0, los hemos conectado a tierra. Recuerde que estos tres pines definen la direccin del dispositivo; entonces, debemos tomar en cuenta que para una memoria serial, los cuatro bits ms significativos estn configurados como 1010xxxx ; los tres bits A2, A1 y A0 estn conectados a tierra en este proyecto; y el bit R/W debe estar en 0 para poder escribir un dato en la memoria (ver figura 10.5). Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 (A2) Bit 2 (A1) Bit 1 (A0) Bit 0 (R/W) 1 0 1 0 0 0 0 0 A 0 Figura 10.5. 194

Para enviar el dato a la memoria en la direccin especificada, utilizamos la instruccin I2CWrite de la siguiente manera: I2Cwrite PORTB.0, PORTB.1, $A0, $10, [$23] Note que en el programa utilizamos los alias y las variables: I2Cwrite SDA, SCL, Control, Direc, [dato]

Seguidamente se requiere de una pausa de 10 milisegundos, para asegurar el tiempo necesario para la grabacin del dato en la memoria. Una vez finalizada la pausa, procedemos a mostrar un mensaje en la pantalla LCD, indicando que el dato ya ha sido grabado. I2CREAD Sintaxis: I2Cread recibe ninguna respuesta del dispositivo consultado. variable definida. Al utilizar la etiqueta opcional, el programa saltar si no se La instruccin I2Cread enviar el dato de control y la direccin especfica a un dispositivo conectado a un bus I2C y almacenar el dato obtenido en una SDA, SCL, Control, Direccin, [dato], {etiqueta de salto opcional} Para verificar que este dato en realidad est grabado en la memoria, y en la direccin correcta, veamos el siguiente programa: Define Osc 4 ' Define el Oscilador para un Cristal de 4 Mhz. Symbol SDA = PORTB.0 ' Alias para RB0 Symbol SCL = PORTB.1 ' Alias para RB1 A1 Var Byte ' Declaracin de variable "A1" Direc var Word ' Declaracin de variable "Direc" Control Var Byte ' Declaracin de variable "Control" Pause 200 ' Pause de 200 milisegundos 195

For To 50 I = LCDOut $fe, 1 Inicio: Direc = $10 ' Control = $A0

0 For To 50 I = 0 ' Limpia la LCD Direccin en la memoria externa ' Dato de Control

I2CREAD SDA, SCL, Control, Direc, [A1] ' Lectura de Memoria LCDOUT $fe, 2,"Dato: ",#A1 ' Muestra el dato leido Ciclo: GoTo Ciclo End

10.3.-Proyecto #29: El siguiente programa almacena datos a partir de la direccin cero ($00) de la memoria EEPROM conectada al bus I2C. Se almacenan nmeros que se incrementan de dos en dos, donde el dato inicial es igual a 1. Este proyecto est basado en el diagrama de la figura 10.4. Analice el siguiente programa: ' Programa en Pic Basic Pro Define Osc 4 ' de 4 Mhz. Symbol SDA = PORTB.0 Symbol SCL = PORTB.1 ' Define el Oscilador para un Cristal ' Alias para RB1 ' Alias para RB0 I VAR Byte ' Declaracin de variable "I" A1 VAR Byte ' Declaracin de variable "A1" Direc VAR Word ' Declaracin de variable "Direc" Control VAR Byte ' Declaracin de variable "Control" Dato VAR Byte ' Declaracin de variable "Dato" Pause 200 ' Pausa de 200 milisegundos para la LCD LCDOut $fe, 1 ' Limpia la LCD Direc = $00

' Direccin en la memoria externa

Control = $A0

' Dato de Control Dato = 1 ' Dato inicial a ser grabado

Escribir: ' Repeticin I2Cwrite SDA, SCL, Control, Direc, [dato] ' Escribe la memoria Pause 10 ' Pausa de 10 milisegundos If I = 50 Then leer ' Condicional Direc = Direc + 1 ' Suma 1 a la variable "Direc" Dato = Dato + 2 ' Suma 2 a la variable "Dato" Next I 196

Leer: LCDOUT $fe, 2,"Datos Grabados" ' Muestra mensaje por la LCD Pause 2000 ' Pausa de 2 segundos LCDOut $fe, 2,"Inicia Lectura" ' Muestra mensaje por la LCD Pause 2000 ' Pausa de 2 segundos Direc = $00 ' Inicializa la direccin en la memoria externa For I=0 To 50 ' Repeticin I2CREAD SDA, SCL, Control, Direc, [A1] ' Lectura de memoria LCDOUT $fe, 2,"Dato ",#I,": ",#A1," " ' Muestra el dato leido Pause 1000 ' Pausa de 1 segundo If I = 50 Then final ' Condicional Direc = Direc + 1 ' Suma 1 a la variable "Direc" Next I

Final: GoTo Final ' Salta a la etiqueta "final"

End En caso de requerir mayor capacidad de memoria de datos para nuestros proyectos, podemos utilizar memorias como la 24LC512 o varias de menor o igual capacidad conectadas al bus I2C como se observa en la figura 10.6. Por supuesto, es importante que cuando se tiene mas de una en cuenta que para una de estas memorias, tenemos que especificar la direccin del dispositivo . leer 2 y 3 (A0, A1 y A2 respectivamente). En el programa tambin debemos tomar cada memoria conectada al bus, se debe considerar el conexionado de los Pines 1, resaltar 197

10.4.-Proyecto #30: Veamos el siguiente programa en el cual se almacenan datos en dos memorias conectadas al bus I2C, para luego ser extrados y verificados. Figura 10.6. Proyecto # 30 Componente Cantidad PIC16F877A Cristal de 4 Mhz Capacitor cermico de 22 pF Pantalla LCD 16x2 Resistencia de 4,7K Ohm Potencimetro de 5K Ohm Memoria EEPROM 24LC256 Fuente regulada de 5 Vdc 1 1 2 1 2 1 2 1 Tabla 10.2. 198

Analice el siguente programa, prestando atencin a los comentarios de cada lnea: Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. Symbol SDA = PORTB.0 Symbol SCL = PORTB.1 I VAR Byte A1 VAR Byte Direc VAR Word Control VAR Byte Dato VAR Byte Pause 200 LCDOut $fe, 1 memoria1: ' Pausa de 200 milisegundos para la LCD ' Limpia la LCD

' Alias para RB0 ' Alias para RB1 ' ' ' ' ' Declaracin Declaracin Declaracin Declaracin Declaracin de de de de de variable variable variable variable variable "I" "A1" "Direc" "Control" "Dato"

' Dato de Control' Escribimos en la memoria 1 (Pin A0 = 0; Pin A1 = 0; Pin A2 = 0) ' xxxxAAAx ' xxxx210x Control = %10100000 Direc = $00 ' Direccin en la memoria externa Dato = 1 ' Dato inicial a ser grabado For I=0 To 20 ' Repeticin

I2Cwrite SDA, SCL, Control, Direc, [dato] ' Escribe la memoria Pause 10

' Pausa de 10 milisegundos If I = 20 Then confirma1 ' Condicional Direc = Direc + 1 ' Suma 1 a la variable "Direc" Dato = Dato + 2 ' Suma 2 a la variable "Dato" Next I

confirma1: LCDOUT $fe, 2,"Datos Grabados" ' Muestra mensaje por la LCD LCDOut $fe,$C0,"Memoria 1 " Pause 2000 ' Pausa de 2 segundos ' Escribimos en la memoria 2 (Pin A0 = 1; Pin A1 = 0; Pin A2 = 0) memoria2: ' xxxxAAAx ' xxxx210x Control = %10100010 ' Dato de Control 199

Direc = $00 ' Direccin en la memoria externa Dato = 150 ' Dato inicial a ser grabado For I=0 To 20 ' Repeticin I2Cwrite SDA, SCL, Control, Direc, [dato] ' Escribe la memoria Pause 10 ' Pausa de 10 milisegundos If I = 20 Then confirma2 ' Condicional Direc = Direc + 1 ' Suma 1 a la variable "Direc" Dato = Dato + 5 ' Suma 2 a la variable "Dato" Next I confirma2: LCDOUT $fe, 2,"Datos Grabados" ' Muestra mensaje por la LCD LCDOut $fe,$C0,"Memoria 2 " Pause 2000 ' Iniciamos la lectura en la memoria 1:

lectura1: LCDOut $fe, 2,"Inicia Lectura" LCDOut $fe,$C0,"Memoria 1 " Pause 2000 ' Muestra mensaje por la LCD ' Pausa de 2 segundos ' xxxxAAAx ' xxxx210x Control = %10100000 Direc = $00 ' Direccin en la memoria externa For I=0 To 20 ' Repeticin ' Dato de Control I2CREAD SDA, SCL, Control, Direc, [A1] LCDOUT $fe, 2,"Dato ",#I,": ",#A1," " ' Muestra el dato leido Pause 1000 ' Pausa de 1 segundo If I = 20 Then lectura2 ' Condicional Direc = Direc + 1 ' Suma 1 a la variable "Direc" Next I lectura2:

' Lectura de memoria

LCDOut $fe, 2,"Inicia Lectura" ' Muestra mensaje por la LCD LCDOut $fe,$C0,"Memoria 2 " Pause 2000 ' Pausa de 2 segundos ' xxxxAAAx ' xxxx210x Control = %10100010 ' Dato de Control Direc = $00 ' Direccin en la memoria externa For I=0 To 20 ' Repeticin I2CREAD SDA, SCL, Control, Direc, [A1] ' Lectura de memoria 200

LCDOUT $fe, 2,"Dato ",#I,": ",#A1," " ' Muestra el dato leido Pause 1000 ' Pausa de 1 segundo If I = 20 Then final ' Condicional Direc = Direc + 1 ' Suma 1 a la variable "Direc" Next I final: GoTo final ' Salta a la etiqueta "final" End 201

Conversor A/D en el PIC16F877 Capitulo XI 11.1.-Conversor A/D. Los microcontroladores de las familias PIC16F87x y PIC18Fxxx de los cuales estaremos hablando a continuacin, poseen un convertidor Analgico-Digital que convierte una seal analgica en un nmero de 8 o 10 bits, segn sea la configuracin elegida por el diseador. PIC16F870, En los microcontroladores PIC de 28 pines el caso particular de los microcontroladores de 40 pines como el PIC16F877 o el PIC18F442 por ejemplo, se puede observar poseen 8 canales para de pines de la figura 11.1: Figura 11.1. distribuidas entre el puerto A y el puerto E, como se muestra en el diagrama conversin A/D, identificadas por las siglas AN(n), las cuales se encuentran que encontraremos que solo poseen 5 entradas para la conversin A/D, y en el como 202

En el microcontrolador PIC16F877, cada canal de conversin A/D est conectado a un pin ubicado en el puerto A y en el puerto E . Por ejemplo, el canal AN0 corresponde al pin # 2 del microcontrolador, o expresado de otra manera, al pin RA0 del puerto A. El canal AN1 corresponde al pin # 3; el canal AN2 corresponde al pin # 4 y as sucesivamente; entonces se puede ver claramente que el puerto A cuenta con cinco de los ocho canales del conversor A/D, y los otros tres canales estn ubicados en los pines correspondientes al puerto E del microcontrolador. Un punto importante a considerar al momento de utilizar el convertidor A/D, ser decidir si la conversin se har configurando el conversor a 8 o 10 bits, con lo cual a su vez estaremos definiendo la resolucin en el proceso de conversin. Esto significa que si elegimos la conversin de una seal analgica a solo 8 bits (28 = 256), los valores digitales resultantes de la conversin estarn comprendidos entre 0 y 255 (en binario es de 00000000 hasta 11111111), como se puede observar en la tabla 11.1: REGISTRO BAJO (ADRESL) Decimal 0 1 2 3 4

BIT 0 0 0 0 0 0 0 0 0 0

7 0 0 0 0 0

BIT 0 0 0 0 0 0 0 0 0 0

6 0 0 0 0 1

BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 0 0 0 1 1 0 1 1 0 0

250 251 252 253 254 255

1 1 1 1 1 1

1 1 1 1 1 1

1 1 1 1 1 1

1 1 1 1 1 1

1 1 1 1 1 1

0 0 1 1 1 1

1 1 0 0 1 1

0 1 0 1 0 1

Tabla 11.1. 203

Cuando la conversin se hace a 10 bits, la resolucin aumenta considerablemente en relacin a la de 8 bits, ya que tenemos 210 = 1024 datos de conversin, como se puede observar en la tabla 11.2: REGISTRO ALTO (ADRESH) REGISTRO BAJO (ADRESL) Decimal 0 1 2 3 4 BIT T 2 0 0 0 0 0 0 0 0 0 0 0 7 BIT BIT 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 BIT BIT 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BI 0 0 1 1 0 1 0 1 0

1018 1019 1020 1021 1022 1023 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 Tabla 11.2. Para comprender an mejor este punto, veamos el siguiente ejemplo: Si configuramos el conversor A/D a 8 bits e introducimos una seal cuya amplitud vara entre 0 y 5 voltios, y donde el voltaje de referencia del conversor es 5 voltios, entonces la resolucin que obtendremos en la conversin sera la siguiente: Vi

max Resolucin = 2n 5V Resolucin = 28 204

5V Resolucin = 256 Resolucin = 0.0196 0.02 V Esto significa que la resolucin a 8 bits para el ejemplo planteado es de 20 mV por cada paso que da el conversor A/D entre 0 y 255. Si configuramos el conversor A/D a 10 bits, entonces tenemos que 210 = 1024, y por lo tanto obtenemos una resolucin mayor, lo cual podemos demostrar realizando los clculos correspondientes: Vi max Resolucin = 2n

5V Resolucin = 10 2 5V Resolucin = 1024 Resolucin = 0.00488 0.0049 V Entonces la resolucin a 10 Bits es de 4.9 mV por cada paso que da el conversor A/D entre 0 y 1023. 205

Veamos el diagrama de bloques del conversor A/D (figura 11.2): Figura 11.2. Resulta interesante saber que se puede obtener ms resolucin en trminos de voltios por paso, si utilizamos un voltaje de referencia menor al de la alimentacin del microcontrolador a travs de los pines Ref+ o Ref- segn sea el caso. Por ejemplo, si aplicamos un voltaje de referencia positivo igual a 2.5 voltios en el pin RA3/AN3/Ref+ del puerto A, el cual ha sido previamente configurado para esto, entonces: Vi max Resolucin = 2n 206

2.5V Resolucin = 210 2.5V Resolucin = 1024 Resolucin = 0.00244 0.0025 V La resolucin del conversor A/D sera de 2.5 mV por cada paso entre 0 y 1023. Hay una serie de pasos que debemos tomar en cuenta para llevar a cabo una conversin A/D, basados en el diagrama de bloques de la figura 11.2: Lo primero, ser configurar los canales de entrada que utilizaremos para introducir la seal analgica al conversor A/D y los canales para voltajes de referencia, en el caso de ser necesario. Esto se hace seleccionando la combinacin correspondiente en los bits PCFG3, PCFG2 PCFG1 y PCFG0 del registro de control ADCON1 (figura 11.3). Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 ADFM -------------PCFG3 PCFG2 PCFG1 PCFG0 Figura 11.3. En este punto es muy conveniente detenerse a analizar la tabla 11.3, que define cuales pines del puerto A y E sern entradas al conversor A/D, segn la combinacin elegida. 207

PCFG3 PCFG2 PCFG1 PCFG0 AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 Vref+ Vref0 0 0 0 A A A A A A A A Vdd Vss 0 0 0 1 A A A A Vref+ A A A RA3 Vss 0 0 1 0 D D D A A A A A Vdd Vss 0 0 1 1 D D D A Vref+ A A A RA3 Vss 0 1 0 0 D D D D A D A A Vdd Vss 0 1 0 1 D D D D Vref+ D A A RA3 Vss 0 1 1 x D D D D D D D D Vdd Vss 1 0 0 0 A A A A Vref+ Vref-A A RA3 RA2 1 0 0 1 D D A A A A A A Vdd Vss 1 0 1 0 D D A A Vref+ A A A RA3 Vss 1 0 1 1 D D A A Vref+ Vref-A A RA3 RA2 1 1 0 0 D D D A Vref+ Vref-A A RA3 RA2 1 1 0 1 D D D D Vref+ Vref-A A RA3 RA2 1 1 1 0 D D D D D D D A Vdd Vss 1 1 1 1 D D D D Vref+ Vref-D A RA3 RA2 PCFG3 PCFG2 PCFG1 PCFG0 AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 Vref+ Vref0 0 0 0 A A A A A A A A Vdd Vss 0 0 0 1 A A A A Vref+ A A A RA3 Vss 0 0 1 0 D D D A A A A A Vdd Vss 0 0 1 1 D D D A Vref+ A A A RA3 Vss 0 1 0 0 D D D D A D A A Vdd Vss 0 1 0 1 D D D D Vref+ D A A RA3 Vss 0 1 1 x D D D D D D D D Vdd Vss 1 0 0 0 A A A A Vref+ Vref-A A RA3 RA2 1 0 0 1 D D A A A A A A Vdd Vss 1 0 1 0 D D A A Vref+ A A A RA3 Vss 1 0 1 1 D D A A Vref+ Vref-A A RA3 RA2 1 1 0 0 D D D A Vref+ Vref-A A RA3 RA2 1 1 0 1 D D D D Vref+ Vref-A A RA3 RA2 1 1 1 0 D D D D D D D A Vdd Vss 1 1 1 1 D D D D Vref+ Vref-D A RA3 RA2 Tabla 11.3. Bit 7 Bit 6 Bit 5 Bit 3 Bit 2 Bit 1 Bit 0 Bit 4 y CHS0 (bit 3) del registro ADCON0 (figura 11.4): entradas analgicas se realiza configurando los bits CHS2 (bit 5), CHS1 (bit 4) seal analgica para que pase a la etapa de muestreo. La seleccin de las El segundo paso ser activar el canal en el cual se encuentra presente la ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE -----ADON Figura 11.4. Canal/Pin 0 0 0 = Canal 0 0 0 1 = Canal 1 0 1 0 = Canal 2 0 1 1 = Canal 3 1 0 0 = Canal 4 1 0 1 = Canal 5 1 1 0 = Canal 6 1 1 1 = Canal 7 CHS2 CHS1 CHS0 Tabla 11.4. 208

(AN0)/RA0 (AN1)/RA1 (AN2)/RA2 (AN3)/RA3 (AN4)/RA5 (AN5)/RE0 (AN6)/RE1 (AN7)/RE2

Tambin es posible seleccionar el canal que deseamos utilizar, con la instruccin de programa ADCin, en la cual slo se especifica cual ser el canal de entrada de la seal a ser convertida y la variable en la cual se almacenar el resultado de la conversin. Por ejemplo: ADCin 0, temperatura Significa que el resultado de la conversin de una en la seal presente entrada AN0 ser almacenado en la variable temperatura , la cual ha sido previamente definida en el programa. Aunque la instruccin ADCin se encarga de controlar el registro ADCON0 ahorrando algunas lneas de programa, consideramos conveniente hacer una revisin de los registros de control del conversor A/D. 11.2.-El registro ADCON0: Bit7 Bit6 Bit5 Bit 4 Bit3 Bit2 Bit1 Bit0 ADCS1 ADCS0 CHS2 CHS0 GO/DONE ------ADON CHS1 Bit 7 y Bit 6: Seleccin del reloj del conversor A/D. Figura 11.5. ADCS1 0 0 = 0 1 = 1 0 = 1 1 = ADCS0 Conversin del Reloj Fosc/2 Fosc/8 Fosc/32 FRC

Tabla 11.5. 209

Bit 0: Enciende el conversor A/D. Bit 5, Bit 4 yBit 3: Seleccin del canal de entrada. CHS2 CHS1 CHS0 Canal/Pin 0 0 0 = Canal 0 (AN0)/RA0 0 0 1 = Canal 1 (AN1)/RA1 0 1 0 = Canal 2 (AN2)/RA2 0 1 1 = Canal 3 (AN3)/RA3 1 0 0 = Canal 4 (AN4)/RA5 1 0 1 = Canal 5 (AN5)/RE0 1 1 0 = Canal 6 (AN6)/RE1 1 1 1 = Canal 7 (AN7)/RE2 Tabla 11.6. Bit 2: Estado de la conversin. GO/DONE: Solo funciona si ADON = 1 1 = Conversin A/D en progreso. 0 = Conversin A/D detenida. Bit 1: Este bit no est implementado. 1 = conversor A/D encendido. :11.3.-El registro ADCON10 = conversor A/D apagado. Bit 7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 ADFM ------------------PCFG3 PCFG2 PCFG1 PCFG0 Figura 11.6. Bit 7: Justificacin del resultado de la conversin a 10 bits a la derecha o izquierda. 210

1 = Justifica a la derecha. 0 = Justifica a la Izquierda. Bit 6 al Bit4: No estn implementados. Bit3, Bit 2, Bit 1 y Bit 0: Configuracin

PCFG3 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1

PCFG2 A A A 1 A A 0 D D 1 D D 0 D D 1 D D x D D 0 A A 1 D D 0 D D 1 D D 0 D D 1 D D 0 D D 1 D D

PCFG1 PCFG0 AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 Vref+ Vref0 A A A A A Vdd Vss A A Vref+ A A A RA3 Vss D A A A A A Vdd Vss D A Vref+ A A A RA3 Vss D D A D A A Vdd Vss D D Vref+ D A A RA3 Vss D D D D D D Vdd Vss A A Vref+ Vref-A A RA3 RA2 A A A A A A Vdd Vss A A Vref+ A A A RA3 Vss A A Vref+ Vref-A A RA3 RA2 D A Vref+ Vref-A A RA3 RA2 D D Vref+ Vref-A A RA3 RA2 D D D D D A Vdd Vss D D Vref+ Vref-D A RA3 RA2

D = I/O Digital si la conversin A/D se har a 8 bits o a 10 bits, Conversin a 8 Bits: se deben utilizar las siguientes directivas: Para definir en un programa A = Entrada Analgica Tabla 11.7. Define ADC_BITS 8 211

Esta directiva define que el resultado de la conversin A/D de una seal, aplicada a cualquiera de los canales, ser de 8 bits. Este resultado ser almacenado en un registro definido por el fabricante denominado ADRESL. REGISTRO BAJO (ADRESL) BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 Figura 11.7. Conversin a 10 Bits: Define ADC_BITS 10

1023. un solo registro de 16 bits, solo que en la parte alta de ste, los 6 bits mas 0 . Esto da como resultado que el valor mximo a ser almacenado en l ser: 0000001111111111, es decir, cuent, es decir, son considerados como significativos (Bit 2 al Bit 7 de ADRESH, figura 11.8) no son tomados en se almacena en dos registros, ADRESH y ADRESL, los cuales unidos forman Cuando realizamos la conversin A/D a 10 bits, el resultado de la conversin BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BI T 2 BIT 1 BIT 0 0 0 0 0 0 0 REGISTRO BAJO (ADRESL) REGISTRO ALTO (ADRESH) Figura 11.8. En la conversin a 10 bits tambin es muy importante considerar el bit 7 (ADFM) del registro de control ADCON1, ya que este bit mantiene el resultado de la conversin de 10 bits justificado, ya sea a la derecha si ADFM = 1, como lo demuestra la figura 11.9, o a la izquierda si ADFM = 0 como lo demuestra la figura 11.10: 212

REGISTRO ALTO (ADRESH) REGISTRO BAJO (ADRESL) BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BI T 2 BIT 1 BIT 0 0 0 0 0 0 0 Figura 11.9. BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BI T 2 BIT 1 BIT 0 0 0 0 0 0 0 REGISTRO BAJO (ADRESL) REGISTRO ALTO (ADRESH) Figura 11.10. menos significativo de ste es el bit 6 del registro ADRESL, y el bit ms significativo es el bit 7 del registro ADRESH. Nota: En el proceso de conversin resulta importante considerar un condensador de mantenimiento (ver figura 11.2). El tiempo de muestreo se define a travs de la siguiente directiva: C-Hold tiempo mnimo requerido en la etapa de muestreo, necesario para cargar el A/D, Cuando justificamos el resultado de la conversin A/D a la izquierda, el bit ADC_SAMPLEUS {tiempo} Define Ejemplo: Define ADC_SAMPLEUS 50

213

11.4.-Proyecto #31: A continuacin presentamos un ejemplo de conversin A/D a 8 bits, el cual consta bsicamente de un microcontrolador PIC16F877, un oscilador externo de 10 Mhz, una pantalla LCD para visualizar los resultados, y un potencimetro de 5Kohm para introducir un voltaje variable en un canal de entrada al conversor A/D. Figura 11.11. 214

Proyecto # 31 Componente Cantidad PIC16F877A Cristal de 10 Mhz Capacitor cermico de 22 pF Pantalla LCD 16x2 Resistencia de 220 Ohm Potencimetro de 5K Ohm Fuente regulada de 5 Vdc 1 1 2 1 2 2 1 Tabla 11.8. ADCin Sintaxis: ADCin canal, Variable Esta instruccin solo es vlida para microcontroladores que tienen convertidor entre otros. DEFINE OSC 10 ' Define el Oscilador a 10 Mhz lnea de programa leyendo detenidamente los comentarios. Realice el montaje del circuito propuesto en la figura 11.11, y analice cada A/D, por ejemplo, el PIC16F877, el PIC18F442, el PIC18F452, el PIC18F458 PORTD ' Indica que el Bus estar conectado en el Puerto D DEFINE LCD_BITS 4 ' El bus ser de cuatro bits. 4 ' Seleccin del Bit de inicio del puerto (0 o 4) en caso ' de utilizar los cuatro Bits mas significativos de la LCD DEFINE LCD_RSREG PORTB ' Indica al uC que el pin "RS" estar en el Puerto B DEFINE LCD_RSBIT 1 ' "RS" estar conectado en RB1 DEFINE LCD_EREG PORTB ' Indica al uC que el pin "E" estar en el Puerto B DEFINE LCD_EBIT 0 ' "E" estar conectado en RB0 DEFINE LCD_LINES 2 ' Define el nmero de lneas de la pantalla DEFINE LCD_DREG DEFINE LCD_DBIT 215

DEFINE ADC_BITS 8 ' Define la conversin A/D a 8 Bits DEFINE ADC_SAMPLEUS 50 ' Tiempo de muestreo en el conversor A/D es 50 uS A VAR Byte ' Declaracin de una variable tipo Byte (8 bits) ADCON1 = %00000000 ' Configura el registro ADCON1 LCDOut $fe, 1 ' Limpia la LCD Inicio: ADCIN 0, A ' Inicia la conversin, almacena el resultado en "A"

LCDOut $fe, 2 ' Posiciona el cursor en el inicio LCDOUT "C-AD a 8 Bit: " ' Muestra mensaje en la lnea 1 ' Pausa de 100 milisegundos' Muestra dato en la lnea 2 LCDOUT $fe,$C0," ",Dec A," " PAUSE 100 ' Salta a inicio GoTo Inicio End

En este ejemplo, podemos observar como vara el resultado cargado en la variable A al modificar el valor del potencimetro conectado al canal AN0 del conversor A/D (figura 11.11). Recordemos que la variable A , definida al inicio del programa, es del tipo Byte (8 Bits), suficiente para una conversin A/D de 8 Bits. Adems es importante observar que hemos seleccionado una configuracin para en el registro ADCON1, que todos los canales estn activos y disponibles para una posible solicitud de conversin, y tambin para que el voltaje de referencia sea el mismo de la fuente de alimentacin del circuito. Otro detalle importante es que el resultado de la conversin A/D se muestra en la pantalla LCD en decimal, debido a que se antepone a la variable A la directiva Dec . El resultado de la conversin tambin lo podemos ver en binario anteponiendo la directiva Bin , o en hexadecimal, anteponiendo la directiva Hex . Si deseamos obtener una mayor resolucin en la conversin A/D, podemos hacer unos cambios en la configuracin del conversor, sin necesidad de modificar el circuito de la figura 11.11. 216

Esto significa que podemos configurar el conversor A/D a 10 Bits, lo cual nos lleva a considerar los siguientes cambios: 1. Debemos definir ADC_BITS = 10. 2. La variable en la cual ser almacenado el resultado, debe ser del tipo Word (16 Bits), ya que una vez que se desborde el registro ADRESL, se requerir disponer de ms bits, debido a que el resultado para una conversin de 10 bits vara entre 0 y 1023. 3. Debemos recordar justificar el resultado de la conversin A/D a la derecha, configurando el bit 7 del registro ADCON1, es decir, ADFM = 1. 4. El mensaje mostrado en la primera lnea de la pantalla LCD deber ser: C-AD a 10 Bit: . Analice el siguiente programa en el cual se pueden observar los cambios antes mencionados: DEFINE OSC 10 ' Define Oscilador a 10 Mhz DEFINE LCD_DREG PORTD ' Indica que el Bus estar conectado en el Puerto D DEFINE LCD_BITS 4 ' El bus ser de cuatro bits. DEFINE LCD_DBIT 4 ' Seleccin del Bit de inicio del puerto (0 o 4) en caso ' de utilizar los cuatro Bits mas significativos de la LCD DEFINE LCD_RSREG PORTB ' Indica al uC que el pin "RS" estar en el Puerto B DEFINE LCD_RSBIT 1 ' "RS" estar conectado en RB1 DEFINE LCD_EREG PORTB

' Indica al uC que el pin "E" estar en el Puerto B DEFINE LCD_EBIT 0 ' "E" estar conectado en RB0 DEFINE LCD_LINES 2 DEFINE ADC_SAMPLEUS 50 Define ADC_BITS 10 ' Define el nmero de lneas de la pantalla

' Define la conversin A/D a 10 Bits ' Tiempo de muestreo en el conversor A/D es 50 uS

A Word VAR ' Declaracin de una variable tipo word (16 bits)

ADCON1 = %10000000 ' Configura el registro ADCON1 LCDOut $fe, 1 ' Limpia la LCD Inicio: ADCIN 0, A ' Inicia la conversin, almacena el resultado en "A" 217

LCDOut $fe, 2 LCDOUT "C-AD a 10 BLCDOUT $fe,$C0," PAUSE 100 it: ",Dec A," " " ' Posiciona el cursor en el inicio ' Muestra mensaje en la lnea 1 ' Muestra dato en la lnea 2 ' Pausa de 100 milisegundos GoTo Inicio ' Salta a inicio End Al modificar el valor del potencimetro conectado al canal AN0, podemos observar cmo vara el resultado de la conversin en la pantalla LCD entre 0 y 1023. Mueva el potencimetro hasta obtener un resultado cercano a 512 en la pantalla LCD, y mida con un multmetro el voltaje aplicado en el canal AN0, el cual deber ser aproximadamente 2,5 voltios, ya que el voltaje de referencia segn la configuracin elegida en el registro de control ADCON1 es el mismo voltaje que alimenta al circuito, es decir, 5 voltios. 218

Este protocolo define 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200 y 128000 adems estndares como la velocidad de transmisin en baudios (300, 1200, que define los parmetros en la comunicacin serial. protocolo de comunicacin RS-232, el cual es una norma o estndar mundial Las instrucciones en PicBasic para la comunicacin serial, se rigen bajo el deseamos establecer una comunicacin entre nuestros circuitos y nuestro PC. inclusive 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200 y 128000 adems estndares como la velocidad de transmisin en baudios (300, 1200, que define los parmetros en la comunicacin serial. protocolo de comunicacin RS-232, el cual es una norma o estndar mundial Las instrucciones en PicBasic para la comunicacin serial, se rigen bajo el deseamos establecer una comunicacin entre nuestros circuitos y nuestro PC. inclusive Comunicacin Serial Transmisin y Recepcin de Datos Capitulo XII

12.1.-Comunicacin Serial. En este captulo nos dedicaremos a estudiar la comunicacin serial asncrona, la cual resulta muy til cuando necesitamos transmitir o recibir datos entre circuitos gobernados por microcontroladores PIC, o cuando bps), niveles de voltaje, distancia entre dispositivos, entre otros. cuenta Cuando se trata de comunicacin serial entre un microcontrolador y un PC, es que importante tomar en los niveles de voltaje entre ambos dispositivos deben ser acoplados, ya que en un puerto serial de un PC, los niveles de voltaje estn comprendidos entre +12V y -12V, y en un microcontrolador los niveles de voltaje estn comprendidos entre 0V y 5V. Estas y otras caractersticas han sido detalladas a lo largo del captulo a travs de algunas recomendaciones y ejemplos. A continuacin estudiaremos las instrucciones SerIn y SerOut con las cuales haremos posible la comunicacin serial asncrona entre diversos dispositivos. Estas dos instrucciones son capaces de emular una comunicacin RS-232 en cualquier microcontrolador que no posea en su hardware USART (Universal Synchronous / Asynchronous Receiver / Transmitter). 12.2.-Instruccin SerIn: La instruccin SerIn se encarga de recibir uno o mas valores a travs de un pin especfico, usando el formato asncrono estndar 8N1 que significa 8 bits de datos, sin revisin de paridad y 1 bit de parada (stop). SerIn trabaja por defecto con un oscilador de 4 Mhz, y para 219

tener una transferencia de datos segura con otros osciladores de mayor valor, ser necesario utilizar la directiva Define Osc al inicio del programa. Ejemplo: Define Osc 20 (para un oscilador de 20 Mhz). Pin: en este campo definiremos cual ser el pin de entrada entre los puertos Sintaxis: SERIN pin, modo,{tiempo, etiqueta}, variable disponibles del microcontrolador. Ejemplo: PortB.1 Modo: define la velocidad de transmisin en baudios. Valor Numrico Modo Tasa de Bps 0 T2400 2400 1 T1200 1200 2 T9600 9600 3 T300 300 4 N2400 2400 5 N1200 1200 6 N9600 9600 7 N300 300 Tabla 12.1. Ejemplo: Velocidad de transmisin: 2400 bps Velocidad de transmisin: 1200 bps Velocidad de transmisin: 9600 bps Velocidad de transmisin: 300 bps El campo Modo tambin puede ser definido como se muestra en la columna Serin PortC.4, 3, variable Serin PortE.0, 2, variable Serin PortA.1, 1, variable Serin PortC.1, 0, variable 2 de la tabla 12.1, incluyendo la librera MODEDEFS.BAS en el inicio del programa (Include "modedefs.bas"), o utilizando directamente la instruccin SYMBOL como se muestra a continuacin: 220

puerto Symbol Symbol Symbol Symbol Symbol Symbol Symbol Symbol

serial COM1. T2400 = 0 ' Dato verdadero (Driven True) T1200 = 1 ' Dato verdadero (Driven True) T9600 = 2 ' Dato verdadero (Driven True) T300 = 3 ' Dato verdadero (Driven True) N2400 = 4 ' Dato invertido (Driven inverted) N1200 = 5 ' Dato invertido (Driven inverted) N9600 = 6 ' Dato invertido (Driven inverted) N300 = 7 ' Dato invertido (Driven inverted)

Tiempo: este campo es opcional al igual que el campo etiqueta , y su objetivo es establecer un tiempo en milisegundos definido por el programador, el cual una vez vencido, har que se realice un salto a la etiqueta , tambin definida por el programador. Ejemplo: Serin PortA.3, 2, 10, inicio, variable Este ejemplo se interpreta de la siguiente forma: el microcontrolador recibe los datos por el pin RA3 a 9600 bps en formato de dato verdadero; si no se reciben datos durante 10 milisegundos, salta a la etiqueta inicio ; si recibe datos lo almacena en la variable y contina con el programa. Variable: En este campo se especifica la variable en la cual se desea sean almacenados los datos recibidos. Ejemplo: Serin PortC.7, 4, dato 12.3.-Proyecto #32: En este proyecto vamos a transmitir datos desde un PC hacia un microcontrolador PIC16F877, utilizando un circuito integrado MAX232 entre ambos dispositivos y donde los datos enviados desde el PC sern visualizados en una pantalla LCD. Para enviar datos desde el PC hacia el microcontrolador, explicaremos como realizar un pequeo proyecto en Visual Basic, en el cual haremos un teclado matricial 3x4, que enviar un dato por cada tecla presionada a travs del Para ello ser necesario construir el circuito de la figura 12.1. Es importante tomar en cuenta en la construccin de este circuito, la polaridad de los 221

condensadores de 1 uF, ya que una polaridad invertida afectar negativamente el funcionamiento del MAX232 (Observe la polaridad de cada condensador en la figura 12.2). Entre los pines 15 (Gnd) y 16 (Vcc) condensador de 1 uF como se muestra de este componente tambin afectar produciendo errores en la recepcin del circuito Figura 12.1. 222 del MAX232 se debe conectar un en la figura 12.2, ya que la ausencia el funcionamiento de datos.

Proyecto # 32 Componente Cantidad PIC16F877A Cristal de 4 Mhz Capacitor cermico de 22 pF Pantalla LCD 16x2 Resistencia de 220 Ohm Capacitor Electroltico de uF Conector DB-9M IC MAX232 Fuente regulada de 5 Vdc 1 1 2 1 1 5 1 1 1 Tabla 12.2. Figura 12.2. 223

' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. Symbol T9600 = 2 ' Dato verdadero (Driven True) dato var Byte ' Define la variable dato como Byte pause 500 ' Pausa de 500 milisegundos para la LCD LCDOut $fe, 1 ' Limpia la LCD inicio: SerIn PORTC.7, T9600, dato ' espera datos durante 1 ms LCDOUT $fe, 2,"Dato: " LCDOut $fe,$C0,#dato," "

GoTo inicio ' Salta a inicio End

Como velocidad de transmisin, hemos elegido utilizar 9600 bps, por lo cual debemos definir este valor en nuestro programa. Las seales con las que acta el puerto del PC son digitales y la tensin con la cual trabaja es +12V y -12V; adicionalmente resulta importante saber que la lgica es invertida, es decir: +12 V Lgica = 0 -12 V Lgica = 1 De ah la importancia de saber cual ser el formato que debemos utilizar a la hora de definir los parmetros para la comunicacin (dato verdadero, o dato invertido). En este caso y como se puede observar en la segunda lnea de programa (Symbol T9600 = 2), esteremos utilizando el formato driven true , debido a que el MAX232 tiene en sus salidas un inversor para los datos provenientes del puerto serial del PC hacia el microcontrolador y vice versa. 224

Programa en Visual Basic 6.0: Para crear un nuevo proyecto en Visual Basic, hacemos clic en el men Archivo Nuevo Proyecto y seleccionamos la opcin EXE estndar 12.3). Figura 12.3. Figura 12.4. 225

(figura

Figura 12.5. Una vez creado un nuevo proyecto, ser importante activar el componente para manejar la comunicacin serial Microsoft Comm Control 6.0 . Esto se realiza haciendo clic en el men Proyectos Componentes Controles.

Figura 12.6. 226

Al hacer clic en el botn Aceptar veremos que en la barra de herramientas aparece un nuevo icono representado por un telfono. Figura 12.7. Inserte en el formulario el icono como se muestra en la figura MsComm 12.8, y configure los siguientes parmetros en la ventana de propiedades: CommPort: 1 (ver figura 12.9) Settings: 9600,n,8,1 (ver figura 12.10) Figura 12.8. 227

Figura 12.9. Figura 12.10. cuales se encargarn de abrir el puerto serial del PC (Figura 12.11). de cdigo en la cual introduciremos las siguientes lneas de programa, las Seguidamente haga doble clic sobre el formulario para visualizar la ventana Figura 12.11. 228

Utilice el icono CommandButton botones en el formulario:

en la barra de herramientas para agregar

propiedades del mismo (ver figura 12.13): Para cambiar el nombre del botn, busque la celda Caption Figura 12.12. Figura 12.13. 229

en la ventana de

Este procedimiento se repite hasta lograr obtener un formulario con 12 botones debidamente identificados como se observa en la figura 12.14: Figura 12.14. El siguiente paso es designar a cada botn la instruccin que se encargar de enviar un dato especfico a travs del puerto serial del PC. Haga doble clic en el primer botn del formulario y agregue la siguiente lnea de comando (ver figura 12.15): MSComm1.Output = Chr$(1)

Figura 12.15. 230

Se repite el paso anterior para el resto de los botones: Botn Botn Botn Botn Botn Botn Botn Botn Botn Botn Botn #2: MSComm1.Output = Chr$(2) #3: MSComm1.Output = Chr$(3) #4: MSComm1.Output = Chr$(4) #5: MSComm1.Output = Chr$(5) #6: MSComm1.Output = Chr$(6) #7: MSComm1.Output = Chr$(7) #8: MSComm1.Output = Chr$(8) #9: MSComm1.Output = Chr$(9) #10: MSComm1.Output = Chr$(10) #11: MSComm1.Output = Chr$(11) #12: MSComm1.Output = Chr$(12)

Por ltimo, haga clic en el botn Iniciar se enviarn 12.16), figura para hacer (ver

funcionar el teclado 3x4 desde el cual datos hacia el microcontrolador. microcontrolador el dato correspondiente el cual podr ser observado en la Al hacer clic en cualquiera de los botones del teclado, estar enviando al pantalla LCD de su circuito. 231

Figura 12.16. Por ltimo, generamos el archivo ejecutable desde el men ArchivoGenerar Nombredelarchivo. exe 232

12.4.-Instruccin SerOut: La instruccin SerOut en PicBasic se encarga de enviar uno o mas valores a travs de un pin especfico, usando el formato asncrono estndar 8N1, que significa 8 bits de datos, sin revisin de paridad y 1 bit de parada (stop). Sintaxis: SEROUT pin, modo, [variable]

Pin: en este campo definiremos cual ser el pin de salida entre los puertos disponibles del microcontrolador. Ejemplo: PortB.5 Modode la instruccin Serin (Tabla 12.1). Variable: En este campo se especifica la variable que contiene los datos que SerOut PORTC.6, T9600, [variable] sern enviados a travs de pin especificado. Ejemplo: : define la velocidad de transmisin en baudios y emplea la misma tabla 12.5.-Proyecto #33: Comenzaremos por realizar el circuito de la figura 12.17, el cual ser conectado al PC a travs del puerto serial COM1, y a travs del HyperTerminal de Windows veremos como son transmitidos los datos desde el microcontrolador hasta el PC. Veamos el siguiente programa en PBP: Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz.

Symbol = 2 I VAR inicio: I = 0 To 9For T9600 Byte ' Dato verdadero (Driven True) ' Define la variable I como Byte ' Repeticin de 0 a 9 SerOut PORTC.6, T9600, [#I] ' Enva los datos a travs del pin RC6 pause 1000 ' Pausa de 1 segundo Next I 233

GoTo inicio ' Salta a inicio End Podemos ver en el programa anterior como es enviado el contenido de la variable I , la cual incrementa su valor de cero a nueve, dato que sale en formato serial asncrono a travs del Pin RC6 a 9600 bps. Figura 12.17. 234

Proyecto # 33 Componente Cantidad PIC16F877A 1 Cristal de 4 Mhz 1 Capacitor cermico de 22 pF 2 Capacitor Electroltico de uF 5 Conector DB-9M 1 IC MAX232 1 Fuente regulada de 5 Vdc 1 Proyecto # 33 Componente Cantidad PIC16F877A 1 Cristal de 4 Mhz 1 Capacitor cermico de 22 pF 2 Capacitor Electroltico de uF 5 Conector DB-9M 1 IC MAX232 1 Fuente regulada de 5 Vdc 1 En caso de no disponer de un MAX232 para el acople entre el microcontrolador y el puerto serial del PC, tambin se pueden utilizar dos resistencias limitadoras de corriente, como se muestra en el diagrama de la figura 12.18. Tabla 12.3. Figura 12.18. 235

Deber tomar en cuenta entonces, que los parmetros de comunicacin cambian, debido a que los datos ya no pasarn a travs del inversor integrado en el MAX232. Esto significa que el programa a utilizar para el circuito de la figura 12.18 es el siguiente: Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz.

Symbol N9600 = 6 dato var Byte I var Byte ' Define la variable dato como Byte ' Define la variable I como Byte ' Dato invertido (Driven inverted) Inicio: For I=0 To 9 ' Repeticin de 0 a 9 SerOut PORTC.6, N9600, [#I] ' Pausa de 1 segundo ' enva los datos a travs del pin RC6 Pause 1000 Next I

GoTo Inicio ' Salta a inicio End

Para abrir el HyperTerminal de Windows, haga clic en el men Inicio Todos los Programas Accesorios Comunicaciones HyperTerminal. Escriba un nombre para la conexin y haga clic en 236

Aceptar .

endisponible Normalmente el puerto disponible para la comunicacin serial es el COM1. Figura 12.19. Seleccione el puerto su PC para realizar la prueba de

237

transmisin y luego haga clic en el botn Configurar

(figura 12.20).

Figura 12.21. coincidir con los parmetros seleccionados para la instruccin SerOut. los coincidir con los parmetros seleccionados para la instruccin SerOut. los Figura 12.20. En la figura 12.21 se observan campos en los cuales se pueden establecer los parmetros para la comunicacin serial, los cuales deben 238

Tambin es conveniente tomar en cuenta en la configuracin de la conexin, el tipo de emulacin (figura 12.22). Figura 12.22. Finalmente, al aceptar todos estos cambios en la ventana de configuracin del HyperTerminal de Windows, podremos ver la siguiente ventana (figura 12.23), en la cual se recibirn los datos enviados desde el microcontrolador. Una vez conectada la alimentacin del circuito, el microcontrolador empezar a enviar los datos desde cero hasta nueve, con intervalos de tiempo de un segundo. 239

acumuladas. 12.6.-Proyecto #34: En base a los conocimientos adquiridos hasta ahora, realizaremos a continuacin un circuito capaz de medir un voltaje variable aplicado a una de las entradas del conversor A/D de un PIC16F877A, el cual a su vez deber enviar el resultado de la conversin en decimal a una pantalla LCD, y enviar este mismo resultado a un PC, a travs del puerto serial donde los datos sern recibidos y convertidos , en una hoja de clculo (Excel), para posteriormente graficar el conjunto de datos de una muestra de diez lecturas Figura 12.23. de iniciar con la programacin, ser importante considerar los siguientes puntos: Antes La conversin A/D ser a 10 Bits, por lo cual debemos tener presente realizar esta definicin, es decir, Define ADC_BITS 10. 240

La pantalla LCD estar conectada en el puerto D , por lo cual ser necesario definir los pines de la misma al inicio del programa. Figura 12.24. 241

Proyecto # 34 Componente Cantidad PIC16F877A Cristal de 4 Mhz Capacitor cermico de 33 pF Pantalla LCD 16x2 Resistencia de 220 Ohm Capacitor Electroltico de uF Conector DB-9M IC MAX232 Potencimetro de 5K Ohm Fuente regulada de 5 Vdc 1 1 2 1 1 5 1 1 1 1 Tabla 12.4. Programa en Pic Basic Pro: '****************************************

'* Nombre : Proyecto34.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Ao) * '* Fecha : Fecha *

'* Versin : 1.0 * '****************************************

DEFINE OSC 4 ' Define Oscilador a 4 Mhz

DEFINE LCD_DREG DEFINE LCD_BITS DEFINE LCD_DBIT PORTD

4 ' Indica que el Bus estar conectado en el Puerto D ' El bus ser de cuatro bits. ' Seleccin del Bit de inicio del puerto (0 o 4) en caso ' de utilizar los cuatro Bits mas significativos de la LCD ' Indica al uC que el pin "RS" estar en el Puerto B ' "RS" estar conectado en RB1 ' Indica al uC que el pin "E" estar en el Puerto B ' "E" estar conectado en RB0 ' Define el nmero de lneas de la pantalla Symbol T9600 = 2 ' Dato verdadero (Driven True) Define ADC_BITS 10 DEFINE ADC_SAMPLEUS 50 ' Define la conversin A/D a 10 Bits ' Tiempo de muestreo en el conversor A/D es 50 uS A VAR Word ' Declaracin de una variable tipo word (16 bits) 242 DEFINE DEFINE DEFINE DEFINE DEFINE 4 LCD_RSREG PORTD LCD_RSBIT 2 LCD_EREG PORTD LCD_EBIT 3 LCD_LINES 2

ADCON1 = %10000000 ' Configura el registro ADCON1 LCDOut $fe, 1 ' Limpia la LCD inicio: ADCIN 0, A ' Inicia la conversin, almacena el resultado en "A" LCDOut $fe, 2 LCDOUT "C-AD a 10 Bit: " LCDOUT $fe,$C0,"Dato: ",Dec A," " ' Posiciona el cursor en el inicio ' Muestra mensaje en la lnea 1 ' Muestra dato en la lnea 2 SerOut PORTC.6, T9600, [#A] ' enva los datos al PC pause 500 GoTo inicio ' Salta a inicio End ' Pausa de 500 milisegundos En el programa se puede observar cmo hemos definido el conexionado de la pantalla LCD, as como tambin la configuracin bsica establecida para el conversor A/D, el cual har la conversin a 10 bits con el fin de obtener una mayor resolucin en el proceso de medicin del voltaje aplicado al pin RA0. Una vez iniciada la conversin, se puede observar que el resultado de la misma es almacenada en la variable A , la cual hemos declarado como una variable de 16 bits (word), debido a que el resultado de la conversin requiere mas de ocho bits de datos. Este resultado puede ser mostrado fcilmente en la pantalla LCD en decimal anteponiendo la directiva Dec a la variable en la cual hemos almacenado el dato resultado de la conversin. El siguiente paso en el programa consiste en enviar el dato obtenido al PC a travs del puerto serial, para luego hacer una pequea pausa de 500 milisegundos y empezar nuevamente el proceso para una nueva lectura. Un paso importante en este punto, una vez obtenido el resultado de la conversin A/D en la pantalla LCD, ser verificar la transferencia de datos hacia el PC con la ayuda del HyperTerminal de Windows. 243

Para esto debemos conectar el cable serial entre el circuito y el PC, desde la cual realizaremos una nueva conexin con el HyperTerminal, como se muestra en figura 12.25: Figura 12.25. En este punto solo debemos dar un nombre a la conexin y configurar el puerto con el cual estaremos trabajando como se muestra a continuacin: 244

Figura 12.26. Figura 12.27. Es importante recordar que la configuracin del puerto en el PC debe coincidir con la configuracin elegida para el microcontrolador PIC. Una vez configurado el HyperTerminal de Windows, se podrn observar los datos en la ventana, los cuales estarn llegando cada 500 milisegundos, tiempo definido 245

anteriormente en el programa que hemos cargado en el microcontrolador PIC (figura 12.28). Figura 12.28. Despus de verificar la correcta recepcin de datos desde el HyperTerminal, disponibilidad del puerto serial. La idea principal de esta prctica, ser llevar estos datos a una hoja de Excel, se debe asegurar de cerrar esta ventana (Figura 12.28) para garantizar la en la cual podamos realizar los clculos para expresar estos valores en sus equivalentes en voltios para luego tomar una muestra significativa y graficarlos como se observa en la figura 12.29. 246

Figura 12.29. El primer paso para configurar la hoja de Excel, ser ubicar las herramientas de Visual Basic y agregar a la hoja de clculo el control Microsoft communications control, Version 6.0 . Para esto debemos seguir los siguientes pasos: 247

1.-Al abrir la hoja de clculo, podemos ver un men de opciones en la parte superior de la ventana denominado Herramientas . Haga clic en el men Herramientas y seleccione la opcin Personalizar . Figura 12.30. Al seleccionar esta opcin podr observar que en la ventana Personalizar hay tres fichas de configuracin. Seleccione la ficha Barra de herramientas como se muestra en la figura 12.31. 248

Figura 12.31. En esta ficha encontrar una serie de opciones disponibles, de las cuales deber seleccionar Visual Basic . Haga clic en al botn Cerrar y ver que aparece en la hoja de clculo una caja de herramientas nueva llamada Visual Basic (Figura 12.32), la cual podemos trasladar a la parte superior de la hoja de clculo, la cual contiene el resto de las herramientas tpicas usadas en Excel (Figura 12.33). 249

Figura 12.32. 250

Figura 12.33. Haga clic en el botn Cuadro de controles (figura 12.33), y desplace la caja de herramientas nuevamente a la parte superior de la hoja de clculo junto con el resto de herramientas comunes de Excel (Figura 12.34). 251

Figura 12.34. En esta serie de botones, podemos encontrar uno denominado Mas controles (ver Figura 12.35), el cual despliega una lista de opciones. Ubique el siguiente control: Microsoft communications control, Version 6.0 . Al hacer doble clic en este control la lista de opciones desaparece y es en este momento en el cual debemos agregar el mismo sobre la hoja de clculo. Para esto, debe mantener el botn izquierdo del mouse activado y arrastrar el 252

puntero hasta que aparezca un pequeo recuadro. Al soltar el botn izquierdo el control aparece sobre la hoja. La figura de un Telfono sobre un MODEM lo identifica claramente, como se muestra en la figura 12.35. Figura 12.35. El siguiente paso ser agregar un botn en el cual se configura el cdigo necesario para la apertura del puerto serial en el PC (Figura 12.36). 253

Figura 12.36. cuales permitirn abrir el puerto clic sobre el botn que hemos agregado para tal fin: 'abre el puerto de comunicacin If Then End If Hoja1.MSComm1.PortOpen = True Hoja1.MSComm1.PortOpen = False Private Sub CommandButton1_Click() al hacer Basic, en el cual podemos agregar las siguientes lneas de programa, Al hacer doble clic sobre el nuevo botn, estamos entrando al editor Figura 12.36. cuales permitirn abrir el puerto clic sobre el botn que hemos agregado para tal fin: 'abre el puerto de comunicacin If Then End If Hoja1.MSComm1.PortOpen = True Hoja1.MSComm1.PortOpen = False Private Sub CommandButton1_Click() al hacer Basic, en el cual podemos agregar las siguientes lneas de programa, Al hacer doble clic sobre el nuevo botn, estamos entrando al editor la correspondiente Observe End Sub

las de Visual

las de Visual

figura 12.37, en la cual se puede ver el campo

Caption ,

a la etiqueta del botn de comando que estamos configurando, la cual podemos personalizar con un nombre adecuado como Abrir Puerto o Abrir Comm1 . 254

Figura 12.37. En figura 12.37 tambin podemos apreciar las lneas de programacin agregadas al botn de comando, y el icono que nos permitir regresar a la hoja de clculo para continuar con la programacin. Al regresar a la hoja de clculo podremos notar el cambio en la etiqueta del botn de comando, como se muestra en la figura 12.38: 255

Ahora solo nos queda configurar el evento OnComm, relativo a la recepcin de datos, haciendo doble clic sobre el control de comunicaciones (figura 12.39): Figura 12.39. 256 Figura 12.38.

Veremos a continuacin la ventana del editor de Visual Basic (Figura 12.40): Figura 12.40. Recordemos que para almacenar datos en una variable, es importante considerar la declaracin de la misma antes de ejecutar cualquier otra lnea de programa que as la requiera. Es por esto que para este ejemplo, el primer 257

paso en la configuracin del control de comunicaciones ha sido la declaracin de dos variables, las cuales hemos denominado Apuntador y datainput . La variable Apuntador ser declarada como ser declarada como String . Byte y la variable datainput

Analice el uso de la variable Apuntador en el cdigo del evento OnComm, el cual detallamos unas lneas ms adelante. Esta variable se usa bsicamente como acumulador y determina la posicin en un rango predeterminado de las filas en la hoja de clculo. Esto se debe a que estamos interesados en mantener una muestra de los diez ltimos valores capturados en el puerto para poder realizar una grfica de lneas suavizadas, la cual se estar actualizando cada 500 milisegundos. Para almacenar un dato presente en el puerto serial (Comm1), utilizamos el comando MSComm1.Input datainput , debemos realizar el siguiente arreglo: , entonces, para almacenar un dato en la variable datainput = MSComm1.Input clculo, podemos utilizar el siguiente comando: Luego para llevar el dato almacenado en la variable a una celda en la hoja de datainput por estar Ejemplo: Hoja1.Cells(Fila, Columna) = Mid(Variable, Bit de inicio, longitud) en la variable datainput de la siguiente manera: declarada como tras otro. Podemos extraer un dato de la cadena de caracteres almacenada Un punto importante a considerar es que la variable String , almacenar una serie de datos consecutivos uno Hoja1.Cells(Fila, Columna) Si datainput = 643645650681701718745776 Para extraer los tres primeros caracteres y llevarlos por ejemplo a la celda (40,2) debemos hacer el siguiente arreglo: 258

Hoja1.Cells(40, 2) = Mid(datainput, 1, 3) Para mantener este dato y capturar uno mas actualizado, simplemente debemos hacer un arreglo para desplazar el contenido de la celda (40,2) a la celda (39,2). Cuando llegue el prximo dato actualizado, el contenido de esta celda deber pasar a la celda (38,2) y as sucesivamente. Al repetir el desplazamiento de celdas diez veces, podremos tomar y graficarlos en la hoja de clculo. estos valores Veamos a continuacin el cdigo para el evento OnComm: Private Sub MSComm1_OnComm() 'Declara variable Dim Apuntador As Byte Dim datainput As String datainput = MSComm1.Input

For Apuntador = 30 To 40 Hoja1.Cells(Apuntador, 2) = Hoja1.Cells(Apuntador + 1, 2) Next Hoja1.Cells(40, 2) = Mid(datainput, 1, 4) End Sub 259

Analice cuidadosamente Figura 12.41. el contenido del cdigo en el evento OnComm. Verifique la rutina encargada de apilar los datos entre las celdas (40,1) y (30, 1). Por ltimo, analice la extraccin de datos de la cadena de caracteres almacenada en la variable datainput . Completados todos estos pasos, lo siguiente ser volver a la hoja de clculo y salir del modo de diseo, haciendo clic en el icono sealado en la siguiente figura: 260

Cuando se sale del modo de el control diseo, de comunicaciones desaparece de la hoja de clculo. Ahora, haciendo clic en el botn Abrir Comm1 y activando el circuito, podremos ver que aparecen los datos de la conversin A/D del microcontrolador en la pantalla LCD y en la hoja de clculo, especficamente en las celdas B40, B39, B38, B37, B36, B35, B34, B33, B32, B31 y B30. Figura 12.42. En la figura 12.43 se pueden ver unos datos de prueba almacenados en las celdas anteriormente mencionadas. Estos datos pueden ser identificados poniendo un nombre o encabezado en la celda B29, por ejemplo, podemos escribir la palabra Lecturas: . En la columna C de la hoja de clculo, haremos la conversin de datos para expresar los valores obtenidos en Voltios. Para esto aplicaremos la siguiente formula en las celdas C40, C39, C38, C37, C36, C35, C34, C33, C32, C31 y C30: =(B40*5)/1024 para la celda C40 =(B39*5)/1024 para la celda C39 =(B38*5)/1024 para la celda C38 =(B37*5)/1024 para la celda C37 261

=(B36*5)/1024 =(B35*5)/1024 =(B34*5)/1024 =(B33*5)/1024 =(B32*5)/1024 =(B31*5)/1024 =(B30*5)/1024

para la celda C36 para la celda C35 para la celda C34 para la celda C33 para la celda C32 para la celda C31 para la celda C30 Figura 12.43. 262

Figura 12.44. Observe en la figura 12.44, la formula para la celda C40. Observe tambin que hemos ocultado una serie de filas de la hoja de clculo, las cuales hemos reservado para agregar un grfico de lneas suavizadas. Para graficar esta serie de datos, seleccionamos las diez celdas (desde la celda C30 hasta la celda C40) y hacemos clic en el icono Asistente para Grficos (Figura 12.45), donde aparecer una ventana en la cual podremos elegir el tipo de grfico que deseamos utilizar. Seleccione la ficha Tipos personalizados y haga clic en la opcin Lneas suavizadas de la lista (Figura 12.46). 263

Figura 12.45. Figura 12.45. Figura 12.46. 264

En la siguiente ventana podemos ver el rango de datos que ser graficado (Figura 12.47): Figura 12.47. Si se desea personalizar an mas el grfico, se puede hacer en la ficha Serie , en cual es posible editar el recuadro que contiene la leyenda. En la siguiente ventana encontraremos una serie de fichas con una gran variedad de opciones que nos permitirn aadir detalles como el ttulo del grfico, identificar los ejes, agregar lneas de divisin, y algunos otros detalles tiles para mejorar la apariencia del grfico. (figura 12.48). 265

Figura 12.48. Figura 12.48. Seguidamente, podemos seleccionar si el grfico ser colocado en una hoja nueva, o en la hoja de clculo en la cual hemos estado trabajando (figura 12.49): Figura 12.49. Finalmente podremos ver en la hoja de Excel los datos enviados desde el microcontrolador, los cuales a su vez sern graficados constantemente, como se puede observar en la figura 12.50. 266

Figura 12.50. 267

Servomotores Capitulo XIII

13.1.-Qu es un Servomotor? Un servomotor estndar tiene dimensiones muy apropiadas para realizar proyectos de robtica, y aunque se pueden encontrar en diferentes tamaos, es importante resaltar que la fuerza de un servo en su eje no es directamente proporcional al tamao del mismo. Esto significa que su fuerza depende en componen sus engranajes. gran sentido de su diseo interior, es decir, de la mecnica y material que Un servomotor es un dispositivo electromecnico capaz de rotar su eje a una posicin especfica a lo largo de su recorrido, inyectando un tren de pulsos controlados, a un circuito de control que posee dentro de su caja o chasis. Esta seal se introduce a travs de un cable de control que se distingue entre los tres cables que posee y que segn la marca del servomotor puede ser de color blanco o amarillo. Los cables de alimentacin se distinguen por sus colores rojo (Positivo) y negro (Negativo). Veamos a continuacin algunas caractersticas tcnicas importantes en un servomotor estndar: Control: Control por ancho de pulso. Pulso: 3-5 Voltios Pico a Pico. Voltaje de operacin: 4.8 a 6.0 Voltios. 268

Torque (4.8V): 3.0 kg/cm (42 oz/in) Torque (6.0V): 4.5 kg/cm (48.60 oz/in) Rango de Temperatura Operacional: -20 a +60 C. Velocidad (4.8V): 0.19sec/60 grados. Velocidad (6.0V): 0.15sec/60 grados. Corriente (4.8V): 7.4mA activo y 160mA al aplicar fuerza. Corriente (6.0V): 7.7mA activo y 180mA al aplicar fuerza.

Figura 13.1. Para controlar la posicin del eje de un servomotor, hace falta enviar un tren de pulsos, donde el ancho de cada pulso determina el punto en el cual el eje mantiene su posicin, siempre y cuando est presente el tren de pulsos. El recorrido ser en la mayora de los modelos de 180 y los tiempos correspondientes al pulso en la seal para las posiciones principales (0, 90 y 269

180) se especifican en la tabla 13.1. (Estos tiempos pueden variar de acuerdo al modelo y marca del servomotor). Entonces, si deseamos llevar el eje a 0, se deben introducir al servo pulsos Tabla 13.1. de 0.6 milisegundos (T1) aproximadamente, cada 20 milisegundos, como se muestra en la figura 13.3. T2 corresponde por consiguiente al tiempo que debemos esperar para enviar un nuevo pulso, el cual mantiene actualizada la posicin de eje. El tiempo T2 puede estar dentro del rango 10 ms = T2 = 40 ms. Figura 13.3. 270

Figura 13.4. Figura 13.4. A medida que aumentamos gradualmente el tiempo T1, el eje del servomotor se ir moviendo en sentido horario. Cuando T1 = 1.5 ms podremos ver que el eje forma un ngulo de 90 con respecto al punto de inicio (0). En la figura 13.4 se puede observar la seal correspondiente a esta posicin (90), donde T2 se mantiene en 20 milisegundos. La seal correspondiente a la posicin mxima (180) en un servomotor estndar, tendra entonces valores para T1 = 2.6 ms y T2 = 20 ms. (figura 13.5). Figura 13.5. 271

13.2.-Proyecto #35: Se puede crear un programa en PicBasic que cumpla con estas caractersticas, en el cual variando solo una variable, podemos modificar el ngulo de giro de un servomotor. Veamos el siguiente ejemplo: Figura 13.6. Proyecto # 35 Componente Cantidad PIC16F84A Cristal de 4 Mhz Capacitor cermico de 22 pF Servomotor Fuente regulada de 5 Vdc 1 1 2 1 1 Tabla 13.2. 272

PAUSEUS Sintaxis: PAUSEUS periodo La instruccin Pause realiza un pausa en el programa por un periodo definido en microsegundos. Esta instruccin no pone al microcontrolador en modo de bajo consumo de energa. Programa en Pic Basic Pro: DEFINE OSC 4 ' Define el oscilador en 4 Mhz PULSO VAR Word ' Define la variable "Pulso" (16 Bits) PULSO = 1550 ' Inicializamos la variable "Pulso" Inicio: High PORTB.0 ' RB0 = 1 PauseUs PULSO ' Pausa en microsegundos

Low PORTB.0 ' RB0 = 0 Pause 20 ' Pausa de 20 milisegundos GoTo Inicio ' Salto a inicio

End

podremos ver en un osciloscopio el tren de pulsos presente en el pin RB0 como se muestra en la figura 13.7. Al compilar, grabar y ejecutar el programa anterior en el microcontrolador, 273

Seguidamente hacemos Figura 13.7. Volt/Div: 2V Time/Div: 5ms Perodo: 21,55 ms T1: 1,55 ms (Ancho de pulso positivo). T2: 20 ms Vpp: 5,44 Voltios. Ciclo de trabajo: 8,16%

Tiempo de subida: 160,0 us Tiempo de bajada: 160,0 us el punto medio de su recorrido total. Al aplicar el tren de pulsos al servomotor, su eje rotar hasta una posicin en Si analizamos el programa, podremos observar que la instruccin PauseUs realiza una parada durante un tiempo definido por la variable es de Pulso , cuyo valor 1550, es decir, se est generando una pausa de 1550 microsegundos, o lo que es igual, 1,55 milisegundos. una pausa de 20 milisegundos antes de enviar nuevamente el pulso al Pin RB0. 274

Entonces, si deseramos modificar el ngulo de giro, podemos cambiar el valor de la variable Pulso , siempre y cuando el valor est dentro del rango de tiempo permitido (0,65 ms = T1 = 2.6 ms), es decir, 650 = PauseUs = 2600. Una forma an ms prctica para generar el tren de pulsos de la figura 13.7, sera haciendo uso de la instruccin PulsOut , como se muestra a continuacin: DEFINE OSC 4 Inicio: PulsOut PORTB.0,65 ' duracin. ' Genera pulsos de 650 microsegundos de ' Define el oscilador en 4 Mhz Low PORTB.0 ' RB0 = 0

Pause 20 ' Salto a inicio. ' Pausa de 20 milisegundos. GoTo Inicio End

275

13.3.-Proyecto #36: Para hacer un poco ms interesante la prctica, en la cual el objetivo ha sido controlar el ngulo de giro de un servomotor, proponemos incorporar al circuito dos pulsadores para aumentar y disminuir el ngulo y una pantalla LCD para visualizar el valor en microsegundos de cada pulso enviado al servomotor (Figura 13.8). Figura 13.8. 276

Proyecto # 36 Componente Cantidad PIC16F84A Cristal de 4 Mhz Capacitor cermico de 22 pF Pantalla LCD 16x2 Resistencia de 10K Ohm Potencimetro de 5K Ohm Servomotor Pulsador Normalmente Abierto Fuente regulada de 5 Vdc 1 1 2 1 3 1 1 2 1 Tabla 13.3. Programa en PBP: DEFINE OSC 4 ' Define el oscilador en 4 Mhz TRISB = %11110110 ' Configuracin del puerto B PULSO VAR Word ' Define la variable "Pulso" (16 Bits) PULSO = 1550 ' Inicializamos la variable "Pulso"

Pause 200 ' Pausa de 200 milisegundos para la LCD LCDOut $fe, 1 ' Limpia la LCD Inicio: High PORTB.0

' RB0=1 PauseUs PULSO ' Pausa en microsegundos Low PORTB.0 ' RB0 = 0 Pause 15

' Pausa de 15 milisegundos

' Considerando que las siguientes instrucciones consumen' 1 ms cada una y la ins truccin de salto consume 2 ms, la ' pausa anterior ser de 15 ms para lograr un tiempo entre' cada pulso de 20 ms. If PORTB.1 = 1 And PULSO < 2600 Then Call SUMA ' Si RB1 = 1 significa que se ha activado el pulsador ' conectado a l. La condicin se cumple slo si el pulsador ' est activado y la variable "Pulso" es menor a 2600. If PORTB.2 = 1 And PULSO > 650 Then Call RESTA ' Si RB2 = 1 significa que se ha activado el pulsador 277

' conectado a l. La condicin se cumple slo si el pulsador ' est activado y la variable "Pulso" es mayor a 650. LCDOUT $fe, 2,"PULSO: ",#PULSO," uS " ' Muestra el dato cargado en la variable "Pulso" GoTo Inicio ' Salto a inicio SUMA: PULSO = PULSO + 100 ' Suma 100 a la variable "Pulso" Pause 40 ' Pausa de 40 milisegundos Return ' Retorno RESTA: PULSO = PULSO -100 ' Resta 100 a la variable "Pulso" Pause 40 ' Pausa de 40 milisegundos Return ' Retorno

' Si se aumenta o disminuye la pausa en las subrutinas ' suma y resta, se logra un efecto de aumento o disminucin ' de la velocidad variacin del ngulo. End

Si empleamos la instruccin

PulsOut :

DEFINE OSC 4 ' Define el oscilador en 4 Mhz

TRISB = %11110110 ' Configuracin del puerto B

PULSO VAR Word PULSO = 155 ' Define la variable "Pulso" (16 Bits) ' Inicializamos la variable "Pulso" Pause 200 ' Pausa de 200 milisegundos para la LCD LCDOut $fe, 1

' Limpia la LCD Inicio:

.0, PULSO Low .0 Pause 15 PulsOut PORTBPORTB ' Genera un pulso en RB0 ' RB0 = 0 ' Pausa de 15 milisegundos ' ' ' ' Considerando que las siguientes instrucciones consumen 1 ms cada una y la instruccin de salto consume 2 ms, la pausa anterior ser de 15 ms para lograr un tiempo entre cada pulso de 20 ms.

If PORTB.1 = 1 And PULSO < 260 Then Call SUMA ' Si RB1 = 1 significa que se ha activado el pulsador ' conectado a l. La condicin se cumple slo si el pulsador 278

' est activado y la variable "Pulso" es menor a 260. If PORTB.2 = 1 And PULSO > 65 Then Call RESTA ' Si RB2 = 1 significa que se ha activado el pulsador ' conectado a l. La condicin se cumple slo si el pulsador ' est activado y la variable "Pulso" es mayor a 65. LCDOUT $fe, 2,"PULSO: ",#PULSO,"0 uS " ' Muestra el dato cargado en la variable "Pulso" GoTo Inicio ' Salto a inicio SUMA: PULSO = PULSO + 10 ' Suma 10 a la variable "Pulso" Pause 40 ' Pausa de 40 milisegundos Return ' Retorno RESTA: PULSO = PULSO -10 ' Resta 10 a la variable "Pulso" Pause 40 ' Pausa de 40 milisegundos Return ' Retorno

' Si se aumenta o disminuye la pausa en las subrutinas ' suma y resta, se logra un efecto de aumento o disminucin ' de la velocidad variacin del ngulo. End

279

13.4.-Proyecto #37: En la siguiente actividad se desea controlar un servomotor y visualizar el tiempo de cada pulso en una pantalla LCD, conectados a un microcontrolador principal. Desde un microcontrolador secundario se enviar el dato correspondiente al ngulo del eje, estableciendo una comunicacin serial con el microcontrolador principal, de tal manera que una c omunicacin serial con el microcontrolador principal, de tal manera que cuando se requiera aumentar o disminuir el ngulo, sean utilizados dos pulsadores conectados en cualquiera de los puertos del microcontrolador secundario. disponibles El circuito propuesto se muestra en la figura 13.9. Figura 13.9. 280

' Define el oscilador en 4 Mhz ' Define el oscilador en 4 Mhz Proyecto # 37 Componente Cantidad PIC16F84A 2 Cristal de 4 Mhz 2 Capacitor cermico de 22 pF 4 Pantalla LCD 16x2 1 Resistencia de 10K Ohm 3 Potencimetro de 5K Ohm 1 Pulsador Normalmente Abierto 2 Fuente regulada de 5 Vdc 1 Tabla 13.4. Programa para el microcontrolador principal U1: DEFINE OSC 4 Symbol T9600 = 2 ' Dato verdadero (Driven True)

PULSO VAR Word ' Define la variable "Pulso" (16 Bits) PULSO = 155 ' Inicializa variable "Pulso"

pause 200 ' Pausa de 200 milisegundos para la LCD LCDOut $fe, 1 ' Limpia la LCD Inicio:

SerIn PORTB.7, T9600, 16, Sigue, PULSO ' Espera dato

' durante 16 ms Sigue:

PulsOut PORTB.1, PULSO ' Genera pulso en RB1 GoTo Inicio ' Salto a inicio End LCDOUT $fe, 2,"PULSO: ",#PULSO,"0 uS " ' Muestra dato.

281

Programa para el microcontrolador secundario U2: DEFINE OSC 4 Symbol T9600 = 2 ' Dato verdadero (Driven True) PULSO VAR Word ' Define la variable "Pulso" (16 Bits) PULSO = 155 ' Inicializa variable "Pulso" inicio: If PORTA.0 = 1 And PULSO < 250 Then Call suma ' Si RA0 = 1 significa que se ha activado el pulsador ' conectado a l. La condicin se cumple slo si el pulsador ' est activado y la variable "Pulso" es menor a 250.

If PORTA.1 = 1 And PULSO > 60 Then Call resta ' Si RA1 = 1 significa que se ha activado el pulsador' conectado a l. La condicin se cumple slo si el pulsador ' est activado y la variable "Pulso" es mayor a 60. GoTo inicio ' Salto a inicio

suma:

PULSO = PULSO + 10 ' Suma 10 a la variable "Pulso" SerOut PORTA.2, T9600, [PULSO] ' Enva dato serial por RA2 PAUSE 40 ' Pausa de 40 milisegundos Return ' Retorno

resta:

PULSO = PULSO -10 ' Resta 10 a la variable "Pulso" SerOut PORTA.2, T9600, [PULSO] ' Enva dato serial por RA2 PAUSE 40 ' Pausa de 40 milisegundos Return

' Retorno End

282

13.5.-Proyecto #38: En la siguiente actividad se controlar un servomotor desde el puerto serial de un PC, desde donde enviaremos el dato a ser cargado en la instruccin PulsOut en el cdigo de programa del microcontrolador, y el cual definir el ancho de pulso a ser introducido en el servomotor cada 20 milisegundos. El circuito consta de un microcontrolador PIC16F84A con oscilador de 4 Mhz y un servomotor, donde la lnea de control estar conectada al Pin RB1. Para la comunicacin entre el PC y el circuito, emplearemos un circuito integrado MAX-232 (Figura 13.10). Figura 13.10. 283

Proyecto # 38 Componente Cantidad PIC16F84A Cristal de 4 Mhz Capacitor cermico de 22 pF IC MAX232 Capacitor electroltico de 0,1 uF Potencimetro de 5K Ohm Conector DB-9M Fuente regulada de 5 Vdc 1 1 2 1 5 1 1 1 Tabla 13.5. Programa en Pic Basic Pro: DEFINE OSC 4 Symbol T9600 = 2 ' Dato verdadero (Driven True) ' Define el oscilador en 4 Mhz PULSO VAR Word ' Define la variable "Pulso" (16 Bits) PORTB.1 = 0 ' Inicializa RB1 inicio: SerIn PORTB.7, T9600, 18, sigue, PULSO ' Espera dato

' durante 18 ms sigue:

GoTo inicio PulsOut PORTB.1, PULSO ' Genera pulso en RB1 ' Salto a inicio End 284

Para la comunicacin serial, se ha definido el modo de dato verdadero a 9600 bps (T9600). A partir de la etiqueta inicio , el primer paso ser esperar un dato serial durante 18 milisegundos antes de saltar a la etiqueta sigue , para generar el pulso correspondiente y donde su duracin se calcula en decenas de microsegundos. Seguidamente se genera un salto a la etiqueta inicio para repetir el proceso. La interfaz grfica para el control del servomotor la hemos realizado en Visual Basic (Figura 13.11), desde la cual podremos seleccionar el tiempo de duracin de los pulsos enviados al servomotor. Adems hemos agregado tres botones con valores fijos para las tres posiciones principales (0, 90 y 180). Veamos a continuacin el desarrollo de la interfaz grfica paso a paso: Figura 13.11. 285

Paso 1: creamos un nuevo proyecto EXE estndar Figura 13.12.

(Figura 13.12):

Paso 2: Identificamos el formulario en las propiedades del mismo, ingresando un nombre que identifique nuestra aplicacin: Figura 13.13. 286

Paso 3: activamos el Figura 13.14. para muestra Controles. componente manejar la comunicacin serial Microsoft Comm Control 6.0 . Esto se realiza haciendo clic en el men Proyectos Componentes Seguidamente se inserta el icono MsComm como se en la figura 13.15, y se configuran los parmetros de conexin la ventana de propiedades (Figuras 13.16 y 13.17): Figura 13.15. en 287

botn en la ventana de propiedades (Figura 13.19): Paso 4: cerramos la ventana de cdigo e incluimos los botones, el campo de Figura 13.17. texto y la imagen en el formulario (Figura 13.18). Recuerde identificar cada Figura 13.18. Figura 13.19. 288 Figura 13.16.

Figura 13.20. Paso 5: se asigna un nombre a cada botn en la ventana de propiedades (Figura 13.21): 289

Figura 13.21. Paso 6: se hace doble clic sobre el formulario para agregar el siguiente cdigo, con el cual habilitaremos el puerto serial del PC, y asignaremos una funcin especfica a cada botn (Figura 13.20): Dim Servo As Byte

' Declaracin de Variable "Servo" ' tipo byte

Private Sub Form_Load() ' Rutina para abrir el puerto serial MSComm1.PortOpen = True If MSComm1.PortOpen = False Then MSComm1.PortOpen = True End If Servo = 155 ' Inicializamos la variable "Servo" MSComm1.Output = Chr$(Servo) ' Enva dato al puerto Comm1 Text1.Text = Servo * 10 ' Muestra dato * 10 en la caja de texto End Sub 290

' Muestra dato * 10 en la caja de texto ' Muestra dato * 10 en la caja de texto Private Sub Boton1_Click() ' Boton 0 Servo = 70 ' Carga el valor para 0 Text1.Text = Servo * 10 ' Muestra dato * 10 en la caja de texto MSComm1.Output = Chr$(Servo) ' Enva dato al puerto Comm1 End Sub Private Sub Boton2_Click() ' Boton 90 Servo = 155 ' Carga el valor para 90 Text1.Text = Servo * 10 ' Muestra dato * 10 en la caja de texto MSComm1.Output = Chr$(Servo) ' Enva dato al puerto Comm1 End Sub Private Sub Boton3_Click() ' Boton 90 Servo = 250 ' Carga el valor para 180 Text1.Text = Servo * 10 MSComm1.Output = Chr$(Servo) ' Enva dato al puerto Comm1 End Sub

Private Sub Boton4_Click() ' Boton <-If Servo > 70 Then ' Restar solo si Servo es > 70 Servo = Servo -5 ' Resta 5 a la variable "Servo" Text1.Text = Servo * 10 ' Muestra dato * 10 en la caja de texto End If End Sub

Private Sub Boton5_Click() ' Boton --> If Servo < 250 Then

' Sumar solo si Servo es < 250 Servo = Servo +5 ' Suma 5 a la variable "Servo" Text1.Text = Servo * 10 ' Muestra dato * 10 en la caja de texto End If End Sub Private Sub Boton6_Click() ' Boton "Enviar Dato" MSComm1.Output = Chr$(Servo) ' Enva dato al puerto Comm1 End Sub

291

Nota Importante: Recuerde que el dato a ser cargado en la instruccin PulsOut del programa de control del PIC16F84A, se mide en decenas de microsegundos para un oscilador de 4 Mhz, por ejemplo: PulsOut PORTB.1, 100 Esto significa que el tiempo del pulso generado ser de 100 decenas de microsegundos: 10 microsegundos x 100 = 1000 microsegundos 1 milisegundo. Por lo tanto, los datos que enviamos al microcontrolador a travs del puerto enserial desde la aplicacin que hemos creado Visual Basic, deben ser considerados como la cantidad de decenas de microsegundos que deseamos que dure cada pulso enviado al servomotor. Esta es la razn por la cual hemos multiplicado por diez el dato a ser mostrado en la caja de texto, especificando adems la unidad de tiempo correspondiente, que en este caso se expresa con la palabra Microsegundos . Paso 7: generamos el archivo ejecutable desde el men ArchivoGenerar Nombredelarchivo.ex e . 292

Mdulos RF para comunicaciones Captulo XIV 14.1.-Proyectos con Mdulos RF. A continuacin realizaremos algunos proyectos donde la base de stos sern los mdulos inalmbricos RF de la empresa Linx Technologies Inc. (http://www.linxtechnologies.com), los cuales ofrecen una gran variedad de modelos en diferentes rangos de frecuencias y donde la caracterstica ms resaltante radica en que no requieren componentes externos a excepcin de la antena (figura 14.1). Su interfaz serial nos realizar una se encuentran a muy sencillo el trabajo de comunicar dos que distancias considerablemente largas en sus versiones de mdulos LR (Long frecuencias de 315 Mhz o 433 Mhz. Figura 14.1. El voltaje de alimentacin no debe exceder los 3.3 Vdc, por lo cual se debe frecuencia estndar de 418 Mhz. Tambin se pueden adquirir para trabajar en Range), para distancias que pueden llegar a exceder los 900 metros en su circuitos permite comunicacin directa o sin modificaciones en el protocolo RS-232, haciendo considerar el uso de una regulador de voltaje para el transmisor y receptor, considerando que el voltaje estndar en nuestros circuitos ha sido de 5 Vdc. 293

Transmisor: TXM-418-LR-S Figura 14.2. Receptor: RXM-418-LR-S Figura 14.3. El pin 4 (LADJ/VCC) en el transmisor puede ser utilizado para el ajuste en la potencia del transmisor, variando el valor de una resistencia o potencimetro, y la relacin resistencia versus potencia se puede ver en la figura 14.4: 294

= entonces el transmisor 0, = entonces el transmisor 0, Figura 14.4. El pin PDN (Power Down) se encuentra disponible en el transmisor y receptor y puede ser utilizado para poner el dispositivo en bajo consumo de energa (menor a 5nA). Si se desea utilizar la opcin de bajo consumo de energa se requiere de una resistencia Pull-up de 10Kohm a Vcc o de menor valor en el pin PDN. Cuando PDN o receptor entran en reposo. 295 A realizaremos una serie de proyectos en los cuales muy interesantes como base para nuevos proyectos. implementaremos la comunicacin serial inalmbrica, y los cuales resultan continuacin Todas estas consideraciones pueden ser ampliadas en la hoja de datos de cada dispositivo suministradas por el fabricante.

14.2.-Proyecto #39: En el siguiente proyecto se requiere la construccin de dos circuitos, figura 14.5 y figura 14.6. En el transmisor hemos empleado un microcontrolador PIC16F877 debido a que en los siguientes proyectos iremos incorporando ms dispositivos externos a dems de la pantalla LCD. El circuito receptor estar controlado por un PIC16F84 al cual le conectado una pantalla LCD para visualizar los datos recibidos. Circuito Transmisor: hemos Figura 14.5. 296

Circuito Receptor: Figura 14.6. 297

Proyecto # 39 Componente Cantidad PIC16F877A PIC16F84A Cristal de 4 Mhz Capacitor cermico de 22 pF TXM-418-LR-S con antena RXM-418-LR-S con antena Pantalla LCD 16x2 Potencimetro de 5K Ohm Resistencia de 390 Ohm Resistencia de 750 Ohm Resistencia de 10K Ohm Fuente regulada de 3.3 Vdc / 5 Vdc 1 1 2 4 1 1 2 2 2 1 1 2 La primera actividad consiste en enviar una secuencia de dgitos (0 al 9) hacia Tabla 14.1. el receptor, los cuales deben poder ser visualizados en la pantalla LCD del mismo. Esto significa que cuando transmitimos el primer dgito al receptor, ste ser mostrado en la pantalla LCD del circuito transmisor y receptor y ambos debern ser iguales para confirmar que la transmisin de datos ha sido Programa para el circuito transmisor: exitosa. T9600 Symbol =2 ' Dato verdadero (Driven True) I VAR Byte ' Define la variable "I" como Byte

Pause 200 ' Pausa de 200 milisegundos para la LCD LCDOut $fe, 1 ' Limpia la LCD inicio: 298

For I=0 To 9 ' Repeticin de 0 a 9 SerOut PORTB.0, T9600, [I] ' Enva los datos por RB0 LCDOut $fe, 2,"Dato: ",#I ' Muestra dato por la LCD Pause 1000 ' Pausa de 1 segundo

Next I GoTo inicio ' Salta a inicio y reinicia el conteo End Programa para el circuito receptor: Symbol T9600 = 2 ' Dato verdadero (Driven True) dato var Byte ' Define la variable "dato" como Byte pause 500 ' Pausa de 500 milisegundos para la LCD LCDOut $fe, 1 ' Limpia la LCD inicio: SerIn PORTB.7, T9600, dato ' espera datos durante 1 ms LCDOUT $fe, 2,"Dato: ",#dato," " GoTo inicio ' Salta a inicio

End

Como podemos observar en los diagramas de los circuitos, los mdulos TXM418LR-S y RXM-418-LR-S conforman el medio a travs del cual viajan los datos, sustituyendo al cable, cuyas limitaciones son de apenas unos pocos metros cuando se requiere de comunicacin serial RS-232. 299

14.3.-Proyecto #40: Incorporando un teclado matricial al proyecto anterior, podemos enviar datos asignados a cada tecla. Circuito transmisor: Figura 14.7. 300

Circuito Receptor: Figura 14.8. 301

Proyecto # 40 Componente Cantidad PIC16F877A 1 PIC16F84A 1 Cristal de 4 Mhz 2 Capacitor cermico de 22 pF 4 Pantalla LCD 16x2 2 TXM-418-LR-S con antena 1 RXM-418-LR-S con antena 1 Resistencia de 1K Ohm Resistencia de 390 Ohm Resistencia de 750 Ohm 1 Resistencia de 10K Ohm 1 Potencimetro de 5K Ohm 2 Teclado Matricial 3x4 1 2Fuente regulada de 3.3 Vdc / 5 Vdc 2 4 Programa para el circuito transmisor con teclado matricial: Tabla 14.2. Symbol T9600 = 2 ' Dato verdadero (Driven True) TRISD = %01111000 ' Configuracin de Puerto D

pause 500 TECLA VAR Byte ' Declaracin de variable "Tecla" ' Pausa de 500 milisegundos para la LCD ' Limpia la LCD inicio: LCDOut $fe, 1Call teclado ' Llama a rutina de barrido de teclas PAUSE 100 ' Pausa de 1050 milisegundos SerOut PORTB.0, T9600, [TECLA] ' Enva dato por RB0 LCDOUT $fe, 2,"Dato: ",#TECLA ' Muestra dato por la LCD

302

GoTo inicio ' Salto a inicio teclado: PORTD.0 = 0 ' Columna 1 = 0 PORTD.1 = 1 ' Columna 2 = 1 PORTD.2 = 1 ' Columna 3 = 1 If If If If PORTD.3 PORTD.4 PORTD.5 PORTD.6 = = = = 0 0 0 0 Then Then Then Then TECLA TECLA TECLA TECLA = = = = 1 ' tecla "1" 4 ' tecla "4" 7 ' tecla "7" 10

PORTD.0 = 1 ' Columna 1 = 1 ' tecla "*" PORTD.1 = 0 ' Columna 2 = 0 PORTD.2 = 1 ' Columna 3 = 1

If If If If

PORTD.3 PORTD.4 PORTD.5 PORTD.6

= = = =

0 0 0 0

Then Then Then Then

TECLA TECLA TECLA TECLA

= = = =

2 5 8 11

' tecla ' tecla ' tecla ' tecla PORTD.0

"5" "8" "0" "2" = 1 ' Columna 1 = 1

PORTD.1 = 1 PORTD.2 = 0 ' Columna 3 = 0 ' Columna 2 = 1 If PORTD.3 = 0 Then TECLA = 3 ' tecla "3" ' tecla "6" ' tecla "9" ' tecla "#"

Return End If PORTD.4 = 0 Then

If PORTD.5 = 0 TECLA = 9 If PORTD.6 = 0 Then TECLA = 12 Then TECLA = 6 Se puede apreciar en la rutina de barrido del teclado que hemos asignado un valor especfico en cada condicin, es decir, si presionamos la tecla #1, el valor asignado a la variable TECLA ser igual a uno. Si presionamos la tecla #2, entonces la variable TECLA ser igual a dos, y as sucesivamente hasta la ltima tecla. 303

Cada vez que presionamos una tecla, el dato correspondiente a la misma es cargado y enviado al receptor el cual a su vez almacena este dato en una variable, e inmediatamente lo muestra en la pantalla LCD. Esta accin se puede apreciar en el cdigo de programa que se muestra a continuacin. Programa para el circuito receptor: Symbol T9600 = 2 ' Dato verdadero (Driven True) dato VAR Byte ' Define la variable "dato" como Byte

Pause 200 ' Pausa de 200 milisegundos para la LCD

LCDOut $fe, 1 ' Limpia la LCD inicio:

SerIn PORTB.7, T9600, dato ' Espera de datos LCDOUT $fe, 2,"Dato: ",#dato," " ' Salta a inicio GoTo inicio

End A partir de la etiqueta inicio se espera la llegada de los datos enviados desde el circuito transmisor. En este punto la instruccin SerIn mantiene al microcontrolador en espera, de tal manera que cuando llega un dato, ste se almacena en la variable correspondiente dato y seguidamente salta a la siguiente lnea, que en este caso corresponde a la instruccin LCDout la cual se encargar de mostrar el dato en la pantalla. Es importante resaltar que cuando el circuito transmisor es apagado, el mdulo receptor (RXM-418-LR-S) pierde sincrona y puede entregar datos errados o aleatorios al microcontrolador. Esto es un problema que puede ser corregido con unas pocas lneas de programacin como lo demostraremos en el siguiente proyecto. 304

14.4.-Proyecto #41: En este proyecto se plantea realizar un sistema de control a distancia que maneje ocho salidas de potencia en el circuito receptor, de tal manera que pueda ser encendida o apagada cualquiera de ellas al presionar el botn correspondiente en el teclado del circuito transmisor. Esto significa que al pulsar la tecla 1 , el estado de la salida 1 , el es tado de la salida correspondiente a esta tecla en el circuito receptor debe cambiar. Si la salida se encuentra en estado lgico cero, la misma debe cambiar a estado lgico uno y viceversa. Lo mismo debe aplicar para el resto de las salidas de potencia del circuito receptor. Para el circuito transmisor podemos emplear el mismo diagrama de la actividad anterior. Circuito transmisor: Figura 14.9. 305

Diagrama del circuito receptor: Figura 14.10. 306

Programa para el circuito transmisor con teclado matricial: Symbol T9600 = 2 ' Dato verdadero (Driven True) TRISD = %01111000 ' Configuracin de Puerto D TECLA VAR Byte ' Declaracin de variable "Tecla" Pause 200 ' Pausa de 200 milisegundos para la LCD LCDOut $fe, 1 ' Limpia la LCD inicio: Call teclado ' Llama a rutina de barrido de teclas. If tecla = 0 Then inicio ' Si TECLA = 0 ninguna tecla fue ' presionada y salta de nuevo a' la etiqueta inicio.

SerOut PORTB.0, T9600, [%10011001] ' Enva dato por RB0 ' Enva cdigo de confirmacin. PAUSE 200 SerOut PORTB.0, T9600, [TECLA] PAUSE 300 ' Pausa de 300 milisegundos LCDOUT $fe, 2,"Dato: ",#TECLA," " ' Muestra dato por la LCD GoTo inicio ' Salto a inicio

teclado: tecla = 0

PORTD.0 = 0 ' Columna 1 = 0PORTD.1 = 1 ' Columna 2 = 1 PORTD.2 = 1 ' Columna 3 = 1 If If If If PORTD.3 PORTD.4 PORTD.5 PORTD.6 = = = = 0 0 0 0 Then Then Then Then TECLA TECLA TECLA TECLA = = = = 1 ' tecla "1" 4 ' tecla "4" 7 ' tecla "7" 10 ' tecla "*"

PORTD.0 = 1 ' Columna 1 = 1 PORTD.1 = 0 ' Columna 2 = 0 PORTD.2 = 1 ' Columna 3 = 1

If PORTD.3 = 0 Then TECLA = 2 ' tecla "2" If PORTD.4 = 0 Then TECLA = 5 ' tecla "5"

If PORTD.5 = 0 Then TECLA = 8 ' tecla "8" 307

If PORTD.6 = 0 Then TECLA PORTD.0 = 1 ' Columna 1 = PORTD.1 = 1 ' Columna 2 = PORTD.2 = 0 ' Columna 3 = If PORTD.3 = 0 Then TECLA If PORTD.4 = 0 Then TECLA If PORTD.5 = 0 Then TECLA If PORTD.6 = 0 Then TECLA Return End

= 1 1 0 = = = =

11 ' tecla "0"

3 ' tecla "3" 6 ' tecla "6" 9 ' tecla "9" 12 ' tecla "#"

En el programa del circuito transmisor se pueden observar algunas mejoras. A partir de la etiqueta inicio se puede observar que no se envan datos al receptor a menos que se presione una tecla. Si una tecla es presionada, entonces enviamos un cdigo elegido al azar al receptor (Ej. 10011001), para indicar que el siguiente dato corresponde al de la tecla presionada. De esta manera evitaremos observar datos errados en la pantalla LCD del circuito receptor, ya que su programa ha sido diseado para que solo cambie el estado lgico de las salidas de potencia, solo si recibe el cdigo correcto enviado desde el circuito transmisor. Programa para el circuito receptor: TRISD = %00000000 Symbol T9600 = 2 ' Dato verdadero (Driven True) dato VAR Byte ' Define la variable "dato" como Byte salida VAR Byte

' Pausa de 500 milisegundos para la LCD LCDOut $fe, 1 ' Limpia la LCD PORTD = 0 ' Inicializamos el puerto D inicio: Pause 500 SerIn PORTB.7, T9600, dato ' Espera datos. If DATO = %10011001 Then sigue ' Salta a la etiqueta "sigue" 308

' si se recibe el cdigo correcto ' que hemos elegido (10011001) GoTo inicio ' Salto a inicio. sigue: SerIn PORTB.7, T9600, dato ' espera datos durante 1 ms

If dato = 1 Then Toggle PORTD.0 ' Invierte el Bit en RD0 If dato = 2 Then Toggle PORTD.1 ' Invierte el Bit en RD1 If dato = 3 Then Toggle PORTD.2 ' Invierte el Bit en RD2 If dato = 4 Then Toggle PORTD.3 ' Invierte el Bit en RD3 If dato = 5 Then Toggle PORTD.4 ' Invierte el Bit en RD4 ' Invierte el Bit en RD6' Invierte el Bit en RD5 If dato = 6 Then Toggle PORTD.5 If dato = 7 Then Toggle PORTD.6 If dato = 8 Then Toggle PORTD.7 ' Invierte el Bit en RD7

LCDOUT $fe, 2,"Salida #: ",#dato," GoTo inicio ' Salta a inicio " ' Muestra dato en LCD End

309

Instrucciones de programa de PicBasic Captulo XV @ Sintaxis: @ instruccin en lenguaje ensamblador Esta instruccin es utilizada para insertar dentro del cdigo PicBasic, lneas de programa en lenguaje ensamblador. En este caso, cada lnea en lenguaje Ejemplo: Led Var Byte ensamblador debe llevar el smbolo @ al inicio. ' Declaracin de Variable Led TRISB = $00 ' Configura el puerto B como salida Led = $00 ' Inicializamos la variable Led Inicio: @ @bcf PORTB GoTo = Led Inicio _Led,0 bsf _Led,0 ' pone en 1 el bit 0 de la variable Led Pause 1000 ' Pausa de 1 segundo PORTB = Led

' Saca dato por el puerto B Pause 1000 ' ' ' ' Pausa de 1 segundo pone en 0 el bit 0 de la variable Led Saca dato por el puerto B Salto a inicio

End Nota Importante: para acceder a una variable declarada en PicBasic, desde el lenguaje ensamblador se debe anteponer el smbolo _ (Guin bajo), ya que de lo contrario no ser posible el acceso a sta. En el ejemplo, se puede

ver que para acceder a la variable Led desde el lenguaje ensamblador, se antepuso el guin bajo a la variable, quedando _Led . 310

ADCin Sintaxis: ADCin canal, Variable Lee una entrada del conversor A/D y el resultado es almacenado en una variable. Esta instruccin solo es vlida para microcontroladores que tienen convertidor A/D, por ejemplo, el PIC16F877, el PIC18F442, el PIC18F452, el PIC18F458 entre otros. Asm EndAsm

Sintaxis: Asm * * * * EndAsm Instrucciones en lenguaje ensamblador Esta instruccin permite insertar un conjunto de instrucciones en lenguaje ensamblador y al igual que en la instruccin @ , tambin aplica el uso del smbolo _ (Guin Bajo), el cual debe anteceder a las variables que se deseen utilizar. 311

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 etique ta 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. Ejemplo: I var Byte ' Declaracin de Variable I TRISB = $00 ' Inicializa el puerto B' Configura el puerto B como salida PORTB = $00

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 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 312

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 15.1). +5V Al Pin S1 R1 10 Kohm R1 10 Kohm S1 Pulsador +5V Pulsador Al Pin Activo-Bajo Activo-Alto

Figura 15.1. 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 antirebote pero no permite la auto-repeticin. Rango: es una variable o constante (0 ciclos entre auto-repeticiones. 313 255) que especifica el nmero de

' Configuracin del puerto B ' Configuracin del puerto B 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. Etiqueta: la instruccin realiza un salto a la etiqueta definida en este campo cuando el pulsador no ha sido presionado. Ejemplo: TRISB = %11111101

A0 Var Byte ' declaracin de la variable A0 Lcdout $fe,1 A0 = 0 inicio: ' inicializa la variable A0 Button PORTB.0,1,2,2,A0,0,NoPres PulsOut PORTB.1,150 NoPres:

Pause 10 GoTo inicio ' Salta a inicio

End

314

Call Sintaxis: Call etiqueta La instruccin

Call , llama a una subrutina la cual est identificada con una

etiqueta, y una vez culminada la subrutina la cual contiene al final la instruccin Return , vuelve a la siguiente lnea despus del llamado. Ejemplo: inicio:

Call Teclado If A0 = 1 Then led1 . . . Teclado: . . . . Return End

Clear Sintaxis: Clear La instruccin Clear inicializa todos los registros de la RAM a cero, es decir, todas las variables simultneamente pasarn a ser cero. 315

ClearWDT Sintaxis: ClearWDT La instruccin Count Sintaxis: ClearWDT inicializa el Perro Guardin (Watchdog Timer).

Count pin, duracin, variable La instruccin Count puede medir la de una seal simple PinCount. DuracinVariable: es una variable definida por el programador en la cual se grabar el resultado del conteo. sobre el pin especificado. : es el tiempo durante el cual se realizar el conteo de impulsos pin es designado como entrada automticamente por la instruccin : especifica el pin del puerto en el cual se introducirn los impulsos. Este frecuencia mxima a ser medida ser de 125 khz. de hasta 25 khz con un oscilador de 4 MHz. Para un oscilador de 20 MHz la determinando el nmero de pulsos por segundo. Se pueden medir frecuencias frecuencia 316

puerto cualquiera del microcontrolador. puerto cualquiera del microcontrolador. Data Sintaxis: Data {@Direccin inicial}, constante1, constante2, constanteN La instruccin Data solo puede ser utilizada para las familias arquitectura. de microcontroladores que incorporan memoria EEPROM en su Para los microcontroladores que no cuentan con esta memoria, existe la Ejemplo: Data @10,1,3,5,7,9 de comunicacin I2C. Bsicamente esta instruccin guarda varias constantes a partir de una direccin que especificamos en el campo correspondiente. posibilidad de agregar una memoria EEPROM externa a travs del protocolo En este ejemplo, la instruccin almacenar los valores 1, 3, 5, 7 y 9 en Data las direcciones de memoria 10, 11, 12, 13 y 14 respectivamente. DTMFout Sintaxis: DTMFout pin, {On-ms, Off-ms}, [tono, tono,...tono] La instruccin DTMFout genera tonos DTMF en secuencia y a travs de un Pin: especifica el pin del puerto en el cual se emitirn los tonos DTMF. On-ms: es una variable, constante o expresin 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. 317

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 por defecto ser de 50 ms. Tono: puede ser una variable o constante (entre 0 tono que debe ser generado. 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 15.1. 318 15), que especifica el

PortC.0, [0,1,2,3,4,5,6,7,8,9] Figura 15.2. Ejemplo: DTMFout Conectando el pin de salida (RC0) adecuadamente a una lnea telefnica, estaremos marcando sin problemas un nmero telefnico. En algunos casos es utilizar los tiempos On-ms y Off-ms para realizar un marcado ms exacto. recomendable Ejemplo: DTMFout PortC.0,400,150, [6,4,3,8,7,1,0] 319

Los tonos tendrn una duracin de 400 milisegundos cada uno y un tiempo en silencio entre ellos de 150 milisegundos. En cuanto al oscilador se recomienda usar del tipo HS (desde 10 Mhz o superior) para obtener mejores resultados en la generacin de tonos DTMF, as como tambin se recomienda utilizar un circuito de acople entre el microcontrolador y el dispositivo externo al cual enviaremos los tonos. C2 0.1 uF R1 1K R2 1K GND C1 0.1 uF Al amplif icador de Audio Al Pin GND C1 Al Pin GND Parlante C2 10 uF 10 uF Figura 15.3. 320

EEPROM Sintaxis: EEPROM direccin,[constante1, constante2, .constanteN] La instruccin EEPROM es capaz de almacenar datos en la memoria de con datos de un microcontrolador siempre y cuando ste cuente esta caracterstica y a partir de la direccin indicada, almacena constantes especficas en las posiciones consecutivas a la inicial. grabaciones de Es importante resaltar que los datos solo son almacenados al momento de grabar el microcontrolador en nuestro programador para microcontroladores PIC, por lo tanto, para realizar lecturas o nuevos datos durante la ejecucin de un programa se debe recurrir a las instrucciones Read y Write. END Sintaxis: End La instruccin END detiene la ejecucin de un programa y pone el microcontrolador en bajo consumo de energa. FREQOUT

Sintaxis: FreqOut pin, On-ms, Frecuencia1, Frecuencia2 La instruccin FreqOut genera una o dos seales de frecuencia entre 0 y 32767 Hz previamente definidas, durante un perodo de tiempo tambin definido. 321

Pin: especifica el pin del puerto en el cual se va a generar la seal. On-ms: Es una variable o constante que determina el tiempo de duracin de la seal. Frecuencia1: puede ser una variable o constante (entre 0 especifica la frecuencia del primer tono. 32767) que

Frecuencia2: puede ser una variable o constante (entre 0 32767) que especifica la frecuencia del segundo tono, el cual sale mezclado con la frecuencia 1. En cuanto al oscilador tambin se recomienda usar del tipo HS (20 Mhz) para obtener mejores resultados en la generacin de tonos, as como tambin se entre el recomienda utilizar un circuito de acople microcontrolador y el dispositivo externo al cual enviaremos los tonos (ver figura 15.3). Ejemplo: FreqOut PortC.2, 1000, 2000 Genera un tono de 2000Hz durante 1 segundo. FreqOut PortC.2, 1000, 1500, 3500 Genera dos tonos a la vez durante 1 segundo, uno de 1500Hz y otro de 3500Hz. 322

FOR NEXT Sintaxis: For variable = inicio to final {step {-} incremento} * * Instrucciones

* Next {variable} La instruccin For Next 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. Ejemplo: Z Var Byte ' Declaracin de la Variable Z Inicio: For Z=0 To 10 PORTD.0 = 1

' Pone en 1 el pin RD0 Pause 1000 ' Pausa de 1 segundo ZNext Pause 1000 PORTD.0 = 0 ' Pone en 0 el pin RD0 ' Pausa de 1 segundo

End 323

Gosub Sintaxis: Gosub etiqueta La instruccin Gosub etiqueta la ejecuta subrutinas dentro de un programa principal donde la ubicacin de las mismas estar definida por correspondiente. Una vez ejecutada la subrutina y encontrada la instruccin Return, la ejecucin del programa contina en la lnea siguiente a la instruccin Gosub. GOTO Sintaxis: La instruccin Goto contina la ejecucin de un programa a partir de la etiqueta especificada. Esta instruccin no tiene retorno. GOTO etiqueta HIGH Sintaxis: HIGH pin La instruccin High pone en uno lgico el pin especificado, el cual configura automticamente como salida. Ejemplo: Inicio: HIGH PORTA.0 ' Pone en 1 el pin RA0 324

I2Cread SDA, SCL, Control, Direccin, [dato], {etiqueta de salto opcional} GoTo inicio End I2CREAD Sintaxis: La instruccin I2Cread un dispositivo conectado a un bus I2C y almacenar el dato obtenido en una enviar el dato de control y la direccin especfica a variable definida. Al utilizar la etiqueta opcional, el programa saltar si no se recibe ninguna respuesta del dispositivo consultado. Ejemplo: SDA VAR PORTB.0 SCL VAR PORTB.1 A1 VAR Byte Direc VAR Word Control VAR Byte Pause 500 ' Pause de 500 milisegundos

LCDOut $fe, 1

' Limpia la LCD

inicio: Direc = $10 ' Direccin en la memoria externa

Control = $A0 ' Dato de Control I2CREAD SDA, SCL, Control, Direc, [A1] ' Lectura de

' memoria

LCDOUT $fe, 2,"Dato: ",#A1 ' Muestra el dato ledo

ciclo: GoTo ciclo

End 325

I2CWRITE Sintaxis: I2CWrite SDA, SCL, Control, Direccin, [dato], {etiqueta de salto opcional} La instruccin I2CWrite enviar el dato de control y la direccin en la cual se almacenar el dato cargado en la variable previamente cargada. Ejemplo: SDA VAR PORTB.0 SCL VAR PORTB.1 Direc var Word Control Var Byte

inicio: Direc = $10 ' Direccin en la memoria externaControl = $A0 ' Dato de Control I2Cwrite SDA, SCL, Control, Direc, [$21] ' Escribe la ' memoria pause 10 ' Pausa de 10 milisegundos Loop: GoTo Loop End

IF THEM ELSE Sintaxis: If expresin 1 {AND / OR expresin 2} Then etiqueta Con la instruccin If Them podemos seleccionar uno, dos o mas posibles comportamientos de programa, tomando decisiones en una estructura de programacin sencilla y la cual ser considerada casi en la totalidad de los programas. 326

Ejemplo 1: Si pulsamos un botn conectado al pin RA0 se cumple la condicin y salta a la etiqueta Espera . inicio: Input PORTA.0 ' Designa el PIN RA0 como entrada

If PORTA.0 = 1 Then Espera ' Si RA0 = 1 salta a la etiqueta GoTo inicio ' Salta a "inicio" si RA0 = 0 Espera: GoTo Espera

End Ejemplo 2: inicio: Input PORTA.0 If PORTA.0 = 1 Then ' Designa el PIN RA0 como entrada ' Si RA0 = 1 ... GoTo Espera ' salta a la etiqueta "Espera" Else

' de lo contrario... GoTo inicio ' salta a la etiqueta "inicio" EndIf ' Fin de la instruccin IF-Them-Else Espera:

GoTo Espera End Solo se utiliza de decisin. 327

EndIf cuando deseamos tener ms de una condicin o toma

Ejemplo 3: A VAR Byte inicio: Input PORTA.0 ' Designa el PIN RA0 como entrada If PORTA.0 = 1 Then

A=A+1 If A = 10 Then Espera ' Si A = 10 salta a la etiqueta Espera EndIf GoTo inicio Espera: GoTo Espera End

' Salta a "inicio" INPUT Sintaxis: INPUT PIN

Designa un pin especfico como entrada. Ejemplo: inicio: Input PORTA.0 ' Designa el PIN RA0 como entrada Espera: GoTo Espera End 328

LCDIN Sintaxis: LCDin direccin, [variable1, variable2, ] La instruccin LCDin carga el dato almacenado en una memoria RAM de la LCD en una variable previamente definida. de la direccin Ejemplo: A VAR Byte inicio: LCDIn $10,[A] Espera: GoTo Espera End ' y lo carga en la variable "A". ' Lee el dato en la direccin de memoria $10 329

LCDout Sintaxis: LCDout comando, dato La instruccin LCD Alfanumrica para que puedan ser mostrados en la misma. pantalla Comando Accin $FE, 1 Limpia la pantalla $FE, 2 Retorna al inicio de la primera lnea $FE, $0C Apaga el Cursor $FE, $0E Cursor bajo (Underline "_ $FE, $0F Cursor intermitente activo $FE, $10 $FE, $14 $FE, $C0 $FE, $90 $FE, $D0 Mueve el cursor al inicio de la tercera lnea Mueve el cursor al inicio de la cuarta lnea Mueve el cursor al inicio de la segunda lnea Mueve el cursor un espacio a la derecha Mueve el cursor un espacio a la izquierda ") activo Tabla 15.2. Ejemplo: Pause 200 LCDOut $fe, 1 ' Limpia la pantalla LCDOut $fe, 2 ' Posiciona el cursor en el inicio LCDOut "* Pantalla LCD *" ' escribe LCDOut $fe,$C0, "* Alfanumerica *" LCDOut $fe,$90, "* 1234567890 *" LCDOut $fe,$D0, "* AaBbCcDdEeFf *" Lcdout enva datos especficos a una

Inicio: GoTo Inicio End 330

LOW Sintaxis: LOW pin La instruccin Ejemplo: inicio: Low PORTA.0 espera: GoTo espera End

LOW

coloca en cero lgico un pin especfico.

' configura RA0 = 0 NAP Sintaxis: NAP periodo La instruccin NAP pone el microcontrolador en modo de bajo consumo de energa por periodos de tiempo definidos en la siguiente tabla: 331

Periodo Retardo (ms) 0 18 1 36 2 72 3 144 4 288 5 576 6 1152 7 2304 Tabla 15.3. Ejemplo: inicio: NAP 6 espera: GoTo espera End OUTPUT ' Bajo consumo de energa durante 1152 milisegundos OUTPUT pin Sintaxis: La instruccin Ejemplo: inicio: OUTPUT configura un pin especfico como salida.

OUTPUT PORTA.0 ' configura RA0 como salida espera: GoTo espera End 332

un periodo PAUSEUS periodo PAUSE Sintaxis: PAUSE periodo La instruccin Pause

realiza una pausa en el programa por

definido en milisegundos. Esta instruccin no pone al microcontrolador en modo de bajo consumo de energa. Ejemplo:

' Pausa de 1 segundo inicio: High PORTA.0 ' RA0 = 1 Pause 1000 Low PORTA.0 ' RA0 = 0 Pause 1500 GoTo inicio ' Salta a la etiqueta "inicio" ' Pausa de 1.5 segundos End PAUSEUS Sintaxis:

La instruccin PauseUs realiza una pausa en el programa por un periodo definido en microsegundos. Esta instruccin no pone al microcontrolador en modo de bajo consumo de energa. Ejemplo: 333

inicio: High PORTA.0 ' RA0 = 1 PauseUs 200 ' Pausa de 200 microsegundos Low PORTA.0 ' RA0 = 0 PauseUs 1500 ' Pausa de 1.5 milisegundos GoTo inicio ' Salta a la etiqueta "inicio" End

La instruccin POT lee un potencimetro, foto celda, termistor, o cualquier POT Sintaxis: POT pin, escala, variable otro dispositivo capaz de variar su valor resistivo. Bsicamente esta instruccin calcula el tiempo de descarga del condensador C1 el cual vara segn el valor resistivo presente en la resistencia variable. Pin: especifica el pin del puerto en el cual se va a conectar el potencimetro. Escala: Es una variable o constante que aumenta o disminuye el rango de lectura en un porcentaje determinado. Esta escala es utilizada para ajustar el rango de salida en la lectura del dispositivo, y es afectada directamente por las constantes RC. El valor de la escala ser correcto cuando el valor cargado en la variable se aproxime a cero, cuando la resistencia medida sea mnima; y tambin cuando el valor de la variable se aproxime a 255, cuando la resistencia medida sea mxima. Variable: es una variable en la cual se almacena el resultado obtenido de la lectura del potencimetro o componente resistivo. 334

PULSIN Sintaxis: PULSIN pin, nivel, variable La instruccin PULSIN mide la duracin de un pulso alto o bajo con una resolucin de 10 microsegundos para un oscilador de 4 Mhz y el valor obtenido es almacenado en una variable definida de 8 bits (variable tipo byte) o 16 bits (variable tipo Word). Pin: especifica el pin del puerto en el cual se introducirn los pulsos. Nivel: define si la medicin se hace en nivel alto o bajo. (1 = alto, 0 = bajo). Variable: es una variable de 8 bits (variable tipo byte) o 16 bits (variable tip o word) definida por el programador en la cual se grabar el resultado de la lectura. Ejemplo: Define OSC 4 ' Define el oscilador en 4 Mhz

LECTURA VAR Word ' Definicin de variable de 16 bits Pause 200 ' Pausa de 200 milisegundos LCDOut $fe, 1 ' Limpia la pantalla Inicio:

LECTURA = 0 ' Inicializa la variable PulsIn PORTB.0,1,LECTURA LCDOut $fe, 2 ' Posiciona el cursor en el inicio LCDOut "Lect. en ms:",#LECTURA," " ' Muestra mensaje y ' dato por pantalla Pause 1000 ' Pausa de 1 segundo GoTo Inicio ' Salta a inicio End 335

PULSOUT Sintaxis: PULSOUT pin, nivel, variable La instruccin PULSOUT genera pulsos con una en decenas de microsegundos. para un oscilador de 4 Mhz). Ejemplo: duracin (Tiene una resolucin de 10 microsegundos definida DEFINE OSC 4 Inicio: PulsOut PORTB.0,100 ' duracin o 100 decenas de uS. ' Genera un pulso de 1 milisegundo de ' Define el oscilador en 4 Mhz Pause 1 ' Salto a inicio' Pausa de 1 milisegundo. GoTo Inicio End PWM Sintaxis: PWM pin, nivel, ciclo enva pulsos PWM (Pulse Width Modulation) a un pin PWM especfico. La instruccin 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 anc ho de pulso positivo se incrementa hasta nivel = 254 donde el ciclo de trabajo es 336

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. Ejemplo: DEFINE OSC 4 ' Define el oscilador en 4 Mhz Inicio:

PWM PORTB.0,127,100 ' Seal PWM GoTo Inicio ' Salto a inicio

End

RANDOM

Sintaxis: RANDOM variable La instruccin RANDOM almacena nmeros aleatorios en una variable de 16 Bits (Word). Ejemplo: A0 VAR Word Inicio: Random A0 ' Declaracin de variable "A0" Word (16 Bits) ' Pausa de 200 milisegundos ' Limpia la pantalla ' Almacena un nmero aleatorio en A0 337 Pause 200 LCDOut $fe, 1

LCDOut $fe, 2 ' Posiciona el cursor en el inicio LCDOut "RANDOM: ",#A0," " ' Muestra mensaje y ' dato por pantalla Pause 1500 ' Pausa de 1.5 segundos GoTo Inicio ' Salto a inicio End READ

Sintaxis: READ direccin, variable

La instruccin READ permite leer datos desde la memoria EEPROM de datos de un microcontrolador almacenndolos en una variable previamente definida. Ejemplo: ' Declaracin de Variables:

I VAR Byte DIRECCION VAR Byte DATO VAR Byte

WRITE 1, 3

' Escribe en la memoria de datos WRITE 2, 5 ' Escribe en la memoria de datos WRITE 3, 7 ' Escribe en la memoria de datos WRITE 4, 9 ' Escribe en la memoria de datos WRITE 5, 11 ' Escribe en la memoria de datos DIRECCION = 1 ' Direccin inicial de lectura Pause 200 ' Pausa de 200 milisegundos LCDOut $fe, 1 ' Limpia la pantalla Inicio: For I = 1 To 5 ' Repite la lectura cinco veces 338

Read DIRECCION,DATO ' Lee la direccin especificada y la ' guarda en la variable "Dato". LCDOut $fe, 2 ' Posiciona el cursor en el inicio LCDOut "Direccion: ",#DIRECCION," " ' Muestra direccin LCDOut $fe,$C0, "Dato: ",#DATO," " ' Muestra el dato ledo DIRECCION = DIRECCION + 1 ' Suma uno (1) a la variable Pause 1500 ' Pausa de 1.5 segundos Next I End RETURN Sintaxis: RETURN Retorno de una subrutina desde donde se ha generado un salto del tipo Call o Gosub. Ejemplo: inicio:

Call Teclado

If . A0=1 Then led1 .

. Teclado: . . . . Return

End 339

' Declaracin de Variables I VAR Byte Z VAR Byte Pause 200 ' Pausa de 200 milisegundos LCDOut $fe, 1 ' Limpia la pantalla 340 REVERSE Sintaxis: REVERSE pin La instruccin REVERSE cambia el estado de un pin I/O, es decir, si el pin es entrada, ste pasa a ser salida. Si un pin es salida , ste pasa a ser entrada. Ejemplo: TRISB = %00000000 ' salida. Inicio: High PORTB.5 ' RB5 = 1 Pause 1000 ' Pausa de 1 segundo ' Configura los pines del puerto B como Low PORTB.5 ' RB5 = 0 Reverse PORTB.5 ' RB5 ahora es entrada End SELECT CASE Sintaxis: variable SELECT CASE La instruccin SELECT CASE Ejemplo: entre un nmero determinado de subrutinas. es un condicional que permite seleccionar

Z=0 ' Inicializa la variable Z Inicio: Z=Z+1 ' Incrementa la variable Z If Z=4 Then Final ' Si Z = 4 salta a la etiqueta "Final"

Select Case Z ' Condicional Select Case para la' variable Z.

Case 1 LCDOut $fe, 2 ' Posiciona el cursor en el inicioLCDOut "Select Case 1" ' Muestra mensaje por la LCD Pause 1500 ' Pausa de 1.5 segundos GoTo Inicio ' Salto a inicio Case 2

LCDOut $fe, 2 ' Muestra mensaje por la LCD' Posiciona el cursor en el inicio LCDOut "Select Case 2" Pause 1500 ' Pausa de 1.5 segundosGoTo Inicio ' Salto a inicio

Case 3 LCDOut $fe, 2 ' Posiciona el cursor en el inicio ' Muestra mensaje por la LCD

Pause 1500 LCDOut "Select Case 3" ' Pausa de 1.5 segundos GoTo Inicio

' Salto a inicio

End Select

Final: GoTo Final End 341

SERIN Sintaxis: SERIN pin, modo,{tiempo, etiqueta}, variable La instruccin SerIn se encarga de recibir uno o mas valores a travs de un pin especfico usando el formato asncrono estndar 8N1 que significa 8 bits de datos, sin revisin de paridad y 1 bit de parada (stop). SerIn trabaja por defecto con un oscilador de 4 Mhz y para tener una transferencia de datos necesario segura con otros osciladores de mayor valor, ser utilizar la directiva Define Osc al inicio del programa. Pin: en este campo definiremos cual ser el pin de entrada entre los puertos disponibles del microcontrolador. Ejemplo: PortB.1 Modo: define la velocidad de transmisin en baudios. Tiempo: este campo es opcional al igual que el campo etiqueta y su objetivo es establecer un tiempo en milisegundos definido por el programador, el cual una vez vencido, har que se realice un salto a la etiqueta tambin definida por el programador. Variable: almacenados los datos recibidos. en este campo se especifica la variable en la cual se desea sean Ejemplo: Symbol T9600 = 2 ' Dato verdadero (Driven True)

Pause 500 dato var Byte ' Define la variable dato ' Pausa de 500 milisegundos para la LCD

como Byte

LCDOut $fe, 1 ' Limpia la LCD Inicio: SerIn PORTC.7, T9600, dato ' espera datos durante 1 ms 342

LCDOUT $fe, 2,"Dato: " LCDOut $fe,$C0,#dato," " GoTo Inicio ' Salta a inicio End SEROUT Sintaxis: SEROUT pin, modo, [variable] La instruccin SerOut se encarga de enviar uno o mas valores a travs de un pin especfico usando el formato asncrono estndar 8N1 que significa 8 bits de datos, sin revisin de paridad y 1 bit de parada (stop). Pin: en este campo definiremos cual ser el pin de salida entre los puertos disponibles del microcontrolador. Modo: define la velocidad de transmisin en baudios y emplea la misma tabla de la instruccin SerIn. Variable: en este campo se especifica la variable que contiene los datos que sern enviados a travs de pin especificado. Ejemplo: Symbol = 2 T9600 ' Dato verdadero (Driven True)

I VAR Byte ' Define la variable

como Byte

Inicio: For I=0 To 9 ' Repeticin de 0 a 9 SerOut PORTC.6, T9600, [#I] ' # enva los datos en ASCII Pause 1000 ' Pausa de 1 segundo Next I 343

GoTo Inicio ' Salta a inicio End SLEEP Sintaxis: SLEEP perodo Ejemplo: Inicio: Sleep 10 Espera: GoTo Espera End ' Salta a la etiqueta "Espera" SWAP Sintaxis: variable, variable SWAP La instruccin SWAP intercambia el contenido de dos variables. La instruccin SLEEP ' Bajo consumo de energa durante 10 segundos microcontrolador por un perodo de tiempo definido en segundos. lleva a un estado de bajo consumo de energa a un Ejemplo: A1 VAR Byte ' Define la variable "A1" como Byte B1 VAR Byte ' Define la variable "B1" como Byte 344

A1 = 10 B1 = 15 Pause 200 ' Pausa de 200 milisegundos para la LCD LCDOut $fe, 1 ' Limpia la LCD Inicio:

Swap A1,B1 ' Intercambia datos entre variables LCDOUT $fe, 2,"A1: ",#A1 ' Muestra variable A1 por la LCD

LCDOut $fe,$C0,"B1: ",#B1 ' Muestra variable B1 por la LCD Espera: GoTo Espera ' Salta a la etiqueta "Espera" End TOGGLE Sintaxis: TOGGLE pin La instruccin TOGGLE invierte el estado lgico de un pin especfico, es lgico (1) y viceversa. decir, si un pin se encuentra en estado lgico cero (0), ste pasa a ser uno Ejemplo: High PORTA.0 ' Pone en uno (1) RA0 Inicio: Toggle PORTA.0 ' invierte el estado lgico de RA0 Pause 1000 ' Pausa de 1 segundo 345

GoTo Inicio ' Salto a inicio End WHILE-WEND Sintaxis: WHILE condicin ...instrucciones... WEND La instruccin WHILE WEND mantiene la ejecucin de las instrucciones involucradas, es decir, entre While y Wend, hasta que se cumpla la condicin establecida. Ejemplo: A VAR Byte ' Declaracin de variable "A"

A=0 ' Inicializa la variable "A"

Pause 200

' Pausa de 200 milisegundos para la LCD LCDOut $fe, 1

' Limpia la LCD Inicio:

While High PORTB.0 A < 5 ' Condicional While -Wend ' RB0 = 1 Pause 1000 ' Pausa de 1 segundo Low PORTB.0 ' RB0 = 0 PAUSE 1000 ' Pausa de 1 segundo A=A+1 ' incrementa en uno (1) la variable "A"

Wend 346

LCDOUT $fe, 2, "While -Wend" ' Muestra mensaje LCDOut $fe,$C0,"ha terminado!" ' Muestra mensaje Espera: GoTo Espera ' Salta a la etiqueta "espera" End

WRITE Sintaxis: WRITE direccin, variable La instruccin WRITE almacena datos en la memoria EEPROM de un microcontrolador en una direccin especfica. Ejemplo: Inicio: WRITE 1, $03 WRITE 2, $A1 ' Escribe en la direccin 2 o $02 el dato $A1 ' Escribe en la direccin 1 o $01 el dato $03 WRITE 3, 7 ' Escribe en la direccin 3 o $03 el dato $07 WRITE 9, 13 ' Escribe en la direccin 9 o $09 el dato $0D WRITE 5, $F0 ' Escribe en la direccin 15 o $0F el dato $0F espera:

GoTo espera End

347

Apndice A Programador de Microcontroladores PIC Existe una gran diversidad de programadores para microcontroladores PIC los consideramos cuales puede adquirir en tiendas de electrnica OnLine o en su proveedor local de componentes electrnicos. Sin embargo, una excelente experiencia llevar a cabo la construccin de su propio programador por lo cual le proponemos uno de los ms populares y prcticos, capaz de programar una gran variedad de modelos de microcontroladores PIC, de muy bajo costo y fcil construccin. Recomendamos P16Pro, programador de microcontroladores desarrollado por Bojan Dobaj de Slovenia, cuyo sitio oficial en la red es http://www.picallw.com. Figura A.1. 348

Download . Una vez vez Software: Descargue el software en su ltima versin en el sitio Web http://www.picallw.com, en la seccin denominada descargado el archivo, se precede a descomprimir el mismo para luego iniciar la instalacin del software haciendo doble clic sobre el archivo ejecutable que ha resultado disponible, denominado Setup.exe A continuacin se muestran las pantallas que se generan en el proceso de instalacin del software: La figura A.2 muestra el inicio del proceso de instalacin del software. Figura A.2. El instalador le mostrara un mensaje de bienvenida en el cual deber seleccionar la opcin NEXT para continuar con la instalacin (Figura A.3). 349

disco duro. A.4). La ruta propuesta por defecto es C:\Picall (Figura La ruta propuesta por defecto es C:\Picall (Figura Figura A.3. Luego deber indicar la ruta de instalacin del software en el Figura A.4. En la siguiente pantalla, el programa instalador le sugiere un nombre para el icono o acceso al programa en la barra de inicio de Windows (Figura A.5). 350

Figura A.5. Al hacer clic en el Install botn (Figura A.6), empieza la instalacin de archivos para finalmente completar el proceso haciendo clic en el botn Finish (Figura A.7). Figura A.6. 351

Figura A.7. Configuracin del Software Picall/P16Pro PIC: Para dar inicio al software Picall/P16Pro, haga clic en el men Windows Picall Picall v0.16. Inmediatamente se despliega la ventana de la figura A.9. Figura A.8. 352 Inicio de

Figura A.9. Figura A.9. Antes de comenzar a programar cualquier microcontrolador, se debern seleccionar ciertos parmetros importantes en el software. Estos parmetros son los que mencionamos a continuacin. 353

Tipo de programador: El programador se identifica en el software como P16PRO y usted deber seleccionarlo en el campo correspondiente como se muestra en la Figura A.10. Figura A.10. 354

Modelo del microcontrolador: En el siguiente paso se deber seleccionar el modelo de microcontrolador que desea programar. Figura A.11. Otro punto importante a verificar ser el puerto seleccionado, el cual deber estar en LPT Port = Auto. Esta opcin se encuentra en el men Settings . 355

El software tambin cuenta con ayuda visual para saber la posicin exacta del Figura A.12. El software tambin cuenta con ayuda visual para saber la posicin exacta del Figura A.12. microcontrolador en la base del programador, como se muestra en la figura A.13. Notar que al cambiar el modelo de microcontrolador a ser programado, la figura cambia irreversibles en el dispositivo. indicando la posicin adecuada para evitar daos 356

Figura A.13. 357

Apndice B Tabla ASCII ASCII Control Characters Decimal Hex ASCII Function Key 0 0 NUL (null) Ctrl-@ 1 1 SOH (start of heading) Ctrl-A 2 2 STX (start of text) Ctrl-B 3 3 ETX (end of text) Ctrl-C 4 4 EOT (end of transmission) Ctrl-D 5 5 ENQ (enquiry) Ctrl-E 6 6 ACK (acknowledge) Ctrl-F 7 7 BEL (bell) Ctrl-G 8

8 BS (backspace) Ctrl-H 9 9 HT (horizontal tab) Ctrl-I 10 A LF (line feed) Ctrl-J 11 B VT (vertical tab) Ctrl-K 12 C FF (form feed) Ctrl-L 13 D CR (carriage return) Ctrl-M 14 E SO (shift out) Ctrl-N 15 F SI (shift in) Ctrl-O 16 10 DLE (data link escape) Ctrl-P 17 11 DC1 (device control 1) Ctrl-Q

18 12 DC2 (device control 2) Ctrl-R 19 13 DC3 (device control 3) Ctrl-S 20 14 DC4 (device control 4) Ctrl-T 21 15 NAK (negative acknowledge) Ctrl-U 22 16 SYN (synchronous idle) Ctrl-V 23 17 ETB (end of trans. block) Ctrl-W 24 18 CAN (cancel) Ctrl-X 25 19 EM (end of medium) Ctrl-Y 26 1A SUB (substitute) Ctrl-Z 27 1B

ESC (escape) Ctrl-[ 28 1C FS (file separator) Ctrl-\ 29 1D GS (group separator) Ctrl-] 30 1E RS (record separator) Ctrl-^ 31 1F US (unit separator) Ctrl-_

Tabla B.1. Fuente: http://www.melabs.com/resources/pbpmanual/ 358

Caracteres ASCII Standard DecimalHexDisplay/Key3220Space3321! 3422" 3523# 3624$ 3725% 3826& 3927' 4028( 4129) 422A* 432B+ 442C, 452D462E. 472F/ 4830049311503225133352344533555436655377563885739583A: 593B; 603C< 613D= 623E> 633F? DecimalHexDisplay/Key6440@ 96541A6642B6743C6844D6945E7046F7147G7248H7349I744AJ754BK764CL774DM784EN794FO8050 P81518252R8353S8454T8555U8656V8757W8858X8959Y905AZ915B[ 925C\ 935D] 945E^ 955F_ DecimalHexDisplay/Key9660` 9761a9862b9963c10064d10165e102661036710468105i1066Aj1076Bkl1096Dm1106En1116Fo112 70p11371q11472r11573s11674t11775u11876v11977w12078x12179y1227Az1237B{ 1247C| 1257D} 1267E~ 1277FDEL69fh1086CQg Tabla B.2. Fuente: http://www.melabs.com/resources/pbpmanual/ 359

Apndice C Software y Practicas en Formato Digital 360

Se pueden obtener los archivos digitales de cada uno de los proyectos planteados en esta obra (archivo fuente cada proyecto y http://www.conexionelectronica.com archivo compilado .hex), ingresando al sitio Web: en pbp de 361

Bibliografa INTERNET: Microchip Technology Inc., http://www.microchip.com microEngineering Labs, Inc., http://www.melabs.com Mecanique, http://www.mecanique.co.uk Picallw, http://www.picallw.com Wikipedia, http://es.wikipedia.org Linx Technologies, http://www.linxtechnologies.com Empresas: microEngineering Labs, Inc. Box 60039 Colorado Springs CO 80960 Tel. (719) 520-5323 Fax. (719) 520-1867 http://www.melabs.com Microchip Technology Inc. 2355 W. Chandler Blvd. Chandler AZ 85224-6199 Tel. (602) 786-7200 Fax. (602) 899-9210 http://www.microchip.com Mecanique 85 Marine Parade SaltBurn by the Sea TS12 1BZ United Kingdom Tel. +44 1287 622382 http://www.mecanique.co.uk Fax. +44 8700 520279 362

Vous aimerez peut-être aussi