Está en la página 1de 149

I.P.E.T.

Juan XXIII

Computadoras Electrnicas
Gustavo A. Yarce

Paran - Entre Ros 2012

Gustavo A. Yarce

ndice general
1. Microcontroladores 1.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Estructura de un microcontrolador . . . . . . . . . . . . . . . . . . 1.3. Estructura Interna . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. El PIC16f873 2.1. Estructura . 2.2. El reloj . . . 2.3. Osciladores 2.4. Reset . . . . 11 11 12 14 17 17 19 20 21 23 23 24 24 26 27 28 28 29 30 31 33

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

3. Estructura de la memoria 3.1. Memoria de Programa . . . . 3.2. Memoria de Datos(RAM) . . 3.3. Registros Especcos - El PC 3.3.1. La pila . . . . . . . . . 3.4. Direccionamiento . . . . . . . 3.5. Los Puertos del PIC . . . . . 3.6. Puerto A . . . . . . . . . . . . 3.7. Puerto B . . . . . . . . . . . . 3.8. Puerto C . . . . . . . . . . . . 3.9. El Registro de Estado . . . . 3.10. El acumulador . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

4. Lenguaje Ensamblador 35 4.1. Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.2. Instrucciones del MPLAB . . . . . . . . . . . . . . . . . . . . . . . 38 4.3. Estructura de un programa ASM . . . . . . . . . . . . . . . . . . . 39 5. Programacin 41 5.1. CALL - RETURN . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3

4 5.2. Rutinas de retardo . . . . . . . 5.2.1. Rutina simple de retardo 5.2.2. Rutina de demora doble 5.2.3. Rutina de retardo triple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Gustavo A. Yarce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 42 43 45 47 47 48 49 50 50 51 52 53 55 55 56 56 57 58 59 60 60 61 61 61 62 62 62 63 65 65 66 67 68 69 70 72 73

6. Programacin en C de Microcontroladores 6.1. Introduccin a CCs . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2. Estructura de un programa en C . . . . . . . . . . . . . . . . . . . 6.2.1. CCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3. Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.1. Expresiones . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.2. Variables Locales y Globales . . . . . . . . . . . . . . . . . . 6.3.3. Conversiones entre tipos . . . . . . . . . . . . . . . . . . . . 6.4. Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5. Prembulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.1. #INCLUDE . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.2. #FUSES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.3. #DEFINE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.4. #USE DELAY (CLOCK=frecuencia) . . . . . . . . . . . . . 6.6. Directivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.1. #USE FAST_IO (puerto) . . . . . . . . . . . . . . . . . . . 6.6.2. #USE FIXED_IO (puerto_OUTPUTS=pin_x#, pin_x#...) 6.6.3. #USE STANDARD_IO (puerto) . . . . . . . . . . . . . . . 6.6.4. output_x(valor) . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.5. INPUT(pin) . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.6. OUTPUT_BIT(pin, value) . . . . . . . . . . . . . . . . . . 6.6.7. OUTPUT_HIGH(pin) . . . . . . . . . . . . . . . . . . . . . 6.6.8. OUTPUT_LOW(pin) . . . . . . . . . . . . . . . . . . . . . 6.6.9. SET_TRIS_puerto(value) . . . . . . . . . . . . . . . . . . 6.6.10. delay_ms(time) . . . . . . . . . . . . . . . . . . . . . . . . . 7. Interrupciones 7.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . 7.1.1. El Registro de Control de Interrupciones INTCON 7.1.2. Registro de permiso de interrupciones 1 (PIE1) . . 7.1.3. Registro de permiso de interrupciones 2 (PIE2) . . 7.1.4. Registro sealizador de interrupciones 1 y 2(PIR1 y 7.2. Interrupciones en CCs . . . . . . . . . . . . . . . . . . . . 7.2.1. Interrupcin por RB0 . . . . . . . . . . . . . . . . . 7.2.2. Interrupcin por RB7-RB4 . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . PIR2) . . . . . . . . . . . .

. . . . . . . .

Computadoras Electrnicas 8. Puerto Serie 8.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2. Handshaking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3. Comunicaciones seriales en los PC . . . . . . . . . . . . . . . . . . 8.4. RS-232 .Voltajes y niveles lgicos . . . . . . . . . . . . . . . . . . 8.5. La velocidad de transmisin de datos . . . . . . . . . . . . . . . . 8.6. RS-232 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.6.1. Secuencia de eventos en una sesin RS-232 . . . . . . . . . 8.6.2. El cable ms simple . . . . . . . . . . . . . . . . . . . . . . 8.6.3. Diseo de cables para impresoras serie y para transferencias PC a PC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.7. Ingreso de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.8. USB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.9. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.10. Objetivos del USB . . . . . . . . . . . . . . . . . . . . . . . . . . 8.11. Descripcin del Sistema . . . . . . . . . . . . . . . . . . . . . . . 8.11.1. Transferencias . . . . . . . . . . . . . . . . . . . . . . . . . 8.12. Puerto Paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.13. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.14. Estructura del interface paralelo . . . . . . . . . . . . . . . . . . . 8.15. Los registros del puerto. . . . . . . . . . . . . . . . . . . . . . . . 8.15.1. Lneas de datos . . . . . . . . . . . . . . . . . . . . . . . . 8.15.2. Lneas de Estado . . . . . . . . . . . . . . . . . . . . . . . 8.15.3. Lneas de Control . . . . . . . . . . . . . . . . . . . . . . . 8.15.4. LECTURA DEL REGISTRO DE ESTADO . . . . . . . . 8.15.5. Lectura-Escritura del registro de control . . . . . . . . . . 8.16. Precauciones en el manejo del puerto. . . . . . . . . . . . . . . . 9. La transmisin serie 9.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . 9.1.1. Registro TXSTA . . . . . . . . . . . . . . . 9.1.2. Registro RCSTA . . . . . . . . . . . . . . . 9.1.3. Registro SPBRG . . . . . . . . . . . . . . . 9.1.4. La transmisin . . . . . . . . . . . . . . . . 9.2. La transmisin serie en CCs . . . . . . . . . . . . . 9.2.1. Opciones de la directiva #USE RS232 . . . 9.2.2. Funciones para comunicacin serie asncrona 9.3. Uso de las interrupciones . . . . . . . . . . . . . . . 9.4. Instrucciones para la transmisin serie . . . . . . . 9.4.1. GETS(char *string) . . . . . . . . . . . . . . 9.4.2. PUTS(string) . . . . . . . . . . . . . . . . .

5 75 75 75 76 77 78 79 79 80 80 82 83 83 85 86 86 92 92 93 95 96 97 97 98 99 100 101 101 101 103 105 106 108 108 110 113 115 116 116

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

Gustavo A. Yarce 9.4.3. PRINTF([function], string, [values]) . . . . . . . . . . . . . . 117

10.Conversin A/D - D/A 10.1. Seales analgicas . . . . . . . . . . . . . . . . . . 10.2. Seales digitales . . . . . . . . . . . . . . . . . . . 10.3. Muestreo y retencin (sample and hold) . . . . . . . . . . . . . . . . . . 10.4. Especicaciones del muestreo y retencin . . . . . 10.5. Conversin analgica-digital . . . . . . . . . . . . 10.6. Mtodos directos de conversin A/D . . . . . . . 10.6.1. Conversores ash (en paralelo) . . . . . . . 10.6.2. Conversor de simple rampa . . . . . . . . 10.7. Mtodos realimentados de conversin A/D . . . . 10.7.1. Conversor de rampa discreta . . . . . . . . 10.7.2. Conversor de balance continuo . . . . . . . 10.8. Especicaciones de los conversores A/D . . . . . . 10.9. El ADC en el PIC . . . . . . . . . . . . . . . . . . 10.10. onguracin de Registros . . . . . . . . . . . . . C 10.11. l ADC en CCs . . . . . . . . . . . . . . . . . . . E 10.12. onversin digital - analgica (D/A) . . . . . . . C 10.13. todo de conmutacin de corrientes ponderadas M 10.14. todo de la red escalera R-2R . . . . . . . . . . M 10.15. specicaciones de los conversores D/A . . . . . . E 11.PWM 11.1. Introduccin . . . . . . . . . . . . 11.2. PWM en un microcontrolador . . 11.3. PWM en CCs . . . . . . . . . . . 11.3.1. Ejemplo de clculo PWM

119 . . . . . . . . . . 119 . . . . . . . . . . 119 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 122 123 123 124 125 126 126 127 128 129 129 133 136 138 139 139

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

143 . 143 . 144 . 146 . 147

ndice de guras
1.1. Estructura de sistema programable . . . . . . . . . . . . . . . . . . . . 11 1.2. Estructura de un microcontrolador . . . . . . . . . . . . . . . . . . . . 13 1.3. Estructura Harvard . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.1. pic16f873 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.2. Esquema del Ciclo de Instruccin . . . . . . . . . . . . . . . . . . . . 20 3.1. Organizacin de la memoria de Programa . . . . . . . . . . . . . . . . 23 3.2. Organizacin de la memoria RAM . . . . . . . . . . . . . . . . . . . . 25 4.1. Programa ASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 6.1. Compilador CCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.2. Fusibles vlidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 8.1. Puerto Serie . . . . . . . . . . . 8.2. Niveles Lgicas Puerto Serie . . . 8.3. Conexin del micro al Puerto Serie 8.4. conectores USB . . . . . . . . . . 8.5. Conector Puerto Paralelo en la PC 8.6. Registro de Datos . . . . . . . . 8.7. Registro de Estado . . . . . . . . 8.8. Registro de Control . . . . . . . . 8.9. Lectura del registro de estado . . 8.10. Lectura del registro de control . . 8.11. Escritura del registro de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 78 82 84 94 96 97 98 98 99 99

10.1. Circuito de muestreo . . . . . . . . . . . . . . . . . . . . . . . 10.2. Circuito de muestreo con retencin . . . . . . . . . . . . . . . 10.3. Aplicacin de un circuito de muestreo y retencin. . . . . . . . 10.4. Estructura de un conversor analgico-digital ash (en paralelo) de 10.5. . Esquema de un conversor analgico digital de simple rampa. . 10.6. Esquema de un conversor analgico-digital de rampa discreta. . . 7

. . . . 120 . . . . 121 . . . . 121 3 bits. 124 . . . . 125 . . . . 126

Gustavo A. Yarce 10.7. Esquema de un conversor analgico-digital de balance continuo. . . . . 10.8. AdCON0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.9. ADCON1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.10. CFG0:PCFG3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P 10.11. elacin entre la entrada digital D y la salida analgica x de un conversor R digital-analgico, con n = 3. . . . . . . . . . . . . . . . . . . . . . . 10.12. structura de un conversor digital-analgico. Xref es la referencia, E dn d1 la entrada digital y x la respuesta analgica. . . . . . . . . . 10.13. ircuito equivalente de un conversor digital-analgico de resistencias C ponderadas.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.14. na red R-2R. La resistencia vista es siempre R . . . . . . . . . . . . U 10.15. ircuito Prctico R-2R . . . . . . . . . . . . . . . . . . . . . . . . . C 10.16. xactitud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E 10.17. rror de escala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E 10.18. rror de oset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E . . . . 127 130 131 132

. 137 . 137 . . . . . . 138 139 140 141 141 142

11.1. Seal PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

ndice de tablas
3.1. Tabla de conguracin de bancos . . . . . . . . . . . . . . . . . . . 24 3.2. Registro de Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.1. Instrucciones orientadas a registros . . . . . . . . . . . . . . . . . . 36 4.2. Instrucciones orientadas a bit . . . . . . . . . . . . . . . . . . . . . 37 4.3. Instrucciones orientadas a literal y conrol . . . . . . . . . . . . . . . 37 6.1. 6.2. 6.3. 6.4. 6.5. 6.6. 6.7. 7.1. 7.2. 7.3. 7.4. 7.5. 7.6. 7.7. Tipos de datos . . . . . . . . Expresiones . . . . . . . . . . Operadores de asignacin . . . Operadores aritmticos . . . . Operadores de relacin . . . . Operadores lgicos . . . . . . Operadores de manejo de bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 50 53 54 54 54 54 66 68 69 69 69 70 71

Registro INTCON . . . . . . . . . . . . Registro PIE1 . . . . . . . . . . . . . . . Registro PIE2 . . . . . . . . . . . . . . . Registro PIR1 . . . . . . . . . . . . . . . Registro PIER2 . . . . . . . . . . . . . . Interrupciones . . . . . . . . . . . . . . . Valores de habilitacin de interrupciones

8.1. Registro de Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 8.2. Direcciones del puerto paralelo . . . . . . . . . . . . . . . . . . . . . 93 8.3. Nombre y Funcin de los pines puerto Paralelo . . . . . . . . . . . . 95 9.1. 9.2. 9.3. 9.4. 9.5. 9.6. Registros transmisin serie Registro TXSTA . . . . . Registro RCSTA . . . . . Registro SPBRG . . . . . Tipos de datos . . . . . . Ejemplos de tipos de datos . . . . . . . . . . . . . . . . . . 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 102 103 105 111 112

Prologo
Este documento no pretende ser un libro completo sobre microcontroladores, es una ayuda para el alumno, para su utilizacin como gua de aprendizaje. Se tiene como objetivo presentar los conceptos bsicos y las caractersticas generales de los dispositivos microprogramables, para el desarrollo y resolucin de problemas que se presentan en el mbito tcnico. Los temas tratados y el desarrollo que se realiza sobre ellos persiguen la enseanza en entornos educativos tcnicos de nivel medio que necesitan conocimientos sobre estas tecnologas. Se prioriza la enseanza de una metodologa de programacin correcta tratando de conservar la facilidad de uso como herramienta. Siempre se considera que lo ms importante es adquirir una base de conocimientos que permita una posterior evolucin hacia conocimientos relacionados con la Electrnica y la programacin.

Captulo 1 Microcontroladores
1.1. Introduccin

Antes de ver qu es un microcontrolador y de analizar sus puntos fuertes y sus defectos, ser til hacer un repaso relativo a la estructura de cualquier sistema programable, que pueda hacer uso de un microcontrolador.

Figura 1.1: Estructura de sistema programable

La gura 1.1 presenta el esquema tipo de cualquier sistema programable. Veamos que elementos son indispensables para su funcionamiento: La unidad central La memoria ROM 11

12 La memoria RAM Los circuitos de interfaz Un bus de interconexin

Gustavo A. Yarce

La presencia de estos elementos bsicos es indispensable y aun cuando no siempre se presenten tan claramente como en nuestro esquema siempre existen. Obsrvese, que son los mismos que los de un sistema informtico clsico, pero dentro del marco de una aplicacin que pueda ser tratada por un microcontrolador. La unidad central, generalmente constituida por un microprocesador ms o menos evolucionado, ejecuta el programa que da vida a la aplicacin. Los programas pueden ser muy diversos, puesto que, como es evidente, el que asegura la gestin de un termostato inteligente no tiene nada que ver con el que controla el correcto funcionamiento de una fotocopiadora. Sin embargo, estos programas tienen en comn el hecho de que muy raramente necesitan clculos complejos y, en cambio, s suelen incluir numerosas manipulaciones de la informacin de entrada/salida. El programa se almacena en un segundo elemento, que es la memoria ROM. Esta memoria puede constituirse de diferentes formas: UVPROM, EEPROM u OTPROM, cualquiera que sea la que se utilice es una memoria no voltil desde la que se ejecutar el programa una vez alimentado el sistema. Para poder trabajar correctamente, nuestro microprocesador necesita, a menudo, almacenar datos temporales en alguna parte, y aqu es donde interviene la memoria RAM, que no necesita ser de grandes dimensiones.

1.2.

Estructura de un microcontrolador

De lo visto anteriormente, un microcontrolador debe contener todos los elementos de la gura 1.1 en un nico encapsulado. El esquema bsico de un microcontrolador sera

Encontramos en l la unidad central pero se ha simplicado con respecto a los microprocesadores clsicos. En contrapartida se le han aadido instrucciones

Computadoras Electrnicas

13

Figura 1.2: Estructura de un microcontrolador

de manejo de bits, muy tiles para las entradas/salidas. En ciertos circuitos, esta unidad central est dotada de un gran nmero de registros internos, que sirven de memoria RAM, por lo que puede parecer que sta ltima est ausente de algunos esquemas. A continuacin podemos ver la memoria ROM, aunque sta no siempre aparece. Cierto nmero de microcontroladores estaban, y todava estn, disponibles sin ROM (ROMless). Posteriormente, los fabricantes han introducido en el chip una memoria programable elctricamente y borrable mediante rayos ultravioleta (UVPROM) o, ms recientemente, borrable elctricamente (EEPROM). Un ltimo producto para almacenar de forma no voltil son las memorias FLASH, de bajo consumo, que se puede escribir y borrar en circuito al igual que las EEPROM, pero suelen disponer de mayor capacidad que estas ltimas. El borrado solo es posible con bloques completos y no se puede realizar sobre posiciones concretas. En lo referente a la memoria RAM, suele utilizarse una del tipo SRAM (RAM esttica) de pequeo tamao, por qu generalmente la unidad central posee sucientes registros para realizar operaciones intermedias. En algunos casos, esta memoria se completa con una EEPROM de datos, que memoriza de forma semipermanente datos del usuario que se manejan como constante en la ejecucin del programa y que de vez en cuando (pasados meses o aos) deben ser modicados.

14

Gustavo A. Yarce

Algo ms delicado es hacer un esquema tipo para los circuitos de interfaz, ya que es un punto donde se distinguen los diferentes microcontroladores, en funcin de las aplicaciones que pretenden. No obstante se pueden encontrar los siguientes elementos bsicos:

Lneas de entrada/salida paralelo, en cantidad variable, segn la nalidad y el tamao del encapsulado (se plantea un problema de nmero mximo de pines debido al crecimiento del nmero de estas lneas). Al menos una interfaz de entrada/salida serie asncrona, ms o menos evolucionada segn los circuitos. Uno o varios temporizadores internos cuyas posibilidades pueden ser muy variables pero que, generalmente, funcionan como contadores ascendentes y descendentes, generadores de impulsos programables, etc. Uno o varios convertidores analgicos/digitales, precedidos o no de multiplexores para ofrecer varias vas. A veces, pero es raro, un covertidor digital/analgico.

Por ltimo, aunque no sea una verdadera interfaz de entrada/salida en el sentido en que nosotros entendemos, ciertos microcontroladores disponen de un acceso a su bus interno. Esto permite conectar con otros circuitos destinados a cumplir funciones que faltan en el chip, lo que a veces resulta til. Precisemos, aunque es evidente, que todos los microcontroladores sin memoria ROM interna disponen necesariamente de esta interfaz, puesto que es necesario permitirle acceder a una memoria ROM externa.

1.3.

Estructura Interna

En general un microcontrolador puede poseer la mayora de los componentes mas comunes de una PC, con la particularidad de no poder variar estos componentes, de ah, que se deba buscar el microcontrolador con las caractersticas especiales para nuestro trabajo. El microcontrolador puede tener algunas de estas caractersticas:

Procesador

Computadoras Electrnicas Memoria no voltil para contener el programa. Memoria de lectura y escritura para guardar los datos. Lneas de E-S para los controladores de perifricos. Circuito de reloj interno o externo. Temporizadores. Conversores AD y DA. Comparadores analgicos. Estado de reposo o de bajo consumo.

15

La arquitectura Harvard se caracteriza por un esuema donde son independientes la memoria de instrucciones(FLASH) y la memoria de datos y cada una dispone de su propio sistema de buses para el acceso. Esta dualidad, adems de propiciar el paralelismo, permite la adecuacin del tamao de las palabras y los buses a los requerimientos especcos de las instrucciones y de los datos. El procesador se cre segn la arquitectura RISC (Computadores de Juego de Instrucciones Reducido), que se identica por poseer un repertorio de instrucciones pequeo y simple, de forma que la mayor parte de las instrucciones se ejecuta en un ciclo de instruccin. La segmentacin del procesador (pipe-line), permite aumentar el rendimiento mediante un trabajo en paralelo, para poder procesar una instruccin diferente en cada una de ellas y trabajar con varias a la vez.

Memoria de Datos (SRAM)

Bus de direccin de datos 9 Bus de datos 8

Bus de direccin de instrucciones

CPU

13 Bus de Instrucciones 14

Memoria de Instrucciones (FLASH)

Figura 1.3: Estructura Harvard

16

Gustavo A. Yarce

Captulo 2 El PIC16f873

2.1.

Estructura

Microcontrolador diseado por la empresa Microchip (http://www.microchip.com), que se fabrica en varias versiones de las cuales se analizar con ms detalle el pic16f873. Son idnticas en cuanto a su arquitectura interna todos los pic de la familia 16f87x a excepcin de la memoria ROM y la memoria RAM y puertos. La memoria EEPROM y la Flash son elctricamente grabables y borrables, lo que permite escribir y borrar el programa bajo prueba manteniendo el microcontrolador en el mismo zcalo y usando el mismo dispositivo para grabar y borrar. Esta caracterstica supone una gran ventaja frente a la mayora de los microcontroladores, que tienen como memoria de programa reescribible una tipo EPROM. Se graba elctricamente, pero para borrarlas hay que someterlas durante cierto tiempo a rayos ultravioleta, lo que implica sacar del zcalo el circuito integrado y colocarlo en un borrador de EPROM. Otra ventaja del PIC16F873 en cuanto a simplicar el proceso de escritura, borrado y reescritura de programas, tan necesario en la fase de diseo, es su sistema de grabacin de datos, que se realiza en serie. Para escribir un programa en la memoria se manda la informacin en serie usando slo dos pins, una para la seal de reloj y otra para los datos serie. A continuacin exponemos las caractersticas ms signicativas:

Frecuencia de operacin 20 MHz 17

18 Memoria FLASH de programa (palabra de 14 bits) 4k Memoria de datos 192 bytes Memoria de datos EEPROM 128 bytes Interrupciones 13 Puertos de E/S Puertos A, B, C Temporizadores 3 Mdulos de Captura/Comparacion/PWM 2 Comunicacin serial tipo MSSP, USART

Gustavo A. Yarce

Mdulo de conversin Anlogo-Digital (10 bits) 5 canales de entrada Conjunto de 35 instrucciones El PIC16F873 se presenta en un encapsulado de 28 pines como se ve en la Figura 2.1 y la descripcin de cada pin se muestran en el cuadro

Figura 2.1: pic16f873

Computadoras Electrnicas

19

2.2.

El reloj

La frecuencia de trabajo del microcontrolador es un parmetro fundamental a la hora de establecer la velocidad de ejecucin de instrucciones y el consumo de energa. Cuando un PIC16F873 funciona a 20 MHz, que es su mxima frecuencia, le corresponde un ciclo de instruccin de 200 ns, puesto que cada instruccin tarda en ejecutarse 4 perodos de reloj, o sea, Ciclo de instruccin = o 4 fOSC = 4 = 200ns 20M HZ

Todas las instrucciones del PIC se realizan en un ciclo de instruccin, menos las de salto que tardan el doble. Los impulsos de reloj entrar por la pin OSC1/CLKIN y se dividen por 4 internamente, dando lugar a las seales Q1, Q2, Q3 y Q4. Durante un ciclo de instruccin, que comprende las cuatro seales mencionadas, se desarrollan las siguientes operaciones: Q1: Durante este impulso se incrementa el Contador de Programa. Q4: Durante este impulso se busca el cdigo de la instruccin en la memoria del programa y se carga en el Registro de Instrucciones. Q2-Q3: Durante la activacin de estas dos seales se produce la decodicacin y la ejecucin de la instruccin. Para conseguir ejecutar cada instruccin en un ciclo de instruccin (excepto las de salto), se aplica la tcnica de segmentacin o pipe-line, que consiste en realizar en paralelo las dos fases que comprende cada instruccin.

La estructura segmentada del procesador permite realizar al mismo tiempo la fase de ejecucin de una instruccin y la de bsqueda de la siguiente. Cuando la instruccin ejecutada corresponde a un salto no se conoce cul ser la siguiente hasta que se realice, por eso en esta situacin se sustituye la fase de bsqueda por un ciclo vacio, originando que las instrucciones de salto tarde en realizarse dos ciclos de instruccin.

20

Gustavo A. Yarce

Figura 2.2: Esquema del Ciclo de Instruccin

2.3.

Osciladores

Los PIC admiten cuatro tipos de osciladores externos para aplicarles la frecuencia de funcionamiento, se colocan entre las pins OSC1 y OSC2. El tipo empleado debe especicarse en dos bits de la Palabra de Conguracin, como se comentar ms adelante. Los tipos que se pueden emplear son:

Oscilador RC: Es un oscilador de bajo coste formado por una simple resistencia y un condensador. Proporciona una estabilidad mediocre de la frecuencia, cuyo valor depende de los valores de los dos elementos R-C. Oscilador HS: Es un oscilador que alcanza una alta velocidad comprendida entre 4 y 10 MHz y est basado en un cristal de cuarzo o un resonador cermico. Oscilador XT: Es un oscilador de cristal o resonador para frecuencias estndar comprendidas entre 100 KHz y 4 MHz. Oscilador LP: Oscilador de bajo consumo con cristal o resonador diseado para trabajar en un rango de frecuencias de 35 a 200 KHz.

Computadoras Electrnicas

21

2.4.

Reset

Cuando se aplica un nivel lgico bajo a la pin MCLR# el microcontrolador reinicializa su estado. Dos acciones importantes se producen en la reinicializacin o Reset:

1. El Contador de Programa se carga con la direccin 0, apuntando a la primera direccin de la memoria de programa en donde deber estar situada la primera instruccin del programa de aplicacin. 2. la mayora de los registros de estado y control del procesador toman un estado conocido y determinado.

Se puede provocar el Reset de varias maneras, pero si se desea realizar manualmente, habr que colocar, conectado al pin MCLR#, que al ser apretado genere un nivel lgico bajo.

22

Gustavo A. Yarce

Captulo 3 Estructura de la memoria

3.1.

Memoria de Programa

La memoria FLASH tiene una capacidad 4K palabras de 14 bits cada una. Esta memoria est dividida en pginas de 2K y esta direccionado con el PC(3.3), que tiene un tamao de 13 bits.

Figura 3.1: Organizacin de la memoria de Programa

23

24

Gustavo A. Yarce

3.2.

Memoria de Datos(RAM)

La memoria RAM de datos de los PIC 16F873 posee una capacidad de 192 bytes, en una estructura de 4 bancos de 128 bytes cada uno. Para seleccionar el banco a acceder hay que manipular el bit 5 (RP0) y el bit 6 (RP1) del registro ESTADO(03h).

BANCO 0 1 2 3

RP1 0 0 1 1

RP0 0 1 0 1

Tabla 3.1: Tabla de conguracin de bancos

La memoria de datos tiene posiciones implementadas en RAM y EEPROM,

1. Area de RAM esttica o SRAM, se alojan los registros operativos fundamentales en el funcionamiento del procesador y en el manejo de todos los perifricos y registros que el se pueden como informacin de trabajo propia de la aplicacin. 2. Area EEPROM, de 64 bytes donde, opcionalmente, se pueden almacenar datos que no se pierden al deconectar la alimentacin.

La zona de memoria RAM se halla dividida en 4 bancos (banco 0,1,2 y 3) de 128 bytes cada uno.En las posiciones iniciales de cada banco se ubican los Registros Especcos que gobiernan al procesador y sus recursos

3.3.

Registros Especcos - El PC

Los 13 bits contenidos en el PC, que direccionan la memoria de cdigo, estn guardados en dos registros especcos. El registro PCL(02h) guarda los 8 bits de

Computadoras Electrnicas

25

Figura 3.2: Organizacin de la memoria RAM

menos peso y se puede leer y escribir. Los bits <12:8>del PC se alojan en PCH, que al no poder ser ledo ni escrito, se accede a l a travs del PCLATH(0Ah).

Las instrucciones de salto CALL y GOTO slo proporcionan 11 bits de la direccin a saltar, esto es una limitante del tamao del salto que se puede producir, siendo su tamao mximo de 2K. Al resetearse el PIC, todos los bits del PC toman valor 1, de manera que la direccin de arranque del programa es siempre la ultima posicin de memoria de programa. En esta posicin se deber poner una instruccin de salto al punto

26

Gustavo A. Yarce

donde verdaderamente se inicia el programa. A diferencia de la mayora de los microprocesadores convencionales, el PC es tambin accesible al programador como registro de memoria interna de datos, en la posicin de 02. Es decir que cualquier instruccin comn que opere sobre registros puede ser utilizada para alterar el PC y desviar la ejecucin del programa. El uso indiscriminado de este tipo de instrucciones complica el programa y puede ser muy peligroso, ya que puede producir comportamientos difciles de predecir. Sin embargo, algunas de esta instrucciones utilizadas con cierto mtodo, pueden ser muy tiles para implementar poderosas estructuras de control tales como el goto computado. Como el PIC opera con datos de 8 bits, y la memoria de datos es tambin de 8 bits, estas instrucciones solo pueden leer o modicar los bits 0 a 7 del PC. Para saltar entre una pgina y otra, los bits ms signicativos del PC debern ser modicados. Debido a que las instrucciones GOTO y CALL slo pueden direccionar un bloque de 2K (pues usan una direccin de 11 bits) deben existir otros dos bits que completen los 13 bits del PC para moverse sobre los 4K de memoria de programa. Estos dos bits extra se encuentran en un SFR denominado PCLATH (Program Counter Latch High) en sus bits PCLATH<4:3>. Por esto antes de un GOTO o un CALL el usuario deber asegurarse que estos bits apunten a la pgina deseada. Si las instrucciones se ejecutan secuencialmente el PC cruza libremente los lmites de pgina sin necesidad de que el usuario escriba en el PCLATH.

3.3.1.

La pila

La memoria de stack o pila es una area de memoria completamente separada de la memoria de datos y la memoria de programa. El stack consta de 8 niveles de 13 bits cada uno. Esta memoria es usada por la CPU para almacenar las direcciones de retorno de subrutinas. El apuntador de stack no es ni legible ni escribible. Cuando se ejecuta una instruccin CALL o es reconocida una interrupcin el PC es guardado en el stack y el apuntador de stack es incrementado en 1 para apuntar a la siguiente posicin vaca. A la inversa, cuando se ejecuta una instruccin RETURN, RETLW o RETFIE el contenido de la posicin actual del stack es colocado en el PC. El Stack o Pila, es una zona de memoria, transparente al usuario, con la cual se salvan las direcciones cuando se ejecuta la instruccin CALL y las interrupciones, en esta zona se guarda el valor del PC(3.3). Es de vital importancia no sobrepasar el lmite de 8 niveles en la realizacin de programas. PCLATH no se modica en ninguna de estas operaciones y cuando el apuntador de stack ya est en la posicin 8 y se ejecuta otro CALL se reinicia a la posicin 1 sobrescribiendo en dicha posicin. No existe ningn indicador que avise de esta situacin.

Computadoras Electrnicas

27

3.4.

Direccionamiento

En los PIC de gama media la memoria de datos est organizada para alojar un mximo de 4 bancos de 128 bytes cada uno. Los PIC16C84 slo tienen implementados los 48 primeros bytes de los bancos 0 y 1. En el resto de los PIC de esta familia se destinan dos bits del registro ESTADO (RP0 y RP1) para determinar el banco y otros siete para elegir una de las 128 posiciones del banco seleccionado, tal y como muestra la gura 8. Direccionamiento Directo: El operando que utiliza la instruccin en curso se referencia mediante su direccin, que viene incluida en el cdigo OP de la misma, concretamente en los 7 bits de menos peso. El banco a acceder lo determinan los bits RP0 y RP1 del registro ESTADO. En el caso del PIC16C84 slo se usa el bit RP0 al tener implementados nicamente dos bancos. Se accede a la RAM de forma inmediata. La direccin de RAM a la que se quiere acceder est implcita en la propia instruccin. Por ejemplo: MOVWF 20 realiza una operacin de escritura en la direccin 0x20. Este modo de direccionamiento es el ms habitual. Direccionamiento Indirecto: Este modo de direccionamiento se usa cuando en una instruccin se utiliza como operando el registro INDF, que ocupa la direccin =de ambos bancos. En realidad el registro INDF no est implementado fsicamente y cuando se le hace referencia, se accede a la direccin de un banco especicada con los bits de menos peso del registro FSR. El bit de ms peso de FSR junto al bit IRP del registro ESTADO se encargan de seleccionar el banco a acceder, mientras que los 7 bits de menos peso apuntan a la posicin. Como slo hay dos bancos en el PIC16C84 en este modo de direccionamiento, el bit IRP es 0 siempre. En este modo de direccionamiento se utilizan dos registros especiales: FSR y INDF. FSR es un puntero de RAM, es decir, contiene la direccin de memoria a la que se desea acceder. El registro INDF, utiliza el valor del registro FSR para acceder al registro deseado. Por ejemplo: si escribimos 20 en FSR y despus escribimos 215 en INDF, habremos escrito un 215 en la direccin de memoria 20 (que era la que contena FSR). El direccionamiento indirecto se usa para manejar tablas manipular segmentos de memoria. Por ejemplo, Podemos programar un bucle, en el cual, incrementamos el valor de FSR para acceder a unas direcciones de memoria consecutivas.

28

Gustavo A. Yarce

3.5.

Los Puertos del PIC

Los PIC16f873 disponen de tres puertos de E/S. La Puerta B tiene 8 lneas, RB0-RB7, y tambin tiene una con funciones multiplexadas, la RB0/INT, que, adems de lnea tpica de E/S, tambin sirve como pin por la que reciben los impulsos externos que provocan una interrupcin. Adems tenemos el puerto C, con 8 lneas. Cada lnea de E/S puede congurarse independientemente como entrada o como salida, segn se ponga a 1 o a 0, respectivamente, el bit asociado del registro de conguracin de cada puerta (TRISA, TRISB y TRISC). Se llaman PORTA, PORTB y PORTC los registros que guardan la informacin que entra o sale por la puerta y ocupan las direcciones 5 y 6 del banco 0 de la memoria de datos. Los registros de conguracin TRISA, TRISB Y TRISC ocupan las mismas direcciones pero en el banco 1. Al reiniciarse el PIC todos los bits de los registros TRIS quedan a 1, con lo que las lneas de las puertas quedan conguradas como entradas. Cada lnea de salida puede suministrar una corriente mxima de 20 mA y si es de entrada puede absorber hasta 25 mA. Al existir una limitacin en la disipacin mxima de la potencia del chip se restringe la corriente mxima de absorcin de la Puerta A a 80 mA y la de suministro a 50 mA. La Puerta B puede absorber un mximo de 150 mA y suministrar un total de 100 mA.

3.6.

Puerto A

La Puerta A posee 6 lneas, RA0-RA5, y soportan funciones multiplexadas. Son bidireccionales y dependen del valor del registro TRISA. Los pines RA0/AN0,RA1/AN1 y RA2/AN2, adems de lneas de E/S digitales tambin pueden actuar como los canales 0,1 y 2 por los que se pueden utilizar como entradas al conversor A/D. El pin RA3/AN3,Vref+ puede actuar como entrada de la tensin de referencia para los perifricos que la precisan. El pin RA4/TOCKI, que puede actuar como lnea de E/S o como el pin por la que se reciben los impulsos que debe contar TMR0. Las lneas RA3-RA0 admiten niveles de entrada TTL y de salida CMOS. La lnea RA4/TOCKI dispone de un circuito Trigger Schmitt que proporciona una buena inmunidad al ruido y la salida tiene drenador abierto. RA4 multiplexa su

Computadoras Electrnicas

29

funcin de E/S con la entrada de impulsos externos para el TMR0. En el circuito de la gura 9 se muestra la adaptacin de las pins RA3-RA0 a las seales internas del procesador. Cuando se lee una lnea de la Puerta A se recoge el nivel lgico que tiene en ese momento. Las lneas cuando actan como salidas estn conectadas a unos biestable, lo que signica que sus pins sacan el nivel lgico que se haya cargado por ltima vez en el registro PUERTAA. La escritura de una puerta, tal y como se ve en la gura 9, implica que primero se deposita el nivel lgico en la lnea correspondiente del bus interno de datos y se activa la seal WRITE, lo que origina el almacenamiento de dicho nivel en el biestable. En esta situacin, el biestable de conguracin (TRIS) debera tener valor 0 para que actuase como salida. Con estos valores la puerta OR tendra un 0 a su salida y la AND tambin. Estos valores producen la conduccin de los transistores MOS, en funcin del valor escrito, dando como salida nal VDD o VSS (1 0 respectivamente). Si una lnea acta como entrada, el nivel lgico depositado en ella desde el exterior pasa a la lnea correspondiente del bus interno de datos cuando se activa la seal READ y se hace conductor el dispositivo triestado que les une. Al programarse como entrada, los dos transistores MOS de salida quedan bloqueados y la lnea de alta impedancia. Tngase en cuenta que cuando se lee una lnea de entrada se obtiene el estado actual que tiene su pin correspondiente (almacenado en el tercer biestable) y no el que haya almacenado en el biestable de datos. La informacin presente en una lnea de entrada se muestrea al iniciarse el ciclo de instruccin y debe matenerse estable durante su desarrollo. Cuando se produce un RESET al conectar la tensin de alimentacin(Power On Reset) todas las patitas de la puerta A quedan conguradas como canales de entrada para el conversor A/D y son ledas como 0. Para que el PORTA funcione como lneas de E/S digitales se debe congurar el valor adecuado en el ADCON1, en general se suele cargar en dicho registro el valor 011x en sus 4 bits de menos peso.

3.7.

Puerto B

Consta de 8 lneas bidireccionales de E/S, RB7-RB0, cuya informacin se almacena en el registro PORTB, que ocupa la direccin 6 del banco 0. El registro de conguracin TRISB ocupa la misma direccin pero del banco 1. La lnea RB0/INT tiene dos funciones multiplexadas; adems de pin de E/S acta como la pin para la peticin de una interrupcin externa, cuando se autoriza esta funcin

30

Gustavo A. Yarce

mediante la adecuada programacin del registro INTCON. Las cuatro lneas de ms peso, RB7-RB4, pueden programarse para soportar una misin especial. Cuando las 4 lneas actan como entradas se las puede programar para generar una interrupcin si alguna de ellas cambia su estado lgico. Esta posibilidad es muy prctica en el control de teclados. En la gura 10 se muestra el esquema de conexionado entre las pins RB7-RB4 y las lneas correspondientes del bus interno. El estado de las pins RB7-RB4 en modo de entrada se compara con el valor antiguo que tenan y que se haba almacenado en un biestable durante la ltima lectura de la Puerta B. El cambio de estado en alguna de esas lneas origina una interrupcin y la activacin del sealizador RBIF. La lnea RB6 tambin se utiliza para la grabacin serie de la memoria de programas y sirve para soportar la seal de reloj. La lnea RB7 constituye la entrada de los datos en serie. Los pines del puerto B disponen de una resistencia interna de pull-up al positivo de la alimentacin, que queda conectada cuando el bit RBPU#, que es el bit 7 del registro OPTION, tiene el valor 0. Las resistencias pull up se utilizan para forzar a un nivel alto una entrada de un componente lgico. Sirve por ejemplo cuando necesitas leer el estado de un interruptor o una tecla. Cuando la tecla se activa se lleva a un estado lgico determinado, pero cuando est abierta est al aire y los circuitos lgicos hacen una interpretacin indeterminada. La resistencia pull up fuerza a nivel lgico alto cuando est abierta y permite que se lleve a nivel bajo al cerrarse sin producir un cortocircuito. Tambin puede servir cuando se conecta una entrada a una salida de colector abierto. El pull up suple la resistencia faltante del driver de colector abierto

3.8.

Puerto C

Consta de 8 lneas bidireccional cuyo sentido se congura mediante el registro TRISC, El Puerto C tiene varias funciones en sus pines, tiene las funciones de comunicacion I2C, el reloj externo del timer 1, Usart, etc. Cuando se usan los mdulos relacionados con este puerto, se debe tener cuidado pues algunas veces cambia el estado E/S del pin sin importar lo que indique TRISC, para saber cuando si cambiara debemos ver la descripcin de cada mdulo. Todos los buers de este puerto son del tipo Schmitt Trigger, adems poseen las siguientes funciones multiplexadas:

Computadoras Electrnicas

31

RC0/T1OSO/T1CKI: E/S, puede ser tambin salida del Timer1 entrada del impulsos para el Timer1. RC1/T1OSI/CCP2: E/S, puede ser tambin entrada al oscilador del Timer1 entrada al mdulo de captura 2, salida del comparador 2 , salida de PWM2. RC2/CCP1: E/S, puede ser tambin entrada captura 1, salida comparador 1 o salida PWM1. RC3/SCK/SCL: E/S, puede ser tambin seal de reloj en modo SPI seal de reloj en modo I2C. RC4/SDI/SDA: E/S, puede ser tambin entrada de datos en modo SPI o Seal de reloj en modo I2C. RC5/SD0: E/S, puede ser tambin salida de datos en modo SPI. RC6/TX/CK: E/S, lnea de transmisin eb USART seal de reloj sncrona en transmisin serie. RC7/RX/DT: E/S, lnea de recepcin USART lnea de datos en transmisin serie sncrona.

3.9.

El Registro de Estado

Hasta ahora ESTADO es el registro ms usado y llega el momento de describirlo en su totalidad. Ocupa la direccin 3 tanto del banco 0 como del 1 de la memoria de datos RAM. Sus bits tienen tres misiones distintas:

1. Se encargan de avisar de la incidencias del resultado de la ALU (C, DC y Z). 2. Indican el estado de Reset (TO# y PD#). 3. Seleccionan el banco a acceder en la memoria de datos (IRP, RP0 y RP1)

En la tabla 8.1, se muestra el diagrama de distribucin de los bits del registro ESTADO, su misin es la siguiente:

32 IRP RP1 7 6 RP0 5 T0# PD# 4 3 Z 2 DC c 1 0

Gustavo A. Yarce

Tabla 3.2: Registro de Estado C: Acarreo en el bit de ms peso 1: Acarreo en el bit de ms peso. 0: No acarreo en el bit de ms peso. DC: Acarreo en el 4o bit 1: Acarreo en el 4o bit. 0: No acarreo en el 4o bit.

Z: Cero 1: El resultado de una instruccin lgico-aritmtica ha sido cero. 0: El resultado de una instruccin lgico-aritmtica no ha sido cero.

PD#: Power Down 1: Se pone a este valor despus de la conexin a la alimentacin o al ejecutar clrwdt. 0: Se pone a este valor al ejecutar sleep.

TO#: Time Out 1: Se pone a este valor despus de la conexin a la alimentacin o al ejecutar clrwdt y sleep. 0: Se pone a este valor al desbordarse el Perro Guardin (Watchdog).

RP1-RP0: Seleccin de banco en direccionamiento directo El PIC16F873 tiene cuatro bancos, emplea el bit RP0 y RP1, de forma que se puede acceder a cualquier banco.

IRP: Seleccin del banco en direccionamiento indirecto Este bit junto con el de ms peso del registro FSR sirven para determinar el banco de la memoria de datos seleccionado.

Computadoras Electrnicas

33

3.10.

El acumulador

Uno de los registros mas utilizado, es el registro de trabajo W, el cual, se utiliza para mover un dato/valor de un registro a otro, cargar valores en un registro, y con la ayuda de la ALU puede hacer operaciones matemticas. El registro W no est implementado en la memoria RAM en la posicin 0x00 ni en otra posicin. W es un registro independiente que tiene un bus directo con la ALU (un camino privado). La ALU es la nica entidad que puede leer o escribir este registro de trabajo.

34

Gustavo A. Yarce

Captulo 4 Lenguaje Ensamblador

4.1.

Instrucciones

El juego de instrucciones de un microprocesador o microcontrolador es el conjunto de entradas binarias que producen acciones denidas durante un ciclo de instruccin. Un juego de instrucciones es para el microcontrolador lo mismo que una tabla de verdad es para una puerta lgica, un registro de desplazamiento o un sumador. Por supuesto, las acciones que realiza un microcontrolador con cada instruccin, son ms complejas que las que realizan los dispositivos y puertas antes mencionados. Una instruccin es un patrn de dgitos binarios el cual debe estar a disposicin del microcontrolador en el tiempo y forma que ste lo requiera. Por ejemplo, cuando el procesador de un microcontrolador PIC16F84A recibe el patrn binario de 12 bits 0000 0100 0000 en el momento adecuado, signica: Clear (borrar o poner a cero) el registro W, y corresponde a la instruccin CLRW. Para los PIC se han creado unas instrucciones y una estructura de programa que los hacen ms sencillos y atractivos todava.. Las instrucciones de los microcontrolador PIC cumplen con las siguientes condiciones: Juego de instrucciones reducido: Por ejemplo, solo existen 35 instrucciones en el PIC16F873. Sencillas y rpidas: La mayora se ejecuta en un ciclo de instruccin, y solo las de salto precisan 2 ciclos. El ciclo de instruccin consta de 4 ciclos de reloj principal. De esta manera un dispositivo con un cristal de cuarzo de 20 MHz realiza 5 millones de instrucciones por segundo. 35

36

Gustavo A. Yarce Ortogonalidad: La ubicacin de los operandos que manejan es muy exible. Cualquier objeto del procesador puede actuar como origen o como destino. Formato uniforme de las instrucciones: Todas las instrucciones tienen una longitud ja de bits. Esta caracterstica signica un notable ahorro de la memoria de programa y una facilidad en la construccin de compiladores. Formato uniforme de los datos.

Un programa es una serie de instrucciones mediante las cuales un sistema basado en CPU realiza una tarea en particular y la forma mas simple de realizar un programa es mediante el lenguaje ensamblador (Ver Sistemas microprogramables, Lenguajes de programacin para sistemas basados en CPU). Podramos decir que el lenguaje ensamblador es complejo por su sencillez. Esto quiere decir que, a diferencia de los lenguajes de alto nivel, aqu no hay funciones que solucionen y simpliquen algoritmos, si no que hay que implementar hasta los pasos ms elementales. Mnemnicos Descripcin ADDWF f,d w+fd ANDWF f,d w AND f d CLRF f 00 h f CLRW f 00 h w COMF f,d Complemento de f d DECF f,d f-1d DECFSZ f,d f - 1 d (si es 0 salta) INCF f,d f+1d INCFSZ f,d f + 1 d (si es 0 salta) IORWF f,d w OR f d MOVF f,d fd MOVWF f wf NOP No operacin RLF f,d Rota f izq por carry d RRF f,d Rota f dcha por carry d SUBWF f,d f-wd SWAPF f,d Intercambia nibbles de f d Flags Ciclos C, DC, Z 1 Z 1 Z 1 Z 1 Z 1 Z 1 Ninguna 1(2) Z 1 Ninguna 1(2) Z 1 Z 1 Ninguna 1 Ninguna 1 C 1 C 1 C,DC,Z 1 Ninguna 1

Tabla 4.1: Instrucciones orientadas a registros

Computadoras Electrnicas Mnemnicos Descripcin BCF f,b Pone a 0 bit b de registro f BSF f,b Pone a 1 bit b de registro f BTFSC f,b Salto si bit b de reg. f es 0 BTFSS f,b Salto si bit b de reg. f es 1 Flags Ninguna Ninguna Ninguna Ninguna Ciclos 1 1 1(2) 1(2)

37

Tabla 4.2: Instrucciones orientadas a bit Mnemnicos ADDLW k ANDLW k CALL k CLRWDT GOTO k IORLW k MOVLW k RETFIE RETLW k RETURN SLEEP SUBLW k XORLW k Descripcin w+kw w AND k w Llamada a subrutina k Borra temporizador del WDT Ir a direccin k w OR k w kw Retorno de una interrupcin Retorno con k en w Retorno de una subrutina Modo Standby k-ww w XOR k w Flags C,DC,Z Z Ninguna TO,PD Ninguna Z Ninguna Ninguna Ninguna Ninguna TO, PD C,DC,Z Z Ciclos 1 1 2 1 2 1 1 2 2 2 1 1 1

Tabla 4.3: Instrucciones orientadas a literal y conrol

Notas: Al modicar un registro de E/S con una operacin sobre l mismo (por ejemplo MOVF PORTB,1), el valor utilizado es el que se halle presente en las patillas del PORTB. Por ejemplo, si el biestable tiene un 1 para una patilla congurada como entrada y se pone a nivel bajo desde el exterior, el dato se volver a escribir como 0. Si se ejecuta esta instruccin sobre el TMR0 y d=1, se borrar el conteo de la preescala asignada (preescaler), si est asignado al TMR0, pero no se borrar la preescala asignada en OPTION_REG, que controla Timer0. Si se modica el Contador de Programa PC o una condicin de prueba es

38

Gustavo A. Yarce verdadera, la instruccin requiere dos ciclos mquina. El segundo ciclo se ejecuta como un NOP.

En las tablas siguientes, por orden alfabtico, veremos todos los datos de inters sobre las 35 instrucciones. Algunos son de poca importancia. En cambio otros, como la operacin, la sintaxis, el comportamiento del registro STATUS y los ejemplos, son imprescindibles para comprender su funcionamiento. Aparte de estas 35 instrucciones, hay otro tipo de instrucciones usadas para simplicar la tarea de programar, y que generalmente estn formadas por dos instrucciones bsicas. Estas no las trataremos a fondo, pero las veremos en un resumen despus de comprender el funcionamiento de las 35 instrucciones bsicas.

4.2.

Instrucciones del MPLAB

No son propiamente instrucciones del microcontrolador, sino que son comandos insertados en el programa que controlan el proceso de ensamblado Estos comandos no tienen traduccin al cdigo mquina. Suelen escribirse en la segunda columna. Algunas de estas pseudoinstrucciones son: END: Indica n del programa. Es el nico comando obligatorio ya que el ensamblador necesita saber donde termina el proceso de ensamblado. Se pone en la ltima lnea del programa. Todas las lneas posteriores a la lnea en la que se encuentra esta directiva son ignoradas y no se ensamblan. ORG: Su sintaxis es:

[<label>] ORG <expr> Indica al programa ensamblador a partir de que posicin de memoria de programa tiene que ensamblar las instrucciones. Ejemplo: ORG 0x04 Si las instrucciones de un programa comienzan a escribirse sin indicar ORG, el ensamblador toma por defecto ORG 0x00. Pueden escribirse varios ORG en el mismo programa

Computadoras Electrnicas EQU. Su sintaxis es: <label>EQU <expr>

39

Es una etiqueta de asignacin. El valor <expr>es asignado a la etiqueta <label>. Usualmente las asignaciones EQU se ponen al principio del programa (antes que las instrucciones). Siempre que <label>aparece en el programa es sustituido por el valor numrico de la expresin que se le haya asignado. _ CONFIG. Esta directiva indica la conguracin elegida para el proceso de grabacin del microcontrolador. Ejemplo: _CONFIG _CP_OFF & _WDT_OFF & PWRTE_ON & _XT_OSC En este caso la conguracin elegida es: No hay proteccin de cdigo (_CP_OFF) No se habilita el Watchdog (_WDT_OFF) Se habilita el Reset mediante Power-up Timer(_PWRTE_ON). Se utiliza el oscilador por cristal de cuarzo (_XT_OSC)

4.3.

Estructura de un programa ASM

E general la estructura del programa en ensamblador tiene, 3 columnas obligatoria, la primer columna es la ETIQUETA y sirve para darle el nombre a una posicin de la memoria del programa al que se necesita apuntar(EQU. La segunda columna, se llama INSTRUCCIN y lo que justamente hace, es una instruccin a realizar por el programa. La tercera columna, se llama OPERANDO y es el operando de una instruccin, o sea, de la segunda columna. Hay instrucciones que no tienen operando. Opcionalmente se puede incluir un cuarta columna, llamada OBSERVACIONES y sirve solo para el usuario, el que est programando el PIC. Comienzan con un ; (punto y coma)

40

Gustavo A. Yarce

Ejemplo 4.1 ASM

Figura 4.1: Programa ASM

Captulo 5 Programacin

5.1.

CALL - RETURN

La instruccin CALL ( llamada la subrutina) consigue que la ejecucin del programa contine en la direccin donde se encuentra la subrutina a la que hace referencia. Es similar a GOTO pero coloca en la pila la direccin de la siguiente instruccin que se debe ejecutar despus de la CALL. La subrutina naliza con la instruccin RETURN (Retorno de la subrutina) que retoma la direccin guardada en le pila y la coloca en el contador del programa PC continuando el ujo de control con la instruccin que sigue a la CALL.

En la familia PIC de gama media la pila tiene ocho niveles de memoria del tipo FIFO (primero en entrar, ltimo en salir). Si se produce la llamada a una subrutina durante la ejecucin de otra subrutina, la direccin de retorno de esta segunda es colocada en la cima de la pila sobre la direccin anterior. Esta segunda direccin es la primera en salir de la pila mediante la instruccin RETURN. Con la pila de ocho niveles, una subrutina puede llamar a otra y sta, a su vez, llamar a otra hasta un mximo de ocho. La gama baja slo puede realizar dos llamadas de este tipo al poseer una pila de slo dos niveles. Las subrutinas deben colocarse al comienzo de las pginas debido a que el bit 8 del contador del programa es puesto a 0 por la instruccin CALL (o por cualquier instruccin que modica el PC). Las subrutinas deben colocarse en la mitad inicial de las pginas (las 256 palabras). 41

42

Gustavo A. Yarce

5.2.

Rutinas de retardo

5.2.1.

Rutina simple de retardo

Una rutina de simple puede ser implementada como:

call retardo r1

retardo

;llama a la rutina de retardo

movlw .k1 ;carga k1 en el acumulador movwf mem1 ;guarda el valor del w en mem1 decfsz mem1,1 ;decrementa mem1 goto r1 ;se ejecuta esta inst. si dec. no es cero return

Cuando ejecuta la instruccin Call esta lleva en ejecutarse 2 ciclos. Cuando esta dentro de la rutina retardo se encuentra con la instruccin movlw .k1 que consume 1 ciclo, luego ejecuta la instruccin movwf mem1 que consume 1 ciclo. Luego se ejecuta la parte principal de la rutina de demora, las instrucciones decfsz mem1,1 y la instruccin goto r1 se ejecutan (k1-1) veces, ya que mienstras esta decrementado y no llega a cero no se saltea la instruccin goto, por lo tanto mienstras no de cero el decremento la instruccin decfsz consume 1 ciclo y la instruccin goto 2, por lo tanto,(k1-1 )*3 ciclos le lleva realizar este decremento, cuando llego a cero la instruccin decfsz consume 2 ciclos, por lo tanto el total de ciclo de la rutina de demora es 3*(k1-1) + 2 ciclos. Luego retorna al programa principal mediante la instruccin return que consume 2 ciclos. El total de ciclos que lleva la rutina completa es 2 + 1 + 1 +(k1-1) + 2 = 35 ciclos, y el tiempo que consume esto es con un reloj de 4 Mhz, por lo tanto el perdo es 2, 5e7 ; cada instruccin consume 4 ciclos, por lo que el tiempo que tarda en ejecutarse cada instruccin es 4 2,5e 7 = 1e6 . La secuencia de demora es {3 254 + 2 = 764}, el mximo tiempo que puede realizar la demora es (2 + 1 + 1 + 3 254 + 2 + 2) = 770ciclos Lo que lleva un tiempo de 770 u seg.

Computadoras Electrnicas

43

5.2.2.

Rutina de demora doble

Una rutina de doble puede ser implementada como: call retardo ;llama a la rutina de retardo retardo r2 r1 movlw .k2 ;{1} movwf mem2 ;{2} movlw .k1 ;{3} carga k1 en el acumulador movwf mem1 ;{4} guarda el valor del w en mem1 decfsz mem1,1 ;{5} decrementa mem1 goto r1 ;{6} se ejecuta esta instr. si el dec. <>0 decfsz mem2,1 ;{7} goto r2 ;{8} return ;{9}

La instruccin Call consume 2 ciclos, luego se ejecuta la instruccin retardo, luego ejecuta la instruccin {1} que tarda 1 ciclo, luego se ejecuta la instruccin {2} - 1 ciclo. Luego ejecuta la instruccin {3} aqu esta tarda 1 ciclo, luego ejecuta la instruccin {4} - 1 ciclo, luego se ejecuta la instruccin {5} {6} que ya fue analizado en el punto anterior y tarda siempre 3*(k1-1)+2 ciclos. luego se ejecuta la instruccin {7} que decrementa mem2, si el decremento no es cero tarda en ejecutarse 1 ciclo y pasa a ejecutar la instruccin {8}, que vuelve a la instruccin {3}. Entonces el secuencia de instrucciones:

{3} {4} {5} {6} {7} {8} Total

1 ciclo 1 ciclo 3*(k1-1)+2 ciclos 1 ciclo 2 ciclo 7+(3*(k1-1) ciclos

Esta secuencia ciclos se ejecutan en su totalidad (k2-1) veces. Luego la tercera vez esta secuencia resulta en: {3} 1 ciclo {4} 1 ciclo {5} {6} 3*(k1-1)+2 ciclos {7} 2 ciclos Total 6+3*(k1-1) ciclos

44

Gustavo A. Yarce se ejecuta decfsz mem2 como el decremento es 0 consume 2 ciclos El total de ciclos consumidos en esta rutina 2 + 1 + 1 + {(7 + (3 (k1 1)) 2 + 6 + 3 (k1 1)} + 2 ciclos El mximo tiempo que se tarda, se cargan mem1 y mem2 con 0FFh. La primera secuencia tarda {3} {4} {5} {6} {7} {8} Total 1 ciclo 1 ciclo 764 ciclos 1 ciclo 2 ciclo 769 ciclos

Esta secuencia se ejecuta 0Feh veces o 254 veces. La segunda secuencia es {3} {4} {5} {6} {7} Total 1 ciclo 1 ciclo 764 ciclos 2 ciclos 768 ciclos

EL nmero de ciclos total es 2 + 1 + 1 + {769 254 + 768} + 2 = 2 + 1 + 2 + {101} + 2 = 196100ciclos Lo que lleva un tiempo de 1961001e6 = 0,1961 segundos o 196.1 milisegundos.

Computadoras Electrnicas

45

5.2.3.

Rutina de retardo triple

retardo r3 r2 r1

movlw movwf movlw movwf movlw movwf decfsz goto decfsz goto decfsz goto return

.k3 ;{1} mem3 ;{2} .k2 ;{3} mem2 ;{4} .k1 ;{5} mem1 ;{6} mem1,1 ;{7} r1 ;{8} mem2,1 ;{9} r2 ;{10} mem3,1 ;{11} r3 ;{12} ;{13}

La llamada a subrutina call tarda 2 ciclos. Luego salta a la subrutina en la cual se encuentra con {1} y {2} que tardan en ejecutarse 2 ciclos. Luego entra en la rutina principal, entre las lneas {7}{8} tenemos el bucle simple el cual tarda en ejecutarse 3*(k1-1)+2 ciclos,

Entre las lneas {5}{6}{7}{8}{9}{10}, tenemos el bucle doble, el cual incluye el bucle simple. Denominaremos a la expresin del bucle simple como A = [3 (k1 1) + 2] Por lo tanto el bucle doble puede expresarse como:

{5} {6} {A} {9} {10}

1 ciclo 1 ciclo A ciclos 1 ciclo 2 ciclos

Este bucle se ejecuta (k2-1). La expresin que rige el segundo bucle, [(1+1+A+1+2)*(k2-1)]+[1+1+A+2]= [(5+A)*(k2-1]+[4+A]ciclos

46 Para indicar la expresin del bucle doble lo haremos como B=[(5+A)*(k2-1)]+[4+A]

Gustavo A. Yarce

En la lnea 3 comienza el bucle triple y naliza en 12 la cual ocupa las siguientes lneas: 3 1 ciclo 4 1 ciclo B B ciclos 11 1 ciclo 12 2 ciclos

C=[(1+1+B+1+2)*(k3-1)]+[1+1+B+2]=[(5+B)*(k3-1)]+[4+B]=

Para determinar una rutina generaliza es A=[3*(k1-1)+2] B=[(5+A)*(k2-1)]+[4+A] C=[(5+B)*(k3-1)]+[4+B] D = 2 + 1 +1 +C + 2

Para el mximo de los valores cargados en k1, k2 y k3 para 255.

A=[3*(255-1)+2]=764 ciclos B=[(5+764)*(255-1)]+[4+764] = [195326]+[768] = 196064 ciclos C=[(5+196094)*(255-1)]+[4+196094] = 50005244 ciclos D = 2 + 1 + 1 + 50005244 + 2 = 50005250 ciclos Para un oscilador de 4 MHz, el tiempo de ciclo de instruccin es t = 1e6 seg. D= 50.005250 segundos

Captulo 6 Programacin en C de Microcontroladores

6.1.

Introduccin a CCs

Cada programa en C debe contener una funcin principal que es el punto de partida de la ejecucin del programa. El programa puede dividirse en mltiples funciones segn el propsito y las funciones pueden ser llamadas desde la principal o subfunciones. En un gran proyecto, las funciones tambin se pueden colocar en diferentes archivos de C o archivos de cabecera que se pueden incluir en el archivo principal de C al grupo de las funciones relacionadas con su categora. CCS tambin requiere incluir el archivo de dispositivo apropiado utilizando la directiva # include para incluir el dispositivo de funcionalidad especca. Tambin hay algunas directivas de preprocesador como # fuses para especicar los fusibles para el chip y #use delay para especicar la velocidad de reloj. Las funciones contienen las declaraciones de datos, deniciones, declaraciones y expresiones. El compilador tambin proporciona un gran nmero de libreras estndar de C, as como otros controladores de dispositivo que puede ser incluida y utilizada en los programas. CCS tambin provee un gran nmero de funciones integradas para acceder a los distintos perifricos incluidos en el microcontrolador PIC.

47

48

Gustavo A. Yarce

6.2.

Estructura de un programa en C

/* Preambulo */ # include # fuse # use # byte # bit declaracin de funciones denicin de variables globales /* Funcin Principal */ void main(void) { denicin de variables locales; deniciones del PIC; Instrucciones; etc; } /* Funciones secundarias */ funcin 1() { denicin de variables locales instrucciones; etc; } funcin 2() { denicin de variables locales; instrucciones; etc; }

Computadoras Electrnicas

49

6.2.1.

CCs

Figura 6.1: Compilador CCs

Figura 6.2: Fusibles vlidos

50

Gustavo A. Yarce

6.3.

Tipos

El lenguaje C proporciona cinco tipos bsico de datos, con cuatro modicadores posibles. Podemos utilizar variables de cualquiera de esos tipos. La tabla siguiente muestra los tipos disponibles:

Tipo short short int int char unsigned unsigned int signed signed int long long int signed long oat

Ancho (Bits) 1 1 8 8 8 8 8 8 16 16 16 32

Rango 0o1 0o1 0 a 255 0 a 255 0 a 255 0 a 255 -128 a 127 -128 a 127 0 a 65536 0 a 65536 -32768 a 32767 3.4E-38 a 3.4E+38

Tabla 6.1: Tipos de datos

6.3.1.

Expresiones

Valor Formato 123 Decimal 123 Octal 0x123 Hex 0b010010 Binario x Carcter \010 Carcter Octal \xA5 Carcter Hex Tabla 6.2: Expresiones

Computadoras Electrnicas

51

6.3.2.

Variables Locales y Globales

Si una variable se declara dentro de una funcin, ser visible solo dentro de sta:

funcion1 () { char letra; .... }

En el ejemplo anterior, la variable tipo char llamada letra solo podr utilizarse dentro de la funcin funcion1(). Si intentamos utilizarla fuera de ella, el compilador nos dar un error. Si declaramos una variable fuera de cualquier funcin, el alcance de esta sera global, lo que quiere decir que estar disponible en cualquier parte de nuestro programa. Vemos un ejemplo de este ltimo caso. char letra; main() { .... }

funcion1() { ... }

La variable tipo char llamada letra podr utilizarse dentro de main() o de funcion1().

52

Gustavo A. Yarce

6.3.3.

Conversiones entre tipos

CCS nos permite mezclar diferentes tipos de variables dentro de una misma expresin. Y existen un conjunto de reglas que nos permiten saber que de que tipo ser el resultado de la misma. Por ejemplo, el compilador convertir automticamente a int cualquier expresin que contenga variables char, short o int. Esta conversin solo tiene efecto mientras se realizan los clculos. Las variables en s mismas no cambian su tipo. Las reglas de conversin de tipos hacen que el resultado de una operacin sea siempre el mismo que el de la variable ms larga que intervenga en ella. Sin embargo, podemos forzar a que el resultado sea de un tipo en particular, de la siguiente forma:

(tipo) valor donde tipo es el tipo al que queremos que pertenezca valor.

El siguiente ejemplo nos aclarar todo esto: int a = 250, b = 10; long c; c = a * b; Tal como explicamos, c no contendr el valor 2500 como podra parecer a simple vista, por que el tipo de c no se modica. CCS calcula a * b y obtiene efectivamente el resultado 2500, pero c slo contendr los 8 bits menos signicativos de ese resultado, es decir, el decimal 196. Si hubisemos hecho:

int a = 250, b = 10; long c; c = (long) (a * b);

Computadoras Electrnicas el valor almacenado en c hubiese sido efectivamente 2500.

53

6.4.

Operadores

En CCS los operadores cumplen un rol importante. Quizs C sea uno de los lenguajes que mas operadores tiene. Una expresin es una combinacin de operadores y operandos. En la mayora de los casos, los operadores de CCS siguen las mismas reglas que en lgebra, y se llaman de la misma manera.

Operador += -= *= /= %= <<= >>= &= |= = =

Descripcin Asignacin de suma Asignacin de resta Asignacin de multiplicacin Asignacin de divisin Asignacin de resto de divisin Asignacin de desplazamiento a la izquierda Asignacin de desplazamiento a la derecha Asignacin de AND de bits Asignacin de OR de bits Asignacin de OR exclusivo de bits Asignacin de negacin de bits Tabla 6.3: Operadores de asignacin

54 Operador + * / %

Gustavo A. Yarce Descripcin Ejemplo Suma (enteros o reales) resul = var1 + var2 Resta (enteros o reales) resul = var1 - var2 Multiplicacin (enteros o reales) resul = var1 * var2 Divisin (enteros o reales) resul = var1 / var2 Cambio de signo en enteros o reales 0 Mdulo; resto de una divisin entera rango = n [A1] % 256 Tabla 6.4: Operadores aritmticos

Operador < > <= >= == =

Descripcin Menor que Mayor que Menor o igual que Mayor o igual que Igual a Distinto de

Tabla 6.5: Operadores de relacin

Operador ! && ||

Descripcin NO lgico Y lgico O lgico

Tabla 6.6: Operadores lgicos

Operador & |

Descripcin Negacin de bits (complemento a 1) Y de bits (AND) O exclusivo de bits (EXOR) O de bits (OR)

Tabla 6.7: Operadores de manejo de bits

Computadoras Electrnicas

55

6.5.

Prembulo

La seccin del prembulo dene, tipo de microcontrolador a utilizar, fusibles, clock, etc. Un ejemplo de esto es:

#include<16f84a.h> #fuses nowdt, xt,put,noprotect #use delay(clock=4000000) #byte port_b = 0x06 #use standard_io(A)

/*Seleccin del PIC*/ /*Configuracin de fusibles*/ /*Velocidad del clock*/ /*Define la direccin del puerto b*/ /*Definicin del puerto A*/

Dentro del prembulo se encuentra la denicin para la funcionalidad de los puertos. Para usar los puertos como entrada o salida digital, CCS provee directivas y funciones predenidas para el uso de los puertos de E/S digital. Las funciones output_X() e input_X() dependen de la directiva de conguracin que usemos.

6.5.1.

#INCLUDE

Permite incluir en nuestro programa uno o mas archivos (conocidos como header le) que posean extensin .h. Estos archivos contienen informacin sobre funciones, sus argumentos, el nombre de los pines de un modelo determinado de PIC o cualquier otra cosa que usemos habitualmente en nuestros programas. Esto permite no tener que escribir un montn de cosas cada vez que comenzamos un programa nuevo: basta con incluir el .h correspondiente. La forma de utilizar esta instruccin es la siguiente: #INCLUDE <archivo>Esto har que el contenido de <archivo>se compile junto con nuestro programa. Por ejemplo: #INCLUDE <PIC16F877A.H>

56

Gustavo A. Yarce

6.5.2.

#FUSES

Permite modicar el valor de los fuses del microcontrolador que estamos empleando. Los valores posibles dependen de cada microcontrolador en particular, y los valores posibles se cargan al utilizar #INCLUDE seguido del archivo correspondiente. La forma de #FUSES es la siguiente: #FUSES opciones donde opciones es una lista de las opciones posibles separadas mediante comas. Antes de seguir, recuerda que puedes ver dentro del archivo con extensin .h correspondiente cuales son los valores posibles para ese microcontrolador. Estn al comienzo del archivo, en forma de comentarios. Algunos valores comunes son: Tipo de oscilador: LP, XT, HS, RC Wach Dog Timer: WDT, NOWDT Proteccin de cdigo: PROTECT, NOPROTECT Power Up Timer: PUT, NOPUT Brown Out Reset: BROWNOUT, NOBROWNOUT Ejemplos: #fuses xt,nowdt,noprotect,noput

6.5.3.

#DEFINE

La instruccin #dene tiene la siguiente forma: #DEFINE <label>value es la etiqueta que usaremos en nuestro programa. Y value es el valor que estamos asignando a esta etiqueta. Las instrucciones #DEFINE no generan codigo ASM, si no que el preprocesador realiza los reemplazos que ellas indican en el momento de la compilacin.

Computadoras Electrnicas

57

El uso de #DEFINE permite construir programas ms ordenados y fciles de mantener. Veamos algunos ejemplos de #DEFINE

#DEFINE TRUE 1 Cada vez que en nuestro programa aparezca la etiqueta TRUE, el precompilador la reemplazar por 1.

#DEFINE pi 3.14159265359

Cada vez que en nuestro programa aparezca la etiqueta pi, el precompilador la reemplazar por 3.14159265359.

6.5.4.

#USE DELAY (CLOCK=frecuencia)

Esta directiva indica al compilador la frecuencia del procesador, en ciclos por segundo, a la vez que habilita el uso de las funciones DELAY_MS() y DELAY_US(). Opcionalmente podemos usar la funcin restart_WDT() para que el compilador reinicie el WDT durante el retardo. Ejemplos:

#use delay (clock=20000000) #use delay (clock=32000, RESTART_WDT)

58

Gustavo A. Yarce

6.6.

Directivas
#use fast_io (puerto): No modica el registro TRIS en lecturas y escrituras. Hay que asegurarse de que los pines est congurados correctamente. #use standar_io (puerto): Modica el registro TRIS correspondiente en lecturas y escrituras. (Modo por defecto) #use xed_io (puerto): Congura el puerto y no modica el registro TRIS en lecturas y escrituras.

Las Directivas que provee CCs:

#include <16f873a.h> #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP #use delay (clock=4000000) #use fixed_io(a_outputs=PIN_A0,PIN_A1) //A0,A1 como salidas en porta #use standard_io(b) #use fast_io(c) void main(void) { int aux; set_tris_c(0xFE); /* puerto c como salida RC0 */

La conguracin como entrada o salida se hace a travs del registro TRISx correspondiente del banco 1 de la memoria. Para congurar los puertos se utiliza la funcin set_tris_X(valor). Se puede leer la conguracin de los puertos con la funcin get_tris_X(valor). set_tris_A (0x3F) /* Puerto A como entradas.*/

CCS tiene funciones predenidas para el uso de los puertos de E/S digital. Los parmetros de estas funciones estn denidos en un chero include . Las funciones pueden tratar el puerto completo, a travs de las instrucciones output_X() e input_X(). Tambin se pueden operar a nivel de bit, con un formato PIN_Xn donde X es el puerto y n el bit.

Computadoras Electrnicas output_low(PIN_Xn) /*pone a 0. */ output_high(PIN_Xn) /*pone a 1. */ output_bit(PIN_Xn,valor) /*pone el pin Xn a valor (0 1). */ output_toggle (PIN_Xn) /*complementa el valor del pin */ output_oat (PIN_Xn) /*Pin como entrada (simula d. ab. */ input_state(PIN_Xn) terminal. */

59

/*Lee el valor del pin sin cambiar el sentido del

input(PIN_Xn) /*Lee el valor del pin. */

6.6.1.

#USE FAST_IO (puerto)

Cada vez que se emplea una funcin output( ) se saca el valor directamente al puerto, y cada vez que se emplea una funcin input( ) se lee el puerto, pero no se modica previamente el registro TRIS correspondiente. El usuario debe asegurarse de que los registros TRIS estn cargados adecuadamente antes de llamar a las funciones. Esta directiva se utiliza para optimizar el cdigo generado por el compilador cuando se utilizan funciones de manejo de entrada y salida como input(pin) denidas ya en CCS. Esta directiva afecta al cdigo que el compilador generar para las instrucciones de entrada y salida. Este mtodo rpido de hacer I/O ocasiona que el compilador realice I/O sin programar el registro de direccin. El puerto puede ser A-G. Ejemplo:

#use fast_io(A)

60

Gustavo A. Yarce

6.6.2.

#USE FIXED_IO (puerto_OUTPUTS=pin_x#, pin_x#...)

Se genera cdigo relativo a la direccin de los datos de manera previa cada vez que aparece una funcin integrada del tipo input( ) output( ), pero los pines se conguran de acuerdo con la informacin que acompaa a la directiva (slo se indican los pines de salida) y no dependiendo de que la operacin sea de entrada o de salida como sucede con #USE STANDARD_IO (PUERTO). Esta directiva afecta al cdigo que el compilador generar para las instrucciones de entrada y salida. El mtodo jo de hacer I/O causar que el compilador genere cdigo para hacer que un pin de I/O sea entrada o salida cada vez que se utiliza. Esto ahorra el byte de RAM usado en I/O normal.

Ejemplo:

#use xed_io(a_outputs=PIN_A2 ,PIN_A3)

6.6.3.

#USE STANDARD_IO (puerto)

Cada vez que se emplea una funcin output( ) se inserta un cdigo previo para forzar a que el bit particular o el puerto completo sean de salida (mediante la carga del TRIS correspondiente) Si se trata de funcin input( ) se carga el cdigo para denir bit o puerto completo como entrada. Esta es la opcin activada por defecto. Esta directiva afecta al cdigo que el compilador genera para las instrucciones de entrada y salida. El mtodo estndar de hacer I/O causar que el compilador genere cdigo para hacer que un pin de I/O sea entrada o salida cada vez que se utiliza. Ejemplo:

#use standard_io(A)

Computadoras Electrnicas input_x( ) Devuelve el estado del puerto especicado Ejemplo:

61

x=input_a() ;

6.6.4.

output_x(valor)

Escribe el byte especicado en el puerto indicado. Ejemplo:

output_a(255) ;

6.6.5.

INPUT(pin)

Devuelve el estado 0 o 1 del pin. El mtodo de acceso de I/O depende de la ltima directiva #USE *_IO utilizada. El valor de retorno es un entero corto. Ejemplo:

while ( !input(PIN_B1) );

6.6.6.

OUTPUT_BIT(pin, value)

Esta funcin saca el bit dado en value(0 o 1) por el pin de I/O especicado. El modo de establecer la direccin del registro, est determinada por la ltima directiva #USE *_IO. Ejemplo:

62 output_bit( PIN_B0, 0);

Gustavo A. Yarce // es lo mismo que output_low(pin_B0);

6.6.7.

OUTPUT_HIGH(pin)

Pone a uno el pin indicado. El mtodo de acceso de I/O depende de la ltima directiva #USE *_IO utilizada.

Ejemplo: output_high(PIN_A0);

6.6.8.

OUTPUT_LOW(pin)

Pone a cero el pin indicado. El mtodo de acceso de I/O depende de la ltima directiva #USE *_IO.

Ejemplo:

output_low(PIN_A0);

6.6.9.

SET_TRIS_puerto(value)

Estas funciones permiten escribir directamente los registros tri-estado para la conguracin de los puertos. Esto debe usarse con FAST_IO() y cuando se accede a los puertos de I/O como si fueran memoria, igual que cuando se utiliza una directiva #BYTE. Cada bit de value representa un pin. Un 1 indica que el pinl es de entrada y un 0 que es de salida.

Ejemplo:

Computadoras Electrnicas SET_TRIS_B( 0x0F );

63

6.6.10.

delay_ms(time)

Esta funcin realiza retardos del valor especicado en time. Dicho valor de tiempo es en milisegundos y el rango es 0-65535. Para obtener retardos ms largos as como retardos variables es preciso hacer llamadas a una funcin separada; vase el ejemplo siguiente. Es preciso utilizar la directiva #use delay(clock=frecuencia) antes de la llamada a esta funcin, para que el compilador sepa la frecuencia de reloj.

Ejemplo:

#include <16f628a.h> #fuses xt, nowdt, put #use delay(clock=4000000) #use fast_io(a) void main() { set_tris_a(0b00000000); int ba; output_low(pin_a0); do { delay_ms(1000); ba=input(pin_a0); if (ba==0) output_high(pin_a0); else output_low(pin_a0); } while(0==0); }

64

Gustavo A. Yarce

Captulo 7 Interrupciones
7.1. Introduccin

Las llamadas a las subrutinas mediante instrucciones del tipo CALL son desviaciones del ujo de control del programa originadas por instrucciones, por lo que se consideran sncronas. Se producen cada vez que se ejecuta dicha instruccin. La interrupciones son desviaciones del ujo de control del programa originadas asncronamente por diversos sucesos que no se hallan bajo la supervisin de las instrucciones. Dichos sucesos pueden ser externos al sistema, como la generacin de un anco o nivel activo en una pin del microcontrolador, o bien, internos, como el desbordamiento de un contador. El comportamiento del microcontrolador ante la interrupcin es similar al de la instruccin tipo CALL de llamada a subrutina. En ambos casos se detiene la ejecucin del programa en curso, se salva la direccin actual del PC en la Pila y se carga el PC con una direccin, que en el caso de CALL viene acompaando a la misma instruccin, y en el caso de una interrupcin es una direccin reservada de la memoria de cdigo, llamada Vector de Interrupcin que da paso a un trozo de cdigo denominado Rutina de Servicio de la Interrupcin (RSI). La RSI suele comenzar guardando en la memoria de datos algunos registros especcos del procesador. Concretamente aquellos que la RSI va a emplear y va a alterar su contenido. Antes del retorno al programa principal se recuperan los valores guardados y se restaura completamente el estado del procesador. Algunos procesadores salvan estos registros en la Pila, pero los PIC no disponen de instrucciones para meter (push) y sacar (pop) informacin de la Pila, utilizando para este n registros de propsito general de la memoria de datos. Los PIC16F84 pueden ser interrumpidos por 4 causas diferentes, pero todas ellas desvan el ujo de control a la direccin 0004 H, por lo que otra de las operaciones iniciales de la RSI es averiguar cul de las posibles causas ha sido la 65

66

Gustavo A. Yarce

responsable de la interrupcin en curso, para ello se exploran los sealizadores de las fuentes de interrupcin. Los PIC16F873 tienen 13 causas posibles de interrupcin. Algunas de las causas son: 1. Desbordamiento del Timer1 2. Desbordamiento del Timer2 3. Captura o comparacin en el mdulo CCP1 4. Captura o comparacin en el mdulo CCP2 5. Transferencia en el pin serie sincrono 6. Colisin de bus en el pin serie sincrono 7. Fin de la transmisin en la USART 8. Fin de la recepcin en la USART 9. Fin de la conversin en el conversor A/D

7.1.1.

El Registro de Control de Interrupciones INTCON

Se trata de un registro lectura y escritura, se halla en los 4 bancos del PIC(0Bh,8Bh,10Bh y 18Bh).

GIE 7

PEIE 6

TOIE 5

INTE 4

RBIE 3

TOIF 2

INTF 1

RBIF 0

Tabla 7.1: Registro INTCON

GIE: Permiso Global de Interrupciones 0: Prohbe todas las interrupciones. 1: Permite la ejecucin de todas las interrupciones, cuyos bits de permiso individuales tambin las permitan.

Computadoras Electrnicas PEIE: Permiso de Interrupcin de los perifricos 0: Prohbe que se produzca esta interrupcin. 1: Permite que se origine esta interrupcin. T0IE: Permiso de Interrupcin por sobrepasamiento del TMR0 0: Prohbe esta interrupcin. 1: Permite una interrupcin al desbordarse el TMR0. INTE: Permiso de Interrupcin por activacin de la pin RB0/INT 0: Prohbe esta interrupcin. 1: Permite la interrupcin al activarse RB0/INT. RBIE: Permiso de Interrupcin por cambio de estado en RB7-RB4 0: Prohbe esta interrupcin 1: Permite esta interrupcin. T0IF: Sealizador de sobrepasamiento del TMR0 0: Indica que el TMR0 no se ha desbordado. 1: Toma este valor cuando ha ocurrido el desbordamiento. INTF: Sealizador de activacin de la pin RB0/INT 0: Indica que RB0/INT an no se ha activado. 1: Se pone a 1 al activarse RB0/INT. RBIF: Sealizador de cambio de estado en las pins RB7-RB4 0: No ha cambiado el estado de RB7-RB4. 1: Pasa a 1 cuando cambia el estado de alguna de esas lneas.

67

7.1.2.

Registro de permiso de interrupciones 1 (PIE1)

Contiene los bits que permiten o prohiben las interrupciones provocadas por los perifricos internos del microcontrolador y que no estaban contempladas en INTCON. Ocupa la direccin 8Ch y para que cumplan su funcin los bits PIE1 es necesario que PEIE=1 en INTCON<6>

68 PSPIE 7 ADIE 6 RCIE TXIE 5 4 SSPIE 3 CCPIIE 2

Gustavo A. Yarce TMR2IE 1 TMR1IE 0

Tabla 7.2: Registro PIE1 PSPIE: Permiso de interrupcin para la puerta paralela esclava al realizar una operacin de lectura/escritura(solo 40 pines) ADIE: Permiso de Interrupcin para el conversor la conversin. A/D al finalizar

RCIE: Permiso de Interrupcin para el receptor del USART cuando el buffer se llena. TXIE: Permiso de Interrupcin para el transmisor del USART cuando el buffer se vaca SSPIE: Permiso de Interrupcin para el pin serie sncrona CCP1IE: Permiso de interrupcin para el mdulo CCP1 cuando se produce una captura o comparacin. TMRR2IE: Permiso de interrupcin para el TMR2 con su desbordamiento TMR1IE: Permiso de interrupcin para el TMR1 con su desbordamiento

7.1.3.

Registro de permiso de interrupciones 2 (PIE2)

Contiene los bits de permiso de interrupcin de las tres causas que no guraban en PIE1. La de n de escritura en la EEPROM, colisin de bus en el modo SSP y produccin de una captura o una comparacin en el mdulo CCP2.

EEIE

Permiso de interrupcin por fn de escritura en la EEPROM de datos

Computadoras Electrnicas - 0 - EEIE 7 6 5 4 BCLIE 3 - - CCP2IE 2 1 0

69

Tabla 7.3: Registro PIE2

BCLIE: Permiso de Interrupcin por colisin de bus en el SSP cuando dos o ms maestros tratan de transferir al mismo tiempo. CCP2IE: Permiso de Interrupcin en el mdulo CCP2

7.1.4.

Registro sealizador de interrupciones 1 y 2(PIR1 y PIR2)

En correspondencia con los bits de permiso/prohibicin de las causas de interrupcin vistas en los registros PIE1 y PIE2, existen otros dos registros, PIR1 y PIR2, cuyos bits actan de sealizadores del momento en el que se origina la causa que provoca la interrupcin, independientemente sin esta permitida o no. Ocupan las direcciones 0Ch y 0Dh.

PSPIF 7

ADIF 6

RCIF TXIF 5 4

SSPIF 3

CCP1IF TMR2IF 2 1

TMR1IF 0

Tabla 7.4: Registro PIR1

- 0 - EEIF 7 6 5 4

BCLIF - - CCP2IF 3 2 1 0

Tabla 7.5: Registro PIER2

70

Gustavo A. Yarce

7.2.

Interrupciones en CCs

Las interrupciones permiten a cualquier evento interno o externo, interrumpir la ejecucin del programa principal en cualquier momento. Cuando se produce una interrupcin, el microcontralador realiza un salto a la rutina de atencin a la interrupcin. Al nalizar la atencin de la interrupcin el microcontralador retorna a la ejecucin del programa principal en la misma posicin del programa donde se produjo la interrupcin. Las interrupciones en CCs poseen el siguiente formato:

#int_xxx indica que la funcin que le sigue es una funcin de interrupcin. Los nombres para las funciones son:

Nombre de la funcin operacin #INT_AD Conversin AD completa #INT_BUSCOL Colisin de bus #INT_CCP1 Unidad 1 de captura, comparacin y PWM #INT_CCP2 Unidad 2 de captura, comparacin y PWM #INT_COMP Comparador #INT_EEPROM Escritura EEPROM nalizada #INT_EXT Interrupcin externa, RB0 #INT_RB Cambio de estado en RB4-RB7 #INT_RDA RS232 dato recibido #INT_RTCC Desbordamiento del Timer 0 (RTCC) #INT_SSP Actividad en SPI o I2C #INT_TBE RS232 buer de transmisin vaco #INT_TIMER1 Desbordamiento del Timer1 #INT_TIMER2 Desbordamiento del Timer2 Tabla 7.6: Interrupciones

Computadoras Electrnicas Otras directivas para el manejo de interrupciones, como: enable_interrupts(valor);

71

Esta instruccin permite habilitar la mscara de la interrupcin que se pretende hacer funcionar, los valores permitidos para esta instruccin son:

GLOBAL INT_RTCC INT_TIMER0 INT_EXT INT_RB INT_AD INT_RDA INT_TBE INT_SSP INT_CCP1 INT_TIMER2 INT_TIMER1 INT_EEPROM INT_BUSCOL INT_CCP2 Tabla 7.7: Valores de habilitacin de interrupciones

La instruccin que deshabilita una interrupcin o todas es: disable_interrupts(valor);

En resumen: enable_interrups(nivel); habilita la interrupcin especicada disable_interrups(nivel); deshabilita la interrupcin especicada

72

Gustavo A. Yarce

7.2.1.

Interrupcin por RB0


#int_ext

La funcin a utilizar es la siguiente:

Esta directiva debe acompaarse por alguna de estos dos directivas, que determinarn el anco en que se produce la interrupcin: ext_int_edge(h_to_l); anco de bajada ext_int_edge(l_to_h); anco de subida

Ejemplo 7.1 //**********************************************************


//*** Realiza el cambio de estado en el pin B7 cada vez //*** que se produce una pulsacin en RB0 //********************************************************** #include <16f873a.h> #fuses xt,nowdt,noprotect,nowrt #use delay(clock=4000000) #use fast_io(b) #int_ext //int cambio=0; void inter() { output_toggle(pin_b7); } void main() { set_tris_b(0x01); output_low(pin_b7); enable_interrupts(int_ext); ext_int_edge(l_to_h); enable_interrupts(global); do{ } while(0==0); }

//b0 como salida //apaga el led //habilita inteterrupcin en rb0 //flanco de subida //habilita las interrupciones en forma global

Computadoras Electrnicas

73

7.2.2.

Interrupcin por RB7-RB4


#int_rb

La funcin a utilizar es la siguiente:

Otras directivas asociadas a las interrupciones son: clear_interrupt(int_rb); //borra los ags del registro enable_interrupts(int_rb); //activar interrupcion rb4:rb7

74

Gustavo A. Yarce

Captulo 8 Puerto Serie


8.1. Introduccin

La comunicacin serial, transmite un bit a la vez, por lo cual es mucho ms lenta, pero posee la ventaja de que necesita un menor nmero de lneas para la transferencia de la informacin y las distancias a la cual se puede realizar el intercambio, es mayor; a esto se suma que dispositivos como modems, la comunicacin se puede extender prcticamente a cualquier lugar del planeta. Existen dos formas de comunicacin serial: sincrnica y asincrnica. En la comunicacin sincrnica, adems de la lnea sobre la que se transeren los datos, se necesitan otra que contenga pulsos de reloj que indiquen cuando un dato es vlido; la duracin del bit est determinada por la duracin del pulso de sincronismo. En la comunicacin asincrnica, los pulsos de reloj no son necesarios y se acuden a otros mecanismos para realizar la lectura/escritura de los datos; la duracin de cada bit est determinada por la frecuencia de referencia con la cual se realiza la transferencia de datos.

8.2.

Handshaking

Para establecer una comunicacin adecuada, los dispositivos normalmente proveen seales que informan los unos a los otros si ellos tienen algn dato para transmitir o si estn listos para recibirlos. Si un dispositivo enva un caracter a otro que en ese momento est ocupado ejecutando alguna otra tarea, la informacin se perdera. Handshaking es el proceso de usar seales para establecer una correcta comunicacin. Por ejemplo, para informar al receptor que hay datos disponibles el transmisor activa una seal llamada Request To Send (RTS). Esta seal 75

76

Gustavo A. Yarce

interrumpe al receptor el receptor mismo la sensa por un proceso de polling. Cuando el receptor detecta esta seal naliza lo que est haciendo y le informa al transmisor con una seal llamada Clear To Send (CTS) que est listo para recibir datos. El transmisor no transmite ningn dato hasta que su entrada CTS est activada. Las seales de handshaking tienen diferentes nombres en diferentes sistemas .Seales adicionales de handshaking estn presentes en sistemas ms avanzados. Las comunicaciones de ida y vuelta (two-way) requieren varias seales, mientras que para comunicaciones de una sola direccin (one-way) slo hacen falta dos seales de handshaking (una entrada y una salida) como por ejemplo en el caso de adquisicin de datos de un sensor donde la computadora est solamente recibiendo datos y el sensor slo transmite datos. Una transmisin serie de datos exige que entre el emisor y el receptor se establezcan normas exactas (protocolo) que determinen las formalidades de la transmisin. Entre ellas guran la velocidad de transmisin (bit/segundos baud rate), el formato externo de la cadena de seales, la sincronizacin y el chequeo de los datos.

8.3.

Comunicaciones seriales en los PC

En los computadores se pueden tener hasta 4 puertos de comunicacin serial RS-232, denominados COM1, COM2, COM3 y COM4; para utilizarlos se debe realizar una conguracin previa de los parmetros de la comunicacin y aunque el sistema operativo y los programas utilizan valores por defecto, no siempre son los mismos. Existen varias formas de establecer los parmetros para la comunicacin serial asincrnica con cualquiera de los puertos.

Figura 8.1: Puerto Serie

Computadoras Electrnicas

77

Cuando no se realiza ninguna transferencia de datos, la lnea del transmisor es pasiva (idle) y permanece en un estado alto. Para empezar a transmitir datos, el transmisor coloca esta lnea en bajo durante el tiempo de un bit, lo cual se conoce como bit de arranque (star bit) y a continuacin, empieza a transmitir, con el mismo intervalo de tiempo, los bits correspondientes al dato ( que pueden ser 7 u 8 bits), empezando por el ms signicativo (LSB), y terminando con el ms signicativo (MSB); al nalizar, se agrega el bit de paridad (Parity bit), si es que est activada la opcin, y los bits de parada (Stop bit), que pueden ser 1 2, en los cuales la lnea regresa a un estado alto. Al concluir esta operacin, el transmisor estar preparado para transmitir el siguiente dato. El receptor mientras tanto, no est sincronizado con el transmisor y desconoce cuando va a recibir datos. La transicin de alto a bajo de la lnea del transmisor activa al receptor y ste genera un conteo de tiempo de tal manera que realiza una lectura de la lnea medio bit despus del evento; si la lectura realizada es un estado alto, asume que la transicin ocurrida fue ocasionada por ruido de lnea; si por el contrario la lectura es un estado bajo, considera como vlida la transicin y empieza a realizar lecturas secuenciales a intervalos de un bit, hasta conformar el dato transmitido. El receptor puede tomar el bit de paridad para determinar la existencia o no de errores y realizar las acciones correspondientes, al igual que los bits de parada para situaciones similares. En la g. 8.4 se transmite un dato binario 0 0 0 1 1 0 1 0, el cual es dato de 8 bits, y como parmetros adicionales poseen 1 bit de parada y ningn bit de paridad.

8.4.

RS-232 .Voltajes y niveles lgicos

Los niveles de voltaje utilizados por RS-232 son marcadamente diferentes a aquellos utilizados en un sistema de micrcomputador ya que TTL no tiene suciente margen de ruido para manejar largos cables en ambientes ruidosos . Los niveles de lgica TTL son: para un 1 lgico corresponde a una tensin entre +2.4 y 5V y para un 0 a tensiones entre 0 y 0.8V. En RS-232: 1 es representado por voltajes entre -3 y -25V (low) 0 es representado por voltajes entre +3 y +25V (high) Dada la diferencia de niveles lgicos de tensin de entre TTL y RS-232 se hace necesaria la adaptacin de los voltajes de una a otra y viceversa ,esto se realiza mediante el uso de chips de desplazamiento (shift) de nivel llamados line driver y line receiver que adems permiten que las seales sean enviadas a mayor distancia.

78

Gustavo A. Yarce

Figura 8.2: Niveles Lgicas Puerto Serie

8.5.

La velocidad de transmisin de datos

Puede ser expresada como bits por segundo y se reere a la velocidad a lo largo del par trenzado. Ha de tenerse presente que en una velocidad de transmisin de datos solamente 8 de los 10 o 11 bits de cada palabra transmitida son datos, un bit de los tres restantes es utilizado como bit de comienzo (bit de start) y los dos restantes como bits de parada (bits de stop). Cualquier frecuencia de transmisin puede ser establecida en un UART, ajustando la frecuencia de reloj. Hay 8 velocidades de transmisin asncrona normalmente utilizadas: 110 bps (bits por segundo) 150 bps 300 bps 600 bps 1200 bps 2400 bps 4800 bps 9600 bps

Computadoras Electrnicas

79

8.6.

RS-232

RS-232 es una interfaz digital, planeada para comunicar a no ms de 50 pies y a 20000 bps, (especicaciones segn la norma). La comunicacin se realiza mediante 25 conductores independientes, cada uno con su propia tarea. Las lneas estn encendidas cuando el nivel de voltajes de -3volts o inferior, o en nada si el voltaje es intermedio. El control de ujo permite a un dispositivo que recibe decir al que enva, Alto!, mi memoria temporal (buer - una pequea cantidad de memoria dentro de la impresora) se est desbordando - detente un momento y estar de regreso muy pronto, luego imprime lo que tiene en su memoria temporal y dice, Listo! Ya estoy listo para ms. TXD Transmitir Datos Seal de salida RXD Recibir Datos Seal de entrada RTS Solicitud de envio Seal de salida DTR Terminal de datos listo Seal de salida CTS Libre para envio Seal de entrada DSR Equipo de datos listo Seal de entrada DCD Deteccin de portadora Seal de entrada SG Tierra Referencia para seales RI Indicador de llamada Seal de entrada

8.6.1.

Secuencia de eventos en una sesin RS-232

1. Ambos dispositivos estn encendidos e indican ese estado - power up encendido. El DTE energiza la lnea 20 (DTR). El DCE energiza la lnea 6 (DSR). Una interfaz RS-232 bien diseada no prosigue la comunicacin hasta que estas dos lneas estn activadas. El DTE espera que aparezca seal en la lnea 6, el DCE en la lnea 20. Las lneas 6 y 20 son exclusivamente para seales de vericacin del equipo, pero algunas veces son utilizadas como lneas de control de ujo.

80

Gustavo A. Yarce 2. Un mdem se conecta con otro mdem. La comunicacin de datos no sirve sin tener alguien con quien comunicarse. As que lo siguiente ( en una situacin mdem/terminal, que es la prevista por los diseadores de RS-232 ) es marcar a un mdem remoto. Los modems intercambian seales portadoras ( el sonido de tono alto que se escucha cuando los modems hacen conexin ), y el mdem se lo informa a la terminal en la lnea 8 ( DCD ). Por cierto, si se tiene un mdem con luces rojas, ver las actividades anteriores indicadas por las luces. La lnea 6 est conectada a la lnea 20 ( Terminal Ready - Terminal lista ); y la lnea 8 est conectada a la luz rotulada CD ( Carrier Detec - Portadora detectada ), 3. La terminal (DTE) pregunta al mdem (DCE) se est listo. La terminal energiza la lnea 4, RTS. El mdem, si esta listo, responde con la lnea 5, CTS. Ahora est terminado el procedimiento de enlace ( handshake). Las lneas 4 y 5 son lneas de control de ujo. 4. Se lleva a cabo el intercambio de datos. La terminal (DTE) pasa informacin para que el mdem (DCE) la transmita por la lnea 2. El mdem pasa informacin de regreso a la terminal por la lnea 3.

8.6.2.

El cable ms simple

Un cable directo conecta un conductor de la lnea 1 del primer lado a la lnea 1 en el segundo lado, otro de la lnea 2 en el primer lado a la lnea 2 en el segundo lado, otro de la lnea 3 en el primer lado a la lnea 3 en el segundo lado y as sucesivamente. El cable estndar de PC a mdem es un ejemplo de esto. RS-232 fue diseado pensando en este cable.

8.6.3.

Diseo de cables para impresoras serie y para transferencias PC a PC

Muchos cables son solo una variacin del cable directo. Preguntndonos, qu clase de cable conectara una impresora a una PC? Bien, tanto la impresora como la PC tienen interfaces DTE. De acuerdo a la norma RS-232, no se pueden conectar directamente dos interfaces DTE. Estn hechas para conectar un mdem a la PC ( recuerde que el mdem es DCE), conecte un mdem a la impresora, y luego conecte los dos mdems con el cable telefnico ms corto del mundo. Qu debe ser diferente para que dos dispositivos DTE se comuniquen entre s?. Primero, ambos estn tratando de transmitir en la lnea 2 y recibir en la lnea 3. La solucin aqu es muy fcil - slo hay que cruzar 2 y 3:

Computadoras Electrnicas 23 32 77

81

Aunque se dejan fuera todas las lneas de control fuera, suele funcionar. Porqu? La mayor parte no tienen necesidad de lneas de control en absoluto siempre y cuando no se requiera control de ujo - esto es, mientras cada lado pueda alcanzar al otro. Cmo se sabe qu lneas de control usa su programa, si es que usa? Repuesta: Se experimenta hasta que se determina qu funciona. A continuacin, necesitamos resolver las lneas indicadoras de encendido 6 y 20. Como antes, ambos dispositivos son DTE, as que ambos energizan la lnea 20 y ambos detectan actividad con la lnea 6. Como ninguno de ellos activa la lnea 6, van esperar permanentemente. Se puede resolver esto en una de dos formas. Una conserva el procedimiento de enlace, la otra no. El mtodo que conserva el enlace es con cruzamientos: la 6 del lado 1 a la 20 del lado 2 y la 20 del lado 1 a la 6 del lado. Lo cual lleva nuestro cable a la siguiente conguracin: 23 32 6- 20 77 20 -6 Pero existe otra forma. Considere que cada lado desea ver actividad en la lnea 6 aproximadamente al mismo tiempo que se suministra seal en la lnea 20. Porqu no dar vuelta en redondo a las lneas sobre su propio lado de tal modo que cada quien oprima sus propios botones? 23 32 77 6- 20 20 6 Cul solucin es mejor? Depende. Si el equipo realmente utiliza 6 y 20, y se necesita el dilogo de enlace, utilice el cable con cruzamientos. Si se est usando equipo que realmente no necesita las lneas 6 y 20 no importa. Si se estn corriendo cables largos y el nmero de conectores de cada cable es importante en cuanto a su costo, es mejor la solucin sin dilogo de enlace. Algunas veces solo desea uno que la mquina trabaje y se preocupar del control de ujo despus. Hay una situacin

82

Gustavo A. Yarce

similar con RTS/CTS, as que se pueden cruzar los cables 4 y 5 o puentear 4 a 5 de cada lado. Hago lo primero en el cable mostrado a continuacin. 2-3 3-2 4-5 5-4 6 20 7-7 20 6 Finalmente, no olvide la lnea DCD. Algunos programas requieren denitivamente ver la DCD antes de continuar. Puesto que 8 es entrada para ambos lados, hurtaremos una lnea activa para satisfacerla. 2-3 3-2 4-5 5-4 620 - 8 7-7 8 - 20-6

8.7.

Ingreso de datos

Figura 8.3: Conexin del micro al Puerto Serie

Computadoras Electrnicas

83

8.8. 8.9.

USB Introduccin

Las computadores personales actuales an conservan los puertos heredados desde que se dise el primer PC de IBM. Por razones de compatibilidad an seguirn subsistiendo este tipo de puertos, pero poco a poco irn apareciendo nuevas mquinas en las que no contaremos con los tpicos conectores serie, paralelo, teclado, etc... y en su lugar slo encontraremos puertos USB. Conectores como el de la salida paralelo (o Centronics), la salida serie (RS232) o el conector del teclado han sufrido muy pocas variaciones. Si bien es cierto que estos conectores todava hoy cumplen su funcin correctamente en casos como la conexin de un teclado o un ratn, se han quedado ya desfasados cuando tratamos de conectar dispositivos ms rpidos como por ejemplo una cmara de video digital. USB (Bus Serie Universal) nace como un estndar de entrada/salida de velocidad media-alta que permite conectar dispositivos que hasta ahora requeran de una tarjeta especial para sacarles todo el rendimiento, lo que ocasionaba un encarecimiento del producto adems de ser productos propietarios ya que obligaban a adquirir una tarjeta para cada dispositivo. Pero adems, USB nos proporciona un nico conector para solventar casi todos los problemas de comunicacin con el exterior, pudindose formar una autntica red de perifricos de hasta 127 elementos. Mediante un par de conectores USB que ya hoy en da son estndar en todas las placas base, y en el espacio que hoy ocupa un slo conector serie de 9 pines nos va a permitir conectar todos los dispositivos que tengamos, desde el teclado al mdem, pasando por ratones, impresoras, altavoces, monitores, scaners, camaras digitales, de vdeo, plotters, etc... sin necesidad de que nuestro PC disponga de un conector dedicado para cada uno de estos elementos, permitiendo ahorrar espacio y dinero. Al igual que las tarjeta ISA desaparecieron, todos los conectores anteriormente citados tambin desaparecern de nuestro ordenador, eliminando adems la necesidad de contar en la placa base o en una tarjeta de expansin los correspondientes controladores para dispositivos serie, paralelo, ratn PS/2, joystick, etc... USB es PnP (Plug and Play) y permite la conexin en caliente, es decir, que

84

Gustavo A. Yarce

se pueden conectar y desconectar los perifricos sin necesidad de reiniciar el ordenador. Caractersticas de USB Cable de 4 hilos. 2 de alimentacin para dispositivos max 0,5A. 2 de transmisin diferencial. Permite suministrar energa elctrica a dispositivos que no tengan un alto consumo y que no estn a ms de 5 metros, lo que elimina la necesidad de conectar dichos perifricos a la red elctrica, con sus correspondientes fuentes de alimentacin, como ocurre por ejemplo con los modem externos. Segmentos de cable de 5m max. Dos tipos de conectores. Hasta 127 dispositivos. Conexin/desconexin en caliente. Autntico Plug & Play. Requiere una sla IRQ para todos los dispositivos. Topologa en estrella, lo que implica la necesidad de dispositivos tipo hub que centralicen las conexiones, aunque en algunos dispositivos como teclados y monitores ya se implementa esta caracterstica, lo que permite tener un slo conector al PC, y desde estos dispositivos sacar conexiones adicionales. Por ejemplo en los teclados USB se suele implementar una conexin adicional para el ratn, o incluso otras para joystick, etc.. y en los monitores varias salidas para el modem, los altavoces...

Figura 8.4: conectores USB

Computadoras Electrnicas

85

Los conectores tipo A se utilizan en el PC y los tipos B suelen utilizarse en los dispositivos USB (tambin existe otro conector mas pequeo). PIN 1 2 3 4 Nombre Desccripcin VBUS +5VDC DData D+ Data + 5VDC Ground

Tabla 8.1: Registro de Estado

8.10.

Objetivos del USB

Apuntan hacia la amigabilidad con el usuario Plug n Play Hot pluggin No tiene que preocuparse por conictos IRQ o insertar tarjetas Conectar hasta 127 dispositivos

Sistema de comunicacin entre dispositivos que slo transmite una unidad de informacin a la vez Todos los dispositivos tienen un sistema de conguracin idntico, incluso un mismo driver sirve para varios dispositivos diferentes. El puerto USB slo necesita una IRQ y una @ de memoria. TODOS los dispositivos usan UNA ID para identicacin. Los puertos standard necesitan 2/3 IRQs, varias DMAs y muchas @ de memoria.

86

Gustavo A. Yarce

8.11.

Descripcin del Sistema

Compuesto por tres partes diferenciadas: HOST USB FUNCIONES HUBS

Velocidades del Bus Hay que decir que el Host es el que controla la velocidad en la que circulan los datos en el bus USB y que al ser un bus compartido, la velocidad real depender de la cantidad de dispositivos que tengamos conectados a el en un momento determinado (mximo 127 incluyendo al Host). Por tanto los datos siguientes son solo tericos y de referencia. Low speed: 1,5 Mbps. Soportado por las especicaciones 1.1, 2.0 y 3.0. Es la velocidad utilizada por dispositivos como teclados, ratones, joystick, etc. Full speed: 12 Mbps. Soportado por USB 1.1, USB 2.0 y USB 3.0. Un ejemplo donde se utilizan estas velocidades es en transmisiones de audio. High speed: 480 Mbps. Solo USB 2.0 y USB 3.0. Ejemplo transmisiones de video. Super speed: 5Gbps solo soportado en dispositivos USB 3.0, y como he dicho antes no conozco ningn microcontrolador que soporte esta especicacin.

8.11.1.

Transferencias

Una transferencia se puede denir como el conjunto global de los datos que forman una comunicacin USB, una transferencia est formada a su vez por una o varias transacciones que a su vez estn formadas por diferentes paquetes de datos que contienen las tramas de una comunicacin USB. No existe un formato nico de transferencia, la especicacin USB permite cuatro tipos de transferencias: Control: se utilizan para congurar y enviar comandos, por ejemplo en la enumeracin del dispositivo, ms adelante veremos lo que es esto.

Computadoras Electrnicas

87

Bulk (masivas): se utilizan cuando se precisa una transferencia de datos grande, es el tipo ms rpido de transferencia, sin embargo no hay garanta de que los datos se transmitan en un tiempo determinado (no garantizada la latencia). Si que hay vericacin de que los datos se han transmitido con xito ya que dispone de sistema de correccin de errores (CRC), esta transferencia solo la pueden utilizar dispositivos que soporten velocidades Full y High Speed. Este tipo de transferencia es utilizada por dispositivos como por ejemplo: discos duros, pen drivers, escaners, impresoras, etc. Iscronas: Es usada en dispositivos que transmiten seales de audio y de vdeo en tiempo real. Se garantiza una tasa de velocidad de transmisin determinada (latencia asegurada). Si no fuera as, por ejemplo en una transmisin de voz el audio se oira entrecortado. No contempla la correccin de errores, si en un archivo de sonido se pierde un BIT, no es importante su recuperacin. Para usar este tipo de transferencia es necesario que los dispositivos soporten velocidades Full Speed. Interrupcin: latencia asegurada y vericacin de que los datos se han transmitido con xito, Se utiliza en dispositivos como: Teclados, Mouse, Sensores, Pantallas tctiles, y dispositivos que no requieran mucho ancho de banda.

Los dispositivos usan uno o ms tipos de transferencia, la de control es utilizada siempre por todos los dispositivos en el proceso de enumeracin. Si se utiliza otra transferencia habr que hacerlo en funcin del tipo y cantidad de datos a transmitir.

En que consiste la Enumeracin? El Host es el encargado de detectar cualquier dispositivo que se conecta al bus. Cuando un dispositivo es detectado el Host necesita obtener informacin sobre el, a este proceso es al que se le llama enumeracin. Esta informacin que necesita el Host se encuentra denida en el dispositivo en los llamados descriptores. Los descriptores son datos que se guardan en la memoria no voltil del PIC y contienen la siguiente informacin: El ID del vendedor (VID) y del producto (PID), consumo de corriente del dispositivo, tipo de transferencia que se va ha utilizar, endpoint utilizados, versin USB soportada, clase utilizada, etc. El VID (Vendor ID) y el PIC (Product ID) son dos nmeros de 16 bits representados en Hexadecimal, si utilizamos la clase CDC (Communications Device

88

Gustavo A. Yarce

Class) de CCS para la comunicacin USB estos valores los podemos modicar en el archivo usb_desc_cdc.h y segn el sistema operativo instalado en el Host deberemos modicarlos tambin en el archivo .inf, pero esto lo veremos ms adelante. Realmente el modicar estos valores solo es til si queremos distribuir nuestro producto comercialmente, en ese caso existe una organizacin llamada USB Implementers Forum que se encarga de proporcionarnos un VID valido, para que nuestro dispositivo conviva sin problemas con el resto de dispositivos USB del mercado, adems tendremos derecho a poner el logo USB en nuestro producto certicando de esta manera que ha pasado los controles pertinentes y cumple con el estndar USB. Todo esto es similar al proceso que se sigue a la hora de obtener una direccin MAC en una tarjeta de red. Si esto no estuviera regulado tal y como est y cada dispositivo tuviera el VID y PID que quisiera, cuando coincidieran en un mismo sistema dos nmeros iguales se presentara un conicto hardware y ambos dispositivos dejaran de funcionar.

Que es un endpoint? Los endpoint son simplemente buer de memoria RAM que son utilizados para el envo y recepcin de datos o comandos de control durante una comunicacin USB. cada endpoint puede ser de entrada o salida de datos o bidireccional, el endpoint 0 est reservado para comandos de control, el proceso de enumeracin se realiza a travs del endpoint nmero 0. Este concepto solo se aplica al dispositivo, en el host existen tambin buer para el envo y recepcin de datos pero no se les denomina con este nombre.

Que es un Pipe o Tubera? Es una conexin lgica entre un endpoint y el software del controlador del host que se produce tras el proceso de enumeracin. Los Pipes se usan mucho en Sistemas Operativos como UNIX/LINUX para enlazar la salida de un proceso con la entrada de otro, en este caso el concepto es el mismo.

Que es una clase? Una clase es un modelo o plantilla que describe el estado y el comportamiento de los objetos que la comparten. La clase provee de propiedades y mtodos (funciones) reutilizables por los objetos o miembros que comparten la clase. Esta denicin general de clase utilizada en la programacin orientada a objetos creo que es la mejor para denir este concepto utilizado en USB. La especicacin USB provee de propiedades y funciones que pueden ser utilizadas por los dispositivos que tengan

Computadoras Electrnicas

89

caractersticas similares. Por ejemplo, un teclado y un ratn por sus caractersticas pertenecern a la misma clase la llamada Human Interface Device (HID), pues bien si yo diseo el rware de un dispositivo con las especicaciones que me exige esta clase podr beneciarme de esas propiedades y funciones comunes a la clase, una ventaja de utilizar esta clase por ejemplo es que no se necesita instalar ningn driver para el dispositivo ya que el sistema operativo utilizar uno genrico para todos. La especicacin USB provee de muchas clases para facilitar la vida al desarrollador de dispositivos, puedes ver una informacin ms precisa de las clases disponibles aqu.

Las clases ms utilizadas con Microcontroladores son: HID (Human Interface Device): ejemplos de dispositivos que utilizan esta clase como hemos dicho ya son: teclados, ratones, pantallas tctiles, joystick, etc. Velocidad low-speed (64 KB/s de velocidad mxima), tipos de transferencias soportadas: de control y de Interrupcin. Una caracterstica interesante al utilizar esta clase es que no se necesita instalar un driver especico en el Sistema Operativo, se utiliza uno estndar que ya est incluido en el sistema. En el S.O Windows la aplicacin de escritorio accede al dispositivo con ayuda de las APIS win32. En Linux veremos como utilizar esta clase en un futuro ejemplo. MSD (Mass Storage Device Class): Como su propio nombre indica para dispositivos de almacenamiento masivo como discos duros, memorias ash, cmaras digitales, dispositivos pticos externos como lectores y grabadoras de CD y DVD, etc. Esta clase se puede utilizar solo en dispositivos que soporten velocidades Full y High Speed. El tipo de transferencias utilizadas es Bulk o una combinacin formada por transferencias del tipo Control, Bulk y Interrupt. Microchip tiene notas de aplicacin sobre esta clase como la AN1003, CCS tambin implementa ejemplos sobre esta clase. No se necesita la instalacin de un driver especco, se utilizan drivers genricos instalados ya en los Sistemas Operativos, en Windows se utiliza el driver llamado usbstor.sys ubicado en C : \ CDC (Communications Device Class): Un ejemplo de dispositivo que utiliza esta clase son los Modems, en este primer ejemplo utilizaremos esta clase para comunicar nuestro PIC18F4550 con la aplicacin de escritorio que realizaremos con un IDE multiplataforma, que nos permitir ejecutar la aplicacin en diferentes sistemas operativos, concretamente en Windows,

90

Gustavo A. Yarce Linux y MAC. La velocidad mxima al utilizar esta clase ser de 80 kBytes/s y el tipo de transferencias soportadas son del tipo interrupcin y Bulk. Utiliza tambin driver estndar incluidos ya en el sistema operativo, segn el sistema operativo utilizado precisar o no de la instalacin del archivo .INF, cuando utilizamos esta clase en el PC nos crear un puerto serie virtual y la comunicacin entre el dispositivo y la aplicacin de escritorio se har a travs de el al igual que se hara con un puerto serie fsico, esto supone una gran ventaja a la hora de disear la aplicacin de escritorio, ya que cualquier IDE de programacin sea del lenguaje que sea, dispone de un componente o librera que permite el acceso al puerto serie fcilmente. Existe una clase genrica llamada Custom Class que se utiliza cuando el dispositivo no se asemeja a las caractersticas de ninguno de los miembros pertenecientes a otras clases. un ejemplo de dispositivo que utiliza esta clase es el ICD2 o ICD3 de Microchip.

Si el rmware de nuestro dispositivo no cumple con las especicaciones de alguna de las clases que se benecia del uso de drivers genricos instalados ya en el sistema operativo no queda otra que disear un driver para nuestro dispositivo, sino el dispositivo no ser reconocido por el PC, disear un driver desde cero es muy complicado ya que se requiere profundos conocimientos tanto de la arquitectura del PC como del Sistema Operativo que tenga instalado. Afortunadamente ya hay drivers personalizados que podemos utilizar en nuestros proyectos, algunos de ellos son los siguientes para los mircocontroladores Microchip: mchpusb.sys es el driver en si y solo est disponible en formato binario. mchpusb.ini este archivo contiene informacin del driver y es requerido por el sistema operativo para que cuando se conecta por primera vez el dispositivo al PC este sepa que driver tiene que asignarle. El S.O tambin obtiene informacin de este archivo para congurar correctamente el dispositivo. Es un archivo de texto que se puede editar y modicar algunas cosas en el, como los valores del VID y PID que deben de coincidir con los denidos en los descriptores del dispositivo, tambin se pueden modicar algunas cadenas de texto que se mostraran como informacin del dispositivo una vez instalado el driver en el S.O, lo dems mejor no tocarlo sino queremos que nuestro dispositivo deje de funcionar.

Computadoras Electrnicas

91

La DLL mpusbapi: una dll es una capa software que en este caso facilita por medio de funciones la comunicacin entre la aplicacin de escritorio y el driver del dispositivo. Esta dll est compilada con el compilador de Borland C++ Builder 6. Microchip facilita su cdigo fuente, por lo que hay dos formas de utilizarla. Si utilizamos el mismo IDE de Borland para crear nuestra aplicacin de escritorio, simplemente tendremos que aadir la librera (el archivo mpusbapi.lib) a nuestro proyecto como una librera ms (ojo la extensin tiene que ser .lib!), si utilizamos otro compilador diferente deberemos de compilar de nuevo los fuentes de la librera para obtener una nueva versin del archivo mpusbapi.lib que sea compatible con el compilador utilizado. La otra opcin de utilizacin de la librera es aadirla a nuestro proyecto de forma dinmica, para ello solo se necesita el archivo con extensin .dll (mpusbapi.dll) proporcionado tambin por Microchip, de esta forma si utilizamos un compilador diferente como los que nos proporciona Microsoft en su plataforma .NET u otros como LabVIEW, Matlab, RealBAsic, etc. No tendremos que modicar el cdigo fuente de la DLL, simplemente la utilizaremos importando las funciones pblicas de la DLL desde nuestra aplicacin de escritorio. Microchip proporciona ejemplos de ambas formas. Como veis todo esto del USB da pie a realizar las cosas de diferentes formas, ms adelante en otro ejemplo veremos ests dos posibilidades. Pero por que utilizar esta opcin y no utilizar siempre las clase CDC, MSD o HID que a priori parece ms fcil su utilizacin? Simplemente porque utilizando un driver personalizado en vez de los genricos que proporciona Windows obtenemos una comunicacin USB ms verstil y con mayores prestaciones. Por ejemplo, en cuanto a velocidad podremos alcanzar velocidades de hasta 1MB/s frente a los 64 KB/s de la clase HID y los 80 kBytes/s de la clase CDC, adems el driver de Microchip soporta todos los tipos de transferencia (Control, Iscronas, Interrup y Bulk), cosa que no ocurre igual si utilizamos las otras clases como ya hemos visto.

Nota importante: cuando utilizamos el driver personalizado de Microchip los datos se transmiten en raw (crudo) y la aplicacin de escritorio intercambia informacin con el PIC directamente a travs de los enpoints utilizados por este, en este caso se usa un protocolo de comunicacin que a priori no est denido. Es importante que copiemos del archivo .INF el valor del campo denido como GUI (Global Unique Identier), que es un nmero que sirve para que la aplicacin pueda acceder al dispositivo, luego accederemos a la dll desde el IDE que hallamos elegido para desarrollar la aplicacin de escritorio editaremos las propiedades y funciones publicas de la dll buscando un campo que se llame GUI (o algo as) y

92

Gustavo A. Yarce

si no coincide tendremos que pegar hay ese nmero, si no lo hacemos no se podr crear la tubera de conexin (pipe) entre nuestra aplicacin y el driver. Cuando utilizamos la clase CDC esto no es necesario ya que la comunicacin est denida a travs del puerto serie virtual creado y la informacin se transmite por defecto en forma de caracteres ASCII al igual que un puerto serie fsico. Otros drivers que podemos utilizar para el PIC 18fx550 son: WinUSB: es el driver genrico para USB que propone utilizar Microsoft cuando nuestro dispositivo no puede ser manejado directamente por los drivers que ya incluye por defecto en su sistema operativo. Para ello al igual que Microchip proporciona los siguientes archivos: Winusb.sys, Winusb.ini y la librera dinmica Winusb.dll que al igual que la dll de Microchip nos proporciona una serie de funciones pblicas para acceder fcilmente al driver y a las APIs win32 de Windows desde nuestra aplicacin de escritorio. Toda la informacin que proporcionada Microsof sobre este driver la podis encontrar en el siguiente enlace. libUSB: Es un driver de cdigo abierto con licencia GNU, se puede instalar en mltiples sistemas operativos como LInux, MAC y otros, incluyendo Windows a travs de su versin libusb-win32. Toda la informacin de este driver lo tenis en la pgina del proyecto. Adems existen ejemplos ya hechos para utilizar con diferentes lenguajes y entornos de programacin como: Java, Python, Ruby, .NET, etc. Bueno y con esto se acaba la pequea introduccin sobre USB enfocada a los PIC, la mayora de datos y valores numricos de est informacin adems de los datasheets est sacada de apuntes y notas tomadas por m en las diferentes presentaciones y seminarios de Microchip a los que he podido asistir a lo largo del tiempo que estoy con esto de los PICs, por lo que no descarto que pueda haber algn error, de vosotros depende el vericar dichos datos y si encontris algn error sera bueno para todos que lo comentarais en el foro.

8.12.

Puerto Paralelo

8.13.

Introduccin

La internase de una computadora con la impresora se encuentra resuelta a travs de un puerto paralelo de 8 bits. Este puerto, en realidad, involucra a tres registros llamados de datos, de estado y de control, mediante los cuales ambos

Computadoras Electrnicas

93

dispositivos realizan consultas de estado, control y transferencia de datos entre s. Cuando IBM introdujo la PC en el ao 1981, esta incorporaba un puerto paralelo de 8 bits para manejar la impresora, que, por muchos aos esta fue el principal ( o el nico ) perifrico que lo utilizaba. Con el paso del tiempo y los avances de la tecnologa, se desarrollaron toda clase de aparatos tales como escner, reproductores de CD, drivers para disquete, etc., los cuales utilizan dicha interface. Los diseadores de perifricos siempre se enfrentaban con las limitaciones de este puerto, entre ellas se cuentan la falta de rendimiento dadas las bajas velocidades de transferencia de informacin ( mximo 150 Kbytes por segundo ) y la limitacin de la mxima longitud del cable ( 1.5 m ). En 1991, los fabricantes de impresoras se reunieron para desarrollar un nuevo estndar para el puerto paralelo. Los requisitos de este eran alta velocidad de transferencia de informacin (hasta 1 Mbyte por segundo), bidireccionalidad y sobre todo compatibilidad total tanto en software como en hardware con la interface original de IBM. As fue que en el ao 1994 naci el estndar IEEE 1284 que rene las caractersticas enunciadas arriba y rige a las interfaces de los modernos PC.

8.14.

Estructura del interface paralelo

Dado que todas las PC compatibles soportan el interface original de IBM, nos limitaremos al estudio de este. Cada PC puede contener hasta 4 puertos paralelos, aunque el BIOS al arrancar en realidad busca 3, pero se puede incluir un cuarto especicando su direccin en el segmento de variables del BIOS. Las direcciones de estos puertos estn estandarizadas y se dan en la tabla 8.2.

Direccin Puerto 3BCh - 3BEh Puerto paralelo en la tarjeta MDA 378h - 37Ah Primer puerto paralelo 278h - 278h Segundo Puerto paralelo Tabla 8.2: Direcciones del puerto paralelo

94

Gustavo A. Yarce

Cada puerto consta de 3 registros accesibles desde una direccin base, 378h para el primer puerto paralelo, es decir para el registro de datos del primer puerto paralelo se acceder con la direccin 378h, para acceder al registro de estado del primer puerto paralelo la direccin ser 379h=378h +1 y para el registro de control del primer puerto paralelo la direccin ser 37Ah=378h + 2.

Los nombres de dichos puertos se los asigna el sistema operativo DOS, para el cual el primero en ser detectado por el BIOS recibe el nombre de LPT1 (abreviatura de Line PrinTer) y si hubiera, el segundo LPT2 y el tercero LPT3. Desde el exterior de la mquina se identica al puerto paralelo mediante un conector D hembra de 25 pines.

Figura 8.5: Conector Puerto Paralelo en la PC

Del lado de la impresora, el cable que conecta a ambos lleva un conector tipo centronics de 36 pines. El nombre de las seales as como el nmero de pin se dan en la tabla 8.3.

La barra / delante de los nombres de las seales indican que son activas a nivel bajo, no que estn invertidas.

Computadoras Electrnicas Pin del PC Pin de la impresora 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 32 16 31 17 36 18-25 19-30

95 Nombre de la lnea Signicado /STROBE Indica transmisin D0 Lnea de datos bit 0 D1 Lnea de datos bit 1 D2 Lnea de datos bit 2 D3 Lnea de datos bit 3 D4 Lnea de datos bit 4 D5 Lnea de datos bit 5 D6 Lnea de datos bit 6 D7 Lnea de datos bit 7 /ACK ltimo caracter aceptado /BUSY Impresora ocupada PE Impresora sin papel SLCT Impresora en ON LINE AUTO FEED CR automtico despus de LF /ERROR Error en transmisin de datos /INIT Reset de la impresora SLCT IN Activar ON LINE en la impresora GND Masa

Tabla 8.3: Nombre y Funcin de los pines puerto Paralelo

8.15.

Los registros del puerto.

Independientemente de la posicin en la zona de direcciones, todos los puertos muestran un register - interfaz unicado que se compone de tres registros. Ocupan las primeras tres direcciones de la tarjeta, por ejemplo, 378h, 379h y 37Ah en el caso del primer puerto paralelo.

Es importante hacer aqu algunas observaciones: 1. Cada bit de los diferentes registros est unido a un cable que llega al exterior del PC, ms exactamente al conector DB25. Si se escribe un 1 en uno de estos bits, la lnea en cuestin se pone bajo tensin inmediatamente y este valor se mantiene hasta que se vuelve a escribir sobre la misma lnea. 2. Algunas de estas lneas presentan lgica negativa. Estas son las lneas cuyo nombre est negado (llevan un guin sobre l) o que comienzan con la barra /. La condicin que est unida a una de estas lneas aparece siempre que la

96

Gustavo A. Yarce lnea est a cero. La lnea error, por ejemplo, muestra un error en la salida de impresin pero solamente cuando este bit contiene el valor cero. Mientras que la lnea se mantenga en uno no existe ningn error.

8.15.1.

Lneas de datos

Sin embargo, los ocho bits del primer registro de un puerto paralelo carecen de lgica negativa. Contiene 8 bits de datos que corresponden a las lneas de datos D0 - D7.

Tenga en cuenta que este registro del puerto est concebido como registro puro de salida, ya que no se plane ninguna recepcin de datos en el momento de su concepcin. El intentar ingresar un dato por estas lneas acarreara indefectiblemente la destruccin del puerto.

La siguiente ilustracin muestra la distribucin de los diferentes bits en el registro de datos.

Figura 8.6: Registro de Datos

Computadoras Electrnicas

97

8.15.2.

Lneas de Estado

El estado actual del puerto paralelo se obtiene del segundo registro, llamado registro de estado, que solo se puede leer pero no escribir por software, ya que en el se reejan las diferentes lneas de estado. Es decir, las lneas de este registro se comportan como entradas al PC sobre las cuales podemos escribir, ingresar algn valor lgico mediante hardware. El intentar escribir por software en este registro no tiene ningn efecto. La distribucin de los diferentes bits de este registro se muestra a continuacin:

Figura 8.7: Registro de Estado

8.15.3.

Lneas de Control

El tercer registro sirve para el control del puerto paralelo. Adems, juega un papel importante durante la transmisin de caracteres. todos los bits, excepto los bits 4 al 7, estn unidos a las diferentes lneas del puerto centronics. La distribucin de los bits es la siguiente:

98

Gustavo A. Yarce

Figura 8.8: Registro de Control

Pero no todo es tan transparente como parece, sino que esta interface esconde algo bajo sus intrincados circuitos, y es que algunos bits estn invertidos por hardware en escritura y otros en lectura por lo que debemos ver cuales son. Comencemos por decir que el registro de datos no posee ningn bit invertido, pero el de estado s. Veamos una grca del mismo cuando lo leemos.

8.15.4.

LECTURA DEL REGISTRO DE ESTADO

Figura 8.9: Lectura del registro de estado

El bit /BUSY est invertido, mientras que los dems no. Ahora, en el registro

Computadoras Electrnicas

99

de control debemos distinguir entre la lectura y la escritura. Comencemos por la lectura.

8.15.5.

Lectura-Escritura del registro de control

Figura 8.10: Lectura del registro de control

Como vemos aqu, los bits invertidos en la lectura de este registro son dos, A. FEED y /STROBE, mientras que SLCT IN e /INIT no sufren inversin alguna. Este mismo registro pero en escritura tiene las siguientes caractersticas:

Figura 8.11: Escritura del registro de control

100

Gustavo A. Yarce

8.16.

Precauciones en el manejo del puerto.

Damos aqu algunos consejos importantes a la hora de trabajar con un puerto paralelo. No conectar ningn dispositivo (impresora, escner o algn prototipo construido por nosotros) cuando el PC est funcionando. Apagar el equipo y luego proceder. Todo prototipo construido por nosotros que se deba conectar al puerto paralelo, deber contar con un buer (interface) entre ambos. Las razones de esto son dos: 1) la capacidad para suministrar corriente del puerto es muy baja, por lo que debemos colocar un amplicador de corriente (puede ser un 74LS373 o 74LS244, 245 etc.) para poder manejar nuestros dispositivos y 2) este interface realiza una aislacin elctrica entre los pines del puerto y las salidas del mismo por lo que un desperfecto en nuestro prototipo ocasiona la destruccin de dicho interface y no del puerto del PC. Antes de conectar un prototipo al puerto, asegurarse de que no existe algn cortocircuito o mala conexin en el mismo, que el circuito est armado correctamente y comprobar el estado del cable que conecta al mismo con el PC para que no haya falsos contactos o cortocircuitos entre las lneas.

Captulo 9 La transmisin serie


9.1. Introduccin

Un microcontrolador puede trabajar de dos formas: 1. modo asncrono 2. modo sncrono El mdulo de transmisin serie es la USART, la cual transmite y recibe datos, de forma asncrona o sncrona. Se orientar el resto del documento a la transmisin asncrona. Los pines utilizados en la transmisin serie son: RC6/TX/CK se utiliza para la transmisin de datos RC7/RX/DT se utiliza para la recepcin de datos

9.1.1.

Registro TXSTA

bit 7: CSRC: Bit de seleccin de reloj 101

102 Registro TXREG RCREG PIR1 PIE1 RCSTA TXSTA SPBRG Funcin Registro de datos de transmisin Registro de datos de recepcin Flag de Interrupcin Habilitacin de Interrupcin Estado de Recepcin-Control Estado de Transmisin-Control Generador del ratio de Baudios

Gustavo A. Yarce

Tabla 9.1: Registros transmisin serie CSRC TX9 TXEN 7 6 5 SYNC 4 - BRGH TRMT 3 2 1 TX9D 0

Tabla 9.2: Registro TXSTA Modo Asncrono no tiene importancia En Modo Sncrono 1 = Modo mster (reloj generado internamente para BRG (Generador de Baudios)) 0 = Modo esclavo (reloj externo) bit 6: TX9: Habilita transmisin de 9-8 bits 1 = Transmisin de 9 bits 0 = Transmisin de 8 bits bit 5: TXEN: Bit de habilitacin del transmisor 1 = Habilita transmisin 0 = Deshabilita transmisin Nota: SREN/CREN anula TXEN en modo SYNC. bit 4: SYNC: Bit de seleccin del modo USART 1 = Modo Sncrono 0 = Modo Asncrono bit 3: Sin implementar: En lectura es0 bit 2: BRGH: Bit de seleccin del rango de baudios alto Modo Asncrono

Computadoras Electrnicas 1 = Alta velocidad 0 = Baja velocidad Modo Sncrono No se usa este modo bit 1: TRMT: Bit de estado del registro de desplazamiento del transmisor (TSR) 1 = TSR vaco 0 = TSR lleno bit 0: TX9D: Noveno bit de datos de transmisin. Se puede emplear como bit de paridad.

103

9.1.2.

Registro RCSTA

SPEN 7

RX9 6

SREN 5

CREN 4

- FERR 3 2

OERR RX9D 1 0

Tabla 9.3: Registro RCSTA

bit 7: SPEN: Bit de habilitacin del puerto serie 1 = Habilita puerto serie (configura patillas RC7/RX/DT y RC6/TX/CK para el puerto serie) 0 = Deshabilita puerto serie bit 6: RX9: Habilita recepcin de 9-8 bits

104 1 = Selecciona 9 bits de recepcin 0 = Selecciona 8 bits de recepcin bit 5: SREN: Bit de habilitacin de recepcin nica Modo asncrono: Este modo no se usa Modo Sncrono master 1 = Habilita una recepcin nica 0 = Deshabilita una recepcin nica Este bit se borra despus de completar la recepcin Modo Sncrono esclavo En este modo no se usa

Gustavo A. Yarce

bit 4: CREN: Bit de habilitacin de recepcin continua Modo Asncrono 1 = Habilita recepcin continua 0 = Deshabilita recepcin continua Modo Sncrono 1 = Habilita recepcin continua hasta que el bit CREN sea borrado (CREN anula SREN) 0 = Deshabilita la recepcin continua bit 3: Sin implementar: En lectura es 0 bit 2: FERR: Bit de error de empaquetamiento 1 = Error de empaquetamiento (Puede actualizarse al leer el registro RCREG y recibir el siguiente byte) 0 = No hay error bit 1: OERR: Bit de error de desbordamiento 1 = Error de desbordamiento (puede ser borrado al borrar CREN) 0 = No hay desbordamiento bit 0:RXGD: Noveno bit de datos de recepcin. Se puede emplear como bit de paridad

Computadoras Electrnicas

105

9.1.3.

Registro SPBRG

Este registro se utiliza para controlar la velocidad de la comunicacin mediante el valor cargado en este registro. Este generador sirve tanto para el modo sncrono como el asncrono y consiste de un contador/divisor de frecuencia de 8 bits controlado por el registro SPBRG (99H). De tal manera que la frecuencia de transmisin se calcula de acuerdo a la siguiente tabla:

SYNC 0(Modo asncrono) 1(Modo sncrono)

BRGH=0(Baja velocidad) BRGH=1(Alta velocidad) Baud rate=Fosc(64(X+1)) Baud rate=Fosc(16(X+1)) Baud rate=Fosc(4(X+1)) Tabla 9.4: Registro SPBRG

Debido a que el divisor es de 8 bits, no se puede tener cualquier velocidad de transmisin deseada, ya que X se deber redondear al entero ms cercano. En las dos tablas anteriores se muestran algunos valores de velocidad de transmisin (baud) estndar, el divisor necesario (X=SPBRG) bajo diferentes frecuencias Fosc y el error producido en porcentaje Ejemplo: Clculo de la proporcin del error de velocidad de transmisin para las siguientes condiciones: FOSC = 16 MHZ Velocidad de transmisin deseada = 9600 baudios BRGH = 0 SYNC = 0 Velocidad de transmisin = Fosc/(64*(X+1)) 9600=16000000/(64*(X+1)) X=25,042=25 Vel. Transmisin = 16000000/(64*(25+1))=9615

106 error=(9615 -9600)/9600=0,16%

Gustavo A. Yarce

Los datos de la pin RC7/RX/DT son muestreados en tres tiempos para detectar y determinar mejor si el nivel presente en la pin RX est a nivel alto o bajo. Si el bit BRGH (TXSTA<2>) est a cero, el muestreo se realiza en el sptimo, octavo, y noveno anco de bajada de x1 6 de reloj. Si por el contrario, el bit BRGH est a uno, el muestreo tiene lugar en el tercer anco de reloj precedido de la segunda subida de reloj y de la primera bajada de x4 de reloj.

9.1.4.

La transmisin

En el modo asincrnico de comunicaciones se emplea una conguracin estndar de un bit de Start, ocho o nueve bits de datos, y un bit de Stop. Este modo de trabajo es detenido durante la funcin Sleep. Aunque la USART tiene funciones independientes para la transmisin y recepcin, los formatos de datos y de velocidad de transmisin son iguales para los dos casos. El generador de baudios produce siempre las seales de reloj x16 x64 (dependiendo de BRGH, TXSTA<2>) para el desplazamiento de los bits. El bit de paridad no est soportado por el hardware, pero se puede implementar por software empleando para ello el noveno bit de datos. Para realizar una transmisin de datos, el registro de desplazamiento TSR obtiene los datos del registro (buer) de lectura/escritura TXREG. El TSR no carga el bit de Stop hasta que se hayan transmitido los datos cargados. Una vez que se haya enviado este bit, el registro ser cargado con los nuevos datos (si estn disponibles), en este caso el bit TXIF (PIR1 <4>) se pone a ,uno si est habilitada la interrupcin (PIE1 <4>).

Los pasos necesarios para realizar una transmisin asncrona son los siguientes: Inicializar el registro SPBRG con el valor apropiado segn los clculos realizados. Si se desea el margen alto se pondr a uno el bit BRGH. Habilitar el puerto asncrono borrando el bit SYN y poniendo a uno el SPEN. Habilitar la interrupcin (si se desea) poniendo a uno el bit TXIE. Poner a cero o a uno el bit TX9 (8 o 9 bits). Habilitar la transmisin poniendo a uno el bit TXEN, el cual pondra a uno el bit TXIF. Si se han seleccionado 9 bits se deber poner el noveno en el bit TX9D.

Computadoras Electrnicas Cargar el dato en el registro TXREG (comenzar la transmisin).

107

En el modo de recepcin, los datos son recibidos por la patilla RC7/RX/DT y se introducen en serie en el registro RSR; despus de recibir el bit de Stop los datos acumulados en este registro se cargan en el de datos RCREG (si est vaco). Cuando la transferencia se ha completado, el bit RCIF (PIR1 <5>) sube a uno. La interrupcin puede habilitarse o deshabilitarse colocando a uno o borrando, respectivamente, el bit RCIE (PIE1 <5>). El bit RCIF se borra cuando el registro RCREG se ha ledo (se vaca el registro). Para congurar el puerto como receptor hay que seguir los siguientes pasos: Inicializar el registro SPBRG con el valor apropiado segn los clculos realizados. Si se desea el margen alto se pondra a uno el bit BRGH. Habilitar el puerto asncrono borrando el bit SYN y poniendo a uno el SPEN. Habilitar la interrupcin (si se desea ) poniendo a uno el bit RCIE. Poner a uno el bit RX9 para habilitar 9 bits de recepcin. Habilitar la recepcin poniendo a uno el bit CREN. El ag RCIF subir a uno cuando se complete la recepcin. Se ocasionar una interrupcin si esta habilitado el bit RCIE. Leer el registro RCSTA, cargar el noveno bit (si esta habilitado) y comprobar si ha ocurrido un error durante la recepcion. Leer el octavo bit recibido y dar lectura al registro RCREG para conocer si el dispositivo se ha direccionado. Si ha ocurrido un error borrarlo poniendo a cero el bit CREN. Si el dispositivo ha sido direccionado, borrar el bit ADDEN para permitir que los datos puedan leerse del buer receptor

108

Gustavo A. Yarce

9.2.

La transmisin serie en CCs

La Conguracin de una Comunicacin Serie Asncrona desde el compilador CCS est regido por la directiva # USE RS232. Aunque la directiva se llame as, sirve para congurar cualquier transferencia serie asncrona y no slo RS232, que no deja de ser una de las posibles normas. Los niveles elctricos asociados a los niveles lgicos de recepcin/transmisin son los correspondientes a la tensin de alimentacin del microcontrolador y no a los de la norma RS232. Esta directiva permite congurar: Velocidad de transmisin (en baudios) Qu pin se emplear para la transmisin Qu pin se utilizar para la recepcin Si se va a utilizar o no bit de paridad y de qu tipo (par o impar)

9.2.1.

Opciones de la directiva #USE RS232

BAUD= x. x sera la velocidad de comunicacin (en baudios). Para que el compilador inserte el cdigo necesario para transmitir/recibir a la velocidad indicada, debe conocer la frecuencia del oscilador que se va a utilizar. Deber pues existir previamente una directiva #USE DELAY(clock=frec.). Si la velocidad de transmisin indicada no se pudiera alcanzar con un error inferior al 3 %, se generara a la hora de realizar la compilacin un mensaje de error del tipo: Baud rate out of range salvo que se incluya una opcin BRGH1OK en la directiva (asumimos ese error). XMIT=pin. Pin de transmisin que se va a utilizar (p.e.: xmit=PIN_C6) RCV=pin. Pin de recepcin que se va a utilizar (p.e.: rcv=PIN_C7) Si el microcontrolador seleccionado tiene mdulo SCI y se especican los pines asociados como los que se deben utilizar, la transmisin y/o recepcin se har con el hardware disponible, en caso contrario ser implementado por software

Computadoras Electrnicas

109

ENABLE=pin.Durante la transmisin, el pin especicado estar en estado alto y durante la recepcin en estado bajo . Ese pin se puede utilizar para habilitar bien la transmisin o bien la recepcin en una comunicacin semidplex como puede ser el caso del control de los drivers de un bus RS485. RESTART_WDT.Se insertar cdigo para resetear el Watchdog durante la espera por un byte (para funciones que se quedan esperando) a que llegue algo. INVERT.Con esta opcin, se invierte la polaridad de los niveles asociados a los pines de la comunicacin: el 0 correspondera a tensin y el 1 a masa. El estado inactivo o de reposo (a 1) se correspondera con tensin nula Esta opcin no debera utilizarse si se emplea el mdulo SCI interno. BITS=x. Se especica el tamao de los datos que sern enviados, x puede tomar un valor comprendido entre 5 y 9 si se implementa por software la comunicacin o bien de 8 9 si se emplea el mdulo SCI interno. FLOAT_HIGH. En estado alto, la lnea no estar en un nivel alto sino en un estado de tensin otante debido a que la salida que la controla es del tipo drenador (o colector) abierto. BRGH1OK. Con esta opcin el compilador permite la generacin de cdigo an en aquellos dispositivos que presentarn problemas en su velocidad de transmisin. PARITY=x. x puede ser N (none: sin), O (odd: impar) o E (even: par) Si se especica el empleo de paridad, se enva un bit adicional como comprobacin y en el supuesto de que se produzca un error, ste quedara registrado en una variable denominada RS232_ERRORS. ERRORS. Si se emplea esta opcin, el compilador dene una variable llamada RS232_ERRORS que recoge los errores en cada recepcin y los resetea despus de que stos se produzcan. variable RS232_ERRORS. Esta variable denida por el compilador contiene: 1. Si se est utilizando una implementacin software: En el bit 7, el 9o bit si se est utilizando tamao de 9 bits en transmisin. El bit 6 se pone a 1 si se produjo un fallo en el envo con el modo de tensin otante de salida

110 2. Si se est empleando una UART interna:

Gustavo A. Yarce

Es una copia del registro RCSTA (slo para recepcin), salvo el bit 0 que se emplea para indicar error de paridad Es importante que las directivas #USE FAST_IO o bien #USE FIXED_IO vayan delante de esta directiva pero no la directiva #USE STANDARD_IO por la manera en que se generara el cdigo de puesta a 1 o puesta a 0 de las lneas de salida.

9.2.2.

Funciones para comunicacin serie asncrona

set_uart_speed(baudios). Esta funcin slo se puede emplear en aquellos dispositivos que utilizan el mdulo SCI (USART) interno hardware. La funcin se emplea para cambiar la velocidad de transmisin/recepcin en tiempo de ejecucin. set_uart_speed(2400);

Transmisin putc() - putchar(). Se enva un carcter a travs del pin especicado para envo (XMIT) en la directiva #USE RS232. putc(carcter)

puts(). La cadena de caracteres debe nalizar con un 0. Se enva cada uno de los caracteres de la cadena usando la funcin putc(). Despus del envo de la cadena de caracteres, se enva un retorno de carro (carcter 10 =0x0A) y un salto de lnea (carcter 13 =0x0D). puts(cadena_caracteres)

puts(Saludos);

Computadoras Electrnicas printf(). printf(cadena_caracteres) printf(cadena_caracteres_constantes,Valores...) printf(Funcin, cadena_caracters_constantes, Valores...)

111

Valores. Son variables en una lista separadas por comas. Funcin. Es el nombre de la funcin que se debe emplear para sacar los caracteres (si no se especica nada es la putc() por defecto). Esta funcin saca, mediante la Funcin de salida especicada, los caracteres y los valores para su representacin. Si se especican Valores, la cadena de caracteres debe ser constante y se puede insertar la representacin de los valores utilizando el carcter especial % seguido del nmero de caracteres a utilizar (opcional de 1 a 9 01 a 09 si se desean representar los ceros a izq.) y del tipo de dato, que puede ser:

c u x s f g e D lu LX ld

como carcter como entero sin signo como hexadecimal(entero) como cadena otante truncado otante con redondeo otante en formato exponencial entero con signo entero largo sin signo hexadecimal largo entero largo con signo Tabla 9.5: Tipos de datos

112 Especicacin %03u %u %2u %d %X Valor_1=0x12 18 18 18 18 12

Gustavo A. Yarce Valor_2=0xFE 254 254 ?Indenido -2 FE

Tabla 9.6: Ejemplos de tipos de datos Recepcin Es Importante notar que estas funciones tienen un comportamiento diferente si la comunicacin est implementada mediante el hardware o por software. getc() - getch() - getchar() Cuando se la llama, espera por la llegada de un byte en el pin de recepcin RCV especicado en la directiva #USE RS232 y devuelve dicho byte como resultado. Si la recepcin est implementada mediante el mdulo USART hardware, se puede hacer uso del triple buer existente sin perder datos. Si est implementada por software, debemos estar esperando cada byte con getc() para no perder recepciones. Para evitar que el microcontrolador quede colgado esperando de manera indenida la recepcin de un byte que no llega, se debera usar la funcin kbhit() para vericar si ha llegado un carcter y est disponible valor = getc( )

kbhit() Esta funcin devuelve 0 (FALSE) 1 (TRUE) si la funcin getc() necesitara conocer la disponibilidad de un carcter (byte) para ser ledo. Si la comunicacin est gestionada por software, la funcin devuelve TRUE si se ha detectado un bit de START en el pin de recepcin Si est implementada con la USART hardware, devuelve TRUE si el byte ha sido recibido y est disponible en el buer para ser ledo mediante getc() valor = kbhit( ) gets() Llamada gets(puntero)

Computadoras Electrnicas

113

Esta funcin espera y lee caracteres que va colocando a partir de la posicin sealada por el puntero utilizado como parmetro. Lee hasta que recibe un retorno de carro (13 - 0x0D). La tira de caracteres se naliza con la inclusin de un cero. gets(puntero_t_cadena_caracteres)

strcat(s1,s2) Para encadenar cadena sde caracteres strchr(s1,c) Localiza c en la cadena por 1a vez y devuelve direccin (&s1[i]) strrchr(s1,c) Idem a la anterior pero empieza bsqueda desde nal strcmp(s1,s2) Compara dos cadenas s1 y s2 y devuelve TRUE si coinciden strncmp(s1,s2,n) Compara n caracteres entre s1 y s2 stricmp(s1,s2) Compara ignorando si son maysculas o minsculas strncpy(s1,s2,n) Copia n caracteres de s2 en s1 strcspn(s1,s2) Cuenta caracteres de s1 que no estn en s2 strspn(s1,s2) Cuenta caracteres de s1 que tambin estn en s2 strlen(s1) Cuenta los caracteres de s1 strlwr(s1) Convierte todas las maysculas a minsculas strpbrk(s1,s2) Busca posicin en s2 donde empieza copia de s1 s1 y s2 son punteros a arrays de caracteres.

9.3.

Uso de las interrupciones

La interrupcin RDA se produce cada vez que en la USART hay disponible un carcter para ser ledo. El buer de recepcin de la USART del PIC 16F628 dispone de solo 2 bytes por lo que es importantsimo el descargarlo tal como se van recibiendo los caracteres, de esta forma evitamos el que se vean tristemente perdidos en el limbo serie.

114

Gustavo A. Yarce

Este Template demuestra cmo recibir cada carcter que llega hacindole eco desde el programa principal. Si necesitamos tomar muchos caracteres y nuestra rutina principal es larga y farragosa es interesante recibir mediante RDA los caracteres e ir almacenando en un BUFFER ms amplio para ser posteriormente tratados. #include <16f628.h> #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT #use delay(clock=4000000) #use standard_io(b) #use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1) char Keypress= ; #int_rda void serial_isr() { Keypress=0x00; if(kbhit()){ Keypress=getc(); if(Keypress!=0x00){ putchar(keypress); keypress=0x00; } } }

// Selecciona el PIC // Opciones de configuracin // Velocidad del Cristal : 4 Mhz // Definicin del RS232

void main() { enable_interrupts(global); enable_interrupts(int_rda); printf("\r\n\Listen on RS232 (Int)\r\n"); do {

} while (TRUE); }

Computadoras Electrnicas #int_RDA void RDA_isr(void) { dato=0; a=(getch()-48); delay_ms(100); i=i+1; if(i>2) { i=0; dato=((a[0]*100)+(a[1]*10)+(a[2])); } }

115

9.4.

Instrucciones para la transmisin serie

c = GETC() c = GETCH() c = GETCHAR()

Estas funciones esperan un carcter por la patilla RCV del dispositivo RS232 y retorna el carcter recibido. Es preciso utilizar la directiva #USE RS232 antes de la llamada a esta funcin para que el compilador pueda determinar la velocidad de transmisin y la patilla utilizada. La directiva #USE RS232 permanece efectiva hasta que se encuentre otra que anule la anterior. Los procedimientos de I/O serie exigen incluir #USE DELAY para ayudar a sincronizar de forma correcta la velocidad de transmisin. Recordad que es necesario adaptar los niveles de voltaje antes de conectar el PIC a un dispositivo RS-232. Ejemplo:

116 printf("Continuar (s,n)?"); do { respuesta=getch(); } while(respuesta!=s&& respuesta!=n);

Gustavo A. Yarce

9.4.1.

GETS(char *string)

Esta funcin lee caracteres (usando GETC()) de la cadena (string) hasta que encuentra un retorno de carro(valor ASCII 13). La cadena se termina con un 0.

Ejemplo: \item PUTC() \item PUTCHAR() Estas funciones envan un carcter a la patilla XMIT del dispositivo RS232. Es preciso utilizar la directiva #USE RS232 antes de la llamada a esta funcin para que el compilador pueda determinar la velocidad de transmisin y la patilla utilizada. La directiva #USE RS232 permanece efectiva hasta que se encuentre otra que anule la anterior. Ejemplo: if (checksum==0) putchar(ACK); else putchar(NAK); // NAK carcter de respuesta negativa

9.4.2.

PUTS(string)

Esta funcin enva cada carcter de string a la patilla XMIT del dispositivo RS232. Una vez concluido el envo de todos los caracteres la funcin enva un retorno de carro CR o RETURN (ASCII 13) y un avance de lnea LF o LINEFEED (ASCII 10). Ejemplo:

Computadoras Electrnicas puts( " ---------- " ); puts( " | HOLA |" ); puts( " ---------- " );

117

9.4.3.

PRINTF([function], string, [values])

La funcin de impresin formateada PRINTF saca una cadena de caracteres al estndar serie RS-232 o a una funcin especicada. El formato est relacionado con el argumento que ponemos dentro de la cadena (string). Cuando se usan variables, string debe ser una constante. El carcter % se pone dentro de string para indicar un valor variable, seguido de uno o ms caracteres que dan formato al tipo de informacin a representar. Si ponemos % % obtenemos a la salida un solo %. El formato tiene la forma genrica %wt, donde w es optativo y puede ser 1,2,...,9. Esto es para especicar cuntos carcteres son representados; si elegimos el formato 01,...,09 indicamos ceros a la izquierda, o tambin 1.1 a 9.9 para representacin en punto otante. t es el tipo de formato y puede ser uno de los siguientes: C Carcter U Entero sin signo x Entero en Hex (en minsculas) X Entero en Hex (en maysculas) D Entero con signo %e Real en formato exponencial(notacin cientfica) %f Real (Float) Lx Entero largo en Hex (en minsculas) LX Entero largo en Hex (en maysculas) Lu Decimal largo sin signo Ld Decimal largo con signo Ejemplos: byte x,y,z; printf (" Hola "); printf("RTCCValue=>%2x\n\r",get_rtcc()); printf("%2u %X %4X\n\r",x,y,z); printf(LCD_PUTC, "n=%c",n);

118

Gustavo A. Yarce

Captulo 10 Conversin A/D - D/A


10.1. Seales analgicas

Son variables elctricas que evolucionan en el tiempo en forma anloga a alguna variable fsica. Estas variables pueden presentarse en la forma de una corriente, una tensin o una carga elctrica. Varan en forma continua entre un lmite inferior y un lmite superior. Cuando estos lmites coinciden con los lmites que admite un determinado dispositivo, se dice que la seal est normalizada. La ventaja de trabajar con seales normalizadas es que se aprovecha mejor la relacin seal/ruido del dispositivo.

10.2.

Seales digitales

Son variables elctricas con dos niveles bien diferenciados que se alternan en el tiempo transmitiendo informacin segn un cdigo previamente acordado. Cada nivel elctrico representa uno de dos smbolos: 0 1, V o F, etc. Los niveles especcos dependen del tipo de dispositivos utilizado. Por ejemplo si se emplean componentes de la familia lgica TTL (transistor-transistor-logic) los niveles son 0 V y 5 V, aunque cualquier valor por debajo de 0,8 V es correctamente interpretado como un 0 y cualquier valor por encima de 2 V es interpretado como un 1 (los niveles de salida estn por de- bajo de 0,4 V y por encima de 2,4 V respectivamente). En el caso de la familia CMOS (complementary metal-oxide-semiconductor), los valores dependen de la alimentacin. Para alimentacin de +5 V, los valores ideales son tambin 0 V y 5 V, pero se reconoce un 0 hasta 2,25 V y un 1 a partir de 2,75 V.

119

120

Gustavo A. Yarce

Estos ejemplos muestran uno de los principales atractivos de las seales digitales: su gran inmunidad al ruido. Las seales digitales descriptas tienen la particularidad de tener slo dos estados y por lo tanto permiten representar, transmitir o almacenar informacin binaria. Para transmitir ms informacin se requiere mayor cantidad de estados, que pueden lograrse combinando varias seales en paralelo (simultneas), cada una de las cuales transmite una informacin binaria. Si hay n seales binarias, el resultado es que pueden representarse 2n estados. El conjunto de n seales constituye una palabra. Otra variante es enviar por una lnea nica, en forma secuencial, la informacin. Si se sabe cundo comienza, y qu longitud tiene una palabra (conjunto ordenado de estados binarios que constituye un estado 2n -ario), se puede conocer su estado. El hecho de que una seal digital pueda tener 2n estados, no nos dice nada respecto a qu signica o cmo se interpreta cada estado. Como veremos a continuacin, esta interpretacin depende, realmente, del cdigo utilizado.

10.3.

Muestreo y retencin (sample and hold)

Se denomina muestreo a la accin de tomar muestras (valores) de una seal en una sucesin de instantes sin importar lo que sucede el resto del tiempo. Ello implica poder conmutar la seal de manera que en el instante deseado la misma atraviese un amplicador (o seguidor) y fuera de ese instante la entrada quede conectada a masa. Ello puede lograrse con el circuito de la gura 10.3

Figura 10.1: Circuito de muestreo

Computadoras Electrnicas

121

La llave, en la prctica, puede ser un FET. Este circuito tiene la desventaja de que no permite retener el valor de la ltima muestra, sino que la salida vuelve a 0. En muchos casos, especcamente en el de la conversin analgica-digital, hace falta un valor constante durante cierto intervalo de tiempo para efectuar una conversin correcta. Para lograr esto, es preciso realizar un muestreo con retencin. Un circuito de muestreo y retencin es el que se ilustra en la gura 10.3

Figura 10.2: Circuito de muestreo con retencin

Tpicamente, el tiempo de muestreo ser corto, y el de retencin ms largo

Figura 10.3: Aplicacin de un circuito de muestreo y retencin.

122

Gustavo A. Yarce

10.4.

Especicaciones del muestreo y retencin

Un sistema de muestreo y retencin (sample and hold) ideal transmitir instantneamente y sin errores el valor de su entrada a la salida durante la etapa de muestreo y conservar dicho valor indenidamente, durante la etapa de retencin, hasta que venga otra etapa de muestreo. En el caso real esto no sucede, y, as, tenemos varias fuentes de error que se traducen en sendas especicaciones: Tiempo de establecimiento: Es el tiempo requerido, durante el muestreo, para que la salida alcance su valor nal con una tolerancia especicada (que depender de la aplicacin). Se debe a dos factores: la resistencia ON de la llave (que justo con el capacitor C forma una constante de tiempo) y la propia respuesta temporal del amplicador, que podra inclusive tener oscilaciones transitorias. Error de ganancia: Durante el muestreo (la llave cerrada) la salida debera seguir exactamente a la entrada. Sin embargo poda haber pequeos errores de ganancia y tener una ganancia, tpicamente, algo menor que 1. Error de oset: Podra haber un desplazamiento de la salida respecto a la entra- da, en general debido al oset del amplicador. Derivas durante la retencin: Aunque idealmente el capacitor C no tiene por donde descargarse cuando la llave se abre, en la prctica nos encontramos con diversas fugas: las prdidas debidas al C, la corriente de polarizacin del amplicador operacional, las fugas a travs de la llave no ideal, y las fugas a travs de imperfecciones en el circuito impreso. Todo esto da origen a una deriva denominada en ingls droop (que podra traducirse como una inclinacin debida a falta de soporte), y que se expresa en mV/S. Feedthrough: Durante la retencin, adems de la deriva ya descripta, suele haber una ltracin de seal a travs de la capacidad parsita de la llave que hace que aparezca superpuesta con la salida una versin atenuada de la entrada. Se determina aplicando una senoide de mxima amplitud y midiendo la amplitud del ripple a la salida. Se expresa como fraccin de la entrada y depende de la frecuencia. Tambin se expresa como atenuacin en dB Tiempo de apertura (aperture time): Es el tiempo entre la seal de retencin y el instante en que la retencin tiene lugar realmente. Tiempo de adquisicin (acquisition time): Intervalo de tiempo necesario con la seal presente despus de habilitar el muestreo para que

Computadoras Electrnicas

123

la salida alcance el valor de la entrada con un error especicado (tpicamente 0,1 %). En general se toma un salto de mxima amplitud entre el valor retenido previamente y el nuevo valor de salida

10.5.

Conversin analgica-digital

Ahora partimos de una seal analgica y queremos convertirla a una representacin numrica. Existen dos dicultades. La primera es que una representacin exacta requiere una cantidad innita (y continua) de estados posibles, lo cual a su vez exigira innitos dgitos. La segunda dicultad est en que para obtener dicha representacin se requiere que durante un tiempo la seal se mantenga invariable. La primera dicultad se resuelve por medio de la cuantizacin, es decir la aproximacin mediante un nivel tomado de entre una cantidad nita de niveles. El proceso de cuantizacin ser asimilable al redondeo o el truncamiento de un nmero de innitas cifras decimales. La segunda dicultad se resuelve por medio del muestreo y la retencin. Supondremos, por consiguiente, que la seal de entrada es constante durante el proceso de conversin. Existen varias tcnicas de conversin analgica digital, que podran clasicarse en dos grandes grupos: directas y realimentadas. Los conversores directos obtienen el dato digital por conteo o por comparacin, mientras que los realimentados lo hacen mediante un conversor digital analgico que realimenta el dato digital generado por algn sistema lgico.

10.6.

Mtodos directos de conversin A/D

Entre stos se encuentran los conversores de integracin de doble y simple rampa y los ash (en paralelo).

124

Gustavo A. Yarce

10.6.1.

Conversores ash (en paralelo)

Consisten en una serie de comparadores que comparan la seal de entrada con una referencia para cada nivel. El resultado de las comparaciones ingresa a un circuito lgico que cuenta los comparadores activados. En la gura 2.36 se muestra un ejemplo de conversor ash de 3 bits. Las referencias para cada nivel se obtienen con un divisor resistivo mltiple. Los valores de las resistencias extremas dieren de las restantes para lograr que la conmutacin de un cdigo al siguiente se produzca a mitad de camino del intervalo que corresponde a ese cdigo. As, si Vref fuera 8 V, las conmutaciones se efectuaran en 0,5 V, 1,5 V, 2,5 V, etc. La ventaja de este tipo de conversores es que la conversin es prcticamente en tiempo real, salvo el tiempo de conmutacin de los comparadores y la lgica. La desventaja es que cuando la resolucin es alta requiere una gran cantidad de comparadores, cuyo oset debe ser menor que 1 LSB. Adems, las capacidades de entrada se suman, lo cual atenta contra las altas velocidades que augura el mtodo de conversin. En los casos de resoluciones altas, la conversin se suele realizar en dos etapas, es decir que se usa la mitad de comparadores y en la segunda etapa se les agrega una tensin de referencia que los desplaza. En este caso se utilizan circuitos lgicos secuenciales.

Figura 10.4: Estructura de un conversor analgico-digital ash (en paralelo) de 3 bits.

Computadoras Electrnicas

125

10.6.2.

Conversor de simple rampa

En este tipo de conversores se utiliza un integrador con un capacitor que se carga a pendiente constante hasta alcanzar la tensin a convertir, instante en que cesa la integracin. El tiempo requerido es proporcional a la tensin de entrada, y puede medirse con un contador que cuente ciclos de un reloj.

Figura 10.5: . Esquema de un conversor analgico digital de simple rampa.

El integrador comienza a integrar la tensin -VREF, obtenindose VRef t RC Mientras V1 < Vi el comparador est alto, permitiendo que los pulsos del oscilador pasen a la entrada de reloj de un contador. Cuando V1 Vi ,el comparador conmuta, inhibiendo los pulsos de reloj. El contador queda entonces con su cuenta retenida. Dicho valor es V1 = D = [fck t0 ] = fck RC i

VRef donde [] es la parte entera del argumento. Eligiendo fck RC = 2n se obtiene un conversor de n bits. Este circuito tiene al menos dos inconvenientes:

126 1. la exactitud depende de fck , de R y de C

Gustavo A. Yarce

2. si se requiere mayor velocidad debe reducirse RC, por lo cual las corrientes de polarizacin pueden alterar la integracin.

10.7.

Mtodos realimentados de conversin A/D

Operan generando digitalmente un cdigo (de acuerdo con alguno de varios criterios), el cual se aplica como entrada digital a un conversor D/A. La salida de ste se compara con la entrada, y segn el signo del error se incrementa o no el cdigo.

10.7.1.

Conversor de rampa discreta

En este caso el generador de cdigo es un simple contador ascendente. Al resetear el contador, el conversor D/A aplica una tensin nula al comparador. Si vi > 0, la salida del comparador es alta, la compuerta AND deja pasar los pulsos del reloj, el contador comienza a incrementar el nmero

Figura 10.6: Esquema de un conversor analgico-digital de rampa discreta.

aplicado en el D/A y ste comienza a aumentar en forma escalonada la tensin en el terminal (-) del comparador. Esta situacin se mantiene hasta que la tensin (-) supera a vi. En ese instante la salida del comparador baja e inhibe, a travs de

Computadoras Electrnicas

127

la compuerta AND, el conteo. El valor digital D se mantiene entonces invariable hasta un nuevo reset.

10.7.2.

Conversor de balance continuo

El conversor anterior requiere ser reseteado para cada conversin, y por lo tanto se requieren hasta 2n 1 ciclos de reloj para completar una conversin. Conceptualmente, el reset puede interpretarse como un conteo descendente rpido, y en ese caso se efectuaba externamente al conversor (ya sea manual o automticamente). Supongamos ahora un contador capaz de contar hacia arriba o hacia abajo (up/down) segn el nivel de una seal de control. Tendremos as un conversor que responde muy rpidamente a variaciones pequeas.

Figura 10.7: Esquema de un conversor analgico-digital de balance continuo.

Una desventaja es que siempre cambia de valor, aun con entrada constante, ya que siempre se pasa para uno u otro lado, oscilando con una amplitud de un LSB. Una solucin sera ignorar el bit menos signicativo, o bien utilizar un conversor con un bit ms de lo necesario.

128

Gustavo A. Yarce

10.8.

Especicaciones de los conversores A/D

Igual que en el caso de los conversores digital-analgicos y los sample and hold, existen diversas no idealidades (algunas heredadas de aqullos) que requieren una cuidadosa especicacin. En lo que sigue se describirn las especicaciones ms importantes. Resolucin: Es la cantidad de bits que entrega a su salida luego de completada la conversin. Tambin puede expresarse como el porcentaje o partes por milln (ppm) que representa cada LSB en el rango total de entrada. Por ejemplo, un conversor de 12 bits tiene una resolucin de 1/212 100 = 0,0244 % o de 244 ppm. Error de cuantizacin: Es la mxima desviacin de un conversor analgico digital ideal con respecto a una transferencia perfectamente lineal, expresada en LSB. El error puede ser de 0,5 LSB +0/ 1 LSB, segn cul sea el punto de conmutacin. En algunos casos se procede por truncamiento y en otros por redondeo. La desviacin mxima se alcanza apenas antes de conmutar al nivel siguiente. Error de histresis: Es el ancho de la ventana de histresis que se establece alrededor de cada conmutacin, expresado en LSB. Se debe en general a la histresis del o los comparadores, y es razonable esperar que sea << 1 LSB. No es comn encontrar esta especicacin. La histresis se utiliza con ventaja para evitar conmutaciones debidas a pequeos niveles de ruido. Error de oset: Es el valor de tensin que debe aplicarse a la entrada para tener una salida digital nula. Se debe al oset del comparador y se expresa en mV o en LSB nominales. Tiempo de conversin: Es el tiempo requerido por un conversor A/D para efectuar una conversin completa. Frecuencia de conversin: Es la cantidad de conversiones por segundo que es capaz de efectuar un conversor A/D. No necesariamente coincide con el recproco del tiempo de conversin, ya que podra haber algunas operaciones complementarias, que ocupan tiempo despus de terminada la conversin propiamente dicha. Frecuencia de reloj: Frecuencia del oscilador que enva pulsos para la operacin del conversor (por ejemplo, para hacer funcionar el contador o el registro de aproximaciones sucesivas).

Computadoras Electrnicas

129

10.9.

El ADC en el PIC

El tiempo de conversin para cada bit viene denido por el TAD, el conversor necesita un mnimo de 12 ciclos de reloj (12TAD), para la conversin de 10-bits. Para generar los pulsos de reloj, deberemos escoger la mejor de las 3 opciones que nos facilita: 2TOSC, 8TOSC, 32 TOSC. Tendremos en cuenta que el oscilador interno tiene un TAD tpico de 4us, pero podemos hacerlo variar entre 2us y 6us. Para un optimo funcionamiento del conversor, nunca deberemos seleccionar un tiempo menor a 1,6us. Siempre deberemos intentar ajustar el tiempo de reloj, para optimizar el funcionamiento del conversor. No todas las aplicaciones requieren un resultado de 10-bits de resolucin, pero si pueden requerir una conversin A/D mas rpida. El modulo A/D permite qu el usuario realice la compensacin de velocidad de la conversin. Para acelerar o ralentizar la conversin, la fuente del reloj del modulo A/D pude variar de tal modo que el TAD vare. La fuente de los impulsos de reloj se aplica a un Divisor de Frecuencias (Prescaler) que los divide por 1, 2, 4 u 8, segn el valor de los bits del registro T1CON. El reloj externo puede estar sincronizado o no con el interno, segn el bit T1SYNC de T1CON. El interno siempre es sncrono. El tiempo que dura la conversin depende de la frecuencia de funcionamiento del PIC y del valor de los bits ADCS1 y ADCS0.

10.10.

Conguracin de Registros

El conversor analgico digital usa cuatro registros para realizar la conversin:

A/D result high register (ADRESH) A/D result low register (ADRESL) A/D control register0 (ADCON0) A/D control register1 (ADCON1)

130 ADCON0 (address: 1FH) Controla las operaciones del modulo A/D.

Gustavo A. Yarce

Figura 10.8: AdCON0

Bit 6-7: ADCS1:ADCS2: bits de seleccin del reloj de conversin. 00 = fosc/2 01 = fosc/8 10 = fosc/32 11= Frc (el reloj deriva del oscilador RC interno del modulo A/D; modo sleep)

bit 5-6: CHS2:CHS0: bits de seleccin del canal analgico 000 = channel 0 (RA0/AN0) 001 = channel 1 (RA1/AN1) 010 = channel 2 (RA2/AN2) 011 = channel 3 (RA3/AN3) 100 = channel 4 (RA4/AN4) 101 = channel 5 (RE0/AN5) 110 = channel 6 (RE1/AN6) 111 = channel 7 (RE2/AN7) bit 2: GO/DONE: bit de estado de la conversin A/D si ADON = 1 = conversin A/D en proceso 0 = la conversin no esta en proceso (este bit se borra automticamente por el hardware cuando la conversin A/D termina) bit 1: no implementado: se lee como 0 bit 0: ADON: bit de encendido 1 = el conversor esta operando

Computadoras Electrnicas 0 = el conversor esta apagado

131

ADCON1 (addess: 9FH) Congura las funciones de los puertos. Los puertos pueden ser congurados como entradas analgicas o como entrada digital.

Figura 10.9: ADCON1

bit 7: ADFM: bit de seleccin de formato de resultado A/D 1 = justificacin a derecha. Los 6 bits ms significativos de ADRESH son ledos como 0 0 = justificacin a izquierda. Los 6 bits menos significativos de ADRESL son ledos como 0 bit 6-4: no implementados: se leen como 0 bit 3-0: PCFG3: PCFG0: bits de control de la configuracin de los puertos

La columna CHAN/Refs indica el nmero de canales analgicos disponibles como entradas A/D y el nmero de canales analgicos usados como entradas de referencia de voltaje.

Conguracin de los puertos analgicos: Los registros ADCON1 y TRIS controlan la operacin de los puertos A/D. los puertos que se deseen congurar como entradas analgicas deben tener su

132

Gustavo A. Yarce

Figura 10.10: PCFG0:PCFG3

correspondiente bit TRIS a uno (entrada). Si el bit TRIS se pone a cero (salida) el nivel de salida digital (Voh o Vol) ser convertido.

ADRESH : ADRESL Estos registros contienen los 10 bits del resultado de la conversin A/D. Cada uno de estos registros es de 8 bits por lo que entre los dos suman un total de 16 bits. El conversor A/D tiene exibilidad para ajustar a la derecha o a la izquierda los 10 bits que son el resultado de la conversin en los 16 bits de los registros de resultado. El bit de seleccin de formato (ADFM; bit 7 del registro ADCON1) controla esta justicacin. Con el bit de seleccin de formato a 1 la justicacin ser a la derecha, y puesto a 0 la justicacin ser a la izquierda. Los bits sobrantes se guardan con ceros. Cuando la conversin A/D esta desactivada estos registros son usados como dos registros de 8 bits de uso general. Cuando la conversin se completa los resultados se cargan en este par de registros. El bit GO/DONE se pone a cero y la bandera (ag) del bit de interrupcin se prepara ponindose a 1

Computadoras Electrnicas

133

Despus que el modulo A/D se congura (ADCON1: bits 3-0) el canal deseado se debe adquirir antes de comenzar la conversin. Los canales de la entrada analgica deben tener su bit de TRIS seleccionados como entradas. Cuando el tiempo de adquisicin naliza la conversin puede empezar. Pasos para llevar a cabo una conversin: 1. conguracin del modulo A/D 2. conguracin de los puertos analgicos y de la referencia de voltaje (ADCON1: bits 3-0) 3. seleccin del canal de entrada (ADCON0 bits 5-3) 4. seleccin del reloj de conversin (ADCON0: bits 7-6) 5. encender el modulo A/D (ADCON0: bit 1) 6. espera del tiempo de adquisicin requerido. 7. empezar la conversin 8. esperar que se complete la traduccin.Vericar el bit GO/DONE hasta que se borre o esperando la Interrupcin del A/D. 9. leer el resultado almacenado en ADRESH:ADRESL borrar el bit ADIF si se requiere. 10. El tiempo de conversin por bit se dene como Tad, una espera mnima de dos Tads es necesaria asta que empiece la otra adquisicin. 11. Vovler a 5

10.11.

El ADC en CCs

El CCs posee las siguientes funciones para manejar el conversor AD son: setup_adc(modo); Esta funcin prepara o congura el conversor A/D, donde modo puede tomar el siguiente valor:

134 adc_o adc_clock_internal adc_clock_div_2 adc_clock_div_8 adc_clock_div_32

Gustavo A. Yarce

setup_adc_ports(valor); Esta funcin congura los pines del ADC para que sean analgicos, digitales o alguna combinacin de ambos. Las combinaciones permitidas varan, dependiendo del chip.Las constantes ALL_ANALOG y NO_ANALOGS son vlidas para todos los chips. setup_adc_ports(RA0_RA1_RA3_ANALOG); setup_adc_ports( ALL_ANALOG ); Valor: dene las entradas analgicas correspondientes a los bits 3-0 del ADCON1.

setup_adc_channel(canal); Especica el canal a utilizar por la funcin READ_ADC(). El nmero de canal empieza en 0. Es preciso esperar un corto espacio de tiempo despus de cambiar el canal de adquisicin, antes de que se puedan obtener lecturas de datos vlidos. 0 - an0 1 - an1 2 - an2 3 - an3 4 - an4 5 - an5

Computadoras Electrnicas 6 - an6 7 - an7

135

valor=read_adc(); Esta funcin lee el valor digital del conversor analgico digital. Deben hacerse llamadas a SETUP_ADC() y SET_ADC_CHANNEL() en algn momento antes de la llamada a esta funcin. Ej: #device adc=10; //dene el conversor con 10 bits de resolucin #device adc=8; //dene el conversor con 8 bits de resolucin La directiva read_adc() admite tres modos de funcionamientos:

adc_start_and_read = Inicia la conversin y leer el conversor. adc_start_only = Slo inicia la conversin. adc_read_only = Slo lee los registros del convertidor.

Ejemplo 10.1 #include <16F873a.h>


#device adc=10 #fuses xt,nowdt #use delay(clock=4000000) void main() { int16 q; setup_adc_ports(an0); setup_adc(adc_clock_internal);

//Canal 0 analgico //Fuente de reloj RC

for (;;) { set_adc_channel(0);

//Habilitacin canal 0

136 delay_us(20); q = read_adc(); } }

Gustavo A. Yarce

//Lectura canal

Funciones Adicionales

i=ATOI(char *ptr) Esta funcin convierte la cadena de caracteres apuntada por ptr en un valor de tipo entero. Acepta argumentos en decimal y en hexadecimal. Si el resultado no se puede representar, el comportamiento es indeterminado. El prototipo de esta funcin est en el chero de cabecera stdlib.h

i=ATOL(char *ptr) Esta funcin convierte la cadena de caracteres apuntada por ptr en un nmero entero largo (long). Acepta argumentos en decimal y en hexadecimal. Si el resultado no se puede representar, el comportamiento es indeterminado. El prototipo de esta funcin est en el chero de cabecera stdlib.h

10.12.

Conversin digital - analgica (D/A)

Partimos de una seal digital D = dn dn1 ...d1 en paralelo que responde a la codicacin binaria natural y una referencia Xref (podra ser una tensin o una corriente) y pretendemos obtener una seal analgica x que vare de a saltos iguales a Xref 2n entre 0 y (2n 1)Xref = Xref (1 2n ) n 2 como se muestra en la g. 10.12

Computadoras Electrnicas

137

Figura 10.11: Relacin entre la entrada digital D y la salida analgica x de un conversor


digital-analgico, con n = 3.

La estructura genrica de este tipo de conversores es la que se ha indicado en la g. 10.12

Figura 10.12: Estructura de un conversor digital-analgico. Xref es la referencia,


dn d1 la entrada digital y x la respuesta analgica.

138

Gustavo A. Yarce

10.13.

Mtodo de conmutacin de corrientes ponderadas

Una primera idea consiste en utilizar una serie de fuentes de corriente ponderadas que concurren a un nudo sumador de corrientes. Cada corriente se conmuta en funcin del valor del bit correspondiente. Esta idea se implementa con resistencias y llaves analgicas. La corriente ik por la k-sima rama es ik = dk VREF nk+1 R 2 k = 1, ..., n

V = dn

1 1 1 + dn1 2 + + d1 n 2R 2R 2 R

VREF R

Figura 10.13: Circuito equivalente de un conversor digital-analgico de resistencias


ponderadas..

VREF V = n 2

dk 2k1
k=1

Computadoras Electrnicas

139

10.14.

Mtodo de la red escalera R-2R

Una red resistiva como la indicada en la gura 2.5 tiene la particularidad de que cualquiera sea el nmero de secciones la resistencia vista (excepto al nal) es R. Este circuito puede usarse como se muestra en la gura 2.6 para obtener un conversor digital analgico muy eciente.

Figura 10.14: Una red R-2R. La resistencia vista es siempre R

10.15.

Especicaciones de los conversores D/A

Para una aplicacin efectiva de los conversores digital-analgicos es preciso conocer y saber interpretar las especicaciones de los mismos, ya que ponen de maniesto las limitaciones as como las verdaderas prestaciones, que en muchos casos dieren considerablemente de la idealidad. A continuacin presentamos una descripcin de las especicaciones ms importantes. Resolucin: es la cantidad de bits o dgitos binarios que acepta en su entrada. Tambin puede expresarse como el porcentaje del valor nominal mximo (fondo de escala). Ejemplo: un conversor de 10 bits tambin puede tener su resolucin expresada como 1/21 0 0, 0976 % . Observar que la = resolucin por s sola no indica nada respecto a la precisin del conversor.

140

Gustavo A. Yarce

Figura 10.15: Circuito Prctico R-2R

Exactitud: es la mxima desviacin respecto a la lnea recta que une el mnimo y el mximo valor ideales. Se expresa en LSB (least signicant bit), lo cual signica que se usa el salto mnimo nominal como unidad. Otra forma de expresarlo es en porcentaje del valor mximo nominal. La exactitud ideal es 0 LSB. Es necesario tener en cuenta que esta especicacin incluye todos los errores posibles del conversor

Computadoras Electrnicas

141

Figura 10.16: Exactitud

Error de escala: Es el error que se obtiene a fondo de escala con respecto al valor ideal. Se debe en general a errores de ganancia, en la referencia o en la red resistiva. Se expresa tambin en LSB a fondo de escala. El error de escala ideal es 0 LSB.

Figura 10.17: Error de escala

Error de oset: Es el valor de salida obtenido cuando la entrada es nula. Se mide en porcentaje del mximo nominal o en LSB. El valor ideal es 0 LSB.

142

Gustavo A. Yarce

Figura 10.18: Error de oset

Tiempo de establecimiento: Es el mximo tiempo transcurrido luego de un cambio de cdigo de entrada arbitrario para alcanzar el valor analgico correspondiente con un error de a lo sumo 0,5 LSB. El tiempo de establecimiento de un conversor D/A tiene dos componentes: una debida al comportamiento dinmico lineal y otra debido al slew-rate del amplicador operacional (fenmeno no lineal). La primera se debe a las capacidades parsitas en paralelo con las llaves analgicas, que hacen que la conmutacin entre un cdigo de entrada y otro no sea instantnea. Sus caractersticas son similares a las de cualquier transitorio, con una aproximacin exponencial al valor nal. La componente debida al slew-rate del amplicador se caracteriza por un crecimiento lineal con pendiente ja, por lo cual cuanto mayor sea la amplitud del salto (por ejemplo un cambio en la entrada de 00...0 a 11...1) mayor ser el tiempo de crecimiento. En general predomina el efecto del slew-rate, salvo que se usen amplicadores de muy alta velocidad. Slew-rate: mxima pendiente de la salida ante una conmutacin del cdigo de entrada. Su efecto es ms notorio en las transiciones grandes (o a fondo de escala). En general, se debe no a la red R-2R sino al amplicador que convierte corriente en tensin.

Captulo 11 PWM
11.1. Introduccin

La modulacin por ancho de pulsos,PWM(Pulse-Width Modulation) de una seal o fuente de energa es una tcnica en la que se modica el ciclo de trabajo de una seal peridica, ya sea para transmitir informacin a travs de un canal de comunicaciones o para controlar la cantidad de energa que se enva a una carga. El ciclo de trabajo de una seal peridica es el ancho relativo de su parte positiva en relacin con el perodo. Expresado matemticamente: D= D es el ciclo de trabajo es el tiempo en que la funcin es positiva (ancho del pulso) T es el perodo de la funcin T

La construccin tpica de un circuito PWM se lleva a cabo mediante un comparador con dos entradas y una salida. Una de las entradas se conecta a un oscilador de onda dientes de sierra, mientras que la otra queda disponible para la seal moduladora. En la salida la frecuencia es generalmente igual a la de la seal dientes de sierra, y el ciclo de trabajo est en funcin de la portadora. La principal desventaja que presentan los circuitos PWM es la posibilidad de que haya interferencias generadas por radiofrecuencia. stas pueden minimizarse ubicando el controlador cerca de la carga y realizando un ltrado de la fuente de alimentacin. 143

144

Gustavo A. Yarce

Figura 11.1: Seal PWM

11.2.

PWM en un microcontrolador

Los microcontroladores de la serie 16f87x poseen dos modulos CCP, que permiten realizar: 1. Modo captura. 2. Modo comparacin. 3. Modo PWM.

El mdulo CCP1 utiliza un registro de trabajo de 16 bits que esta formado por la concatenacin de los registros CCPR1H-CCPR1L (direcciones 16h y 15h). El registro de control del mdulo CCP1 es el CCP1CON(17H). El mdulo CCP2 tiene como registro de trabajo CCPR2H-CCPR2L(1Ch-1Bh) y un registro de control CCP2CON(1Dh). Cuando se trabaja en el modo PWM, el pin RC2/CCP1 esta congurado como salida y alterna su valor entre 0 y 1. Para lograr esta alternancia se usa un comparador que pone a 1 un ip-op cuando el valor del registro PR2 coincide con la parte alta del TMR2, momento en el cual toma el valor 00h. El el ip-op se pone a cero cuando otro comparador detecta la coincidencia del valor existente en CCPR1H con el de la parte alta del TMR2. Por lo tanto variando los valores que se cargan en PR2 y CCPR1L se vara el intervalo de tiempo del pin RC2/CCP1.

Computadoras Electrnicas

145

Cuando se trabaja con una resolucin de 10 bits, los dos bits CCP1CON<5:4>se concatenan con los 8 bits de CCPR1L, y de la misma forma, los 8 bits de mas peso de TMR2 se concatenan con los dos bits de menos peso del reloj interno, haciendo que el TMR2 cuente cada TOSC en vez de cada 4TOSC . El tiempo que dura el perodo de la seal depende del valor cargado en PR2: P er P W M = [(P R2) + 1] 4 TOSC (T M R2 V alor del P rescaler) iodo Cuando el valor de TMR2 coincide con el de PR2 sucede: 1. se borra TMR2 2. el pin RC2/CCP1 se pone a 1 3. el valor de CCPR1L, que determina la anchura del impulso, se carga en CCPR1H.

El tiempo que la pin RC2/CCP1 esta a nivel alto, depende del valor cargado en CCPR1L y de los bits 5 y 4 del CCP1CON Ancho del pulso = (CCP R1L : CCP 1CON<5:4> )TOSC (T M R2 V alor del P rescale) (CCP R1L : CCP 1CON<5:4> ) 4(P R2 + 1)

Ciclo util =

El procedimiento para congurar el modo PWM es el siguiente: 1. Asignar el perodo cargando el valor adecuado en PR2. 2. Asignar el ancho del pulso cargando el registro CCPR1L y los dos bits 5 y 4 del CCP1CON. 3. Congurar el pin RC2/CCP1 como salida. 4. Asignar el valor del Prescaler y activar el TMR2 escribiendo en T2CON. 5. Congurar el mdulo CCP1 en modo PWM.

146

Gustavo A. Yarce

11.3.

PWM en CCs

Para congurar el mdulo CCP en modo PWM se debe realizar 1. Congurar el modo PWM

setup_ccp1(CCP_PWM); 2. Congurar el modo del prescaler y el perodo PWM setup_timer_2(modo, perodo,postscala) donde modo =

T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16 postscala=1

3. Por ltimo debemos poner el valor de los ciclos de reloj que queremos para mantener el PIN RC2/CCP en alto. set_pwm1_duty=(valor)

Computadoras Electrnicas

147

Ejemplo 11.1 .
#include<16f873a.h> #fuses XT,NOWDT,NOPROTECT,noPUT,NOLVP #use delay(clock=4000000) #use fast_io(c) void main() { set_tris_c(0x00); setup_ccp1(CCP_PWM); setup_timer_2(T2_DIV_BY_1, 11, 1); set_pwm1_duty(100); } while(0==0) { } }

11.3.1.

Ejemplo de clculo PWM

Supongamos que se desea una frecuencia de 1500 Hz a un ciclo de trabajo de 30 % con una frecuencia del oscilador de 4MHz. Segn la frmula de clculo del perodo: P er P W M = [(P R2) + 1] 4 TOSC (T M R2 V alor del P rescaler) iodo Por lo tanto P er P W M = iodo 1 FP W M = 1 = 6, 67x104 1500Hz

1 = 250ns 4M Hz Necesitamos encontrar el valor que se carga en el registro PR2, para ello debemos jar el valor del Prescaler del TMR2. Recordar que el valor de este puede ser 1, 4 o 16. El valor de PR2 para los diferentes valores del Prescaler da, TOSC =

148

Gustavo A. Yarce

P R2 =

4 TOSC

P er P W M iodo 1 (T M R2 V alor del P rescaler)

Perodo 6, 67x104 6, 67x104 6, 67x104

Prescaler PR2 1 665,67 4 165,67 16 40,67

El valor correspondiente a PR2 es el de un registro de 8bits, por lo que el valor mximo que puede adoptar es 255. Analizando los valores calculados se puede ver que el valor 665,67 no es admisible. Quedan los otros dos valores, 165,67 40,67 Los valores admisibles sern tipo BYTE, por lo tanto 165, 67 = 40, 67 = 165 166 40 41

PR2 165 166 40 41

Frec_PWM Error 1506,024096 6,02 1497,005988 2,99 1524,390244 24,39 1488,095238 11,90

Se puede deducir que el valor apropiado para el TMR2 es el de 166, con un valor para el prescaler de 4. Si queremos un ciclo de trabajo del 30 %, signica que el valor donde se repite el periodo (PR2+1) es 167, debemos encontrar el valor de (CCP R1L : CCP 1CON<5:4> ) = Ciclo util (4 (P R2 + 1)) = 0, 3 (4 (166 + 1)) = 200, 40

Computadoras Electrnicas

149

Tomaremos como valor (CCP R1L : CCP 1CON<5:4> ) = 200 Para utilizar los 10 bits de resolucin el CCS debe saber que el parmetro de set_pwm_duty() es un entero de 16 bits,INT16 o LONG, de otra manera lo tomar como 8 bits, solo tomar el CCPR1L, Por lo tanto nuestro calculo nal resulta en: PR2 = 166 (CCP R1L : CCP 1CON<5:4> ) = 200 Valor del Prescaler TMR2 = 4

El cdigo de conguracin ser, 30 % setup_ccp1(ccp_PWM); setup_timer_2(t2_div_By_4,166,1); set_pwm_duty(200L);

Ciclo til 30 % 50 % 75 %

Frec_PWM 1500 1500 1500

(CCP R1L : CCP 1CON<5:4> ) 200 334 500