Computadoras Electronicas

149
I.P.E.T. Juan XXIII Computadoras Electrónicas Gustavo A. Yarce Paraná - Entre Ríos 2012

Transcript of Computadoras Electronicas

Page 1: Computadoras Electronicas

I.P.E.T. Juan XXIII

Computadoras Electrónicas

Gustavo A. Yarce

Paraná - Entre Ríos2012

Page 2: Computadoras Electronicas

2 Gustavo A. Yarce

Page 3: Computadoras Electronicas

Índice general

1. Microcontroladores 111.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.2. Estructura de un microcontrolador . . . . . . . . . . . . . . . . . . 121.3. Estructura Interna . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2. El PIC16f873 172.1. Estructura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.2. El reloj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.3. Osciladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.4. Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3. Estructura de la memoria 233.1. Memoria de Programa . . . . . . . . . . . . . . . . . . . . . . . . . 233.2. Memoria de Datos(RAM) . . . . . . . . . . . . . . . . . . . . . . . 243.3. Registros Específicos - El PC . . . . . . . . . . . . . . . . . . . . . 24

3.3.1. La pila . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263.4. Direccionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.5. Los Puertos del PIC . . . . . . . . . . . . . . . . . . . . . . . . . . 283.6. Puerto A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.7. Puerto B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.8. Puerto C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.9. El Registro de Estado . . . . . . . . . . . . . . . . . . . . . . . . . 313.10. El acumulador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4. Lenguaje Ensamblador 354.1. Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354.2. Instrucciones del MPLAB . . . . . . . . . . . . . . . . . . . . . . . 384.3. Estructura de un programa ASM . . . . . . . . . . . . . . . . . . . 39

5. Programación 415.1. CALL - RETURN . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

3

Page 4: Computadoras Electronicas

4 Gustavo A. Yarce

5.2. Rutinas de retardo . . . . . . . . . . . . . . . . . . . . . . . . . . . 425.2.1. Rutina simple de retardo . . . . . . . . . . . . . . . . . . . . 425.2.2. Rutina de demora doble . . . . . . . . . . . . . . . . . . . . 435.2.3. Rutina de retardo triple . . . . . . . . . . . . . . . . . . . . 45

6. Programación en C de Microcontroladores 476.1. Introducción a CCs . . . . . . . . . . . . . . . . . . . . . . . . . . . 476.2. Estructura de un programa en C . . . . . . . . . . . . . . . . . . . 48

6.2.1. CCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496.3. Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

6.3.1. Expresiones . . . . . . . . . . . . . . . . . . . . . . . . . . . 506.3.2. Variables Locales y Globales . . . . . . . . . . . . . . . . . . 516.3.3. Conversiones entre tipos . . . . . . . . . . . . . . . . . . . . 52

6.4. Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.5. Preámbulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

6.5.1. #INCLUDE . . . . . . . . . . . . . . . . . . . . . . . . . . . 556.5.2. #FUSES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566.5.3. #DEFINE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566.5.4. #USE DELAY (CLOCK=frecuencia) . . . . . . . . . . . . . 57

6.6. Directivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586.6.1. #USE FAST_IO (puerto) . . . . . . . . . . . . . . . . . . . 596.6.2. #USE FIXED_IO (puerto_OUTPUTS=pin_x#, pin_x#...) 606.6.3. #USE STANDARD_IO (puerto) . . . . . . . . . . . . . . . 606.6.4. output_x(valor) . . . . . . . . . . . . . . . . . . . . . . . . . 616.6.5. INPUT(pin) . . . . . . . . . . . . . . . . . . . . . . . . . . . 616.6.6. OUTPUT_BIT(pin, value) . . . . . . . . . . . . . . . . . . 616.6.7. OUTPUT_HIGH(pin) . . . . . . . . . . . . . . . . . . . . . 626.6.8. OUTPUT_LOW(pin) . . . . . . . . . . . . . . . . . . . . . 626.6.9. SET_TRIS_puerto(value) . . . . . . . . . . . . . . . . . . 626.6.10. delay_ms(time) . . . . . . . . . . . . . . . . . . . . . . . . . 63

7. Interrupciones 657.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

7.1.1. El Registro de Control de Interrupciones INTCON . . . . . 667.1.2. Registro de permiso de interrupciones 1 (PIE1) . . . . . . . 677.1.3. Registro de permiso de interrupciones 2 (PIE2) . . . . . . . 687.1.4. Registro señalizador de interrupciones 1 y 2(PIR1 y PIR2) . 69

7.2. Interrupciones en CCs . . . . . . . . . . . . . . . . . . . . . . . . . 707.2.1. Interrupción por RB0 . . . . . . . . . . . . . . . . . . . . . . 727.2.2. Interrupción por RB7-RB4 . . . . . . . . . . . . . . . . . . . 73

Page 5: Computadoras Electronicas

Computadoras Electrónicas 5

8. Puerto Serie 758.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758.2. Handshaking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758.3. Comunicaciones seriales en los PC . . . . . . . . . . . . . . . . . . . 768.4. RS-232 .Voltajes y niveles lógicos . . . . . . . . . . . . . . . . . . . 778.5. La velocidad de transmisión de datos . . . . . . . . . . . . . . . . . 788.6. RS-232 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

8.6.1. Secuencia de eventos en una sesión RS-232 . . . . . . . . . . 798.6.2. El cable más simple . . . . . . . . . . . . . . . . . . . . . . . 808.6.3. Diseño de cables para impresoras serie y para transferencias

PC a PC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808.7. Ingreso de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828.8. USB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838.9. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838.10. Objetivos del USB . . . . . . . . . . . . . . . . . . . . . . . . . . . 858.11. Descripción del Sistema . . . . . . . . . . . . . . . . . . . . . . . . 86

8.11.1. Transferencias . . . . . . . . . . . . . . . . . . . . . . . . . . 868.12. Puerto Paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 928.13. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 928.14. Estructura del interface paralelo . . . . . . . . . . . . . . . . . . . . 938.15. Los registros del puerto. . . . . . . . . . . . . . . . . . . . . . . . . 95

8.15.1. Líneas de datos . . . . . . . . . . . . . . . . . . . . . . . . . 968.15.2. Líneas de Estado . . . . . . . . . . . . . . . . . . . . . . . . 978.15.3. Líneas de Control . . . . . . . . . . . . . . . . . . . . . . . . 978.15.4. LECTURA DEL REGISTRO DE ESTADO . . . . . . . . . 988.15.5. Lectura-Escritura del registro de control . . . . . . . . . . . 99

8.16. Precauciones en el manejo del puerto. . . . . . . . . . . . . . . . . 100

9. La transmisión serie 1019.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

9.1.1. Registro TXSTA . . . . . . . . . . . . . . . . . . . . . . . . 1019.1.2. Registro RCSTA . . . . . . . . . . . . . . . . . . . . . . . . 1039.1.3. Registro SPBRG . . . . . . . . . . . . . . . . . . . . . . . . 1059.1.4. La transmisión . . . . . . . . . . . . . . . . . . . . . . . . . 106

9.2. La transmisión serie en CCs . . . . . . . . . . . . . . . . . . . . . . 1089.2.1. Opciones de la directiva #USE RS232 . . . . . . . . . . . . 1089.2.2. Funciones para comunicación serie asíncrona . . . . . . . . . 110

9.3. Uso de las interrupciones . . . . . . . . . . . . . . . . . . . . . . . . 1139.4. Instrucciones para la transmisión serie . . . . . . . . . . . . . . . . 115

9.4.1. GETS(char *string) . . . . . . . . . . . . . . . . . . . . . . . 1169.4.2. PUTS(string) . . . . . . . . . . . . . . . . . . . . . . . . . . 116

Page 6: Computadoras Electronicas

6 Gustavo A. Yarce

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

10.Conversión A/D - D/A 11910.1. Señales analógicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11910.2. Señales digitales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11910.3. Muestreo y retención

(sample and hold) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12010.4. Especificaciones del muestreo y retención . . . . . . . . . . . . . . . 12210.5. Conversión analógica-digital . . . . . . . . . . . . . . . . . . . . . . 12310.6. Métodos directos de conversión A/D . . . . . . . . . . . . . . . . . 123

10.6.1. Conversores flash (en paralelo) . . . . . . . . . . . . . . . . . 12410.6.2. Conversor de simple rampa . . . . . . . . . . . . . . . . . . 125

10.7. Métodos realimentados de conversión A/D . . . . . . . . . . . . . . 12610.7.1. Conversor de rampa discreta . . . . . . . . . . . . . . . . . . 12610.7.2. Conversor de balance continuo . . . . . . . . . . . . . . . . . 127

10.8. Especificaciones de los conversores A/D . . . . . . . . . . . . . . . . 12810.9. El ADC en el PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12910.10.Configuración de Registros . . . . . . . . . . . . . . . . . . . . . . . 12910.11.El ADC en CCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13310.12.Conversión digital - analógica (D/A) . . . . . . . . . . . . . . . . . 13610.13.Método de conmutación de corrientes ponderadas . . . . . . . . . . 13810.14.Método de la red escalera R-2R . . . . . . . . . . . . . . . . . . . . 13910.15.Especificaciones de los conversores D/A . . . . . . . . . . . . . . . . 139

11.PWM 14311.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14311.2. PWM en un microcontrolador . . . . . . . . . . . . . . . . . . . . . 14411.3. PWM en CCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

11.3.1. Ejemplo de cálculo PWM . . . . . . . . . . . . . . . . . . . 147

Page 7: Computadoras Electronicas

Índice de figuras

1.1. Estructura de sistema programable . . . . . . . . . . . . . . . . . . . . 111.2. Estructura de un microcontrolador . . . . . . . . . . . . . . . . . . . . 131.3. Estructura Harvard . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.1. pic16f873 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.2. Esquema del Ciclo de Instrucción . . . . . . . . . . . . . . . . . . . . 20

3.1. Organización de la memoria de Programa . . . . . . . . . . . . . . . . 233.2. Organización de la memoria RAM . . . . . . . . . . . . . . . . . . . . 25

4.1. Programa ASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

6.1. Compilador CCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496.2. Fusibles válidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

8.1. Puerto Serie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768.2. Niveles Lógicas Puerto Serie . . . . . . . . . . . . . . . . . . . . . . . 788.3. Conexión del micro al Puerto Serie . . . . . . . . . . . . . . . . . . . . 828.4. conectores USB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 848.5. Conector Puerto Paralelo en la PC . . . . . . . . . . . . . . . . . . . . 948.6. Registro de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 968.7. Registro de Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . 978.8. Registro de Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . 988.9. Lectura del registro de estado . . . . . . . . . . . . . . . . . . . . . . 988.10. Lectura del registro de control . . . . . . . . . . . . . . . . . . . . . . 998.11. Escritura del registro de control . . . . . . . . . . . . . . . . . . . . . 99

10.1. Circuito de muestreo . . . . . . . . . . . . . . . . . . . . . . . . . . . 12010.2. Circuito de muestreo con retención . . . . . . . . . . . . . . . . . . . 12110.3. Aplicación de un circuito de muestreo y retención. . . . . . . . . . . . 12110.4. Estructura de un conversor analógico-digital flash (en paralelo) de 3 bits. 12410.5. . Esquema de un conversor analógico digital de simple rampa. . . . . . 12510.6. Esquema de un conversor analógico-digital de rampa discreta. . . . . . . 126

7

Page 8: Computadoras Electronicas

8 Gustavo A. Yarce

10.7. Esquema de un conversor analógico-digital de balance continuo. . . . . . 12710.8. AdCON0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13010.9. ADCON1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13110.10.PCFG0:PCFG3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13210.11.Relación entre la entrada digital D y la salida analógica x de un conversor

digital-analógico, con n = 3. . . . . . . . . . . . . . . . . . . . . . . . 13710.12.Estructura de un conversor digital-analógico. Xref es la referencia,

dn · · · d1 la entrada digital y x la respuesta analógica. . . . . . . . . . . 13710.13.Circuito equivalente de un conversor digital-analógico de resistencias

ponderadas.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13810.14.Una red R-2R. La resistencia vista es siempre R . . . . . . . . . . . . . 13910.15.Circuito Práctico R-2R . . . . . . . . . . . . . . . . . . . . . . . . . . 14010.16.Exactitud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14110.17.Error de escala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14110.18.Error de offset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

11.1. Señal PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Page 9: Computadoras Electronicas

Índice de tablas

3.1. Tabla de configuración de bancos . . . . . . . . . . . . . . . . . . . 243.2. Registro de Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

4.1. Instrucciones orientadas a registros . . . . . . . . . . . . . . . . . . 364.2. Instrucciones orientadas a bit . . . . . . . . . . . . . . . . . . . . . 374.3. Instrucciones orientadas a literal y conrol . . . . . . . . . . . . . . . 37

6.1. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506.2. Expresiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506.3. Operadores de asignación . . . . . . . . . . . . . . . . . . . . . . . . 536.4. Operadores aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . 546.5. Operadores de relación . . . . . . . . . . . . . . . . . . . . . . . . . 546.6. Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.7. Operadores de manejo de bits . . . . . . . . . . . . . . . . . . . . . 54

7.1. Registro INTCON . . . . . . . . . . . . . . . . . . . . . . . . . . . 667.2. Registro PIE1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687.3. Registro PIE2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697.4. Registro PIR1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697.5. Registro PIER2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697.6. Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707.7. Valores de habilitación de interrupciones . . . . . . . . . . . . . . . 71

8.1. Registro de Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . 858.2. Direcciones del puerto paralelo . . . . . . . . . . . . . . . . . . . . . 938.3. Nombre y Función de los pines puerto Paralelo . . . . . . . . . . . . 95

9.1. Registros transmisión serie . . . . . . . . . . . . . . . . . . . . . . . 1029.2. Registro TXSTA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029.3. Registro RCSTA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1039.4. Registro SPBRG . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1059.5. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1119.6. Ejemplos de tipos de datos . . . . . . . . . . . . . . . . . . . . . . . 112

9

Page 10: Computadoras Electronicas

Prologo

Este documento no pretende ser un libro completo sobre microcontroladores,es una ayuda para el alumno, para su utilización como guía de aprendizaje.Se tiene como objetivo presentar los conceptos básicos y las característicasgenerales de los dispositivos microprogramables, para el desarrollo y resoluciónde problemas que se presentan en el ámbito técnico.Los temas tratados y el desarrollo que se realiza sobre ellos persiguen la enseñanzaen entornos educativos técnicos de nivel medio que necesitan conocimientos sobreestas tecnologías.Se prioriza la enseñanza de una metodología de programación correcta tratandode conservar la facilidad de uso como herramienta. Siempre se considera que lomás importante es adquirir una base de conocimientos que permita una posteriorevolución hacia conocimientos relacionados con la Electrónica y la programación.

Page 11: Computadoras Electronicas

Capítulo 1

Microcontroladores

1.1. Introducción

Antes de ver qué es un microcontrolador y de analizar sus puntos fuertes y susdefectos, será útil hacer un repaso relativo a la estructura de cualquier sistemaprogramable, que pueda hacer uso de un microcontrolador.

Figura 1.1: Estructura de sistema programable

La figura 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

Page 12: Computadoras Electronicas

12 Gustavo A. Yarce

La memoria RAM

Los circuitos de interfaz

Un bus de interconexión

La presencia de estos elementos básicos es indispensable y aun cuando nosiempre se presenten tan claramente como en nuestro esquema siempre existen.Obsérvese, que son los mismos que los de un sistema informático clásico, perodentro del marco de una aplicación que pueda ser tratada por un microcontrolador.

La unidad central, generalmente constituida por un microprocesador máso menos evolucionado, ejecuta el programa que da vida a la aplicación. Losprogramas pueden ser muy diversos, puesto que, como es evidente, el que asegurala gestión de un termostato inteligente no tiene nada que ver con el que controlael correcto funcionamiento de una fotocopiadora. Sin embargo, estos programastienen en común el hecho de que muy raramente necesitan cálculos complejosy, en cambio, sí suelen incluir numerosas manipulaciones de la información deentrada/salida.

El programa se almacena en un segundo elemento, que es la memoria ROM.Esta memoria puede constituirse de diferentes formas: UVPROM, EEPROM uOTPROM, cualquiera que sea la que se utilice es una memoria no volátil desdela que se ejecutará el programa una vez alimentado el sistema. Para podertrabajar correctamente, nuestro microprocesador necesita, a menudo, almacenardatos 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 loselementos de la figura 1.1 en un único encapsulado. El esquema básico de unmicrocontrolador sería

Encontramos en él la unidad central pero se ha simplificado con respecto alos microprocesadores clásicos. En contrapartida se le han añadido instrucciones

Page 13: Computadoras Electronicas

Computadoras Electrónicas 13

Figura 1.2: Estructura de un microcontrolador

de manejo de bits, muy útiles para las entradas/salidas. En ciertos circuitos, estaunidad central está dotada de un gran número de registros internos, que sirven dememoria RAM, por lo que puede parecer que ésta última está ausente de algunosesquemas.

A continuación podemos ver la memoria ROM, aunque ésta no siempre aparece.Cierto número de microcontroladores estaban, y todavía están, disponibles sinROM (ROMless).

Posteriormente, los fabricantes han introducido en el chip una memoriaprogramable eléctricamente y borrable mediante rayos ultravioleta (UVPROM)o, más recientemente, borrable eléctricamente (EEPROM).

Un último producto para almacenar de forma no volátil son las memoriasFLASH, de bajo consumo, que se puede escribir y borrar en circuito al igualque las EEPROM, pero suelen disponer de mayor capacidad que estas últimas.El borrado solo es posible con bloques completos y no se puede realizar sobreposiciones concretas.

En lo referente a la memoria RAM, suele utilizarse una del tipo SRAM(RAM estática) de pequeño tamaño, por qué generalmente la unidad centralposee suficientes registros para realizar operaciones intermedias. En algunos casos,esta memoria se completa con una EEPROM de datos, que memoriza de formasemipermanente datos del usuario que se manejan como constante en la ejecucióndel programa y que de vez en cuando (pasados meses o años) deben ser modificados.

Page 14: Computadoras Electronicas

14 Gustavo A. Yarce

Algo más delicado es hacer un esquema tipo para los circuitos de interfaz, yaque es un punto donde se distinguen los diferentes microcontroladores, en funciónde las aplicaciones que pretenden. No obstante se pueden encontrar los siguienteselementos básicos:

Líneas de entrada/salida paralelo, en cantidad variable, según la finalidad yel tamaño del encapsulado (se plantea un problema de número máximo depines debido al crecimiento del número de estas líneas).

Al menos una interfaz de entrada/salida serie asíncrona, más o menosevolucionada según los circuitos.

Uno o varios temporizadores internos cuyas posibilidades pueden ser muyvariables pero que, generalmente, funcionan como contadores ascendentes ydescendentes, generadores de impulsos programables, etc.

Uno o varios convertidores analógicos/digitales, precedidos o no de multiple-xores para ofrecer varias vías.

A veces, pero es raro, un covertidor digital/analógico.

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

1.3. Estructura Interna

En general un microcontrolador puede poseer la mayoría de los componentesmas comunes de una PC, con la particularidad de no poder variar estoscomponentes, de ahí, que se deba buscar el microcontrolador con las característicasespeciales para nuestro trabajo.

El microcontrolador puede tener algunas de estas características:

Procesador

Page 15: Computadoras Electronicas

Computadoras Electrónicas 15

Memoria no volátil para contener el programa.

Memoria de lectura y escritura para guardar los datos.

Líneas de E-S para los controladores de periféricos.

Circuito de reloj interno o externo.

Temporizadores.

Conversores AD y DA.

Comparadores analógicos.

Estado de reposo o de bajo consumo.

La arquitectura Harvard se caracteriza por un esuema donde son independientesla memoria de instrucciones(FLASH) y la memoria de datos y cada una disponede su propio sistema de buses para el acceso. Esta dualidad, además de propiciarel paralelismo, permite la adecuación del tamaño de las palabras y los buses a losrequerimientos específicos de las instrucciones y de los datos.

El procesador se creó según la arquitectura RISC (Computadores de Juego deInstrucciones Reducido), que se identifica por poseer un repertorio de instruccionespequeño y simple, de forma que la mayor parte de las instrucciones se ejecuta enun ciclo de instrucción.

La segmentación del procesador (pipe-line), permite aumentar el rendimientomediante un trabajo en paralelo, para poder procesar una instrucción diferente encada una de ellas y trabajar con varias a la vez.

CPU

Memoria de Datos (SRAM)

Memoria deInstrucciones (FLASH)

Bus de dirección de datos

Bus de datos

Bus de dirección de instrucciones

Bus de Instrucciones

9

8

13

14

Figura 1.3: Estructura Harvard

Page 16: Computadoras Electronicas

16 Gustavo A. Yarce

Page 17: Computadoras Electronicas

Capítulo 2

El PIC16f873

2.1. Estructura

Microcontrolador diseñado por la empresa Microchip (http://www.microchip.com),que se fabrica en varias versiones de las cuales se analizará con más detalle elpic16f873. Son idénticas en cuanto a su arquitectura interna todos los pic de lafamilia 16f87x a excepción de la memoria ROM y la memoria RAM y puertos.

La memoria EEPROM y la Flash son eléctricamente grabables y borrables,lo que permite escribir y borrar el programa bajo prueba manteniendo elmicrocontrolador en el mismo zócalo y usando el mismo dispositivo para grabary borrar. Esta característica supone una gran ventaja frente a la mayoría delos microcontroladores, que tienen como memoria de programa reescribible unatipo EPROM. Se graba eléctricamente, pero para borrarlas hay que someterlasdurante cierto tiempo a rayos ultravioleta, lo que implica sacar del zócalo el circuitointegrado y colocarlo en un borrador de EPROM.

Otra ventaja del PIC16F873 en cuanto a simplificar el proceso de escritura,borrado y reescritura de programas, tan necesario en la fase de diseño, es su sistemade grabación de datos, que se realiza en serie. Para escribir un programa en lamemoria se manda la información en serie usando sólo dos pins, una para la señalde reloj y otra para los datos serie. A continuación exponemos las característicasmás significativas:

Frecuencia de operación 20 MHz

17

Page 18: Computadoras Electronicas

18 Gustavo A. Yarce

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

Módulos de Captura/Comparacion/PWM 2

Comunicación serial tipo MSSP, USART

Módulo de conversión Análogo-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 laFigura 2.1 y la descripción de cada pin se muestran en el cuadro

Figura 2.1: pic16f873

Page 19: Computadoras Electronicas

Computadoras Electrónicas 19

2.2. El reloj

La frecuencia de trabajo del microcontrolador es un parámetro fundamental ala hora de establecer la velocidad de ejecución de instrucciones y el consumo deenergía.

Cuando un PIC16F873 funciona a 20 MHz, que es su máxima frecuencia, lecorresponde un ciclo de instrucción de 200 ns, puesto que cada instrucción tardaen ejecutarse 4 períodos de reloj, o sea,

Ciclo de instruccion =4

fOSC

=4

20MHZ= 200ns

Todas las instrucciones del PIC se realizan en un ciclo de instrucción, menoslas de salto que tardan el doble.

Los impulsos de reloj entrar por la pin OSC1/CLKIN y se dividen por 4internamente, dando lugar a las señales Q1, Q2, Q3 y Q4. Durante un ciclo deinstrucción, que comprende las cuatro señales mencionadas, se desarrollan lassiguientes operaciones:

Q1: Durante este impulso se incrementa el Contador de Programa.

Q4: Durante este impulso se busca el código de la instrucción en la memoriadel programa y se carga en el Registro de Instrucciones.

Q2-Q3: Durante la activación de estas dos señales se produce la decodificacióny la ejecución de la instrucción.

Para conseguir ejecutar cada instrucción en un ciclo de instrucción (excepto lasde salto), se aplica la técnica de segmentación o pipe-line, que consiste en realizaren paralelo las dos fases que comprende cada instrucción.

La estructura segmentada del procesador permite realizar al mismo tiempo lafase de ejecución de una instrucción y la de búsqueda de la siguiente. Cuando lainstrucción ejecutada corresponde a un salto no se conoce cuál será la siguientehasta que se realice, por eso en esta situación se sustituye la fase de búsqueda porun ciclo “vacio”, originando que las instrucciones de salto tarde en realizarse dosciclos de instrucción.

Page 20: Computadoras Electronicas

20 Gustavo A. Yarce

Figura 2.2: Esquema del Ciclo de Instrucción

2.3. Osciladores

Los PIC admiten cuatro tipos de osciladores externos para aplicarles lafrecuencia de funcionamiento, se colocan entre las pins OSC1 y OSC2. El tipoempleado debe especificarse en dos bits de la “Palabra de Configuración”, como secomentará más adelante. Los tipos que se pueden emplear son:

Oscilador RC: Es un oscilador de bajo coste formado por una simpleresistencia y un condensador. Proporciona una estabilidad mediocre de lafrecuencia, cuyo valor depende de los valores de los dos elementos R-C.

Oscilador HS: Es un oscilador que alcanza una alta velocidad comprendidaentre 4 y 10 MHz y está basado en un cristal de cuarzo o un resonadorcerámico.

Oscilador XT: Es un oscilador de cristal o resonador para frecuenciasestándar comprendidas entre 100 KHz y 4 MHz.

Oscilador LP: Oscilador de bajo consumo con cristal o resonador diseñadopara trabajar en un rango de frecuencias de 35 a 200 KHz.

Page 21: Computadoras Electronicas

Computadoras Electrónicas 21

2.4. Reset

Cuando se aplica un nivel lógico bajo a la pin MCLR# el microcontroladorreinicializa su estado. Dos acciones importantes se producen en la reinicializacióno Reset:

1. El Contador de Programa se carga con la dirección 0, apuntando a la primeradirección de la memoria de programa en donde deberá estar situada laprimera instrucción del programa de aplicación.

2. la mayoría de los registros de estado y control del procesador toman unestado conocido y determinado.

Se puede provocar el Reset de varias maneras, pero si se desea realizarmanualmente, habrá que colocar, conectado al pin MCLR#, que al ser apretadogenere un nivel lógico bajo.

Page 22: Computadoras Electronicas

22 Gustavo A. Yarce

Page 23: Computadoras Electronicas

Capítulo 3

Estructura de la memoria

3.1. Memoria de Programa

La memoria FLASH tiene una capacidad 4K palabras de 14 bits cada una. Estamemoria está dividida en páginas de 2K y esta direccionado con el PC(3.3), quetiene un tamaño de 13 bits.

Figura 3.1: Organización de la memoria de Programa

23

Page 24: Computadoras Electronicas

24 Gustavo A. Yarce

3.2. Memoria de Datos(RAM)

La memoria RAM de datos de los PIC 16F873 posee una capacidad de 192bytes, 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 RP1 RP00 0 01 0 12 1 03 1 1

Tabla 3.1: Tabla de configuración de bancos

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

1. Area de RAM estática o SRAM, se alojan los registros operativosfundamentales en el funcionamiento del procesador y en el manejo de todoslos periféricos y registros que el se pueden como información de trabajopropia de la aplicación.

2. Area EEPROM, de 64 bytes donde, opcionalmente, se pueden almacenardatos que no se pierden al deconectar la alimentación.

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

3.3. Registros Específicos - El PC

Los 13 bits contenidos en el PC, que direccionan la memoria de código, estánguardados en dos registros específicos. El registro PCL(02h) guarda los 8 bits de

Page 25: Computadoras Electronicas

Computadoras Electrónicas 25

Figura 3.2: Organización 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 leído ni escrito, se accede a él a través del PCLATH(0Ah).

Las instrucciones de salto CALL y GOTO sólo proporcionan 11 bits de ladirección a saltar, esto es una limitante del tamaño del salto que se puede producir,siendo su tamaño máximo de 2K.Al resetearse el PIC, todos los bits del PC toman valor 1, de manera que ladirección de arranque del programa es siempre la ultima posición de memoriade programa. En esta posición se deberá poner una instrucción de salto al punto

Page 26: Computadoras Electronicas

26 Gustavo A. Yarce

donde verdaderamente se inicia el programa. A diferencia de la mayoría de losmicroprocesadores convencionales, el PC es también accesible al programadorcomo registro de memoria interna de datos, en la posición de 02. Es decir quecualquier instrucción común que opere sobre registros puede ser utilizada paraalterar el PC y desviar la ejecución del programa. El uso indiscriminado de estetipo de instrucciones complica el programa y puede ser muy peligroso, ya quepuede producir comportamientos difíciles de predecir. Sin embargo, algunas de estainstrucciones utilizadas con cierto método, pueden ser muy útiles para implementarpoderosas estructuras de control tales como el goto computado. Como el PIC operacon datos de 8 bits, y la memoria de datos es también de 8 bits, estas instruccionessolo pueden leer o modificar los bits 0 a 7 del PC.

Para saltar entre una página y otra, los bits más significativos del PC deberánser modificados. Debido a que las instrucciones GOTO y CALL sólo puedendireccionar un bloque de 2K (pues usan una dirección de 11 bits) deben existir otrosdos bits que completen los 13 bits del PC para moverse sobre los 4K de memoriade 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 unGOTO o un CALL el usuario deberá asegurarse que estos bits apunten a la páginadeseada. Si las instrucciones se ejecutan secuencialmente el PC cruza librementelos límites de página 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 dela memoria de datos y la memoria de programa. El stack consta de 8 niveles de 13bits cada uno. Esta memoria es usada por la CPU para almacenar las direccionesde retorno de subrutinas. El apuntador de stack no es ni legible ni escribible.Cuando se ejecuta una instrucción CALL o es reconocida una interrupción el PC esguardado en el stack y el apuntador de stack es incrementado en 1 para apuntar a lasiguiente posición vacía. A la inversa, cuando se ejecuta una instrucción RETURN,RETLW o RETFIE el contenido de la posición actual del stack es colocado en elPC.

El Stack o Pila, es una zona de memoria, transparente al usuario, con la cual sesalvan las direcciones cuando se ejecuta la instrucción CALL y las interrupciones,en esta zona se guarda el valor del PC(3.3). Es de vital importancia no sobrepasarel límite de 8 niveles en la realización de programas. PCLATH no se modificaen ninguna de estas operaciones y cuando el apuntador de stack ya está en laposición 8 y se ejecuta otro CALL se reinicia a la posición 1 sobrescribiendo endicha posición. No existe ningún indicador que avise de esta situación.

Page 27: Computadoras Electronicas

Computadoras Electrónicas 27

3.4. Direccionamiento

En los PIC de gama media la memoria de datos está organizada para alojarun máximo de 4 bancos de 128 bytes cada uno. Los PIC16C84 sólo tienenimplementados los 48 primeros bytes de los bancos 0 y 1. En el resto de losPIC de esta familia se destinan dos bits del registro ESTADO (RP0 y RP1) paradeterminar el banco y otros siete

para elegir una de las 128 posiciones del banco seleccionado, tal y como muestrala figura 8.

Direccionamiento Directo: El operando que utiliza la instrucción en cursose referencia mediante su dirección, que viene incluida en el código OP dela misma, concretamente en los 7 bits de menos peso. El banco a accederlo determinan los bits RP0 y RP1 del registro ESTADO. En el caso delPIC16C84 sólo se usa el bit RP0 al tener implementados únicamente dosbancos. Se accede a la RAM de forma inmediata. La dirección de RAM ala que se quiere acceder está implícita en la propia instrucción. Por ejemplo:MOVWF 20 realiza una operación de escritura en la dirección 0x20. Estemodo de direccionamiento es el más habitual.

Direccionamiento Indirecto: Este modo de direccionamiento se usa cuandoen una instrucción se utiliza como operando el registro INDF, que ocupala dirección =de ambos bancos. En realidad el registro INDF no estáimplementado físicamente y cuando se le hace referencia, se accede a ladirección de un banco especificada con los bits de menos peso del registroFSR. El bit de más peso de FSR junto al bit IRP del registro ESTADO seencargan de seleccionar el banco a acceder, mientras que los 7 bits de menospeso apuntan a la posición. Como sólo hay dos bancos en el PIC16C84 eneste modo de direccionamiento, el bit IRP es 0 siempre. En este modo dedireccionamiento se utilizan dos registros especiales: FSR y INDF. FSR esun puntero de RAM, es decir, contiene la dirección de memoria a la quese desea acceder. El registro INDF, utiliza el valor del registro FSR paraacceder al registro deseado. Por ejemplo: si escribimos 20 en FSR y despuésescribimos 215 en INDF, habremos escrito un 215 en la dirección de memoria20 (que era la que contenía FSR). El direccionamiento indirecto se usa paramanejar tablas ó manipular segmentos de memoria. Por ejemplo, Podemosprogramar un bucle, en el cual, incrementamos el valor de FSR para accedera unas direcciones de memoria consecutivas.

Page 28: Computadoras Electronicas

28 Gustavo A. Yarce

3.5. Los Puertos del PIC

Los PIC16f873 disponen de tres puertos de E/S. La Puerta B tiene 8 líneas,RB0-RB7, y también tiene una con funciones multiplexadas, la RB0/INT, que,además de línea típica de E/S, también sirve como pin por la que reciben losimpulsos externos que provocan una interrupción. Además tenemos el puerto C,con 8 líneas.

Cada línea de E/S puede configurarse independientemente como entrada ocomo salida, según se ponga a 1 o a 0, respectivamente, el bit asociado del registrode configuración de cada puerta (TRISA, TRISB y TRISC). Se llaman PORTA,PORTB y PORTC los registros que guardan la información que entra o sale porla puerta y ocupan las direcciones 5 y 6 del banco 0 de la memoria de datos. Losregistros de configuración TRISA, TRISB Y TRISC ocupan las mismas direccionespero en el banco 1. Al reiniciarse el PIC todos los bits de los registros TRIS quedana 1, con lo que las líneas de las puertas quedan configuradas como entradas. Cadalínea de salida puede suministrar una corriente máxima de 20 mA y si es de entradapuede absorber hasta 25 mA. Al existir una limitación en la disipación máxima dela potencia del chip se restringe la corriente máxima de absorción de la Puerta Aa 80 mA y la de suministro a 50 mA. La Puerta B puede absorber un máximo de150 mA y suministrar un total de 100 mA.

3.6. Puerto A

La Puerta A posee 6 líneas, RA0-RA5, y soportan funciones multiplexadas.Son bidireccionales y dependen del valor del registro TRISA. Los pinesRA0/AN0,RA1/AN1 y RA2/AN2, además de líneas de E/S digitales tambiénpueden actuar como los canales 0,1 y 2 por los que se pueden utilizar como entradasal conversor A/D.El pin RA3/AN3,Vref+ puede actuar como entrada de la tensión de referenciapara los periféricos que la precisan. El pin RA4/TOCKI, que puede actuar comolínea de E/S o como el pin por la que se reciben los impulsos que debe contarTMR0.

Las líneas RA3-RA0 admiten niveles de entrada TTL y de salida CMOS. Lalínea RA4/TOCKI dispone de un circuito Trigger Schmitt que proporciona unabuena inmunidad al ruido y la salida tiene drenador abierto. RA4 multiplexa su

Page 29: Computadoras Electronicas

Computadoras Electrónicas 29

función de E/S con la entrada de impulsos externos para el TMR0. En el circuitode la figura 9 se muestra la adaptación de las pins RA3-RA0 a las señales internasdel procesador.

Cuando se lee una línea de la Puerta A se recoge el nivel lógico que tiene en esemomento. Las líneas cuando actúan como salidas están conectadas a unos biestable,lo que significa que sus pins sacan el nivel lógico que se haya cargado por última vezen el registro PUERTAA. La escritura de una puerta, tal y como se ve en la figura9, implica que primero se deposita el nivel lógico en la línea correspondiente del businterno de datos y se activa la señal WRITE, lo que origina el almacenamiento dedicho nivel en el biestable. En esta situación, el biestable de configuración (TRIS)debería tener valor 0 para que actuase como salida. Con estos valores la puerta ORtendría un 0 a su salida y la AND también. Estos valores producen la conducciónde los transistores MOS, en función del valor escrito, dando como salida final VDDo VSS (1 ó 0 respectivamente).

Si una línea actúa como entrada, el nivel lógico depositado en ella desdeel exterior pasa a la línea correspondiente del bus interno de datos cuando seactiva la señal READ y se hace conductor el dispositivo triestado que les une. Alprogramarse como entrada, los dos transistores MOS de salida quedan bloqueadosy la línea de alta impedancia. Téngase en cuenta que cuando se lee una línea deentrada se obtiene el estado actual que tiene su pin correspondiente (almacenadoen el tercer biestable) y no el que haya almacenado en el biestable de datos. Lainformación presente en una línea de entrada se muestrea al iniciarse el ciclo deinstrucción y debe matenerse estable durante su desarrollo.

Cuando se produce un RESET al conectar la tensión de alimentación(PowerOn Reset) todas las patitas de la puerta A quedan configuradas como canales deentrada para el conversor A/D y son leídas como 0. Para que el PORTA funcionecomo líneas de E/S digitales se debe configurar el valor adecuado en el ADCON1,en general se suele cargar en dicho registro el valor 011x en sus 4 bits de menospeso.

3.7. Puerto B

Consta de 8 líneas bidireccionales de E/S, RB7-RB0, cuya información sealmacena en el registro PORTB, que ocupa la dirección 6 del banco 0. El registrode configuración TRISB ocupa la misma dirección pero del banco 1. La líneaRB0/INT tiene dos funciones multiplexadas; además de pin de E/S actúa como lapin para la petición de una interrupción externa, cuando se autoriza esta función

Page 30: Computadoras Electronicas

30 Gustavo A. Yarce

mediante la adecuada programación del registro INTCON.Las cuatro líneas de más peso, RB7-RB4, pueden programarse para soportar

una misión especial. Cuando las 4 líneas actúan como entradas se las puedeprogramar para generar una interrupción si alguna de ellas cambia su estadológico. Esta posibilidad es muy práctica en el control de teclados. En la figura10 se muestra el esquema de conexionado entre las pins RB7-RB4 y las líneascorrespondientes del bus interno.

El estado de las pins RB7-RB4 en modo de entrada se compara con el valorantiguo que tenían y que se había almacenado en un biestable durante la últimalectura de la Puerta B. El cambio de estado en alguna de esas líneas origina unainterrupción y la activación del señalizador RBIF. La línea RB6 también se utilizapara la grabación serie de la memoria de programas y sirve para soportar la señalde reloj. La línea RB7 constituye la entrada de los datos en serie.

Los pines del puerto B disponen de una resistencia interna de pull-up al positivode la alimentación, que queda conectada cuando el bit RBPU#, que es el bit 7 delregistro OPTION, tiene el valor 0. Las resistencias pull up se utilizan para forzara un nivel alto una entrada de un componente lógico. Sirve por ejemplo cuandonecesitas leer el estado de un interruptor o una tecla. Cuando la tecla se activa selleva a un estado lógico determinado, pero cuando está abierta está al aire y loscircuitos lógicos hacen una interpretación indeterminada. La resistencia pull upfuerza a nivel lógico alto cuando está abierta y permite que se lleve a nivel bajoal cerrarse sin producir un cortocircuito. También puede servir cuando se conectauna entrada a una salida de colector abierto. El pull up suple la resistencia faltantedel driver de colector abierto

3.8. Puerto C

Consta de 8 líneas bidireccional cuyo sentido se configura mediante el registroTRISC,

El Puerto C tiene varias funciones en sus pines, tiene las funciones decomunicacion I2C, el reloj externo del timer 1, Usart, etc.

Cuando se usan los módulos relacionados con este puerto, se debe tener cuidadopues algunas veces cambia el estado E/S del pin sin importar lo que indique TRISC,para saber cuando si cambiaría debemos ver la descripción de cada módulo.Todos los buffers de este puerto son del tipo Schmitt Trigger, además poseen lassiguientes funciones multiplexadas:

Page 31: Computadoras Electronicas

Computadoras Electrónicas 31

RC0/T1OSO/T1CKI: E/S, puede ser también salida del Timer1 ó entradadel impulsos para el Timer1.

RC1/T1OSI/CCP2: E/S, puede ser también entrada al oscilador del Timer1ó entrada al módulo de captura 2, salida del comparador 2 , salida de PWM2.

RC2/CCP1: E/S, puede ser también entrada captura 1, salida comparador1 o salida PWM1.

RC3/SCK/SCL: E/S, puede ser también señal de reloj en modo SPI ó señalde reloj en modo I2C.

RC4/SDI/SDA: E/S, puede ser también entrada de datos en modo SPI oSeñal de reloj en modo I2C.

RC5/SD0: E/S, puede ser también salida de datos en modo SPI.

RC6/TX/CK: E/S, línea de transmisión eb USART ó señal de reloj síncronaen transmisión serie.

RC7/RX/DT: E/S, línea de recepción USART ó línea de datos entransmisión serie síncrona.

3.9. El Registro de Estado

Hasta ahora ESTADO es el registro más usado y llega el momento de describirloen su totalidad. Ocupa la dirección 3 tanto del banco 0 como del 1 de la memoriade 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 distribución de los bits del registroESTADO, su misión es la siguiente:

Page 32: Computadoras Electronicas

32 Gustavo A. Yarce

IRP RP1 RP0 T0# PD# Z DC c7 6 5 4 3 2 1 0

Tabla 3.2: Registro de Estado

C: Acarreo en el bit de más peso1: Acarreo en el bit de más peso.0: No acarreo en el bit de más peso.

DC: Acarreo en el 4o bit1: Acarreo en el 4o bit.0: No acarreo en el 4o bit.

Z: Cero1: El resultado de una instrucción lógico-aritmética ha sido cero.0: El resultado de una instrucción lógico-aritmética no ha sido cero.

PD#: Power Down1: Se pone a este valor después de la conexión a la alimentación o al ejecutarclrwdt.0: Se pone a este valor al ejecutar sleep.

TO#: Time Out1: Se pone a este valor después de la conexión a la alimentación o al ejecutarclrwdt y sleep.0: Se pone a este valor al desbordarse el Perro Guardián (Watchdog).

RP1-RP0: Selección de banco en direccionamiento directoEl PIC16F873 tiene cuatro bancos, emplea el bit RP0 y RP1, de forma quese puede acceder a cualquier banco.

IRP: Selección del banco en direccionamiento indirectoEste bit junto con el de más peso del registro FSR sirven para determinar elbanco de la memoria de datos seleccionado.

Page 33: Computadoras Electronicas

Computadoras Electrónicas 33

3.10. El acumulador

Uno de los registros mas utilizado, es el registro de trabajo “W”, el cual, seutiliza 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 matemáticas. El registro W noestá implementado en la memoria RAM en la posición 0x00 ni en otra posición.W es un registro independiente que tiene un bus directo con la ALU (un caminoprivado). La ALU es la única entidad que puede leer o escribir este registro detrabajo.

Page 34: Computadoras Electronicas

34 Gustavo A. Yarce

Page 35: Computadoras Electronicas

Capítulo 4

Lenguaje Ensamblador

4.1. Instrucciones

El juego de instrucciones de un microprocesador o microcontrolador es el con-junto de entradas binarias que producen acciones definidas durante un ciclo deinstrucción. Un juego de instrucciones es para el microcontrolador lo mismo queuna tabla de verdad es para una puerta lógica, un registro de desplazamiento oun sumador. Por supuesto, las acciones que realiza un microcontrolador con cadainstrucción, son más complejas que las que realizan los dispositivos y puertas antesmencionados.

Una instrucción es un patrón de dígitos binarios el cual debe estar a disposicióndel microcontrolador en el tiempo y forma que éste lo requiera.

Por ejemplo, cuando el procesador de un microcontrolador PIC16F84A recibeel patrón binario de 12 bits ’0000 0100 0000’ en el momento adecuado, significa:Clear (borrar o poner a cero) el registro W, y corresponde a la instrucción CLRW.

Para los PIC se han creado unas instrucciones y una estructura de programaque los hacen más sencillos y atractivos todavía..

Las instrucciones de los microcontrolador PIC cumplen con las siguientescondiciones:

Juego de instrucciones reducido: Por ejemplo, solo existen 35 instruccionesen el PIC16F873.

Sencillas y rápidas: La mayoría se ejecuta en un ciclo de instrucción, y sololas de salto precisan 2 ciclos. El ciclo de instrucción consta de 4 ciclos dereloj principal. De esta manera un dispositivo con un cristal de cuarzo de 20MHz realiza 5 millones de instrucciones por segundo.

35

Page 36: Computadoras Electronicas

36 Gustavo A. Yarce

Ortogonalidad: La ubicación de los operandos que manejan es muy flexible.Cualquier objeto del procesador puede actuar como origen o como destino.

Formato uniforme de las instrucciones: Todas las instrucciones tienen unalongitud fija de bits. Esta característica significa un notable ahorro de lamemoria de programa y una facilidad en la construcción de compiladores.

Formato uniforme de los datos.

Un programa es una serie de instrucciones mediante las cuales un sistemabasado en CPU realiza una tarea en particular y la forma mas simple de realizar unprograma es mediante el lenguaje ensamblador (Ver Sistemas microprogramables,Lenguajes de programación para sistemas basados en CPU).

Podríamos decir que el lenguaje ensamblador “es complejo por su sencillez”.Esto quiere decir que, a diferencia de los lenguajes de alto nivel, aquí no hayfunciones que solucionen y simplifiquen algoritmos, si no que hay que implementarhasta los pasos más elementales.

Mnemónicos Descripción Flags CiclosADDWF f,d w + f → d C, DC, Z 1ANDWF f,d w AND f → d Z 1

CLRF f 00 h → f Z 1CLRW f 00 h → w Z 1COMF f,d Complemento de f → d Z 1DECF f,d f - 1 → d Z 1

DECFSZ f,d f - 1 → d (si es 0 salta) Ninguna 1(2)INCF f,d f + 1 → d Z 1

INCFSZ f,d f + 1 → d (si es 0 salta) Ninguna 1(2)IORWF f,d w OR f → d Z 1MOVF f,d f → d Z 1MOVWF f w → f Ninguna 1NOP - No operación Ninguna 1RLF f,d Rota f izq por carry → d C 1RRF f,d Rota f dcha por carry → d C 1

SUBWF f,d f - w → d C,DC,Z 1SWAPF f,d Intercambia nibbles de f → d Ninguna 1

Tabla 4.1: Instrucciones orientadas a registros

Page 37: Computadoras Electronicas

Computadoras Electrónicas 37

Mnemónicos Descripción Flags CiclosBCF f,b Pone a 0 bit b de registro f Ninguna 1BSF f,b Pone a 1 bit b de registro f Ninguna 1

BTFSC f,b Salto si bit b de reg. f es 0 Ninguna 1(2)BTFSS f,b Salto si bit b de reg. f es 1 Ninguna 1(2)

Tabla 4.2: Instrucciones orientadas a bit

Mnemónicos Descripción Flags CiclosADDLW k w + k → w C,DC,Z 1ANDLW k w AND k → w Z 1CALL k Llamada a subrutina k Ninguna 2

CLRWDT - Borra temporizador del WDT TO,PD 1GOTO k Ir a dirección k Ninguna 2IORLW k w OR k → w Z 1MOVLW k k → w Ninguna 1RETFIE - Retorno de una interrupción Ninguna 2RETLW k Retorno con k en w Ninguna 2RETURN - Retorno de una subrutina Ninguna 2SLEEP - Modo Standby TO, PD 1SUBLW k k - w → w C,DC,Z 1XORLW k w XOR k → w Z 1

Tabla 4.3: Instrucciones orientadas a literal y conrol

Notas:

Al modificar un registro de E/S con una operación sobre él mismo (porejemplo MOVF PORTB,1), el valor utilizado es el que se halle presente enlas patillas del PORTB. Por ejemplo, si el biestable tiene un “1” para unapatilla configurada como entrada y se pone a nivel bajo desde el exterior, eldato se volverá a escribir como “0”.

Si se ejecuta esta instrucción sobre el TMR0 y d=1, se borrará el conteode la preescala asignada (preescaler), si está asignado al TMR0, pero no seborrará la preescala asignada en OPTION_REG, que controla Timer0.

Si se modifica el Contador de Programa PC o una condición de prueba es

Page 38: Computadoras Electronicas

38 Gustavo A. Yarce

verdadera, la instrucción requiere dos ciclos máquina. El segundo ciclo seejecuta como un NOP.

En las tablas siguientes, por orden alfabético, veremos todos los datos de interéssobre las 35 instrucciones.

Algunos son de poca importancia. En cambio otros, como la operación,la sintaxis, el comportamiento del registro STATUS y los ejemplos, sonimprescindibles para comprender su funcionamiento.

Aparte de estas 35 instrucciones, hay otro tipo de instrucciones usadas parasimplificar la tarea de programar, y que generalmente están formadas por dosinstrucciones básicas. Estas no las trataremos a fondo, pero las veremos en unresumen después de comprender el funcionamiento de las 35 instrucciones básicas.

4.2. Instrucciones del MPLAB

No son propiamente instrucciones del microcontrolador, sino que son comandosinsertados en el programa que controlan el proceso de ensamblado Estos comandosno tienen traducción al código máquina. Suelen escribirse en la segunda columna.

Algunas de estas “pseudoinstrucciones” son:

END: Indica fin del programa. Es el único comando obligatorio ya que elensamblador necesita saber donde termina el proceso de ensamblado. Se poneen la última línea del programa. Todas las líneas posteriores a la línea en laque 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 posición de memoria deprograma tiene que ensamblar las instrucciones. Ejemplo: ORG 0x04Si las instrucciones de un programa comienzan a escribirse sin indicar ORG,el ensamblador toma por defecto ORG 0x00. Pueden escribirse varios ORGen el mismo programa

Page 39: Computadoras Electronicas

Computadoras Electrónicas 39

EQU. Su sintaxis es:

<label>EQU <expr>

Es una etiqueta de asignación. El valor <expr>es asignado a la etiqueta<label>. Usualmente las asignaciones EQU se ponen al principio delprograma (antes que las instrucciones). Siempre que <label>aparece en elprograma es sustituido por el valor numérico de la expresión que se le hayaasignado.

_ CONFIG. Esta directiva indica la configuración elegida para el proceso degrabación del microcontrolador.Ejemplo:

_CONFIG _CP_OFF & _WDT_OFF & PWRTE_ON & _XT_OSC

En este caso la configuración elegida es:

• No hay protección de código (_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 columnasobligatoria, la primer columna es la “ETIQUETA” y sirve para darle el nombrea una posición de la memoria del programa al que se necesita apuntar(EQU.La segunda columna, se llama “INSTRUCCIÓN” y lo que justamente hace,es una instrucción a realizar por el programa. La tercera columna, se llama“OPERANDO” y es el operando de una instrucción, o sea, de la segunda columna.Hay instrucciones que no tienen operando.

Opcionalmente se puede incluir un cuarta columna, llamada “OBSERVACIO-NES” y sirve solo para el usuario, el que está programando el PIC. Comienzan conun “;” (punto y coma)

Page 40: Computadoras Electronicas

40 Gustavo A. Yarce

Ejemplo 4.1 ASM

Figura 4.1: Programa ASM

Page 41: Computadoras Electronicas

Capítulo 5

Programación

5.1. CALL - RETURN

La instrucción CALL ( llamada la subrutina) consigue que la ejecución delprograma continúe en la dirección donde se encuentra la subrutina a la que hacereferencia. Es similar a GOTO pero coloca en la pila la dirección de la siguienteinstrucción que se debe ejecutar después de la CALL. La subrutina finaliza con lainstrucción RETURN (Retorno de la subrutina) que retoma la dirección guardadaen le pila y la coloca en el contador del programa PC continuando el flujo decontrol con la instrucción que sigue a la CALL.

En la familia PIC de gama media la pila tiene ocho niveles de memoria deltipo FIFO (primero en entrar, último en salir). Si se produce la llamada a unasubrutina durante la ejecución de otra subrutina, la dirección de retorno de estasegunda es colocada en la cima de la pila sobre la dirección anterior. Esta segundadirección es la primera en salir de la pila mediante la instrucción RETURN. Conla pila de ocho niveles, una subrutina puede llamar a otra y ésta, a su vez, llamar aotra hasta un máximo de ocho. La gama baja sólo puede realizar dos llamadas deeste tipo al poseer una pila de sólo dos niveles. Las subrutinas deben colocarse alcomienzo de las páginas debido a que el bit 8 del contador del programa es puestoa 0 por la instrucción CALL (o por cualquier instrucción que modifica el PC). Lassubrutinas deben colocarse en la mitad inicial de las páginas (las 256 palabras).

41

Page 42: Computadoras Electronicas

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 ;llama a la rutina de retardo

retardo movlw .k1 ;carga k1 en el acumuladormovwf mem1 ;guarda el valor del w en mem1

r1 decfsz mem1,1 ;decrementa mem1goto r1 ;se ejecuta esta inst. si dec. no es ceroreturn

Cuando ejecuta la instrucción “Call” esta lleva en ejecutarse 2 ciclos. Cuandoesta dentro de la rutina “retardo” se encuentra con la instrucción “movlw .k1”que consume 1 ciclo, luego ejecuta la instrucción “movwf mem1” que consume 1ciclo. Luego se ejecuta la parte principal de la rutina de demora, las instrucciones“decfsz mem1,1” y la instrucción “goto r1” se ejecutan (k1-1) veces, ya que mienstrasesta decrementado y no llega a cero no se saltea la instrucción goto, por lo tantomienstras no de cero el decremento la instrucción decfsz consume 1 ciclo y lainstrucción goto 2, por lo tanto,(k1-1 )*3 ciclos le lleva realizar este decremento,cuando llego a cero la instrucción decfsz consume 2 ciclos, por lo tanto el totalde ciclo de la rutina de demora es 3*(k1-1) + 2 ciclos. Luego retorna al programaprincipal mediante la instrucción “return” que consume 2 ciclos. El total de ciclosque lleva la rutina completa es 2 + 1 + 1 +(k1-1) + 2 = 35 ciclos, y el tiempoque consume esto es con un reloj de 4 Mhz, por lo tanto el perído es 2, 5e7; cadainstrucción consume 4 ciclos, por lo que el tiempo que tarda en ejecutarse cadainstrucción es 4 ∗ 2,5e− 7 = 1e−6.

La secuencia de demora es {3 ∗ 254 + 2 = 764}, el máximo tiempo que puederealizar la demora es

(2 + 1 + 1 + 3 ∗ 254 + 2 + 2) = 770ciclos

Lo que lleva un tiempo de 770 u seg.

Page 43: Computadoras Electronicas

Computadoras Electrónicas 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 movlw .k2 ;{1}movwf mem2 ;{2}

r2 movlw .k1 ;{3} carga k1 en el acumuladormovwf mem1 ;{4} guarda el valor del w en mem1

r1 decfsz mem1,1 ;{5} decrementa mem1goto r1 ;{6} se ejecuta esta instr. si el dec. <>0decfsz mem2,1 ;{7}goto r2 ;{8}return ;{9}

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

{3} 1 ciclo{4} 1 ciclo

{5} {6} 3*(k1-1)+2 ciclos{7} 1 ciclo{8} 2 cicloTotal 7+(3*(k1-1) ciclos

Esta secuencia ciclos se ejecutan en su totalidad (k2-1) veces. Luego la terceravez esta secuencia resulta en:

{3} 1 ciclo{4} 1 ciclo

{5} {6} 3*(k1-1)+2 ciclos{7} 2 ciclosTotal 6+3*(k1-1) ciclos

Page 44: Computadoras Electronicas

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 máximo tiempo que se tarda, se cargan mem1 y mem2 con 0FFh.

La primera secuencia tarda

{3} 1 ciclo{4} 1 ciclo

{5} {6} 764 ciclos{7} 1 ciclo{8} 2 cicloTotal 769 ciclos

Esta secuencia se ejecuta 0Feh veces o 254 veces.

La segunda secuencia es

{3} 1 ciclo{4} 1 ciclo

{5} {6} 764 ciclos{7} 2 ciclosTotal 768 ciclos

EL número de ciclos total es

2 + 1 + 1 + {769 ∗ 254 + 768}+ 2 = 2 + 1 + 2 + {101}+ 2 = 196100ciclos

Lo que lleva un tiempo de 196100∗1e−6 = 0,1961 segundos o 196.1 milisegundos.

Page 45: Computadoras Electronicas

Computadoras Electrónicas 45

5.2.3. Rutina de retardo triple

retardo movlw .k3 ;{1}movwf mem3 ;{2}

r3 movlw .k2 ;{3}movwf mem2 ;{4}

r2 movlw .k1 ;{5}movwf mem1 ;{6}

r1 decfsz mem1,1 ;{7}goto r1 ;{8}decfsz mem2,1 ;{9}goto r2 ;{10}decfsz mem3,1 ;{11}goto r3 ;{12}return ;{13}

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

Entre las líneas {5}{6}{7}{8}{9}{10}, tenemos el bucle doble, el cual incluyeel bucle simple. Denominaremos a la expresión del bucle simple como

A = [3 ∗ (k1− 1) + 2]Por lo tanto el bucle doble puede expresarse como:

{5} 1 ciclo{6} 1 ciclo{A} A ciclos{9} 1 ciclo{10} 2 ciclos

Este bucle se ejecuta (k2-1). La expresión que rige el segundo bucle,

[(1+1+A+1+2)*(k2-1)]+[1+1+A+2]= [(5+A)*(k2-1]+[4+A]ciclos

Page 46: Computadoras Electronicas

46 Gustavo A. Yarce

Para indicar la expresión del bucle doble lo haremos como

B=[(5+A)*(k2-1)]+[4+A]

En la línea 3 comienza el bucle triple y finaliza en 12 la cual ocupa las siguienteslíneas:

3 1 ciclo4 1 cicloB B ciclos11 1 ciclo12 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 máximo de los valores cargados en k1, k2 y k3 para 255.

A=[3*(255-1)+2]=764 ciclosB=[(5+764)*(255-1)]+[4+764] = [195326]+[768] = 196064 ciclosC=[(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 instrucción es t = 1e−6seg.

D= 50.005250 segundos

Page 47: Computadoras Electronicas

Capítulo 6

Programación en C deMicrocontroladores

6.1. Introducción a CCs

Cada programa en C debe contener una función principal que es el punto departida de la ejecución del programa. El programa puede dividirse en múltiplesfunciones según el propósito y las funciones pueden ser llamadas desde la principalo subfunciones. En un gran proyecto, las funciones también se pueden colocar endiferentes archivos de C o archivos de cabecera que se pueden incluir en el archivoprincipal de C al grupo de las funciones relacionadas con su categoría.

CCS también requiere incluir el archivo de dispositivo apropiado utilizandola directiva “# include” para incluir el dispositivo de funcionalidad específica.También hay algunas directivas de preprocesador como “# fuses” para especificarlos fusibles para el chip y “#use delay” para especificar la velocidad de reloj.Las funciones contienen las declaraciones de datos, definiciones, declaracionesy expresiones. El compilador también proporciona un gran número de libreríasestándar de C, así como otros controladores de dispositivo que puede ser incluiday utilizada en los programas. CCS también provee un gran número de funcionesintegradas para acceder a los distintos periféricos incluidos en el microcontroladorPIC.

47

Page 48: Computadoras Electronicas

48 Gustavo A. Yarce

6.2. Estructura de un programa en C

/* Preambulo */

# include# fuse# use# byte# bitdeclaración de funcionesdefinición de variables globales

/* Función Principal */

void main(void){ definición de variables locales;definiciones del PIC;Instrucciones;etc;}

/* Funciones secundarias */función 1(){definición de variables localesinstrucciones;etc;}

función 2(){definición de variables locales;instrucciones;etc;}

Page 49: Computadoras Electronicas

Computadoras Electrónicas 49

6.2.1. CCs

Figura 6.1: Compilador CCs

Figura 6.2: Fusibles válidos

Page 50: Computadoras Electronicas

50 Gustavo A. Yarce

6.3. Tipos

El lenguaje C proporciona cinco tipos básico de datos, con cuatro modificadoresposibles. Podemos utilizar variables de cualquiera de esos tipos. La tabla siguientemuestra los tipos disponibles:

Tipo Ancho (Bits) Rangoshort 1 0 o 1

short int 1 0 o 1int 8 0 a 255char 8 0 a 255

unsigned 8 0 a 255unsigned int 8 0 a 255

signed 8 -128 a 127signed int 8 -128 a 127

long 16 0 a 65536long int 16 0 a 65536

signed long 16 -32768 a 32767float 32 3.4E-38 a 3.4E+38

Tabla 6.1: Tipos de datos

6.3.1. Expresiones

Valor Formato123 Decimal123 Octal

0x123 Hex0b010010 Binario

’x’ Carácter′\010′ Carácter Octal′\xA5′ Carácter Hex

Tabla 6.2: Expresiones

Page 51: Computadoras Electronicas

Computadoras Electrónicas 51

6.3.2. Variables Locales y Globales

Si una variable se declara dentro de una función, será “visible” solo dentro deésta:

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

En el ejemplo anterior, la variable tipo char llamada letra solo podrá utilizarsedentro de la función funcion1(). Si intentamos utilizarla fuera de ella, el compiladornos dará un error. Si declaramos una variable fuera de cualquier función, el alcancede esta sera global, lo que quiere decir que estará disponible en cualquier parte denuestro programa. Vemos un ejemplo de este último caso.

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

funcion1(){. . .}

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

Page 52: Computadoras Electronicas

52 Gustavo A. Yarce

6.3.3. Conversiones entre tipos

CCS nos permite mezclar diferentes tipos de variables dentro de una mismaexpresión. Y existen un conjunto de reglas que nos permiten saber que de quetipo será el resultado de la misma. Por ejemplo, el compilador convertirá automá-ticamente a int cualquier expresión que contenga variables char, short o int. Estaconversión solo tiene efecto mientras se realizan los cálculos. Las variables en símismas no cambian su tipo.

Las reglas de conversión de tipos hacen que el resultado de una operación seasiempre el mismo que el de la variable más larga que intervenga en ella.Sin embargo, podemos forzar a que el resultado sea de un tipo en particular, de lasiguiente 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 podría parecer a simplevista, por que el tipo de c no se modifica. CCS calcula a * b y obtiene efectiva-mente el resultado 2500, pero c sólo contendrá los 8 bits menos significativos deese resultado, es decir, el decimal 196.

Si hubiésemos hecho:

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

Page 53: Computadoras Electronicas

Computadoras Electrónicas 53

el valor almacenado en c hubiese sido efectivamente 2500.

6.4. Operadores

En CCS los operadores cumplen un rol importante. Quizás C sea uno delos lenguajes que mas operadores tiene. Una expresión es una combinación deoperadores y operandos. En la mayoría de los casos, los operadores de CCS siguenlas mismas reglas que en álgebra, y se llaman de la misma manera.

Operador Descripción+= Asignación de suma-= Asignación de resta*= Asignación de multiplicación/= Asignación de división

%= Asignación de resto de división<<= Asignación de desplazamiento a la izquierda>>= Asignación de desplazamiento a la derecha& = Asignación de AND de bits| = Asignación de OR de bitsˆˆ= Asignación de OR exclusivo de bits˜= Asignación de negación de bits

Tabla 6.3: Operadores de asignación

Page 54: Computadoras Electronicas

54 Gustavo A. Yarce

Operador Descripción Ejemplo+ Suma (enteros o reales) resul = var1 + var2- Resta (enteros o reales) resul = var1 - var2* Multiplicación (enteros o reales) resul = var1 * var2/ División (enteros o reales) resul = var1 / var2- Cambio de signo en enteros o reales 0

% Módulo; resto de una división entera rango = n [A1]% 256

Tabla 6.4: Operadores aritméticos

Operador Descripción< Menor que> Mayor que<= Menor o igual que>= Mayor o igual que== Igual a¡= Distinto de

Tabla 6.5: Operadores de relación

Operador Descripción! NO lógico

&& Y lógico|| O lógico

Tabla 6.6: Operadores lógicos

Operador DescripciónNegación 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

Page 55: Computadoras Electronicas

Computadoras Electrónicas 55

6.5. Preámbulo

La sección del preámbulo define, tipo de microcontrolador a utilizar, fusibles,clock, etc. Un ejemplo de esto es:

#include<16f84a.h> /*Selección del PIC*/#fuses nowdt, xt,put,noprotect /*Configuración de fusibles*/#use delay(clock=4000000) /*Velocidad del clock*/#byte port_b = 0x06 /*Define la dirección del puerto b*/#use standard_io(A) /*Definición del puerto A*/

Dentro del preámbulo se encuentra la definición para la funcionalidad de lospuertos. Para usar los puertos como entrada o salida digital, CCS provee directivasy funciones predefinidas para el uso de los puertos de E/S digital. Las funciones“output_X()” e “input_X()” dependen de la directiva de configuración que usemos.

6.5.1. #INCLUDE

Permite incluir en nuestro programa uno o mas archivos (conocidos como hea-der file) que posean extensión .h. Estos archivos contienen información sobre fun-ciones, sus argumentos, el nombre de los pines de un modelo determinado de PIC ocualquier otra cosa que usemos habitualmente en nuestros programas. Esto permi-te no tener que escribir un montón de cosas cada vez que comenzamos un programanuevo: basta con incluir el .h correspondiente. La forma de utilizar esta instrucciónes la siguiente: #INCLUDE <archivo>Esto hará que el contenido de <archivo>secompile junto con nuestro programa.Por ejemplo:

#INCLUDE <PIC16F877A.H>

Page 56: Computadoras Electronicas

56 Gustavo A. Yarce

6.5.2. #FUSES

Permite modificar el valor de los fuses del microcontrolador que estamos em-pleando. Los valores posibles dependen de cada microcontrolador en particular, ylos valores posibles se cargan al utilizar #INCLUDE seguido del archivo correspon-diente. La forma de #FUSES es la siguiente: #FUSES opciones donde opcioneses una lista de las opciones posibles separadas mediante comas. Antes de seguir,recuerda que puedes ver dentro del archivo con extensión .h correspondiente cualesson los valores posibles para ese microcontrolador. Están al comienzo del archivo,en forma de comentarios.

Algunos valores comunes son:

Tipo de oscilador: LP, XT, HS, RC

Wach Dog Timer: WDT, NOWDT

Protección de código: PROTECT, NOPROTECT

Power Up Timer: PUT, NOPUT

Brown Out Reset: BROWNOUT, NOBROWNOUT

Ejemplos:

#fuses xt,nowdt,noprotect,noput

6.5.3. #DEFINE

La instrucción #define tiene la siguiente forma:

#DEFINE <label>value

es la etiqueta que usaremos en nuestro programa. Y value es el valor que esta-mos asignando a esta etiqueta.Las instrucciones #DEFINE no generan codigo ASM, si no que el preprocesadorrealiza los reemplazos que ellas indican en el momento de la compilación.

Page 57: Computadoras Electronicas

Computadoras Electrónicas 57

El uso de #DEFINE permite construir programas más ordenados y fáciles de man-tener. Veamos algunos ejemplos de #DEFINE

#DEFINE TRUE 1

Cada vez que en nuestro programa aparezca la etiqueta TRUE, el precompila-dor la reemplazará por 1.

#DEFINE pi 3.14159265359

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

6.5.4. #USE DELAY (CLOCK=frecuencia)

Esta directiva indica al compilador la frecuencia del procesador, en ciclos por se-gundo, a la vez que habilita el uso de las funciones DELAY_MS() y DELAY_US().Opcionalmente podemos usar la función restart_WDT() para que el compiladorreinicie el WDT durante el retardo.

Ejemplos:

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

Page 58: Computadoras Electronicas

58 Gustavo A. Yarce

6.6. Directivas

Las Directivas que provee CCs:

#use fast_io (puerto): No modifica el registro TRIS en lecturas y escrituras.Hay que asegurarse de que los pines está configurados correctamente.

#use standar_io (puerto): Modifica el registro TRIS correspondiente enlecturas y escrituras. (Modo por defecto)

#use fixed_io (puerto): Configura el puerto y no modifica el registro TRISen lecturas y escrituras.

#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 configuración como entrada o salida se hace a través del registro “TRISx”correspondiente del banco 1 de la memoria.

Para configurar los puertos se utiliza la función “set_tris_X(valor)”. Se puedeleer la configuración de los puertos con la función “get_tris_X(valor)”.

set_tris_A (0x3F) /* Puerto A como entradas.*/

CCS tiene funciones predefinidas para el uso de los puertos de E/S digital. Losparámetros de estas funciones están definidos en un fichero “include ”.

Las funciones pueden tratar el puerto completo, a través de las instrucciones“output_X()” e “input_X()”. También se pueden operar a nivel de bit, con unformato PIN_Xn donde X es el puerto y n el bit.

Page 59: Computadoras Electronicas

Computadoras Electrónicas 59

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_float (PIN_Xn) /*Pin como entrada (simula d. ab. */

input_state(PIN_Xn) /*Lee el valor del pin sin cambiar el sentido delterminal. */

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

6.6.1. #USE FAST_IO (puerto)

Cada vez que se emplea una función output( ) se saca el valor directamente alpuerto, y cada vez que se emplea una función input( ) se lee el puerto, pero no semodifica previamente el registro TRIS correspondiente.

El usuario debe asegurarse de que los registros TRIS están cargadosadecuadamente antes de llamar a las funciones.

Esta directiva se utiliza para optimizar el código generado por el compiladorcuando se utilizan funciones de manejo de entrada y salida como “input(pin)” de-finidas ya en CCS.Esta directiva afecta al código que el compilador generará para las instruccionesde entrada y salida. Este método rápido de hacer I/O ocasiona que el compiladorrealice I/O sin programar el registro de dirección. El puerto puede ser A-G.

Ejemplo:

#use fast_io(A)

Page 60: Computadoras Electronicas

60 Gustavo A. Yarce

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

Se genera código relativo a la dirección de los datos de manera previa cada vezque aparece una función integrada del tipo input( ) ó output( ), pero los pinesse configuran de acuerdo con la información que acompaña a la directiva (sólo seindican los pines de salida) y no dependiendo de que la operación sea de entradao de salida como sucede con #USE STANDARD_IO (PUERTO).

Esta directiva afecta al código que el compilador generará para las instruccio-nes de entrada y salida. El método fijo de hacer I/O causará que el compiladorgenere código para hacer que un pin de I/O sea entrada o salida cada vez que seutiliza. Esto ahorra el byte de RAM usado en I/O normal.

Ejemplo:

#use fixed_io(a_outputs=PIN_A2 ,PIN_A3)

6.6.3. #USE STANDARD_IO (puerto)

Cada vez que se emplea una función output( ) se inserta un código previo paraforzar a que el bit particular o el puerto completo sean de salida (mediante la cargadel TRIS correspondiente) Si se trata de función input( ) se carga el código paradefinir bit o puerto completo como entrada.

Esta es la opción activada por defecto.Esta directiva afecta al código que el compilador genera para las instrucciones

de entrada y salida. El método estándar de hacer I/O causará que el compiladorgenere código para hacer que un pin de I/O sea entrada o salida cada vez que seutiliza.

Ejemplo:

#use standard_io(A)

Page 61: Computadoras Electronicas

Computadoras Electrónicas 61

input_x( )

Devuelve el estado del puerto especificadoEjemplo:

x=input_a() ;

6.6.4. output_x(valor)

Escribe el byte especificado en el puerto indicado.

Ejemplo:

output_a(255) ;

6.6.5. INPUT(pin)

Devuelve el estado “0” o “1” del pin. El método de acceso de I/O depende dela ú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 función saca el bit dado en value(0 o 1) por el pin de I/O especificado.El modo de establecer la dirección del registro, está determinada por la últimadirectiva #USE *_IO.

Ejemplo:

Page 62: Computadoras Electronicas

62 Gustavo A. Yarce

output_bit( PIN_B0, 0); // es lo mismo que output_low(pin_B0);

6.6.7. OUTPUT_HIGH(pin)

Pone a “uno” el pin indicado. El método de acceso de I/O depende de la últimadirectiva #USE *_IO utilizada.

Ejemplo:

output_high(PIN_A0);

6.6.8. OUTPUT_LOW(pin)

Pone a “cero” el pin indicado. El método de acceso de I/O depende de la últimadirectiva #USE *_IO.

Ejemplo:

output_low(PIN_A0);

6.6.9. SET_TRIS_puerto(value)

Estas funciones permiten escribir directamente los registros tri-estado para laconfiguración de los puertos.

Esto debe usarse con FAST_IO() y cuando se accede a los puertos de I/Ocomo si fueran memoria, igual que cuando se utiliza una directiva #BYTE. Cadabit de value representa un pin. Un “1” indica que el pinl es de entrada y un “0” quees de salida.

Ejemplo:

Page 63: Computadoras Electronicas

Computadoras Electrónicas 63

SET_TRIS_B( 0x0F );

6.6.10. delay_ms(time)

Esta función realiza retardos del valor especificado en time. Dicho valor detiempo es en milisegundos y el rango es 0-65535.

Para obtener retardos más largos así como retardos ’variables’ es preciso hacerllamadas a una función separada; véase el ejemplo siguiente.

Es preciso utilizar la directiva #use delay(clock=frecuencia) antes de la llamadaa esta función, 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);

}

Page 64: Computadoras Electronicas

64 Gustavo A. Yarce

Page 65: Computadoras Electronicas

Capítulo 7

Interrupciones

7.1. Introducción

Las llamadas a las subrutinas mediante instrucciones del tipo CALL sondesviaciones del flujo de control del programa originadas por instrucciones, por loque se consideran síncronas. Se producen cada vez que se ejecuta dicha instrucción.La interrupciones son desviaciones del flujo de control del programa originadasasíncronamente por diversos sucesos que no se hallan bajo la supervisión de lasinstrucciones. Dichos sucesos pueden ser externos al sistema, como la generaciónde un flanco o nivel activo en una pin del microcontrolador, o bien, internos, comoel desbordamiento de un contador.

El comportamiento del microcontrolador ante la interrupción es similar al dela instrucción tipo CALL de llamada a subrutina. En ambos casos se detiene laejecución del programa en curso, se salva la dirección actual del PC en la Pila y secarga el PC con una dirección, que en el caso de CALL viene acompañando a lamisma instrucción, y en el caso de una interrupción es una dirección “reservada”de la memoria de código, llamada Vector de Interrupción que da paso a un trozode código denominado Rutina de Servicio de la Interrupción (RSI).

La RSI suele comenzar guardando en la memoria de datos algunos registrosespecíficos del procesador. Concretamente aquellos que la RSI va a emplear yva a alterar su contenido. Antes del retorno al programa principal se recuperanlos valores guardados y se restaura completamente el estado del procesador.Algunos procesadores salvan estos registros en la Pila, pero los PIC no disponende instrucciones para meter (push) y sacar (pop) información de la Pila, utilizandopara este fin registros de propósito general de la memoria de datos.

Los PIC16F84 pueden ser interrumpidos por 4 causas diferentes, pero todasellas desvían el flujo de control a la dirección 0004 H, por lo que otra de lasoperaciones iniciales de la RSI es averiguar cuál de las posibles causas ha sido la

65

Page 66: Computadoras Electronicas

66 Gustavo A. Yarce

responsable de la interrupción en curso, para ello se exploran los señalizadores delas fuentes de interrupción.

Los PIC16F873 tienen 13 causas posibles de interrupción. Algunas de las causasson:

1. Desbordamiento del Timer1

2. Desbordamiento del Timer2

3. Captura o comparación en el módulo CCP1

4. Captura o comparación en el módulo CCP2

5. Transferencia en el pin serie sincrono

6. Colisión de bus en el pin serie sincrono

7. Fin de la transmisión en la USART

8. Fin de la recepción en la USART

9. Fin de la conversión 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 delPIC(0Bh,8Bh,10Bh y 18Bh).

GIE PEIE TOIE INTE RBIE TOIF INTF RBIF7 6 5 4 3 2 1 0

Tabla 7.1: Registro INTCON

GIE: Permiso Global de Interrupciones0: Prohíbe todas las interrupciones.1: Permite la ejecución de todas las interrupciones,

cuyos bits de permiso individuales también las permitan.

Page 67: Computadoras Electronicas

Computadoras Electrónicas 67

PEIE: Permiso de Interrupción de los periféricos0: Prohíbe que se produzca esta interrupción.1: Permite que se origine esta interrupción.

T0IE: Permiso de Interrupción por sobrepasamiento del TMR00: Prohíbe esta interrupción.1: Permite una interrupción al desbordarse el TMR0.

INTE: Permiso de Interrupción por activación de la pin RB0/INT0: Prohíbe esta interrupción.1: Permite la interrupción al activarse RB0/INT.

RBIE: Permiso de Interrupción por cambio de estado en RB7-RB40: Prohíbe esta interrupción1: Permite esta interrupción.

T0IF: Señalizador de sobrepasamiento del TMR00: Indica que el TMR0 no se ha desbordado.1: Toma este valor cuando ha ocurrido el desbordamiento.

INTF: Señalizador de activación de la pin RB0/INT0: Indica que RB0/INT aún no se ha activado.1: Se pone a 1 al activarse RB0/INT.

RBIF: Señalizador de cambio de estado en las pins RB7-RB40: No ha cambiado el estado de RB7-RB4.1: Pasa a 1 cuando cambia el estado de alguna de esas líneas.

7.1.2. Registro de permiso de interrupciones 1 (PIE1)

Contiene los bits que permiten o prohiben las interrupciones provocadas porlos periféricos internos del microcontrolador y que no estaban contempladas enINTCON.

Ocupa la dirección 8Ch y para que cumplan su función los bits PIE1 es necesarioque PEIE=1 en INTCON<6>

Page 68: Computadoras Electronicas

68 Gustavo A. Yarce

PSPIE ADIE RCIE TXIE SSPIE CCPIIE TMR2IE TMR1IE7 6 5 4 3 2 1 0

Tabla 7.2: Registro PIE1

PSPIE: Permiso de interrupción para la puerta paralela esclavaal realizar una operación de lectura/escritura(solo 40 pines)

ADIE: Permiso de Interrupción para el conversor A/D al finalizarla conversión.

RCIE: Permiso de Interrupción para el receptor del USART cuandoel buffer se llena.

TXIE: Permiso de Interrupción para el transmisor del USART cuandoel buffer se vacía

SSPIE: Permiso de Interrupción para el pin serie síncrona

CCP1IE: Permiso de interrupción para el módulo CCP1 cuando seproduce una captura o comparación.

TMRR2IE: Permiso de interrupción para el TMR2 con su desbordamiento

TMR1IE: Permiso de interrupción para el TMR1 con su desbordamiento

7.1.3. Registro de permiso de interrupciones 2 (PIE2)

Contiene los bits de permiso de interrupción de las tres causas que no figurabanen PIE1. La de fin de escritura en la EEPROM, colisión de bus en el modo SSP yproducción de una captura o una comparación en el módulo CCP2.

EEIE Permiso de interrupción por fín de escritura en la EEPROM de datos

Page 69: Computadoras Electronicas

Computadoras Electrónicas 69

- 0 - EEIE BCLIE - - CCP2IE7 6 5 4 3 2 1 0

Tabla 7.3: Registro PIE2

BCLIE: Permiso de Interrupción por colisión de bus en el SSP cuando doso más maestros tratan de transferir al mismo tiempo.

CCP2IE: Permiso de Interrupción en el módulo CCP2

7.1.4. Registro señalizador de interrupciones 1 y 2(PIR1 yPIR2)

En correspondencia con los bits de permiso/prohibición de las causas deinterrupción vistas en los registros PIE1 y PIE2, existen otros dos registros, PIR1y PIR2, cuyos bits actúan de señalizadores del momento en el que se origina lacausa que provoca la interrupción, independientemente sin esta permitida o no.Ocupan las direcciones 0Ch y 0Dh.

PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF7 6 5 4 3 2 1 0

Tabla 7.4: Registro PIR1

- 0 - EEIF BCLIF - - CCP2IF7 6 5 4 3 2 1 0

Tabla 7.5: Registro PIER2

Page 70: Computadoras Electronicas

70 Gustavo A. Yarce

7.2. Interrupciones en CCs

Las interrupciones permiten a cualquier evento interno o externo, interrumpirla ejecución del programa principal en cualquier momento. Cuando se produceuna interrupción, el microcontralador realiza un salto a la rutina de atención a lainterrupción. Al finalizar la atención de la interrupción el microcontralador retornaa la ejecución del programa principal en la misma posición del programa donde seprodujo la interrupción.

Las interrupciones en CCs poseen el siguiente formato:

#int_xxx

indica que la función que le sigue es una función de interrupción.

Los nombres para las funciones son:

Nombre de la función operación#INT_AD Conversión AD completa

#INT_BUSCOL Colisión de bus#INT_CCP1 Unidad 1 de captura, comparación y PWM#INT_CCP2 Unidad 2 de captura, comparación y PWM#INT_COMP Comparador

#INT_EEPROM Escritura EEPROM finalizada#INT_EXT Interrupción 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 buffer de transmisión vacío

#INT_TIMER1 Desbordamiento del Timer1#INT_TIMER2 Desbordamiento del Timer2

Tabla 7.6: Interrupciones

Page 71: Computadoras Electronicas

Computadoras Electrónicas 71

Otras directivas para el manejo de interrupciones, como:

enable_interrupts(valor);

Esta instrucción permite habilitar la máscara de la interrupción que se pretendehacer funcionar, los valores permitidos para esta instrucción son:

GLOBALINT_RTCC

INT_TIMER0INT_EXTINT_RBINT_ADINT_RDAINT_TBEINT_SSPINT_CCP1

INT_TIMER2INT_TIMER1INT_EEPROMINT_BUSCOLINT_CCP2

Tabla 7.7: Valores de habilitación de interrupciones

La instrucción que deshabilita una interrupción o todas es:

disable_interrupts(valor);

En resumen:

enable_interrups(nivel); habilita la interrupción especificada

disable_interrups(nivel); deshabilita la interrupción especificada

Page 72: Computadoras Electronicas

72 Gustavo A. Yarce

7.2.1. Interrupción por RB0

La función a utilizar es la siguiente:

#int_ext

Esta directiva debe acompañarse por alguna de estos dos directivas, quedeterminarán el flanco en que se produce la interrupción:

ext_int_edge(h_to_l); flanco de bajada

ext_int_edge(l_to_h); flanco de subida

Ejemplo 7.1 //**********************************************************//*** Realiza el cambio de estado en el pin B7 cada vez//*** que se produce una pulsación 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); //b0 como salidaoutput_low(pin_b7); //apaga el ledenable_interrupts(int_ext); //habilita inteterrupción en rb0ext_int_edge(l_to_h); //flanco de subidaenable_interrupts(global); //habilita las interrupciones en forma global

do{}

while(0==0);

}

Page 73: Computadoras Electronicas

Computadoras Electrónicas 73

7.2.2. Interrupción por RB7-RB4

La función a utilizar es la siguiente:

#int_rb

Otras directivas asociadas a las interrupciones son:

clear_interrupt(int_rb); //borra los flags del registro

enable_interrupts(int_rb); //activar interrupcion rb4:rb7

Page 74: Computadoras Electronicas

74 Gustavo A. Yarce

Page 75: Computadoras Electronicas

Capítulo 8

Puerto Serie

8.1. Introducción

La comunicación serial, transmite un bit a la vez, por lo cual es mucho máslenta, pero posee la ventaja de que necesita un menor número de líneas parala transferencia de la información y las distancias a la cual se puede realizarel intercambio, es mayor; a esto se suma que dispositivos como modems, lacomunicación se puede extender prácticamente a cualquier lugar del planeta.Existen dos formas de comunicación serial: sincrónica y asincrónica.

En la comunicación sincrónica, además de la línea sobre la que se transfierenlos datos, se necesitan otra que contenga pulsos de reloj que indiquen cuando undato es válido; la duración del bit está determinada por la duración del pulso desincronismo. En la comunicación asincrónica, los pulsos de reloj no son necesariosy se acuden a otros mecanismos para realizar la lectura/escritura de los datos; laduración de cada bit está determinada por la frecuencia de referencia con la cualse realiza la transferencia de datos.

8.2. Handshaking

Para establecer una comunicación adecuada, los dispositivos normalmenteproveen señales que informan los unos a los otros si ellos tienen algún dato paratransmitir o si están listos para recibirlos. Si un dispositivo envía un caracter a otroque en ese momento está ocupado ejecutando alguna otra tarea, la información seperdería. “Handshaking” es el proceso de usar señales para establecer una correctacomunicación. Por ejemplo, para informar al receptor que hay datos disponiblesel transmisor activa una señal llamada Request To Send (RTS). Esta señal ó

75

Page 76: Computadoras Electronicas

76 Gustavo A. Yarce

interrumpe al receptor ó el receptor mismo la sensa por un proceso de “polling”.Cuando el receptor detecta esta señal finaliza lo que está haciendo y le informa altransmisor con una señal llamada Clear To Send (CTS) que está listo para recibirdatos. El transmisor no transmite ningún dato hasta que su entrada CTS estéactivada.

Las señales de handshaking tienen diferentes nombres en diferentes sistemas.Señales adicionales de handshaking están presentes en sistemas más avanzados.Las comunicaciones de ida y vuelta (two-way) requieren varias señales, mientrasque para comunicaciones de una sola dirección (one-way) sólo hacen falta dosseñales de handshaking (una entrada y una salida) como por ejemplo en el caso deadquisición de datos de un sensor donde la computadora está solamente recibiendodatos y el sensor sólo transmite datos.

Una transmisión serie de datos exige que entre el emisor y el receptor seestablezcan normas exactas (protocolo) que determinen las formalidades de latransmisión. Entre ellas figuran la velocidad de transmisión (bit/segundos ó baudrate), el formato externo de la cadena de señales, la sincronización y el chequeo delos datos.

8.3. Comunicaciones seriales en los PC

En los computadores se pueden tener hasta 4 puertos de comunicación serialRS-232, denominados COM1, COM2, COM3 y COM4; para utilizarlos se deberealizar una configuración previa de los parámetros de la comunicación y aunqueel sistema operativo y los programas utilizan valores por defecto, no siempre son losmismos. Existen varias formas de establecer los parámetros para la comunicaciónserial asincrónica con cualquiera de los puertos.

Figura 8.1: Puerto Serie

Page 77: Computadoras Electronicas

Computadoras Electrónicas 77

Cuando no se realiza ninguna transferencia de datos, la línea del transmisores pasiva (idle) y permanece en un estado alto. Para empezar a transmitir datos,el transmisor coloca esta línea en bajo durante el tiempo de un bit, lo cual seconoce como bit de arranque (star bit) y a continuación, empieza a transmitir, conel mismo intervalo de tiempo, los bits correspondientes al dato ( que pueden ser7 u 8 bits), empezando por el más significativo (LSB), y terminando con el mássignificativo (MSB); al finalizar, se agrega el bit de paridad (Parity bit), si es queestá activada la opción, y los bits de parada (Stop bit), que pueden ser 1 ó 2, en loscuales la línea regresa a un estado alto. Al concluir esta operación, el transmisorestará preparado para transmitir el siguiente dato.

El receptor mientras tanto, no está sincronizado con el transmisor y desconocecuando va a recibir datos. La transición de alto a bajo de la línea del transmisoractiva al receptor y éste genera un conteo de tiempo de tal manera que realizauna lectura de la línea medio bit después del evento; si la lectura realizada es unestado alto, asume que la transición ocurrida fue ocasionada por ruido de línea; sipor el contrario la lectura es un estado bajo, considera como válida la transicióny empieza a realizar lecturas secuenciales a intervalos de un bit, hasta conformarel dato transmitido. El receptor puede tomar el bit de paridad para determinarla existencia o no de errores y realizar las acciones correspondientes, al igual quelos bits de parada para situaciones similares. En la fig. 8.4 se transmite un datobinario 0 0 0 1 1 0 1 0, el cual es dato de 8 bits, y como parámetros adicionalesposeen 1 bit de parada y ningún bit de paridad.

8.4. RS-232 .Voltajes y niveles lógicos

Los niveles de voltaje utilizados por RS-232 son marcadamente diferentesa aquellos utilizados en un sistema de micrcomputador ya que TTL no tienesuficiente margen de ruido para manejar largos cables en ambientes ruidosos .Los niveles de lógica TTL son: para un “1” lógico corresponde a una tensión 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 lógicos de tensión de entre TTL y RS-232 se hacenecesaria la adaptación de los voltajes de una a otra y viceversa ,esto se realizamediante el uso de chips de desplazamiento (shift) de nivel llamados line driver yline receiver que además permiten que las señales sean enviadas a mayor distancia.

Page 78: Computadoras Electronicas

78 Gustavo A. Yarce

Figura 8.2: Niveles Lógicas Puerto Serie

8.5. La velocidad de transmisión de datos

Puede ser expresada como bits por segundo y se refiere a la velocidad a lo largodel par trenzado. Ha de tenerse presente que en una velocidad de transmisiónde 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) ylos dos restantes como bits de parada (bits de stop). Cualquier frecuencia detransmisión puede ser establecida en un UART, ajustando la frecuencia de reloj.Hay 8 velocidades de transmisión asíncrona normalmente utilizadas:

110 bps (bits por segundo)

150 bps

300 bps

600 bps

1200 bps

2400 bps

4800 bps

9600 bps

Page 79: Computadoras Electronicas

Computadoras Electrónicas 79

8.6. RS-232

RS-232 es una interfaz digital, planeada para comunicar a no más de 50 pies y a20000 bps, (especificaciones según la norma). La comunicación se realiza mediante25 conductores independientes, cada uno con su propia tarea. Las líneas estánencendidas cuando el nivel de voltajes de -3volts o inferior, o en nada si el voltajees intermedio. El control de flujo permite a un dispositivo que recibe decir al queenvía, “¡Alto!, mi memoria temporal (buffer - una pequeña cantidad de memoriadentro de la impresora) se está desbordando - detente un momento y estaré deregreso muy pronto,” luego imprime lo que tiene en su memoria temporal y dice,“¡Listo! Ya estoy listo para más.”

TXD Transmitir Datos Señal de salida

RXD Recibir Datos Señal de entrada

RTS Solicitud de envio Señal de salida

DTR Terminal de datos listo Señal de salida

CTS Libre para envio Señal de entrada

DSR Equipo de datos listo Señal de entrada

DCD Detección de portadora Señal de entrada

SG Tierra Referencia para señales

RI Indicador de llamada Señal de entrada

8.6.1. Secuencia de eventos en una sesión RS-232

1. Ambos dispositivos están encendidos e indican ese estado - “power upencendido”. El DTE energiza la línea 20 (DTR). El DCE energiza la línea 6(DSR). Una interfaz RS-232 bien diseñada no prosigue la comunicación hastaque estas dos líneas estén activadas. El DTE espera que aparezca señal enla línea 6, el DCE en la línea 20. Las líneas 6 y 20 son exclusivamente paraseñales de verificación del equipo, pero algunas veces son utilizadas comolíneas de control de flujo.

Page 80: Computadoras Electronicas

80 Gustavo A. Yarce

2. Un módem se conecta con otro módem. La comunicación de datos no sirve sintener alguien con quien comunicarse. Así que lo siguiente ( en una situaciónmódem/terminal, que es la prevista por los diseñadores de RS-232 ) es marcara un módem remoto. Los modems intercambian señales portadoras ( el sonidode tono alto que se escucha cuando los modems hacen conexión ), y el módemse lo informa a la terminal en la línea 8 ( DCD ). Por cierto, si se tiene unmódem con luces rojas, verá las actividades anteriores indicadas por las luces.La línea 6 está conectada a la línea 20 ( Terminal Ready - Terminal lista );y la línea 8 está conectada a la luz rotulada CD ( Carrier Detec - Portadoradetectada ),

3. La terminal (DTE) pregunta al módem (DCE) se está listo. La terminalenergiza la línea 4, RTS. El módem, si esta listo, responde con la línea 5,CTS. Ahora está terminado el procedimiento de enlace ( handshake). Laslíneas 4 y 5 son líneas de control de flujo.

4. Se lleva a cabo el intercambio de datos. La terminal (DTE) pasa informaciónpara que el módem (DCE) la transmita por la línea 2. El módem pasainformación de regreso a la terminal por la línea 3.

8.6.2. El cable más simple

Un cable directo conecta un conductor de la línea 1 del primer lado a la línea1 en el segundo lado, otro de la línea 2 en el primer lado a la línea 2 en el segundolado, otro de la línea 3 en el primer lado a la línea 3 en el segundo lado y asísucesivamente. El cable estándar de PC a módem es un ejemplo de esto. RS-232fue diseñado pensando en este cable.

8.6.3. Diseño de cables para impresoras serie y paratransferencias PC a PC

Muchos cables son solo una variación del cable directo. Preguntándonos, ¿ quéclase de cable conectaría una impresora a una PC? Bien, tanto la impresora comola PC tienen interfaces DTE. De acuerdo a la norma RS-232, no se pueden conectardirectamente dos interfaces DTE. Están hechas para conectar un módem a la PC( recuerde que el módem es DCE), conecte un módem a la impresora, y luegoconecte los dos módems con el cable telefónico más corto del mundo. ¿Qué debeser diferente para que dos dispositivos DTE se comuniquen entre sí?. Primero,ambos están tratando de transmitir en la línea 2 y recibir en la línea 3. La soluciónaquí es muy fácil - sólo hay que cruzar 2 y 3:

Page 81: Computadoras Electronicas

Computadoras Electrónicas 81

2—————————————33—————————————27—————————————7

Aunque se dejan fuera todas las líneas de control fuera, suele funcionar. ¿Porqué? La mayor parte no tienen necesidad de líneas de control en absolutosiempre y cuando no se requiera control de flujo - esto es, mientras cada ladopueda alcanzar al otro. ¿ Cómo se sabe qué líneas de control usa su programa,si es que usa? Repuesta: Se experimenta hasta que se determina qué funciona.A continuación, necesitamos resolver las líneas indicadoras de encendido 6 y 20.Como antes, ambos dispositivos son DTE, así que ambos energizan la línea 20 yambos detectan actividad con la línea 6. Como ninguno de ellos activa la línea 6,van esperar permanentemente. Se puede resolver esto en una de dos formas. Unaconserva el procedimiento de enlace, la otra no. El método que conserva el enlacees con cruzamientos: la 6 del lado 1 a la 20 del lado 2 y la 20 del lado 1 a la 6 dellado. Lo cual lleva nuestro cable a la siguiente configuración:

2—————————————–33—————————————–26—————————————- 207—————————————–720 —————————————-6

Pero existe otra forma. Considere que cada lado desea ver actividad en la línea 6aproximadamente al mismo tiempo que se suministra señal en la línea 20. ¿Porquéno dar vuelta en redondo a las líneas sobre su propio lado de tal modo que cadaquien oprima sus propios botones?

2—————————————–33—————————————–27—————————————–76—————————————- 2020 —————————————–6

¿Cuál solución es mejor? Depende. Si el equipo realmente utiliza 6 y 20, y senecesita el diálogo de enlace, utilice el cable con cruzamientos. Si se está usandoequipo que realmente no necesita las líneas 6 y 20 no importa. Si se están corriendocables largos y el número de conectores de cada cable es importante en cuanto a sucosto, es mejor la solución sin diálogo de enlace. Algunas veces solo desea uno quela máquina trabaje y se preocupará del control de flujo después. Hay una situación

Page 82: Computadoras Electronicas

82 Gustavo A. Yarce

similar con RTS/CTS, así que se pueden cruzar los cables 4 y 5 o puentear 4 a 5de cada lado. Hago lo primero en el cable mostrado a continuación.

2———————————-33———————————-24———————————-55———————————-46——————————— 207———————————-720 ———————————6

Finalmente, no olvide la línea DCD. Algunos programas requieren definitiva-mente ver la DCD antes de continuar. Puesto que 8 es entrada para ambos lados,hurtaremos una línea activa para satisfacerla.

2———————————-33———————————-24———————————-55———————————-4

6———————————20 - 87———————————-7

8 - 20———————————-6

8.7. Ingreso de datos

Figura 8.3: Conexión del micro al Puerto Serie

Page 83: Computadoras Electronicas

Computadoras Electrónicas 83

8.8. USB

8.9. Introducción

Las computadores personales actuales aún conservan los puertos heredados des-de que se diseñó el primer PC de IBM. Por razones de compatibilidad aún seguiránsubsistiendo este tipo de puertos, pero poco a poco irán apareciendo nuevas má-quinas en las que no contaremos con los típicos conectores serie, paralelo, teclado,etc... y en su lugar sólo 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 todavía hoy cumplen su función correc-tamente en casos como la conexión de un teclado o un ratón, se han quedado yadesfasados cuando tratamos de conectar dispositivos más rápidos como por ejem-plo una cámara de video digital.

USB (Bus Serie Universal) nace como un estándar de entrada/salida de velo-cidad media-alta que permite conectar dispositivos que hasta ahora requerían deuna tarjeta especial para sacarles todo el rendimiento, lo que ocasionaba un enca-recimiento del producto además de ser productos propietarios ya que obligaban aadquirir una tarjeta para cada dispositivo.

Pero además, USB nos proporciona un único conector para solventar casi todoslos problemas de comunicación con el exterior, pudiéndose formar una auténticared de periféricos de hasta 127 elementos. Mediante un par de conectores USB queya hoy en día son estándar en todas las placas base, y en el espacio que hoy ocupaun sólo conector serie de 9 pines nos va a permitir conectar todos los dispositivosque tengamos, desde el teclado al módem, pasando por ratones, impresoras, alta-voces, monitores, scaners, camaras digitales, de vídeo, plotters, etc... sin necesidadde que nuestro PC disponga de un conector dedicado para cada uno de estos ele-mentos, permitiendo ahorrar espacio y dinero.

Al igual que las tarjeta ISA desaparecieron, todos los conectores anteriormentecitados también desaparecerán de nuestro ordenador, eliminando además lanecesidad de contar en la placa base o en una tarjeta de expansión loscorrespondientes controladores para dispositivos serie, paralelo, ratón PS/2,joystick, etc...

USB es PnP (Plug and Play) y permite la conexión “en caliente”, es decir, que

Page 84: Computadoras Electronicas

84 Gustavo A. Yarce

se pueden conectar y desconectar los periféricos sin necesidad de reiniciar el orde-nador.

Características de USB

Cable de 4 hilos.

2 de alimentación para dispositivos max 0,5A.

2 de transmisión diferencial.

Permite suministrar energía eléctrica a dispositivos que no tengan un altoconsumo y que no estén a más de 5 metros, lo que elimina la necesidad deconectar dichos periféricos a la red eléctrica, con sus correspondientes fuentes dealimentación, como ocurre por ejemplo con los modem externos.

Segmentos de cable de 5m max.

Dos tipos de conectores.

Hasta 127 dispositivos.

Conexión/desconexión en caliente.

Auténtico Plug & Play.

Requiere una sóla IRQ para todos los dispositivos. Topología en estrella, loque implica la necesidad de dispositivos tipo “hub” que centralicen las conexiones,aunque en algunos dispositivos como teclados y monitores ya se implementaesta característica, lo que permite tener un sólo conector al PC, y desde estosdispositivos sacar conexiones adicionales.

Por ejemplo en los teclados USB se suele implementar una conexión adicionalpara el ratón, o incluso otras para joystick, etc.. y en los monitores varias salidaspara el modem, los altavoces...

Figura 8.4: conectores USB

Page 85: Computadoras Electronicas

Computadoras Electrónicas 85

Los conectores tipo “A” se utilizan en el PC y los tipos “B” suelen utilizarse enlos dispositivos USB (también existe otro conector mas pequeño).

PIN Nombre Desccripción1 VBUS +5VDC2 D- Data -3 D+ Data +4 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 conflictos IRQ o insertar tarjetas

Conectar hasta 127 dispositivos

Sistema de comunicación entre dispositivos que sólo transmite una unidad deinformación a la vez

Todos los dispositivos tienen un sistema de configuración idéntico, incluso unmismo driver sirve para varios dispositivos diferentes.

El puerto USB sólo necesita una IRQ y una @ de memoria.

TODOS los dispositivos usan UNA ID para identificación.

Los puertos standard necesitan 2/3 IRQs, varias DMAs y muchas @ dememoria.

Page 86: Computadoras Electronicas

86 Gustavo A. Yarce

8.11. Descripción 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 losdatos 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 momentodeterminado (máximo 127 incluyendo al Host). Por tanto los datos siguientes sonsolo teóricos y de referencia.

Low speed: 1,5 Mbps. Soportado por las especificaciones 1.1, 2.0 y 3.0. Es lavelocidad 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 ejemplodonde se utilizan estas velocidades es en transmisiones de audio.

High speed: 480 Mbps. Solo USB 2.0 y USB 3.0. Ejemplo transmisiones devideo.

Super speed: 5Gbps solo soportado en dispositivos USB 3.0, y como he dichoantes no conozco ningún microcontrolador que soporte esta especificación.

8.11.1. Transferencias

Una transferencia se puede definir como el conjunto global de los datos queforman una comunicación USB, una transferencia está formada a su vez por una ovarias transacciones que a su vez están formadas por diferentes paquetes de datosque contienen las tramas de una comunicación USB.

No existe un formato único de transferencia, la especificación USB permitecuatro tipos de transferencias:

Control: se utilizan para configurar y enviar comandos, por ejemplo en laenumeración del dispositivo, más adelante veremos lo que es esto.

Page 87: Computadoras Electronicas

Computadoras Electrónicas 87

Bulk (masivas): se utilizan cuando se precisa una transferencia de datosgrande, es el tipo más rápido de transferencia, sin embargo no hay garantíade que los datos se transmitan en un tiempo determinado (no garantizadala latencia). Si que hay verificación de que los datos se han transmitidocon éxito ya que dispone de sistema de corrección de errores (CRC), estatransferencia solo la pueden utilizar dispositivos que soporten velocidadesFull y High Speed. Este tipo de transferencia es utilizada por dispositivoscomo por ejemplo: discos duros, pen drivers, escaners, impresoras, etc.

Isócronas: Es usada en dispositivos que transmiten señales de audio y devídeo en tiempo real. Se garantiza una tasa de velocidad de transmisióndeterminada (latencia asegurada). Si no fuera así, por ejemplo en unatransmisión de voz el audio se oiría entrecortado. No contempla la correcciónde errores, si en un archivo de sonido se pierde un BIT, no es importantesu recuperación. Para usar este tipo de transferencia es necesario que losdispositivos soporten velocidades Full Speed.

Interrupción: latencia asegurada y verificación de que los datos se hantransmitido con éxito, Se utiliza en dispositivos como: Teclados, Mouse,Sensores, Pantallas táctiles, y dispositivos que no requieran mucho anchode banda.

Los dispositivos usan uno o más tipos de transferencia, la de control es utilizadasiempre por todos los dispositivos en el proceso de enumeración. Si se utilizaotra transferencia habrá que hacerlo en función del tipo y cantidad de datos atransmitir.

¿En que consiste la Enumeración?

El Host es el encargado de detectar cualquier dispositivo que se conecta al bus.Cuando un dispositivo es detectado el Host necesita obtener información sobre el,a este proceso es al que se le llama enumeración. Esta información que necesitael Host se encuentra definida en el dispositivo en los llamados descriptores. Losdescriptores son datos que se guardan en la memoria no volátil del PIC y contienenla siguiente información: El ID del vendedor (VID) y del producto (PID), consumode corriente del dispositivo, tipo de transferencia que se va ha utilizar, endpointutilizados, versión USB soportada, clase utilizada, etc.

El VID (Vendor ID) y el PIC (Product ID) son dos números de 16 bitsrepresentados en Hexadecimal, si utilizamos la clase CDC (Communications Device

Page 88: Computadoras Electronicas

88 Gustavo A. Yarce

Class) de CCS para la comunicación USB estos valores los podemos modificar enel archivo “usb_desc_cdc.h” y según el sistema operativo instalado en el Hostdeberemos modificarlos también en el archivo .inf, pero esto lo veremos másadelante.

Realmente el modificar estos valores solo es útil si queremos distribuir nuestroproducto comercialmente, en ese caso existe una organización llamada USBImplementers Forum que se encarga de proporcionarnos un VID valido, para quenuestro dispositivo conviva sin problemas con el resto de dispositivos USB delmercado, además tendremos derecho a poner el logo USB en nuestro productocertificando de esta manera que ha pasado los controles pertinentes y cumple conel estándar USB. Todo esto es similar al proceso que se sigue a la hora de obteneruna dirección MAC en una tarjeta de red.

Si esto no estuviera regulado tal y como está y cada dispositivo tuviera el VIDy PID que quisiera, cuando coincidieran en un mismo sistema dos números igualesse presentaría un conflicto hardware y ambos dispositivos dejarían de funcionar.

¿Que es un endpoint?Los endpoint son simplemente buffer de memoria RAM que son utilizados para

el envío y recepción de datos o comandos de control durante una comunicaciónUSB. cada endpoint puede ser de entrada o salida de datos o bidireccional, elendpoint 0 está reservado para comandos de control, el proceso de enumeración serealiza a través del endpoint número 0. Este concepto solo se aplica al dispositivo,en el host existen también buffer para el envío y recepción de datos pero no se lesdenomina con este nombre.

¿Que es un Pipe o Tubería?Es una conexión lógica entre un endpoint y el software del controlador del

host que se produce tras el proceso de enumeración. Los Pipes se usan mucho enSistemas Operativos como UNIX/LINUX para enlazar la salida de un proceso conla 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 métodos (funciones)reutilizables por los objetos o miembros que comparten la clase. Esta definicióngeneral de clase utilizada en la programación orientada a objetos creo que es lamejor para definir este concepto utilizado en USB. La especificación USB provee depropiedades y funciones que pueden ser utilizadas por los dispositivos que tengan

Page 89: Computadoras Electronicas

Computadoras Electrónicas 89

características similares. Por ejemplo, un teclado y un ratón por sus característicaspertenecerán a la misma clase la llamada Human Interface Device (HID), pues biensi yo diseño el firware de un dispositivo con las especificaciones que me exige estaclase podré beneficiarme de esas propiedades y funciones comunes a la clase, unaventaja de utilizar esta clase por ejemplo es que no se necesita instalar ningúndriver para el dispositivo ya que el sistema operativo utilizará uno genérico paratodos.

La especificación USB provee de muchas clases para facilitar la vida aldesarrollador de dispositivos, puedes ver una información más precisa de las clasesdisponibles aquí.

Las clases más utilizadas con Microcontroladores son:

HID (Human Interface Device): ejemplos de dispositivos que utilizanesta clase como hemos dicho ya son: teclados, ratones, pantallas táctiles,joystick, etc. Velocidad low-speed (64 KB/s de velocidad máxima), tipos detransferencias soportadas: de control y de Interrupción. Una característicainteresante al utilizar esta clase es que no se necesita instalar un driverespecifico en el Sistema Operativo, se utiliza uno estándar que ya estáincluido en el sistema. En el S.O Windows la aplicación de escritorio accedeal dispositivo con ayuda de las APIS win32. En Linux veremos como utilizaresta clase en un futuro ejemplo.

MSD (Mass Storage Device Class): Como su propio nombre indica paradispositivos de almacenamiento masivo como discos duros, memorias flash,cámaras digitales, dispositivos ópticos externos como lectores y grabadorasde CD y DVD, etc. Esta clase se puede utilizar solo en dispositivos quesoporten velocidades Full y High Speed. El tipo de transferencias utilizadases Bulk o una combinación formada por transferencias del tipo Control, Bulky Interrupt. Microchip tiene notas de aplicación sobre esta clase como laAN1003, CCS también implementa ejemplos sobre esta clase. No se necesitala instalación de un driver específico, se utilizan drivers genéricos instaladosya en los Sistemas Operativos, en Windows se utiliza el driver llamadousbstor.sys ubicado en C : \

CDC (Communications Device Class): Un ejemplo de dispositivo que utilizaesta clase son los Modems, en este primer ejemplo utilizaremos esta clasepara comunicar nuestro PIC18F4550 con la aplicación de escritorio querealizaremos con un IDE multiplataforma, que nos permitirá ejecutar laaplicación en diferentes sistemas operativos, concretamente en Windows,

Page 90: Computadoras Electronicas

90 Gustavo A. Yarce

Linux y MAC. La velocidad máxima al utilizar esta clase será de 80 kBytes/sy el tipo de transferencias soportadas son del tipo interrupción y Bulk.Utiliza también driver estándar incluidos ya en el sistema operativo, según elsistema operativo utilizado precisará o no de la instalación del archivo .INF,cuando utilizamos esta clase en el PC nos creará un puerto serie virtual yla comunicación entre el dispositivo y la aplicación de escritorio se hará através de el al igual que se haría con un puerto serie físico, esto supone unagran ventaja a la hora de diseñar la aplicación de escritorio, ya que cualquierIDE de programación sea del lenguaje que sea, dispone de un componente olibrería que permite el acceso al puerto serie fácilmente.

Existe una clase genérica llamada “Custom Class” que se utiliza cuando eldispositivo no se asemeja a las características de ninguno de los miembrospertenecientes a otras clases. un ejemplo de dispositivo que utiliza esta clasees el ICD2 o ICD3 de Microchip.

Si el firmware de nuestro dispositivo no cumple con las especificaciones dealguna de las clases que se beneficia del uso de drivers genéricos instalados ya enel sistema operativo no queda otra que diseñar un driver para nuestro dispositivo,sino el dispositivo no será reconocido por el PC, diseñar un driver desde cero es muycomplicado ya que se requiere profundos conocimientos tanto de la arquitecturadel PC como del Sistema Operativo que tenga instalado. Afortunadamente ya haydrivers personalizados que podemos utilizar en nuestros proyectos, algunos de ellosson 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 información del driver y es requerido por elsistema operativo para que cuando se conecta por primera vez el dispositivoal PC este sepa que driver tiene que asignarle. El S.O también obtieneinformación de este archivo para configurar correctamente el dispositivo. Esun archivo de texto que se puede editar y modificar algunas cosas en el,como los valores del VID y PID que deben de coincidir con los definidos en losdescriptores del dispositivo, también se pueden modificar algunas cadenas detexto que se mostraran como información del dispositivo una vez instaladoel driver en el S.O, lo demás mejor no tocarlo sino queremos que nuestrodispositivo deje de funcionar.

Page 91: Computadoras Electronicas

Computadoras Electrónicas 91

La DLL mpusbapi: una dll es una capa software que en este caso facilitapor medio de funciones la comunicación entre la aplicación de escritorioy el driver del dispositivo. Esta dll está compilada con el compilador deBorland C++ Builder 6. Microchip facilita su código fuente, por lo quehay dos formas de utilizarla. Si utilizamos el mismo IDE de Borland paracrear nuestra aplicación de escritorio, simplemente tendremos que añadir lalibrería (el archivo mpusbapi.lib) a nuestro proyecto como una librería más(¡ojo la extensión tiene que ser .lib!), si utilizamos otro compilador diferentedeberemos de compilar de nuevo los fuentes de la librería para obtener unanueva versión del archivo mpusbapi.lib que sea compatible con el compiladorutilizado. La otra opción de utilización de la librería es añadirla a nuestroproyecto de forma dinámica, para ello solo se necesita el archivo con extensión.dll (mpusbapi.dll) proporcionado también por Microchip, de esta forma siutilizamos un compilador diferente como los que nos proporciona Microsoften su plataforma .NET u otros como LabVIEW, Matlab, RealBAsic, etc.No tendremos que modificar el código fuente de la DLL, simplemente lautilizaremos importando las funciones públicas de la DLL desde nuestraaplicación de escritorio. Microchip proporciona ejemplos de ambas formas.Como veis todo esto del USB da pie a realizar las cosas de diferentes formas,más adelante en otro ejemplo veremos estás dos posibilidades. Pero ¿porque utilizar esta opción y no utilizar siempre las clase CDC, MSD o HIDque a priori parece más fácil su utilización? Simplemente porque utilizandoun driver personalizado en vez de los genéricos que proporciona Windowsobtenemos una comunicación USB más versátil y con mayores prestaciones.Por ejemplo, en cuanto a velocidad podremos alcanzar velocidades de hasta1MB/s frente a los 64 KB/s de la clase HID y los 80 kBytes/s de la claseCDC, además el driver de Microchip soporta todos los tipos de transferencia(Control, Isócronas, Interrup y Bulk), cosa que no ocurre igual si utilizamoslas otras clases como ya hemos visto.

Nota importante: cuando utilizamos el driver personalizado de Microchip losdatos se transmiten en raw (crudo) y la aplicación de escritorio intercambiainformación con el PIC directamente a través de los enpoints utilizados por este,en este caso se usa un protocolo de comunicación que a priori no está definido.Es importante que copiemos del archivo .INF el valor del campo definido comoGUI (Global Unique Identifier), que es un número que sirve para que la aplicaciónpueda acceder al dispositivo, luego accederemos a la dll desde el IDE que hallamoselegido para desarrollar la aplicación de escritorio editaremos las propiedades yfunciones publicas de la dll buscando un campo que se llame GUI (o algo así) y

Page 92: Computadoras Electronicas

92 Gustavo A. Yarce

si no coincide tendremos que pegar hay ese número, si no lo hacemos no se podrácrear la tubería de conexión (pipe) entre nuestra aplicación y el driver. Cuandoutilizamos la clase CDC esto no es necesario ya que la comunicación está definidaa través del puerto serie virtual creado y la información se transmite por defectoen forma de caracteres ASCII al igual que un puerto serie físico.

Otros drivers que podemos utilizar para el PIC 18fx550 son:WinUSB: es el driver genérico para USB que propone utilizar Microsoft cuando

nuestro dispositivo no puede ser manejado directamente por los drivers que yaincluye por defecto en su sistema operativo. Para ello al igual que Microchipproporciona los siguientes archivos: Winusb.sys, Winusb.ini y la librería dinámicaWinusb.dll que al igual que la dll de Microchip nos proporciona una serie defunciones públicas para acceder fácilmente al driver y a las APIs win32 de Windowsdesde nuestra aplicación de escritorio.

Toda la información que proporcionada Microsof sobre este driver la podéisencontrar en el siguiente enlace.

libUSB: Es un driver de código abierto con licencia GNU, se puede instalar enmúltiples sistemas operativos como LInux, MAC y otros, incluyendo Windows através de su versión libusb-win32. Toda la información de este driver lo tenéis en lapágina del proyecto. Además existen ejemplos ya hechos para utilizar con diferenteslenguajes y entornos de programación como: Java, Python, Ruby, .NET, etc.

Bueno y con esto se acaba la pequeña introducción sobre USB enfocada alos PIC, la mayoría de datos y valores numéricos de está información además delos datasheets está sacada de apuntes y notas tomadas por mí en las diferentespresentaciones y seminarios de Microchip a los que he podido asistir a lo largo deltiempo que estoy con esto de los PICs, por lo que no descarto que pueda haberalgún error, de vosotros depende el verificar dichos datos y si encontráis algúnerror sería bueno para todos que lo comentarais en el foro.

8.12. Puerto Paralelo

8.13. Introducción

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

Page 93: Computadoras Electronicas

Computadoras Electrónicas 93

dispositivos realizan consultas de estado, control y transferencia de datos entre sí.Cuando IBM introdujo la PC en el año 1981, esta incorporaba un puerto

paralelo de 8 bits para manejar la impresora, que, por muchos años esta fue elprincipal ( o el único ) periférico que lo utilizaba. Con el paso del tiempo y losavances de la tecnología, se desarrollaron toda clase de aparatos tales como escáner,reproductores de CD, drivers para disquete, etc., los cuales utilizan dicha interface.

Los diseñadores de periféricos siempre se enfrentaban con las limitacionesde este puerto, entre ellas se cuentan la falta de rendimiento dadas las bajasvelocidades de transferencia de información ( máximo 150 Kbytes por segundo) y la limitación de la máxima longitud del cable ( 1.5 m ).

En 1991, los fabricantes de impresoras se reunieron para desarrollar un nuevoestándar para el puerto paralelo. Los requisitos de este eran alta velocidad detransferencia de información (hasta 1 Mbyte por segundo), bidireccionalidad ysobre todo compatibilidad total tanto en software como en hardware con lainterface original de IBM.

Así fue que en el año 1994 nació el estándar IEEE 1284 que reúne lascaracterísticas 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, noslimitaremos 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 cuartoespecificando su dirección en el segmento de variables del BIOS. Las direccionesde estos puertos están estandarizadas y se dan en la tabla 8.2.

Dirección Puerto3BCh - 3BEh Puerto paralelo en la tarjeta MDA378h - 37Ah Primer puerto paralelo278h - 278h Segundo Puerto paralelo

Tabla 8.2: Direcciones del puerto paralelo

Page 94: Computadoras Electronicas

94 Gustavo A. Yarce

Cada puerto consta de 3 registros accesibles desde una dirección base, 378hpara el primer puerto paralelo, es decir para el registro de datos del primer puertoparalelo se accederá con la dirección 378h, para acceder al registro de estado delprimer puerto paralelo la dirección será 379h=378h +1 y para el registro de controldel primer puerto paralelo la dirección será 37Ah=378h + 2.

Los nombres de dichos puertos se los asigna el sistema operativo DOS, para elcual el primero en ser detectado por el BIOS recibe el nombre de LPT1 (abreviaturade Line PrinTer) y si hubiera, el segundo LPT2 y el tercero LPT3.

Desde el exterior de la máquina se identifica al puerto paralelo mediante unconector 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 tipocentronics de 36 pines. El nombre de las señales así como el número de pin se danen la tabla 8.3.

La barra / delante de los nombres de las señales indican que son activas a nivelbajo, no que están invertidas.

Page 95: Computadoras Electronicas

Computadoras Electrónicas 95

Pin del PC Pin de la impresora Nombre de la línea Significado1 1 /STROBE Indica transmisión2 2 D0 Línea de datos bit 03 3 D1 Línea de datos bit 14 4 D2 Línea de datos bit 25 5 D3 Línea de datos bit 36 6 D4 Línea de datos bit 47 7 D5 Línea de datos bit 58 8 D6 Línea de datos bit 69 9 D7 Línea de datos bit 710 10 /ACK Último caracter aceptado11 11 /BUSY Impresora ocupada12 12 PE Impresora sin papel13 13 SLCT Impresora en ON LINE14 14 AUTO FEED CR automático después de LF15 32 /ERROR Error en transmisión de datos16 31 /INIT Reset de la impresora17 36 SLCT IN Activar ON LINE en la impresora

18-25 19-30 GND Masa

Tabla 8.3: Nombre y Función de los pines puerto Paralelo

8.15. Los registros del puerto.

Independientemente de la posición en la zona de direcciones, todos los puertosmuestran un register - interfaz unificado que se compone de tres registros. Ocupanlas primeras tres direcciones de la tarjeta, por ejemplo, 378h, 379h y 37Ah en elcaso 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 exteriordel PC, más exactamente al conector DB25. Si se escribe un 1 en uno deestos bits, la línea en cuestión se pone bajo tensión inmediatamente y estevalor se mantiene hasta que se vuelve a escribir sobre la misma línea.

2. Algunas de estas líneas presentan lógica negativa. Estas son las líneas cuyonombre está negado (llevan un guión sobre él) o que comienzan con la barra/. La condición que está unida a una de estas líneas aparece siempre que la

Page 96: Computadoras Electronicas

96 Gustavo A. Yarce

línea esté a cero. La línea error, por ejemplo, muestra un error en la salidade impresión pero solamente cuando este bit contiene el valor cero. Mientrasque la línea se mantenga en uno no existe ningún error.

8.15.1. Líneas de datos

Sin embargo, los ocho bits del primer registro de un puerto paralelo carecen delógica negativa. Contiene 8 bits de datos que corresponden a las líneas de datosD0 - D7.

Tenga en cuenta que este registro del puerto está concebido comoregistro puro de salida, ya que no se planeó ninguna recepción de datosen el momento de su concepción. El intentar ingresar un dato por estaslíneas acarrearía indefectiblemente la destrucción del puerto.

La siguiente ilustración muestra la distribución de los diferentes bits en elregistro de datos.

Figura 8.6: Registro de Datos

Page 97: Computadoras Electronicas

Computadoras Electrónicas 97

8.15.2. Líneas de Estado

El estado actual del puerto paralelo se obtiene del segundo registro, llamadoregistro de estado, que solo se puede leer pero no escribir por software, ya que enel se reflejan las diferentes líneas de estado. Es decir, las líneas de este registro secomportan como entradas al PC sobre las cuales podemos escribir, ingresar algúnvalor lógico mediante hardware. El intentar escribir por software en este registrono tiene ningún efecto.

La distribución de los diferentes bits de este registro se muestra a continuación:

Figura 8.7: Registro de Estado

8.15.3. Líneas de Control

El tercer registro sirve para el control del puerto paralelo. Además, juega unpapel importante durante la transmisión de caracteres. todos los bits, excepto losbits 4 al 7, están unidos a las diferentes líneas del puerto centronics. La distribuciónde los bits es la siguiente:

Page 98: Computadoras Electronicas

98 Gustavo A. Yarce

Figura 8.8: Registro de Control

Pero no todo es tan transparente como parece, sino que esta interface escondealgo bajo sus intrincados circuitos, y es que algunos bits están invertidos porhardware en escritura y otros en lectura por lo que debemos ver cuales son.

Comencemos por decir que el registro de datos no posee ningún bit invertido,pero el de estado sí. Veamos una gráfica 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 demás no. Ahora, en el registro

Page 99: Computadoras Electronicas

Computadoras Electrónicas 99

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

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 inversión alguna.

Este mismo registro pero en escritura tiene las siguientes características:

Figura 8.11: Escritura del registro de control

Page 100: Computadoras Electronicas

100 Gustavo A. Yarce

8.16. Precauciones en el manejo del puerto.

Damos aquí algunos consejos importantes a la hora de trabajar con un puertoparalelo.

No conectar ningún dispositivo (impresora, escáner o algún prototipoconstruido por nosotros) cuando el PC está funcionando. Apagar el equipoy luego proceder.

Todo prototipo construido por nosotros que se deba conectar al puertoparalelo, deberá contar con un buffer (interface) entre ambos. Las razones deesto son dos: 1) la capacidad para suministrar corriente del puerto es muybaja, por lo que debemos colocar un amplificador de corriente (puede ser un74LS373 o 74LS244, 245 etc.) para poder manejar nuestros dispositivos y 2)este interface realiza una aislación eléctrica entre los pines del puerto y lassalidas del mismo por lo que un desperfecto en nuestro prototipo ocasiona ladestrucción de dicho interface y no del puerto del PC.

Antes de conectar un prototipo al puerto, asegurarse de que no existe algúncortocircuito o mala conexión en el mismo, que el circuito esté armadocorrectamente y comprobar el estado del cable que conecta al mismo conel PC para que no haya falsos contactos o cortocircuitos entre las líneas.

Page 101: Computadoras Electronicas

Capítulo 9

La transmisión serie

9.1. Introducción

Un microcontrolador puede trabajar de dos formas:

1. modo asíncrono

2. modo síncrono

El módulo de transmisión serie es la USART, la cual transmite y recibe datos,de forma asíncrona o síncrona. Se orientará el resto del documento a la transmisiónasíncrona.

Los pines utilizados en la transmisión serie son:

RC6/TX/CK se utiliza para la transmisión de datos

RC7/RX/DT se utiliza para la recepción de datos

9.1.1. Registro TXSTA

bit 7: CSRC: Bit de selección de reloj

101

Page 102: Computadoras Electronicas

102 Gustavo A. Yarce

Registro FunciónTXREG Registro de datos de transmisiónRCREG Registro de datos de recepciónPIR1 Flag de InterrupciónPIE1 Habilitación de Interrupción

RCSTA Estado de Recepción-ControlTXSTA Estado de Transmisión-ControlSPBRG Generador del ratio de Baudios

Tabla 9.1: Registros transmisión serie

CSRC TX9 TXEN SYNC - BRGH TRMT TX9D7 6 5 4 3 2 1 0

Tabla 9.2: Registro TXSTA

Modo Asíncrono no tiene importanciaEn Modo Síncrono1 = Modo máster (reloj generado internamente para

BRG (Generador de Baudios))0 = Modo esclavo (reloj externo)

bit 6: TX9: Habilita transmisión de 9-8 bits1 = Transmisión de 9 bits0 = Transmisión de 8 bits

bit 5: TXEN: Bit de habilitación del transmisor1 = Habilita transmisión0 = Deshabilita transmisiónNota: SREN/CREN anula TXEN en modo SYNC.

bit 4: SYNC: Bit de selección del modo USART1 = Modo Síncrono0 = Modo Asíncrono

bit 3: Sin implementar: En lectura es’0’

bit 2: BRGH: Bit de selección del rango de baudios altoModo Asíncrono

Page 103: Computadoras Electronicas

Computadoras Electrónicas 103

1 = Alta velocidad0 = Baja velocidad

Modo SíncronoNo se usa este modo

bit 1: TRMT: Bit de estado del registro de desplazamientodel transmisor (TSR)

1 = TSR vacío0 = TSR lleno

bit 0: TX9D: Noveno bit de datos de transmisión.Se puede emplear como bit de paridad.

9.1.2. Registro RCSTA

SPEN RX9 SREN CREN - FERR OERR RX9D7 6 5 4 3 2 1 0

Tabla 9.3: Registro RCSTA

bit 7: SPEN: Bit de habilitación del puerto serie1 = Habilita puerto serie (configura patillas RC7/RX/DT

y RC6/TX/CK para el puerto serie)0 = Deshabilita puerto serie

bit 6: RX9: Habilita recepción de 9-8 bits

Page 104: Computadoras Electronicas

104 Gustavo A. Yarce

1 = Selecciona 9 bits de recepción0 = Selecciona 8 bits de recepción

bit 5: SREN: Bit de habilitación de recepción únicaModo asíncrono: Este modo no se usaModo Síncrono master1 = Habilita una recepción única0 = Deshabilita una recepción única

Este bit se borra después de completar la recepciónModo Síncrono esclavo En este modo no se usa

bit 4: CREN: Bit de habilitación de recepción continuaModo Asíncrono 1 = Habilita recepción continua

0 = Deshabilita recepción continuaModo Síncrono 1 = Habilita recepción continua hasta que

el bit CREN sea borrado (CREN anula SREN)0 = Deshabilita la recepción continua

bit 3: Sin implementar: En lectura es ’0’

bit 2: FERR: Bit de error de empaquetamiento1 = 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 desbordamiento1 = Error de desbordamiento (puede ser borrado al borrar CREN)0 = No hay desbordamiento

bit 0:RXGD: Noveno bit de datos de recepción.Se puede emplear como bit de paridad

Page 105: Computadoras Electronicas

Computadoras Electrónicas 105

9.1.3. Registro SPBRG

Este registro se utiliza para controlar la velocidad de la comunicación medianteel valor cargado en este registro. Este generador sirve tanto para el modo síncronocomo el asíncrono y consiste de un contador/divisor de frecuencia de 8 bitscontrolado por el registro SPBRG (99H). De tal manera que la frecuencia detransmisión se calcula de acuerdo a la siguiente tabla:

SYNC BRGH=0(Baja velocidad) BRGH=1(Alta velocidad)0(Modo asíncrono) Baud rate=Fosc(64(X+1)) Baud rate=Fosc(16(X+1))1(Modo síncrono) 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 velocidadde transmisión deseada, ya que X se deberá redondear al entero más cercano. Enlas dos tablas anteriores se muestran algunos valores de velocidad de transmisión(baud) estándar, el divisor necesario (X=SPBRG) bajo diferentes frecuencias Foscy el error producido en porcentaje

Ejemplo:Cálculo de la proporción del error de velocidadde transmisión para las siguientes condiciones:

FOSC = 16 MHZVelocidad de transmisión deseada = 9600 baudiosBRGH = 0SYNC = 0

Velocidad de transmisión = Fosc/(64*(X+1))

9600=16000000/(64*(X+1))

X=25,042=25

Vel. Transmisión = 16000000/(64*(25+1))=9615

Page 106: Computadoras Electronicas

106 Gustavo A. Yarce

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

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

9.1.4. La transmisión

En el modo asincrónico de comunicaciones se emplea una configuraciónestándar de un bit de Start, ocho o nueve bits de datos, y un bit de Stop.Este modo de trabajo es detenido durante la función Sleep. Aunque la USARTtiene funciones independientes para la transmisión y recepción, los formatos dedatos y de velocidad de transmisión son iguales para los dos casos. El generadorde baudios produce siempre las señales de reloj x16 ó x64 (dependiendo deBRGH, TXSTA<2>) para el desplazamiento de los bits. El bit de paridad no estásoportado por el hardware, pero se puede implementar por software empleandopara ello el noveno bit de datos. Para realizar una transmisión de datos, el registrode desplazamiento TSR obtiene los datos del registro (buffer) de lectura/escrituraTXREG. El TSR no carga el bit de Stop hasta que se hayan transmitido los datoscargados. Una vez que se haya enviado este bit, el registro será cargado con losnuevos datos (si están disponibles), en este caso el bit TXIF (PIR1 <4>) se ponea ,uno si está habilitada la interrupción (PIE1 <4>).

Los pasos necesarios para realizar una transmisión asíncrona son los siguientes:

Inicializar el registro SPBRG con el valor apropiado según los cálculosrealizados. Si se desea el margen alto se pondrá a uno el bit BRGH.

Habilitar el puerto asíncrono borrando el bit SYN y poniendo a uno el SPEN.

Habilitar la interrupción (si se desea) poniendo a uno el bit TXIE.

Poner a cero o a uno el bit TX9 (8 o 9 bits).

Habilitar la transmisión poniendo a uno el bit TXEN, el cual pondra a unoel bit TXIF.

Si se han seleccionado 9 bits se deber poner el noveno en el bit TX9D.

Page 107: Computadoras Electronicas

Computadoras Electrónicas 107

Cargar el dato en el registro TXREG (comenzar la transmisión).

En el modo de recepción, los datos son recibidos por la patilla RC7/RX/DTy se introducen en serie en el registro RSR; después de recibir el bit de Stop losdatos acumulados en este registro se cargan en el de datos RCREG (si está vacío).Cuando la transferencia se ha completado, el bit RCIF (PIR1 <5>) sube a uno.La interrupción puede habilitarse o deshabilitarse colocando a uno o borrando,respectivamente, el bit RCIE (PIE1 <5>). El bit RCIF se borra cuando el registroRCREG se ha leído (se “vacía” el registro). Para configurar el puerto como receptorhay que seguir los siguientes pasos:

Inicializar el registro SPBRG con el valor apropiado según los cálculosrealizados. Si se desea el margen alto se pondra a uno el bit BRGH.

Habilitar el puerto asíncrono borrando el bit SYN y poniendo a uno el SPEN.

Habilitar la interrupción (si se desea ) poniendo a uno el bit RCIE.

Poner a uno el bit RX9 para habilitar 9 bits de recepción.

Habilitar la recepción poniendo a uno el bit CREN.

El flag RCIF subirá a uno cuando se complete la recepción.

Se ocasionar una interrupción si esta habilitado el bit RCIE.

Leer el registro RCSTA, cargar el noveno bit (si esta habilitado) y comprobarsi ha ocurrido un error durante la recepcion.

Leer el octavo bit recibido y dar lectura al registro RCREG para conocer siel 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 permitirque los datos puedan leerse del buffer receptor

Page 108: Computadoras Electronicas

108 Gustavo A. Yarce

9.2. La transmisión serie en CCs

La Configuración de una Comunicación Serie Asíncrona desde el compiladorCCS está regido por la directiva # USE RS232. Aunque la directiva se llame así,sirve para configurar cualquier transferencia serie asíncrona y no sólo RS232, queno deja de ser una de las posibles normas. Los niveles eléctricos asociados a losniveles lógicos de recepción/transmisión son los correspondientes a la tensión dealimentación del microcontrolador y no a los de la norma RS232.

Esta directiva permite configurar:

Velocidad de transmisión (en baudios)

Qué pin se empleará para la transmisión

Qué pin se utilizará para la recepción

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 sería la velocidad de comunicación (en baudios). Para que elcompilador inserte el código necesario para transmitir/recibir a la velocidadindicada, 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 transmisión indicada no se pudiera alcanzar con un errorinferior al 3%, se generaría a la hora de realizar la compilación un mensajede error del tipo: “Baud rate out of range” salvo que se incluya una opciónBRGH1OK en la directiva (asumimos ese error).

XMIT=pin. Pin de transmisión que se va a utilizar (p.e.: xmit=PIN_C6)

RCV=pin. Pin de recepción que se va a utilizar (p.e.: rcv=PIN_C7) Si elmicrocontrolador seleccionado tiene módulo SCI y se especifican los pinesasociados como los que se deben utilizar, la transmisión y/o recepción sehará con el hardware disponible, en caso contrario será implementado porsoftware

Page 109: Computadoras Electronicas

Computadoras Electrónicas 109

ENABLE=pin.Durante la transmisión, el pin especificado estará en estadoalto y durante la recepción en estado bajo . Ese pin se puede utilizar parahabilitar bien la transmisión o bien la recepción en una comunicación semi-dúplex como puede ser el caso del control de los drivers de un bus RS485.

RESTART_WDT.Se insertará código para resetear el Watchdog durantela espera por un byte (para funciones que se quedan esperando) a que lleguealgo.

INVERT.Con esta opción, se invierte la polaridad de los niveles asociadosa los pines de la comunicación: el 0 correspondería a tensión y el 1 a masa.El estado inactivo o de reposo (a 1) se correspondería con tensión nula Estaopción no debería utilizarse si se emplea el módulo SCI interno.

BITS=x. Se especifica el tamaño de los datos que serán enviados, x puedetomar un valor comprendido entre 5 y 9 si se implementa por software lacomunicación o bien de 8 ó 9 si se emplea el módulo SCI interno.

FLOAT_HIGH. En estado alto, la línea no estará en un nivel alto sino enun estado de tensión flotante debido a que la salida que la controla es deltipo drenador (o colector) abierto.

BRGH1OK. Con esta opción el compilador permite la generación de códigoaún en aquellos dispositivos que presentarán problemas en su velocidad detransmisión.

PARITY=x. x puede ser N (none: sin), O (odd: impar) o E (even: par) Si seespecifica el empleo de paridad, se envía un bit adicional como comprobacióny en el supuesto de que se produzca un error, éste quedaría registrado en unavariable denominada RS232_ERRORS.

ERRORS. Si se emplea esta opción, el compilador define una variablellamada RS232_ERRORS que recoge los errores en cada recepción y losresetea después de que éstos se produzcan.

variable RS232_ERRORS. Esta variable definida por el compiladorcontiene:

1. Si se está utilizando una implementación software:

• En el bit 7, el 9o bit si se está utilizando tamaño de 9 bits entransmisión.• El bit 6 se pone a 1 si se produjo un fallo en el envío con el modo

de tensión flotante de salida

Page 110: Computadoras Electronicas

110 Gustavo A. Yarce

2. Si se está empleando una UART interna:

• Es una copia del registro RCSTA (sólo para recepción), salvo el bit0 que se emplea para indicar error de paridad

Es importante que las directivas #USE FAST_IO o bien #USE FIXED_IOvayan delante de esta directiva pero no la directiva #USE STANDARD_IO porla manera en que se generaría el código de puesta a 1 o puesta a 0 de las líneas desalida.

9.2.2. Funciones para comunicación serie asíncrona

set_uart_speed(baudios). Esta función sólo se puede emplear en aquellosdispositivos que utilizan el módulo SCI (USART) interno hardware. La función seemplea para cambiar la velocidad de transmisión/recepción en tiempo de ejecución.

set_uart_speed(2400);

Transmisión

putc() - putchar(). Se envía un carácter a través del pin especificado paraenvío (XMIT) en la directiva #USE RS232.

putc(carácter)

puts(). La cadena de caracteres debe finalizar con un 0. Se envía cada unode los caracteres de la cadena usando la función putc(). Después del envíode la cadena de caracteres, se envía un retorno de carro (carácter 10 =0x0A)y un salto de línea (carácter 13 =0x0D).

puts(cadena_caracteres)

puts(“Saludos”);

Page 111: Computadoras Electronicas

Computadoras Electrónicas 111

printf().

• printf(cadena_caracteres)

• printf(cadena_caracteres_constantes,Valores...)

• printf(Función, cadena_caracters_constantes, Valores...)

• Valores. Son variables en una lista separadas por comas.

• Función. Es el nombre de la función que se debe emplear para sacarlos caracteres (si no se especifica nada es la putc() por defecto). Estafunción saca, mediante la Función de salida especificada, los caracteresy los valores para su representación. Si se especificanValores, la cadenade caracteres debe ser constante y se puede insertar la representaciónde los valores utilizando el carácter especial% seguido del número decaracteres a utilizar (opcional de 1 a 9 ó 01 a 09 si se desean representarlos ceros a izq.) y del tipo de dato, que puede ser:

c como carácteru como entero sin signox como hexadecimal(entero)s como cadenaf flotante truncadog flotante con redondeoe flotante en formato exponencialD entero con signolu entero largo sin signoLX hexadecimal “largo”ld entero largo con signo

Tabla 9.5: Tipos de datos

Page 112: Computadoras Electronicas

112 Gustavo A. Yarce

Especificación Valor_1=0x12 Valor_2=0xFE%03u 18 254%u 18 254%2u 18 ?Indefinido%d 18 -2%X 12 FE

Tabla 9.6: Ejemplos de tipos de datos

Recepción

Es Importante notar que estas funciones tienen un comportamiento diferentesi la comunicación 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 recepciónRCV especificado en la directiva #USE RS232 y devuelve dicho byte comoresultado. Si la recepción está implementada mediante el módulo USARThardware, se puede hacer uso del triple buffer existente sin perder datos.Si está implementada por software, debemos estar esperando cada byte congetc() para no perder recepciones. Para evitar que el microcontrolador quede“colgado” esperando de manera indefinida la recepción de un byte que nollega, se debería usar la función kbhit() para verificar si ha llegado un caráctery está disponible

valor = getc( )

kbhit() Esta función devuelve 0 (FALSE) ó 1 (TRUE) si la función getc()necesitara conocer la disponibilidad de un carácter (byte) para ser leído. Si lacomunicación está gestionada por software, la función devuelve TRUE si seha detectado un bit de START en el pin de recepción Si está implementadacon la USART hardware, devuelve TRUE si el byte ha sido recibido y estádisponible en el buffer para ser leído mediante getc()

valor = kbhit( )

gets() Llamada gets(puntero)

Page 113: Computadoras Electronicas

Computadoras Electrónicas 113

Esta función espera y lee caracteres que va colocando a partir de la posiciónseñalada por el puntero utilizado como parámetro. Lee hasta que recibe unretorno de carro (13 - 0x0D). La tira de caracteres se finaliza con la inclusiónde 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 dirección (&s1[i])

strrchr(s1,c) Idem a la anterior pero empieza búsqueda desde final

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 mayúsculas o minúsculas

strncpy(s1,s2,n) Copia n caracteres de s2 en s1

strcspn(s1,s2) Cuenta caracteres de s1 que no están en s2

strspn(s1,s2) Cuenta caracteres de s1 que también están en s2

strlen(s1) Cuenta los caracteres de s1

strlwr(s1) Convierte todas las mayúsculas a minúsculas

strpbrk(s1,s2) Busca posición en s2 donde empieza copia de s1

s1 y s2 son punteros a arrays de caracteres.

9.3. Uso de las interrupciones

La interrupción RDA se produce cada vez que en la USART hay disponible uncarácter para ser leído.

El buffer de recepción de la USART del PIC 16F628 dispone de solo 2 bytes porlo que es importantísimo el descargarlo tal como se van recibiendo los caracteres,de esta forma evitamos el que se vean tristemente perdidos en el limbo serie.

Page 114: Computadoras Electronicas

114 Gustavo A. Yarce

Este Template demuestra cómo recibir cada carácter que llega haciéndole ecodesde el programa principal. Si necesitamos tomar muchos caracteres y nuestrarutina principal es larga y farragosa es interesante recibir mediante RDA loscaracteres e ir almacenando en un BUFFER más amplio para ser posteriormentetratados.

#include <16f628.h> // Selecciona el PIC#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT // Opciones de configuración#use delay(clock=4000000) // Velocidad del Cristal : 4 Mhz#use standard_io(b)#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1) // Definición del RS232

char Keypress=’ ’;

#int_rdavoid serial_isr() {

Keypress=0x00;if(kbhit()){

Keypress=getc();if(Keypress!=0x00){

putchar(keypress);keypress=0x00;

}}

}

void main() {

enable_interrupts(global);enable_interrupts(int_rda);

printf("\r\n\Listen on RS232 (Int)\r\n");

do {

} while (TRUE);}

Page 115: Computadoras Electronicas

Computadoras Electrónicas 115

#int_RDAvoid 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]));}

}

9.4. Instrucciones para la transmisión serie

c = GETC()

c = GETCH()

c = GETCHAR()

Estas funciones esperan un carácter por la patilla RCV del dispositivo RS232y retorna el carácter recibido.

Es preciso utilizar la directiva #USE RS232 antes de la llamada a esta funciónpara que el compilador pueda determinar la velocidad de transmisión y la patillautilizada. La directiva #USE RS232 permanece efectiva hasta que se encuentreotra que anule la anterior. Los procedimientos de I/O serie exigen incluir #USEDELAY para ayudar a sincronizar de forma correcta la velocidad de transmisión.Recordad que es necesario adaptar los niveles de voltaje antes de conectar el PICa un dispositivo RS-232.

Ejemplo:

Page 116: Computadoras Electronicas

116 Gustavo A. Yarce

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

9.4.1. GETS(char *string)

Esta función lee caracteres (usando GETC()) de la cadena (string) hasta queencuentra un retorno de carro(valor ASCII 13). La cadena se termina con un 0.

Ejemplo:

\item PUTC()\item PUTCHAR()

Estas funciones envían un carácter a la patilla XMIT del dispositivo RS232.Es preciso utilizar la directiva #USE RS232 antes de la llamada a esta funciónpara que el compilador pueda determinar la velocidad de transmisión y la patillautilizada. La directiva #USE RS232 permanece efectiva hasta que se encuentreotra que anule la anterior.

Ejemplo:

if (checksum==0)putchar(ACK);elseputchar(NAK); // NAK carácter de respuesta negativa

9.4.2. PUTS(string)

Esta función envía cada carácter de string a la patilla XMIT del dispositivoRS232. Una vez concluido el envío de todos los caracteres la función envía unretorno de carro CR o RETURN (ASCII 13) y un avance de línea LF o LINE-FEED (ASCII 10).

Ejemplo:

Page 117: Computadoras Electronicas

Computadoras Electrónicas 117

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

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

La función de impresión formateada PRINTF saca una cadena de caracteres alestándar serie RS-232 o a una función especificada. El formato está relacionado conel argumento que ponemos dentro de la cadena (string). Cuando se usan variables,string debe ser una constante. El carácter% se pone dentro de string para indicarun valor variable, seguido de uno o más caracteres que dan formato al tipo deinformación a representar. Si ponemos%% obtenemos a la salida un solo%. Elformato tiene la forma genérica%wt, donde w es optativo y puede ser 1,2,...,9.

Esto es para especificar cuántos carácteres son representados; si elegimosel formato 01,...,09 indicamos ceros a la izquierda, o también 1.1 a 9.9 pararepresentación en punto flotante.

t es el tipo de formato y puede ser uno de los siguientes:C CarácterU Entero sin signox Entero en Hex (en minúsculas)X Entero en Hex (en mayúsculas)D Entero con signo%e Real en formato exponencial(notación científica)%f Real (Float)Lx Entero largo en Hex (en minúsculas)LX Entero largo en Hex (en mayúsculas)Lu Decimal largo sin signoLd 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);

Page 118: Computadoras Electronicas

118 Gustavo A. Yarce

Page 119: Computadoras Electronicas

Capítulo 10

Conversión A/D - D/A

10.1. Señales analógicas

Son variables eléctricas que evolucionan en el tiempo en forma análoga a algunavariable física. Estas variables pueden presentarse en la forma de una corriente,una tensión o una carga eléctrica. Varían en forma continua entre un límite inferiory un límite superior. Cuando estos límites coinciden con los límites que admiteun determinado dispositivo, se dice que la señal está normalizada. La ventaja detrabajar con señales normalizadas es que se aprovecha mejor la relación señal/ruidodel dispositivo.

10.2. Señales digitales

Son variables eléctricas con dos niveles bien diferenciados que se alternan enel tiempo transmitiendo información según un código previamente acordado. Ca-da nivel eléctrico representa uno de dos símbolos: 0 ó 1, V o F, etc. Los nivelesespecíficos dependen del tipo de dispositivos utilizado. Por ejemplo si se empleancomponentes de la familia lógica TTL (transistor-transistor-logic) los niveles son 0V y 5 V, aunque cualquier valor por debajo de 0,8 V es correctamente interpretadocomo un 0 y cualquier valor por encima de 2 V es interpretado como un 1 (los ni-veles de salida están 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), losvalores dependen de la alimentación. Para alimentación de +5 V, los valores idealesson también 0 V y 5 V, pero se reconoce un 0 hasta 2,25 V y un 1 a partir de 2,75 V.

119

Page 120: Computadoras Electronicas

120 Gustavo A. Yarce

Estos ejemplos muestran uno de los principales atractivos de las señales digi-tales: su gran inmunidad al ruido.

Las señales digitales descriptas tienen la particularidad de tener sólo dos es-tados y por lo tanto permiten representar, transmitir o almacenar informaciónbinaria. Para transmitir más información se requiere mayor cantidad de estados,que pueden lograrse combinando varias señales en paralelo (simultáneas), cada unade las cuales transmite una información binaria. Si hay n señales binarias, el resul-tado es que pueden representarse 2n estados. El conjunto de n señales constituyeuna palabra. Otra variante es enviar por una línea única, en forma secuencial, lainformación. Si se sabe cuándo comienza, y qué longitud tiene una palabra (con-junto ordenado de estados binarios que constituye un estado 2n-ario), se puedeconocer su estado.

El hecho de que una señal digital pueda tener 2n estados, no nos dice nadarespecto a qué significa o cómo se interpreta cada estado. Como veremos acontinuación, esta interpretación depende, realmente, del código utilizado.

10.3. Muestreo y retención(sample and hold)

Se denomina muestreo a la acción de tomar muestras (valores) de una señalen una sucesión de instantes sin importar lo que sucede el resto del tiempo. Elloimplica poder conmutar la señal de manera que en el instante deseado la mismaatraviese un amplificador (o seguidor) y fuera de ese instante la entrada quedeconectada a masa. Ello puede lograrse con el circuito de la figura 10.3

Figura 10.1: Circuito de muestreo

Page 121: Computadoras Electronicas

Computadoras Electrónicas 121

La llave, en la práctica, puede ser un FET. Este circuito tiene la desventajade que no permite retener el valor de la última muestra, sino que la salida vuelvea 0. En muchos casos, específicamente en el de la conversión analógica-digital,hace falta un valor constante durante cierto intervalo de tiempo para efectuar unaconversión correcta. Para lograr esto, es preciso realizar un muestreo con retención.Un circuito de muestreo y retención es el que se ilustra en la figura 10.3

Figura 10.2: Circuito de muestreo con retención

Típicamente, el tiempo de muestreo será corto, y el de retención más largo

Figura 10.3: Aplicación de un circuito de muestreo y retención.

Page 122: Computadoras Electronicas

122 Gustavo A. Yarce

10.4. Especificaciones del muestreo y retención

Un sistema de muestreo y retención (sample and hold) ideal transmitiráinstantáneamente y sin errores el valor de su entrada a la salida durante la etapa demuestreo y conservará dicho valor indefinidamente, durante la etapa de retención,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 especificaciones:

Tiempo de establecimiento: Es el tiempo requerido, durante el muestreo,para que la salida alcance su valor final con una tolerancia especificada (quedependerá de la aplicación). Se debe a dos factores: la resistencia ON de lallave (que justo con el capacitor C forma una constante de tiempo) y la propiarespuesta temporal del amplificador, que podría inclusive tener oscilacionestransitorias.

Error de ganancia: Durante el muestreo (la llave cerrada) la salida deberíaseguir exactamente a la entrada. Sin embargo podía haber pequeños erroresde ganancia y tener una ganancia, típicamente, algo menor que 1.

Error de offset: Podría haber un desplazamiento de la salida respecto a laentra- da, en general debido al offset del amplificador.

Derivas durante la retención: Aunque idealmente el capacitor C no tienepor donde descargarse cuando la llave se abre, en la práctica nos encontramoscon diversas fugas: las pérdidas debidas al C, la corriente de polarización delamplificador operacional, las fugas a través de la llave no ideal, y las fugasa través de imperfecciones en el circuito impreso. Todo esto da origen auna deriva denominada en inglés “droop” (que podría traducirse como unainclinación debida a falta de soporte), y que se expresa en mV/S.

Feedthrough: Durante la retención, además de la deriva ya descripta, suelehaber una filtración de señal a través de la capacidad parásita de la llaveque hace que aparezca superpuesta con la salida una versión atenuada de laentrada. Se determina aplicando una senoide de máxima amplitud y midiendola amplitud del ripple a la salida. Se expresa como fracción de la entrada ydepende de la frecuencia. También se expresa como atenuación en dB

Tiempo de apertura (aperture time): Es el tiempo entre la señal deretención y el instante en que la retención tiene lugar realmente.

Tiempo de adquisición (acquisition time): Intervalo de tiemponecesario con la señal presente después de habilitar el muestreo para que

Page 123: Computadoras Electronicas

Computadoras Electrónicas 123

la salida alcance el valor de la entrada con un error especificado (típicamente0,1%). En general se toma un salto de máxima amplitud entre el valorretenido previamente y el nuevo valor de salida

10.5. Conversión analógica-digital

Ahora partimos de una señal analógica y queremos convertirla a una represen-tación numérica. Existen dos dificultades. La primera es que una representaciónexacta requiere una cantidad infinita (y continua) de estados posibles, lo cual asu vez exigiría infinitos dígitos. La segunda dificultad está en que para obtenerdicha representación se requiere que durante un tiempo la señal se mantenga inva-riable. La primera dificultad se resuelve por medio de la cuantización, es decir laaproximación mediante un nivel tomado de entre una cantidad finita de niveles. Elproceso de cuantización será asimilable al redondeo o el truncamiento de un nú-mero de infinitas cifras decimales. La segunda dificultad se resuelve por medio delmuestreo y la retención. Supondremos, por consiguiente, que la señal de entradaes constante durante el proceso de conversión.

Existen varias técnicas de conversión analógica digital, que podrían clasificarseen dos grandes grupos: directas y realimentadas. Los conversores directos obtienenel dato digital por conteo o por comparación, mientras que los realimentadoslo hacen mediante un conversor digital analógico que realimenta el dato digitalgenerado por algún sistema lógico.

10.6. Métodos directos de conversión A/D

Entre éstos se encuentran los conversores de integración de doble y simplerampa y los flash (en paralelo).

Page 124: Computadoras Electronicas

124 Gustavo A. Yarce

10.6.1. Conversores flash (en paralelo)

Consisten en una serie de comparadores que comparan la señal de entrada conuna referencia para cada nivel. El resultado de las comparaciones ingresa a un cir-cuito lógico que “cuenta” los comparadores activados. En la figura 2.36 se muestraun ejemplo de conversor flash de 3 bits. Las referencias para cada nivel se obtienencon un divisor resistivo múltiple. Los valores de las resistencias extremas difierende las restantes para lograr que la conmutación de un código al siguiente se pro-duzca a mitad de camino del intervalo que corresponde a ese código. Así, si Vreffuera 8 V, las conmutaciones se efectuarían en 0,5 V, 1,5 V, 2,5 V, etc.

La ventaja de este tipo de conversores es que la conversión es prácticamenteen tiempo real, salvo el tiempo de conmutación de los comparadores y la lógica.La desventaja es que cuando la resolución es alta requiere una gran cantidad decomparadores, cuyo offset debe ser menor que 1 LSB. Además, las capacidades deentrada se suman, lo cual atenta contra las altas velocidades que augura el métodode conversión. En los casos de resoluciones altas, la conversión se suele realizar endos etapas, es decir que se usa la mitad de comparadores y en la segunda etapase les agrega una tensión de referencia que los desplaza. En este caso se utilizancircuitos lógicos secuenciales.

Figura 10.4: Estructura de un conversor analógico-digital flash (en paralelo) de 3 bits.

Page 125: Computadoras Electronicas

Computadoras Electrónicas 125

10.6.2. Conversor de simple rampa

En este tipo de conversores se utiliza un integrador con un capacitor que secarga a pendiente constante hasta alcanzar la tensión a convertir, instante en quecesa la integración. El tiempo requerido es proporcional a la tensión de entrada, ypuede medirse con un contador que cuente ciclos de un reloj.

Figura 10.5: . Esquema de un conversor analógico digital de simple rampa.

El integrador comienza a integrar la tensión -VREF, obteniéndose

V1 =VRef

RCt

Mientras V1 < Vi el comparador está alto, permitiendo que los pulsos deloscilador pasen a la entrada de reloj de un contador. Cuando V1 ≥ Vi ,elcomparador conmuta, inhibiendo los pulsos de reloj. El contador queda entoncescon su cuenta retenida. Dicho valor es

D = [fckt0] =

[fckRC

i

VRef

]donde [] es la parte entera del argumento. Eligiendo fckRC = 2n se obtiene un

conversor de n bits.

Este circuito tiene al menos dos inconvenientes:

Page 126: Computadoras Electronicas

126 Gustavo A. Yarce

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

2. si se requiere mayor velocidad debe reducirse RC, por lo cual las corrientesde polarización pueden alterar la integración.

10.7. Métodos realimentados de conversión A/D

Operan generando digitalmente un código (de acuerdo con alguno de varioscriterios), el cual se aplica como entrada digital a un conversor D/A. La salida deéste se compara con la entrada, y según el signo del error se incrementa o no elcódigo.

10.7.1. Conversor de rampa discreta

En este caso el generador de código es un simple contador ascendente. Alresetear el contador, el conversor D/A aplica una tensión nula al comparador.Si vi > 0, la salida del comparador es alta, la compuerta AND deja pasar lospulsos del reloj, el contador comienza a incrementar el número

Figura 10.6: Esquema de un conversor analógico-digital de rampa discreta.

aplicado en el D/A y éste comienza a aumentar en forma escalonada la tensiónen el terminal (-) del comparador. Esta situación se mantiene hasta que la tensión(-) supera a vi. En ese instante la salida del comparador baja e inhibe, a través de

Page 127: Computadoras Electronicas

Computadoras Electrónicas 127

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

10.7.2. Conversor de balance continuo

El conversor anterior requiere ser reseteado para cada conversión, y por lotanto se requieren hasta 2n − 1 ciclos de reloj para completar una conversión.Conceptualmente, el reset puede interpretarse como un conteo descendenterápido, y en ese caso se efectuaba externamente al conversor (ya sea manual oautomáticamente). Supongamos ahora un contador capaz de contar hacia arriba ohacia abajo (up/down) según el nivel de una señal de control. Tendremos así unconversor que responde muy rápidamente a variaciones pequeñas.

Figura 10.7: Esquema de un conversor analógico-digital de balance continuo.

Una desventaja es que siempre cambia de valor, aun con entrada constante, yaque siempre “se pasa” para uno u otro lado, oscilando con una amplitud de un LSB.Una solución sería ignorar el bit menos significativo, o bien utilizar un conversorcon un bit más de lo necesario.

Page 128: Computadoras Electronicas

128 Gustavo A. Yarce

10.8. Especificaciones de los conversores A/D

Igual que en el caso de los conversores digital-analógicos y los sample and hold,existen diversas no idealidades (algunas heredadas de aquéllos) que requieren unacuidadosa especificación. En lo que sigue se describirán las especificaciones másimportantes.

Resolución: Es la cantidad de bits que entrega a su salida luego decompletada la conversión. También puede expresarse como el porcentajeo partes por millón (ppm) que representa cada LSB en el rango total deentrada. Por ejemplo, un conversor de 12 bits tiene una resolución de 1/212100 = 0,0244% o de 244 ppm.

Error de cuantización: Es la máxima desviación de un conversor analógicodigital ideal con respecto a una transferencia perfectamente lineal, expresadaen LSB. El error puede ser de 0,5 LSB ó +0/ 1 LSB, según cuál sea el puntode conmutación. En algunos casos se procede por truncamiento y en otrospor redondeo. La desviación máxima se alcanza apenas antes de conmutaral nivel siguiente.

Error de histéresis: Es el ancho de la ventana de histéresis que se establecealrededor de cada conmutación, expresado en LSB. Se debe en general a lahistéresis del o los comparadores, y es razonable esperar que sea << 1 LSB.No es común encontrar esta especificación. La histéresis se utiliza con ventajapara evitar conmutaciones debidas a pequeños niveles de ruido.

Error de offset: Es el valor de tensión que debe aplicarse a la entrada paratener una salida digital nula. Se debe al offset del comparador y se expresaen mV o en LSB nominales.

Tiempo de conversión: Es el tiempo requerido por un conversor A/D paraefectuar una conversión completa.

Frecuencia de conversión: Es la cantidad de conversiones por segundo quees capaz de efectuar un conversor A/D. No necesariamente coincide con elrecíproco del tiempo de conversión, ya que podría haber algunas operacionescomplementarias, que ocupan tiempo después de terminada la conversiónpropiamente dicha.

Frecuencia de reloj: Frecuencia del oscilador que envía pulsos para laoperación del conversor (por ejemplo, para hacer funcionar el contador o elregistro de aproximaciones sucesivas).

Page 129: Computadoras Electronicas

Computadoras Electrónicas 129

10.9. El ADC en el PIC

El tiempo de conversión para cada bit viene definido por el TAD, el conversornecesita un mínimo de 12 ciclos de reloj (12TAD), para la conversión de 10-bits.Para generar los pulsos de reloj, deberemos escoger la mejor de las 3 opcionesque nos facilita: 2TOSC, 8TOSC, 32 TOSC. Tendremos en cuenta que el osciladorinterno tiene un TAD típico de 4us, pero podemos hacerlo variar entre 2us y 6us.Para un optimo funcionamiento del conversor, nunca deberemos seleccionar untiempo 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 resolución, perosi pueden requerir una conversión A/D mas rápida. El modulo A/D permite quel usuario realice la compensación de velocidad de la conversión. Para acelerar oralentizar la conversión, la fuente del reloj del modulo A/D pude variar de talmodo que el TAD varíe.

La fuente de los impulsos de reloj se aplica a un Divisor de Frecuencias(Prescaler) que los divide por 1, 2, 4 u 8, según el valor de los bits del registroT1CON. El reloj externo puede estar sincronizado o no con el interno, según elbit T1SYNC de T1CON. El interno siempre es síncrono. El tiempo que dura laconversión depende de la frecuencia de funcionamiento del PIC y del valor de losbits ADCS1 y ADCS0.

10.10. Configuración de Registros

El conversor analógico digital usa cuatro registros para realizar la conversión:

A/D result high register (ADRESH)

A/D result low register (ADRESL)

A/D control register0 (ADCON0)

A/D control register1 (ADCON1)

Page 130: Computadoras Electronicas

130 Gustavo A. Yarce

ADCON0 (address: 1FH)

Controla las operaciones del modulo A/D.

Figura 10.8: AdCON0

Bit 6-7: ADCS1:ADCS2: bits de selección del reloj de conversión.00 = fosc/201 = fosc/810 = fosc/3211= Frc (el reloj deriva del oscilador RC interno

del modulo A/D; modo sleep)

bit 5-6: CHS2:CHS0: bits de selección del canal analógico000 = 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 conversión A/Dsi ADON =

1 = conversión A/D en proceso0 = la conversión no esta en proceso(este bit se borra automáticamente porel hardware cuando la conversión A/D termina)

bit 1: no implementado: se lee como 0

bit 0: ADON: bit de encendido1 = el conversor esta operando

Page 131: Computadoras Electronicas

Computadoras Electrónicas 131

0 = el conversor esta apagado

ADCON1 (addess: 9FH)

Configura las funciones de los puertos. Los puertos pueden ser configuradoscomo entradas analógicas o como entrada digital.

Figura 10.9: ADCON1

bit 7: ADFM: bit de selección de formato de resultado A/D1 = justificación a derecha. Los 6 bits más significativos

de ADRESH son leídos como 00 = justificación a izquierda. Los 6 bits menos

significativos de ADRESL son leídos como 0

bit 6-4: no implementados: se leen como 0

bit 3-0: PCFG3: PCFG0: bits de control de la configuración de los puertos

La columna CHAN/Refs indica el número de canales analógicos disponiblescomo entradas A/D y el número de canales analógicos usados como entradas dereferencia de voltaje.

Configuración de los puertos analógicos:

Los registros ADCON1 y TRIS controlan la operación de los puertos A/D.los puertos que se deseen configurar como entradas analógicas deben tener su

Page 132: Computadoras Electronicas

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 : ADRESLEstos registros contienen los 10 bits del resultado de la conversión A/D. Cada

uno de estos registros es de 8 bits por lo que entre los dos suman un total de 16bits. El conversor A/D tiene flexibilidad para ajustar a la derecha o a la izquierdalos 10 bits que son el resultado de la conversión en los 16 bits de los registros deresultado. El bit de selección de formato (ADFM; bit 7 del registro ADCON1)controla esta justificación. Con el bit de selección de formato a 1 la justificaciónserá a la derecha, y puesto a 0 la justificación será a la izquierda. Los bits sobrantesse guardan con ceros.

Cuando la conversión A/D esta desactivada estos registros son usados comodos registros de 8 bits de uso general.

Cuando la conversión se completa los resultados se cargan en este par deregistros. El bit GO/DONE se pone a cero y la bandera (flag) del bit deinterrupción se prepara poniéndose a 1

Page 133: Computadoras Electronicas

Computadoras Electrónicas 133

Después que el modulo A/D se configura (ADCON1: bits 3-0) el canal deseadose debe adquirir antes de comenzar la conversión. Los canales de la entradaanalógica deben tener su bit de TRIS seleccionados como entradas. Cuando eltiempo de adquisición finaliza la conversión puede empezar.

Pasos para llevar a cabo una conversión:

1. configuración del modulo A/D

2. configuración de los puertos analógicos y de la referencia de voltaje(ADCON1: bits 3-0)

3. selección del canal de entrada (ADCON0 bits 5-3)

4. selección del reloj de conversión (ADCON0: bits 7-6)

5. encender el modulo A/D (ADCON0: bit 1)

6. espera del tiempo de adquisición requerido.

7. empezar la conversión

8. esperar que se complete la traducción.Verificar el bit GO/DONE hasta quese borre o esperando la Interrupción del A/D.

9. leer el resultado almacenado en ADRESH:ADRESL borrar el bit ADIF si serequiere.

10. El tiempo de conversión por bit se define como Tad, una espera mínima dedos Tads es necesaria asta que empiece la otra adquisición.

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 función prepara o configura el conversor A/D, donde “modo” puede tomar elsiguiente valor:

Page 134: Computadoras Electronicas

134 Gustavo A. Yarce

adc_off

adc_clock_internal

adc_clock_div_2

adc_clock_div_8

adc_clock_div_32

setup_adc_ports(valor);Esta función configura los pines del ADC para que sean analógicos, digitales oalguna combinación de ambos. Las combinaciones permitidas varían, dependiendodel chip.Las constantes ALL_ANALOG y NO_ANALOGS son válidas para todoslos chips.

setup_adc_ports(RA0_RA1_RA3_ANALOG);

setup_adc_ports( ALL_ANALOG );

Valor: define las entradas analógicas correspondientes a los bits 3-0 delADCON1.

setup_adc_channel(canal);Especifica el canal a utilizar por la función READ_ADC(). El número de canalempieza en 0. Es preciso esperar un corto espacio de tiempo después de cambiarel canal de adquisición, antes de que se puedan obtener lecturas de datos válidos.

0 - an0

1 - an1

2 - an2

3 - an3

4 - an4

5 - an5

Page 135: Computadoras Electronicas

Computadoras Electrónicas 135

6 - an6

7 - an7

valor=read_adc();Esta función lee el valor digital del conversor analógico digital. Deben hacersellamadas a SETUP_ADC() y SET_ADC_CHANNEL() en algún momento antesde la llamada a esta función.

Ej:#device adc=10; //define el conversor con 10 bits de resolución#device adc=8; //define el conversor con 8 bits de resolución

La directiva read_adc() admite tres modos de funcionamientos:

adc_start_and_read = Inicia la conversión y leer el conversor.

adc_start_only = Sólo inicia la conversión.

adc_read_only = Sólo 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); //Canal 0 analógicosetup_adc(adc_clock_internal); //Fuente de reloj RC

for (;;) {set_adc_channel(0); //Habilitación canal 0

Page 136: Computadoras Electronicas

136 Gustavo A. Yarce

delay_us(20);q = read_adc(); //Lectura canal 0

}}

Funciones Adicionales

i=ATOI(char *ptr) Esta función convierte la cadena de caracteres apuntadapor 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. Elprototipo de esta función está en el fichero de cabecera stdlib.h

i=ATOL(char *ptr) Esta función convierte la cadena de caracteres apuntadapor ptr en un número entero largo (long). Acepta argumentos en decimal yen hexadecimal. Si el resultado no se puede representar, el comportamiento esindeterminado. El prototipo de esta función está en el fichero de cabecera stdlib.h

10.12. Conversión digital - analógica (D/A)

Partimos de una señal digital

D = dndn−1...d1

en paralelo que responde a la codificación binaria natural y una referencia Xref(podría ser una tensión o una corriente) y pretendemos obtener una señal analógicax que varíe de a saltos iguales a

Xref

2n

entre 0 y(2n − 1)Xref

2n= Xref(1− 2−n)

como se muestra en la fig. 10.12

Page 137: Computadoras Electronicas

Computadoras Electrónicas 137

Figura 10.11: Relación entre la entrada digital D y la salida analógica x de un conversordigital-analógico, con n = 3.

La estructura genérica de este tipo de conversores es la que se ha indicado enla fig. 10.12

Figura 10.12: Estructura de un conversor digital-analógico. Xref es la referencia,dn · · · d1 la entrada digital y x la respuesta analógica.

Page 138: Computadoras Electronicas

138 Gustavo A. Yarce

10.13. Método de conmutación de corrientes pon-deradas

Una primera idea consiste en utilizar una serie de fuentes de corriente pondera-das que concurren a un nudo sumador de corrientes. Cada corriente se conmuta enfunción del valor del bit correspondiente. Esta idea se implementa con resistenciasy llaves analógicas.

La corriente ik por la k-ésima rama es

ik = dkVREF

2n−k+1Rk = 1, ..., n

V = −(dn

1

2R+ dn−1

1

22R+ · · ·+ d1

1

2nR

)VREFR

Figura 10.13: Circuito equivalente de un conversor digital-analógico de resistenciasponderadas..

V = −VREF

2n

n∑k=1

dk2k−1

Page 139: Computadoras Electronicas

Computadoras Electrónicas 139

10.14. Método de la red escalera R-2R

Una red resistiva como la indicada en la figura 2.5 tiene la particularidad deque cualquiera sea el número de secciones la resistencia vista (excepto al final) esR. Este circuito puede usarse como se muestra en la figura 2.6 para obtener unconversor digital analógico muy eficiente.

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

10.15. Especificaciones de los conversores D/A

Para una aplicación efectiva de los conversores digital-analógicos es precisoconocer y saber interpretar las especificaciones de los mismos, ya que ponen demanifiesto las limitaciones así como las verdaderas prestaciones, que en muchoscasos difieren considerablemente de la idealidad. A continuación presentamos unadescripción de las especificaciones más importantes.

Resolución: es la cantidad de bits o dígitos binarios que acepta en suentrada. También puede expresarse como el porcentaje del valor nominalmáximo (fondo de escala). Ejemplo: un conversor de 10 bits también puedetener su resolución expresada como 1/210 ∼= 0, 0976 % . Observar que laresolución por sí sola no indica nada respecto a la precisión del conversor.

Page 140: Computadoras Electronicas

140 Gustavo A. Yarce

Figura 10.15: Circuito Práctico R-2R

Exactitud: es la máxima desviación respecto a la línea recta que une elmínimo y el máximo valor ideales. Se expresa en LSB (least significant bit),lo cual significa que se usa el salto mínimo nominal como unidad. Otra formade expresarlo es en porcentaje del valor máximo nominal. La exactitud ideales 0 LSB. Es necesario tener en cuenta que esta especificación incluye todoslos errores posibles del conversor

Page 141: Computadoras Electronicas

Computadoras Electrónicas 141

Figura 10.16: Exactitud

Error de escala: Es el error que se obtiene a fondo de escala con respectoal valor ideal. Se debe en general a errores de ganancia, en la referencia o enla red resistiva. Se expresa también en LSB a fondo de escala. El error deescala ideal es 0 LSB.

Figura 10.17: Error de escala

Error de offset: Es el valor de salida obtenido cuando la entrada es nula. Semide en porcentaje del máximo nominal o en LSB. El valor ideal es 0 LSB.

Page 142: Computadoras Electronicas

142 Gustavo A. Yarce

Figura 10.18: Error de offset

Tiempo de establecimiento: Es el máximo tiempo transcurrido luegode un cambio de código de entrada arbitrario para alcanzar el valoranalógico correspondiente con un error de a lo sumo 0,5 LSB. El tiempode establecimiento de un conversor D/A tiene dos componentes: una debidaal comportamiento dinámico lineal y otra debido al slew-rate del amplificadoroperacional (fenómeno no lineal). La primera se debe a las capacidadesparásitas en paralelo con las llaves analógicas, que hacen que la conmutaciónentre un código de entrada y otro no sea instantánea. Sus características sonsimilares a las de cualquier transitorio, con una aproximación exponencial alvalor final. La componente debida al slew-rate del amplificador se caracterizapor un crecimiento lineal con pendiente fija, por lo cual cuanto mayor sea laamplitud 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 delslew-rate, salvo que se usen amplificadores de muy alta velocidad.

Slew-rate: máxima pendiente de la salida ante una conmutación del códigode entrada. Su efecto es más notorio en las transiciones grandes (o a fondode escala). En general, se debe no a la red R-2R sino al amplificador queconvierte corriente en tensión.

Page 143: Computadoras Electronicas

Capítulo 11

PWM

11.1. Introducción

La modulación por ancho de pulsos,PWM(Pulse-Width Modulation) de unaseñal o fuente de energía es una técnica en la que se modifica el ciclo de trabajode una señal periódica, ya sea para transmitir información a través de un canal decomunicaciones o para controlar la cantidad de energía que se envía a una carga.

El ciclo de trabajo de una señal periódica es el ancho relativo de su parte positivaen relación con el período. Expresado matemáticamente:

D =τ

T

D es el ciclo de trabajo

τ es el tiempo en que la función es positiva (ancho del pulso)

T es el período de la función

La construcción típica de un circuito PWM se lleva a cabo mediante un compa-rador con dos entradas y una salida. Una de las entradas se conecta a un osciladorde onda dientes de sierra, mientras que la otra queda disponible para la señal mo-duladora. En la salida la frecuencia es generalmente igual a la de la señal dientesde sierra, y el ciclo de trabajo está en función de la portadora.

La principal desventaja que presentan los circuitos PWM es la posibilidad deque haya interferencias generadas por radiofrecuencia. Éstas pueden minimizarseubicando el controlador cerca de la carga y realizando un filtrado de la fuente dealimentación.

143

Page 144: Computadoras Electronicas

144 Gustavo A. Yarce

Figura 11.1: Señal PWM

11.2. PWM en un microcontrolador

Los microcontroladores de la serie 16f87x poseen dos modulos CCP, quepermiten realizar:

1. Modo captura.

2. Modo comparación.

3. Modo PWM.

El módulo CCP1 utiliza un registro de trabajo de 16 bits que esta formado porla concatenación de los registros CCPR1H-CCPR1L (direcciones 16h y 15h). Elregistro de control del módulo CCP1 es el CCP1CON(17H). El módulo CCP2 tienecomo registro de trabajo CCPR2H-CCPR2L(1Ch-1Bh) y un registro de controlCCP2CON(1Dh).

Cuando se trabaja en el modo PWM, el pin RC2/CCP1 esta configurado comosalida y alterna su valor entre 0 y 1. Para lograr esta alternancia se usa uncomparador que pone a 1 un flip-flop cuando el valor del registro PR2 coincidecon la parte alta del TMR2, momento en el cual toma el valor 00h. El el flip-flopse pone a cero cuando otro comparador detecta la coincidencia del valor existenteen CCPR1H con el de la parte alta del TMR2. Por lo tanto variando los valores quese cargan en PR2 y CCPR1L se varía el intervalo de tiempo del pin RC2/CCP1.

Page 145: Computadoras Electronicas

Computadoras Electrónicas 145

Cuando se trabaja con una resolución de 10 bits, los dos bits CCP1CON<5:4>seconcatenan con los 8 bits de CCPR1L, y de la misma forma, los 8 bits de mas pesode TMR2 se concatenan con los dos bits de menos peso del reloj interno, hacien-do que el TMR2 cuente cada TOSC en vez de cada 4TOSC. El tiempo que dura elperíodo de la señal depende del valor cargado en PR2:

PeriodoPWM = [(PR2) + 1] ∗ 4 ∗ TOSC ∗ (TMR2 V alor del Prescaler)

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

El tiempo que la pin RC2/CCP1 esta a nivel alto, depende del valor cargadoen CCPR1L y de los bits 5 y 4 del CCP1CON

Ancho del pulso = (CCPR1L : CCP1CON<5:4>)∗TOSC∗(TMR2 V alor del Prescale)

Ciclo util =(CCPR1L : CCP1CON<5:4>)

4(PR2 + 1)

El procedimiento para configurar el modo PWM es el siguiente:

1. Asignar el período cargando el valor adecuado en PR2.

2. Asignar el ancho del pulso cargando el registro CCPR1L y los dos bits 5 y 4del CCP1CON.

3. Configurar el pin RC2/CCP1 como salida.

4. Asignar el valor del Prescaler y activar el TMR2 escribiendo en T2CON.

5. Configurar el módulo CCP1 en modo PWM.

Page 146: Computadoras Electronicas

146 Gustavo A. Yarce

11.3. PWM en CCs

Para configurar el módulo CCP en modo PWM se debe realizar

1. Configurar el modo PWM

setup_ccp1(CCP_PWM);

2. Configurar el “modo” del prescaler y el período PWM

setup_timer_2(modo, período,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 paramantener el PIN RC2/CCP en alto.

set_pwm1_duty=(valor)

Page 147: Computadoras Electronicas

Computadoras Electrónicas 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 cálculo PWM

Supongamos que se desea una frecuencia de 1500 Hz a un ciclo de trabajo de30% con una frecuencia del oscilador de 4MHz.

Según la fórmula de cálculo del período:

PeriodoPWM = [(PR2) + 1] ∗ 4 ∗ TOSC ∗ (TMR2 V alor del Prescaler)

Por lo tanto

PeriodoPWM =1

FPWM

=1

1500Hz= 6, 67x10−4

TOSC =1

4MHz= 250ns

Necesitamos encontrar el valor que se carga en el registro PR2, para ellodebemos fijar el valor del Prescaler del TMR2. Recordar que el valor de este puedeser 1, 4 o 16.

El valor de PR2 para los diferentes valores del Prescaler da,

Page 148: Computadoras Electronicas

148 Gustavo A. Yarce

PR2 =PeriodoPWM

4 ∗ TOSC ∗ (TMR2 V alor del Prescaler)− 1

Período Prescaler PR26, 67x10−4 1 665,676, 67x10−4 4 165,676, 67x10−4 16 40,67

El valor correspondiente a PR2 es el de un registro de 8bits, por lo que el valormáximo que puede adoptar es 255. Analizando los valores calculados se puede verque el valor 665,67 no es admisible. Quedan los otros dos valores,

165,67

40,67

Los valores admisibles serán tipo BYTE, por lo tanto

165, 67 =⇒{

165

166

40, 67 =⇒{

40

41

PR2 Frec_PWM Error165 1506,024096 6,02166 1497,005988 2,9940 1524,390244 24,3941 1488,095238 11,90

Se puede deducir que el valor apropiado para el TMR2 es el de 166, con unvalor para el prescaler de 4.

Si queremos un ciclo de trabajo del 30%, significa que el valor donde se repiteel periodo (PR2+1) es 167, debemos encontrar el valor de

(CCPR1L : CCP1CON<5:4>) = Ciclo util ∗ (4 ∗ (PR2 + 1))

= 0, 3 ∗ (4 ∗ (166 + 1)) = 200, 40

Page 149: Computadoras Electronicas

Computadoras Electrónicas 149

Tomaremos como valor (CCPR1L : CCP1CON<5:4>) = 200Para utilizar los 10 bits de resolución el CCS debe saber que el parámetro 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 final resulta en:

PR2 = 166

(CCPR1L : CCP1CON<5:4>) = 200

Valor del Prescaler TMR2 = 4

El código de configuración será, 30%

setup_ccp1(ccp_PWM);

setup_timer_2(t2_div_By_4,166,1);

set_pwm_duty(200L);

Ciclo Útil Frec_PWM (CCPR1L : CCP1CON<5:4>)30 % 1500 20050 % 1500 33475 % 1500 500