BASIC PARA MICROCONTROLADORES PIC

Christian Bodington Esteva
Ingeniero en Electrónica

CONTENIDO

Prólogo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Capítulo I. Herramientas de Diseño. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Capítulo II. MicroCode Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 Capitulo III. Microcontroladores PIC.
3.1.- ¿Que es un PIC? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21 3.2.- El Oscilador Externo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25 3.3.- El Circuito de Reset. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.4.- Consideraciones técnicas de diseño. . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.4.1.- Estado Lógico de un pin I/O. . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.4.2. Lectura de un estado lógico en un pin I/O. . . . . . . . . . . . . . . 33 3.4.3. El Opto-acoplador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.4.4. Fuente de poder, 5Vdc / 3.3Vdc. . . . . . . . . . . . . . . . . . . . . . . 37

Capítulo IV. Estructura de un programa. Componentes y operadores en PicBasic.
4.1.- Estructura de un programa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.2.- Subrutinas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 4.3.- Componentes y operadores en PicBasic. . . . . . . . . . . . . . . . . . . . . . . .41

i

4.3.1.- Define. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4.3.2.- Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42 4.3.3.- Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.3.4.- Constantes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.3.5.- Símbolos o Alias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.3.6.- Operadores Aritméticos. . . . . . . . . . . . . . . . . . . . . . . . . . . . .45 4.3.7.- Operadores Binarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45 4.3.8.- Operadores de Comparación. . . . . . . . . . . . . . . . . . . . . . . . 46 4.3.9.- Operadores Lógicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

Capitulo V. Primeros Programas con el PIC16F84.
5.1.- Proyecto #1. Implementación de las instrucciones de programa High, Low Goto y Pause. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47 5.2.- Proyecto #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.3.- Proyecto #3. Implementación de la instrucción If-Them-Else. . . . . . . .60 5.4.- Proyecto #4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 5.5.- Proyecto #5. Implementación de la instrucción For-Next. . . . . . . . . . . 65 5.6.- Proyecto #6. Implementación de la instrucción Frecout. . . . . . . . . . . . 68 5.7.- Proyecto #7. Implementación de la instrucción Button . . . . . . . . . . . . .76 5.7.1.- Proyecto #7.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 5.7.2.- Proyecto #7.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 5.7.3.- Proyecto #7.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

ii

5.8.- Proyecto #8. Implementación de la instrucción Branch . . . . . . . . . . . . 91 5.9.- Proyecto #9. Implementación de la instrucción PWM . . . . . . . . . . . . . 94

Capitulo VI. Módulos LCD.
6.1.- Pantallas LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 6.2.- Identificación de los pines de una pantalla LCD . . . . . . . . . . . . . . . . . 98 6.3.- Conexión de una pantalla LCD en Pic Basic. . . . . . . . . . . . . . . . . . . . 99 6.4.- Proyecto #10. Implementación de la instrucción Lcdout . . . . . . . . . . 103 6.5.- Proyecto #11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 6.6.- Proyecto #12. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .109 6.7.- Proyecto #13. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .111 6.8.- Proyecto #14. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .114 6.9.- Proyecto #15. Implementación de la instrucción Count. . . . . . . . . . . 115 6.10.- Proyecto #16. Implementación de la instrucción Pulsin. . . . . . . . . . 122 6.11.- Proyecto #17. Implementación de la instrucción Pot. . . . . . . . . . . . 124 6.12.- Memoria CGRAM en la Pantalla LCD. . . . . . . . . . . . . . . . . . . . . . . .127 6.13.- Proyecto #18. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .130 6.14.- Proyecto #19. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .137

Capitulo VII. Teclado Matricial.
7.1.- Teclado Matricial. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149 7.2.- Proyecto #20. Aplicación de un teclado 3x4. . . . . . . . . . . . . . . . . . . .154

iii

Capitulo VIII. Memoria de Datos.
8.1.- Memoria de Datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .157 8.2.- Proyecto #21. Implementación de la instrucción Read. . . . . . . . . . . .161 8.3.- Proyecto #22. Implementación de la instrucción Write. . . . . . . . . . . .163 8.4.- Proyecto #23. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .165 8.5.- Proyecto #24. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .168

Capitulo IX. Interrupciones.
9.1.- ¿Qué son las Interrupciones?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175 9.2.- Fuentes de Interrupciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175 9.3.- Registro INTCON. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175 9.4.- Activación de interrupción a través del pin RB0/INT. . . . . . . . . . . . . . 177 9.5.- Proyecto #25. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 9.6.- Interrupción TMR0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .180 9.7.- Registro OPTION. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .181 9.8.- Proyecto #26. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 9.9.- Interrupción por cambio de estado de uno de los pines más significativos del puerto B (RB4-RB7). . . . . . . . . . . . . . . . . . . . . . . . . . . . .186 9.10.- Proyecto #27. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .187

Capitulo X. Memoria Serial I2C.
10.1.- ¿Qué es el bus I2C?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .190 10.2.- Proyecto #28. Implementación de las instrucciones I2Cwrite, I2Cread . . 192

iv

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

Capitulo XI. Conversor A/D en el PIC16F877.
11.1.- Conversor A/D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .202 11.2.- El registro ADCON0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .209 11.3.- El registro ADCON1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .210 11.4.- Proyecto #31. Implementación de la instrucción ADCin. . . . . . . . . . 214

Capitulo XII. Comunicación Serial. Transmisión y Recepción de Datos.
12.1.- Comunicación Serial. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 12.2.- Instrucción SerIn. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 12.3.- Proyecto #32. Implementación de la instrucción SerIn. . . . . . . . . . . 221 12.4.- Instrucción SerOut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .233 12.5.- Proyecto #33. Implementación de la instrucción SerOut. . . . . . . . . .233 12.6.- Proyecto #34 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .240

Capitulo XIII. Servomotor.
13.1.- ¿Qué es un Servomotor?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .268 13.2.- Proyecto #35. Implementación de la instrucción PauseUs. . . . . . . . .272 13.3.- Proyecto #36. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .276 13.4.- Proyecto #37. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .280 13.5.- Proyecto #38. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .283

v

296 14. . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 321 FreqOut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 DTMFout. . . . Módulos RF para comunicaciones. . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 ADCin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .316 Count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Proyecto #39. . . . . . . . . . . . . . . . . . .Capitulo XIV. . . . . . . . . . . . . . . . . . . . . . . . . .321 For… Next. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 vi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .312 Button. . . . . @. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .300 14. 313 Call. . . .Proyecto #41. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .315 ClearWDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .323 Gosub. . .Proyecto #40. . . . . . . . . . . . . . . . . 14. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .305 Capitulo XV. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 Asm… EndAsm. .Módulos RF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2. . . . . . . . . . . . . . . . . Instrucciones de programa de PicBasic. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1. . . . . . . 315 Clear . . . . . . . . . . . . .3. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . .311 Branch. .321 End. . . . . . . . . . . . . . . . . . . . . . . . . .293 14. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 EEPROM. . . . . . . 316 Data . . . . . . . . .

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

. .348 Apéndice B . . . . . .360 Bibliografía . . . . . . . . . . .358 Apéndice C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .343 Sleep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .347 Apéndice A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .344 Swap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 Write . . . . . . . . . . . . . . . . . . . . . .SerOut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .345 While-Wend . . . . . . . . . . . . . . . . . . . . . . . . . . .362 viii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .344 Toggle . . . . . . . . . . . . . . . . . .

memorias de datos entre otros. En esta ocasión iniciamos con el estudio del compilador PicBasic Pro. y donde una de las características más relevantes es el considerable ahorro de tiempo. Además. que será utilizado en este libro para estudiar algunas de sus características a través del desarrollo de actividades que en principio no requieren un nivel de conocimiento elevado y a través del cual daremos los pasos necesarios para adentrarnos en las gamas mas altas. a través de un sin numero de posibilidades de diseño a partir de una serie de ejemplos prácticos desarrollados en lenguaje Basic para Microcontroladores PIC. hemos elegido para empezar el microcontrolador más popular de toda la serie.. lo que se traduce en efectividad y menos líneas de programa. de tal . hemos considerado proporcionar la información adecuada referente a las herramientas de desarrollo más importantes en la actualidad. el PIC16F84.. presión. y en los que podremos manejar dispositivos periféricos que le dan un gran valor agregado a cada uno de nuestros proyectos y abren posibilidades de desarrollo muy interesantes al lector. sensores de temperatura. humedad. de la empresa microEngineering Labs. debido a que cuenta con una gran variedad de instrucciones que hacen de la programación de microcontroladores una tarea fácil y muy productiva a la hora de desarrollar proyectos que involucren periféricos como pantallas LCD. la cual ofrece una de las herramientas mas populares en el área. Inc. en la cual nos hemos concentrado en dar al lector algunas herramientas fundamentales con las cuales esperamos abrir un campo de conocimiento en la electrónica de control. de las que se ha seleccionado el microcontrolador PIC16F877 para la realización de proyectos electrónicos de nivel medio y avanzado. De toda la gama de posibilidades entre las familias de microcontroladores PIC que ofrece Microchip Inc. teclados matriciales. gas.Prólogo Emprender el estudio de microcontroladores para el desarrollo de proyectos electrónicos que sean la base para nuevas ideas es el objetivo primordial de esta primera edición. para programación en lenguaje Basic para microcontroladores PIC.

además 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. de Boban Dobaj. 16 y 18 de Microchip. proyectos de robótica y todo aquello que represente una innovación científica en este campo. Técnico Superior en Electricidad. Otra de las herramientas que hemos decidido incorporar a la obra. Finalmente. Raúl Mastropasqua. Este programador soporta una gran cantidad de modelos de las series 12. Ingeniero en Información. Cada capítulo contiene teoría sobre la cual se pretende estudiar el funcionamiento de los microcontroladores y periféricos conectados a él. logrando así perfeccionar su desempeño en cualquiera de las funciones que desee programar. Maria del Carmen Lara T. de la página oficial de PicallW. Esperamos con esto proporcionar al lector una base sólida de conocimientos para el desarrollo de proyectos electrónicos. quienes se han encargado de revisar cada detalle. Su construcción es sumamente sencilla y de muy bajo costo. es el programador de microcontroladores PIC P16Pro/PicAll. 2 .manera que el diseñador puede prestar mayor atención a los detalles. el agradecimiento para todos nuestros colaboradores en la edición de esta publicación. Para ello hemos desarrollado una serie de prácticas en las que el lector deberá hacer montajes de circuitos en base a los diagramas esquemáticos siguiendo las instrucciones y leyendo detenidamente los comentarios de cada línea de programa. Ingeniero en Electrónica. Jesús Frank Phorlakis. proyectos e ideas plasmadas en cada capitulo. Diseñador.

las cuales vamos a describir a continuación: Software: para la programación en Lenguaje Basic. además del compilador Basic.1.com) 3 .. Inc. PICBasic Compiler. (Fuente: http://www.microengineeringlabs. el Ambiente Integrado de Desarrollo Microcode Studio (IDE) de microEngineering Labs.Herramientas de Diseño Capitulo I En la elaboración de proyectos electrónicos con microcontroladores PIC. o PICBasic Pro Compiler. y entre las cuales hemos elegido para esta primera edición. resulta muy importante considerar una serie de herramientas. Con estas dos herramientas estaremos realizando la programación en cada uno de los proyectos propuestos a partir del capítulo V. contamos con una gran variedad de posibilidades en el mercado. Figura 1.

2. Figura 1. Los detalles para la construcción de este programador están contenidos en el apéndice A.• Programador de Microcontroladores PIC: es una herramienta indispensable con la cual podemos grabar el código generado por el compilador PicBasic para poner en funcionamiento cada uno de los proyectos propuestos en cada capítulo. Consideramos una buena experiencia realizar el montaje de cualquiera de estos diseños. de muy bajo costo y fácil construcción. 4 . Existen en internet una gran cantidad de modelos de programadores para microcontroladores PIC. aunque en esta oportunidad nuestra recomendación es el programador P16Pro/Picallw.

5 . Figura 1. • Multímetro digital: este instrumento de medición será muy útil durante la elaboración de los circuitos propuetos en cada capítulo. Figura 1. con lo cual se hace más práctico el desarrollo de los proyectos electrónicos propuestos a lo largo de cada capítulo.4.3.• Placa de prototipos: proporciona al diseñador conexiones sin soldaduras.

3 Vdc. extractor de circuitos integrados.• Fuente de poder regulada con salida de voltaje variable. Figura 1. • Herramientas de corte. En el capítulo III se propone la construcción de una fuente de poder regulada a 5 Vdc y 3. Figura 1. cable rígido para conexiones en la placa de prototipos.6.5. 6 .

diodos.7. • Componentes electrónicos: microcontroladores PIC en los modelos definidos en cada ejemplo práctico.• Osciloscopio: este instrumento se requiere para el desarrollo de algunas prácticas en las cuales se hace necesario medir las señales generadas desde el microcontrolador. resistencias. servomotores.7. 7 . Cada proyecto cuenta con una tabla en la cual se decriben los componentes electrónicos que deberán ser utilizados en el cada montaje. Figura 1. Figura 1. condensadores. cristales y otros componentes de fácil adquisición.

htm En esta página se puede encontrar una sección destinada para la descarga del archivo instalador.com/resources/win_ide. de libre adquisición a través de la página Web http://www.2: 8 .1.microengineeringlabs.Microcode Studio Capitulo II Microcode Studio (IDE). (Fuente: http://www. Inc. diseñado especialmente para microEngineering Labs.com) Descargar este programa es muy sencillo y esto lo podemos hacer ingresando a la siguiente dirección: http://www.microengineeringlabs..com Figura 2. como se observa en la figura 2. es un Ambiente Integrado de Desarrollo de MECANIQUE.microengineeringlabs.

a través de la dirección: http://www.microengineeringlabs. (Figura 2.Figura 2.melabs.3.com) Es posible descargar una versión DEMO del compilador PIC Basic.com/pbpdemo. es necesario adquirir el compilador PicBasic.melabs. (Fuente: http://www.com) Además de esta herramienta. Se puede acceder directamente a la página de productos de microEngineering Labs a través de la dirección: http://www.microengineeringlabs. con la cual se pueden compilar programas con un máximo de 31 líneas de código.2.htm 9 .htm Figura 2.3). (Fuente: http://www.com/products/index.

Haga clic en el Link aquí señalado. Pro Figura 2.5. Nota Importante: Es necesario adquirir una de las versiones completas del compilador Basic.4.com) Para empezar la descarga del archivo de instalación del compilador. y en la figura 2. para descargar la versión Demo de PicBasic. Figura 2.5 se puede observar el archivo descargado para la versión disponible del software Microcode Studio.6 se puede observar el archivo del compilador PicBasic Pro en su versión de prueba. 10 . solo hay que hacer clic en el link señalado en la figura 2.6. (Fuente: http://www. En la figura 2. Figura 2.melabs. para no tener límites en la cantidad de líneas del programa a compilar.4. e indicar la ruta en la cual se desea que el archivo de instalación sea almacenado.

8. el cual es el responsable de iniciar el proceso de instalación de Microcode Studio: Figura 2.7. Seguidamente Microcode Studio le da la bienvenida en la ventana que se muestra a continuación: Figura 2.exe. El primer paso será ejecutar el archivo mcsinstall.El proceso de instalación es muy sencillo. 11 .

La ruta por defecto para la instalación de Microcode Studio es C:\Archivos de programa\Mecanique\MCS. a través del cual se podrá ubicar la nueva carpeta en la cual deberá ser instalado el software: Nombre de la carpeta en la cual se encontrará el archivo ejecutable de Microcode Studio.Haga clic en el botón “Next” y podrá ver en la siguiente ventana el acuerdo de licencia para Microcode Studio: Figura 2. Figura 2.10. 12 .9. Esta ruta puede ser cambiada haciendo clic en el botón “Browse”.

Figura 2.12). Figura 2.11.12.Pulse “Next” para iniciar la copia de archivos (figura 2. 13 .11). y finalmente espere que se complete la instalación (figura 2.

es importante tomar en cuenta que antes de iniciar este software. el cual es indispensable para la generación del código que será cargado en el microcontrolador PIC. 14 . será necesario ejecutar el archivo denominado “pbpdemo. es necesario instalar el compilador Basic. 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. en la cual se da la bienvenida al usuario y le invita a cerrar cualquier otra aplicación que se encuentre en uso en ese momento. Figura 2.exe” para el caso de la versión de demostración. La figura 2.13. Instalación del compilador PicBasic Pro: Para dar inicio a la instalación del compilador Pic Basic. El software de instalación del compilador establece por defecto la ruta indicada en la figura 2.13 muestra la ventana de inicio del proceso de instalación.14.Una vez instalado Microcode Studio.

15. 15 . Seguidamente se debe especificar el nombre de la carpeta que va a contener los accesos directos a los archivos que ofrecen información adicional acerca del compilador PicBasic.Figura 2. Este paso puede ser omitido seleccionando la opción “Don’t create a Start Menu Folder”: Figura 2.14.

para dar inicio a la copia de archivos. Figura 2.16.Una vez seleccionadas las rutas de instalación del compilador.17.16). Figura 2. 16 . se debe hacer clic en el botón “Install” (figura 2.

Finalmente se puede ver en la ventana de la figura 2.htm 17 .melabs. Nota: Puede descargar la documentación completa del compilador PicBasic a través de la dirección: http://www.18.Figura 2. un mensaje en el cual se confirma que el compilador PICBasic Pro ha sido instalado satisfactoriamente.com/support/index.18. Deshabilite la opción “Install Microcode Studio IDE” y seguidamente haga clic en el botón “Finish”.

18 .19. Para esto debemos iniciar el software y seguir las siguientes instrucciones: 1. Figura 2. Haga clic en el menú “View” y seleccione la opción “Compile and Program Options”. indicando la ruta en la cual se encuentra instalado.Integración de Microcode Studio y Pic Basic Pro: Es importante integrar Microcode Studio con el compilador PicBasic Pro. 2.20. Figura 2. Desde el menú de Inicio de Windows ejecute “Microcode Studio”.

En la pestaña “Compiler” haga clic en el botón “Find Automatically” para una ubicación automática del compilador. 4. Figura 2.21. Figura 2. En la pestaña “Programmer” se pide la ubicación del software del programador que estaremos utilizando para grabar los microcontroladores.3. o si lo prefiere haga clic en “Find Manually” para ubicar el compilador manualmente. 19 .22.

haciendo clic en el botón denominado “Add New Programmer” (Figura 2. 20 . Por último. el software realizará la búsqueda automática de la carpeta que contiene el archivo ejecutable del programador Picall. el cual ha debido ser instalado según el procedimiento descrito en el Apéndice A. al hacer clic en el botón “Next”.Se debe ubicar en la lista el programador “PICALL Programmer”. como se puede observar en la figura 2. y seguidamente se debe seleccionar de la lista de opciones.23: Figura 2.22).23.

Podríamos decir que estos dispositivos se asemejan a una computadora pero de tamaño muy reducido. También podemos destinar un puerto completo 21 . entre otros. memoria RAM. Esto significa que el microcontrolador es el encargado de dirigir todos los procesos de un circuito electrónico. por ejemplo. USART (Universal Synchronous/Asynchronous Receiver/Transmitter). los cuales cuentan con una tecnología tipo RISC (Reduced Instruction Set Computer) y poseen en su arquitectura interna características especiales que varían según el modelo de PIC que deseamos utilizar. El diseño de programas para microcontroladores PIC va acompañado normalmente con un previo estudio del diseño del hardware que hará que nuestros proyectos se pongan en marcha. Es decir.Microcontroladores PIC Capitulo III 3. resulta absolutamente necesario saber cual será la función específica de cada pin. Que es un PIC? Los PIC son una familia de microcontroladores desarrollados y fabricados por la empresa Microchip Technologies Inc. poseen memoria de programa. memoria de datos. comparadores. puertos de entrada o salida. temporizadores y en algunos casos cuentan con recursos adicionales como convertidores A/D. en base a las instrucciones de programa o rutinas que definen funciones específicas de control. Es por esta razón que consideramos muy importante estudiar la arquitectura interna del microcontrolador que se desea programar y aunque esta tarea pueda parecer difícil. el Lenguaje Basic para microcontroladores PIC la hace sumamente sencilla. Con todas estas características es lógico pensar que este dispositivo pasa a ser el corazón del circuito a ser controlado.. es importante definir sus funciones antes de empezar a programar. donde las mismas serán realizadas en lenguaje Basic para microcontroladores PIC. ya que cuentan con casi los mismos recursos que éstas. es decir.1. ya que éstos pueden ser configurados a conveniencia como entrada o como salida de datos de forma independiente. en el caso de los puertos I/O (IN/OUT) a ser utilizados en el microcontrolador. comunicación serie I2C.

oscilador interno. PIC16F84A. además de otras características relevantes. leds. De ahí la importancia de establecer cual será la función de cada puerto del microcontrolador PIC elegido para nuestros proyectos. servomotores entre otros.del microcontrolador para el control de dispositivos periféricos como pantallas LCD. 13 pines I/O entre otras características que estaremos estudiando a lo largo del contenido de esta obra. debido principalmente a que cuentan con un numero de pines I/O superior a éste. • • 22 . incluyen un gran número de mejoras en comparación con el PIC16F84. Otra decisión importante será elegir convenientemente el modelo de microcontrolador a ser utilizado. Los microcontroladores PIC comúnmente más utilizados son los siguientes: • PIC12C508 y PIC12C509. tienen memoria de programa EPROM. Este PIC ha resultado ser uno de los más populares de toda la serie. oscilador externo. PIC16F87X. Figura 3. teclados. tiene memoria de programa tipo FLASH. motores paso a paso. Por ejemplo. ya que hay una gran gama de modelos que pueden ser adaptados a necesidades específicas de diseño. con esta serie de microcontroladores contamos con una mayor capacidad en cuanto a memoria de programa y memoria de datos. y son muy utilizados en diseños de pequeños circuitos.1.

23 .• PIC18F4XX. Posee 13 pines I/O (pines de entrada o salida). según sea el objetivo de diseño del circuito que deseamos realizar. Memoria de programa tipo Flash de 1024 palabras de 14 bits.com Estas características influyen directamente al momento de decidir que modelo de microcontrolador PIC deseamos utilizar en nuestros proyectos. Cada uno de estos microcontroladores cuenta con una completa hoja de datos que puede ser descargada de la página oficial de Microchip: http://www. Cuatro fuentes de interrupción. el preferido por estudiantes para dar inicio al estudio de la programación de microcontroladores. Memoria RAM de 68 bytes.microchip. para tener una base de conocimientos básicos para poder realizar un programa de control de un diseño completamente personalizado. Para empezar. Antes de empezar a revisar todo lo referente a la programación de microcontroladores PIC. Memoria EEPROM de datos de 64 bytes. Velocidad de operación de hasta 20 Mhz. El microcontrolador PIC16F84 es uno de los microcontroladores más populares y en algunos casos. estos microcontroladores resultan muy útiles cuando deseamos diseñar proyectos más avanzados. consideramos importante recordar algunas de las características de éstos dispositivos. PIC16F84: • • • • • • • veamos algunas características del microcontrolador Microcontrolador de 8 Bits. seguido del PIC16F877 el cual posee más recursos importantes que estaremos estudiando a continuación.

Pin de Alimentación a Tierra (GND) Pin de Entrada/Salida (I/O) del puerto B Pin de Entrada/Salida (I/O) del puerto B Pin de Entrada/Salida (I/O) del puerto B Pin de Entrada/Salida (I/O) del puerto B Pin de Entrada/Salida (I/O) del puerto B Pin de Entrada/Salida (I/O) del puerto B Pin de Entrada/Salida (I/O) del puerto B Pin de Entrada/Salida (I/O) del puerto B Pin de Alimentación de 5Vdc Salida del oscilador a cristal.2. Pin de Entrada/Salida (I/O) del puerto A Pin de Entrada/Salida (I/O) del puerto A Tabla 3. Entrada del oscilador a cristal o fuente externa de reloj.1 24 .Diagrama de pines del PIC16F84: Figura 3. PIN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Identificación RA2 RA3 RA4/TOCKI MCLR Vss RB0/INT RB1 RB2 RB3 RB4 RB5 RB6 RB7 Vdd OCS2/CLKOUT OSC1/CLKIN RA0 RA1 Descripción del Pin Pin de Entrada/Salida (I/O) del puerto A Pin de Entrada/Salida (I/O) del puerto A Pin de Entrada/Salida (I/O) del puerto A Reset y entrada de voltaje de programación.

Los pines correspondientes al oscilador (OSC1 y OSC2) y al reset (MCLR) deben ser siempre tomados en cuenta en el diseño de nuestros proyectos. Para hacer funcionar nuestro diseño podemos elegir entre las siguientes cuatro opciones: • • Oscilador LP: Oscilador de bajo consumo (Low Power). En total se cuenta con trece pines I/O. los cuales pueden ser programados como entrada o salida según convenga al momento de diseñar un circuito de control.3: Figura 3. define la velocidad a la cual va a trabajar. el cual consta de cinco pines I/O y el puerto B. el puerto A. el cual consta de ocho pines I/O como se puede observar en la figura 3.2. Oscilador XT: Cristal / Resonador.3. 3.El microcontrolador PIC16F84 cuenta con dos puertos I/O. Es por este motivo que damos inicio al estudio de algunos circuitos indispensables para el correcto funcionamiento del microcontrolador PIC. Es un circuito indispensable para el funcionamiento del microcontrolador y el cual además. El Oscilador Externo. 25 .

100 pF 15 .• • Oscilador HS: Oscilador de alta velocidad (High Speed).33 pF 15 . Osc2/CLKout y Osc1/CLKin respectivamente.33 pF 15 .33 pF 15 .33 pF 15 .4. XT y HS el cristal debe ser conectado a los pines 15 y 16.33 pF Tabla 3.100 pF 15 . como se muestra en la figura 3.33 pF Osc2/CLKout 68 . Oscilador RC: Resistencia / Condensador.2 26 .33 pF 15 . Figura 3.33 pF 15 . Los valores de los condensadores cerámicos vienen dados según la tabla que se muestra a continuación: Modo LP XT HS Frecuencia 32 kHz 200 kHz 2 MHz 4 MHz 4 MHz 10 MHz Osc1/CLKin 68 .4.33 pF 15 .33 pF 15 . En los modos de oscilador LP.

Figura 3. Al conectar el microcontrolador a la fuente de alimentación de 5 Vdc y medir la señal de salida del oscilador XT con un osciloscopio. 27 . para un oscilador tipo XT. podemos utilizar un cristal de cuarzo como el de la figura 3.6.5. en el pin 15 (Osc2/CLKout) del microcontrolador.Por ejemplo.5. podremos ver la onda generada bajo los siguientes parámetros de medición seleccionados en el equipo: • • Voltios/Div: 200mV Time/Div: 100ns Figura 3.

8.71 ns Cristal de cuarzo TTL: Este tipo de cristal consta de cuatro pines.La lectura de la frecuencia y período en este caso sería la siguiente: • • Frecuencia: 3.972 Mhz Período: 251. de los cuales solo tres están implementados de la siguiente manera: Figura 3. bajo los siguientes parámetros de medición seleccionados en un osciloscopio: • • Voltios/Div: 2V Time/Div: 100ns 28 . Pin 1: NC (Este pin no se encuentra conectado internamente) Pin 7: GND Pin 8: Salida TTL Pin 14: +5Vdc En su salida se obtiene un tren de pulsos como se puede observar en la figura 3.7.

Figura 3. La lectura de la frecuencia y período en este caso sería la siguiente: • • Frecuencia: 3. Los valores recomendados para este oscilador son los siguientes: • • 5 Kohm ≤ R1 ≤ 100 Kohm C1 > 20 pF 29 .013 ns El oscilador externo en modo RC resulta ser el más sencillo de todos y por ende el más económico.999 Mhz Período: 250. Su configuración lo hace menos preciso debido a que existe una tolerancia de error en sus componentes. sin olvidar también que la temperatura puede afectar la operación de este tipo de oscilador.8.

Si deseamos tener control externo del reset de un microcontrolador PIC. Circuito de Reset: El Pin denominado MCLR (Master Clear).3. si a éste se le aplica un nivel lógico bajo (0V).10: 30 . debemos considerar el circuito de la figura 3. 3. siempre debe ser tomado en cuenta cuando se diseña un circuito con microcontroladores PIC. el Pin MCLR debe estar siempre en un nivel lógico alto (5V).Figura 3.9. A través de este Pin se podrá reiniciar el dispositivo. por lo tanto resulta importante destacar que para que un programa cargado en un microcontrolador se mantenga en ejecución.

Estado Lógico de un pin I/O: Una manera muy sencilla de ver el estado lógico de un pin configurado como salida en cualquiera de los puertos de microcontrolador es a través del uso de LEDs. 3.4. Estos circuitos son muy útiles cuando deseamos visualizar el resultado de una acción programada en el microcontrolador. 31 .Figura 3.11. Consideraciones técnicas de diseño: A continuación veremos algunos circuitos básicos que deben ser tomados en cuenta para el desarrollo de prácticas con microcontroladores PIC. Este circuito permite reiniciar el microcontrolador cada vez que el pulsador P1 es presionado. 3.10. como se observa en los circuitos de la figura 3.1.4.

el LED se iluminará solo cuando el estado lógico del pin de salida del puerto sea igual a “1”. 5 voltios. Figura 3.11. en cualquiera de los puertos de un microcontrolador. 32 . En el segundo circuito. es decir.En el primer circuito. Esto significa que si deseamos realizar un programa en Lenguaje Basic encargado de cambiar el estado lógico de un pin específico. es decir. una forma “básica” de visualizar este cambio es a través del uso de LEDs. 0 voltios. el LED se iluminará solo cuando el estado lógico de la salida del puerto sea igual a “0”.

3. Si deseamos introducir un nivel lógico bajo (0V). Un ejemplo común podría ser el uso de un pulsador para hacer destellar un led cada vez que éste sea presionado. o alto (5V). podríamos considerar los circuitos de la figura 3. a una de las entradas de un microcontrolador a través de un pulsador. los cuales nos proporcionan dos formas diferentes de hacerlo: Figura 3. Lectura de un estado lógico en un pin I/O: El microcontrolador también nos permite capturar datos o señales externas para luego ser procesadas y convertidas en respuestas que pueden definir una acción específica en nuestros circuitos de prueba.2.4.12. 33 .12.

34 .13. el nivel lógico en el pin I/O del puerto pasa a ser bajo (0V). el nivel lógico en el pin I/O del puerto pasa a ser alto (5V). Este componente en una de sus versiones. El segundo circuito de la figura 3.El primer circuito en la figura 3.3. El Opto-acoplador: El opto-acoplador es un componente muy útil cuando se requiere acoplar circuitos electrónicos digitales con etapas de manejo de potencia o con otros circuitos. se compone básicamente de un diodo LED el cual se encarga de iluminar un fototransistor. Al presionar el pulsador. para que éste conduzca corriente a través del colector. Figura 3.12 mantiene un nivel lógico alto (5V) mientras el pulsador permanece abierto.12 mantiene un nivel lógico bajo (0V) mientras el pulsador permanece abierto.4. Al presionar el pulsador. 3.

en la salida tendremos un 0 lógico (0V).14). en la cual se ha incluido un relé a 35 . el fototransistor permanecerá abierto entre el emisor y colector..15.13 y figura 3. la cual se basa en cualquiera de los dos circuitos antes mencionados (figura 3.En la configuración de la figura 3. de tal manera que en la salida tendremos un 1 lógico (5V). cuando en el pin I/O aplicamos un 1 lógico (5V). dando como resultado un 0 lógico (0V) en la salida. Mientras haya un 0 lógico en la entrada. solenoides. En la configuración de la figura 3. el LED del opto-acoplador enciende y el fototransistor conduce la corriente a tierra. se puede ver en la figura 3. cuando en el pin I/O aplicamos un 1 lógico (5V). por lo tanto.14. el LED del opto-acoplador enciende y el fototransistor conduce para poner en la salida un 1 lógico (5V). Si apagamos el LED.13. Figura 3. el transistor no conduce. luces incandescentes. Una configuración muy común para el control de dispositivos de potencia como motores eléctricos. etc.14.

Figura 3. 36 . para hacer funcionar cualquiera de estos dispositivos de potencia.través del cual circulará la corriente necesaria entre sus contactos.15.

4. 37 . Fuente de poder. 5Vdc / 3.3.16 se puede observar el diseño de una fuente regulada con salidas de voltaje de +5 Vdc y +3.3Vdc: En caso de no disponer de una fuente de poder regulada. En la figura 3.4.16.3 Vdc: Figura 3. proponemos la construccion de un diseño sencillo que podemos implementar en todos los proyectos propuestos.

1 se puede observar la estructura básica de un programa hecho en Microcode Studio. y en la cual hemos identificado las cuatro secciones que consideramos más importantes para lograr un programa bien estructurado.Estructura de un programa: Para que nuestros programas tengan una apariencia ordenada y se facilite la comprensión del mismo ante otros programadores que deseen realizar mejoras a éste.1. 38 .. D En la figura 4. Componentes y operadores en PicBasic.Estructura de un programa. Capitulo IV 4. es necesario establecer una estructura que nos permita identificar fácilmente cada una de las partes que lo componen.1. A B C Figura 4.

siempre que la frase comience con su respectiva comilla. siempre igual o superior entre la sección B y C. Sección C: Estará destinada para las instrucciones de programa y la misma está separada de la columna cero del editor de texto por una tabulación. Cuando un comentario es demasiado extenso. Es importante resaltar que cada línea del encabezado debe empezar con una comilla simple. Sección D: Esta destinada para realizar comentarios acerca de la función que estará cumpliendo una instrucción específica en nuestro programa. la identificación de autor. podemos continuar el mismo en la siguiente línea. en forma de comentario (ver “Sección D”). como el nombre. versión del programa que se está realizando. Las etiquetas identifican puntos específicos o subrutinas dentro de un programa.Sección A: Corresponde al encabezado del programa. en el cual se debe considerar información básica del mismo. es decir. y en ella se pueden declarar las definiciones (concepto que estudiaremos mas adelante) y las etiquetas de cada una de las subrutinas que serán programadas. presionamos una vez la tecla “TAB”. Copyright. que definen el final de la misma. Sección B: Esta sección empieza en la columna cero del editor de texto de Microcode Studio. cuando el cursor se encuentra en la columna cero. y de esta manera establecemos un espacio mínimo. 39 . fecha de elaboración o fecha de los últimos cambios realizados. Son definidas por el programador y deben tener al final de cada una de ellas el símbolo de “dos puntos”. Cada comentario debe empezar siempre con una comilla simple como se muestra a continuación: ' Define el Oscilador para un Cristal ' de 4 Mhz. e incluso una breve descripción acerca del objetivo del programa y su aplicación en un determinado circuito electrónico.

.Subrutinas: Una subrutina se presenta como un algoritmo separado del algoritmo principal. y estará destinado a resolver una tarea específica. 4. Las subrutinas pueden ser referidas cada vez que sea necesario.2. la cual debe ir siempre al inicio de la misma. llamando a la etiqueta que corresponde a ésta.Los comentarios ayudan al diseñador a identificar cada línea de programa o cada una de las funciones de cada subrutina. Led1: For Z = 0 To 9 LED = Encendido Pause 1000 LED = Apagado Pause 1000 Next Z GoTo Inicio End Etiqueta Subrutina 40 . garantizando así una buena documentación en cada uno de los programas que realizamos.

y otras que no son de uso obligatorio. PIC Basic cuenta con una serie de herramientas de programación entre las cuales podemos mencionar las etiquetas. variables. Veamos a continuación la tabla de parámetros para el uso de la instrucción Define. Así mismo ocurre para el caso de las comunicaciones seriales o I2C. 4... Por ejemplo.3. Algunas de estas herramientas son de uso obligatorio a la hora de realizar un programa.Componentes y operadores en PicBasic. ya que establece una serie de parámetros que de no ser tomados en cuenta. si deseamos utilizar un oscilador de diferente frecuencia al valor establecido por defecto (4 Mhz). comentarios. causará que nuestros programas sencillamente no funcionen en la mayoría de los casos. donde se deberán definir los puertos de conexión para el bus de datos y bus de control.1. donde los parámetros también deben ser definidos.3.4. identificadores. nos facilitarán el trabajo considerablemente. 41 . constantes.Define: La directiva “Define” resulta muy importante en la programación de microcontroladores con PicBasic. símbolos entre otras. Esta serie de parámetros están directamente relacionados con dispositivos externos al microcontrolador. será conveniente entonces definir la velocidad del mismo utilizando la directiva: Define Osc {frecuencia} De igual forma deben ser considerados estos parámetros para el uso de dispositivos como pantallas LCD.

1. Regularmente la definición de variables se hace al inicio del programa y para ello se utiliza la palabra VAR seguida por el tipo de variable según la tabla que mostramos a continuación: Nombre de la Variable A1 Temp dig1 VAR Var Var Var Tipo de Variable Bit Byte Word Descripción Toma los valores 0 y 1 unicamente Toma valores entre 0 y 255 (8 bits) Toma valores entre 0 y 65535 (16 bits) Tabla 4.2.2 o 4) Interface de Reloj I2C Bipolar Cuando en la transferencia es utilizado un oscilador mas lento que 8 Mhz.2.Variables: En las variables podemos almacenar datos temporalmente. 42 . los cuales podrán ser consultados o modificados cada vez que sea necesario.. Tabla 4. 4.3. El nombre de la variable es elegido por el programador y el tipo de variable se define según el tipo de dato que se desea almacenar temporalmente.Parámetro OSC {frecuencia} LCD_DREG {puerto} LCD_DBIT {bit} LCD_RSREG {puerto} LCD_RSBIT {bit} LCD_EREG {puerto} LCD_EBIT {bit} LCD_RWREG {puerto} LCD_RWBIT {pin} LCD_LINES {líneas} I2C_SCLOUT 1 I2C_SLOW 1 Descripción Frecuencia del Oscilador en Mhz Puerto de datos LCD Bit inicial del puerto de datos Puerto para RS (Register Select) Pin del Puerto para RS Puerto para E (Enable) Pin del Puerto para E Puerto para RW (Read/Write) Pin del puerto para RW Número de líneas de la LCD (1.

4. Las variables Arrays tipo Bit. las variables Arrays tipo Byte pueden almacenar hasta 96 elementos y las variables Arrays tipo Word hasta 48 elementos.3. 45. 56. lo cual significa que hemos declarado una variable array de 8 elementos. siempre especificando el índice. pueden almacenar 256 elementos. 43 .Arrays: Las variables Arrays tienen un determinado número de “elementos”. los cuales a su vez pueden ser accesados en cualquiera de los tres casos a través de un índice. En este caso podemos almacenar un byte en cada elemento. 15. 20. 80. definido según el tamaño de la variable. 33. Ejemplo: Almacenar en cada elemento de la variable “Dato” los valores 200.3. Dato[0] = 200 Dato[1] = 15 Dato[2] = 56 Dato[3] = 75 Dato[4] = 80 Dato[5] = 20 Dato[6] = 33 Dato[7] = 45 En algunos casos se debe verificar la hoja de datos del microcontrolador. 75.. Este índice se específica entre corchetes como se muestra en los siguientes ejemplos: Para declarar una variable Array utilizamos el siguiente formato: Dato Var Byte[7] El primer elemento de esta variable es Dato[0] y el último elemento es Dato[7]. ya que la cantidad de elementos que se pueden almacenar en variables arrays tipo Byte o Word puede variar según el modelo del mismo.

en vez de referirse a él como “PortA.0”. si deseamos controlar un motor DC a través de uno de los pines del puerto A de un microcontrolador.Constantes: Ayudan a identificar un valor constante en nuestro programa. En la tabla 4. Entonces..4..0 44 .3. facilitando aún más la comprensión del mismo a la hora de verificar su funcionamiento.5. el símbolo de igualdad “=”.3. y por último el elemento en cuestión: Symbol {alias} = {elemento} Por ejemplo. utilizamos la palabra “Symbol”. seguida del alias del elemento. Para definir un símbolo.1 = PORTC. resultaría mucho mas sencillo referirse a este pin como “Motor”.3. Symbol Motor = PORTA.3 se puede observar la forma de declarar una constante.0 LED RC0 = PORTA.0 Sensor = PORTA. Nombre de la Constante Temp_Max Temp_Min CON CON CON Tabla 4. Valor de la Constante 150 55 4.4.0 Veamos otros ejemplos: Symbol Symbol Symbol Symbol Relay = PORTB.Símbolos o Alias: Proveen un nombre único y específico a elementos o variables dentro de nuestro programa.

Operadores Binarios: En la siguiente tabla veremos los operadores binarios proporcionados para el Lenguaje PicBasic: Operrador & | ^ Descripción AND Lógico OR Lógico XOR Lógico NOT Lógico NAND Lógico NOR Lógico NXOR Lógico Tabla 4. ˜ &/ |/ ^/ Con estos operadores resulta muy sencillo realizar operaciones binarias.5. como lo demuestra el siguiente ejemplo: Si aplicamos una AND lógica. Operador ABS SIN COS MIN MAX REV DIG Descripción Valor Absoluto Seno del Angulo Coseno del Angulo Minimo de un número Máximo de un número Invertir un Bit Valor de un digito para un número decimal 4..3.3.6. Var1 = Var1 & %00000001 45 .7. donde deseamos filtrar los siete bits más significativos del valor almacenado en la siguiente variable: Var1 = %00101001 Entonces.4.Operadores Aritméticos: Entre los operadores aritméticos más utilizados tenemos los que se muestran en la siguiente tabla: Operador + * / // << >> = Descripción Suma Resta Multiplicación División Residuo Desplaza a la Izquierda Desplaza a la Derecha Asignación de Valores Tabla 4.4..

Operadores de Comparación: Los operadores de comparación normalmente son utilizados con la instrucción If…Them… para realizar comparaciones entre variables o datos extraídos de alguna operación aritmética.Operadores Lógicos: Los operadores lógicos son utilizados para establecer condiciones entre variables y son utilizados de la misma manera que los operadores de comparación. 46 ..El resultado de esta operación es Var1 = %00000001 4..6. Ejemplo: If Var1 = 1 and Var2 = 3 And Var3 = 5 Then Goto inicio La condición saltará a la etiqueta “inicio” solo si se cumplen las tres condiciones.3. Operador = <> < > <= >= Descripción Igual Diferente Menor que Mayor que Menor o igual que Mayor o igual que Tabla 4. Operador AND OR XOR NOT NOT AND NOT OR NOT XOR Descripción AND Lógico OR Lógico XOR Lógico NOT Lógico NAND Lógico NOR Lógico NXOR Lógico Tabla 4.7. 4.9.8.3.

estaremos estudiando la sintaxis de las instrucciones empleadas en cada proyecto para facilitar la comprensión general de éste.1. 5..1.1.Proyecto #1: A continuación realice el montaje de la figura 5. no están presentes los pines de alimentación “Vcc” y “Gnd”. Se debe tomar en cuenta que aunque en los diagramas de los circuitos que se muestran a continuación. El primer paso entonces será realizar el montaje del circuito con base en los conocimientos adquiridos en las páginas anteriores. 47 .Primeros Programas con el PIC16F84 Capitulo V Para aprender a programar un microcontrolador resulta importante dar inicio al tema con ejemplos prácticos y sencillos. que nos ayuden a comprender el funcionamiento de la arquitectura del PIC y las instrucciones de programa que se están empleando. en base al cual realizaremos la programación necesaria para encender dos Leds conectados a los puertos del microcontrolador: Figura 5. referente a la programación y diseño electrónico. A medida que se van proponiendo ejemplos de aplicación práctica. éstos deben ser conectados debidamente a la fuente de alimentación de 5 Voltios.

el puerto A solo cuenta con 5 pines (RA0. los cuales para el caso específico del PIC16F84 son dos: TrisA (registro de configuración I/O del puerto A). por lo tanto para que encienda el LED debemos hacer salir un 1 lógico por el pin correspondiente. Note que el ánodo del diodo LED se encuentra conectado al pin de salida del puerto.2). RA2. El Led 2 se encuentra conectado en el pin RB0 del puerto B. 48 . es un registro de 8 bits. • • El Led 1 se encuentra conectado en el pin RA0 del puerto A. RA3 y RA4).Proyecto # 1 Componentes PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 33 pF LED Resistencia de 220 Ohm Fuente regulada de 5 Vdc Cantidad 1 1 2 2 2 1 Tabla 5. es importante tomar en cuenta los registros de configuración de puertos. el cual deberá ser configurado como “Salida”. de los cuales los tres más significativos no se encuentran implementados en este modelo de microcontrolador.1. RA1. Como los pines de los puertos pueden ser configurados como “entradas” o como “salidas”. el cual deberá ser configurado igualmente como “Salida”. ya que como se puede observar en el diagrama de pines del dispositivo (figura 3.

3. 0 = Salida (Al configurar un bit del registro TrisB en “0”. es un registro de 8 bits en el cual se configuran los pines del puerto B. éste se comporta como entrada). TrisB. 49 . ya sea como entrada o como salida. 0 = Salida (Al configurar un bit del registro TrisA en “0”. En PicBasic.2. 1 0 RB7 RB6 RB5 RA4 RA3 RA2 RA1 RA0 Bit menos significativo 1 = Entrada (Al configurar un bit del registro TrisB en “1”.Un ejemplo de configuración de los pines I/O del puerto A es el siguiente: Registro TrisA 1 1 1 Figura 5.2. el bit correspondiente a este pin en el registro TrisA ha sido configurado como salida”. éste se comporta como entrada). por ejemplo: 1 1 Registro TrisB 1 1 1 1 Figura 5. se puede observar que el pin RA0 ha sido configurado como salida y el resto de los pines como entrada. este paso se realiza de la siguiente manera: TrisA = %11110 (“%” para expresar la configuración en Binario). ó: TrisA = $1E (“$” para expresar la configuración en Hexadecimal) “Recordemos entonces que como el Led 1 se encuentra conectado en el pin RA0. éste se comporta como salida). Al ver la figura 5. éste se comporta como salida). 1 0 RA4 RA3 RA2 RA1 RA0 Bit menos significativo 1 = Entrada (Al configurar un bit del registro TrisA en “1”.

50 . se puede observar que el pin RB0 ha sido configurado como salida y el resto de los pines como entrada. ya que de esta forma podemos evitar daños en el hardware interno del microcontrolador al experimentar con éste en un tablero de pruebas. “Consideramos importante configurar los pines que no estarán en uso como entrada. ó: TrisB = $FE (si se desea hacer la notación en hexadecimal) Antes de verificar el programa propuesto para este ejemplo. Sintaxis de las Instrucciones empleadas en el programa: HIGH Sintaxis: HIGH pin La instrucción “High” pone en uno lógico un pin I/O específico. en el cual encontrará la descripción de cada una de las instrucciones utilizadas en cada proyecto planteado en esta edición. para tener una idea clara de la función que cumple cada instrucción. ajustada al ejemplo de la figura 5.” La configuración en PicBasic para el registro TrisB. veremos la sintaxis de las instrucciones utilizadas en él. Esta información puede ser complementada en el capítulo XV.Para el caso particular del puerto B.3 sería entonces la siguiente: TrisB = %11111110 (si se desea hacer la notación en binario).

LOW Sintaxis: LOW pin La instrucción “LOW” coloca en cero lógico un pin I/O específico. 51 .pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1.0 * '**************************************** Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. Veamos el programa en PicBasic: '**************************************** '* Nombre : Proyecto1. PAUSE Sintaxis: PAUSE periodo La instrucción “Pause” realiza una pausa en el programa por un periodo definido en milisegundos. GOTO Sintaxis: GOTO etiqueta La instrucción “Goto” continúa la ejecución de un programa a partir de la etiqueta especificada (Esta instrucción no tiene retorno).

' Inicializa el puerto "B". ' Enciente el Led conectado en el pin RB0 ' Hace una pausa de 1000 milisegundos = 1 ' Seg. es decir. Low PORTA.0 Pause 1000 High PORTB. Al igual que en la instrucción “High”. La instrucción “GoTo” realiza un salto hacia una etiqueta específica.0 Pause 1000 GoTo Inicio End La instrucción “High” se encarga de poner un nivel lógico alto en el pin especificado seguidamente. ' Apaga el Led conectado en el pin RB0 ' Hace una pausa de 1000 milisegundos = 1 ' Seg. En este caso. 52 . se debe especificar el puerto y el pin del puerto a ser utilizado. ' Etiqueta de Inicio del programa ' Enciente el Led conectado en el pin RA0 ' Hace una pausa de 1000 milisegundos = 1 ' Seg. se especifica el número del pin en el puerto que deseamos utilizar. ' se ponen todos los pines en cero. primero se escribe el puerto y seguido de un punto. en este caso el programa salta a la etiqueta “Inicio” para empezar de nuevo todo el proceso. ' Apaga el Led conectado en el pin RA0 ' Hace una pausa de 1000 milisegundos = 1 ' Seg.TRISA = %11110 ' Configuración el Puerto A TRISB = %11111110 ' Configuración el Puerto B PORTA = 0 PORTB = 0 Inicio: High PORTA.0 Pause 1000 ' Inicializa el puerto "A". La instrucción “Low” es responsable en este caso de poner el pin especificado en un nivel lógico bajo. ' Salta a la etiqueta "Inicio" y se repite el ' proceso.0 Pause 1000 Low PORTB.

5. Observe que para este “Proyecto1. 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. hemos designado el nombre Figura 5.4). programa. se debe asegurar de seleccionar el modelo apropiado de microcontrolador PIC.pbp” (figura 5. Antes de compilar el programa.4. Luego se compila el programa y se verifica que éste no tenga errores.Al escribir el programa en el editor de texto de Microcode Studio. 53 . como se observa en la figura 5.

En este momento el microcontrolador deberá estar montado en la base del programador en la posición indicada por la figura 5. Al hacer clic en el icono “Compilar y Grabar en el PIC” (ver figura 5. el compilador habrá generado un archivo de nombre “Ejemplo1. Modelo del uC.5). Seguidamente. 54 .hex” y seguidamente se abrirá el software “Picall/P16Pro”.5. se debe proceder a cargar el programa compilado en el microcontrolador con la ayuda del programador de microcontroladores Pic.6.6.6: Figura 5. como se observa en la figura 5.Compilar Compilar y Grabar en el PIC Figura 5.

6. En esta sección se debe configurar el tipo de oscilador utilizado en nuestro circuito. En la figura 5. Figura 5. de forma que podamos reiniciar el temporizador “Watchdog” antes de que éste se desborde y provoque un “Reset” en el sistema. provocando un “Reset” del sistema. el cual puede ser visualizado en la figura 5. • En la sección “Hardware” es posible activar el temporizador “Perro Guardián”. el cual se encarga de reiniciar el microcontrolador en caso de fallas o bloqueos en el programa. así como otras opciones disponibles que comentaremos a continuación (ver figura 5. Para utilizar el “Watchdog” es necesario diseñar el programa bajo ciertos parámetros. accediendo al botón “Config”.7). también resulta conveniente verificar los fusibles de programación. el temporizador Watchdog completaría su conteo y se desbordaría. Si nuestro programa llegara a fallar. debemos seleccionar el tipo de oscilador utilizado en nuestro circuito electrónico. “Hardware” y “Protection”: • En la sección “Oscillator”. 55 .7 se pueden observar tres secciones llamadas “Oscillator”.7.Antes de programar el microcontrolador. el cual en este caso es del tipo XT. debido a que el cristal que hemos elegido es de 4 Mhz.

para descargar el programa “Proyecto1.hex” en el microcontrolador. • En la sección “Protection”. inmediatamente se podrá ver el proceso de grabación y verificación de datos. Finalmente hacemos clic en el botón “Program” (ver figura 5.• En la sección “Hardware” también disponemos de la opción “Power Up Timer”. hará que éste no pueda iniciar el programa hasta tanto el voltaje aplicado al circuito sea estable y seguro (ver figura 5.6). 6 5 4 Voltios 3 2 1 0 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 Tiempo Figura 5. o cada vez que se desee realizar una modificación a un programa para obtener siempre mejores resultados sobre el objetivo propuesto en cada actividad. tenemos la posibilidad de proteger el código de programa almacenado en la memoria del microcontrolador.8). Estos pasos se deben aplicar en cada uno de los proyectos aquí planteados. para luego culminar con el montaje del microcontrolador en el circuito de prueba. 56 .8. la cual una vez activada en el microcontrolador.

9 podemos observar en detalle la conexión del circuito eléctrico que deberá ser montado.5. Figura 5. el cual a su vez deberá ser configurado como salida para garantizar el correcto funcionamiento del mismo. 57 .2.2.9.Proyecto #2: En este ejemplo conectaremos un Led en cada pin del puerto B.. Proyecto # 2 Componente PIC16F84A Cristal de 4 Mhz Capacitor de 33 pF LED Resistencia de 220 Ohm Fuente regulada de 5 Vdc Cantidad 1 1 2 8 8 1 Tabla 5. En la figura 5.

Veamos el siguiente programa: '**************************************** '* Nombre : Proyecto2. utilizando las instrucciones High y Low. Basados en esta información podemos lograr encender y apagar varios leds simultáneamente conectados a uno de los puertos del microcontrolador como lo muestra el montaje de la figura 5. RB5 = 1. RB4 = 0. RB5 = 1. RB0 = 0 Este mismo ejemplo de configuración en hexadecimal: PORTB = $AA ' RB7 = 1. RB2 = 0. RB3 = 1. esto se puede lograr de varias maneras: PORTA. por lo cual se deben expresar los ocho bits a ser cargados en el registro “PortB”. RB1 = 1 ' RB6 = 0.9. RB3 = 1.0 = 0 ' RA0 = 1 -> (es igual a High PortA.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1.0) Cuando deseamos poner varios pines de un mismo puerto en “1”. RB2 = 0. seguido del valor calculado.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. podemos utilizar las siguientes opciones: PORTB = %10101010 ' RB7 = 1.0 = 1 PORTA. RB4 = 0. También existen otras formas de poner un “1” o un “0” lógico en un pin configurado como salida. RB1 = 1 ' RB6 = 0. RB0 = 0 Recordemos que el símbolo “%” expresa la notación en binario.0) ' RA0 = 0 -> (es igual a Low PortA. Otra forma de expresar este ejemplo sería colocando la notación en hexadecimal con el símbolo “$”.0 * '**************************************** 58 .

RB3.Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. ' Hace una pausa de 1000 milisegundos = 1 Seg. TRISB = %00000000 PORTB = %00000000 Inicio: PORTB = %01010101 Pause 1000 PORTB = %10101010 Pause 1000 GoTo Inicio End Este programa enciende primero las salidas pares del puerto B y apaga las salidas impares. genera una pausa de 1 segundo (1000 ms) y seguidamente hace el proceso inverso en las salidas. ' Enciente las salidas RB1. RB3. RB5 y RB7. al ' mismo tiempo apaga RB0. RB2. ' Salta a la etiqueta "Inicio" y se repite el ' proceso. RB4 y RB6. ' Hace una pausa de 1000 milisegundos = 1 Seg. 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 . RB5 y RB7. ' Configura el Puerto B como Salida ' Inicializa el puerto "B". RB4 y RB6. es decir. al ' mismo tiempo apaga RB1. RB2. ' Etiqueta de Inicio del programa ' Enciente las salidas RB0.

Figura 5. Proyecto # 3 Componente PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 33 pF LED Resistencia de 220 Ohm Resistencia de 10K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc Cantidad 1 1 2 1 1 1 1 1 Tabla 5.Proyecto #3: Los pines en los puertos de un microcontrolador pueden ser configurados también como entradas.10.3. 60 . ya sea TRISA o TRISB. éste se comportará como entrada. para el caso del PIC16F84A.10 y analice el programa que se muestra a continuación. Realice el montaje de la figura 5.. donde se explica claramente que al poner un “1” en un bit de un registro de configuración de puerto.5. como se detalla en el contenido del proyecto #1.3.

0 = 1 ' Pregunta si RA0 = 1.0 * '**************************************** Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. y para lo cual debemos utilizar necesariamente su complemento “Then” seguido de la acción a ser tomada. se pregunta si RA0 = 1.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1. basadas en condiciones específicas definidas por el programador. Esto es posible gracias a la instrucción “IF” la cual genera un resultado siempre que la condición planteada se cumpla. Pause 1000 Low PORTB. El siguiente programa hace destellar un LED conectado en RB0.0 = 1 Then PORTB.IF – THEM – ELSE Sintaxis: If expresión 1 {AND / OR expresión 2} Then etiqueta Con la instrucción If – Them podemos tomar decisiones a lo largo de un programa. TRISA = %11111 ' configura el Puerto A como Entrada TRISB = %00000000 ' Configura el Puerto B como Salida PORTB = $00 Inicio: If PORTA. si se cumple ' la condición entonces enciende el Led. solo cuado el pulsador es activado: '**************************************** '* Nombre : Proyecto3. 61 .0 Pause 1000 GoTo inicio End ' Hace una pausa de 1 segundo (1000 ms) ' Apaga el Led ' Hace una pausa de 1 segundo (1000 ms) ' Salta a la etiqueta "Inicio" ' Inicializa el puerto B Para verificar si el pulsador está activado.

Figura 5.En este caso si el pulsador ha sido activado. es decir.4. se cumple la condición y por lo tanto RB0 = 1. 62 . 5. con el cual nos hemos planteado la lectura de ocho pulsadores conectados al puerto B.Proyecto #4: En este ejemplo empleamos un microcontrolador PIC16F877A.11. es decir. el LED enciende. entonces RA0 = 1. de tal manera que al activar uno de ellos podemos mostrar un dígito decimal en un Display de siete segmentos..

En el diagrama esquemático de la figura 5. RB1 corresponde al segmento “b”. RB5 corresponde al segmento “f” y RB6 corresponde al segmento “g”. RB4 corresponde al segmento “e”.11 se pueden observar ocho pulsadores normalmente abiertos. El siguiente programa es una forma básica 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. el cual ha sido configurado como entrada. RB3 corresponde al segmento “d”.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1. los cuales una vez activados generan un estado lógico alto en el puerto seleccionado (puerto “B”). El display de 7 segmentos de cátodo común. RB2 corresponde al segmento “c”.4.0 * '**************************************** 63 .Cátodo común Fuente regulada de 5 Vdc Cantidad 1 1 2 8 8 8 1 1 Tabla 5.Proyecto # 4 Componente PIC16F877A Cristal de 4 Mhz Capacitor cerámico de 33 pF Resistencia de 220 Ohm Resistencia de 10K Ohm Pulsador Normalmente Abierto Display de 7 Segmentos . donde el bit menos significativo RB0 corresponde al segmento “a” del display. se encuentra conectado al puerto “D”.

TRISB = $FF TrisD = $00 ' Configura el Puerto B como Entrada ' Configura el Puerto D como Salida Inicio: ' ' ' ' A continuación se verifica cada pin del puerto B.Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. ' gfedcba ' ||||||| If PORTB.2 = 1 Then PortD = %01011011 If PORTB. ' Enciende los segmentos correspondientes ' al dígito “uno” en el display.6 = 1 Then PortD = %01111101 If PORTB.4 = 1 Then PortD = %01100110 If PORTB. ' Enciende los segmentos correspondientes ' al dígito “cuatro” en el display.5 = 1 Then PortD = %01101101 If PORTB.1 = 1 Then PortD = %00000110 If PORTB. ' Enciende los segmentos correspondientes ' al dígito “cinco” en el display.3 = 1 Then PortD = %01001111 If PORTB. If PORTB. ' Enciende los segmentos correspondientes ' al dígito “dos” en el display. si hay un 1 lógico en alguna de las entradas el puerto D se actualiza con el dato correspondiente para generar en el Display un dígito decimal. ' Enciende los segmentos correspondientes ' al dígito “siete” en el display.0 = 1 Then PortD = %00111111 ' Enciende los segmentos correspondientes ' al dígito “cero” en el display. ' Enciende los segmentos correspondientes ' al dígito “tres” en el display. ' Enciende los segmentos correspondientes ' al dígito “seis” en el display.7 = 1 Then PortD = %00000111 GoTo Inicio End ' Salta a la etiqueta "Inicio" 64 .

Proyecto # 5 Componente PIC16F877A Cristal de 4 Mhz Capacitor cerámico de 33 pF Resistencia de 220 Ohm Display de 7 Segmentos . Figura 5.12..5. 65 .Cátodo común Fuente regulada de 5 Vdc Cantidad 1 1 2 8 1 1 Tabla 5.5.Proyecto #5: En el ejemplo a continuación se realiza un conteo ascendente desde cero hasta nueve en un display de 7 segmentos conectado al puerto “D” de un PIC16F877A.5.

FOR… NEXT Sintaxis: For variable = inicio to final * * Instrucciones… * * Next { variable} {step {-} incremento} La instrucción For…Next se encarga de hacer repeticiones de instrucciones que permanecen dentro del lazo For… Next. Si este parámetro es omitido.0 * '**************************************** Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1. el incremento es en una unidad. Analice el siguiente programa: '**************************************** '* Nombre : Proyecto5. ' Declaración de la Variable "I" tipo Byte I Var Byte ' Constantes para definir cada dígito decimal en el Display: ' gfedcba ' ||||||| %00111111 %00000110 %01011011 %01001111 %01100110 %01101101 %01111101 %00000111 Cero Uno Dos Tres Cuatro Cinco Seis Siete CON CON CON CON CON CON CON CON 66 . El parámetro Step afecta el incremento según el valor asignado después de esta palabra.

Next ' Salto con Retorno hacia la etiqueta "Digito" ' Pausa de 1 segundo (1000 ms) ' Configura el Puerto D como Salida Call Digito Pause 1000 Next I GoTo Inicio Digito: ' Salta a la etiqueta "Inicio" ' Verificación del dígito a ser mostrado en el Display el cual ' se corresponde con el valor almacenado en la variable "I". Si deseamos realizar el incremento en más de una unidad por vez. tan solo debemos incluir la directiva “Step”. es decir. seguido del incremento.Ocho Nueve CON %01111111 CON %01100111 ' Configuración del Puerto de Salida: TrisD = $00 Inicio: For I = 0 To 9 ' Repetición de Instrucciones dentro del Lazo ' For . entonces el lazo For – Next se compone de la siguiente manera: 67 . If If If If If If If If If If I I I I I I I I I I = = = = = = = = = = 0 1 2 3 4 5 6 7 8 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 End ' Retorna una línea después del salto con retorno (Call) Al iniciar el conteo en el display de 7 segmentos. se puede observar un conteo ascendente que da inicio en cero y se va incrementando en una unidad cada segundo hasta llegar a nueve. si queremos realizar un incremento de dos unidades por vez.

' Salto con Retorno hacia la etiqueta "Digito" ' Pausa de 1 segundo (1000 ms) Call Digito Pause 1000 Next I Esto significa que el conteo arranca en cero y cada segundo transcurrido se podrán ver los dígitos: “2”. el cual genera tonos DTMF consecutivos de una serie de dígitos predefinidos.13 y analice el programa que se muestra a continuación. “4”. tonos que se utilizan en telefonía para marcar una serie de números y así poder establecer la comunicación entre dos o más personas.Proyecto #6: PicBasic cuenta con una instrucción capaz de generar tonos DTMF (Dual Tone Multifrecuency .Multifrecuencia de doble tono). “6” y “8”. ' Salto con Retorno hacia la etiqueta "Digito" ' Pausa de 1 segundo (1000 ms) Call Digito Pause 1000 Next I En este caso en conteo inicia en nueve y decrece en una unidad hasta llegar a cero.6. Realice el montaje de la figura 5. Es muy importante considerar que para generar los tonos adecuadamente el oscilador externo debe ser de 10 Mhz o superior.For I = 0 To 9 Step 2 ' Repetición de Instrucciones dentro del Lazo ' For – Next con incremento en dos unidades. para luego generar un mensaje de voz que nos alerte de dicho evento. 68 . Una aplicación interesante para esta instrucción podría ser el discado de números telefónicos en sistemas de alarma cuando ha sido activado un dispositivo de supervisión. el lazo For – Next se compone de la siguiente forma: For I = 9 To 0 Step -1 ' Repetición de Instrucciones dentro del Lazo ' For – Next. Para realizar un conteo regresivo.. 5.

6. obtendremos las mismas frecuencias baja y alta que se generan al pulsar el dígito “1” de cualquier teléfono de tonos DTMF.7 se puede observar la frecuencia baja y la frecuencia alta de cada digito entre cero y quince.Figura 5.13. Si deseáramos generar desde el microcontrolador el tono DTMF 69 . En la tabla 5. como se puede observar en la segunda columna de la misma tabla. los cuales se corresponden a su vez con cada uno de los dígitos de un teclado telefónico. Esto quiere decir que si generamos las frecuencias correspondientes al dígito “1” utilizando la instrucción “DTMFout”. Proyecto # 6 Componente PIC16F84A Cristal de 10 Mhz Capacitor cerámico de 33 pF Capcitor Electrolítico de 10 uF Parlante de 8 Ohm Fuente regulada de 5 Vdc Cantidad 1 1 2 2 1 1 Tabla 5.

el dígito a introducir en la instrucción “DTMFout” deberá ser el “10”.14. según la tabla 5.correspondiente al dígito “0” de un teclado telefónico. Figura 5.7. 70 .7. entonces. Dígito en la Instrucción DTMFout 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 Dígito en un Teclado Telefónico 1 2 3 4 5 6 7 8 9 0 * # A B C D Frecuencias Bajas 697 HZ 697 HZ 697 HZ 770 HZ 770 HZ 770 HZ 852 HZ 852 HZ 852 HZ 941 HZ 941 HZ 941 HZ 697 HZ 770 HZ 852 HZ 941 HZ Frecuencias Altas 1209 HZ 1336 HZ 1477 HZ 1209 HZ 1336 HZ 1477 HZ 1209 HZ 1336 HZ 1477 HZ 1209 HZ 1336 HZ 1477 HZ 1633 HZ 1633 HZ 1633 HZ 1633 HZ Tabla 5.

Off-ms: es una variable o constante que especifica el tiempo en milisegundos del silencio que hay entre cada tono. {On-ms. Pin: especifica el pin del puerto en el cual se emitirán los tonos DTMF.. Tono: puede ser una variable o constante entre 0 y 15. [tono. Off-ms}. el tiempo por defecto de cada tono es de 200 ms. 71 ..Antes de empezar a programar. On-ms: es una variable o constante que especifica la duración de cada tono en milisegundos. tono. En caso de no utilizar este parámetro.tono] La instrucción DTMFout genera tonos DTMF en secuencia y a través de un puerto cualquiera del microcontrolador.. el tiempo en silencio entre cada tono por defecto será de 50 ms. En caso de no utilizar este parámetro. que especifica el tono que debe ser generado. vamos a verificar la sintaxis de la instrucción DTMFout: DTMFout Sintaxis: DTMFout pin.

14.0 * '**************************************** Define Osc 10 TRISA = $FE ' Define el Oscilador en 10 Mhz.4.5. Inicio: DTMFOut PORTA.7.10.9.7.1.4.13.2.Programa en Pic Basic: '**************************************** '* Nombre : Proyecto6.11.8.12. 150.1.3. ' Configura el pin RA0 como Salida ' y el resto de los pines como entrada. [0.15] ' Genera una pausa de 2 segundos.12.2.14.6.5.3. Pause 2000 DTMFOut PORTA.10. [0.11. Pause 2000 GoTo Inicio End 72 .13.6.8.0.0. 400.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1.9.15] ' Genera una pausa de 2 segundos. ' Salta a la etiqueta "Inicio".

Esto significa que el microcontrolador genera cada tono con una duración de 200 milisegundos por defecto. después de la etiqueta “Inicio”. no se especifica la duración de cada tono y el tiempo en silencio entre cada tono. y un tiempo en silencio entre cada tono de 50 milisegundos como se muestra en las figuras 5.15.15 y 5.Observe que en la primera instrucción “DTMFout”.16 respectivamente: Figura 5. 73 .

Estos tiempos pueden ser ajustados a conveniencia cada vez que sea necesario.17).18). 74 . La segunda instrucción “DTMFout”.16.Figura 5. tiene definido un tiempo de duración para cada tono de 400 milisegundos (figura 5. y un tiempo de espera entre cada tono de 150 milisegundos (figura 5. después de la etiqueta “Inicio”.

18. 75 .17.Figura 5. Figura 5.

7. acción.19). Pin: especifica el pin del puerto en el cual será conectado el pulsador. la cual puede ser variada fácilmente como lo demostraremos a continuación. como sucede en el caso de los teclados de las computadoras. el pulsador deberá ser activo-bajo y si es 1. veamos la sintaxis de la instrucción Button: Button Sintaxis: Button pin. 76 . variable. retardo.. Si es 0. Antes de empezar. en las cuales si dejamos presionado un botón o tecla. etiqueta elimina los rebotes de un “pulsador” o “switch”. el pulsador deberá ser activo-alto (Ver figura 5.Proyecto #7: En este proyecto estudiaremos la instrucción “Button”. Estado: indica cual es estado lógico que debe ocurrir cuando el pulsador es presionado (0 o 1).5. estado. rango. la cual es utilizada para la eliminación de rebotes en pulsadores o para efectuar repeticiones en un botón. y La instrucción “Button” genera auto-repetición. la misma se repite indefinidamente a una frecuencia específica.

Este campo tiene dos funciones especiales: si el campo retardo es igual 0. permite el antirebote pero no permite la auto-repetición. Variable: es una variable auxiliar tipo Byte. Si el campo retardo es igual a 255. Retardo: es una variable o constante (0 – 255) que especifica cuantos ciclos deben pasar antes de efectuar la auto-repetición. definida también al inicio del programa para uso exclusivo de la instrucción Button.19. Acción: indica el estado del botón cuando éste no es presionado. 77 . Rango: es una variable o constante (0 – 255) que especifica el número de ciclos entre auto-repeticiones. por lo cual no deberá ser utilizada con otro fin en el programa.Figura 5. no permite anti-rebote y no permite auto-repetición. Siempre debe ser inicializada antes del comando Button.

PULSout Sintaxis: PULSout pin. genera pulsos con una duración definida en decenas de microsegundos. nivel.Etiqueta: la instrucción realiza un salto a la etiqueta definida en este campo cuando el pulsador no ha sido presionado. Adicionalmente utilizaremos la instrucción “Pulsout” en el ejemplo. variable La instrucción “PULSout”. para generar pulsos de tiempo definido. y una resolución de 2 microsegundos para un oscilador de 20 Mhz). 78 . (Tiene una resolución de 10 microsegundos para un oscilador de 4 Mhz.

8.3 Componente PIC16F877A Cristal de 4 Mhz Capacitor cerámico de 33 pF Resistencia de 10K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc Cantidad 1 1 2 1 1 1 Tabla 5.20. Proyecto # 7 .2 .Para este proyecto hemos preparado tres ejemplos los cuales están basados en el circuito de la figura 5. 79 . Figura 5.20.7.1 .7.7.

1. Luego.Proyecto #7.2.1: Para el primer ejemplo. 5.150 ' Genera un pulso de 1. el cual debemos configurar como entrada en el programa. en el cual hemos conectado un osciloscopio para poder ver el resultado de las señales generadas a partir de las especificaciones dadas en cada ejemplo a continuación.7. debe empezar una auto-repetición de este pulso cada 10 milisegundos.. Cuando el pulsador sea presionado.1 = 0 Inicio: Button PORTB. se pide generar un pulso de 1. pasados 20 milisegundos con el botón presionado.Se puede observar en el diagrama esquemático.Tiempo PulsOut PORTB. que mientras el pulsador permanece abierto.1.5 milisegundos una vez presionado el botón. La salida a través de la cual se van a generar los pulsos será el pin RB1. el estado lógico en el pin RB0 será un uno lógico.1.1.0. Tiempo: Pause 10 GoTo Inicio End ' Pausa de 10 milisegundos ' Salta a inicio ' Configuración del puerto B ' declaración de la variable A para la instrucción Button. ' inicializa la variable A ' Inicializa la Salida RB0 80 .5ms o 150 decenas de ' microsegundos.0.A. Veamos el siguiente programa: Define Osc 4 TRISB = %11111101 A Var Byte A = 0 PORTB. hay un cero lógico en el pin RB0.

y el programa continúa su curso hasta completar el primer ciclo.0.Tiempo • Figura 5. y finalmente retorna a la etiqueta inicio.2. se genera el primer pulso a través de la instrucción “Pulsout PortB. ya que hemos especificado en la instrucción Button.21).21.A.1. que ésta debe comenzar al terminar el segundo ciclo: Button PORTB.0.1. 150” (figura 5. Seguidamente el programa completa el ciclo ejecutando las instrucciones que siguen. 81 . la instrucción Button salta a la etiqueta especificada.1.Ahora analicemos la secuencia del programa: • Mientras el pulsador permanece abierto. la cual en este caso hemos denominado “Tiempo”. En este punto la autorepetición aún no comienza. Si es presionado el pulsador.

1. han transcurrido los primeros 10 milisegundos.Al terminar el primer ciclo de programa. Con el segundo ciclo de programa ocurre nuevamente el salto a la etiqueta “Tiempo”. la instrucción empieza la auto-repetición cada “un ciclo”.2.22.1. para un tiempo de espera antes de ejecutar la auto-repetición de 20 milisegundos.A. • Cumplidos los dos ciclos especificados en el campo “retardo” de la instrucción Button. Figura 5.0. ya que así lo hemos especificado en el campo “rango” de la instrucción: Button PORTB.0. produciéndose una nueva pausa de 10 milisegundos.Tiempo 82 .

Figura 5.En la figura 5. y que el tiempo entre cada autorepetición es de 10 milisegundos (figura 5.23). 83 . Observe que el tiempo entre el primer pulso y la auto-repetición es de 20 milisegundos.23.22 se puede apreciar la lectura de la señal producida por el programa al activar el pulsador.

la cual permanecerá hasta que el pulsador sea liberado. en la cual se ve la auto-repetición del pulso de 1.24 se puede observar la señal generada al activar el pulsador.En la figura 5.24. 84 .5 milisegundos. Figura 5.

Analice el siguiente programa: Define Osc 4 TRISB = %11111101 A Var Byte A = 0 PORTB.150 Tiempo: Pause 10 GoTo Inicio End ' Pausa de 10 milisegundos ' Salta a inicio ' Genera un pulso de 1.0.2. ' Configuración del puerto B ' declaración de la variable A ' inicializa la variable A ' Inicializa la Salida RB0 Observe en el programa que el único cambio para lograr el objetivo.1.2: Para el siguiente ejemplo se pretende generar el mismo pulso de 1.1 = 0 Inicio: Button PORTB..5 milisegundos indefinidamente cada 20 milisegundos.Tiempo La secuencia para este programa es la siguiente: • Mientras el pulsador permanece abierto. Cuando activamos el pulsador. siempre y cuando el pulsador permanezca activado.Proyecto #7. lo cual significa que se deben esperar dos ciclos de programa entre cada autorepetición para producir el pulso de 1.Tiempo PulsOut PORTB. se genera el primer pulso de 1.5 milisegundos gracias a la instrucción Pulsout. luego se genera una • 85 .1.A.2.2.0.A.2. al igual que en el ejemplo anterior.5 milisegundos.2.5.1.5ms o 150 decenas de ' microsegundos. la instrucción Button hace un salto a la etiqueta “Tiempo” por cada ciclo de programa.0. ha sido aumentar en una unidad el campo “rango” de la instrucción Button. Button PORTB.0.7.

Ahora podemos ver en el osciloscopio (figura 5. la instrucción Button verifica el conteo de los ciclos. • Figura 5.5 milisegundos de la auto-repetición.25). de tal manera que ocurre nuevamente el salto a la etiqueta “Tiempo”. y en la cual se produce un pulso de 1.pausa de 10 milisegundos y finaliza el primer ciclo con un salto a la etiqueta “Inicio”. determinando que aún no se puede empezar la auto-repetición hasta tanto no haya culminado el segundo ciclo. cada 20 milisegundos. En el segundo ciclo.5 milisegundos.25. la señal generada al activar el pulsador. el cual es controlado por la variable “A”. se produce el primer pulso de 1. • Culminados los dos ciclos definidos en el campo “retardo” de la instrucción Button para el anti-rebote. y se produce una nueva pausa de 10 milisegundos. 86 .

lo cual da como resultado un retardo de 30 milisegundos. Debido a que el campo “retardo” en la instrucción Button es igual a tres.5ms o 250 decenas de ' microsegundos. se genera un pulso de 2.3: En este ejemplo se debe generar un pulso de 2.5 milisegundos. la secuencia de programa es la siguiente: • • Al activar el botón.3. pasando por la subrutina “Tiempo” en cada ciclo. generando un pulso de 2.7. con un tiempo para anti-rebotes en el pulsador de 30 milisegundos.1.Tiempo PulsOut PORTB. y para la auto-repetición un ciclo de programa.A.. Al culminar el tercer ciclo de programa.0.1 = 0 Inicio: Button PORTB. empieza la auto-repetición. la instrucción ejecutará la auto-repetición después de cumplir con los tres ciclos de programa.3.1.Proyecto #7. y un tiempo entre cada auto-repetición de 10 milisegundos.1.5 milisegundos. Analice el siguiente programa: Define Osc 4 TRISB = %11111101 A Var Byte A = 0 PORTB.5 milisegundos por cada ciclo de programa.250 Tiempo: Pause 10 GoTo Inicio End ' Pausa de 10 milisegundos ' Salta a inicio ' Genera un pulso de 2.0. ' Configuración del puerto B ' declaración de la variable A ' inicializa la variable A ' Inicializa la Salida RB0 En este caso se puede observar que los parámetros en la instrucción Button han sido configurados para que el tiempo en anti-rebote dure tres ciclos de programa. Entonces. • 87 .5.

aproximadamente cada 10 milisegundos. al igual que la medición del tiempo en el pulso generado por la instrucción “Pulsout”.es decir. 88 . Figura 5. La auto-repetición se mantiene siempre y cuando el pulsador permanezca activo.5 milisegundos.26. En la figura 5.26 se puede observar la señal generada al activar el pulsador. igual a 2.

27. igual a 30 milisegundos. la cual se mantiene siempre que el pulsador se encuentre presionado. También se puede observar claramente. se puede apreciar el tiempo de espera generado por la instrucción “Button”. se genera una auto-repetición del pulso.En la figura 5. que una vez culminado este tiempo. para evitar los rebotes en el pulsador. Figura 5.27. 89 .

28.28 la medición del tiempo entre cada auto-repetición.Observe en la figura 5. 90 . Figura 5.

8. en el cual se debe iluminar cada Led en forma consecutiva por cada segundo transcurrido. Figura 5.29.5. 91 .Proyecto #8: En este proyecto estudiaremos la instrucción “Branch”.29..9. Proyecto # 8 Componente PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 33 pF LED Resistencia de 220 Ohm Fuente regulada de 5 Vdc Cantidad 1 1 2 3 3 1 Tabla 5. con un ejemplo sencillo basado en el circuito de la figura 5.

el salto se hace a la etiqueta 2. el salto se hace a la etiqueta 3. Etiqueta2. y así sucesivamente. el salto se hace a la etiqueta 1.…EtiquetaN] La instrucción Branch hace un salto a una etiqueta dependiendo del valor de la variable.0 * '**************************************** I var Byte TRISB = $00 PORTB = $00 I = 0 Inicio: Branch I. es decir. si la variable es igual a 1. si la variable es igual a 0.[Led1. Analice el siguiente programa: '**************************************** '* Nombre : Proyecto8.Branch Sintaxis: Branch Variable.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1.Led2.[Etiqueta1.Led3] ' Declaración de la variable “I” ' Configura el puerto B como salida ' Inicializa el puerto B ' Inicializa la variable I Led1: PORTB = %00000001 Pause 1000 PORTB = %00000000 I = I + 1 GoTo 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 ' ' ' ' ' enciende el led en RB0 pause de 1 segundo apaga el led suma 1 a la variable I salta a inicio 92 . si la variable es igual a 2.

si I = 2. si I = 1. que se corresponde con la posición de la etiqueta que hemos designado entre los corchetes. 93 . la instrucción hace un salto a la etiqueta “Led2”. la instrucción “Branch” hace un salto a la etiqueta especificada según el valor cargado en la variable “I”. si I = 0. Entonces. la instrucción hace un salto a la etiqueta “Led1”.Led3: PORTB = %00000100 Pause 1000 PORTB = %00000000 I = 0 GoTo Inicio End ' ' ' ' enciende el led en RB2 pause de 1 segundo apaga el Led Inicializa la variable I ' salta a inicio Observe en el programa que a partir de la etiqueta “Inicio”. entonces la instrucción hace un salto a la etiqueta “Led3”.

9. Figura 5.Proyecto #9: La instrucción “PWM”. 94 . Proyecto # 9 Componente PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 33 pF Resistencia de 10K Ohm Capcitor Electrolítico de 10 uF Fuente regulada de 5 Vdc Cantidad 1 1 2 1 1 1 Tabla 5..10.5.30. A continuación realizaremos un ejemplo de aplicación de la instrucción PWM para generar un voltaje determinado.30. aplicando una serie de cálculos sencillos. puede ser usada para generar voltajes analógicos implementando el circuito conectado al pin RB0 de la figura 5.

ciclo La instrucción PWM envía pulsos PWM (Pulse Width Modulation) a un pin específico. cuando nivel = 255. la salida se mantiene en cero lógico. o para regular voltajes en fuentes conmutadas entre otras aplicaciones. hasta nivel = 254. 95 . PWM es una abreviación de Pulse Width Modulation. nivel. Pin: especifica el pin del puerto en el cual se genera PWM. Nivel: es una variable o constante que determina la duración del pulso en su nivel alto. Este control se lleva a cabo modificando el ancho de pulso o ciclo de trabajo de la señal generada. Vfuente: voltaje de la fuente de alimentación del circuito. Ciclo: es una variable o constante en el cual se define el número de ciclos en un pin específico. Nivel: constante entre 0 y 255. partiendo de nivel = 1. si se incrementa este valor. Cuando nivel = 0. donde el ciclo de trabajo es aproximadamente 100%. y es un método utilizado normalmente para el control de velocidad de motores eléctricos. podemos aplicar la siguiente fórmula: Vout = Vfuente ∗ nivel 255 donde. En nuestro ejemplo. para generar un voltaje específico en una de las salidas de un microcontrolador a través de la instrucción PWM. Vout: voltaje de salida. la salida se mantiene en uno lógico.PWM Sintaxis: PWM pin. es decir. el ancho de pulso positivo se incrementa. o modulación por ancho de pulso.

podemos comprobar que éste se aproxima al valor deseado de 3. nivel = Vout ∗ 255 3. Al medir el voltaje en la salida del circuito de la figura 5. El programa a ser cargado en el microcontrolador es el siguiente: DEFINE OSC 4 Inicio: PWM PORTB.5 ≈ 179 Vfuente 5V El valor a ser cargado en el campo “nivel” de la instrucción es 179.5V.Por ejemplo.30. entonces.0. si deseamos obtener Vout = 3.100 GoTo Inicio End ' Señal PWM ' Salto a inicio ' Define el oscilador en 4 Mhz 96 .179.5V ∗ 255 = = 178.5 voltios.

3. también resulta interesante mencionar que existen en el mercado pantallas gráficas (GLCD). Pantalla GLCD (Graphic Liquid Crystal Display) de 128x64 pixel. son las más utilizadas hoy en día en el desarrollo de proyectos o equipos electrónicos en los cuales se hace necesario visualizar mensajes de texto cortos. Figura 6.3. y donde se debe aplicar un método de control diferente al de las pantallas alfanuméricas. Aunque en esta edición solo estudiaremos el uso de pantallas alfanuméricas. Figura 6.Pantallas LCD: Las pantallas LCD alfanuméricas. Todas estas configuraciones también se encuentran para 20 columnas y hasta para 40 columnas. 97 . como la que se observa en la figura 6..Módulos LCD Capitulo VI 6.2.1. de 2x16 y de 4x16 (Filas x Columnas). Figura 6. Pantalla LCD 2x16.1. que proporcionen la información adecuada sobre un evento determinado. Pantalla LCD 4x16. Las pantallas más comunes suelen ser de 1x16.

1 y 2 corresponden a la alimentación de la pantalla. esta condición indica que podemos escribir un dato en la pantalla. Pines 7 al 14.Identificación de los pines de una pantalla LCD: Veamos a continuación la descripción de cada uno de los pines de una pantalla LCD: Figura 6. cuando RS es cero. Pin 1. de tal manera que podemos escribir o leer desde el modulo LCD.4. GND y Vcc.2.4. este es el pin de habilitación. el dato presente en el bus corresponde a un registro de datos o caracter alfanumérico. si E = 0 el módulo LCD se encuentra inhabilitado para recibir datos. pero cuando RS es uno. El Pin No. donde el voltaje máximo comúnmente soportado es de 5 Vdc. el Pin No.6. el módulo LCD se encuentra habilitado para trabajar. Pin 4: "RS" (trabaja paralelamente al Bus de datos del modulo LCD.3 corresponde al control de contraste de la pantalla. esta condición nos permite leer un dato desde la pantalla LCD. 98 . este pin es utilizado para leer un dato desde la pantalla LCD o para escribir un dato en la pantalla LCD. Pinout de un módulo LCD con conexión a Vcc. es decir. Si R/W = 1. es decir. Gnd y Control de contraste. Pin 5: "R/W" (Read/Write). el dato presente en el bus corresponde a un registro de control o instrucción. en la mayoría de las pantallas LCD. Pin 6: "E" (Enable). 2 y 3: como se puede observar en la figura 6. pero si E = 1.. Si R/W = 0.

Pin 15-16: "BackLight". de manera tal que el Pin 15 sea el “Cátodo” y el Pin 16 el “Ánodo”. Si deseamos trabajar solo con los cuatro bits más significativos del bus.5. como se muestra en la figura 6. aunque se pueden encontrar en el mercado modelos de pantallas LCD donde esta condición es configurable desde la parte posterior del circuito impreso a través de “Jumpers”. en muchos modelos de LCD. estos deberán ser conectados en los cuatro bits menos significativos de un puerto o en los cuatro bits más significativos del puerto seleccionado. 6. el Pin R/W deberá estar conectado a tierra (GND) para indicar a la pantalla LCD que estaremos escribiendo.Pin 7 al14: "Bus de Datos”.3. o conexiones donde podemos invertir los Pines. Los pines E (Pin 6) y RS (Pin 4) pueden estar conectados en cualquier puerto del microcontrolador. los pines 15 y 16 son respectivamente el “Ánodo” y el “Cátodo”.5. Al emplear los ocho bits.Conexión 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). 99 . el Pin 7 hasta el Pin 14 representan 8 líneas que se utilizan para colocar el dato que representa una instrucción para el modulo LCD o un carácter alfanumérico. esto debido a que estaremos trabajando inicialmente solo con la instrucción “Lcdout”. estos deberán estar conectados en un solo puerto y nunca en puertos diferentes. Por último. Figura 6..

pero ésta deberá ser definida al inicio del programa para garantizar que la pantalla funcione correctamente. sin embargo.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 configuración es a 8 bits de datos. En este caso no será necesario definir estas conexiones en el programa. y podrá notar que las conexiones entre la pantalla LCD y el microcontrolador PIC coinciden exactamente con cada línea de programa de la nota anterior. lo cual reduce a la mitad la cantidad de pines a ser utilizados en un puerto de un microcontrolador PIC. lo cual requiere que conectemos todos los pines del bus (D0 hasta D7 en la pantalla LCD).6. es conveniente saber que el funcionamiento de un programa para el manejo de una pantalla LCD. ' Selección 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 A ' “RS” estará conectado en RA4 ' Indica al uC que el pin “E” estará en el Puerto B ' “E” estará conectado en RB3 DEFINE LCD_BITS DEFINE LCD_DBIT 4 0 DEFINE LCD_RSREG PORTA DEFINE LCD_RSBIT 4 DEFINE LCD_EREG DEFINE LCD_EBIT PORTB 3 Compare estas definiciones con el diagrama esquemático de la figura 6. 100 . La segunda configuración posible es a 4 bits de datos. • Nota Importante: PIC Basic asume por defecto que el conexionado entre un módulo LCD alfanumérico y un microcontrolador.6. se ha realizado como se muestra en el diagrama esquemático de la figura 6. no se verá afectado si decidimos definir cada una de las conexiones como se muestran a continuación: DEFINE LCD_DREG PORTA ' Indica que el Bus de datos estará conectado ' en el Puerto A. ' El bus de datos de la LCD será de cuatro bits. en uno de los puertos disponibles de un microcontrolador PIC.

Proyecto # 10 Componente PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 33 pF Pantalla LCD 16x4 Resistencia de 1K Ohm Potenciómetro de 5K Ohm Fuente regulada de 5 Vdc Cantidad 1 1 2 1 1 1 1 Tabla 6.Figura 6.6. 101 .1.

$0E $FE. 1 $FE.2. pero siempre tomando en cuenta las definiciones anteriormente mencionadas. en ellas se especifica la disposición de los pines de la pantalla LCD con respecto a su conexión en los puertos del microcontrolador.2: Comando $FE. $C0 $FE. $0F $FE. seguida del mensaje o variable que se desea mostrar. Para el caso específico de la primera línea en una pantalla LCD. $90 $FE. bastará solo con escribir la instrucción “Lcdout”. La instrucción “Lcdout” va acompañada de un comando de control el cual opera según la tabla 6. $10 $FE. 2 $FE. Estos comandos son indispensables para especificar en la pantalla LCD la acción que deseamos tomar.Aunque esta configuración es la que PicBasic asume por defecto. dato La instrucción “Lcdout” envía datos específicos a una pantalla LCD Alfanumérica para que puedan ser mostrados en la misma. $14 $FE. 102 . $D0 Acción Limpia la pantalla Retorna al inicio de la primera línea Apaga el Cursor Cursor bajo (Underline "_") activo Cursor intermitente activo Mueve el cursor un espacio a la izquierda Mueve el cursor un espacio a la derecha Mueve el cursor al inicio de la segunda línea Mueve el cursor al inicio de la tercera línea Mueve el cursor al inicio de la cuarta línea Tabla 6. la misma puede ser cambiada según convenga. $0C $FE. LCDout Sintaxis: LCDout comando.

1 LCDOut $fe. ' Programa en PIC Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz.2. 2 LCDOut ' Limpia la pantalla ' Posiciona el cursor en el inicio "* Pantalla LCD *" 103 .$D0..Proyecto #10.7. 6.$C0. "Mensaje Linea Lcdout $fe.6. cambiando la dirección en el comando de control de la instrucción. para escribir un mensaje en cada línea de una pantalla LCD.$90. con el fin de comprobar la tabla 6. En el siguiente programa se puede ver que no ha sido utilizado ningún tipo de definición de parámetros de conexión para los pines de control entre la pantalla y el microcontrolador. "Mensaje Linea 1" 2" 3" 4" También es posible iniciar un mensaje en otra posición en las líneas 2. tenemos que: Lcdout "Mensaje Linea Lcdout $fe. Pause 500 LCDOut $fe.En la figura 6. Entonces. 3 y 4. 3 y 4: Pantalla LCD 16x4 Línea 1 Línea 2 $C0 $C1 $C2 $C3 $C4 $C5 $C6 $C7 $C8 $C9 $CA $CB $CC $CD $CE $CF Línea 3 $90 $91 $92 $93 $94 $95 $96 $97 $98 $99 $9A $9B $9C $9D $9E $9F Línea 4 $D0 $D1 $D2 $D3 $D4 $D5 $D6 $D7 $D8 $D9 $DA $DB $DC $DD $DE $DF Figura 6.7 se muestran las direcciones de cada caracter en las líneas 2.4. Realice el montaje y haga modificaciones al programa mostrado a continuación. "Mensaje Linea Lcdout $fe. por lo cual se asume que el conexionado entre ambos dispositivos deberá ser igual al planteado en el diagrama de la figura 6.

8 y 6.9. "* Alfanumerica *" LCDOut $fe.$C0. "* AaBbCcDdEeFf *" Inicio: GoTo Inicio End ' Salta a la etiqueta inicio Al conectar el circuito de la figura 6.$90. Figura 6. cada frase preestablecida en el programa. podremos ver como se despliega en la pantalla LCD de cuatro líneas. como se muestra en las figuras 6. Figura 6.9. "* 1234567890 *" LCDOut $fe. 104 .LCDOut $fe.8.6 y el programa cargado en el microcontrolador.$D0.

En el diagrama de la figura 6. Los puertos han sido configurados de la siguiente manera: • • Puerto B: se configura como entrada ya que en los pines RB0 y RB1 estarán conectados los pulsadores P1 y P2. con el fin de utilizar en el programa la definición de conexiones anteriormente mencionada. La segunda condición 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). y la cual podrá ser incrementada al accionar el pulsador “P1” conectado en RB0. • 105 .. Para este ejemplo se ha realizado un programa que muestra el valor cargado en una variable a la cual hemos denominado “Dato”. La variable “Dato” ha sido inicializada con un valor cargado igual a 25.10 se puede observar que la conexión entre el modulo LCD y el microcontrolador ha cambiado con respecto al proyecto #10. Adicionalmente se establecen dos condiciones que se deben cumplir para que la variable pueda aumentar su valor o disminuir: • La primera condición al pulsar P1 para el incremento es: solo podrá ser incrementado el valor cargado en la variable “Dato”.5. simplemente se pregunta si en RB0 o en RB1 hay un cambio de estado lógico. Para aumentar o disminuir este valor.6. el valor de esta variable también podrá decrecer al accionar el pulsador “P2” conectado en RB1. si ésta es menor (“<”) a cincuenta (50). Puerto D: se configura como salida ya que éste será utilizado para el control de la pantalla LCD.Proyecto #11.

como se muestra a continuación: Lcdout $fe.Dec Dato ' Escribe el mensaje en la línea 2 ' seguido del valor cargado en la ' variable "Dato" en Decimal."Dato: "."Dato: ". ó.$C0.Para mostrar el valor decimal cargado en la variable “Dato” a través de la pantalla LCD. se debe utilizar la directiva “Dec” o el símbolo “#” antes de la variable. 106 . Lcdout $fe.10.$C0.#Dato Figura 6.

Proyecto # 11 .0 * '**************************************** DEFINE LCD_DREG DEFINE LCD_BITS DEFINE LCD_DBIT DEFINE DEFINE DEFINE DEFINE LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT PORTD 4 4 PORTD 2 PORTD 3 ' ' ' ' ' ' ' ' Indica que el Bus estará conectado en el Puerto D El bus será de cuatro bits. ' Inicializa la Variable Dato = 25.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1. 1 Inicio: 107 . ' Declaración de la Variable "Dato" tipo Byte. Selección 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 Indica al uC que el pin "E" estará en el Puerto D "E" estará conectado en RD3 Define Osc 8 ' Define el Oscilador para un Cristal ' de 8 Mhz.3.12 Componente PIC16F877A Cristal de 8 Mhz Capacitor cerámico de 33 pF Pantalla LCD 16x2 Resistencia de 10K Ohm Potenciómetro de 5K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc Cantidad 1 1 2 1 2 1 2 1 Tabla 6. ' Configura el puerto B como entrada. ' Limpia la pantalla TRISB = $FF TRISD = $00 Dato Var Byte Dato = 25 Lcdout $fe. ' Programa en Pic Basic Pro: '**************************************** '* Nombre : Proyecto11. ' Configura el puerto D como salida.

"Dato: ". Realiza una pausa de 350 milisegundos para evitar que el decremento de la variable sea muy acelerado mientras el pulsador "P2" esté presionado. Return Resta: Dato = Dato . If PORTB.1 = 1 And Dato > 0 Then Call Resta GoTo Inicio ' Salta a la etiqueta "Inicio".$C0. Retorna una línea después del llamado "Call Resta". Suma: Dato = Dato + 1 Pause 350 ' ' ' ' ' Incrementa en una unidad la variable "Dato". Si se cumplen estas dos condiciones. Note que en la línea de programa encargada de imprimir el mensaje “Dato: “.Dec Dato. hay un espacio en blanco entre comillas (“ “) para imprimir en la pantalla: Lcdout $fe. Realiza una pausa de 350 milisegundos para evitar que el incremento de la variable sea muy acelerado mientras el pulsador "P1" esté presionado.Lcdout $fe. " ' Escribe el mensaje en la 2da línea ' seguido del valor cargado en la ' variable "Dato" en Decimal. If PORTB. además del valor cargado en la variable.Dec Dato. hace un salto ' con retorno a la subrutina "Resta". Lcdout "P1 Suma P2 Resta" Lcdout $fe.$C0.1 Pause 350 Return End ' ' ' ' ' Decrementa en una unidad la variable "Dato". Si se cumplen estas dos condiciones." " Analice la razón por la cual ha sido considerado este espacio en blanco. Retorna una línea después del llamado "Call Suma"."Dato: ".2 ' Inicio de la primera línea.0 = 1 And Dato < 50 Then Call Suma ' La siguiente instrucción pregunta si hay un "1" en RB1 y si la variable ' "Dato" es mayor a 0. 108 . ' Escribe mensaje en la primera línea. hace un salto ' con retorno a la subrutina "Suma"." ' La siguiente instrucción pregunta si hay un "1" en RB0 y si la variable ' "Dato" es menor a 50.

6..Proyecto #12. se deberá mostrar el siguiente sub-menú (figura 6. Observe que en esta oportunidad hemos utilizado un alias para cada una de las entradas utilizadas en el puerto B (RB0 se llamará P1.6. como se muestra a continuación: "P1: Ver Mensaje1" "P2: Ver Mensaje2" Figura 6.13).10 para efectuar la programación del microcontrolador.11. La idea principal en este ejemplo.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1. • Al accionar el pulsador “P1”. el cual deberá permanecer visible durante 5 segundos para luego retornar al menú inicial: " Menu #1 " "Mensaje #1 aqui!" Figura 6. ' Programa en Pic Basic Pro: '**************************************** '* Nombre : Proyecto12. • Al accionar el pulsador “P2”.13.12. el cual también deberá permanecer visible durante 5 segundos para luego retornar al menú inicial: " Menu #2 " "Mensaje #2 aqui!" Figura 6. En este proyecto nos hemos basado en el diagrama de la figura 6. se deberá mostrar el siguiente sub-menú (figura 6.12). y RB1 se llamará P2).0 * '**************************************** 109 . Lea detenidamente los comentarios de cada línea del programa. será mostrar un menú inicial en la pantalla LCD.

"P2: Ver Mensaje2" If P1 = 1 Then Call Mensaje1 If P2 = 1 Then Call Mensaje2 GoTo Inicio Mensaje1: LCDOut $fe. Pause 5000 Return End ' Posiciona el cursor en el inicio " Menu #2 " "Mensaje #2 aqui!" ' Pausa de 5 segundos.$C0. 2 ' Posiciona el cursor en el inicio LCDOut "P1: Ver Mensaje1" LCDOut $fe.1 Define Osc 8 ' Alias para RB0 ' Alias para RB1 ' Define el Oscilador para un Cristal ' de 8 Mhz.DEFINE LCD_DREG DEFINE LCD_BITS DEFINE LCD_DBIT DEFINE DEFINE DEFINE DEFINE LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT PORTD 4 4 PORTD 2 PORTD 3 ' ' ' ' ' ' ' ' Indica que el Bus estará conectado en el Puerto D El bus será de cuatro bits. ' Limpia la pantalla TRISB = $FF TrisD = $00 LCDOut $fe. 2 LCDOut LCDOut $fe. ' Retorna una línea después del llamado "Call" ' Posiciona el cursor en el inicio " Menu #1 " "Mensaje #1 aqui!" ' Pausa de 5 segundos.0 Symbol P2 = PORTB. ' Retorna una línea después del llamado "Call" ' Pregunta si RB0 = 1 ' Pregunta si RB1 = 1 110 .$C0. 1 Inicio: LCDOut $fe. ' Configura el puerto D como salida. ' Configura el puerto B como entrada. Selección 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 Indica al uC que el pin "E" estará en el Puerto D "E" estará conectado en RD3 Symbol P1 = PORTB. 2 LCDOut LCDOut $fe.$C0. Pause 5000 Return Mensaje2: LCDOut $fe.

Entonces. Ya es conocido por un ejemplo anterior a éste. debemos utilizar las siguientes directivas: Hexadecimal: Binario: LCDOut LCDOut "Hexadecimal: ". en la cual cargaremos un valor igual a 64. de un dato almacenado en una variable tipo Byte. para mostrar estos valores en la pantalla LCD en su formato correspondiente. En el siguiente ejemplo explicamos la forma de visualizar en la pantalla LCD un valor decimal y sus equivalentes en hexadecimal.Hex Dato "Binario: ". Dato Realice el montaje de la figura 6.6. que si deseamos mostrar el contenido de la variable en decimal. #Dato El equivalente en Hexadecimal para este valor (64) es “40”.14. debemos anteponer la directiva “Dec” o el símbolo “#” a ésta. como se puede ver a continuación: LCDOut LCDOut "Decimal: ". y el equivalente en binario para este mismo valor es “1000000”. Para lograr este objetivo.7.Bin Dato El código ASCII equivalente a este valor (“64”). hemos declarado en el programa la variable “Dato”. Dec Dato "Decimal: ". binario y el código ASCII correspondiente.Proyecto #13.. y se muestra de la siguiente forma: LCDOut "Código ASCII: ". y analice el programa que se muestra a continuación: 111 . como ejemplo inicial. corresponde al símbolo “@”.

14. Proyecto # 13 . 112 .Figura 6.14 Componente PIC16F877A Cristal de 8 Mhz Capacitor cerámico de 33 pF Pantalla LCD 16x2 Potenciómetro de 5K Ohm Fuente regulada de 5 Vdc Cantidad 1 1 2 1 1 1 Tabla 6.4.

"Hexadecimal: ". TrisD = $00 Dato Var Byte Dato = 64 ' Carga la variable "Dato" con el Valor 64." Pause 4000 GoTo Inicio End ' Hace una pausa de 4 segundos.0 * '**************************************** DEFINE LCD_DREG DEFINE LCD_BITS DEFINE LCD_DBIT DEFINE DEFINE DEFINE DEFINE LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT PORTD 4 4 PORTD 2 PORTD 3 ' ' ' ' ' ' ' ' Indica que el Bus estará conectado en el Puerto D El bus será de cuatro bits. ' Configura el puerto D como salida. "Binario:"." " " LCDOut $fe.' Programa en Pic Basic Pro: '**************************************** '* Nombre : Proyecto13.$C0. ' Limpia la pantalla. 2 LCDOut ' Posiciona el cursor en el inicio. 113 . Dato.$C0. "Decimal: ".Dec Dato.BIN Dato " LCDOut $fe. LCDOut $fe. "Codigo ASCII: ". Selección 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 Indica al uC que el pin "E" estará en el Puerto D "E" estará conectado en RD3 Define Osc 8 ' Define el Oscilador para un Cristal ' de 8 Mhz. 2 LCDOut ' Posiciona el cursor en el inicio. 1 Inicio: LCDOuT $fe. LCDOuT $fe. ' Salta a la etiqueta "Inicio".pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1." Pause 4000 ' Hace una pausa de 4 segundos.HEX Dato.

además de sus equivalentes en hexadecimal y código ASCII correspondiente.HEX I. 114 .." Lcdout $fe.0 * '**************************************** DEFINE LCD_DREG DEFINE LCD_BITS DEFINE LCD_DBIT DEFINE DEFINE DEFINE DEFINE LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT PORTD 4 4 PORTD 2 PORTD 3 ' ' ' ' ' ' ' ' Indica que el Bus estará conectado en el Puerto D El bus será de cuatro bits.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1.8. Por cada incremento se muestran los valores equivalentes en hexadecimal y su respectivo código ASCII en la pantalla LCD.Proyecto #14: Analice el programa propuesto a continuación. 1 Inicio: ' ' ' ' A continuación se carga la variable "I" con un valor inicial igual a 33.2 Lcdout "Dec:". ' Limpia la pantalla. Selección 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 Indica al uC que el pin "E" estará en el Puerto D "E" estará conectado en RD3 Define Osc 8 ' Define el Oscilador para un Cristal ' de 8 Mhz.$C0. En este caso se desea mostrar en la pantalla LCD los valores entre 33 y 125 en decimal. TrisD = $00 I Var Byte LCDOut $fe. For I = 33 To 125 Lcdout $fe.6.#I. ' Configura el puerto D como salida. el cual se irá incrementando hasta llegar a 125. I." Hex:". ' Declaración de la variable "I" topo Byte. ' Bucle infinito. el cual está basado en el diagrama esquemático de la figura 6.14. ' Programa en Pic Basic Pro: '**************************************** '* Nombre : Proyecto14."ASCII: "." Pause 1000 Next I Fin: GoTo Fin End " " ' Realiza una pausa de 1 segundo.

. El tren de pulsos cuadrados de frecuencia variable. estaremos realizando un contador de pulsos. P1 para aumentar la frecuencia y P2 para disminuir la frecuencia.Proyecto #15: Con la ayuda de la instrucción “Count”. será generado desde un microcontrolador PIC16F84A utilizando la instrucción “Pulsout”. y el cual deberá ser programado para que sea posible aumentar o disminuir la frecuencia a través de dos pulsadores conectados a él. como se muestra en el diagrama de la figura 6.15. 115 .6.15. el cual se compone básicamente de un PIC16F877A y una pantalla LCD 2x16.9. Figura 6.

para luego ser mostrado en la pantalla LCD. durante un tiempo definido. en el cual cargaremos el programa encargado de realizar el conteo de pulsos enviados desde un microcontrolador PIC16F84A. El tren de pulsos de frecuencia variable desde los pulsadores P1 y P2. que en este caso ha sido de 1000 milisegundos.15 se puede observar un microcontrolador PIC16F877A. el cual también dispone de su propia programación para poder generar un tren de pulsos variables. el cual a su vez realiza constantemente el conteo de pulsos. Veamos a continuación la sintaxis de la nueva instrucción y seguidamente los programas propuestos para este ejemplo. sale desde el pin RB1 del PIC16F84A hacia el pin RB1 del PIC16F877A.16 Componente PIC16F877A PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 33 pF Pantalla LCD 16x4 Resistencia de 10K Ohm Potenciómetro de 5K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc Cantidad 1 1 1 2 1 2 1 2 1 Tabla 6.5. 116 . En el circuito de la figura 6. Seguidamente el resultado del conteo de pulsos en este período de tiempo es almacenado en una variable la cual hemos denominado “Pulsos”.Proyecto # 15 .

Programa para el contador de pulsos (PIC16F877A): DEFINE LCD_DREG DEFINE LCD_BITS DEFINE LCD_DBIT DEFINE DEFINE DEFINE DEFINE LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT PORTD 4 4 PORTD 2 PORTD 3 ' ' ' ' ' ' ' ' Indica que el Bus estará conectado en el Puerto D El bus será de cuatro bits. duración.Count Sintaxis: Count pin. durante el cual se realizará el conteo de pulsos sobre el pin especificado. Para un oscilador de 20 MHz la frecuencia máxima a ser medida será de 125 khz. contando el número de pulsos durante un tiempo determinado. variable Con esta instrucción se puede medir la frecuencia de una señal simple. Selección 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 Indica al uC que el pin "E" estará en el Puerto D "E" estará conectado en RD3 Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. definido en el campo “duración” de la instrucción. Variable: es una variable definida por el programador en la cual se grabará el resultado del conteo.1. durante 1000 milisegundos y el ' resultado del conteo es almacenado en la 117 . Este pin es designado como entrada automáticamente por la instrucción Count. Se pueden medir frecuencias de hasta 25 khz con un oscilador de 4 MHz. Pulsos ' Cuenta los pulsos introducidos a través ' del pin RB1. Pin: especifica el pin del puerto en el cual se introducirán los pulsos. 1 Inicio: Count PORTB. Duración: es el tiempo en milisegundos. ' declaración de la variable "Pulsos" tipo Word ' Limpia la pantalla Pulsos Var Word Lcdout $fe. 1000.

' Escribe mensaje en la primera línea.1 = 0 Base = 100 Espera = 1 Inicio: ' Inicializa la Salida RB0 ' Inicializa la variable Base = 100 If PORTB.$C0. se han definido los pines de control y bus de datos de la pantalla LCD. cuenta los pulsos introducidos por el pin RB1. " ' Escribe dato en pantalla. en la pantalla LCD y se retorna a la etiqueta “Inicio”. Por último se muestra el valor cargado en la variable “Pulsos”."Medida = ".' variable "Pulsos". La instrucción “Count”. Programa para el generador de pulsos (PIC16F84A): Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz.0 = 1 Then Call Suma ' Si RB0 = 1 llama a la subrutina "Suma" 118 . LcdOut $FE.2 Lcdout "Frecuencia " ' Inicio de la primera línea. ' Configuración del puerto B ' Declaración de la variable "Base" tipo Word TRISB = %11111101 Base Var Word Espera VAR Word PORTB. al igual que la frecuencia del oscilador externo. Lcdout $fe. Seguidamente se define la variable “Pulsos”." Hz GoTo Inicio End ' Salta a la etiqueta "Inicio" Análisis del programa: • • • • • Para empezar. y el resultado es almacenado en la variable “Pulsos”. en la cual se cargará el resultado del conteo de los pulsos introducidos a través del pin RB1.#Pulsos. Se limpia la pantalla LCD.

1. ha sido declarada la variable “Base” y la variable “Espera”.100 If Base = 0 Then Base = 100 Espera = Base / 100 ' ' ' ' ' ' ' ' ' Pausa de 300 milisegundos decrementa la variable "Base" Establece un límite máximo al valor cargado en la variable "Base". Divide el valor cargado en la variable "Base" entre 100 y lo carga en la variable "Espera". además de la pausa generada entre cada pulso. para que la pausa que se genera ' después de cada pulso sea igual al tiempo ' del pulso. las cuales serán necesarias para almacenar la base de tiempo de los pulsos generados por la instrucción Pulsout.Base ' Genera un pulso de duración definida por la variable ' "Base". ' Retorna una línea después del llamado "Call" ' Pausa de "Base/100" milisegundos ' Salta a inicio Return End ' Retorna una línea después del llamado "Call" Análisis del programa: • En el programa se puede observar que se han dado los pasos necesarios en lo que respecta a la definición del tipo de oscilador y la configuración del puerto que estamos utilizando en el diseño propuesto. para que la pausa que se genera después de cada pulso sea igual al tiempo del pulso.2 = 1 Then Call Resta ' Si RB2 = 1 llama a la subrutina "Resta" PulsOut PORTB. Espera = Base / 100 ' Divide el valor cargado en la variable ' "Base" entre 100 y lo carga en la variable ' "Espera". Seguidamente.If PORTB. pause Espera GoTo Inicio Suma: Pause 300 ' Pausa de 300 milisegundos Base = Base + 100 ' Incrementa la variable "Base" If Base = 10100 Then Base = 10000 ' Establece un límite máximo al valor cargado ' en la variable "Base". Return Resta: Pause 300 Base = Base . • 119 .

Recuerde que la instrucción Pulsout tiene una resolución de 10 microsegundos para un oscilador de 4 Mhz. el programa hace un salto con retorno a la subrutina “Suma”. Por ejemplo. el primer paso de la subrutina ha sido preguntar si los pulsadores P1 y P2 han sido activados. • • • 120 . Si el pulsador P1 es activado. genera un pulso en el pin RB1. es decir. 1 milisegundo. La instrucción Pulsout. se establecen límites para la variable “Base”. Seguidamente se carga la variable “Espera”. debido a que se está dividiendo el valor cargado en la variable “Base” entre 100 y el resultado es cargado en la variable “Espera”. si Base = 100. el programa hace un salto a la etiqueta “Inicio” para empezar el proceso. En estas dos subrutinas (Suma y Resta). la pausa generada es de 1 milisegundo. Si el pulsador P2 es activado. En el caso específico de la resta. Entonces.• • Inicializamos la variable “Base” con un valor igual a 100 y la variable “Espera” con un valor igual a 1. entonces el pulso generado será de 100 decenas de microsegundos. la variable “Base” mantiene su valor igual a 10000. Por último. valor que será utilizado para realizar la pausa entre pulsos. A partir de la etiqueta “Inicio”. de manera tal que si la suma llega a ser igual a 10100. Seguidamente el programa realiza una pausa la cual depende también del valor cargado en la variable “Espera”. observe que si la variable Base = 100. tanto en la subrutina “Suma” como en la subrutina “Resta”. incrementando el valor de la variable “Base” en 100 unidades. el programa hace un salto con retorno a la subrutina “Resta”. con una duración definida por el valor cargado en la variable “Base”. haciendo decrecer en 100 unidades el valor cargado en la variable “Base”. si el valor de la variable “Base” llega a ser igual a 0. entonces la variable mantiene siempre su valor igual a 100.

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

con la cual mediremos la duración de los pulsos generados por el microcontrolador PIC16F84A.15. Analice el siguiente programa: DEFINE LCD_DREG DEFINE LCD_BITS DEFINE LCD_DBIT DEFINE DEFINE DEFINE DEFINE LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT PORTD 4 4 PORTD 2 PORTD 3 ' ' ' ' ' ' ' ' Indica que el Bus estará conectado en el Puerto D El bus será de cuatro bits. Pin: especifica el pin del puerto en el cual se introducirá el pulso a ser medido. 0 = bajo). Selección 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 Indica al uC que el pin "E" estará en el Puerto D "E" estará conectado en RD3 ' Define el oscilador en 4 Mhz ' Definición de variable de 16 bits ' Pausa de 200 milisegundos ' Limpia la pantalla Define OSC 4 LECTURA VAR Word Pause 200 LCDOut $fe. 1 122 .6. Variable: es una variable de 8 bits (variable tipo byte) o 16 bits (variable tipo word) definida por el programador en la cual se grabará el resultado de la lectura.10. (1 = alto. o una resolución de 2 microsegundos para un oscilador de 20 Mhz.Proyecto #16: El siguiente proyecto está basado en el montaje de la figura 6. programado en el proyecto #15.. PULSIN Sintaxis: PULSIN pin. variable La instrucción PULSIN mide la duración de un pulso alto o bajo con una resolución de 10 microsegundos para un oscilador de 4 Mhz. Nivel: define si la medición se hace en nivel alto o bajo. En esta oportunidad estudiaremos el funcionamiento de la instrucción “Pulsin”. nivel. y el valor obtenido es almacenado en una variable definida de 8 bits (byte) o 16 bits (Word).

$C0."decenas de uS. ' Mide la duración de un pulso. ' Muestra el mensaje de la segunda línea. LCDOut "Lectura: ".Inicio: LECTURA = 0 PulsIn PORTB. Entonces. el valor cargado en la variable “Lectura” será igual o aproximado a 100. " " ' Muestra mensaje y dato por pantalla. ' Posiciona el cursor en el inicio.1." Lcdout $fe. su generamos un pulso cuya duración es igual a 1 milisegundo. la cual mide el tiempo de cada pulso que ingresa a través del pin RB1. en decenas de microsegundos. podremos observar en la pantalla LCD el resultado de la lectura generada por la instrucción “Pulsin”.15. 123 .1.#LECTURA. Pause 1000 GoTo Inicio End ' Pausa de 1 segundo ' Salta a inicio Al compilar y grabar el programa en el microcontrolador PIC16F877A del diagrama de la figura 6. 2 ' Inicializa la variable "Lectura".LECTURA LCDOut $fe.

124 . con el cual se pretende tomar lectura de un elemento resistivo. con el cual estudiaremos la instrucción “POT” a través de un ejemplo de programación. el cual en este caso será un potenciómetro de 10Kohm.17.6.17. Figura 6..11.Proyecto #17: Realice el montaje para el circuito la figura 6.

y también cuando el valor de la variable se aproxime a 255. variable La instrucción “POT” lee un potenciómetro. El valor de la escala será correcto cuando el valor cargado en la variable se aproxime a cero. Esta escala es utilizada para ajustar el rango de salida en la lectura del dispositivo. foto celda. cuando la resistencia medida sea mínima. 125 . Básicamente esta instrucción calcula el tiempo de descarga del condensador C1 el cual varía según el valor resistivo presente en la resistencia variable. POT Sintaxis: POT pin.6. escala.1 uF Fuente regulada de 5 Vdc Cantidad 1 1 2 1 1 1 1 1 Tabla 6.Proyecto # 17 Componente PIC16F877A Cristal de 4 Mhz Capacitor cerámico de 33 pF Pantalla LCD 16x2 Potenciómetro de 5K Ohm Potenciómetro de 10K Ohm Capacitor cerámico de 0. Pin: especifica el pin del puerto en el cual se va a conectar el potenciómetro. o cualquier otro dispositivo capaz de variar su valor resistivo. cuando la resistencia medida sea máxima. Escala: Es una variable o constante que aumenta o disminuye el rango de lectura en un porcentaje determinado. y es afectada directamente por las constantes RC. termistor.

hasta lograr el rango más aceptable para una resistencia variable (P1) de 10K.#DATO. y experimente sobre el valor de C1. 2 LCDOut "Lectura: ". y el valor de la escala en la instrucción POT. Selección 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 Indica al uC que el pin "E" estará en el Puerto D "E" estará conectado en RD3 ' Define el oscilador en 4 Mhz Define OSC 4 ESCALA VAR Byte DATO Var Byte Pause 200 ESCALA = 127 LCDOut $fe.DATO LCDOut $fe." GoTo inicio End ' Pausa de 200 milisegundos ' Asigna valor a la escala ' Limpia la pantalla ' Toma lectura del Potenciómetro ' Posiciona el cursor en el inicio ' Muestra dato por pantalla ' Salto a inicio " 126 . Analice el siguiente programa. 1 Inicio: Pot PORTB.0.Variable: es una variable en la cual se almacena el resultado obtenido de la lectura del potenciómetro o componente resistivo. DEFINE LCD_DREG DEFINE LCD_BITS DEFINE LCD_DBIT DEFINE DEFINE DEFINE DEFINE LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT PORTD 4 4 PORTD 2 PORTD 3 ' ' ' ' ' ' ' ' Indica que el Bus estará conectado en el Puerto D El bus será de cuatro bits.ESCALA.

.7. es decir.. En cada posición de la CGRAM se almacenan los 8 bytes que forman un caracter..... 127 .. Figura 6. cada una de 8 bits (1 byte)*.. destinada para que el usuario pueda almacenar hasta un máximo de 8 caracteres o figuras personalizadas como lo demostraremos a continuación. C5 C4 C3 C2 C1 C5 C4 C3 C2 C1 C5 C4 C3 C2 C1 C5 C4 C3 C2 C1 C5 C4 C3 C2 C1 Fila 1 Fila 2 Fila 3 Fila 4 Fila 5 Fila 6 Fila 7 Fila 8 ..Memoria CGRAM en la Pantalla LCD.18.. son tomados como ceros. cada carácter se compone de ocho bytes.6. Cada carácter es representado como un bloque constituido normalmente por 5 columnas y 8 filas.. * Nota: Los 3 bits más significativos de cada byte (3 bits más significativos de cada fila)..12. La pantalla LCD posee una memoria llamada CGRAM (Character Generator RAM). Las direcciones correspondientes a cada posición son: Posición en la CGRAM Posición 0 Posición 1 Posición 2 Posición 3 Posición 4 Posición 5 Posición 6 Posición 7 Byte 0 Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Byte 7 $40 $41 $42 $43 $44 $45 $46 $47 $48 $49 $4A $4B $4C $4D $4E $4F $50 $51 $52 $53 $54 $55 $56 $57 $58 $59 $5A $5B $5C $5D $5E $5F $60 $61 $62 $63 $64 $65 $66 $67 $68 $69 $6A $6B $6C $6D $6E $6F $70 $71 $72 $73 $74 $75 $76 $77 $78 $79 $7A $7B $7C $7D $7E $7F Tabla 6..

$06.8. Dato HEX $02 $06 $1A $1A $1A $06 $02 $00 Dato Binario 00000010 00000110 00011010 00011010 00011010 00000110 00000010 00000000 Tabla 6. 0 ' Limpia la pantalla y luego muestra el símbolo ' almacenado en la posición 0 de la CGRAM 128 . donde “1” es encendido y “0” es apagado.$1A.$06.Veamos el siguiente ejemplo en el cual almacenaremos el símbolo de un parlante en la posición 0 de la CGRAM.$00 Observe que hemos especificado la dirección inicial de la posición cero después de la sentencia de comando $fe.$02. podemos desplegar el símbolo en la pantalla LCD. seguido de los datos correspondientes al caracter. Esto se hace especificando la posición de la CGRAM que se desea mostrar después del comando de control. La instrucción para desplegar este símbolo en la pantalla sería la siguiente: LCDOUT $fe. Una vez almacenado los datos correspondientes a la figura en la posición cero de la memoria CGRAM.1.$1A.$40.$02.$1A. como se muestra a continuación: LCDOUT $FE. Símbolo Bytes en la CGRAM $40 $41 $42 $43 $44 $45 $46 $47 Note que cada cuadro representa un bit el cual corresponde a un “1” o un “0” según sea el caso o la figura que deseamos realizar.

$1A.$C0.$00 ' Muestra el caracter en la pantalla: LCDOut $fe.$1A.2) y en la figura 6. la sintaxis sería la siguiente: LcdOut $fe.$06. Para mostrar esta misma figura en una posición diferente de la pantalla. 0 Inicio: GoTo Inicio ' Salta a la etiqueta “Inicio” (Lazo infinito).$06. posición $C7 de la pantalla LCD.En este caso la figura aparece en la primera línea de la pantalla LCD.$40. simplemente nos basamos en la tabla de comandos de la instrucción “Lcdout” (Tabla 6. 2 ' Pausa de 500 milisegundos ' Limpia la pantalla ' Posiciona el cursor en el inicio ' Cargamos el caracter en la posición cero: LCDOut $fe. End 129 . 1 LCDOut $fe. la sintaxis sería la siguiente: LcdOut $fe.7. • Para visualizar la figura cargada en la posición cero de la CGRAM en la línea 2.$1A.$02.1.$02. 0 • Para visualizar una figura cargada en la posición cuatro de la CGRAM en la línea 2. posición $C0 de la pantalla LCD. 4 El programa para visualizar entonces la figura ya creada anteriormente en la línea 1 de la pantalla LCD sería el siguiente: ' Programa en PIC Basic Pro Pause 500 LCDOut $fe. Por ejemplo.$C7. en la cual podremos encontrar la dirección de la posición de visualización deseada en la pantalla LCD.

9.Proyecto #18.13. basados en el diagrama de la figura 6. Proyecto # 18 Componente PIC16F877A Cristal de 8 Mhz Capacitor cerámico de 33 pF Pantalla LCD 16x2 Resistencia de 10K Ohm Potenciómetro de 5K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc Cantidad 1 1 2 1 2 1 2 1 Tabla 6. Figura 6.6.19. mientras que el pulsador “P2” será el encargado de disminuir el nivel. 130 . El pulsador “P1” será el encargado de aumentar el nivel de volumen. A continuación realizaremos la simulación de un control digital de volumen.19..

23.Las pantallas que veremos representadas en este ejemplo son las mostradas en las figuras 6.22 y 6. 6.21.22. encargados de indicar el nivel de volumen. 131 .21. 6. Figura 6. Figura 6. Figura 6.20. Figura 6.20.23. Se puede observar en ellas la representación de un pequeño parlante y cuatro rectángulos.

El primer paso en la elaboración de este ejercicio. $02. $06. $00 Figura 2: Dato HEX $00 $00 $00 $00 $00 $00 $1F $1F Dato Binario 00000000 00000000 00000000 00000000 00000000 00000000 00011111 00011111 Bytes en la CGRAM $48 $49 $4A $4B $4C $4D $4E $4F Símbolo Palabra 1: $00. $00. $1A. es crear las figuras que deseamos mostrar en la pantalla LCD basados en la explicación dada anteriormente: Figura 1: Dato HEX $02 $06 $1A $1A $1A $06 $02 $00 Dato Binario 00000010 00000110 00011010 00011010 00011010 00000110 00000010 00000000 Bytes en la CGRAM $40 $41 $42 $43 $44 $45 $46 $47 Símbolo Palabra 0: $02. $00. $06. $00. $1F 132 . $1F. $00. $1A. $00. $1A.

$1F. $1F 133 . $00. $1F. $1F. $1F. $1F. $1F. $00.Figura 3: Dato HEX $00 $00 $00 $00 $1F $1F $1F $1F Dato Binario 00000000 00000000 00000000 00000000 00011111 00011111 00011111 00011111 Bytes en la CGRAM $50 $51 $52 $53 $54 $55 $56 $57 Símbolo Palabra 2: $00. $1F. $1F. $1F Figura 4: Dato HEX $00 $00 $1F $1F $1F $1F $1F $1F Dato Binario 00000000 00000000 00011111 00011111 00011111 00011111 00011111 00011111 Bytes en la CGRAM $58 $59 $5A $5B $5C $5D $5E $5F Símbolo Palabra 3: $00. $00. $00.

leyendo detenidamente los comentarios: ' Programa en PIC Basic Pro '**************************************** '* Nombre : Proyecto18. $1F. $1F A continuación analice el siguiente programa. $1F. Selección 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 Indica al uC que el pin "E" estará en el Puerto D "E" estará conectado en RD3 Define Osc 8 ' Define el Oscilador para un Cristal ' de 8 Mhz. $1F. $1F. 134 . $1F.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1. $1F.0 * '**************************************** DEFINE LCD_DREG DEFINE LCD_BITS DEFINE LCD_DBIT DEFINE DEFINE DEFINE DEFINE LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT PORTD 4 4 PORTD 2 PORTD 3 ' ' ' ' ' ' ' ' Indica que el Bus estará conectado en el Puerto D El bus será de cuatro bits.Figura 5: Dato HEX $1F $1F $1F $1F $1F $1F $1F $1F Dato Binario 00011111 00011111 00011111 00011111 00011111 00011111 00011111 00011111 Bytes en la CGRAM $60 $61 $62 $63 $64 $65 $66 $67 Símbolo Palabra 4: $1F.

$1F. $00. $06.0 Symbol P2 = PORTB. $00. $60. $00.$C6. $1F.$C5. $48. $fe. $1F. $58. $02. If Volumen = 2 Then Call Nivel1 If Volumen = 3 Then Call Nivel2 If Volumen = 4 Then Call Nivel3 Return Nivel1: LCDOut $fe. mientras se suelta P1. $fe. ' Pausa de 350 milisegundos. $1F. $fe. $00 $1F $1F $1F $1F 'Figura 'Figura 'Figura 'Figura 'Figura 1. $00. $fe. 2. $1F. 3. $1F. ' Muestra la Figura almacenada en la Posición 1 ' de la CGRAM. $1F. LCDOut $fe. $40. $1A. 1 ' ' ' ' ' A continuación se verifica si alguno de los pulsadores ha sido activado. LCDOut $fe. ' Posiciona el cursor en el inicio ' Muestra la Figura almacenada en la Posición 0 ' de la CGRAM. $00. $00. $00. $1F. $1F. ' Inicializa la variable “Volumen” con el valor "1". $1F. $1F. $1F. ' Alias para RB1. $00. 4. $1A. llama a la subrutina "BajaVol". 135 . llama a la subrutina "SubeVol". $1A. ' A continuación se cargan las cinco figuras creadas a partir de la ' posición cero de la memoria CGRAM: LCDOut LCDOut LCDOut LCDOut LCDOut $fe. $00. 2 LCDOut $fe. Si P2 es activado y la variable "Volumen" es mayor a cero. $00.Symbol P1 = PORTB. $00. $50. $1F. $02. 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". 0 " ' Limpia la pantalla ' Escribe "Volumen:" en la línea 1 de la pantalla. 2 Pause 350 Return ' Muestra la Figura almacenada en la Posición dos (2) ' de la CGRAM. ' Declaración de la variable "Volumen" tipo Byte. $06. Si P1 es activado y la variable "Volumen" es menor a cinco. $00.1 Volumen Var Byte Volumen = 1 ' Alias para RB0. SubeVol: Volumen = Volumen + 1 ' Suma 1 al contenido de la variable "Volumen". $1F. $1F. $1F.$C7. 1 LCDOut " Volumen: Inicio: LCDOut $fe. 5.

$C9.$C9. mientras se suelta P2. mientras se suelta P1. ' Pausa de 350 milisegundos. BajaVol: Volumen = Volumen .Nivel2: LCDOut $fe." " Pause 350 Return End ' Borra la figura colocando un espacio en blanco en la ' posición $C7 de la pantalla LCD. 4 Pause 350 Return ' Muestra la Figura almacenada en la Posición cuatro (4) ' de la CGRAM. 3 Pause 350 Return Nivel3: LCDOut $fe. 136 . If Volumen = 3 Then Call Borra1 If Volumen = 2 Then Call Borra2 If Volumen = 1 Then Call Borra3 Return Borra1: LCDOut $fe. mientras se suelta P2. mientras se suelta P1." " Pause 350 Return Borra3: LCDOut $fe. ' Muestra la Figura almacenada en la Posición tres (3) ' de la CGRAM.$C8. mientras se suelta P2. ' Pausa de 350 milisegundos.1 ' Resta 1 al contenido de la variable "Volumen". ' Pausa de 350 milisegundos." " Pause 350 Return Borra2: LCDOut $fe. ' Borra la figura colocando un espacio en blanco en la ' posición $C9 de la pantalla LCD. ' Pausa de 350 milisegundos. ' Borra la figura colocando un espacio en blanco en la ' posición $C8 de la pantalla LCD.$C8. ' Pausa de 350 milisegundos.$C7.

26. como se muestra en las figuras 6.25 y 6.6.24.14. El programa ha sido diseñado en base al diagrama esquemático de la figura 6. 137 .10. Proyecto # 19 Componente PIC16F877A Cristal de 8 Mhz Capacitor cerámico de 33 pF Pantalla LCD 16x4 Potenciómetro de 5K Ohm Fuente regulada de 5 Vdc Cantidad 1 1 2 1 1 1 Tabla 6.Proyecto #19.. Realice el siguiente ejercicio en el cual se podrá visualizar un pequeño caballo que corre a lo largo de la pantalla LCD.24: Figura 6.

A continuación podrá ver una secuencia numerada de cada una de las pantallas que debe generar el programa propuesto: Figura 6. 138 .25.

Figura 6. 139 .26.

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

$06.$0D.$00.$05 141 .Los datos a ser almacenados en las ocho posiciones de la CGRAM son los siguientes: Figura 1: Dato HEX $00 $00 $10 $0F $0F $0D $18 $10 Dato Binario 00000000 00000000 00010000 00001111 00001111 00001101 00011000 00010000 Bytes en la CGRAM $40 $41 $42 $43 $44 $45 $46 $47 Figura A Palabra 0: $00.$1C.$1C.$1C.$0F.$18.$10 Figura 2: Dato HEX $04 $0E $1F $1C $1C $1C $06 $05 Dato Binario 00000100 00001110 00011111 00011100 00011100 00011100 00000110 00000101 Bytes en la CGRAM $48 $49 $4A $4B $4C $4D $4E $4F Figura B Palabra 1: $04.$0F.$1F.$10.$0E.

$18 142 .$0F.Figura 3: Dato HEX $00 $00 $10 $0F $0F $0D $04 $06 Dato Binario 00000000 00000000 00010000 00001111 00001111 00001101 00000100 00000110 Bytes en la CGRAM $50 $51 $52 $53 $54 $55 $56 $57 Figura C Palabra 2: $00.$04.$1C.$10.$1C.$08.$00.$0F.$0E.$1F.$0D.$06 Figura 4: Dato HEX $04 $0E $1F $1C $1C $1C $08 $18 Dato Binario 00000100 00001110 00011111 00011100 00011100 00011100 00001000 00011000 Bytes en la CGRAM $58 $59 $5A $5B $5C $5D $5E $5F Figura D Palabra 3: $04.$1C.

$02.$07.$0E.$16.$1F.$04.$07.$1E.Figura 5: Dato HEX $04 $0E $1F $07 $07 $07 $02 $03 Dato Binario 00000100 00001110 00011111 00000111 00000111 00000111 00000010 00000011 Bytes en la CGRAM $60 $61 $62 $63 $64 $65 $66 $67 Figura E Palabra 4: $04.$0C 143 .$07.$1E.$01.$00.$03 Figura 6: Dato HEX $00 $00 $01 $1E $1E $16 $04 $0C Dato Binario 00000000 00000000 00000001 00011110 00011110 00010110 00000100 00001100 Bytes en la CGRAM $68 $69 $6A $6B $6C $6D $6E $6F Figura F Palabra 5: $00.

$01.$1E.$0E.$0C.$14 Figura 8: Dato HEX $00 $00 $01 $1E $1E $16 $03 $01 Dato Binario 00000000 00000000 00000001 00011110 00011110 00010110 00000011 00000001 Bytes en la CGRAM $78 $79 $7A $7B $7C $7D $7E $7F Figura H Palabra 7: $00.$1F.$07.$03.$00.$1E.$07.$01 144 .$07.$16.Figura 7: Dato HEX $04 $0E $1F $07 $07 $07 $0C $14 Dato Binario 00000100 00001110 00011111 00000111 00000111 00000111 00001100 00010100 Bytes en la CGRAM $70 $71 $72 $73 $74 $75 $76 $77 Figura G Palabra 6: $04.

“F”. En la figura 6. hacemos una pausa de 300 milisegundos. borramos la pantalla y mostramos las figuras “C” y “D” en las posiciones $C2 y $C3 respectivamente de la pantalla LCD.28 se pueden observar las direcciones en una pantalla LCD de 16 columnas y 4 filas.28. “G” y “H”. solo que esta vez será partiendo desde la dirección $C4. Pantalla LCD 16x4 Línea 1 Línea 2 Línea 3 Línea 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. luego hacemos otra pausa de 300 milisegundos y comenzamos el proceso. nos referimos respectivamente a las figuras “A” y “B” de nuestro diseño.En esta oportunidad pondremos a correr nuestro caballo en la segunda línea de la pantalla. 145 . y lo ubicaremos de la siguiente manera: La primera mitad de nuestro caballo estará en la dirección $C0 y la otra mitad estará en la dirección $C1. estaremos listos para repetir todo el proceso de forma inversa con las figuras “E”. Cuando la figura “D” llegue a la dirección $CF. Esta tabla de direcciones resulta muy útil al momento de establecer la ubicación de cada figura en cualquiera de las líneas de la pantalla LCD. Para ver el efecto que deseamos.

' Declaración de Variables POS1 POS2 POS3 POS4 var var var var Byte Byte Byte Byte ' Inicializamos las Variables correspondientes a la posición de la figura ' en la pantalla LCD POS1 POS2 POS3 POS4 = = = = $C0 $C1 $C2 $C3 ' Ver figura 6.$16.$00.$0E.$07.$0F.$05 $FE.$10.$0F.$00.$1C.$0F.$14 $FE. Selección 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 Indica al uC que el pin "E" estará en el Puerto D "E" estará conectado en RD3 ' Programa en PIC Basic Pro Define Osc 8 ' Define el Oscilador para un Cristal ' de 8 Mhz.$0F.$02.$1F.$00.$1C.$78.$1F.$70.$08.$58.$07.$10.$1E.$0C.$0E.0 * '**************************************** DEFINE LCD_DREG DEFINE LCD_BITS DEFINE LCD_DBIT DEFINE DEFINE DEFINE DEFINE LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT PORTD 4 4 PORTD 2 PORTD 3 ' ' ' ' ' ' ' ' Indica que el Bus estará conectado en el Puerto D El bus será de cuatro bits.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1.$18.$0D.$04.$00.$06 $FE.$01.$1E.$00.$04.$60.$1C.$1F.$16.$03.Veamos el programa que hace posible esta representación: ' Programa en PIC Basic Pro '**************************************** '* Nombre : Proyecto19.$07.$04.$18 $FE.$0D.$0E.$50.$0E.$00.$1C.$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 146 .$00.$1C.$07.$01.$07.$10 $FE.13 ' ' ' ' Tiempo de inicialización de la Pantalla LCD Pause 500 ' Cargamos las 8 figuras en la CGRAM: LCDOUT LCDOUT LCDOUT LCDOUT LCDOUT LCDOUT LCDOUT LCDOUT inicio: $FE.$40.$0C $FE.$68.$1E.$04.$03 $FE.$48.$07.$06.$00.$1C.$1E.$1F.$04.$04.

1 LCDOUT $FE.G y H tengan una ' posición inicial en la pantalla LCD: RETRO: POS1 POS2 POS3 POS4 = = = = $CF $CE $CD $CC RETROCEDE: LCDOUT $fe. Pause 300 LCDOUT $fe.F.POS2. LCDOUT $FE.POS3. 1 LCDOUT $FE.POS1. 4 Pause 300 ' Limpia la pantalla LCD ' Muestra Palabra 7 en la LCD ' Muestra Palabra 6 en la LCD ' Limpia la pantalla LCD ' Muestra Palabra 5 en la LCD ' Muestra Palabra 4 en la LCD ' Disminuimos la posición de cada símbolo en la pantalla para dar el efecto ' de movimiento en sentido contrario: POS1 POS2 POS3 POS4 = = = = POS1 POS2 POS3 POS4 3 3 3 3 If POS4 < $C0 Then REINICIA ' Pregunta si llega al tope Izquierdo de la LCD GoTo RETROCEDE ' Nos aseguramos de que las figuras A.POS2.C y D tengan una posición inicial en la ' pantalla LCD: 147 .POS1. 1 LCDOUT $FE.LCDOUT $fe. 5 LCDOUT $FE. 7 LCDOUT $FE.POS4. LCDOUT $FE. 6 Pause 300 LCDOUT $fe.POS4.B. 1 LCDOUT $FE. Pause 300 0 1 ' Limpia la pantalla LCD ' Muestra Palabra 0 en la LCD ' Muestra Palabra 1 en la LCD ' Limpia la pantalla LCD ' Muestra Palabra 2 en la LCD ' Muestra Palabra 3 en la LCD 2 3 ' Aumentamos la posición de cada símbolo 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.POS3.

REINICIA: POS1 POS2 POS3 POS4 = = = = $C0 $C1 $C2 $C3 GoTo inicio ' Se repite el proceso saltando a la etiqueta "inicio" End 148 .

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

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

PORTB. entonces: Si PORTB. La tecla "4" fue presionada. podemos aplicar el siguiente análisis: 1.5 = 0 Si PORTB.6 = 0 La tecla "1" fue presionada. Entonces para saber si una tecla ha sido presionada. Si esto sucede. 151 .4 = 0 Si PORTB.2 = 1 ' Columna 1 = 0 ' Columna 2 = 1 ' Columna 3 = 1 2.1 = 1 PORTB. 3 y 4 para verificar si alguna de ellas cambió su estado a cero “0”. quiere decir que una de las teclas en la columna 1 ha sido presionada.3 = 0 Si PORTB.0 = 0 PORTB. La tecla "*" fue presionada.Figura 7. y enviamos un “1” por las columnas 2 y 3. La tecla "7" fue presionada. 2. Leemos las filas 1. Enviamos un cero “0” por la columna 1.3.

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

3 PORTB.5 PORTB.4 PORTB.4 PORTB.2 = 1 If If If If PORTB.1 = 0 PORTB.6 = = = = 0 0 0 0 ' Llama a la rutina barrido del teclado matricial. ' Columna 1 = 0 ' Columna 2 = 1 ' Columna 3 = 1 Then Then Then Then PORTD PORTD PORTD PORTD = = = = %11111001 %10011001 %11111000 %10011100 ' ' ' ' tecla tecla tecla tecla "1" "4" "7" "*" PORTB.0 = 0 PORTB. en el puerto D. ' Hace una pausa de 300 ms. ' Configura los pines del puerto B. ' Salta a la etiqueta “Inicio”.0 = 1 PORTB. TRISB = %01111000 TRISD = %00000000 Inicio: Call Teclado Pause 300 GoTo Inicio Teclado: PORTB. ' Programa en PIC Basic Pro Define Osc 8 ' Define el Oscilador para un Cristal ' de 8 Mhz.2 = 1 If If If If PORTB. lo cual significa que para encender un segmento será necesario enviar un cero “0” a través del pin que corresponda a éste.6 = = = = 0 0 0 0 ' Columna 1 = 1 ' Columna 2 = 0 ' Columna 3 = 1 Then Then Then Then PORTD PORTD PORTD PORTD = = = = %10100100 %10010010 %10000000 %11000000 ' ' ' ' tecla tecla tecla tecla "2" "5" "8" "0" PORTB. ' Configura los pines del puerto D.5 PORTB.1 = 1 PORTB.6 = = = = 0 0 0 0 ' Columna 1 = 1 ' Columna 2 = 1 ' Columna 3 = 0 Then Then Then Then PORTD PORTD PORTD PORTD = = = = %10110000 %10000010 %10011000 %10100011 ' ' ' ' tecla tecla tecla tecla "3" "6" "9" "#" Return End 153 .1 = 1 PORTB.5 PORTB.0 = 1 PORTB.2 = 0 If If If If PORTB.Observe que el display de 7 segmentos es de ánodo común.3 PORTB.4 PORTB.3 PORTB.

2. conectados según el diagrama esquemático de la figura 7.4.Proyecto #20.22 . 154 .23 Componente PIC16F877A Cristal de 4 Mhz Capacitor cerámico de 33 pF Pantalla LCD 16x2 Resistencia de 1K Ohm Potenciómetro de 5K Ohm Teclado Matricial 3x4 Fuente regulada de 5 Vdc Cantidad 1 1 2 1 4 1 1 1 Tabla 7. Figura 7.21 . En el siguiente proyecto utilizaremos una pantalla LCD 16x2. y un teclado matricial 3x4. Proyecto # 20 .7..2. El objetivo de este proyecto será visualizar el valor o símbolo correspondiente a cada una de las teclas.4.

1 = 0 PORTD.3 PORTD. 1 Lcdout $fe. 2 ' Posiciona el cursor en el inicio Lcdout "Tecla Pulsada: " Lcdout $fe. ' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. PAUSE 3000 Inicio: Call Teclado ' Pausa de 3 segundos Lcdout $fe.0 = 0 PORTD.$C0.Utilizaremos la técnica de lectura de teclado mostrada anteriormente para la programación de este proyecto.2 = 1 ' Columna 1 = 1 ' Columna 2 = 0 ' Columna 3 = 1 155 . y compare el algoritmo de lectura del teclado matricial con el algoritmo comentado anteriormente. "--> ".2 = 1 If If If If PORTD." " GoTo Inicio Teclado: PORTD.5 PORTD. 2 Lcdout Lcdout $fe.4 PORTD.$C0. *" Lcdout $fe. ' Configuración del puerto A ' Configuración del puerto B ' Configuración del puerto D TRISA = %00000000 TRISB = %00000000 TRISD = %01111000 VAR1 VAR Byte var1 = 0 Pause 200 ' Declaramos la Variable VAR1 ' Inicializamos la variable VAR1 ' Pausa de 200 milisegundos ' Limpia la pantalla ' Posiciona el cursor en el inicio "* Pantalla LCD *" "* Teclado Mat.#var1.1 = 1 PORTD.0 = 1 PORTD.6 = = = = 0 0 0 0 ' Columna 1 = 0 ' Columna 2 = 1 ' Columna 3 = 1 Then Then Then Then VAR1 VAR1 VAR1 VAR1 = = = = 1 4 7 10 ' ' ' ' tecla tecla tecla tecla "1" "4" "7" "*" PORTD. Realice un análisis detallado del siguiente programa.

3 PORTD.5 PORTD.5 PORTD.1 = 1 PORTD.0 = 1 PORTD.4 PORTD.3 PORTD.6 = = = = 0 0 0 0 Then Then Then Then VAR1 VAR1 VAR1 VAR1 = = = = 2 5 8 11 ' ' ' ' tecla tecla tecla tecla "2" "5" "8" "0" PORTD.4 PORTD.6 = = = = 0 0 0 0 ' Columna 1 = 1 ' Columna 2 = 1 ' Columna 3 = 0 Then Then Then Then VAR1 VAR1 VAR1 VAR1 = = = = 3 6 9 12 ' ' ' ' tecla tecla tecla tecla "3" "6" "9" "#" Return End ' Retorna una línea después del llamado "Call" 156 .If If If If PORTD.2 = 0 If If If If PORTD.

el PIC16F84 cuenta con una memoria de datos de 64 bytes y el PIC16F877 cuenta con una memoria de datos de 256 bytes. que tenemos 64 bytes que podemos utilizar para almacenar información. Podemos ver claramente en la tabla de memoria de datos. Esta información puede ser verificada directamente en la hoja de características técnicas de cada microcontrolador.Memoria de Datos Capitulo VIII 8..La Memoria de Datos: La memoria EEPROM de datos resulta muy importante cuando necesitamos almacenar información que no queremos que se pierda al desconectar la energía de nuestros proyectos. 157 . y no todos cuentan con esta característica. Por ejemplo. a partir de la posición 00 hasta la posición 3F.1. Sin embargo.1. La capacidad de esta memoria varía según el modelo de microcontrolador que escojamos. haremos un mapa de memoria de datos para estos dos microcontroladores PIC: 0000: 0008: 0010: 0018: 0020: 0028: 0030: 0038: Memoria de Datos PIC16F84 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 21 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F Tabla 8.

será necesario saber la posición en la cual estarán almacenados para luego poder ser consultados. Este compilador tiene instrucciones muy específicas las cuales estudiaremos a continuación.En un microcontrolador PIC16F877 la capacidad de almacenamiento aumenta considerablemente y lo podemos ver en el siguiente mapa: 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: Memoria de Datos PIC16F877 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 21 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF Tabla 8. La instrucción 158 . Si deseamos grabar algunos datos.2. Guardar y leer datos resulta muy sencillo al trabajar en PicBasic.

1 Write $21. la instrucción en PicBasic para este fin es “Read”. variable La instrucción READ permite leer datos desde la memoria EEPROM de datos de un microcontrolador almacenándolos en una variable previamente definida. dato WRITE Sintaxis: WRITE dirección. ' en la dirección $A0 Si deseamos leer alguno de los datos almacenados.VAR1 ' graba el dato o valor “1” en la dirección $00 ' graba el dato o valor “155” en la dirección $21 ' graba el dato almacenado en la variable VAR1.en PicBasic para grabar datos en la memoria de datos EEPROM es “Write” y la estructura de la sentencia es la siguiente: WRITE dirección. variable La instrucción WRITE almacena datos en la memoria EEPROM de un microcontrolador en una dirección específica.155 Write $A0. y la estructura de la sentencia es la siguiente: Read dirección. 159 . variable READ Sintaxis: READ dirección. Ejemplo: Write $00.

La idea principal en cada proyecto será familiarizarse con el uso de la memoria de datos. almacenando en ella información que deberá poder ser consultada aunque el circuito sea reiniciado o apagado. en los cuales deberán ser aplicados los todos conocimientos adquiridos en los capítulos anteriores. Como se puede observar en la figura 8.1. VAR3 A continuación realizaremos una serie de ejercicios. VAR2 Read $A0.1. con la cual se podrá visualizar toda la información a ser consultada. se requiere el uso de un teclado matricial 3x4 para el ingreso de datos y una pantalla LCD. Figura 8. VAR1 ' lee el dato de la dirección especificada y lo guarda ' en la variable VAR1 ' lee el dato de la dirección especificada y lo guarda ' en la variable VAR2 ' lee el dato de la dirección especificada y lo guarda ' en la variable VAR3 Read $21. 160 .Ejemplo: Read $00.

1 Lcdout $fe. B y D están 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. veamos a almacenar el valor “1” en la posición de memoria $00. En este ejemplo. empezamos el programa asegurando que los puertos A.1. 2 Lcdout Lcdout $fe.2.$C0. “2” en la posición de memoria $01 y “3” en la posición de memoria $02: Write $00. Pause 3000 ' Pausa de 3 segundos Para almacenar un dato es necesario especificar una dirección en la memoria de datos.. para luego ser consultados y mostrados uno por uno en la pantalla LCD. ' Configuración 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 ' Limpia la pantalla ' Posiciona el cursor en el inicio "Memoria de Datos" "****************" Lcdout $fe. Basados en el diagrama esquemático de la figura 8.Proyecto #21.3 ' Escribe el valor “1” en la posición “$00” ' Escribe el valor “2” en la posición “$01” ' Escribe el valor “3” en la posición “$02” 161 .8.1 Write $01. En este proyecto vamos a almacenar datos en la memoria EEPROM.2 Write $02.

#VAR1.#VAR1.VAR1 ' Posiciona el cursor en el inicio Lcdout $fe. para luego volver a empezar el proceso de lectura.#VAR1. "Dato: ".$C0. 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 pequeña ventana llamada “Data Memory”." " Pause 3000 GoTo inicio End Para comprobar que estos datos están en la memoria de datos EEPROM del microcontrolador. 2 Lcdout "Dirección 02: " Lcdout $fe.La siguiente subrutina lee el valor almacenado en la dirección $00 y lo muestra en la pantalla LCD. "Dato: ". Inicio: Read $00.VAR1 Lcdout $fe. Por último se lee el valor almacenado en la posición $02 y lo muestra en la pantalla LCD durante tres segundos.2: 162 .$C0. "Dato: ". 2 ' Posiciona el cursor en el inicio Lcdout "Dirección 00: " Lcdout $fe. espera tres segundos y lee el segundo valor almacenado en la posición $01.VAR1 Lcdout $fe. lo muestra en la pantalla LCD y nuevamente hace una pausa de tres segundos. 2 ' Posiciona el cursor en el inicio Lcdout "Dirección 01: " Lcdout $fe.$C0. también es posible utilizar el programador P16Pro para este fin. en la cual se pueden ver los datos almacenados como se muestra en la figura 8." " Pause 3000 Read $01." " Pause 3000 Read $02.

En el ejemplo presentado a continuación se desea almacenar una serie de datos a partir de una dirección específica en la memoria de programa.. Pause 3000 ' Pausa de 3 segundos DIRECCION = $00 DATO = 1 ' Asignamos una dirección inicial ' Primer dato que será almacenado 163 . 2 Lcdout Lcdout $fe.1: ' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz.2.3. 1 Lcdout $fe. Veamos el siguiente programa. Se puede experimentar cambiando las direcciones y datos a ser almacenados. 8. ' Configuración de Puertos: TRISA = %00000000 TRISB = %00000000 TRISD = %01111000 I VAR Byte VAR1 var Byte DIRECCION var Byte DATO var Byte Pause 200 ' ' ' ' Declaramos Declaramos Declaramos Declaramos la la la la Variable Variable Variable Variable I VAR1 DIRECCION DATO ' Pausa de 200 milisegundos ' Limpia la pantalla ' Posiciona el cursor en el inicio "Memoria de Datos" "****************" Lcdout $fe. el cual está basado en el diagrama de la figura 8.Figura 8.$C0.Proyecto #22.

7.VAR1 ' lee el dato y lo almacena en VAR1 Lcdout $fe. DATO = DATO + 2 ' aumenta en dos unidades el valor del dato a almacenar. "Dato: ".3. los datos a almacenar serán: 1.#DIRECCION.35.5. 2 ' Posiciona el cursor en el inicio Lcdout "Dirección ".11.": " ' muestra la dirección Lcdout $fe. For I = 1 To 20 ' ejecuta la subrutina 20 veces Write DIRECCION. Next I Inicio: DIRECCION = $00 For I = 1 To 20 ' ejecuta la subrutina 20 veces Read DIRECCION.29.37 y 39." " ' muestra el dato DIRECCION = DIRECCION + 1 ' aumenta en uno la posición de la memoria Pause 2000 ' Pausa de 2 segundos para poder visualizar la información Next I GoTo Inicio End ' inicia el proceso de lectura de la memoria de datos Si apagamos el circuito y leemos la memoria de datos. podremos observar los valores almacenados en el siguiente mapa de la memoria: Figura 8. 164 .' Almacenaremos a continuación 20 datos en 20 direcciones ' consecutivas.31.$C0.17.23.3 que están almacenados 20 valores (el equivalente de cada valor o dato en hexadecimal).DATO ' escribe el dato en la dirección especificada DIRECCION = DIRECCION + 1 ' aumenta en una unidad la posición de la Mem.27.9.33.19.25.13 ' 15.3.21. Se puede ver en la figura 8.#var1.

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

4 PORTD.1 = 1 PORTD.$C0.$C0.5 PORTD.1 = 1 PORTD.3 PORTD.3 PORTD.5 PORTD.6 = = = = 0 0 0 0 ' Columna 1 = 1 ' Columna 2 = 1 ' Columna 3 = 0 Then Then Then Then VAR1 VAR1 VAR1 VAR1 = = = = 3 6 9 12 ' ' ' ' tecla tecla tecla tecla "3" "6" "9" "#" Return End ' Retorna una línea después del llamado "Call" 166 .6 = = = = 0 0 0 0 ' Columna 1 = 1 ' Columna 2 = 0 ' Columna 3 = 1 Then Then Then Then VAR1 VAR1 VAR1 VAR1 = = = = 2 5 8 11 ' ' ' ' tecla tecla tecla tecla "2" "5" "8" "0" PORTD.0 = 0 PORTD.4 PORTD.4 PORTD. Parada: GoTo Parada Teclado: VAR1 = 0 PORTD.Lcdout $fe. 1 Lcdout $fe.0 = 1 PORTD. "Dato Almacenado" Pause 1000 ' Espera 1 segundo para visualizar el mensaje If DIRECCION = $0F Then Aviso ' Revisa si llegamos al límite asignado por ' el programador en la memoria de datos GoTo inicio Aviso: Lcdout $fe.6 = = = = 0 0 0 0 ' Columna 1 = 0 ' Columna 2 = 1 ' Columna 3 = 1 Then Then Then Then VAR1 VAR1 VAR1 VAR1 = = = = 1 4 7 10 ' ' ' ' tecla tecla tecla tecla "1" "4" "7" "*" ' Limpia la pantalla ' Posiciona el cursor en el inicio " Memoria llena! " "****************" PORTD.0 = 1 PORTD.2 = 1 If If If If PORTD.5 PORTD.1 = 0 PORTD. 2 Lcdout Lcdout $fe.2 = 0 If If If If PORTD.2 = 1 If If If If PORTD.3 PORTD.

para luego mostrar un mensaje en la pantalla LCD que nos indicará que hemos llenado cada uno de los 16 registros disponibles. los valores podrán ser introducidos a la memoria de datos a través del teclado matricial.Una vez compilado y puesto a prueba el programa. 167 . y el límite de datos a ser grabados será de 16 registros. ya que hemos fijado como límite la dirección “$0F” en la memoria de datos. Recuerde que un microcontrolador PIC16F877 tiene una capacidad de memoria de datos de 256 bytes. por lo tanto el límite que hemos fijado en el programa anterior puede ser llevado a su capacidad máxima de ser necesario.

. Si la contraseña es correcta. se genera un mensaje de confirmación y sonido (“Beep”).8. Figura 8. se encuentra conectado al pin RC0. Beep.Proyecto #24: En el siguiente ejemplo hemos desarrollado un sistema de control de acceso. se genera un mensaje de error y un sonido intermitente (“Beep. Si la contraseña es incorrecta. El dispositivo encargado de generar el sonido (Buzzer). Beep”). 168 .5. en el cual el usuario deberá introducir una contraseña previamente almacenada en la memoria de datos.4.

hasta la dirección “$15”. convenientemente podemos tomar las posiciones en el mapa de la memoria de datos a partir de la dirección “$10” por ejemplo.Proyecto # 24 Componente PIC16F877A Cristal de 4 Mhz Capacitor cerámico de 33 pF Pantalla LCD 16x2 Resistencia de 1K Ohm Potenciómetro de 5K Ohm Teclado Matricial 3x4 Transistor 2N3904 Buzzer 5 Vdc Fuente regulada de 5 Vdc Cantidad 1 1 2 1 4 1 1 1 1 1 Tabla 8. Para un sistema de acceso donde la contraseña será de seis dígitos. como se puede apreciar en la siguiente tabla: 169 . es importante tomar en cuenta cuales serán las posiciones en la memoria de datos para guardar la contraseña.3. Antes de empezar a programar. y donde cada dígito deberá ser almacenado en una posición específica.

Notará que la clave que hemos establecido en el programa es una serie de dígitos consecutivos “123456””. También podrá notar que seguimos utilizando la misma rutina para el control del teclado matricial. 170 . Ahora analice detenidamente el siguiente programa tomando en cuenta cada comentario.4.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: Memoria de Datos PIC16F877 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 21 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF Tabla 8.

Read 13. 1 ' LCDOut $fe. Read 14.$C0. de Acceso" LCDOut $fe.' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. "** Bienvenido **" Pause 2000 Call Beep Clave: X = 0 Read 10. 2 ' LCDOut LCDOut $fe. Read 12. 14. Read 11. 2 ' Posiciona el cursor en el inicio LCDOut "Cont.$C0. 11. Call Beep Limpia la LCD Posiciona el cursor en el inicio "Introduzca su " "Clave de Acceso:" ' Generamos un sonido 171 . Read 15. 13. ' Configuración de Puertos: TRISA = %00000000 TRISB = %00000000 TRISD = %01111000 ' Declaramos las variables: X VAR Byte VAR1 VAR Byte DIGITO VAR Byte[7] CLV VAR Byte[7] ' Guardamos cada digito de la clave en las posiciones elegidas previamente: Write Write Write Write Write Write 10. 15. ' ' ' ' ' ' ' inicializamos la variable X = 0 leemos el primer dígito y lo guardamos en CLV[1] leemos el segundo dígito y lo guardamos en CLV[2] leemos el tercer dígito y lo guardamos en CLV[3] leemos el cuarto dígito y lo guardamos en CLV[4] leemos el quinto dígito y lo guardamos en CLV[5] leemos el sexto dígito y lo guardamos en CLV[6] ' Hacemos una pausa de 2 segundos ' Generamos un sonido CLV[1] CLV[2] CLV[3] CLV[4] CLV[5] CLV[6] LCDOut $fe. 1 2 3 4 5 6 ' ' ' ' ' ' Primer dígito de la clave Segundo dígito de la clave Tercer dígito de la clave Cuarto dígito de la clave Quinto dígito de la clave Sexto dígito de la clave ' Iniciamos el sistema con una bienvenida: Inicio: LCDOut $fe. 12.

significa que pulsamos una tecla. si es diferente salta a la subrutina “error”.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. y el formato es: Si DIGITO[X] es igual a CLV[X] el digito es correcto. y salta a la etiqueta “paseX”. 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 dígitos han sido correctos ' se ejecuta la subrutina correspondiente. X = X + 1 DIGITO[X] = VAR1 ' 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 ' teclado matricial GoTo consulta ' Si X es diferente de 6 continuamos ' esperando el siguiente valor a ser ' ingresado desde el teclado ' ' ' ' ' ' A partir de la siguiente etiqueta empezamos la comprobación. 172 . 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 dígitos introducidos desde el teclado matricial para luego ser comparados con los valores almacenados en la memoria de datos.

Correcto: Pause 500 LCDOut $fe, 1 ' Limpia la LCD LCDOut $fe, 2 ' Posiciona el cursor en el inicio LCDOut " * * * * * * "

LCDOut $fe,$C0, "Clave Call beep Pause 3000 GoTo inicio Error: Pause 500 LCDOut $fe, 1 ' LCDOut $fe, 2 ' LCDOut LCDOut $fe,$C0, Call beep Call beep Call beep Pause 1500 GoTo clave

Correcta!"

' Generamos un sonido ' Pausa para visualizar el mensaje

Limpia la LCD Posiciona el cursor en el inicio " * * * * * * " " ERROR! "

' Generamos un sonido ' Generamos un sonido ' Generamos un sonido ' Pausa para visualizar el mensaje ' Salta a “clave” para nueva oportunidad

' La siguiente subrutina genera un “Beep” en el Buzzer ' conectado en RC0. Beep: High portc.0 ' Estado Lógico Alto para RC0 Pause 100 ' Pausa de 100 milisegundos Low portc.0 ' Estado Lógico Bajo para RC0 Pause 100 ' Pausa de 100 milisegundos Return ' Retorna una línea después del llamado "Call" Teclado: VAR1 = 0 PORTD.0 = 0 PORTD.1 = 1 PORTD.2 = 1 If If If If PORTD.3 PORTD.4 PORTD.5 PORTD.6 = = = = 0 0 0 0 ' Columna 1 = 0 ' Columna 2 = 1 ' Columna 3 = 1 Then Then Then Then VAR1 VAR1 VAR1 VAR1 = = = = 1 4 7 10 ' ' ' ' tecla tecla tecla tecla "1" "4" "7" "*"

173

PORTD.0 = 1 PORTD.1 = 0 PORTD.2 = 1 If If If If PORTD.3 PORTD.4 PORTD.5 PORTD.6 = = = = 0 0 0 0

' Columna 1 = 1 ' Columna 2 = 0 ' Columna 3 = 1 Then Then Then Then VAR1 VAR1 VAR1 VAR1 = = = = 2 5 8 11 ' ' ' ' tecla tecla tecla tecla "2" "5" "8" "0"

PORTD.0 = 1 PORTD.1 = 1 PORTD.2 = 0 If If If If PORTD.3 PORTD.4 PORTD.5 PORTD.6 = = = = 0 0 0 0

' Columna 1 = 1 ' Columna 2 = 1 ' Columna 3 = 0 Then Then Then Then VAR1 VAR1 VAR1 VAR1 = = = = 3 6 9 12 ' ' ' ' tecla tecla tecla tecla "3" "6" "9" "#"

Return End

' Retorna una línea después del llamado "Call"

174

Interrupciones

Capitulo IX

9.1.- ¿Qué son las Interrupciones? Las interrupciones son cambios de trayectorias del flujo de un programa causadas por agentes externos de mayor prioridad. Cuando esto ocurre, el microcontrolador detiene el programa en curso, almacena la dirección en la cual se ha detenido y salta a un vector de interrupción previamente definido en el programa. 9.2.- Fuentes de Interrupciones: A continuación mencionaremos cuatro posibles fuentes de interrupción en un microcontrolador PIC16F84: 1. Activación de interrupción por el pin RB0/INT. 2. Desbordamiento del temporizador TMR0. 3. Cambio de estado de uno de los pines más significativos del puerto B (RB4-RB7). 4. Finalización de la escritura en la EEPROM de datos. Estas posibles fuentes de interrupción microcontroladores mas avanzados. pueden aumentar en

9.3.- Registro INTCON: Para aprender a controlar una de estas fuentes de interrupción, debemos estudiar el registro de control de interrupciones “INTCON”, con el cual podremos habilitar el inspector de interrupciones, seleccionar el tipo de interrupción y consultar las banderas de interrupciones.
Bit 7 GIE Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 EEIE TOIE INTE RBIE TOIF INTF RBIF
Figura 9.1.

175

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

176

9.4.- Activación de interrupción a través del pin RB0/INT: Para activar esta interrupción, lo primero que debemos tomar en cuenta es la configuración 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 interrupción y habilitar el inspector de interrupciones. Estos pasos se pueden ver claramente en el programa propuesto para el proyecto que presentamos a continuación.

9.5.- Proyecto #25. En el siguiente circuito hemos conectado un diodo LED en el pin RA0, el cual deberá destellar a una frecuencia de 1 Hz. La interrupción ocurre cuando activamos P1, lo cual produce un salto hacia el vector de interrupción, en el cual habrá una rutina encargada de hacer destellar un LED conectado en el pin RA1.

Figura 9.2.

177

Proyecto # 25 Componente PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 33 pF LED Resistencia de 220 Ohm Resistencia de 10K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc Cantidad 1 1 2 2 2 1 1 1

Tabla 9.1.

Figura 9.3.

Lea detenidamente los comentarios en cada línea y analice el funcionamiento del programa y del registro INTCON:
' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz.

178

TRISA = %00000000 TRISB = %00000000 I VAR Byte

' Configura el Puerto A como salida ' Configura el Puerto B como salida

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 interrupción será ' activada por flanco positivo o negativo. On Interrupt GoTo Interrup INTCON = %10010000 ' Define el vector de interrupción. ' Activa el inspector de interrupciones y ' habilita la interrupción RB0/INT. ' Inicializa el puerto A. ' Apaga el Led1 ' Apaga el Led2 ' Cero (0) para activación de RB0/INT en flanco descendente ' Uno (1) para activación de RB0/INT en flanco ascendente

PORTA = $00 LED1 = 0 LED2 = 0 INTEDG = 0 Inicio: LED1 = 1 Pause 1000 LED1 = 0 Pause 1000 GoTo Inicio ' ' ' ' '

Enciende el Led1 Pausa de 1000 ms (1 segundo) Apaga el Led1 Pausa de 1000 ms (1 segundo) Salta a la etiqueta inicio

' Rutina de interrupción: Interrup: Disable For I = 1 To 6 LED2 = 1 Pause 200 LED2 = 0 Pause 200 Next I INTCON = %10010000 ' Detiene al inspector de interrupciones mientras ' ejecuta las siguientes líneas: ' ' ' ' Enciende Pausa de Apaga el Pausa de el Led2 200 ms Led1 200 ms

Enable Resume End

' Habilita las interrupciones (GIE=1) ' Habilita la interrupción RB0/INT (INTE=1) ' Inicializa la interrupción (INTF=0) ' Habilita el inspector de interrupciones. ' GIE = 1 y retorna al punto donde había quedado ' antes de la interrupción.

179

la bandera de interrupción TOIF en el registro INTCON se activa.9. Cuando esto ocurre. Este registro produce una interrupción cuando su conteo pasa de 255 ($FF) a 0 ($00).4. La Figura 9. TOIF = 1. 180 .Interrupción TMR0: El registro TMR0 es un contador ascendente de ocho bits.6. el cual también puede ser configurado como temporizador. es decir.4 representa el funcionamiento del registro TMR0: Figura 9..

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

Divisor de WDT 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128 182 .2.INTEDG: (Flanco activo de interrupción externa) 1 = activación de la interrupción con flanco ascendente 0 = activación de la interrupción con flanco descendente TOCS: 1 = señal de reloj introducida a través de RA4/TOCKI 0 = señal de reloj interno FOSC/4 TOSE: 1 = incrementa TMR0 con flanco descendente de RA4/TOCKI 0 = incrementa TMR0 con flanco ascendente de RA4/TOCKI PSA: 1 = asigna el divisor de frecuencia a WDT 0 = asigna el divisor de frecuencia a TMR0 PS2.PS0: PS2 PS1 PS0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 Divisor de TMR0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256 Tabla 9.PS1.

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

6. aplicando la formula tenemos: Temporización 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 incógnita tenemos que: Valor a cargar en TMR0 = 256 – (50ms / (256 x 0.000001)) Valor a cargar en TMR0 = 256 – 195 Valor a cargar en TMR0 = 61 El valor a cargar en el registro TMR0 para que se produzca un desborde cada 50 milisegundos es 61. 184 .Entonces.6 y analice detenidamente el programa que se muestra a continuación: Figura 9. Realice el montaje correspondiente al diagrama esquemático de la figura 9.

' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz.0 OPTION_REG = %0000111 INTCON = %10100000 Disable Inicio: High LED Call Retardo Low LED Call Retardo GoTo Inicio ' ' ' ' ' Enciende el Led Llama a la rutina de retardo Apaga el Led Llama a la rutina de retardo Salta a la etiqueta “inicio”. 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 cálculo del dato a cargar en TMR0 es: 185 . Retardo: For I = 1 To 20 ' Repetimos la interrupción 20 veces para ' obtener un retardo de 1 segundo.2 Symbol GIE = INTCON.7 Symbol LED = PORTA.Proyecto # 26 Componente PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 33 pF LED Resistencia de 220 Ohm Fuente regulada de 5 Vdc Cantidad 1 1 2 1 1 1 Tabla 9. ' Alias para el bit 7 del registro INTCON.3. ' Alias para el pin RA0 ' Configuración del Registro OPTION ' Configuración del Registro INTCON I var Byte On Interrupt GoTo retardo Symbol TOIF = INTCON. ' Declaración de la variable “I” tipo Byte. ' Define el vector de Interrupción ' Alias para el bit 2 del registro INTCON.

con este bit en estado lógico “1”. RB5. ' pregunta si TMR0 se desbordo. podemos configurar este registro de la siguiente manera: Bit 7 GIE Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 EEIE TOIE INTE RBIE TOIF INTF RBIF Figura 9.7. RB6 y RB7 es muy sencillo. ' Salta a la etiqueta “Espera”.' TMR0 = 256 .9. y lo podemos hacer a través del registro INTCON. 186 .050/0. es decir. habilitamos las interrupciones por cambio de estado en el puerto B. es decir.Interrupción por cambio de estado de uno de los pines más significativos del puerto B (RB4-RB7): Activar la interrupción por cambio de estado en los pines RB4. con este bit en estado lógico “1”.000256) = 60. ' Inicializa la bandera TOIF 9. habilitamos las interrupciones. donde contamos con un bit llamado RBIE.(0. RBIE = 1.68 = 61 TMR0 = 61 Espera: ' Cargamos el dato en TMR0 If TOIF = 1 Then Reseteo GoTo Espera Reseteo: TOIF = 0 Return Resume End ' pregunta si TOIF es igual a 1.. INTCON = %10001000 GIE = 1. que activa o desactiva este tipo de interrupción.

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

' Configura el puerto A como salida. ' Declaración de la variable "I" tipo Byte ' Alias para el pin RA0 ' Alias para el pin RA1 TRISA = %00000000 TRISB = %11110000 I VAR Byte Symbol LED1 = PORTA.4. para poner un “1” en la entrada correspondiente. RB5. RB6 y RB7 están normalmente en “0”.1 On Interrupt GoTo Interrup ' Define el vector de interrupción INTCON = %10001000 ' habilita la interrupción RB4-RB7 Inicio: LED1 = 1 Pause 1000 LED1 = 0 Pause 1000 GoTo Inicio ' ' ' ' ' Enciende el Led 1 Pausa de 1 segundo Apaga el Led 1 Pausa de 1 segundo Salta a la etiqueta "Inicio" 188 .0 Symbol LED2 = PORTA. ' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. para producir una interrupción bastará con activar cualquiera de los pulsadores. ' Configura los 4 bits más significativos como ' entrada. En este circuito las entradas RB4.Proyecto # 27 Componente PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 33 pF LED Resistencia de 220 Ohm Resistencia de 10K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc Cantidad 1 1 2 2 2 4 4 1 Tabla 9.

Interrup: Disable For I = 1 To 6 LED2 = 1 Pause 1000 LED2 = 0 Pause 1000 Next I ' ' ' ' Enciende Pausa de Apaga el Pausa de el Led 2 1 segundo Led 2 1 segundo INTCON = %10001000 ' habilita las interrupciones (GIE=1) ' habilita la interrupción RB4-RB7 (RBIE=1) ' Inicializa la interrupción (RBIF=0) Resume Enable End 189 .

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

y 191 . El Pin SDA (Serial Data) es bi-direccional y es utilizado para transferir direcciones y datos a un dispositivo I2C. 2 y 3 son programables a través de los pines A0. Las instrucciones de programa en PicBasic para el control del bus I2C son “I2Cread” e “I2CWrite”. A1 y A2 (ver figura 10. con ellos seleccionamos la dirección de cada memoria EEPROM conectada al Bus: 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. con las cuales realizaremos los siguientes proyectos. Los Bits 1. El Pin SCL (Serial Clock) se utiliza para sincronizar la transferencia de datos y los dispositivos conectados al bus I2C.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.3. “lectura” o “escritura”. Figura 10. El bit 0 es una bandera que indica el estado actual de la memoria.2).2. El Pin WP (Write Protection) debemos conectarlo a tierra (Gnd) si deseamos escribir datos en la memoria.

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

SCL.0 Symbol SCL = PORTB. La primera actividad consiste en escribir un dato en una dirección específica de la memoria de datos EEPROM conectada al bus I2C. ' Alias para RB0 ' Alias para RB1 Symbol SDA = PORTB. {etiqueta de salto opcional} La instrucción I2CWrite enviará el dato de control y la dirección en la cual se almacenará el dato cargado en la variable previamente cargada.29 Componente PIC16F877A Cristal de 4 Mhz Capacitor cerámico de 22 pF Pantalla LCD 16x2 Resistencia de 4. Dirección.1.7K Ohm Potenciómetro de 5K Ohm Memoria EEPROM 24LC256 Fuente regulada de 5 Vdc Cantidad 1 1 2 1 2 1 1 1 Tabla 10. Control.Proyecto # 28 . I2CWRITE Sintaxis: I2CWrite SDA.1 193 . Analice el siguiente programa: Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. [dato].

los cuatro bits más significativos están configurados como “1010xxxx”. debemos tomar en cuenta que para una memoria serial. A1 y A0. A1 y A0 están conectados a tierra en este proyecto. SCL. Observe que los pines A2. los hemos conectado a tierra. y el bit R/W debe estar en “0” para poder escribir un dato en la memoria (ver figura 10. y por último el dato a ser almacenado será “$23”. el cual contiene la dirección de la memoria 24LC256 es “$A0”.5). 2. entonces. podrá obtener la respuesta verificando la conexión de la memoria en el circuito de la figura 10. 1 Inicio: Control = $A0 Direc = $10 Dato = $23 ' Declaración de variable "Direc" ' Declaración de variable "Control" ' Declaración de variable "Dato" ' Pausa de 200 milisegundos para la LCD ' Limpia la LCD ' ' ' ' Dato de Control Dirección en la memoria externa Dato a ser cargado en la dirección especificada ($23 = 35 Decimal) I2Cwrite SDA. Direc. "Dato Grabado" Loop: GoTo Loop End A partir de la etiqueta “Inicio”. los tres bits A2. El dato de control. Bit 0 (R/W) 0 194 . la dirección en la cual vamos a almacenar un dato en este ejemplo será “$10”. Recuerde que estos tres pines definen la dirección del dispositivo.Direc VAR Word Control VAR Byte Dato VAR Byte Pause 200 LCDOut $fe. Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 (A2) Bit 2 (A1) Bit 1 (A0) 1 0 1 0 0 0 0 A 0 Figura 10. Control. [dato] ' Escribe la memoria Pause 10 ' Pausa de 10 milisegundos ' Muestra mensaje por la LCD LCDOUT $fe.4. asignamos valores a las variables declaradas.5. Si se pregunta porqué el dato de control es $A0.

y en la dirección correcta. [dato]. Control. $A0. I2CREAD Sintaxis: I2Cread SDA. procedemos a mostrar un mensaje en la pantalla LCD. Para verificar que este dato en realidad está grabado en la memoria. PORTB. Control. SCL.1.1 A1 Var Byte Direc var Word Control Var Byte Pause 200 195 . veamos el siguiente programa: Define Osc 4 ' Define el Oscilador para un Cristal de 4 Mhz. Al utilizar la etiqueta opcional. ' Alias para RB0 ' Alias para RB1 ' Declaración de variable "A1" ' Declaración de variable "Direc" ' Declaración de variable "Control" ' Pause de 200 milisegundos Symbol SDA = PORTB. Dirección.0. el programa saltará si no se recibe ninguna respuesta del dispositivo consultado. indicando que el dato ya ha sido grabado. $10. Direc. para asegurar el tiempo necesario para la grabación del dato en la memoria. [$23] Note que en el programa utilizamos los alias y las variables: I2Cwrite SDA.Para enviar el dato a la memoria en la dirección especificada. SCL. utilizamos la instrucción I2CWrite de la siguiente manera: I2Cwrite PORTB. [dato] Seguidamente se requiere de una pausa de 10 milisegundos.0 Symbol SCL = PORTB. {etiqueta de salto opcional} La instrucción I2Cread enviará el dato de control y la dirección específica a un dispositivo conectado a un bus I2C y almacenará el dato obtenido en una variable definida. Una vez finalizada la pausa.

LCDOut $fe. Direc.. Control. [dato] Pause 10 If I = 50 Then leer Direc = Direc + 1 Dato = Dato + 2 Next I ' ' ' ' Pausa de 10 milisegundos Condicional Suma 1 a la variable "Direc" Suma 2 a la variable "Dato" 196 . Direc. ' Alias para RB0 ' Alias para RB1 Declaración Declaración Declaración Declaración Declaración de de de de de variable variable variable variable variable "I" "A1" "Direc" "Control" "Dato" Symbol SDA = PORTB.3.1 I VAR Byte A1 VAR Byte Direc VAR Word Control VAR Byte Dato VAR Byte Pause 200 LCDOut $fe. SCL. Control."Dato: ". Este proyecto está basado en el diagrama de la figura 10.#A1 Ciclo: GoTo Ciclo End ' Muestra el dato leido 10.Proyecto #29: El siguiente programa almacena datos a partir de la dirección cero ($00) de la memoria EEPROM conectada al bus I2C. 1 Direc = $00 Control = $A0 Dato = 1 Escribir: For I = 0 To 50 ' ' ' ' ' ' Pausa de 200 milisegundos para la LCD ' Limpia la LCD ' Dirección en la memoria externa ' Dato de Control ' Dato inicial a ser grabado ' Repetición ' Escribe la memoria I2Cwrite SDA. donde el dato inicial es igual a 1. SCL. [A1] LCDOUT $fe. Analice el siguiente programa: ' Programa en Pic Basic Pro Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. 2.4. Se almacenan números que se incrementan de dos en dos. 1 Inicio: Direc = $10 Control = $A0 ' Limpia la LCD ' Dirección en la memoria externa ' Dato de Control ' Lectura de Memoria I2CREAD SDA.0 Symbol SCL = PORTB.

"Inicia Lectura" Pause 2000 Direc = $00 For I = 0 To 50 ' Muestra mensaje por la LCD ' Pausa de 2 segundos ' Muestra mensaje por la LCD ' Pausa de 2 segundos ' Inicializa la dirección en la memoria externa ' Repetición ' Lectura de memoria I2CREAD SDA. 2. podemos utilizar memorias como la 24LC512 o varias de menor o igual capacidad conectadas al bus I2C como se observa en la figura 10.Leer: LCDOUT $fe. se debe considerar el conexionado de los Pines 1. En el programa también debemos tomar en cuenta que para leer cada una de estas memorias." " ' 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 End ' Salta a la etiqueta "final" En caso de requerir mayor capacidad de memoria de datos para nuestros proyectos. tenemos que especificar la dirección del “dispositivo”. SCL."Dato "."Datos Grabados" Pause 2000 LCDOut $fe.#I. [A1] LCDOUT $fe. 197 . es importante resaltar que cuando se tiene mas de una memoria conectada al bus. 2. Direc.": ". 2. A1 y A2 respectivamente). Por supuesto. Control.#A1.6. 2 y 3 (A0.

para luego ser extraídos y verificados. 198 .10.4.2. Proyecto # 30 Componente PIC16F877A Cristal de 4 Mhz Capacitor cerámico de 22 pF Pantalla LCD 16x2 Resistencia de 4.. Figura 10.Proyecto #30: Veamos el siguiente programa en el cual se almacenan datos en dos memorias conectadas al bus I2C.7K Ohm Potenciómetro de 5K Ohm Memoria EEPROM 24LC256 Fuente regulada de 5 Vdc Cantidad 1 1 2 1 2 1 2 1 Tabla 10.6.

Control.0 Symbol SCL = PORTB. Pin A1 = 0."Memoria 1 " Pause 2000 ' Pausa de 2 segundos ' Escribimos en la memoria 2 (Pin A0 = 1. ' Alias para RB0 ' Alias para RB1 ' ' ' ' ' Declaración Declaración Declaración Declaración Declaración de de de de de variable variable variable variable variable "I" "A1" "Direc" "Control" "Dato" Symbol SDA = PORTB. Direc. Pin A1 = 0.$C0. SCL. 1 ' Pausa de 200 milisegundos para la LCD ' Limpia la LCD memoria1: ' Escribimos en la memoria 1 (Pin A0 = 0. prestando atención a los comentarios de cada línea: Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. Pin A2 = 0) ' xxxxAAAx ' xxxx210x Control = %10100000 Direc = $00 Dato = 1 For I = 0 To 20 ' Dato de Control ' Dirección en la memoria externa ' Dato inicial a ser grabado ' Repetición ' Escribe la memoria I2Cwrite SDA.1 I VAR Byte A1 VAR Byte Direc VAR Word Control VAR Byte Dato VAR Byte Pause 200 LCDOut $fe.Analice el siguente programa. Pin A2 = 0) memoria2: ' xxxxAAAx ' xxxx210x Control = %10100010 ' Dato de Control 199 . 2. [dato] Pause 10 If I = 20 Then confirma1 Direc = Direc + 1 Dato = Dato + 2 Next I confirma1: ' Pausa de 10 milisegundos ' Condicional ' Suma 1 a la variable "Direc" ' Suma 2 a la variable "Dato" ' Muestra mensaje por la LCD LCDOUT $fe."Datos Grabados" LCDOut $fe.

Control."Inicia Lectura" LCDOut $fe."Memoria 2 " Pause 2000 ' xxxxAAAx ' xxxx210x Control = %10100010 Direc = $00 For I = 0 To 20 ' Muestra mensaje por la LCD ' Pausa de 2 segundos ' Dato de Control ' Dirección en la memoria externa ' Repetición ' Lectura de memoria I2CREAD SDA.": ". [A1] LCDOUT $fe.$C0.#I.$C0.Direc = $00 Dato = 150 For I = 0 To 20 ' Dirección en la memoria externa ' Dato inicial a ser grabado ' Repetición ' Escribe la memoria I2Cwrite SDA. SCL. Direc. Direc."Memoria 2 " Pause 2000 ' Muestra mensaje por la LCD ' Iniciamos la lectura en la memoria 1: lectura1: LCDOut $fe. 2."Inicia Lectura" LCDOut $fe. SCL.#A1. 2. Control. Direc."Memoria 1 " Pause 2000 ' xxxxAAAx ' xxxx210x Control = %10100000 Direc = $00 For I = 0 To 20 ' Muestra mensaje por la LCD ' Pausa de 2 segundos ' Dato de Control ' Dirección en la memoria externa ' Repetición ' Lectura de memoria I2CREAD SDA."Dato ". 2. Control.$C0."Datos Grabados" LCDOut $fe." " ' 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: LCDOut $fe. [A1] 200 . SCL. 2. [dato] Pause 10 If I = 20 Then confirma2 Direc = Direc + 1 Dato = Dato + 5 Next I ' ' ' ' Pausa de 10 milisegundos Condicional Suma 1 a la variable "Direc" Suma 2 a la variable "Dato" confirma2: LCDOUT $fe.

2." " ' 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 End ' Salta a la etiqueta "final" 201 .LCDOUT $fe.#I.": "."Dato ".#A1.

1.1. según sea la configuración elegida por el diseñador. Los microcontroladores de las familias PIC16F87x y PIC18Fxxx de los cuales estaremos hablando a continuación. identificadas por las siglas AN(n).1: Figura 11. y en el caso particular de los microcontroladores de 40 pines como el PIC16F877 o el PIC18F442 por ejemplo. 202 . se puede observar que poseen 8 canales para conversión A/D. como se muestra en el diagrama de pines de la figura 11. poseen un convertidor Analógico-Digital que convierte una señal analógica en un número de 8 o 10 bits..Conversor A/D en el PIC16F877 Capitulo XI 11.Conversor A/D. encontraremos que solo poseen 5 entradas para la conversión A/D. En los microcontroladores PIC de 28 pines como el PIC16F870. las cuales se encuentran distribuidas entre el puerto A y el puerto E.

el canal AN2 corresponde al pin # 4 y así sucesivamente. al pin RA0 del puerto A. Por ejemplo.1. como se puede observar en la tabla 11. 0 1 2 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 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. Esto significa que si elegimos la conversión de una señal analógica a solo 8 bits (28 = 256).En el microcontrolador PIC16F877. 203 . o expresado de otra manera.1: REGISTRO BAJO (ADRESL) Decimal BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 …………. los valores digitales resultantes de la conversión estarán comprendidos entre 0 y 255 (en binario es de 00000000 hasta 11111111). será decidir si la conversión se hará configurando el conversor a 8 o 10 bits. 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 …………. el canal AN0 corresponde al pin # 2 del microcontrolador. cada canal de conversión A/D está conectado a un pin ubicado en el puerto “A” y en el puerto “E”. entonces se puede ver claramente que el puerto A cuenta con cinco de los ocho canales del conversor A/D. El canal AN1 corresponde al pin # 3. Un punto importante a considerar al momento de utilizar el convertidor A/D. y los otros tres canales están ubicados en los pines correspondientes al puerto E del microcontrolador. con lo cual a su vez estaremos definiendo la resolución en el proceso de conversión.

ya que tenemos 210 = 1024 datos de conversión. y donde el voltaje de referencia del conversor es 5 voltios. veamos el siguiente ejemplo: Si configuramos el conversor A/D a 8 bits e introducimos una señal cuya amplitud varía entre 0 y 5 voltios. …………. 0 1 2 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 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. entonces la resolución que obtendremos en la conversión sería la siguiente: Resolución = Vimax 2n 5V 28 Resolución = 204 . 1018 1019 1020 1021 1022 1023 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 1 1 1 1 1 1 ………….2: REGISTRO ALTO (ADRESH) Decimal BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 REGISTRO BAJO (ADRESL) BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 ………….Cuando la conversión se hace a 10 bits. como se puede observar en la tabla 11.2. Para comprender aún mejor este punto. la resolución aumenta considerablemente en relación a la de 8 bits.

Si configuramos el conversor A/D a 10 bits.00488 ≈ 0. entonces tenemos que 210 = 1024.02 V Esto significa que la resolución a 8 bits para el ejemplo planteado es de 20 mV por cada paso que da el conversor A/D entre 0 y 255.0049 V Entonces la resolución a 10 Bits es de 4. 205 .0196 ≈ 0. lo cual podemos demostrar realizando los cálculos correspondientes: Resolución = Vimax 2n 5V 210 5V 1024 Resolución = Resolución = Resolución = 0.Resolución = 5V 256 Resolución = 0. y por lo tanto obtenemos una resolución mayor.9 mV por cada paso que da el conversor A/D entre 0 y 1023.

el cual ha sido previamente configurado para esto. Resulta interesante saber que se puede obtener más resolución en términos de voltios por paso.5 voltios en el pin RA3/AN3/Ref+ del puerto A. si utilizamos un voltaje de referencia menor al de la alimentación del microcontrolador a través de los pines “Ref+” o “Ref-“ según sea el caso.2.2): Figura 11. si aplicamos un voltaje de referencia positivo igual a 2.Veamos el diagrama de bloques del conversor A/D (figura 11. Por ejemplo. entonces: Resolución = Vimax 2n 206 .

Esto se hace seleccionando la combinación correspondiente en los bits PCFG3. 207 .3.3). según la combinación elegida. Bit 7 ADFM Bit 6 ------ Bit 5 ------ Bit 4 ------ Bit 3 PCFG3 Bit 2 PCFG2 Bit 1 PCFG1 Bit 0 PCFG0 Figura 11.Resolución = 2.5V 1024 Resolución = Resolución = 0.3. PCFG2 PCFG1 y PCFG0 del registro de control ADCON1 (figura 11.5V 210 2.00244 ≈ 0.0025 V La resolución del conversor A/D sería de 2. en el caso de ser necesario. Hay una serie de pasos que debemos tomar en cuenta para llevar a cabo una conversión A/D. basados en el diagrama de bloques de la figura 11. que define cuales pines del puerto A y E serán entradas al conversor A/D.5 mV por cada paso entre 0 y 1023. En este punto es muy conveniente detenerse a analizar la tabla 11.2: Lo primero. será configurar los canales de entrada que utilizaremos para introducir la señal analógica al conversor A/D y los canales para voltajes de referencia.

4. CHS1 (bit 4) y CHS0 (bit 3) del registro ADCON0 (figura 11.4): Bit 7 ADCS1 Bit 6 ADCS0 Bit 5 CHS2 Bit 4 CHS1 Bit 3 CHS0 Bit 2 GO/DONE Bit 1 ------ Bit 0 ADON Figura 11.4. CHS2 CHS1 CHS0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 = = = = = = = = Canal/Pin Canal 0 (AN0)/RA0 Canal 1 (AN1)/RA1 Canal 2 (AN2)/RA2 Canal 3 (AN3)/RA3 Canal 4 (AN4)/RA5 Canal 5 (AN5)/RE0 Canal 6 (AN6)/RE1 Canal 7 (AN7)/RE2 Tabla 11.3. El segundo paso será activar el canal en el cual se encuentra presente la señal analógica para que pase a la etapa de muestreo. La selección de las entradas analógicas se realiza configurando los bits CHS2 (bit 5). 208 .PCFG3 PCFG2 PCFG1 PCFG0 AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 Vref+ Vref- 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 x 0 1 0 1 0 1 0 1 A A D D D D D A D D D D D D D A A D D D D D A D D D D D D D A A D D D D D A A A A D D D D A A A A D D D A A A A A D D D A A Vref+ A A A Vref+ A A D Vref+ D D D Vref+ VrefA A Vref+ A Vref+ VrefVref+ VrefVref+ VrefD D Vref+ Vref- A A A A A A D A A A A A A D D A A A A A A D A A A A A A A A Vdd RA3 Vdd RA3 Vdd RA3 Vdd RA3 Vdd RA3 RA3 RA3 RA3 Vdd RA3 Vss Vss Vss Vss Vss Vss Vss RA2 Vss Vss RA2 RA2 RA2 Vss RA2 Tabla 11.

2. temperatura Significa que el resultado de la conversión de una señal presente en la entrada “AN0” será almacenado en la variable “temperatura”.. la cual ha sido previamente definida en el programa. Por ejemplo: ADCin 0. 11. con la instrucción de programa ADCin.También es posible seleccionar el canal que deseamos utilizar.5. en la cual sólo se especifica cual será el canal de entrada de la señal a ser convertida y la variable en la cual se almacenará el resultado de la conversión. ADCS1 ADCS0 Conversión del Reloj 0 0 = Fosc/2 0 1 = Fosc/8 1 0 = Fosc/32 1 1 = FRC Tabla 11. Bit 7 y Bit 6: Selección del reloj del conversor A/D. Aunque la instrucción ADCin se encarga de controlar el registro ADCON0 ahorrando algunas líneas de programa.5. consideramos conveniente hacer una revisión de los registros de control del conversor A/D.El registro ADCON0: Bit 7 ADCS1 Bit 6 ADCS0 Bit 5 CHS2 Bit 4 CHS1 Bit 3 CHS0 Bit 2 GO/DONE Bit 1 ------ Bit 0 ADON Figura 11. 209 .

6. 0 = Conversión A/D detenida. Bit 2: Estado de la conversión.El registro ADCON1: Bit 7 ADFM Bit 6 ------ Bit 5 ------ Bit 4 ------ Bit 3 PCFG3 Bit 2 PCFG2 Bit 1 PCFG1 Bit 0 PCFG0 Figura 11.3. 0 = conversor A/D apagado. 1 = conversor A/D encendido. Bit 1: Este bit no está implementado. Bit 7: Justificación del resultado de la conversión a 10 bits a la derecha o izquierda. CHS2 CHS1 CHS0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 = = = = = = = = Canal/Pin Canal 0 (AN0)/RA0 Canal 1 (AN1)/RA1 Canal 2 (AN2)/RA2 Canal 3 (AN3)/RA3 Canal 4 (AN4)/RA5 Canal 5 (AN5)/RE0 Canal 6 (AN6)/RE1 Canal 7 (AN7)/RE2 Tabla 11.6. Bit 4 y Bit 3: Selección del canal de entrada. GO/DONE: Solo funciona si ADON = 1 1 = Conversión A/D en progreso. Bit 0: Enciende el conversor A/D.Bit 5. 210 . 11..

0 = Justifica a la Izquierda.7. se deben utilizar las siguientes directivas: Conversión a 8 Bits: Define ADC_BITS 8 211 . Bit 2. Bit 6 al Bit 4: No están implementados. Bit3. A A A A D D D A A A A A D D D A Vref+ A Vref+ A Vref+ D Vref+ A Vref+ Vref+ Vref+ Vref+ D Vref+ A A A A D D D VrefA A VrefVrefVrefD Vref- A A A A A A D A A A A A A D D A A A A A A D A A A A A A A A Vdd RA3 Vdd RA3 Vdd RA3 Vdd RA3 Vdd RA3 RA3 RA3 RA3 Vdd RA3 Vss Vss Vss Vss Vss Vss Vss RA2 Vss Vss RA2 RA2 RA2 Vss RA2 A = Entrada Analógica D = I/O Digital Para definir en un programa si la conversión A/D se hará a 8 bits o a 10 bits.1 = Justifica a la derecha. Bit 1 y Bit 0: Configuración PCFG3 PCFG2 PCFG1 PCFG0 AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 Vref+ Vref- 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 x 0 1 0 1 0 1 0 1 A A D D D D D A D D D D D D D A A D D D D D A D D D D D D D A A D D D D D A A A A D D D D Tabla 11.

solo que en la parte alta de éste. figura 11. es decir. el resultado de la conversión se almacena en dos registros. Conversión a 10 Bits: Define ADC_BITS 10 Cuando realizamos la conversión A/D a 10 bits. como lo demuestra la figura 11. aplicada a cualquiera de los canales. es decir. será de 8 bits. los 6 bits mas significativos (Bit 2 al Bit 7 de ADRESH.8) no son tomados en cuent.8.9. En la conversión a 10 bits también es muy importante considerar el bit 7 (ADFM) del registro de control ADCON1. ya que este bit mantiene el resultado de la conversión de 10 bits justificado. son considerados como “0”. Este resultado será almacenado en un registro definido por el fabricante denominado ADRESL. ADRESH y ADRESL. Esto da como resultado que el valor máximo a ser almacenado en él será: 0000001111111111.Esta directiva define que el resultado de la conversión A/D de una señal.7. o a la izquierda si ADFM = 0 como lo demuestra la figura 11. 1023.10: 212 . REGISTRO BAJO (ADRESL) BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 Figura 11. REGISTRO ALTO (ADRESH) BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 REGISTRO BAJO (ADRESL) BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 0 0 0 0 0 0 Figura 11. ya sea a la derecha si ADFM = 1. los cuales unidos forman un solo registro de 16 bits.

necesario para cargar el condensador de mantenimiento “C-Hold” (ver figura 11. y el bit más significativo es el bit 7 del registro ADRESH. 0 0 0 0 0 Cuando justificamos el resultado de la conversión A/D a la izquierda. Nota: En el proceso de conversión A/D. resulta importante considerar un tiempo mínimo requerido en la etapa de muestreo.REGISTRO ALTO (ADRESH) BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 REGISTRO BAJO (ADRESL) BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 0 0 0 0 0 0 Figura 11.2). El tiempo de muestreo se define a través de la siguiente directiva: Define ADC_SAMPLEUS {tiempo} Ejemplo: Define ADC_SAMPLEUS 50 213 . el bit menos significativo de éste es el bit 6 del registro ADRESL.10. REGISTRO ALTO (ADRESH) BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 REGISTRO BAJO (ADRESL) BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 0 Figura 11.9.

. 214 .4. Figura 11. y un potenciómetro de 5Kohm para introducir un voltaje variable en un canal de entrada al conversor A/D.11. el cual consta básicamente de un microcontrolador PIC16F877. una pantalla LCD para visualizar los resultados.11.Proyecto #31: A continuación presentamos un ejemplo de conversión A/D a 8 bits. un oscilador externo de 10 Mhz.

el PIC16F877. el PIC18F442. el PIC18F458 entre otros. DEFINE OSC 10 DEFINE LCD_DREG DEFINE LCD_BITS DEFINE LCD_DBIT DEFINE DEFINE DEFINE DEFINE DEFINE LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT LCD_LINES PORTD 4 4 PORTB 1 PORTB 0 2 ' Define el Oscilador a 10 Mhz ' ' ' ' ' ' ' ' ' Indica que el Bus estará conectado en el Puerto D El bus será de cuatro bits. Selección 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 número de líneas de la pantalla 215 .Proyecto # 31 Componente PIC16F877A Cristal de 10 Mhz Capacitor cerámico de 22 pF Pantalla LCD 16x2 Resistencia de 220 Ohm Potenciómetro de 5K Ohm Fuente regulada de 5 Vdc Cantidad 1 1 2 1 2 2 1 Tabla 11. el PIC18F452.8. Realice el montaje del circuito propuesto en la figura 11. y analice cada línea de programa leyendo detenidamente los comentarios. Variable Esta instrucción solo es válida para microcontroladores que tienen convertidor A/D. ADCin Sintaxis: ADCin canal. por ejemplo.11.

podemos observar como varía el resultado cargado en la variable “A” al modificar el valor del potenciómetro conectado al canal AN0 del conversor A/D (figura 11. y también para que el voltaje de referencia sea el mismo de la fuente de alimentación del circuito. El resultado de la conversión también lo podemos ver en binario anteponiendo la directiva “Bin”." PAUSE 100 GoTo Inicio End " En este ejemplo. para que todos los canales estén activos y disponibles para una posible solicitud de conversión." ".DEFINE ADC_BITS 8 DEFINE ADC_SAMPLEUS 50 A VAR Byte ADCON1 = %00000000 LCDOut $fe.$C0. 216 . anteponiendo la directiva “Hex”. suficiente para una conversión A/D de 8 Bits.11). podemos hacer unos cambios en la configuración del conversor. Recordemos que la variable “A”. Si deseamos obtener una mayor resolución en la conversión A/D.Dec A. o en hexadecimal. debido a que se antepone a la variable “A” la directiva “Dec”. A ' Define la conversión A/D a 8 Bits ' Tiempo de muestreo en el conversor A/D es 50 uS ' Declaración de una variable tipo Byte (8 bits) ' Configura el registro ADCON1 ' Limpia la LCD ' Inicia la conversión. sin necesidad de modificar el circuito de la figura 11. Además es importante observar que hemos seleccionado una configuración en el registro ADCON1.11. 2 LCDOUT "C-AD a 8 Bit: " LCDOUT $fe. definida al inicio del programa. Otro detalle importante es que el resultado de la conversión A/D se muestra en la pantalla LCD en decimal. almacena el resultado en "A" ' ' ' ' Posiciona el cursor en el inicio Muestra mensaje en la línea 1 Muestra dato en la línea 2 Pausa de 100 milisegundos ' Salta a inicio LCDOut $fe. es del tipo Byte (8 Bits). 1 Inicio: ADCIN 0.

se requerirá disponer de más bits. debe ser del tipo Word (16 Bits). 3. 2. Analice el siguiente programa en el cual se pueden observar los cambios antes mencionados: DEFINE OSC 10 DEFINE LCD_DREG DEFINE LCD_BITS DEFINE LCD_DBIT DEFINE DEFINE DEFINE DEFINE DEFINE LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT LCD_LINES PORTD 4 4 PORTB 1 PORTB 0 2 ' Define Oscilador a 10 Mhz ' ' ' ' ' ' ' ' ' Indica que el Bus estará conectado en el Puerto D El bus será de cuatro bits. configurando el bit 7 del registro ADCON1.Esto significa que podemos configurar el conversor A/D a 10 Bits. ADFM = 1. almacena el resultado en "A" 217 . Selección 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 número de líneas de la pantalla Define ADC_BITS 10 DEFINE ADC_SAMPLEUS 50 A VAR Word ADCON1 = %10000000 LCDOut $fe. 4. Debemos definir ADC_BITS = 10. El mensaje mostrado en la primera línea de la pantalla LCD deberá ser: “C-AD a 10 Bit:”. 1 Inicio: ADCIN 0. A ' Define la conversión A/D a 10 Bits ' Tiempo de muestreo en el conversor A/D es 50 uS ' Declaración de una variable tipo word (16 bits) ' Configura el registro ADCON1 ' Limpia la LCD ' Inicia la conversión. debido a que el resultado para una conversión de 10 bits varía entre 0 y 1023. Debemos recordar justificar el resultado de la conversión A/D a la derecha. La variable en la cual será almacenado el resultado. es decir. lo cual nos lleva a considerar los siguientes cambios: 1. ya que una vez que se desborde el registro ADRESL.

LCDOut $fe.Dec A. 218 . Mueva el potenciómetro hasta obtener un resultado cercano a 512 en la pantalla LCD. 5 voltios. el cual deberá ser aproximadamente 2." PAUSE 100 GoTo Inicio End " ' ' ' ' Posiciona el cursor en el inicio Muestra mensaje en la línea 1 Muestra dato en la línea 2 Pausa de 100 milisegundos ' Salta a inicio Al modificar el valor del potenciómetro conectado al canal AN0. y mida con un multímetro el voltaje aplicado en el canal AN0. podemos observar cómo varía el resultado de la conversión en la pantalla LCD entre 0 y 1023. es decir. ya que el voltaje de referencia según la configuración elegida en el registro de control ADCON1 es el mismo voltaje que alimenta al circuito.5 voltios." ". 2 LCDOUT "C-AD a 10 Bit: " LCDOUT $fe.$C0.

Comunicación Serial Transmisión y Recepción de Datos Capitulo XII 12.. A continuación estudiaremos las instrucciones SerIn y SerOut con las cuales haremos posible la comunicación serial asíncrona entre diversos dispositivos. Este protocolo define además estándares como la velocidad de transmisión en baudios (300. Estas y otras características han sido detalladas a lo largo del capítulo a través de algunas recomendaciones y ejemplos.2. el cual es una norma o estándar mundial que define los parámetros en la comunicación serial.Comunicación Serial. 38400. 9600. es importante tomar en cuenta que los niveles de voltaje entre ambos dispositivos deben ser acoplados. 1200. niveles de voltaje. ya que en un puerto serial de un PC. 56000. 19200. SerIn trabaja por defecto con un oscilador de 4 Mhz. 12. 115200 y 128000 bps). se rigen bajo el protocolo de comunicación RS-232. 4800. En este capítulo nos dedicaremos a estudiar la comunicación serial asíncrona. sin revisión de paridad y 1 bit de parada (stop). usando el formato asíncrono estándar 8N1 que significa 8 bits de datos. distancia entre dispositivos. 14400..1. Estas dos instrucciones son capaces de emular una comunicación RS-232 en cualquier microcontrolador que no posea en su hardware USART (Universal Synchronous / Asynchronous Receiver / Transmitter). Las instrucciones en PicBasic para la comunicación serial. la cual resulta muy útil cuando necesitamos transmitir o recibir datos entre circuitos gobernados por microcontroladores PIC. entre otros. o inclusive cuando deseamos establecer una comunicación entre nuestros circuitos y nuestro PC. 2400. los niveles de voltaje están comprendidos entre +12V y -12V. y en un microcontrolador los niveles de voltaje están comprendidos entre 0V y 5V. y para 219 . 57600. Cuando se trata de comunicación serial entre un microcontrolador y un PC.Instrucción SerIn: La instrucción SerIn se encarga de recibir uno o mas valores a través de un pin específico.

tener una transferencia de datos segura con otros osciladores de mayor valor, será necesario utilizar la directiva “Define Osc” al inicio del programa. Ejemplo: Sintaxis: Define Osc 20 (para un oscilador de 20 Mhz).

SERIN pin, modo,{tiempo, etiqueta}, variable

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 transmisión en baudios.
Valor Numérico 0 1 2 3 4 5 6 7 Modo T2400 T1200 T9600 T300 N2400 N1200 N9600 N300
Tabla 12.1.

Tasa de Bps 2400 1200 9600 300 2400 1200 9600 300

Ejemplo: Serin PortC.1, 0, variable Serin PortA.1, 1, variable Serin PortE.0, 2, variable Serin PortC.4, 3, variable Velocidad de transmisión: 2400 bps Velocidad de transmisión: 1200 bps Velocidad de transmisión: 9600 bps Velocidad de transmisión: 300 bps

El campo “Modo” también puede ser definido como se muestra en la columna 2 de la tabla 12.1, incluyendo la librería MODEDEFS.BAS en el inicio del programa (Include "modedefs.bas"), o utilizando directamente la instrucción “SYMBOL” como se muestra a continuación:

220

Symbol Symbol Symbol Symbol Symbol Symbol Symbol Symbol

T2400 T1200 T9600 T300 N2400 N1200 N9600 N300

= = = = = = = =

0 1 2 3 4 5 6 7

' ' ' ' ' ' ' '

Dato Dato Dato Dato Dato Dato Dato Dato

verdadero verdadero verdadero verdadero invertido invertido invertido invertido

(Driven (Driven (Driven (Driven (Driven (Driven (Driven (Driven

True) True) True) True) inverted) inverted) inverted) 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”, también 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 continúa 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 serán visualizados en una pantalla LCD. Para enviar datos desde el PC hacia el microcontrolador, explicaremos como realizar un pequeño proyecto en Visual Basic, en el cual haremos un teclado matricial 3x4, que enviará un dato por cada tecla presionada a través del puerto serial COM1. Para ello será necesario construir el circuito de la figura 12.1. Es importante tomar en cuenta en la construcción 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) del MAX232 se debe conectar un condensador de 1 uF como se muestra en la figura 12.2, ya que la ausencia de este componente también afectará el funcionamiento del circuito produciendo errores en la recepción de datos.

Figura 12.1.

222

Proyecto # 32 Componente PIC16F877A Cristal de 4 Mhz Capacitor cerámico de 22 pF Pantalla LCD 16x2 Resistencia de 220 Ohm Capacitor Electrolítico de uF Conector DB-9M IC MAX232 Fuente regulada de 5 Vdc Cantidad 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 dato var Byte pause 500 LCDOut $fe, 1 inicio:

= 2

' Dato verdadero (Driven True) ' Define la variable “dato” como Byte

' Pausa de 500 milisegundos para la LCD ' Limpia la LCD

SerIn PORTC.7, T9600, dato LCDOUT $fe, 2,"Dato: " LCDOut $fe,$C0,#dato," GoTo inicio End

' espera datos durante 1 ms

"

' Salta a inicio

Como velocidad de transmisión, hemos elegido utilizar 9600 bps, por lo cual debemos definir este valor en nuestro programa. Las señales con las que actúa el puerto del PC son digitales y la tensión con la cual trabaja es +12V y -12V; adicionalmente resulta importante saber que la lógica es invertida, es decir:
+12 V -12 V Lógica = “0” Lógica = “1”

De ahí la importancia de saber cual será el formato que debemos utilizar a la hora de definir los parámetros para la comunicación (dato verdadero, o dato invertido). En este caso y como se puede observar en la segunda línea 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 opción “EXE estándar” (figura 12.3).

Figura 12.3.

Figura 12.4.

225

Figura 12.5.

Una vez creado un nuevo proyecto, será importante activar el componente para manejar la comunicación serial “Microsoft Comm Control 6.0”. Esto se realiza haciendo clic en el menú Proyectos Componentes Controles.

Figura 12.6.

226

n. Figura 12. 227 .Al hacer clic en el botón “Aceptar” veremos que en la barra de herramientas aparece un nuevo icono representado por un teléfono.8.8. y configure los siguientes parámetros en la ventana de propiedades: CommPort: 1 (ver figura 12.9) Settings: 9600.10) Figura 12. Inserte en el formulario el icono “MsComm” como se muestra en la figura 12.7.1 (ver figura 12.8.

228 . las cuales se encargarán de abrir el puerto serial del PC (Figura 12.Figura 12.9.11.10. Figura 12.11). Seguidamente haga doble clic sobre el formulario para visualizar la ventana de código en la cual introduciremos las siguientes líneas de programa. Figura 12.

12. 229 . busque la celda “Caption” en la ventana de propiedades del mismo (ver figura 12.13): Figura 12.13. Para cambiar el nombre del botón.Utilice el icono “CommandButton” en la barra de herramientas para agregar botones en el formulario: Figura 12.

14: Figura 12. El siguiente paso es designar a cada botón la instrucción que se encargará de enviar un dato específico a través del puerto serial del PC.Este procedimiento se repite hasta lograr obtener un formulario con 12 botones debidamente identificados como se observa en la figura 12. Haga doble clic en el primer botón del formulario y agregue la siguiente línea de comando (ver figura 12. 230 .15): MSComm1.14.15.Output = Chr$(1) Figura 12.

Output = Chr$(12) Por último.Output = Chr$(6) #7: MSComm1. estará enviando al microcontrolador el dato correspondiente el cual podrá ser observado en la pantalla LCD de su circuito. 231 .Output = Chr$(4) #5: MSComm1.Output = Chr$(11) #12: MSComm1. haga clic en el botón “Iniciar” (ver figura 12.Output = Chr$(5) #6: MSComm1. Al hacer clic en cualquiera de los botones del teclado.Output = Chr$(7) #8: MSComm1.Output = Chr$(3) #4: MSComm1.Output = Chr$(2) #3: MSComm1.Se repite el paso anterior para el resto de los botones: Botón Botón Botón Botón Botón Botón Botón Botón Botón Botón Botón #2: MSComm1.Output = Chr$(9) #10: MSComm1. para hacer funcionar el teclado 3x4 desde el cual se enviarán datos hacia el microcontrolador.Output = Chr$(10) #11: MSComm1.Output = Chr$(8) #9: MSComm1.16).

exe” Generar 232 .Figura 12.16. Por último. generamos el archivo ejecutable desde el menú Archivo “Nombre del archivo.

sin revisión de paridad y 1 bit de parada (stop). T9600.1). Veamos el siguiente programa en PBP: Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz.5 Modo: define la velocidad de transmisión en baudios y emplea la misma tabla de la instrucción Serin (Tabla 12.17. Variable: En este campo se especifica la variable que contiene los datos que serán enviados a través de pin especificado. que significa 8 bits de datos. [variable] Pin: en este campo definiremos cual será el pin de salida entre los puertos disponibles del microcontrolador.Proyecto #33: Comenzaremos por realizar el circuito de la figura 12. Ejemplo: SerOut PORTC.Instrucción SerOut: La instrucción SerOut en PicBasic se encarga de enviar uno o mas valores a través de un pin específico.6. Sintaxis: SEROUT pin.5..12. [variable] 12..4. [#I] pause 1000 Next I ' Pausa de 1 segundo 233 . modo. T9600.6. y a través del HyperTerminal de Windows veremos como son transmitidos los datos desde el microcontrolador hasta el PC. Symbol T9600 I VAR Byte inicio: For I = 0 To 9 = 2 ' Dato verdadero (Driven True) ' Define la variable “I” como Byte ' Repetición de 0 a 9 ' Envía los datos a través del pin RC6 SerOut PORTC. Ejemplo: PortB. el cual será conectado al PC a través del puerto serial COM1. usando el formato asíncrono estándar 8N1.

dato que sale en formato serial asíncrono a través del Pin RC6 a 9600 bps.17. 234 .GoTo inicio End ' Salta a inicio Podemos ver en el programa anterior como es enviado el contenido de la variable “I”. Figura 12. la cual incrementa su valor de cero a nueve.

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

18 es el siguiente: Define Osc 4 ' Define el Oscilador para un Cristal ' de 4 Mhz. que los parámetros de comunicación cambian. haga clic en el menú Inicio Todos los Programas Accesorios Comunicaciones HyperTerminal. debido a que los datos ya no pasarán a través del inversor integrado en el MAX232. Symbol N9600 dato var Byte I var Byte Inicio: For I = 0 To 9 = 6 ' Dato invertido (Driven inverted) ' Define la variable “dato” como Byte ' Define la variable “I” como Byte ' Repetición de 0 a 9 ' envía los datos a través del pin RC6 SerOut PORTC. Escriba un nombre para la conexión y haga clic en “Aceptar”. 236 .Deberá tomar en cuenta entonces. N9600. [#I] Pause 1000 Next I GoTo Inicio End ' Pausa de 1 segundo ' Salta a inicio Para abrir el HyperTerminal de Windows.6. Esto significa que el programa a utilizar para el circuito de la figura 12.

Normalmente el puerto disponible para la comunicación serial es el COM1.20). Seleccione el puerto disponible en su PC para realizar la prueba de transmisión y luego haga clic en el botón “Configurar” (figura 12. 237 .Figura 12.19.

21.Figura 12.20. los cuales deben coincidir con los parámetros seleccionados para la instrucción SerOut. Figura 12. 238 . En la figura 12.21 se observan los campos en los cuales se pueden establecer los parámetros para la comunicación serial.

al aceptar todos estos cambios en la ventana de configuración del HyperTerminal de Windows. el microcontrolador empezará a enviar los datos desde cero hasta nueve.22).También es conveniente tomar en cuenta en la configuración de la conexión. en la cual se recibirán los datos enviados desde el microcontrolador. Figura 12. el tipo de emulación (figura 12. 239 . Una vez conectada la alimentación del circuito. con intervalos de tiempo de un segundo. podremos ver la siguiente ventana (figura 12.23). Finalmente.22.

realizaremos a continuación un circuito capaz de medir un voltaje variable aplicado a una de las entradas del conversor A/D de un PIC16F877A.6. será importante considerar los siguientes puntos: • La conversión A/D será a 10 Bits. en una hoja de cálculo (Excel). para posteriormente graficar el conjunto de datos de una muestra de diez lecturas acumuladas.Figura 12. el cual a su vez deberá enviar el resultado de la conversión en decimal a una pantalla LCD.23. a través del puerto serial donde los datos serán recibidos y “convertidos”. 240 . Antes de iniciar con la programación. 12.. por lo cual debemos tener presente realizar esta definición.Proyecto #34: En base a los conocimientos adquiridos hasta ahora. es decir. y enviar este mismo resultado a un PC. Define ADC_BITS 10.

por lo cual será necesario definir los pines de la misma al inicio del programa.24. Figura 12. 241 .• La pantalla LCD estará conectada en el puerto “D”.

Proyecto # 34 Componente PIC16F877A Cristal de 4 Mhz Capacitor cerámico de 33 pF Pantalla LCD 16x2 Resistencia de 220 Ohm Capacitor Electrolítico de uF Conector DB-9M IC MAX232 Potenciómetro de 5K Ohm Fuente regulada de 5 Vdc Cantidad 1 1 2 1 1 5 1 1 1 1 Tabla 12. Programa en Pic Basic Pro: '**************************************** '* Nombre : Proyecto34.4.pbp * '* Autor : Nombre del Autor * '* Copyright : Copyright (Año) * '* Fecha : Fecha * '* Versión : 1. Selección 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 número de líneas de la pantalla Symbol T9600 ' Dato verdadero (Driven True) Define ADC_BITS 10 DEFINE ADC_SAMPLEUS 50 A VAR Word ' Define la conversión A/D a 10 Bits ' Tiempo de muestreo en el conversor A/D es 50 uS ' Declaración de una variable tipo word (16 bits) 242 .0 * '**************************************** DEFINE OSC 4 DEFINE LCD_DREG DEFINE LCD_BITS DEFINE LCD_DBIT DEFINE DEFINE DEFINE DEFINE DEFINE LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT LCD_LINES PORTD 4 4 PORTD 2 PORTD 3 2 = 2 ' Define Oscilador a 4 Mhz ' ' ' ' ' ' ' ' ' Indica que el Bus estará conectado en el Puerto D El bus será de cuatro bits.

243 . El siguiente paso en el programa consiste en enviar el dato obtenido al PC a través del puerto serial. para luego hacer una pequeña pausa de 500 milisegundos y empezar nuevamente el proceso para una nueva lectura. una vez obtenido el resultado de la conversión A/D en la pantalla LCD. almacena el resultado en "A" ' Posiciona el cursor en el inicio ' Muestra mensaje en la línea 1 ' Muestra dato en la línea 2 ' envía los datos al PC ' Pausa de 500 milisegundos ' Salta a inicio LCDOut $fe. será verificar la transferencia de datos hacia el PC con la ayuda del HyperTerminal de Windows."Dato: ". así como también la configuración básica establecida para el conversor A/D.ADCON1 = %10000000 LCDOut $fe. Un paso importante en este punto.Dec A. Una vez iniciada la conversión. la cual hemos declarado como una variable de 16 bits (word)." SerOut PORTC. debido a que el resultado de la conversión requiere mas de ocho bits de datos.$C0. se puede observar que el resultado de la misma es almacenada en la variable “A”. el cual hará la conversión a 10 bits con el fin de obtener una mayor resolución en el proceso de medición del voltaje aplicado al pin RA0. 1 inicio: ADCIN 0. [#A] pause 500 GoTo inicio End " En el programa se puede observar cómo hemos definido el conexionado de la pantalla LCD. 2 LCDOUT "C-AD a 10 Bit: " LCDOUT $fe. T9600.6. Este resultado puede ser mostrado fácilmente en la pantalla LCD en decimal anteponiendo la directiva “Dec” a la variable en la cual hemos almacenado el dato resultado de la conversión. A ' Configura el registro ADCON1 ' Limpia la LCD ' Inicia la conversión.

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

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

28).29. Después de verificar la correcta recepción de datos desde el HyperTerminal.28. en la cual podamos realizar los cálculos para expresar estos valores en sus equivalentes en voltios para luego tomar una muestra significativa y graficarlos como se observa en la figura 12. 246 . se debe asegurar de cerrar esta ventana (Figura 12.28) para garantizar la disponibilidad del puerto serial. La idea principal de esta práctica. Figura 12. será llevar estos datos a una hoja de Excel.anteriormente en el programa que hemos cargado en el microcontrolador PIC (figura 12.

será ubicar las herramientas de Visual Basic y agregar a la hoja de cálculo el control “Microsoft communications control.Figura 12. Para esto debemos seguir los siguientes pasos: 247 .29. El primer paso para configurar la hoja de Excel. Version 6.0”.

1.- Al abrir la hoja de cálculo, podemos ver un menú de opciones en la parte superior de la ventana denominado “Herramientas”. Haga clic en el menú “Herramientas” y seleccione la opción “Personalizar”.

Figura 12.30.

Al seleccionar esta opción podrá observar que en la ventana “Personalizar” hay tres fichas de configuración. 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 botón “Cerrar” y verá que aparece en la hoja de cálculo una caja de herramientas nueva llamada “Visual Basic” (Figura 12.32), la cual podemos trasladar a la parte superior de la hoja de cálculo, la cual contiene el resto de las herramientas típicas usadas en Excel (Figura 12.33).

249

Figura 12.32.

250

Figura 12.33.

Haga clic en el botón “Cuadro de controles” (figura 12.33), y desplace la caja de herramientas nuevamente a la parte superior de la hoja de cálculo 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 cálculo. Para esto, debe mantener el botón izquierdo del mouse activado y arrastrar el

252

puntero hasta que aparezca un pequeño recuadro. Al soltar el botón izquierdo el control aparece sobre la hoja. La figura de un Teléfono sobre un “MODEM” lo identifica claramente, como se muestra en la figura 12.35.

Figura 12.35.

El siguiente paso será agregar un botón en el cual se configura el código necesario para la apertura del puerto serial en el PC (Figura 12.36).
253

Figura 12.36.

Al hacer doble clic sobre el nuevo botón, estamos entrando al editor de Visual Basic, en el cual podemos agregar las siguientes líneas de programa, las cuales permitirán abrir el puerto al hacer clic sobre el botón que hemos agregado para tal fin:

Private Sub CommandButton1_Click() 'abre el puerto de comunicación If Hoja1.MSComm1.PortOpen = False Then Hoja1.MSComm1.PortOpen = True End If End Sub

Observe la figura 12.37, en la cual se puede ver el campo “Caption”, correspondiente a la etiqueta del botón 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 también podemos apreciar las líneas de programación agregadas al botón de comando, y el icono que nos permitirá regresar a la hoja de cálculo para continuar con la programación. Al regresar a la hoja de cálculo podremos notar el cambio en la etiqueta del botón de comando, como se muestra en la figura 12.38:

255

Figura 12.38.

Ahora solo nos queda configurar el evento OnComm, relativo a la recepción de datos, haciendo doble clic sobre el control de comunicaciones (figura 12.39):

Figura 12.39.

256

Veremos a continuación 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 declaración de la misma antes de ejecutar cualquier otra línea de programa que así la requiera. Es por esto que para este ejemplo, el primer
257

paso en la configuración del control de comunicaciones ha sido la declaración de dos variables, las cuales hemos denominado “Apuntador” y “datainput”. La variable “Apuntador” será declarada como “Byte” y la variable “datainput” será declarada como “String”. Analice el uso de la variable “Apuntador” en el código del evento OnComm, el cual detallamos unas líneas más adelante. Esta variable se usa básicamente como acumulador y determina la posición en un rango predeterminado de las filas en la hoja de cálculo. Esto se debe a que estamos interesados en mantener una muestra de los diez últimos valores capturados en el puerto para poder realizar una gráfica de líneas suavizadas, la cual se estará actualizando cada 500 milisegundos. Para almacenar un dato presente en el puerto serial (Comm1), utilizamos el comando “MSComm1.Input”, entonces, para almacenar un dato en la variable “datainput”, debemos realizar el siguiente arreglo: datainput = MSComm1.Input Luego para llevar el dato almacenado en la variable a una celda en la hoja de cálculo, podemos utilizar el siguiente comando: Hoja1.Cells(Fila, Columna) Un punto importante a considerar es que la variable “datainput” por estar declarada como “String”, almacenará una serie de datos consecutivos uno tras otro. Podemos extraer un dato de la cadena de caracteres almacenada en la variable “datainput” de la siguiente manera:
Hoja1.Cells(Fila, Columna) = Mid(Variable, Bit de inicio, longitud)

Ejemplo: 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 próximo 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 estos valores y graficarlos en la hoja de cálculo. Veamos a continuación el código 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

Figura 12. lo siguiente será volver a la hoja de cálculo y salir del modo de diseño. haciendo clic en el icono señalado en la siguiente figura: 260 .41. Completados todos estos pasos. analice la extracción de datos de la cadena de caracteres almacenada en la variable “datainput”. Por último. 1). Analice cuidadosamente el contenido del código en el evento OnComm.1) y (30. Verifique la rutina encargada de apilar los datos entre las celdas (40.

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

• • • • • • • =(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 .

46). seleccionamos las diez celdas (desde la celda C30 hasta la celda C40) y hacemos clic en el icono “Asistente para Gráficos” (Figura 12. Observe en la figura 12.45).44. Seleccione la ficha “Tipos personalizados” y haga clic en la opción “Líneas suavizadas” de la lista (Figura 12. Para graficar esta serie de datos. donde aparecerá una ventana en la cual podremos elegir el tipo de gráfico que deseamos utilizar.Figura 12. Observe también que hemos ocultado una serie de filas de la hoja de cálculo. 263 .44. la formula para la celda C40. las cuales hemos reservado para agregar un gráfico de líneas suavizadas.

Figura 12. Figura 12.46.45. 264 .

agregar líneas de división. y algunos otros detalles útiles para mejorar la apariencia del gráfico. en cual es posible editar el recuadro que contiene la leyenda.47. 265 .En la siguiente ventana podemos ver el rango de datos que será graficado (Figura 12.48). identificar los ejes. (figura 12.47): Figura 12. En la siguiente ventana encontraremos una serie de fichas con una gran variedad de opciones que nos permitirán añadir detalles como el título del gráfico. Si se desea personalizar aún mas el gráfico. se puede hacer en la ficha “Serie”.

podemos seleccionar si el gráfico será colocado en una hoja nueva.50.48.Figura 12. 266 . Seguidamente. los cuales a su vez serán graficados constantemente. o en la hoja de cálculo en la cual hemos estado trabajando (figura 12. Finalmente podremos ver en la hoja de Excel los datos enviados desde el microcontrolador.49): Figura 12. como se puede observar en la figura 12.49.

267 .Figura 12.50.

0 Voltios. Esta señal se introduce a través de un cable de control que se distingue entre los tres cables que posee y que según la marca del servomotor puede ser de color blanco o amarillo. Voltaje de operación: 4. y aunque se pueden encontrar en diferentes tamaños.¿Qué es un Servomotor? Un servomotor es un dispositivo electromecánico capaz de rotar su eje a una posición específica a lo largo de su recorrido.1. es importante resaltar que la fuerza de un servo en su eje no es directamente proporcional al tamaño del mismo. a un circuito de control que posee dentro de su caja o chasis. inyectando un tren de pulsos controlados..Servomotores Capitulo XIII 13. Veamos a continuación algunas características técnicas importantes en un servomotor estándar: Control: Control por ancho de pulso. de la mecánica y material que componen sus engranajes. es decir.8 a 6. Un servomotor estándar tiene dimensiones muy apropiadas para realizar proyectos de robótica. Pulso: 3-5 Voltios Pico a Pico. Esto significa que su fuerza depende en gran sentido de su diseño interior. Los cables de alimentación se distinguen por sus colores rojo (Positivo) y negro (Negativo). 268 .

Velocidad (4.8V): 3. Velocidad (6.60 oz/in) Rango de Temperatura Operacional: -20 a +60 ºC.8V): 7. Para controlar la posición del eje de un servomotor.8V): 0. siempre y cuando esté presente el tren de pulsos. hace falta enviar un tren de pulsos.5 kg/cm (48.1.7mA activo y 180mA al aplicar fuerza. Corriente (6.0 kg/cm (42 oz/in) Torque (6. donde el ancho de cada pulso determina el punto en el cual el eje mantiene su posición. 90º y 269 .4mA activo y 160mA al aplicar fuerza.Torque (4.19sec/60 grados.0V): 4. Figura 13. Corriente (4. El recorrido será en la mayoría de los modelos de 180º y los tiempos correspondientes al pulso en la señal para las posiciones principales (0º.0V): 0.15sec/60 grados.0V): 7.

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

5.4. Cuando T1 = 1. tendría entonces valores para T1 = 2.5 ms podremos ver que el eje forma un ángulo de 90º con respecto al punto de inicio (0º). En la figura 13.6 ms y T2 = 20 ms. (figura 13. 271 . el eje del servomotor se irá moviendo en sentido horario. Figura 13. La señal correspondiente a la posición máxima (180º) en un servomotor estándar. Figura 13.4 se puede observar la señal correspondiente a esta posición (90º). donde T2 se mantiene en 20 milisegundos.5).A medida que aumentamos gradualmente el tiempo T1.

13.Proyecto #35: Se puede crear un programa en PicBasic que cumpla con estas características.2. podemos modificar el ángulo de giro de un servomotor.. en el cual variando solo una variable. Veamos el siguiente ejemplo: Figura 13. Proyecto # 35 Componente PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 22 pF Servomotor Fuente regulada de 5 Vdc Cantidad 1 1 2 1 1 Tabla 13.2.6. 272 .

273 . Esta instrucción no pone al microcontrolador en modo de bajo consumo de energía.0 PauseUs PULSO Low PORTB. podremos ver en un osciloscopio el tren de pulsos presente en el pin RB0 como se muestra en la figura 13. grabar y ejecutar el programa anterior en el microcontrolador.0 Pause 20 GoTo Inicio End ' ' ' ' RB0 = Pausa RB0 = Pausa 1 en microsegundos 0 de 20 milisegundos ' Define el oscilador en 4 Mhz ' Define la variable "Pulso" (16 Bits) ' Inicializamos la variable "Pulso" ' Salto a inicio Al compilar. Programa en Pic Basic Pro: DEFINE OSC 4 PULSO VAR Word PULSO = 1550 Inicio: High PORTB.7.PAUSEUS Sintaxis: PAUSEUS periodo La instrucción Pause realiza un pausa en el programa por un periodo definido en microsegundos.

cuyo valor es de 1550. T2: 20 ms Vpp: 5. podremos observar que la instrucción “PauseUs” realiza una parada durante un tiempo definido por la variable “Pulso”. su eje rotará hasta una posición en el punto medio de su recorrido total. 274 . Si analizamos el programa.0 us Al aplicar el tren de pulsos al servomotor. o lo que es igual.Figura 13.44 Voltios. 1. Seguidamente hacemos una pausa de 20 milisegundos antes de enviar nuevamente el pulso al Pin RB0. es decir.0 us Tiempo de bajada: 160.55 milisegundos.16% Tiempo de subida: 160.7. se está generando una pausa de 1550 microsegundos.55 ms (Ancho de pulso positivo). Volt/Div: 2V Time/Div: 5ms Período: 21.55 ms T1: 1. Ciclo de trabajo: 8.

Entonces.65 Low PORTB.6 ms). sería haciendo uso de la instrucción “PulsOut”.7. siempre y cuando el valor esté dentro del rango de tiempo permitido (0.0 Pause 20 GoTo Inicio End ' Define el oscilador en 4 Mhz ' ' ' ' ' Genera pulsos de 650 microsegundos de duración.65 ms ≤ T1 ≤ 2. Salto a inicio. 275 . 650 ≤ PauseUs ≤ 2600. si deseáramos modificar el ángulo de giro.0. es decir. como se muestra a continuación: DEFINE OSC 4 Inicio: PulsOut PORTB. Una forma aún más práctica para generar el tren de pulsos de la figura 13. podemos cambiar el valor de la variable “Pulso”. RB0 = 0 Pausa de 20 milisegundos.

8.Proyecto #36: Para hacer un poco más interesante la práctica. 276 . en la cual el objetivo ha sido controlar el ángulo de giro de un servomotor. Figura 13. 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)..13.3.

la pausa anterior será de 15 ms para lograr un tiempo entre cada pulso de 20 ms. If PORTB. La condición se cumple sólo si el pulsador ' está activado y la variable "Pulso" es menor a 2600.2 = 1 And PULSO > 650 Then Call RESTA ' Si RB2 = 1 significa que se ha activado el pulsador 277 . If PORTB.0 PauseUs PULSO Low PORTB.3.0 Pause 15 ' ' ' ' ' RB0 = 1 ' Pausa en microsegundos ' RB0 = 0 ' Pausa de 15 milisegundos ' Define el oscilador en 4 Mhz ' Configuración del puerto B ' Define la variable "Pulso" (16 Bits) ' Inicializamos la variable "Pulso" ' Pausa de 200 milisegundos para la LCD ' Limpia la LCD Considerando que las siguientes instrucciones consumen 1 ms cada una y la instrucción de salto consume 2 ms.Proyecto # 36 Componente PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 22 pF Pantalla LCD 16x2 Resistencia de 10K Ohm Potenciómetro de 5K Ohm Servomotor Pulsador Normalmente Abierto Fuente regulada de 5 Vdc Cantidad 1 1 2 1 3 1 1 2 1 Tabla 13. Programa en PBP: DEFINE OSC 4 TRISB = %11110110 PULSO VAR Word PULSO = 1550 Pause 200 LCDOut $fe. 1 Inicio: High PORTB.1 = 1 And PULSO < 2600 Then Call SUMA ' Si RB1 = 1 significa que se ha activado el pulsador ' conectado a él.

LCDOUT $fe. La condición se cumple sólo si el pulsador ' está activado y la variable "Pulso" es mayor a 650.0.#PULSO.100 Pause 40 Return ' Resta 100 a la variable "Pulso" ' Pausa de 40 milisegundos ' Retorno ' Suma 100 a la variable "Pulso" ' Pausa de 40 milisegundos ' Retorno ' Salto a inicio ' Si se aumenta o disminuye la pausa en las subrutinas ' suma y resta.0 Pause 15 ' ' ' ' ' Genera un pulso en RB0 ' RB0 = 0 ' Pausa de 15 milisegundos ' Define el oscilador en 4 Mhz ' Configuración del puerto B ' Define la variable "Pulso" (16 Bits) ' Inicializamos la variable "Pulso" ' Pausa de 200 milisegundos para la LCD ' Limpia la LCD Considerando que las siguientes instrucciones consumen 1 ms cada una y la instrucción de salto consume 2 ms. End Si empleamos la instrucción “PulsOut”: DEFINE OSC 4 TRISB = %11110110 PULSO VAR Word PULSO = 155 Pause 200 LCDOut $fe." uS " ' Muestra el dato cargado en la variable "Pulso" GoTo Inicio SUMA: PULSO = PULSO + 100 Pause 40 Return RESTA: PULSO = PULSO .1 = 1 And PULSO < 260 Then Call SUMA ' Si RB1 = 1 significa que se ha activado el pulsador ' conectado a él."PULSO: ". la pausa anterior será de 15 ms para lograr un tiempo entre cada pulso de 20 ms. If PORTB. 1 Inicio: PulsOut PORTB. se logra un efecto de aumento o disminución ' de la velocidad variación del ángulo. PULSO Low PORTB.' conectado a él. La condición se cumple sólo si el pulsador 278 . 2.

If PORTB.#PULSO.2 = 1 And PULSO > 65 Then Call RESTA ' Si RB2 = 1 significa que se ha activado el pulsador ' conectado a él. LCDOUT $fe.10 Pause 40 Return ' Suma 10 a la variable "Pulso" ' Pausa de 40 milisegundos ' Retorno ' Resta 10 a la variable "Pulso" ' Pausa de 40 milisegundos ' Retorno ' Si se aumenta o disminuye la pausa en las subrutinas ' suma y resta. se logra un efecto de aumento o disminución ' de la velocidad variación del ángulo."0 uS " ' Muestra el dato cargado en la variable "Pulso" GoTo Inicio ' Salto a inicio SUMA: PULSO = PULSO + 10 Pause 40 Return RESTA: PULSO = PULSO .' está activado y la variable "Pulso" es menor a 260. La condición se cumple sólo si el pulsador ' está activado y la variable "Pulso" es mayor a 65. 2."PULSO: ". End 279 .

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

"0 uS " ' Muestra dato. PULSO ' Genera pulso en RB1 GoTo Inicio ' Salto a inicio End 281 . T9600. PULSO Sigue: ' Espera dato ' durante 16 ms LCDOUT $fe.Proyecto # 37 Componente PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 22 pF Pantalla LCD 16x2 Resistencia de 10K Ohm Potenciómetro de 5K Ohm Pulsador Normalmente Abierto Fuente regulada de 5 Vdc Cantidad 2 2 4 1 3 1 2 1 Tabla 13. PulsOut PORTB. 2. 16.1."PULSO: ". 1 Inicio: SerIn PORTB. Sigue.7. Programa para el microcontrolador principal U1: DEFINE OSC 4 Symbol T9600 = 2 ' Define el oscilador en 4 Mhz ' Dato verdadero (Driven True) ' Define la variable "Pulso" (16 Bits) ' Inicializa variable "Pulso" ' Pausa de 200 milisegundos para la LCD ' Limpia la LCD PULSO VAR Word PULSO = 155 pause 200 LCDOut $fe.#PULSO.4.

10 ' Resta 10 a la variable "Pulso" SerOut PORTA.Programa para el microcontrolador secundario U2: DEFINE OSC 4 Symbol T9600 = 2 ' Dato verdadero (Driven True) ' Define la variable "Pulso" (16 Bits) ' Inicializa variable "Pulso" PULSO VAR Word PULSO = 155 inicio: If PORTA. La condición se cumple sólo si el pulsador ' está activado y la variable "Pulso" es menor a 250. GoTo inicio suma: PULSO = PULSO + 10 ' Suma 10 a la variable "Pulso" ' Salto a inicio SerOut PORTA.1 = 1 And PULSO > 60 Then Call resta ' Si RA1 = 1 significa que se ha activado el pulsador ' conectado a él. [PULSO] ' Envía dato serial por RA2 PAUSE 40 ' Pausa de 40 milisegundos Return ' Retorno End 282 .2.2. T9600. T9600. If PORTA. La condición se cumple sólo si el pulsador ' está activado y la variable "Pulso" es mayor a 60.0 = 1 And PULSO < 250 Then Call suma ' Si RA0 = 1 significa que se ha activado el pulsador ' conectado a él. [PULSO] ' Envía dato serial por RA2 PAUSE 40 ' Pausa de 40 milisegundos Return ' Retorno resta: PULSO = PULSO .

10. y el cual definirá el ancho de pulso a ser introducido en el servomotor cada 20 milisegundos.13. emplearemos un circuito integrado MAX-232 (Figura 13. Para la comunicación entre el PC y el circuito. 283 . El circuito consta de un microcontrolador PIC16F84A con oscilador de 4 Mhz y un servomotor.5. desde donde enviaremos el dato a ser cargado en la instrucción “PulsOut” en el código de programa del microcontrolador. donde la línea de control estará conectada al Pin RB1.Proyecto #38: En la siguiente actividad se controlará un servomotor desde el puerto serial de un PC. Figura 13.10)..

PULSO GoTo inicio End ' Espera dato ' durante 18 ms ' Genera pulso en RB1 ' Salto a inicio 284 .7. 18. PULSO sigue: PulsOut PORTB.1.1 uF Potenciómetro de 5K Ohm Conector DB-9M Fuente regulada de 5 Vdc Cantidad 1 1 2 1 5 1 1 1 Tabla 13. T9600.1 = 0 = 2 ' Define el oscilador en 4 Mhz ' Dato verdadero (Driven True) ' Define la variable "Pulso" (16 Bits) ' Inicializa RB1 inicio: SerIn PORTB.Proyecto # 38 Componente PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 22 pF IC MAX232 Capacitor electrolítico de 0. Programa en Pic Basic Pro: DEFINE OSC 4 Symbol T9600 PULSO VAR Word PORTB. sigue.5.

el primer paso será esperar un dato serial durante 18 milisegundos antes de saltar a la etiqueta “sigue”.Para la comunicación serial. Además hemos agregado tres botones con valores fijos para las tres posiciones principales (0º. Veamos a continuación el desarrollo de la interfaz gráfica paso a paso: Figura 13. 285 . desde la cual podremos seleccionar el tiempo de duración de los pulsos enviados al servomotor. La interfaz gráfica para el control del servomotor la hemos realizado en Visual Basic (Figura 13. Seguidamente se genera un salto a la etiqueta “inicio” para repetir el proceso. 90º y 180º). se ha definido el modo de dato verdadero a 9600 bps (T9600).11.11). A partir de la etiqueta “inicio”. para generar el pulso correspondiente y donde su duración se calcula en decenas de microsegundos.

12): Figura 13. 286 .13. Paso 2: Identificamos el formulario en las propiedades del mismo.12. ingresando un nombre que identifique nuestra aplicación: Figura 13.Paso 1: creamos un nuevo proyecto “EXE estándar” (Figura 13.

Paso 3: activamos el componente para manejar la comunicación serial “Microsoft Comm Control 6. 287 . y se configuran los parámetros de conexión en la ventana de propiedades (Figuras 13.0”.16 y 13.15.17): Figura 13.15.Figura 13. Seguidamente se inserta el icono “MsComm” como se muestra en la figura 13. Esto se realiza haciendo clic en el menú Proyectos Componentes Controles.14.

18).17.19): Figura 13. Paso 4: cerramos la ventana de código e incluimos los botones. el campo de texto y la imagen en el formulario (Figura 13. Recuerde identificar cada botón en la ventana de propiedades (Figura 13.19.Figura 13. Figura 13. 288 .18.16. Figura 13.

Paso 5: se asigna un nombre a cada botón en la ventana de propiedades (Figura 13.Figura 13.20.21): 289 .

Figura 13.PortOpen = False Then MSComm1.Output = Chr$(Servo) Text1. y asignaremos una función específica a cada botón (Figura 13.20): ' Declaración de Variable "Servo" ' tipo byte ______________________________________________________________________________ Private Sub Form_Load() ' Rutina para abrir el puerto serial MSComm1.Text = Servo * 10 ' Inicializamos la variable "Servo" ' Envía dato al puerto Comm1 ' Muestra dato * 10 en la caja de texto Dim Servo As Byte End Sub ______________________________________________________________________________ 290 .21. con el cual habilitaremos el puerto serial del PC.PortOpen = True If MSComm1. Paso 6: se hace doble clic sobre el formulario para agregar el siguiente código.PortOpen = True End If Servo = 155 MSComm1.

Output = Chr$(Servo) ' Envía dato al puerto Comm1 End Sub ______________________________________________________________________________ Private Sub Boton3_Click() ' Boton 90º Servo = 250 ' Carga el valor para 180º Text1.Output = Chr$(Servo) End Sub ' Boton "Enviar Dato" ' Envía dato al puerto Comm1 291 .Private Sub Boton1_Click() ' Boton 0º Servo = 70 ' Carga el valor para 0º Text1.5 ' Resta 5 a la variable "Servo" Text1.Output = Chr$(Servo) ' Envía dato al puerto Comm1 End Sub ______________________________________________________________________________ Private Sub Boton2_Click() ' Boton 90º Servo = 155 ' Carga el valor para 90º Text1.Output = Chr$(Servo) ' Envía dato al puerto Comm1 End Sub ______________________________________________________________________________ Private Sub Boton4_Click() ' Boton <-- If Servo > 70 Then ' Restará solo si Servo es > 70 Servo = Servo .Text = Servo * 10 ' Muestra dato * 10 en la caja de texto MSComm1.Text = Servo * 10 ' Muestra dato * 10 en la caja de texto MSComm1.Text = Servo * 10 ' Muestra dato * 10 en la caja de texto MSComm1.Text = Servo * 10 ' Muestra dato * 10 en la caja de texto End If End Sub ______________________________________________________________________________ Private Sub Boton6_Click() MSComm1.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.

exe”. Por lo tanto. Paso 7: generamos el archivo ejecutable desde el menú Archivo “Nombre del archivo.1.Nota Importante: Recuerde que el dato a ser cargado en la instrucción “PulsOut” del programa de control del PIC16F84A. especificando además la unidad de tiempo correspondiente. se mide en decenas de microsegundos para un oscilador de 4 Mhz. 100 Esto significa que el tiempo del pulso generado será de 100 decenas de microsegundos: 10 microsegundos x 100 = 1000 microsegundos ó 1 milisegundo. por ejemplo: PulsOut PORTB. deben ser considerados como la cantidad de decenas de microsegundos que deseamos que dure cada pulso enviado al servomotor. Esta es la razón por la cual hemos multiplicado por diez el dato a ser mostrado en la caja de texto. que en este caso se expresa con la palabra “Microsegundos”. Generar 292 . los datos que enviamos al microcontrolador a través del puerto serial desde la aplicación que hemos creado en Visual Basic.

los cuales ofrecen una gran variedad de modelos en diferentes rangos de frecuencias y donde la característica más resaltante radica en que no requieren componentes externos a excepción de la antena (figura 14. considerando que el voltaje estándar en nuestros circuitos ha sido de 5 Vdc. También se pueden adquirir para trabajar en frecuencias de 315 Mhz o 433 Mhz. para distancias que pueden llegar a exceder los 900 metros en su frecuencia estándar de 418 Mhz.1).linxtechnologies.3 Vdc. A continuación realizaremos algunos proyectos donde la base de éstos serán los módulos inalámbricos RF de la empresa Linx Technologies Inc..com).Módulos RF para comunicaciones Capítulo XIV 14.1.Proyectos con Módulos RF. Figura 14. 293 . por lo cual se debe considerar el uso de una regulador de voltaje para el transmisor y receptor. (http://www. El voltaje de alimentación no debe exceder los 3.1. Su interfaz serial nos permite realizar una comunicación directa o sin modificaciones en el protocolo RS-232. haciendo muy sencillo el trabajo de comunicar dos circuitos que se encuentran a distancias considerablemente largas en sus versiones de módulos LR (Long Range).

y la relación resistencia versus potencia se puede ver en la figura 14.4: 294 .3. El pin 4 (LADJ/VCC) en el transmisor puede ser utilizado para el ajuste en la potencia del transmisor.2. Receptor: RXM-418-LR-S Figura 14. variando el valor de una resistencia o potenciómetro.Transmisor: TXM-418-LR-S Figura 14.

Si se desea utilizar la opción de bajo consumo de energía se requiere de una resistencia Pull-up de 10Kohm a Vcc o de menor valor en el pin PDN.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 energía (menor a 5nA). 295 .Figura 14. Todas estas consideraciones pueden ser ampliadas en la hoja de datos de cada dispositivo suministradas por el fabricante. Cuando PDN = 0. entonces el transmisor o receptor entran en reposo. y los cuales resultan muy interesantes como base para nuevos proyectos. A continuación realizaremos una serie de proyectos en los cuales implementaremos la comunicación serial inalámbrica.

14. figura 14.2.6. Circuito Transmisor: Figura 14. En el transmisor hemos empleado un microcontrolador PIC16F877 debido a que en los siguientes proyectos iremos incorporando más dispositivos externos a demás de la pantalla LCD.5 y figura 14.Proyecto #39: En el siguiente proyecto se requiere la construcción de dos circuitos. El circuito receptor estará controlado por un PIC16F84 al cual le hemos conectado una pantalla LCD para visualizar los datos recibidos.. 296 .5.

6. 297 .Circuito Receptor: Figura 14.

Esto significa que cuando transmitimos el primer dígito al receptor. 1 inicio: = 2 ' Dato verdadero (Driven True) ' Define la variable "I" como Byte ' Pausa de 200 milisegundos para la LCD ' Limpia la LCD 298 . los cuales deben poder ser visualizados en la pantalla LCD del mismo. La primera actividad consiste en enviar una secuencia de dígitos (0 al 9) hacia el receptor.1.Proyecto # 39 Componente PIC16F877A PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 22 pF TXM-418-LR-S con antena RXM-418-LR-S con antena Pantalla LCD 16x2 Potenciómetro de 5K Ohm Resistencia de 390 Ohm Resistencia de 750 Ohm Resistencia de 10K Ohm Fuente regulada de 3. Programa para el circuito transmisor: Symbol T9600 I VAR Byte Pause 200 LCDOut $fe. éste será mostrado en la pantalla LCD del circuito transmisor y receptor y ambos deberán ser iguales para confirmar que la transmisión de datos ha sido exitosa.3 Vdc / 5 Vdc Cantidad 1 1 2 4 1 1 2 2 2 1 1 2 Tabla 14.

" GoTo inicio End ' Salta a inicio Como podemos observar en los diagramas de los circuitos.#I Pause 1000 Next I GoTo inicio End ' Pausa de 1 segundo ' Salta a inicio y reinicia el conteo Programa para el circuito receptor: Symbol T9600 dato var Byte pause 500 LCDOut $fe. sustituyendo al cable. dato ' espera datos durante 1 ms " = 2 ' Dato verdadero (Driven True) ' Define la variable "dato" como Byte ' Pausa de 500 milisegundos para la LCD ' Limpia la LCD LCDOUT $fe. [I] LCDOut $fe.0.For I = 0 To 9 ' Repetición de 0 a 9 ' Envía los datos por RB0 ' Muestra dato por la LCD SerOut PORTB. cuyas limitaciones son de apenas unos pocos metros cuando se requiere de comunicación serial RS-232. 1 inicio: SerIn PORTB. T9600. los módulos TXM418-LR-S y RXM-418-LR-S conforman el medio a través del cual viajan los datos."Dato: ".#dato. 2. 2. T9600. 299 ."Dato: ".7.

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

8. 301 .Circuito Receptor: Figura 14.

"Dato: ".#TECLA 302 . 1 inicio: Call teclado PAUSE 100 ' Llama a rutina de barrido de teclas ' Pausa de 1050 milisegundos ' Envía dato por RB0 ' Muestra dato por la LCD SerOut PORTB.2.3 Vdc / 5 Vdc Cantidad 1 1 2 4 2 1 1 4 2 1 1 2 1 2 Tabla 14. T9600. 2. [TECLA] LCDOUT $fe.0. Programa para el circuito transmisor con teclado matricial: Symbol T9600 = 2 ' Dato verdadero (Driven True) ' Configuración de Puerto D ' Declaración de variable "Tecla" ' Pausa de 500 milisegundos para la LCD ' Limpia la LCD TRISD = %01111000 TECLA VAR Byte pause 500 LCDOut $fe.Proyecto # 40 Componente PIC16F877A PIC16F84A Cristal de 4 Mhz Capacitor cerámico de 22 pF Pantalla LCD 16x2 TXM-418-LR-S con antena RXM-418-LR-S con antena Resistencia de 1K Ohm Resistencia de 390 Ohm Resistencia de 750 Ohm Resistencia de 10K Ohm Potenciómetro de 5K Ohm Teclado Matricial 3x4 Fuente regulada de 3.

6 = = = = 0 0 0 0 ' Salto a inicio ' Columna 1 = 0 ' Columna 2 = 1 ' Columna 3 = 1 Then Then Then Then TECLA TECLA TECLA TECLA = = = = 1 4 7 10 ' ' ' ' tecla tecla tecla tecla "1" "4" "7" "*" PORTD.3 PORTD. Si presionamos la tecla #2.5 If PORTD.2 = 0 If PORTD.0 = 1 PORTD.1 = 0 PORTD.0 = 1 PORTD.2 = 1 If If If If PORTD.3 PORTD. si presionamos la tecla #1. y así sucesivamente hasta la última tecla.4 PORTD.6 Return End = = = = 0 0 0 0 ' Columna 1 = 1 ' Columna 2 = 1 ' Columna 3 = 0 Then Then Then Then TECLA TECLA TECLA TECLA = = = = 3 6 9 12 ' ' ' ' tecla tecla tecla tecla "3" "6" "9" "#" Se puede apreciar en la rutina de barrido del teclado que hemos asignado un valor específico en cada condición.2 = 1 If If If If PORTD.5 PORTD.4 PORTD.3 If PORTD. es decir.5 PORTD. entonces la variable “TECLA” será igual a dos.4 If PORTD.6 = = = = 0 0 0 0 ' Columna 1 = 1 ' Columna 2 = 0 ' Columna 3 = 1 Then Then Then Then TECLA TECLA TECLA TECLA = = = = 2 5 8 11 ' ' ' ' tecla tecla tecla tecla "2" "5" "8" "0" PORTD.GoTo inicio teclado: PORTD.1 = 1 PORTD. el valor asignado a la variable “TECLA” será igual a uno.0 = 0 PORTD. 303 .1 = 1 PORTD.

de tal manera que cuando llega un dato. En este punto la instrucción “SerIn” mantiene al microcontrolador en espera." GoTo inicio End ' Salta a inicio A partir de la etiqueta “inicio” se espera la llegada de los datos enviados desde el circuito transmisor. 1 inicio: SerIn PORTB. que en este caso corresponde a la instrucción LCDout la cual se encargará de mostrar el dato en la pantalla.Cada vez que presionamos una tecla. 304 . e inmediatamente lo muestra en la pantalla LCD. 2. T9600. dato ' Espera de datos " = 2 ' Dato verdadero (Driven True) ' Define la variable "dato" como Byte ' Pausa de 200 milisegundos para la LCD ' Limpia la LCD LCDOUT $fe. Esta acción se puede apreciar en el código de programa que se muestra a continuación. Es importante resaltar que cuando el circuito transmisor es apagado. éste se almacena en la variable correspondiente “dato” y seguidamente salta a la siguiente línea."Dato: ". el módulo receptor (RXM-418-LR-S) pierde sincronía y puede entregar datos errados o aleatorios al microcontrolador. Esto es un problema que puede ser corregido con unas pocas líneas de programación como lo demostraremos en el siguiente proyecto.#dato.7. Programa para el circuito receptor: Symbol T9600 dato VAR Byte Pause 200 LCDOut $fe. el dato correspondiente a la misma es cargado y enviado al receptor el cual a su vez almacena este dato en una variable.

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

10. 306 .Diagrama del circuito receptor: Figura 14.

0.0 = 0 PORTD. T9600.5 PORTD." GoTo inicio ' Salto a inicio teclado: tecla = 0 PORTD.0 = 1 PORTD. T9600. [TECLA] ' Envía dato por RB0 PAUSE 300 ' Pausa de 300 milisegundos LCDOUT $fe.1 = 0 PORTD.0. SerOut PORTB.5 = 0 Then TECLA = 8 ' tecla "8" 307 .3 PORTD. [%10011001] ' Envía código de confirmación.4 PORTD.6 = = = = 0 0 0 0 ' Columna 1 = 0 ' Columna 2 = 1 ' Columna 3 = 1 Then Then Then Then TECLA TECLA TECLA TECLA = = = = 1 4 7 10 ' ' ' ' tecla tecla tecla tecla "1" "4" "7" "*" " ' Muestra dato por la LCD PORTD.2 = 1 ' Columna 1 = 1 ' Columna 2 = 0 ' Columna 3 = 1 ' tecla "2" ' tecla "5" If PORTD."Dato: ".Programa para el circuito transmisor con teclado matricial: Symbol T9600 = 2 ' Dato verdadero (Driven True) ' Configuración de Puerto D TRISD = %01111000 TECLA VAR Byte Pause 200 LCDOut $fe. 1 inicio: Call teclado ' Declaración de variable "Tecla" ' Pausa de 200 milisegundos para la LCD ' Limpia la LCD ' 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. 2.2 = 1 If If If If PORTD. PAUSE 200 SerOut PORTB.#TECLA.1 = 1 PORTD.4 = 0 Then TECLA = 5 If PORTD.3 = 0 Then TECLA = 2 If PORTD.

1 PORTD = 0 inicio: ' Pausa de 500 milisegundos para la LCD ' Limpia la LCD ' Inicializamos el puerto D SerIn PORTB. dato If DATO = %10011001 Then sigue ' Espera datos.6 = 0 Then TECLA = 11 PORTD.0 = 1 PORTD. T9600.4 PORTD. entonces enviamos un código elegido al azar al receptor (Ej. Programa para el circuito receptor: TRISD = %00000000 Symbol T9600 = 2 ' Dato verdadero (Driven True) ' Define la variable "dato" como Byte dato VAR Byte salida VAR Byte Pause 500 LCDOut $fe. A partir de la etiqueta “inicio” se puede observar que no se envían datos al receptor a menos que se presione una tecla. ' Salta a la etiqueta "sigue" 308 . De esta manera evitaremos observar datos errados en la pantalla LCD del circuito receptor. solo si recibe el código correcto enviado desde el circuito transmisor.7.1 = 1 PORTD.5 PORTD.2 = 0 If If If If PORTD.If PORTD. 10011001). ya que su programa ha sido diseñado para que solo cambie el estado lógico de las salidas de potencia.3 PORTD. Si una tecla es presionada.6 = = = = 0 0 0 0 ' Columna 1 = 1 ' Columna 2 = 1 ' Columna 3 = 0 Then Then Then Then TECLA TECLA TECLA TECLA = = = = 3 6 9 12 ' tecla "0" ' ' ' ' tecla tecla tecla tecla "3" "6" "9" "#" Return End En el programa del circuito transmisor se pueden observar algunas mejoras. para indicar que el siguiente dato corresponde al de la tecla presionada.

' si se recibe el código correcto ' que hemos elegido (10011001) GoTo inicio sigue: SerIn PORTB.5 PORTD.#dato.7 LCDOUT $fe."Salida #: ".4 PORTD.1 PORTD.6 PORTD.7. PORTD." " ' Muestra dato en LCD GoTo inicio ' Salta a inicio End 309 . T9600. dato If If If If If If If If dato dato dato dato dato dato dato dato = = = = = = = = 1 2 3 4 5 6 7 8 Then Then Then Then Then Then Then Then Toggle Toggle Toggle Toggle Toggle Toggle Toggle Toggle ' espera datos durante 1 ms ' ' ' ' ' ' ' ' Invierte Invierte Invierte Invierte Invierte Invierte Invierte Invierte el el el el el el el el Bit Bit Bit Bit Bit Bit Bit Bit en en en en en en en en RD0 RD1 RD2 RD3 RD4 RD5 RD6 RD7 ' Salto a inicio. 2.3 PORTD.2 PORTD.0 PORTD.

cada línea en lenguaje ensamblador debe llevar el símbolo @ al inicio. se puede ver que para acceder a la variable “Led” desde el lenguaje ensamblador. se antepuso el guión bajo a la variable. quedando “_Led”. líneas de programa en lenguaje ensamblador. desde el lenguaje ensamblador se debe anteponer el símbolo “_” (Guión bajo). ya que de lo contrario no será posible el acceso a ésta.0 Pause 1000 PORTB = Led Pause 1000 @bcf _Led. 310 . Ejemplo: Led Var Byte TRISB = $00 Led = $00 Inicio: @bsf _Led. En este caso.Instrucciones de programa de PicBasic Capítulo XV @ Sintaxis: @ instrucción en lenguaje ensamblador Esta instrucción es utilizada para insertar dentro del código PicBasic.0 PORTB = Led GoTo Inicio End ' ' ' ' ' ' ' pone en 1 el bit 0 de la variable Led Pausa de 1 segundo Saca dato por el puerto B Pausa de 1 segundo pone en 0 el bit 0 de la variable Led Saca dato por el puerto B Salto a inicio ' Declaración de Variable Led ' Configura el puerto B como salida ' Inicializamos la variable Led Nota Importante: para acceder a una variable declarada en PicBasic. En el ejemplo.

el cual debe anteceder a las variables que se deseen utilizar. el PIC18F442. el PIC18F458 entre otros. Asm… EndAsm Sintaxis: Asm * * Instrucciones en lenguaje ensamblador * * EndAsm Esta instrucción permite insertar un conjunto de instrucciones en lenguaje ensamblador y al igual que en la instrucción “@”.ADCin Sintaxis: ADCin canal. el PIC18F452. por ejemplo. 311 . el PIC16F877. también aplica el uso del símbolo “_” (Guión Bajo). Variable Lee una entrada del conversor A/D y el resultado es almacenado en una variable. Esta instrucción solo es válida para microcontroladores que tienen convertidor A/D.

Led3] Led1: PORTB = %00000001 pause 1000 PORTB = %00000000 I = I + 1 GoTo inicio Led2: PORTB = %00000010 pause 1000 PORTB = %00000000 I = I + 1 GoTo inicio Led3: PORTB = %00000100 pause 1000 PORTB = %00000000 I = 0 GoTo inicio End ' ' ' ' ' enciende el led en RB2 pause de 1 segundo apaga el Led Inicializa la variable I salta a inicio ' ' ' ' ' enciende el led en RB1 pause de 1 segundo apaga el Led suma 1 a la variable I salta a inicio ' ' ' ' ' enciende el led en RB0 pause de 1 segundo apaga el led suma 1 a la variable I salta a inicio ' Declaración de Variable I ' Configura el puerto B como salida ' Inicializa el puerto B ' Inicializa la variable I 312 . si la variable es igual a 1.Led2. si la variable es igual a 0. el salto se hace a la etiqueta 2.[Etiqueta1. si la variable es igual a 2. es decir.…EtiquetaN] La instrucción Branch hace un salto a una etiqueta dependiendo del valor de la variable.Branch Sintaxis: Branch Variable.[Led1. Etiqueta2. y así sucesivamente. Ejemplo: I var Byte TRISB = $00 PORTB = $00 I = 0 inicio: Branch I. el salto se hace a la etiqueta 1. el salto se hace a la etiqueta 3.

no permite anti-rebote y no permite auto-repetición. permite el antirebote pero no permite la auto-repetición. Si es 0. y La instrucción “Button” genera auto-repetición. 313 . Activo-Alto Retardo: es una variable o constante (0 – 255) que especifica cuantos ciclos deben pasar antes de efectuar la auto-repetición. variable. acción.1).1.Button Sintaxis: Button pin. Este campo tiene dos funciones especiales: si el campo retardo es igual 0. etiqueta elimina los rebotes de un “pulsador” o “switch”. el pulsador deberá ser activo-bajo y si es 1. retardo. rango. +5V +5V R1 10 Kohm S1 Pulsador Al Pin Al Pin S1 Pulsador R1 10 Kohm Activo-Bajo Figura 15. estado. el pulsador deberá ser activo-alto (Ver figura 15. Rango: es una variable o constante (0 – 255) que especifica el número de ciclos entre auto-repeticiones. Estado: indica cual es estado lógico que debe ocurrir cuando el pulsador es presionado (0 o 1). Pin: especifica el pin del puerto en el cual será conectado el pulsador. Si el campo retardo es igual a 255.

A0.0.2. Ejemplo: TRISB = %11111101 A0 Var Byte ' Configuración del puerto B ' declaración de la variable A0 Lcdout $fe.1.150 NoPres: Pause 10 GoTo inicio End ' Salta a inicio 314 .0.NoPres PulsOut PORTB. Siempre debe ser inicializada antes del comando Button. Etiqueta: la instrucción realiza un salto a la etiqueta definida en este campo cuando el pulsador no ha sido presionado.Variable: es una variable auxiliar tipo Byte. definida también al inicio del programa para uso exclusivo de la instrucción Button. Acción: indica el estado del botón cuando éste no es presionado. por lo cual no deberá ser utilizada con otro fin en el programa.2.1 A0 = 0 inicio: ' inicializa la variable A0 Button PORTB.1.

Return End Clear Sintaxis: Clear La instrucción “Clear” inicializa todos los registros de la RAM a cero. llama a una subrutina la cual está identificada con una etiqueta. 315 . . . . todas las variables simultáneamente pasarán a ser cero. Ejemplo: inicio: Call Teclado If A0 = 1 Then led1 . . Teclado: .Call Sintaxis: Call etiqueta La instrucción “Call”. es decir. . y una vez culminada la subrutina la cual contiene al final la instrucción “Return”. vuelve a la siguiente línea después del llamado.

Este pin es designado como entrada automáticamente por la instrucción Count.ClearWDT Sintaxis: ClearWDT La instrucción “ClearWDT” inicializa el Perro Guardián (Watchdog Timer). Count Sintaxis: Count pin. Variable: es una variable definida por el programador en la cual se grabará el resultado del conteo. Duración: es el tiempo durante el cual se realizará el conteo de impulsos sobre el pin especificado. 316 . Se pueden medir frecuencias de hasta 25 khz con un oscilador de 4 MHz. Pin: especifica el pin del puerto en el cual se introducirán los impulsos. variable La instrucción “Count” puede medir la frecuencia de una señal simple determinando el número de pulsos por segundo. Para un oscilador de 20 MHz la frecuencia máxima a ser medida será de 125 khz. duración.

. 5.1.5. Para los microcontroladores que no cuentan con esta memoria. 13 y 14 respectivamente. constante1. 317 . {On-ms.…constanteN La instrucción “Data” solo puede ser utilizada para las familias de microcontroladores que incorporan memoria EEPROM en su arquitectura.. Off-ms}. el tiempo por defecto de cada tono es de 200 ms. constante o expresión que especifica la duración de cada tono en milisegundos. existe la posibilidad de agregar una memoria EEPROM externa a través del protocolo de comunicación I2C. DTMFout Sintaxis: DTMFout pin.9 En este ejemplo.. Ejemplo: Data @10. [tono. la instrucción Data almacenará los valores 1. constante2.7. 3. tono. 7 y 9 en las direcciones de memoria 10.Data Sintaxis: Data {@Dirección inicial}.tono] La instrucción DTMFout genera tonos DTMF en secuencia y a través de un puerto cualquiera del microcontrolador.3. On-ms: es una variable. En caso de no utilizar este parámetro. 12. 11. Básicamente esta instrucción guarda varias constantes a partir de una dirección que especificamos en el campo correspondiente. Pin: especifica el pin del puerto en el cual se emitirán los tonos DTMF.

Tono: puede ser una variable o constante (entre 0 – 15). que especifica el tono que debe ser generado. En caso de no utilizar este parámetro.1. 318 . Dígito en la Instrucción DTMFout 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 Dígito en un Teclado Telefónico 1 2 3 4 5 6 7 8 9 0 * # A B C D Frecuencias Bajas 697 HZ 697 HZ 697 HZ 770 HZ 770 HZ 770 HZ 852 HZ 852 HZ 852 HZ 941 HZ 941 HZ 941 HZ 697 HZ 770 HZ 852 HZ 941 HZ Frecuencias Altas 1209 HZ 1336 HZ 1477 HZ 1209 HZ 1336 HZ 1477 HZ 1209 HZ 1336 HZ 1477 HZ 1209 HZ 1336 HZ 1477 HZ 1633 HZ 1633 HZ 1633 HZ 1633 HZ Tabla 15.Off-ms: es una variable o constante que especifica el tiempo en milisegundos del silencio que hay entre cada tono. el tiempo por defecto será de 50 ms.

8. estaremos marcando sin problemas un número telefónico.6.400.4. Ejemplo: DTMFout PortC.9] Conectando el pin de salida (RC0) adecuadamente a una línea telefónica.0.1. [6.Figura 15. [0.1.7.8.0] 319 .3. En algunos casos es recomendable utilizar los tiempos On-ms y Off-ms para realizar un marcado más exacto.0.3.2. Ejemplo: DTMFout PortC.150.5.2.7.4.

320 .1 uF GND C2 0.Los tonos tendrán una duración de 400 milisegundos cada uno y un tiempo en silencio entre ellos de 150 milisegundos. R1 1K Al Pin R2 1K Al amplif icador de Audio C1 0.3. En cuanto al oscilador se recomienda usar del tipo HS (desde 10 Mhz o superior) para obtener mejores resultados en la generación de tonos DTMF. así como también se recomienda utilizar un circuito de acople entre el microcontrolador y el dispositivo externo al cual enviaremos los tonos.1 uF GND C1 Al Pin 10 uF C2 10 uF Parlante GND Figura 15.

On-ms. durante un período de tiempo también definido. FREQOUT Sintaxis: FreqOut pin. Frecuencia2 La instrucción “FreqOut” genera una o dos señales de frecuencia entre 0 y 32767 Hz previamente definidas. Es importante resaltar que los datos solo son almacenados al momento de grabar el microcontrolador en nuestro programador para microcontroladores PIC.[constante1.…. para realizar lecturas o grabaciones de nuevos datos durante la ejecución de un programa se debe recurrir a las instrucciones Read y Write.EEPROM Sintaxis: EEPROM dirección. por lo tanto. almacena constantes específicas en las posiciones consecutivas a la inicial.constanteN] La instrucción “EEPROM” es capaz de almacenar datos en la memoria de datos de un microcontrolador siempre y cuando éste cuente con esta característica y a partir de la dirección indicada. constante2. Frecuencia1. 321 . END Sintaxis: End La instrucción “END” detiene la ejecución de un programa y pone el microcontrolador en bajo consumo de energía.

3). 1000. 1500. On-ms: Es una variable o constante que determina el tiempo de duración de la señal. Frecuencia1: puede ser una variable o constante (entre 0 – 32767) que especifica la frecuencia del primer tono. FreqOut PortC.Pin: especifica el pin del puerto en el cual se va a generar la señal. En cuanto al oscilador también se recomienda usar del tipo HS (20 Mhz) para obtener mejores resultados en la generación de tonos. así como también se recomienda utilizar un circuito de acople entre el microcontrolador y el dispositivo externo al cual enviaremos los tonos (ver figura 15.2.2. 2000 Genera un tono de 2000Hz durante 1 segundo. Ejemplo: FreqOut PortC. uno de 1500Hz y otro de 3500Hz. 3500 Genera dos tonos a la vez durante 1 segundo. 322 . el cual sale mezclado con la frecuencia 1. 1000. Frecuencia2: puede ser una variable o constante (entre 0 – 32767) que especifica la frecuencia del segundo tono.

Si este parámetro es omitido.0 = 0 Pause 1000 Next Z End ' ' ' ' Pone en 1 el pin RD0 Pausa de 1 segundo Pone en 0 el pin RD0 Pausa de 1 segundo ' Declaración de la Variable Z 323 . el incremento es en una unidad. El parámetro Step afecta el incremento según el valor asignado después de esta palabra.0 = 1 Pause 1000 PORTD. Ejemplo: Z Var Byte Inicio: For Z = 0 To 10 PORTD.FOR… NEXT Sintaxis: For variable = inicio to final * * Instrucciones… * * Next {variable} {step {-} incremento} La instrucción “For…Next” se encarga de hacer repeticiones de instrucciones que permanecen dentro del lazo For… Next.

la ejecución del programa continúa en la línea siguiente a la instrucción Gosub. Esta instrucción no tiene retorno. el cual configura automáticamente como salida. Una vez ejecutada la subrutina y encontrada la instrucción Return. HIGH Sintaxis: HIGH pin La instrucción “High” pone en uno lógico el pin especificado.0 ' Pone en 1 el pin RA0 324 . GOTO Sintaxis: GOTO etiqueta La instrucción “Goto” continúa la ejecución de un programa a partir de la etiqueta especificada.Gosub Sintaxis: Gosub etiqueta La instrucción “Gosub” ejecuta subrutinas dentro de un programa principal donde la ubicación de las mismas estará definida por la etiqueta correspondiente. Ejemplo: Inicio: HIGH PORTA.

0 SCL VAR PORTB. 2.GoTo inicio End I2CREAD Sintaxis: I2Cread SDA. Dirección. SCL. Direc. Control.1 A1 VAR Byte Direc VAR Word Control VAR Byte Pause 500 LCDOut $fe. SCL. [A1] ' Lectura de ' memoria LCDOUT $fe. Control. Ejemplo: SDA VAR PORTB."Dato: ". {etiqueta de salto opcional} La instrucción “I2Cread” enviará el dato de control y la dirección específica a un dispositivo conectado a un bus I2C y almacenará el dato obtenido en una variable definida. [dato]. Al utilizar la etiqueta opcional.#A1 ciclo: GoTo ciclo End ' Muestra el dato leído 325 . 1 inicio: Direc = $10 Control = $A0 ' Dirección en la memoria externa ' Dato de Control ' Pause de 500 milisegundos ' Limpia la LCD I2CREAD SDA. el programa saltará si no se recibe ninguna respuesta del dispositivo consultado.

0 SCL VAR PORTB.I2CWRITE Sintaxis: I2CWrite SDA. Direc. dos o mas posibles comportamientos de programa. SCL. [dato]. 326 . Control. Control. {etiqueta de salto opcional} La instrucción “I2CWrite” enviará el dato de control y la dirección en la cual se almacenará el dato cargado en la variable previamente cargada. SCL. tomando decisiones en una estructura de programación sencilla y la cual será considerada casi en la totalidad de los programas.1 Direc var Word Control Var Byte inicio: Direc = $10 Control = $A0 ' Dirección en la memoria externa ' Dato de Control ' Escribe la ' memoria I2Cwrite SDA. Ejemplo: SDA VAR PORTB. [$21] pause 10 Loop: GoTo Loop End ' Pausa de 10 milisegundos IF – THEM – ELSE Sintaxis: If expresión 1 {AND / OR expresión 2} Then etiqueta Con la instrucción “If – Them” podemos seleccionar uno. Dirección.

0 ' Designa el PIN RA0 como entrada ' Si RA0 = 1 salta a la etiqueta If PORTA. inicio: Input PORTA..0 = 1 Then Espera GoTo inicio Espera: GoTo Espera End ' Salta a "inicio" si RA0 = 0 Ejemplo 2: inicio: Input PORTA...0 = 1 Then GoTo Espera Else GoTo inicio EndIf Espera: GoTo Espera End Solo se utiliza “EndIf” cuando deseamos tener más de una condición o toma de decisión. 327 .Ejemplo 1: Si pulsamos un botón conectado al pin RA0 se cumple la condición y salta a la etiqueta “Espera”. ' salta a la etiqueta "Espera" ' de lo contrario.. ' salta a la etiqueta "inicio" ' Fin de la instrucción IF-Them-Else If PORTA.0 ' Designa el PIN RA0 como entrada ' Si RA0 = 1 .

0 If PORTA. Ejemplo: inicio: Input PORTA.Ejemplo 3: A VAR Byte inicio: Input PORTA.0 Espera: GoTo Espera End ' Designa el PIN RA0 como entrada 328 .0 = 1 Then A = A + 1 If A = 10 Then Espera EndIf GoTo inicio Espera: GoTo Espera End ' Si A = 10 salta a la etiqueta “Espera” ' Designa el PIN RA0 como entrada ' Salta a "inicio" INPUT Sintaxis: INPUT PIN Designa un pin específico como entrada.

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

"* Alfanumerica *" $fe. $90 $FE. $C0 $FE.LCDout Sintaxis: LCDout comando. "* AaBbCcDdEeFf *" 330 . $0E $FE. $0F $FE. Ejemplo: Pause 200 LCDOut LCDOut LCDOut LCDOut LCDOut LCDOut Inicio: GoTo Inicio End $fe.$C0. 1 $FE. 1 $fe. dato La instrucción “Lcdout” envía datos específicos a una pantalla LCD Alfanumérica para que puedan ser mostrados en la misma. 2 $FE. $10 $FE. 2 ' Limpia la pantalla ' Posiciona el cursor en el inicio "* Pantalla LCD *" ' escribe $fe. $14 $FE.2. $0C $FE.$90.$D0. "* 1234567890 *" $fe. $D0 Acción Limpia la pantalla Retorna al inicio de la primera línea Apaga el Cursor Cursor bajo (Underline "_") activo Cursor intermitente activo Mueve el cursor un espacio a la izquierda Mueve el cursor un espacio a la derecha Mueve el cursor al inicio de la segunda línea Mueve el cursor al inicio de la tercera línea Mueve el cursor al inicio de la cuarta línea Tabla 15. Comando $FE.

Ejemplo: inicio: Low PORTA.LOW Sintaxis: LOW pin La instrucción “LOW” coloca en cero lógico un pin específico.0 ' configura RA0 = 0 espera: GoTo espera End NAP Sintaxis: NAP periodo La instrucción “NAP” pone el microcontrolador en modo de bajo consumo de energía por periodos de tiempo definidos en la siguiente tabla: 331 .

Ejemplo: inicio: NAP 6 espera: GoTo espera End ' Bajo consumo de energía durante 1152 milisegundos OUTPUT Sintaxis: OUTPUT pin La instrucción “OUTPUT” configura un pin específico como salida. Ejemplo: inicio: OUTPUT PORTA.Periodo 0 1 2 3 4 5 6 7 Retardo (ms) 18 36 72 144 288 576 1152 2304 Tabla 15.3.0 espera: GoTo espera End ' configura RA0 como salida 332 .

0 Pause 1000 Low PORTA.0 Pause 1500 GoTo inicio End ' RA0 = 1 ' Pausa de 1 segundo ' RA0 = 0 ' Pausa de 1. Esta instrucción no pone al microcontrolador en modo de bajo consumo de energía. Esta instrucción no pone al microcontrolador en modo de bajo consumo de energía.5 segundos ' Salta a la etiqueta "inicio" PAUSEUS Sintaxis: PAUSEUS periodo La instrucción “PauseUs” realiza una pausa en el programa por un periodo definido en microsegundos. Ejemplo: 333 . Ejemplo: inicio: High PORTA.PAUSE Sintaxis: PAUSE periodo La instrucción “Pause” realiza una pausa en el programa por un periodo definido en milisegundos.

El valor de la escala será correcto cuando el valor cargado en la variable se aproxime a cero. y es afectada directamente por las constantes RC. Pin: especifica el pin del puerto en el cual se va a conectar el potenciómetro. y también cuando el valor de la variable se aproxime a 255.0 PauseUs 200 Low PORTA. variable La instrucción “POT” lee un potenciómetro. 334 . foto celda. Escala: Es una variable o constante que aumenta o disminuye el rango de lectura en un porcentaje determinado. cuando la resistencia medida sea máxima.inicio: High PORTA. termistor.0 PauseUs 1500 GoTo inicio End ' RA0 = 1 ' Pausa de 200 microsegundos ' RA0 = 0 ' Pausa de 1. Básicamente esta instrucción calcula el tiempo de descarga del condensador C1 el cual varía según el valor resistivo presente en la resistencia variable.5 milisegundos ' Salta a la etiqueta "inicio" POT Sintaxis: POT pin. escala. Variable: es una variable en la cual se almacena el resultado obtenido de la lectura del potenciómetro o componente resistivo. cuando la resistencia medida sea mínima. Esta escala es utilizada para ajustar el rango de salida en la lectura del dispositivo. o cualquier otro dispositivo capaz de variar su valor resistivo.

variable La instrucción “PULSIN” mide la duración de un pulso alto o bajo con una resolución 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)." " ' Muestra mensaje y ' dato por pantalla Pause 1000 ' Pausa de 1 segundo GoTo Inicio ' Salta a inicio End ' Inicializa la variable ' Define el oscilador en 4 Mhz ' Definición de variable de 16 bits ' Pausa de 200 milisegundos ' Limpia la pantalla 335 .0. nivel.LECTURA LCDOut $fe. Variable: es una variable de 8 bits (variable tipo byte) o 16 bits (variable tipo word) definida por el programador en la cual se grabará el resultado de la lectura. Nivel: define si la medición se hace en nivel alto o bajo. 0 = bajo). Ejemplo: Define OSC 4 LECTURA VAR Word Pause 200 LCDOut $fe.#LECTURA. (1 = alto. en ms:".PULSIN Sintaxis: PULSIN pin. Pin: especifica el pin del puerto en el cual se introducirán los pulsos. 1 Inicio: LECTURA = 0 PulsIn PORTB. 2 ' Posiciona el cursor en el inicio LCDOut "Lect.1.

variable La instrucción “PULSOUT” genera pulsos con una duración definida en decenas de microsegundos. es decir. Nivel: es una variable o constante que determina la duración del pulso en su nivel alto. partiendo de nivel = 1 si se incrementa este valor. nivel. Pin: especifica el pin del puerto en el cual se genera PWM. Pausa de 1 milisegundo. ciclo La instrucción “PWM” envía pulsos PWM (Pulse Width Modulation) a un pin específico. Ejemplo: DEFINE OSC 4 Inicio: PulsOut PORTB. (Tiene una resolución de 10 microsegundos para un oscilador de 4 Mhz). el ancho de pulso positivo se incrementa hasta nivel = 254 donde el ciclo de trabajo es 336 . nivel.PULSOUT Sintaxis: PULSOUT pin.0.100 Pause 1 GoTo Inicio End ' ' ' ' Genera un pulso de 1 milisegundo de duración o 100 decenas de uS. Salto a inicio ' Define el oscilador en 4 Mhz PWM Sintaxis: PWM pin.

Ejemplo: DEFINE OSC 4 Inicio: PWM PORTB.127. Ejemplo: A0 VAR Word Pause 200 LCDOut $fe. Ciclo: es una variable o constante en el cual se define el número de ciclos en un pin específico.aproximadamente 100%. cuando nivel = 255 la salida se mantiene en uno lógico.100 GoTo Inicio End ' Señal PWM ' Salto a inicio ' Define el oscilador en 4 Mhz RANDOM Sintaxis: RANDOM variable La instrucción RANDOM almacena números aleatorios en una variable de 16 Bits (Word). Cuando nivel = 0 la salida se mantiene en cero lógico.0. 1 Inicio: Random A0 ' Almacena un número aleatorio en A0 ' Declaración de variable "A0" Word (16 Bits) ' Pausa de 200 milisegundos ' Limpia la pantalla 337 .

5. variable La instrucción “READ” permite leer datos desde la memoria EEPROM de datos de un microcontrolador almacenándolos en una variable previamente definida. 3 5 7 9 11 ' ' ' ' ' Escribe Escribe Escribe Escribe Escribe en en en en en la la la la la memoria memoria memoria memoria memoria de de de de de datos datos datos datos datos DIRECCION = 1 Pause 200 LCDOut $fe." " ' Muestra mensaje y ' dato por pantalla Pause 1500 GoTo Inicio End ' Pausa de 1. 2 ' Posiciona el cursor en el inicio LCDOut "RANDOM: ". Ejemplo: ' Declaración de Variables: I VAR Byte DIRECCION VAR Byte DATO VAR Byte WRITE WRITE WRITE WRITE WRITE 1. 1 Inicio: For I = 1 To 5 ' Dirección inicial de lectura ' Pausa de 200 milisegundos ' Limpia la pantalla ' Repite la lectura cinco veces 338 . 3.LCDOut $fe.#A0. 4.5 segundos ' Salto a inicio READ Sintaxis: READ dirección. 2.

$C0. .#DATO.5 segundos RETURN Sintaxis: RETURN Retorno de una subrutina desde donde se ha generado un salto del tipo Call o Gosub. . "Dato: ".DATO ' Lee la dirección especificada y la ' guarda en la variable "Dato". ." LCDOut $fe.Read DIRECCION. Teclado: . Ejemplo: inicio: Call Teclado If A0 = 1 Then led1 ." DIRECCION = DIRECCION + 1 Pause 1500 Next I End " ' Suma uno (1) a la variable ' Pausa de 1. .#DIRECCION. ' Posiciona el cursor en el inicio " ' Muestra dirección ' Muestra el dato leído LCDOut $fe. . Return End 339 . 2 LCDOut "Direccion: ".

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

Case 1 LCDOut $fe. 2 LCDOut "Select Case 3" Pause 1500 GoTo Inicio End Select Final: GoTo Final End ' ' ' ' Posiciona el cursor en el inicio Muestra mensaje por la LCD Pausa de 1.5 segundos Salto a inicio 341 . 2 LCDOut "Select Case 1" Pause 1500 GoTo Inicio Case 2 LCDOut $fe.5 segundos Salto a inicio ' ' ' ' Posiciona el cursor en el inicio Muestra mensaje por la LCD Pausa de 1. 2 LCDOut "Select Case 2" Pause 1500 GoTo Inicio Case 3 LCDOut $fe.5 segundos Salto a inicio ' ' ' ' Posiciona el cursor en el inicio Muestra mensaje por la LCD Pausa de 1.Z = 0 Inicio: Z = Z + 1 If Z = 4 Then Final Select Case Z ' Inicializa la variable Z ' Incrementa la variable Z ' Si Z = 4 salta a la etiqueta "Final" ' Condicional Select Case para la ' variable Z.

sin revisión de paridad y 1 bit de parada (stop). hará que se realice un salto a la “etiqueta” también definida por el programador. dato ' espera datos durante 1 ms = 2 ' Dato verdadero (Driven True) ' Define la variable “dato” como Byte ' Pausa de 500 milisegundos para la LCD ' Limpia la LCD 342 . Tiempo: este campo es opcional al igual que el campo “etiqueta” y su objetivo es establecer un tiempo en milisegundos definido por el programador. Variable: en este campo se especifica la variable en la cual se desea sean almacenados los datos recibidos. modo. etiqueta}. variable La instrucción “SerIn” se encarga de recibir uno o mas valores a través de un pin específico usando el formato asíncrono estándar 8N1 que significa 8 bits de datos. Ejemplo: Symbol T9600 dato var Byte Pause 500 LCDOut $fe. será necesario utilizar la directiva “Define Osc” al inicio del programa.7. el cual una vez vencido.{tiempo.SERIN Sintaxis: SERIN pin. Ejemplo: PortB.1 Modo: define la velocidad de transmisión en baudios. T9600. 1 Inicio: SerIn PORTC. SerIn trabaja por defecto con un oscilador de 4 Mhz y para tener una transferencia de datos segura con otros osciladores de mayor valor. Pin: en este campo definiremos cual será el pin de entrada entre los puertos disponibles del microcontrolador.

LCDOUT $fe.6. Ejemplo: Symbol T9600 I VAR Byte Inicio: For I = 0 To 9 ' Repetición de 0 a 9 ' “#” envía los datos en ASCII = 2 ' Dato verdadero (Driven True) ' Define la variable “I” como Byte SerOut PORTC. sin revisión de paridad y 1 bit de parada (stop). Modo: define la velocidad de transmisión en baudios y emplea la misma tabla de la instrucción SerIn. modo.$C0. Variable: en este campo se especifica la variable que contiene los datos que serán enviados a través de pin especificado. T9600. 2. Pin: en este campo definiremos cual será el pin de salida entre los puertos disponibles del microcontrolador." GoTo Inicio End " ' Salta a inicio SEROUT Sintaxis: SEROUT pin. [variable] La instrucción “SerOut” se encarga de enviar uno o mas valores a través de un pin específico usando el formato asíncrono estándar 8N1 que significa 8 bits de datos. [#I] Pause 1000 Next I ' Pausa de 1 segundo 343 .#dato."Dato: " LCDOut $fe.

variable La instrucción “SWAP” intercambia el contenido de dos variables. Ejemplo: A1 VAR Byte B1 VAR Byte ' Define la variable "A1" como Byte ' Define la variable "B1" como Byte 344 .GoTo Inicio End ' Salta a inicio SLEEP Sintaxis: SLEEP período La instrucción “SLEEP” lleva a un estado de bajo consumo de energía a un microcontrolador por un período de tiempo definido en segundos. Ejemplo: Inicio: Sleep 10 Espera: GoTo Espera End ' Salta a la etiqueta "Espera" ' Bajo consumo de energía durante 10 segundos SWAP Sintaxis: SWAP variable.

es decir."B1: ". 1 Inicio: Swap A1.0 Pause 1000 ' invierte el estado lógico de RA0 ' Pausa de 1 segundo ' Pone en uno (1) RA0 345 . 2. Ejemplo: High PORTA.A1 = 10 B1 = 15 Pause 200 LCDOut $fe."A1: ". si un pin se encuentra en estado lógico cero (0).0 Inicio: Toggle PORTA.$C0. éste pasa a ser uno lógico (1) y viceversa.#A1 ' Muestra variable A1 por la LCD LCDOut $fe.B1 ' Pausa de 200 milisegundos para la LCD ' Limpia la LCD ' Intercambia datos entre variables LCDOUT $fe.#B1 ' Muestra variable B1 por la LCD Espera: GoTo Espera End ' Salta a la etiqueta "Espera" TOGGLE Sintaxis: TOGGLE pin La instrucción “TOGGLE” invierte el estado lógico de un pin específico.

1 Inicio: While A < 5 High PORTB.. WEND La instrucción “WHILE – WEND” mantiene la ejecución de las instrucciones involucradas.. es decir.0 Pause 1000 Low PORTB. Ejemplo: A VAR Byte A = 0 Pause 200 LCDOut $fe.GoTo Inicio End ' Salto a inicio WHILE-WEND Sintaxis: WHILE condición . hasta que se cumpla la condición establecida.instrucciones. entre While y Wend.Wend ' ' ' ' RB0 = Pausa RB0 = Pausa 1 de 1 segundo 0 de 1 segundo ' Declaración de variable "A" ' Inicializa la variable "A" ' Pausa de 200 milisegundos para la LCD ' Limpia la LCD ' incrementa en uno (1) la variable "A" 346 .0 PAUSE 1000 A = A + 1 Wend ' Condicional While ...

9. 2.$C0. 5. Ejemplo: Inicio: WRITE WRITE WRITE WRITE WRITE 1. $03 $A1 7 13 $F0 ' ' ' ' ' Escribe Escribe Escribe Escribe Escribe en en en en en la la la la la dirección dirección dirección dirección dirección 1 o $01 el dato $03 2 o $02 el dato $A1 3 o $03 el dato $07 9 o $09 el dato $0D 15 o $0F el dato $0F espera: GoTo espera End 347 .LCDOUT $fe."ha terminado!" ' Muestra mensaje Espera: GoTo Espera End ' Salta a la etiqueta "espera" WRITE Sintaxis: WRITE dirección. 3. "While .Wend" ' Muestra mensaje LCDOut $fe. variable La instrucción “WRITE” almacena datos en la memoria EEPROM de un microcontrolador en una dirección específica. 2.

Recomendamos P16Pro.Apéndice A Programador de Microcontroladores PIC Existe una gran diversidad de programadores para microcontroladores PIC los cuales puede adquirir en tiendas de electrónica OnLine o en su proveedor local de componentes electrónicos.1.picallw. capaz de programar una gran variedad de modelos de microcontroladores PIC. consideramos una excelente experiencia llevar a cabo la construcción de su propio programador por lo cual le proponemos uno de los más populares y prácticos. Sin embargo. de muy bajo costo y fácil construcción. cuyo sitio oficial en la red es http://www. programador de microcontroladores desarrollado por Bojan Dobaj de Slovenia. 348 .com. Figura A.

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

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

• Al hacer clic en el botón “Install” (Figura A. 351 .5.Figura A.6).6.7). empieza la instalación de archivos para finalmente completar el proceso haciendo clic en el botón “Finish” (Figura A. Figura A.

Figura A. Configuración del Software Picall/P16Pro PIC: Para dar inicio al software Picall/P16Pro. Figura A. haga clic en el menú “Inicio” de Windows Picall Picall v0.9.16. Inmediatamente se despliega la ventana de la figura A.8.7. 352 .

se deberán seleccionar ciertos parámetros importantes en el software. Antes de comenzar a programar cualquier microcontrolador. Estos parámetros son los que mencionamos a continuación.9.Figura A. 353 .

10. 354 .10. Figura A.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.

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

Figura A. como se muestra en la figura A. El software también cuenta con ayuda visual para saber la posición exacta del microcontrolador en la base del programador.12. Notará que al cambiar el modelo de microcontrolador a ser programado. la figura cambia indicando la posición adecuada para evitar daños irreversibles en el dispositivo.13. 356 .

Figura A.13. 357 .

block) CAN (cancel) EM (end of medium) Ctrl-V Ctrl-W Ctrl-X Ctrl-Y Ctrl-Z Ctrl-[ Ctrl-\ Ctrl-] Ctrl-^ Ctrl-_ 1A SUB (substitute) 1B ESC (escape) 1C FS (file separator) 1D GS (group separator) 1E 1F RS (record separator) US (unit separator) Tabla B. Fuente: http://www.melabs.1.Apéndice B Tabla ASCII ASCII Control Characters Decimal Hex ASCII Function 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 NUL (null) SOH (start of heading) STX (start of text) ETX (end of text) EOT (end of transmission) ENQ (enquiry) ACK (acknowledge) BEL (bell) BS (backspace) HT (horizontal tab) LF (line feed) VT (vertical tab) FF (form feed) CR (carriage return) SO (shift out) SI (shift in) DLE (data link escape) DC1 (device control 1) DC2 (device control 2) DC3 (device control 3) DC4 (device control 4) Key Ctrl-@ Ctrl-A Ctrl-B Ctrl-C Ctrl-D Ctrl-E Ctrl-F Ctrl-G Ctrl-H Ctrl-I Ctrl-J Ctrl-K Ctrl-L Ctrl-M Ctrl-N Ctrl-O Ctrl-P Ctrl-Q Ctrl-R Ctrl-S Ctrl-T NAK (negative acknowledge) Ctrl-U SYN (synchronous idle) ETB (end of trans.com/resources/pbpmanual/ 358 .

melabs. < = > ? Decimal Hex Display / Key 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ Decimal Hex Display / Key 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ DEL Tabla B.Caracteres ASCII Standard Decimal Hex Display / Key 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F Space ! " # $ % & ' ( ) * + .2.com/resources/pbpmanual/ 359 . Fuente: http://www. . / 0 1 2 3 4 5 6 7 8 9 : .

Apéndice C Software y Practicas en Formato Digital 360 .

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

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

Sign up to vote on this title
UsefulNot useful