Juan Carlos Vesga Ferreira, Martin Sinsel Eduardo Muriel, Jaime Hueso Juan Cazares, Luis Puebla, Diego Haro
MICROCONTROLADORES Motorola-Freescale
Programación, familias y sus distintas aplicaciones en la industria
freescale
semiconductor
TM
Datos catalográficos Vesga, Juan Microcontroladores Motorola-Freescale: programación, familias y sus distintas aplicaciones en la industria. Primera Edición Alfaomega Grupo Editor, S.A. de C.V., México ISBN: 978-970-15-1329-3 Formato: 21 x 24 cm
Páginas: 368
Microcontroladores Motorola-Freescale: programación, familias y sus distintas aplicaciones en la industria Juan Carlos Vesga Ferreira Coautores: Martin Sinsel, Eduardo Muriel, Jaime Hueso, Juan Cazares, Luis Puebla, Diego Haro Derechos reservados © Alfaomega Grupo Editor, S.A. de C.V., México © Freescale Semiconductor Primera edición: Alfaomega Grupo Editor, México, noviembre 2007 © 2008 Alfaomega Grupo Editor, S.A. de C.V. Pitágoras 1139, Col. Del Valle, 03100, México D.F. Miembro de la Cámara Nacional de la Industria Editorial Mexicana Registro No. 2317 Pág. Web: http://www.alfaomega.com.mx E-mail:
[email protected] ISBN: 978-970-15-1329-3 Derechos reservados: Esta obra es propiedad intelectual de su autor y los derechos de publicación en lengua española han sido legalmente transferidos al editor. Prohibida su reproducción parcial o total por cualquier medio sin permiso por escrito del propietario de los derechos del copyright. Edición autorizada para venta en México y todo el continente americano. Impreso en México. Printed in Mexico. Empresas del grupo: México: Alfaomega Grupo Editor, S.A. de C.V. – Pitágoras 1139, Col. Del Valle, México, D.F. – C.P. 03100. Tel.: (52-55) 5089-7740 – Fax: (52-55) 5575-2420 / 2490. Sin costo: 01-800-020-4396 E-mail:
[email protected] Colombia: Alfaomega Colombiana S.A. – Carrera 15 No. 64 A 29 – PBX (57-1) 2100122 Fax: (57-1) 6068648 – E-mail:
[email protected] Chile: Alfaomega Grupo Editor, S.A. – General del Canto 370-Providencia, Santiago, Chile Tel.: (56-2) 235-4248 – Fax: (56-2) 235-5786 – E-mail:
[email protected] Argentina: Alfaomega Grupo Editor Argentino, S.A. – Paraguay 1307 P.B. “11”, Capital Federal, Buenos Aires, C.P. 1057 – Tel.: (54-11) 4811-7183 / 8352, E-mail:
[email protected]
Mensaje del editor Los conocimientos son esenciales para el buen desempeño de los profesionales. Estos les permiten adquirir habilidades indispensables para competir laboralmente. Durante el paso por la universidad o por las instituciones de formación para el trabajo, se tiene una gran oportunidad de adquirir conocimientos, que debe ser aprovechada para más tarde cosechar en beneficio propio y en el de quienes nos rodean. El avance de la ciencia y de la técnica hace necesario mantener conocimientos actualizados, a riesgo de perder competitividad laboral y, eventualmente, bienestar. Cuando se toma la decisión de capacitarse para actuar como trabajadores profesionales, se firma un compromiso de por vida con los conocimientos que conforman un oficio específico. Alfaomega se ocupa de presentarles a los lectores los conocimientos dentro de lineamientos pedagógicos que faciliten su utilización y les ayuden a aprender y a desarrollar las competencias requeridas por una profesión determinada. Así mismo, combina las diferentes tecnologías de la información y las comunicaciones (IT) para facilitar su aprendizaje. Alfaomega espera ser su compañera de por vida en este viaje por el conocimiento. Nuestros libros impresos están complementados por una página Web en donde el alumno y su profesor encontrarán materiales adicionales, información actualizada, tests de autoevaluación, diapositivas y vínculos con otros sitios Web relacionados. Visualmente, las obras contienen numerosos gráficos, tablas y párrafos cortos bien desarrollados, para que el estudiante “navegue” durante su estudio, facilitándole la comprensión y apropiación del conocimiento. Los libros de Alfaomega están diseñados para ser utilizados dentro de los procesos de enseñanza-aprendizaje, y pueden usarse como textos guía del curso o como apoyo para reforzar el desarrollo profesional. Cada capítulo tiene objetivos y metas cognitivas concretas, la estructura de relato es fácilmente comprensible; al final de cada capítulo se encuentran actividades pedagógicas, además de extensa bibliografía, palabras clave y resumen. Alfaomega desea que cuando el acervo cognitivo conjuntamente con el desarrollo de las destrezas le permitan ser profesional exitoso(a), no olvide su responsabilidad social y así lograr conjuntamente construir un país mejor.
Web de apoyo La página Web de este libro, cuenta con Software (2 programas) que le permitirán trabajar simultáneamente los ejercicios y ejemplos planteados en el libro. Tendrán a disposición simulaciones de programación, anexos con documentos afines al tema, ejercicios, un plano para Programador Motorola, lista de sitios Web relacionados y ayudas permanentemente actualizadas. Ayudas para docentes que incluyen presentaciones del tema en PowerPoint por capítulo. Para acceder a la Web de Apoyo, deberá ingresar a nuestra página Web: www.alfaomega.com.co en la cual encontrará un link llamado Web de Apoyo, este a su vez lo llevará a nuestra plataforma virtual y al libro Microcontroladores Motorola - Freescale. Para ingresar a las ayudas, utilice la clave incluida en el libro y regístrese como usuario, una vez registrado, siga las instrucciones dadas en la Web. Los usuarios que accedan con el código asignado, podrán utilizar todas las ayudas virtuales, excepto las que están dedicadas a los docentes. Éstas, requieren una contraseña adicional que deberá solicitar el docente al promotor o directamente a nuestro correo electrónico: Colombia:
[email protected] México:
[email protected] Argentina:
[email protected]
Este libro fue hecho gracias al esfuerzo de muchas personas que sacrificaron su tiempo, su autoría y su capital para que fuera posible esta obra que enriquecerá el conocimiento de muchos estudiosos del tema. Igualmente, Usted ha invertido en la compra de este ejemplar, porque es conciente de la inmensa riqueza intelectual que aporta un libro original, no lo facilite para la fotocopia.
www.alfaomega.com.mx
Dedico este trabajo a Dios, a mis padres José Antonio y Esther, a mis hermanos Diana Milena y Sergio Andrés, y finalmente a mi linda y adorada esposa Katherin, a los que adoro con todo mi corazón.
Juan Carlos
Agradecimientos “A la empresa MOTOROLA-FREESCALE por todo su acompañamiento, colaboración y orientación durante el proceso de elaboración, desarrollo y evaluación de tan importante proyecto. Especialmente a los Ingenieros Armando Molano y Martin Sinsel, quienes estuvieron permanentemente al tanto de todo el proceso del libro.” A la Universidad Manuela Beltrán y a las Unidades Tecnológicas de Santander (Bucaramanga), por su apoyo y colaboración constante en el desarrollo del presente libro. Al Dr. Miguel José Pinilla Gutiérrez, rector de la Universidad Manuela Beltrán, por su colaboración, apoyo incondicional y confianza en diferentes aspectos relacionados con la elaboración de este proyecto. Al Dr. Víctor Raúl Castro Neira, rector de las Unidades Tecnológicas de Santander, por su amistad, colaboración, apoyo incondicional y confianza en lo pertinente al desarrollo de este proyecto. A los ingenieros Gloria Galvis Valderrama y Jorge Eduardo Quintero Muñoz, directores de los programas de Ingeniería de Sistemas e Ingeniería Biomédica, respectivamente, por todo el apoyo brindado y la confianza depositada desde el inicio en la elaboración del presente trabajo. A Daniel Méndez, Luis Eduardo Rodríguez y Luis Javier Buitrago por su acompañamiento, amistad y orientación en todo el proceso de elaboración y edición de este libro. A todas las personas que de una u otra manera se relacionaron con el mismo, brindado el apoyo y la ayuda que cada uno pudo aportar.
El autor
El autor JUAN CARLOS VESGA FERREIRA nació en 1979 en Bucaramanga, departamento de Santander, en Colombia. Es ingeniero electrónico de la Universidad Industrial de Santander, ingeniero de sistemas de la Universidad Manuela Beltrán, especialista en docencia universitaria de la Universidad Cooperativa de Colombia, especialista en telecomunicaciones y candidato a magíster en telecomunicaciones de la Universidad Pontificia Bolivariana. Se desempeñó como coordinador de Tecnología en Diseño y Administración de Sistemas de las U.T.S., como par académico ante el Ministerio de Educación Nacional, como catedrático en diferentes instituciones del área metropolitana de Bucaramanga en las áreas de microcontroladores, electrónica de potencia, programación avanzada y telecomunicaciones, y se encuentra registrado como instructor Cisco CCNA-CCAI de las academias locales (Unidades Tecnológicas de Santander – Universitaria de Investigación y Desarrollo U.D.I.); es miembro de la Red de Semilleros de Investigación (REDSI UMB). Ha sido director, evaluador y conferencista de diversos proyectos de grado y seminarios de profundización en las áreas de control electrónico, electrónica de potencia, control de máquinas, robótica, comunicaciones, redes LAN y WAN, arquitecturas de computación, desarrollo de aplicaciones, software bajo herramientas de última tecnología.
CONTENIDO Mensaje del editor ..............................................................................................................iii Web de Apoyo ...................................................................................................................iv Agradecimientos .................................................................................................................vi El autor ..............................................................................................................................vii Contenido ..........................................................................................................................ix Prólogo de Freescale ..........................................................................................................xv Introducción .................................................................................................................... xvii
Capítulo 1 INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA-FREESCALE Objetivo del capítulo .......................................................................................................................................1 Conocimientos previos ....................................................................................................................................1 1.1 Introducción ...........................................................................................................................................1 1.2 Reseña histórica ......................................................................................................................................2 1.3 ¿Qué es un microcontrolador? ................................................................................................................3 1.6 Diferencias entre microprocesador y microcontrolador ...........................................................................4 1.7 Ventajas de un microcontrolador frente a un microprocesador ................................................................5 1.6 Relación entre microcontrolador y DSP...................................................................................................6 1.7 Clasificación de los microcontroladores...................................................................................................9 1.8 Arquitectura cerrada o abierta ...............................................................................................................12 1.9 Tipo de memoria de programa ..............................................................................................................12 1.10 Prestaciones y recursos especiales ..........................................................................................................14 1.11 Microcontroladores de uso común .........................................................................................................15 1.12 ¿Cómo elegir el microcontrolador adecuado?.........................................................................................17 1.13 Características de otros microcontroladores............................................................................................17 1.14 Principios básicos de operación interna..................................................................................................23 1.15 Sistemas de desarrollo............................................................................................................................25 RESUMEN DEL CAPÍTULO ...........................................................................................................................31
x
JUAN CARLOS VESGA FERREIRA
Capítulo 2 LOS MICROCONTROLADORES MC68H(R)C908JL3/JK3/JK1 Objetivo del capítulo .....................................................................................................................................33 Conocimientos previos ..................................................................................................................................33 2.1 Introducción ..........................................................................................................................................33 2.2 Características de la CPU 08 ..................................................................................................................34 2.3 Características de los microcontroladores ...............................................................................................34 2.4 Distribución de pines del microcontrolador MC68H(R)C908JL3/JK3/JK1 ................................................39 2.5
Descripción de pines del JL3/JK3/JK1 ...................................................................................................41
2.6
Mapa de memoria del JL3.....................................................................................................................42
RESUMEN DEL CAPÍTULO ...........................................................................................................................44
Capítulo 3 INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA- FREESCALE Objetivo del capítulo .....................................................................................................................................45 Conocimientos previos ..................................................................................................................................45 3.1 Introducción ..........................................................................................................................................45 3.2 Registros de uso general ........................................................................................................................45 3.3 Modos de direccionamiento ..................................................................................................................49 3.4 Memoria RAM .......................................................................................................................................63 3.5 Set de instrucciones ..............................................................................................................................64 EJERCICIOS PROPUESTOS ............................................................................................................................70 RESUMEN DEL CAPÍTULO ...........................................................................................................................71
Capítulo 4 PUERTOS DE ENTRADA/SALIDA Objetivo del capítulo .....................................................................................................................................73 Conocimientos previos ..................................................................................................................................73 4.1 Introducción ..........................................................................................................................................73 4.2 Registro PORT A (PTA) ...........................................................................................................................74 4.3 Registro de configuración del PORT A (DDRA).......................................................................................76 4.4 Registro PTAPUE ....................................................................................................................................77 4.5 Registro PORT B (PTB) ...........................................................................................................................78 4.6 Registro de configuración del PORT B (DDRB) .......................................................................................79 4.7 Registro PORT D (PTD) ..........................................................................................................................79 4.8 Registro de configuración del PORT D (DDRD)......................................................................................80 4.9 Registro de control del PORT D (PDCR) .................................................................................................80 4.10 EJERCICIOS RESUELTOS .......................................................................................................................81 EJERCICIOS PROPUESTOS ............................................................................................................................88 RESUMEN DEL CAPÍTULO ...........................................................................................................................88
ALFAOMEGA - FREESCALE
CONTENIDO
Capítulo 5 MANEJO DE TEMPORIZACIÓN BÁSICA Objetivo del capítulo .....................................................................................................................................89 Conocimientos previos ..................................................................................................................................89 5.1 Introduccón ...........................................................................................................................................89 5.2 Display de cristal líquido ........................................................................................................................91 EJERCICIOS PROPUESTOS ............................................................................................................................95 RESUMEN DEL CAPÍTULO ..........................................................................................................................116
Capítulo 6 INTERRUPCIONES (SISTEMA DE INTEGRACIÓN MODULAR) Objetivo del capítulo ...................................................................................................................................117 Conocimientos previos ................................................................................................................................117 6.1 Introducción ........................................................................................................................................117 6.2 Interrupciones .....................................................................................................................................118 6.3 Estado de interrupción del registro 1 ....................................................................................................120 6.4 Estado de interrupción del registro 2 ....................................................................................................120 6.5 Estado de interrupción del Registro 3 ...................................................................................................120 6.6 La instrucción SWI ...............................................................................................................................121 6.7 RESET ..................................................................................................................................................121 RESUMEN DEL CAPÍTULO ..........................................................................................................................122
Capítulo 7 MÓDULO DE INTERRUPCIÓN POR TECLADO (KBI) Objetivo del capítulo ...................................................................................................................................123 Conocimientos previos ................................................................................................................................123 7.1 Introducción ........................................................................................................................................123 7.2 Registro de control y estado de teclado (KBSCR) ..................................................................................124 7.3 Registro de habilitación de interrupciones de teclado (KBIER) ..............................................................124 7.4 Inicialización del teclado.....................................................................................................................125 7.5 EJERCICIOS RESUELTOS .....................................................................................................................126 EJERCICIOS PROPUESTOS ..........................................................................................................................133 RESUMEN DEL CAPÍTULO .........................................................................................................................133
Capítulo 8 INTERRUPCIÓN EXTERNA IRQ Objetivo del capítulo ...................................................................................................................................135 Conocimientos previos ................................................................................................................................135 8.1 Introducción ........................................................................................................................................135 8.2 Características .....................................................................................................................................136 8.3 Descripción del funcionamiento .........................................................................................................136 8.3 Registro de control de estado de IRQ (INTSCR) ...................................................................................137 ALFAOMEGA - FREESCALE
xi
xii
JUAN CARLOS VESGA FERREIRA
8.4 EJERCICIOS RESUELTOS ......................................................................................................................138 EJERCICIOS PROPUESTOS ..........................................................................................................................142 RESUMEN DEL CAPÍTULO .........................................................................................................................143
Capítulo 9 MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE Objetivo del capítulo ...................................................................................................................................145 Conocimientos previos ................................................................................................................................145 9.1 Introducción .......................................................................................................................................145 9.2 Fuentes de interrupción debidas al TIM ..............................................................................................147 9.3 Registro TSC .......................................................................................................................................147 9.4 Registro contador del TIM TCNTH/L ...................................................................................................148 9.5 Registro módulo de tiempo TMODH/L ...............................................................................................149 9.6 Registro de estado y control de canales del TIM .................................................................................149 9.7 Los registros de canales del TIM (TCH0H/L:TCH1H/L) ........................................................................152 9.8 Función PWM ....................................................................................................................................153 9.9 Implementación PWM en el microcontrolador....................................................................................154 9.10 EJERCICIOS RESUELTOS .....................................................................................................................156 EJERCICIOS PROPUESTOS ..........................................................................................................................176 RESUMEN DEL CAPÍTULO .........................................................................................................................176
Capítulo 10 CONVERSOR ANÁLOGO/DIGITAL Objetivo del capítulo ...................................................................................................................................179 Conocimientos previos ................................................................................................................................179 10.1 Introducción ......................................................................................................................................179 10.2 Descripción del funcionamiento del ADC ..........................................................................................180 10.3 Voltaje de conversión.........................................................................................................................181 10.4 Tiempo de conversión .......................................................................................................................181 10.5 Registro de control y estado del A/D (ADSCR) ...................................................................................181 10.6 Registro de conversión A/D (ADR) ......................................................................................................183 10.7 Registro de configuración del reloj para el conversor A/D (ADCLK) ....................................................183 10.8 EJERCICIOS RESUELTOS ....................................................................................................................185 EJERCICIOS PROPUESTOS ..........................................................................................................................195 RESUMEN DEL CAPÍTULO .........................................................................................................................195
Capítulo 11 EL OSCILADOR Objetivo del capítulo ...................................................................................................................................197 Conocimientos previos ................................................................................................................................197 11.1 Introducción ......................................................................................................................................197 ALFAOMEGA - FREESCALE
CONTENIDO
xiii
EJERCICIOS PROPUESTOS ..........................................................................................................................201 RESUMEN DEL CAPÍTULO .........................................................................................................................201
Capítulo 12 RECURSOS DE CONFIGURACIÓN AVANZADA Objetivo del capítulo ...................................................................................................................................203 Conocimientos previos ................................................................................................................................203 12.1 Introducción ......................................................................................................................................203 12.2 Memoria Flash ...................................................................................................................................204 12.3 Borrado de la memoria flash en bloque .............................................................................................205 12.4 Programación de la memoria flash .....................................................................................................206 12.5 Protección de la memoria flash ..........................................................................................................206 12.6 Módulo de ruptura ............................................................................................................................207 12.7 Configuración del registro CONFIG ...................................................................................................210 RESUMEN DEL CAPÍTULO ..........................................................................................................................212
Capítulo 13 PROGRAMACIÓN EN C Objetivo del capítulo ...................................................................................................................................215 Conocimientos previos ................................................................................................................................215 13.1 Introducción al lenguaje C .................................................................................................................215 13.2 Estructura de un programa en C .........................................................................................................217 13.3 Definición de estructuras iniciales en C ..............................................................................................218 13.4 Definición de variables ......................................................................................................................219 13.5 Programa principal ............................................................................................................................227 13.6 Operadores ......................................................................................................................................228 13.7 Sentencias de control .........................................................................................................................231 13.8 Arreglos o vectores.............................................................................................................................237 13.9 Funciones ..........................................................................................................................................238 13.10 Interrupciones ..................................................................................................................................243 RESUMEN DEL CAPÍTULO ..........................................................................................................................247
Capítulo 14 INTRODUCCIÓN A LOS MICROCONTROLADORES SO8Q Objetivo del capítulo ...................................................................................................................................249 Conocimientos previos ................................................................................................................................249 14.1 Introducción ........................................................................................................................................249 14.2 Características de los microcontroladores MC9S08QG8/QG4 ..............................................................250 14.3 Módulo Timer Interface (MTIM) ...........................................................................................................261 14.4 Real Time Interrupt (RTI) ......................................................................................................................270 14.5 Módulo de comparación analógico ......................................................................................................284 ALFAOMEGA - FREESCALE
xiv
JUAN CARLOS VESGA FERREIRA
14.6 Módulo de conversión análogo/digital ..................................................................................................288 Descripción del funcionamiento del adc ..............................................................................................289 Modulos de comunicaciones con el S08 ..............................................................................................297 14.7 Módulo interface de comunicaciones seriales (SCI)..............................................................................................299 14.8 Transmisiones seriales sincronas - módulo spi .......................................................................................311 14.9 Módulo I2C (Inter – Integrated Circuit) ................................................................................................323 CONCLUSIONES FINALES ..........................................................................................................................347 RESUMEN DEL CAPÍTULO ..........................................................................................................................212
BIBLIOGRAFÍA ...........................................................................................................................................349
ALFAOMEGA - FREESCALE
Pró rólogo logo del Fre Freesca escale le Freescale Semiconductor es una compañía global líder en la industria de semiconductores enfocada proveer procesamiento embebido y productos de conectividad. Actualmente, nos enfocamos al suministro de productos para la industria automotriz, de redes, comunicaciones inalámbricas, control industrial e industrias de consumo electrónico. Con nuestra oferta de procesadores embebidos y de productos complementarios, proporcionamos a nuestros clientes una solución completa de semiconductores y software. Esta compañía privada está basada en Agustín, Texas, y tiene diseño, investigación y desarrollo, manufactura u operación de ventas en más de 30 países. Freescale es una de las compañías más grandes de semiconductores con ventas en el 2006 de $6.4 Billones de dólares. Nuestra base global de clientes está integrada por más de 10,000 clientes finales. Entre ellos se incluyen más de 100 fabricantes lideres de equipo original a los que damos servicio a través de nuestra fuerza de ventas directas y a otros miles de clientes finales a quienes atendemos a través de una red de distribuidores. Cerca de 24,000 empleados en más de 30 países dan servicio y soporte a estos clientes. Freescale puede ser una las mas grandes compañías que la gente toca cada día, pero a la que nunca se escucha. Ha enviado más de 17 billones de semiconductores que pueden ser encontradas en marcas de todos los días como: Celulares Motorota, Sony electronics, Electrodomésticos Whirlpool, Teclados y mousse Logitech, Sistemas de entrenamiento Lifefitness, Routers Cisco, Radios Bose, Sistemas de calefacción y enfriamiento Trane, Vehículos Mercedes, BMW, Ford, Hyundai y General Motors, etc. La visión de Freescale es ser el líder de procesamiento integrado para el mundo conectado. Nos esforzamos por alcanzar este objetivo enfocándonos a los mercados con alto índice de crecimiento donde podamos aplicar nuestras fortalezas: Experiencia y liderazgo en procesadores embebidos, Experiencia en el desarrollo de aplicaciones comerciales para nuestras industrias objetivo, Liderazgo en tecnología y propiedad intelectual, Enfoque diferenciado de manufactura que aporta experiencia en tecnología de procesos y capacidad de manufactura flexible, Relaciones a largo plazo con clientes y con proveedores, Por consiguiente, nuestra misión para América Latina, es participar activamente en el desarrollo de la Industria Electrónica, creando así este canal de comunicación, a través del cuál buscaremos acercarnos a ustedes para entender mejor sus necesidades, ofreciendo productos innovadores, inteligentes, más simples y de bajo costo, que permitan construir y diseñar sus productos. Después de mas de 50 años como parte de Motorola, Freescale comenzó una nueva vida como compañía independiente en Julio del 2004. Freescale es propietaria de siete fábricas de obleas, dos de ensamble y sitios de pruebas y una linea piloto de pruebas de 300 milímetros y centro de investigación y desarrollo en Crolles, Francia junto con STMicroelectronics y NXP. Freescale invierte $1 billón anualmente en Investigación y Desarrollo y tiene 5,500 familias de patentes. Es para nosotros muy grato presentar este libro que ha sido estudiado y apoyado por nuestros ingenieros, y quienes han aportado significativos temas en el desarrollo del mismo, para lograr mayor credibilidad en el contenido. Sin duda, será un texto que les ayudará a entender con mayor facilidad el impresionante mundo del microcontrolador Freescale.
iNTRODUCCIÓN Uno de los temas más relevantes de los últimos tiempos en el campo de la electrónica ha sido el estudio y la inclusión de los microcontroladores no solamente en dicho campo sino también en la vida moderna en general. El microcontrolador se considera actualmente el componente electrónico más versátil que existe, sus aplicaciones son ilimitadas y cada día es mas frecuente encontrar equipos que los utilizan en diferentes funciones orientadas al control, las telecomunicaciones y la instrumentación. Inicialmente toda la electrónica utilizada para el control de procesos se realizaba a través de lógica cableada, es decir, empleando circuitos integrados que no efectuaban sino algunas funciones específicas como, por ejemplo, operaciones lógicas (caso de las compuertas lógicas), biestables, multiplexores, codificadores, etc. Al inicio se creía que el manejo de un microprocesador era sólo para personas que tuvieran un alto coeficiente intelectual; por el contrario, con la aparición de este circuito integrado todo sería mucho más fácil de entender y los diseños electrónicos se harían luego mucho más pequeños y simplificados. Aunque existen en el mercado una gran diversidad de familias de microcontroladores, los microcontroladores Freescale lideran con su presencia y utilización en diferentes ámbitos industriales, principalmente en el campo automotriz, gracias a su estabilidad, facilidad de programación, bajo costo frente a sus competidores, todo lo cual los ha hecho tan llamativos para los profesionales como para estudiantes, usuarios, etc. Un microcontrolador es un circuito integrado o chip que incluye en su interior las tres unidades funcionales de un computador: CPU, memoria y unidades de E/S, es decir, se trata de un computador completo en un solo circuito integrado. Aunque sus recursos son limitados en comparación con un PC corriente, adicionalmente a su dicha integración, su característica principal es su alto nivel de especialización. Un microcontrolador es un microprocesador optimizado, se usa para controlar equipos electrónicos, diseño de sistemas de comunicación, monitoreo y adquisición de señales físicas, procesamiento y administración de señales analógicas y digitales. Un microcontrolador difiere de una CPU corriente debido a que es más fácil convertirla en un computador o computadora en funcionamiento con un mínimo de chips externos de apoyo. Un microprocesador tradicional no le permitirá hacer esto, ya que espera que todas estas tareas sean manejadas por otros chips. Los microcontroladores están conquistando el mundo, están presentes en nuestro trabajo, en nuestra casa y en nuestra vida en general. Se pueden encontrar controlando el funcionamiento de los mouses y teclados de los computadores, y también en los teléfonos, en los hornos microondas y los televisores de nuestro hogar. Pero la invasión acaba de comenzar y el nacimiento del siglo XXI será testigo de la conquista masiva de estos diminutos computadores, que controlarán la mayor parte de los equipos que se han de fabricar y que estarán presentes en todos los ambientes de nuestra vida, por ejemplo en nuestra vivienda, en el trabajo, en los automóviles, etc.
xviii
JUAN CARLOS VESGA FERREIRA
Frecuentemente estos dispositivos integrados pueden ser controlados por instrucciones de procesadores especializados. Los modernos microcontroladores frecuentemente incluyen un lenguaje de programación integrado, como el Basic o el C, que se utilizan bastante con este propósito. Cuando se decide realizar un proyecto y en él es necesario utilizar un microcontrolador, el primer problema que se enfrenta es la selección de una familia de microcontroladores y, dentro de esta, un modelo en concreto que se ajuste lo mejor posible a las necesidades del diseño.Freescale dentro de su gama de productos ofrece un sinfín de posibilidades de microcontroladores, cada uno con características propias y específicas para diferentes tipos de diseños en los que se requieran. Los microcontroladores Freescale tienen la reputación de ser muy confiables, fáciles de programar y, ante todo, de ser unos de los más uti¬lizados a nivel mundial. Tanto los estudiantes como los profesionales y usuarios en general, al conocer las bondades en cuanto a menor costo, mayor diversidad de instrucciones para la ejecución de operaciones matemáticas como multiplicaciones y divisiones, manejo de interrupciones vectorizadas mas no jerarquizadas y otra gran cantidad de recursos, sin dudarlo comienzan su relación con la familia de microcontroladores Freescale. Uno de los aspectos sobresalientes de Freescale es que cada día sigue creciendo más y más; hace muy poco tiempo se realizó el lanzamiento de una nueva familia de microcontroladores, denominada familia de “ultra bajo costo” RS08, basada en el “core” de instrucciones reducidas RS08, prometiendo convertirse en una de las familias más importantes de microcontroladores de 8 y 16 pines, en donde sus principales ventajas sobre sus homólogos son su muy reducido costo y facilidad de integración en aplicaciones de volúmenes elevados y altas prestaciones, radicando su principal diferencia en la densidad de código de las distintas instrucciones y modos de direccionamiento, aunque conserva aún muchas características potentes y versátiles de los periféricos que se utilizan en la familia HC9S08. Las bondades ofrecidas por los microcontroladores Freescale, complementado esto con el hecho de no existir un libro que guíe paso a paso en el conocimiento, adiestramiento y profundización de los mismos, han constituido las dos razones fundamentales para la creación del presente texto. Este libro no solamente da al lector una introducción al mundo de los microcontroladores, sino que lo lleva de la mano desde las aplicaciones más sencillas, como es el caso del encendido y apagado de un led, hasta aplicaciones complejas como comunicaciones con el PC y control de procesos industriales e instrumentación centrados en el uso de los microcontroladores Freescale. El libro presenta una forma muy didáctica para la enseñanza de estos dispositivos, utilizando técnicas muy útiles para el aprendizaje y asimilación de la información en forma clara, concisa y muy rica conceptualmente, lo cual llevará al lector a desarrollar aplicaciones desde las más sencillas hasta tan complejas como lo desee, iniciando con la programación de los microcontroladores de la familia HC08 y finalizando con la introducción a la segunda familia de microcontroladores más importante denominada S08, la cual en la actualidad se considera como una de las más completas y utilizadas a escala mundial soportando su programación en lenguajes como Assembler y el lenguaje C.
ALFAOMEGA - FREESCALE
Capítulo
1
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE OBJETIVO DEL CAPÍTULO Al finalizar el capítulo el estudiante tendrá un conocimiento sobre ¿qué es un microcontrolador?, ¿para qué se utiliza?, ¿qué beneficios aporta a la hora de realizar un diseño electrónico?, ¿qué tipos de microcontroladores existen en el mercado?, ¿quiénes los fabrican?, ¿cómo escoger el microcontrolador adecuado para la aplicación a desarrollar?, ¿qué diferencias existen entre un microcontrolador, un microprocesador y un DSP?, así como muchas cosas más que darán al estudiante una visón global del mundo de los microcontroladores y en especial, de los microcontroladores Freescale.
CONOCIMIENTOS PREVIOS Para iniciar el estudio de los microcontroladores Motorola-Freescale es necesario que el lector tenga conocimientos básicos sobre electrónica básica y circuitos digitales, con el fin de que pueda aprovechar y comprender al máximo los conceptos y las temáticas expuestas tanto en el presente capítulo como en los posteriores.
1.1
INTRODUCCIÓN
El microcontrolador es quizás el componente electrónico más versátil que existe, sus aplicaciones están limitadas únicamente por la imaginación. Cada día es más frecuente encontrar equipos que los utilicen como elementos de control, de comunicaciones, de señalización, etc. Existen en el mercado una gran cantidad de microcontroladores, como PICs, Basic Stamp, Xenix, Freescale, siendo estos últimos los dispositivos de nuestro interés, debido a la gran cantidad de aplicaciones en las que se encuentran, a su fácil programación, a que son muy comerciales y se consiguen a muy bajo costo frente a sus competidores, lo cual los ha hecho tan llamativos para los profesionales como para estudiantes, etc. Este libro presenta una forma muy didáctica para la enseñanza de estos dispositivos, utilizando técnicas muy útiles para el aprendizaje y asimilación de la información en forma clara, concisa y muy rica conceptualmente, lo cual llevará al lector a desarrollar aplicaciones desde las más sencillas hasta tan complejas como lo desee.
2
JUAN CARLOS VESGA FERREIRA
Sin invertir grandes cantidades de tiempo y dinero en borradores, programadores o software, las tecnologías actuales de microcontroladores de 8 y 16 bits de Freescale permiten a los usuarios tener rápidamente un laboratorio donde puedan desarrollar sus aplicaciones en menos tiempo y con mayor confiabilidad. En el pasado, las tecnologías existentes en el mercado obligaban a pequeños o medianos industriales a invertir mucho dinero en equipos adicionales al microcontrolador como son los borradores ultravioleta, programadores y, en algunos casos, en un buen software que les permitiera editar, ensamblar, simular, realizar conexiones y programaciones. Los nuevos microcontroladores y las herramientas de desarrollo disponibles para los usuarios de 8 bits de Freescale permiten todas estas facilidades mediante un programa interno de fábrica que permite iniciar proyectos en forma muy sencilla, rápida y sin ningún costo adicional.
1.2
RESEÑA HISTÓRICA
Recibe el nombre de controlador el dispositivo que se emplea para el control de uno o varios procesos. Aunque el concepto de controlador ha permanecido invariable a través del tiempo, su implementación física ha variado frecuentemente. Hace varios años los controladores se construían exclusivamente con componentes de lógica discreta; posteriormente se emplearon los microprocesadores, que se rodeaban con chips de memoria y dispositivos de E/S sobre una tarjeta de circuito impreso. En la década de 1970 los fabricantes de circuitos integrados iniciaron la construcción y el diseño de un nuevo circuito para control, medición e instrumentación al que llamaron microcomputador en un sólo chip o, de manera más exacta, microcontrolador. Inicialmente toda la electrónica utilizada para el control de procesos se realizaba a través de lógica cableada, es decir, utilizando circuitos integrados que no efectuaban sino algunas funciones específicas como, por ejemplo, operaciones lógicas (caso de las compuertas lógicas), biestables, multiplexores, codificadores, etc. Esto hacía que los diseños fueran relativamente grandes, conformados por una gran cantidad de componentes, lo que en muchos casos se reflejaba en constantes fallas y problemas en el momento de operarlos; pero en 1971 apareció el primer microprocesador, el cual originó un cambio decisivo en las técnicas de diseño de la mayoría de los equipos. Al comienzo se creía que el manejo de un microprocesador era para aquellas personas que tuvieran un coeficiente intelectual muy alto; por el contrario, con la aparición de este circuito integrado todo sería mucho más fácil de entender y los diseños electrónicos serían mucho más pequeños y simplificados. Entre los microprocesadores más conocidos tenemos el popular Z-80 y el 8085. Los diseñadores de equipos electrónicos ahora tenían equipos que podían realizar mayor cantidad de tareas en menor tiempo y su tamaño se redujo considerablemente; sin embargo, después de cierto tiempo aparece una nueva tecnología llamada microcontrolador, que simplifica aún más el diseño electrónico. Los microcontroladores están conquistando el mundo. Están presentes en nuestro trabajo, en nuestra casa y en nuestra vida, en general. Se pueden encontrar controlando el funcionamiento de los mouses y teclados de los computadores, en los teléfonos, en los hornos microondas y los televisores de nuestro hogar. Pero la invasión acaba de comenzar y el nacimiento del siglo XXI será testigo de la conquista masiva de estos diminutos computadores, que controlarán la mayor parte de los equipos que se fabriquen y que estarán presentes en todos los ambientes de nuestra vida; por ejemplo, en nuestra vivienda, en el trabajo, en los automóviles, etc. ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
3
Cada vez existen más productos que incorporan un microcontrolador con el fin de aumentar sustancialmente sus prestaciones, reducir su tamaño y costo, mejorar su fiabilidad y disminuir el consumo. Algunos fabricantes de microcontroladores superan el millón de unidades de un determinado modelo producidas en una semana. Este dato puede dar una idea de la masiva utilización de estos componentes. Los microcontroladores están siendo empleados en multitud de sistemas presentes en nuestra vida diaria, como juguetes, horno microondas, televisores, computadores, impresoras, módems, etc. Y también otras aplicaciones más especializadas como la instrumentación electrónica, sistemas de control y comunicaciones, etc.
1.3
¿QUÉ ES UN MICROCONTROLADOR?
Una definición breve y general sería que un microcontrolador es un dispositivo electrónico capaz de llevar a cabo procesos lógicos. Estos procesos o acciones son programados en lenguaje ensamblador por el usuario, y son introducidos en éste a través de un programador o quemador de microcontroladores. Una definición más completa sería que un microcontrolador es un circuito integrado o chip que incluye en su interior las tres unidades funcionales de un computador: CPU, memoria y unidades de E/S, es decir, se trata de un computador completo en un solo circuito integrado. Aunque sus recursos son limitados en comparación con un PC normal, adicional a su dicha integración, su principal característica es su alto nivel de especialización. El microcontrolador es un dispositivo dedicado. En su memoria sólo reside un programa destinado a controlar una aplicación determinada; sus líneas de entrada/salida soportan la conexión de sensores y dispositivos de control que permitan efectuar el proceso deseado. Una vez programado y configurado el microcontrolador, solamente sirve para controlar la tarea asignada. Un microcontrolador es un microprocesador optimizado, utilizado para controlar equipos electrónicos, diseño de sistemas de comunicación, monitoreo y adquisición de señales físicas, procesamiento y administración de señales analógicas y digitales. Un microcontrolador difiere de una CPU normal debido a que es más fácil convertirla en un computador en funcionamiento, con un mínimo de chips externos de apoyo. Un microprocesador tradicional no le permitirá hacer esto, ya que espera que todas estas tareas sean manejadas por otros chips. Por ejemplo, un microcontrolador típico tendrá un generador de reloj integrado y una pequeña cantidad de memoria RAM y ROM/EPROM/EEPROM, lo que significa que para hacerlo funcionar se necesita solamente unos pocos programas de control y un cristal de sincronización. Los microcontroladores disponen generalmente también de una gran variedad de dispositivos de entrada/salida, como conversores de analógico a digital, temporizadores, UARTs y buses de interfaz serie especializados, como I2C y CAN. Frecuentemente estos dispositivos integrados pueden ser controlados por instrucciones de procesadores especializados. Los modernos microcontroladores incluyen frecuentemente un lenguaje de programación integrado, como el Basic o el C, que se utilizan bastante con este propósito. El microcontrolador es uno de los logros más sobresalientes de nuestra época. Hace unos años tal afirmación habría parecido absurda. Pero cada año el microcontrolador se acerca más al centro de nuestras vidas, haciendo parte fundamental y participando como cerebro central de muchos equipos de control electrónico. Su presencia ha comenzado a cambiar la forma en que percibimos el mundo e incluso a nosotros mismos.
ALFAOMEGA - FREESCALE
4
JUAN CARLOS VESGA FERREIRA
Cada vez se hace más difícil pasar por alto el microcontrolador como otro simple producto en una larga línea de innovaciones tecnológicas. Ninguna otra invención en la historia se ha distribuido y crecido en forma casi exponencial en todo el mundo. Hoy existen casi 15,000 millones de microchips de alguna clase en uso. De cara a esa realidad, ¿quién puede dudar que el microcontrolador no sólo está transformando los productos que usamos sino también nuestra forma de vivir y, por último, la forma en que percibimos la realidad? El mayor atributo del microcontrolador es que puede integrar inteligencia casi a cualquier equipo. Se puede programar para adaptarse a su entorno, responder a condiciones cambiantes, volverse más eficiente y para que responda a las necesidades únicas de sus usuarios.
1.6
DIFERENCIAS ENTRE MICROPROCESADOR Y MICROCONTROLADOR Bus direcciones Bus Datos Datos Bus Control
P Memoria
Controlador 1
Controlador 2
Periféricos
Periféricos
FIGURA 1.1 Estructura de un sistema abierto basado en un microprocesador.
ALFAOMEGA - FREESCALE
5
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
Cuando se realiza un diseño basado en un microprocesador, se puede observar que dependiendo del circuito se requieren algunos circuitos integrados además del microprocesador, como, por ejemplo: memorias RAM para almacenar los datos temporalmente y memorias ROM para almacenar el programa que se encargaría del proceso del equipo, un circuito integrado para los puertos de entrada y salida y, finalmente, un decodificador de direcciones.
Periféricos
P
Periféricos
FIGURA 1.2 El microcontrolador es un sistema cerrado. Todas las partes del procesador están contenidas en su interior y sólo salen al exterior las líneas que gobiernan los periféricos.
Un microcontrolador es un circuito integrado que contiene todos los elementos electrónicos que se utilizaban para hacer funcionar un sistema basado en un microprocesador; es decir, contiene en un solo circuito integrado la unidad de proceso, la memoria RAM, memoria ROM, puertos de entrada, salidas y otros periféricos, lo cual se refleja en una considerable reducción de espacio.
1.7
VENTAJAS DE UN MICROCONTROLADOR FRENTE A UN MICROPROCESADOR
Estas ventajas son reconocidas inmediatamente por aquellas personas que han trabajado con los microprocesadores y después pasaron a trabajar con microcontroladores. Estas son las diferencias más importantes: ALFAOMEGA - FREESCALE
6
JUAN CARLOS VESGA FERREIRA
Por ejemplo, la configuración mínima básica de un microprocesador estaba constituida por un micro de 40 pines, una memoria RAM de 28 pines, una memoria ROM de 28 pines y un decodificador de direcciones de 18 pines; pero un microcontrolador incluye todos estos elementos en un solo circuito integrado por lo que implica una gran ventaja en varios factores: en el circuito impreso por su amplia simplificación de circuitería, el costo para un sistema basado en microcontrolador es mucho menor y, lo mejor de todo, el tiempo de desarrollo de su proyecto electrónico se disminuye considerablemente.
En general, se prodría decir que la gran ventaja que presenta un microcntrolado, frente a un microprocesador es la inclusión de diversos módulos y periféricos que permiten que el microcontrolador realice funciones completas sin necesidad de elementos externos más allá del cristal y un oscilador.
1.6
RELACIÓN ENTRE MICROCONTROLADOR Y DSP
Existen dos herramientas clave en el diseño de cualquier circuito de control y comunicaciones, utilizadas en gran parte por la mayoría de los ingenieros; estas dos herramientas son los microcontroladores y los DSP (Digital Signal processor o procesador digital de señales). Los microcontroladores se usan primordialmente en aplicaciones de control que requieran manejo de interrupciones y la detección y control de eventos externos, en dispositivos como PLC, temporizadores, sistemas de medición, controladores, etc. Los DSP se encuentran normalmente en sistemas donde se requiere un procesamiento preciso de señales análogas, como procesamiento de video y sonido. Debido al normal avance en complejidad de cada una de estas tecnologías, hoy ya vemos microcontroladores con algunas capacidades de procesamiento de señales (como es el caso de los DSCs) y a los DSP, siendo capaces de ejecutar tareas de manejo de eventos en tiempo real, aunque siguen realizando sus tareas primordiales de procesamiento matemático. Según la aplicación se debe escoger el más adecuado, pero como característica fundamental en el momento de tomar como decisión unánime el uso de los DSP y dejar de lado los microcontroladores, es cuando se va a trabajar en tareas de tiempo real en las cuales la mayoría del los microcontroladores no cuentan con las herramientas suficientes para hacerlo. Es esta la gran limitante de los microcontroladores. Una tarea típica de un microcontrolador es analizar y monitorear las entradas y el estado actual del sistema, determinando qué dispositivos debe activar o desactivar. El programa que se encuentra almacenado en el microcontrolador está básicamente estructurado por saltos, condicionales y operaciones aritmético-lógicas. De otra parte, las aplicaciones con los DSP tienden a las aplicaciones matemáticas, aplicación de técnicas matemáticas para analizar señales en tiempo discreto como, por ejemplo, transformadas de Fourier, entre otros cálculos binarios a una velocidad simplemente extraordinaria, mas no enfocados hacia el control de procesos como lo realizan los microcontroladores. ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
7
Actualmente las aplicaciones orientadas al control se desarrollan tradicionalmente con sólo un microcontrolador, pero en algunas recientes aplicaciones se están incluyendo DSPs con el fin de acelerar el desarrollo de operaciones matemáticas. Entre los sistemas que cumplen con esta arquitectura se encuentran el control de movimiento, la robótica, los discos duros y algunos medidores electrónicos. Estos sistemas son fundamentalmente orientados al control, pero trabajando de la mano con un DSP haciendo las veces de coprocesador matemático del microcontrolador. Una opción que está tomando fuerza es incorporar funciones DSP en los microcontroladores. Esto es útil por muchas razones, ya que se pueden utilizar en los microcontroladores herramientas matemáticas más avanzadas y mayor optimización de los recursos del sistema, además de un ahorro de tipo económico. Aunque antiguamente pensar en incluir un DSP en un desarrollo era una inversión bastante alta, ahora esa idea ha cambiado considerablemente; el avance tecnológico y la necesidad de lograr cada día mayores tasas de transmisión y capacidad de procesamiento de información elevada, ha llevado a que no solamente microcontroladores posean características de DSP como es el caso de los DSCs, sino que además los costos de los DSP han bajado considerablemente permitiendo que estas poderosas herramientas se encuentren al alcance de su mano. En resumen, se puede concluir que un microcontrolador contiene toda la arquitectura de un sencillo pero completo computador en un solo chip. Las aplicaciones y desarrollos que se pueden alcanzar utilizando estos dispositivos son realmente interesantes. El microcontrolador consiste en un circuito integrado de alta escala de integración que incorpora la mayor parte de los elementos que configuran un controlador. Se dice que es “la solución en un chip” porque su reducido tamaño minimiza el número de componentes y el costo. Los componentes de los que dispone normalmente un microcontrolador son: Procesador o CPU (unidad central de procesamiento). Memoria RAM para contener los datos de propósito general. Memoria para el programa tipo ROM/PROM/EPROM. Líneas de E/S para comunicarse con el exterior. Diversos módulos para el control de periféricos (temporizadores, puertas serie y paralelo, CAD, etc.) Generador de impulsos de reloj que sincronizan el funcionamiento de todo el sistema. Según la referencia del microcontrolador con el que se desee trabajar, el tamaño y el tipo de memoria pueden cambiar, así como los módulos de control de periféricos y el número de líneas de E/S. La inmensa cantidad de modelos y marcas disponibles permite seleccionar el más adecuado según la aplicación que se quiera realizar. Una estructura interna fija supone una limitación, que se convierte en una ventaja en el caso de que en un simple circuito integrado residan todos los componentes que necesita el controlador. La única limitación que tienen las aplicaciones de los microcontroladores actuales está en la imaginación del diseñador. Los campos más destacados en los que se emplean microcontroladores son los siguientes: Automatización industrial. Adquisición y cuantificación de variables físicas. Control de procesos industriales. Enseñanza e investigación. Electrodomésticos. ALFAOMEGA - FREESCALE
8
JUAN CARLOS VESGA FERREIRA
Electromedicina. Robótica. Sistemas de navegación. Sistemas de seguridad. La industria donde se presenta la mayor cantidad de estos dispositivos programables es la informática, la cual acapara la gran mayoría de los microcontroladores que se fabrican. Casi todos los periféricos de un computador, desde el mouse hasta la impresora o el teclado, son regulados por microcontroladores. En el campo de la instrumentación y la electromedicina existe una gran variedad de aplicaciones basadas en microcontroladores, como: mediciones del ritmo cardíaco, presión arterial, encefalogramas, temperatura, humedad, etc. En la rama de las comunicaciones y sistemas de transmisión y recepción de información se utilizan constantemente estos microcomputadores, aplicados en diferentes medios de transmisión como: aire, par trenzado, red eléctrica, entre otros. A continuación se ilustra un gráfico de la distribución de la producción mundial de microcontroladores en las diversas áreas de aplicación. Aplicaciones automotrices 18%
Consumo 27%
Industria 10%
Computadores 15% Comunicaciones 30%
FIGURA 1.3 Distribución por sectores de aplicación. Los productos que para su control incorporan un microcontrolador disponen de las siguientes ventajas: Aumento de prestaciones. Aumento de la fiabilidad. Reducción del tamaño en el producto acabado. Menor consumo de energía. Mayor flexibilidad. Reducción del precio del producto acabado. ALFAOMEGA - FREESCALE
9
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
1.7
CLASIFICACIÓN DE LOS MICROCONTROLADORES
Los microcontroladores se pueden clasificar de diferentes maneras, según criterios de diseño como tamaño de los datos, tipos de arquitectura, cantidad de pines, etc. A continuación se hace un resumen de las principales características que definen las diferentes subclasificaciones que se presentan en los microcontroladores existentes en la actualidad.
Clasificación de los microcontroladores
Descripción
Según el tamaño de los datos
4 bits 8 bits 16 bits 32 bits 64 bits
Según la arquitectura interna
Von Neumann Harvard
Según la arquitectura del procesador
microcontroladores CISC microcontroladores RISC microcontroladores SISC
Clasificación de los microcontroladores según el tamaño de los datos Según el tamaño de los datos que procesa el microcontrolador, se pueden clasificar en: Microcontroladores de 4 bits. Microcontroladores de 8 bits. Microcontroladores de 16 bits. Microcontroladores de 32 bits. Microcontroladores de 64 bits. El más representativo de esta clasificación es el microcontrolador de 8 bits, porque resulta el más flexible y eficaz para la mayoría de los desarrollos electrónicos. Aunque en los últimos años los microcontroladores de 16 bits están aumentando significativamente su aparición en las diferentes aplicaciones industriales.
Tipos de arquitecturas de microcontroladores Según la arquitectura interna de la memoria del microcontrolador, se pueden clasificar en: Microcontroladores con arquitectura Von Neumann. Microcontroladores con arquitectura Harvard.
ALFAOMEGA - FREESCALE
10
JUAN CARLOS VESGA FERREIRA
Inicialmente todos los microcontroladores adoptaron la arquitectura clásica de Von Neumann. Actualmente muchos microcontroladores utilizan esta arquitectura, pero poco a poco se impone la arquitectura Harvard.
Arquitectura Von Neumann La arquitectura tradicional de computadores y microprocesadores está basada en la arquitectura Von Neumann, en la cual la unidad central de procesamiento (CPU) está conectada a una memoria única donde se guardan las instrucciones del programa y los datos. El tamaño de la unidad de datos o instrucciones está fijado por el ancho del bus que comunica la memoria con la CPU. Así, un microprocesador de 8 bits con un bus de 8 bits tendrá que manejar datos e instrucciones de una o más unidades de 8 bits de longitud. Si tiene que acceder a una instrucción o dato de más de un byte de longitud, tendrá que realizar más de un acceso a la memoria. Y el tener un único bus permite que la estructura interna sea más sencilla de implementar, y con ello un requerimiento de menor cantidad de silicio, lo que permite que estos dispositivos sean fáciles de construir, eficientes y a costos de fabricación y comercialización relativamente bajos, contrario a lo que ocurre con los dispositivos que poseen arquitectura Harvard. Por estas poderosas razones de estabilidad, simplicidad y bajo costo, la mayoría de fabricantes prefieran utilizar esta arquitectura en la gran mayoría de dispositivos que fabrican.
CPU
MEMORIA
FIGURA 1.4 Arquitectura Von Neumann.
La arquitectura Harvard Tiene la unidad central de procesamiento (CPU) conectada a dos memorias (una con las instrucciones y otra con los datos) por medio de dos buses diferentes. Una de las memorias contiene solamente las instrucciones del programa (memoria de programa), y la otra sólo almacena datos (memoria de datos). Ambos buses son totalmente independientes y pueden ser de distintos anchos. Para un procesador de set de instrucciones reducido, o RISC (Reduced Instruction Set Computer), el set de instrucciones y el bus de memoria de programa pueden diseñarse de tal manera que todas las instrucciones tengan una sola posición de memoria de programa de longitud. Además, al ser independientes los buses, la CPU puede acceder a los datos para completar la ejecución de una instrucción y al mismo tiempo leer la siguiente instrucción a ejecutar. Ventajas de esta arquitectura: ALFAOMEGA - FREESCALE
11
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
1. El tamaño de las instrucciones no está relacionado con el de los datos, y por tanto puede ser optimizado para que cualquier instrucción ocupe una sola posición de memoria de programa, logrando así mayor velocidad y menor longitud de programa. 2. El tiempo de acceso a las instrucciones puede superponerse con el de los datos, logrando una mayor velocidad en cada operación. Entre las principales desventajas de los procesadores que tienen arquitectura Harvard están: Se debe poseer instrucciones especiales para acceder a tablas de valores constantes que pueda ser necesario incluir en los programas, ya que estas tablas se encontrarán físicamente en la memoria de programa (por ejemplo, en la EPROM de un microprocesador). Debido a que la arquitectura Harvard es más compleja que la arquitectura Von Neumann, requiere mayor cantidad de silicio para su construcción y con ello, un mayor costo de producción. La relación aproximada de costo entre un dispositivo con arquitectura Harvard es aproximadamente 50% más costoso con relación a un dispositivo de arquitectura Von Neumann.
MEM DATOS
CPU
MEM PROGRAMA
FIGURA 1.5 Arquitectura Harvard. Para el caso de los microcontroladores Freescale, la arquitectura implementada es la Von Neumann.
Arquitectura del procesador o CPU Según la filosofía de la arquitectura del procesador, se puede clasificar en: Microcontroladores CISC. Microcontroladores RISC. Microcontroladores SISC. Un microcontrolador basado en la filosofía CISC (computadores de juego de instrucciones complejo) dispone de más de 80 instrucciones máquina en su repertorio, algunas de las cuales son muy sofisticadas y potentes, requiriendo muchos ciclos para su ejecución. Una ventaja de los procesadores CISC es que ofrecen al programador instrucciones complejas que actúan como macros. Pero la desventaja es que debido al gran número de instrucciones no se considera en muchos casos llamativa para el ingeniero diseñador. La siguiente arquitectura, conocida como arquitectura RISC (computadores de juego de instrucciones reducido) se considera como la más llamativa para el diseño de aplicaciones debido a su juego de instrucciones ALFAOMEGA - FREESCALE
12
JUAN CARLOS VESGA FERREIRA
un poco más moderado en cuanto a cantidad que los CISC. Tanto la industria de los computadores comerciales como la de los microcontroladores están enfocándose hacia esta filosofía. En estos procesadores el repertorio de instrucciones es muy reducido y las instrucciones son simples y, generalmente, se ejecuta en un solo ciclo. La sencillez y rapidez de las instrucciones permiten optimizar el hardware y el software del procesador. En los microcontroladores destinados a aplicaciones muy concretas, el juego de instrucciones, además de ser reducido, es específico, o sea, las instrucciones se adaptan a las necesidades de la aplicación prevista. Esta filosofía se ha bautizado con el nombre de SISC (computadores de juego de instrucciones específico).
1.8
ARQUITECTURA CERRADA O ABIERTA
Entre los fabricantes de microcontroladores hay dos tendencias para resolver las demandas de los usuarios. Los microcontroladores de arquitectura abierta se caracterizan porque, además de poseer una estructura interna determinada, emplean sus líneas de E/S para sacar al exterior los buses de datos, direcciones y control, con lo que se posibilita la ampliación de la memoria y las E/S con circuitos integrados externos. Esta solución se asemeja a la que emplean los clásicos microprocesadores. Los microcontroladores de arquitectura cerrada poseen una determinada CPU, cierta cantidad de memoria de datos, cierto tipo y capacidad de memoria de instrucciones, un número de E/S y un conjunto de recursos auxiliares muy concreto. El modelo no admite variaciones ni ampliaciones. La aplicación a la que se destina debe encontrar en su estructura todo lo que precisa, y en caso contrario, hay que desecharlo. La línea que separa unos de otros es muy delgada, pero el concepto de microcontrolador se acerca posiblemente más a la arquitectura cerrada.
1.9
TIPO DE MEMORIA DE PROGRAMA
En los microcontroladores la memoria de instrucciones y datos está integrada en el propio chip. Una parte debe ser no volátil, de tipo ROM, que se destina a contener el programa de instrucciones que gobierna la aplicación. Otra parte de memoria debe ser volátil, de tipo RAM, y se destina a guardar las variables y los datos. Existen principalmente cinco versiones de memoria no volátil que se pueden encontrar en los microcontroladores del mercado: Memoria ROM con máscara. Memoria OTP. Memoria EPROM. Memoria EEPROM. Memoria FLASH. La memoria ROM con máscara es no volátil y de sólo lectura, cuyo contenido se graba durante la fabricación del chip. El elevado costo del diseño de la máscara sólo hace aconsejable el empleo de los microcontroladores con este tipo de memoria cuando se precisan cantidades superiores a varios miles de unidades. ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
13
La memoria OTP (One Time Programmable) es no volátil, de sólo lectura y programable una sola vez por el usuario. La grabación se realiza mediante un sencillo grabador o quemador controlado por un programa desde un PC. La versión OTP es recomendable cuando es muy corto el ciclo de diseño del producto, o bien, en la construcción de prototipos o serie muy pequeñas. Los microcontroladores que disponen de memoria EPROM (Erasable Programmable Read Only Memory) pueden borrarse y grabarse muchas veces. La grabación se realiza como en el caso de la memoria OTP. Si posteriormente se desea borrar el contenido, disponen de una ventana de cristal en su superficie por la que se somete a la EPROM a rayos ultravioleta durante varios minutos.
FIGURA 1.6 Aspecto físico de una memoria EPROM. La memoria EEPROM (Electrical EPROM) es de sólo lectura, programable y borrable eléctricamente. Tanto la programación como el borrado se realizan eléctricamente desde el propio grabador y bajo el control programado de un PC, y puede hacerse con el microcontrolador instalado en el circuito. Es muy cómoda y rápida la operación de grabado, así como la de borrado.
FIGURA 1.7 Aspecto físico de una memoria EEPROM. La memoria flash es no volátil, de bajo consumo y puede grabarse y borrarse eléctricamente. Funciona como una ROM y una RAM pero consume menos energía y es más pequeña. La memoria FLASH también puede programarse “en circuito” y además, es más rápida, tiene mayor densidad y tolera más ciclos de escritura/borrado que la EEPROM. ALFAOMEGA - FREESCALE
14
JUAN CARLOS VESGA FERREIRA
1.10 PRESTACIONES Y RECURSOS ESPECIALES Además de las clasificaciones anteriores se podrían hacer otras dos, atendiendo a las necesidades y a los recursos especiales que pueden tener los microcontroladores. Respecto a las bondades ofrecidas cabe destacar: Precio. Velocidad de ejecución de código. Eficiencia en la compresión de código. Inmunidad al ruido. Indudablemente, el precio es uno de los factores decisivos a la hora de emplear uno u otro microcontrolador. La velocidad de ejecución del código depende principalmente de la frecuencia de funcionamiento del microcontrolador, la cual es establecida a través del oscilador externo, pero también influyen otras características como la arquitectura o el tipo de memoria empleada. En lo que se refiere al número de palabras o bytes en la memoria que emplea cada microcontrolador en contener un programa, ésta depende sobre todo de la arquitectura básica y de la longitud de la palabra de datos. La inmunidad al ruido, así como otras características especiales como rangos amplios de temperaturas de funcionamiento, destacan sobre todo en microcontroladores destinados al uso militar. Los recursos especiales más comunes que pueden poseer los microcontroladores son los siguientes: Temporizador y/o contador. Perro guardián o “COP”. Protección ante el fallo de la alimentación. Estado de reposo o de bajo consumo. Conversor analógico-digital (CAD). Conversor digital-analógico (CDA). Comparador analógico. Modulador de anchura de impulsos o PWM. Puertas de entrada y salidas digitales. Puertas de comunicación (USART, USB, SCI, etc.) Los temporizadores se emplean para controlar períodos de tiempo, actuando como temporizador o para llevar la cuenta de acontecimientos que suceden en el exterior, actuando como contador. El perro guardián consiste en un temporizador que cuando se desborda provoca automáticamente un reset en el microcontrolador, para así evitar que el sistema se quede “bloqueado”. Los detalles para el uso adecuado de este poderoso recurso se expondrán posteriormente en el transcurso del libro. La protección ante el fallo de la alimentación consiste en un circuito que provoca un reset al microcontrolador cuando el voltaje de alimentación sea inferior a un voltaje mínimo. Mientras el voltaje de alimentación sea ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
15
inferior al mínimo, el dispositivo se mantiene reseteado, comenzando a funcionar normalmente cuando sobrepasa dicho valor. Son abundantes las situaciones reales en las que el microcontrolador debe esperar, sin hacer nada, a que se produzca algún acontecimiento externo que lo obligue a entrar de nuevo en funcionamiento. Para ahorrar energía, factor clave en los equipos portátiles, los microcontroladores disponen de una instrucción especial que les permite el paso al estado de reposo o de bajo consumo de energía, en el cual el consumo de potencia es mínimo. Los microcontroladores que poseen conversores análogos digitales pueden ser utilizados para aplicaciones que requieran esta bondad, como, por ejemplo, en aplicaciones de instrumentación industrial, biomédica, comunicaciones, entre otras. Adicional a esto, no solamente permiten el muestreo de una señal sino de varias señales a la vez, ya que internamente poseen un multiplexor análogo que constantemente está conmutando las señales que provienen del exterior enviándolas al conversor para su posterior muestreo y análisis. Algunos modelos de microcontrolador disponen internamente de un amplificador operacional que actúa como comparador analógico entre una señal de referencia fija y otra variable que es aplicada por uno de los terminales de entrada del microcontrolador. La salida de comparador proporciona un nivel lógico 1 o 0 según una señal sea mayor o menor que la otra. Otros microcontroladores poseen internamente un módulo PWM (modulación por ancho de pulso), utilizado comúnmente en aplicaciones de control de motores y comunicaciones digitales. Este módulo proporciona en la salida impulsos de ancho variable, programados por software según las condiciones deseadas. Todos los microcontroladores dedican algunos de sus terminales a líneas de entrada y salida digitales. Por lo general, estas líneas se agrupan de ocho en ocho, formando así lo que se conoce como puertos. Con el objeto de dotar al microcontrolador de la capacidad de comunicarse con otros dispositivos externos, otros buses de microcontrolador o microprocesadores, buses de sistemas o buses de redes y poder adaptarlos con otros elementos y con otras normas y protocolos, algunos microcontroladores disponen de puertos de comunicación. Destacan las conexiones serie UART y USART, puertos paralelos, puertos I²C o el moderno bus serie USB desarrollado para los PC.
1.11 MICROCONTROLADORES DE USO COMÚN Los microcontroladores más comunes en uso son:
Atmel: AVR Hitachi: H8 Holtek: HT8 Intel: 8 bits (8XC42, MCS51, 8xC251), 16 bits (MCS96, MXS296) National Semiconductor: COP8 Microchip ALFAOMEGA - FREESCALE
16
JUAN CARLOS VESGA FERREIRA
Gama baja (familia 12Cxx de 12 bits) (p. ej., PIC12C508) Gama media (familia 12Fxx, 16Cxx y 16Fxx de 14 bits) (p. ej., PIC16F84) Gama alta (18Cxx y 18Fxx de 16 bits) (p. ej., PIC18F452) dsPIC (DSPs)
NEC: 78K, ST, ST 62, ST 7 Texas Instruments: TMS370 Zilog: Z8, Z86E02 Genérico Algunas arquitecturas de microcontrolador están disponibles por tal cantidad de vendedores y en tantas variedades, que podrían tener, con total corrección, su propia categoría. Entre ellos encontramos, principalmente, las variantes de 8051 y Z80.
FREESCALE: Freescale cuenta con una gran diversidad de microcontroladores para todos los gustos y requerimientos que presente un usuario en un determinado momento, los cuales se pueden clasificar de la siguiente forma:
Microcontroladores de 8 bits Dentro de las familias fundamentales se pueden mencionar:
Familias HC08: HC08AB, HC08AP, HC08AS/AZ, HC08BD, HC08EY, HC08G, HC08JK/JL, HC08MR, HC08Q, HC08RF, HC08SR. Dentro de las familias con mejoras significativas sobre las anteriores, incluyendo módulos como I2C, SPI, entre otros, se pueden mencionar:
Familias HCS08: HCS08AW, HCS08G/Q/R Familias RS08: MC9RS08KA1/2 Existen otras familias importantes, como es el caso de las familias HC05 y HC11, las cuales actualmente se encuentran descontinuadas.
Microcontroladores de 16 bits Este grupo presenta diferencias significativas con las familias anteriores, no sólo por los recursos adicionales que ofrecen sino también por su alta capacidad de procesamiento. Dentro de las familias fundamentales se pueden mencionar:
Familias S12: S12XA/XD, S12A, S12C, S12D, S12E, S12H, S12G y una que permite a los usuarios establecer comunicaciones de alta envergadura, como el caso de la familia S12 ETHERNET Y USB. Familias HC12: HC912BXX, HC912DXX ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
17
Familias HC16: 68HC16R1, 68HC16Y1/Y3, 68HC16Z1/Z3 Y la familia 568XX/E, que brinda al usuario la posibilidad de integrar todo el potencial de los microcontroladores y la capacidad de procesamiento de señales que brinda un DSP en un solo chip, denominados DSCs.
Microcontroladores de 32 bits Este grupo presenta características avanzadas tanto en velocidad de procesamiento como en funciones especiales que realiza. Dentro de las familias más importantes se pueden mencionar:
Familias 68K/ColdFire: ColdFire MCF52XX, 68K M683XX, 68K M680X0.
1.12 ¿CÓMO ELEGIR EL MICROCONTROLADOR ADECUADO? El primer problema al que se enfrenta un ingeniero a la hora de materializar una idea usando un microcontrolador es la elección de una familia de microcontroladores y dentro de ésta, un modelo en concreto que se ajuste lo mejor posible a las necesidades del diseño. Todos los microcontroladores que se fabrican hoy en día son buenos, y el mejor no siempre es el mismo. Cambian el modelo y el fabricante según la aplicación y las circunstancias que lo envuelven. En el mercado existen multitud de fabricantes. La elección de un MICROCONTROLADOR FREESCALE frente a otros más conocidos como el 80XX de Intel, el PIC de Microchip, el ST-62XX de SGS-Thomson o el Z86XX de Zilog, se debe a características como su bajo precio, velocidad, reducido consumo de energía, tamaño, facilidad de uso, fácil programación y, lo mejor de todo, los recursos que la gran mayoría de estos microcontroladores presentan a la hora de diseñar cualquier aplicación. Por ello los microcontroladores Freescale se encuentran hoy en día en la gran mayoría de aplicaciones industriales, de comunicaciones y control. Si se desea investigar al respecto, por ejemplo, en el caso de la industria automotriz, la cual en la actualidad es una de las que requieren mayor precisión en el desarrollo de procesos de control, instrumentación, entre otras, se encuentra que casi 90% de sus componentes son gobernados por microcontroladores Freescale, debido a sus bondades, estabilidad, inmunidad al ruido y otros factores importantes que hacen decisiva su elección frente a otras marcas.
1.13
CARACTERÍSTICAS DE OTROS MICROCONTROLADORES
Altair Altair es el nombre genérico de una familia de microcontroladores de propósito general compatibles con la familia 51. Todos ellos son programables directamente desde un equipo PC mediante lenguaje macroensamblador, o bien mediante otros lenguajes disponibles para la familia 51 (Basic, C, etc.) Los microcontroladores Altair disponen de un microprocesador de 8 bits 100% compatible a nivel de código, 256 bytes de memoria interna, 128 registros especiales de función, puertos de entrada/salida de propósito general, 111 instrucciones y posibilidad de direccionar 128 kbytes. ALFAOMEGA - FREESCALE
18
JUAN CARLOS VESGA FERREIRA
Existen distintos modelos, dependiendo de la velocidad de ejecución, del número de E/S o de los periféricos de los que dispongan (DAC, ADC, Watchdog, PWM, etc.) La elección de un modelo u otro dependerá de las necesidades del caso. Como entrenador o sistema de iniciación existen varios modelos, entre los que destacan el Altair 32 básico o bien el Altair 535A completo. Para proyectos avanzados o desarrollos profesionales, el Altair 537 A.
Intel El 8051 es el primer microcontrolador de la familia introducido por Intel Corporation. La familia 8051 de microcontroladores son controladores de 8 bits capaces de direccionar hasta 64 kbytes de memoria de programa y una memoria de datos de 64 kbytes. El 8031 (la versión sin ROM interna del 8051, siendo esta la única diferencia) tiene 128 bytes de RAM interna (el 8032 tiene RAM interna de 256 bytes y un temporizador adicional). El 8031 tiene dos temporizadores/ contadores, un puerto serie, cuatro puertos de entrada/salida paralelas de propósito general (P0, P1, P2 y P3) y una lógica de control de interrupción con cinco fuentes de interrupciones. Al lado de la RAM interna, el 8031 tiene varios registros de funciones especiales (SFR) que son para el control y registros de datos. Los SFR también incluyen el registro Acumulador, el registro B, y el registro o palabra de estado de programa (PSW), que contiene los flags de la CPU. La ROM interna del 8051 y la del 8052 no pueden ser programadas por el usuario. El usuario debe suministrar el programa al fabricante, y el fabricante programa los microcontroladores durante la producción. Debido a los costos, la opción de la ROM programada por el fabricante no es económica para producción de pequeñas cantidades. El 8751 y el 8752 son las versiones EPROM del 8051 y el 8052. Estos pueden ser programados por los usuarios.
Siemens El Siemens SAB80C515 es un miembro mejorado de la familia 8051 de microcontroladores. El 80C515 es de tecnología CMOS que típicamente reduce los requerimientos de energía. Las características que tiene frente al 8051 son más puertos, un versátil conversor analógico-digital, un segundo temporizador optimizado, un Watchdog, y modos de ahorro de energía sofisticados. El 80C515 es completamente compatible con el 8051. Esto es, usa el mismo conjunto de instrucciones del lenguaje ensamblador MCS-51. Las nuevas facilidades del chip son controladas y monitoreadas a través de SFR adicionales.
Los microcontroladores Freescale Como se había mencionado antes, esta familia de microcontroladores es una de las más difundidas y utilizadas a nivel mundial, brindando un sinfín de posibilidades que harán que cualquier diseñador no piense otra cosa que no sea utilizar un microcontrolador Freescale en sus desarrollos. Sus aplicaciones incluyen las comunicaciones, el control, la electrónica automotriz, etc. Los microcontroladores Freescale tienen la reputación de ser muy confiables, fáciles de programar y, ante todo, de ser unos de los más utilizados a nivel mundial. Aunque la gran mayoría de las instituciones universitarias y profesionales en general trabajan con microcontroladores PIC de la empresa Microchip, al conocer las bondades en cuanto a menor costo, mayor diversidad de instrucciones para la ejecución de operaciones matemáticas como multiplicaciones y divisiones, manejo de interrupciones ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
19
vectorizadas mas no jerarquizadas y otra gran cantidad de recursos, sin dudarlo han comenzado su relación con la familia de microcontroladores Freescale. Y no es de extrañar, ya que esta firma es líder en productos de alta tecnología. La cantidad de familias y referencias que poseen estos dispositivos permiten que los diseñadores puedan escoger el más apropiado para cada tarea específica que se deba realizar. Anteriormente se mencionaron las principales familias que hacen parte de esta gran diversidad de microcontroladores; cada una de ellas tiene muchas referencias distintas, las cuales pueden variar por el tamaño de la memoria que poseen, el número de pines, aplicaciones, características especiales como conversor A/D, timer, interrupciones, entre otras. Debido a las bondades ofrecidas por los microcontroladores Freescale, además del hecho de no existir un libro que guíe paso a paso en el conocimiento, adiestramiento y profundización de los mismos, se puede decir que han sido las dos razones fundamentales para la creación del presente texto. El libro no solamente da al lector una introducción al mundo de los microcontroladores, sino que lo lleva de la mano desde las aplicaciones más sencillas, como es el caso del encendido y apagado de un led, hasta aplicaciones complejas como comunicaciones con el PC y control de procesos industriales e instrumentación centrados en el uso de los microcontroladores Freescale. A continuación se da una visión general de las características presentes en algunas de las familias más importantes pertenecientes a este tipo de microcontroladores
Familia de microcontroladores HC05 Esta familia es una de las más utilizadas en la gran mayoría de aplicaciones por su versatilidad de recursos y fácil programación. Sin embargo, presenta una propiedad de mayor importancia y es su compatibilidad con familias más avanzadas; por ejemplo, con la familia HC08, lo que permite hacer migración de diseños hacia dispositivos de más alto rendimiento de una manera muy fácil y rápida.
Familia 68HC05-B. Es un dispositivo de propósito general cuyas principales ventajas son un poderoso timer y memoria para datos tipo EEPROM de 256 posiciones. Otras características incluyen memoria de programa desde 4k hasta 32k, memoria RAM desde 176 hasta 528 bytes, 8 canales A/D, comunicación serial síncrona y asíncrona, y otros recursos de gran interés. Familias 68HC05-C y 68HC05-D. Son elementos de propósito general cuya principal ventaja es su timer
de 16 bits, el cual está acompañado por un módulo de captura y un módulo de comparación. Además, ofrece tamaños de memoria de programa desde 4k hasta 16k, acreditándolo para realizar tareas bastante complejas. Posee interface de comunicaciones asíncronas SCI (Serial Communications Interface), con velocidad ajustable por software desde 75 Hz hasta 131 kHz; también incluye una interface SPI (Serial Peripheral Interface) de 4 hilos y alta velocidad. El watchdog timer o circuito de vigilancia también es una de las características importantes.
Familias 68HC05-J y 68HC115-K. Estas son las familias de más bajo costo, vienen en encapsulados
de 20 y 16 pines. El tamaño de su memoria de programa va desde 0,5k hasta 2k, con memoria RAM de 32 hasta 128 bytes.
Familia 68HC05-P. Es una familia de microcontroladores de propósito general de 28 pines, posee memoria
de programa desde 2k hasta 8k con memoria RAM desde 96 hasta 192 bytes. Tiene comunicación serial
ALFAOMEGA - FREESCALE
20
JUAN CARLOS VESGA FERREIRA
síncrona, timer de 16 bits con módulo de captura y de comparación, conversor A/D de 8 bits con 4 canales de entrada y capacidad de manejar alta corriente en algunos pines.
Familia 68HC05-L. La principal característica es que posee un controlador para manejar una pantalla de
cristal líquido o LCD, con un tamaño que va desde 8 caracteres por 4 filas hasta de 16 caracteres por 60 filas. La memoria de programa va desde 0,6k hasta 24k con memoria RAM de 32 hasta 768 bytes. Incluye timer de 16 bits con módulos de captura y comparación, comunicación serial síncrona y asíncrona.
Familia de microcontroladores HC11 Esta es una familia de microcontroladores de 8 bits de muy alto rendimiento, su arquitectura es compatible con la HC05 y su programación es compatible con la familia de microcontroladores de 16 bits 68HC 12; esto hace que la migración de diseños de una familia a otra sea bastante rápida. Entre las características sobresalientes de esta familia se encuentran: Ha sido optimizado para bajo consumo de potencia Posee un sistema de interrupciones muy avanzado Muchos de sus miembros poseen memoria EEPROM Los últimos miembros de esta familia incluyen un coprocesador matemático con Unidad Aritmética Lógica (ALU) de 16 bits para rápidas operaciones de multiplicación y división Registro acumulador de 16 bits o 2 de 8 bits Seis modos de direccionamiento
Familia de microcontroladores HC12 Este es un poderoso microcontrolador de 16 bits, según Freescale reúne lo mejor del 68HC 11 y mucho más. Entre sus principales características se encuentran: Bajo consumo de potencia y operación a bajo voltaje Memorias flash y EEPROM en un solo chip Instrucciones de Fuzzy logic Bus de datos de 16 bits 64 nuevas instrucciones adicionales a las ya conocidas del 68HC11 Unidad Aritmética Lógica (ALU) de 20 bits Conversor A/D PWM En el transcurso de este libro se trabajará con base en la familia 68HC08, la cual es la más comercial y presenta una gran mayoría de recursos como conversores A/D, timers, PWM, comunicaciones seriales, manejo de interrupciones sectorizadas, entre otros recursos adicionales.
Últimos microcontroladores desarrollados por Freescale Hace muy poco tiempo se realizó el lanzamiento de una nueva familia de microcontroladores, denominada familia de “ultra bajo costo” RS08, en donde sus primeros ejemplares son los dispositivos con referencias ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
21
MC9RS08KA2 y MC9RS08KA1. Esta nueva familia se encuentra basada en el “core” de instrucciones reducidas RS08, prometiendo convertirse en una de las familias más importantes de microcontroladores de 8 y 16 pines, en donde sus principales ventajas sobre sus homólogos son su muy reducido costo y facilidad de integración en aplicaciones de volúmenes elevados. El Core RS08 es una versión reducida del conocido y potente Core S08 de muy bajo consumo y altas prestaciones, radicando su principal diferencia en la densidad de código de las distintas instrucciones y modos de direccionamiento, aunque conserva aún muchas características potentes y versátiles de los periféricos que se utilizan en la familia HC9S08; un ejemplo claro consiste en el módulo BDM que permite emulación en tiempo real a un solo hilo con herramientas de bajo costo, oscilador interno de gran estabilidad que permite lograr frecuencias de bus de hasta 10 Mhz, módulo KBI para manejo de teclado por interrupciones y los modos de bajo consumo típicos de la familia HC9S08. Estos nuevos modelos de microcontroladores (MC9RS08KA2 y MC9RS08KA1) disponen de 2 kbytes y 1 kbyte de memoria flash de tercera generación, respectivamente, para alojar código de programa o datos, 63 bytes de memoria RAM, y lo que más llama la atención de estos dispositivos es la propiedad de trabajar en el rango de tensiones desde 5,5 V con solamente 1,8 V de alimentación, lo que los hace ideales para aplicaciones portátiles basadas en baterías gracias al bajo consumo de energía que presentan. Los dispositivos MC9RS08KA2 y MC9RS08KA1 se encuentran disponibles en el mercado en encapsulados de 8 PDIP, 8 pines SOIC y la versión ultrapequeña de 6 pines DFN (3 mm x 3 mm), complementándose con el hecho de que Freescale dispone de un amplio portafolio de herramientas de hardware y software que soportan esta nueva familia y que están disponibles por medio de sus distribuidores autorizados. Entre las novedades presentes actualmente en la familia HC908 FLASH se encuentran una gran diversidad de dispositivos con capacidad de memoria FLASH de hasta 16K, entre las cuales se pueden mencionar: MC68HC908QTxA/QYxA: Familia de 8 y 16 pines, versión muy mejorada de la popular QT/QY. MC68HC908QLxx: Familia de 20 y 16 pines, de hasta 16 K de memoria flash, con puerto serial apto para redes LIN (CAN limitada), A/D de 10 bits, SPI, 2 comparadores analógicos, oscilador interno, entre sus principales características. MC68HC908QC16xx: Familia de hasta 28 pines y con capacidades de memoria FLASH de hasta 16 K, puertos seriales, SPI apto para redes LIN, A/D de 10 bits, 2 timers de 16 bits, oscilador interno de múltiples frecuencias, entre sus principales características. MC68HC908GRxxA: Es la familia que presenta la mayor cantidad de pines (64) y mayor cantidad de memoria flash (60 K), con A/D de 10 bits, puerto serial apto para redes LIN, hasta 53 puertos I/O, 2 timers de 16 bits, SPI. MC68HC908QB8: Dispositivo de 16 pines con 8 K de memoria flash, con puerto serial apto para redes LIN, A/D de 10 bits, oscilador interno de alta estabilidad. MC68HC908JL16: perteneciente a la familia JL, esta versión de 16 K, compatible con las versiones menores (JL3 y JL8), posee puerto serial, A/D de 10 bits, 2 timers de 16 bits, KBI, entre sus principales características. Sin embargo, también se han presentado novedades en la familia HC9S08 de bajo consumo, entre las cuales se pueden mencionar: MC9S08QG8/4: Familia de pocos pines (16/8) que posee un puerto SCI, SPI, I2C, A/D de 10 bits, timer de 16 bits, timer de 8 bits MTIM especial para realizar tareas periódicas, comparador analógico, ALFAOMEGA - FREESCALE
22
JUAN CARLOS VESGA FERREIRA
oscilador interno de alta estabilidad y de hasta 10 Mhz de bus programable, lo cual permite desarrollar aplicaciones en muchos casos avanzadas gracias a la gran variedad de módulos y recursos que esta familia de microcontroladores en particular presenta. MC9S08AWxx: Familia de hasta 60K de memoria FLASH especialmente diseñada para el ámbito automotriz, se pueden encontrar hasta de 64 pines, soportan alimentación extendida desde 1,8 V hasta 5 V, poseen adicionalmente 2 timers de 16 bits, 2 puertos SCI, SPI, I2C, A/D de 10 bits y muchas herramientas más. Por otro lado, la familia de 16 bits HC9S12 mostró su amplio portafolio de dispositivos en donde se destacan las soluciones con módulos para conectividad Ethernet / TCP/IP (MC9S12NE64) y otras aplicaciones industriales.
Microcontroladores COLDFIRE de Freescale Con la base de años de experiencia en control industrial y comunicaciones, Freescale ha desarrollado el primer microcontrolador de 32-bit con Ethernet, CAN y memoria flash incorporada. El nuevo dispositivo, el Coldfire MCF5282, ofrece a los diseñadores una opción poderosa, nueva y de bajo costo que incluye avanzadas características de comunicaciones, un amplio set de periféricos y una gran variedad de software y herramientas de desarrollo para sistemas de redes embedded. Estos dispositivos contienen drivers para manejo de redes Ethernet, protocolos Internet como IP, UDP, TCP, ICMP, ARP y DHCP, http para pequeños servidores web, servidores FTP triviales para actualizaciones del firmware a distancia y clientes para protocolos al nivel de la aplicación para SMTP y SNTP, entre otros recursos adicionales, que hacen de estos diminutos dispositivos unos gigantes en el campo tecnológico del desarrollo de aplicaciones y, lo mejor de todo, al alcance de cualquier persona. Los microcontroladores ColdFire son los nuevos dispositivos de 32 bits que complementan la gran familia de microcontroladores fabricados por Freescale; entre las principales características de la familia de productos 68 k/coldfire se encuentra su controlador de tipo Fast Ethernet/capa física y USB On-The-Go, permitiendo a los programadores de microcontroladores la posibilidad de crear aplicaciones basadas en comunicaciones y redes de computadores, transmisión remota de datos, sistemas de seguridad avanzados, domótica y un sinfín de posibilidades que sólo la imaginación podrá limitar. Pueden soportar gran variedad de aplicaciones de redes, incluyendo servidores web, servidores UDP/ TCP, gateways/routers, sistemas de seguridad, e interface web para dispositivos X-10; pueden utilizarse como interfaces para tradicionales aplicaciones LAN con microcontroladores, como máquinas de vending y control de equipos de fabricación. El MCF5282 es el primer microcontrolador basado en el núcleo Coldfire de 32-bit de Freescale, el cual presenta características avanzadas en comunicaciones, un gran set de periféricos y amplio soporte software y de herramientas de desarrollo. Entre sus principales características internas se pueden mencionar: Memoria FLASH incorporada de 512 KB MAC Ethernet 10/100 Incluye soporte para protocolos comunes de redes e Internet como UDB, IP, TCP, ARP, DHCP e ICMP Interfaces analógicos-digitales (QADC) ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
23
Timers de 16 y 32 bits Interface I2C 3 UARTS para comunicación serie local Una herramienta gráfica de inicialización para reducir el ciclo de diseño Metrowerks Codewarrior y herramientas de terceras partes Otra de las propiedades que se encuentra entre otros modelos de microcontroladores ColdFire está el bus de serie universal (USB, por sus siglas en inglés), “On-The-Go”, el cual es una extensión del USB tradicional que permite al puerto actuar como servidor o como dispositivo; si se encuentra configurado como servidor hará que otros dispositivos de comunicaciones dependan de él; de lo contrario, si se encuentra configurado como dispositivo, éste dependerá de otro que se encuentre configurado como servidor. Otra de las referencias clave de esta poderosa familia de microcontroladores es el dispositivo MCF5223x, considerado como uno de los primeros microcontroladores que ofrece en un solo integrado 32 bits, controlador de Fast Ethernet, capa física de Ethernet y memoria flash, complementándose con el hecho de ser el más pequeño que existe en la industria para redes basadas en Ethernet. Entre las aplicaciones que ofrece en este mismo chip está su aceleración criptográfica, brindando posibilidades de integrar aplicaciones de seguridad, un coprocesador programable Coldfire que ayuda a acelerar las funciones físicas y, por tanto, también el desempeño de algoritmos criptográficos, permitiendo que la información sea ocultada y protegida, lo cual brinda un mayor soporte y herramientas a la hora de desarrollar aplicaciones basadas en redes de computadores. El microcontrolador MCF5222x es otro dispositivo pionero de la misma familia, el cual posee la característica de un módulo USB On-The-Go integrado y memoria flash, permitiendo que dos dispositivos USB tengan comunicación sin necesidad de un host (una interface en modo de anfitrión) o en otras palabras, un PC. La familia Coldfire se beneficia de una amplia gama de herramientas de desarrollo. Freescale, Quadros y Metrowerks se han unido para soportar soluciones de control para redes embedded basadas en el Coldfire MCF5282, RTXC Quadros y Codewarrior para Coldfire.
RESUMEN
Se podría decir que estas familias de dispositivos abren la puerta hacia el uso de procesadores de desempeño de 32-bits de alto rendimiento, brindando un gran portafolio de recursos a la hora de que los diseñadores de aplicaciones basadas en microcontrolador puedan desarrollar sistemas integrados que manejen secciones basadas en control, conectividad y estabilidad capaces de brindar niveles de seguridad a muy bajo costo.
1.14 PRINCIPIOS BÁSICOS DE OPERACIÓN INTERNA El microcontrolador ejecuta las instrucciones que se encuentran almacenadas en la memoria de programa. Este proceso se genera de manera síncrona con base en un reloj un oscilador (OSC), que paso a paso va siguiendo ALFAOMEGA - FREESCALE
24
JUAN CARLOS VESGA FERREIRA
una máquina de estados finita encargada de buscar la instrucción en memoria, interpretarla y ejecutar las tareas asociadas a la instrucción en particular. De esta forma, el OSC se convierte en la referencia de tiempo de ejecución del microcontrolador. Si el OSC tiene una mayor frecuencia, entonces ejecutará instrucciones a mayor velocidad, teniendo como límite la máxima velocidad de operación del microcontrolador Al ser una máquina de estados finita, es necesario que parta de un estado conocido. Lo anterior se logra con el proceso de inicialización de encendido (Power On Reset). En el proceso de inicialización, el contador de programa (PC) se carga con un valor inicial. Este PC se encargará de estar apuntando a la siguiente instrucción a ejecutar. Con base en la máquina de estados, el PC se convertirá en la dirección de memoria de programa que contiene la siguiente instrucción a ejecutar; la unidad de control se encargará de leer la instrucción y de actualizar el PC para que apunte a la siguiente instrucción. Se presentan otras circunstancias en las que es necesario que el PC vuelva a la posición inicial, por lo que se ofrece la opción de que una señal de entrada externa al microcontrolador, la señal de RESET, pueda utilizarse con dicho comportamiento.
Unidad Central de Procesamiento (CPU) La unidad central de procesamiento es el módulo “inteligente” del microcontrolador. La CPU sigue la secuencia de instrucciones, o programa, que se encuentra almacenada en la memoria de código (Flash). El diseñador del programa define la secuencia de instrucciones que resolverá la aplicación. Este programa se interpreta en código máquina (binario) aunque el diseñador lo escribe en un lenguaje un poco más cercano al ser humano, conocido como lenguaje ensamblador. Este lenguaje ensamblador es un punto intermedio entre el lenguaje máquina y lenguajes de mayor nivel, como, por ejemplo, lenguaje C. En tiempos modernos la programación se hace principalmente en lenguaje C. Se dice que es un lenguaje de mayor nivel por estar más cercano al lenguaje humano y más alejado del lenguaje máquina. Implica un mayor nivel de abstracción y mayor simplicidad en la programación. La unidad central de procesamiento (CPU) está conformada por la unidad de control, los registros del procesador y la unidad de control. La unidad aritmético lógica (ALU) es la encargada de realizar las operaciones, es el módulo que ejecuta los cálculos que colaboran, paso a paso, en la ejecución de las operaciones que el diseñador define para resolver la aplicación. La ALU se auxilia de registros internos, que son localidades de memoria de alta velocidad, construidos con Flip Flops. Algunos de estos registros se usan en lenguaje ensamblador para poder ejecutar las operaciones. En lenguaje C, el diseñador no opera con estos registros, le son transparentes. La secuencia de acciones necesarias desde la interpretación hasta la ejecución de las instrucciones es controlada por la unidad de control. Esta unidad se construye con base en decodificadores y máquinas de estado finitas (FSM) que llevan paso a paso el control de todos los módulos. La unidad de control gobierna la operación de todos los módulos, indicando cuándo debe ejecutar y qué tipo de acción debe realizar. La unidad de control inicia su operación como respuesta a la señal de inicialización (RESET); a partir de ese momento, seguirá la secuencia de acciones dependiendo de cada instrucción y cumpliendo la secuencia almacenada en la memoria de programa. La máquina de estado se sincroniza con base en una señal de reloj (CLK) que puede estar definida por una señal externa o una señal interna. ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
25
Memoria interna El microcontrolador sigue la estrategia del programa almacenado en memoria; por lo anterior, requiere memoria de programa, memoria de datos y registros internos, explicados anteriormente.
Memoria de programa Es la encargada de mantener la secuencia de instrucciones a ejecutar; normalmente es memoria no volátil, es decir, que aunque se retire la energía, puede mantener las instrucciones durante años. Dicha memoria se borra, programa o configura con descargas eléctricas, por lo que puede ser programada sin necesidad de removerse de la tarjeta de circuito impreso; lo anterior se denomina In Circuit Programming. El ambiente de desarrollo integral (IDE) en el computador o la computadora permitirá, entre otras cosas, poder grabar la memoria de programa en el dispositivo electrónico.
Memoria de datos La memoria de datos, conocida como RAM, es la unidad de almacenamiento temporal; es volátil, por lo que al retirar la energía se perderán los datos. Cómo respuesta a un Reset, las celdas de memoria quedarán con valores desconocidos, por lo que no se puede presuponer ningún valor.
Puertos de entrada/salida Los puertos de entrada/salida son los medios con los cuales el microcontrolador tiene la capacidad de realizar interfaces con el entorno. Vía los puertos de entrada se pueden conectar desde dispositivos muy simple como switches y teclados. Básicos (GPIO) Estándar (Special Funct)
1.15 SISTEMAS DE DESARROLLO Existen gran cantidad de modelos, los cuales se ajustan a las necesidades y presupuestos disponibles. Estos equipos ofrecen muchas ventajas a pesar de su bajo costo; por ejemplo, una de las ventajas que presentan los programadores de microcontroladores Freescale sobre programadores de otros fabricantes es que incluyen la capacidad de emulación en el circuito de aplicación, y aunque esta tarea no se ejecuta en tiempo real, sí es de gran ayuda para agilizar el trabajo y disminuir el tiempo de desarrollo de los programas. Otras características son: Ambiente de desarrollo totalmente integrado bajo Windows Se puede examinar y modificar la memoria, registros y pines de entrada/ salida Acepta hasta hasta 64 breakpoints (puntos de parada) Diferentes modos de ejecución en pasos o de corrido Programa microcontroladores OTP y EPROM Conexión serial con el computador ALFAOMEGA - FREESCALE
26
JUAN CARLOS VESGA FERREIRA
FIGURA 1.8 Sistema de desarrollo creado por Freescale para la familia HC08.
Así como existe un gran número de referencias de microcontroladores, existe también un buen número de sistemas de desarrollo, tarjetas de evaluación y programadores disponibles para que el diseñador escoja el que más le convenga. Se pueden encontrar en el mercado programadores universales de microcontroladores Freescale a costos relativamente bajos como programadores exclusivos para ciertas referencias, por ejemplo programadores para solamente GP32, JK1/JK3, HC11, S08, etc. Para obtener mayor información al respecto se puede visitar la página de internet http://www.freescale.com o la página http://www.pemicro.com/, en la cual se puede encontrar toda la información necesaria relacionada con la gama de programadores y herramientas de desarrollo para las diferentes familias de microcontroladores Freescale. Al final del libro se adjunta un circuito de un programador para el microcontrolador JK1/JK3. (Ver página web www.alfaomega.com.co). Existen también en internet planos de programadores muy sencillos para cada familia. Una de las ventajas de estos programadores es que todos funcionan como primera medida con el mismo software (WINIDE), aunque debido a los avances y tendencias actuales de los nuevos desarrollos realizados por Freescale, recomiendan trabajar con la herramienta software denominada Codewarrior, la cual no solamente supera las características que presenta la herramienta de desarrollo WINIDE sino que además permite compilar tanto en lenguaje ensamblador como en C; adicionalmente brinda recursos poderosos de simulación, emulación, librerías incorporadas ya listas para comenzar a interactuar con dispositivos presentes en aplicaciones como pantallas de cristal líquido, memorias, entre otros dispositivos. El diseño basado en un microcontrolador requiere herramientas que permitan simplificar varios procesos: la generación del programa, el mecanismo para grabar la memoria de programa en el dispositivo electrónico y la capacidad de poder verificar el proceso correcto del par hardware–software. Todo lo anterior lo ofrece Freescale en su ambiente de desarrollo integrado (IDE) llamado CodeWarrior.
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
27
Para generar el código que ejecutará el microcontrolador, el Code Warrior (CW) tiene un editor de texto que puede recibir código en lenguaje ensamblador, en lenguaje C o en una mezcla de ambos. Freescale ofrece muchas librerías o secciones de software que lo mismo sirven para inicializar los periféricos integrados o el CPU, como para implementar ciertos algoritmos y hasta aplicaciones completas. La familia HCS08 de Freescale tiene la capacidad de grabar la memoria de programa usando una interfaz especial llamada BDM (Background Debug Mode). Normalmente la interfaz BDM se conecta a una computadora personal usando un módulo USB. El módulo USB puede venir como parte de la tarjeta de desarrollo (Demo board) o en un módulo independiente. CW tiene los elementos de software necesarios para poder cargar el programa en la memoria de código usando la interfaz USB. De esta manera, es muy fácil realizar la etapa de programación del microcontrolador.
Tarjetas de evaluación o tarjetas demo Freescale ofrece diferentes tarjetas de circuito impreso para poder acelerar el desarrollo de aplicaciones, eliminando la necesidad de hacer tarjetas de circuito impreso para iniciar el proceso. El diseñador puede desarrollar su código, grabarlo en el microcontrolador y probarlo. Las tarjetas de evaluación o las tarjetas demo tienen interfaces comunes al tipo de aplicaciones para las cuales se utiliza el microcontrolador. Durante el desarrollo de esta obra se usará la tarjeta demo del microcontrolador S08QG8. La familia S08 se programa con la interfaz BDM y el componente llamado QG8 tiene 8 KB de memoria de programa y un conjunto interesante de periféricos y funcionalidades integradas. El diseñador puede iniciar la ejecución de su código desde la ventana de depuración presionando la tecla RUN o puede simplemente desconectar el módulo BDM y la energía, de tal modo que al reenergizar corra la aplicación desarrollada. Para la instalación del ambiente IDE CodeWarrior Development Studio for HC(S)08 y service pack para soporte de la familia QG pueden encontrarse indicaciones en la página web de Freescale, www.freescale.com, y descargarse las versiones más recientes de CodeWarrior (CW). Siga las indicaciones del proceso de instalación de la guía de inicio rápida (Quick Start Guide). Después de que CodeWarrior haya sido instalado de manera adecuada, instale el service pack para HC(S)08 usando el CD llamado CodeWarrior service pack. Este paso es necesario si se desea utilizar la interfaz USBBDM de la tarjeta DEMO9S08QG8.
Debe registrar la instalación y así podrá obtener una licencia para el uso de la edición especial de CodeWarrior.
Esta poderosa herramienta se explicará en detalle en capítulos posteriores, y brindará un gran soporte a la hora de entrenarse y desarrollar aplicaciones de una manera fácil y rápida dentro del mundo de los microcontroladores Freescale.
ALFAOMEGA - FREESCALE
28
JUAN CARLOS VESGA FERREIRA
Conoce el hardware con el que se trabajará Antes de comenzar cualquier proyecto basado en software y hardware, es necesario conocer como está conectado el hardware asociado al microcontrolador; para ello se usa en primera instancia el manual de la tarjeta a ser utilizada, donde se indica comúnmente a qué voltaje se alimenta la tarjeta, ubicación y función de los jumpers y dispositivos conectados a ella.
FIGURA 1.9 Para entender claramente cómo está conectado el microcontrolador debe verse el diagrama esquemático. A continuación mencionamos las principales características de la tarjeta de evaluación.
Componentes principales de la tarjeta DEMO9S08QG8 Programador USB-BDM La tarjeta DEMO9S08QG8 cuenta con una interfaz USB-BDM que permite programar y depurar nuestro código en el microcontrolador. Es importante hacer notar que una aplicación final con el microcontrolador no requiere este programador en la misma tarjeta, es decir, el microcontrolador puede operar solo. El programador a su vez cuenta con dos LED que informan de su estado. USB LED – La conexión del USB con la computadora se ha establecido. USB PWR out – La interfaz USB está proporcionando voltaje a la tarjeta. ALFAOMEGA - FREESCALE
29
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
Fuente de poder Esta tarjeta puede ser alimentada utilizando el voltaje que se proporciona a la interfaz USB, o mediante una fuente no regulada externa de 7-12 voltios mediante el JACK PWR. La fuente es seleccionada mediante el jumper PWR_SEL VB Voltaje proveniente de la interfaz USB VDD voltaje de la fuente externa conectada al JACK PWR LED que indica que el microcontrolador está alimentado VDD presente.
Botones La tarjeta demo cuenta con dos botones denominados SW1 y SW2, los cuales están conectados de tal forma que cuando no son presionados el microcontrolador lee un valor de 1 lógico (Vcc) y cuando se presionan el microcontrolador lee un 0 lógico.
LEDS La tarjeta cuenta con dos lámparas de tipo LED denominadas LED1 y LED2. Estos LED prenden cuando el pin del microcontrolador conectado al LED se pone en 0 V y se apagan cuando están a 1.
Potenciómetro El potenciómetro Rv1 proporciona un voltaje variable a una entrada del microcontrolador de 0 voltios a Vcc; este potenciómetro servirá para hacer pruebas con el convertidor analógico-digital.
Fotocelda La fotocelda Rz1 proporciona un voltaje proporcional a la intensidad de luz a una de las entradas del microcontrolador.
Interfase RS232 Esta interfase puede utilizarse para transferir información entre el microcontrolador y la computadora.
Jumper
On
Off
MCU PORT
MCU PIN
SW1
Enable SW1
Disable SW1
PTA2
14
SW2
Enable SW2
Disable SW2
PTA3
13
LED1
Enable LED1
Disable LED1
PTB6
6
LED2
Enable LED2
Disable LED2
PTB7
5
RV1
Enable RV1
Disable RV1
PTB0
16
RZ1
Enable RZ1
Disable RZ1
PTB1
15
TABLA 1.1 Jumpers y configuración del DEMO9S08QG8. ALFAOMEGA - FREESCALE
30
VB VX_EN
1
2
3
4
5
VDD
COM_EN
6
PWR SEL
JUAN CARLOS VESGA FERREIRA
USER_EN
FIGURA 1.10 Distribución de jumpers puesta en fábrica (default).
El microcontrolador cuenta con un puerto de comunicación serie llamado SCI el cual es acondicionado en el DEMO9S08QG8 para aceptar niveles de comunicación RS232 estándar. Este puerto de comunicación RS232 también se conoce como puerto COM en las computadoras. La siguiente tabla muestra en resumen los dispositivos que están conectados al microcontrolador, así como los jumpers asociados. Revise que los jumpers se encuentren en la posición default. Use la figura como guía. Conecte el cable USB a la PC y a la tarjeta electrónica. Si se está usando la tarjeta por primera vez en la computadora, siga las instrucciones en pantalla para instalar adecuadamente el dispositivo USB. (Si no ha instalado CW y el service pack, no dispondrá de los archivos necesarios (drivers) para reconocer la tarjeta DEMO. Después de que los drivers de USB se instalaron de manera adecuada, los LED de USB, USB PWR OUT y VDD se encenderán. Presione el SW1 y el LED1 cambiará de estado. El LED2 parpadeará a una velocidad mayor. Si la tarjeta DEMO no tiene preinstalado el programa de prueba, deben seguirse estos pasos: 1. Copie el archivo DEMO_S08QG8_Test.zip del CD de Axiom y extraiga todos los archivos a una nueva carpeta. 2. Abra CodeWarrior, seleccione la opción “Start using CodeWarrior” y abra el archivo de proyecto DEMO_S08QG8_Test.mcp. 3. Presione el ícono “Debug” o la tecla F5. La ventana de la herramienta de depuración se abrirá; siga las instrucciones para completar el proceso de grabación del programa en la memoria Flash. 4. Cuando se abra la ventana “Erase and Program Flash”, presione “YES”. 5. La ventana del programador se cerrará y entonces está lista la aplicación para ejecutarse. El código fuente de este programa se puede encontrar en el archivo “DEMO_S08QG8_Test.zip” del CD de Axiom, específicamente en la carpeta “Examples”.
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES MOTOROLA FREESCALE
RESUMEN DEL CAPÍTULO CAPÍTULO Freescale cuenta con una gran diversidad de microcontroladores para todos los gustos y requerimientos que presente un usuario en un determinado momento y diseño en particular. Se puede concluir que un microcontrolador contiene toda la arquitectura de un sencillo pero completo computador en un solo chip. Las aplicaciones y desarrollos que se pueden alcanzar utilizando estos dispositivos son realmente interesantes. El microcontrolador consiste en un circuito integrado de alta escala de integración que incorpora la mayor parte de los elementos que configuran un controlador. Se dice que es “la solución en un chip” porque su reducido tamaño minimiza el número de componentes y el costo. Los componentes de los que dispone normalmente un microcontrolador son: Procesador o CPU (unidad central de procesamiento). Memoria RAM para contener los datos de propósito general. Memoria para el programa, tipo ROM/PROM/EPROM. Líneas de E/S para comunicarse con el exterior. Diversos módulos para el control de periféricos (temporizadores, puertas serie y paralelo, CAD, etc.) Generador de impulsos de reloj que sincronizan el funcionamiento de todo el sistema. La única limitación que tienen las aplicaciones de los microcontroladores actuales está en la imaginación del diseñador. Los campos más destacados en los que se emplean microcontroladores son los siguientes: Automatización industrial. Adquisición y cuantificación de variables físicas. Control de procesos Industriales. Enseñanza e investigación. Electrodomésticos. Electromedicina. Robótica. Sistemas de navegación. Sistemas de seguridad. Además de las clasificaciones anteriores, se podrían hacer otras dos clasificaciones atendiendo a las necesidades y a los recursos especiales que pueden tener los microcontroladores. Respecto a las bondades ofrecidas cabe destacar: Precio. Velocidad de ejecución de código.
ALFAOMEGA - FREESCALE
31
32
JUAN CARLOS VESGA FERREIRA
Eficiencia en la compresión de código. Inmunidad al ruido. Los recursos especiales más comunes que pueden tener los microcontroladores son los siguientes: Temporizador y/o contador. Perro guardián o “COP”. Protección ante el fallo de la alimentación. Estado de reposo o de bajo consumo. Conversor analógico-digital (CAD). Conversor digital-analógico (CDA). Comparador analógico. Modulador de anchura de impulsos o PWM. Puertas de entrada y salidas digitales. Puertas de comunicación (USART, USB, SCI, etc.)
ALFAOMEGA - FREESCALE
Capítulo
2
LOS MICROCONTROLADORES
MC68H(R)C908JL3/JK3/JK1 OBJETIVO DEL CAPÍTULO Al finalizar el presente capítulo el estudiante tendrá un conocimiento sobre las características principales de los microcontroladores Freescale JK1/JK3/JL3, tales como: distribución de pines, principales recursos, mapa de memoria, modos de direccionamiento, registros de uso general, y muchas cosas más que hacen parte fundamental de esta familia de microcontroladores.
CONOCIMIENTOS PREVIOS Para iniciar el estudio del presente capítulo, es necesario que el lector posea conocimientos básicos sobre: ¿qué es un microcontrolador?, ¿para qué sirve?,¿qué tipos de familias y fabricantes existen en el mercado?, y arquitecturas, entre otros aspectos, con el fin de que pueda comprender al máximo los conceptos y las temáticas expuestas.
2.1
INTRODUCCIÓN
El MC68H(R)C908JL3/JK3/JK1 son miembros de muy bajo costo, alto desempeño en la familia de 8 bits M68HC08. Todos los miembros de la familia 08 de Freescale utilizan la unidad de procesamiento CPU08 y están presentes en una gran variedad de presentaciones de (20,28 y 40 pines) y en diversos tamaños de memoria de programa (1.5k, 4k y 32k). Dentro de las principales características de estos microcontroladores están: tienen memoria Flash (borrable y programable eléctricamente), además de contar con conversores análogos digitales, interrupciones sectorizadas, interrupciones externas, timers, etc.
34
JUAN CARLOS VESGA FERREIRA
DISPOSITIVO
TAMAÑO DE MEMORIA FLASH
No. PINES
MC68H®C908JL3
4096 bytes
28
MC68H®C908JK3
4096 bytes
20
MC68H®C908JK1
1536 bytes
20
TABLA 2.1 Tamaño de la memoria Flash y número de pines
2.2
CARACTERÍSTICAS DE LA CPU 08
Presenta un modelo de programación muy completo Tiene set de instrucciones muy amplio, incluyendo varios modos de direccionamiento Registro de 16 bits (H:X) y stack pointer manipulable por el usuario Instrucciones de transferencia de memoria a memoria Instrucciones de multiplicación rápida de 8*8 Instrucciones de división rápida de 16/8 Instrucciones de BCD Fácil soporte de lenguajes de alto nivel como el C
2.3
CARACTERÍSTICAS DE LOS MICROCONTROLADORES
CPU de 8 bits Operación interna a 8 MHz Rango de operación entre 3 V y 5 V LVI: Protección contra voltaje Opción de oscilador con red RC o cristal Sistema de programación Flash Seguridad Flash 4096 bytes para MC68H(R)C908JL3/JK3 1536 bytes para MC68H(R)C908JK1 128 bytes de memoria RAM 2 timers de 16 bits ALFAOMEGA - FREESCALE
LOS MICROCONTROLADORES MC68H(R)C908JL3/JK3/JK1
35
12 canales de conversores A/D de 8 bits (JL3), 10 canales de conversión A/D para el JK3. 23 pines de entrada/salida para uso general (JL3). 7 interrupciones de teclado con resistencias de Pull-up 10 drivers para LED 2 ICAP/OCAP/PWM 15 pines de entrada/salida para uso general (JK3/JK1) 1 interrupción por teclado con resistencias de Pull-up 4 drivers para LED 2 ICAP/OCAP/PWM Modos de bajo consumo COP perro guardián Fuentes de interrupciones totalmente sectorizadas Pull-down programables por puerto de entrada Antes de iniciar el recorrido por el mundo de la programación de los microcontroladores Freescale, existe la necesidad de exponer una serie de conceptos básicos que le ayudarán al lector a comprender con mayor fluidez el comportamiento y funcionamiento de los microcontroladores con el mundo exterior. A continuación se explicarán conceptos como: ¿qué son los pines de entrada?, ¿qué son los pines de salida?, ¿qué es una CPU y qué función desempeña en el microcontrolador?, ¿qué es el reloj y para qué sirve?, ¿cómo se articula un programa escrito por un desarrollador, con el hardware propio del microcontrolador?, y muchas preguntas más, dándole al lector una visión mucho más clara del comportamiento y alcance de estos poderosos dispositivos programables.
¿Qué son los pines de entrada? En los microcontroladores se usan dispositivos de entrada muy sencillos como, por ejemplo, interruptores simples, debido a que la mayoría de las entradas de los microcontroladores pueden solamente procesar señales digitales con los mismos niveles de tensión que la fuente de alimentación (+5 V). Inicialmente se debe tener en cuenta lo siguiente: el nivel de cero voltios o nivel de tierra se denomina Vss, y el nivel positivo o nivel de alimentación se denomina Vdd, cuyo valor por defecto son 5 voltios de corriente contínua. Se sabe por circuitos digitales que un nivel de tensión de (0- 0.8 V) se considera como un “0” lógico y una tensión que se puede encontrar entre 2.5 y 5 V se considera como un “1” lógico. Sin embargo, no todas las señales que se aplican al microcontrolador deben ser señales de tipo digital; el mundo real está poblado de señales analógicas, o señales que son de otros niveles de tensión. Algunos dispositivos tienen la propiedad de acondicionar las señales presentes en el medio a niveles de tensión dentro del rango permitido para el microcontrolador, esto en cuanto a nivel digital; por otra parte, existen otros dispositivos con la propiedad de convertir señales analógicas en señales digitales (a valores binarios compuestos por “1” y “0”), los cuales el microcontrolador será capaz de procesar y manipular. En el caso de la familia que se estudiará a lo largo del libro, estos dispositivos conversores ya vienen incorporados en el mismo microcontrolador y con muchas herramientas potenciales adicionales. En la mayoría de las aplicaciones que requieran instrumentación se recurrirá al uso de dispositivos conocidos como “transductores”, los cuales tienen la característica de convertir una variable física presente ALFAOMEGA - FREESCALE
36
JUAN CARLOS VESGA FERREIRA
en el mundo real, como, por ejemplo: presión, temperatura, velocidad, en señales eléctricas directamente proporcionales a su valor real, es decir, a mayor valor de la variable, mayor valor de voltaje a la salida del transductor y viceversa.
Se debe tener en cuenta que cuando se desee realizar un diseño, en la mayoría de los microcontroladores los pines cuando son configurados como entradas pueden recibir corrientes provenientes de otros circuitos hasta 25 mA por pin, aproximadamente.
¿Qué son los pines de salida? Así como se mencionó antes, que las entradas permiten recibir señales, en la mayoría de los casos en formato digital, los dispositivos de salida permiten que el microcontrolador envíe información al mundo exterior o bien realice acciones sobre éste. En un computador, un dispositivo de salida puede ser el monitor; en los microcontroladores se utilizan de igual modo dispositivos simples basados en mecanismos de conmutación o interruptores. Cuando el microcontrolador envía un “0” lógico a través de alguno de los pines configurados como salida, a nivel de tensión se obtendrá externamente un valor de 0 V; de lo contrario, si se envía un “1” lógico a través de alguno de los pines configurados como salida, a nivel de tensión se obtendrá externamente un valor de 5 V.
Se debe tener en cuenta que cuando se desee realizar un diseño, en la mayoría de los microcontroladores los pines cuando son configurados como salidas podrán suministrar corrientes hasta 20 mA por pin, aproximadamente, lo suficiente como para encender perfectamente un LED.
¿Qué es una CPU y qué función desempeña en el microcontrolador? La CPU o unidad central de proceso es el núcleo de todo el sistema; su función principal es ejecutar cada una de las instrucciones programadas por el diseñador. Este programa estará constituido por instrucciones que le ordenará en muchos casos a la CPU leer información proveniente de los pines de entrada o de una dirección de memoria de trabajo, y a su vez enviar información ya sea a un puerto o a una dirección de memoria en particular. Algunas instrucciones del programa involucran sencillas decisiones provocando establecer rutinas condicionales y/o repetitivas necesarias para realizar una tarea específica. En el apéndice del libro se explica cuidadosamente cada una de las instrucciones disponibles para esta familia especial de microcontroladores. En un microcontrolador hay usualmente sólo un programa, el que atiende una aplicación específica de control. La CPU de la familia MC68HC08 (CPU08) reconoce alrededor de 89 instrucciones diferentes, respectivamente, permitiendo realizar cualquier tarea que el diseñador requiera y con una estabilidad y funcionalidad excelentes. ALFAOMEGA - FREESCALE
LOS MICROCONTROLADORES MC68H(R)C908JL3/JK3/JK1
37
¿Qué es el reloj y para qué sirve? Uno de los elementos primordiales que debe estar presente en cualquier microcontrolador es el oscilador. Un oscilador es un circuito que permite la generación de una señal que podemos imaginar como un tren de pulsos, a una determinada frecuencia, establecida convencionalmente por un cristal de cuarzo. Este tren de pulsos permitirá que el microcontrolador funcione y ejecute cada una de las instrucciones previamente programadas. Una instrucción, por sencilla que sea, se puede dividir en una serie de etapas más elementales, cada una de estas pequeñas etapas en la operación de un microcontrolador toma un ciclo de reloj de la CPU; es decir, el ciclo o tiempo de ejecución de una instrucción es equivalente a una cantidad de ciclos generados por el oscilador, en donde la relación aproximada en la mayoría de los microcontroladores es que el tiempo de ejecución de una instrucción será aproximadamente de 4 ciclos de reloj, o sea 4 ciclos del oscilador.
¿Qué función cumple la memoria dentro del sistema? Hay varios tipos de memoria que se utilizan para diversos propósitos en los sistemas del computador. Los principales tipos que se encuentran en sistemas con microcontroladores son la memoria de la lectura solamente (ROM) y la memoria de lectura / escritura de acceso aleatorio (RAM). La ROM se utiliza principalmente para el almacenamiento de programas y datos de manera permanente, en los cuales, en caso de presentarse ausencia de energía en el circuito, los datos no serán borrados del microcontrolador. Caso contrario ocurre en la memoria RAM, en donde la información es almacenada de manera temporal y en caso de ocurrir alguna falla en la energía, los datos se perderán definitivamente. Existe otro tipo de memoria que se encuentra convencionalmente en muchos microcontroladores, la cual sería el homólogo del disco duro en un computador personal; este tipo de memoria se denomina EEPROM, y es programable y borrable eléctricamente, manteniendo almacenada la información deseada por el desarrollador y, en caso de ausencia de energía, no se perderá. En aplicaciones reales, esta memoria puede ser utilizada, por ejemplo, para almacenar números de identificación de dispositivos, contraseñas, conteos, entre otros valores que puedan ser valiosos para el desarrollador y que en caso de requerir modificación no sea necesario reprogramar el microcontrolador totalmente, sino modificar ligeramente desde aplicaciones externas el valor presente en ella. Se debe tener en cuenta que la menor unidad de almacenamiento de memoria en un microcontrolador es el bit, el cual puede retener un valor correspondiente a un “1” o un “0” lógico; el conjunto de 8 bits agrupados es lo que se denomina byte. Los microcontroladores pueden manejar canales de comunicación internos desde 8 bits hasta los más poderosos, que permiten transferir simultáneamente hasta 32 bits. En el caso de la familia HC08 se utilizará como estándar canales de comunicación y registros de 8 bits.
¿Cómo se articula un programa escrito por un desarrollador, con el hardware propio del microcontrolador? La figura que se muestra a continuación ilustra al programa como una nebulosa, dándose a entender que en esta sección en particular puede haber cualquier cosa, dependiendo de la imaginación del desarrollador. Tal como se había mencionado antes, los componentes fundamentales de un programa son las instrucciones ejecutadas progresiva y secuencialmente por la CPU. De la misma manera, un desarrollador mediante el uso de circuitos eléctricos digitales puede implementar un sistema basándose en elementos tan simples como son las compuertas AND, OR y NOT; por analogía, un programador puede escribir un programa que realice la misma función mediante instrucciones simples y con menor circuitería y complejidad que el método inicial.
ALFAOMEGA - FREESCALE
38
JUAN CARLOS VESGA FERREIRA
PROGRAMA
ENTRADAS SWITCHES TECLADOS
SALIDAS MEMORIA
CPU
RELEVOS LEDS PARLANTES
SENSORES Reloj
OSCILADOR
FIGURA 2.1 Diagrama de bloques interno de un microcontrolador.
¿Cómo funcionan los puertos del microcontrolador y cómo se pueden configurar como entrada o salida? Cuando se tienen valores a la entrada o salida de un pin o grupo de pines en particular, la información del estado y control de los pines de entrada/salida se puede conocer gracias a que sus valores se verán reflejados en el registro correspondiente al puerto en el que se encuentran ubicados, registro que está en una posición particular del mapa de memoria, permitiendo entonces que el sistema pueda intercambiar información desde o hacia su mundo exterior. El mapa de memoria correspondiente a la familia HC08 se estudiará en detalle en capítulos posteriores. Los tipos más simples de posiciones de memoria de I/O son un simple puerto de entrada y un puerto de salida; cada puerto se encuentra constituido por 8 bits, y aunque muchas veces externamente sólo se tiene acceso a una cantidad inferior a los 8 pines, internamente siempre estará completo el puerto respectivo, estableciendo el valor de “0” lógico en aquellos bits que no pueden ser visualizados externamente. Por ejemplo: si en un puerto, de sus 8 bits los 4 bits de más peso fueran configurados como entrada y los 4 bits de menos peso como salida, y adicionalmente se colocara un voltaje de 5 voltios en el pin de más peso y el valor leído por este pin fuera representado por el bit de menos peso, se obtendría el siguiente resultado: ALFAOMEGA - FREESCALE
39
LOS MICROCONTROLADORES MC68H(R)C908JL3/JK3/JK1
MSB
1
LSB
0
0
0
0
0
BIT DE ENTRADA
0
1 BIT DE SALIDA
Los microcontroladores incluyen pines de I/O de ports paralelos de propósito general. El sentido de cada pin se puede configurar de manera independiente, es decir, que a pesar de tener un puerto 8 bits, la combinación de cuáles pines serán configurados como entrada y cuáles como salida dependerá solamente del desarrollador a través de la combinación establecida en el registro DDR respectivo. Un pin de port se puede configurar como salida si en el registro correspondiente DDR, en el bit respectivo está escrito un “1” lógico; de lo contrario, si un pin de port se desea configurar como entrada, en el registro DDR respectivo deberá estar escrito como un “0” lógico. Si por algún motivo todos los bits del registro DDR son borrados, se estaría configurando en el puerto equivalente todos sus pines como entrada.
2.4
DISTRIBUCIÓN DE PINES DEL MICROCONTROLADOR MC68H(R)C908JL3/JK3/JK1
Como se puede visualizar en la figura 1, el microcontrolador JL3 está constituido por 28 pines, mientras que los microcontroladores JK3 y JK1 solamente poseen 20 pines. A continuación se ilustra la distribución de pines de cada uno de ellos y la respectiva función que desempeñan. Como se puede observar, el microcontrolador MC68H(R)C908JL3 está constituido por 28 pines, entre los cuales presenta tres puertos configurables como entrada o salida de manera independiente, mientras que el MC68H(R)C908JK3/JK1 posee dos puertos con las mismas características de este último. Una de las principales características de estos microcontroladores es que sus pines comparten recursos propios del dispositivo, los cuales se ilustran en detalle en la tabla siguiente. Además tienen dos pines para conexión del oscilador, el cual permite el funcionamiento del microcontrolador, conversores análogos/digitales. Fuentes de interrupción externa como la IRQ1 y funciones de interrupción por teclado presentes solamente en el JL3.
ALFAOMEGA - FREESCALE
40
JUAN CARLOS VESGA FERREIRA
IRQ1
1
28
RST
PTA0
2
27
PTA5
VSS
3
26
PTD4
OSC1
4
25
PTD5
OSC2/PTA6
5
24
PTD2
IRQ1
1
20
RST
PTA1
6
23
PTA4
VSS
2
19
PTD4
VDD
7
22
PTD3
OSC1
3
18
PTD5
PTA2
8
21
PTB0
OSC2/PTA6
4
17
PTD2
PTA3
9
20
PTB1
VDD
5
16
PTD3
PTB7
10
19
PTD1
PTB7
6
15
PTB0
PTB6
11
18
PTB2
PTB6
7
14
PTB1
PTB5
12
17
PTB3
PTB5
8
13
PTB2
PTD7
13
16
PTD0
PTD7
9
12
PTB3
PTD6
14
15
PTB4
PTD6
10
11
PTB4
MC68H(R)C908JL3
MC68H(R)C908JK3/JK1
TABLA 2.2 Distribución de pines y apariencia física del JL3/JK3/JK1.
ALFAOMEGA - FREESCALE
41
LOS MICROCONTROLADORES MC68H(R)C908JL3/JK3/JK1
2.5
DESCRIPCIÓN DE PINES DEL JL3/JK3/JK1
Nombre del pin
Descripción del pin
IN/OUT
Nivel de voltaje
IN
3–5V
VDD
Alimentación positiva
VSS
Tierra
OUT
0V
RST
Reset activo en bajo
IN
VDD
IRQ1
Interrupción externa Posee resistencia de Pull-Up Pin usado para seleccionar modo de arranque
IN
VDD
OSC1
Entrada del oscilador
IN
Análoga
OSC2
Para oscilador a cristal: salida del OSC1 Para oscilador RC
OUT IN/OUT
Análoga VDD
PTA[0:6]
7 bit de propósito general I/O 7 interrupciones de teclado IN Resistencias de Pull-Up programables
IN/OUT IN
VDD VDD VDD
PTB[0:7]
8 bits de propósito general I/O 8 conversores A/D ADC[0:7]
IN/OUT IN
VDD Análoga
PTD[0:7]
8 bits de propósito general I/O PTD[3:0] 4 conversores A/D ADC[8:11] PTD[4:5] canales TIM, TCH0, TCH1 PTD[6:7] pines I/O drenador abierto
IN/OUT IN IN/OUT IN/OUT
VDD Análoga VDD VDD
TABLA 2.2 Descripción de pines del JL3/JK3/JK1.
NOTA En los microcontroladores JK3/JK1 no está disponible el PTA, ni los pines PTD0 y PTD1.
ALFAOMEGA - FREESCALE
42
2.6
JUAN CARLOS VESGA FERREIRA
MAPA DE MEMORIA DEL JL3 $0000 $003F $0040 $007F $0080 $00FF $0100 $EBFF $E000 $FBFF
Registros de I/O (64 bytes)
Registros Reservados (64 bytes)
Memoria RAM (128 bytes)
Sin Implementar (60160 bytes)
Sin Implementar 62720
$0100
Memoria FLASH 409.6 bytes MC68H(R)C908JL3/JK3
Memoria Flash 1536 bytes/JK1
$0600
$FDFF
Monitor ROM 512 bytes
$FE00
Registro de Estado de Ruptura BSR
$FE01
Registro de Estado de Reset RSR
$FE02
Reservado
$FE03
Registro de Control de Ruptura BFCR
$FC00
$F5FF
$FBFF
$FE04 Registro de Estado de Interrupción INT1 $FE05 Registro de Estado de Interrupción INT2 $FE06
Registro de Estado de Interrupción INT3
$FE07
Reservado
$FE08
Registro de Control FLASH FLCR
$FE09
Protección en Bloque FLASH FLBPR
$FE0A
Reservado
$FE0B
Reservado
$FE0C
Dirección de Ruptura Alto BRKH
$FE0D
Dirección de Ruptura Baja BRKL
$FE0E
Estado y Control de Ruptura BRKSCR
$FEDF
Reservado
$FE10
Monitor ROM 448 Bytes
$FFCF $FFD0 $FFFF
Uso de Vectores 48 Bytes
ALFAOMEGA - FREESCALE
43
LOS MICROCONTROLADORES MC68H(R)C908JL3/JK3/JK1
Desde las direcciones $0000 hasta la $003F se encuentran todos los registros de control para entrada y salida de datos, configuración de los puertos A, B y D, configuración y estado de los timers, de los canales de conversión A/D, etc.
Dirección $0000
Nombre PORTA
Detalle Registro del puerto A
$0001
PORTB
Registro del puerto B
$0003
PORTD
Registro del puerto D
$0004
DDRA
Registro de configuración del puerto A
$0005
DDRB
Registro de configuración del puerto B
$0007
DDRD
Registro de configuración del puerto D
$000A
PDCR
Registro de control del puerto D
$000D
PTAPUE
$001ª
KBSCR
Control de teclado
$001B
KBIER
Habilitación de interrupción de teclado
$001D
INTSCR
$001E
CONFIG2
Registro de configuración del sistema 2
$001F
CONFIG1
Registro de configuración del sistema 1
Control y estado de la IRQ
$0020
TSC
$0021
TCNTH
Byte alto contador del timer (TIM)
$0022
TCNTL
Byte bajo contador del timer (TIM)
$0023
TMODH
Módulo contador del TIM byte alto
Registro de estatus y control del TIM
Módulo contador del TIM byte bajo
$0024
TMODL
$0025
TSC0
$0026
TCH0H
Timer CH0 byte alto
$0027
TCH0L
Timer CH0 byte bajo
Estatus y control del TIM canal 0
$0028
TSC1
$0029
TCH1H
Timer CH1 byte alto
$002ª
TCH1L
Timer CH1 byte bajo
$003C
ADSCR
Control y estatus del ADC
Estatus y control del TIM canal 1
$003D
ADR
Datos del ADC
$003E
AD/CLK
Reloj del ADC
TABLA 2.4 Registros de I/O. ALFAOMEGA - FREESCALE
Habilitación de resistencias Pull-Up del PortA
44
JUAN CARLOS VESGA FERREIRA
RESUMEN DEL CAPÍTULO CAPÍTULO Los microcontroladores Freescale son dispositivos de muy bajo costo, alto desempeño y están presentes en una gran variedad de presentaciones (de 20, 28 y 40 pines) y en diversos tamaños de memoria de programa. Entre las principales características de estos microcontroladores están la de tener memoria Flash (borrable y programable eléctricamente), además de contar con conversores análogos digitales, interrupciones sectorizadas, interrupciones externas, timers, etc. Además presentan un modelo de programación muy completo, set de instrucciones muy amplio, incluyendo varios modos de direccionamiento, instrucciones de transferencia de memoria a memoria, instrucciones de multiplicación y división rápida, fácil soporte de lenguajes de alto nivel como el C, rango de operación entre 3 V y 5 V, protección contra voltaje, opción de oscilador con red RC o cristal, sistema de programación FLASH, timers de 16 bits, canales de conversores A/D de 8 bits (JL3), 10 canales de conversión A/D para el JK3, modos de bajo consumo, fuentes de interrupciones totalmente sectorizadas, Pulldown programables por puerto de entrada y muchas características más que hacen de estos microcontroladores dispositivos muy especiales en el campo de la electrónica. La CPU o unidad central de proceso es el núcleo de todo el sistema; su función principal es ejecutar cada una de las instrucciones programadas por el diseñador. El oscilador es un circuito que permite la generación de una señal que podemos imaginar como un tren de pulsos, a una determinada frecuencia, establecida convencionalmente por un cristal de cuarzo. Este tren de pulsos permitirá que el microcontrolador funcione y ejecute cada una de las instrucciones previamente programadas.
ALFAOMEGA - FREESCALE
Capítulo
3
INTRODUCCIÓN A LA PROGRAMACIÓN
DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE OBJETIVO DEL CAPÍTULO Al finalizar este capítulo el estudiante estará familiarizado con el repertorio de instrucciones, los modos de direccionamiento utilizados y el estado del registro banderas en un momento determinado, las cuales conforman el grupo de funciones ya sea de tipo aritmético, lógico, condicional, de salto, de manipulación de bits o registros, entre otras, que hacen parte fundamental en el proceso de programación y que brindan al estudiante una visión de todo lo que se puede realizar en el mundo de los microcontroladores Freescale.
CONOCIMIENTOS PREVIOS Para iniciar el estudio del presente capítulo, es necesario que el lector posea conocimientos sobre las características básicas de la familia de microcontroladores HC08 en estudio y conceptos básicos de fundamentos de programación, con el fin de que pueda comprender los conceptos y set de instrucciones explicados a continuación.
3.1
INTRODUCCIÓN
Para iniciar la travesía en el campo de la programación de microcontroladores es necesario comprender su filosofía de trabajo, así como su vocabulario, que para nuestro caso se trata del set de instrucciones, las cuales en el presente capítulo se visualizarán en un cuadro resumen, pero podrán ser estudiadas en detalle en el apéndice B al final del libro, y finalmente los modos de direccionamiento utilizados para la transferencia, manipulación y procesamiento de los registros que hacen parte de un programa o desarrollo en particular.
3.2
REGISTROS DE USO GENERAL
Existen unos registros que se encuentran constantemente interactuando con el microcontrolador, efectuando tareas de acuerdo con las instrucciones que se vayan realizando. Uno de los detalles a tener en cuenta es que a pesar de que estos
46
JUAN CARLOS VESGA FERREIRA
registros hacen parte constante de la programación de microcontroladores, son registros propios e internos de la CPU y por tal razón no se encuentran mapeados en la memoria. Estos registros son:
ACUMULADOR (A): Es un registro de 8 bits de propósito general usado en las operaciones aritméticas y
lógicas. El acumulador comúnmente se utiliza para almacenar operandos, resultados de cálculos aritméticos, y de manipulación de datos, complementándose con el hecho de ser directamente accesible a la CPU para operaciones no aritméticas. Cuando se almacenan datos numéricos se debe tener en cuenta la notación de la base a utilizar para introducir las cantidades.
$: cantidad hexadecimal %: cantidad binaria t: cantidad decimal
REGISTRO ÍNDICE (X): El registro índice se emplea para los modos de direccionamiento indexados, o bien puede usarse como un acumulador auxiliar; está constituido por 8 bits, valor que puede ser cargado directamente o desde una posición de memoria. En las instrucciones indexadas, el registro X provee un valor de 8 bits que es sumado a la dirección base provista por la instrucción para crear una dirección afectiva. El valor provisto por la instrucción puede ser de 0, 1 o 2 bytes de largo.
REGISTRO ÍNDICE (H:X) Este registro puede ser visto como uno solo formado por 16 bits o como dos registros de 8 bits independientes, H y X (registro explicado antes). Este registro se utiliza en los modos de direccionamiento indexados y sirve como un apuntador, siendo capaz de cubrir todo el mapa de memoria con 16 bits. Además, el registro X puede ser utilizado como un acumulador secundario, ya que existen diversas instrucciones que lo emplean como fuente y/o destino, igual que A. Esto es útil para disminuir la carga de trabajo del registro A, de modo que se requiera menos movimiento de datos entre memoria y A, agilizando así la ejecución de la aplicación.
PUNTERO DE PILA (SP): (Stack Pointer). Es un registro de 16 bits que contiene la dirección de la
posición disponible en el stack. El stack pointer puede funcionar como un registro de indexado para acceder a datos en el stack. Una pila (stack) es una estructura de datos de tipo LIFO (del inglés Last In First Out) que permite almacenar y recuperar datos mediante operaciones push (apilar) y pop (desapilar). Estas operaciones se realizan sobre un único extremo de la pila llamado cima.
Por analogía con objetos cotidianos, una operación “push” equivaldría a colocar un plato sobre una pila de platos, y un “pop” a retirarlo. Esto quiere decir que con una operación ‘pop’ se obtendrá el elemento que se añadió la última vez en la pila, es decir, el que se encuentre en la parte superior de la pila; al mismo tiempo que lo elimina de la pila. En general, se puede decir que: ALFAOMEGA - FREESCALE
47
INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE
Un objeto de la clase stack es una pila, la cual permite almacenar objetos y luego recuperarlos en el orden inverso en que se insertaron, es decir, siempre se recupera el último elemento insertado. Para insertar un objeto a la pila se utiliza la instrucción Push, y para retirarlo se utiliza la instrucción Pop.
CONTADOR DE PROGRAMA (PC). Es un registro de 16 bits que contiene la dirección de la siguiente instrucción u operación a procesar. En otras palabras, se podría decir que el registro contador de programa (PC) es usado por la CPU para no perder de vista la dirección de la próxima instrucción a ejecutar. Al resetear la CPU (encenderla), el contador de programa (PC) es cargado con el contenido de un par de posiciones de memoria específicas denominadas vector de reset. Las operaciones del vector de reset contienen la dirección donde está almacenada la lógica interna de la CPU incrementar paulatinamente el valor del contador de programa, de modo tal que siempre apunte a la próxima instrucción a ejecutar. En muchas de las variantes de la famila HC08, algunos de los bits superiores del contador de programa no son usados y están siempre en cero. Se debe tener en cuenta que el número de bits utilizados en el contador de programa coincide con el número de líneas de dirección implementadas en el sistema del microcontrolador.
REGISTRO DE BANDERAS (CCR). Es un registro de 8 bits que contiene el bit de enmascarado general de interrupciones y 5 banderas de estado, las cuales indican ciertas condiciones originadas por la instrucción previamente ejecutada. El registro de código de condición (o registro de banderas) contiene una máscara de interrupción y cuatro indicadores de estado que reflejan el resultado de operaciones aritméticas y de otro tipo de la CPU. Las cinco banderas son semi-acarreo (H), máscara de interrupción (I), negativo (N), cero (Z) y acarreo/préstamo (C). Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
V
1
1
H
I
N
Z
C
Leer Escribir
Este registro contiene un conjunto de banderas que dan información sobre el resultado de la última operación ejecutada. La mayoría de las instrucciones de salto utilizan estas banderas como condición. Aquí se encuentra también el habilitador global de interrupciones. Los bits que componen este registro son:
V: BANDERA DE REBOSAMIENTO Esta bandera es el equivalente de C para operaciones con signo. Se activa si el resultado sale del rango de -128 a 127. Este bit puede ser modificado también por instrucciones no aritméticas. La CPU coloca esta bandera en 1 cuando al efectuar el complemento a dos ocurre un rebosamiento. 1: Rebosamiento 0: No rebosamiento
H: BANDERA DE MEDIO CARRY Indica si existió un desbordamiento en los primeros 4 bits del resultado. Funciona de la misma manera que C para instrucciones aritméticas, pero considerando sólo los primeros 4 bits del resultado. ALFAOMEGA - FREESCALE
48
JUAN CARLOS VESGA FERREIRA
La CPU coloca este bit en 1 cuando ocurre un carry entre los bits 3 y 4 durante una suma con o sin carry; el medio carry es requerido cuando se utiliza codificación en BCD. 1: Carry entre los bits 3 y 4 0: No carry entre los bits 3 y 4
I: MÁSCARA DE INTERRUPCIÓN Este bit es el habilitador global de interrupciones. Si se encuentra en 1, todas las interrupciones (exceptuando las no enmascarables) serán inhibidas y permanecerán pendientes hasta que este bit sea colocado en 0. Este habilitador se modifica en lenguaje C con las instrucciones “EnableInterrupts” y “DisableInterrupts”. Cuando este bit se coloca en 1 lógico todas las interrupciones son deshabilitadas, y se habilitan nuevamente cuando este bit se coloca en 0 lógico. Cuando ocurre cualquier interrupción, este bit se coloca automáticamente en 1 lógico. Después de que este bit es limpiado, la interrupción que es atendida es la que posea mayor prioridad. El bit I no es una bandera de estado, es un bit de máscara de interrupción que desabilita todas las fuentes de interrupción enmascarables cuando el bit I está en uno: de lo contrario, las interrupciones estarán habilitadas cuando este bit está en cero. Cuando ocurre cualquier interrupción, el bit I es automáticamente forzado a uno luego de haber salvado los registros en la pila, pero antes es buscado el vector de interrupción. Si ocurre una interrupción interna mientras el bit I está en uno, la interrupción es almacenada y procesada luego de que el bit I se ponga en cero; de esta manera, no se perderá una interrupción IRQ que se presente cuando el bit está en uno. Cuando se ha atendido una interrupción, la instrucción retorno desde una interrupción (RTI) provocará que los registros recuperen sus valores previos. Normalmente, el bit I permanecería en cero luego de que fuese ejecutada la instrucción RTI; sin embargo, luego de la ocurrencia de cualquier reset, el bit I estará en uno y sólo podrá llevárselo a cero por medio de una instrucción.
N: BANDERA DE VALOR NEGATIVO Esta bandera refleja el estado del bit de signo (bit 7) del resultado anterior. Al igual que la bandera de cero, esto se extiende a otro tipo de instrucciones. Este bit se coloca en 1 lógico cuando el resultado de una operación aritmética es negativa. 1: Resultado negativo 0: Resultado positivo
Z: BANDERA DE CERO Este bit se coloca en 1 lógico cuando el resultado de una operación aritmética o lógica dé cómo resultado CERO. Esta bandera no sólo es modificada por instrucciones aritméticas, por lo que se activará siempre que el valor del registro de destino de la instrucción sea igual a 0. 1: Resultado cero 0: Resultado no cero
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE
49
C: BANDERA DE CARRY En instrucciones aritméticas sin signo, esta bandera indica si ocurrió un desbordamiento en el resultado, es decir, si salió del rango de 0 a 255. Las instrucciones de corrimiento y rotación pueden también hacer uso de este bit. Este bit se coloca en 1 lógico cuando el resultado de una operación aritmética produce Carry después del bit 7. El bit C se usa para indicar si ha habido o no acarreo de una suma o pedido de préstamo como resultado de una resta. Las instrucciones de desplazamiento y rotación operan sobre y a través del bit C para facilitar operaciones de desplazamiento de múltiples bytes. El bit C es afectado además durante las instrucciones de evaluación de bit y de bifurcación. 1: Carry 0: No carry En los capítulos posteriores se harán explicaciones en detalle de cada uno de los registros de uso general de acuerdo con los requerimientos de programación que haya en un momento dado.
3.3
MODOS DE DIRECCIONAMIENTO
En todo proceso de programación se requiere realizar constantemente operaciones, asignación de valores a registros y extraer valores existentes en otros registros para transferirlos y/o procesarlos con otros datos; este proceso de extracción y adjudicación se conoce como DIRECCIONAMIENTO. Una de las propiedades que brindan actualmente los microcontroladores consiste en la habilidad para acceder a la memoria; aprovechado tal cualidad, los modos de direccionamiento existentes en la CPU proveen esta capacidad. Existe una gran variedad de formas de direccionar los datos, las cuales se clasifican según la forma en que una instrucción obtendrá el valor requerido para su ejecución. Debido a los diferentes modos de direccionamiento, una instrucción puede acceder al operando en una de las diversas maneras. Cada variante del modo de direccionamiento de una instrucción debe tener un único código de operación de instrucción. Los microcontroladores Freescale usan seis modos de direccionamiento, que son: Inherente Inmediato Extendido Directo indexado sin desplazamiento con desplazamiento de 8 bits con desplazamiento de 16 bits relativo En los microcontroladores pequeños como, por ejemplo, en la familia HC08, todos los registros utilizados en el programa para el uso de variables y los registros de entrada/salida no requieren área adicional de
ALFAOMEGA - FREESCALE
50
JUAN CARLOS VESGA FERREIRA
memoria, todos ellos se encuentran funcionando en el rango de memoria que va desde la dirección $0000 a la dirección $00FF, en donde el modo de direccionamiento más utilizado es el direccionamiento directo. A continuación se describen en detalle las diferentes formas de direccionamiento existentes, acompañadas de una descripción general y algunos ejemplos que le ayudarán al lector a comprender mucho mejor las bondades y formas de uso presentes en cada modo de direccionamiento. Antes de entrar en detalle, hay necesidad de explicar ciertos conceptos sobre el uso adecuado del sistema numérico en el que se desea expresar una cantidad en un momento dado. El espacio en blanco o ningún símbolo, o culminando la expresión con la letra T, indica que el número es decimal. Este número será trasladado a un valor binario antes de ser almacenado en memoria para ser usado por la CPU. El símbolo $ precediendo a un número indica que el número es hexadecimal; por ejemplo, $0F es la representación en hexadecimal del número 15 en decimal o base 10. El símbolo # indica que el valor que lo acompaña es un valor constante. Se debe tener en cuenta que existe una gran variedad de símbolos y expresiones que pueden utilizarse siguiendo al carácter #. Debido a que no todos los compiladores de ensamblador usan las mismas reglas de sintaxis ni los mismos caracteres especiales, es necesario referirse a la documentación del ensamblador en particular que se esté utilizando en un modelo específico. A continuación se ilustra un cuadro resumen que ayudará al lector a comprender mejor la forma de representar una cantidad en el sistema numérico deseado.
PREFIJO
Tipo de valor que representa
t
Decimal
$
Hexadecimal
@
Octal
%
Binario
Apóstrofe ‘
Carácter ASCII
TABLA 3.1 Listado de prefijos comúnmente utilizados en representaciones numéricas.
Modo de direccionamiento inmediato En el modo de direccionamiento inmediato, el operando está contenido en el byte inmediato siguiente al código de operación. Este modo se usa cuando se requiere un valor o constante conocido en el momento de escribir el programa y que cumple con el hecho de que no cambiará durante la ejecución del programa. Esta es una instrucción de dos bytes, uno para el código de operación y otro para el byte de dato inmediato.
En otras palabras, el operando es un dato constante al que se le antepone el símbolo #
ALFAOMEGA - FREESCALE
51
INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE
Ejemplos LDA
#$0F
;A=$0F
Explicación Los pasos que se ejecutan en el momento de evaluar la anterior instrucción son los siguientes: La CPU almacena el nuevo valor en el registro acumulador (A); en este caso, se almacena el valor de 0F en hexadecimal o 15 en decimal y se ajusta las banderas requeridas según la operación. LDX
#10T
; X = 10
Explicación Los pasos que se ejecutan en el momento de evaluar la anterior instrucción son los siguientes: La CPU almacena el nuevo valor en el registro índice (X); en este caso se almacena el valor 10 y se ajusta las banderas requeridas según la operación. A continuación se muestra el listado de instrucciones que permiten la ejecución del direccionamiento inmediato.
Instrucción
Nemónico
Suma con acarreo
ADC
Suma sin acarreo
ADD
Función lógica AND Comparar el acumulador con memoria
AND CMP
Comparar el registro Índice con memoria
CPX
Función OR exclusiva
EOR
Cargar el acumulador desde memoria
LDA
Cargar el registro Índice desde memoria
LDX
Función OR
ORA
Resta con acarreo
SBC
Resta sin acarreo
SUB
TABLA 3.2 Instrucciones con modo de direccionamiento inmediato
ALFAOMEGA - FREESCALE
52
JUAN CARLOS VESGA FERREIRA
Modo de direccionamiento inherente Este modo de direccionamiento se caracteriza porque toda la información requerida para la operación ya es implícitamente conocida por la CPU y no es necesario utilizar valores adicionales para su ejecución. En caso de requerirse algún operando en particular, son sólo los registros de la CPU o bien valores de datos almacenados en la pila.
Ejemplos INCA
; Incrementar el acumulador
Explicación Los pasos que se ejecutan en el momento de evaluar la anterior instrucción son los siguientes: La CPU lee el valor que se encuentra almacenado en el registro Acumulador. La CPU le suma uno al valor actual del acumulador. La CPU almacena el nuevo valor en el acumulador y ajusta las banderas requeridas según la operación. CLRA
; Borrar el Acumulador
Explicación Los pasos que se ejecutan en el momento de evaluar la anterior instrucción son los siguientes: La CPU almacena el valor (00h) en el registro acumulador (A), borrando toda información que se encontrara almacenada previamente en este registro y ajusta las banderas requeridas según la operación. A continuación se listan las instrucciones que pueden usar el modo de direccionamiento inherente. Instrucción
Nemónico
Desplazamiento aritmético a la izquierda
ASLA, ASLX
Desplazamiento aritmético a la derecha
ASRA, ASRX
Borrar bit de cari
CLC
Borrar bit de máscara de interrupción
CLI
Limpiar
CLRA, CLRX
Complementar
COMA, COMX
Decrementar
DECA, DECX
Incrementar
INCA, INCX
Desplazamiento lógico a la izquierda
LSLA, LSLX
ALFAOMEGA - FREESCALE
53
INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE
Desplazamiento lógico a la derecha
LSRA, LSRX
Multiplicar
MUL
Negar
NEGA, NEGX
No operación
NOP
Rotar a la izquierda a través del carry
ROLA, ROLX
Rotar a la derecha a través del carry
RORA, RORX
Resetear la pila
RSP
Retorno de interrupción
RTI
Retorno de subrutina
RTS
Colocar el bit de carry en 1
SEC
Colocar el bit de máscara de interrupción en 1
SEI
Habilitar IRQ, detener el oscilador
STOP
Interrupción por software
SWI
Transferir el acumulador al registro X
TAX
Probar qure no sea negativo o cero
TSTA, TSTX
Transferir el registro X al acumulador
TXA
TABLA 3.3 Instrucciones con modo de direccionamiento inherente.
Modo de direccionamiento extendido Uno de los modos de direccionamiento más importantes dentro de la programación de los microcontroladores es el modo de direccionamiento extendido, que consiste en extraer la información almacenada en una dirección de memoria que para representarla requiere 2 bytes (16 bits), y se escribe su valor seguido de la instrucción. Este modo se emplea para hacer referencia a cualquier posición de memoria dentro del espacio de memoria del MCU, incluyendo direcciones de puertos de entrada/salida, direcciones de la memoria RAM, ROM, EPROM, Flash. En general, se podría decir que esta forma de direccionamiento se encuentra constituida por tres bytes, un primer byte para la instrucción a utilizar y otros dos para la dirección del operando. A continuación se ilustra un ejemplo que explica con mayor detalle este modo especial de direccionamiento:
Ejemplo Supongamos que en la posición de memoria $0367 se encuentra almacenado el valor $0F, entonces: LDA $0367
; A=$0F , es decir el valor 0Fh (15 en base 10)
La anterior instrucción extrae el valor que se encuentra almacenado en la dirección extendida 0367h y lo almacena en el registro Acumulador (A). ALFAOMEGA - FREESCALE
54
JUAN CARLOS VESGA FERREIRA
Explicación La CPU lee la instrucción que significa cargar el acumulador usando el modo de direccionamiento extendido. La CPU lee el valor $03, el cual es interpretado como el valor correspondiente a los 8 bits de mayor peso de la dirección a leer. La CPU lee el valor $67, el cual es interpretado como el valor correspondiente a los 8 bits de menos peso de la dirección a leer. La CPU arma la dirección extendida completa $0367 con los dos valores previamente leídos, esta dirección es colocada en el bus de direcciones y la CPU leerá el valor almacenado en la posición de memoria $0367 almacenándolo en el registro Acumulador (A). En el Acumulador quedará almacenado el valor 0Fh para el caso del ejemplo. A continuación se ilustra la tabla de instrucciones que permiten el uso del modo de direccionamiento extendido. Instrucción
Nemónico
Suma con acarreo
ADC
Suma sin acarreo
ADD
Función lógica AND
AND
Comparar el acumulador con memoria
CMP
Comparar el registro Índice con memoria
CPX
Función OR exclusiva
EOR
Saltar
JMP
Saltar a subrutina
JSR
Cargar el acumulador desde memoria
LDA
Cargar el registro Índice desde memoria
LDX
Función OR
ORA
Resta con acarreo
SBC
Resta sin acarreo
SUB
TABLA 3.4 Instrucciones con modo de direccionamiento extendido
Modo de direccionamiento directo Uno de los modos de direccionamiento más utilizados en la programación de microcontroladores es el modo de direccionamiento directo; éste es muy similar al modo de direccionamiento extendido, con la diferencia de ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE
55
que el byte correspondiente a la parte alta de la dirección del operando (los 8 bits de más peso del valor de la dirección) se asume con el valor $00, de tal forma que sólo es necesario incluir el byte de menos peso de la dirección del operando (8 bits de menos peso del valor de la dirección) en la instrucción a ejecutar. El hecho de considerar que la parte alta de la dirección de memoria a accesar se considere como 00h, delimita en cierta manera los registros y recursos del microcontrolador a accesar mediante este modo de direccionamiento. Esta área de memoria en especial se denomina página directa, la cual incluye los registros de memoria RAM y puertos de entrada/salida del interior del chip. En general, se podría decir que este modo de direccionamiento es muy eficiente en factores fundamentales a la hora de programar y desarrollar aplicaciones como son: menor espacio de memoria de programa, menor tiempo de ejecución, entre otros factores, debido a que ésta es una instrucción de dos bytes, el primero utilizado para la instrucción a ejecutar y el otro para el byte de menos peso de la dirección de memoria a accesar. A continuación se ilustra un ejemplo que explica con mayor detalle este modo especial de direccionamiento:
Ejemplo Supongamos que en la posición de memoria $80 se encuentra almacenado el valor $0F, entonces: LDA $80
; A=$0F , es decir el valor 0Fh (15 en base 10)
La anterior instrucción extrae el valor que se encuentra almacenado en la dirección 80h y lo almacena en el registro Acumulador (A).
Explicación La CPU lee la instrucción que significa cargar el acumulador usando el modo de direccionamiento directo. La CPU lee el valor $80, el cual es interpretado como el valor correspondiente a los 8 bits de menos peso de una dirección de página directa (desde $0000 hasta $00FF). Los 8 bits de más peso de la dirección a acceder se establecen como $00. La CPU arma la dirección completa de página directa $0080 con los dos valores previamente mencionados, colocando esta dirección en el bus de direcciones y la CPU leerá el valor almacenado en la posición de memoria $0080 almacenándolo en el registro Acumulador (A). En el Acumulador quedará almacenado el valor 0Fh para el caso del ejemplo. A continuación se ilustra la tabla de instrucciones que permiten el uso del modo de direccionamiento directo.
ALFAOMEGA - FREESCALE
56
JUAN CARLOS VESGA FERREIRA
Instrucción Desplazamiento aritmético a la izquierda
Nemónico ASL
Desplazamiento aritmético a la derecha
ASR
Limpiar
CLR
Complementar
COM
Decrementar
DEC
Incrementar
INC
Desplazamiento lógico a la izquierda
LSL
Desplazamiento lógico a la derecha
LSR
Negar
NEG
Rotar a la izquierda a través del carry
ROL
Rotar a la derecha a través del carry
ROR
Probar que no sea negativo o cero
TST
Asignar valor al acumulador
STA
Asignar valor al registro Índice X
STX
Suma con acarreo
ADC
Suma sin acarreo
ADD
Función lógica AND
AND
Comparar el acumulador con memoria
CMP
Comparar el registro Índice con memoria
CPX
Función OR exclusiva
EOR
Saltar
JMP
Saltar a subrutina
JSR
Cargar el acumulador desde memoria
LDA
Cargar el registro Índice desde memoria
LDX
Función OR
ORA
Resta con acarreo
SBC
Resta sin acarreo
SUB
Cargar el acumulador desde memoria
STA
Cargar el registro Índice desde memoria
STX
Saltar si el bit n es 1
BRCLR
Saltar si el bit n es 0
BRSET
Colocar en 1 el bit en memoria
BSET
Limpiar el bit en memoria
BCLR
TABLA 3.5 Instrucciones con modo de direccionamiento directo. ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE
57
Modo de direccionamiento indexado Uno de los problemas que surgen en el momento de requerir almacenar 10, 20 o más valores en direcciones de memoria consecutivas utilizando los modos de direccionamiento anteriores sería el hecho de tener que escribir el código de instrucciones de almacenamiento tantas veces como valores se desee almacenar, lo cual generaría un trabajo bastante tedioso; por esta razón se planteó el modo de direccionamiento indexado. Este modo particular de direccionamiento consiste en que la dirección efectiva del operando es variable y depende de dos factores: El valor almacenado actualmente en el registro índice (X) El desplazamiento contenido en el byte o bytes siguientes al código de operación. Este modo de direccionamiento se puede clasificar de tres maneras diferentes: sin desplazamiento con desplazamiento de 8 bits con desplazamiento de 16 bits.
Indexado sin desplazamiento La primera subclase del modo de direccionamiento indexado denominada indexado sin desplazamiento consiste en que la dirección efectiva del operando para la instrucción está contenida en los 8 bits del registro índice. De tal forma que este modo de direccionamiento puede acceder a las primeras 256 posiciones de memoria (desde $0000 hasta $00FF), considerando el hecho de que la dirección que se tomará como punto de partida o de desplazamiento con relación al valor almacenado en el registro índice será $00 (00h). Hay que tener en cuenta que esta instrucción es de un solo byte. A continuación se ilustra un ejemplo que explica con mayor detalle este modo especial de direccionamiento.
Ejemplo Supongamos que en la posición de memoria $80 se encuentra almacenado el valor $0F y se desea acceder a esta posición utilizando el modo de direccionamiento indexado sin desplazamiento; entonces: LDX #$80 ; X = $80 o (80h) dirección a ser apuntada por el registro X LDA 0,X
; Carga el registro A con el valor almacenado previamente en la dirección 80h de la memoria, que para el ejemplo corresponde al valor $0F (0Fh)
La anterior secuencia de instrucciones ilustra la forma de almacenar en el registro Acumulador (A), el valor almacenado en la dirección 80h, apuntada por el registro índice (X)
Explicación La CPU lee la instrucción que permitirá almacenar un valor existente en una posición de memoria en particular en el registro acumulador (A), utilizando el modo de direccionamiento indexado sin desplazamiento. La CPU construye la dirección completa a acceder sumando $0000 al contenido del registro índice de 8 bits (X), registro que actualmente, para el caso del ejemplo, presenta un valor almacenado de $80 (80h). ALFAOMEGA - FREESCALE
58
JUAN CARLOS VESGA FERREIRA
La dirección resultante es colocada en el bus de direcciones y la CPU lee el valor del registro contenido en esa posición de memoria y lo carga en el registro acumulador (A). La siguiente tabla incluye una lista de todas las instrucciones que pueden usar el modo de direccionamiento indexado sin desplazamiento y con desplazamiento de 8 bits.
Instrucción
Nemónico
Suma con acarreo
ADC
Suma sin acarreo
ADD
Función lógica AND
AND
Desplazamiento aritmético a la izquierda
ASL
Desplazamiento aritmético a la derecha
ASR
Limpiar
CLR
Comparar el acumulador con memoria
CMP
Complementar
COM
Comparar el registro Índice con memoria
CPX
Decrementar
DEC
Función OR exclusiva
EOR
Incrementar
INC
Saltar
JMP
Saltar a subrutina
JSR
Cargar el acumulador desde memoria
LDA
Cargar el registro Índice desde memoria
LDX
Desplazamiento lógico a la izquierda
LSL
Desplazamiento lógico a la derecha
LSR
Negar
NEG
Función OR
ORA
Rotar a la izquierda a través del carry
ROL
Rotar a la derecha a través del carry
ROR
Resta con acarreo
SBC
Asignar valor al acumulador
STA
Cargar el acumulador desde memoria
STX
TABLA 3.6 Instrucciones con modo de direccionamiento indexado (No offset o 8 bits Offset).
ALFAOMEGA - FREESCALE
59
INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE
Indexado con desplazamiento de 8 bits La segunda subclase del modo de direccionamiento indexado denominada indexado con desplazamiento de 8 bits consiste en que la dirección efectiva es la suma del contenido del registro índice de 8 bits (X) y el byte de desplazamiento siguiente a la instrucción a ejecutar. Hay que tener en cuenta que el byte de desplazamiento suministrado en la instrucción es un número entero no signado de 8 bits. Una de las cosas que se deben tener en cuenta es que a pesar de contarse con la suma de dos registros de 8 bits cada uno, la sumatoria de ambas cantidades no debe superar 256, garantizando con ello que este modo de direccionamiento permita acceder a las primeras 256 posiciones de memoria (desde $0000 hasta $00FF) manteniendo la condición de página directa. La dirección que se tomará como punto de partida o de desplazamiento con relación al valor almacenado en el registro índice será la estipulada por el valor del byte de desplazamiento siguiente a la instrucción a ejecutar. A continuación se ilustra un ejemplo que explica con mayor detalle este modo especial de direccionamiento.
Ejemplo Supongamos que en la posición de memoria $85 se encuentra almacenado el valor $0F y se desea acceder a esta posición utilizando el modo de direccionamiento indexado con desplazamiento de 8 bits; entonces: LDX #$80 ; X = $80 o (80h) dirección a ser apuntada por el
registro X
LDA 5,X ; Carga el registro A con el valor almacenado en la dirección de memoria correspondiente a la suma del valor del registro índice X ($80) y el valor constante que acompaña la instrucción (5); en otras palabras, $80+5=$85, lo cual produce que el valor almacenado en la dirección $85 sea almacenado en el registro Acumulador, que para el ejemplo corresponde al valor $0F (0Fh). La anterior secuencia de instrucciones ilustra la forma de almacenar en el registro Acumulador (A) el valor almacenado en la dirección 85h, apuntada por el registro índice (X) y complementada por un valor de corrimiento constante.
Explicación La CPU lee la instrucción que permitirá almacenar un valor existente en una posición de memoria en particular en el registro acumulador (A), utilizando el modo de direccionamiento indexado con desplazamiento de 8 bits. la CPU construye la dirección completa a acceder sumando el valor constante que acompaña la instrucción (5), estableciéndose como punto de partida la $0005 con el contenido del registro índice de 8 bits (X), registro que actualmente, para el caso del ejemplo, presenta un valor almacenado de $80 (80h). La dirección resultante ($80+$5=$85) es colocada en el bus de direcciones y la CPU lee el valor del registro contenido en esa posición de memoria y lo carga en el registro acumulador (A).
Indexado con desplazamiento de 16 bits La tercera subclase del modo de direccionamiento indexado es la denominada indexado con desplazamiento de 16 bits; la dirección efectiva es la suma del contenido del registro índice de 8 bits y los dos bytes de ALFAOMEGA - FREESCALE
60
JUAN CARLOS VESGA FERREIRA
desplazamiento siguientes a la instrucción a ejecutar. Se debe tener en cuenta que el byte de desplazamiento suministrado en la instrucción es un número entero sin signo de 16 bits. En resumen, se puede decir que este modo especial de direccionamiento constituye una instrucción de tres bytes, uno para la instrucción a ejecutar y los otros dos bytes son para el desplazamiento. Una de las cosas que se deben tener en cuenta es que el hecho de contar con la suma de dos registros, uno de 8 bits y el otro de 16 bits, generará un resultado de 16 bits, provocando que se pueda acceder a posiciones de memoria en modo extendido. A continuación se ilustra un ejemplo que explica con mayor detalle este modo especial de direccionamiento.
Ejemplo Supongamos que en la posición de memoria $0315 se encuentra almacenado el valor $0F y se desea acceder a esta posición utilizando el modo de direccionamiento indexado con desplazamiento de 16 bits; entonces: LDX #$5
; X = $5 o (5h) dirección a ser apuntada por el registro X
LDA $0310,X ; Carga el registro A con el valor almacenado en la dirección de memoria correspondiente a la suma del valor del registro índice X ($5) y el valor constante de 16 bits que acompaña la instrucción ($0310); en otras palabras, $0310+$5=$0315, lo cual produce que el valor almacenado en la dirección $0315 sea almacenado en el registro Acumulador, que para el ejemplo corresponde al valor $0F (0Fh). La anterior secuencia de instrucciones ilustra la forma de almacenar en el registro Acumulador (A) el valor almacenado en la dirección 0315h, apuntada por el registro índice (X) y complementada por un valor de corrimiento constante de 16 bits.
Explicación La CPU lee la instrucción que permitirá almacenar un valor existente en una posición de memoria en particular en el registro acumulador (A), utilizando el modo de direccionamiento indexado con desplazamiento de 16 bits. La CPU construye la dirección completa a acceder sumando el valor constante que acompaña la instrucción ($0310), estableciéndose como punto de partida la $0310 con el contenido del registro índice de 8 bits (X), registro que actualmente, para el ejemplo, presenta un valor almacenado de $5 (5h). La dirección resultante ($0310+$5=$0315) es colocada en el bus de direcciones y la CPU lee el valor del registro contenido en esa posición de memoria y lo carga en el registro acumulador (A).
ALFAOMEGA - FREESCALE
61
INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE
Instrucción Suma con acarreo
Nemónico ADC
Suma sin acarreo
ADD
Función lógica AND
AND
Desplazamiento aritmético a la izquierda
ASL
Desplazamiento aritmético a la derecha
ASR
Comparar el acumulador con memoria
CMP
Comparar el registro Índice con memoria
CPX
Función OR exclusiva
EOR
Saltar
JMP
Saltar a subrutina
JSR
Cargar el acumulador desde memoria
LDA
Cargar el registro Índice desde memoria
LDX
Función OR
ORA
Rotar a la izquierda a través del carry
ROL
Rotar a la derecha a través del carry
ROR
Resta con acarreo
SBC
Asignar valor al acumulador
STA
Cargar el acumulador desde memoria
STX
Resta sin acarreo
SUB
TABLA 3.7 Instrucciones con modo de direccionamiento indexado (16 bits de Offset).
Modo de direccionamiento relativo Uno de los modos de direccionamiento especiales y que se considera de gran ayuda a la hora de programar microcontroladores es el llamado modo de direccionamiento relativo, el cual es usado solamente por las instrucciones de bifurcación (saltos condicionados). Se debe tener en cuenta que las instrucciones de bifurcación, a excepción de las bifurcaciones en su versión de manipulación de bits, generan dos bytes de código de máquina: el primer byte se utiliza para la instrucción y otro byte para el desplazamiento relativo. Como en muchos casos se desea que el salto o bifurcación sea en cualquier sentido (hacia arriba o hacia abajo), el byte de desplazamiento es un número que puede presentar bit de signo, oscilando en el rango entre -128 hasta +127 bytes (respecto a la dirección de la instrucción inmediata posterior a la instrucción de bifurcación). Si la condición de salto es verdadera, el contenido de los 8 bits del byte con signo siguiente al código de operación (desplazamiento) es sumado al contenido del contador de programa para formar la dirección de ALFAOMEGA - FREESCALE
62
JUAN CARLOS VESGA FERREIRA
bifurcación efectiva; de otro modo, el control continúa en la siguiente instrucción inmediata posterior a la instrucción de bifurcación. A continuación se ilustra un ejemplo para explicar con mayor detalle el modo de direccionamiento relativo.
Ejemplo LDA
#40T
; A = 40, Acumulador = 40
CMP
#30T
; Compara A con 30
BNE Salto1 ; Si no son iguales salta a la etiqueta “Salto1”, de lo contrario sigue en la siguiente línea; como en este caso no son iguales, se produce el salto.
Explicación La CPU lee la instrucción de saltar hacia la etiqueta “Salto1” en caso de que al efectuar el proceso de comparación el bit Z = 0. La CPU lee la dirección de memoria denominada en este caso $XX, en donde la dirección $XX es interpretada como el valor de desplazamiento relativo. Después de realizado este proceso, el contador de programa apunta al primer byte de la próxima instrucción a ejecutar. Si el bit Z =1, no se produce ninguna bifurcación o salto y el programa debe continuar con la próxima instrucción. De lo contrario, si el bit Z=0, la CPU generará la dirección completa sumando el desplazamiento con signo mencionado anteriormente ($XX) con el valor existente en el contador de programa para obtener la dirección destino de la bifurcación o salto, provocando que la ejecución del programa continúe desde otro punto del programa (Salto1). La tabla siguiente incluye una lista de todas las instrucciones que se pueden usar en el modo de direccionamiento relativo.
Instrucción
Nemónico
Saltar a la etiqueta si el bit de carry es 0
BCC
Saltar a la etiqueta si el bit de carry es 1
BCS
Saltar a la etiqueta si es igual (bit Z = 1)
BEQ
Saltar a la etiqueta si el bit de carry medio es 0 (H)
BHCC
Saltar a la etiqueta si el bit de carry medio es 1 (H)
BHCS
Saltar a la etiqueta si es mayor
BHI
Saltar si es mayor o igual
BHS
Saltar si el Pin IRQ está en alto
BIH
Saltar si el pin IRQ está en bajo
BIL
Saltar a la etiqueta si es menor
BLO
Saltar a la etiqueta si es menor o igual
BLS
Saltar si la bandera de interrupción está en 0
BMC
ALFAOMEGA - FREESCALE
63
INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE
Saltar si el resultado de una operación es negativo
BMI
Saltar si la bandera de interrupción está en 1 Saltar a la etiqueta si no es igual
BMS BNE
Saltar si el resultado de una operación es positivo
BPL
Saltar a la etiqueta siempre Saltar si el bit N del registro OPR está en 0 Nunca saltar
BRA BRCLR BRN
Saltar si el bit N del registro OPR está en 1
BRSET
Poner en 1 el bit N del registro OPR
BSET
Saltar a subrutina
BSR
TABLA 3.8 Instrucciones que se pueden usar en el modo de direccionamiento relativo.
DIRECCIONAMIENTO DE MEMORIA A MEMORIA: Se puede utilizar de cuatro formas diferentes:
1. EL MOVER DE Inmediato – Directo Ej: MOV #$30,$80 2. El MOVER DE Directo – Directo Ej: MOV $80,$90 3. El MOVER DE Directo – Indexado Ej: MOV $80,X+ 4. El MOVER DE Indexado – Directo Ej: MOV X+,$90
DIRECCIONAMIENTO CON STACK POINTER: Permite agregar a 8 o 16 bits con Offset. Ej: LDA $50,SP LDA $0150,SP
3.4
; STACK POINTER A 8 BITS ; STACK POINTER A 16 BITS
MEMORIA RAM
El microcontrolador posee 128 registros de propósito general en la memoria RAM, estos registros se utilizan para la adjudicación de variables necesarias dentro de un programa específico. Este espacio está definido desde la dirección $0080 hasta la $00FF. ALFAOMEGA - FREESCALE
64
JUAN CARLOS VESGA FERREIRA
3.5
SET DE INSTRUCCIONES
Las instrucciones son aquellas órdenes que se dan al microcontrolador para que realice una tarea específica. Como se puede observar, la programación de estos dispositivos se realiza en lenguaje Assembler, el cual tiene la ventaja de que efectúa tareas en forma muy rápida y el paso es casi directo al lenguaje comprendido por cualquier dispositivo electrónico; se trata del lenguaje binario, el cual está conformado por dos dígitos (1 y 0). Este microcontrolador permite también su programación mediante compiladores en lenguajes de alto nivel como el C, el cual se explicará en detalle en capítulos posteriores. Mientras tanto, iniciemos el camino hacia la programación de los microcontroladores Freescale. En el anexo de la página web del libro se explica en detalle cada una de las instrucciones que hacen parte de esta familia de microcontroladores describiendo su sintaxis, función y algunos ejemplos que harán fácil la comprensión y el uso de cada uno de ellos dentro de un programa, según sea el caso.
Nota
INSTRUCCIÓN ADC #OPR ADC OPR ADC OPR,X ADC ,X ADC OPR,SP ADD #OPR ADD OPR ADD OPR,X ADD ,X ADD OPR,SP AIS #OPR AIX #OPR
En la siguiente tabla se ha reunido todo el conjunto de instrucciones ordenadas de manera alfabética; con el fin de brindar al estudiante una guía fácil y didáctica a la hora de querer consultar alguna instrucción en especial, ilustrándose su sintaxis, función, número de ciclos y algunos detalles adicionales que la convierten en pieza clave a la hora de desarrollar aplicaciones basadas en microcontroladores Motorola Freescale.
OPERACIÓN SUMA CON CARRY A = A+(M)+C M = Dato o valor almacenado C = Carry SUMA SIN CARRY
No. CICLOS 2 3 3
2
SP=SP+DATO
4 2 3 3 2 4 2
H:X = H:X + DATO
2
A = A+(M) M = Dato o valor almacenado
ALFAOMEGA - FREESCALE
65
INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE
AND #OPR AND OPR AND OPR,X AND ,X AND OPR,SP ASL OPR ASLA ASLX ASL OPR,X ASL,X ASL OPR,SP ASR OPR ASRA ASRX ASR OPR,X ASR OPR,SP
FUNCION AND A = A&(M) M = Dato o valor almacenado Desplazamiento aritmético a la izquierda B7
C
B0
0
Desplazamiento aritmético a la derecha B7
B0
C
2 3 3 2 4 4 1 1 4 3 5 4 1 1 4 5
BCC Etiqueta
Saltar a la etiqueta si el bit de carry es 0
3
BCLR N,OPR
Borrar el bit N del registro OPR
4
BCS Etiqueta
Saltar a la etiqueta si el bit de carry es 1
3
BEQ Etiqueta
Saltar a la etiqueta si es igual (bit Z=1)
3
BGE OPR
Saltar si es igual o mayor que OPR
3
BGT OPR
Saltar si es mayor que OPR
3
BHCC Etiqueta
Saltar a la etiqueta si el bit de carry medio es 0 (H)
3
BHCS Etiqueta
Saltar a la etiqueta si el bit de carry medio es 1 (H)
3
BHI Etiqueta
Saltar a la etiqueta si es mayor
3
BHS Etiqueta
Saltar si es mayor o igual
3
BIH Etiqueta BIL Etiqueta BIT #OPR BIT OPR BIT OPR,X BIT ,X BIT OPR,SP BLE OPR
Saltar si el pin IRQ está en alto Saltar si el pin IRQ está en bajo
3 3 2 3 3 2 4 3
Probar bits A & (M) M = Dato o valor almacenado Saltar si es igual o menor que OPR
BLO ETIQ
Saltar a la etiqueta si es menor
3
BLS ETIQ
Saltar a la etiqueta si es menor o igual
3
BLT OPR
Saltar si es menor que
3
BMC ETIQ
Saltar si la bandera de interrupción está en 0
3
BMI ETIQ
Saltar si el resultado de una operación es negativo
3
BMS ETIQ
Saltar si la bandera de interrupción está en 1
3
BNE ETIQ
Saltar a la etiqueta si no es igual
3
ALFAOMEGA - FREESCALE
66
JUAN CARLOS VESGA FERREIRA
BPL ETIQ
Saltar si el resultado de una operación es positivo
3
BRA ETIQ
Saltar a la etiqueta siempre
3
BRCLR N,OPR,ETIQ
Saltar a la etiqueta si el bit N del registro OPR está en 0
5
BRN ETIQ
Nunca saltar
3
BRSET N,OPR,ETIQ
Saltar a la etiqueta si el bit N del registro OPR está en 1
5
BSET N,OPR
Poner en 1 el bit N del registro OPR
4
BSR ETIQ
Saltar a subrutina
4
Comparar el valor de A con el valor #OPR o el dato almacenado en OPR y saltar si son iguales a la etiqueta
5 4 4 5
CBEQ OPR,ETIQ CBEQA #OPR,ETIQ CBEQX #OPR,ETIQ CBEQ OPR,X+,ETIQ CBEQ OPR,SP,ETIQ
5
CLC
Borrar el bit de carry
1
CLI
Borrar el bit de interrupción o bandera de interrupción
2
CLR OPR CLRA CLRX CLRH CLR OPR,X CLR,X CLR OPR,SP CMP #OPR CMP OPR CMP OPR,X CMP ,X CMP OPR,SP COM OPR COMA COMX COM OPR,X COM ,X COM OPR,SP CPHX #OPR CPHX OPR CPX #OPR CPX OPR CPX ,X CPX OPR,X CPX OPR,SP DAA
Borrar
Comparar el valor de A con el valor #OPR o el dato almacenado en OPR
Complemento a uno
Comparar el valor de H:X con el valor #OPR o el dato almacenado en OPR Comparar el valor de X con el valor #OPR o el dato almacenado en OPR
Ajustar a decimal el registro A
3 1 1 1 3 2 4 2 3 3 2 4 4 1 1 4 3 5 3 4 2 3 3 2 4 2
ALFAOMEGA - FREESCALE
67
INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE
DBNZ OPR,ETIQ DBNZA ETIQ DBNZX ETIQ DBNZ OPR,X,ETIQ DBNZ X,ETIQ DBNZ OPR,SP,ETIQ DEC OPR DECA DECX DEC OPR,X DEC ,X DEC OPR,SP DIV EOR #OPR EOR OPR EOR OPR,X EOR ,X EOR OPR,SP INC OPR INCA INCX INC OPR,X INC ,X INC OPR,SP JMP OPR JMP OPR,X JMP ,X JSR OPR JSR OPR,X JSR ,X LDA #OPR LDA OPR LDA OPR,X LDA ,X LDA OPR,SP LDHX #OPR LDHX OPR LDX #OPR LDX OPR LDX OPR,X LDX ,X LDX OPR,SP LSL OPR LSLA LSLX LSL OPR,X LSL ,X LSL OPR,SP
ALFAOMEGA - FREESCALE
Decrementar y saltar si no es cero
Decrementar y saltar si no es cero
Dividir A=(H:A)/X (A = cociente, H = residuo) OR EXCLUSIVA A=A (M) M = Dato o valor almacenado
Incrementar
Saltar a la dirección OPR
Saltar a subrutina
Cargar en A el valor #OPR o el dato almacenado en OPR
Cargar en H:X el valor #OPR o el dato almacenado en OPR
Cargar en X el valor #OPR o el dato almacenado en OPR
Desplazamiento lógica a la izquierda (igual que ASL)
5 3 3 5 4 5 4 1 1 4 3 5 7 2 3 3 2 4 4 1 1 4 3 5 2 3 2 4 5 4 2 3 3 2 4 3 4 2 3 3 2 4 4 1 1 4 3 5
68
JUAN CARLOS VESGA FERREIRA
LSR OPR LSRA LSRX LSR OPR,X LSR ,X LSR OPR,SP MOV OPR,OPR MOV OPR,X+ MOV #OPR,OPR MOV X+,OPR MUL NEG OPR NEGA NEGX NEG OPR,X NEG ,X NEG OPR,SP
Desplazamiento lógica a la derecha 0
C
B0
B7
Mover fuente, destino
4 1 1 4 3 5 5 4 4 4
5
Multiplicación sin signo (X:A = X* A)
4 1 1 4 3 5
Complemento a Dos
NOP
No operación
1
NSA
Intercambiar nibles de A (A=(A[3:0]:A[7:4]))
3
ORA #OPR ORA OPR ORA OPR,X ORA ,X ORA OPR,SP PSHA
A = A | (M) M = Dato o valor almacenado Insertar A en el stack
2 3 3 2 4 2
PSHH
Insertar H en el stack
2
PSHX
Insertar X en el stack
2
PULA
Sacar A del stack
2
PULH
Sacar H del stack
2
PULX ROL OPR ROLA ROLX ROL OPR,X ROL ,X ROL OPR,SP ROR OPR RORA RORX ROR OPR,X ROR ,X ROR OPR,SP
Sacar X del stack
2 4 1 1 4 3 5 4 1 1 4 3 5
FUNCION OR
Rotar a la izquierda a través del carry B0
B7
C
Rotar a la derecha a través del carry B7
B0
C
ALFAOMEGA - FREESCALE
69
INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE
RSP
Reset al Stack Pointer
1
RTI
Retornar de una interrupción
7
RTS SBC #OPR SBC OPR SBC OPR,X SBC ,X SBC OPR,SP
Retornar de una subrutina
A = A - (M) – C M = Dato o valor almacenado
4 2 3 3 2 4
SEC
Colocar el bit de carry en 1
1
SEI
Colocar el bit de interrupción en 1
STA OPR STA OPR,X STA ,X STA OPR,SP STHX OPR
Asignar A en el registro OPR M=A M = Dato o valor almacenado en dirección OPR Asignar H:X en el registro OPR
3 4 2 4 4
STOP
Habilitar el pin IRQ, detener el oscilador
1
STX OPR STX OPR,X STX ,X STX OPR,SP SUB #OPR SUB OPR SUB OPR,X SUB ,X SUB OPR,SP SWI
RESTA CON CARRY
I=1
Asignar X en el registro OPR
2
3 4 2 4
A = A - (M) M = Dato o valor almacenado Interrupción por software
2 3 3 2 4 9
TAP
Transferir A al CCR , CCR = A
2
TAX
Transferir A a X
1
TPA TST OPR TSTA TSTX TST OPR,X TST ,X TST OPR,SP
Transferir CCR a A ; A = CCR
Probar si la cantidad es negativa o cero
1 3 1 1 3 2 4
TSX
Transferir SP a H:X , H:X = SP + 1
2
TXA
Transferir X a A
TXS
Transferir H:X a SP , SP = H:X – 1
TABLA 3.9 Conjunto de instrucciones. ALFAOMEGA - FREESCALE
RESTAR
,X=A
,A=X
1 2
70
JUAN CARLOS VESGA FERREIRA
EJERCICIOS PROPUESTOS Escribir una rutina que permita leer dos números y efectuar las siguientes funciones: a. Sumarlos b. Restarlos c. Multiplicarlos d. Dividirlos Las respuestas correspondientes se deben almacenar en las direcciones $80, $81, $82, $83, respectivamente. Diseñar un programa que permita sumar los números del 1 al 100 y calcular su promedio. Escribir una rutina que permita leer dos números y efectuar las siguientes funciones: a. AND b. OR c. XOR d. Complementarlos a 1 el primero y a 2 el segundo, y las respuestas correspondientes se deben almacenar en las direcciones $80, $81, $82, $83, respectivamente.
NOTA Se recomienda, para resolver estos ejercicios, el uso del CodeWarrior o el WINIDE con el fin de codificar y depurar paso a paso cada uno de los programas, verificando su funcionamiento. Ver Anexo A.
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LA PROGRAMACIÓN DE LOS MICROCONTROLADORES MOTOROLA-FREESCALE
71
RESUMEN DEL CAPÍTULO CAPÍTULO Existen unos registros que se encuentran constantemente interactuando con el microcontrolador, efectuando tareas dependiendo de las instrucciones que se vayan realizando. Uno de los detalles a tener en cuenta es que a pesar de que estos registros hacen parte constante de la programación de microcontroladores, son registros propios e internos de la CPU y por tal razón no se encuentran mapeados en la memoria. Estos registros son: acumulador (A), registro índice (H:X), pila (SP), contador de programa (PC) registro de banderas (CCR). En todo proceso de programación se requiere realizar constantemente operaciones, asignación de valores a registros y extraer valores existentes en otros registros para transferirlos y/o procesarlos con otros datos; este proceso de extracción y adjudicación se conoce como direccionamiento. Los microcontroladores Freescale usan seis modos de direccionamiento: inherente, inmediato, extendido, directo, indexado y relativo. Las instrucciones son aquellas órdenes que se le dan al microcontrolador para que realice una tarea específica. Como se puede observar, la programación de estos dispositivos se puede realizar en lenguaje Assembler o en lenguaje C.
ALFAOMEGA - FREESCALE
Capítulo
4
PUERTOS DE ENTRADA/SALIDA OBJETIVO DEL CAPÍTULO
A
l finalizar el capítulo el estudiante tendrá conocimiento sobre ¿qué es un puerto del microcontrolador?, ¿cuántos puertos hay según la referencia del microcontrolador a utilizar?, ¿qué recursos adicionales brindan al estudiante aparte de configurarse como simple terminales de entrada/ salida lógicos?, ¿cómo configurarlos según los requerimientos del estudiante? y finalmente, ¿cómo interactuar con ellos en un momento dado?
CONOCIMIENTOS PREVIOS Para iniciar el estudio del presente capítulo es necesario que el lector posea conocimientos sobre las características básicas de la familia de microcontroladores HC08 en estudio y conceptos básicos de lógica digital, con el fin de que pueda comprender el comportamiento y configuración de los puertos o periféricos presentes en esta familia de microcontroladores
4.1 INTRODUCCIÓN Los puertos del microcontrolador son el punto de comunicación entre el microcontrolador y el mundo exterior; a través de ellos se puede efectuar procesos de control electrónico sobre dispositivos de potencia, instrumentación, telemetría, etc. Además, permiten también recibir señales del mundo exterior como, por ejemplo, señales provenientes de transductores, amplificadores, transmisores, actuadores, etc. En otras palabras, los puertos del microcontrolador se pueden ver como los brazos con los que interactúa el microcontrolador con otros sistemas electrónicos. En el microcontrolador, 23 pines pueden ser configurados de manera bidireccional (I/O) a través de tres puertos paralelos. Todos los pines pueden ser configurados como entrada o salida.
74
JUAN CARLOS VESGA FERREIRA
Se debe tener en cuenta que en la gran mayoría de familias de microcontroladores los puertos de entrada/ salida no solamente cumplen funciones de envío y recepción de señales digitales, sino que además comparten recursos internos con el microcontrolador; es decir, que si por un pin en especial se pueden manipular datos digitales (“1” y “0”), según la estructura interna, tambien podría cumplir, por ejemplo, funciones de conversión A/D o funciones de PWM, o funciones de compración analógica, entre otras funciones adicionales propias de cada familia de microcontroladores a utilizar. Estos módulos alternos o compartidos presentes en el microcontrolador se pueden conocer para cualquier familia de microcontroladores en el manual de referencia propio de cada uno; para el caso del JK1/JK3/JL3, se puede observar en el capítulo 2 del presente libro.
NOTA
Antes de comenzar con la descripción de cada uno de los puertos existentes en la familia JK1/JK3/JL3, se recomienda el montaje del siguiente circuito, el cual no solamente le ayudará a la verificación de los ejercicios resueltos sino que además podrá servirle de guía para desarrollar otros programas sencillos y visualizar posibles resultados que al procesarse internamente en el microcontrolador sería imposible visualizarlos a simple vista, pero con la ayuda de este circuito podrá visualizar el resultado, por ejemplo, de una operación matemática, lógica o el resultado de algún proceso en particular, gracias al banco de LEDS presentes en el esquema.
A continuación se ilustra cada uno de los registros correspondientes al uso y configuración de cada uno de los puertos existentes en esta familia especial de microcontroladores.
4.2
REGISTRO PORT A (PTA)
Dirección $0000 Bit 7 Leer Escribir
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
PTA 6
PTA 5
PTA 4
PTA 3
PTA 2
PTA 1
PTA 0
0
Este registro posee sus 8 bits, de los cuales sólo 7 pueden ser configurados como pines de entrada o salida de manera independiente a través del registro DDRA. Además de permitir manejar independientemente las salidas de cada uno de sus bits, tiene la función especial de interrupción por teclado, efectuándose esta configuración mediante el registro KBI, lo cual se explicará en detalle más adelante. Una de las principales características de este puerto es que cada pin del puerto A posee configuración por software de las resistencias de Pull-Up a través del registro PTAPUE. Estas resistencias tienen un valor de 30 k. ALFAOMEGA - FREESCALE
75
PUERTOS DE ENTRADA/SALIDA
5V
1K
20
20pF
3 4MHz
+
10M
20pF
4
1
PTB0
RST
PTB1 OSC1 PTB2 OSC2/PTA6
IRQ1
PTB3 PTB4 PTB5
5V
+ 5
2
VDD
VSS
PTB6 PTB7
PTD2 PTD3 PTD4 PTD5 PTD6 PTD7
15 14
220 220
13
220
12
220
11
220
8
220
7
220
6
17
220
+
16
5V
10K
19 18
SW1
+
10 9
FIGURA 4.1 Circuito recomendado para la verificación de rutinas, ejemplos resueltos y propuestos.
Una resistencia de Pull-Up consiste en una resistencia que se encuentra conectada internamente entre un pin en particular del puerto A y el terminal positivo de alimentación o VDD, que en nuestro caso sería +5 V.
ALFAOMEGA - FREESCALE
76
JUAN CARLOS VESGA FERREIRA
Para comprender mucho mejor este concepto, supongamos que se desea conocer cómo estaría conectada la resistencia del Pull-Up presente en el Pin 0 del puerto A (PTA0). En la gráfica siguiente se ilustra este concepto con gran detalle.
VDD (+5V)
30k
Resistencia de Pull-Up
PIN PTA0
Microcontrolador
FIGURA 4.2 Conexión interna de una resistencia de Pull-Up a través del pin PTA0.
4.3
REGISTRO DE CONFIGURACIÓN DEL PORT A (DDRA)
Dirección $0004 Bit 7 Leer Escribir
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
DDRA 6
DDRA 5
DDRA 4
DDRA 3
DDRA 2
DDRA 1
DDRA 0
0
ALFAOMEGA - FREESCALE
77
PUERTOS DE ENTRADA/SALIDA
Mediante este registro de 8 bits, de los cuales sólo se puede acceder a 7 bits, se efectúa la configuración de los bits del registro PORT A, ya sea como entradas o como salidas. Tal como se mencionó en el capítulo 2, el registro PORTA permite visualizar el estado actual de los diferentes niveles presentes en el puerto; sin embargo, el registro DDRA sería el encargado de realizar la configuración del puerto A, en donde se establece inicialmente qué pines se configurarán para recibir señales de fuentes externas y qué pines funcionarán como salidas del microcontrolador hacia el mundo real. A continuación se describe qué valores deben establecerse en el registro DDRA para configurar un pin como entrada o como salida.
DDRA[6:0]: bits de configuración del PORT A 1: El pin correspondiente del PORT A es configurado como salida 0: El pin correspondiente del PORT A es configurado como entrada
4.4
REGISTRO PTAPUE
Dirección $000D Bit 7
Bit 6
Bit 5
Bit 4
PTA6EN
PTAPUE6
PTAPUE5
PTAPUE4
Bit 3
Bit 2
Bit 1
Bit 0
Leer Escribir
PTAPUE3 PTAPUE2 PTAPUE1 PTAPUE0
Este registro es el que permite habilitar o deshabilitar las resistencias de Pull-Up para cada uno de los pines del puerto A. Se debe tener en cuenta que cuando se habilitan las resistencias de Pull-Up, estas resistencias serán válidas solamente cuando el pin correspondiente es configurado como entrada y dinámicamente deshabilitado cuando este pin es configurado como salida. A continuación se explica en detalle el significado de cada bit perteneciente al registro PTAPUE y la función que desempeña cada uno.
PTA6EN: Habilitar el pin PTA6 como OSC2. La función del OSC2 se configura cuando se escoge la opción de oscilador RC. 1: El OSC2 es configurado para utilizar el pin PTA6 como un pin de I/O, con las funciones de interrupción y configuración de resistencias de Pull-Up. 0: El OSC2 es configurado como oscilador de tipo RC.
PTAPUE[6:0]: Habilitación de resistencias de Pull-Up 1: Habilita las resistencia de Pull-Up correspondiente al pin del puerto A, siempre y cuando este pin esté configurado como entrada. 0: Deshabilita la resistencia de Pull-Up correspondiente al pin del puerto A.
ALFAOMEGA - FREESCALE
78
JUAN CARLOS VESGA FERREIRA
Ejemplo Supongamos que se desea configurar en el puerto A los 4 bits de menos peso como entradas y los 4 pines de más peso como salidas; adicionalmente, habilitar las resistencias de Pull-Up para los 4 pines configurados como entrada en el puerto A.
Solución MOV #$F0,DDRA MOV #$8F,PTAPUE
Explicación En la primera instrucción se almacenó en el registro DDRA el valor $F0 (F0h) que corresponde al valor 11110000 expresado en binario, provocando con ello que los bits en donde se encuentran con valor “0” sean configurados como entrada y los bits donde se encuentran “1” sean configurados como salida. En la segunda instrucción se almacenó en el registro PTAPUE el valor $8F (8Fh) que corresponde al valor 10001111 expresado en binario, provocando con ello que los bits en donde se encuetran con valor “0” se deshabilite el uso de resistencias de Pull-Up y los bits donde se encuentran “1” sean habilitadas; sin embargo, en el bit 7 del registro PTAPUE se estableció el valor “1”, el cual en este caso no corresponde a la habilitación de una resistencia de Pull-Up, sino habilitando la opción de ser utilizado este pin como pin de I/O y no como entrada para un oscilador de tipo RC.
Con las intrucciones anteriores se da solución al problema, configurando como primera medida los 4 bits de menos peso del puerto A como entradas y los 4 bits de más peso como salidas; además se habilitó internamente el uso de 4 resistencias de Pull-Up en los pines correspondientes a los 4 bits de menos peso del puerto A.
4.5
REGISTRO PORT B (PTB)
Dirección $0001 Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
PTB7
PTB6
PTB5
PTB4
PTB3
PTB2
PTB1
PTB0
Leer Escribir
ALFAOMEGA - FREESCALE
79
PUERTOS DE ENTRADA/SALIDA
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADC7
ADC6
ADC5
ADC4
ADC3
ADC2
ADC1
ADC0
El registro PORTB permite la manipulación de señales digitales entre sus terminales, tal como ocurre con el registro PORTA; sin embargo, este puerto comparte adicionalmente recursos con el módulo de conversión analógico-digital incluido internamente en el microcontrolador, en donde cada pin del puerto correspondería a un canal de conversión A/D. Cada uno de estos pines puede ser configurado como entrada o como salida de manera independiente a través del registro DDRB.
4.6
REGISTRO DE CONFIGURACIÓN DEL PORT B (DDRB)
Dirección $0005 Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
DDRB7
DDRB6
DDRB5
DDRB4
DDRB3
DDRB2
DDRB1
DDRB0
Leer Escribir
Mediante este registro de 8 bits se efectúa la configuración de los bits del registro PORT B, ya sea como entradas o salidas, tal como ocurría con el registro de configuración DDRA.
DDRB[7:0]: bits de configuración del PORT B
4.7
1:
El pin correspondiente del PORT B es configurado como salida.
0:
El pin correspondiente del PORT B es configurado como entrada.
REGISTRO PORT D (PTD)
Dirección $0003 Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
PTD7
PTD6
PTD5
PTD4
PTD3
PTD2
PTD1
PTD0
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Función 1
LED
LED
TCH1
TCH0
LED
LED
Función 2
25MA
25MA
ADC8
ADC9
Leer Escribir
ALFAOMEGA - FREESCALE
Bit 1
Bit 0
ADC10
ADC11
80
JUAN CARLOS VESGA FERREIRA
El registro PORTD posee dos pines destinados para uso del módulo TIM, 4 pines destinados para canales de conversión A/D (los módulos TIM y ADC serán tratados en capítulos posteriores) y dos pines (PTD6 y PTD7) que poseen drivers de corriente superior a 25 mA y resistencias de Pull-Up programables de 5 k. Cada uno de estos pines puede ser configurado como entrada o como salida de manera independiente a través del registro DDRD.
4.8
REGISTRO DE CONFIGURACIÓN DEL PORT D (DDRD)
Dirección $0007 Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
DDRD7
DDRD6
DDRD5
DDRD4
DDRD3
DDRD2
DDRD1
DDRD0
Leer Escribir
Mediante este registro de 8 bits se efectúa la configuración de los bits del registro PORT D, ya sea como entradas o como salidas.
DDRD[7:0]: bits de configuración del PORT D
4.9
1:
El pin correspondiente del PORT D es configurado como salida.
0:
El pin correspondiente del PORT D es configurado como entrada.
REGISTRO DE CONTROL DEL PORT D (PDCR)
Dirección $000A
Leer Escribir
Bit 7
Bit 6
Bit 5
Bit 4
0
0
0
0
Bit 3
Bit 2
Bit 1
Bit 0
SLOWD7
SLOWD6
PTDPU7
PTDPU6
Este registro cumple funciones muy semejantes a las del registro PTAPUE explicado anteriormente, permitiendo habilitar y deshabilitar las resistencias de Pull-Up, y manejo del driver de corriente para los pines PTD7 y PTD6. A continuación se explica el modo de configuración de este registro y las funciones que realiza según los valores establecidos en cada uno de sus bits.
SLOWDx: los bits SLOWD6 Y SLOWD7 permiten habilitar drenador abierto y driver de corriente. ALFAOMEGA - FREESCALE
81
PUERTOS DE ENTRADA/SALIDA
1:
El pin está configurado como salida con drenador abierto.
0:
El pin está configurado con Push-Pull.
PTDPUx: bits para habilitar resistencias de Pull-Up 1:
Habilitar resistencia de Pull-Up de 5 k
0:
Deshabilitar resistencia de Pull-Up de 5 k
4.10
velocidad establecida. EJERCICIOS RESUELTOS Teniendo en cuenta
lo anterior resolvamos nuevamente el ejercicio, con la de incluir Antes de aventurarnos en el mundo de diferencia la programación de los microcontroladores Freescale, es necesario un retardo que permita la visualización conocer algunos conceptos especiales que le ayudarán al desarrollador a generar fácilmente cualquier de loesocurrido enestablecer el procesouna estructura de programación, la cual será programa que desee.más Por clara tal motivo necesario utilizada en todos los programas que se desarrollen en adelante. Esta estructura servirá de plantilla o molde para la codificación de cualquier programa de microcontroladores que se requiera. Inclusión de librerías especiales para configuración de bits, registros y demás propios de la referencia de microcontrolador a programar. Inclusión de librerías especiales que incluyan subrutinas requeridas en un proceso en particular. $INCLUDE ‘JL3REGS.INC’ Etiquetas de dirección en el microcontrolador FLASH EQU
$EC00
RESET EQU
$FFFE
RAM
$80
EQU
COPD EQU
0
Definición de los bits que se utilizarán en el microcontrolador para manejar funciones especiales, por ejemplo: encender un Led, habilitar dispositivo, etc. Para el caso, supongamos que se desea que el Led1 sea controlado por el pin 1 y la habilitación de un relevo por el pin 2 de un puerto cualquiera.
ALFAOMEGA - FREESCALE
LED1
EQU
1
H_RELEVO
EQU
2
82
JUAN CARLOS VESGA FERREIRA
Definición de registros a utilizar en la RAM; en esta sección se establecen todas las variables y registros definidos por el desarrollador. Para el caso, supongamos que se desea crear dos variables: Cantidad1 y Cantidad2. ORG
RAM
CANTIDAD1
RMB
1
CANTIDAD2
RMB
1
Definición de la dirección a partir de la cual se debe escribir el programa, dirección correspondiente a la memoria Flash. ORG FLASH En esta sección del programa se pueden establecer vectores o tablas que se desee trabajar en la aplicación a desarrollar. A continuación se ilustra 2 tablas; la primera hace referencia a un mensaje o cadena de caracteres y la segunda a un vector con cantidades hexadecimales. TABLA FDB ‘PRUEBA DE PANTALLA’ TABLA1
DB
$0F,$F0,$AA,$55
Sección de inicio del programa principal INICIO BSET
COPD,CONFIG1
; Deshabilita el COP
Sección para configuración de registros especiales, configuración de puertos como entradas/salidas, establecer valores iniciales en cada uno de los terminales del microcontrolador, etc. MOV
#$00,PORTB
MOV
#$FF,DDRB
MOV
#00,PORTD
MOV
#$FF,DDRD
; Configuración de puertos B y D
Sección para escritura del cuerpo del programa ......... ........... ................... ............................ Sección para establecer rutas hacia subrutinas relacionadas con interrupciones, inicialización del sistema y reset ORG
RESET
DW
INICIO
ALFAOMEGA - FREESCALE
83
PUERTOS DE ENTRADA/SALIDA
Ejercicio 1 Enunciado del problema Se desea escribir un programa que permita encender o apagar un LED según el estado de un interruptor. Si el interruptor se encuentra abierto, el LED deberá encender pero si el interruptor se encuentra cerrado, el LED deberá apagarse.
Solución Utilizando el circuito propuesto inicialmente para el microcontrolador MC68HC908JK3, la solución del ejemplo sería la siguiente: 5V
1K
20
20pF
3 4MHz
+
10M
20pF
4
1
PTB0
RST
PTB1 OSC1 PTB2 OSC2/PTA6
IRQ1
PTB3 PTB4 PTB5
5V
+ 5
2
VDD
VSS
PTB6 PTB7
PTD2 PTD3 PTD4 PTD5 PTD6 PTD7
FIGURA 4.3 ALFAOMEGA - FREESCALE
15 14
220 220
13
220
12
220
11
220
8
220
7
220
6
17 16
220
+
5V
10K
19 18
SW1
+
10 9
Circuito propuesto, utilizado para el encendido y apagado del LED conectado al pin PTB0 según el estado del interruptor SW1.
84
JUAN CARLOS VESGA FERREIRA
El programa que obedece a este ejercicio es el siguiente: $ Include ‘jl3regs.inc’ FLASH
EQU
$ECE0
RESET
EQU
$FFFE
LED
EQU
1
SW EQU 2 ;Bit 2 Puerto D Capítulo 5 COPD EQU 0 MANEJO BÁSICA ORGDEL TEMPORIZACIÓN FLASH INICIO BSET Objetivo del capítulo BSET
COPD,CONFIG1
;Inhabilita el COPD
LED,PORTB ;BIT 1 PORTB = 1 Al finalizar el capítulo estudiante estará familiarizado con conceptos clave a la hora BSET el LED,DDRB ;BIT 1 Salida de diseñar aplicaciones basadas en microcontroladores, que requieran BCLR SW,PORTD ;BIT 2 PORTD = 0 el uso de retardos y temporizaciones básicas, mediante conocimientos básicos del circuito oscilador y el tiempo BCLR SW,DDRD ;BIT 2 Entrada de ejecución de una instrucción. SALTO BRSET SW,PORTB,LED_ON ;SW abierto?, Ir a LED_ON BRCLR SW,PORTB,LED_OFF ;SW abierto?, Ir a LED_OFF 5.1 INTRODUCCIÓN BRA un SALTO a SALTO Muchas veces se requiere retardo en diferentes;Iraplicaciones, por ejemplo: en el capítulo
anterior se expuso un ejercicio de rotación del encendido de un LED, pero, debido a la gran LED_ON BSET LED,PORTB ;Encender Led velocidad de ejecución, se daba la sensación de que los LEDS siempre estuvieran encendidos, BRAcierto SALTO lo cual en realidad no era ya que sólo uno de ellos estaba encendido y, por características propias del ojo humano, al no poder responder a velocidades de conmutación tan altas se LED_OFF BCLR LED,PORTB ;Apagar Led producía esa sensación de encendído constante. BRA SALTO Si se hubiera contado con una rutina que generara un retardo correspondiente a un tiempo cercano o igual al segundo, resultado de rotación sería excelente y fácil de apreciar a la ORG el RESET ;Cuando se Energiza DW
INICIO
;Ir a rutina INICIO
Ejercicio 2 Enunciado del problema Analicemos un segundo ejercicio en el cual se desea que dependiendo del valor de un interruptor, el encendido de un LED sea rotado de derecha a izquierda cuando el interruptor esté abierto y sea rotado de izquierda a derecha cuando el interruptor esté cerrado.
Solución Utilizando el mismo circuito del ejemplo anterior, el programa que obedece a este ejercicio es el siguiente:
ALFAOMEGA - FREESCALE
85
PUERTOS DE ENTRADA/SALIDA
$ Include ‘jl3regs.inc’ FLASH RESET LED SW COPD INICIO
SALTO
EQU EQU EQU EQU EQU
$ECE0 $FFFE 0 2 0
ORG FLASH BSET COPD,CONFIG1 BSET LED,PORTB MOV #$FF,DDRB BCLR SW,PORTD BCLR SW,DDRD BRSET SW,PORTD,ROT_IZQ BRCLR SW,PORTB,ROT_DER BRA SALTO
;Inhabilita el COPD ;BIT 0 PORTB = 1 ;Puerto B Salida ;BIT 2 PORTD = 0 ;BIT 2 Entrada ;SW abierto?, Ir a ROT_IZQ ;SW abierto?, Ir a ROT_DER ;Ir a SALTO
ROT_IZQ
ROL BRA
PORTB SALTO
;Rotar a Izquierda
ROT_DER
ROR BRA
PORTB SALTO
;Rotar a Derecha
ORG
RESET
;Cuando se Energiza
DW
INICIO
;Ir a rutina INICIO
Ejercicio 3 Enunciado del problema Analicemos un tercer ejercicio. Uno de los desafíos presentes a la hora de realizar un programa en lenguaje ensamblador es el uso de bucles o rutinas repetitivas. Resolvamos ahora uno de los programas propuestos anteriormente, realizando la multiplicación de dos números con la restricción de no utilizar la instrucción MUL.
Solución Según los conceptos básicos sobre aritmética, una multiplicación consiste en una suma sucesiva de una cantidad A (multiplicando), tantas veces como lo indique una cantidad B (multiplicador) y el resultado de esta suma sucesiva será el resultado de la multiplicación (producto).
Ejemplo: Si se desea multiplicar 8 por 3, el valor resultante consistirá en sumar sucesivamente la cantidad A (8) tantas veces como lo indique la cantidad B (3). Por tanto: Producto = 8 + 8 + 8 = 24 ALFAOMEGA - FREESCALE
86
JUAN CARLOS VESGA FERREIRA
Utilizando el mismo circuito del ejemplo anterior, se visualizará el resultado de multiplicar dos cantidades, y para facilitar el ejercicio circuitalmente se establecerán las dos cantidades a multiplicar directamente desde el programa, visualizando el resultado de la multiplicación en el puerto B. El programa que obedece a este ejercicio es el siguiente: $ Include ‘jl3regs.inc’ FLASH EQU RESET EQU RAM EQU COPD EQU
$ECE0 $FFFE $80 0
ORG CANT_A CANT_B MULTIPLI INICIO
RAM RMB RMB RMB
1 1 1
ORG BSET CLR MOV
FLASH COPD,CONFIG1 PORTB #$FF,DDRB
;Inhabilita el COPD ;PORTB = 00h ;Puerto B Salida
CLR
DDRD
;Puerto D Entrada
En este caso se realizará la multiplicación de 10 * 3, donde CANT_A = 10 y CANT_B=3 OTRO
MOV
#10T,CANT_A
;CANT_A=10
MOV
#3T,CANT_B
;CANT_B=3
CLR
MULTIPLI
;MULTIPLI=0
Rutina de multiplicación de CANT_A*CANT_B SALTO
LDA
MULTIPLI
; A = MULTIPLI , A=0
ADD
CANT_A
; A = A + CANT_A
DBNZ CANT_B,SALTO
;Mientras CANT_B≠0, salta
STA
MULTIPLI
;MULTIPLI=CANT_A*CANT_B
STA
PORTB
;PORTB=MULTIPLI,
BRA
OTRO
;Visualizando el resultado
La rutina decrementa CANT_B y salta si no es cero, realizando en este caso el salto tantas veces como lo indique CANT_B, lo cual se representa en realizar CANT_B veces la suma sucesiva de CANT_A, quedando finalmente el resultado de la multiplicación en el registro MULTIPLI.
ALFAOMEGA - FREESCALE
87
PUERTOS DE ENTRADA/SALIDA
ORG
RESET
;Cuando se Energiza
DW
INICIO
;Ir a rutina INICIO
Uno de los detalles más importantes a la hora de utilizar los puertos de un microcontrolador es conocer su valor en el momento posterior a la ocurrencia de un RESET. El reset se utiliza para forzar al microcontrolador a ir a un punto de partida o dirección conocida. Cuando ocurre un reset, los sistemas periféricos como los puertos, los bits de control y los bits de estado son también forzados a un estado conocido como resultado de un reset. Como resultado de cualquier reset en el microcontrolador, ocurren las siguientes acciones internas: Todos los registros referentes a puertos se colocan en cero en condición de entradas. El puntero de la pila (SP) es forzado a $00FF. El bit I del CCR toma el valor “1” lógico, deshabilitando las interrupciones enmascarables. El latch de interrupciones externas es borrado. El latch de STOP es borrado. El latch de WAIT es borrado. Cuando ocurre un reset en el microcontrolador, el contador de programa (PC) comienza a buscar la dirección más alta. Esta operación se denomina “búsqueda del vector de reset”, que al alcanzarla, la CPU del microcontrolador iniciará la búsqueda y ejecución de instrucciones, comenzando por la dirección almacenada en el vector de reset. Pero surge una pregunta: ¿cúando se puede producir un reset en un microcontrolador? Se puede producir externamente, cuando es aplicado un “0” lógico en el pin / RESET. Al encender la fuente de alimentación, energizando el microcontrolador (power on reset). Cuando ocurre un rebosamiento del valor presente en el Watch Dog o perro guardián. Cuando se desea ejecutar una instrucción desde una dirección ilegal. Al detectarse una transición positiva sobre VDD.
ALFAOMEGA - FREESCALE
88
JUAN CARLOS VESGA FERREIRA
EJERCICIOS PROPUESTOS Escribir un programa que permita efectuar la división de un número en potencias de 2. Escribir un programa que permita efectuar la multiplicación de un número en potencias de 2. Escribir un programa que lea un número por los cuatro bits de menos peso del puerto B y muestre el correspondiente código de esta cantidad en Exceso 3, por los cuatro bits de más peso del puerto B y utilice el bit PTD2 como el quinto bit para representar esta cantidad. Escribir un programa que lea dos números utilizando los cuatro bits de menos peso para un número (A), y los cuatro bits de más peso para el otro número (B). Estos números se deben comparar e indicar según corresponda: Si A > B , entonces PTD2 = 1, PTD3 = 0, PTD4 = 0 Si A = B , entonces PTD2 = 0, PTD3 = 1, PTD4 = 0 Si A < B , entonces PTD2 = 0, PTD3 = 0, PTD4 = 1 Diseñar un programa que permita manejar una pantalla de cristal líquido, configurada a 4 bits enviando secuencialmente mensajes en forma aleatoria y desplazando el contenido del mensaje de derecha a izquierda.
RESUMEN DEL CAPÍTULO CAPÍTULO Uno de los componentes más importantes de un microcontrolador son sus periféricos. Los puertos del microcontrolador son el punto de comunicación entre el microcontrolador y el mundo exterior, a través de ellos se pueden efectuar procesos de control electrónico sobre dispositivos de potencia, instrumentación, telemetría, etc. Además permiten recibir señales del mundo exterior como, por ejemplo, señales provenientes de transductores, amplificadores, transmisores, actuadores, etc. En otras palabras, los puertos del microcontrolador se pueden considerar como los brazos con los que interactúa el microcontrolador con otros sistemas electrónicos cumpliendo funciones de conversión A/D o funciones de PWM, o funciones de comparación analógica, entre otras funciones adicionales propias de cada familia de microcontroladores a utilizar.
ALFAOMEGA - FREESCALE
Capítulo
5
MANEJO DE TEMPORIZACIÓN BÁSICA OBJETIVO DEL CAPÍTULO Al finalizar el capítulo el estudiante estará familiarizado con conceptos clave a la hora de diseñar aplicaciones basadas en microcontroladores que requieran el uso de retardos y temporizaciones básicas, mediante conocimientos básicos del circuito oscilador y el tiempo de ejecución de una instrucción.
CONOCIMIENTOS PREVIOS Para iniciar el estudio del presente capítulo es necesario que el lector posea un conocimiento básico del conjunto de instrucciones propias de esta familia de microcontroladores y adicionalmente conocimientos básicos de circuitos digitales, con el fin de que pueda comprender el concepto de temporización y su uso dentro del desarrollo de aplicaciones.
5.1 INTRODUCCIÓN Muchas veces se requiere un retardo en diferentes aplicaciones, por ejemplo: en el capítulo anterior se expuso un ejercicio de rotación del encendido de un LED, pero, debido a la gran velocidad de ejecución, se daba la sensación de que los LEDS siempre estuvieran encendidos, lo cual en realidad no era cierto ya que sólo uno de ellos estaba encendido y, por características propias del ojo humano, al no poder responder a velocidades de conmutación tan altas se producía esa sensación de encendido constante.
90
JUAN CARLOS VESGA FERREIRA
Si se hubiera contado con una rutina que generara un retardo correspondiente a un tiempo cercano o igual al segundo, el resultado de rotación sería excelente y fácil de apreciar a la velocidad establecida. Teniendo en cuenta lo anterior resolvamos nuevamente el ejercicio, con la diferencia de incluir un retardo que permita la visualización más clara de lo ocurrido en el proceso de rotación del encendido de un LED. 5V
1K
20
20pF
3 4MHz
+
10M
20pF
4
1
PTB0
RST
PTB1 OSC1 PTB2 OSC2/PTA6
IRQ1
PTB3 PTB4 PTB5
5V
+ 5
2
VDD
VSS
PTB6 PTB7
PTD2 PTD3 PTD4 PTD5 PTD6 PTD7
FIGURA 5.1
15 14
220 220
13
220
12
220
11
220
8
220
7
220
6
17 16
220
+
5V
10K
19 18
SW1
+
10 9
Circuito propuesto, utilizado para el encendido y apagado del LED conectado al pin PTB0 según el estado del interruptor SW1. ALFAOMEGA - FREESCALE
91
MANEJO DE TEMPORIZACIÓN BÁSICA
5.2
DISPLAY DE CRISTAL LÍQUIDO
FIGURA 5.2 Un display de cristal liquido (LCD) es una muy práctica interfaz con el usuario, que permite visualizar letras, números y otros símbolos y caracteres útiles. Las pantallas de cristal líquido pueden ser de una sola línea o de dos líneas y cada línea puede tener una capacidad para 16 caracteres visibles (2x16) o de 20 caracteres (2x20), también de 4 líneas (4x16 o 4x20). Cada una de las localidades donde se pueden presentar los caracteres está conformada por una matriz de puntos, ya sea de 5x10 o de 5x7, sobre las cuales se pueden presentar los caracteres ASCII. Un display de cristal liquido posee dos buses: el bus de datos, que es de 8 bits, y el bus de control que es de 3 bits, que son manejados directamente por el sistema microprocesado al cual está conectado. pin 14
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F pin 2 pin 1
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
pin 14
pin 1
FIGURA 5.3 Direcciones para las matrices del LCD y distribución de pines. ALFAOMEGA - FREESCALE
92
JUAN CARLOS VESGA FERREIRA
El direccionamiento de las matrices para los caracteres visibles va para la primera línea desde 00 hasta 0F HEX. Y para la segunda línea, desde 40 HEX hasta 4F HEX.
5.2.1 MODOS DE OPERACIÓN Se utilizan los 8 bits del bus de datos (caso de configuración a 8 bits), o se pueden utilizar los 4 bits de más peso (caso de configuración a 4 bits), para enviar tanto instrucciones como caracteres al módulo. Estas instrucciones pueden ser limpiar pantalla, direccionar matriz, mover el cursor, etc.
Número del terminal
Símbolo
Nivel
1
VSS
-
Fuente 0 V (GND)
2
VDD
-
Fuente + 5 V
3
VEE
-
Control de contraste
4
RS
1/0
Registro selector 1: Carácter de entrada 2: Instrucción de entrada
5
R/W
1/0
2: Leer carácter 2: Escribir carácter
6
E
1,1 0
Pulso de validación de la operación de lectura o escritura
7
DB0
1/0
Bits bajos del bus de datos
8
DB1
1/0
Bits bajos del bus de datos
Función
9
DB2
1/0
Bits bajos del bus de datos.
10
DB3
1/0
Bits bajos del bus de datos.
11
DB4
1/0
Bits altos del bus de datos.
12
DB5
1/0
Bits altos del bus de datos.
13
DB6
1/0
Bits altos del bus de datos.
14
Db7
1/0
Bits altos del bus de datos.
TABLA 5.1 Distribución y función de los pines del LCD. Los bits RS y E del bus de control determinan la validación de la instrucción o del carácter que esté presente en el bus de datos con temporizaciones que se hace necesario respetar. La siguiente tabla describe el conjunto de instrucciones y requerimientos del módulo LCD en forma general. ALFAOMEGA - FREESCALE
93
MANEJO DE TEMPORIZACIÓN BÁSICA
Instrucciones
RS
R/W
Borrado de pantalla
0
0
0
0
0
0
0
0
0
1
Clarea el display y direcciona 00 a DD RAM.
1.28 ms
Cursor a casa
0
0
0
0
0
0
0
0
1
*
Direcciona 00 a DD RAM sin cambiar los datos en RAM.
1.28 ms
Selección de modo
0
0
0
0
0
0
0
1
I/D
S
Configura corrimiento cursor desplazamiento del display.
31.0 s
Control on/off de pantalla
0
0
0
0
0
0
1
D
C
B
Configura parpadeo del display, cursor y carácter.
31.0 s
Corrimiento cursor o pantalla
0
0
0
0
0
1
S/C
R/L
*
*
Mueve el cursor y el display sin cambiar los datos en RAM.
31.0 s
Selección de función
0
0
0
0
1
DL
N
F
*
*
Configura bus de datos (DL), líneas (L) y puntos de la matriz (F).
31.0 s
Selección de dirección CG RAM
0
0
0
1
Direcciona para la generación de caracteres CG en RAM.
31.0 s
Selección de dirección DD RAM
0
0
1
Dirección de RAM
Direcciona para la escribir un carácter en DD RAM.
31.0 s
Leer bandera de ocupado
0
1
BF
AC
Escribir dato a CG o DD RAM
1
0
Lee dato desde CG o DD RAM
1
1
S
DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Descripción
Lectura bandera Busy Flag para saber el funcionamiento.
Escritura del dato
Lectura del dato
31.0 s
Lee el dato o carácter desde DD RAM o CG RAM.
31.0 s
DL = 1:Bus de datos de 8 bits
I/D = 0:Decrementa
DL = 0:Bus de datos de 4 bits
= 0:Mensaje fijo en pantalla
0 s
Escribe el dato o carácter en DD RAM o en CG RAM.
I/D = 1:Incrementa = 1:Desplaza mensaje en pantalla S
Dirección para generar en RAM
T
N
= 1:Dos líneas de pantalla
N
= 0:Una línea de pantalla
S/C = 1:Desplazamiento de la pantalla
F
= 1:Matriz de 5 x 10 puntos
S/C = 0:Desplazamiento del cursor
F
= 0:Matriz de 5 x 7 puntos
R/L = 1:Corrimiento a la derecha
BF = 1:Indica una operación interna del módulo
R/L = 0:Corrimiento a la izquierda
BF = 0:Indica finalización de una operación interna
*:Sin efecto
TABLA 5.2 Conjunto de instrucciones para la LCD. ALFAOMEGA - FREESCALE
94
JUAN CARLOS VESGA FERREIRA
A continuación se ilustra un ejemplo de cómo configurar una pantalla de cristal líquido a 8 bits. Se debe tener muy en cuenta el orden en que se envían los datos de configuración a la pantalla y los tiempos de espera entre un comando y otro. Las órdenes se envían en la siguiente forma: Configuración de la pantalla, indicando el número de bits a utilizar para la configuración, el número de líneas y el tipo de matriz que posee la pantalla a utilizar. Configuración del parpadeo del cursor, del display y del carácter. Borrar pantalla. Configuración del desplazamiento del cursor. Dirección de la pantalla para comenzar a escribir. Para enviar la información a la pantalla se debe diferenciar cuándo se trata de una orden y cuándo se trata de un carácter, por ello se utiliza la siguiente rutina: CONTROL
BCLR RS,PORTD
BRA
DATO2
DATO
BSET RS,PORTD
DATO2
BSET E,PORTD STA PORTB BSR RETARDO1 BCLR E,PORTD BSR RETARDO1 BCLR RS,PORTD RTS
La etiqueta CONTROL hace referencia a la rutina que se llama cuando se desea enviar un comando de configuración a la pantalla. La etiqueta DATO hace referencia a la rutina que se llama cuando se desea enviar un carácter. La rutina RETARDO1 corresponde a la rutina que genera el retardo para efectuar los cambios de nivel de los bits E y RS para una óptima configuración y comunicación con la pantalla de cristal líquido.
ALFAOMEGA - FREESCALE
95
MANEJO DE TEMPORIZACIÓN BÁSICA
EJERCICIOS PROPUESTOS Ejercicio 1 Enunciado del problema A continuación se ilustra cada uno
de losseregistros al de un interruptor, el encendido de un LED Recordando el enunciado, desea quecorrespondientes dependiendo del valor uso y configuración cada unoesté deabierto y sea rotado de izquierda a derecha sea rotado de derecha a izquierda cuando elde interruptor puertos existentes en esta familia cuando el interruptorlos esté cerrado, manteniendo el estado de encendido de un LED por un período de especial de microcontroladores. 1 segundo.
Explicación de teoría adicional para la solución del problema Antes de escribir la solución al ejercicio es necesario conocer “cómo se pueden generar rutinas de retardo en un microcontrolador haciendo uso del tiempo de ejecución de una instrucción”. Al final del capítulo 3 se expuso el set de instrucciones propias de la familia de microcontroladores HC08, en donde una de las casillas que se ilustra en la tabla resume el número de ciclos que tarda cada instrucción en ejecutarse. Aunque este método no sea el óptimo en rutinas de temporización, resulta bastante útil a la hora de generar retardos que no requieran mucha exactitud en la ejecución de los respectivos tiempos. Cuando se desea calcular el número de instrucciones requeridas para establecer un tiempo específico, se puede utilizar la siguiente expresión:
Tiempo (seg) =
Frec. Oscilador
ciclos
En donde No_Ciclos indica cuántos ciclos de máquina se deben ejecutar para lograr el tiempo deseado. Para el caso en que se requiera un retardo de 1 segundo y considerando un oscilador de 4MHz, la cantidad de ciclos sería la siguiente: 1 (seg) =
ciclos
No_ ciclos = 106 , es decir, un millón de ciclos
ALFAOMEGA - FREESCALE
96
JUAN CARLOS VESGA FERREIRA
Aunque la cantidad de ciclos parezca exorbitante, es muy fácil de implementar gracias al uso de rutinas cíclicas. Si recordamos la rutina correspondiente a la multiplicación de dos cantidades, de la misma manera se puede escribir una rutina que, realizando un proceso semejante al de la multiplicación, permita generar la ejecución de un millón de ciclos de máquina. La siguiente rutina permitirá generar este retardo de una manera fácil y rápida. Como sabemos, la frecuencia del cristal es 4 M Hz. Por tanto, el tiempo que tarda en ejecución 1 ciclo de máquina es 1 µs.
Además, 1.000.000 = 5*100*200 quiere decir que: si tenemos un bucle con una duración de 5 ciclos, el cual repetimos 100 veces y a su vez este último lo repetimos 200 veces, obtendríamos una duración de 1.000.000 de ciclos aproximadamente. Por tanto, la rutina que permite establecer un retardo de 1 segundo será la siguiente:
Rutina de retardo de 1 segundo RET_1S REDO
MOV
#200T,CONTA
LDA
#100T
;CONTA = 200 ;A = 100
NOP
;1 Ciclo
NOP
;1 Ciclo
DBNZA REDO
;3 Ciclos. Total=5 ciclos
LDA
#100T
;A = 100
DBNZ CONTA,REDO
;Decrementa CONTA y salta si≠0
RTS
;Retornar de Rutina
Solución Teniendo en cuenta lo anterior, el resultado del ejercicio es el siguiente: $ Include ‘jl3regs.inc’
COPD
FLASH EQU
$ECE0
RESET EQU
$FFFE
RAM
EQU
$80
EQU
0
ORG
RAM
CONTA RMB INICIO
1
ORG
FLASH
BSET
COPD,CONFIG1
;Inhabilita el COPD ALFAOMEGA - FREESCALE
97
MANEJO DE TEMPORIZACIÓN BÁSICA
BSET MOV
SALTO
LED,PORTB
#$FF,DDRB
;BIT 0 PORTB = 1
;Puerto B Salida
BCLR
SW,PORTD
;BIT 2 PORTD = 0
BCLR
SW,DDRD
;BIT 2 Entrada
JSR
RET_1S
;Retardo de 1 Segundo
BRSET SW,PORTD,ROT_IZQ
;SW abierto?, Ir a ROT_IZQ
BRCLR SW,PORTB,ROT_DER
;SW abierto?, Ir a ROT_DER
BRA
SALTO
;Ir a SALTO
ROT_IZQ ROL
PORTB
;Rotar a Izquierda
BRA
SALTO
ROT_DER ROR
PORTB
BRA
SALTO
MOV
#200T,CONTA
LDA
#100T
RET_1S REDO
;Rotar a Derecha ;CONTA = 200 ;A = 100
NOP
;1 Ciclo
NOP
;1 Ciclo
DBNZA REDO
;3 Ciclos. Total=5 ciclos
LDA
#100T
;A = 100
DBNZ CONTA,REDO
;Decrementa CONTA y salta si≠0
RTS
;Retornar de Rutina
ORG
RESET
;Cuando se Energiza
DW
INICIO
;Ir a rutina INICIO
Ejercicio 2 Enunciado del problema El programa que se muestra a continuación consiste en una rutina para configuración de una pantalla de cristal líquido, con bus de datos a 8 bits, dos líneas para visualización de datos y muestra un mensaje que dice “PRUEBA DE PANTALLA”.
ALFAOMEGA - FREESCALE
98
JUAN CARLOS VESGA FERREIRA
NOTA Se debe recordar que cuando se desea utilizar comentarios en un programa se utiliza *. La librería JL3REGS.INC es una librería que posee la definición de todos los registros y bits que hacen parte del mapa de memoria del microcontrolador JL3/JK3/JK1.
Solución A continuación se ilustra el circuito desarrollado con el microcontrolador MC68HC908JK3.
1
PTB2 OSC2/PTA6 PTB3 IRQ1
PTB4 PTB5
+5
PTB6 5 2
VDD VSS
PTB7
PTB2 PTB3 PTB4 PTB5 PTB6 PTB7
14 VSS
12 VDD
13 VEE
10 RW
11 RS
9 E
8 DB7
7 DB6
6 DB5
5 DB4
4 DB3
14 +5
13 12 11 8
2
PTB1
R1
4
OSC1
+5
3
R4
C2
4
Q1
3
15
7 1
C1
PTB0
3 DB2
DB0 1
R3
20
2 DB1
PRUEBA DE PANTALLA
+5
6
17 16 19 18 10 9
FIGURA 5.4 Circuito de control de LCD a 8 bits con MC68HC908JK3. ALFAOMEGA - FREESCALE
99
MANEJO DE TEMPORIZACIÓN BÁSICA
El programa que obedece al ejemplo es el siguiente: $INCLUDE ‘JL3REGS.INC’ Etiquetas de dirección en el microcontrolador FLASH
EQU
$EC00
RESET
EQU
$FFFE
RAM
EQU
$80
COPD
EQU
0
Definición de los bits que se utilizarán en el microcontrolador para manejar las líneas RS y E de la pantalla de cristal liquido, en este caso los pines PTD2 y PTD3, respectivamente. E
EQU
3
RS
EQU
2
Definición de registros a utilizar en la RAM ORG
RAM
CONT RMB
1
Definición de la dirección a partir de la cual se escribe el programa ORG
FLASH
TABLA
FDB
‘PRUEBA DE PANTALLA’
INICIO
BSET
COPD,CONFIG1
; Deshabilita el COP
MOV
#$00,PORTB
; Configuración de Puertos B y D
MOV
#$FF,DDRB
MOV
#00,PORTD
MOV
#$FF,DDRD
BSR
RETARDO
; Retardo
BSR
LCD_CONF
; Configuración de la Pantalla
MOV
#19T,CONT
; No. de caracteres del mensaje
LDHX
#TABLA
; Rutina para enviar el mensaje
LDA
,X
; A = carácter X+1 de la tabla
DEC
CONT
; Caracteres por enviar
BEQ
FIN
; Saltar si ya se enviaron todos
BSR
DATO
; Si no, enviar carácter
BSR
RETARDO
; Retardo
CLRA CLRX CLRH
CICLO
ALFAOMEGA - FREESCALE
100
JUAN CARLOS VESGA FERREIRA
FIN
AIX
#1
BRA
CICLO
BRA
FIN
; X = X+1 ,Siguiente carácter
Rutina de configuración de LCD a 8 bits LCD_CONF
LDA
#%00111000
BSR
CONTROL
LDA
#%00001110
BSR
CONTROL
LDA
#%00000001
BSR
CONTROL
LDA
#%00000110
BSR
CONTROL
LDA
#%10000000
BSR
CONTROL
; Configuración de LCD ; Configuración de Parpadeo ; Borrar pantalla ; Configuración de desplazam. ; Dirección inicial para escritura
RTS RETARDO
PSHH PSHX LDA
#$FF
DELAY
LDHX
#$00EF
LOOP1
AIX
#-1
CPHX
#0
BNE
LOOP1
DECA BNE
DELAY
PULX PULH RTS Retardo para pulso de envío de comandos o datos a la LCD RETARDO1 LDA #$FF DELAY1
DECA BNE
DELAY1
RTS Rutina de envío de comandos o caracteres a la LCD a 8 bits CONTROL
BCLR RS,PORTD
; Bit RS = 0 lógico ALFAOMEGA - FREESCALE
101
MANEJO DE TEMPORIZACIÓN BÁSICA
BRA DATO2
; Salta a DATO2
DATO
BSET RS,PORTD
; Bit RS = 1 lógico
DATO2
BSET E,PORTD
; Bit E = 1 lógico
STA PORTB
; Enviar al PTOB a valor de A
BSR RETARDO1
; Pulso de Retardo1
BCLR E,PORTD
; Bit E = 0 lógico
BSR RETARDO1
; Pulso de Retardo1
BCLR RS,PORTD
; Bit RS = 0 lógico
RTS
; Retorno de Subrutina
ORG RESET DW INICIO La rutina equivalente para configuración a 4 bits es la misma anterior, solamente se efectúa el cambio de la rutina de envío de comandos y caracteres (CONTROL) y la rutina de configuración (LCD_CONF) por la siguiente: LCD_CONF
CONTROL DATO DATO2
ALFAOMEGA - FREESCALE
LDA
#%00101000
BSR LDA BSR LDA BSR LDA BSR LDA BSR RTS
CONTROL #%00001110 CONTROL #%00000001 CONTROL #%00000110 CONTROL #%10000000 CONTROL
; Configuración de LCD ; Configuración de Parpadeo ; Borrar pantalla ; Configuración de desplazam. ; Dirección inicial para escritura
BCLR RS,PORTD BRA DATO2 BSET RS,PORTD BSET E,PORTD STA CHAR AND #$F0
; Bit RS = 0 ; Saltar a DATO2 ; Bit RS = 1 ; Bit E = 1 ; CHAR = A ; bits de más peso de A
STA PORTB
; se envían al Puerto B
BSR
RETARDO1
; Pulso de Retardo1
BCLR
E,PORTD
; Bit E = 0
CLR
PORTB
; Borra Puerto B
BSR BSET
RETARDO1 E,PORTD
; Pulso de Retardo1 ; Bit E = 1
102
JUAN CARLOS VESGA FERREIRA
LDA CHAR NSA AND #$F0 STA PORTB BSR RETARDO1 BCLR E,PORTD BSR RETARDO1 CLR PORTB
; A = CHAR ; Intercambia nibles de A ; bits de menos peso antes ; se envían al Puerto B ; Pulso de retardo1 ; Bit E = 0 ; Pulso de retardo1 ; Borra Puerto B
RTS
; Retorna de Subrutina
Ejercicio 3 Explicación de teoría adicional para la solución del ejercicio A continuación se ilustra toda la teoría y el desarrollo para efectuar una comunicación serial entre el microcontrolador y el PC a una velocidad de 2400 baudios. El estudiante debe asimilar esta teoría, aplicarla y verificarla. En caso de requerir ajuste, el estudiante debe efectuarlo.
COMUNICACIÓN SERIAL CON EL 68HC908JL3/JK3/JK1 La comunicación serial, como su nombre lo indica, realiza la transferencia de información enviando o recibiendo datos descompuestos en bits, los cuales viajan secuencialmente uno tras otro. En la comunicación paralela, los datos pueden ser transferidos en paquetes de 8, 16, 32 o más bits en forma simultánea, utilizando un cable para cada bit, mientras que en la comunicación serial solamente se hace uso de algunos conductores y por ellos viaja toda la información correspondiente a los datos propiamente dichos. La transferencia de datos en forma paralela es rápida pero usa muchas líneas conductoras y la transferencia serial es lenta pero utiliza menor número de cables. Se debe tener en cuenta que la comunicación en paralelo permite menor distancia entre los equipos a comunicar que la comunicación serial. Todo esto está regido por normas o protocolos donde el utilizado por las computadoras convencionales es el protocolo RS-232. El protocolo RS-232 es una norma o estándar mundial que rige los parámetros de uno de los modos de comunicación serial. ALFAOMEGA - FREESCALE
103
MANEJO DE TEMPORIZACIÓN BÁSICA
No. Pin 1 2 3 4 5 6 7 8 9
Función Detector de portadora (CD) Recepción de datos (RxD) Transmisión de datos (TxD) Datos listos en terminal (DTR) Tierra (GND) Datos listos para enviar (DSR) Solicitud de envío (RTS) Listo para envío (CTS) Detector de tono (RI)
FIGURA 5.5 Distribución de pines del conector DB9 para comunicación serial.
Para transmitir serial y asincrónicamente, además del dato, se necesita la generación adicional del bit de arranque (un “cero” lógico) y los de parada (un “uno” lógico); el bit de paridad es opcional. Para recibir datos, el elemento clave es detectar sobre la línea que recibe los datos, el bit de arranque, bien sea a través de interrupciones, o bien a través de la lectura frecuente de la línea. En ambos casos lo recomendable es que después de detectado el bit de arranque, la lectura de cada uno de los bits se realice en la mitad del bit, tal como se puede observar en la figura. Con el microcontrolador se pueden utilizar las interrupciones, dando mayor eficiencia al sistema. En nuestro caso se utilizó el segundo método, cuyo diagrama de flujo para recepción serial y el programa se ilustran a continuación, considerando además que la rutina es más útil ya que se hace extensiva a todos los microcontroladores.
ALFAOMEGA - FREESCALE
104
JUAN CARLOS VESGA FERREIRA
BIT DE PARADA Estado antes de TX
1
Estado después de TX
DATO DE 8 BITS
0
LSB
MSB
1
1
Puntos donde es recomendable adquirir el valor del Bit BIT DE ARRANQUE
FIGURA 5.6 Lectura de los bits de datos.
Equivalente en TTL
Equivalente en protocolo RS-232
1 lógico
2.5 a 5 V
-5 a -20 V
0 lógico
0 a 0.8 V
5 a 20 V
Valor Lógico
TABLA 5.3 Niveles de tensión en el protocolo RS-232.
Aunque las anteriores rutinas de recepción y transmisión son válidas para establecer comunicaciones seriales entre microcontroladores y microprocesadores, surgen incompatibilidades cuando pretendemos comunicar un microcontrolador con un computador de tipo PC debido a los niveles de tensión que se manejan entre ellos.
ALFAOMEGA - FREESCALE
105
MANEJO DE TEMPORIZACIÓN BÁSICA
5V
1
10uF TX
3
10uF C1 + V+ C1 V-
RX
4
5 10uF
11 10 12 9
2
6
C2 +
10uF
C2 -
GND
T1IN
T1OUT
T2IN
T2OUT
R1OUT
R1IN
R2OUT
R2IN
14 7
RX PC
13 8
TX PC
FIGURA 5.7 Interfaz de comunicación entre el microcontrolador y el PC utilizando el protocolo RS-232. Para estos casos se puede acudir a un circuito integrado muy útil, el MAX 232 que, utilizando una fuente única de 5 voltios, logra “traducir” los niveles TTL existentes en los microcontroladores a niveles RS-232, los cuales pueden viajar distancias mayores y son los que están presentes a la entrada del puerto DB9 de un computador PC. Las rutinas para transmisión y recepción serial a una velocidad de 2400 baudios (bits por segundo) y con una frecuencia del oscilador de 4 MHz son las siguientes. La rutina para transmisión serial es: ENVIAR
XNEXT
SALTO
STA
TRANSM
;TRANSM = Dato
MOV
#$8,CONTA
;8 bits a Transmitir
BCLR
6,PORTD
;Bit de arranque
BSR
UN_BIT
;Retardo 1 bit
ROR
TRANSM
;rotar a Derecha.
BCLR
6,PORTD
;PTD6 = 0
BHCC
SALTO
;si Carry = 0, saltar
BSET
6,PORTD
;si no, PTD6 = 1
BSR
UN_BIT
;Retardo 1 bit
DEC
CONTA
;Decrem. Bits por Tx
BNE
XNEXT
;Bits <> 0?,saltar
BSET
6,PORTD
;Bit de parada
ALFAOMEGA - FREESCALE
106
JUAN CARLOS VESGA FERREIRA
BSR
UN_BIT
;Retardo 1 bit
RTS
;Retorno de rutina
La rutina para recepción serial es: RECIBIR
RNEXT
SALTO1
CLR
RECEPC
;RECEPC = 0
BRSET 7,PORTD,RECIBIR
; Si Bit Rx=1, salta
BSR
UNOYMED
;si no,Retardo 1.5 bit
MOV
#$08,CONTA
;Bits a recibir
CLC
;Carry = 0
BRCLR 7,PORTD,SALTO1
;Si RX = 0, salta
SEC
;si no, carry = 1
ROR
RECEPC
;Rotar RECEPC
BSR
UN_BIT
;Retardo 1 bit
DEC
CONTA
;Dec. Bits por recibir
BNE
RNEXT
;Si bits<>0, salta
BSR
UN_BIT
;Retardo 1 bit
RTS
;Retorna de rutina
Como se desea transmitir a 2400 baudios, es decir, 2400 bits por segundo, debemos calcular el tiempo requerido para 1 bit y 1.5 bits.
1 bit =
= 416*10-6 seg = 416 s
1.5 bits = 1.5 * 416 μs = 624 μs Como sabemos, la frecuencia del cristal es 4 MHz. Por tanto, el tiempo que tarda en ejecución 1 ciclo de máquina es 1 μs. 415 μs = 1 μs * 5 * 83
; 5 ciclos de máquina, 83 veces
625 μs = 1 μs * 5 * 125
; 5 ciclos de máquina, 125 veces
Rutina de retardo para velocidad de transmisión a 2400 baudios UNOYMED LDA
#125T
;A = 125
BRA
REDO
;Saltar a REDO
UN_BIT
LDA
#83T
;A = 83
REDO
NOP NOP DBNZA RTS
REDO ;Dec A y salta si A<>0 ;Retornar de Rutina ALFAOMEGA - FREESCALE
107
MANEJO DE TEMPORIZACIÓN BÁSICA
RECEPCIÓN
No
Línea Rx en bajo Sí Rutina 1.5 bits Contador = 8
Limpiar Carry
No Línea Rx en bajo No Rotar a la derecha registro de recepción
Rutina de 1 Bit decrementar contador No Contador = 0 ? Sí Terminar
FIGURA 5.8 Diagrama de flujo de la rutina de recepción serial.
ALFAOMEGA - FREESCALE
Carry = 1
108
JUAN CARLOS VESGA FERREIRA
TRANSMITIR
Bit de arranque contador = 8
Colocar línea de transmisión en bajo
Rotar a la derecha registro de transmisión No Colocar línea de Tx en alto
Carry = 0? Sí Rutina de 1Bit decremementar contador
No
Contador = 0? Sí Bit de parada
Terminar
FIGURA 5.9 Diagrama de flujo de la rutina de transmisión serial. ALFAOMEGA - FREESCALE
MANEJO DE TEMPORIZACIÓN BÁSICA
109
LA COMUNICACIÓN SERIAL CON EL PC Como es sabido, la comunicación serial se estará efectuando entre el microcontrolador y el PC. Las rutinas de transmisión y recepción desde el microcontrolador ya se explicaron antes, ahora analizaremos las rutinas de transmisión y recepción desde el PC mediante Visual Basic.
FIGURA 5.10 Control para comunicación serial con Visual Basic y sus propiedades.
ALFAOMEGA - FREESCALE
110
JUAN CARLOS VESGA FERREIRA
Para la utilización de las comunicaciones seriales en Visual Basic se debe utilizar un control ActiveX llamado MICROSOFT COMM CONTROL, que permite manipular las comunicaciones seriales desde cualquier puerto serial existente en el PC y a velocidades deseadas por el usuario. La explicación de la lógica de transmisión y recepción serial ya se expuso con anterioridad, por ello solamente se explicará la implementación de este control y sus respectivas rutinas. En la figura anterior se pueden observar las propiedades principales para la configuración del control ActiveX y su aspecto físico. El significado de cada una de ellas es el siguiente:
CommPort: Indica qué puerto serial se desea utilizar para la comunicación. Cuando se asigna el valor 1 corresponde al COMM1, y así sucesivamente. Handshaking: Constante de protocolos.
Constante
Valor
Descripción
Compone
0
Sin protocolo
ComXonXoff
1
Protocolo XON/XOFF
ComRTS
2
Protocolo RTS/CTS (petición de envío/preparado para enviar)
TABLA 5.4 Opciones de la propiedad Handshaking
InputMode: El tipo de los datos recuperados por la propiedad Input está determinado por el valor de esta propiedad, que puede tomar alguno de los valores siguientes:
Constante
Valor
Descripción
comInputModeText
0
(Predeterminado) Los datos se recuperan como texto mediante la propiedad Input
comInputModeBinary
1
Los datos se recuperan como datos binarios mediante la propiedad Input
TABLA 5.5 Valores posibles de la propiedad InputMode.
ALFAOMEGA - FREESCALE
111
MANEJO DE TEMPORIZACIÓN BÁSICA
RThreshold: Si toma el valor 0 desactiva la posibilidad de detectar en qué momento se recibe algún dato, si toma el valor 1 lo activa.
SThreshold: Si toma el valor 0 desactiva la posibilidad de enviar algún dato, si toma el valor 1 lo activa. Settings: Esta propiedad permite configurar el modo en el cual se van a enviar los datos serialmente en el siguiente orden:
Velocidad de transmisión: Puede tomar valores de 1200, 2400, 4800, 9600, 14400 baudios. Cantidad de bits de datos: Se pueden considerar dos opciones, ya sean 8 o 9 bits de datos. Paridad: Configura si se desea considerar en la transmisión paridad o no; si lo desea coloca S, de lo contrario N. Bits de parada: Si transmite 8 bits de datos se puede o no colocar un bit de parada, de lo contrario no se puede por la longitud del buffer de transmisión. Considerando lo anterior, como en el proyecto se utilizó una transmisión a 2400 baudios, 8 bits de datos, sin paridad y un bit de parada, en la propiedad Settings se coloca lo siguiente: Settings = 2400,8,n,1
RUTINAS PARA TRANSMISIÓN Y RECEPCIÓN CON VISUAL BASIC A continuación se ilustran las rutinas para la transmisión y recepción serial con Visual Basic. RUTINA PARA RECEPCIÓN Private Sub MSComm1_OnComm()
; Ocurrió algún evento
Dim DatoMIC as Variant Select Case MSComm1.CommEvent Case comEvReceive DatoMIC = Asc(MSComm1.Input)
; En caso de ser Recepción ; Lea el dato del Buffer
End Select End Sub RUTINA PARA TRANSMISIÓN Private Sub Enviar() Dim Dato_a_Enviar as Variant MSComm1.Output=chr(Dato_a_Enviar)
; Envía el dato almacenado
End Sub
; en la variable.
ALFAOMEGA - FREESCALE
112
JUAN CARLOS VESGA FERREIRA
Solución Se desea implementar un sistema de comunicación serial entre el PC y el microcontrolador 68HC908JL3, utilizando el pin PTD6 como transmisor y el pin PTD7 como receptor, transmitiendo a una velocidad de 2400 baudios.
5V
1K
20
20pF
+
10M
1
3
4
4MHz
4
1
20pF
PTB0
RST
PTB1 OSC1 PTB2 OSC2/PTA6
IRQ1
PTB3 PTB4 PTB5
5V
+ 5
2
VDD
PTB6 PTB7
220
-1
220
2
13
220
3
12
220
4
11
220
1
8
220
2
7
220
3
220
4
15 14
6
10uF
VSS
PTD2 PTD3 PTD4 PTD5 PTD6 PTD7
1
17
3
16
4
19 18 10 9
5 10uF
5V
10uF C1 + V+
2
C1 V- 6 C2 +
10uF
C2 -
GND
11
T1IN
T1OUT 14
10
T2IN
T2OUT 7 R1IN 13
12 9
R1OUT R2OUT
R2IN 8
RX TX
FIGURA 5.11 Circuito de comunicación serial a 2400 baudios.
ALFAOMEGA - FREESCALE
113
MANEJO DE TEMPORIZACIÓN BÁSICA
La información que envía el PC corresponde a un número de 8 bits (0 a 255), siendo esta posteriormente visualizada por el puerto B considerando PTB0 como el bit de menos peso y PTB7 como el bit de más peso.
El código fuente es el siguiente: $ INCLUDE ‘JL3REGS.INC’ FLASH
EQU
$ECE0
RESET
EQU
$FFFE
RAM
EQU
$80
COPD
EQU
0
ORG BANDERA RMB INICIO
ESPERA
RAM 1
;Registro Bandera de 1 Seg.
ORG
FLASH
BSET
COPD,CONFIG1
;Inhabilita el COPD
MOV
#$00,PORTB
;PTB7 = 0
MOV
#$FF,DDRB
;Configura el PTB como salida
MOV
#$40,PORTD
;PTD6 = 1
MOV
#$40,DDRD
;PTD6 = SALIDA
BSR
RECIBIR
;Espera recibir dato del PC
MOV
RECEPC,PORTB
;Cuando lo recibe va al PTB
LDA
RECEPC
;Lo que recibio, lo carga A
BSR
ENVIAR
;A es enviado al PC
BRA
ESPERA
;salto
La rutina para transmisión serial es: ENVIAR
XNEXT
STA
TRANSM
;TRANSM = Dato
MOV
#$8,CONTA
;8 bits a Transmitir
BCLR
6,PORTD
;Bit de arranque
BSR
UN_BIT
;Retardo 1 bit
ROR
TRANSM
;rotar a Derecha.
BCLR
6,PORTD
;PTD6 = 0
BHCC SALTO
;si Carry = 0, saltar
BSET
;si no, PTD6 = 1
ALFAOMEGA - FREESCALE
6,PORTD
114
JUAN CARLOS VESGA FERREIRA
SALTO
BSR
UN_BIT
;Retardo 1 bit
DEC
CONTA
;Decrem. Bits por Tx
BNE
XNEXT
;Bits <> 0?,saltar
BSET
6,PORTD
;Bit de parada
BSR
UN_BIT
RTS
;Retardo 1 bit ;Retorno de rutina
La rutina para recepción serial es: RECIBIR
RNEXT
SALTO1
CLR
RECEPC
;RECEPC = 0
BRSET 7,PORTD,RECIBIR
; Si Bit Rx=1, salta
BSR
UNOYMED
;si no,Retardo 1.5 bit
MOV
#$08,CONTA
;Bits a recibir
CLC
;Carry = 0
BRCLR 7,PORTD,SALTO1
;Si RX = 0, salta
SEC
;si no, carry = 1
ROR
RECEPC
;Rotar RECEPC
BSR
UN_BIT
;Retardo 1 bit
DEC
CONTA
;Dec. Bits por recibir
BNE
RNEXT
;Si bits<>0, salta
BSR
UN_BIT
;Retardo 1 bit
RTS
;Retorna de rutina
Rutina de retardo para velocidad de transmisión a 2400 baudios. UNOYMED LDA
#125T
;A = 125
BRA
REDO
;Saltar a REDO
UN_BIT
LDA
#83T
;A = 83
REDO
NOP NOP DBNZAREDO
;Dec A y salta si A<>0
RTS
;Retornar de Rutina
ORG
RESET
DW
INICIO
ALFAOMEGA - FREESCALE
115
MANEJO DE TEMPORIZACIÓN BÁSICA
FIGURA 5.12 Interfaz gráfica de comunicación serial.
En la rutina de transmisión, el dato es colocado en la caja de texto “TEXT1” y posteriormente se pulsa el botón “Enviar”. El dato es enviado serialmente, es recibido por el microcontrolador y regresado nuevamente al PC. Este dato es recibido y detectado mediante el evento OnComm de Visual Basic, el cual ocurre cuando se encuentra un dato en el buffer de recepción. Este dato es retirado del buffer y enviado a la caja de texto “Text2”, en donde es visualizado. Las rutinas correspondientes a la transmisión y recepción serial desde el PC son las siguientes: Rutina para transmisión Private Sub Enviar() Dim Dato_a_Enviar as Variant MSComm1.Output=chr(Val(Text1.Text))
; Envía el dato almacenado
End Sub
; en la variable.
Rutina para recepción Private Sub MSComm1_OnComm() ALFAOMEGA - FREESCALE
; Ocurrió algún evento
116
JUAN CARLOS VESGA FERREIRA
Dim DatoMIC as Variant Select Case MSComm1.CommEvent Case comEvReceive
; En caso de ser Recepción
DatoMIC = Asc(MSComm1.Input)
; Lea el dato del Buffer
Text2.Text = DatoMIC End Select End Sub
RESUMEN DEL CAPÍTULO CAPÍTULO Uno de los recursos más importantes que se requieren en la mayoría de aplicaciones electrónicas son los retardos. Un retardo es, como su nombre lo indica, un tiempo de espera que efectúa el microcontrolador mientras realiza una operación específica que lo requiera. Aunque todo microcontrolador posee recursos dedicados a la ejecución y manejo de tiempos en un proceso de control electrónico como lo es el timer, en este caso se efectuó teniendo en cuenta los retardos ofrecidos por la ejecución de instrucciones, las cuales también provocan un pequeño retardo mientras se ejecutan y se pueden cuantificar mediante ciclos; estas están relacionadas de manera directa con la frecuencia del oscilador interno, siendo ésta en muchos casos una manera fácil y útil de realizar procedimientos de retardo en alguna aplicación que lo requiera.
ALFAOMEGA - FREESCALE
Capítulo
6
INTERRUPCIONES
(SISTEMA DE INTEGRACIÓN MODULAR) OBJETIVO DEL CAPÍTULO Al finalizar el capítulo el estudiante estará familiarizado con las diferentes fuentes de interrupciones que existen en esta familia, sus aplicaciones, propiedades y formas de utilizarlas, configurarlas e identificarlas en el momento de su ocurrencia.
CONOCIMIENTOS PREVIOS Para iniciar el estudio del presente capítulo es necesario que el lector posea una comprensión general de las características propias de ésta familia de microcontroladores y su programación.
6.1 INTRODUCCIÓN En esta sección se explicará el sistema de integración modular, el cual soporta hasta 24 interrupciones internas y externas, junto con la CPU, los controles SIM y todas las actividades de la MCU. A continuación se ilustra un diagrama que muestra un resumen de los registros de I/O existentes en la SIM. La SIM es un sistema de control de estados que coordina a la CPU, y es responsable de: Generación del reloj de bus, control de la CPU y periféricos • Arranque, parada, espera y ruptura de entrada y recuperación. • Control del reloj interno. Control maestro del reset, incluyendo el Power - on – Reset y el tiempo de rebosamiento del COP. Control de interrupciones. Habilitación y deshabilitación de tiempos en la CPU.
118
JUAN CARLOS VESGA FERREIRA
Módulo de parada Módulo de espera STOP/WAIT CONTROL
Parada de la CPU Espera de la CPU SIMOSCEN (TO OSCILLATOR) SIM COUNTER
Reloj del COP 2OSCOUT OSCOUT
+2 VDD
INTERNAL PULL-UP
RESET PIN LOGIC
Ctrl de Reloj
Generador de Reloj
Relojes Internos
ILLEGAL OPCODE (FROM CPU)
POR CONTROL
MASTER RESET CONTROL
RESET PIN CONTROL SIM RESET STATUS REGISTER
ILLEGAL ADDRESS (FROM ADRESS MAP DECORDERSS COP TIMEOUT (FROM COP MODULE) USB RESET (FROM USB MODULE)
RESET
INTERRUPT CONTROL AND PRICRITY DECODE
Fuentes de Interrupción Interfase con la CPU
FIGURA 6.1 Diagrama en bloque del SIM.
6.2
INTERRUPCIONES
Una interrupción cambia temporalmente la secuencia del programa en ejecución y va a responder a un evento particular. Es decir, se emplean a veces para interrumpir el procesamiento normal o para responder a algún evento inusual. Los microcontroladores por lo general pueden ser interrumpidos mediante diferentes fuentes de interrupción. ALFAOMEGA - FREESCALE
119
INTERRUPCIONES (SISTEMA DE INTEGRACIÓN MODULAR)
Prioridad Mayor
Fuente
Bandera
Máscara
INT Reg. bandera
Reset
$FFFE-$FFFF
SWI Instrucción
Menor
Dirección del vector $FFFC-$FFFD
IRQ1 pin
IRQF1
IMASK1
IF1
$FFFA-$FFFB
Interrupción por timer canal 0
CHOF
CHOIE
IF3
$FFF6-$FFF7
Interrupción por timer canal 0
CH1F
CH1IE
IF4
$FFF4-$FFF5
Interrupción por rebosamiento del timer
TQF
TOIE
IF5
$FFF2-$FFF3
Interrupción por teclado
KEYF
IMASKK
IF14
$FFF0-$FFF1
Interrupción por conversión completa del A/D
C0C0
AIEN
IF15
$FFDE-$FFDF
TABLA 6.2 Fuentes de interrupción
Prioridad del vector Vector Dirección Menor prioridad
IF15 IF14 IF13 IF5 IF4 IF3
$FFDE
Mayor prioridad
Vector de conversión completa ADC (byte alto)
$FFDF
Vector de conversión completa ADC (byte bajo)
$FFE0
Vector de teclado (alto)
$FFE1
Vector de teclado (bajo)
A IF6
No usado
$FFF2
Rebosamiento del timer (byte alto)
$FFF3
Rebosamiento del timer (byte bajo)
$FFF4
timer canal1 vector alto
$FFF5
timer canal1 vector bajo
$FFF6
timer canal0 vector alto
$FFF7
timer canal0 vector bajo
IF2 IF1
Detalle
No usado $FFFA
vector IRQ (byte alto)
$FFFB
vector IRQ (byte bajo)
$FFFC
SWI vector (alto)
$FFFD
SWI vector (bajo)
$FFFE
Reset (byte alto)
$FFFF
Reset (byte bajo)
TABLA 6.3 Direcciones de interrupciones vectorizadas ALFAOMEGA - FREESCALE
120
JUAN CARLOS VESGA FERREIRA
6.3
ESTADO DE INTERRUPCIÓN DEL REGISTRO 1
Dirección $FE04 Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Leer
0
IF5
IF4
IF3
0
IF1
0
0
Escribir
R
R
R
R
R
R
R
R
R: Reservado IF1, IF3 A IF5: BANDERAS DE INTERRUPCIÓN Estas banderas indican cuál fue la interrupción que ocurrió según la fuente que se ilustra en la tabla anterior. Los bits 0, 1, 3 y 7 siempre son leídos como cero.
6.4
ESTADO DE INTERRUPCIÓN DEL REGISTRO 2
Dirección $FE05 Bit 7 Leer
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
IF14
0
0
0
0
0
0
0
R
R
R
R
R
R
R
R
Escribir
R: Reservado IF14: BANDERAS DE INTERRUPCIÓN Esta bandera indica cuál fue la interrupción que ocurrió según la fuente que se ilustra en la tabla anterior. Los bits [0:6] siempre son leídos como cero.
6.5
ESTADO DE INTERRUPCIÓN DEL REGISTRO 3
Dirección $FE06 Leer Escribir
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
IF14
0
0
0
0
0
0
IF15
R
R
R
R
R
R
R
R
R: Reservado ALFAOMEGA - FREESCALE
INTERRUPCIONES (SISTEMA DE INTEGRACIÓN MODULAR)
121
IF15: BANDERAS DE INTERRUPCIÓN Esta bandera indica cuál fue la interrupción que ocurrió según la fuente que se ilustra en la tabla anterior. Los bits [1:7] siempre son leídos como cero.
6.6
LA INSTRUCCIÓN SWI
La SWI es una instrucción no enmascarable que causa una interrupción indiferente del estado que posea el bit I (bit bandera de interrupción), en la condición de registro de código. Una interrupción por software envía el PC (contador de programa) al stack. Una interrupción por software no aplica al PC=PC – 1, cosa que sí hace una interrupción por hardware.
6.7
RESET
Todas las fuentes de reset son las que tienen igual o mayor prioridad sobre las demás y no pueden ser omitidas de ninguna forma. El reset obliga a que el bit I tome el valor “1” lógico y en “0” lógico todos los bits que permiten la habilitación de interrupciones locales a fin de prevenir interrupciones durante el proceso de inicialización. Cuando el bit I está en uno, ninguna interrupción (excepto SWI) es reconocida. Aunque pueda registrarse a la fuente de interrupción, su pedido no será atendido hasta que el bit I se ponga en cero.
Se debe tener en cuenta que si se produce una interrupción mientras la CPU está ejecutando una instrucción, la instrucción será completada antes de que la CPU responda al pedido de interrupción. Las interrupciones pueden ser deshabilitadas en conjunto colocando el bit I del CCR en “1” lógico, o colocando en ceros los bits de control de habilitación de cada fuente de interrupción.
ALFAOMEGA - FREESCALE
122
JUAN CARLOS VESGA FERREIRA
RESUMEN DEL CAPÍTULO CAPÍTULO Una de las principales ventajas del uso de los microcontroladores Freescale consiste en que el manejo de su conjunto de interrupciones, ya sean internas o externas, se encuentran totalmente sectorizadas, facilitando con ello la identificación de la interrupción, mayor rapidez de atención, mayor estructuración del software en forma modular, etc. Gracias a los registros de interrupción 3, 2 y 1 se puede también verificar en forma jerárquica la ocurrencia de estos eventos que provocan la interrupción, definiendo el usuario la prioridad, aunque internamente en el microcontrolador esta jerarquía ya está preestablecida.
ALFAOMEGA - FREESCALE
Capítulo
7
MÓDULO DE INTERRUPCIÓN POR TECLADO (KBI) OBJETIVO DEL CAPÍTULO Al finalizar el capítulo el estudiante estará en capacidad de utilizar, configurar y manipular la interrupción por teclado KBI, la cual facilita el desarrollo de aplicaciones que utilicen este dispositivo de entrada de datos.
CONOCIMIENTOS PREVIOS Para iniciar el estudio del presente capítulo es necesario que el lector posea una comprensión general de las características propias de esta familia de microcontroladores y su programación.
7.1 INTRODUCCIÓN En muchas aplicaciones es común el uso de dispositivos para introducir información, caso particular del teclado, el cual se hace presente en desarrollos como los controles de bandas transportadoras, programación de tareas, horarios, control de acceso, etc. El módulo de interrupción por teclado tiene siete (7) interrupciones externas manipuladas de manera independiente cada una de ellas, y se encuentran disponibles entre los pines PTA[0:6]. Entre las características del módulo de interrupción por teclado podemos mencionar las siguientes: Siete pines de interrupción por teclado habilitadas por separado cada una y un solo bit indicador de la interrupción. Configuración de resistencias de Pull-Up. Interrupción programable por flanco o flanco/ nivel. Salida en modo de bajo consumo.
124
7.2
JUAN CARLOS VESGA FERREIRA
REGISTRO DE CONTROL Y ESTADO DE TECLADO (KBSCR)
Dirección $001A Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
0
0
0
0
KEYF
0
Leer Escribir
Bit 1
Bit 0
IMASKK
MODEK
Los bits del 7 al 4 no son utilizados, y siempre son leídos como 0 lógico.
KEYF: bit de bandera de teclado Este bit es de sólo lectura y toma el valor 1 lógico cuando la interrupción por teclado ha ocurrido y se encuentra pendiente por atender. 1: Interrupción de teclado pendiente 0: Interrupción de teclado no pendiente
ACKK: bit de reconocimiento de teclado Este bit es leído siempre como 0 lógico, pero cuando se escribe en él un 1 lógico se está indicando que la interrupción por teclado ya fue atendida y, por ende, el bit KEYF retorna a 0 lógico.
IMASKK: bit de habilitación de interrupción por teclado 1: Deshabilita la interrupción por teclado 0: Habilita la interrupción por teclado
MODEK: Configuración de sensibilidad de activación del teclado 1: Interrupción activada por flanco descendente y nivel lógico bajo 0: Interrupción activada por flanco descendente solamente
7.3
REGISTRO DE HABILITACIÓN DE INTERRUPCIONES DE TECLADO (KBIER)
Dirección $001B Bit 7 Leer Escribir
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
KBIE6
KBIE5
KBIE4
KBIE3
KBIE2
KBIE1
KBIE0
0
ALFAOMEGA - FREESCALE
MÓDULO DE INTERRUPCIÓN POR TECLADO (KBI)
125
Este registro habilita o deshabilita independientemente los pines del puerto A para utilizar la interrupción por teclado. 1: El bit KBIx es habilitado para interrupción por teclado 0: El bit KBIx es deshabilitado para interrupción por teclado Cuando se habilita la interrupción en un pin específico, la resistencia de Pull-Up es habilitada también en el pin correspondiente.
7.4
INICIALIZACIÓN DEL TECLADO
Cuando un pin de interrupción por teclado es habilitado, le toma un tiempo interno a la resistencia de Pull-Up alcanzar un 1 lógico. Por tanto, una interrupción falsa puede ocurrir tan pronto como el pin es habilitado. Para prevenir una falsa interrupción en la inicialización del teclado se debe efectuar lo siguiente: IMASKK = 1 Asignar los valores a cada uno de los KBIx. ACKK = 0 IMASKK = 0 Otra forma de evitar una interrupción falsa es la siguiente: Configurar todo el puerto A como salida, esto se hace colocando cada uno de los bits del registro DDRA en 1 lógico. Escribir un 1 lógico en cada uno de los bits correspondientes al puerto A. Asignar los valores a cada uno de los KBIx. Los teclados pueden tener varias configuraciones, unos pueden ser matriciales y otros lineales. Los teclados lineales son los que poseen tantos pines como teclas presenten y dos pines más para alimentación. Cada vez que se pulse una tecla, esta enviará a su respectivo pin un nivel bajo, identificando con ello la tecla pulsada. Los teclados matriciales, los cuales son los más utilizados en la gran mayoría de aplicaciones electrónicas se encuentran configurados, como su nombre lo indica, como una matriz. Para identificar una tecla, ésta se encuentra direccionada por una fila y una columna, y la intersección de ellas encasilla la tecla. En nuestro caso se explicará un ejemplo de interrupción por teclado, mediante un teclado matricial de 12 teclas (teclado de teléfono), el cual enviará el valor de la tecla pulsada a una pantalla de cristal liquido. Según el circuito, la tecla que sea pulsada presentará tanto en la fila como en la columna que la direcciona un 0 lógico, este cero será rotado por las columnas del teclado y cuando la tecla sea pulsada, éste será enviado directamente a la fila que la preside provocando con ello la interrupción por teclado. La forma de configurar el teclado es la siguiente: Configuramos los pines para el manejo del teclado, en nuestro caso los bits de PTA[6:3] serán entradas (filas) y los bits PTA[2:0] serán salidas (columnas).
ALFAOMEGA - FREESCALE
126
JUAN CARLOS VESGA FERREIRA
MOV MOV
#$FF,PORTA
#%10000111,DDRA
Configuramos las resistencias de Pull-Up para los pines PTA[6:3] y habilitamos el pin PTA6 como un pin de I/O y no como una función del oscilador de tipo RC, colocando en 1 lógico en bit 7 del registro PTAPUE. MOV #%11111000,PTAPUE Para evitar una interrupción falsa, efectuamos lo siguiente: IMASKK = 1 Asignar los valores a cada uno de los KBIx. ACKK = 0 IMASKK = 0 Y el resultado es: BSET
IMASKK,KBSCR
MOV
#%01111000,KBIER
BCLR
ACKK,KBSCR
BCLR
IMASKK,KBSCR
7.5
EJERCICIOS RESUELTOS
Enunciado del capítulo Se desea escribir un programa que permita leer la información enviada desde un teclado matricial de 12 teclas, y el valor de la tecla pulsada podrá ser visualizado a través de una pantalla de cristal líquido.
ALFAOMEGA - FREESCALE
127
MÓDULO DE INTERRUPCIÓN POR TECLADO (KBI)
Solución PTA2
PTA1 PTA0
PTA3
1
2
3
PTA4
4
5
6
PTA5
7
8
9
PTA6
*
0
#
FIGURA 7.1 Conexión del teclado. PTA7
PTA6
PTA5
PTA4
PTA3
PTA2
PTA1
PTA0
PTAA
0
1
1
1
0
0
1
1
1
0
1
1
1
0
1
0
1
2
0
1
1
1
0
1
1
0
3
0
1
1
0
1
0
1
1
4
0
1
1
0
1
1
0
1
5
0
1
1
0
1
1
1
0
6
0
1
0
1
1
0
1
1
7
0
1
0
1
1
1
0
1
8
0
1
0
1
1
1
1
0
9
0
0
1
1
1
0
1
1
*
0
0
1
1
1
1
0
1
0
0
0
1
1
1
1
1
0
#
TABLA 7.1 Combinaciones para identificar la tecla pulsada. ALFAOMEGA - FREESCALE
128
JUAN CARLOS VESGA FERREIRA
+5 +5
14
PTD3
PTB3
PTD4
PTB4
PTD5
PTB5
PTD6
PTB6 PTB7
#
LCD
20 18 17 15 12
+5
11 10
2
3
13 PTD7
0
14 VSS
PTB2
*
12 VDD
PTD2
9
13 VEE
PTB1
8
10 RW
25
21
7
11 RS
26
PTB0
6
9 E
22
27
5
8 DB7
24
PTD1
PTA5
4
7 DB6
19
PTD
23
3
6 DB5
16
IRQ1
PTA4
9
2
5 DB4
1
OSC2/PTA6
8
1
4 DB3
10pF
PTA3
MC68HC908JL3
5
PTA2
OSC1
VSS
4
6
3 DB2
PTA1
2
2 DB1
20K
PTA0
DB0
RST
1
26
VDD
7
1K
+5
1
3
10k
FIGURA 7.2 Circuito para manejo de teclado y LCD.
$INCLUDE ‘JL3REGS.INC’ * Etiquetas de dirección en el microcontrolador FLASH EQU $EC00 RESET EQU $FFFE TIMER EQU $FFF2 TECLADO EQU $FFE0 RAM EQU $80 COPD EQU 0 ALFAOMEGA - FREESCALE
129
MÓDULO DE INTERRUPCIÓN POR TECLADO (KBI)
* Definición de los bits que se utilizarán en el microcontrolador para manejar las líneas RS y E de la pantalla de cristal liquido, en este caso los pines PTD2 y PTD3, respectivamente. E
EQU
3
RS
EQU
2
* Definición de registros a utilizar en la RAM ORG
RAM
CONT
RMB
1
* Definición de la dirección a partir de la cual se escribe el programa ORG FLASH NÚMEROS DB
%01110011
;1
DB
%01110101
;2
DB
%01110110
;3
DB
%01101011
;4
DB
%01101101
;5
DB
%01101110
;6
DB
%01011011
;7
DB
%01011101
;8
DB
%01011110
;9
DB
%00111011
;*
DB
%00111101
;0
DB
%00111110
;#
ASCII
DB
‘123456789*0#’
INICIO
BSET
COPD,CONFIG1
; Deshabilita el COP
CLRA CLRX CLRH MOV
#$00,PORTB
MOV
#$FF,DDRB
MOV
#00,PORTD
MOV
#$FF,DDRD
; Configuración de Puertos B y D
* Rutina de configuración del teclado MOV
#$FF,PORTA MOV
ALFAOMEGA - FREESCALE
#%10000111,DDRA
130
JUAN CARLOS VESGA FERREIRA
MOV
#%11111000,PTAPUE
BSET
IMASKK,KBSCR
MOV
#%01111000,KBIER
BCLR
ACKK,KBSCR
BCLR
IMASKK,KBSCR
;Habilitar Resist. Pull-Up ;Hab. Pines de Interrup. ;Hab. Interrup. de Tecl.
* Configuración del timer MOV
#$36,TSC
MOV
#$02,TMODH
MOV
#$FF,TMODL
MOV
#$46,TSC
BSR
RETARDO
; Retardo
BSR
LCD_CONF
; Configuración de la Pantalla LCD
CLI FIN
BRA
; Habilitar Interrupciones FIN
; Bucle infinito
* Rutina de configuración de LCD a 8 bits LCD_CONF
LDA
#%00111000
BSR
CONTROL
LDA
#%00001110
BSR
CONTROL
LDA
#%00000001
BSR
CONTROL
LDA
#%00000110
BSR
CONTROL
LDA
#%10000000
BSR
CONTROL
; Configuración de LCD ; Configuración de Parpadeo ; Borrar pantalla ; Configuración de desplazam. ; Dirección inicial para escritura
RTS * Retardo para inicializar la LCD RETARDO PSHH PSHX LDA
#$FF
DELAY
LDHX
#$00EF
LOOP1
AIX
#-1
CPHX
#0
BNE
LOOP1
ALFAOMEGA - FREESCALE
131
MÓDULO DE INTERRUPCIÓN POR TECLADO (KBI)
DECA BNE
DELAY
PULX PULH RTS * Retardo para pulso de envío de comandos o datos a la LCD RETARDO1 LDA DELAY1
#$FF
DECA BNE
DELAY1
RTS * Rutina de envío de comandos o caracteres a la LCD a 4 bits CONTROL BCLR
RS,PORTD
; Bit RS = 0
BRA
DATO2
; Saltar a DATO2
DATO
BSET
RS,PORTD
; Bit RS = 1
DATO2
BSET
E,PORTD
; Bit E = 1
STA
CHAR
; CHAR = A
AND
#$F0
; Tomar los bits de más peso
STA
PORTB
; se envían al Puerto B
BSR
RETARDO1
; Pulso de Retardo1
BCLR
E,PORTD
; Bit E = 0
CLR
PORTB
; Borra Puerto B
BSR
RETARDO1
; Pulso de Retardo1
BSET
E,PORTD
; Bit E = 1
LDA
CHAR
; A = CHAR
NSA AND
; Intercambia nibles de A #$F0
; bits de menos peso antes
STA
PORTB
; se envían al Puerto B
BSR
RETARDO1
; Pulso de retardo1
BCLR
E,PORTD
; Bit E = 0
BSR
RETARDO1
; Pulso de retardo1
CLR
PORTB
; Borra Puerto B
RTS
; Retorna de Subrutina
* Rutina de interrupción por timer INT_TIM
ALFAOMEGA - FREESCALE
PSHH
;Guarda H en el Stack
BRSET 0,PORTA,LOOP3
;si PTA0 es “1”,saltar
132
JUAN CARLOS VESGA FERREIRA
MOV BRA
#%11111011,ROT_COL SALTO
;si no, iniciar valor ;de Columna
ROR
ROT_COL
;Rotar a Dcha. La Columna
SALTO
MOV
ROT_COL,PORTA
;Enviar el dato al PORTA
FIN_TIM
BCLR
7,TSC
;timer Atendido
PULH
;Sacar H del Stack
RTI
;Fin de Interrupción
* Rutina de interrupción por teclado INT_TECL PSHH
;Guarda H en el Stack
LOOP2
CLRX
LOOP4
CPX
#$12T
;Comparar X con 12
;X = 0
BEQ
FIN_TEC
;Si X=12, Teclas no pulsadas
LDA
PORTA
;si no, Leer valor puerto A
CMP
NÚMEROS,X
;Compara con la tabla
BEQ
LOOP5
;si coincide, ir a LOOP5
INCX LOOP5 FIN_TEC
;Si no, X = X+1
BRA
LOOP4
;Siguiente valor de Tabla
LDA
ASCII,X
;Cargar carácter
BSR
DATO
;Enviarlo a la LCD
BSET
ACKK,KBSCR
;Interrupción atendida
PULH
;Sacar H del Stack
RTI
;Salir de la Interrupción
ORG
TIMER
DW
INT_TIM
ORG
TECLADO
DW
INT_TECL
ORG
RESET
DW
INICIO
ALFAOMEGA - FREESCALE
MÓDULO DE INTERRUPCIÓN POR TECLADO (KBI)
133
EJERCICIOS PROPUESTOS Escribir una rutina que permita leer una clave de acceso mediante un teclado matricial de 16 teclas. La clave debe estar constituida por 4 dígitos. Si por algún motivo se digita erróneamente alguna tecla, se debe permitir las funciones de borrado y aceptación de la clave con tres intentos como máximo para introducir la clave correctamente. En una empresa de bebidas se desea diseñar un sistema que permita contar botellas, las cuales se trasladan mediante una banda transportadora, ubicándolas finalmente en una caja. El sistema debe permitir configurar el cupo máximo de botellas por caja.
RESUMEN DEL CAPÍTULO Un teclado se utiliza constantemente en diferentes aplicaciones electrónicas; sin embargo, debido a su funcionamiento interno es necesario recurrir a un conjunto de dispositivos adicionales o, en muchos casos, a rutinas complicadas e innecesarias provocando un aumento en la complejidad del sistema y un desgaste a nivel de programación. Una de las bondades presentes en los microcontroladores Freescale es la inclusión de un módulo especializado en el manejo de este tipo de dispositivos, lo cual favorece al diseñador a la hora de desarrollar alguna aplicación que lo requiera. El módulo de interrupción por teclado posee siete (7) interrupciones externas manipuladas de manera independiente cada una, y se encuentran disponibles entre los pines PTA[0:6]. Entre las características del módulo de interrupción por teclado podemos mencionar las siguientes: Siete pines de interrupción por teclado habilitadas por separado cada una, y un solo bit indicador de la interrupción. Configuración de resistencias de Pull-Up. Interrupción programable por flanco o flanco/nivel. Salida en modo de bajo consumo. Los teclados pueden tener varias configuraciones, unos pueden ser matriciales y otros lineales. Los teclados lineales son los que poseen tantos pines como teclas presenten y dos pines más para alimentación. Cada
ALFAOMEGA - FREESCALE
134
JUAN CARLOS VESGA FERREIRA
vez que se pulse una tecla, ésta enviará a su respectivo pin un nivel bajo, identificando con ello la tecla pulsada. Los teclados matriciales, los cuales son los más utilizados en la gran mayoría de aplicaciones electrónicas, se encuentran configurados, como su nombre lo indica, como una matriz. Para identificar una tecla, ésta se encuentra direccionada por una fila y una columna, y la intersección de ellas encasilla la tecla.
ALFAOMEGA - FREESCALE
Capítulo
8
INTERRUPCIÓN EXTERNA IRQ OBJETIVO DEL CAPÍTULO Al finalizar el capítulo el estudiante estará en capacidad de configurar, manipular e interactuar con la interrupción IRQ, la cual se emplea en el campo de detección de eventos externos como conteos, cambios de estado de dispositivos,
CONOCIMIENTOS PREVIOS etc.Para iniciar el estudio del presente capítulo es necesario que el lector posea un concepto básico de lo que es una interrupción, una comprensión general de las características propias de ésta familia de microcontroladores y su programación.
8.1 INTRODUCCIÓN Esta interrupción es una de las más utilizadas en las aplicaciones desarrolladas con los microcontroladores Freescale, se emplea comúnmente para conteo de personas, medidores de velocidad, detección de cruce por cero en circuitos de control de potencia, detección de eventos, alarmas, etc. Es una de las interrupciones que se encuentran relacionadas con el bit bandera de interrupciones I. Como la mayoría de los estudiantes están familiarizados con la programación de microcontroladores PIC, esta interrupción es el equivalente a la interrupción por flanco presente en el pin RB0 del PIC16F84. Una de las ventajas que presentan las interrupciones en los microcontroladores Freescale, a diferencia de otros fabricantes, es que su manejo se hace de manera sectorizada, es decir, que para cada interrupción existe una dirección única a la cual irá el microcontrolador automáticamente en el momento de ocurrir determinada interrupción, y no como ocurre
136
JUAN CARLOS VESGA FERREIRA
con otras familias en las que el manejo de interrupciones se hace de manera jerarquizada, es decir, hay que clasificar las interrupciones según el grado de importancia que considere el diseñador a la hora de realizar cualquier aplicación, con la necesidad de preguntar una interrupción tras otra hasta que se encuentre el evento deseado.
8.2
CARACTERÍSTICAS
El módulo de la IRQ tiene las siguientes características: Un pin para interrupción externa, Bit de control de interrupción IRQ Buffer de histéresis Interrupción programable como flanco o como flanco y nivel Reconocimiento de interrupción automática Resistencias de Pull-Up seleccionable
8.3
DESCRIPCIÓN DEL FUNCIONAMIENTO
Un 0 lógico aplicado al pin de interrupción externo produce la interrupción. A continuación se muestra aquí el esquema correspondiente a la estructura del módulo IRQ.
ACK1
Bus de direcciones internas
RESET VECTOR FETCH DECODER
A la CPU para las instrucciones BIL/BIH
VDD IRQPUD
INTERNAL PLLLUP
VDD
DEYICE
IRQF1 D
CLR
Q
SYNCHRONIZER
CK
IRQ1
Demanda de la interrupción IRQ1
IRQ1 FF IMASK1
MODE1 Detección de alto voltaje
Al modo de Selección Lógico
FIGURA 8.1 Módulo de interrupción IRQ. ALFAOMEGA - FREESCALE
137
INTERRUPCIÓN EXTERNA IRQ
El pin de interrupción externa es configurable por software, activado por flanco descendente o por flanco descendente y nivel bajo. El bit MODE1 en el registro ISCR controla el grado de sensibilidad para la activación del pin. Es necesario tener en cuenta que se debe atender la interrupción y salir de ella antes de que el pin de interrupción retorne a 1 lógico siempre y cuando se tenga configurado como flanco y nivel lógico bajo.
8.3
REGISTRO DE CONTROL DE ESTADO DE IRQ (INTSCR)
Dirección $001D
Leer
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
0
0
0
0
IRQF1
Escribir
Bit 2
Bit 1
Bit 0
IMASK1
MODE 1
0 ACK1
Este registro es el encargado del control y monitoreo de las operaciones del módulo IRQ. El ISCR tiene las siguientes funciones: Mostrar el estado de la bandera IRQ1 Limpiar el latch IRQ1 Control de activación del pin de interrupción IRQ1 Bit IRQ1 y demanda de interrupciones
IRQF1: BANDERA IRQ1 Este bit es de sólo lectura y se encuentra en 1 lógico cuando la interrupción IRQ1 está pendiente. 1: Interrupción IRQ1 pendiente 0: Interrupción IRQ1 no pendiente
ACK1: bit de reconocimiento de demanda de la interrupción IRQ1 Se debe escribir en este bit un 1 lógico solamente cuando se desee borrar el bit IRQF1, y siempre será leído este bit como 0 lógico.
MASK1: bit de habilitación de la interrupción IRQ1 1: Interrupción IRQ1 deshabilitada 0: Interrupción IRQ1 habilitada
MODE1: bit de selección de flanco/nivel para IRQ1 Este bit controla la activación del pin IRQ1 1: Interrupción IRQ1 activada por flanco descendente y nivel lógico bajo 0: Interrupción IRQ1 activada por flanco descendente solamente ALFAOMEGA - FREESCALE
138
JUAN CARLOS VESGA FERREIRA
Se debe recordar que en el registro CONFIG2, ubicado en la dirección $001E, se encuentra un bit llamado IRQPUD que habilita o deshabilita las resistencias de Pull-Up existentes entre el pin IRQ1 y VDD.
8.4
EJERCICIOS RESUELTOS
Enunciado del problema Se desea utilizar una matriz de LEDS a través de la cual se visualizará una letra. Esta cambiará cada vez que se presione el pulsador SW1, el cual mediante la interrupción IRQ efectúa este cambio.
Solución La matriz de LEDS a utilizar se encuentra constituida por 7 filas y 5 columnas, así:
PTD3
PTD4
PTD5
PTD6
PTD7
C1
C2
C3
C4
C5
LETRA C1
C2
C3
C4
C5
PTB0
F1
0
0
1
0
0
PTB1
F2
0
1
0
1
0
PTB2
F3
1
0
0
0
1
PTB3
F4
1
0
0
0
1
PTB4
F5
1
1
1
1
1
PTB5
F6
1
0
0
0
1
PTB6
F7
1
0
0
0
1
NO USADO
0
0
0
0
0
FIGURA 8.2 Esquema de configuración de la matriz de Leds.7 Se debe tener en cuenta que las filas encienden con 1 lógico y las columnas con 0 lógico. En la gráfica se ilustra el ejemplo de la construcción de la letra “A”, los cinco valores correspondientes a las cinco columnas son los valores establecidos en la tabla vistos de izquierda a derecha y considerando que el valor que se encuentra en cada columna corresponde a un registro de 8 bits, el cual es enviado al puerto B, según la habilitación de la columna por un nivel bajo. A continuación se ilustra el circuito desarrollado con el microcontrolador MC68HC908JK3.
ALFAOMEGA - FREESCALE
139
INTERRUPCIÓN EXTERNA IRQ
5V
1K 5
1
20pF
OSC1 PTB2 OSC2/PTA6
IRQ1
PTB3 PTB4 PTB5
5V
+ VDD
PTB7
7
13
8
12
9
11
10
8 7
11 1
6 2
5
PTB6
14
2
5V
VSS
PTD2 PTD3 PTD4 PTD5
10K SWI
PTD6 PTD7
17 16 19
220
10
220
9
220
Circuito de control de matriz de Leds con MC68HC908JK3.
FLASH RESET
ALFAOMEGA - FREESCALE
EQU $EC00 EQU $FFFE
220
18
FIGURA 8.3
$INCLUDE ‘JL3REGS.INC’
220
12
4
4
PTB1
6
+
4MHz
10M
1
3
PTB0
RST
4
20pF
15
3
20
140
JUAN CARLOS VESGA FERREIRA
RAM
EQU $80
IMASK1
EQU 1
MODE1
EQU 0
ACK1
EQU 2 ORG
ROTADOR RMB
RAM 1
LETRA
RMB
1
CONTA
RMB
1
BANDERA RMB
1
ORG
FLASH
TABLA DB %01111100,%00010010,%00010001,%00010010,%01111100 ;A DB %01111111,%01001001,%01001001,%01001001,%00110110 ;B DB %00111110,%01000001,%01000001,%01000001,%00100010 ;C DB %01111111,%01000001,%01000001,%01000001,%00111110 ;D DB %01111111,%01001001,%01001001,%01001001,%01001001 ;E DB %01111111,%00001001,%00001001,%00001001,%00001001 ;F DB %00111110,%01001001,%01001001,%01001001,%00110010 ;G DB %01111111,%00001000,%00001000,%00001000,%01111111 ;H DB %01000001,%01000001,%01111111,%01000001,%01000001 ;I DB %01110000,%01000000,%01000000,%01000001,%00111111 ;J DB %01111111,%00001000,%00010100,%00100010,%01000001 ;K DB %01111111,%01000000,%01000000,%01000000,%01000000 ;L DB %01111111,%00000010,%00000100,%00000010,%01111111 ;M DB %01111111,%00000100,%00001000,%00010000,%01111111 ;N DB %00111110,%01000001,%01000001,%01000001,%00111110 ;O DB %01111111,%00001001,%00001001,%00001001,%00000110 ;P DB %00111110,%01000001,%01010001,%01100001,%01111110 ;Q DB %01111111,%00001001,%00011001,%00101001,%01000110 ;R DB %00100110,%01001001,%01001001,%01001001,%00110010 ;S DB %00000001,%00000001,%01111111,%00000001,%00000001 ;T INICIO
BSET
0,CONFIG1
* CONFIGURACIÓN DE LOS PUERTOS MOV
#$00,PORTB
MOV
#$FF,DDRB
MOV
#$00,PORTD
MOV
#$FF,DDRD
;Configura el Puerto B como Salida ;Configura el Puerto D como Salida
ALFAOMEGA - FREESCALE
141
INTERRUPCIÓN EXTERNA IRQ
* CONFIGURACIÓN DE LA INTERRUPCIÓN IRQ BCLR BCLR
IMASK1,INTSCR MODE1,INTSCR
CLI CLR
;Habilita Interrupciones LETRA
;Borra el registro Tabla
BANDERA
;Borra registro Bandera
LDA
LETRA
;Carga en A el número de letra
STA
CONTA
;y se almacena en CONTA
CLR
PORTB
;Borrar PTOB
INIC_ROT CLR
CLRX ROT
;Habilita Interrupción de la IRQ ;IRQ por flanco descendente
;Borra X, apuntador OFFSET de Tabla
MOV
#%11110111,ROTADOR
MOV
ROTADOR,PORTD
;Enciende la Columna
LDX
CONTA
;Carga en X el valor de CONTA
LDA
TABLA,X
;Va a la tabla y carga la fila X de la Letra
STA
PORTB
;y la envía al PTOB
BSR
RETARDO
;Llama retardo
INC
CONTA
;Siguiente Fila, CONTA = CONTA+1
BRCLR 7,PORTD,INIC_ROT
; Si ya se visualizaron las 5 columnas
BRSET 1,BANDERA,INIC_ROT
;Siguiente Letra
ROL
ROTADOR
;Rota a siguiente Columna
CLR
PORTB
;Borra el PTOB
BRA
ROT
;Salta a ROT, Sig. fila y Columna
#$70
;A = $70
RETARDO LDA SALTO2
LDHX
#$0002
;H:X = $0002
SALTO1
AIX
#-1
;H:X = H:X - 1
CPHX
#$0
;Compare H:X con Cero
BNE
SALTO1
;Si no es cero, saltar a SALTO1
SALTO2
;Si A no es Cero, Saltar a SALTO2
DECA BNE
;A = A - 1
RTS
;Salir de Subrutina
* INTERRUPCIÓN IRQ IRQ
ALFAOMEGA - FREESCALE
PSHH
;Guarda H en el Stack
BIH
FIN_IRQ
;Salta a FIN_IRQ si el Pin IRQ = 1
LDA
LETRA
;si no, cargar el No. de Fila
CMP
#95T
;A = 95 decimal?
BEQ
SALTO_IRQ
;Si A = 95, ir a COMENZAR
142
JUAN CARLOS VESGA FERREIRA
FIN_IRQ
LDA
LETRA
;Si no, A=LETRA
ADD
#$5
;A = A+5
STA
LETRA
;LETRA = A
BSET
1,BANDERA
;Cambio de Letra
BSET
ACK1,INTSCR
;Borra Interrupción por IRQ
PULH
;Saca H del Stack
RTI
;Salir de Interrupción
COMENZAR CLR
LETRA
;Se posiciona en la primera letra
BRA
FIN_IRQ
;Ir a FIN_IRQ
ORG
$FFFA
DW
IRQ
ORG
RESET
DW
INICIO
; Cuando ocurre interrupción por IRQ ; Salta a INICIO cuando se energiza
EJERCICIOS PROPUESTOS Se desea escribir un programa que permita contar el número de personas que ingresan y salen de un almacén, mediante la interrupción externa IRQ y utilizando 2 sensores fotorresistivos. La cantidad de personas debe visualizarse a través de una pantalla de cristal líquido. Se desea diseñar un programa que permita controlar una alarma hogareña, de tal manera que cuando un sensor de tipo magnético que se encuentra en la puerta quede abierto se active una sirena mediante la generación de un tren de pulsos a una frecuencia entre 400 y 500 Hz. Diseñar un programa que permita controlar las luces de una habitación utilizando relés, de tal modo que cuando se detecte la presencia de una persona mediante un sensor de movimiento, el sistema debe encenderlas o apagarlas, siempre y cuando se encuentre oscura la habitación.
ALFAOMEGA - FREESCALE
143
INTERRUPCIÓN EXTERNA IRQ
RESUMEN DEL CAPÍTULO Una de las ventajas que presentan las interrupciones en los microcontroladores Freescale con respecto a otros fabricantes es que su manejo se hace de manera sectorizada, es decir, que para cada interrupción existe una dirección única a la cual irá el microcontrolador automáticamente en el momento de ocurrir determinada interrupción, y no como ocurre con otras familias en las que el manejo de interrupciones se hace de manera jerarquizada, es decir, hay que clasificar las interrupciones según el grado de importancia que considere el diseñador a la hora de realizar cualquier aplicación, con la necesidad de preguntar una interrupción tras otra hasta que se encuentre el evento deseado. El módulo de la IRQ tiene las siguientes características: un pin para interrupción externa IRQ1, bit de control de interrupción IRQ, buffer de histéresis, interrupción programable como flanco o como flanco y nivel, reconocimiento de interrupción automática, resistencias de Pull-Up seleccionable. El pin de interrupción externa es configurable por software, activado por flanco descendente o por flanco descendente y nivel bajo. El bit MODE1 en el registro ISCR controla el grado de sensibilidad para la activación del pin IRQ1.
ALFAOMEGA - FREESCALE
Capítulo
9
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE OBJETIVO DEL CAPÍTULO Al finalizar el capítulo el estudiante estará familiarizado con el uso del timer existente en el microcontrolador, con el cual a través de la interrupción podrá programar, configurar y manipular según sus necesidades, desarrollando además la habilidad para trabajar tiempos a diferentes escalas y momentos, y aplicarlos en todo desarrollo que lo requiera.
CONOCIMIENTOS PREVIOS Para iniciar el estudio del presente capítulo es necesario que el lector posea conceptos básicos sobre temporización y uso de interrupciones.
9.1 INTRODUCCIÓN Uno de los recursos que más se necesitan a la hora de desarrollar cualquier aplicación es el manejo de tiempos o retardos. Los retardos se pueden realizar de dos formas: la primera consiste en valerse del retardo presente durante la ejecución de una instrucción, la cual depende del número de ciclos que requiere para su ejecución y de la frecuencia del oscilador encargado del funcionamiento del microcontrolador; teniendo en cuenta estos dos factores es posible generar un retardo a base de instrucciones, forma que en la mayoría de los casos es poco práctica ya que obliga a que el microcontrolador dirija su atención a este proceso y descuide otros procesos que en un momento dado representen mayor importancia. La segunda forma y, de paso, la más adecuada y utilizada, es valerse de un poderoso recurso presente en la gran mayoría de microcontroladores existentes, que es utilizar el timer. El timer se puede considerar como un registro contador que incrementa su valor a medida que
146
JUAN CARLOS VESGA FERREIRA
transcurre el tiempo, donde el incremento depende de varios factores como son la frecuencia del oscilador y la configuración del prescalador. En este capítulo se hace énfasis en el manejo, configuración y programación de este recurso tan importante a la hora de diseñar cualquier aplicación de índole electrónica. El TIM es un módulo de tiempo de dos canales que recibe, compara, envía y tiene funciones de modulación por ancho de pulso PWM.
INTERNAL BUS CLOCK
PRESCALER SELECT
PRESCALER
TSTOP
PS2
TRST
PS1
16-BIT COUNTER
PS0
TOF TOIE
16-BIT COMPARATOR
INTERRUPT LOGIC
TMODH:TMODL CHANNEL 0
ELS0B
TOVO
ELS0A
CH0MAX
16-BIT COMPARATOR TCH0H:TCH0L
CH0F
16-BIT LATCH
INTERNAL BUS
MS0A CHANNEL 1
ELS1B
MS0B
ELS1A
16-BIT COMPARATOR TCH1H:TCH1L
CH0IE TOV1 CH1MAX
PORT LOGIC
TCH0
INTERRUPT LOGIC
PORT LOGIC
TCH1
CH1F
16-BIT LATCH MS1A
CH1IE
INTERRUPT LOGIC
FIGURA 9.1 Módulo interno del TIM.
En el puerto D se encuentran dos pines que manejan dos canales de I/O con el TIM, siendo estos PTD4/ TCH0 y PTD5/TCH1. Cada canal de I/O es programable de manera independiente como un pin de captura de entrada (“Input Compare”) o una comparación de salida (“Output Compare”). El pin PTD4/TCH0 puede ser configurado como un buffer de comparación de salida o un pin de buffer PWM.
ALFAOMEGA - FREESCALE
147
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
9.2
FUENTES DE INTERRUPCIÓN DEBIDAS AL TIM
TOF: Bandera de rebosamiento del TIM El bit TOF se coloca en 1 lógico cuando el valor del contador del TIM retorna al valor $0000 después de haber alcanzado el valor MÓDULO (valor de rebosamiento), esta interrupción es habilitada cuando el bit TOIE tiene como valor 1 lógico.
BANDERAS DE CANALES (CH1F:CH0F). El bit CHxF se coloca en 1 lógico cuando una captura
de entrada o una comparación de salida ocurren en el canal x. Automáticamente el canal x genera la llamada a la interrupción controlada por el canal x y ésta se habilita cuando el bit CHxIE tiene como valor 1 lógico.
9.3
REGISTRO TSC
Dirección $0020 Bit 7 Leer Escribir
Bit 6
Bit 5
TOIE
TSTOP
TOF 0
Bit 4
Bit 3
0
0
TRST
Bit 2
Bit 1
Bit 0
PS2
PS1
PS0
TOF: bit indicador de rebosamiento del TIM Este bit se coloca en 1 cuando el contador del TIM se reinicia o tiene como valor $0000 después de alcanzar el valor MÓDULO; para borrar este bit basta con leer el valor del registro TSC. 1: El contador del TIM ha alcanzado el valor MÓDULO 0: El contador del TIM no ha alcanzado el valor MÓDULO
TOIE: bit habilitador de interrupción por rebosamiento del TIM 1: Interrupción por rebosamiento del TIM habilitada 0: Interrupción por rebosamiento del TIM deshabilitada
TSTOP: bit de parada del TIM Este bit permite parar el contador del TIM 1: Detiene el contador del TIM 0: Activa el contador del TIM
TRST: bit de Reset del TIM 1: Prescalador y contador del TIM son limpiados 0: Sin efecto ALFAOMEGA - FREESCALE
148
JUAN CARLOS VESGA FERREIRA
PS[2:0]: selección de bits para configuración del prescalador Estos bits permiten configurar el prescalador del TIM, dependiendo de la combinación tal como lo ilustra la siguiente tabla.
PS2
PS1
PS0
PRESCALADOR DEL TIM
0
0
0
RELOJ INTERNO ÷ 1
0
0
1
RELOJ INTERNO ÷ 2
0
1
0
RELOJ INTERNO ÷ 4
0
1
1
RELOJ INTERNO ÷ 8
1
0
0
RELOJ INTERNO ÷ 16
1
0
1
RELOJ INTERNO ÷ 32
1
1
0
RELOJ INTERNO ÷ 64
1
1
1
NO DISPONIBLE
TABLA 9.1 Configuración del prescalador.
9.4
REGISTRO CONTADOR DEL TIM TCNTH/L
REGISTRO TCNTH Dirección $0021
Leer
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Escribir
REGISTRO TCNTL Dirección $0022 Leer
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
Escribir ALFAOMEGA - FREESCALE
149
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
Estos dos registros (TCNTH:TCNTL) son de sólo lectura y contienen los bytes alto y bajo del contador del TIM, respectivamente.
9.5 REGISTRO MÓDULO DE TIEMPO TMODH/L REGISTRO TMODH Dirección $0023 Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
Leer Escribir
REGISTRO TMODL Dirección $0024 Leer Escribir
Estos dos registros contienen el valor MÓDULO para el contador del TIM. Cuando el contador del TIM alcanza el valor MÓDULO, el bit TOF se coloca en 1 lógico y comienza nuevamente el conteo desde $0000.
9.6 REGISTRO DE ESTADO Y CONTROL DE CANALES DEL TIM Cada uno de los registros de control de estado de canales del TIM tiene las siguientes características: Banderas de capturas de entrada (Input Compare) y comparación de salidas (Output Compare). Habilitación de capturas de entrada y comparación de salidas. Selección de capturas de entrada, comparación de salidas o funciones PWM. Selección de flanco ascendente/descendente como valores de arranque. Selección de salidas bipolares (toggle) en el rebosamiento del TIM. Selección de duración del ciclo PWM en 100%. Habilitación de buffers en comparación de salidas/funciones PWM.
ALFAOMEGA - FREESCALE
150
JUAN CARLOS VESGA FERREIRA
REGISTRO TSC0 Dirección $0025 Bit 7 Leer Escribir
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
CH0IE
MS0B
MS0A
ELS0B
ELS0A
TOV0
CH0MAX
CH0F 0
REGISTRO TSC1 Dirección $0028 Bit 7 Leer
Bit 6
CH1F
Escribir
0
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
MS1A
ELS1B
ELS1A
TOV1
CH1MAX
0 CH1IE
CHxF: bit bandera del canal x Este bit se coloca en 1 lógico cuando ocurre un flanco en el pin del canal x. Cuando el canal x es una comparación de salida, este bit se coloca en 1 lógico cuando en el registro contador del TIM es igual al valor del registro del TIM del canal x. 1: Captura de entrada o comparación de salida en el canal x. 0: NO captura de entrada o comparación de salida en el canal x.
CHxIE: bit de habilitación de interrupción del canal x 1: Habilita la interrupción 0: Deshabilita la interrupción
MSxB: modo de selección del bit B Este bit selecciona el buffer para comparación de salida/operación PWM. Este bit existe solamente en el registro TSC0. Si este bit tiene valor de 1 lógico, el TSC1 queda deshabilitado y regresa el TCH1 a propósitos generales de I/O. 1: Habilita el buffer para comparación de salida/operaciones PWM. 0: Deshabilita el buffer para comparación de salida/operaciones PWM.
MSxA: modo de selección del bit A Cuando ELSxB:A ≠ 00
ALFAOMEGA - FREESCALE
151
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
1: Sin buffer de comparación de salida/operación PWM. 0: Operación captura de entrada. Cuando ELSxB:A = 00 Selecciona el valor inicial del pin TCHx 1: 0 lógico como valor inicial. 0: 1 lógico como valor inicial.
ELSxB y ELSxA: bits de selección de flanco o nivel Para comprender mejor la combinación anterior se debe tener en cuenta la siguiente tabla.
MSxB
MSxA
ELSxB
ELSXA
X
0
0
0
MODO Salida prestablecida
X
1
0
0
0
0
0
1
0
0
1
0
0
0
1
1
0
1
0
1
1
1
0
0
1
1
1
1
X
0
1
1
X
1
0
1
X
1
1
0
Captura de entrada
CONFIGURACIÓN Pin bajo control del puerto 1 lógico como valor inicial Pin bajo control del puerto 0 lógico como valor inicial Captura con solo flanco ascendente Captura con solo flanco descendente Captura con solo flanco ascend. o descend.
Comparación de salida o PWM
Salida de Toggle en comparación Salida 0 lógica en comparación Salida 1 lógica en comparación
Comparación de salida con buffer o PWM con buffer
Salida de Toggle en comparación Salida 0 lógica en comparación Salida 1 lógica en comparación
TABLA 9.2 Selección de modos, flancos y niveles.
TOVx: bit de habilitación de toggle en rebosamiento 1: Aplicar toggle al pin del canal x cuando el contador del TIM se rebose. 0: No aplicar toggle al pin del canal x cuando el contador del TIM se rebose.
CHxMAX: bit de máxima duración del ciclo en el canal x Cuando TOVx es un 0 lógico y se coloca el bit CHxMAX en 1 lógico, se configura la duración del ciclo PWM a 100% y esto se mantiene hasta que el bit CHxMAX es borrado.
ALFAOMEGA - FREESCALE
152
JUAN CARLOS VESGA FERREIRA
9.7
LOS REGISTROS DE CANALES DEL TIM (TCH0H/L:TCH1H/L)
Estos registros contienen el valor del contador del TIM de la función captura de entrada o comparación de salida. El estado de estos registros después del reset es desconocido.
REGISTRO TCH0H Dirección $0026 Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Bit 15
Bit 14
Bit 13
Bit 12
EBit 11
Bit 10
Bit 9
Bit 8
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Bit 7
Bit 6
Bit 5
Bit 4
EBit 3
Bit 2
Bit 1
Bit 0
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Bit 15
Bit 14
Bit 13
Bit 12
EBit 11
Bit 10
Bit 9
Bit 8
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Bit 7
Bit 6
Bit 5
Bit 4
EBit 3
Bit 2
Bit 1
Bit 0
Leer Escribir
REGISTRO TCH0L Dirección $0027 Leer Escribir
REGISTRO TCH1H Dirección $0029
Leer Escribir
REGISTRO TCH1L Dirección $002A Leer Escribir
ALFAOMEGA - FREESCALE
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
9.8
153
FUNCIÓN PWM
La modulación del ancho de pulso se usa para generar una forma de onda con un período fijo y el ciclo de servicio variable. El ciclo de servicio es la relación existente entre el tiempo en el cual la señal se mantiene en un estado alto “1” y el tiempo en que la señal se mantiene en un estado bajo “0”. Según lo anterior, se puede decir que en la modulación PWM se pueden presentar diferentes frecuencias y resoluciones. La frecuencia está definida por el período o duración de un ciclo completo de la señal (T = TH + TL; TH: tiempo de duración para un nivel alto, TL: tiempo de duración para un nivel bajo) y la resolución es definida por el número de pasos discretos del ciclo de servicio que se pueden poner a 1. Si se configura una modulación PWM de 8 bits, es decir, configurando el rebosamiento del timer a un valor de 256, que para lograrlo se debe establecer (TMODH:TMODL = 00:FF), permitiendo especificar el ciclo de servicio en 256 pasos. El uso de señales PWM tiene lugar comúnmente en diferentes tipos de aplicaciones como, por ejemplo: Generación de señales sinusoidales, obtenida de la generación de una onda cuadrada a un frecuencia fija (programada según el período de la señal PWM con 50% de ciclo de servicio), aplicada posteriormente a un filtro pasabajo con frecuencia de corte igual a la frecuencia de la señal cuadrado. Control de velocidad de un motor de DC. Control de carga de una batería. Control de intensidad de luz en una lámpara (Dimmer).
Entre las funciones más importantes del módulo TIM están las funciones Output Compare e Input Compare. A continuación se explicará en detalle cada una de ellas y se indicarán los beneficios que brindan a la hora de realizar cualquier implementación que requiera el uso de este módulo.
Función “Output Compare” La función de comparación de salida usa los siguientes componentes para su óptimo funcionamiento: Módulo de tiempo de 16 bits Un comparador Un ‘latch’ de 16-bits de comparación de salida (Output Compare) Un pin de salida Un pin de control lógico y una fuente de interrupción. La función Output Compare realiza, como su nombre lo indica, una comparación entre el valor presente en el registro (TCNTH:TCNTL) y el valor de contador del módulo TIM propio del canal (TCHxH:TCHxL); cuando estos dos valores son iguales se genera una interrupción visualizada en los bits TCHxF.
ALFAOMEGA - FREESCALE
154
JUAN CARLOS VESGA FERREIRA
Opcionalmente se puede establecer un pin de salida a 1, 0 o conmutando (toggle) cuando la acción anterior ocurra. Al utilizar las interrupciones permite al usuario acercarse a tiempos muy precisos y crear eventos externos usando los pins de entrada/salida de comparación.
Aplicaciones ‘Output Compare’ Se puede utlizar la función Output Compare en una gran variedad de aplicaciones que van desde cronometraje o temporización de eventos hasta control de niveles de tensión en cargas eléctricas. Usando el pin de salida configurado en modo (toggle) se puede implementar un simple pulso con ancho variable, generar una frecuencia de salida variable o una señal de modulación de ancho de pulso (PWM). Estas técnicas serán explicadas con mayor detalle en secciones posteriores.
Función Input Capture La función Input Capture se implementa a través de un pin de entrada con modo de selección de flanco, detector lógico y lógica de interrupción; utiliza un contador de 16 bits permitiendo cronometrar eventos externos para ser referenciados al contador que corre libremente de 16 bits. Se puede configurar el pin de la entrada para buscar un flanco de subida, un flanco de bajada o cualquier tipo de flanco. Cuando se activan las interrupciones y se ha detectado el flanco seleccionado, el latch del Input Capture se carga con el valor del contador que corre libremente y graba un tiempo de cuando ocurrió el evento, colocando en 1 el indicador de estado y generarando así la interrupción correspondiente.
Aplicaciones Input Capture Se puede usar la función Input Capture en una gran diversidad de aplicaciones. Se emplea comúnmente para realizar una referencia de tiempo absoluto de un evento externo, medir un período de entrada, entre otras aplicaciones. Cuando se utilizan períodos largos, la rutina de servicio se ajusta al número de interrupciones de desbordamiento del timer que ocurren entre el primer y segundo flanco. Usando el Input Capture se puede medir el ancho de un pulso de entrada, función semejante a la medición de un período, excepto que la segunda captura se configura para detectar el flanco de bajada en vez del flanco de subida inicial. Cuando se requieren anchos de pulso muy cortos, se pueden utilizar los dos canales del timer para mirar la misma señal con un canal para detectar el flanco de subida y el otro canal para detectar el flanco de bajada permitiendo la toma de tiempos inferiores a 125 ns. En caso de no requerirse la función de captura de entrada, se puede utilizar el pin de captura de entrada como una línea de interrupción adicional. La operación de PWM o modulación por ancho de pulso presenta en la actualidad una gran variedad de aplicaciones en control y comunicaciones, y este microcontrolador tiene esta valiosa herramienta entre sus funciones.
9.9
IMPLEMENTACIÓN PWM EN EL MICROCONTROLADOR
Para efectuar la operación de modulación por ancho de pulso se debe tener en cuenta que el PERÍODO de la operación PWM se adjudica en los registros MÓDULO del contador del TIM y en los registros TCHxH/L se ALFAOMEGA - FREESCALE
155
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
configura el ancho del pulso. La comparación de salida en el registro del canal del TIM determina al ancho del pulso de la señal PWM. El tiempo entre el rebosamiento y la comparación de la salida corresponde al ancho del pulso.
Período y ancho de pulso de la operación PWM El valor de los registros módulo y la selección prescalador de salida determina la frecuencia de salida de la señal PWM. La frecuencia es variable en 256 incrementos. Si TMODH:TMODL = $00FF (255), los registros contadores de módulo producen un período de 256 veces el período del reloj interno si el valor del prescalador es 000 (configuración del prescalador en el registro TSC).
REBOSAMIENTO
REBOSAMIENTO
REBOSAMIENTO
PERÍODO
ANCHO DEL PULSO
TCHx
COMPARACIÓN DE SALIDA
COMPARACIÓN DE SALIDA
COMPARACIÓN DE SALIDA
FIGURA 9.3 Período y ancho de pulso.
El valor de los registros de canal del TIM determina el ancho del pulso de la señal PWM. Aquí también se tiene una variación de 256 incrementos. Si, por ejemplo, el valor $0080 (128), es almacenado en los registros canales del TIM, produce una duración de ciclo de (128/256), es decir, 50%. El hecho de utilizar salida PWM con buffer o sin buffer puede traer ventajas en cuanto al control de la señal PWM, ya que permite manejarse en forma síncrona o asíncrona, respectivamente, y con ello evitar que haya errores al cambiar valores antiguos para el valor del ancho de pulso. Una operación asíncrona puede causar operaciones incorrectas por uno o dos períodos de PWM. Por ejemplo, colocar un nuevo valor antes de que el contador alcance el valor antiguo pero después de que alcance el valor nuevo, evita alguna comparación durante ese período de PWM; sin embargo, utilizando la bandera de interrupción de rebosamiento del TIM podrá escribir un nuevo dato, pero si éste provoca un ancho muy pequeño puede llegar a omitirse. ALFAOMEGA - FREESCALE
156
JUAN CARLOS VESGA FERREIRA
Por ello se recomienda efectuar el siguiente procedimiento para evitar tener problemas al sincronizar la señal PWM sin buffer: Cuando se cambie a un ancho de pulso corto o largo se debe habilitar la interrupción de comparación de salida del canal x y escribir un nuevo dato en la rutina de interrupción de comparación de salida. Esta interrupción ocurre cuando finaliza el pulso actual de PWM.
INICIALIZACIÓN DE LA FUNCIÓN PWM Para lograr un correcto funcionamiento de la función PWM: 1. Efectuar las siguientes tareas en el registro TSC: a. TSTOP = 1 b. TRST =1 2. En los registros (TMODH:TMODL), escribir el valor requerido para el período PWM. 3. En los registros (TCHxH:TCHxL), escribir el valor requerido para el ancho del pulso. 4. En el registro TSCx, efectuar las siguientes tareas: a. escribir 0:1 (para comparación de salida sin buffer o señales PWM) o escribir 1:0 (para comparación de salida con buffer o señales PWM) en el modo de selección de bits MSxB:MSxA; ver tabla de selección de modos y flancos expuesta anteriormente. b. TOVx = 1 c. escribir 1:0 (para 0 lógico la comparación de salida) o escribir 1:1 (para 1 lógico la comparación de salida) en el bit de selección para flanco/nivel ELSxB:ELSxA. 5. TSTOP = 0 del registro TSC El registro TSCR0 es el que se encarga de controlar y monitorear la señal PWM. Cuando se coloca en el bit TOVx = 0 tiene como resultado que la duración del ciclo de salida es 0%.
9.10
EJERCICIOS RESUELTOS
En el capítulo referente al Manejo de temporización básica se introdujeron conceptos básicos sobre temporización utilizando como mecanismo de retardo el generado por cada instrucción, de acuerdo con los ciclos de máquina propios de cada instrucción a la hora de ejecutar la función específica para la que fueron diseñados.
ALFAOMEGA - FREESCALE
157
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
Ejercicio 1 Enunciado A continuación se ilustra un ejemplo en el que se desea escribir una rutina que permita efectuar un retardo de 1 segundo (otra forma diferente), utilizando simplemente el retardo efectuado por el número de ciclos de una instrucción y considerando la frecuencia del oscilador de 4MHz.
Solución Teniendo en cuenta que: 1 CICLO DE MÁQUINA = 4 CICLOS DEL OSCILADOR Entonces si se considera esto, se puede afirmar que: Frecuencia del bus interno = 1 ciclo de máquina =
Frec.Oscilador
4 1 = Frec.BusInterno
4 Frec.Oscilador
En nuestro caso, si el oscilador tiene una frecuencia de 4 MHz, el tiempo que tarda un ciclo de máquina es 1 s. Como se desea escribir una rutina que genere un retardo de 1 segundo, se puede pensar que: 1 segundo = (1 s) x (10 ciclos) x 1000 x 100 = ((((1 s) 10 ciclos) 1000 veces ) 100 veces) Considerando lo anterior, la rutina que cumple lo deseado es la siguiente: RETARDO
PSHH
; Almacena H en el Stack
2Cic.
PSHX
; Almacena X en el Stack
2Cic.
LDA DELAY
#$64
LDHX #$03E8
; A = $64 , 100 Veces
2Cic.
; H:X = $03E8 , 1000 Veces
3Cic.
* Rutina de retardo 10 ciclos de máquina LOOP1
AIX
#-1
; HX = HX – 1
2Cic.
CPHX
#0
; Compara HX con 0
3Cic.
; Nada
1Cic.
NOP NOP BNE
1Cic. LOOP1
DECA BNE ALFAOMEGA - FREESCALE
DELAY
; Si no es Cero, saltar a LOOP1
3Cic.
; Decrementar A
1Cic.
; Si no es Cero, saltar a DELAY1
3Cic.
158
JUAN CARLOS VESGA FERREIRA
PULX
; Sacar X del Stack
2Cic.
PULH
; Sacar H del Stack
2Cic.
RTS
; Retornar de Subrutina
4Cic.
Para obtener el mismo efecto anterior se deben seguir estos pasos, los cuales son necesarios para la óptima configuración del timer. 1. Se deshabilita la interrupción por TIM, TOIE = 0 2. se detiene el TIM, TSTOP = 1 3. Se borra el TIM, TRST = 1 4. Se configura el prescalador, en este caso se configura a 64 5. Se establecen los valores de rebosamiento en los registros TMODH/L 6. Se habilita el TIM para interrupción TOIE = 1 7. Se deshabilita el reset del TIM, TRST = 0 8. Se permite el conteo del TIM , TSTOP = 0 Teniendo en cuenta lo anterior, el resultado es el siguiente: 1 segundo =
4 Frec.Oscilador
x Pr escalador x (TMODH : TMODL)
Si consideramos la frecuencia del oscilador nuevamente de 4 MHz y el valor del prescalador = 64, el valor correspondiente a TMODH:TMODL será: TMODH : TMODL =
1 Segundo x Frec. Oscilador 4 x Pr escalador
=
1 x 4 x 106 4 x 64
= 15625
La respuesta es 15625 en decimal, o su equivalente 3D09 en hexadecimal, indicando este último que los valores de TMODH y TMODL serán $3D y $09, respectivamente. CONF_TIM
MOV
#$36,TSC
;B’00110110’ al TSC, Pasos 1,2,3 y 4
MOV
#$3D,TMODH
;TMODH = , Paso 5
MOV
#$09,TMODL
;TMODL 0 , Paso 5
MOV
#$46,TSC
;B’01000110’ al TSC, Pasos 6,7 y 8
Esta rutina provocará que el timer genere una interrupción cada segundo, la cual deberá ser atendida. Para observar el efecto consideremos el siguiente ejemplo, en el que se desea que un LED ubicado en el pin PTB7 se encienda y se apague cada segundo.
ALFAOMEGA - FREESCALE
159
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
5V
1K
20
20pF
+ 4
4MHz
10M
1
3 4
1
20pF
PTB0
RST
PTB1 OSC1 PTB2 OSC2/PTA6
IRQ1
PTB3 PTB4 PTB5
+5V
+ 5
VDD
PTB6 PTB7
15 14 13 12 11 8 7 6 220
2
VSS
PTD2 PTD3 PTD4 PTD5 PTD6 PTD7
FIGURA 9.4 Circuito aplicado al ejemplo con MC68HC908JK3. $ INCLUDE ‘JL3REGS.INC’ FLASH EQU $ECE0 RESET EQU $FFFE TIMER EQU $FFF2 RAM EQU $80 ALFAOMEGA - FREESCALE
17 16 19 18 10 9
160
JUAN CARLOS VESGA FERREIRA
COPD LED
EQU EQU ORG BANDERA RMB ORG INICIO BSET MOV MOV SALTO BCLR BSR BSET BSR BRA RETARDO CONF_TIM
ESPERA FIN TIM FIN_INT
BCLR MOV MOV MOV MOV CLI
0 7 RAM 1 FLASH COPD,CONFIG1 #$00,PORTB #$80,DDRB 7,PORTB RETARDO 7,PORTB RETARDO SALTO LED,BANDERA #$36,TSC #$3D,TMODH #$09,TMODL #$46,TSC
;Registro Bandera de 1 Seg. ;Inhabilita el COPD ;PTB7 = 0 ;Config. el PTB7 salidas ;PTB7 = 0 ;Retardo de 1 Segundo ;PTB7 = 1 ;Retardo de 1 Segundo ;Ir a Salto ;No ha transcurrido 1 Seg. ;B’00110110’ al TSC ;TMODH = $3D ;TMODL = $09 ;B’01000110’ al TSC ;Habilita Interrupciones
BRSET LED,BANDERA,FIN BRA ESPERA RTS
;Si transcurrió 1 Seg. FIN ;Si nó, ir a Espera ;Retorno de Subrutina
PSHH BSET BCLR PULH RTI
LED,BANDERA 7,TSC
;Guarda el registro H ;Ya transcurrió 1 Segundo ;Borra bandera de interrup ;Sacar H del Stack
ORG DW
RESET INICIO
;Cuando se energiza… ;Ir a INICIO
ORG DW
TIMER TIM
;Interrupción por TIMER ;Ir a TIM
Ejercicio 2 Enunciado Otra aplicación importante en el campo de la electrónica es el control de motores paso a paso. Estos motores están presentes en una gran cantidad de aplicaciones como controles de posición, robótica, impresoras, etc. ALFAOMEGA - FREESCALE
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
161
GRIS ROJO
BOBINA 2 BOBINA 4
BOBINA 3
BOBINA 1
Explicación de teoría adicional para solución del problema
AMARILLO NEGRO
NEGRO AMARILLO
ROJO GRIS
FIGURA 9.5 Esquema de un motor paso a paso.
Estos motores están conformados internamente por cuatro bobinas, las cuales dependiendo de la forma en que son energizadas, permiten obtener diferentes configuraciones de movimiento para el motor. Entre las configuraciones de movimiento se pueden mencionar: 1. CONFIGURACIÓN OLA. Esta configuración consiste en que solamente una de las cuatro bobinas es energizada, permitiendo con ello un movimiento del motor armónico, pero sin mucho torque. 2. CONFIGURACIÓN PASO. Consiste en que dos de las cuatro bobinas se encuentran energizadas; con ello se permite avanzar en la misma forma que la configuración anterior, pero con un mayor torque. 3. CONFIGURACIÓN MEDIO PASO. Esta configuración es útil cuando se desea que el desplazamiento del motor sea, como su nombre lo dice, a medio paso, es decir, un motor por lo general se identifica por el número de pasos que requiere para dar un giro completo (360 grados). Esta configuración permite que si el motor es de 50 pasos se convierta en uno de 100 pasos, permitiendo con ello un movimiento más fino. La configuración consiste en que alternadamente se van energizando dos bobinas y luego una y así sucesivamente hasta completar con esta combinación las cuatro bobinas.
ALFAOMEGA - FREESCALE
162
JUAN CARLOS VESGA FERREIRA
A continuación se ilustra la forma en que son energizadas las bobinas para cada una de las configuraciones, teniendo en cuenta que la bobina es energizada donde se encuentre un 1 lógico y desenergizada cuando se encuentre un 0 lógico.
CONFIGURACIÓN OLA BOBINA 1
BOBINA 2
BOBINA 3
BOBINA 4
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
TABLA 9.2 Configuración Ola.
CONFIGURACIÓN PASO BOBINA 1
BOBINA 2
BOBINA 3
BOBINA 4
1
1
0
0
0
1
1
0
0
0
1
1
1
0
0
1
TABLA 9.3 Configuración Paso.
ALFAOMEGA - FREESCALE
163
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
CONFIGURACIÓN MEDIO PASO BOBINA 1
BOBINA 2
BOBINA 3
BOBINA 4
1
1
0
0
0
1
0
0
0
1
1
0
0
0
1
0
0
0
1
1
0
0
0
1
1
0
0
1
1
0
0
0
TABLA 9.4 Configuración Medio paso.
Se desea escribir un programa que permita controlar un motor paso a paso en las diferentes configuraciones Paso, Medio paso y Ola y el sentido de giro, ya sea horario o antihorario, mediante 3 interruptores que se encuentran en los pines PTB[7:5] configurados así: Los interruptores correspondientes a los pines PTB[7:6] controlan según su combinación el tipo de configuración para el motor paso a paso.
PTB7
PTB6
Configuración
0
0
Deterner
0
1
Ola
1
0
Paso
1
1
Medio Paso
TABLA 9.5 Estado de bits para control del motor.
ALFAOMEGA - FREESCALE
164
JUAN CARLOS VESGA FERREIRA
El interruptor del pin PTB5 controla el sentido de giro. CONFIGURACIÓN PASO
TABLA 9.6
PTB5
Sentido
0
Horario
1
Antohorario
Estado de bits para control del motor.
12V VDD
5V
1
3
+
10M
4
4MHz
4
1
20pF
PTB0
RST
PTB1 OSC1 PTB2 OSC2/PTA6
IRQ1
PTB3 PTB4 PTB5
5V
+ 5
VDD
PTB6 PTB7
10K
13
10K
12
10K
11
10K
8
5V R2
VSS
PTD2 PTD3 PTD4
FIGURA 9.6 Circuito de control de motor paso a paso con JK3.
PTD5 PTD6 PTD7
17 16
L1
L2
5V 10K 1
2
L3
5V
7 6
1
14
2
10K
3
15
R3
20
20pF
4
L4
1K
10K 1
10K 1
81
82
83
2
2
2
19 18 10 9
ALFAOMEGA - FREESCALE
165
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
$ INCLUDE ‘JL3REGS.INC’ FLASH
EQU
$ECE0
RESET
EQU
$FFFE
TIMER
EQU
$FFF2
RAM
EQU
$80
COPD
EQU
0
*BANDERAS *BIT 0
;0 SENTIDO A 1 SENTIDO B
*BIT 1
;1 SIGUE TABLA 0 INICIO DE TABLA
ORG
RAM
DATO
RMB
1
BANDERA RMB
1
MAXIMO
RMB
1
MINIMO
RMB
1
ORG
FLASH
TABLA
INICIO
DB
$0,$8,$4,$2,$1,$0
; OLA
DB
$0,$0C,$6,$3,$9,$0
; PASO
DB
$0,$0C,$4,$6,$2,$3,$1,$9,$8,$0
; MEDIO PASO
BSET
COPD,CONFIG1
;Inhabilita el COPD
CLRA
;A = 0
CLRX
;X = 0
CLR
BANDERA
;BANDERAS = 0
CLR
DATO
;DATO = 0
* Configuración de Puertos MOV
#$00,PORTB
;Puerto B Borrado
MOV
#$0F,DDRB
;PTB[7:4] IN, PTB[3:0] OUT
* Configuración del TIMER MOV
#$36,TSC
MOV
#$00,TMODH
MOV
#$14,TMODL
MOV
#$46,TSC
CLI MOV
ALFAOMEGA - FREESCALE
;Habilita Interrupciones #0T,MINIMO
;Valores Iniciales
166
JUAN CARLOS VESGA FERREIRA
MOV
#0T,MAXIMO
;Valores Iniciales
* Rutina que controla el motor en sentido horario HORARIO CLR NEXTH
PORTB
;Apaga Motor
MOV
MINIMO,DATO
;Valor minimo de Config.
LDX
DATO
;X = MINIMO
LDA
TABLA,X
;Carga combinación
BEQ
HORARIO
;si Valor = 0,salta
STA SALTOH
PORTB
;si no, la envía al puerto
BRCLR 2,BANDERA,SALTOH
; Espera el retardo
BCLR
2,BANDERA
;Borra bandera de Retardo
INC
DATO
;Siguiente combinación
BRSET 5,PORTB,AHORARIO
;Verifica sentido
BRA
;Salta a siguiente valor
NEXTH
* Rutina que controla el motor en sentido antihorario AHORARIO CLR NEXTAH
PORTB
;Apaga Motor
MOV
MAXIMO,DATO
;Valor mínimo de Config.
LDX
DATO
;X = MAXIMO
LDA
TABLA,X
;Carga combinación
BEQ
AHORARIO
;si Valor = 0,salta
STA
PORTB
SALTOAH BRCLR 2,BANDERA,SALTOAH
TIM
; Espera el retardo
BCLR
2,BANDERA
;Borra bandera de Retardo
DEC
DATO
;Siguiente combinación
BRCLR 5,PORTB,HORARIO
;Verifica sentido
BRA
NEXTAH
;Salta a siguiente Valor
2,BANDERA
;Bit de Retardo cumplido
LDA
PORTB
;Leer PTOB
AND
#$C0
;Extrae bits 7 y 6
PSHH BSET
CBEQA #$40,S_OLA
FIN_INT
;si no, la envía al puerto
;Configuración OLA?
CBEQA #$80,S_PASO
;Configuración PASO?
CBEQA #$C0,S_MPASO
;Configuración MPASO?
CBEQA #$40,PARAR
;Parar Motor?
BCLR
;Interrupción Atendida
7,TSC
PULH RTI ALFAOMEGA - FREESCALE
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
167
* Rutinas de valores MINIMO Y MAXIMO según la configuración S_OLA
S_PASO
MOV
#1T,MINIMO
MOV
#4T,MAXIMO
BRA
FIN_INT
MOV
#7T,MINIMO
MOV
#10T,MAXIMO
BRA
FIN_INT
S_MPASO MOV
#13T,MINIMO
MOV
#20T,MAXIMO
BRA
FIN_INT
MOV
#0T,MINIMO
MOV
#5T,MAXIMO
BRA
FIN_INT
PARAR
ORG
TIMER
DW
TIM
ORG
RESET
DW
INICIO
Ejercicio 3 Enunciado El objetivo del trabajo práctico es la implementación del módulo PWM en el control de intensidad de una lámpara dicroica, utilizando un microcontrolador de la familia HC08 Freescale (JK3). El sistema contará con de un pulsador, en donde cada vez que se presione incrementará la intensidad de la lámpara pasando duraciones del ciclo de tabajo PWM de 10%, 20%, 30%, 40% o 50%.
En caso de encontrarse en el ciclo de trabajo de 50% y es presionado el pulsador, éste provocará reiniciar nuevamente adjudicando un modo de trabajo de 10%.
ALFAOMEGA - FREESCALE
168
JUAN CARLOS VESGA FERREIRA
Solución 5V
1K
20
20pF
+ 4
4MHz
10M
1
3 4
1
20pF
PTB0
RST
PTB1 OSC1 PTB2 OSC2/PTA6
IRQ1
PTB3 PTB4 PTB5
5V
+ 5
VDD
PTB6 PTB7
15 14 13 12 11 8 7 6 12V
2 5V +5
VSS
PTD2 PTD3 PTD4
10K
PTD5 PTD6 PTD7
17 16 19
10K
18 10 9
FIGURA 9.7 Esquemático control de intensidad lumínica. Como se requiere que el control PWM realice diferentes porcentajes de servicio, se necesita crear una tabla que almacene la secuencia de los valores correspondientes al registro TCH0L, para su aplicación. ALFAOMEGA - FREESCALE
169
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
Como se estableció que el registro TMODH:TMODL=$00FF El valor del prescalador del timer se desea configurar en 64 Frecuencia del oscilador 4 MHz. Se calcularía que el valor del período de la señal PWM será: Período PWM =
=
4 Frec. escalador
= Pr escalador x (TMODH : TMODL)
4 4 * 106
x 64 x (255) = 16.32 ms
Los valores del registro TCH0L serán entonces los siguientes mediante el uso de una regla de 3 simple, manteniendo siempre el valor del registro TCH0H=00h: TCH0L =
255 100
x (% servicio)
% servicio
Valor calculado Valor TCH0L
10
25.5
28
20
51
51
30
76.5
77
40
102
102
50
127.5
128
TABLA 9.7 Valores calculados para TCH0L según % de servicio.
Quedando la tabla definida de la siguiente forma: TABLA
DB
$0,26T, 51T, 77T, 102T, 128T,$0
Los valores extremos de la tabla ($0) se establecieron como 0 para que cuando se detecte el último valor de la tabla, al presionar nuevamente el pulsador se inicialice el proceso secuencial de valores. Teniendo en cuenta lo expuesto antes sobre los pasos de inicialización del módulo PWM, el programa final quedaría de la siguiente forma:
ALFAOMEGA - FREESCALE
170
JUAN CARLOS VESGA FERREIRA
$ INCLUDE ‘JL3REGS.INC’ FLASH
EQU
$ECE0
RESET
EQU
$FFFE
T_PWM
EQU
$FFF6
RAM
EQU
$80
COPD
EQU
0
IMASK1
EQU
1
MODE1
EQU
0
ACK1
EQU
2
ORG
RAM
RMB
1
MAXIMO RMB
1
MINIMO RMB
1
DATO
ORG
FLASH
TABLA
DB
$0,26T, 52T, 77T, 102T, 128T,$0
INICIO
BSET
COPD,CONFIG1
;Inhabilita el COPD
CLRA
;A = 0
CLRX
;X = 0
CLR
DATO
;DATO = 0
* Configuración de Puertos MOV
#$00,PORTD
;Puerto D Borrado
MOV
#$FF,DDRD
;PTD[7:0] OUT
* Configuración del TIMER MOV
#$36,TSC
MOV
#$00,TMODH
MOV
#255T,TMODL
MOV
#$00,TCH0H
MOV
#26T,TCH0L
;Inicia Ciclo de Servicio 10%
MOV
#%01101010,TSC0
;Configuración PWM
MOV
#$06,TSC
* CONFIGURACIÓN DE LA INTERRUPCIÓN IRQ BCLR BCLR CLI
IMASK1,INTSCR MODE1,INTSCR
;Habilita Interrupción de la IRQ ;IRQ por flanco descendente ;Habilita Interrupciones
ALFAOMEGA - FREESCALE
171
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
SALTO
BRA
SALTO
PWM
PSHH
BCLR
7,TSC0
;Bucle infinito ;Interrupción Atendida
PULH RTI * INTERRUPCIÓN IRQ IRQ
PSHH BIH
;Guarda H en el Stack FIN_IRQ
;Salta a FIN_IRQ si el Pin IRQ = 1
LDA
TABLA,X
;Carga VALOR (% SERVICIO)
BEQ
LIMPIAR
;si Valor = 0,salta
STA
TCH0L
;Cambia el % de servicio
BSET
ACK1,INTSCR
;Borra Interrupción por IRQ
INCX DIMMER
FIN_IRQ
LIMPIAR
PULH
;Saca H del Stack
RTI
;Salir de Interrupción
CLRX
;X = 0
BRA
FIN_IRQ
ORG
T_PWM
DW
PWM
ORG
$FFFA
DW
IRQ
ORG
RESET
DW
INICIO
; Cuando ocurre interrupción por IRQ
Ejercicio 4 Enunciado DISEÑO DE UN TACÓMETRO CON EL 68HC908JL3/JK3/JK1 A continuación se explica toda la teoría de funcionamiento y aparece el código correspondiente al desarrollo, pero este programa presenta algunos errores. Usted debe encontrarlos y corregirlos para lograr el óptimo funcionamiento. Esto con el fin de reforzar sus conocimientos sobre la programación de esta familia de microcontroladores.
ALFAOMEGA - FREESCALE
172
JUAN CARLOS VESGA FERREIRA
Teoría adicional para solución del problema Como se sabe, una de las finalidades de varios proyectos en el ambiente industrial es el control de velocidad de motores. En muchos proyectos se utilizan sensores de efecto Hall, entre otros, que permiten cuantificar la tensión del motor y con ello, de manera indirecta, la velocidad. El procedimiento de determinar la velocidad de un motor por medio del conocimiento de la tensión existente en sus terminales es válido siempre y cuando el motor se analice en vacío, pero un motor siempre tendrá carga afectando en una forma considerable la corriente y la velocidad. Por esta razón se pensó en diseñar un circuito que permita cuantificar la velocidad de una manera precisa sin depender de factores como voltajes o corrientes. Por ello se diseñó entonces un tacómetro óptico que permite sensar la velocidad del motor de manera práctica. El método para sensar la velocidad es el siguiente: Un haz de luz es enviado directamente hacia una fotocelda, la cual varía su resistencia según la intensidad recibida; en el rotor se encuentra un aspa que va cortando el haz de luz, provocando una variación alterna de resistencia en la fotocelda, la cual se refleja en el circuito en forma de voltaje. Esta variación de tensión se asemeja a una onda diente de sierra y según la luminosidad del ambiente varía su valor pico y promedio. Si se pensaba en un divisor de tensión para compararse con la señal de la fotocelda, funcionaría, pero para cierto grado de luminosidad del ambiente, generando con ello un problema. Por esto se pensó que en vez de compararse con un voltaje fijo producido por un divisor de tensión, se comparara con un voltaje que variara en la misma forma como variaba el voltaje de la fotocelda según el grado de luminosidad existente en ese momento. Este voltaje se tomó directamente de la señal, que por medio de un condensador y una resistencia se obtendría un valor muy semejante al valor promedio de la onda, que al compararse con la señal genera una onda cuadrada perfecta directamente proporcional a la velocidad del motor. Esta señal es aplicada al pin IRQ del microcontrolador, el cual mediante la interrupción externa detecta los cambios de nivel, los cuantifica y los envía al PC o a una pantalla de cristal liquido para visualizar posteriormente la velocidad, tomándose en total tres muestras en un tiempo de 0.5 segundos cada una para luego ser promediadas y visualizadas. Se consideró este tiempo de 0.5 segundos, con el fin de permitir la cuantificación de la velocidad en el motor tanto en instantes en donde la velocidad es baja como en aquellos en que la velocidad es alta. El esquema utilizado para sensar la velocidad es el siguiente.
ALFAOMEGA - FREESCALE
173
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
5V
1K IRQ
+ -
+
100
220uF
1M
5V 220
FIGURA 9.8 Esquema del tacómetro óptico.
NOTA En la rutina no se encuentra incluida la forma de visualización de la información. Esto se deja libre para que el estudiante escoja la que más le agrade.
Solución parcial del problema $INCLUDE ‘JL3REGS.INC’ FLASH
EQU
$EC00
TIMER
EQU
$FFF2
RESET
EQU
$FFFE
ALFAOMEGA - FREESCALE
174
JUAN CARLOS VESGA FERREIRA
RAM
EQU
IMASK1
EQU 1
MODE1
EQU 0
ACK1
EQU 2
CONTA
$80
ORG
RAM
RMB
1
MUESTRA1 RMB
1
MUESTRA2 RMB
1
MUESTRA3 RMB
1
INICIO
ORG
FLASH
BSET
0,CONFIG1
* configuración de los PUERTOS MOV
#$00,PORTB
MOV
#$FF,DDRB
MOV
#$00,PORTD
MOV
#$FF,DDRD
;Configura el Puerto B como Salida ;Configura el Puerto D como Salida
* Configuración del TIMER a 0.5 segundos MOV
#$36,TSC
MOV
#$1E,TMODH
MOV
#$60,TMODL
MOV
#$46,TSC
* Configuración de la interrupción IRQ BCLR BCLR
IMASK1,INTSCR MODE1,INTSCR
CLI OTRO
CLR
;Habilita Interrupción de la IRQ ;IRQ por flanco descendente ;Habilita Interrupciones
CONTA
CLRX
ESPERA
CLR
MUESTRA1
CLR
MUESTRA2
CLR
MUESTRA3
LDA
CONTA
CMP
#3T
BNE
ESPERA
CLRA ADD
MUESTRA1 ALFAOMEGA - FREESCALE
175
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
ADD
MUESTRA2
ADD
MUESTRA3
LDX
#3T
DIV LDX
#120T
MUL
En este espacio se debe colocar la rutina para visualizar la información correspondiente a la velocidad del motor. Se debe tener en cuenta que la información ya está dada en r.p.m. (revoluciones por minuto), donde estas revoluciones se encuentran en el registro X:A.
BRA
OTRO
* INTERRUPCIÓN IRQ IRQ FIN_IRQ
TIM
PSHH
;Guarda H en el Stack
INC
$81,X
;Incrementa Muestra1/2/3
BSET
ACK1,INTSCR
;Borra Interrupción por IRQ
PULH
;Saca H del Stack
RTI
;Salir de Interrupción
PSHH INCX
FIN_INT
;Siguiente Muestra
INC
CONTA
;Siguiente Muestra
BCLR
7,TSC
;Interrupción Atendida
PULH RTI
ALFAOMEGA - FREESCALE
ORG
$FFFA
DW
IRQ
ORG
RESET
DW
INICIO
ORG
TIMER
DW
TIM
; Cuando ocurre interrupción por IRQ ; Salta a INICIO cuando se energiza ;Salta a interrupción por TIMER
176
JUAN CARLOS VESGA FERREIRA
EJERCICIOS PROPUESTOS En una empresa se desea diseñar un sistema que permita medir el período de oscilación de un péndulo. Este tiempo comienza a tomarse desde el momento en que el péndulo corta un haz de luz, el cual es monitoreado mediante la interrupción externa IRQ y finaliza la medición de tiempo cuando este haz es cortado por segunda vez por el péndulo indicando el final de la oscilación. Se deben tomar 10 muestras y visualizar el promedio de ellas mediante una pantalla de cristal líquido configurada a 4 bits. Diseñar un control de velocidad de un motor DC utilizando la modulación por ancho de pulso sin utilizar el módulo que ofrece este microcontrolador para tal fin, permitiendo configurar la duración del ciclo en porcentaje a través de un teclado matricial de 12 teclas. Diseñar una rutina que permita generar una onda cuadrada a través del pin PTB0, permitiendo configurar su frecuencia mediante un teclado de 12 teclas.
RESUMEN DEL CAPÍTULO CAPÍTULO Los retardos se pueden realizar de dos maneras: la primera consiste en valerse del retardo presente durante la ejecución de una instrucción, la cual depende del número de ciclos que requiere para su ejecución y de la frecuencia del oscilador encargado del funcionamiento del microcontrolador; teniendo en cuenta estos dos factores es posible generar un retardo a base de instrucciones, forma que en la mayoría de los casos es poco práctica. La segunda es valerse de un poderoso recurso presente en la gran mayoría de microcontroladores existentes, y es utilizar el timer. Este se puede considerar como un registro contador que incrementa su valor a medida que transcurre el tiempo, donde el incremento depende de varios factores: la frecuencia del oscilador y la configuración del prescalador. Con el módulo de temporización TIM se tiene acceso a las siguientes características: Banderas de capturas de entrada (Input Compare) y comparación de salidas (Output Compare). Habilitación de capturas de entrada y comparación de salidas. Selección de capturas de entrada, comparación de salidas o funciones PWM. Selección de flanco ascendente/descendente como valores de arranque.
ALFAOMEGA - FREESCALE
MANEJO DE LOS TIMERS CON EL MICROCONTROLADOR MOTOROLA-FREESCALE
177
Selección de salidas bipolares (toggle) en el rebosamiento del TIM. Selección de duración del ciclo PWM en 100%. Habilitación de buffers en comparación de salidas/funciones PWM. Una de las funciones más importantes del módulo TIM son las funciones Output Compare e Input Compare. Se puede utilizar la función Output Compare en una gran variedad de aplicaciones que van desde cronometraje o temporización de eventos hasta control de niveles de tensión en cargas eléctricas. Usando el ‘input capture’ se puede medir el ancho de un pulso de entrada, función semejante a la medición de un período, excepto que la segunda captura se configura para detectar el flanco de bajada en vez del flanco de subida inicial. Cuando se requieren anchos de pulso muy cortos, se pueden utilizar los dos canales del timer para mirar la misma señal con un canal para detectar el flanco de subida y el otro canal para detectar el flanco de bajada permitiendo la toma de tiempos inferiores a 125 ns.
ALFAOMEGA - FREESCALE
10
Capítulo CONVERSOR ANÁLOGO/DIGITAL OBJETIVO DEL CAPÍTULO Al finalizar el capítulo el estudiante estará familiarizado con el uso del conversor análogodigital presente en el microcontrolador, su configuración, manipulación y utilización en aplicaciones de tipo instrumental en donde comúnmente se encuentra y que contribuye con un alto valor agregado en el momento de desarrollar cualquier aplicación.
CONOCIMIENTOS PREVIOS Para iniciar el estudio del presente capítulo es necesario que el lector posea conceptos básicos sobre electrónica básica, temporización y uso de interrupciones.
10.1 INTRODUCCIÓN En muchas situaciones se requiere controlar un proceso mediante un sistema digital. Las señales provenientes del mundo exterior son de tipo analógico como, por ejemplo, presión, temperatura, velocidad, etc., en las cuales mediante el uso de un transductor se realiza el proceso de conversión de un tipo de señal física a una señal eléctrica. Pero un sistema de control electrónico solamente reconoce señales de tipo digital, y por ello se requiere convertir las señales analógicas a digitales. Los conversores análogo/digital (A/D) y digital/ análogo (D/A) son elementos que permiten a los sistemas digitales “comunicarse” con sistemas analógicos, tanto para recibir como para suministrar información. Se debe tener en cuenta que una señal digital es aquella que toma sólo dos valores lógicos (0, 1) traducidos a valores discretos de voltaje, y en cambio una señal analógica es aquella que varía en forma continua desde un mínimo hasta un máximo de corriente o voltaje.
180
JUAN CARLOS VESGA FERREIRA
La conversión de una señal analógica a una digital puede realizarse mediante diferentes formas: Conversores con salida en paralelo. Como su nombre lo indica, entregan la señal binaria en paralelo, equivalente al valor de la variable analógica de entrada. Son los conversores comúnmente usados por su fácil acoplamiento a procesadores digitales. Conversores de salida en serie. También codifican la señal de entrada en una señal digital, entregándola por una única salida serie. Cuando se desea realizar un diseño haciendo uso de un conversor análogo digital, hay necesidad de conocer como mínimo algunos parámetros propios del conversor, que pueden suministrar información valiosa en el momento de decidir si es adecuado o no para su implementación en el diseño. Estos parámetros son: Características de diseño. Constituyen los parámetros básicos de los conversores A/D. Código binario. Corresponden al tipo de código que se obtiene en la salida del conversor: binario natural o BCD. Resolución. Se define como el mínimo incremento necesario en la entrada analógica para que se produzca un cambio en la combinación binaria de salida. Tiempo de conversión. Es el intervalo de tiempo necesario para que se produzca una conversión. Características de funcionamiento. Las características reales de un conversor A/D también difieren de las ideales, y corresponden a las mismas definidas para el conversor A/D. A continuación se explicarán el funcionamiento del conversor A/D y el modo de trabajarlo por medio de los canales adjudicados para tal fin. Algunas características del módulo de conversión A/D son: Tiene 12 canales con entrada multiplexada. Utiliza el método de aproximaciones sucesivas para la conversión. Tiene 8 bits de resolución. Presenta conversión sencilla o continua. Tiene bandera de conversión completa o interrupción de conversión completa. Cuenta con reloj de conversión A/D seleccionable.
10.2 DESCRIPCIÓN DEL FUNCIONAMIENTO DEL ADC Doce canales de conversión A/D se encuentran disponibles, distribuidos en los pines PTB[0:7] y PTD[0:3]. Existe internamente un multiplexor análogo que se encarga de seleccionar el canal para efectuar la conversión, y este voltaje de entrada se conoce como ADCVIN. El ADCVIN es convertido mediante el método de aproximaciones sucesivas basado en contadores, y cuando la conversión está completa la bandera de fin de conversión y la bandera de interrupción por fin de conversión toman el valor 1 lógico.
ALFAOMEGA - FREESCALE
181
CONVERSOR ANÁLOGO/DIGITAL
10.3 VOLTAJE DE CONVERSIÓN Cuando el voltaje de entrada es igual a VDD, el valor de la conversión es $FF (escala completa). Si el voltaje de entrada es igual a VSS, el valor de la conversión es $00. Téngase en cuenta que el valor del voltaje de entrada NO debe encontrarse por fuera del rango entre VDD y VSS.
10.4 TIEMPO DE CONVERSIÓN Se requieren 16 relojes internos para hacer la conversión A/D. El conversor A/D comienza la conversión en el primer flanco ascendente del reloj interno de conversión. Si el reloj interno está seleccionado para funcionar a 1 MHz, entonces una conversión tarda en completarse 16 µs. Con un reloj de 1 MHz, la máxima rata de muestra es de 62.5 kHz. Tiempo de conversión =
16 ciclos de reloj Frecuencia de reloj de ADC
10.5 REGISTRO DE CONTROL Y ESTADO DEL A/D (ADSCR) Dirección $003C Bit 7 Leer Escribir
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
AEIN
ADC0
CH4
CH3
CH2
CH1
CH0
COCO
COCO: bit de conversión completa Cuando el AIEN se encuentra en 0 lógico, se puede utilizar el bit COCO como indicador de fin de conversión. 1: Conversión Completa (AIEN = 0) 0: Conversión No Completa (AIEN = 0) Cuando el bit AIEN está en 1 lógico (Habilitación de Interrupción), el bit COCO tendrá siempre el valor 0 lógico.
AIEN: Habilitación de la Interrupción de Conversión A/D Cuando este bit se coloca en 1, se habilita la opción de interrupción al finalizar la conversión A/D. El bit de interrupción es limpiado cuando el dato es leído.
ALFAOMEGA - FREESCALE
182
JUAN CARLOS VESGA FERREIRA
1: Habilitar interrupción por fin de Conversión A/D 0: Deshabilitar interrupción por fin de Conversión A/D
ADCO: bit de Conversión Continua Cuando este bit se encuentra en 1, constantemente va actualizando el valor del registro ADR (registro donde se almacena el valor de la conversión) y sólo una conversión es almacenada cuando este bit está en 0 lógico. 1: Conversión A/D continua 0: Una sola conversión A/D
ADCH[4:0]: bits de selección de canales de conversión A/D Se debe tener en cuenta que con sólo 5 bits se configura el canal a utilizar para la conversión y además el tipo de señal a recibir, ya sea analógica o digital.
CH4
CH3
CH2
CH1
CH0
CANAL A/D
PIN
0
0
0
0
0
ADC1
PTB0
0
0
0
0
1
ADC1
PTB1
0
0
0
1
0
ADC2
PTB2
0
0
0
1
1
ADC3
PTB3
0
0
1
0
0
ADC4
PTB4
0
0
1
0
1
ADC5
PTB5
0
0
1
1
0
ADC6
PTB6
0
0
1
1
1
ADC7
PTB7
0
1
0
0
0
ADC8
PTD3
0
1
0
0
1
ADC9
PTD2
0
1
0
1
0
ADC10
PTD1
0
1
0
1
1
ADC11
0 : 1
1 : 1
1 : 0
0 : 1
0 : 0
SIN USAR (VER NOTA1)
1
1
0
1
1
RESERVADO
1
1
1
0
0
SIN USAR
PTD0
1
1
1
0
1
VDDA (NOTA2)
1
1
1
1
0
VSSA (NOTA2)
1
1
1
1
1
OFF ADC
TABLA 10.1 Configuración del canal para conversión A/D.
ALFAOMEGA - FREESCALE
183
CONVERSOR ANÁLOGO/DIGITAL
NOTA
1. Si alguno de los canales sin usar es seleccionado, el valor de la conversión será desconocido. 2. Los niveles de voltaje de alimentación de los nodos especificados como referencia en la tabla son usados para verificar la operación de la conversión A/D, ambos en producción de pruebas y para uso de aplicaciones.
10.6 REGISTRO DE CONVERSIÓN A/D (ADR) Dirección $003D
Leer
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
AD7
AD6
AD5
AD4
AD3
AD2
AD1
AD0
Escribir
El valor de la conversión A/D queda almacenado en este registro; el registro es actualizado cada vez que la conversión se completa.
10.7 REGISTRO DE CONFIGURACIÓN DEL RELOJ PARA EL CONVERSOR A/D (ADCLK) Dirección $003E Bit 7
Bit 6
Bit 5
ADIV2
ADIV1
ADIV0
Leer Escribir
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
0
0
0
0
0
ADIV2:ADIV0: bits de prescalador del reloj para conversión A/D Estos 3 bits permiten escoger el valor del prescalador para el reloj de conversión A/D. El valor del prescalador se ajusta según la siguiente tabla. Hay que tener en cuenta que el reloj de conversión deberá ser de aproximadamente 1 MHz.
ALFAOMEGA - FREESCALE
184
JUAN CARLOS VESGA FERREIRA
ADIV2
ADIV1
ADIV0
PRESCALADOR
0
0
0
CLK ADC ÷ 1
0
0
1
CLK ADC ÷ 2
0
1
0
CLK ADC ÷ 4
0
1
1
CLK ADC ÷ 8
1
X
X
CLK ADC ÷ 16
X: No importa el valor.
TABLA 10.2 Configuración del prescalador para conversión A/D.
Cuando se desea utilizar el conversor A/D se debe efectuar los siguientes pasos para la configuración óptima: 1. Configurar el registro ADCLK indicando la frecuencia para el prescalador de conversión A/D. En nuestro caso: ADIV2 = 0 ADIV1 = 0 ADIV0 = 0 Al adjudicar estos valores, el prescalador tendrá como valor 1, es decir que la frecuencia del reloj de conversión es la misma frecuencia del bus interno. 2. Configurar el registro ADSCR, indicando lo siguiente: a. Habilitar el bit de interrupción, indicando fin de conversión. AIEN = 1. b. Configurar el tipo de conversión, ya sea continua o una muestra. En este caso se desea que la conversión sea continua, por ello ADCO = 1. c. Definir el canal de conversión A/D, para el ejemplo se utilizará PTB7.ADCH[4:0]=00111. El resultado de lo anterior es el siguiente: MOV
#$00,ADCLK
MOV
#%01100111,ADSCR
ALFAOMEGA - FREESCALE
185
CONVERSOR ANÁLOGO/DIGITAL
10.8
EJERCICIOS RESUELTOS
Enunciado
Para comprender mucho más este tema, ilustremos el siguiente ejemplo. Se desea escribir un programa que permita obtener una señal a través del pin PTB7. Como se mencionó antes, este voltaje debe estar entre 0 y 5 voltios. El valor del voltaje aplicado se visualizará en dos displays de 7 segmentos, enviando los dígitos en formato BCD y en forma multiplexada a través de los pines PTB[0:3].
Solución 5V+
20pF
PTA4 1
IRQ1
PTA5
8 9
10K
23
22 26 25 14
PTD3
PTB0 PTB1 PTB2 PTB3
PTD4
PTB4
PTD5
PTB5
PTD6
PTB6
PTD7
PTB7
3
13
PTD2
MC68HC908JL3
24
PTD1
VSS
18
PTD0
FIGURA 10.1 Circuito ejemplo para conversión A/D. ALFAOMEGA - FREESCALE
220
220
27
+ 16
10K
21 20
7 1 2 6 4
18
5 3
IC1 IA
A 13 12 B 11 C D 10 E 9
IB IC ID BI/RB0
F 15 14 G
RBI LT
17 15 12 11 10
0 5
7448
+5 10k
14
PTA2 OSC2/PTA6 PTA3
0 0
a b c d e f g
5
OSC1
1 13 10 8 7 2 11
10M
6
14
+
PTA1
2
DIS
1
4
4
4MHz
PTA0
RST
a b c d e f g
28
20pF
1 13 10 8 7 2 11
1K
186
JUAN CARLOS VESGA FERREIRA
$ Include ‘jl3regs.inc’ FLASH
EQU
$ECE0
RESET
EQU
$FFFE
TIMER
EQU
$FFF2
ADC
EQU
$FFDE
RAM
EQU
$80
COPD
EQU
0
ORG
RAM
AUX1
RMB
1
; byte auxiliar
AUX2
RMB
1
; byte auxiliar
AUX3
RMB
1
; byte auxiliar
VOLTS
RMB
1
; byte de conversión A/D temp
V_BCD
RMB
1
; byte de conversión A/D en BCD
CONTA
RMB
1
; Contador
ORG
FLASH
BSET
COPD,CONFIG1
INICIO
;Inhabilita el COPD
CLRA CLRX CLRH MOV
#$00,PORTB
; Borra el Puerto B
MOV
#$0F,DDRB
; PTB[3:0] salidas, PT7 Entrada
MOV
#$20,PORTA
; PTA5= 1
MOV
#%00110000,DDRA
; PTA[5:4] Salidas
*Timer configurado a 1 ms con frecuencia de oscilador 4 MHz MOV
#$36,TSC
MOV
#$00,TMODH
MOV
#$16,TMODL
MOV
#$46,TSC
;B’00110110’ al TSC
;B’01000110’ al TSC
*Configuración del conversor A/D. MOV
#$00,ADCLK
MOV
#%01100111,ADSCR
CLI ESPERA
BRA
; Habilita interrupciones ESPERA
* Rutina de interrupción por fin de conversión A/D. ADCONV PSHH
;Guarda H en el Stack
ALFAOMEGA - FREESCALE
187
CONVERSOR ANÁLOGO/DIGITAL
CLR
CONTA
;Borra CONTA
LDA
ADR
;A = Valor de Conversión
LDX
#50T
;X = 50 decimal
MUL
;X:A = X * A
STX
AUX1
;AUX1 = X
STA
AUX3
;AUX3 = A
LDHX
AUX1
;H:X = AUX1
LDA
AUX3
;A = AUX3
LDX
#255T
DIV
;X = 255 decimal ; A = (H:A)/X
STA
VOLTS
;VOLTS = A
LDA
VOLTS
;A = VOLTS
BNE
CONV_BCD
;Si A no es 0, CONV_BCD
CLR
V_BCD
;si no, V_BCD = 0
PULH
;Sacar H del Stack
RTI
;Retornar de Interrupción
* Rutina para convertir los voltios en formato BCD. CONV_BCD
LDX
VOLTS
; X = VOLTS
SALTO2
LDA
CONTA
; A = CONTA
ADD
#$1
; A = A+1
DAA STA
; Ajustar A en BCD CONTA
; CONTA = A
BNE
SALTO2
; Si X no es 0, ir a SALTO2
MOV
CONTA,V_BCD
;si no, V_BCD = CONTA
DECX
; X = X-1
PULH
;Sacar H del Stack
RTI
;Regresar de Interrupción
* Rutina de Interrupción por timer. TIM
PSHH
;Guarda H en el Stack
LDA
#%00110000
;A = %00110000
EOR
PORTA
;PTD7=0, PTD6=1 o Vicev.
STA
PORTA
;Conmuta PTD[7:6]
BRSET 4,PORTA,DISP_LSB
;Si PTA4=1, ir a DISP_LSB
BRSET 5,PORTA,DISP_MSB
;Si PTA5=1, ir a DISP_MSB
* Visualiza el Display Menos Significativo. DISP_LSB MOV ALFAOMEGA - FREESCALE
V_BCD,PORTB
;PORTB = V_BCD
188
JUAN CARLOS VESGA FERREIRA
BRA
FIN_INT
;Ir a fin de Interrupción
* Visualiza el Display más Significativo. DISP_MSB LDA
V_BCD
NSA FIN_INT
; A = V_BCD ; Intercambia nibles de A
STA
PORTB
; PORTB = A
BCLR
7,TSC
;Borra bandera de Interrup
PULH
;Saca H del Stack
RTI
;Retorna de la Interrupción
ORG
ADC
DW
ADCONV
ORG
TIMER
DW
TIM
ORG
RESET
DW
INICIO
;Si ocurre Int. Por ADC ;Si ocurre Int. Por TIMER ;Cuando se Energiza
Ejercicio 2 Enunciado DISEÑAR UN OSCILOSCOPIO CON EL 68HC908JL3/JK3/JK1 A continuación se muestra la teoría y gran parte del desarrollo de un osciloscopio mediante el microcontrolador 68HC908JL3/JK3/JK1. El estudiante debe analizar la teoría, entender las rutinas que se plantean, y completar el programa del microcontrolador para que el sistema funcione correctamente.
Teoría adicional para solucionar el problema Cuando se ha seleccionado un par de puntos para adquirir la información sobre alguna variable se envía esta señal al circuito que se encarga de adaptar la señal de alta potencia a una señal donde su valor máximo será 5 Vpp y sin valores negativos de tensión. Este circuito utiliza un divisor de tensión con resistencias de gran valor óhmico para restringir el paso de corrientes de gran valor y además ofrecer al circuito una protección y aislamiento con el circuito de potencia. Esta señal es enviada a un amplificador de instrumentación que permite medir la tensión en un determinado par de puntos de manera diferencial, tal como lo hacen los multímetros, aumentando así la seguridad del circuito.
ALFAOMEGA - FREESCALE
189
CONVERSOR ANÁLOGO/DIGITAL
+12V
12
IC1D 14
Puntas de Medida
10K
13
2.5K
2.2K
1K
1M 10K 33K 1M
8 1K
100K
10K 10
6
IC1B
1K
7 1K
2
IC1C 8
9
IC1A Vo
3
1K
2.2K 1K
5V
10K
FIGURA 10.2 Circuito adecuador de señal para muestreo. La señal después de pasar por el amplificador, tiene garantizada una amplitud máxima de 5 Vpp (± 2.5 V); cuando la tensión entre los terminales del dispositivo a medir sea de 800 Vpp, a esta señal se le agrega un voltaje en DC de 2.5 V por medio de un diodo Zener de este valor, para garantizar que la señal que llega al conversor se encuentre entre 0 y 5 V. Además, por seguridad para no sobrepasar los 5 V permitidos como máximo y no aplicar tensiones negativas, se dispuso un diodo Zener de 5 V a la salida del circuito, el cual, debido a sus propiedades, garantiza el cumplimiento de estos dos últimos requisitos. La señal antes de ser muestreada pasa por un filtro bajo de tipo Butterworth de orden 4, diseñado para una frecuencia de corte de 1 kHz. Este corresponde al siguiente esquema. Se decidió utilizar este método para el sensado de las diferentes variables, debido a factores como economía y diversidad de formas de las señales, ya que, como se sabe, estas poseen componentes en DC y AC que no tienen incidencia sobre sensores resistivos pero sí sobre sensores inductivos y capacitivos, provocando no sólo un aumento en la parte circuital sino también un error en la reproducción (forma de onda) de la señal deseada, por lo que es necesaria la forma de onda exacta de la variable para su posterior graficación y cuantificación en caso de requerirse. Este microcontrolador posee un conversor A/D de 8 bits, con 16 relojes internos que son necesarios para la
ALFAOMEGA - FREESCALE
190
JUAN CARLOS VESGA FERREIRA
+12V
12
IC1D 14
13
Puntas de Medida
10K
2.5K
2.2K
1K
1M 10K 33K 1M
8 1K
100K
6
IC1B 7
10K 10
1K 1K
2
IC1C 8
9
IC1A Vo
3
1K
2.2K 1K
5V
10K
FIGURA 10.3 Filtro Butterworth pasa bajo de orden 4 con frecuencia de corte de 1 kHz. conversión A/D. El conversor A/D comienza la conversión en el primer flanco ascendente del reloj interno de conversión. Si el reloj interno está seleccionado para funcionar a 1 MHz (frecuencia del oscilador = 4 MHz), entonces una conversión tarda en completarse 16 µs. Con un reloj de 1 MHz, la máxima rata de muestra es 62.5 kHz. Tiempo de conversión =
16 tipos de reloj Frecuencia de reloj de ADC
Considerando que el voltaje de referencia es 5 V obtenemos que: Resolución =
5 _ 2 1 8
= 19.6 mV
Error de cuantización ±
1 2
LSB =
5
2(28 _ 1)
= 9.8 mV
En el proceso de adquisición de datos se decidió tomar 140 muestras por variable para garantizar que con el tiempo de muestreo se logre una óptima resolución de la gráfica. La frecuencia máxima de la señal a graficar y cuantificar debe ser 1 kHz. ALFAOMEGA - FREESCALE
191
CONVERSOR ANÁLOGO/DIGITAL
Solución parcial del problema El proceso de adquisición de los datos, almacenamiento en la memoria RAM del microcontrolador y transporte hacia el PC es el siguiente: ADCONV PSHH
DESOCUPA
;Guarda H en el Stack
LDA
ADR
;A = Valor de Conversión
STA
$85,X
;Guardar el dato en RAM
BSR
RETARDO
;Retardo entre muestras
INCX
;Incrementar X
DBNZ CONTA,FIN_INT
;Decrem. Y saltar si <> 0
BCLR
6,ADSCR
;si CONTA=0, deshab. ADC
MUESTRAS,CONTA
;No. Muestras = CONTA
CLRX MOV
;X = 0
OTRO LDA BSR ESPERA
FIN_INT
BSR
$85,X
ENVIAR RECIBIR
;Extraer dato de RAM ;Enviar Serialmente a PC ;Recibe confirmación
LDA
RECEPC
;del PC para envío del
CMP
#255T
;siguiente dato
BNE
ESPERA
INCX
;Siguiente dato
DBNZ CONTA,OTRO
;Ya se enviaron todos?
PULH
;Sacar H del Stack
RTI
;Retornar de Interrupción
Esta rutina es la misma tanto para adquirir el valor promedio, como para el muestreo de la señal a graficar. Cuando se utiliza para adquirir muestras para graficar, la variable MUESTRAS tendrá como valor 140, indicando las 140 muestras a tomar; pero si se va a medir el valor promedio, MUESTRAS toma el valor 3. El valor promedio de las diferentes señales se puede obtener de una manera circuital y ajustado por software mediante esquemas que toman una señal analógica y la adecuan a una señal en DC directamente proporcional a su respectivo valor promedio, bastando solamente multiplicarlas por un factor de corrección debido al ajuste y conversión analógica de la señal para dar como resultado el valor esperado. Este circuito consta inicialmente de un filtro pasa-alto que permite eliminar la componente en DC de la señal a analizar, la señal resultante y la original son aplicadas a un circuito restador en el cual a su salida obtenemos una señal en DC equivalente al valor promedio de la señal aplicada inicialmente. Para estabilizar y mejorar la salida se colocó una red RC. Además se aplicó posteriormente el mismo proceso que el de la señal analógica, garantizando que no se introduzcan valores negativos ni superiores a 5 V al conversor A/D.
ALFAOMEGA - FREESCALE
192
JUAN CARLOS VESGA FERREIRA
Señal
12
IC2D
1K
14 13 0,1u
1K 10
1M
9
0
100K
1000u
IC2A I
IC2C
2
8 50 1K
Vo
1K
FIGURA 10.4 Circuito que permite convertir una señal analógica en una señal equivalente a su valor promedio. Este circuito consta inicialmente de un filtro pasa-alto que permite eliminar la componente en DC de la señal a analizar; la señal resultante y la original son aplicadas a un circuito restador en el cual a su salida obtenemos una señal en DC equivalente al valor promedio de la señal aplicada inicialmente. Para estabilizar y mejorar la salida se colocó una red RC, además se le aplicó posteriormente el mismo proceso que el de la señal analógica, garantizando que no se introduzcan valores negativos ni superiores a 5 V al conversor A/D.
FIGURA 10.5 Interfaz gráfica con el PC para osciloscopio. ALFAOMEGA - FREESCALE
CONVERSOR ANÁLOGO/DIGITAL
El programa correspondiente en Visual Basic es el siguiente. Definición de variables globales Dim bd As Database Dim rs As Recordset Dim Conta, Orden Rutina de Inicio al cargar el Formulario Private Sub Form_Load() Set bd = OpenDatabase(“C:\Base.MDB”) Conta = 0 End Sub Rutina para llamar cálculo del valor promedio Private Sub Promedio_Click() Conta = 0 Orden = 1 MSComm1.Output = Chr(2) ‘Orden de Muestreo End Sub Rutina para llamar gráfica de Señal Private Sub Graficar_Click() Dim x Conta = 0 Orden = 0 MSComm1.Output = Chr(1) ‘Orden de Muestreo End Sub Rutina para limpiar pantalla y borrar base Private Sub Limpiar_Click() ‘ Borra Pantalla Picture1.Cls Picture1.PSet (0, 128) ‘ Borra Base bd.Execute “delete from tabla” Data1.Refresh End Sub Rutina de Recepción Serial
ALFAOMEGA - FREESCALE
193
194
JUAN CARLOS VESGA FERREIRA
Private Sub MSComm1_OnComm() Dim DatoMIC Select Case MSComm1.CommEvent Case comEvReceive DatoPIC = Asc(MSComm1.Input) ‘ Recibir datos desde MICROCONTROLADOR Select Case Orden Case 0
‘Muestreo
Conta = Conta + 1 With Data1.Recordset .AddNew !x = Conta !y = DatoMIC .Update End With Picture1.Line -(Conta, 128 - DatoMIC) MSComm1.Output = Chr(255) Exit Sub Case 1
‘Valor Promedio
Conta = Conta + 1 With Data1.Recordset .AddNew !x = Conta !y = DatoMIC .Update End With MSComm1.Output = Chr(255) If Conta = 3 Then ‘Se calcula el promedio mediante la función AVG Set rs = bd.OpenRecordset(“Select AVG(Y) AS Prom From Tabla”) MsgBox “El valor promedio es: “ + Str(rs!prom * K - B) ‘K:Constante de Ajuste para valor real DC ‘B:Constante de Ajuste para valor positivo o negativo ‘Ecuación de la forma Voltaje = K(Prom) - B End If Exit Sub ALFAOMEGA - FREESCALE
195
CONVERSOR ANÁLOGO/DIGITAL
End Select End Select End Sub
EJERCICIOS PROPUESTOS Se desea diseñar un sistema que permita leer constantemente la temperatura que hay en un horno. Esta información es visualizada a través de una pantalla de cristal líquido a 4 bits, con rango de temperatura entre 25 a 500 grados centígrados. Diseñar un voltímetro digital que pueda leer valores de tensión entre -20 y 20 voltios de DC. Visualizar el resultado mediante dos displays de siete segmentos y en forma multiplexada. Diseñar un medidor de temperatura de 4 canales. Esta temperatura debe ser leída constantemente y comparadas sus lecturas. La diferencia de temperatura entre dos canales debe ser visualizada en una pantalla de cristal líquido indicando entre qué canales se está tomando la lectura.
RESUMEN DEL CAPÍTULO CAPÍTULO Las señales provenientes del mundo exterior son de tipo analógico, como, por ejemplo, presión, temperatura, velocidad, etc. Mediante el uso de un transductor se realiza el proceso de conversión de un tipo de señal física a una señal eléctrica. Pero un sistema de control electrónico solamente reconoce señales de tipo digital, por lo que se requiere convertir las señales analógicas a digitales. Cuando se desea realizar un diseño haciendo uso de un conversor análogo digital hay necesidad de conocer como mínimo algunos parámetros propios del conversor, que pueden suministrar información valiosa en el momento de decidir si es adecuado o no para su implementación en el diseño. Estos parámetros son: características de diseño, código binario, resolución, tiempo de conversión y características de funcionamiento. Algunas características del módulo de conversión A/D son: Tiene 12 canales con entrada multiplexada. Utiliza el método de aproximaciones sucesivas para la conversión.
ALFAOMEGA - FREESCALE
196
JUAN CARLOS VESGA FERREIRA
Tiene 8 bits de resolución. Conversión sencilla o continua. Bandera de conversión completa o interrupción de conversión completa. Reloj de conversión A/D seleccionable.
ALFAOMEGA - FREESCALE
11
Capítulo EL OSCILADOR OBJETIVO DEL CAPÍTULO El oscilador es uno de lo módulos más importantes del microcontrolador, ya que sin él no podría funcionar. El objetivo de este capítulo es ilustrar al estudiante acerca de: en qué consiste este módulo, qué partes lo componen, qué tipos de osciladores se pueden utilizar y cómo se deben conectar y configurar para su óptimo funcionamiento, y finalmente qué cuidados se deben tener a la hora de seleccionar un determinado oscilador para desarrollar una aplicación específica.
CONOCIMIENTOS PREVIOS Para iniciar el estudio del presente capítulo es necesario que el lector posea conceptos básicos sobre electrónica básica y circuitos digitales con el fin de poder comprender fácilmente cada uno de los temas expuestos aquí.
11.1 INTRODUCCIÓN Actualmente todos los microcontroladores disponen de un circuito oscilador que genera una onda cuadrada de alta frecuencia; este módulo es el que está encargado de la sincronización de todas las tareas que realice el microcontrolador, es decir, el oscilador es el circuito que permite que el microcontrolador ejecute las instrucciones deseadas y funcione correctamente. Por lo general este circuito de reloj hace parte del microcontrolador y sólo se necesitan algunos componentes exteriores para completar el circuito oscilador a la frecuencia de trabajo deseada. Estos componentes pueden ser un cristal de cuarzo y un par de condensadores que tengan valores entre 15 y 33 pF o una red de tipo RC. Se debe tener en cuenta que al aumentar la frecuencia del reloj aumenta el tiempo de ejecución de las instrucciones, junto con un aumento en el consumo de potencia; esto significa que a mayor velocidad de procesamiento, mayor será el consumo de energía por parte del microcontrolador.
198
JUAN CARLOS VESGA FERREIRA
El módulo del oscilador es el que suministra el reloj para el sistema MCU. Existen dos tipos de módulos para osciladores: MC68HC908XXX. Está basado en un módulo de oscilador a cristal, el cual requiere un cristal externo o un resonador cerámico; esta opción puede ser manipulada directamente en el OSC1.
Del SIM
al SIM 20SCOUT XTALCLK
al SIM OSCOUT .. 2
SIMOSCEN MCU OSC1
OSC2
RB
RS+
X1 C1
C2
FIGURA 11.1 Conexión externa del oscilador a cristal.
Esta configuración usa cinco componentes: Cristal X1. Capacitor fijo C1 (mínimo 2 veces la capacitancia del cristal). Capacitor variable C2 (puede ser un condensador fijo, mínimo 2 veces la capacitancia del cristal). Resistencia de retroalimentación (10 MΩ). Resistor serie (opcional). Esta resistencia puede ser de valor cero cuando se utiliza cristal y frecuencias altas.
ALFAOMEGA - FREESCALE
199
EL OSCILADOR
MC68HRC908XXX. Está basado en un módulo de oscilador RC, el cual requiere externamente una red de tipo RC solamente. Este tipo de oscilador suministra una fuente de reloj con una tolerancia inferior a 10%.
Al SIM
Del SIM
20SCOUT SIMOSCEN
OSCOUT
RCCLK
Ext-RC Oscillator
EN
Al SIM
.. 2
0 1
PTA6 I/O
PTA6 PTA6EN
MCU PTA6/RCCLK (OSC2)
OSC1 VDD
REXT
CEXT
FIGURA 11.2 Conexión externa del oscilador RC.
Como se mencionó, este tipo de oscilador requiere dos componentes, una resistencia R y un condensador C (min 10 pF), cada uno de los cuales deberá tener una tolerancia inferior a 1%.
OSC1 Este pin es la entrada hacia el amplificador de las señales generadas por el cristal o la red RC.
OSC2/PTA6/RCCLK Cuando se utiliza un oscilador a cristal, este pin es la salida del amplificador inversor. Cuando se utiliza un oscilador de tipo RC, este pin puede ser configurado como pin de propósito general (I/O) o como salida de reloj del oscilador interno generado por la red RC.
ALFAOMEGA - FREESCALE
200
JUAN CARLOS VESGA FERREIRA
OPCIÓN
FUNCIÓN DEL PIN OSC2
OSCILADOR A CRISTAL
OSC1 INVERTIDA
OSCILADOR RC
PTAEN = 0: SALIDA DEL RCCLK PTAEN = 1: PTA6 I/O
TABLA 11.1 Configuración según el oscilador.
SEÑAL HABILITADORA DEL OSCILADOR (SIMOSCEN) Esta señal proviene del sistema de integración modular, la cual habilita o deshabilita el circuito oscilador a cristal o RC.
EL RELOJ DE OSCILACIÓN A CRISTAL (XTALCLK) Es la señal correspondiente a la salida del oscilador a cristal y proviene directamente de este circuito. La duración de un ciclo del XTALCLK es desconocida y puede depender del cristal y de otros factores externos.
EL RELOJ DE OSCILACIÓN RC (RCCLK) Esta es la señal de salida correspondiente al oscilador de tipo RC. Esta frecuencia es directamente proporcional a la constante de tiempo de la red RC.
SALIDA DEL OSCILADOR 2 (2OSCOUT) El 2OSCOUT es el mismo reloj de entrada (XTALCLK o RCCLK). Esta señal se usa para determinar los ciclos del COP (perro guardián).
SALIDA DEL OSCILADOR (OSCOUT) La frecuencia de esta señal es igual a la mitad de la señal 2OSCOUT y se usa para el reloj de la CPU y otros módulos en la MCU. La señal OSCOUT se divide nuevamente en el SIM y el resultado es la frecuencia del bus interno, siendo una cuarta parte de la frecuencia del reloj de oscilación (XTALCLK O RCCLK).
ALFAOMEGA - FREESCALE
201
EL OSCILADOR
EJERCICIOS PROPUESTOS Con base en las gráficas descriptivas de especificaciones eléctricas que se encuentran en los Datasheet de Freescale y que se ilustra a continuación, ¿qué valores deben tener la resistencia Rext y el condensador Cext para provocar frecuencias de oscilación de 4 MHz, 10 MHz y 16 MHz, respectivamente? 14
RC frequency, fRCCLK (MHZ)
12
REXT = 10 pF
10
MCU
3V @ 25oC
6
OSC1
6
VDD
4
REXT
CEXT
2 0
0
10
30 20 Resistor, REXT (K )
40
50
RESUMEN DEL CAPÍTULO CAPÍTULO El oscilador es uno de lo módulos indispensables del microcontrolador, ya que sin él no sería posible su funcionamiento. Este circuito de reloj hace parte del microcontrolador y sólo se necesitan unos pocos componentes exteriores para completar el circuito oscilador a la frecuencia de trabajo que se quiera. Estos componentes pueden ser un cristal de cuarzo y un par de condensadores de valores entre 15 y 33 pF o una red de tipo RC. Se debe tener en cuenta que al aumentar la frecuencia del reloj aumenta también el tiempo de ejecución de las instrucciones, junto con un aumento del consumo de potencia, lo cual significa que a mayor velocidad de procesamiento, mayor será el consumo de energía por parte del microcontrolador.
ALFAOMEGA - FREESCALE
Capítulo
12
RECURSOS DE CONFIGURACIÓN AVANZADA OBJETIVO DEL CAPÍTULO Al finalizar el capítulo el estudiante tendrá un conocimiento sobre ¿Qué es la memoria Flash?, ¿para qué se utiliza?, cuales son sus principales características, procedimiento de programación y borrado de la misma, entre otras cosas que hacen parte de este interesante tema. Adicionalmente, el estudiante debe familiarizarse con el uso, configuración y manipulación de la interrupción por software, aplicándolo correctamente a desarrollos en que se considere necesario.
CONOCIMIENTOS PREVIOS Para iniciar el estudio del presente capítulo es necesario que el lector posea conceptos básicos sobre el significado y uso de interrupciones en los microcontroladores.
12.1 INTRODUCCIÓN Uno de los parámetros importantes de esta familia de microcontroladores es el uso, configuración y manipulación de la interrupción por software y su aplicación correcta dentro de desarrollos que requieran su uso. Este módulo puede generar interrupciones, provocando un alto en la ejecución de un determinado programa en una dirección establecida previamente. Adicionalmente, en muchas aplicaciones industriales es necesario almacenar información que de ser posible no sea borrada aun ante la ausencia de energía; tal es el caso de la memoria Flash, la cual debido a sus características cada día es adoptada mayormente en los últimos diseños de almacenamiento de información electrónico. En este capítulo se pretende dar una visión general tanto de los registros de configuración avanzados como de la memoria Flash describiéndose su uso, administración y configuración.
204
JUAN CARLOS VESGA FERREIRA
12.2 MEMORIA FLASH La memoria Flash es no volátil, es decir, en ausencia de energía los datos almacenados en ella no son borrados como ocurre con la memoria RAM; además presenta bajo consumo de energía y puede grabarse y borrarse eléctricamente. Funciona como una ROM y una RAM pero consume menos energía y es más pequeña. La memoria Flash también puede programarse “en circuito”; además es más rápida, tiene mayor densidad y tolera más ciclos de escritura/borrado que la EEPROM. Esta memoria consiste en un vector de 4096 o 1536 bytes con una adición de 48 bytes para ser usados vectorialmente. El tamaño mínimo de la memoria Flash que puede ser borrado es de 64 bytes, y el máximo tamaño que puede ser programado en un programa cíclico es de 32 bytes (una fila). Las operaciones de programar y borrar se permiten a través del control de unos bits en el registro de control de la memoria Flash (FLCR). Los rangos de direcciones utilizados para esta memoria son: $EC00 - $FBFF
; 4096 bytes ; Aplicado al JL3/JK3
$F600 - $FBFF
; 1536 bytes ; Aplicado al JK1
REGISTRO DE CONTROL DE LA MEMORIA FLASH (FLCR) Dirección: $FE08
Leer
Bit 7
Bit 6
Bit 5
Bit 4
0
0
0
0
Escribir
Bit 3
Bit 2
Bit 1
Bit 0
HVEN
MASS
ERASE
PGM
HVEN: HABILITACIÓN DE ALTO VOLTAJE Este bit habilita o no la bomba de carga de alto voltaje para permitir el proceso de programación o borrado de la memoria Flash, dependiendo del valor de los bits PGM = 1 o ERASE = 1, respectivamente. 1: Habilita el proceso 0: Deshabilita el proceso
MASS: CONTROL DE BORRADO EN MASA Este bit permite que la memoria Flash sea borrada en MASA o en BLOQUE. 1: Selecciona la operación de borrado en Masa 0: Selecciona la operación de borrado en Bloque
ERASE: CONTROL DE BORRADO Configura la memoria para la operación de borrado; debe tenerse en cuenta que este bit y el bit PGM no deben estar en 1 al mismo tiempo. ALFAOMEGA - FREESCALE
RECURSOS DE CONFIGURACIÓN AVANZADA
205
1: Habilita la operación de borrado 0: Deshabilita la operación de borrado
PGM: CONTROL DE PROGRAMACIÓN Configura la memoria para la operación de programación; debe tenerse en cuenta que este bit y el bit PGM no deben estar en 1 al mismo tiempo. 1: Habilita la operación de programación 0: Deshabilita la operación de programación
12.3 BORRADO DE LA MEMORIA FLASH EN BLOQUE Un bloque consta de 64 bytes consecutivos, comenzando en la dirección $XX00, $XX40, $XX80 o $XXC0. Los 48 bytes utilizados en las interrupciones vectorizadas constituyen un bloque. Ningún bloque que se encuentre entre $EC00 - $FBFF puede ser borrado solo, pero los 48 bytes de interrupciones sectorizadas sí pueden ser borrados solos, a menos que se escoja la opción masa, la cual borra todo el bloque. El procedimiento para borrar en BLOQUE es el siguiente: 1. ERASE = 1 , MASS = 0. 2. Escribir algún dato en cualquier parte de la memoria Flash dentro del rango del bloque a borrar. 3. Esperar alrededor de unos 10 µs. 4. HVEN = 1. 5. Esperar alrededor de 1 ms (Tiempo de Borrado). 6. ERASE = 0. 7. Esperar alrededor de unos 5 µs. 8. HVEN = 0. 9. Esperar alrededor de 1 µs. Después de este proceso la memoria está lista para ser leída y utilizada nuevamente. Se debe tener en cuenta que la programación y borrado de las posiciones de la memoria Flash no puede realizarse por código mientras se esté ejecutando en la memoria Flash. El procedimiento para borrar en MASA es el siguiente: 1. ERASE = 1 , MASS = 1. 2. Escribir algún dato en cualquier parte de la memoria Flash dentro del rango del bloque a borrar. 3. Esperar alrededor de 10 µs 4. HVEN = 1. 5. Esperar alrededor de 4 ms (Tiempo de Borrado) 6. ERASE = 0. 7. Esperar alrededor de 100 µs 8. HVEN = 0. ALFAOMEGA - FREESCALE
206
JUAN CARLOS VESGA FERREIRA
9. Esperar alrededor de 1 µs. Después de este proceso la memoria está lista para ser leída y utilizada nuevamente.
12.4 PROGRAMACIÓN DE LA MEMORIA FLASH La programación de la memoria Flash es hecha a base de filas. Una fila consta de 32 bytes consecutivos comenzando desde la dirección $XX00, $XX20, $XX40, $XX60, $XXA0, $XXC0 o $XXE0. La acción de programar una fila de la memoria Flash se efectúa de la siguiente manera: 1. PGM = 1 , configura la memoria para programación. 2. Escribir algún dato en cualquier parte de la memoria Flash dentro del rango de la fila a programar. 3. Esperar alrededor de 10 µs. 4. HVEN = 1. 5. Esperar alrededor de 5 µs. 6. Escribir el dato o byte a ser programado. 7. Esperar unos 30 µs. 8. Repetir los pasos 6 y 7 hasta que todos los bytes dentro de la fila sean almacenados. 9. PGM = 0. 10. Esperar alrededor de 5 µs. 11. HVEN = 0. 12. Esperar alrededor de 1 µs. Después de este proceso la memoria está lista para ser leída y utilizada nuevamente. La secuencia anterior es repetida por toda la memoria hasta que todos los datos son programados.
12.5 PROTECCIÓN DE LA MEMORIA FLASH Cuando se efectúan procesos de programación o borrado de la memoria Flash se hace necesario proteger los bloques de memoria debido al mal funcionamiento del sistema. Esta protección consiste en proteger el registro FLBPR, el cual determina el rango a ser protegido, comenzando por la dirección definida como punto inicial en el registro FLBPR hasta la dirección $FFFF. Cuando la memoria es protegida, el bit HVEN no puede estar en 1, ni habilitarse procesos de borrado o programación.
Protección de registros en bloque La protección de registros en bloque se efectúa mediante registros de I/O de 8 bits. El valor del registro determina la dirección inicial para protección dentro del rango de la memoria Flash.
ALFAOMEGA - FREESCALE
207
RECURSOS DE CONFIGURACIÓN AVANZADA
Registro de protección en bloque flash (FLBPR)
Dirección $FE09 Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
BPR7
BPR6
BPR5
BPR4
BPR3
BPR2
BPR1
Leer Escribir
Bit 0 0
Estos 8 bits en el registro FLBPR en los cuales el bit 0 siempre tiene como valor cero, representan los bits [12:5] de la dirección de memoria de 16 bits. Los bits [15:13] son 1 lógico y los bits [4:0] son 0 lógico. La dirección resultante de 16 bits se utiliza para especificar la dirección inicial del bloque de protección de la memoria Flash. La memoria es protegida desde esta dirección hasta la dirección $FFFF. Se debe tener en cuenta que las direcciones consideradas como puntos de partida pueden ser $XX00, $XX40, $XX80 o $XXC0 dentro del rango de la memoria Flash. Para que toda la memoria Flash quede protegida, el valor del registro FLBPR puede estar entre $00 hasta $60, y para que nada se proteja se le puede adjudicar el valor $FF.
12.6 MÓDULO DE RUPTURA Hasta el momento se han mencionado todos los tipos de interrupciones, pero faltaba un tipo de interrupción que en muchos casos presenta un valor agregado a la hora de desarrollar cualquier aplicación; es precisamente cuando se puede generar una interrupción por software, es decir, una interrupción provocada a propósito por el usuario para ejecutar una tarea específica. En esta sección se describe el módulo de ruptura. Este módulo puede generar interrupciones, provocando un alto en la ejecución de un determinado programa en una dirección establecida previamente. Es el módulo encargado de permitir la función “BREAK”, capaz de generar una interrupción que detenga el flujo normal del programa en una dirección definida a entrar en el programa “background”. Comúnmente esto es muy utilizado para generar lo que se conoce como “Break–Point” o punto de quiebre en el programa del usuario durante la emulación del mismo. Esta característica es exclusiva de la familia HC908 y permite la implemetación de numerosos metodos de depuración de programas y herramientas de emulación poderosas, sin dejar por ello de ser económicas. Cuando se habla de “background” se refiere a una rutina o programa completo, que normalmente NO SE EJECUTA, salvo que se cumpla con las condiciones para generar un “Break–Point” que permitan saltar a esta rutina. Generalmente esta función se utiliza para generar rutinas de debbuging (depuración) internas que permitan un rápido desarrollo o depuración ante determinadas circunstancias. A diferencia de otras familias de microcontroladores, la familia HC908 FLASH de Freescale, al contar con este módulo y la ROM monitor, permite disponer de herramientas de emulación en TIEMPO REAL a precios muy accesibles. Una interrupción de ruptura es generada en las siguientes circunstancias: ALFAOMEGA - FREESCALE
208
JUAN CARLOS VESGA FERREIRA
Cuando una dirección interna es escrita en el registro de ruptura, se provoca una interrupción por software (SWI). Cuando se coloca un 1 lógico en el bit BRKA del registro de control y estado de ruptura. La CPU comienza la ruptura: Cuando es cargada la instrucción SWI. Cuando al contador de programa se carga con alguna de las siguientes direcciones ($FFFC, $FFFD, $FEFC, $FEFD) en el modo monitor. Los registros encargados del control y monitoreo del módulo de ruptura son los siguientes: Registro de control y estado de ruptura (BRKSCR). Registro de dirección de ruptura (BRKH/BRKL). Registro de estado de ruptura (BSR). Registro de control de bandera para ruptura (BFCR). Durante una interrupción por ruptura ocurre lo siguiente: Se debe tener en cuenta que el contador del TIM se detiene. El COP es deshabilitado.
Registro de control y estado de ruptura (BRKSCR) Dirección $FE0E Bit 7
Bit 6
BRKE
BRKA
Leer Escribir
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
0
0
0
0
0
0
BRKE: Bit de habilitación de ruptura 1: Habilitación de ruptura en dirección de 16 bits 0: Deshabilitación de ruptura
BRKA: Bit de ruptura activa 1: Generar interrupción de ruptura en la dirección señalada 0: No generar ruptura en la dirección señalada
Registro de dirección de ruptura (BRKH/BRKL) Registro BRKH
Dirección $FE0C Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Leer Escribir
ALFAOMEGA - FREESCALE
209
RECURSOS DE CONFIGURACIÓN AVANZADA
Registro BRKL
Dirección $FE0D Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
Leer Escribir
Estos registros contienen la dirección en donde se desea generar la interrupción por ruptura.
Registro de estado de ruptura (BSR)
Dirección $FE00 Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
R
R
R
R
R
R
NOTA 1
Leer Escribir
Bit 0
SBSW R
R: Reservado
SBSW: Parada o espera de ruptura del SIM Este bit se utiliza en todas las aplicaciones que requieran un retorno de un modo WAIT/STOP, después de salir de una interrupción de ruptura. El bit puede ser leído dentro de la rutina de interrupción por software SWI.
Registro de control de bandera para ruptura (BFCR) Dirección $FE03 Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
BCFE
R
R
R
R
R
R
R
Leer Escribir
BCFE: bit para habilitar el borrado de la bandera de ruptura 1: Permite borrar el estado del bit de ruptura durante la ruptura. 0: No permite borrar el estado del bit de ruptura durante la ruptura.
ALFAOMEGA - FREESCALE
210
JUAN CARLOS VESGA FERREIRA
12.7 CONFIGURACIÓN DEL REGISTRO CONFIG En esta sección se ilustrará la forma de configurar los registros CONFIG1 Y CONFIG2. La configuración de estos registros habilita o deshabilita las siguientes opciones: Instrucción STOP. Perro guardián COP. Reiniciar el COP en períodos de COPRS, (213
_
_ 24) * 2OSCOUT o (218 24) * 2OSCOUT.
Habilitar el circuito LVI. El timer COP, también conocido como Watchdog timer, se basa en un contador que corre libremente y que puede ser borrado por el usuario en cualquier momento. El COP permite a la CPU recuperarse de eventos inesperados como el llamado runaway software (ejecución incorrecta del software) y errores en el proceso de software. Para usar el COP, simplemente hay que activar y seleccionar el período de timeout deseado. El COP hace un reset si no ha habido un reset dentro del período de timeout. El timeout es el exceso de tiempo en la espera de una señal determinada. Lo más importante que siempre se debe recordar es que hay que servirlo antes de que el período de interrupción expire. Si se activa el timer del COP y no se le da servicio dentro del período de interrupción, el COP hará un reset a la CPU. La configuración de este registro se usa para la inicialización de varias opciones. La configuración de este registro puede ser cambiada incluso después de cada reset. Se recomienda que este registro sea configurado inmediatamente después de efectuado el reset. Este registro se encuentra localizado en la dirección $001E y $001F, y puede ser leído en cualquier momento.
Registro CONFIG2 Dirección $001E Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
IRQPUD
R
R
LVIT1
LVIT0
R
R
R
Leer Escribir
R: Reservado
IRQPUD: bit de control de resistencias Pull-Up para el pin IRQ1 1: Resistencias de Pull-Up desconectadas. 0: Resistencias de Pull-Up conectadas entre IRQ1 y VDD. El módulo de restricción de bajo voltaje (LVI) es el que se encarga de monitorear el voltaje en el pin VDD y de reiniciar el microcontrolador cuando el voltaje de VDD se encuentra por debajo de los niveles establecidos. (LVI trip). Por medio de este registro es posible seleccionar los niveles de tensión para efectuar el reset del microcontrolador y además permitir la habilitación del circuito LVI. ALFAOMEGA - FREESCALE
211
RECURSOS DE CONFIGURACIÓN AVANZADA
Características del módulo LVI Mejora la fiabilidad del sistema. Reduce el número de componenetes externos, bajando el costo. Hace un reset a la MCU cuando el voltaje se encuentra por debajo de cierto nivel de tensión. Cuando el voltaje retorna a su estado natural, la MCU continuará trabajando. Incluye una selección de voltaje cuando se alimenta el sistema con 3 o 5 V.
LVIT1, LVIT0: bits de selección de niveles de control de VDD para que el circuito de protección entre en acción.
LVIT1
LVIT0
NIVEL DE VOLTAJE
VDD
0
0
2.4 V
VDD = 3.0 V
0
1
2.4 V
VDD = 3.0 V
1
0
4.0 V
VDD = 5.0 V
1
1
Reservado
TABLA 12.1 Niveles de configuración de voltaje.
Registro CONFIG1 Dirección $001F Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
COPRS
R
R
LVID
R
SSREC
STOP
COPD
Leer Escribir
R: Reservado
COPRS: bit de selección para el período de reset del COP (perro guardián). 1: COP reset = (213 - 24) * 2OSCOUT 0: COP reset = (218 - 24) * 2OSCOUT
LVID: bit habilitación para bajo voltaje. 1= Deshabilitar circuito de restricción para bajo voltaje. 0= Habilitar circuito de restricción para bajo voltaje. ALFAOMEGA - FREESCALE
212
JUAN CARLOS VESGA FERREIRA
SSREC: Recuperación de parada corta, este registro habilita la salida de la CPU del modo Stop con un retardo de 32*OSCXCLK ciclos a cambio de 4096*2OSCOUT ciclos.
1= Retornar del modo Stop después de 32*2OSCOUT ciclos. 0= Retornar del modo Stop después de 4096*2OSCOUT ciclos. Si se usa un cristal externo, no se puede colocar el bit SSREC en 1.
STOP: bit de habilitación de la instrucción STOP. 1: Habilitación de la instrucción STOP. 0: La instrucción STOP será tomada como código ilegal.
COPD: bit de deshabilitación del COP. 1: Deshabilitar el módulo COP. 0: Habilitar el módulo COP.
Información complementaria Para mayor información y profundización sobre el manejo de la memoria Flash, programas de almacenamiento y borrado en masa y bloque con sus respectivos códigos fuente, se puede buscar los siguientes archivos. AN-HK-33.pdf AN-HK-32.pdf AN1831.pdf AN1770.pdf
RESUMEN DEL CAPÍTULO CAPÍTULO La memoria Flash es el equivalente al disco duro del microcontrolador gracias a que es una memoria de tipo no volátil. La memoria Flash también puede programarse “en circuito”; además es más rápida, tiene mayor densidad y tolera más ciclos de escritura/borrado que la EEPROM. Esta memoria consiste en un vector de 4096 o 1536 bytes con una adición de 48 bytes para ser usados vectorialmente. El tamaño mínimo de la memoria Flash que puede ser borrado es de 64 bytes, y el máximo tamaño que puede ser programado en un programa cíclico es de 32 bytes (una fila). Los rangos de direcciones utilizados para esta memoria son:
ALFAOMEGA - FREESCALE
213
RECURSOS DE CONFIGURACIÓN AVANZADA
$EC00 - $FBFF
; 4096 bytes ; Aplicado al JL3/JK3
$F600 - $FBFF
; 1536 bytes ; Aplicado al JK1
La programación de la memoria Flash es hecha a base de filas. Una fila consta de 32 bytes consecutivos comenzando desde la dirección $XX00, $XX20, $XX40,$XX60,$XXA0,$XXC0 o $XXE0. Cuando se efectúan procesos de programación o borrado de la memoria Flash, se hace necesario proteger los bloque de memoria debido al mal funcionamiento del sistema. El timer COP, también conocido como “Watchdog Timer” se basa en un contador que corre libremente y que puede ser borrado por el usuario en cualquier momento. El COP permite a la CPU recuperarse de eventos inesperados como el llamado ‘runaway software’ (ejecución incorrecta del software) y errores en el proceso de software. Uno de los parámetros importantes de esta familia de microcontroladores es el uso, configuración y manipulación de la interrupción por software y su aplicación correcta dentro de desarrollos que requieran su uso. Este módulo puede generar interrupciones, provocando un alto en la ejecución de un determinado programa en una dirección establecida previamente. Cuando se habla de “background”, se refiere a éste como una rutina o programa completo, que normalmente NO SE EJECUTA, salvo que se cumplan las condiciones para generar un “Break – Point” que permitan saltar a esta rutina. Generalmente esta función es utilizada para generar rutinas de Debbuging (depuración) internas que permitan un rápido desarrollo o depuración ante determinadas circunstancias. Una interrupción de ruptura es generada: Cuando una dirección interna es escrita en el registro de ruptura, se provoca una interrupción por software (SWI). Cuando se coloca un 1 lógico en el bit BRKA del registro de control y estado de ruptura. La CPU comienza la ruptura: Cuando es cargada la instrucción SWI. Cuando al contador de programa se carga con alguna de las siguientes direcciones ($FFFC, $FFFD, $FEFC, $FEFD) en el modo monitor. Los registros encargados del control y monitoreo del módulo de ruptura son los siguientes: registro de control y estado de ruptura (BRKSCR), registro de direccion de ruptura (BRKH/BRKL), registro de estado de ruptura (BSR) y el registro de control de bandera para ruptura (BFCR).
ALFAOMEGA - FREESCALE
Capítulo
13
PROGRAMACIÓN EN C OBJETIVO DEL CAPÍTULO Exponer las bondades de la programación en lenguaje C, estructuras, sintaxis y su aplicación en la programación de microcontroladores.
CONOCIMIENTOS PREVIOS Para iniciar el estudio del presente capítulo es necesario que el lector posea conceptos básicos sobre fundamentos de programación y la estructura tanto interna como lógica del microcontrolador es estudio
13.1 INTRODUCCIÓN AL LENGUAJE C Hasta el momento, en todos los programas desarrollados en el campo de la programación de microcontroladores el lenguaje de programación por excelencia ha sido Assembler. Es un lenguaje de programación de bajo nivel que permite interactuar de una manera fácil y rápida al hombre con las máquinas, en este caso, al programador con el microcontrolador. La forma en que un programador puede ordenarle a un microcontrolador realizar tareas y funciones se basa en el uso de operaciones lógicas y aritméticas basadas en sistemas numéricos como el hexadecimal, el decimal y el binario. Sin embargo, una de las dificultades que presenta es el hecho de que en muchos casos se requiere efectuar operaciones especiales como, por ejemplo, multiplicaciones, divisiones, implementación de funciones condicionales y funciones repetitivas, y se debe incorporar una cierta cantidad de código, que la mayoría de las veces se
216
JUAN CARLOS VESGA FERREIRA
puede considerar extensa y compleja, lográndose el mismo resultado con una simple instrucción utilizando lenguajes de programación de alto nivel como Basic o C, considerándose el lenguaje C como el lenguaje de programación de alto nivel predeterminado para la programación de microcontroladores, en este caso de los microcontroladores Motorola Freescale. C es un lenguaje de programación de propósito general que permite el uso de una sintaxis corta, creación de estructuras condicionales y repetitivas sencillas, generación de procedimientos y subrutinas; complementándose con el hecho de contar con un repertorio de instrucciones y operadores que ayudarán a escribir cualquier programa de una manera fácil y corta, en comparación con su homólogo en lenguaje Assembler. C no se considera un lenguaje de muy alto nivel, más bien un lenguaje pequeño y sencillo que no se encuentra especializado en ningún tipo de aplicación en particular, lo cual lo hace un lenguaje de programación muy potente a la hora de ser utilizado, rodeado de un campo de aplicación ilimitado brindándole al usuario no sólo una gama ilimitada de posibilidades de uso en diferentes aplicaciones, sino que tambien se encuentra al alcance de cualquier programador que desee aprenderlo en muy poco tiempo. El lenguaje C fue desarrollado por Brian W. Kerninghan y Dennis M. Ritchie a mediados de la década de 1970, con el objeto de desarrollar el sistema operativo UNIX para la computadora PDP-11. Desde entonces ha tenido una amplia aceptación dentro del área de la programación debido a su flexiblidad, tamaño y portabilidad. Una de las ventajas que presenta el lenguaje C es que trabaja con diferentes tipos de datos que son directamente manejables por el hardware del microcontrolador, como son los caracteres, números y direcciones. Estos tipos de datos pueden ser manipulados por operaciones aritmético-lógicas que proporciona cualquier microcontrolador, brindándole al programador las herramientas de desarrollo base para la construcción de estructuras más complejas en el momento en que se requieran. Esto permite que el código resultante generado por el programador sea muy eficiente, y con ello una mayor estabilidad en el momento de su ejecución, considerándose lo anterior como el punto clave que le ha dado al lenguaje C el éxito que ha tenido como lenguaje de desarrollo de sistemas. C no proporciona otras alternativas de almacenamiento de información que no sea la estática y no proporciona alternativas fijas de entrada/salida, lo cual ha permitido que el lenguaje sea reducido y los compiladores sean de fácil implementación en diferentes modelos de microcontroladores, brindando con ello la capacidad de solucionar las falencias presentes en el sistema en el momento de su reducción con el hecho de permitir incluir funciones en librerías, las cuales le permitirán al programador realizar todas estas tareas, que normalmente dependen del sistema operativo que se esté utilizando en el momento.
En general, se podría decir que C es un lenguaje de programación que tiene una connotación medio-bajo nivel, el cual le permitirá al programador la opción de acceder al hardware del microcontrolador mediante el uso de un modelo de programación estructurada, de manera que se puede hacer uso eficiente de los recursos con que cuenta el microcontrolador con un mínimo de instrucciones.
El presente capítulo tiene como objetivo principal explicar de una manerá rápida pero a su vez completa, las formas de programar con este lenguaje, sus estructuras, su sintaxis y todo el grupo de recursos que rodean a esta poderosa herramienta de trabajo. ALFAOMEGA - FREESCALE
PROGRAMACIÓN EN C
217
13.2 ESTRUCTURA DE UN PROGRAMA EN C Un programa en C consta de varias secciones en donde se determinará qué variables y funciones tendrá el programa, así como la tarea que deberá realizar. Su estructura está determinada por las siguientes partes: Instrucciones para el compilador Definición de estructuras Definición de variables Funciones Programa principal #include
#include declaración de funciones definición (cuerpo de funciones) declaración variables globales main (void) { cuerpo del main o programa principal } otras funciones
¿Qué es un compilador? Un compilador es un programa que traduce el código fuente de un programa escrito en un lenguaje de programación en particular, que para nuestro caso es C, en un código que es el lenguaje por excelencia de todo procesador, llamado “lenguaje máquina”, constituido simplemente por cadenas conformadas por “1” y “0”.
¿Qué es un editor? El compilador es simplemente la herramienta que nos sirve para efectuar las traducciones de un lenguaje comprensible para el ser humano en un lenguaje comprensible solamente por los procesadores; pero, ¿en dónde se escribe el código fuente o programa para el microcontrolador?, la respuesta es muy sencilla: en el editor. Un editor es simplemete cualquier procesador de texto en el cual se escribe el código del programa empleando la sintaxis propia del lenguaje de programación utilizado, para ser enviado posteriormente al compilador con el fin de ser revisado, evaluado y traducido a su código final. ALFAOMEGA - FREESCALE
218
JUAN CARLOS VESGA FERREIRA
Cuando se trata de crear programas para microcontroladores Motorola Freescale, tanto el compilador como el editor se encuentran incluidos en la herramienta de desarrollo propia de esta familia, conocida como CodeWarrior. La programación no siempre es una tarea fácil de hacer, algunas veces está llena de frustaciones, tristezas y estrés, pero tambien está llena de alegrías y recompensas y así mismo, de un sentido de orgullo por haberlo logrado. A continuación se muestra una metodologia que puede ayudar a evitar las frustaciones; esta metodologia está basada en 7 pasos: 1. Definir o redefinir el problema. 2. Diseñar el programa. 3. Escribir el código. 4. Compilar el código. 5. Pruebas y depuración. 6. Documentación. 7. Modificar y mantener.
Definir o redefinir el problema. Este paso define la dirección de lo que sigue en el proceso. Definir el
problema es esencialmente comprender completamente el problema. Esto probablemente al iniciar a programar puede parecer complicado, por lo que al comienzo la definición del problema es vaga; esto requiere redefinir nuestro problema, incluyendo una definición precisa de los datos de entrada, los datos dados y el resultado deseado.
Diseñar el programa. Una vez que ya se tiene la idea conceptual de lo que el programa necesita hacer, necesitamos definir cómo él va a hacerlo. Se requiere contestar preguntas como ¿qué lenguaje utilizar?, ¿cómo va a estar organizado el programa?, ¿cómo debe verse la interfaz (si se requiere)?; tambien se necesita decidir cómo va a representar los datos en el programa o en los archivos y cuáles métodos va a utilizar para procesar los datos. Este paso no requiere ser tan específico, es decir, no exige pensar en las líneas de código exactas. Este paso es más para organizar ideas y pensamientos, aquí es donde se generan los algoritmos y los diagramas de flujo para usarlos más tarde. Escribir el código. Ya que tenemos los algoritmos y los diagramas de flujo podemos entonces traducirlos a líneas de código organizadas que serán ejecutadas por el microcontrolador.
Pruebas y depuración. Si ya hemos logrado tener el código en el lenguaje seleccionado, se requiere hacer un conjunto de pruebas de todos los casos que se han planteado en el diseño, y si surge alguna discrepancia tendremos que volver a la etapa del diseño para corregir el problema.
13.3 DEFINICIÓN DE ESTRUCTURAS INICIALES EN C Las primeras líneas de un programa en C tienen un significado especial como, por ejemplo: la definición de nombres, macros e incluso adjuntar archivos, entre otras funciones. ALFAOMEGA - FREESCALE
219
PROGRAMACIÓN EN C
Todas estas líneas inician con el carácter ‘#’. Por ejemplo: #include
/* Carga al programa la librería stdio.h
#define e 2.7182
/* Donde “e” es el nombre de una constante y su valor es 2.7182 */
Toda expresión que se encuentre entre los símbolos “/*” y “*/” se toma como comentario, es decir, no se considera una instrucción; por tanto, no se tiene en cuenta en el proceso de compilación.
13.4 DEFINICIÓN DE VARIABLES Una variable se considera como una etiqueta o un nombre con el cual se puede tener acceso a posiciones de memoria en particular, permitiendo realizar funciones de lectura y escritura de información durante la ejecución del programa. Las variables pueden ser de dos tipos: variables globales y variables locales. Las variables globales son las que pueden ser llamadas desde cualquier función, manipuladas y mantener los cambios en ellas dentro de todo el programa. Estas variables se definen por fuera de la estructura main ( ) o programa principal. Las variables locales, como su nombre lo indica, son variables que solamente existen dentro de una función o procedimiento, pero si son llamadas desde una función o un procedimiento externo no son capaces de conservar su valor actual y son definidas dentro de la misma rutina que las utilice. A continuación se listan los tipos de variables que pueden ser utilizados para la programación de microcontroladores, el rango de valores de almacenamiento permitidos y el tamaño de memoria que ocupan dentro del microcontrolador.
Type
ALFAOMEGA - FREESCALE
Default format
Default value range min
Formats available with option -T
max
char (unsigned)
8 bit
0
255
8bit, 16bit, 32bit
signed char
8 bit
-128
127
8bit, 16bit, 32bit
unsigned char
8 bit
0
255
8bit, 16bit, 32bit
signed short
16 bit
-32768
32767
8bit, 16bit, 32bit
unsigned short
16 bit
0
65535
8bit, 16bit, 32bit
enum (signed)
16 bit
-32768
32767
8bit, 16bit, 32bit
signed int
16 bit
-32768
32767
8bit, 16bit, 32bit
0
unsigned int
16 bit
65535
8bit, 16bit, 32bit
signed long
32 bit
-2147483648 2147483647
8bit, 16bit, 32bit
unsigned long
32 bit
0 4294967295
8bit, 16bit, 32bit
signed long long
32 bit
-2147483648 2147483647
8bit, 16bit, 32bit
unsigned long
32 bit
0 4294967295
8bit, 16bit, 32bit
220
JUAN CARLOS VESGA FERREIRA
La tabla anterior puede parecer demasiado tediosa; sin embargo, no todos estos tipos de datos se utilizan a la hora de la programacion. Un ejemplo es: char. unsigned char. Estos dos tipos de datos en realidad son lo mismo, como puede darse cuenta el lector, por el rango que manejan. De esta manera tenemos cuatro tipos de datos más usados: 1. char. 2. int. 3. float. 4. double. Y tenemos su contraparte, en la cual podemos manejar datos con signo donde el bit más significativo de cada tipo uno de estos tres tipos se utiliza como signo: 1. signed char. 2. signed int. 3. signed long. Cuando se utilizan variables en lenguaje C, éstas pueden ser de varios tipos según la información que desean manipular o procesar. Entre los tipos de variables se pueden mencionar: * void
Sin valor
* char
Carácter
* short
Entero corto
* int
Entero
* long
Entero largo
* float
Flotante
* double
Flotante de doble precisión
* signed
Usa signo
* unsigned
Sin signo
Un tipo especial de variable es el tipo void, que permite declarar funciones que realizan alguna función en particular sin regresar valores (por ejemplo, una función que imprima un mensaje) y también para la declaración de apuntadores genéricos, es decir, capaces de apuntar a cualquier tipo de variable. La declaración de una variable emplea la siguiente sintaxis: Tipo de Variable Variable1, Variable2; Cuando se definen variables en el mismo renglón, éstas se consideran todas del mismo tipo, por ejemplo: float a,b,c;
ALFAOMEGA - FREESCALE
221
PROGRAMACIÓN EN C
Siempre se debe tener en cuenta que al definir variables, al finalizar la línea se escribe punto y coma (;). Otra propiedad útil es que en el momento en que se define una variable, se le puede indicar el valor inicial de la misma, por ejemplo: char a = ‘X’; float y = 10.2, x = 12.5; Otra posible forma de definir una variables es la siguiente: tipo nombre_variable = valor_de_inicialización; El nombre que puede tomar una variable puede ser de hasta 31 caracteres de largo. Los caracteres que forman el nombre pueden ser letras mayúsculas y/o letras minúsculas, los números de 0 a 9, el carácter “_” ( guión bajo); sin embargo, la mayoría de los compiladores de C y librerías utilizan el guion bajo como primer carácter como convención, y por tanto debe ser evitado como primer carácter ya sea del nombre de una función o de una variable.
Ejemplo La siguiente tabla muestra algunas declaraciones de variables utilizando diferentes tipos; en la segunda columna se explica si están bien escritas desde el punto de vista de sintaxis.
Declaración de variable
Sintaxis
char puertoA;
Válida.
int %avoid;
No válida. No se puede usar caracteres especiales, a excepcion del guión bajo. Válida.
unsigned char x14; Signed int 1a=0xFFFF; signed char siguiente_dato=0x01
No válida. No se puede comenzar con números. Válida.
De todos estos tipos de datos, podemos remarcar que el tamaño tipo entero (INT : integer) depende del bus de datos del microcontrolador seleccionado. En otras palabras, debe depender de la arquitectura misma del componente. Sin embargo, algunas herramientas de desarrollo como CodeWarrior nos permiten seleccionar los tamaños que deseamos definir para cada tipo de dato; ver figura 1. Esto no es recomendable, porque nos puede evitar la portabilidad de nuestro código. Por si fuera poco, el estándar ANSI no define del todo el tamaño de estos tipos.
ALFAOMEGA - FREESCALE
222
JUAN CARLOS VESGA FERREIRA
FIGURA 13.1 Ventana de CodeWarrior donde se permite cambiar el tamaño de los tipos de datos.
Cuando se programa sistemas embebidos es necesario guardar tanto memoria como tiempo de ejecución. Por esto es necesario conocer si se va a programar un microcontrolador de 8, 16 o 32 bits y tratar de usar el mejor tamaño que se adapte para el microcontrolador seleccionado. Por ejemplo, microcontroladores de 8 bits son capaces de procesar datos de 8 bits más eficientemente que los datos de 16 bits. Los tamaños más grandes deberán usarse solamente cuando se requiera, como cuando ejecutamos una multiplicación de 2 datos de 8 bits sabemos de antemano que el resultado será 16 bits; en este caso la variable que utilicemos deberá ser de 16 bits que pueda soportar y guardar el contenido. De esta manera los tipos de datos de doble precisión y de punto flotante son particularmente ineficientes y ¡deberán ser EVITADOS! Además, la mayoría de las aplicaciones que se desarrollan para microcontroladores ¡se basan en datos con punto fijo! ALFAOMEGA - FREESCALE
223
PROGRAMACIÓN EN C
Existen tres reglas básicas para poder seleccionar el tipo de datos en microcontroladores de 8 y 16 bits. 1. Utilizar siempre el tipo más pequeño. 2. Utilizar unsigned donde sea posible. 3. Manejar casts dentro de las expresiones para reducir los tipos de datos al minimo requerido. Podemos agregar a estas tres reglas básicas la de utilizar typedefs para tener valores fijos, y evitar los tipos basicos como son char, int, long en el código de aplicacion.
Ejemplo Cambiar los tipos de datos básicos utilizando un typedef para tener nuevos tipos de datos que sean más fáciles de entender para el programador de microcontroladores. typedef
unsigned char
byte;
typedef
unsigned int
word;
typedef
unsigned long
uint_32;
ast. Como acabamos de mencionar, dentro de las tres reglas básicas hay que utilizar casts para reducir los
tipos de datos al mínimo.
Ejemplo Cuando se realiza una multiplicación de dos datos de 8 bits el resultado será 16 bits, por lo que la variable del resultado de la multiplicación será de 16 bits; sin embargo, para poder manipular el dato requerimos aplicar un cast y dejarlo en 8 bits. char multiplica (char x, char y){ char resultadobajo, resultadoalto; /* Variable Local */ int resultado; resultado = x * y; resultadobajo=(char)resultado; /*Cast para convertir a CHAR de INT*/ resultadoalto=(char)(resultado>>8); return resultadobajo; } En caso de utilizar varios archivos, que es una práctica común en el lenguaje C, las variables globales o las funciones que sean declaradas en un archivo pueden ser accesadas solamente por las funciones que estén en el mismo archivo; en caso de ser necesario que una función o variable global que se encuentre en otro archivo requiera la función o de la variable tendrá que informársele al compilador utilizando la palabra reservada EXTERN.
ALFAOMEGA - FREESCALE
224
JUAN CARLOS VESGA FERREIRA
Ejemplo En el archivo 1. Se encuentra el programa visto en el ejemplo pasado. En el archivo 2. Se encuentra la función resta, la cual utiliza la variable resultado. extern char resultado; /*Variable global declarada en otro archivo sólo se agrega extern para indicarle al compilador que tiene que buscar la declaración en otro archivo. */ /* Código de la Función SUMA */ char resta (char x){ char total; /* Variable Local */ total = x - resultado; return total; /* Aqui se pasa el parámetro del resultado de la suma*/ }
Lugares de almacenamiento de las variables Existen algunos otros modificadores para indicarle al compilador dónde se van a almacenar las variables y cómo se inicializan. Estos modificadores son: Auto. Static. Register. Const. Volatile. Las variables locales definidas dentro de una función utilizan el modificador AUTO, el cual no se requiere agregarlo; una variable local automática puede ser utilizada dentro del bloque de la función y su valor nunca es inicializado cuando es creada; por lo general estas variables son almacenadas en el espacio del stack pointer, de manera que el espacio requerido por la variable es creado en el momento en que se llama a la función y es eliminado cuando se sale o termina. Como vimos en los ejemplos anteriores, una variable puede ser inicializada en el momento en que es declarada asignando un valor a la variable: char x=0x55, x1=0x33; /* Esta variable es AUTO */ Una variable creada con el modificador auto cada vez que se accese a la función será inicializada con el valor que se puso en la declaración, si no se pone ningún valor esta variable va a tomar un dato totalmente aleatorio. Algunas veces se requiere que el valor que se asignó a la variable local se mantenga para futuros llamados de la función. Esto se logra agregando el modificador STATIC. Una variable creada con el modificador STATIC puede ser utilizada solamente dentro de la función en la cual se declaró, y son inicializadas a cero en el momento de su creación. ALFAOMEGA - FREESCALE
225
PROGRAMACIÓN EN C
Ejemplo Una variable es declarada como sigue, dentro de una función: static char zeta = 1; Hay que hacer notar que las variables STATIC no se almacenan en el STACK aunque sean locales; en vez de eso se guardan en una localidad de memoria separada. Como la variable zeta es STATIC, es inicializada a cero cuando el programa es cargado, pero la primera vez que se accesa a la función el valor “1” es asignado a zeta después de este primer acceso la variable NO SERÁ INICIALIZADA nuevamente y en cambio mantendrá el valor asignado la úlitma vez que fue ejecutada la función.
Antes de entrar en MyFunction ( ) la primera 1era. vez, myVar = 0
Esto es parte de ANSI C startup “copy down”
FILE1.c
FILE2.c
#include //includes functions in file FILE2.c
void MyFunction (void) { //Definition of MyFunction in FILE2.C
void main (void) { MyFunction(); //included in FILE2.c MyFunction();
//included in FILE2.c
} Antes de entrar en MyFunction() la segunda vez myVar = 1
static char myVar = 0; //local variable declared static myVar = myVar + 1; }
myVar es una variable local pero mantiene el valor porque está declarada como static.
Otro tipo de modificador para el lugar de almacenamiento es el REGISTER, cuando una variable es declarada para ser de tipo REGISTER el compilador intentará almacenarla en un registro disponible del CPU. Estas variables pueden ser accesadas de forma más rápida que las variables almacenadas en memoria, de manera que este tipo de almacenamieto puede ser para las variables que se utilicen en ciclos que requieran rapidez. Es claro que el espacio de registro en los CPU está muy limitado, especialmente en microcontroladores pequeños y por eso no siempre los registros del microcontrolador estarán disponibles para almacenamiento de datos. Cuando el compilador sepa que no hay registros disponibles para el almacenamiento de datos, hará a la variable de tipo AUTO.
ALFAOMEGA - FREESCALE
226
JUAN CARLOS VESGA FERREIRA
En el caso de las variables globales éstas siempre son inicializadas a cero cuando el programa es cargado. Estas variables, como ya se mencionó en la sección pasada, pueden accesar por cualquier función del programa, de manera que las variables globales se comportan como si fueran STATIC en el aspecto en que son inicializadas a cero y después se les puede asignar un valor cuando son creadas. El modificador CONST se utiliza para poder crear constantes, cuando se utiliza el modificador CONST en la declaración de una variable se requiere que se agregue un valor de inicialización; este valor no puede ser cambiado por el programa por ser de una constante; un ejemplo de una declaracion sería: const double PI = 3.14159265; Una variable declarada como VOLATILE puede ser cambiada fuera del flujo normal del programa, es decir, puede cambiar y no necesariamente por el programa; en los sistemas embebidos esto puede suceder por: 1. Una rutina de servicio de interrupción. Esto se verá más adelante en este mismo capítulo. 2. Consecuencia de una acción del hardware. Por esta última razón se considera como una buena práctica declarar todos los registros de los periféricos como VOLATILE; ejemplo: volatile unsigned char PTAD @0x0000 volatile PTADSTR _PTAD @0x0000 Ahora bien, puede existir una variable con modificador CONST y VOLATILE; esto se debe a que existen registros dentro de los microcontroladores que son de sólo lectura y que cambian por el hardware del microcontrolador; el ejemplo que puede ser más obvio es el registro de estatus de un puerto de comunicaciones seriales como el SCS1. Este registro tiene varias banderas para acondicionar las señales de comunicación, como son la bandera de transmisión completa (SCS1_TC) y la bandera de buffer vacío de transmisión (SCS1_TE), entre otras. Este registro se considera entonces como VOLATILE porque las banderas pueden cambiar por HARDWARE en forma inesperada, dependiendo del estatus de la comunicación, y tambien es de sólo lectura porque estas banderas no pueden ser escritas por programa, solamente responden al estado del módulo. Entonces la mejor declaracion para este tipo de registro es: const volatile unsigned char SCS1 @0x0016
Secuencias de escape Ciertos caracteres no son representados gráficamente y se pueden representar mediante lo que se conoce como secuencia de escape. A continuación vemos una tabla de las más significativas:
\n
salto de línea
\b
retroceso
\t
tabulación horizontal
\v
tabulación vertical
\\
contrabarra ALFAOMEGA - FREESCALE
227
PROGRAMACIÓN EN C
\f
salto de página
\’
apóstrofe
\”
comillas dobles
\0
fin de una cadena de caracteres
Inclusión de ficheros Como ya hemos mencionado, en la programación en C es posible utilizar funciones que no estén incluidas en el propio programa. Para ello utilizamos la directiva #include, que nos permite añadir librerías o funciones que se encuentran en otros ficheros a nuestro programa. Para indicar al compilador que vamos a incluir ficheros externos, podemos hacerlo de dos maneras (siempre antes de las declaraciones). 1. Indicándole al compilador la ruta donde se encuentra el fichero. #include “misfunc.h” #include “c:\includes\misfunc.h” 2.
Indicando que se encuentran en el directorio por defecto del compilador. #include
13.5
PROGRAMA PRINCIPAL
El programa principal es el encargado de organizar y recopilar de manera secuencial la ejeción del programa; en él se encuentran las instrucciones y llamadas a funciones que se han programado previamente. La sección correspondiente al programa principal se identifica con la estructura “main ()”. El programa principal para el cálculo del volumen de una esfera puede ser el siguiente: void main(void) { .............. aquí se escribe la estructura secuencial del programa deseado .............. }
ALFAOMEGA - FREESCALE
228
JUAN CARLOS VESGA FERREIRA
NOTA Se debe tener en cuenta que cuando se escribe un programa en C, es importante el uso de tabulaciones o sangrías con el fin de comprender mucho más fácil a nivel de observación la estructura de un programa, visualizando qué partes pertenecen a una estructura en particular y cuáles no.
13.6 OPERADORES Un operador es un símbolo que representa una operación especial, la cual puede ser de diferentes clases; los tipos de operadores que existen son: aritméticos de relación y lógicos de incremento y decremento para manejo de bits de asignación y expresiones expresiones condicionales A continuación se describe en detalle cada una de las clases de operadores y su forma de implementación.
Operadores aritméticos Los operadores aritméticos son aquellos que permiten realizar las funciones básicas matemáticas; estos operadores son los siguientes:
+
Suma de dos operandos
-
Resta entre dos operandos
*
Multiplicación de dos operandos
/
División entre dos operandos
%
Módulo entre dos operandos. Da el residuo de la división resultante entre el operando1 (numerador) y el operando2 (denominador).
ALFAOMEGA - FREESCALE
229
PROGRAMACIÓN EN C
La sintaxis es: Resultado = operando1 operador
operando2
Ejemplos: Suma = Cantidad1 + Cantidad 2 Resta = Cantidad1 - Cantidad 2
Operadores de relación y lógicos Los operadores de relación son aquellos que permiten realizar comparaciones entre dos cantidades, entregando como resultado una cantidad de tipo booleano (Verdadero o Falso); éstos operadores juegan un papel muy importante en el mundo de la programación de microcontroladores. Los tipos de operadores de relación y lógicos son los siguientes: Operadores de relación >
Mayor que
>=
Mayor o igual
<
Menor que
<=
Menor o igual
==
Idéntico
!=
Diferente a
Operadores lógicos &&
Y
Función lógica AND
||
Ó Función lógica OR
!
NO
Función lógica NOT
NOTA Como se mencionó antes, el resultado del uso de estos operadores puede ser falso o verdadero. Si el resultado de la operación es falso se representará con un valor cero; de lo contrario, si el valor fue verdadero tomará como valor cualquier cantidad diferente de cero.
ALFAOMEGA - FREESCALE
230
JUAN CARLOS VESGA FERREIRA
La sintaxis es: Si se trata de un Operador de Relación Condicional operando1 operador operando2 If (Cantidad1 >= Cantidad2) Si se trata de un Operador Lógico
A nivel condicional Condicional Condición1 operador Condición2 If ((Cantidad1 >= Cantidad2) && (Cantidad2 >= Cantidad3))
A nivel operativo Resultado = Cantidad1 operador Cantidad2 Resultado = Cantidad1 & Cantidad2 Hay que tener en cuenta que cuando se desea realizar una operación no condicional, el símbolo del operador respectivo se coloca sólo una vez, de lo contrario se debe colocar dos veces.
Operadores de incremento y decremento Entre los operadores más utilizados en programación se encuentran los operadores de incremento y decremento, los cuales aumentan o disminuyen en una unidad al operando o variable que se está afectando, respectivamente. A continuación se ilustran algunos ejemplos de estos operadores. Operador
Sentencia Abreviada
Sentencia no Abreviada
=
=
=
++
m++
m=m+1
--
m--
m=m-1
+=
m+=n
m=m+n
-=
m-=n
m=m-n
*=
m*=n
m=m*n
/=
m/=n
m=m/n
Los operadores ++ y – pueden ir antes o después de una expresión generando resultados diferentes; estas expresiones se llaman pre-incrementos o post-incrementos.
Ejemplos int x=1,y; y=x++;
/* y vale 1 y x vale 2 */ ALFAOMEGA - FREESCALE
231
PROGRAMACIÓN EN C
int x=1,y; y=++x;
/* y vale 2 y x vale 2 */
Operadores para manejo de bits Dentro de los operadores que más uso tienen en el mundo de la programación de microcontroladores se encuentran los que permiten manipular bits; gracias a éstos se puede extraer información importante que esté presente, por ejemplo, en un puerto en un momento dado. Dentro de los operadores que permiten la manipulación de bits podemos mencionar:
&
AND de bits.
Ejemplo: 0x0F & 0x2A => 0x0A
|
OR inclusivo de bits.
Ejemplo: 0X0F | 0XF0 => 0xFF
^
OR exlusivo de bits.
Ejemplo: 0xF0 ^ 0x02 => 0xF2
<<
corrimiento a la izquierda.
Ejemplo: 0x02 << 1 => 0x04
>>
corrimiento a la derecha.
Ejemplo: 0x08 >> 2 => 0x02
~
complemento a uno (unario).
Ejemplo: ~0x0F => 0XF0
Operadores de asignación y expresiones El operador de asignación ‘=’, permite el almacenamiento o resultado de una operación en una variable específica.
Ejemplos x = 3 + 4;
/* x=7 */
x = 4;
/* x=4 */
x = x + 4;
/* x=x + 4 */
x += 4;
/* x=x + 4*/
13.7 SENTENCIAS DE CONTROL Dentro de las estructuras que brindan una gran ventaja a la hora de realizar funciones que desde el punto de vista de Assembler serían demasiado largas y complejas, se encuentran las sentencias de control. El tener que escribir rutinas de tipo repetitivo o condicional muchas veces puede resultar complejo y confuso; sin embargo, escribir las mismas rutinas utilizando C resulta bastante fácil, corto y estable en el momento de su ejecución. En esta ocasión se debe tener en cuenta que a la hora de escribir rutinas de este tipo, el uso de las llaves ‘{‘, ‘}’ se requiere para agrupar declaraciones y proposiciones dentro de un bloque. Las sentencias de control son las siguientes: if-else, else-if, switch, while, for, do-while. ALFAOMEGA - FREESCALE
232
JUAN CARLOS VESGA FERREIRA
if-else La proposición if-else es la sentencia de control más básica que se puede utilizar; se requiere cuando es necesario el uso de condicionales dentro de una estructura de programación. Su sintaxis es: if(expresión) proposición1; else
/* Si la condición es verdadera */ /* Se ejecuta la proposición1 */ /* De lo contrario */
proposición2;
/* Se ejecuta la proposición2 */
Si la condición no requiere una acción, en caso de no cumplirse la condición se puede escribir de la siguiente manera: if(expresión) proposición1;
/* Si la condición es verdadera */ /* Se ejecuta la proposición1 */
Para los casos anteriores, tanto la proposición1 como la proposición2 están constituidas por una sola instrucción; en caso de requerirse el uso de dos o más instrucciones dentro de un condicional, es necesario agruparlas entre llaves; en tal caso, tanto la proposición1 como la proposición2 pueden ser proposiciones compuestas o bloques. Por ejemplo: If ( a>b ) { mayor=a; menor=b;
/* Bloque correspondiente a Proposición 1 */
} else { mayor=b; menor=a;
/* Bloque correspondiente a Proposición 2 */
}
else-if Esta sentencia es complementaria con la sentencia anterior; conocida como sentencia if anidada, se utiliza cuando solamente una de varias condiciones es válida. Su sintaxis es: if( expresión ) proposición1; else if( expresión ) proposición2; ALFAOMEGA - FREESCALE
233
PROGRAMACIÓN EN C
else if( expresión ) proposición3; else if( expresión ) proposición4; else proposición5;
Ejemplo: if ( a>b ) && ( b>c ) { mayor=a; menor=c;
/* Bloque correspondiente a Proposición 1 */
} else if ( a>b ) && ( c>b ) { mayor=a; menor=c;
/* Bloque correspondiente a Proposición 2 */
} else if ( b>a ) && ( a>c ) { mayor=b; menor=c;
/* Bloque correspondiente a Proposición 3 */
} .............. ………………. else { mayor=c; menor=b;
/* Bloque correspondiente a última Proposición */
}
switch Cuando se requiere establecer situaciones semejantes a las de un menú, en donde solamente una de varias opciones debe ejecutarse, la proposición switch es la ideal; ésta permite la decisión múltiple que prueba si una expresión coincide con uno de los valores constantes enteros que se hayan definido previamente.
ALFAOMEGA - FREESCALE
234
JUAN CARLOS VESGA FERREIRA
Su sintaxis es: switch( expresión ) { case exp-const: proposiciones break; case exp-const: proposiciones break; case exp-const: case exp-const: proposiciones break; default: proposiciones } “exp-const” corresponde a cada una de las opciones presentes en el abanico de posibilidades a ejecutar, y en el momento de encontrar una constante idéntica se ejecutan las proposiciones correspondientes a ese caso. Al terminar de realizar las proposiciones de un caso en particular y se desea indicar el final de la misma, para salir de la sentencia switch se debe usar la palabra reservada “break” finalizando la sentencia. Si en ninguno de los casos se cumple con la expresión, se puede definir un caso por omisión, que permita realizar operaciones requeridas según la ocasión; para tales efectos se debe utilizar la opción “default”.
Ejemplo switch ( operacion ) { case 1: { resultado=a+b; break; } case 2: { resultado=a-b; break; } case 3: { resultado=a*b; break; } default:
/* Operación contiene el valor de la función a utilizar /* Operacion=1 , SUMAR */
/* Operacion=1 , RESTAR */
/* Operacion=1 , MULTIPLICAR */
/* Operacion=1 , DIVIDIR */ ALFAOMEGA - FREESCALE
235
PROGRAMACIÓN EN C
{ resultado=a/b; break; } } Se debe recordar que para los casos en donde las proposiciones están constituidas por una sola instrucción, no se usan llaves de agrupación; en caso de requerirse el uso de dos o más instrucciones dentro de un condicional, es necesario agruparlas entre llaves.
while Cuando se desea escribir rutinas repetitivas, se pueden utilizar las sentencias while o for; sin embargo, existe una gran diferencia entre las dos. Cuando se sabe cuántas veces se debe repetir una rutina o proposición se pueden utilizar las sentencias for o while, en caso de no saber cuántas veces se debe repetir la proposición, se debe utilizar while; este último permite la ejecución de una proposición simple o compuesta, mientras la “condición” sea verdadera. Su sintaxis es: while( condición ) proposición Por ejemplo, While (Npersonas<20) { s=a+b; Npersonas++; }
for La sentencia “for” permite la ejecución de rutinas repetitivas, que como se mencionó antes, es recomendable cuando se conoce el número de veces que se desea repetir una determinada proposición o subrutina. La sentencia for requiere tres expresiones como argumento. La expresión 1 corresponde al punto inicial de la variable de control, la expresión 2 corresponde a un condicional o delimitador de cuál es el valor máximo que debe alcanzar la variable de control para mantener la iteración, y finalmente la expresión 3 corresponde al incremento que debe sufrir la variable de control cada vez que realice una iteración, en donde el valor por defecto de ésta última expresión es 1. La sintaxis es: for(expresión1; expresión2; expresión3) proposición
Ejemplo La siguiente rutina calcula el valor de la suma de los números de 1 a 10. ALFAOMEGA - FREESCALE
236
JUAN CARLOS VESGA FERREIRA
for(i=1; i =10 ; i++)
/* i inicia con el valor de 1 hasta 10 */
{
/* incrementos de 1 en 1
*/
suma=suma + i; }
do-while Otra sentencia utilizada en rutinas repetitivas es “do-while”; ésta es muy similar a la sentencia “while”, ejecutando la proposición o subrutina mientras se cumpla la condición dada en “expresión”. La principal diferencia entre las dos sentencias radica en que en “do-while” siempre se evalúa al menos una vez su “proposición”, mientras que en “while” si no se cumple la “expresión” no entra al ciclo. Sintaxis: do proposición while( expresión );
Ejemplo Calcular la suma de los números de 1 a 10. suma=0; i=1; do { suma=suma+i; i++; } while( i <= 10 );
break y continue Cuando se desea abandonar una rutina cíclica en forma abrupta debido a alguna situación en particular, se debe usar la proposición “break”; ésta se utiliza en sentencias repetitivas como “for”, “while” y “do-while”. Existe una instrucción que permite realizar la función contraria o complementaria llamada “continue”, en donde su función es ocasionar la próxima iteración del ciclo.
Ejemplos Este programa permite imprimir todos los números de 1 a 10 que no sean múltiplos de 3. ALFAOMEGA - FREESCALE
237
PROGRAMACIÓN EN C
for(i=1; i=10; i++) { if ( i%3 == 0 ) /* si i es múltiplo de 3 */ { continue; /* salta hacia el siguiente valor de i */ } cout << i /* si i no es múltiplo de 3, imprime i */ } Este programa imprime todos los números de 1 a 10; en caso de encontrarse un múltiplo de 3, el programa finalizará abruptamente. for(i=1; i=10; i++) { if ( i%3 == 0 ) /* si i es múltiplo de 3 */ { break; /* finaliza la sentencia for */ } cout << i /* si i no es múltiplo de 3, imprime i */ }
13.8 ARREGLOS O VECTORES Un arreglo se define como un conjunto de localidades de memoria consecutivas, es decir, podemos definirlo como un conjunto de variables. Un arreglo se declara igual que una variable pero después del nombre se utiliza un par de corchetes “[ ]“ para indicar la cantidad de elementos que contendrá el arreglo, como se muestra a continuación: Sintaxis: tipo nombre_variable[cantidad]={valores_de_inicialización};
Arreglo
Der. de memoria
FIGURA 13.2 Asignación de un arreglo. ALFAOMEGA - FREESCALE
Char Var1
Char Var2
Char Var3
3A00H
3A01H
3A02H
238
JUAN CARLOS VESGA FERREIRA
Ejemplos extern int a[]; char xy[100]={0x20, 0x30,0x40}; float temperatura[1000]; char cadena[]={“HOLA, MUNDO”}; Como podemos ver, el tamaño de un arreglo puede ser asignado después, y se puede utilizar corchetes vacíos en el momento de la declaración. En el primer ejemplo el arreglo a[ ] es definido como memoria global, en un archivo externo. El argumento de un arreglo se llama a veces índice. Este número permite seleccionar uno de los elementos del arreglo. Los elementos de un arreglo siempre comienzan con cero. De manera que cuando un arreglo es creado con 100 elementos, estos elementos pueden ser accesados utilizando el índice variándolo desde 0 hasta 99. El elemento correspondiente al índice 100 no es parte del arreglo. Los valores de inicialización deben estar dentro de llaves, y si son varios los valores numéricos, estos deberán estar separados por comas como aparece en el segundo ejemplo.
Cadenas Una cadena es un caso especial de arreglo. Cuando se genera una cadena en C, se crea un arreglo de caracteres. La longitud de una cadena es de uno más que cualquier otro tipo de arreglo. Los caracteres individuales de la cadena se guardan en cada uno de los lugares de los elementos del arreglo. Para ser considerado una cadena en C, el arreglo debe contener en su último carácter un CERO o un carácter NULO. Todas las cadenas en C terminan con un carácter NUL (null). Si el programador crea una cadena de caracteres en su programa debe asignar el carácter nulo para garantizar que C lo trate como una cadena de caracteres. El lenguaje C no provee ningún tipo de chequeo de límites; es, por tanto, responsabilidad del programador garantizar que el índice del arreglo no sobrepasa los límites del mismo. Un ejemplo de cadena es: char mensaje[ ]={“LA HORA EXACTA ES:”}; char texto[6]={“PAGO:”};
13.9 FUNCIONES Las funciones son conjuntos de instrucciones organizadas a nivel de procedimientos o subrutinas que realizan tareas específicas. Un ejemplo claro de una función es el siguiente: se desea escribir una función que lea dos números y devuelva el mayor.
ALFAOMEGA - FREESCALE
239
PROGRAMACIÓN EN C
#include int Comparar (int a, int b) /* esta es la forma de definir una función*/ { int mayor; if (a>b) { mayor=a; } else { mayor=b; } return mayor; } void main (void) { ............ resultado=Comparar(num1,num2)
/* esta es la forma de utilizarla en la cual num1 y num2 son 2 cantidades prestablecidas y al ser comparadas en la función, el valor mayor quedará almacenado en la variable resultado. */
} Conforme aumenta el código de una aplicación se puede encontrar que existen algunos segmentos de código que se repiten en diferentes partes de la aplicación. Estos segmentos de código pueden ser agrupados con la finalidad de que la aplicación pueda reutilizarlos en cualquier parte del programa que lo requiera. A estos segmentos de código se les conoce como funciones. La sintaxis de una función es la siguiente: < Tipo > < Nombre de la Función > ( Argumentos de la función ) { Sentencia1; Sentencia2; SentenciaN; } El tipo de la función es determinado por el tipo de dato que retorna dicha función. Las funciones pueden retornar cualquier tipo de dato definido dentro de la aplicación o pueden no retornar ningún tipo de dato. ALFAOMEGA - FREESCALE
240
JUAN CARLOS VESGA FERREIRA
Las funciones que no regresan ningún valor se conocen como funciones de tipo vacío (void). Si se quiere que la función retorne un determinado tipo de dato, el tipo de dato requerido debe ser especificado en el campo “Tipo”. El nombre de la función puede ser formado por números y letras de 1 a 32 caracteres. El nombre de la función no puede empezar con un número o con un signo. El único signo aceptado dentro del nombre de una función es el guión bajo “_”. Independientemente del tipo de dato que retorna la función, la función puede o no recibir argumentos. Los argumentos de una función se conocen también como paso de parámetros. Los argumentos recibidos por una función pueden ser de cualquier tipo de dato definido dentro de la aplicación. A continuación se muestra la sintaxis de una función de tipo vacío (void) que no recibe ningún tipo de parámetro. void Funcion1(void) { Sentencia1; Sentencia2; SentenciaN; }
Ejemplo 1 Se utiliza una función llamada “Suma” que realiza la adición de las variables globales VarA y VarB, almacenando el resultado de la suma en la variable global llamada “Resultado”. En este ejemplo las 3 variables son declaradas como globales debido a que están declaradas fuera de cualquier función. Si dichas variables son declaradas dentro de la función “main”, serán interpretadas como variables locales debido a que están declaradas dentro de una función. En este caso el compilador generaría un error dentro de la función suma debido a que dichas variables sólo pueden ser utilizadas por la función que las declaró. El ejemplo almacena en VarA un valor 15 decimal y en VarB un valor 20 decimal y posteriormente ejecuta la función “Suma”. Después de que se ejecuta la función “Suma”, la variable Resultado es 35. unsigned char VarA; unsigned char VarB; unsigned int Resultado; void Suma(void) { Resultado = VarA + VarB; } void main(void) { VarA = 15; ALFAOMEGA - FREESCALE
PROGRAMACIÓN EN C
241
VarB = 20; Suma(); For(;;); } Una función puede recibir uno o más parámetros, los cuales pueden ser de un tipo de dato diferente, por lo que cada argumento debe ser declarado en forma independiente. Si una función recibe más de 1 parámetro, la declaración de cada parámetro debe ser separada por una coma “,”. El o los parámetros que recibe una función son interpretados como variables locales, lo que quiere decir que dichos parámetros sólo existirán dentro de la función que los declara. A continuación se muestra la sintaxis de una función de tipo “void” que recibe 2 argumentos. void Funtion1( < Variable1>, < Variable2>) { Sentencia1; Sentencia2; SentenciaN; }
Ejemplo 2 Se utiliza una función llamada “Suma” que recibe 2 parámetros. Los parámetros son VarA y VarB, los cuales son variables de tipo “unsigned char”. En este ejemplo VarA y VarB son declarados cuando la función “Suma” es ejecutada y ambos parámetros dejarán de existir cuando la función “Suma” termine. En este ejemplo, los valores 15 decimal y 20 decimal son cargados en VarA y VarB respectivamente, cuando la función “Suma” es llamada. El resultado de la suma de VarA y VarB es guardado en la variable global llamada “Resultado”, la cual será igual a 35 después de que la función “Suma” termine. unsigned int Resultado; void Suma(unsigned char VarA, unsigned char VarB) { Resultado = VarA + VarB; } void main(void) { Suma(15, 20); For(;;); } ALFAOMEGA - FREESCALE
242
JUAN CARLOS VESGA FERREIRA
Como se mencionó antes, una función puede retornar o no algún valor independientemente de si la función recibe parámetros. El tipo de dato que retorna la función se especifica desde el momento en que la función es declarada. Para que la función pueda retornar un valor, debe ser utilizada la palabra reservada “return” seguida del valor de retorno encerrado entre paréntesis. Una vez que la instrucción “return” es ejecutada, la función será terminada. La instrucción “return” es siempre la última sentencia que es ejecutada dentro de la función. Cuando una función retorna un valor, dicho valor debe ser asignado a una variable del mismo tipo del valor de retorno. Dicha asignación debe realizarse en el momento de la llamada a la función.
Ejemplo 3 Se utiliza una función llamada “Suma” que recibe 2 parámetros, VarA y VarB. En este ejemplo los valores 15 decimal y 20 decimal son cargados en VarA y VarB, respectivamente, cuando la función “Suma” es llamada. El resultado de la suma de VarA y VarB es almacenado en una variable local llamada “Temporal” y posteriormente dicha variable es retornada por la función “Suma” utilizando la instrucción “return”. Una vez que la función “Suma” es ejecutada, el valor de retorno es asignado a la variable llamada “Resultado”, en este caso el valor de retorno es 35 decimal. Es importante mencionar que en el ejemplo no se utiliza ninguna variable global, puesto que las entradas que utiliza la función son pasadas por medio de parámetros y el resultado de la función es pasado a través del valor de retorno. unsigned int Suma(unsigned char VarA, unsigned char VarB) { unsigned int Temporal; Temporal = VarA + VarB; return(Temporal); } void main(void) { unsigned int Resultado; Resultado = Suma(15, 20); For(;;); } En el ejemplo anterior el resultado de la suma es almacenado en una variable local y posteriormente dicha variable es pasada como valor de retorno usando la instrucción “return”. Dentro de los paréntesis de la instrucción “return” pueden realizarse directamente operaciones con variables y el resultado de dichas operaciones será retornado sin necesidad de ser almacenado previamente en una variable local. El siguiente ejemplo realiza la suma de VarA y VarB directamente sobre la instrucción “return”. Este ejemplo obtiene los mismos resultados que el ejemplo anterior, pero evita que la variable local llamada “Temporal” tenga que ser declarada y que el resultado de la suma tenga que ser previamente asignado a dicha variable. ALFAOMEGA - FREESCALE
PROGRAMACIÓN EN C
243
unsigned int Suma(unsigned char VarA, unsigned char VarB) { return(VarA + VarB); } void main(void) { unsigned int Resultado; Resultado = Suma(15, 20); For(;;); }
13.10 INTERRUPCIONES Como se mencionó anteriormente, un microcontrolador es un sistema que está constituido por 3 partes fundamentales, el procesador (CPU), las memorias (RAM, Flash) y los periféricos. Hasta el momento el uso de los periféricos ha sido de manera síncrona puesto que se conocen la o las líneas específicas de código donde el procesador hace mención a algún periférico ya sea para manipularlo o sólo para conocer el estado en que se encuentra dicho periférico, como se muestra en el ejercicio del capítulo 2. Los periféricos son una parte esencial en el uso de microcontroladores debido a que son éstos los que permiten interactuar al procesador con el mundo real. Debido a que en el mundo real existen eventos que no pueden ser predecibles puesto que pueden darse en cualquier momento, es necesario contar con un recurso que le permita al procesador detectar esta clase de eventos. Esta clase de eventos se conocen también como eventos asíncronos. Las interrupciones son un recurso que permite al procesador establecer un diálogo con los distintos periféricos para poder detectar cualquier tipo de evento ya sea síncrono o asíncrono. El principal objetivo de una interrupción será entonces procesar eventos asíncronos. El ejemplo más simple de un evento asíncrono puede ser el de detectar que el usuario ha presionado un botón, como se pudo ver en el ejercicio del capítulo 2. Aunque este tipo de evento es asíncrono, se podría detectar sin el uso de interrupciones debido a que la velocidad en que un microcontrolador puede verificar si determinado botón fue presionado es mucho mayor que la velocidad a la que un ser humano puede presionar y liberar el botón. Para este caso, leer el estado del puerto (poleo) en determinada parte del código sería suficiente para detectar cuándo el usuario está presionando algún botón. Pero las cosas se complican cuando se quiere detectar eventos asíncronos de gran velocidad. En este caso se vuelve prácticamente imposible detectar el evento ejecutando una instrucción de lectura de un puerto, puesto que por cada instrucción ejecutada por el procesador tendría que haber una instrucción para detectar el estado del puerto y así asegurar que todos los eventos están siendo contabilizados por el procesador. Debido a que un evento asíncrono puede generarse en cualquier momento, el procesador debe ser capaz de detectar este tipo de eventos en cualquier momento sin importar la tarea o instrucción que esté ejecutando en ese momento. Las interrupciones pueden ser configuradas para permitir que un evento genere una interrupción en el flujo normal del programa obligando al procesador a suspender temporalmente su ejecución para atender al evento que generó dicha interrupción. ALFAOMEGA - FREESCALE
244
JUAN CARLOS VESGA FERREIRA
Para lograr que un evento genere una interrupción debe tener asociada una sección de código, la cual el procesador ejecutará cuando dicho evento se genere; esta sección de código se conoce como rutina de servicio de interrupción (ISR). Una rutina de servicio de interrupción es esencialmente una función con la diferencia de que dicha función no necesita ser llamada dentro del flujo normal del programa, puesto que es ejecutada por un circuito de hardware cuando el evento apropiado se genera. Al igual que las llamadas a función, las rutinas de servicio de interrupción modifican el flujo normal del programa, por lo que el contexto actual debe ser almacenado cuando la rutina de servicio es ejecutada. De igual manera, cuando la rutina de servicio de interrupción termina, el contexto necesita ser recuperado para permitir que el programa continúe con las tareas que estaba ejecutando justo antes de que se generara la interrupción. La siguiente figura ejemplifica cómo puede ser ejecutada una rutina de servicio de interrupción sin importar qué parte del programa principal está ejecutando el procesador.
Normas Ejecución
PROGRAMA PRINCIPAL
Interrupción (Hardware)
SUBRUTINA DE SERVICIO RTI Regreso por software
Normal Ejecución
FIGURA 13.3 La mayoría de los microcontroladores tienen diferentes tipos de interrupciones, como interrupciones externas, interrupciones de tiempo real, interrupciones periódicas, interrupciones de puerto, etc. Todas y cada una de las interrupciones de un microcontrolador pueden ser configuradas y habilitadas en forma independiente. Esto significa que por cada interrupción habilitada debe existir una rutina de servicio de interrupción. Debido a que se pueden tener varias interrupciones habilitadas al mismo tiempo, es necesario que el procesador sepa qué rutina de servicio de interrupción necesita ejecutar cuando se genera una interrupción. La forma en que se liga un determinado tipo de interrupción con una rutina de servicio es a través de una tabla de vectores. Un vector de interrupción es una localidad dentro de la memoria de programa que se utiliza para almacenar la dirección donde se encuentra la rutina de servicio que es ejecutada cuando dicha interrupción sea generada. Cada tipo de interrupción tiene asignado un vector. A continuación se muestra la tabla de vectores de interrupción de un microcontrolador de la familia MC9S08GX. ALFAOMEGA - FREESCALE
245
PROGRAMACIÓN EN C
Vector Priority
Vector Number Address (High/Low) Vector Name
Lower
26 thorough 31
$FFC0/FFC1 through $FFCA/FFCB
25
$FFCC/FFCD
Vrti
System control
RTIF
RTIE
Real-time interrupt
24
$FFCE/FFCF
Viic1
IIC
IICIS
IICIE
IIC control
23
$FFC0/FFC1
Vatd1
ATD
COCO
AIEN
AD conversion complete
Source
Enable
Description
Unused Vector Space (available for user program)
22
$FFC2/FFD3
Vkeyboard1
KBI
KBF
KBIE
Keyboard pins
21
$FFD4/FFD5
Vsci2tx
SCI2
TDRE TC
TIE TCIE
SCI2 transmit
20
$FFD6/FFD7
Vsci2rx
SCI2
IDLE RDRF
ILIE RIE
SCI2 receive
OR NF FE PF
ORIE NFIE FEIE PFIE
19
$FFD8/FFD9
Vsci2en
SCI2
18
$FFDA/FFDB
Vsci1tx
SCI1
TDRE TC
TIE TCIE
SCI1 transmit
17
$FFDC/FFDD
Vsci1rx
SCI1
IDLE RDRF
ILIE RIE
SCI1 receive
16
$FFDE/FFDF
Vsci1err
SCI1
OR NF FE PF
ORIE NFIE FEIE PFIE
SCI1 error
15
$FFD0/FFE1
VsPI1
SPI
SPIF MODF SPTEF
SPIE SPIE SPTIE
SPI
14
$FFD2/FFE3
Vtpm2ovf
TPM2
TOF
TOIE
TPM2 overlow
13
$FFE4/FFE5
V1pm2ch4
TPM2
CH4F
CH4IE
TPM2 channel 4
12
$FFE6/FFE7
V1pm2ch3
TPM2
CH3F
CH3IE
TPM2 channel 3
11
$FFE8/FFE9
V1pm2ch2
TPM2
CH2F
CH2IE
TPM2 channel 2
SCI2 error
10
$FFEA/FFEB
V1pm2ch1
TPM2
CH1F
CH1IE
TPM2 channel 1
9
$FFEC/FFED
V1pm2ch0
TPM2
CH0F
CH0IE
TPM2 channel 0
8
$FFEE/FFEF
Vtpm2ovf
TPM1
TOF
TOIE
TPM1 overflow
7
$FFE0/FFF1
V1pm1ch2
TPM1
CH2F
CH2IE
TPM1 channel 2
6
$FFE2/FFF3
V1pm1ch1
TPM1
CH1F
CH1IE
TPM1 channel 1
5
$FFE4/FFF5
V1pm1ch0
TPM1
CH0F
CH0IE
TPM1 channel 0
$FFE6/FFF7
Vicg
ICG
ICGIF (LOLS/LOCS)
LOLRE/LOCRE
ICG
3
$FFEB/FFF9
VIvd
System control
LVDF
LVDIE
Low-voltage detect
2
$FFEA/FFFB
Vrrq
IRQ
IRQF
IRQIE
IRQ pin
1
$FFEC/FFFD
Vswi
Core
SWI Instruction
__
Software interrupt
0
$FFEC/FFFF
Vreset
System control
COP LVD RESET pin illegal opcode
COPE LVDRE __ __
Watchdog timer Low-voltage detect External pin Illegal opcode
4
Higher
Module
ALFAOMEGA - FREESCALE
246
JUAN CARLOS VESGA FERREIRA
Sintaxis de una rutina de servicio de interrupción interrupt void (void) { Limpiar bandera de interrupción; Sentencia1; } Aunque la sintaxis de una rutina de servicio de interrupción es muy similar a la sintaxis de una función, existen varias diferencias que vale la pena mencionar. La declaración de una rutina de servicio de interrupción empieza con la palabra reservada “interrupt”, la cual permitirá al compilador diferenciar una rutina de servicio de interrupción de una función. En la declaración de una rutina de servicio de interrupción se debe especificar el número del vector de interrupción al que será ligada dicha rutina. El número de vector de interrupción es especificado en la tabla de vectores de interrupción. Todas las rutinas de servicio de interrupción son de tipo “void” puesto que no retornan ningún valor. Ninguna rutina de servicio de interrupción recibe parámetros. El siguiente ejemplo muestra la declaración de la rutina de servicio de interrupción ejecutada cuando la interrupción del módulo IRQ es generada. Como muestra la tabla de vectores, el número de vector correspondiente al módulo IRQ es el número “2”. interrupt 2 void IRQ_ISR(void) { } Todas y cada una de las interrupciones descritas en la tabla de vectores pueden ser habilitadas o deshabilitadas, con excepción del vector de reset. Las interrupciones que pueden ser habilitadas y deshabilitadas por software se conocen como interrupciones mascarables. Una interrupción mascarable es aquella donde el procesador puede decir si ejecuta o no dicha interrupción. Aquellas interrupciones como el “reset”, donde el procesador no puede decidir si ejecuta la interrupción o no, se conocen como interrupciones no mascarables. Las interrupciones mascarables tienen un registro de configuración donde se pueden habilitar o deshabilitar de forma Cada uno de los módulos descritos en la tabla de vectores de interrupción pueden ser habilitados o deshabilitados en forma independiente debido a que cada módulo tiene un registro de configuración de interrupciones. Además de estos registros de configuración existe un registro global que permite deshabilitar todas las interrupciones habilitadas hasta el momento. La máscara que deshabilita las interrupciones globalmente se llama I y se encuentra en el registro de código de condiciones, pero puede ser llamada por ALFAOMEGA - FREESCALE
247
PROGRAMACIÓN EN C
un par de macros para activarla y desactivarla en C la macro que pone esta bandera en cero que permite “DisableInterrupts”. La máscara que permite la ejecución de cualquier interrupción habilitada hasta el momento se llama “EnableInterrupts”. Ninguna interrupción podrá ser ejecutada si la máscara “EnableInterrupts” no es utilizada dentro de la aplicación. Debido a que un procesador ejecuta tareas en forma secuencial, dos tareas o procesos no pueden ser ejecutados por el procesador al mismo tiempo. Lo mismo sucede con las interrupciones. Aunque se habló de que las interrupciones pueden ser generadas en forma asíncrona, al igual que cualquier otra tarea el procesador sólo puede atender una cada vez. Esto quiere decir que si dos interrupciones son generadas al mismo tiempo, el procesador deberá ser capaz de decir cuál de las dos interrupciones debe atender primero. Para resolver este problema cada una de las interrupciones tiene asignada una prioridad, de manera que si dos interrupciones son generadas simultáneamente el procesador atenderá primero la interrupción de más alta prioridad. En algunos sistemas la prioridad de las interrupciones puede ser configurada por el usuario y en algunos otros sistemas dicha prioridad es fija. Por ejemplo, la prioridad de las interrupciones de los microcontroladores de la familia MC9S08GX no puede ser cambiada. En la tabla de vectores de interrupción mostrada antes se
RESUMEN DEL CAPÍTULO CAPÍTULO Hasta el momento, en todos los programas desarrollados en el campo de la programación de Microcontroladores, el lenguaje de programación por excelencia ha sido Assembler. Assembler es un lenguaje de programación de bajo nivel que permite interactuar de una manera fácil y rápida al hombre con las máquinas, en este caso, al programador con el Microcontrolador. C es un lenguaje de programación de propósito general que permite el uso de una sintaxis corta, creación de estructuras condicionales y repetitivas sencillas, generación de procedimientos y subrutinas; complementándose con el hecho de contar con un repertorio de instrucciones y operadores que ayudarán a escribir cualquier programa de una manera fácil y corta comparado con su homólogo en lenguaje Assembler. C no es considerado un lenguaje de muy alto nivel, más bien un lenguaje pequeño y sencillo el cual no se encuentra especializado en ningún tipo de aplicación en particular, lo cual hace de C un lenguaje de programación muy potente a la hora de ser utilizado, rodeado de un campo de aplicación ilimitado brindándole al usuario no solo una gama ilimitada de posibilidades de uso en diferentes aplicaciones, sino que tambien se encuentra al alcance de cualquier programador que desee aprenderlo en muy poco tiempo. Una de las ventajas que presenta el lenguaje C, es que trabaja con diferentes tipos de datos que son directamente manejables por el hardware del Microcontrolador, como son los caracteres, números y ALFAOMEGA - FREESCALE
direcciones. Esto permite que el código resultante generado por el programador sea muy eficiente y con ello una mayor estabilidad en el momento de su ejecución, considerándose lo anterior como el punto clave que le ha dado al lenguaje C el éxito que ha tenido como lenguaje de desarrollo de sistemas. En general se podría decir que C es un lenguaje de programación con una connotación medio-bajo nivel, el cual le permitirá al programador la opción de acceder al hardware del Microcontrolador mediante el uso de un modelo de programación estructurada, de manera que se puede hacer uso eficiente de los recursos con los que cuenta el Microcontrolador con un mínimo de instrucciones . Un programa en C, consta de varias secciones en donde se determinarán que variables y funciones tendrá el programa, así como la tarea que tendrá que realizar. Su estructura está determinada por las partes siguientes: Instrucciones para el compilador Definición de estructuras Definición de variables Funciones Programa principal Cuando se trata de crear programas para Microcontroladores Motorota-Freescale, tanto el Compilador como el Editor se encuentran incluidos en la herramienta de desarrollo propia de ésta familia conocida como “CODEWARRIOR” La programación no siempre es una tarea fácil de hacer, algunas veces esta llena de frustaciones, tristezas y estres, pero tambien esta llena de alegrias y recompensas y tambien de un sentido de orgullo por haberlo logrado. A continuación se muestra una metodologia que puede ayudar para evitar las frustaciones esta metodologia esta basada en 7 pasos: 1. Definir o redefinir el problema. 2. Diseñar el programa. 3. Escribir el Código. 4. Compilar el código. 5. Pruebas y Depuración. 6. Documentación. 7. Modificar y Mantener.
Capítulo
14
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q OBJETIVO DEL CAPÍTULO Conocer las principales características de la nueva familia de microcontroladores Motorola-Freescale S08, familia que promete ser muy superior frente a sus antecesores y frente a sus competidores no sólo por los beneficios ya conocidos, como costo y estabilidad, sino también por la inclusión de módulos especializados, permitiéndole al estudiante desarrollar aplicaciones tan complejas como lo desee y con la facilidad que ningún otro microcontrolador podrá permitirle.
CONOCIMIENTOS PREVIOS Para iniciar el estudio del presente capítulo es necesario que el lector posea claramente los conceptos vistos hasta el momento para el uso, configuración y programación de la familia de micrcontroladores HC08 con el fin de lograr comprender fácilmente los módulos y actualizaciones incluidas en las últimas familias de microcontroladores Motorola-Freescale tales como la familia S08.
14.1 INTRODUCCIÓN Uno de los factores que rigen el desarrollo tecnológico y la aparición diaria de nuevos y sorprendentes dispositivos de lógica programable es la competencia por posicionarse en el atractivo mercado de la electrónica, la cual se intensifica cada día más, obligando a los fabricantes a ofrecer soluciones que satisfagan una serie de requerimientos de los usuarios, entre los que se encuentran la funcionalidad, el tamaño, el costo, el consumo de potencia y la facilidad de uso. Con el fin de dar solución a las necesidades diarias de los desarrolladores y a las exigencias del campo electrónico, Freescale Semiconductor introdujo recientemente al mercado su nueva familia S08QG de MCUs bits, familia que integra en un solo chip una gran cantidad de módulos con características especiales que harán de este microcontrolador un poderoso aliado a la hora de implementar aplicaciones de alta envergadura, satisfaciendo con excelente resultado las exigencias fundamentales de los nuevos diseños tecnológicos como son: bajo consumo de potencia, tamaño reducido y un costo inferior a un dólar.
250
JUAN CARLOS VESGA FERREIRA
Los microcontroladores MC9S08QG8/QG4 ofrecen una estupenda combinación de funcionalidad y tamaño reducido y muy bajo costo, en donde los desarrolladores de aplicaciones electrónicas ya disponen de microcontroladores de 8 bits que brindan una atractiva combinación de alternativas para las cuales sólo la imaginación será su limitante. Entre las novedades que presenta esta familia frente a otras se pueden mencionar: 8 canales con conversión analógica/digital, basados en un conversor analógico-digital (ADC) mejorado, de 10 bits de alta resolución y velocidad de conversión elevada, brindando un mínimo consumo de potencia. Debido a la gran integración que presenta esta familia especial de microcontroladores, permite a los diseñadores conectar fácilmente entradas analógicas utilizando la mínima cantidad de circuitería externa posible. Incluye adicionalmente tres módulos especiales de comunicaciones como son: un módulo de interfaz para comunicaciones en serie (SCI), un módulo para periféricos en serie (SPI) y otro módulo para conexión de dispositivos con comunicación I2C, permitiendo expandir su conexión con toda una gama de dispositivos especiales como, por ejemplo: memorias, relojes de tiempo real, conversores A/D, transceivers, entre otros dispositivos que no sólo facilitarán el diseño de aplicaciones especializadas sino que además garantizarán que los desarrolladores vean en esta familia de microcontroladores la solución a todos sus problemas. Una de las principales características que ofrece esta familia de microcontroladores consiste en una mayor flexibilidad de temporización a nivel de software gracias al módulo temporizador (MTIM) de 8 bits, así como funciones de control del movimiento con el módulo (Timer/PWM o TPM) de dos canales. La integración presente en el 9S08QG8/QG4 ofrece además distintas fuentes de reloj. Una fuente de reloj interna (internal clock source o ICS) modular, la cual es un generador de reloj interno de gran exactitud y bajo consumo de potencia, que evita tener que instalar un oscilador o cristal de cuarzo, que hasta ahora era un requerimiento especial de funcionamiento para cualquier microcontrolador existente; complementándose con el hecho de que estos microcontroladores pueden soportar entradas externas de reloj desde 32 kHz hasta 20 MHz.
14.2
CARACTERÍSTICAS DE LOS MICROCONTROLADORES MC9S08QG8/QG4
Basados en el chip HCS08 Funcionan hasta 20 MHz (bus a 10 MHz) a tensiones superiores de 2,1 V, con ciclo de instrucción mínimo de 100 ns y a una frecuencia de 16 MHz (bus a 8 MHz) a tensiones de alimentación inferiores a 2,1 V. Memoria flash reprogramable de 8 K y 4 K Módulos de comunicación en serie síncronos y asíncronos (SPI, IIC, SCI) Integración de un convertidor analógico a digital de 8 canales y 10 bits de resolución que incluye un sensor de temperatura. Módulo de comparación analógico (ACMP). Módulo temporizador/de gestión del consumo (TPM) de 2 canales. Módulo temporizador (MTIM) de 8 bits. Módulo interruptor de teclado (keyboard interrupt, KBI) de 8 pines con polaridad seleccionable por software en modos flanco o flanco/igual. Módulo fuente de reloj interno (internal clock source, ICS) con un bucle sincronizado en frecuencia (frequency-locked loop o FLL). Oscilador externo que soporta fuentes de reloj externas. Funciones de protección del sistema como detección de baja tensión (LVD), control de encendido en el momento de reiniciar (POR) y contador COP con oscilador independiente. Sistema de depuración no intensivo con emulación en el chip y en el circuito (ICE) con captura de buses en tiempo real. ALFAOMEGA - FREESCALE
251
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
Los microcontroladores de 8 bits continúan siendo una opción atractiva para una amplia gama de aplicaciones, brindando soluciones en campos específicos como, por ejemplo: electrodomésticos, Dimmers o controles de iluminación, controles industriales, sistemas de seguridad, domótica y sistemas de comunicaciones, en especial las comunicaciones inalámbricas. La tendencia de hoy en día de los diseñadores de aplicaciones electrónicas consiste en disponer de una amplia variedad de dispositivos que brinden integración de soluciones a un bajo consumo de potencia y a precios al alcance de cualquier usuario, en donde la familia S08QG no solamente las satisface, sino que además ofrece niveles de integración, innovación y funcionalidad, a un precio extremadamente bajo para toda la versatilidad de soluciones que brinda; limitándose las nuevas aplicaciones no por el costo o el tamaño sino por la imaginación del diseñador. La familia HCS08 fue introducida por Freescale (entonces Motorola) en el año 2003; una de sus principales ventajas ha sido su funcionamiento con un voltaje de alimentación de 1.8 V, familia de la cual hace parte esta nueva referencia de microcontroladores, conformada por los dispositivos 9S08QG8 y QG4; microcontroladores basados en un núcleo HCS08, en donde la principal diferencia radica en la cantidad de memoria disponible, mientras que el QG4 integra 4KB de Flash y 256 bytes de RAM, el QG8 ofrece 8KB de memoria Flash y 512 bytes de RAM.
Dispositivo Caracteristicas
MC9S08Q G8
PAQUETE
16 PINES
8 PINES
MC9S08Q G4 16 PINES
8 PINES
FLASH
8K
4K
RAM
512
256
XOSC
SI
ICS
SI
SI
ACMP ADC
NO
SI
SI 8 CANALES
DBG
NO SI
4 CANALES SI
8 CANALES
4 CANALES
SI
NO
IIC
SI
SI
IRQ
SI
SI
KBI
8 PINES
MTIM
4 PINES
8 PINES
SI
4 PINES SI
SCI
SI
NO
SI
NO
SPI
SI
NO
SI
NO
TPM
2 CANALES
1 CANAL
2 CANALES
1 CANAL
PINES I/O
12
4
12
4
TIPOS DE PAQUETES
16 PDIP 16 QFN 16 TSSOP
8 DFN 8 SOIC
16 QFN 16 TSSOP
8 DFN 8 SOIC 8 PDIP
CUADRO 14.1 Resumen de las características de la familia MC9S08QG8/4. ALFAOMEGA - FREESCALE
252
JUAN CARLOS VESGA FERREIRA
La variedad no sólo se encuentra entre los recursos propios de esta familia, sino que además la acompaña toda una serie de herramientas de desarrollo facilitándole al usuario el desarrollo de sus aplicaciones. Adicionalmente, los dispositivos QG8/QG4 incluyen un sistema de depuración y un sistema de emulación on-chip in-circuit (ICE), con un bus de captura de datos en tiempo real, lo que permite disminuir los costos de herramientas de depuración. Esta poderosa familia, debido a la recursividad que ofrece, no sólo ha sido aceptada dentro del mundo del desarrollo de aplicaciones electrónicas sino que además promete convertirse en una de las herramientas de desarrollo más poderosas que se encuentren en el mercado, degustando a los diseñadores no sólo por su portafolio de recursos internos sino por satisfacer las necesidades principales de cualquier diseñador, como son: el bajo costo, bajo consumo de potencia, innovación tecnológica e integrabilidad con otros sistemas electrónicos disponibles en el mercado actualmente.
BKGD/MS
HCS08 CORE
IRQ
MÓDULO DEPURADOR (DBG)
RTI
COP
IRQ
LVD
MÓDULO I2C MÓDULO DE TECLADO (KBI) DE 8 BITS
FLASH (MC908QG8 = 8192 BYTES) RAM (MC908QG8 = 512 BYTES) (MC908QG4 = 4096 BYTES) RELOJ INTERNO 16 MHz (ICS) OSCILADOR BAJO CONSUMO 31.25 kHz to 38.4 kHz 1 MHz to 16 MHz (XOSC) VSS VDD
REGULADOR DE VOLTAJE VDDA
TCLK
MÓDULO TIMER (MTIM) 8 BITS
MÓDULO COMPARADOR (ACMP) CONVERSOR A/D 10 BITS TIMER/PWM 16 BITS MÓDULO (TPM) SERIAL PERIFÉRICA MÓDULO (SPI) COMUNIC. SERIALES MÓDULO (SCI)
PTA5//IRQ/TCLK/RESET PTA4//ACMPO/BKGD/MS
SCL SDA
PTA3//KBIP3/SCL/ADP3 PORT A
SISTEMA DE CONTROL SO8 INTERRUPCIONES Y RESET MODOS DE OPERACIÓN MANEJO DE POTENCIA
4 4
PTA2//KBIP2/SDA/ADP2
ACMP0 ACMPACMP+ 4
PTA1/KBIP1/ADP1/ACMP_ PTA0/KBIP0/TPMCH0/ADP0/ACMP+ PTB7/SCL/EXTAL PTB6/SDA/XTAL
4 TPMCH0 TPMCH5 SS MISO MOSI SPSCK RxD TxD
PORT B
BDC
CPU
PTB5/TPMCH1/SS PTB4/MISO PTB3/KBIP7/MOSI/ADP7 PTB2/KBIP6/SPSCK/ADP6 PTB1/KBIP5/TxD/ADP5 PTB0/KBIP4/RxD/ADP4
EXTAL XTAL
VSSA VREFH VREFL
FIGURA 14.1
Esquema interno de la familia MC9S08QG8/4. ALFAOMEGA - FREESCALE
253
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
PTA5/IRQ/TCLK/RESERT
1
16
PTA0/KBIPO/TPMCH0/ADPO/ACMP+
PTA4/ACMPO/BKGD/MS
2
15
PTA1/KBIP1/ADP1/ACMP-
VDD
3
14
PTA2/KBIP2/SDA/ADP2
VSS
4
13
PTA3/KBIP3/SCL/ADP3
PTB7/SCL/EXTAL
5
12
PTB0/KBIP4/RxD/ADP4
PTB6/SDA/XTAL
6
11
PTB1/KBIP5/TxD/ADP5
PTB5/TPMCH1/SS
7
10
PTB2/KBIP6/SPSCK/ADP6
8
9
PTB3/KBIP7/MOSI/ADP7
PTB4/MISO
PTB5/IRQ/TCLK/RESET
1
8
PTB0KBIPO/TPMCH0/ADPO/ACMP+
PTB4/ACMPO/BKGD/MS
2
7
PTA1/KBIP1/ADP1/ACMP-
VDD
3
6
PTA1/KBIP2/SDA/ADP2
VSS
4
5
PTA3/KBIP3/SDL/ADP3
FIGURA 14.2 Distribución de pines de la familia MC9S08QG8/4, respectivamente.
Hasta el momento se ha estudiado cada uno de los módulos que hacen parte de la familia HC08; sin embargo, la nueva familia de microcontroladores S08 promete ser una familia muy superior y muy completa frente a sus antecesores y frente a sus competidores no sólo por los beneficios ya conocidos, como costo y estabilidad, sino también por la inclusión de módulos tan importantes y necesarios en la gran mayoría de aplicaciones actuales como módulos de comunicaciones especializadas, módulo de comparación, módulo de conversión A/D mejorado, entre otras que harán de este microcontrolador una herramienta poderosa a la hora de implementar cualquier aplicación de índole electrónica que lo requiera. A continuación se hace una explicación introductoria de las nuevas bondades ofrecidas por esta familia de microcontroladores Motorola-Freescale, como complemento a las expuestas hasta el momento por la familia HC08.
ALFAOMEGA - FREESCALE
254
JUAN CARLOS VESGA FERREIRA
Modos de direccionamiento Al programar en un lenguaje de alto nivel como C utilizamos variables para manejar los datos sin preocuparnos mucho de su ubicación o de la forma de accederlos. Estas variables se encuentran almacenadas en localidades de memoria y existen diversos caminos para llegar ellas. Por ejemplo, es distinta la forma de leer de un arreglo, de una variable local, una global, una tabla de constantes, etc. Es tarea del compilador elegir el camino más eficiente para llegar a los datos. A continuación se presentan los modos de direccionamiento disponibles en el CPU de la familia HCS08.
Inherente Existen instrucciones que contienen en ellas mismas la información de los operandos que requieren. Éstas normalmente involucran registros del CPU, de modo que no es necesario leer datos de una dirección de memoria para ejecutarlas. Existen también instrucciones que sí realizan accesos a memoria, pero el programador no necesita especificar la dirección, esto sucede en operaciones que involucran al stack. De manera general, se considera direccionamiento inherente siempre que el programador no requiera proveer de ningún parámetro a la instrucción.
Relativo Al realizar un salto en el programa debe modificarse el valor del PC para apuntar a la instrucción correspondiente. Esto se hace sumándole un valor proporcionado por el programador, que debe ser la diferencia entre la localidad a la que apunta el PC antes de realizar el salto y la localidad de la primera instrucción a ejecutar posterior a éste. Se le llama direccionamiento relativo ya que la dirección resultante es relativa a la original.
Inmediato En muchas ocasiones, al inicializar una variable o realizar una comparación, por ejemplo, se utiliza un valor numérico constante. En este caso, el valor se provee inmediatamente al CPU y éste no necesita calcular ninguna dirección extra para leerlo.
Directo Este modo de direccionamiento se emplea para acceder a las localidades de la $0000 a la $00FF. Debido a que la parte alta de la dirección siempre es igual a $00, sólo es necesario especificar la parte baja para que el CPU pueda accederla. Esto tiene la ventaja de ahorrar un byte de memoria de programa (el de la parte alta), además de que la instrucción se ejecuta más rápido debido a que no requiere realizar esta lectura.
Extendido En el modo extendido se proveen los dos bytes requeridos de la dirección del operando. Con esto se puede acceder a todo el mapa de memoria.
Indexado En este modo de direccionamiento se utiliza un registro como apuntador, ya sea H:X o SP, de modo que la dirección de memoria a la que se desea tener acceso debe estar contenida en este registro. Existen diversas variantes que hacen de éste un modo de direccionamiento muy flexible y poderoso. ALFAOMEGA - FREESCALE
255
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
Indexado sin offset. El valor de H:X se utiliza como dirección. Indexado sin offset con postincremento. Se utiliza el valor de H:X como dirección y se incrementa en uno al terminar la ejecución. Indexado con offset de 8 bits. En la instrucción se provee un valor de 8 bits que será sumado al del registro H:X para generar la dirección a manipular. Indexado con offset de 8 bits y postincremento. Esta variante es una combinación de las dos anteriores, calculando la dirección con la suma de H:X y el valor provisto por el programador, y posteriormente incrementando en uno el valor de H:X. Indexado con offset de 16 bits. En esta variante el valor sumado es de 16 bits, con lo que se puede direccionar toda la memoria del componente. Relativo al SP con offset de 8 bits. Mismo caso que la tercera variante, pero ahora se utiliza el registro SP como apuntador. Relativo al SP con offset de 16 bits. Estos modos de direccionamiento son especialmente útiles para el manejo de arreglos y tablas de datos. En ninguno de los casos en que se maneja un offset se altera el valor original del apuntador. Esto sólo sucede si se realiza un postincremento.
PUERTOS DE ENTRADA Y SALIDA DE PROPÓSITO GENERAL De los nombres de pines Los pines de los microcontroladores usualmente tienen asociadas mas de una función, por lo que se puede observar en la hoja de especificación nombres como PTA0/TX/TPMCH0, lo que, por ejemplo, indica que el pin puede tener alguna de las tres funciones PTA0= puerto de entrada-salida de propósito general, Tx = pin de transmisión del puerto de comunicación serie, TPMCH0= pin del canal 0 del timer.
Qué es un puerto de entrada El puerto de entrada de un microcontrolador es el medio por el cual podemos leer estímulos externos digitales, es decir, variables que pueden tomar dos valores como alto-bajo, uno-cero, falso-verdadero, como, por ejemplo, si un botón es presionado, o en qué posición se encuentra un interruptor (encendido o apagado), o recibir cualquier otra señal digital en el rango permitido por el microcontrolador y determinar si su valor es uno o cero lógico. Esta señal de entrada digital físicamente esta conectada a los pines del microcontrolador y puede recibir una señal eléctrica que varía en voltaje; para el caso del MC9S08QG8 alimentado a 3.3V tenemos que: Una señal baja o cero lógico se considera como cualquier señal de voltaje menor a 0.3Vdd Vcero <= 0.9V Una señal alta o uno lógico se considera como cualquier señal de voltaje mayor a 0.7Vdd Vuno >= 2.3V
ALFAOMEGA - FREESCALE
256
JUAN CARLOS VESGA FERREIRA
Resistencias de sostenimiento (pull-up) Las resistencias de sostenimiento en alto denominadas (en inglés) como resistencias pull-up son conectadas a los pines de entrada del microcontrolador para asegurar que el valor leído por el puerto sea 1 lógico cuando no es aplicada ninguna señal externa; por ejemplo, en la figura siguiente el botón está conectado a 0V o tierra. Si el botón no es presionado, el microcontrolador lee 1 lógico (3.3 V), y cuando el botón es presionado el microcontrolador lee 0 lógico (0 V); este circuito es tan común que la mayoría de los microcontroladores actuales cuentan actualmente con resistencias de pull-up internas que pueden ser habilitadas por el usuario.
Vdd = 3.3 V
Habitacion de la resistencia de pull-up
Resistencia de pull-up Entrada micro
Tierra = GND = 0 V
FIGURA 14.3
Esquema equivalente Resistencias de Pull-up.
NOTA Es importante hacer notar que los voltajes que se aplican a la entrada deben estar en el rango establecido en la hoja de datos del fabricante, ya que en caso de exceder esto valores el microcontrolador resultará dañado.
Los voltajes permitidos para el microcontrolador MC9S08QG8 son de voltajes permitidos en las entradas digitales de -0,3 V a Vdd+0.3.
Qué es un puerto de salida El puerto de salida de un microcontrolador es capaz de proporcionar una salida digital de voltaje, es decir puede tomar dos valores alto-bajo, cero-uno. Físicamente el microcontrolador es capaz de entregar voltaje pero limitado en corriente, por ejemplo una salida digital con valor de uno. ALFAOMEGA - FREESCALE
257
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
Vsalida_uno ≥ Vdd-0.5 ≥ 2.8 con una corriente máxima de 10mA Y el voltaje de salida cuando es cero es: Vsalida_cero ≤ 0.5 con una corriente máxima de 10mA Por ejemplo en la figura siguiente esta conectado un LED, y para limitar la corriente que va a pasar por el circuito utilizamos una resistencia R, esto nos asegura que no excederemos la capacidad del microcontrolador.
Vdd = 3.3 V
Si I deseada = 0.01A, entonces tenemos R = (Vs - Vd)/I = (3.3 - 1.2)/0.01 = 210 Valor comercial = 220
FIGURA 14.4 NOTA
Salida de microcontrolador
Vs = 3.3 V
I = (Vs - Vd) /R I = (Vs - Vd) /R R
I Vd ≈ 1.2 V
Esquema de conexión pin de salida
Aunque cada uno de los pines puede entregar como máximo hasta 25 mA, no es posible exceder la corriente máxima del microcontrolador que en nuestro caso es de 120 mA, por lo que siempre que se vaya a utilizar una salida hay que limitar la corriente que se va a consumir. Elautor recomienda cuidar que la corriente en cada uno de los pines no exceda de 10 mA, y estar atentos a no exceder el máximo permitido para el microcontrolador, para evitar dañarlo.
Control de los puertos de entrada y salida El control de los puertos de entrada y salida desde el punto de vista del software es realizado a través de registros de control que se encuentran en la memoria del microcontrolador, en el caso de los puertos de entrada y salida del MC9S08QG8 tenemos los registros de datos (PTAD, PTBD) y dirección PTADD y PTBDD como se observa en la siguiente tabla.
ALFAOMEGA - FREESCALE
258
JUAN CARLOS VESGA FERREIRA
Address
Register Name
Bit 7
0x0000
PTDA
0
0
PTAD5
PTAD4
PTAD3
PTAD2
PTAD1
PTAD0
0x0001
PTADD
0
0
PTADD5
PTADD4
PTADD3
PTADD2
PTADD51
PTADD0
0x0002
PTABD
PTABD7
PTABD6
PTABD5
PTABD4
PTABD3
PTABD2
PTABD1
PTABD0
0x0003
PTABDD
PTABDD4 PTABDD3
PTABDD2
PTABDD1
PTABDD0
6
5
PTABDD7 PTABDD6 PTABDD5
4
3
2
1
Bit 0
Los otros registros de control del comportamiento del puerto son los de pull-up enable (PTAPE, PTBPE), la de selección de slew rate (PTASE, PTBSE) y la de selección de fuerza para las salidas (PTADS, PTBDS). Bit 7
6
5
4
3
2
1
Bit 0
0x1840
PTAPE
0
0
PTAE5
PTAE4
PTAE3
PTAE2
PTAE1
PTAE0
0x1841
PTASE
0
0
PTASE5
PTASE4
PTASE3
PTASE2
PTASE1
PTASE0
0x1842
PTADS
0
0
PTADS5
PTADS4
PTADS3
PTADS2
PTADS1
PTADS0
0x1843
Reserved
---
---
---
---
---
---
---
---
0x1844
PTBPE
PTBPE7
PTBPE6
PTBPE5
PTBPE4
PTBPE3
PTBPE2
PTBPE1
PTBPE0
0x1845
PTBSE
PTBSE7
PTBSE6
PTBSE5
PTBSE4
PTBSE3
PTBSE2
PTBSE1
PTBSE0
0x1846
PTBDS
PTBDS7
PTBDS6
PTBDS5
PTBDS4
PTBDS3
PTBDS2
PTBDS1
PTBDS0
Descripción de los registros de control Cada uno de los pines de los puertos de entrada-salida puede ser configurado en forma independiente, por ejemplo podríamos tener 3 pines del puerto A como entradas, 5 como salidas, 1 entrada con pull-up, o dos salidas con slew-rate controlado, etc.
PTAD, PTBD Registro de datos Si el pin correspondiente es configurado como entrada, al hacer una lectura de este registro se lee el valor actual del pin. El escribir en un pin configurado como entrada no tiene ningún efecto sobre el pin. Si el pin correspondiente es configurado como salida, al hacer una escritura a este registro el puerto de salida toma el valor correspondiente. 1 = 3.3 V en la salida, 0 = 0 V en la salida. Cuando se lee un pin de salida devuelve el último valor escrito en el puerto.
PTADD, PTBDD Registro de dirección Si se escribe un valor de 1 en algunos de los bits, este bit se comportara como salida; si se escribe un 0 se comportará como entrada.
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
259
PTAPE, PTBPE Registro de habilitación de la resistencia interna de Pull-Up Si el pin correspondiente está configurado como entrada y se escribe un valor de 1 en algunos de los bits, este bit tendrá conectada una resistencia de pull-up, en caso contrario el pin estará en flotación (el circuito externo al microcontrolador deberá asegurar que existen valores permitidos para esta entrada).
PTASE, PTBSE Registro de habilitación del control de slew-rate. Si el pin correspondiente
está configurado como salida y se escribe un valor de 1 en algunos de los bits, este bit tendrá control del slew rate. Esto hace que el cambio en la salida de 1 a 0 o de 0 a 1 sea menos rápido y con esto poder controlar las emisiones de RF generadas por el microcontrolador. Para mayor información sobre esta característica, refiérase a la hoja de datos.
PTASE, PTBSE Registro de habilitación del control de slew-rate. Si el pin correspondiente
está configurado como salida y se escribe un valor de 1 en algunos de los bits, este bit tendrá control del slew rate. Esto hace que el cambio en la salida de 1 a 0 o de 0 a 1 sea menos rápido y con esto poder controlar las emisiones de RF generadas por el microcontrolador. Para mayor información sobre esta característica, refiérase a la hoja de datos.
PTADS, PTBDS Registro de control de la fuerza de salida del puerto Si el pin correspondiente está configurado como salida y se escribe un valor de 1 en algunos de los bits, este bit tendrá mayor fuerza, es decir, mayor capacidad para proporcionar corriente a la carga. Sin embargo, esto no implica que debamos respetar los límites establecidos para el microcontrolador; ver sección de puerto de salida. Para mayor información sobre esta característica, refiérase a la hoja de datos.
PROGRAMACIÓN DE LOS PUERTOS DE ENTRADA-SALIDA La configuración utilizando lenguaje C puede hacerse, en general, de dos formas, en paralelo o por bit. La programación en paralelo implica mover todos los bits del puerto al mismo tiempo, mientras que la programación orientada a bit sólo modifica cada uno de los bits del puerto en forma independiente. Por ejemplo: para habilitar el puerto B bit 7 y bit 6 como salidas en forma simultánea podemos escribir la siguiente sentencia: PTBDD = 0b11000000; /* el dato es con número binario */ O en hexadecimal; PTBDD = 0xC0; /* el dato es con número hexadecimal */ Y para poner las salidas en 1 en PTB6 y PTB7 y las demás en 0, tendremos: PTBD = 0xC0;
ALFAOMEGA - FREESCALE
260
JUAN CARLOS VESGA FERREIRA
Por otro lado, si quiero modificar el valor de salida del puerto B- bit 6, pero no quiero modificar el valor de los otros datos del puerto bits 7,5,4,3,2, y 1, se puede escribir: PTBD_PTBD6 = 1; /* pone en 1 la salida del puerto B bit6*/ PTBD_PTBD6 = 0; /* pone en 0 la salida del puerto B bit6*/ Note que en la nomenclatura de las operaciones orientadas a bit se toma el nombre del registro y luego se duplica con el número de bit a modificar, lo cual aplica para todos los registros del microcontrolador y no sólo para los puertos de entrada y salida.
TEMPORIZACIONES BÁSICAS En la vida cotidiana, al hablar de tiempo empleamos cantidades en nuestras unidades de medida: horas, minutos, segundos. En electrónica, generalmente utilizamos unidades de magnitud inferior al segundo para hablar de períodos, tiempos de respuesta, etc. De la misma manera, el microcontrolador “cuenta” el tiempo en unidades adimensionales comúnmente llamadas “ticks”, que tienen una relación numérica con nuestras unidades de medición. En su forma más básica, un timer es un contador, ascendente o descendente, que opera a una frecuencia de reloj específica. Esto quiere decir que, si se trata de un contador ascendente, la cuenta será incrementada con cada ciclo de la señal de reloj que se esté aplicando al dispositivo. De esta forma, cada cuenta del timer equivaldrá en tiempo al período de esta señal. Esto se logra mediante flip-flops divisores de frecuencia colocados en cascada, de modo que cada uno corresponde a un bit del contador.
D
Timer Clock
D
Q
Clk
Q
C0 LSB
Q
D
Q
D
Q
Q
Clk
Q
Clk
Q
C1
C2
Cn MSB
FIGURA 14.5 Arreglo de flip-flops de un contador de n bits.
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
261
Al activarse un timer, ya sea por medio de algún habilitador o por la aplicación de una señal de reloj, se inicia el incremento o decremento del valor del contador, según sea el caso. Este contador, como cualquier registro, tiene una cantidad de bits definida, por lo que el rango de valores que puede almacenar se encuentra dentro de límites conocidos. Una vez que se alcanza uno de estos limites, al transcurrir otro ciclo de la señal de reloj ocurre un desbordamiento u overflow. Este evento es el que puede utilizarse para determinar cuando ha transcurrido un período de tiempo específico, ya que es el que nos alerta el microcontrolador. De esta manera, si el contador es ascendente de 8 bits, después de FFh cuentas se realizará la transición a 00h y el microcontrolador “avisará” con una bandera que se ha producido un desbordamiento, evento que puede ser fuente de una interrupción del microcontrolador. A este modo de operación en que el timer cuenta de manera continua en todo su rango se le conoce como free running o corrida libre. Existen infinidad de aplicaciones en las que se requiere el uso de timers, y sus principales aplicaciones podrían dividirse en tres: Medición de período. En este caso se utiliza un timer para medir el tiempo transcurrido de un evento a otro, como pudiera ser el caso del procesamiento de una señal en un sistema de comunicación. Medición de frecuencia. En este caso se mide la cantidad de eventos en un tiempo determinado, aplicado por ejemplo, para medir velocidad a través de un encoder. Generación de tiempos. A diferencia de los anteriores, en este caso se utiliza el timer para generar eventos en tiempos determinados, ya sea para la inicialización de un dispositivo, la generación de algún tipo de señal o la programación de tareas en tiempos específicos. El microcontrolador QG8 cuenta con tres periféricos especializados en las operaciones relacionadas con el tiempo, cumpliendo con estas necesidades. En este capítulo estudiaremos dos de estos módulos, los más sencillos, que están más relacionados con la generación de bases de tiempo.
14.3
MÓDULO TIMER INTERFACE (MTIM)
El MTIM es un timer ascendente de 8 bits, es decir que su registro contador tiene una longitud de 8 bits y su cuenta se incrementa con cada ciclo de reloj. Este reloj puede ser una de tres señales distintas que se explicarán más adelante. Cuenta además con un registro extra que permite generar tiempos de una manera mucho más precisa, llamado “módulo”. A continuación se muestra el diagrama a bloques del MTIM; conforme se vaya avanzando en el capítulo, el lector será capaz de comprender la función de cada una de sus partes.
ALFAOMEGA - FREESCALE
262
JUAN CARLOS VESGA FERREIRA
BUSCLK XCLK TOLK
MTIM INTERRUPT RESQUEST
SYNC
CLOCK SOURCE SELECT
FRESCALE AND SELECT DIVIDE BY
CLKS
PS
TOF
8 BIT COUNTER (MTIMCNT)
TRST TSTP
8-BIT COMPARATOR
8-BIT MÓDULO (MTIMMOD)
TOIE
FIGURA 14.6 Diagrama a bloques del MTIM.
Fuentes de reloj Empezando por el primer bloque, estudiaremos ahora las fuentes de la señal de reloj disponibles para este módulo. El MTIM puede funcionar con tres señales de reloj distintas: BUSCLK. Corresponde al reloj del bus del microcontrolador. XCLK. Corresponde a un reloj interno de frecuencia fija. TCLK. Permite la aplicación de una señal externa a través del pin 1 (PTA5/IRQ/TCLK/RESET) del dispositivo. Al seleccionar esta señal, puede configurarse el flanco, positivo o negativo, en que se realizará el incremento del contador. La frecuencia del bus (BUSCLK) es configurable a través de ciertos registros del microcontrolador; sin embargo, por simplicidad utilizaremos el valor por defecto, que podemos considerar de 4 MHz. La frecuencia del XCLK corresponde a la frecuencia del oscilador interno del microcontrolador dividido entre dos o, para este caso, la frecuencia del bus dividida entre 256. Esta relación varía si se modifica la frecuencia del bus. La frecuencia de la señal de XCLK es entonces de 15.625 KHz. Para la fuente externa, la frecuencia puede encontrarse entre 0 Hz y la frecuencia del bus dividida entre 4. Esta variedad de señales permite utilizar distintas frecuencias de operación, lo que produce una mayor versatilidad del periférico, siendo capaz de generar una gama más amplia de tiempos. Hasta este momento, hemos establecido que:
cuenta =
1 fclk
Tclk
ALFAOMEGA - FREESCALE
263
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
Es decir, que una cuenta del timer equivale directamente en tiempo al período de la señal de reloj, ya que con cada ciclo se realiza una transición en el estado del primer flip-flop de la cadena que forma el contador. Sin embargo, antes de que la señal seleccionada llegue al contador pasa por una etapa de división de frecuencia, lo que permite aumentar el período de tiempo entre incrementos. Esto resulta muy útil en los casos en que los tiempos requeridos son muy grandes en comparación con el período del reloj seleccionado, y no se requiere tanta precisión en el conteo. Para entender esto, supongamos que queremos que ocurra un overflow cada 256 us, lo que equivaldría a 1 us por cuenta; recordemos que el overflow ocurre en una transición de 0xFF a 0x00. Antes que nada, debemos seleccionar la señal de reloj adecuada. En la gran mayoría de los casos se prefiere utilizar las señales generadas internamente en el microcontrolador, de modo que se ahorre circuitería externa innecesaria que sólo haría más complejo el diseño y por tanto, más costoso. Descartemos entonces la posibilidad de aplicar una señal de reloj externa y comparemos el período de cada señal interna con el período deseado para determinar cuál es la más adecuada:
TBUSCLK =
1
4MHZ
0.25
TXCLK =
s
1 = 64 s 15. 625 KHz
Fácilmente se puede notar que el XCLK no es una opción para este caso, ya que excede por mucho el período requerido y transcurrirían los 256 us deseados en tan sólo 4 cuentas. Para el reloj del bus, en cambio, se puede notar que se requerirían más de 1000 cuentas para alcanzar este valor, cosa que no es posible ya que el contador sólo cuenta con 8 bits. El problema se soluciona si hacemos que el período del BUSCLK sea 4 veces más grande, es decir, si dividimos su frecuencia entre 4. De esta manera el período de la señal que llega al contador es de 1 us. A continuación se muestra un diagrama de tiempos que muestra este funcionamiento.
selected clock source MTIM clock (PS=%0010)
MTIMCNT
0xA7
0xA8
0xA9
0xAA
FIGURA 14.7 Diagrama de tiempos con un prescaler de 4. Este divisor se conoce como prescaler, o preescalador, ya que “escala” la frecuencia de la señal original a una más acorde a nuestra aplicación antes de que ésta llegue al contador. La configuración de este prescaler, así como de la fuente de reloj, se realiza en el registro MTIMCLK. ALFAOMEGA - FREESCALE
264
JUAN CARLOS VESGA FERREIRA
R w Reset
7
6
0
0
0
0
5
4
3
2
1
0
0
0
PS
CLKS 0
0
0
0
FIGURA 14.8 Registro de configuración del reloj. Los bits 4 y 5 se utilizan para configurar la fuente del reloj del timer, mientras que los bits del 0 al 3 determinan el factor de división de esta señal. Sus posibles valores se ilustran en las tablas siguientes.
CLKS
Señal de reloj
00
BUSCLK
01
XCLK
10
TCLK – flanco de bajada
11
TCLK – flanco de subida
TABLA 14.2 Valores de configuración de la señal de reloj.
Prescaler
Divisor
0000
÷1
0001
÷2
0010
÷4
0011
÷8
0100
÷16
0101
÷32
0110
÷64
0111
÷128
1xxx
÷256
TABLA 14.3 Combinaciones del prescaler. ALFAOMEGA - FREESCALE
265
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
Control del timer Tenemos ya elementos para utilizar el MTIM en su forma más básica. Ahora debemos conocer cómo se controla su funcionamiento, cómo se habilita, cómo es que podemos saber cuándo se ha producido un overflow. Todo esto se encuentra reunido en un solo registro que nos reporta el estado y nos permite controlar el MTIM. Este registro se llama MTIMSC, por MTIM Status and Control Register.
7 R w Reset
TOF 0
6 TOIE 0
5 0 TRST 0
4 TSTP 1
3
2
1
0
0
0
0
0
0
0
0
0
FIGURA 14.9 Registro de estatus y control del MTIM. Como ya se mencionó anteriormente, una vez que el contador pasa de FFh a 00h, es decir, ocurre un overflow, el microcontrolador activa una bandera que nos permite conocer que el evento ha ocurrido. Esta bandera es el bit TOF (Timer Overflow Flag) de este registro, y permanece en 1 después de un overflow hasta que se realiza una serie de pasos para regresarla a su estado inicial. Como puede observarse en la figura 14.9, este bit es de sólo lectura, de manera que no nos es posible modificarlo; sólo el hardware del MTIM puede colocarlo en 1. Esto evita que un error en la programación afecte esta bandera y produzca un comportamiento no deseado. Para regresar la bandera al estado de 0 se debe leer primero todo el registro MTIMSC y posteriormente escribir un 0 en este bit, lo que activa ciertos procesos internos que modifican el estado de la bandera; hay que recordar que es de sólo lectura. Mediante el bit TSTP es posible detener o activar el timer en cualquier momento, de la misma manera que el botón de un cronómetro. Un 1 en este bit detiene el incremento del contador y un 0 lo activa. Como puede observarse en la figura 4.5, el timer siempre está detenido después de un reset del microcontrolador. El bit TRST es de sólo escritura y su función es colocar en 00h el valor del contador del timer. Al escribir un 1 en este bit el contador se resetea y continúa su funcionamiento normal; un 0 no tiene ningún efecto y siempre que sea leído se obtendrá un 0 como estado. Podemos ahora realizar el ejemplo anterior en el microcontrolador. Antes que nada, debemos configurar la señal de reloj deseada, que determinamos sería la señal de BUSCLK dividida entre 4. En las tablas 14.1 y 14.2 se encuentran estos valores, que deben ser escritos en el registro MTIMCLK. Una vez hecho esto, se puede iniciar el funcionamiento del timer y esperar a que la bandera de overflow sea activada. El código para realizar esto se muestra a continuación. /* Programa de ejemplo de uso básico del MTIM */ #include #include
ALFAOMEGA - FREESCALE
266
JUAN CARLOS VESGA FERREIRA
void main(void) { MTIM_Init();
//Función de inicialización del MTIM
MTIMSC_TSTP = 0;
//Se empieza a incrementar el contador
for(;;){ if(MTIM_TOF == 1)
//Si ha ocurrido un overflow…
{ (void)MTIMSC;
//Proceso para limpiar TOF
MTIMSC_TOF = 0; } __RESET_WATCHDOG();
//Reinicia el watchdog
} } void MTIM_Init(void) { MTIMCLK = 0x02;
/* CLKS = 00 – Selecciona el BUSCLK como señal de reloj para el contador. PS = 0010 – Divide la frecuencia del reloj entre 4.
*/ } /* Fin del programa de ejemplo */
Modos de operación En el ejemplo anterior se trabajó con el timer en el modo conocido como “corrida libre”. En este caso, el contador se incrementa libremente mientras se le aplique una señal de reloj, desbordándose después del valor 0xFF y reiniciando en 0x00. Pero, ¿qué sucede si ahora tenemos un dispositivo que envía datos al puerto B del microcontrolador cada 100 us? Es necesario contar este tiempo de manera precisa, ya que si es considerablemente menor puede que se haga una doble lectura del mismo dato, o si es mayor, puede que se pierda un dato. Resulta evidente que esto no sería posible con los procedimientos utilizados hasta este momento. Es por esto por lo que el MTIM cuenta con dos modos de operación: Corrida libre. El contador opera en todo su rango y se produce un overflow al pasar de FFh a 00h. Módulo. Se establece un límite superior del contador diferente de FFh y se produce un overflow después de un valor determinado por el programador. En el diagrama a bloques mostrado en la figura 14.10, a la derecha se encuentran tres elementos: el contador del timer (MTIMCNT), un registro llamado Módulo (MTIMMOD) y comparador en el que ambos convergen. Analicemos primero el registro del contador. ALFAOMEGA - FREESCALE
267
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
R w Reset
FIGURA 14.10 Registro contador MTIMCNT.
El contador del timer es de 8 bits, como ya se había mencionado anteriormente. Además, es un registro de sólo lectura, ya que sólo el hardware del timer puede modificar su valor. Esto representa, de nuevo, la ventaja de protección contra errores en la programación. Revisemos ahora el registro del módulo.
7
6
5
4
R w Reset
3
2
1
0
0
0
0
0
MOD 0
0
0
0
FIGURA 14.11 Registro de módulo.
Este registro es de la misma longitud del contador y sirve para establecer el valor máximo que podrá tomar el contador al irse incrementando su cuenta. Como se observa en el diagrama a bloques, estos dos registros se cargan a un comparador, de modo que constantemente se prueba por hardware si ambos valores son iguales. En el momento en que llegan a serlo, el contador se resetea a 00h y se produce un evento de overflow. Hay que notar que realmente no ocurre desbordamiento alguno, ya que cualquier valor que se establezca será siempre posible contenerlo en los 8 bits del contador; sin embargo, dado que el efecto producido al alcanzar este valor es el mismo que cuando ocurre un desbordamiento del contador (incremento después de FFh), se utiliza el mismo termino para nombrar el evento. De esta manera, basta con escribir un valor en el registro MTIMMOD para que se produzca un overflow cuando el valor del contador sea igual a éste. Así, si se desea que ocurra un overflow cada 50 us utilizando el BUSCLK como fuente de reloj, se escribiría en el MTIMMOD un valor de 200d o CBh. Esto ya que:
cuenta =
ALFAOMEGA - FREESCALE
1 1 = = 0.25 s fBUSCLK 4MHZ
1 50 s MTIMMOD = cuenta = = 200 50 s
268
JUAN CARLOS VESGA FERREIRA
Una vez entendido esto, pudiera decirse que el modo de corrida libre es un caso especial de este modo de operación. Estrictamente, un overflow en un número de 8 bits ocurre cuando el valor se incrementa más allá de su límite, en este caso FFh, pues se requieren más bits para representar el resultado. Sin embargo, en el caso del timer, el evento de overflow se da cuando el valor del contador iguala al valor del módulo, de manera que el modo de corrida libre se obtiene cuando el módulo tiene un valor de 00h.
toverflow =
2PS ! MTIMMOD fCLK
Interrupción En el caso mencionado anteriormente en el que un dispositivo manda datos al microcontrolador a determinada frecuencia, se habló de la importancia de generar tiempos con gran exactitud. En el código presentado en las páginas anteriores se utiliza la técnica de polling (encuesta) en que se verifica cada cierto tiempo el estado de la bandera de overflow, pero esto puede representar un problema cuando el microcontrolador tiene una carga elevada de procesos, de modo que puede pasar mucho tiempo antes de que se verifique nuevamente el estado de la bandera. Para evitar este retraso, que pudiera tener efectos nocivos en la aplicación, se puede habilitar al timer para generar una interrupción al ocurrir un evento de overflow. De esta manera, el proceso activo puede ser interrumpido para atender al evento en el tiempo exacto, evitando así retrasos no deseados y pérdida de datos en nuestro caso. El habilitador de interrupción es el bit TOIE del registro MTIMSC (figura 14.9). Al colocar este bit en 1 se habilita la generación de una interrupción siempre que la bandera de overflow (TOF) se encuentre en 1. El proceso para limpiar la bandera debe ser llevado a cabo dentro de la rutina de interrupción, y es muy importante hacerlo, ya que si la bandera permanece activa al salir de la interrupción, el microcontrolador produce inmediatamente la interrupción de nuevo, lo que genera un ciclo infinito en el programa. El vector correspondiente al MTIM es el 12, que puede ser consultado en la tabla de vectores del componente. Podemos entonces escribir el código para la solución del problema: recibir datos por el puerto B del microcontrolador cada 100 us. Además, se desea que se haga un promedio cada 8 muestras y que este valor se guarde en una variable global para su posterior uso. /* Programa de ejemplo de uso del módulo e interrupción del MTIM */ #include #include unsigned char ucAvg;
//Variable en que se guardará el promedio
void main(void) { MTIM_Init();
//Función de inicialización del MTIM
ALFAOMEGA - FREESCALE
269
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
MTIMSC_TSTP = 0;
//Se activa el timer
for(;;){ __RESET_WATCHDOG();
//Reinicia el watchdog
} } void MTIM_Init(void) { MTIMCLK = 0x02;
/* CLKS = 00 – Selecciona el BUSCLK como señal de reloj para el contador. PS = 0010 – Divide la frecuencia del reloj entre 4.
*/ MTIMMOD = 100;
// 100 cuentas para un overflow
} interrupt 12 void MTIM_Isr(void) { static unsigned int uiDatos = 0;
//Acumulará los datos recibidos
static unsigned char ucCont = 0;
//Contador de datos
(void)MTIMSC;
//Proceso para limpiar TOF
MTIMSC_TOF = 0; uiDatos += PTB;
//Suma el dato actual a los anteriores
ucCont++; if(ucCont == 8) { ucAvg = uiDatos>>3; ucCont = 0; uiDatos = 0; } } /* Fin del programa de ejemplo */
ALFAOMEGA - FREESCALE
//Divide uiDatos entre 8 para sacar el promedio
270
JUAN CARLOS VESGA FERREIRA
14.4
REAL TIME INTERRUPT (RTI)
El módulo de RTI es aún más sencillo que el MTIM para el manejo de tiempos. No cuenta con un registro contador, mucho menos con el registro de módulo, y sus fuentes de reloj son más limitadas. Su función principal es generar interrupciones de manera periódica, siendo posible seleccionar sólo una cantidad limitada de períodos. Como fuentes de reloj tenemos sólo dos opciones: un reloj interno a 1 KHz, que es el seleccionado después de un reset del microcontrolador. Tenemos también la posibilidad de utilizar un oscilador externo, en caso de que el componente esté funcionando con uno. Esto se configura con el bit RTICLKS en el registro de estatus y control de la interrupción en tiempo real del sistema (SRTISC). Un 0 corresponde al reloj interno de 1 KHz y un 1 al oscilador externo.
R w Reset
7
6
RTIF
0 RTIACK
0
0
5
4
RTICLKS
RTIE
0
1
3
2
1
0 0
0
RTIS 0
0
0
FIGURA 14.12 Registro de estatus y control de la RTI (SRTISC). Una vez configurada la fuente de reloj, se configura el período al que se desea que ocurra la interrupción. Esto en el campo de RTIS, que cumple una función similar al prescaler del MTIM. En la tabla siguiente se muestran todos los posibles valores de este campo y los períodos a los que corresponden.
RTIS2:RTIS1:RTIS0
Using internal 1-KHz Clock source1 2
Using External Clock Source Period = text3
0:0:0
Disable RTI
Disable RTI
0:0:0
8 ms
text X 256
0:0:0
32 ms
text X 1024
0:0:0
64 ms
text X 2048
0:0:0
128 ms
text X 4096
0:0:0
256 ms
text X 8192
0:0:0
512 ms
text X 16384
TABLA 14.4 Configuración del período de concurrencia de la interrupción en el Campo RTIS. ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
271
Se puede notar que el valor tiene un efecto diferente si se utiliza la señal interna que si se utiliza la externa. El multiplicador es 32 veces mayor para la señal externa que para la interna. También hay que observar que, a diferencia del MTIM que contaba con el bit TSTP para activar o detener el contador, la RTI empieza su “conteo” inmediatamente después de la selección de un período, y para desactivarla hay que escribir el valor 0 en todo el campo de RTIS. Como en el MTIM, tenemos también un bit que nos alerta de que se ha cumplido el tiempo deseado; este bit es el RTIF. El proceso para limpiar esta bandera es más simple que en el MTIM, basta con escribir un 1 en el bit RTIACK para que la bandera vuelva a su estado 0. Escribir un 0 no tiene ningún efecto y al leer siempre se obtendrá un 0, un funcionamiento similar al TRST del MTIM. Tenemos también un bit que habilita la generación de una interrupción cuando el tiempo configurado ha transcurrido, el RTIE. Dado que en este caso no se cuenta con un contador, no existe la opción de resetear la RTI.
TEMPORIZACIÓN AVANZADA Aparte de los módulos de tiempo explicados en capítulos anteriores, existen otros dispositivos que pueden ser usados no sólo para generar bases de tiempo sino también para capturar eventos generados sobre pines específicos proveídos con esa funcionalidad o como moduladores de ancho de pulso. A este módulo se le conoce como módulo de canales de tiempo (TPM). De microcontrolador a microcontrolador podemos encontrar diferencias en la cantidad de módulos y la cantidad de canales por módulo disponibles. Existen microcontroladores que tienen un solo módulo y 2 o más canales, en cuyo caso cada uno de los canales puede ser configurado de forma independiente; sin embargo, todos ellos funcionan con base en un solo contador, el contador del módulo. Podemos encontrar también microcontroladores con 2 o más módulos y un solo canal por módulo. En este caso cada canal utilizará el contador del módulo correspondiente. La fuente de reloj que incrementa el contador del módulo puede ser seleccionada generalmente de 3 fuentes diferentes: una fuente de reloj externa, el cristal que utiliza el procesador y los periféricos para operar o la velocidad del bus generada por el módulo multiplicador de frecuencia (FLL). Los módulos de tiempo pueden tener contadores de 8 bits o contadores de 16 bits. La cantidad de bits del contador de un módulo puede hacer mucha diferencia sobre todo cuando se utilizan los canales del módulo para generar bases de tiempo. Un contador de 16 bits podrá alcanzar períodos de tiempo más largos que un contador de sólo 8 bits. Por otro lado, si los canales de un módulo están siendo utilizados para generar bases de tiempo con una frecuencia distinta, el rango de frecuencia que puede existir entre los diferentes canales es mucho más estrecho en un contador de 8 bits. Esto quiere decir que los contadores de 16 bits permiten una mayor precisión y una flexibilidad mayor.
Fuentes de reloj Como se mencionó anteriormente, el módulo de tiempo puede utilizar 3 distintas fuentes de reloj ya sea para generar bases de tiempo, captura de eventos o modulación de ancho de pulso. El módulo permite además configurar un preescalador para dividir la fuente de reloj, cual quiera que haya sido seleccionada, y obtener una frecuencia de reloj más lenta. La siguiente ecuación muestra cómo calcular cualquier base de tiempo deseada con base en las configuraciones que el módulo permite, tales como preescalador, registro de módulo o fuente de reloj. ALFAOMEGA - FREESCALE
272
JUAN CARLOS VESGA FERREIRA
preescalador x registro de módulo Tiempo en segundos = -----------------------------------------------frecuencia de la fuente de reloj
Como muestra la ecuación, cuanto más grande sea el valor del preescalador más grande será el período de tiempo que el TPM puede generar. Por otro lado, el preescalador puede ser utilizado para generar bases de tiempo más precisas debido a que manipula la frecuencia de la fuente de reloj permitiendo una mayor flexibilidad. Como se comentó anteriormente, este periférico puede ser configurado de diferentes maneras: como contador de módulo para generar una única base de tiempo o también se puede configurar cualquiera de los canales disponibles para generar la misma funcionalidad. Cuando el TPM es configurado como módulo, el contador del periférico contará siempre en forma ascendente desde cero hasta alcanzar el valor almacenado en el registro de módulo. Cuando el valor del registro de móodulo es alcanzado, un evento de sobreflujo de tiempo será generado y el contador del periférico será inicializado con un valor de cero, repitiéndose el proceso. Cuando el TPM es configurado como módulo, el registro de módulo no necesita ser recargado cada vez que se cumpla el período de tiempo; bastará con limpiar la bandera que indica que sucedió el evento. Cuando alguno de los canales de tiempo del TPM es configurado para generar una base de tiempo, el evento de tiempo será generado cuando el contador del periférico es igual al valor almacenado en el registro de comparación del canal. Para lograr que los canales sean independientes uno de otro, el contador del periférico deberá ser utilizado exclusivamente para comparación, esto quiere decir que el valor del contador del periférico no deberá ser nunca modificado por ninguno de los canales. La forma de lograr que uno o más canales utilicen el mismo contador para generar períodos de tiempo independientes es almacenar el valor actual del contador del periférico en el registro de comparación del canal y sumarle el valor necesario para lograr la base de tiempo deseada. A diferencia de la configuración de módulo, los canales necesitan recargar el período de tiempo en el registro de comparación del canal, como se menciono anteriormente, cada vez que un evento de tiempo es generado. Aunque configurar el periférico como contador de módulo es ligeramente más sencillo que configurar un canal, es importante considerar lo siguiente: El TPM sólo puede ser configurado de una solo forma cada vez, como módulo o como canal de tiempo. Si se configura como módulo los canales del módulo quedaran deshabilitados permitiendo generar una sola base de tiempo. Si el TPM es configurado como canal de tiempo, entonces se podrían generar más de una base de tiempo cada vez, si es que el módulo cuenta con más de un canal. También se debe considerar que no existe diferencia significativa en cuanto a la precisión que se gana o pierde utilizando un módulo o un canal para generar una base de tiempo si se realiza la apropiada configuración. Quizá será mas difícil configurar un canal de tiempo para alcanzar la misma precisión que un módulo, pero en la mayoría de los casos valdrá la pena debido a que se aprovechan mejor los recursos del módulo. Esto quiere decir que mientras un canal es usado para generar una base de tiempo, el otro podrá ser usado para una funcionalidad diferente como, por ejemplo, un modulador de ancho de pulso o una captura de eventos. ALFAOMEGA - FREESCALE
273
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
A continuación se explicará cómo configurar el TPM como módulo de tiempo utilizando las diferentes fuentes de reloj. La primera fuente de reloj puede tomarse de la frecuencia del bus (BUSCLOCK), la cual puede ser ajustada por medio del módulo FLL a cualquier frecuencia deseada dentro de los límites especificados en la hoja de datos del microcontrolador. Esta fuente es una de las más utilizadas, sobre todo cuando se requiere generar eventos de tiempo muy precisos o eventos de tiempo con períodos muy cortos, digamos de microsegundos. Cabe mencionar que algunos microcontroladores pueden generar la frecuencia del bus con base en una fuente de reloj interna (ICS). Esta configuración es normalmente utilizada para aplicaciones donde se requiere un consumo de potencia muy bajo. En el caso de que la frecuencia del bus sea generada utilizando la frecuencia interna, la precisión de la frecuencia del bus podría verse afectada. El siguiente ejemplo configura el TPM como un módulo de tiempo para utilizar como fuente de reloj la frecuencia del bus. Para efectos de este ejemplo se tomará la frecuencia del bus igual a 2 megahertz. El módulo de tiempo será configurado para utilizar la frecuencia de la fuente de reloj dividida entre 32. Por ultimo, el registro de módulo será cargado con un valor de 62500 para generar un evento de tiempo cada segundo (1 hertz). El ejemplo no utiliza interrupciones para detectar los eventos de tiempo, por lo que el evento de tiempo será detectado poleando la bandera TOF. Siguiendo la ecuación antes descrita, el cálculo del ejemplo quedaría de la siguiente manera:
32 x 62500 1 = -----------------2000000
Programa ejemplo #include /* for EnableInterrupts macro */ #include “derivative.h” /* include peripheral declarations */ void main(void) { TPMSC = 0b00001101; //
|||| ||||
//
| | | | | | | |___ Clock source Prescaler bit0 = clk/32
//
| | | | | | |____ Clock source Prescaler bit1 = clk/32
//
| | | | | |_____ Clock source Prescaler bit2 = clk/32
//
| | | | |______ Clock source select bit0 = Bus Clock
//
| | | |________Clock source select bit1 = Bus Clock
//
| | |________ PWM mode disabled
//
| |_________ Overflow interrupt disabled
ALFAOMEGA - FREESCALE
274
JUAN CARLOS VESGA FERREIRA
//
|__________ Overflow flag TPMMOD = 62500; PTBDD_PTBDD6 = 1; EnableInterrupts; /* enable interrupts */ for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ if(TPMSC_TOF == 1) { TPMSC_TOF = 0; PTBD_PTBD6 ^= 1; } }
} Del anterior ejemplo es importante mencionar que si los 3 bits dedicados para seleccionar la fuente de reloj están en ceros, el módulo completo permanecerá deshabilitado. El ejemplo configura el módulo para contar de 0 a 62500 una y otra vez a una frecuencia dada por la frecuencia del bus dividida por el preescalador (2000000/32). Si el registro de módulo es cargado con un valor igual a cero, el módulo contará de 0 a 65535 una y otra vez generando el mayor tiempo posible. La segunda fuente de reloj puede ser tomada directamente de la frecuencia del cristal que está conectado al microcontrolador (XCLK). Si la tarjeta no tiene conectado ningún cristal externo esta fuente de reloj no podrá ser utilizada. Si se configura el módulo de tiempo para funcionar con base en un cristal externo y éste no está realmente conectado el contador del módulo, no será incrementado y por tanto el módulo de tiempo no funcionará. Esta fuente de reloj puede ser utilizada cuando se requiere que la frecuencia que emplea el módulo de tiempo para trabajar sea mucho más lenta que la frecuencia del resto del microcontrolador. Un ejemplo de esto podría ser cuando se necesita generar eventos que tienen un período de tiempo muy largo, digamos de segundos. El siguiente ejemplo configura el TPM como módulo de tiempo para utilizar como fuente de reloj el cristal externo conectado al microcontrolador. Para efectos de este ejemplo se utilizará un cristal externo de 16.384 kilohertz. El módulo de tiempo será configurado para utilizar la frecuencia de la fuente de reloj dividida entre 32. Por último, el registro de módulo será cargado con un valor de 512 para generar un evento de tiempo cada segundo (1 hertz). El ejemplo no utiliza interrupciones para detectar los eventos de tiempo, por lo que el evento de tiempo será detectado poleando la bandera TOF. ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
Programa ejemplo #include /* for EnableInterrupts macro */ #include “derivative.h” /* include peripheral declarations */ void main(void) { TPMSC = 0b00010101; //
|||| ||||
//
| | | | | | | |___ Clock source Prescaler bit0 = clk/32
//
| | | | | | |____ Clock source Prescaler bit1 = clk/32
//
| | | | | |_____ Clock source Prescaler bit2 = clk/32
//
| | | | |______ Clock source select bit0 = Bus Clock
//
| | | |________Clock source select bit1 = Bus Clock
//
| | |________ PWM mode disabled
//
| |_________ Overflow interrupt disabled
//
|__________ Overflow flag TPMMOD = 512; PTBDD_PTBDD6 = 1; EnableInterrupts; /* enable interrupts */ for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ if(TPMSC_TOF == 1) { TPMSC_TOF = 0; PTBD_PTBD6 ^= 1; } }
}
ALFAOMEGA - FREESCALE
275
276
JUAN CARLOS VESGA FERREIRA
La tercera fuente de reloj puede tomarse directamente de una fuente de reloj externa conectada a un pin del microcontrolador dedicado para dicha funcionalidad (TCLK). En esta configuración debe existir una fuente de reloj externa, la cual provee una señal cuadrada periódica que podrá usar el microcontrolador como fuente de reloj para el módulo de tiempo. Es importante mencionar que esta fuente de reloj externa es completamente independiente a la fuente de reloj que utiliza el procesador y algunos otros periféricos para funcionar. Esto quiere decir que cuando el módulo de tiempo es configurado para utilizar una fuente de reloj externa, éste puede funcionar a una frecuencia completamente distinta de la frecuencia del resto del microcontrolador; esta característica puede usarse para bajar el consumo de potencia del microcontrolador. El ejemplo siguiente configura el módulo de tiempo para generar un período de tiempo igual a un segundo. Para efectos de este ejemplo se utilizará una fuente de reloj externa de 10 kilohertz y un preescalador de 1. Utilizando la ecuación encontraremos que el valor que necesita ser almacenado en el registro del módulo debe ser igual a 10000 cuantas para generar un período de un segundo.
Programa ejemplo #include /* for EnableInterrupts macro */ #include “derivative.h” /* include peripheral declarations */ void main(void) { TPMSC = 0b01011000; //
|||| ||||
//
| | | | | | | |___ Clock source Prescaler bit0 = clk/1
//
| | | | | | |____ Clock source Prescaler bit1 = clk/1
//
| | | | | |_____ Clock source Prescaler bit2 = clk/1
//
| | | | |______ Clock source select bit0 = External Clock
//
| | | |________Clock source select bit1 = External Clock
//
| | |________ PWM mode disabled
//
| |_________ Overflow interrupt enabled
//
|__________ Overflow flag TPMMOD = 10000; PTBDD_PTBDD6 = 1; EnableInterrupts; /* enable interrupts */ for(;;) { ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
277
__RESET_WATCHDOG(); /* feeds the dog */ } } interrupt 7 void TPM_ISR(void) { TPMSC_TOF = 0; PTBD_PTBD6 ^= 1; } Los ejemplos mostrados hasta el momento detectan cuándo el evento de tiempo es generado poleando la bandera correspondiente. El ejemplo siguiente configura el TPM como módulo de tiempo utilizando como fuente de reloj la frecuencia del bus (2 megahertz). Configura también un preescalador igual a 32 y almacena en el registro de módulo un valor igual a 62500 para generar un evento de tiempo cada segundo. A diferencia de los ejemplos anteriores, el nuevo ejemplo configura la interrupción correspondiente para detectar cuándo el evento de tiempo es generado. Cuando transcurre el período de tiempo prefijado, la interrupción de sobreflujo de tiempo es generada y el programa ejecuta la correspondiente rutina de servicio de interrupción. Dentro de la rutina de servicio de interrupción la bandera de interrupción deberá ser limpiada para permitir que el proceso se repita nuevamente.
Programa ejemplo #include /* for EnableInterrupts macro */ #include “derivative.h” /* include peripheral declarations */ void main(void) { TPMSC = 0b01001101; //
|||| ||||
//
| | | | | | | |___ Clock source Prescaler bit0 = clk/32
//
| | | | | | |____ Clock source Prescaler bit1 = clk/32
//
| | | | | |_____ Clock source Prescaler bit2 = clk/32
//
| | | | |______ Clock source select bit0 = Bus Clock
//
| | | |________Clock source select bit1 = Bus Clock
//
| | |________ PWM mode disabled
//
| |_________ Overflow interrupt enabled
//
|__________ Overflow flag TPMMOD = 62500;
ALFAOMEGA - FREESCALE
278
JUAN CARLOS VESGA FERREIRA
PTBDD_PTBDD6 = 1; EnableInterrupts; /* enable interrupts */ for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ } } interrupt 7 void TPM_ISR(void) { TPMSC_TOF = 0; PTBD_PTBD6 ^= 1; } Como ya se comentó, los canales del TPM pueden ser configurados en forma independiente para generar bases de tiempo, captura de eventos o modulación de ancho de pulso. Es importante mencionar que los diferentes canales, aunque son independientes, comparten la misma fuente de reloj y el mismo preescalador. Esto quiere decir que lo primero que se deberá configurar antes de configurar cualquier canal es la fuente de reloj y el preescalador que utilizará el periférico para trabajar, tal como se hizo en los ejemplos anteriores. A continuación se explicará cómo configurar un canal para ejecutar cada una de las funciones anteriormente mencionadas:
Base de tiempo (Output Compare): un canal puede ser configurado para generar bases de tiempo muy exactas, al igual que la funcionalidad de módulo descrita anteriormente. Cada canal cuenta con un registro de comparación, el cual es usado para configurar el período de tiempo. El contador del TPM cuenta siempre en forma ascendente de 0 a 255 si el canal es de 8 bits, o de 0 a 65535 si el canal es de 16 bits. Cuando el contador del TPM es igual al valor almacenado en el registro de comparación del canal, el evento de tiempo de dicho canal es generado habilitando la bandera del canal correspondiente. Como se comentó antes el contador del TPM debe ser utilizado sólo para comparar cuando el período de tiempo de un canal ya transcurrió. Si se quiere generar un período de tiempo específico se debe calcular el número de incrementos que se tienen que dar en el contador del TPM para que transcurra el período de tiempo deseado. El registro de comparación del canal debe ser cargado con el número de cuentas que se necesitan para generar el período deseado. Para calcular el número de cuentas necesarias se puede utilizar la ecuación ya descrita. En ejercicios anteriores se utilizó la ecuación para calcular qué período de tiempo en segundos se generaba bajo un cierto valor de preescalador, frecuencia de reloj y registro de módulo. A diferencia de los ejercicios anteriores ahora despejaremos de la citada ecuación la variable Registro, puesto que conocemos las variables Períodos, Preescalador y Frecuencia de reloj. De la mencionada obtendremos la nueva ecuación quedando de la siguiente manera:
ALFAOMEGA - FREESCALE
279
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
tiempo en segundos X frecuencia de reloj ----------------------------------------------------------preescalador
Registro de comparación =
Pongamos por ejemplo, que queremos generar un evento de tiempo cada 10 milisegundos con una frecuencia de reloj igual a 2 megahertz y un preescalador igual a 32. La ecuación quedaría de la siguiente manera: 0.01 X 2000000 625 = ------------------------32 Si se tuviera un canal de tiempo de 8 bits no sería posible generar dicho período de tiempo, puesto que el valor resultante no se podría manejar con 8 bits. Siguiendo la nueva ecuación se puede modificar el valor del preescalador para intentar que el valor resultante sea menor o igual a 255 y, por tanto, que pueda ser manejado por un canal de 8 bits. Haciendo el preescalador igual a 128 podríamos obtener un valor resultante menor a 255, quedando de la siguiente manera.
156.25
=
0.01 X 2000000 -------------------------128
Como se puede observar, el valor resultante es menor a 255 pero dicho valor contiene parte entera y parte decimal. Como se comentó anteriormente, los registros del TPM aceptan únicamente valores enteros, lo que significa que el valor resultante que puede ser cargado en el registro de comparación del canal puede ser 156 o 157. Ambos valores generaran un e Si se substituye cualquiera de los 2 valores anteriormente mencionados en la primera ecuación el período de tiempo resultante será cercano a 10 milisegundos, pero existirá un porcentaje de error. Si utilizamos el valor más cercano al calculado (156), el período de tiempo resultante utilizando la misma ecuación sería: 128 x 156 9.984 milisegundos = -----------------2000000 Podemos concluir que hay casos donde un canal de tiempo de 8 bits puede ser suficiente para generar el período de tiempo deseado; sin embargo, habrá casos donde será necesario utilizar un canal de tiempo de 16 bits para poder generar con precisión el período de tiempo deseado. Si utilizamos un canal de tiempo de ALFAOMEGA - FREESCALE
280
JUAN CARLOS VESGA FERREIRA
16 bits, para el ejemplo anterior, podríamos generar con exactitud un período de tiempo de 10 milisegundos con una frecuencia de reloj igual a 2 megahertz y un preescalador igual a 32, puesto que el valor resultante (625) es un número entero sin decimales que puede ser manejado sin problema con 16 bits. El ejemplo 5 configura el canal 0 del TPM para generar una base de tiempo de 10 milisegundos con una frecuencia de reloj igual a 2 megahertz y un preescalador igual a 32. El ejemplo configura la interrupción correspondiente, la cual será ejecutada cuando el evento de tiempo sea generado.
Programa ejemplo #include /* for EnableInterrupts macro */ #include “derivative.h” /* include peripheral declarations */
void main(void) { TPMSC = 0b00001101; //
|||| ||||
//
| | | | | | | |___ Clock source Prescaler bit0 = clk/32
//
| | | | | | |____ Clock source Prescaler bit1 = clk/32
//
| | | | | |_____ Clock source Prescaler bit2 = clk/32
//
| | | | |______ Clock source select bit0 = Bus Clock
//
| | | |________Clock source select bit1 = Bus Clock
//
| | |________ PWM mode disabled
//
| |_________ Overflow interrupt disabled
//
|__________ Overflow flag
TPMC0SC = 0b01010000; //
|||| ||||
//
| | | | | | | |__ unused
//
| | | | | | |___ unused
//
| | | | | |____ Edge/level select A
//
| | | | |_____ Edge/level select B
//
| | | |_______ Mode select A
//
| | |________ Mode select B
//
| |_________ channel interrupt enabled
//
|_________ channel flag TPMC0V = 625; PTBDD_PTBDD6 = 1; ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
281
EnableInterrupts; /* enable interrupts */ for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ } } interrupt 5 void TPM_Channel0_ISR(void) { TPMC0SC_CH0F = 0; TPMC0V += 625; PTBD_PTBD6 ^= 1; }
Captura de eventos (Input Capture): esta función permite capturar eventos o transiciones sobre un pin en específico. Cada canal de tiempo tiene asignado un pin que puede ser usado como pin de propósito general o puede ser ligado a su respectivo canal de tiempo. El canal de tiempo puede ser configurado para detectar transiciones positivas o transiciones negativas. La captura de eventos puede ser por poleo o por medio de una interrupción, donde dicha interrupción es generada cuando se genera una transición sobre el pin ligado al canal de tiempo. Para lograr una detección mas efectiva de las transiciones es recomendable utilizar una interrupción. Cuando el canal es utilizado para capturar eventos, el registro de comparación del canal puede ser utilizado para medir la frecuencia con que las transiciones son generadas. El registro de comparación del canal es incrementado al mismo tiempo que el contador del módulo de tiempo, lo que quiere decir que, sabiendo la cantidad de veces que se incrementó el registro de comparación del canal entre transición, y transición se puede determinar el tiempo transcurrido. El ejemplo siguiente configura un canal de tiempo para detectar transiciones positivas. Dichas transiciones son detectadas por medio de una interrupción. Dentro de la interrupción en este nuevo ejemplo se prende y apaga un led cada vez que se genera dicho servicio de interrupción.
Programa ejemplo #include /* for EnableInterrupts macro */ #include “derivative.h” /* include peripheral declarations */ void main(void) { TPMSC = 0b00001101; //
|||| ||||
//
| | | | | | | |___ Clock source Prescaler bit0 = clk/32
ALFAOMEGA - FREESCALE
282
JUAN CARLOS VESGA FERREIRA
//
| | | | | | |____ Clock source Prescaler bit1 = clk/32
//
| | | | | |_____ Clock source Prescaler bit2 = clk/32
//
| | | | |______ Clock source select bit0 = Bus Clock
//
| | | |________Clock source select bit1 = Bus Clock
//
| | |________ PWM mode disabled
//
| |_________ Overflow interrupt disabled
//
|__________ Overflow flag
TPMC0SC = 0b01000100; //
|||| ||||
//
| | | | | | | |__ unused
//
| | | | | | |___ unused
//
| | | | | |____ Edge/level select A
//
| | | | |_____ Edge/level select B
//
| | | |_______ Mode select A
//
| | |________ Mode select B
//
| |_________ channel interrupt enabled
//
|_________ channel flag PTADD_PTADD0 = 0; PTBDD_PTBDD6 = 1; EnableInterrupts; /* enable interrupts */ for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ }
} interrupt 5 void TPM_Channel0_ISR(void) { TPMC0SC_CH0F = 0; PTBD_PTBD6 ^= 1; }
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
283
Modulación de ancho de pulso (Pulse Width Modulator): La modulación de ancho de pulso es la variación del ciclo de trabajo de una señal cuadrada periódica, en donde el módulo permite configurar qué porcentaje del período de la señal cuadrada estará en un nivel alto o 1 lógico y qué porcentaje del período estará en un nivel bajo o 0 lógico. Dicha señal cuadrada es generada por un pin del microcontrolador que puede ser configurado como pin de propósito general o como modulador de ancho de pulso. Una vez que la funcionalidad de modulación de ancho de pulso es habilitada, una señal cuadrada será reflejada en el pin antes mencionado. Es importante indicar que aunque el ancho del pulso sea incrementado o decrementado, el período de dicha señal cuadrada se conservará sin cambio alguno. Este módulo permite cambiar el ancho del pulso en cualquier momento y tantas veces como se desee. Por lo general, la mayoría de los moduladores de ancho de pulso son módulos de 8 bits, esto significa que la precisión del incremento o decremento del ancho del pulso está dado por 100 por ciento dividido entre 255. Esto quiere decir que el porcentaje del ancho del pulso puede ser incrementado o decrementado con una precisión de 0.392 por ciento. Para modificar el ancho del pulso basta con escribir un valor entre 0 y 255 en el registro del módulo, una vez realizada la escritura a dicho registro el ancho del pulso será cambiado automáticamente y permanecerá igual hasta que un nuevo valor sea escrito en el registro. Existen algunos moduladores de ancho de pulso donde el período de la señal cuadrada generada puede ser ajustado e incluso ser variable si se desea, al igual que el ancho del pulso. En este tipo de moduladores la forma de calcular el ancho del pulso de salida es un poco diferente a la forma anteriormente mencionada. El ejemplo que se presenta a continuación configura un canal de tiempo como modulador de ancho de pulso que permite configurar el período de la señal así como el ancho del pulso; para esto el periférico cuenta con 2 registros, el primero de ellos contiene la cantidad de cuentas o escalones en que será dividida la señal cuadrada periódica y el segundo contiene la cantidad de cuentas o escalones donde la señal de salida estará en un nivel alto o 1 lógico. Por ejemplo, queremos dividir la señal cuadrada en 1000 partes y que en 900 de esas partes la señal de salida permanezca en un nivel alto o 1 lógico. Esto, dicho en otras palabras significará que 90 por ciento del tiempo la señal de salida tendrá un nivel alto o 1 lógico y sólo 10 por ciento tendrá un nivel bajo o 0 lógico. El nuevo ejemplo configura un canal de tiempo como modulador de ancho de pulso, donde la señal de salida estará 75 por ciento del tiempo en alto o 1 lógico y sólo 25 por ciento restante en bajo o 0 lógico.
Programa ejemplo #include /* for EnableInterrupts macro */ #include “derivative.h” /* include peripheral declarations */ void main(void) { TPMSC = 0b00101101; //
|||| ||||
//
| | | | | | | |___ Clock source Prescaler bit0 = clk/32
//
| | | | | | |____ Clock source Prescaler bit1 = clk/32
//
| | | | | |_____ Clock source Prescaler bit2 = clk/32
ALFAOMEGA - FREESCALE
284
JUAN CARLOS VESGA FERREIRA
//
| | | | |______ Clock source select bit0 = Bus Clock
//
| | | |________Clock source select bit1 = Bus Clock
//
| | |________ PWM mode enabled
//
| |_________ Overflow interrupt disabled
//
|__________ Overflow flag
TPMC0SC = 0b00001000; //
|||| ||||
//
| | | | | | | |__ unused
//
| | | | | | |___ unused
//
| | | | | |____ Edge/level select A
//
| | | | |_____ Edge/level select B
//
| | | |_______ Mode select A
//
| | |________ Mode select B
//
| |_________ channel interrupt disabled
//
|_________ channel flag TPMMOD = 1000; TPMC0V = 750; EnableInterrupts; /* enable interrupts */ for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ }
}
14.5
MÓDULO DE COMPARACIÓN ANALÓGICO
En el diseño de aplicaciones electrónicas el uso de amplificadores operacionales es muy común, desempeñando funciones de amplificación, comparación, filtrado, entre otras aplicaciones, lo cual resulta muy útil y práctico a la hora de realizar desarrollos tecnológicos; sin embargo, muchas veces, según la aplicación, se requiere el uso de al menos un amplificador que en la mayoría de los casos cumple las funciones de comparación entre niveles de tensión; el solo hecho de requerirlo obliga a que el diseñador incorpore un circuito integrado que contenga el amplificador operacional requerido, complementándose con el hecho de que para energizar el circuito integrado del amplificador operacional se debe contar con niveles de tensión diferentes al suministrado al microcontrolador, aumentando no sólo el tamaño del hardware requerido sino también el consumo de potencia de la aplicación desarrollada. ALFAOMEGA - FREESCALE
285
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
Este problema presente hasta el momento ha sido superado por la familia de microcontroladores S08, gracias a la integración de un módulo de comparación analógico que permite cumplir no solamente con los fines propios de un amplificador operacional sino que además elimina la posibilidad de incorporar hardware adicional, evita incluir nuevos niveles de tensión de alimentación y, lo más importante, con un consumo de potencia muy bajo.
MÓDULO DBG TCLK
PTA5//IRQ/TCLK/RESET
MÓDULO MTIM
PTA4//ACMPO/BKGD/MS
SCL
MÓDULO KBI VDD VSS
MÓDULO COMPARADOR (ACMP)
SDA 4 4
PORT A
MÓDULO I2C
PTA3//KBIP3/SCL/ADP3 PTA2//KBIP2/SDA/ADP2
ACMP0 ACMPACMP+ 4
PTA1/KBIP1/ADP1/ACMP_ PTA0/KBIP0/TPMCH0/ADP0/ACMP+
FIGURA 14.13 Figura diagrama de bloques del modulo acmp y los pines que lo componen
Características del módulo ACMP Operación del módulo en el rango completo de alimentación. Menos de 40 mV de entrada de FOCET. Menos de 15 mV de histéresis. Selección del tipo de flanco según el proceso de comparación: ascendente, descendente o ascendentedescendente. Opción de comparación con un nivel de referencia interna. Opción de visualizar el resultado de la comparación a través del pin ACMPO.
ALFAOMEGA - FREESCALE
286
JUAN CARLOS VESGA FERREIRA
BUS INTERNO REFERENCIA INTERNA ACBGS ACME
ACF
set ACF
ACOPE
CONTROL INTERRUPCIÓN
+ _ ACMP_
ACIE
STATUS Y CONTROL ACMOD
ACMP+
ACMP INTERRUPT REQUEST
COMPARADOR ACMPO
FIGURA 14.14 Figura esquema interno del módulo ACMP
Según el esquema observado en la figura anterior, el módulo de comparación analógico, ACMP, cuenta con tres pines, de los cuales dos corresponden a las entradas analógicas a comparar (ACMP+ y ACMP-) y el tercer pin corresponde una salida digital que ilustra el resultado de la comparación (ACMPO). En cada uno de los dos pines de entrada se pueden aplicar niveles de tensión desde 0 V hasta el valor del voltaje de alimentación (VDD), teniendo en cuenta que ACMP+ corresponde a la entrada no inversora (voltaje considerado como la referencia positiva de comparación) y ACMP- corresponde a la entrada inversora (voltaje considerado como la referencia negativa de comparación). El módulo ACMP presenta además un registro de control de 8 bits, el cual permitirá realizar la configuración deseada del presente módulo. A continuación se explica en detalle la configuración de este registro denominado ACMPSC y el significado de cada uno de sus bits.
Registro control y estatus ACMPSC Bit 7
Bit 6
Bit 5
Bit 4
ACME
ACBGS
ACF
ACIE
Leer Escribir
Bit 3
Bit 2
Bit 1
Bit 0
ACO ACOPE
ACMOD
SIN IMPLEMENTAR ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
287
ACME: Este bit es el encargado de permitir la habilitación del módulo de comparación. 1: Habilita el funcionamiento del módulo 0: Deshabilita el funcionamiento del módulo
ACBGS: Permite seleccionar el nivel de referencia deseado a comparar con la señal de entrada presente en el pin correspondiente a la entrada inversora; este nivel de referencia puede ser interno o externo.
1: Habilita la opción de establecer un voltaje de referencia interno conocido como “Bandgap”, el cual puede oscilar entre 1.18 V y 1.21V, tomado como valor típico 1.20 V. Este nivel de tensión será conectado a través del pin correspondiente a la entrada no inversora del comparador (ACMP+) de manera interna. 0: Permite establecer un nivel de referencia externo, conectado a través del pin de la entrada no inversora del comparador, el cual podrá oscilar desde 0 hasta 3.8 V.
ACF: indica la ocurrencia de la interrupción propia del módulo de comparación, tomando valores de “1” o “0”, en caso de ocurrencia de comparación entre niveles de tensión o no, respectivamente. 1: Se ha producido una comparación 0: No ha ocurrido una comparación
ACIE: Permite la habilitación o no de la interrupción propia del módulo de comparación analógico por ejecución del proceso de comparación. 1: Interrupción por comparación entre niveles Habilitada 0: Interrupción por comparación entre niveles Deshabilitada
ACO: Permite la visualización del resultado de la comparación, siempre y cuando la interrupción por comparación se encuentre habilitada; de lo contrario será leída siempre como un nivel lógico “0”. 1: El nivel de tensión presente en ACMP+>ACMP0: El nivel de tensión presente en ACMP+
ACOPE: Habilita la visualización externa del resultado de un proceso de comparación. 1: Permite manejar la salida del módulo según la configuración establecida y visualizar el resultado de la comparación en modo externo, es decir, un reflejo del valor presente en el bit ACO. 0: La salida del módulo comparador no se encuentra habilitada.
ACMOD: Permite configurar el modo en el cual la interrupción correspondiente al módulo de comparación
será activada.
00:Salida del comparador con flanco descendente 01: Salida del comparador con flanco ascendente 10: Salida del comparador con flanco descendente 11: Salida del comparador con flanco ascendente o descendente ALFAOMEGA - FREESCALE
288
JUAN CARLOS VESGA FERREIRA
14.6
MÓDULO DE CONVERSIÓN ANÁLOGO/DIGITAL
En capítulos anteriores se realizó el estudio del conversor A/D existente en los modelos de la familia HC08JK1/ JK3/JL3, el cual constaba de 8 bits; este nuevo modelo ofrece la gran ventaja de realizar conversiones con mayor precisión debido a que utiliza una cantidad de 10 bits, con la posibilidad de ofrecerle al usuario la alternativa de conservar el formato antiguo de conversión a 8 bits, o el nuevo a 10 bits, utilizando como método de conversión la técnica de aproximaciones sucesivas.
Características del módulo de conversión A/D Utiliza el método de aproximaciones sucesivas para realizar la conversión A/D, con una resolución de 10 bits. Presenta la posibilidad de manipular hasta 28 entradas análogas. Respuesta de conversión ajustable a 8 o 10 bits.
PTA4//ACMPO/BKGD/MS
SCL
MÓDULO ACMP
CONVERSOR A/D 10 BITS MÓDULO (TPM)
MÓDULO (SPI)
PORT A
MÓDULO KBI
SDA 4 4 ACMPACMP+ 4
PTA1/KBIP1/ADP1/ACMP_ PTA0/KBIP0/TPMCH0/ADP0/ACMP+ PTB7/SCL/EXTAL PTB6/SDA/XTAL
4 TPMCH0 TPMCH5 SS MISO MOSI SPSCK RxD
MÓDULO (SCI) VSS VDD
PTA2//KBIP2/SDA/ADP2
ACMP0
TxD
PORT B
MÓDULO I2C
PTA3//KBIP3/SCL/ADP3
PTB5/TPMCH1/SS PTB4/MISO PTB3/KBIP7/MOSI/ADP7 PTB2/KBIP6/SPSCK/ADP6 PTB1/KBIP5/TxD/ADP5 PTB0/KBIP4/RxD/ADP4
REGULADOR DE VOLTAJE VDDA
VSSA VREFH VREFL
FIGURA 14.15 Diagrama a bloque de los pines pertenecientes al modulo de conversión analógico/digital ALFAOMEGA - FREESCALE
289
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
Permite la configuración de utilizar un modo de conversión para una sola conversión o realizar conversiones continuas. Tiempo de conversión ajustable. Presenta la opción de utilizar interrupciones en el momento de culminar un proceso de conversión A/D. Selección de señal de reloj de entrada con la opción de cuatro posibles fuentes diferentes. Permite el uso de una fuente de reloj asíncrona para operaciones con baja señal de ruido. Presenta adicionalmente la posibilidad de habilitar una interrupción cuando se presenten valores menores, iguales o superiores a un valor programado previamente. Entre otras características mejoradas con relación a los módulos de conversión A/D implementados anteriormente.
DESCRIPCIÓN DEL FUNCIONAMIENTO DEL ADC El microcontrolador tiene ocho canales de conversión A/D, se encuentran distribuidos en los pines PTA[3:0] y PTB[3:0]. Existe internamente un multiplexor análogo que se encarga de seleccionar el canal para efectuar la conversión y este voltaje de entrada se conoce como ADCVIN. El ADCVIN es convertido mediante el método de aproximaciones sucesivas basado en contadores; cuando la conversión está completa la bandera de fin de conversión y la bandera de interrupción por fin de conversión toman el valor 1 lógico. A continuación se presenta el diagrama lógico interno del módulo ADC.
ADCCFG
MCU STOP
ADVIN
Async Clock Gen ADACK Bus Clock
ADCK Clock DMde
+2
transfer abort
sample
Inflalizo
AD0
convert
Control Sequencer
ADHWT
ADIV
ADLSMP ADLPC
2
ADTRG MODE
1
ADCO complete
IEN
COCO
ADCSC 1
ADICLK
Compare true
ADCH
3
AIEN 1 COCO 2
SAR Convert
AD27
Data registers
Value
Compare Logic Compare Value Registers
FIGURA 14.16 ALFAOMEGA - FREESCALE
Compare true
3
ACFGT
Sum
VREFH VREFL
ADCSC2
Modelo interno del Conversor A/D
ALTCLK
Interrupt
290
JUAN CARLOS VESGA FERREIRA
Asignación de canales del conversor A/D ADCH
CANAL
ENTRADA
Pin control
ADCH
CANAL
ENTRADA
Pin control
00000
AD0
PTA0/ADP0
ADPC0
10000
AD16
VSS
N/A
00001
AD1
PTA1/ADP1
ADPC1
10001
AD17
VSS
N/A
00010
AD2
PTA2/ADP2
ADPC2
00010
AD18
VSS
N/A
00011
AD3
PTA3/ADP3
ADPC3
00011
AD19
VSS
N/A
00100
AD4
PTA0/ADP4
ADPC4
00100
AD20
VSS
N/A
00101
AD5
PTA1/ADP5
ADPC5
00101
AD21
VSS
N/A
00110
AD6
PTA2/ADP6
ADPC6
00110
AD22
RESERVADO
N/A
00111
AD7
PTA3/ADP7
ADPC7
00111
AD23
RESERVADO
N/A
01000
AD8
VSS
N/A
01000
AD24
RESERVADO
N/A
AD25
RESERVADO
N/A
01001
AD9
VSS
N/A
01001
01010
AD10
VSS
N/A
01010
AD26
N/A
01011
AD11
VSS
N/A
SENSOR DE TEMPERATURA
01100
AD12
VSS
N/A
01011
AD27
BANDGAP INTERNO
N/A
01101
AD13
VSS
N/A
01100
---
RESERVADO
N/A
01110
AD14
VSS
N/A
01101
VREFH
VDD
N/A
01111
AD15
VSS
N/A
01110
VREFL
VSS
N/A
01111
MODULO ODD
NINGUNO
N/A
A continuación se explicará en detalle cada uno de los registros que hacen parte de la configuración, manipulación y uso del módulo de conversión A/D para el nuevo modelo correspondiente a la familia S08QG.
REGISTRO DE CONTROL Y ESTADO DEL A/D (ADCSC1) Bit 7 Leer Escribir
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
AIEN
ADCO
CH4
CH3
CH2
CH1
CH0
COCO
Este registro se encarga de controlar y visualizar el estado del módulo de conversión A/D, permitiendo configurar parámetros importantes como son: indicadores de conversión completa, uso de interrupciones, modo de conversión (continua o sencilla) y selección de canales. El significado de cada uno de los bits bandera pertenecientes a este registro se describe a continuación.
COCO: bit de conversión completa Cuando el AIEN se encuentra en 0 lógico, se puede utilizar el bit COCO como indicador de fin de conversión. ALFAOMEGA - FREESCALE
291
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
1: Conversión Completa (AIEN = 0) 0: Conversión No Completa (AIEN = 0) Cuando el bit AIEN está en 1 lógico (habilitación de interrupción), el bit COCO tendrá siempre el valor 0 lógico.
AIEN: Habilitación de la interrupción de conversión A/D Cuando este bit se coloca en 1, se habilita la opción de interrupción al finalizar la conversión A/D. El bit de interrupción es limpiado cuando el dato es leído. 1: Habilitar interrupción por fin de Conversión A/D 0: Deshabilitar interrupción por fin de Conversión A/D
ADCO: bit de conversión continua Cuando este bit se encuentra en 1, constantemente va actualizando el valor del registro ADR (registro donde se almacena el valor de la conversión) y sólo una conversión es almacenada cuando este bit está en 0 lógico. 1: Conversión A/D Continua 0: Una sola conversión A/D
ADCH[4:0]: bits de selección de canales de conversión A/D Se debe tener en cuenta que con sólo 5 bits se configura el canal a utilizar para la conversión y además el tipo de señal a recibir, ya sea analógica o digital. En la tabla anterior se muestran los diferentes valores que pueden tomar ADCH[4:0] para seleccionar el canal deseado.
REGISTRO 2 DE CONTROL Y ESTATUS Bit 7 Leer
Bit 6
Bit 5
Bit 4
ADACT
Escribir
ADTRG
ACFE
ACFGT
Bit 3
Bit 2
0
0
Bit 1
Bit 0
R
R
ADACT: Conversión activa Según el valor del bit ADACT se puede saber el estado actual del proceso de una conversión. 1: Conversión en Progreso 0: Conversión Completa
ADTRG: Selección de trigger en la conversión A/D Permite la selección del tipo de trigger que se desea utilizar; existen dos tipos de trigger disponibles: trigger por hardware y trigger por software. 1: Selección de trigger por Hardware 0: Selección de trigger por Software ALFAOMEGA - FREESCALE
292
JUAN CARLOS VESGA FERREIRA
ACFE: habilitar la función Compare Este bit en especial permite habilitar la función de comparación del valor resultante de un proceso de conversión A/D, con un valor programado previamente, detectando su condición si fuese mayor, igual o menor que la establecida por defecto. 1: Habilita la función Compare 0: Deshabilita la función Compare
ACFGT: habilita función de comparación mayor que El bit anterior habilitó simplemente la función de comparación, mientras que este bit (ACFGT) especifica el tipo de comparación a realizar entre el valor resultante y el predefinido por el usuario, indicando si es menor, igual o mayor. 1: Habilita la comparación si el valor resultante es mayor o igual que el preestablecido. 0: Habilita la comparación si el valor resultante es menor que el preestablecido.
REGISTRO ADCRH
Leer
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
0
0
0
0
0
0
ADR9
ADR8
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADR7
ADR6
ADR5
ADR4
ADR3
ADR2
ADR1
ADR0
Escribir
REGISTRO ADCRL
Leer Escribir
En estos dos registros se almacena el valor correspondiente al valor resultante del proceso de conversión A/D; como se había mencionado antes, el módulo permite realizar una conversión con 8 o 10 bits de resolución, en donde, para el caso de la conversión a 10 bits, los 8 bits de menos peso del valor resultante serán visualizados en el registro ADCRL y los dos bits de más peso serán adjudicados en el registro ADCRH, ubicados en los bits ADR9 y ADR8, respectivamente. Para el caso de la conversión a 8 bits, los 8 bits correspondientes al valor resultante serán visualizados en el registro ADCRL y los dos bits de más peso del registro ADCRH (ADR9 y ADR8) tomarán cada uno el valor “0” lógico.
ALFAOMEGA - FREESCALE
293
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
REGISTRO: VALOR DE COMPARACIÓN (PARTE ALTA) ADCCVH
Leer
Bit 7
Bit 6
Bit 5
Bit 4
0
0
0
0
Bit 3
Bit 2
Escribir
Bit 1
Bit 0
ADVC9
ADVC8
REGISTRO: VALOR DE COMPARACIÓN (PARTE BAJA) ADCCVL Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADVC7
ADVC6
ADVC5
ADVC4
ADVC3
ADVC2
ADVC1
ADVC0
Leer Escribir
En estos dos registros se almacena el valor con el cual el usuario podrá realizar una comparación con el valor generado por el módulo de conversión, tomándose como criterio, al igual que en los dos registros anteriores, si se desea trabajar a 8 o 10 bits, respectivamente.
REGISTRO DE CONFIGURACIÓN ADCCFG Este registro permite establecer la configuración del conversor análogo-digital en parámetros como, por ejemplo: selección del modo de operación, fuente de reloj, división de frecuencia del reloj y configuración de modo de bajo consumo de potencia. Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Leer Escribir
ADLPC
ADIV
ADLMSP
MODE
ADICLK
ADLPC: Este bit permite establecer la configuración en modo de bajo consumo de potencia en el
microcontrolador a la hora de hacer uso del módulo de conversión analógica-digital, mediante el control de la velocidad de conversión; a mayor velocidad, mayor consumo de potencia, optimizando con ello el consumo de potencia cuando no se requiere gran cantidad de muestras. 1: Configuración de bajo consumo de potencia. 0: Configuración de alta velocidad.
ADIV[6:5] Selector del divisor del reloj. Permite configurar el factor de división del reloj para realizar el proceso de conversión A/D. En la siguiente tabla se ilustra según el valor adjudicado a la sección ADIV el correspondiente factor de división.
ALFAOMEGA - FREESCALE
294
JUAN CARLOS VESGA FERREIRA
SELECCIÓN DE DIVISIÓN DEL RELOJ ADIV
RADIO DE DIVISIÓN
DIVISIÓN DEL RELOJ
00
1
RELOJ
01
2
RELOJ/2
10
4
RELOJ/4
11
8
RELOJ/8
ADLSMP: Este bit permite habilitar el modo de configuración de tiempo cuando se desea establecer espacios muestrales en corto y en largo tiempo. 1: Configuración de tiempo largo entre muestras 0: Configuración de tiempo corto entre muestras
MODE [3:2] Selección del modo de conversión. Permite seleccionar entre operaciones de 8 0 10 bits. A continuación se ilustra una tabla con los valores correspondientes al tipo de configuración establecido según el valor de los bits de la sección MODE. MODOS DE CONVERSIÓN MODO
DESCRIPCIÓN DEL MODO DE CONVERSIÓN A/D
00
CONVERSIÓN A 8 BITS (N = 8)
01
RESERVADO
10
CONVERSIÓN A 10 BITS (N = 10)
11
RESERVADO
ADICLK [1:0] Selector de reloj de entrada. Establece la selección de la fuente del reloj de entrada para
realizar el proceso de conversión A/D. En la siguiente tabla se muestra según el valor del campo ADICLK el tipo de fuente establecida para realizar el proceso de conversión.
SELECCIÓN DEL RELOJ DE ENTRADA ADICLK
SELECCIÓN DE FUENTE DE RELOJ
00
RELOJ DE BUS
01
RELOJ DE BUS DIVIDIDO POR 2
10
RELOJ ALTERNO (ALTCLK)
11
RESERVADO
ALFAOMEGA - FREESCALE
295
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
REGISTRO DE CONTROL 1 PARA PINES A/D (APCTL1) Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADPC7
ADPC6
ADPC5
ADPC4
ADPC3
ADPC2
ADPC1
ADPC0
Leer Escribir
REGISTRO DE CONTROL 2 PARA PINES A/D (APCTL2) Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADPC15
ADPC14
ADPC13
ADPC12
ADPC11
ADPC10
ADPC9
ADPC8
Leer Escribir
REGISTRO DE CONTROL 3 PARA PINES A/D (APCTL3) Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADPC23
ADPC22
ADPC21
ADPC20
ADPC19
ADPC18
ADPC17
ADPC16
Leer Escribir
Los registros anteriores permiten habilitar o deshabilitar los diferentes canales que se usarán como entradas análogas. ADPCXX : Canales que podrán ser seleccionados como entradas análogas 1: Canal Deshabilitado 0: Canal Habilitado
TIEMPO TOTAL DE CONVERSIÓN Uno de los factores más importante a la hora de realizar cualquier proceso de conversión analógico a digital es el tiempo de conversión; este tiempo depende del tiempo muestral (establecido en el registro ADLSMP), como también de la frecuencia del bus, del modo de conversión (si es a 8 o 10 bits) y de la frecuencia del reloj de conversión (FADCK). El tiempo de conversión puede variar, dependiendo de la configuración establecida por el usuario según la valoración establecida en cada uno de los parámentros antes mencionados. A continuación se ilustra una tabla que permite cuantificar el tiempo de conversión según los valores establecidos.
ALFAOMEGA - FREESCALE
296
JUAN CARLOS VESGA FERREIRA
Tiempo de conversión vs. condiciones de control Tipo de conversión
ADICLK
ADLSMP
Sencilla o primera continua a 8 bits
00,01,10
0
20 ciclos de ADCK + 5 ciclos del reloj del bus
Sencilla o primera continua a 10 bits
00,01,10
0
23 Ciclos de ADCK + 5 ciclos del reloj del bus
Sencilla o primera continua a 8 bits
00,01,10
1
40 ciclos de ADCK + 5 ciclos del reloj del bus
Sencilla o primera continua a 10 bits
00,01,10
1
43 ciclos de ADCK + 5 ciclos del reloj del bus
Sencilla o primera continua a 8 bits
11
0
5 us + 20 ciclos de ADCK + 5 ciclos del reloj del bus
Sencilla o primera continua a 10 bits
11
0
5 us + 23 ciclos de ADCK + 5 ciclos del reloj del bus
Sencilla o primera continua a 8 bits
11
1
5 us + 40 ciclos de ADCK + 5 ciclos del reloj del bus
Sencilla o primera continua a 10 bits Continuas posteriores a 8 bits FBUS>FADCK
11
1
5 us + 43 ciclos de ADCK + 5 ciclos del reloj del bus
00,01,10,11
0
17 ciclos de ADCK
00,01,10,11
0
20 ciclos de ADCK
00,01,10,11
1
37 ciclos de ADCK
00,01,10,11
1
40 ciclos de ADCK
Continuas posteriores a 10 bits FBUS>FADCK Continuas posteriores a 8 bits FBUS>FADCK/11 Continuas posteriores a 10 bits FBUS>FADCK/11
Tiempo de conversión máximo
Se debe tener en cuenta que el tiempo máximo de conversión es determinado por la fuente de reloj seleccionada y el factor de división establecido. Como se mencionó antes, la fuente de reloj es seleccionada por ADICLK y el factor de división por los bits que conforman la sección ADIV.
Inicialización y operación del ADC Cuando se desea utilizar el conversor A/D se debe efectuar los siguientes pasos para la configuración óptima: 1. Configurar el registro ADCLK indicando la frecuencia para el preescalador de conversión A/D. 2. Configurar el registro ADSCR, indicando lo siguiente: a. Habilitar el bit de interrupción, indicando fin de conversión. b. Configurar el tipo de conversión, ya sea continua o una muestra. c. Definir el canal de conversión A/D. Considerando que el voltaje de referencia es 5 V obtenemos que: Resolución =
5 2 _1 8
19.6 mV
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
297
Error de cuantización ±=
1 5 LSB = = 9.8 mV 2 2(28_1)
Ejemplo de configuración y uso del módulo ADC void adc_init(void) { ADCSC1 = 0x5F; /* Habilita interrupciones Deshabilita conversiones continuas Deshabilta el ADC encendiendo todos los pines de ADCH */ ADCSC2 = 0x00; /* Selección inicio de conversión por Software*/ ADCCFG = 0x0B; /* ADIV=input clock/8 MODE=10bit conversion ADICLK=bus clock */ APCTL1 = 0x0E; /* Habilita pines del 1 al 3 como entradas del ADC*/ } //end adc_init interrupt 19 void ADC_ISR(void) { ADC_val_H = ADCRH;
// Parte alta de la conversión (Bits 8 y 9)
ADC_val_L = ADCRL;
// Parte baja de la conversión (Bits 7 al 0)
}
MODULOS DE COMUNICACIONES CON EL S08 Las comunicaciones forman parte del dia a dia en caso todos los sistemas basados en microcontroladores por poner un ejemplo quien pudiera imaginar hoy en dia una computadora personal sin un puerto serial o simplemente el Internet. Como se puede percibir este ejemplo refleja como las comunicaciones nos permiten mantenernos informados, y por lo cual es importante que un microcontrolador cuente no solo con una opción de comunicación si no con varias. A continuación trataremos los tipos de comunicaciones digitales básicas existentes en los microntroladores
Definiciones Existen tres tipos básicos de sistema de comunicaciones Simplex. Half- Duplex. Full- Duplex. ALFAOMEGA - FREESCALE
298
JUAN CARLOS VESGA FERREIRA
Simplex. En este esquema de comunicaciones la información viaja de un sentido a otro. Un ejemplo típico de este esquema de comunicaciones es el de un Radio Receptor de FM o AM. Como se muestra en la figura.
Half – Duplex. Este sistema es uno de los mas utilizados porque permite, comportarse en un instante de tiempo como un transmisor y en otro tiempo pasar a ser un receptor. Ver figura. Full- Duplex. Es el mejor esquema de comunicacion porque permite el envio de informacion todo el tiempo en ambos sentidos, es decir funciona tanto como receptor y transmisor al mismo momento. Ver figura. El ejemplo mas palpable de este esquema es el
C1
Comunicación Half-Duplex
C2
Comunicación Full-Duplex
C2
C1
C1
Comunicación Simplex
C2
FIGURA 14.17 Sistemas básicos de Comunicaciones. Estos esquemas de comunicaciones como pueden darse cuenta solo nos indican como viaja el flujo de información, sin embargo no nos indican el como lo realizan. En general podemos clasificar las comunicaciones por la forma en que envian información en: Seriales. En este tipo la información viaja bit a bit. Existen dos tipos de comunicaciones seriales: A) Sincronas. B) Asincronas.
Paralelas. A diferencia del serial en este tipo la información se envía en grupo de bits, por lo general en paquetes de 8 bits.
Protocolo. Un protocolo es el conjunto de reglas necesarias para garantizar que la información pueda enviarse de un origen a un destino. Es necesario que un protocolo cuente con la definición del medio por el ALFAOMEGA - FREESCALE
299
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
que enviará la información y la lógica necesaria para lograr establecer la comunicación. Por el enfoque de este libro no se realizarán las definiciones del modelo de referencia OSI (Open Structure Interface) pero igual se hará referencia a este.
14.7
MÓDULO INTERFACE DE COMUNICACIONES SERIALES (SCI)
Uno de los principales módulos de la familia de microcontroladores S08Q es el módulo interface de comunicaciones seriales, el cual brinda la posibilidad de establecer una forma fácil y rápida de establecer interfaces de comunicación con diferentes dispositivos y con rutinas de comunicación de alta envergadura, como es el caso de técnicas de detección de errores debidos a diferentes fuentes como, por ejemplo: el ruido, la paridad o errores en la trama de bits; causas frecuentes de error en este tipo de sistemas, los cuales son detectados con gran facilidad sin requerir códigos adicionales complicados que lo único los cuales solamente provocan retardos en el proceso de comunicación y que en muchos casos resultan inefectivos.
MÓDULO INTERFACE SERIAL PERIFÉRICA SPI MODULO INTERFACE DE COMUNICACIÓN SERIAL SCI
SS MISO MOSI SPSCK RxD TxD
PORT B
PTB7/SCL/EXTAL PTB6/SCL/XTAL
PTB5/TPMCH1/SS PTB4/MISO PTB3/KBIP7/MOSI/ADP7 PTB2/KBIP6/SPSCK/ADP6 PTB1/KBIP5/TxD/ADP5 PTB0/KBIP4/RxD/ADP4
FIGURA 14.18 Diagrama a bloque de los pines del Microcontrolador que hacen parte del módulo SCI
Características del módulo SCI Comunicación Full-duplex con formato de tipo NRZ (No retorno a cero). Doble buffer de transmisión y recepción con la particularidad de ser habilitados o no por separado. Posee un módulo divisor de frecuencia programable de 13 bits. Presenta manejador de interrupciones indicando los siguientes eventos: Registro de transmisión vacío y transmisión completa. Recepción de datos completa. Recepción fuera de rango, error de paridad y error por ruido. ALFAOMEGA - FREESCALE
300
JUAN CARLOS VESGA FERREIRA
Detección de receptor deshabilitado. Detección de paridad por hardware. Longitud del valor a transmitir programable a 8 o 9 bits. Y muchas otras características especiales que hacen de este módulo una herramienta valiosa a la hora de desarrollar aplicaciones que requieran transferencia de datos serialmente. Dentro de los modos de operación que presenta este módulo se pueden mencionar: Modo de transmisión de datos a 8 o 9 bits. Modo de parada, en el cual el módulo SCI congela su valor actual mientras se mantenga este modo activo. Modo cíclico o de bucle. Modo de cableado sencillo. A la hora de programar las rutinas de comunicaciones serie se pueden seguir dos caminos distintos: espera activa o interrupciones. Al utilizar espera activa todas las interrupciones están deshabilitadas. Es el propio software el que debe determinar cuándo se puede enviar un dato y cuándo hay un dato recibido listo para ser leído; esto se realiza “monitoreando” el registro de estado del SCI; cuando se detecta que ha ocurrido algún suceso se actúa en consecuencia. Cuando se realiza una rutina de comunicación basada en el sistema de espera activa, este presenta la ventaja de que conceptualmente es muy sencillo y los programas son fáciles de realizar; sin embargo, está consumiendo recursos de microcontrolador que pueden ser utilizados en otras tareas que lo requieran realmente. Sin embargo, utilizando el método de interrupciones se consigue liberar a la CPU de trabajos inútiles, permitiendo que el mismo sistema nos avise qué ha ocurrido, actuando de manera eficaz ante la actividad que requiera atención en un instante dado. Por ejemplo, cada vez que llega un dato nuevo se activa una interrupción. La CPU deja de hacer lo que estaba haciendo y pasa a atender la interrupción. Se lee el carácter que ha llegado y se continúa con lo que estaba haciendo. Las interrupciones tienen el inconveniente de que son más complicadas de entender y los programas son un poco más complejos, pero a cambio el programa es más “eficaz”.
Fuentes de interrupciones en el módulo SCI Existen cuatro fuentes de interrupción dedicadas exclusivamente al proceso de comunicación basadas en el módulo SCI. Tal como se estudió anteriormente, en el manejo de las interrupciones se requieren dos bits especiales: el primer bit, que por lo general es terminado en “E”, es el encargado de habilitar o no la rutina de la interrupción requerida para que en el momento en que ocurra sea avisado el microcontrolador y pueda realizar la atención requerida. El segundo bit es el que indica en qué instante ha ocurrido un evento en particular, provocando la activación de la interrupción, el cual en la mayoría de los casos es terminado en “F”; éste deberá ser limpiado tan pronto como la interrupción sea atendida; de lo contrario, el microcontrolador creerá que la interrupción ha ocurrido nuevamente, quedándose en un bucle infinito. La siguiente tabla muestra las causas de interrupción, el bit del registro de estado asociado a cada una y el bit del registro de control 2 que las enmascara.
ALFAOMEGA - FREESCALE
301
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
Motivo de interrupción
Bit de estado
Máscara interrupción
Registro de transmisión vacío
TDRE
TIE
Registro de transmisión vacío y línea transmisión vacía
TC
TCIE
Dato recibido
RDRF
RIE
Dato recibido y línea recepción vacía (IDLE)
IDLE
ILIE
Registros de preescalamiento de la velocidad de transmisión Este registro es el encargado de fijar el divisor para el generar la velocidad de transmisión de cada uno de los bits de la trama.
REGISTRO (SCIBRH) Leer
Bit 7
Bit 6
Bit 5
0
0
0
Escribir
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
SBR12
SBR11
SBR10
SBR9
SBR8
REGISTRO (SCIBRL) Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
SBR7
SBR6
SBR5
SBR4
SBR3
SBR2
SBR1
SBR0
Leer Escribir
El registro de velocidad permite configurar la velocidad (en baudios) de la comunicación. Los bits 4 y 5 (SCP0 y SCP1) determinan la máxima velocidad en baudios. Esta velocidad depende del cristal que se haya conectado al microcontrolador. La velocidad de transmisión (baud rate) se calcula entonces de la siguiente manera: Baud Rate =
frecuencia _ oscilador divisor*16
Ejemplo Si utilizamos el modo que está por default del reloj del microcontrolador, es decir, el modo con reloj interno a 4 Mhz y deseamos obtener un Baud Rate de 9600 bps, ¿que valor se debe colocar en el registro SCIBR? Se escogió este valor de 9600 como ejemplo ya que cualquier computadora personal con el sistema operativo Windows cuenta con la herramienta de comunicaciones llamada Hyperterminal que permite usar el puerto serial de la PC a esta velocidad. ALFAOMEGA - FREESCALE
302
JUAN CARLOS VESGA FERREIRA
Solución Aplicando la ecuación que acabamos de ver, divisor = 4 Mhz/ 16*9600 bps = 26.041, lo que es igual a un 0x1 A (hexadecimal). De esta forma el registro SCI1BDH =0x00; y el registro SCI1BDL=0x1A para obtener los 9600 bps.
REGISTRO DE CONTROL 1 (SCIC1) Este registro nos permite configurar el modo de operación del módulo en One Wire o modo normal, el tamaño de la trama para la transmisión 8/9 bits, la forma de utilizar el Wakeup Line y por último la configuración del bit de paridad. Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
LOOPS
SCISWAI
RSRC
M
WAKE
ILT
PE
PT
Leer Escribir
LOOPS: Modo de selección ciclico. Permite establecer modos de comunicación internos y externos, es
decir, se puede verificar si el módulo se encuentra en óptimas condiciones de transmisión realizando una comunicación denominada Loop Back, en la cual el microcontrolador establece un puente de comunicación entre su propio transmisor y receptor o puede ser configurado en modo normal donde la señal puede salir del microcontrolador hacia otros dispositivos. 0: Operación Normal; el TX y RX usan pines de comunicación diferentes 1: Modo de Comunicación cíclico, en donde el TX y el Rx internamente son conectados.
SCISWAI: Modo de espera o parada del módulo SCI 0: El módulo se mantendrá en modo de espera y el reloj continuará funcionando normalmente hasta que la fuente de interrupción sea levantada. 1: El reloj del módulo SCI se congelará mientras la CPU se encuentra en modo de espera.
RSRC: selector de fuente de recepción 0: Permite establecer la comunicación de tipo LOOP BACK 1: Permite establecer la comunicación con un dispositivo externo. M: Modo de selección de transmisión a 8 o 9 bits 0: Modo de transmisión normal a 8 bits de datos más un bit de arranque y un bit de parada 1: Receptor y transmisor configurado a 9 bits de datos más un bit de arranque, uno de parada.
ALFAOMEGA - FREESCALE
303
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
WAKE: El módulo SCI tiene un modo de funcionamiento especial denominado modo WAKEUP, el cual permite aumentar la eficiencia en sistemas multirreceptores. Este modo consiste en que el receptor se queda con las interrupciones inhibidas esperando un evento hardware externo (asociado a la línea de recepción), que le devuelva al estado activo con interrupciones. El evento externo puede ser de dos tipos y se selecciona con el bit 3 (WAKE). 0: Se espera hasta detectar que la línea de recepción está vacía. 1: Se espera hasta detectar una marca de dirección.
ILT: selector de línea desocupada Establece a partir de dónde se colocará el nivel lógico alto para indicar el estado de la línea desocupada. 0: El bit de conteo inicia después del bit de arranque 1: El bit de conteo inicia después del bit de parada
PE: habilita la generación de paridad por hardware. Cuando es habiltada, el bit de más peso es tomado como el bit de paridad del valor a transmitir.
0: Paridad por hardware deshabilitada 1: Paridad habilitada
PT: tipo de paridad; permite establecer el tipo de paridad a utilizar, el cual puede ser de dos tipos. 0: Paridad impar 1: Paridad par
REGISTRO DE CONTROL 2 (SCIC2) Este registro contiene las máscaras que permiten habilitar o deshabilitar los eventos relacionados a las interrupciones. Permite habilitar el transmisor y el receptor, la recepcion por Wakeup Line y la transmisión del break. Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
TIE
TCIE
RIE
ILIE
TE
RE
RWU
SBK
Leer Escribir
Es el principal registro en el que se configura la salida de la señal de comunicaciones hacia otros dispositivos adyacentes. Según el esquema del microcontrolador, los pines utilizados para transmitir y recibir corresponden a los bits 1 y 0 del puerto B, respectivamente. Por lo anterior, estos dos pines pueden desempeñar dos funciones: como pines dedicados a comunicaciones seriales o pines de propósito general, según lo disponga el diseñador. Los bits 4, 5, 6 y 7 (ILIE, RIE, TCIE, TIE) son máscaras que permiten que ciertas interrupciones ocurran o no. TCIE y TIE corresponden a dos interrupciones del transmisor y ILIE y RIE a dos interrupciones del receptor. ALFAOMEGA - FREESCALE
304
JUAN CARLOS VESGA FERREIRA
TIE: Interrupción que se habilita cuando se desee saber en qué momento se ha transmitido un dato y el buffer ha quedado vacío o libre para ser utilizado por otro registro a transmitir. 1: Habilita interrupción de transmisión 0: Deshabilita la interrupción
El bit de estado asociado para el anterior bit bandera es el bit TDRE, cuando TDRE=1 indica que se ha recibido un dato y si el bit TIE está a 1 entonces se produce la interrupción.
TCIE: Este bit ilustra otra interrupción que permite saber cuándo se ha realizado se ha transmitido un dato completamente, que de manera indirecta se registra cuando el buffer de transmisión ha quedado vacío. 1: Habilita la interrupción para saber cuándo se ha realizado una transmisión completa. 0: Deshabilita la interrupción. El bit de estado asociado es TC y el funcionamiento es análogo al anterior, es decir, activa siempre y cuando el bit TC se encuentre en “1”.
RIE: Al igual que en el transmisor, es posible saber cuándo se ha transmitido un registro; también es posible saber cuándo se ha recibido un dato; interrupción que puede ser manipulada bajo el estado del bit RIE. 1: Habilita la interrupción para saber en qué momento se ha recibido un dato. 0: Deshabilita la interrupción.
ILIE: Este bit bandera permite activar una interrupción que le indicará al sistema cuándo la línea de recepción
está vacía. Este bit se encuentra trabajando de la mano con el bit IDLE.
1: habilita la interrupción para saber en qué instante el buffer de recepción se encuentra vacío. 0: deshabilita la interrupción.
TE: habilitar transmisor 1: Transmisor habilitado 0: Transmisor deshabilitado
RE: habilitar receptor 1: Receptor habilitado 0: Receptor deshabilitado
RWU: Utilizando este método, el receptor siempre está en estado de bajo consumo de potencia, esperando una condición hardware que lo despierte. Dicha condición depende del valor que tenga el bit 3 (WAKE) ALFAOMEGA - FREESCALE
305
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
del registro de control 1 (SCCR1). Generalmente es el programa el que establece este bit en 1 y la CPU es la encargada de desactivarlo. 1: Modo especial WAKE−UP está activo; espera que ocurra una acción hardware para activarse. 0: Estado del receptor activa
SBK: Es un bit que según su estado, realiza el envío de señales de tipo BREAK, caracterizadas por enviar
ceros por la línea, provocando que no solamente los bits de datos sean ceros sino que además el bit de parada también será cero donde este último siempre presenta el valor de “1”. 1: Envía las señales de tipo BREAK. 0: Operación de transmisión normal.
REGISTRO DE CONTROL 3 (SCIC3) Bit 7 Leer Escribir
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
T8
TXDIR
TXINV
ORIE
NBIE
FEIE
PEIE
R8
Cuando es configurada la trama de TX y RX a 9 bits (M=1), se utilizan estos dos bits presentes en el registro. R8 : noveno bit del dato recibido T8 : noveno bit del dato a transmitir
TXDIR: Cuando el sistema es configurado en el modo de operación Half Duplex (LOOPS=1=RSRC), determinándose la dirección de la comunicación en este pin. 0: Pin TxD Configurado como entrada 1: Pin TxD Configurado como entrada
TXINV: inversión de datos de transmisión. Este pin permite aplicar la polaridad inversa a los datos que se desea transmitir. 0: Datos de transmisión no invertidos 1: Datos de transmisión invertidos
ORIE: Interrupción de sobreescritura. Habilita la interrupción que indica cuándo se ha recibido un carácter por el puerto serie y el anterior dato recibido todavía no se ha leído. Cuando ocurre este error, el dato que se pierde es el que se acaba de recibir. 1: habilita la interrupción 0: deshabilita la interrupción
ALFAOMEGA - FREESCALE
306
JUAN CARLOS VESGA FERREIRA
NEIE: Habilitar interrupción por errores de recepción debidas al ruido 1: Habilita la interrupción 0: Deshabilita la interrupción
FEIE: Habilitar interrupción debido a errores presentes en la trama de bits 1: Habilita la interrupción 0: Deshabilita la interrupción
PEIE: Habilitar interrupción indicando errores de paridad 1: Habilita la interrupción 0: Deshabilita la interrupción
REGISTRO ESTATUS 1 (SCIS1) Por medio de este registro se tienen las banderas que indican el resultado de las operaciones del módulo de SCI; éste es el registro más importante, ya que nos indica no sólo que se ha recibido o transmitido un dato sino el tipo de errores en caso de haber existido éstos.
Leer
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
TDRE
TC
RDRF
IDLE
OR
NF
FE
PF
Escribir
Como se puede observar en el esquema, este registro es de sólo lectura; permite comprobar el estado actual del módulo SCI.
TDRE: Cuando se ha realizado la transmisión de un dato o carácter, este bit tomará el valor “1”; de lo
contrario tomará el valor “0”. Hay que tener en cuenta que siempre que se desee transmitir un dato hay que asegurarse de que este bit se encuentra en estado “1”; de lo contrario, el dato que se esté enviando en ese momento será alterado y destruido completamente.
TC: Cuando se ha transmitido un dato y la línea de transmisión ha quedado vacía (IDLE); este bit es más confiable cuando se desea saber si realmente un byte ha sido transmitido completamente o no. 1: Se ha transmitido un byte completamente 0: El buffer de Tx está lleno y se encuentra en proceso de transmisión
RDRF: Este bit indica cuándo se ha recibido un dato nuevo en el buffer de recepción. 1: Se ha recibido un dato 0: Buffer de recepción vacío
IDLE: Bit que indica cuándo la línea de RX se ha quedado vacía; si el bit RWU del registro de control 2 se encuentra activo, este bit se encontrará deshabilitado. 1: Línea de Rx desocupada ALFAOMEGA - FREESCALE
307
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
0: Línea de Rx ocupada
OR: Este bit indica cuando se ha recibido un carácter por el puerto serie y el anterior dato recibido todavía no se ha leído. Cuando ocurre este error, el dato que se pierde es el que se acaba de recibir. 1: Se ha recibido un nuevo dato que sobreescribió al anterior 0: Recepción normal
NF: Bandera de ruido. Cuando se ha recibido algún dato y se detecta que en él existe un posible error, es activado este bit. La activación de este bit no produce interrupción, será el software el que se preocupe de examinar este bit después de recibir un dato para saber si es válido o no. 1: Se ha recibido un dato con un posible error 0: Recepción normal
FE: Error de trama. Se activa cuando se ha detectado un error en la trama enviada. Al recibir un dato se verifica que el bit de stop esté a nivel alto. 1: Error en la trama recibida 0: Recepción correcta
PF: Bandera de error de paridad. Este bit indica si ha ocurrido un error en la recepción del byte debido a errores de paridad. 1: Error en la paridad 0: Recepción sin errores de paridad
REGISTRO ESTATUS 2 (SCIS2) Este registro, al igual que el anterior, es de sólo lectura.
Leer
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
0
0
0
0
0
Escribir
Bit 2
Bit 1
Bit 0
0
RAF
BRK13
BRK13: A través de este bit se define la longitud del registro de ruptura (BREAK) mencionado anteriormente.
1: Tamaño del bit de ruptura de 13 bits 0: Tamaño del bit de ruptura de 10 bits
RAF: Bandera de recepción activa. 0: Receptor activado, línea de recepción vacía y esperando bit de arranque 1: Receptor activado, línea de recepción no vacía.
ALFAOMEGA - FREESCALE
308
JUAN CARLOS VESGA FERREIRA
REGISTRO ESTATUS 3 (SCIS3). Este registro contiene al noveno bit que será transmitido cuando se ha seleccionado este modo, además de las configuraciones necesarias para el modo One Wire. Además contiene las máscaras para las interrupciones de error. 7 R w Reset
R8 0
6
5
4
3
2
1
0
T8
TXDIR
TXINV
ORIE
NEIE
FEIE
PEIE
0
0
1
0
0
0
0
= Unimplemented or Reserved
REGISTRO DE DATOS DEL MÓDULO SCI (SCID) Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Leer
R7
R6
R5
R4
R3
R2
R1
R0
Escribir
T7
T6
T5
T4
T3
T2
T1
T0
Este registro funciona como si fueran dos registros independientes; cuando existe un valor presente en él, corresponde al valor que proviene del buffer de datos debido a algún dato recibido previamente; sin embargo, cuando se escribe un valor en él, es considerado como un dato a transmitir y es enviado al buffer de Tx para ser evacuado en el menor tiempo posible.
Ejercicio Realizar un driver para manejar el módulo SCI del S08QG8 sin utilizar las interrupciones; para probar el driver el programa principal mandará hacia la PC un cadena de datos con el mensaje “Bienvenido”.
Solución La parte del driver consiste en realizar un conjunto de funciones que nos permitan manejar directamente al módulo para enviar y recibir datos. Y en la parte del programa principal se realiza la inicialización del módulo y se hace uso de las funciones del driver para transmitir la cadena del mensaje. Código del Driver. #include “SCI.h” /* #### Rutina que permite Transmitir un Byte de Datos ####*/ void transmite(unsigned char x) { SCID=x; while(!SCIS1_TDRE); // Verifica y espera hasta que el dato ya haya sido transmitido. ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
} /* #### Rutina que permite Recibir un Byte de Datos ####*/ char recibe(void) { while(!SCIS1_RDRF);
// Espera mientras se esta recibiendo el dato.
return SCID; } /* #### Funcion para Transmitir mas de un Byte ####*/ void transmite_cadena(byte *x){ do{ sendbyte(*x); }while(*x++); } Código del Programa Principal. #include /* for EnableInterrupts macro */ #include “derivative.h” /* include peripheral declarations */ #include “SCI.h” /* Rutinas para el Puerto Serie.*/ void MCU_init(void); /* Device initialization function declaration */ void main(void) { const byte cadena_mensaje[]={“Bienvenido”}; MCU_init(); /* Inicializa el puerto Serial y el Reloj del micro */ transmite_cadena(&cadena_mensaje[0]); for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ } /* loop forever */ /* please make sure that you never leave this function */ } void MCU_init(void) { /* ### MC9S08QG8_16 “Cpu” init code ... */ /* PE initialization code after reset */ /* Common initialization of the write once registers */ /* SOPT1: COPE=0,COPT=1,STOPE=0,BKGDPE=1,RSTPE=0 */ SOPT1 = 0x52; ALFAOMEGA - FREESCALE
309
310
JUAN CARLOS VESGA FERREIRA
/* SPMSC1: LVDF=0,LVDACK=0,LVDIE=0,LVDRE=1,LVDSE=1,LVDE=1,BGBE=0 */ SPMSC1 = 0x1C; /* SPMSC2: PDF=0,PPDF=0,PPDACK=0,PDC=0,PPDC=0 */ SPMSC2 = 0x00; /* SPMSC3: LVDV=0,LVWV=0 */ SPMSC3 &= (unsigned char)~0x30; /* System clock initialization */ ICSTRM = *(unsigned char*far)0xFFAF; /* Initialize ICSTRM register from a non volatile memory */ ICSSC = *(unsigned char*far)0xFFAE; /* Initialize ICSSC register from a non volatile memory */ /* ICSC1: CLKS=0,RDIV=0,IREFS=1,IRCLKEN=0,IREFSTEN=0 */ ICSC1 = 0x04;
/* Initialization of the ICS control register 1 */
/* ICSC2: BDIV=0,RANGE=0,HGO=0,LP=0,EREFS=0,ERCLKEN=0,EREFSTEN=0 */ ICSC2 = 0x00;
/* Initialization of the ICS control register 2 */
/* SOPT2: COPCLKS=0,IICPS=0,ACIC=0 */ SOPT2 = 0x00; /* ### Init_SCI init code */ /* SCIC2: TIE=0,TCIE=0,RIE=0,ILIE=0,TE=0,RE=0,RWU=0,SBK=0 */ SCIC2 = 0x00;
/* Disable the SCI module */
(void)(SCIS1 == 0);
/* Dummy read of the SCIS1 registr to clear flags */
(void)(SCID == 0);
/* Dummy read of the SCID registr to clear flags */
/* SCIS2: BRK13=0,RAF=0 */ SCIS2 = 0x00; SCIBD = 0x36; /* SCIC1: LOOPS=0,SCISWAI=0,RSRC=0,M=0,WAKE=0,ILT=0,PE=0,PT=0 */ SCIC1 = 0x00; /* SCIC2: TIE=0,TCIE=0,RIE=0,ILIE=0,TE=1,RE=1,RWU=0,SBK=0 */ SCIC2 = 0x0C; /* SCIC3: R8=0,T8=0,TXDIR=0,TXINV=0,ORIE=0,NEIE=0,FEIE=0,PEIE=0 */ SCIC3 = 0x00; /* ### */ asm CLI;
/* Enable interrupts */
} /*MCU_init*/
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
311
14.8 TRANSMISIONES SERIALES SINCRONAS - MÓDULO SPI Otro de los módulos que posee esta familia de microcontroladores es el módulo SPI (Serial Peripheral Interface); consiste fundamentalmente en un sistema de comunicación serie síncrono de alta velocidad, el cual puede ser utilizado simplemente como un puerto bidireccional facilitando la comunicación entre diferentes dispositivos electrónicos. Cuando hablamos de un sistema de comunicaciones seriales sincronas debemos pensar que el sistema cuenta con una señal adicional a la de datos con la cual podemos llevar a cabo el proceso de envío y recepción de la información. De manera que un sistema FULL-DUPLEX de comunicación serial síncrona cuenta con las señales: MOSI (Master Output – Slave Input) MISO (Master Input – Slave Output) CLK (Clock). Cuando se desea establecer una comunicación entre dos dispositivos, el MCU permite seleccionar entre dos modos de funcionamiento: el modo maestro y el modo esclavo. Cuando se realizan redes de comunicaciones (entre dos o más dispositivos) solamente está permitida la existencia de un solo maestro, y los dispositivos restantes pertenecientes a la red serán configurados como esclavos. Se debe tener en cuenta que la potencia de la unidad llega al límite al permitir transmisiones full duplex (en ambos sentidos simultáneamente) entre un maestro y un esclavo. A partir de aquí, es posible realizar desde una simple comunicación unidireccional entre el MCU y un periférico hasta construir enlaces jerárquicos complejos entre MCUs y/o periféricos.
Descripción del funcionamiento dispositivo maestro Este sistema de comunicaciones se basa en un registro de corrimiento, el cual toma los datos en forma paralela y los transforma a serial, transmitiéndolos por la línea de MOSI y al mismo momento se transmite por la línea CLK la señal de reloj que realizará las funciones de sincronización. Como puede verse en la figura, cada vez que es transmitido uno de los bits, la señal de reloj está en una de sus transiciones. Un aspecto de importancia es que la transmisión de los datos siempre comienza con el bit menos significativo, pero esto no es un estándar y puede cambiar según el protocolo que se desea manejar; en el caso de los productos Freescale los datos siempre son enviados de esta manera. Otro rasgo a destacar es que el dispositivo maestro siempre será el encargado de generar la señal de reloj, y por lo regular los dispositivos maestros siempre son todos aquellos que realizan una transmisión o por lo menos inician con la sesión de enlace.
Descripción del funcionamiento dispositivo esclavo En este caso el dispositivo esclavo recibe la señal por la misma línea de MOSI y la señal de CLK, la cual, como se mencionó en la descripción del dispositivo maestro, lleva el control para poder saber en qué momento va recibiendo cada uno de los bits transmitidos. Nuevamente un registro de corrimiento se encarga de transformar los datos seriales recibidos en un dato paralelo. ALFAOMEGA - FREESCALE
312
JUAN CARLOS VESGA FERREIRA
Se puede hacer notar que pueden existir más de un dispositivo esclavo; para poder seleccionar a cuál de los dispositivos esclavos se desea hablar, el dispositivo maestro genera la señal de SS (slave select).
Protocolo utilizado en el módulo SPI Una de las cosas que se deben tener en cuenta a la hora de establecer una comunicación es el protocolo de comunicación a utilizar; cuando un dispositivo maestro desea enviar un mensaje a uno o varios esclavos debe proceder a realizar una selección de los mismos; de esta forma, al ser activado el esclavo, recibe el dato manteniendo el sincronismo gracias a una señal de reloj conjunta. Suele ocurrir que cuando un esclavo sea activado con el fin de recibir un dato, éste desee enviar una trama de respuesta al maestro, lo cual será posible mientras su línea de activación la mantenga el maestro, de modo que si es necesario la transmisión se efectuará simultáneamente en los dos sentidos (Full Duplex). Cuando se establece una comunicación entre dispositivos utilizando el módulo SPI, se pueden presentar cuatro líneas básicas asociadas a la unidad SPI mediante las cuales es posible establecer los diferentes enlaces:
MOSI (Master Out, Slave In) Esta es la línea por donde son enviados los datos desde el dispositivo maestro hacia los dispositivos esclavos; por tanto, será la señal de salida de datos de la unidad que funcione como maestro y la señal de entrada de datos para los esclavos.
MISO (Master In, Slave Out) A través de esta línea son enviados los datos que van desde algún dispositivo esclavo hacia un dispositivo maestro; de esta forma será una señal de entrada para el maestro y las respectivas salidas para los esclavos.
SCK (Serial Clock) Corresponde a la señal de reloj, la cual permite establecer el proceso de comunicación y sincronismo entre el dispositivo maestro y el esclavo.
MAESTRO
MOSI
MOSI
MISO
MISO
SCK
SCK
SS
SS
ESCLAVO
FIGURA 14.19 Comunicación de dos dispositivos mediante el módulo SPI.
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
313
SS (Slave Select) Está línea tiene una funcionalidad muy concreta, en los dispositivos esclavos permite la activación o no del respectivo dispositivo indicándole que recibirá información desde un dispositivo maestro. Cuando la unidad es configurada como dispositivo maestro, puede utilizarse para diferentes fines que se describirán posteriormente.
Cada dispositivo esclavo es seleccionado por un nivel lógico bajo (‘0’) a través de la línea (CS = Chip Select o SS Slave Select). Los datos son transferidos en bloques de 8 bits, en donde el bits más significativo (MSB) se transmite primero.
Una de las características que presenta este módulo SPI es que mediante software es posible seleccionar la velocidad de transmisión, la polaridad y la fase de la señal de reloj encargada del sincronismo permitiendo con ello la compatibilidad con diferentes dispositivos que permiten entrada serie directa como, por ejemplo: puertos, lcd, teclados, conversores A/D, entre otros. Otra de las ventajas que ofrece este módulo consiste en que la implementación de sistemas de comunicación basados en comunicaciones seriales síncronas es muy fácil de realizar, complementándose esto con el hecho de que es notable el ahorro de líneas de conexión que se genera en comparación con un puerto estándar, donde es necesario como mínimo el cableado del bus de datos. Cuando se desea activar los dispositivos SPI esclavos es necesario disponer de control sobre las líneas respectivas SS. Para establecer una comunicación del tipo MCU−MCU o simplemente MCU−periférico, este control se utiliza de una manera sencilla gracias a que es posible conectar directamente la línea SS del maestro trabajando como entrada/salida a la entrada de selección del esclavo; es decir, conectar simplemente las líneas SS.
Modos del reloj Como se había mencionado antes, la transferencia de datos es sincronizada por la línea de reloj de este bus en donde un bit es transferido por cada ciclo de reloj.
La mayoría de las interfaces SPI tienen 2 bits de configuración, llamados CPOL (Clock Polarity = polaridad de reloj) y CPHA (Clock Phase = reloj de fase). CPOL determina el estado o condición de la línea de transmisión en un momento dado; puede ser que se encuentre en el estado Idle (vacía o desocupada) o se encuentre ocupada.
ALFAOMEGA - FREESCALE
314
JUAN CARLOS VESGA FERREIRA
Existen cuatro modos de reloj definidos por el protocolo SPI, estos son: Modo A Modo B Modo C Modo D
SS (EN)
SCK
INICIO DE RELOJ
CPHA = 1 CPOL = 0 MODO A
LIBRE
DATOS MS Bit LEER
LEER
Modo A
SS (EN)
SCK
LEER
INICIO DE RELOJ
CPHA = 1 CPOL = 0 MODO B
LIBRE
DATOS MS Bit LEER
Modo B
LEER
LEER
ALFAOMEGA - FREESCALE
315
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
SS (EN)
SCK
INICIO DE RELOJ
CPHA = 1 CPOL = 0 MODO C
LIBRE
DATOS MS Bit LEER
LEER
Modo C SS (EN)
SCK
LEER
INICIO DE RELOJ
CPHA = 1 CPOL = 0 MODO B
LIBRE
DATOS MS Bit LEER
Modo D
LEER
LEER
FIGURA 14.20 Modos de reloj, protocolo SPI.
NOTA En general, se podría decir lo siguiente acerca del modo de comunicación serial síncrono: cuando se establece una comunicación entre dos dispositivos (un dispositivo maestro y un dispositivo esclavo) se utilizan tres líneas sobre las cuales son transmitidos los paquetes de información de 8 bits. Adicionalmente, cada dispositivo conectado al bus puede actuar como transmisor y receptor al mismo tiempo, por lo que este tipo de comunicación serial se conoce como comunicación full duplex, en donde dos de las tres líneas son las encargadas de transferir la información de cada uno de los dispositivos (una en cada dirección) y la tercera línea es la que se encarga de transportar la señal de reloj para mantener el sincronismo de comunicación entre los dos dispositivos lográndose con ello una mayor confiabilidad en el proceso de comunicación, en comparación con otros modos de transmisión.
ALFAOMEGA - FREESCALE
316
JUAN CARLOS VESGA FERREIRA
En la siguiente figura se ilustra un ejemplo claro de cómo se deben conectar las diferentes líneas de comunicación entre los dispositivos que conforman una red basados en el módulo SPI, teniendo en cuenta que un solo dispositivo se encuentra configurado en modo maestro mientras que todos los demás están configurados como modo esclavo.
ESCLAVO 1 SCLK MOSI MISO /SS1 /SS2
ESCLAVO 2
/SS3 MAESTRO
ESCLAVO 3
MÓDULO INTERFACE SERIAL PERIFÉRICA SPI MODULO INTERFACE DE COMUNICACIÓN SERIAL SCI
FIGURA 14.21
SS MISO MOSI SPSCK RxD TxD
PORT B
PTB7/SCL/EXTAL PTB6/SCL/XTAL
PTB5/TPMCH1/SS PTB4/MISO PTB3/KBIP7/MOSI/ADP7 PTB2/KBIP6/SPSCK/ADP6 PTB1/KBIP5/TxD/ADP5 PTB0/KBIP4/RxD/ADP4
Modelos interfaces Seriales SPI, SCI. ALFAOMEGA - FREESCALE
317
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
Características del módulo SPI Operación en modo maestro o modo esclavo. Opción para Full-Duplex o Single Wire bidireccional. Velocidad de transmisión programable. Posee doble buffer (uno para transmisión y otro para recepción). Configuración de fase y polaridad del reloj. Selección de desplazamiento de registro para transmisión comenzando por el bit más significativo (MSB) o por el menos significativo (LSB). Otras características adicionales que pueden ser consultadas en el Manual de referencia, que harán de este módulo una herramienta valiosa y útil a la hora de desarrollar aplicaciones basadas en comunicaciones seriales síncronas. Como se puede observar en la figura, cuando se quiere transferir un dato (8 bits) desde un dispositivo maestro hacia un dispositivo esclavo, éste inicializa su transferencia tomando como punto de partida el bit más significativo, comenzando la transferencia de datos a través del pin MOSI; a su vez, el dispositivo esclavo a medida que va recibiendo los bits, los va desplazando y retornando al dispositivo maestro a través del pin MISO. Este desplazamiento va trabajando de la mano con el sincronismo establecido entre los dos dispositivos utilizando una señal de reloj a través del pin SPSCK. Adicionalmente, el pin SS es utilizado como pin de selección de dispositivos esclavos; cuando el dispositivo maestro desea establecer una comunicación con un dispositivo esclavo, coloca un nivel lógico “0” a través de este pin, provocando con ello que el dispositivo que lo recibe adopte la condición de esclavo y quede a la espera de iniciar la comunicación.
DISPOSITIVO MAESTRO
DISPOSITIVO ESCLAVO MOSI
MOSI
REGISTRO DE DESPLAZAMIENTO SPI 7
6
5
4
3
2
1 0
GENERADOR DE RELOJ
FIGURA 14.22 Conexiones del sistema SPI.
ALFAOMEGA - FREESCALE
REGISTRO DE DESPLAZAMIENTO SPI MISO
MISO
SPSCK
SPSCK
SS
SS
7
6
5
4
3
2
1 0
SPI Control Register 1 (SPIC1). Este registro permite configurar el módulo de SPI, habilita las
interrupciones
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
SPIE
SPE
SPTIE
MSTR
CPOL
CPHA
SSOE
LSBFE
Leer Escribir
SPIE: A través de este bit se habilita o no la interrupción del módulo SPI que indica cuándo se encuentra lleno el buffer de recepción. 1: Habilita las interrupciones del SPI. 0: Deshabilita las interrupciones del SPI.
SPE: Permite activar o no el sistema de comunicación serial; en caso de deshabilitar el módulo cuando se encuentra en progreso una transmisión, el buffer es borrado y se reinicia el sistema del módulo. 1: Activa el módulo SPI. 0: Desactiva el módulo SPI.
SPTIE: Habilita la interrupción de transmisión a través del módulo SPI, la cual se encarga de indicar que
ha ocurrido interrupción cuando el buffer de transmisión ha quedado vacío, es decir, que el dato que se encontraba cargado en el buffer de transmisión ha sido enviado totalmente. 0: Deshabilita la interrupción 1: Habilita la interrupción
MSTR: Modo de selección maestro o esclavo 0: El módulo SPI es configurado como esclavo 1: El módulo SPI es configurado como maestro
CPOL: Polaridad del reloj. Este bit realiza un cambio en la señal de reloj invirtiendo su polaridad, lo cual da como resultado que los pulsos que antes presentaban un estado lógico alto ahora presentan un estado lógico bajo y viceversa. 0: Reloj SPI activo alto (flanco descendente) 1: Reloj SPI activo bajo (flanco ascendente)
CPHA: Fase del reloj. Este bit permite seleccionar uno de los dos métodos de fase posibles en un proceso de comunicación.
0: El primer flanco de reloj ocurre en la mitad del primer ciclo de una transferencia de datos de 8 bits. 1: El primer flanco de reloj ocurre al inicio del primer ciclo de una transferencia de datos de 8 bits.
SSOE. Habilita la señal de Slave Select (SS). LSBFE. Configura el orden de transmisión de los datos en 0 MSB, en 1 LSB.
SPI Control Register 2 (SPIC2)
Leer
Bit 7
Bit 6
Bit 5
0
0
0
Escribir
Bit 4
Bit 3
Bit 2
MODFEN
BIDIROE
Bit 1
Bit 0
SPISWAI
SPCO
0
MODFEN. Master Mode - Fault Function Enable. En la siguiente tabla se muestra en mayor a
detalle el funcionamiento de este bit.
MODFEN
SSOE
MODO MAESTRO
MODO ESCLAVO
0
0
I/O de propósito general (no SPI)
Selección de entrada esclava
0
1
I/O de propósito general (no SPI)
Selección de entrada esclava
1
0
Entrada SS modo defecto
Selección de entrada esclava
1
1
Salida SS modo automático
Selección de entrada esclava
BIDIROE. (Bidirectional Mode Output Enable). SPIWAI. SPI (Stop in Wait Mode). SPC0. SPI Enable. Habilitador del módulo de SPI. SPI Baud Rate Register (SPIBR) Bit 7 Leer Escribir
Bit 6
Bit 5
Bit 4
SPPR2
SPPR1
SPPR0
0
Bit 3
Bit 2
Bit 1
Bit 0
SPP2
SPP1
SPP0
0
SPPR2:SPPR1:SPPR0
DIVISOR PREESCALADOR
0:0:0
1
0:0:1
2
0:1:0
3
0:1:1
4
1:0:0
5
1:0:1
6
1:1:0
7
1:1:1
8
320
JUAN CARLOS VESGA FERREIRA
SPR2:SPR1:SPR0
RAZÓN DEL DIVISOR
0:0:0
2
0:0:1
4
0:1:0
8
0:1:1
16
1:0:0
32
1:0:1
64
1:1:0
128
1:1:1
256
SPI Status Register SPIS
Leer
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
SPRF
0
SPTEF
MODF
0
0
0
0
Escribir
SPRF: Este bit indica cuándo se ha completado una transmisión y el dato recibido puede ser leído del buffer de recepción.
0: Recepción no completada 1: Recepción completa; puede ser leída la información desde el buffer
SPTEF: Este bit indica cuándo el buffer de transmisión se encuentra ocupado o vacío. 0: Buffer de transmisión no vacío 1: Buffer de transmisión vacío
MODF: Mode Fault. 1= Se pone a uno cuando un MCU trabajando como maestro ha querido ser seleccionado como si éste fuera esclavo. 0= Se pone a cero realizando una lectura del registro seguido de un acceso al registro de datos.
SPI Data Register (SPID). Registro de datos. Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
R7
R6
R5
R4
R3
R2
R1
R0
Leer Escribir
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
321
Este registro es el utilizado para transmitir o recibir datos del bus serie que conforma el SPI. Una escritura en este registro cuando previamente se ha configurado el sistema como maestro iniciará una transferencia de un byte. De la misma manera, las unidades configuradas como esclavas podrán leer los datos recibidos en sus respectivos registros.
Ejercicio Este ejemplo muestra un driver para SPI. Código. #include “SPI.h” unsigned char *SPITxPuntero; unsigned char SPIRxBuffer[8]; unsigned char u8SPIRxContador; unsigned char u8SPITxContador; unsigned char u8SPIRxStatus; /* ### Codigo de Inicialización del SPI ### */ void InitSPI(void) { /* SPIC1: SPIE=0,SPE=0,SPTIE=0,MSTR=0,CPOL=0,CPHA=0,SSOE=0,LSBFE=0 */ SPIC1 = 0xF0; /* SPIC2: MODFEN=0,BIDIROE=0,SPISWAI=0,SPC0=0 */ SPIC2 = 0x00; /* SPIBR: SPPR2=0,SPPR1=1,SPPR0=1,SPR2=0,SPR1=0,SPR0=0 */ SPIBR = 0x30; /* Lectura DUMMY del registro de banderas */ (void)(SPIS == 0); /* SPIC1: SPIE=1,SPE=1,SPTIE=1,MSTR=1,CPOL=0,CPHA=0,SSOE=0,LSBFE=0 */ SPIC1 = 0xF0; } /* ### Función de Transmisión de un Byte ### */ void SPI_Transmite_Byte(unsigned char Data) { ALFAOMEGA - FREESCALE
322
JUAN CARLOS VESGA FERREIRA
SPID = Data; u8SPITxContador = 0; SPIC1 |= 0x20; } /* ### Función de Transmisión de una Cadena de Datos ### */ void SPI_Transmite_Mensaje(unsigned char *MensajePuntero, unsigned char Tamano) { SPITxPuntero = MensajePuntero; u8SPITxContador = Tamano - 1; SPID = *SPITxPuntero++; SPIC1 |= 0x20; } /* ### Rutina de Servicio para la Interrupción de datos ### */ __interrupt void SPI_ISR(void) { /*En caso de Recepción */ if (SPIS & 0x80) { SPIRxBuffer[u8SPIRxContador++] = SPID; if (u8SPIRxContador == sizeof(SPIRxBuffer)) { u8SPIRxContador = 0; } } /*En caso de Transmisión */ if (SPIS & 0x20) { if (u8SPITxContador) { SPID = *SPITxPuntero; SPITxPuntero++; u8SPITxContador--; } else { SPIC1 &= ~0x20; /* Clear SPTIE Bit, Tx Interrupt Disabled*/ } } } ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
323
14.9 MÓDULO I2C (INTER – INTEGRATED CIRCUIT) Introducción El bus I2C es uno de los buses de comunicación más útiles y versátiles inventados hasta el momento, debido a su poca complejidad a nivel circuital y su eficiencia en el proceso de comunicación con otros dispositivos que comparten la misma infraestructura de comunicación, favoreciendo así la creación de redes de sensores y dispositivos de control; tecnología que actualmente se encuentra en auge en el ámbito industrial. Philips Semiconductors inventó el bus de dos alambres al que llamó I2C para comunicación entre circuitos integrados en 1980, y desde entonces se ha convertido en el bus serial estándar, implementado en un gran número de circuitos integrados y con licencias otorgadas a más de 50 compañías con un total de 1000 dispositivos compatibles I2C en el mercado mundial. La velocidad de transmisión originalmente especificada para establecer un proceso de comunicación entre dos o más dispositivos es de 100 kbits/s en donde el objetivo inicial era realizar transmisión de señales para control simple y monitoreo de variables que no requieran supervisión constante, brindando con ello un bajo costo de implementación, facilidad de instalación y configuración y versatilidad técnica asegurando de esta manera un crecimiento y aceptación dentro de los estándares popularmente utilizados. El bus serial I2C ha sido extendido para soportar velocidades de hasta 3.4 Mbits/s, combinado con una función de desplazamiento del nivel de voltaje, en modo High-speed (Hs-mode) ofreciendo una solución ideal para los sistemas que utilizan diferentes estándares de comunicación, donde las altas velocidades y la variedad de voltajes (5 V, 3 V o menor) son comúnmente utilizados. El nuevo modo de configuración I2C (Hs) es compatible con todos los sistemas existentes del bus I2C, incluyendo el estándar original (S-mode) y el modo Fast (F-mode), actualización introducida al mercado en 1992, alcanzando velocidades de transmisión de hasta 400 kbits/s. Para desarrollar aplicaciones que integren los diferentes modos I2C pueden ser conectados fácilmente de manera simultánea; así como en sistemas de redes de computadores, hay equipos que funcionan a velocidades de 10 Mbps (Ethernet), los cuales se conectan a dispositivos concentradores que pueden manejar velocidades superiores de hasta 100 Mbps (Fast Ethernet) y estos a su vez pueden conectarse a dispositivos concentradores con una mayor velocidad (Gigabit-Ethernet), debido a que deben soportar un mayor tráfico; así sucede con las redes utilizando el bus I2C, en donde los equipos de menor velocidad utilizarán S-mode (Standard Mode); estos son concentrados por dispositivos que manejen una mayor velocidad (F-mode o Fast Mode) y finalmente estos últimos, concentrados mediante dispositivos que utilicen el modo (Hs-mode o High Speed Mode). Philips fue el inventor del bus Inter-IC o I2C hace más de 20 años, y actualmente debido al éxito obtenido por este protocolo de comunicación se encuentra firmemente establecido como la solución mundial para aplicaciones integradas. Debido a esto se ha incluido un módulo de comunicación I2C en una gran variedad de microcontroladores, facilitando con ello la creación de aplicaciones de telecomunicaciones, control, diagnóstico, monitoreo y administración de señales en diferentes campos como el industrial, el médico y el de telecomunicaciones. El bus I2C es un estándar que facilita la comunicación entre microcontroladores, memorias y otros dispositivos con cierto nivel de “inteligencia”, requiriendo sólo dos líneas para manejo de señales (datos y sincronismo) y una tercera línea como nivel de referencia o tierra. La metodología de comunicación de datos ALFAOMEGA - FREESCALE
324
JUAN CARLOS VESGA FERREIRA
del bus I2C es en serie y sincrónica. Una de las señales del bus marca el tiempo (pulsos de reloj) y la otra se utiliza para intercambiar datos.
Especificaciones I2C Tal como se mencionó antes, actualmente este poderoso estándar ha sido incorporado como módulo extra en una gran variedad de microcontroladores; en nuestro caso, el módulo se encuentra en las referencias MC9S08GB y MC9S08GT, orientado a las aplicaciones de 8-bits, en donde básicamente los criterios que se deben establecer son los siguientes: Un sistema consiste en al menos un microcontrolador y varios sistemas periféricos como memorias, conversores A/D, relojes de tiempo real, entre otros dispositivos que utilicen el bus I2C como protocolo de comunicación. El costo de conexión entre los diferentes dispositivos dentro del sistema debe ser el mínimo. El sistema que utilice este bus no requerirá una alta tasa de transferencia de información. La eficiencia del sistema dependerá de la correcta selección, manipulación e interconexión de los diferentes dispositivos en la estructura del bus.
Conceptos generales del bus I2C El bus I2C soporta cualquier tipo de componente (NMOS, CMOS, bipolar, etc.); está constituido por dos hilos físicos, uno de datos (SDA) y otro de reloj (SCL) utilizado para el sincronismo, debido a que, como se mencionó anteriormente, la comunicación es serial sincrónica, transportando la información entre los diferentes dispositivos que se encuentran conectados al bus de comunicación. En conclusión, en este bus se pueden encontrar las siguientes señales: SDA (System Data) por la cual viajan los datos entre los dispositivos. SCL (System Clock) por la cual transitan los pulsos de reloj que sincronizan el sistema. GND (Nivel de referencia o tierra) Interconectada entre todos los dispositivos “conectados” al bus, es decir, comparten la misma tierra o nivel de referencia. Las líneas SDA y SCL son del tipo drenador abierto, es decir, un estado similar al de colector abierto, pero asociadas a un transistor de efecto de campo (o FET). Se deben polarizar en estado alto (conectándose a la alimentación por medio de resistores “pull-up”), lo que define una estructura de bus que permite conectar en paralelo múltiples entradas y salidas. Tanto la línea de datos (SDA) como la señal de reloj (SCL) son bidireccionales.
ALFAOMEGA - FREESCALE
325
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
+5V
R
R
Dispositivo 1
Dispositivo 2
Dispositivo 2
SCL SDA
FIGURA 14.23 Conexión de dispositivos al bus I2C.
El diagrama anterior ilustra de una manera muy clara la forma de conexión de los dispositivos que conforman la red y forma de polarización de las líneas de comunicación. Cuando ningún dispositivo se encuentra transmitiendo, las dos líneas del bus están en un nivel lógico alto indicando un estado inactivo, de lo contrario tomarán los valores respectivos en un momento dado de comunicación. En principio, el número de dispositivos que se puede conectar al bus no tiene límites, aunque hay que tener en cuenta que la capacitancia máxima sumada de todos los dispositivos no supere 400 pF. El valor de las resistencias de polarización no es muy crítico, y puede ir desde 1.8 k (1.800 ohmios) a 47 k (47.000 ohmios). Cuando se utiliza un valor pequeño de resistencia se incrementa el consumo de los integrados pero disminuye la sensibilidad al ruido y mejora el tiempo de los flancos de subida y bajada de las señales; por esta razón los valores recomendados más comunes en polarización de las líneas de comunicación (SDA y SCL) son entre 1.8 k y 10 k. Se debe tener en cuenta que el valor máximo permitido a nivel de tensión para representar un “0” lógico será 1.5 V y el valor mínimo permitido a nivel de tensión para representar un “1” lógico será 3.0 V, valores que serán válidos en ambas líneas de comunicación (SDA y SCL). Cada dispositivo es reconocido por una única dirección (si es un microcontrolador, LCD, memoria o teclado) y puede operar cualquiera como transmisor o emisor de datos, dependiendo de la función del dispositivo. Un display es sólo un receptor de datos, mientras que una memoria recibe y transmite datos. En función de que el dispositivo envíe o reciba datos se debe considerar los dispositivos como maestros (Master) o esclavos (Slaves). A continuación se describe la terminología utilizada en las diferentes configuraciones de dispositivos según su condición en la red I2C.
ALFAOMEGA - FREESCALE
326
JUAN CARLOS VESGA FERREIRA
Terminología básica del bus I2C Términos
Descripción
Transmisor
El dispositivo que envía datos al bus
Receptor
El dispositivo que recibe datos desde el bus
Master (maestro)
El dispositivo que inicia una transferencia, genera las señales del reloj y termina un envío de datos
Slave (esclavo)
El dispositivo direccionado por un master
Multi-Master
Más de un master puede controlar el bus al mismo tiempo sin corrupción de los mensajes
Arbitraje
Procedimiento que asegura que si uno o más masters simultáneamente deciden controlar el bus, sólo a uno se le permite controlarlo y el mensaje saliente no es deteriorado
Sincronización
Procedimiento para sincronizar las señales del reloj de dos o más dispositivos
Generalidades Los masters son generalmente microcontroladores, por lo que un microcontrolador puede ser unas veces master y otras slave. La posibilidad de conectar más de un microcontrolador al bus significa que uno o más microcontroladores pueden iniciar el envío de datos al mismo tiempo. Para prevenir el caos que esto ocasionaría se ha desarrollado un sistema de arbitraje. Si uno o más dispositivos con configuración “master” intentan colocar información en el bus, es la señal del reloj si está en “1” o “0” lo que determina los derechos de arbitraje. La generación de señales de reloj (SCL) es siempre responsabilidad de los dispositivos master; cada master genera su propia señal de reloj cuando envía datos al bus; las señales de reloj de un master sólo pueden ser alteradas cuando la línea de reloj sufre una caída por un dispositivo esclavo o por el dominio del control del bus por el arbitraje de otro microcontrolador. Se debe tener en cuenta que todos los dispositivos conectados al bus deben ser de colector abierto o drenaje abierto y que durante el tiempo en que no hay transferencia de datos (tiempo inactivo), tanto la línea del reloj (SCL) como la línea de datos (SDA) tomarán un valor “1” lógico o +5 V a través de resistencias externas pull-up conectadas a ellas; y que la única limitación en la conexión de dispositivos al bus depende de la capacitancia máxima, que no puede superar 400 pF. A continuación se ilustran los tipos de transferencia de datos que se pueden presentar en el bus I2C, dependiendo del modo de configuración: Modo estándar, aproximadamente a 100 kbits/s. Modo rápido, aproximadamente a 400 kbits/s. Modo alta velocidad, más de 3,4 Mbits/s. Anteriormente se mencionó la terminología utilizada en cuanto a la configuración de los dispositivos en un momento dado dentro de la red I2C; a continuación se presenta la terminología según los estados de comunicación propiamente dichos; las definiciones o términos utilizados en relación con las funciones del bus I2C son las siguientes: ALFAOMEGA - FREESCALE
327
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
maestro (Master). Dispositivo que determina la temporización y la dirección del tráfico de datos en el bus. Es el único que aplica los pulsos de reloj en la línea SCL. Cuando se conectan varios dispositivos maestros a un mismo bus, la configuración obtenida se denomina “multi-maestro”. esclavo (Slave). Cualquier dispositivo conectado al bus, incapaz de generar pulsos de reloj. Reciben señales de comando y de reloj, provenientes del dispositivo maestro. Bus desocupado (Bus Free). Estado en el cual ambas líneas (SDA y SCL) están inactivas, presentando un estado lógico alto. Únicamente en este momento es cuando un dispositivo maestro puede comenzar a hacer uso del bus. Comienzo (Start). Ocurre cuando un dispositivo maestro hace ocupación del bus, generando esta condición. La línea de datos (SDA) toma un estado bajo mientras que la línea de reloj (SCL) permanece alta.
Secuencia de inicio SDA SCL
Parada (Stop). Un dispositivo maestro puede generar esta condición dejando libre el bus. La línea de datos toma un estado lógico alto mientras la de reloj permanece también en ese estado.
Secuencia de parada SDA SCL
Dato válido (Valid Data). Sucede cuando un dato presente en la línea SDA es estable mientras la línea SCL está a nivel lógico alto. Formato de datos (Data Format). La transmisión de datos a través de este bus consta de 8 bits de datos (o 1 byte). A cada byte le sigue un noveno pulso de reloj durante el cual el dispositivo receptor del byte debe generar un pulso de reconocimiento, conocido como ACK (del inglés Acknowledge). Esto se logra situando la línea de datos a un nivel lógico bajo mientras transcurre el noveno pulso de reloj. ALFAOMEGA - FREESCALE
328
JUAN CARLOS VESGA FERREIRA
Dirección (Address). Cada dispositivo diseñado para funcionar en este bus dispone de su propia y única dirección de acceso, que viene preestablecida por el fabricante. Hay dispositivos que permiten establecer externamente parte de la dirección de acceso. Esto permite que una serie del mismo tipo de dispositivos se puedan conectar en un mismo bus sin problemas de identificación. La dirección 00 es la denominada “de acceso general”, por la cual responden todos los dispositivos conectados al bus, tal como ocurre en el caso de las redes de computadores, donde la dirección con la cual todos los dispositivos conectados reciben la misma información se denomina Broadcast. Lectura/escritura (Bit R/W). Cada dispositivo dispone de una dirección de 7 bits. El octavo bit (el menos significativo o LSB) enviado durante la operación de direccionamiento corresponde al bit que indica el tipo de operación a realizar. Si este bit es alto, el dispositivo maestro lee información proveniente de un dispositivo esclavo. En cambio, si el bit fuese bajo el dispositivo maestro escribe información en un dispositivo esclavo.
Protocolo de comunicación del bus I2C Cuando se tiene una red constituida por varios dispositivos conectados sobre el bus I2C, es lógico que para establecer una comunicación a través de él se deba respetar un protocolo o lenguaje de comunicación. A continuación se describen los pasos a seguir para establecer una comunicación entre dos o más dispositivos existentes en una red I2C. En primer lugar, existen dispositivos maestros y dispositivos esclavos. Se debe tener muy claro que sólo los dispositivos maestros pueden iniciar una comunicación. La condición inicial, de bus libre, es cuando ambas señales están en estado lógico alto. En este estado cualquier dispositivo maestro puede ocuparlo, estableciendo la condición de inicio (start). Esta condición se presenta cuando un dispositivo maestro pone en estado bajo la línea de datos (SDA), pero dejando en alto la línea de reloj (SCL). Para establecer una comunicación entre un dispositivo maestro y uno esclavo, el dispositivo maestro transmite un primer byte luego de la condición de inicio; este byte contiene siete bits que componen la dirección del dispositivo que se desea seleccionar para entablar la comunicación, y un octavo bit que corresponde a la operación que se quiere realizar con él (lectura o escritura). Si al enviar este primer byte y el dispositivo cuya dirección corresponde a la que se indica en los siete bits (A0-A6) está presente en el bus, éste contesta con un bit en bajo por la misma línea de datos (SDA), ubicado inmediatamente luego del octavo bit que ha enviado el dispositivo maestro. Este bit se conoce como bit de reconocimiento (ACK) en bajo; le indica al dispositivo maestro que el esclavo reconoce la solicitud y está en condiciones de comunicarse. Aquí la comunicación se establece en firme y comienza el intercambio de información entre los dispositivos.
SDA
A6
A5
A4
A3
A2
A1
A0
RW
ACK
3
4
5
6
7
8
9
SCL
1
2
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
329
Si el bit de lectura/escritura (R/W) fue puesto en esta comunicación a nivel lógico bajo (escritura), el dispositivo maestro envía datos al dispositivo esclavo. Esto se mantiene mientras continúe recibiendo señales de reconocimiento, y el contacto concluye cuando se hayan transmitido todos los datos. En el caso contrario, cuando el bit de lectura/escritura estaba a nivel lógico alto (lectura), el dispositivo maestro genera pulsos de reloj para que el dispositivo esclavo pueda enviar los datos. Luego de cada byte recibido el dispositivo maestro (el que está recibiendo los datos) genera un pulso de reconocimiento. El dispositivo maestro puede dejar libre el bus generando una condición de parada (o detención; stop en inglés). Si se desea seguir transmitiendo, el dispositivo maestro puede generar otra condición de inicio en vez de una condición de parada. Esta nueva condición de inicio se denomina “inicio reiterado” y se puede emplear para direccionar un dispositivo esclavo diferente o para alterar el estado del bit de lectura/escritura. En resumen, se podría decir que cuando el dispositivo maestro quiere comunicarse con un esclavo, produce una secuencia de inicio en el bus. La secuencia de inicio es una de las dos secuencias especiales que se han definido anteriormente en el bus I2C; la otra es la secuencia de parada. Las secuencias de inicio y de parada son especiales porque son los dos únicos casos en que se permite que la línea de datos (SDA) cambie cuando la línea de reloj (SCL) está alta. Se debe tener muy claro que cuando se están transmitiendo datos, la línea SDA debe permanecer estable, y jamás cambiar, mientras la línea SCL está alta. Las secuencias de inicio y de parada señalan el comienzo y el final de una transacción con los dispositivos esclavos. Los datos se transfieren en secuencias de 8 bits. Estos bits se colocan en la línea SDA comenzando por el bit de más peso (o más significativo). Una vez puesto un bit en SDA, se lleva la línea SCL a alto. Se debe recordar que el dispositivo maestro no puede llevar la línea a un estado alto; en realidad, lo que hace es “liberar la línea”, y el que se encarga de establecer un nivel alto en la línea es la resistencia de Pull-Up. Por cada 8 bits que se transfieren, el dispositivo que recibe el dato envía de regreso un bit de reconocimiento, de modo que en realidad por cada byte de información enviada se producen 9 pulsos sobre la línea SCL (es decir, 9 pulsos de reloj por cada 8 bits de datos). Si el dispositivo que recibe envía un bit de reconocimiento bajo indica que ha recibido el dato y que está listo para aceptar otro byte, por el contrario, si retorna un nivel alto, lo que indica es que el dispositivo esclavo no puede recibir más datos y el dispositivo maestro deberá terminar la transferencia enviando una secuencia de parada. Lo más común en los dispositivos para el bus I2C es que utilicen direcciones de 7 bits, aunque existen dispositivos de 10 bits. Este último caso es raro. Una dirección de 7 bits implica que se pueden colocar hasta 128 dispositivos sobre un bus I2C, ya que un número de 7 bits puede ir desde 0 a 127. El direccionamiento de 10 bits permite usar hasta 1024 direcciones; esto no cambia el formato de direcciones definido en la especificación del bus I2C, usando direcciones reservadas en la especificación existente. El direccionamiento a 10-bit no afecta el direccionamiento existente de 7 bits, permitiendo que los dispositivos con direcciones de 7 o 10 bits puedan ser conectados al mismo bus I2C, y ambos tipos de dispositivos pueden emplearse en sistemas con modos Standard, Fast o High-speed. Cuando se envían las direcciones de 7 bit, de cualquier modo la transmisión es de 8 bits. El bit extra se utiliza para informarle al dispositivo esclavo si el dispositivo maestro va a escribir o va a leer datos desde él. Si el bit de lectura/escritura (R/W) es cero, el dispositivo maestro está escribiendo en el esclavo. Si el bit es 1, el maestro está leyendo desde el esclavo. La dirección de 7 bits se coloca en los 7 bits más significativos del byte y el bit de lectura/escritura es el bit menos significativo.
ALFAOMEGA - FREESCALE
330
JUAN CARLOS VESGA FERREIRA
El hecho de colocar la dirección de 7 bits en los 7 bits más significativos del byte produce confusiones entre quienes comienzan a trabajar con este bus. Si, por ejemplo, se desea escribir en la dirección 27 (hexadecimal), en realidad se debe enviar un 54, que es un 27 desplazado un bit hacia la izquierda o posiciones de más peso. También se pueden tomar las direcciones del bus I2C como direcciones de 8 bits, en las que las pares son de sólo escritura y las impares son de sólo lectura. Para dar un ejemplo, un dispositivo cualquiera que posea fijado en fábrica en la dirección 0xF0 ($F0). La dirección 0xF0 se utiliza para escribir en él y la dirección 0xF1 es para leer de él.
Protocolo de programación para el bus I2C Lo primero que ocurre en un bus I2C es que el dispositivo maestro envía una secuencia de inicio. Esto alerta a los dispositivos esclavos, indicándoles que deben estar a la espera de una transacción. Estos quedan atentos para ver si se trata de una solicitud para ellos. A continuación el dispositivo maestro envía la dirección de dispositivo. El dispositivo esclavo que posee esa dirección continuará con la transacción, y los otros ignorarán el resto de los intercambios, esperando la próxima secuencia de inicio. Cuando se ha establecido comunicación con el dispositivo esclavo de interés, lo que debe hacer ahora el dispositivo maestro es enviar la ubicación interna o número de registro desde el que desea leer o al que va a escribir. La cantidad depende, obviamente, de qué dispositivo es y de cuántos registros internos posee. Algunos dispositivos muy simples no tienen ninguno, pero la mayoría sí los tienen. Por ejemplo, si se tiene un dispositivo que posee 16 ubicaciones internas, éstas estarán enumeradas desde la posición 0 a 15. Cuando el dispositivo maestro ha enviado la dirección del dispositivo en el bus I2C y la dirección del registro interno del dispositivo, puede comenzar a enviar los respectivos bytes de datos que desee transmitir; el dispositivo maestro puede seguir enviando bytes al esclavo, que normalmente serán almacenados en registros con direcciones sucesivas, debido a que el esclavo incrementa automáticamente la dirección del registro interno después de recibir cada byte; cuando el dispositivo maestro ha terminado de escribir datos en el dispositivo esclavo, envía una secuencia de parada que concluye la transacción. El procedimiento para escribir datos en un dispositivo esclavo tiene los siguientes pasos: 1. Enviar una secuencia de inicio. 2. Enviar la dirección de dispositivo con el bit de lectura/escritura en bajo. 3. Enviar el número de registro interno en el que se desea escribir. 4. Enviar el byte de dato. 5. [Opcionalmente, enviar más bytes de dato]. 6. Enviar la secuencia de parada.
Ejemplo Se tiene un dispositivo esclavo que presenta una dirección de bus establecida de fábrica de 0xF0 y se desea enviarle desde un dispositivo maestro el valor 0x21 que corresponde a una orden establecida en su menú interno de funciones, el cual deberá ser almacenado en el registro ubicado en la dirección interna 0x01. La secuencia de señalización y transmisión de datos es la siguiente: 1. Enviar una secuencia de inicio. 2. Enviar 0xF0 (la dirección de dispositivo esclavo con el bit de lectura/escritura en bajo). ALFAOMEGA - FREESCALE
331
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
3. Enviar 0x01 (dirección interna del registro de comando). 4. Enviar 0x21 (valor a transmitir desde el dispositivo maestro). 5. Enviar la secuencia de parada. En conclusión, la secuencia de transmisión de datos desde un dispositivo maestro a un dispositivo esclavo será tal como se ilustra en la figura.
S
Dirección de Esclavo
R/W
A
DATO
A
DATO
A
De Maestro a Esclavo
A
ACK de Reconocimiento
De Esclavo a Maestro
S
Condición de Arranque
P
Condición de Parada
P
FIGURA 14.24 Secuencia de lectura de datos desde un dispositivo esclavo.
Lectura desde un dispositivo esclavo Cuando se desea leer datos desde un dispositivo esclavo, primero se debe informar desde cuál de sus direcciones internas se va a leer, de manera que una lectura desde un dispositivo esclavo en realidad comienza con una operación de escritura en él; con base en lo anterior, se debe enviar la secuencia de inicio, la dirección de dispositivo con el bit de lectura/escritura en bajo y el registro interno desde el que se desea leer; posteriormente se envía otra secuencia de inicio nuevamente con la dirección de dispositivo, pero esta vez con el bit de lectura/escritura en alto, quedando lista la configuración de lectura de bytes desde el dispositivo esclavo, los cuales serán leídos de manera secuencial a partir de la dirección inicial preestablecida de lectura, culminando el proceso de lectura con una secuencia de parada. El procedimiento para leer datos desde un dispositivo esclavo tiene los siguientes pasos: 1. Enviar una secuencia de inicio. 2. Enviar la dirección de dispositivo con el bit de lectura/escritura en bajo. 3. Enviar el número de registro interno en el que se desea escribir. 4. Enviar una secuencia de inicio (inicio reiterado). 5. Enviar la dirección de dispositivo con el bit de lectura/escritura en alto. 6. Leer el byte de dato. 5. [Opcionalmente, leer más bytes de dato]. 6. Enviar la secuencia de parada.
ALFAOMEGA - FREESCALE
332
JUAN CARLOS VESGA FERREIRA
Ejemplo Se tiene un dispositivo esclavo que presenta una dirección de bus establecida de fábrica de 0xF0 y se desea leer desde un dispositivo esclavo el valor almacenado en el registro ubicado en la dirección interna 0x01. La secuencia de señalización y transmisión de datos es la siguiente: 1. Enviar una secuencia de inicio. 2. Enviar 0xF0 (la dirección de dispositivo esclavo con el bit de lectura/escritura en bajo). 3. Enviar 0x01 (dirección interna del registro a leer). 4. Enviar una secuencia de inicio (inicio reiterado). 5. Enviar 0xF1 (la dirección de dispositivo esclavo con el bit de lectura/escritura en alto). 6. Leer un byte de dato desde el dispositivo esclavo. 7. Enviar la secuencia de parada. La secuencia se verá así: Bit de Inicio
Dirección del Dispositivo Esclavo 0xF0 A7
A6
A5
A4
1
2
3
4
A3 5
A2 6
A1 RW 7
8
ACK D7 9
1
D6 2
Dirección del Dispositivo Esclavo 0xF0 con el bit menos significativo en 1 A7
A6
A5
A4
1
2
3
4
A3
A2
A1 RW
5
6
7
8
Bit de Inicio Repetido
Escribir número del Registro a Leer D5 3
D4 4
5
D3 D2 6
7
D1 8
D0 ACK 9
Bit de Parada
Leer uno o más Registros
ACK D7 9
1
D6
D5
2
3
D4 4
D3 D2 5
6
D1 7
D0 ACK 8
9
En conclusión, la secuencia de lectura de datos desde un dispositivo esclavo será tal como se ilustra en la figura:
S
Dirección de Esclavo
R/W
A
DATO
A
DATO
A
P
De Maestro a Esclavo
A
ACK de Reconocimiento
De Esclavo a Maestro
S
Condición de Arranque
P
Condición de Parada
FIGURA 14.25 Secuencia de transmisión de datos desde un dispositivo maestro a un dispositivo esclavo. ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
333
Comunicaciones avanzadas utilizando el bus I2C Hasta el momento se han explicado las formas de establecer una comunicación sencilla utilizando el bus I2C; sin embargo, esto no siempre es así debido a que se pueden presentar complicaciones en el proceso de comunicación con dispositivos que tengan que realizar tareas diferentes a la de comunicación. Si un dispositivo maestro está leyendo información desde un dispositivo esclavo, quien establece los datos en la línea SDA del bus es el dispositivo esclavo, y el dispositivo maestro es el que controla el pulso de reloj. ¿Qué sucede si el dispositivo esclavo no está listo para enviar un dato? Con dispositivos esclavos como una EEPROM o un conversor A/D esto no sería problema, pero si el dispositivo esclavo es un microprocesador o un microcontrolador, el cual tiene otras funciones que realizar, pueden surgir inconvenientes. En el caso eventual de que se presente la situación anterior, para atender la transacción el microcontrolador debe pasar a una rutina de interrupción, guardar sus registros de trabajo, determinar qué dirección desea leer el dispositivo maestro, obtener el dato y colocarlo en el registro de transmisión. Esto puede llevar varios microsegundos, lo que implica que el dispositivo maestro podría estar enviando pulsos de reloj ciegamente por la línea SCL sin que el dispositivo esclavo pueda responderle. Con el fin de solucionar este inconveniente, el protocolo I2C ofrece una solución para este problema: el dispositivo esclavo (en este caso el microcontrolador) puede mantener la línea SCL en bajo; a esto se le llama estiramiento del reloj. Cuando el dispositivo esclavo recibe el comando de lectura lo primero que hace es colocar la línea de reloj en bajo; por tanto, si se obtiene el dato solicitado, lo coloca en el registro de transmisión y posteriormente libera la línea de reloj, que pasará de inmediato a un nivel alto debido a la resistencia de polarización. Desde el punto de vista del dispositivo maestro, éste tratará de enviar el primer pulso de reloj para la lectura de datos liberando la línea SCL, la cual retornará a un estado lógico alto, pero antes de hacerlo comprobará que ésta realmente haya ido al nivel lógico 1. Si la línea SCL permanece en bajo, el dispositivo maestro interpreta que el esclavo la mantiene así y espera a que SCL retorne a un nivel alto antes de continuar. Por suerte, la mayoría de los dispositivos que utilizan el bus I2C de los microcontroladores manejan esto de manera automática; sin embargo, a veces el manejo de I2C en el dispositivo maestro no se encuentra implementado de manera automática sino que mediante la programación de subrutinas manejan los estados de las dos líneas de un puerto I2C. Algunos dispositivos ignoran o no poseen la propiedad del estiramiento del reloj. Estas soluciones trabajarán bien con dispositivos como las EEPROM, relojes de tiempo real, entre otros, pero no podrán intercambiar datos correctamente con microprocesadores y/o microcontroladores esclavos que utilizan el estiramiento del pulso de reloj, generando como resultado transmisiones de información erradas.
Reconocimiento En toda comunicación que se realice utilizando en bus I2C, el bit de reconocimiento es obligatorio en la transferencia de datos. El pulso de reloj correspondiente al bit de reconocimiento (ACK) es generado por el dispositivo maestro, desbloqueando el transmisor la línea SDA y estableciendo en ella un nivel lógico alto (“1”) durante el pulso de reconocimiento; cuando el receptor ha recibido a satisfacción el byte enviado desde el dispositivo maestro, el receptor debe colocar en nivel lógico “0” la línea SDA durante el pulso ACK de modo tal que la duración del bit ACK generado por el dispositivo maestro y el bit ACK generado por el dispositivo esclavo sean iguales. En condiciones normales de comunicación un receptor cuando ha recibido un byte que ha sido enviado desde un dispositivo maestro, esta obligado a generar un ACK o bit de reconocimiento, informándole de esta ALFAOMEGA - FREESCALE
334
JUAN CARLOS VESGA FERREIRA
manera al dispositivo maestro que el byte enviado fue recibido a satisfacción; si el byte fue recibido de manera correcta, el dispositivo esclavo establecerá el bit de reconocimiento ACK como un nivel lógico bajo (“0”); en caso contrario el dispositivo generará el bit de reconocimiento ACK como un nivel lógico alto (“1”). Otra situación que se puede presentar es que el dispositivo esclavo no se encuentre preparado para recibir información desde un dispositivo maestro; en esta situación el dispositivo esclavo no generará el bit ACK (debido a que se encuentra ocupado realizando otras funciones y no puede atender el bus de comunicación), manteniendo entonces la línea SDA a nivel lógico alto (“1”) durante el bit ACK; en tal caso, el dispositivo maestro puede generar una condición de STOP abortando la transferencia de datos o repetir la condición de Inicio enviando una nueva transferencia de datos. Si un dispositivo esclavo se encuentra recibiendo datos de manera constante y no desea seguir recibiendo más bytes, el dispositivo maestro podrá detectar esta condición gracias a que el dispositivo esclavo no generará el bit ACK, manteniendo la línea SDA a en nivel lógico alto (“1”), por lo cual el dispositivo maestro podrá generar una condición de Stop o repetir la condición de Inicio para reintentar un nuevo proceso de transmisión. Si un dispositivo maestro se encuentra recibiendo datos desde un dispositivo esclavo, el dispositivo maestro deberá generar un bit ACK por cada byte recibido; en caso de requerirse la culminación de transferencia de información el dispositivo maestro no deberá generar bit de reconocimiento ACK después de recibir el ultimo byte enviado por el dispositivo esclavo, desbloqueando este último la línea SDA y permitiendo que el dispositivo maestro genere la condición de Stop.
Sincronización En todo proceso de comunicación realizado en el bus I2C, los dispositivos maestros generan su propia señal de reloj sobre la línea SCL para transferir datos, garantizando de esta forma que tanto el dispositivo maestro como el dispositivo esclavo estarán sincronizados. Los bits de datos serán aceptados por el dispositivo esclavo durante los intervalos en los cuales la señal de reloj presente un nivel lógico alto (“1”). La sincronización del reloj se realiza mediante una conexión AND de todos los dispositivos del bus a la línea SCL; esto significa que una transición de un dispositivo maestro de un nivel lógico alto (“1”) a un nivel lógico bajo (“0”) en la línea SCL hace que la línea adopte un nivel lógico bajo (“0”), manteniendo la línea SCL en ese estado. Sin embargo, la transición de (“0”) a (“1”) no cambia el estado de la línea SCL si otro reloj está todavía en su período de (“0”). Por tanto, la línea SCL permanecerá en un nivel lógico bajo (“0”) tanto tiempo como el período más largo de cualquier dispositivo maestro lo requiera, es decir, mientras cualquier dispositivo maestro mantenga la línea SCL en un nivel lógico bajo (“0”), la línea se mantendrá en este estado hasta que todos los dispositivos maestros hayan culminado sus procesos de transmisión y liberen la línea SCL para establecer posteriores transmisiones; en tal caso, mientras esto sucede todos los dispositivos maestros entrarán en un período de espera.
Arbitraje Un dispositivo maestro sólo podrá iniciar una transmisión si el bus I2C se encuentra libre; en otras palabras, que la línea SCL presente un nivel lógico alto (“1”). Dos o más dispositivos maestros podrán generar una condición de Inicio en el bus, provocando una condición de Inicio general; en tal caso, cada dispositivo maestro deberá comprobar si el bit de datos que transmite junto a su pulso de reloj coincide con el nivel lógico en la línea de datos SDA. El sistema de arbitraje actúa sobre la línea de datos SDA, mientras la línea SCL está en
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
335
un nivel lógico alto (“1”), teniendo en cuenta que si un dispositivo maestro transmite un nivel lógico alto (“1”) pierde el arbitraje sobre otro dispositivo maestro que se encuentra enviando en este mismo instante un nivel lógico bajo (“0”) en la línea de datos SDA; en tal caso, la situación se mantendrá hasta que se detecte la condición de Stop generada por el dispositivo maestro que se encuentra con el dominio del bus. El arbitraje puede continuar varios bits hasta que se dé la circunstancia de control del bus por uno de los dispositivos maestros. Tras el arbitraje, los dispositivos maestros perdedores se deben configurar automáticamente en modo esclavo, debido a que los datos que se están enviando por un dispositivo maestro dominante pueden estar dirigidos para alguno de ellos. Se debe tener en cuenta que un dispositivo maestro que pierde el arbitraje puede generar pulsos de reloj hasta el fin del byte en el cual pierde totalmente el arbitraje. En el instante en el que un dispositivo maestro toma el control, sólo este dispositivo tomará las decisiones y generará los códigos de dirección, por tanto se podría decir que en tal caso no existirán dispositivos maestros centrales, ni existirán órdenes prioritarias en el bus. Se debe tener especial cuidado cuando durante una transferencia de datos el procedimiento de arbitraje esté todavía en proceso justo en el momento en que se envía al bus una condición de Stop, podría ocurrir que el dispositivo maestro afectado pueda enviar códigos de Inicio o Stop. Entre las sugerencias a tener en cuenta en cualquier proceso de comunicación utilizando el bus I2C se pueden mencionar: Los dispositivos compatibles con el bus I2C deben poder reajustar su bus lógico a la recepción de una o más condiciones de Start. Después de la condición Start la dirección del dispositivo esclavo es repetida y los datos pueden comenzar a ser transferidos. Cada byte es seguido por un bit de reconocimiento como indican los bloques en la secuencia. Se pueden combinar diversos formatos de direccionamiento. Las decisiones para prioridad en el acceso a las posiciones de las memorias deben ser tomadas por el diseñador del dispositivo. Durante el primer byte de datos la posición de la memoria interna debe ser escrita. Una condición de Start inmediatamente seguida por una condición de Stop es un formato ilegal. Una dirección puede tener una parte fija y otra programable, permitiendo la conexión de dispositivos idénticos al sistema, activándolos por la parte fija y controlándolos por la parte programable. Existen una serie de direcciones reservadas en los bus I2C que no se deben utilizar dado que son direcciones determinadas por Philips para usos generales. Si se desea tener mayor profundización en el tema correspondiente al protocolo I2C se debe consultar el manual de Philips, el cual puede hallarse en la siguiente dirección: www.semiconductors.philips.com/acrobat/applicationnotes/AN10216_1.pdf
ALFAOMEGA - FREESCALE
336
JUAN CARLOS VESGA FERREIRA
SCL SDA
PORT B
MODELO 12C
PORT A
Descripción del módulo I2C
PTA3/KBIP3/SCL/ADP3 PTA2/KBIP2/SDA/ADP2
PTB7/SCL/EXTAL PTB6/SDA/XTAL
FIGURA 14.26 Comunicación de dos dispositivos mediante el módulo SPI.
Características Compatible con el bus I2C estándar. Operaciones multi-maestro. Programación por software de una de las 64 diferentes frecuencias de reloj serial. Selección por software del bit de reconocimiento. Manejador de interrupción byte a byte para transferencia de datos. Detección y generación de señales de Inicio y Parada. Generación de señal de inicio repetitiva. Generación y detección del bit de reconocimiento. Detección de bus ocupado. Otras características adicionales.
Modos de operación El módulo I2C puede funcionar como uno de los siguientes modos de operación: Modo Ejecución: Este es el modo básico de funcionamiento. Modo Espera: El módulo funcionará normalmente mientras la MCU se encuentre en estado de espera. Modo Parada: Cuando se encuentra en este modo de operación se produce un bajo consumo de energía, lo cual es recomendable cuando el módulo no se encuentre en uso.
REGISTRO DE CONTROL (IICC) Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
0
0
0
IICEN
IICEN
MST
TX
TXAK
RSTA
Leer Escribir
ALFAOMEGA - FREESCALE
337
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
IICEN: Permite Activar o Desactivar el módulo I2C 1: Módulo I2C Habilitado 0: Módulo I2C Deshabilitado
IICIE: bit que permite activar o no la interrupción del módulo I2C 1: Interrupción del módulo I2C Habilitado 0: Interrupción del módulo I2C Deshabilitado
MST: Modo de selección maestro 1: Modo maestro 0: Modo esclavo
TX: Selección del modo de transmisión 1: Transmisor 0: Receptor
TXAK: Habilitar reconocimiento de transmisión 1: No envía señal de reconocimiento después de recibir un byte 0: Una señal de reconocimiento será enviada después de recibir un byte
RSTA: Repetir bit de inicio de transmisión 1: Repite señal de inicio de transmisión 0: No repite señal de inicio
REGISTRO DE ESTADO (IICS) Bit 7 Leer
Bit 6
TCF
Escribir
Bit 5
Bit 4
BUSY IAAS
Bit 3
Bit 2
0
SRW
ARBL
TCF: Bandera de transferencia completa, indica cuándo un byte ha sido transferido 1: Transferencia completa 0: Transferencia en progreso
IAAS: Direccionamiento como esclavo 1: Direccionado como esclavo 0: No direccionado
BUSY: Indica el estado del bus de transmisión 1: El bus está ocupado 0: El bus está disponible ALFAOMEGA - FREESCALE
Bit 1
Bit 0 RXAK
IICIF
338
JUAN CARLOS VESGA FERREIRA
ARBL: Perdida de Arbitraje 1: Pérdida de Arbitraje 0: Operación del bus normal
SRW: Escritura o lectura del dispositivo esclavo 1: El esclavo transmite y el maestro está leyendo información del esclavo 0: El maestro transmite y el esclavo está leyendo información del maestro
IICIF: Bandera de interrupción. Este bit será borrado por software, pero tomará el valor “1” cuando ocurra cualquiera de los siguientes eventos: Pérdida de arbitraje Un byte fue transferido incompleto Problemas de direccionamiento 1: Ocurrió interrupción 0: No ocurrió interrupción
RXAK: Recepción de reconocimiento 1: Señal de reconocimiento no recibida 0: Señal de reconocimiento recibida
REGISTRO DE DIRECCIÓN (IICA) Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Leer ADDR
Escribir
0
REGISTRO DE ENTRADA/SALIDA DE DATOS (IICD) Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Leer DATA
Escribir
El registro de dirección IICA indica la dirección propia del dispositivo, mientras que en el registro IICD se asignarán los valores de transmisión o recepción a utilizar durante el proceso de comunicación.
REGISTRO DIVISOR DE FRECUENCIA (IICF) Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Leer Escribir
MULT
ICR ALFAOMEGA - FREESCALE
339
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
MULT [7:6] Factor de preescalamiento, aplicable a la división de frecuencia de la línea SCL. 00: Multiplicador por 1 01: Multiplicador por 2 10: Multiplicador por 4 11: Reservado
ICR [5:0] Factor que permite el valor del divisor de frecuencia de la línea SCL; adicionalmente establece el tiempo de sostenimiento de la línea SDA completando el parámetro restante para establecer la velocidad en baudios de la línea SCL, tal como se indica en la siguiente expresión: Velocidad en baudios = velocidad del bus (Hz)/(mul * divisor de SCL)
ICR (HEXA)
Divisor SCL
Valor de sostenimiento Línea SDA
ICR (HEXA)
Divisor SCL
Valor de sostenimiento Línea SDA
00
20
7
20
160
7
01
22
7
21
192
7
02
24
8
22
224
8
03
26
8
23
256
8
04
28
9
24
288
9
05
30
9
25
320
9
06
34
10
26
384
10
07
40
10
27
480
10
08
28
7
28
320
7
09
32
7
29
384
7
0A
36
9
2A
448
9
0B
40
9
2B
512
9
0C
44
11
2C
576
11
0D
48
11
2D
640
11
0E
56
13
2E
768
13
0F
68
13
2F
960
13
10
48
9
30
640
9
11
56
9
31
768
9
12
64
13
32
960
13
13
72
13
33
1024
13
14
80
17
34
1152
17
15
88
17
35
1280
17
16
104
21
36
1536
21
ALFAOMEGA - FREESCALE
340
JUAN CARLOS VESGA FERREIRA
ICR (HEXA)
Divisor SCL
Valor de sostenimiento Línea SDA
ICR (HEXA)
Divisor SCL
Valor de sostenimiento Línea SDA
17
128
21
37
1920
21
18
80
9
38
1280
9
19
96
9
39
1536
9
1A
112
17
3A
1792
17
1B
128
17
3B
2048
17
1C
144
25
3C
2304
25
1D
160
25
3D
2560
25
La tabla anterior ilustra los valores que establece el registro mediante la configuración de la sección ICR y los valores correspondientes al factor que permitirá calcular el tiempo de sostenimiento de la línea SDA. Cuando se desea configurar un dispositivo como esclavo se debe proceder de la siguiente manera: Se establece la dirección como dispositivo esclavo Se habilitan las interrupciones, estableciendo los bits IICEN y IICIE en “1” para transmisión de datos Inicializar las variables utilizadas según la rutina mostrada en la siguiente figura. Cuando se desea configurar un dispositivo como maestro se debe proceder de la siguiente manera: Se establece la velocidad en baudios de la línea SCL. Se habilitan las interrupciones, estableciendo los bits IICEN y IICIE en “1” para transmisión de datos. Inicializar las variables utilizadas según la rutina mostrada en la siguiente figura. Habilitar TX (TX=1). Establecer Modo maestro (MST=1). Con el registro IICD se utilizan los 7 bits de más peso para definir la dirección del dispositivo esclavo con el que se desea establecer comunicación y el bit de menos peso indica si el dispositivo maestro se comportará como transmisor o receptor en un momento dado.
ALFAOMEGA - FREESCALE
341
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
BORRAR IICIF Si
TX
No
Modo maestro?
Si
RX
Tx/Rx ?
Pérdida de Arbitraje?
No Últimobyte transmitido?
Si
Borrar ARBL
No
RXAK = 0 ?
Último byte leído?
No
No
Fin ciclo maestro (RX)?
Si
Si Leer
Transferencia de datos TX/RX ?
SRW = 1 ? No Escribir
Generar señal STOP MST = 0
NIKE = 1
No Dirección a transferir
No
Escribir siguiente byte al IICD
IAAS = 1 ?
Si
Último byte leído?
No
Si
IAAS = 1 ?
No
Si
Si
Si
RX TX
Bit de ACK Recibido?
Establecer modo TX
No Escribir Dato en IBDR
Pasar a modo RX
Leer de IICD
Generar señal STOP (ST = 0)
Leer dato de IICD y almacenar
Transmitir Siguiente Byte
Leer dato de IICD y almacenar
Pasar a modo RX
Pasar a modo RX
Leer de IICD
Leer de IICD
RTI
FIGURA 14.27 Rutina de interrupción tipica del módulo I2C
FUNCIONES ESPECIALES A continuación se expondrán dos de los módulos que no fueron mencionados ampliamente en los capítulos anteriores, pero que sin duda no pueden dejarse de lado si se quiere llegar a conocer en su totalidad el funcionamiento de esta familia de microcontroladores. El lector encontrará en esta sección, nociones básicas ALFAOMEGA - FREESCALE
342
JUAN CARLOS VESGA FERREIRA
y específicas de los módulos de KBI y COP, así como las partes que los conforman, y sus funciones; todo lo cual tiene como propósito acercarlo al entendimiento práctico que requiere todo usuario que desee hacer aplicaciones completas e integrales con esta familia de microcontroladores. Es necesaria una visión práctica en la que se informe al usuario acerca de la situación específica de usar la familia de microcontroladores que se describe en este libro y, por tanto, de cada uno de los módulos que los componen; es decir, el practicante, el principiante o el estudiante que desee aplicar correctamente sus conocimientos requiere más que una explicación teórica aunque ésta sea en la mayoría de los casos, necesaria; el nuevo usuario necesita ejemplos, planteamientos empíricos y ¿por qué no?, consejos provenientes de alguien más experimentado en el tema, y tener presentes las funciones, beneficios y utilidades, así como los riesgos y los errores más comunes y las posibles soluciones. Además se pretende mostrar al lector ejemplos básicos y situaciones comunes sobre la utilización de estos módulos para darle una visión práctica y un tanto sencilla de lo que se esperará que realice en un futuro; por ejemplo, ¿cómo configurar y detectar la interrupción del teclado?
Módulo de interrupción del teclado (KBI) El módulo de interrupción del teclado (KBI por sus siglas en inglés) tiene como función básica detectar la presión de alguna tecla o botón y debido a las opciones que tiene para su configuración es de mucha utilidad en todas las aplicaciones en las que es usado, ya que brinda al usuario mucha versatilidad. Otras aplicaciones en las que también se puede utilizar es para detectar cambios de nivel lógico en alguna línea, con algún otro fin (por ejemplo, sacar al microcontrolador de algún modo de bajo consumo de energía). Como se puede ver en la figura siguiente, el módulo de interrupción del teclado cuenta con 8 fuentes diferentes que pueden provocar una interrupción. Esto significa que se puede tener un teclado con 8 botones, cada uno conectado a una línea de este KBI, también se puede hacer un teclado matricial multiplexado de 16 botones conectando cuatro de estas líneas a los renglones del teclado y otras cuatro líneas de propósito general a las columnas (dejando al software la necesidad de detectar exactamente qué botón se apretó, leyendo los valores de las 4 líneas) o alguna otra configuración. En cierta forma, el KBI es uno de los módulos que comunican al micro con el exterior, ya que a través de éste se puede provocar que cada vez que el usuario lo desee, el microcontrolador realice un comando específico. Este módulo es comúnmente utilizado para sacar al microcontrolador de algún modo de bajo consumo de energía, ya que al darse la interrupción del teclado el microcontrolador “despierta” para hacer alguna actividad previamente programada. En relación con los demás módulos, y teniendo clara la forma en que funciona este módulo, el KBI se puede usar como disparador para que algún otro módulo del micro sea habilitado. Al darse una interrupción del teclado, es posible hacer que otros módulos realicen funciones específicas; por ejemplo, según sea el caso, se puede poner en marcha un contador (módulo de timer), dar un comando para que se dé una conversión analógica a digital (módulo del ADC), o mandar un dato por medio de alguna comunicación serial (módulo de SCI, módulo de SPI, módulo de IIC).
ALFAOMEGA - FREESCALE
343
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
BKGD/MS
HCS08 CORE
RTI
COP
IRQ
LVD
FLASH (MC908QG8 = 8192 BYTES) RAM (MC908QG8 = 512 BYTES) (MC908QG4 = 4096 BYTES) RELOJ INTERNO 16 MHz (ICS) OSCILADOR BAJO CONSUMO 31.25 kHz to 38.4 kHz 1 MHz to 16 MHz (XOSC) VSS VDD
REGULADOR DE VOLTAJE VDDA
TCLK
MÓDULO TIMER (MTIM) 8 BITS MÓDULO I2C MÓDULO DE TECLADO (KBI) DE 8 BITS MÓDULO COMPARADOR (ACMP) CONVERSOR A/D 10 BITS TIMER/PWM 16 BITS MÓDULO (TPM) SERIAL PERIFÉRICA MÓDULO (SPI) COMUNIC. SERIALES MÓDULO (SCI)
PTA5//IRQ/TCLK/RESET PTA4//ACMPO/BKGD/MS
SCL SDA
PTA3//KBIP3/SCL/ADP3 PORT A
SISTEMA DE CONTROL SO8 INTERRUPCIONES Y RESET MODOS DE OPERACIÓN MANEJO DE POTENCIA
MÓDULO DEPURADOR (DBG)
4 4
PTA2//KBIP2/SDA/ADP2
ACMP0 ACMPACMP+ 4
PTA1/KBIP1/ADP1/ACMP_ PTA0/KBIP0/TPMCH0/ADP0/ACMP+ PTB7/SCL/EXTAL PTB6/SDA/XTAL
4 TPMCH0 TPMCH5 SS MISO MOSI SPSCK RxD TxD
PORT B
BDC
CPU
IRQ
PTB5/TPMCH1/SS PTB4/MISO PTB3/KBIP7/MOSI/ADP7 PTB2/KBIP6/SPSCK/ADP6 PTB1/KBIP5/TxD/ADP5 PTB0/KBIP4/RxD/ADP4
EXTAL XTAL
VSSA VREFH VREFL
FIGURA 14.28
Esquema interno Módulo de Interrupción por teclado (KBI)
Los registros de configuración de este módulo (a los cuales se les puede escribir bit por bit o en un solo byte) son: KBISC. En este registro se puede habilitar o deshabilitar la interrupción, así como seleccionar el modo de detección de la interrupción (puede ser detectando sólo flancos, o flancos y niveles). En este registro se encuentra también la bandera que se prende al darse una interrupción, así como el bit con el que se le dice al módulo que ya se atendió la interrupción. KBIPE. Con este registro se selecciona qué líneas, de las 8 posibles, serán usadas como fuente de interrupción. KBIES. En este registro se selecciona, para cada línea de interrupción, si su detección se hará con flanco/ flanco y nivel de bajada o de subida. ALFAOMEGA - FREESCALE
344
JUAN CARLOS VESGA FERREIRA
Un ejemplo básico para entender un poco mejor cómo funciona este módulo de interrupción se explica a continuación, seguido por el código de la inicialización del módulo y de la rutina de interrupción del teclado. Este ejemplo consiste básicamente en configurar el módulo de KBI de manera que pueda detectar la presión de dos teclas diferentes, y con cada una prender/apagar un led. El módulo de interrupción del teclado se inicializa de la siguiente manera: primero se deshabilita la interrupción para evitar falsas interrupciones, después se elige qué líneas de las ocho disponibles se van a habilitar para que puedan provocar una interrupción, se selecciona si la detección se va a dar por flanco de bajada o de subida, a continuación se le dice al módulo que se ha atendido la última petición de interrupción, para evitar falsas interrupciones y por último se habilita la interrupción. A partir de este momento un cambio en cualquiera de las dos líneas habilitadas de un 1 lógico a un 0 lógico provocará una interrupción. Después de esta inicialización el programa puede estar inicializando algún otro módulo, haciendo algún servicio de otro módulo o simplemente estar en el loop infinito. Una vez que se provoca una interrupción del teclado, el microcontrolador va y realiza la rutina de interrupción correspondiente, que para este ejemplo consiste en los siguientes pasos: primero se le dice al módulo que se ha atendido esta última petición de interrupción, para que al salir de esta rutina no regrese inmediatamente; después viene la parte más importante de la rutina, en la que se identifica cuál fue la línea (de las dos habilitadas en la inicialización) que provocó la interrupción. Una vez identificada la línea, se prende/apaga el led que le corresponde y el microcontrolador regresa a hacer lo que estaba haciendo antes de la interrupción. /* Código de inicialización del módulo del teclado */ void KBI_Init (void) { /* KBISC: En este registro se configura si se quiere o no activa la interrupción del teclado y si va a detectar solo flancos o flancos y nivel.*/ KBISC_KBIE = 0; //Se deshabilita la interrupción del módulo para evitar falsas interrupciones /* KBIPE: Registro para habilitar los pines que se usarán como interrupciones de teclado */ KBIPE_KBIPE0 = 1; //Se habilita el pin 0 del módulo KBIPE_KBIPE1 = 1; //Se habilita el pin 1 del módulo /* KBIES: Registro para seleccionar si la detección se dará por flanco de bajada o flanco de subida, se le puede escribir bit a bit, como el registro anterior, o en un solo byte, como se muestra en esta ocasión */ KBIES = 0; KBISC_KBACK = 1; /*Se le dice al módulo que ya se atendió la última petición de interrupción para evitar interrupciones no deseadas */ KBISC_KBIE = 1; //Se habilita la interrupción del módulo ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
345
} /* Código de la rutina de interrupción del KBI */ interrupt 18 void isrVkeyboard(void) { KBISC_KBACK = 1; //Se le dice al módulo que ya se atendió la última petición de interrupción if(PTAD_PTAD0 == 0 ) { LED0 =! LED0; //Se complementa un bit simulando el prendido y apagado de un LED } if(PTAD_PTAD1 == 0) { LED1 =! LED1; //Se complementa un bit simulando el prendido y apagado de un LED } } Es importante que el usuario tenga presente el hecho de que las habilidades para dominar el funcionamiento del microcontrolador y cada módulo que lo conforma con sus cualidades específicas depende en gran medida, de la práctica que el mismo vaya adquiriendo y las conclusiones que vaya sacando en la marcha. Por lo que no debe parecerle extraño que sus primeras experiencias y ejecuciones con este módulo, se presente una que otra falla o error que entorpezca el completo funcionamiento del sistema, y por esto podrá ser de gran ayuda una breve exposición de lo que a nuestro parecer resulta ser el error más común en la utilización de este módulo.
Problema de rebote (Bouncing) La manera en que se suele manifestar este error es que al presionar una vez el botón para provocar una interrupción de KBI, ésta se da más de una vez. Esto se debe a que, en el momento de apretar y/o soltar el botón, el paso entre niveles lógicos no se da de una manera óptima, es decir, se esperaría que cumpliera su función de switch en una sola ocasión, sin embargo lo que sucede es que esta función se repite varias veces aunque el botón haya sido presionado una sola vez desde el punto de vista del usuario. Este es un problema de hardware pero es necesario resolverlo por software, lo cual se puede lograr cumpliendo las siguientes indicaciones: una vez que se da la primer interrupción del teclado, se deshabilita esta interrupción (para que no se presente de nuevo por el rebote) y se pone a correr un contador un tiempo definido, tras el cual, al darse la interrupción de este contador en 3 ocasiones diferentes, se checa, en cada una de ellas, que el nivel lógico siga siendo el esperado y así descartar que se trate de ruido; una vez verificado esto, se realiza la función que se tenía definida para cuando se presionara el botón, se vuelve a habilitar la interrupción del teclado, y por último se deshabilita la interrupción del contador. ALFAOMEGA - FREESCALE
346
JUAN CARLOS VESGA FERREIRA
MÓDULO DEL ADECUADO FUNCIONAMIENTO DE LA COMPUTADORA (COP) O WATCHDOG El módulo del adecuado funcionamiento de la computadora (COP, por sus siglas en inglés), también conocido como watchdog, es un módulo que tiene como función básica provocarle un reset al microcontrolador en caso de que no reciba una notificación antes de un tiempo determinado. Este módulo se encuentra ubicado en el control del sistema del HCS08. Para el microcontrolador, este módulo es quizás el más crítico en lo que respecta a la secuencia del código de la aplicación, ya que si el programa llegara a caer en una localidad de memoria equivocada (esto provocado por ruido ambiental, por ejemplo, ya que el microcontrolador puede estar trabajando en un automóvil, donde hay muchas señales no deseadas para este dispositivo), es muy probable que no regrese a ejecutar la instrucción donde se quedó, y como única salida para esto esta el reset, que es justamente para lo que sirve este módulo, mantener el programa corriendo como debe. Los dos registros de configuración del COP (SOPT1 y SOPT2) sólo se pueden escribir una vez, por lo que se sugiere poner, en las primeras líneas del main(), la configuración deseada para estos registros y escribirles por byte, no por bit.
Ejemplo Para usar el watchdog, simplemente hay que configurar los dos registros que se muestran a continuación y estar refrescando el contador de este módulo para evitar que éste le provoque un reset al microcontrolador. En este caso se configura el módulo para que se el timeout del COP sea lo más largo posible y haya menos posibilidades de que el microcontrolador sea reseteado por no atender rápido al watchdog. /* Código de inicialización del módulo del teclado */ SOPT1 = 0xC3; //Se habilita el watchdog y se selecciona un periodo de timeout largo. SOPT2 = 0x00; //Se selecciona la fuente de reloj para el módulo de 1-kHz interna. Después de esto si no se refresca el contador del COP en menos de 28 ciclos (256 ms aproximadamente), el microcontrolador será reseteado. Para refrescar el contador hay que mandar llamar a la siguiente macro: __RESET_WATCHDOG(); Se sugiere colocar esta macro en el ciclo infinito del programa y asegurarse de que las funciones que realice fuera de este ciclo se lleven a cabo en un tiempo menor al que dura el timeout del watchdog para evitar que el microcontrolador sea reseteado. Para deshabilitar el watchdog simplemente hay que escribir un cero en el bit COPE del registro SOPT1 al inicio del programa (SOPT1_COPE = 0;). Esto es muy recomendado si el lector usa esta familia de microcontroladores a nivel experimental, de práctica escolar, o se encuentra en desarrollo, habilitándolo exclusivamente ya sea que el programa haya sido terminado y esté funcionando totalmente.
ALFAOMEGA - FREESCALE
INTRODUCCIÓN A LOS MICROCONTROLADORES S08Q
347
CONCLUSIONES FINALES Existen actualmente una gran diversidad de fabricantes de dispositivos compatibles con I2C, por lo cual se dispone de una amplia gama de circuitos integrados, incluyendo memorias RAM y E2PROM, microcontroladores, puertos de E/S, codificadores DTMF, tranceptores IR, conversores A/D y D/A, relojes de tiempo real, calendarios, etc. Debido a que no siempre se requiere alta velocidad de transferencia de datos, este bus es ideal para sistemas donde es necesario manejar información entre muchos dispositivos y, al mismo tiempo, se requiere poco espacio y líneas de circuito impreso. Por ello es común ver dispositivos I2C en videograbadoras, sistemas de seguridad, electrónica automotriz, televisores, equipos de sonido y muchas otras aplicaciones. Existen también circuitos integrados que permiten realizar cambios de niveles de tensión entre sistemas, permitiendo que dispositivos que utilicen niveles TTL puedan acceder a sistemas basados en niveles I2C y viceversa, facilitando con ello una gran integración de sistemas a la hora de realizar un diseño electrónico. Se ha logrado explicar en forma general las principales características sobre los módulos anteriormente descritos, en términos de que se han expuesto las funciones, cualidades y relaciones entre estos módulos y con los demás componentes del microcontrolador y, por otro lado, se han despejado algunas de las dudas más comunes que pudieran surgir en el usuario en el momento de comenzar a familiarizarse con este grupo de microcontroladores. Es siempre recomendable que se lleven notas no sólo de los contratiempos que se presenten en el proceso de programación y ejecución de los módulos, sino también de la forma en que cada vez se han podido resolver las dificultades secundarias que se han presentado debido a las primeras, y sin duda serán igual de importantes las notas que hagan referencia a aciertos o formas útiles de cumplir los objetivos y metas para cada módulo, y así tener un acervo completo y muy útil de experiencias pasadas que nos permitirán no repetir los mismos errores, tomar en cuenta alternativas de solución que nos han funcionado con anterioridad y también las que sólo han agravado el problema, etc. Es importante también que el usuario sea capaz de transmitir todas estas experiencias a un nuevo usuario para que le sean de utilidad en su nueva práctica, así como espero que mi experiencia haya sido de ayuda para ustedes.
ALFAOMEGA - FREESCALE
348
JUAN CARLOS VESGA FERREIRA
RESUMEN DEL CAPÍTULO CAPÍTULO Dentro de los factores que rige el desarrollo tecnológico y la aparición diaria de nuevos y sorprendentes dispositivos de lógica programable, es la competencia por posicionarse en el atractivo mercado de la electrónica, la cual, cada día se intensifica más, obligando a los fabricantes a ofrecer soluciones que satisfagan una serie de requerimientos entre los que se encuentran la funcionalidad, el tamaño, el costo, consumo de potencia y facilidad de uso. Los microcontroladores MC9S08QG8/QG4 ofrecen una estupenda combinación de funcionalidad y tamaño reducido y muy bajo costo. Entre las novedades que presenta esta familia frente a otras se pueden mencionar: 8 canales con conversión Analógica/Digital, basados en un conversor analógico-digital (ADC) mejorado, de 10 bits de alta resolución y velocidad de conversión elevada, brindando un mínimo consumo de potencia. Debido a la gran integración que presenta ésta familia especial de Microcontroladores, permite a los diseñadores conectar fácilmente entradas analógicas utilizando la mínima cantidad de circuitería externa posible. Adicionalmente incluye tres módulos especiales de comunicaciones como son:un módulo de interfaz para comunicaciones en serie (SCI), un módulo para periféricos en serie (SPI) y otro módulo para conexión de dispositivos con comunicación I2C; permitiendo expandir su conexión con toda una gama de dispositivos especiales como por ejemplo: memorias, relojes de tiempo real, conversores A/D, transceivers, entre otros dispositivos que no solo facilitarán el diseño de aplicaciones especializadas sino que además garantizarán que los desarrolladores vean en ésta familia de Microcontroladores la solución a todos sus problemas. Una de las principales características que ofrece ésta familia de Microcontroladores consiste en una mayor flexibilidad de temporización a nivel software gracias al módulo temporizador (MTIM) de 8 bits, así como funciones de control del movimiento con el módulo (Timer/PWM o TPM) de dos canales. La integración presente en el 9S08QG8/QG4 ofrece además distintas fuentes de reloj. Una fuente de reloj interna (internal clock source o ICS) modular, la cual, es un generador de reloj interno de gran exactitud y bajo consumo de potencia, que evita tener que instalar un oscilador o cristal de cuarzo, que hasta ahora era un requerimiento especial de funcionamiento para cualquier Microcontrolador existente; complementándose con el hecho de que éstos Microcontroladores pueden soportar entradas externas de reloj desde 32 kHz hasta 20 MHz.
ALFAOMEGA - FREESCALE
bIBLIOGRAFÍA Ceballos, Francisco Javier. Enciclopedia de Microsoft Visual Basic 6.0, AlfaOmega-RA-Ma, 2000. Ceballos, Francisco Javier. C/C++ Curso de programación, 2 ed., AlfaOmega-RA-Ma. 2002. Di Lella, Daniel. Curso Introductorio sobre Microcontroladores HC908 Motorola-Freescale, 2000. Freescale Semiconductor Technologies. C for Embedded Systems, Motorola-Freescale Technologies, 2004. Gutiérrez, Freddy Fernando. Manual de Usuario de Microcontroladores Motorola JK3, Compulogix Ltda., 2001. Martín Del Brío, Bonifacio. Iniciación a los microcontroladores 68HC11. Ingeniería Electrónica y Telecomunicaciones, Universidad de Zaragoza (España), 2001. Mayne, Jordy. Guía didáctica del 68HC08, Silica Technologies, 2000. Metrowerks Technologies. CodeWarrior C, C++, and Assembly Language Referente, Metrowerks, 2004. Metrowerks Technologies. CodeWarrior C Compilers Reference, Metrowerks, 2004. Metrowerks Technologies. CodeWarrior Principles of Programming, Metrowerks, 2004. Metrowerks Technologies. CodeWarrior Development Studio for Freescale 68HC08/HCS08 Microcontrollers Quick Start, Metrowerks, 2005. Motorola-Freescale Technologies. MC68H(R)908JL3/JK3/JK1 User’s Guide, Motorola Technologies, 2002. Motorola-Freescale Technologies. MC9S08QG8/QG4 User’s Guide, Motorola-Freescale Technologies, 2006. Motorola-Freescale Technologies. User’s Guide. Aplications, notes, Motorola-Freescale Technologies, 20002006. Motorola Technologies. Embedded Systems Freescale-Motorola User’s Guide, Motorola Technologies, 2001. Philips. The I2C Bus Technologies Specifications, 2000. Rashid, Muhamed. Electrónica de Potencia, 2 ed., Ed. Prentice Hall, México, 1993. Smith, Sedra. Circuitos y Microelectrónica, 4 ed., Oxford University Press, Inc., 1998.