You are on page 1of 334

EDICIONS UPC

EDICIONS UPC

MICROCONTROLADORES MCS-51 Y MCS2-51 Published by ATARAXIAINC 111 III World Street Hoboken, NJ 07030-5774 Copyright 2006 by Ataraxiainc, Bogota, Chibchombia Published by Ataraxiainc, Bogota, Chibchombia Published simultaneously in the Earth planet All parts of this publication may be reproduced, stored in a retrieval system or transmitted in any form or by any means, electronic, mechanical, photocopying, recording, scanning or otherwise, except as no permitted under Sections of the Copyright Act, without either the prior written permission of the Publisher, or authorization through payment of the appropriate per-copy fee to the Copyright Clearance Center, 2*2 Rosewood Drive, Danvers, MA 0+-23, (978) 75.-84/*00, fax (9%) 646-/600. Requests to the Publisher for permission should be addressed to the Legal Department, Ataraxiainc, Bogota, Chibchombia e-mail: Ataraxiainc@Gmail.com. Trademarks: ATARAXIAINC

LIMIT OF LIABILITY/DISCLAIMER OF WARRANTY: THE PUBLISHER AND THE AUTHOR MAKE NO REPRESENTATIONS OR WARRANTIES WITH RESPECT TO THE ACCURACY OR COMPLETENESS OF THE CONTENTS OF THIS WORK AND SPECIFICALLY DISCLAIM ALL WARRANTIES, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE. NO WARRANTY MAY BE CREATED OR EXTENDED BY SALES OR PROMOTIONAL MATERIALS. THE ADVICE AND STRATEGIES CONTAINED HEREIN MAY NOT BE SUITABLE FOR EVERY SITUATION. THIS WORK IS SOLD WITH THE UNDERSTANDING THAT THE PUBLISHER IS NOT ENGAGED IN RENDERING LEGAL, ACCOUNTING, OR OTHER PROFESSIONAL SERVICES. IF PROFESSIONAL ASSISTANCE IS REQUIRED, THE SERVICES OF A COMPETENT PROFESSIONAL PERSON SHOULD BE SOUGHT. NEITHER THE PUBLISHER NOR THE AUTHOR SHALL BE LIABLE FOR DAMAGES ARISING HEREFROM. THE FACT THAT AN ORGANIZATION OR WEBSITE IS REFERRED TO IN THIS WORK AS A CITATION AND/OR A POTENTIAL SOURCE OF FURTHER INFORMATION DOES NOT MEAN THAT THE AUTHOR OR THE PUBLISHER ENDORSES THE INFORMATION THE ORGANIZATION OR WEBSITE MAY PROVIDE OR RECOMMENDATIONS IT MAY MAKE. FURTHER, READERS SHOULD BE AWARE THAT INTERNET WEBSITES LISTED IN THIS WORK MAY HAVE CHANGED OR DISAPPEARED BETWEEN WHEN THIS WORK WAS WRITTEN AND WHEN IT IS READ.

For general information on our other products and services or to obtain technical support, please contact our Customer Care Department within the ($=$(%&/&)%$=, outside the U.S. at =$(%(%$$__(/$-$)($, or fax |@##43@#. Ataraxiainc also publishes its books in a variety of electronic formats. Some content that appears in print may not be available in electronic books. Library of Congress Control Number: -!$&$+-+)=(%/ ISBN: !?=)$(%/&-/+* Manufactured in the Chibchombian World 10 9 8 7 6 5 4 3 2 1 2O/QW/RQ/QU/IN

POLITEXT 97

Microcontroladores MCS-51 y MCS-251

EDICIONS UPC

POLITEXT

Jos Matas Alcal Rafael Ramn Ramos Lara

Microcontroladores MCS-51 y MCS-251

EDICIONS UPC

La presente obra fue galardonada en el sptimo concurso "Ajuts a l'elaboraci de material docent" convocado por la UPC.

Primera edicin: febrero de 2001

Diseo de la cubierta: Manuel Andreu

Los autores, 2001 Edicions UPC, 2001 Edicions de la Universitat Politcnica de Catalunya, SL Jordi Girona Salgado 31, 08034 Barcelona Tel.: 934 016 883 Fax: 934 015 885 Edicions Virtuals: www.edicionsupc.es E-mail: edicions-upc@upc.es

Produccin:

Barcelona Digital, S.L. Rossell 77, 08029 Barcelona

Depsito legal: B-10.539-2001 ISBN: 84-8301-454-8


Quedan rigurosamente prohibidas, sin la autorizacin escrita de los titulares del copyright, bajo las sanciones establecidas en las leyes, la reproduccin total o parcial de esta obra por cualquier medio o procedimiento, comprendidos la reprografa y el tratamiento informtico, y la distribucin de ejemplares de ella mediante alquiler o prstamo pblicos.

A Gemma y Alex, a mi familia, a mis amigos ms prximos, a mis compaeros de la EUPVG, y a la memoria de mi padre.

Jos Matas

A Paula y a Rosa, a mi familia, a mis compaeros de la EUPVG y a mis amigos.

Rafael Ramos

Los autores, 2001; Edicions UPC, 2001.

ndice

ndice
1
1.1 1.2 1.2.1 1.2.2 1.2.3 1.3 1.4

Estructura bsica de un sistema microprocesador


Introduccin .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. Estructura bsica de un sistema microprocesador ...... .. ... . ... .. .. .. .. ... .. .. .. .. .. . Unidad central de proceso (CPU) ...... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. Mdulo de entradas/salidas (E/S) .. .. .. ... .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. . Buses del sistema .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. Estructura general de un sistema basado en microprocesador .... ... .. .. .. .. .. ... .. .. .. Estructura general de un sistema basado en microcontrolador ...... .. .. .. .. ... .. .. .. .. 15 15 16 18 18 21 23

2
2.1 2.2 2.3 2.4 2.5 2.5.1 2.5.2 2.5.3 2.5.4

Las familias de microcontroladores de Intel y de otros fabricantes


La familia MCS-48 .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. La familia MCS-51 .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. La familia MCS-151 ... .. ... . ... .. .. .. .. .. ... .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... La familia MCS-251 ... .. ... . ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... Microcontroladores de otros fabricantes .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. Microcontroladores de Philips ... ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. Microcontroladores de Siemens .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... Microcontroladores de Atmel .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. Microcontroladores de Dallas Semiconductor .. .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. .. 25 25 26 27 28 28 30 31 31

3
3.1 3.1.1 3.1.2 3.2 3.2.1 3.2.2 3.2.3 3.3 3.3.1 3.3.2 3.4 3.4.1 3.4.2 3.4.3

Arquitectura de las familias MCS-51 y MCS-251


Arquitectura interna de la MCS-51 .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. ... . Relacin de terminales .. .... . .. .. .. .. ... .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. . Puertos de entrada/salida .... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. Organizacin de la memoria y de los registros internos de la MCS-51 .. . .. ... .. .. .. .. .. rea de memoria de cdigo de programa y memoria de datos .... .. .. .. .. ... .. .. .. .. .. rea de memoria interna y de registros de propsito general .. .. ... .. .. .. .. .. ... .. .. .. rea de registros especiales (SFR) .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. ... . ... .. .. .. Arquitectura interna de la MCS-251 ... .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. Relacin de terminales .. .... . .. .. .. .. ... .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. . Estructura interna de los puertos de entrada/salida ... . ... ... . .. .. .. ... .. .. .. .. .. ... .. . Organizacin de los espacios de memoria de la MCS-251 ... .. .. .. ... .. .. .. .. .. ... .. .. rea de memoria ... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. ... . rea de registros de propsito genrico ... ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ... .. rea de registros de funcin especfica SFR . .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. . 33 34 36 38 38 40 41 44 45 48 48 49 51 54

Los autores, 2001; Edicions UPC, 2001.

10

Microcontroladores MCS-51 y MCS-251

3.4.4 Compatibilidad con la arquitectura de la familia MCS-51 ... . .. .. ... .. .. .. .. .. ... .. .. . 57 3.5 Configuracin de la serie 8XC251Sx . .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. .. . 58 3.5.1 Configuracin del acceso a la memoria externa .. .. .. .. .... . .. .. .. ... .. .. .. .. .. ... .. . 58

4
4.1 4.2 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.2.7 4.3 4.3.1 4.3.2 4.3.3 4.3.4 4.3.5 4.3.6 4.3.7 4.3.8

Programacin de las familias MCS-51 y MCS-251


Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Tipos de direccionamiento .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. . Direccionamiento inmediato . ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. ... . ... .. .. .. .. .. Direccionamiento directo .... . ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. . Direccionamiento por registro .. ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. . Direccionamientoindirecto ... .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. Direccionamiento por desplazamiento o indexado .... .. .. .. ... .. .. .. .. .. ... .. .. .. .. Direccionamiento de bit ... .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. Direccionamiento relativo .... . .. .. .. ... .. .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. ... .. . Conjunto de instrucciones de la familia MCS-51 y MCS-251 .. .. .. .. ... .. .. .. .. .. ... Formato de una instruccin .. . ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. . Directivas de ensamblador ..... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... Los registros de estado PSW y PSW1 ..... .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... . Instrucciones aritmticas .. ... . .. ... .. .. .. .. .. ... .. .. .. ... . ... .. .. .. .. .. ... .. .. .. . Instrucciones lgicas . .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. Instrucciones de transferencia de datos ... ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. .. Instrucciones booleanas ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Instrucciones de control .. ... . .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. 63 64 65 66 67 68 69 70 73 73 74 75 77 79 83 86 90 92

El modelo de programacin
Creacin y consulta a tablas .. .. .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. ... . . Transferencia de bloques de datos .... .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. . Funciones booleanas .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Retardos de tiempo ... ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .... . . ... .. .. Suma y resta de datos .... .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. Contador en BCD .. .. .. .. ... . ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. . Multiplicacin y divisin de datos de 16 bits .... .. .. .. ... .. .. .. ... .. .. .. .. .. .. ... .. Suma y resta de datos con signo . .. .. .. ... .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... . Multiplicacin y divisin de 16 bits con signo . .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. Ejemplos de aplicacin ... ... . .. .. .. ... .. .. .. .. ... .. .. ... . .. .. ... .. .. .. .. .. ... .. . Generacin de una seal cuadrada ... .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. .. Conexin de teclas al microcontrolador ..... .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Conexin de un dgito de siete segmentos .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. Conexin de un teclado matricial de 4 x 4 teclas .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. Conexin de varios dgitos de siete segmentos, aplicacin de Su turno .. .. .. .. ... .. . Contador de piezas .... .. .. ... .. .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. .. Control de un ascensor ... ... .. .. .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. .. Control de un calefactor ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. Control de una cinta elevadora .... .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Control de la temperatura de un horno de coccin ... .. .. ... .. .. .. .. .. .... . .. .. .... . 97 98 99 100 101 103 105 109 109 113 113 115 117 118 121 125 127 129 131 134

5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.10.1 5.10.2 5.10.3 5.10.4 5.10.5 5.10.6 5.10.7 5.10.8 5.10.9 5.10.10

Los autores, 2001; Edicions UPC, 2001.

ndice

11

6
6.1 6.2 6.2.1 6.2.2 6.2.3 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6

Las interrupciones
Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Las interrupciones en la familia MCS-51 . .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. Vectorizacin de interrupciones en la MCS-51 .. .. ... . .. ... .. .. .. .. .. .. ... .. .. .. .. . Habilitacin de interrupciones y establecimiento de prioridades en la MCS-51 .. . .. .. .. Tiempos de respuesta del proceso de interrupcin ... .. .. ... .. .. .. .. .. ... .. .. .. .. .. . El sistema de interrupciones en la familia MCS-251 .. .. .. .. .. .. ... .. .. .. .. .. ... .. .. Habilitacin de las interrupciones . .. .. .. .. .. .. ... .. .. .. ... . ... .. .. .. .. .. ... .. .. .. . Niveles de prioridad de las interrupciones .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. Interrupciones externas /INT0 e /INT1 ..... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... Interrupcin de los Timers ... . .. .. ... .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. . Interrupcin del array de contadores programables (PCA) .. .. ... .. .. .. .. .. ... .. .. .. Interrupcin del puerto serie ... .. .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. .. 137 139 142 143 145 152 155 156 158

163
164

165

7
7.1 7.2 7.2.1 7.2.2 7.2.3 7.3 7.4 7.4.1 7.4.2 7.5 7.5.1 7.5.2 7.5.3 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4

Temporizadores/contadores internos y watchdog


Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Temporizadores/contadores para la MCS-51 .... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... Timer 0 y Timer 1 .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. Timer 2 .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. .. ... ... . .. .. ... .. .. .. .. .. ... Timer 0, 1 y 2 como contador ... .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Temporizadores para la MCS-251 ..... .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. .. Funcionamiento de los Timers .. .. ... .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. .. .. Funcionamiento como temporizador .... ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... Funcionamiento como contador .... .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. . Timer 0 y Timer 1 .. .. ... .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. Habilitacin de los Timers 0 y 1 ... .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. .. Desbordamiento de los Timers 0 y 1 ... .. .. ... .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. .. Modos de funcionamiento de los Timers 0 y 1 ... .. .. .. .... . .. .. .. ... .. .. .. .. .. ... . Timer 2 .. ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. Modo captura ..... .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. . Modo autorrecarga ..... .. ... . ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. . Modo de generador de baudios (Baud Rate Generator Mode) .... .. ... .. .. .. .. .. ... .. Modo Clock-out ..... .. .. ... . ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. . Timer watchdog ..... .. .. ... . ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. . Descripcin de funcionamiento . .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. Utilizacin del timer WDT ..... .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. Timer WDT durante el modo Idle ..... .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. . Timer WDT durante Power Down .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... 173 174 174 181 186 191 192 193 193 194 194 198 199 213 215 215 217 217 219 219 220 220 220

8
8.1 8.2 8.3 8.4

Memoria externa
Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Memorias semiconductoras .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. Estructura externa de las memorias .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. Ciclos de fetch, de lectura y de escritura .. .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. 221 221 223 224

Los autores, 2001; Edicions UPC, 2001.

12

Microcontroladores MCS-51 y MCS-251

8.5 8.5.1 8.6 8.7 8.8 8.8.1 8.8.2 8.8.3 8.8.4

Conexin entre la MCS-51 y la memoria externa . .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Diagramas de tiempo para la MCS-51 . ... .. .. ... . .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. Ejemplos de conexin para la MCS-51 .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. . Conexin con la memoria externa para la familia MCS-251 .. .. .. .. .. .. ... .. .. .. .. .. Configuraciones de acceso a la memoria externa . ... .. .. ... . .. ... .. .. .. .. .. ... .. .. . 18 bits de bus de direcciones (RD1, RD0 = 00) ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. 17 bits de bus de direcciones (RD1, RD0 = 01) ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. 16 bits de bus de direcciones (RD1, RD0 = 10) ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. 16 bits de bus de direcciones (RD1, RD0 = 11) ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. ..

225 225 227 231 233 233 239 240 240

9
9.1 9.2 9.3 9.3.1 9.3.2 9.3.3 9.4 9.5 9.6 9.6.1 9.6.2 9.7 9.8 9.9 9.9.1 9.9.2

Puerto de comunicacin serie


Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . La comunicacin serie en la MCS-51 .. .. .. ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. Modos de funcionamiento del puerto serie .. ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. Modo 0. Modo sncrono ... .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. Modos 1, 2 y 3. Modos asncronos .. .. .. .. .. .. ... .. .. .. ... . ... .. .. .. .. .. ... .. .. .. . El Timer 2 como base para el puerto serie ..... .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... . Deteccin de errores ..... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. La comunicacin serie en la MCS-251 ... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. Modos de operacin ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. ... . Modo 0 o sncrono .... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. Modos 1, 2 y 3. Modos asncronos .. .. .. .. .. .. ... .. .. .. ... . ... .. .. .. .. .. ... .. .. .. . Deteccin de errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comunicacin multiprocesador ..... .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. . Reconocimiento automtico de direcciones ... .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. Direcciones given ... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. .... . .. .... . . ... .. .. .. .. .. .. Direcciones broadcast ... .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. 247 248 250 250 250 252 253 262 264 264 267 272 272 273 273 274

10 El array de contadores programables (PCA)


10.1 10.2 10.3 10.3.1 10.3.2 Introduccin .. .. .. .. .. ... ... .. . .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Temporizador/contador del PCA ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. Mdulos de comparacin/captura del PCA . .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. . Modo captura ..... .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. . Modos de comparacin ..... . .. .. .. .. ... .. .. .. .. .. ... ... . .. .. ... .. .. .. .. .. ... .. . 277 279 280 280 287

11 Entradas y salidas analgicas


11.1 11.2 11.3 11.4 11.5 Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. ... . ... .. ... . .. .. ... .. .. .. .. .. ... .. . Conexin de un convertidor D/A . ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. Convertidor A/D de bajo coste mediante aproximaciones sucesivas .. . .. .. ... .. .. .. .. Conexin de un convertidor A/D . ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. Conversin A/D utilizando los temporizadores del microcontrolador ..... .. .. .. .. ... . 297 298 302 305 317

Los autores, 2001; Edicions UPC, 2001.

ndice

13

12 Modos especiales de funcionamiento


12.1 12.2 12.2.1 12.2.2 12.3 12.4 12.5 Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... ... . . ... .. .. .. .. .. ... .. . Registro de control de potencia (PCON) ... .. ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. . Bits de control del puerto serie ..... ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. Bit de Power Off (POF) ...... . .. .. ... .. ... . .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. . Modo Idle ..... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... Modo Power Down ..... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. Modo ONCE (On-Circuit Emulation) ...... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. 327 327 327 327 328 329 330

Apndice Juego de instrucciones de la familia MCS-51 y MCS-251 .. . .. .. ... .. .. .. .. 331 Bibliografa .... .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. .. 337

Los autores, 2001; Edicions UPC, 2001.

Bibliofrafa

337

Bibliografa
BERNARD ODANT; Microcontroladores 8051 y 8052. Paraninfo, 1995. GONZLEZ VAZQUEZ, J.A; Introduccin a los microcontroladores 8X52, 8X51. Mc Graw Hill, 1992. ANGULO, J.M; Microprocesadores y Microcontroladores 8085, MCS-51 y ST6. Paraninfo, 1992. Embedded Microcontroller Users Manual. 8XC251SA, 8XC251SB, 8XC251SP, 8XC251SQ. SENCER YERALAN Y ASHUSTOSH AHLUWALIA; Programming and interfacing the 8051 Microcontroller. Addison-Wesley, 1995. JAMES W. STEWART; The 8051 Microcontrollers, Hardware, Software and interfacing. PrenticeHall, 1993. THOMAS W. SHULTZ; C and the 8051. Programming and Multitasking. Prentice-Hall, 1993. JOHN UFFENBECK; Microcomputers and Microprocessors. The 8080, 8085, and Z-80. PrenticeHall, 1991. BARRY B. BREY; Los microprocesadores de INTEL. Arquitectura. Programacin e interfaces. Prentice-Hall, 1994. RICHARD J. PRESTOPNIK; The Microprocessor Peripheral IC Reference Manual. Prentice-Hall, 1989. MATAS, Jos, et al ; Entorno de desarrollo para la placa evaluadora EV80C51FX. Revista Espaola de Electrnica, pg. 52-55, Abril 1995. ANDREW TANENBAUM; Structured computer organization. Prentice-Hall, 1990. DOUGLAS V. HALL; Microprocessors and Interfacing, Programming and Hardware. Mc-Graw Hill, 1992. A.C. DOWNTON; Computadores y Microprocesadores. Addison-Wesley, 1993

Los autores, 2001; Edicions UPC, 2001.

1 Estructura bsica de un sistema microprocesador

15

1 Estructura bsica de un sistema microprocesador


1.1 Introduccin
Un sistema microprocesador se puede concebir como un sistema procesador secuencial de instrucciones (figura 1.1), que puede ejecutar un conjunto determinado de instrucciones, lo que hace que sea un sistema flexible, capaz de controlar una amplia gama de aplicaciones, de abaratar costos y de reducir el tiempo necesario de diseo.

Algoritmo o programa Salida del proceso Proceso a gobernar

Entradas Sistema procesador

Salidas

Fig. 1.1 Esquema general de un sistema procesador

Un sistema procesador puede ser de programa fijo, como es el caso de las calculadoras de bolsillo no programables, o de lgica programable, como es el caso de los microprocesadores, microcontroladores, procesadores digitales de seal (DSP), etc. Los sistemas procesadores tambin pueden trabajar en paralelo, aumentando la velocidad de ejecucin de los programas.

1.2 Estructura bsica de un sistema microprocesador


La estructura bsica de un sistema microprocesador (figura 1.2), se basa en la arquitectura de Von Newman que, a pesar de los grandes avances producidos en la tecnologa de los semiconductores, ha permanecido inalterada desde el momento de su concepcin. En la estructura bsica de un sistema microprocesador (figura 1.2) se distinguen los siguientes bloques: la unidad central de proceso CPU, la memoria, el mdulo de entradas/salidas y los buses de direcciones, de datos y de control.

Los autores, 2001; Edicions UPC, 2001.

16

Microcontroladores MCS-51 y MCS-251

Memoria (M)

Bus de direcciones

Unidad central de proceso (CPU)

Mdulo de E/S Bus de control

Bus de datos
Fig. 1.2 Diagrama de bloques de la estructura bsica de un sistema microprocesador

La CPU est formada principalmente por dos bloques funcionales: la unidad de control y la unidad de proceso. La unidad de control se encarga de buscar, interpretar y ejecutar las instrucciones almacenadas en la memoria. La unidad de proceso se encarga de realizar una serie de operaciones aritmticas, lgicas, de transferencia de datos, etc. La memoria est destinada a almacenar las instrucciones y los datos del programa y los resultados obtenidos en su ejecucin. Sobre la memoria opera la CPU, leyendo instrucciones y escribiendo o leyendo datos. Existen dos tipos bsicos de memoria: la memoria ROM de slo lectura y la memoria RAM de lectura/escritura. Para acceder a la memoria se deben realizar una seleccin previa de sta, ms un direccionamiento de la posicin concreta a que se desea acceder para la lectura o la escritura. El mdulo de entradas/salidas, E/S o I/O, permite la comunicacin del sistema microprocesador con el exterior, haciendo que este sea un sistema abierto, es decir, accesible por dispositivos externos. Los buses son el conjunto de lneas fsicas que permiten la transferencia de informacin entre todos los bloques que constituyen el sistema microprocesador. Los buses se pueden clasificar, en funcin del tipo de informacin que transportan, en tres tipos: el bus de direcciones, el bus de datos y el bus de control. El bus de direcciones determina la direccin de memoria a que se va a acceder por la CPU y, tambin, se utiliza para seleccionar, dentro de un rango de direcciones, distintos tipos de memoria, de la misma forma que para seleccionar distintos tipos de perifricos a travs del mdulo de E/S.

1.2.1 Unidad central de proceso (CPU) La CPU est formada por la unidad de control y por la unidad de proceso. La unidad de control gestiona el funcionamiento completo de la CPU y del resto de los bloques del sistema

Los autores, 2001; Edicions UPC, 2001.

1 Estructura bsica de un sistema microprocesador

17

microprocesador, encargndose de buscar, decodificar, ejecutar las instrucciones y de generar las seales de control adecuadas para ello. La unidad de proceso est formada por la unidad aritmtico-lgica, ALU, y por los registros del sistema microprocesador. La ALU se encarga de realizar las operaciones aritmticas y lgicas del sistema, como pueden ser la suma, resta, multiplicacin, funcin AND lgica, funcin OR lgica, etc. En los registros se almacenan datos que son el origen o el destino de las operaciones de la ALU, y el origen o destino de la transferencia de datos entre la CPU (figura 1.2) y la memoria del sistema. La unidad de control tiene tambin el registro PC (Program Counter), o contador de programa, que es un registro especial encargado de enviar, por medio del bus de direcciones, la posicin de memoria que corresponde a la siguiente instruccin que se debe ejecutar. El contador de programa, PC, se actualiza automticamente cuando se ejecuta una instruccin, de manera que siempre apunta a la siguiente instruccin que se debe ejecutar en el programa. El conjunto de bloques formado por la unidad de control y la unidad de proceso constituye la CPU, que se caracteriza por el repertorio de instrucciones que es capaz de ejecutar.

Bus interno de la CPU Unidad de proceso (UP) Registro de 2 operando Acumulador

Unidad Registro de estado

ALU

Control

de control (UC)

Fig. 1.3 Diagrama de bloques de la CPU

De la figura 1.3 cabe destacar al acumulador como un registro de suma importancia, pues siempre suele recibir uno de los operandos que intervienen en una operacin aritmtica, o suele ser, en la CPU, el registro destinatario del resultado obtenido en la operacin. Otro registro que se debe destacar es el registro de estado, debido a que contiene bits que actan como indicadores o alarmas de ciertos sucesos acontecidos en las operaciones aritmticas. Uno de los bits que suele llevar es el bit C de acarreo, que se activa en operaciones de suma y resta; o el bit P de paridad, que indica la paridad par o impar del nmero contenido en el acumulador.

Los autores, 2001; Edicions UPC, 2001.

18

Microcontroladores MCS-51 y MCS-251

1.2.2 Mdulo de entradas/salidas (E/S) El sistema microprocesador necesita de dispositivos de entrada/salida para gobernar y comunicarse con el entorno de la aplicacin, con la funcin principal de hacer de interfaz entre el sistema y los perifricos externos asociados a ste.
Bus de direcciones

Mdulo
Bus de control

Enlaces con dispositivos perifricos

de E/S

Bus de datos

Fig. 1.4 Modelo genrico de un mdulo de E/S

Las operaciones de E/S se hacen sobre una amplia gama de perifricos conectados al sistema microprocesador (impresoras, teclados, monitores, convertidores A/D y D/A, sensores, actuadores, etc.), y con los que se suelen intercambiar seales de control y de datos. En estas operaciones se debe coordinar el trfico entre los recursos internos del sistema microprocesador y los perifricos, pues a menudo la velocidad de transferencia de datos de los perifricos es ms lenta, o necesitan un determinado sincronismo. El mdulo de E/S se puede realizar por medio de instrucciones especficas que lo conforman y que residen en el programa del sistema microprocesador; se puede hacer mediante interrupciones, donde los perifricos pueden activar lneas de interrupcin de la CPU, que detienen la ejecucin del programa y pasan a ejecutar un programa especfico pensado para atender al perifrico que ha causado la interrupcin; se puede hacer tratando las entradas/salidas como posiciones de memoria, donde se seleccionan los perifricos mediante ciertos rangos de direcciones y se envan y reciben datos que gestionan al perifrico. Tambin se ofrecen en el mercado numerosos circuitos integrados de soporte al sistema microprocesador, que suelen ser configurables mediante software y son capaces de adaptar al sistema todo tipo de perifricos.

1.2.3 Buses del sistema Un bus es el medio por el cual se transmite informacin por los distintos mdulos que componen un sistema microprocesador. Un bus puede ser unidireccional o bidireccional, es decir, puede transmitir la informacin en una nica direccin, del emisor al receptor, o en ambas direcciones, del emisor al receptor, y viceversa. Cuando hay varios dispositivos conectados a un mismo bus, como ocurre, por ejemplo, con el bus de datos, stos disponen de la caracterstica triestado, que consiste en un estado de alta impedancia en las lneas del dispositivo conectados al bus, de forma que permite que quede desconectado elctricamente del bus, y que as la CPU pueda acceder a uno de los distintos dispositivos conectados al mismo.

Los autores, 2001; Edicions UPC, 2001.

1 Estructura bsica de un sistema microprocesador

19

Un dispositivo triestado tiene una seal de control que determina si el estado ser de alta impedancia, o no. El estado en alta impedancia hace que el dispositivo se desconecte elctricamente de la lnea en cuestin (figuras 1.5 y 1.6).
Buffer

Alta impedancia 0 Control 1 b Control 1 1 a 0 0 b a

Entradas . . . . . . . . . . . . . . . . . . . . .

Salidas

Fig. 1.5 Conexin de dos buffers triestados a una misma lnea de bus

Control
Fig. 1.6 Estructura de un buffer triestado

La figura 1.5 muestra la conexin de dos buffers de salida a una misma lnea de un bus. En esta figura se observa el caso en que, para evitar colisiones entre los estados lgicos de la salida de ambos buffers, el buffer a permanece en estado de alta impedancia mientras el buffer b est transmitiendo informacin por la lnea del bus. El bus de direcciones tiene la tarea de llevar la direccin de la posicin de memoria, o del mdulo de E/S, a la que la CPU desea acceder. El contenido del bus es unidireccional y siempre lo proporciona la CPU a travs de la unidad de control. El nmero de lneas del bus de direcciones est relacionado con la capacidad de direccionamiento de la CPU. Por ejemplo, si se desea direccionar una memoria de 64kbytes, es decir, con 216 posiciones de memoria, sern necesarias 16 lneas de direccin para formar el bus de direcciones. El bus de datos debe soportar el traspaso de informacin entre la CPU, la memoria y los mdulos de E/S. El bus de datos es bidireccional y triestado, pues est compartido por todos los bloques del sistema microprocesador. El bus de control est formado por las lneas destinadas a llevar las seales que gobiernan y sincronizan todo el sistema microprocesador, como son las seales del tipo /RD, /WR, ALE, reset, lneas de interrupcin, etc. Con estas seales se llevan a cabo distintas operaciones como, por ejemplo, la seleccin, lectura y escritura en las memorias externas, o en los perifricos externos. Uno de los problemas que se debe considerar en un bus es la carga que puede soportar, es decir, el nmero de dispositivos o de puertas lgicas que se pueden conectar a una misma lnea. En general, cada nuevo dispositivo receptor que se conecta a una lnea supone un incremento en la corriente que

Los autores, 2001; Edicions UPC, 2001.

20

Microcontroladores MCS-51 y MCS-251

debe suministrar el emisor cuando est a nivel alto, VOH (1 lgico), y en la corriente que debe absorber cuando est a nivel bajo, VOL (0 lgico), tal y como se indica en las figuras 1.7 y 1.8, respectivamente. Las especificaciones de VOH, VOL, IOH, IOL, IIH y IIL, se dan para el peor de los casos y dependen de la tecnologa o de la familia lgica utilizada. La tabla 1.1 muestra el valor de estos parmetros para circuitos integrados TTL, CMOS y LSTTL (Low-Power Schottky TTL). En esta tabla las corrientes negativas indican que la corriente se suministra por el transmisor. Con esta tabla se puede determinar el nmero mximo de receptores que puede soportar un emisor especfico. Receptores Receptores

Emisor
I OH V=VOH I H1

I H2 I H3

I H4

Emisor
I OL V=VOL I L1

I L2 I L3

I L4

I OH [ I H1 I H 2 I H 3 I H 4

I OL [ I L1 I L 2 I L3 I L 4

Fig. 1.7 Corriente que suministra el emisor cuando su salida est a nivel alto, VOH (1 lgico)

Fig. 1.8 Corriente que absorbe el emisor cuando su salida est a nivel bajo, VOL (0 lgico)

Tabla 1.1 Especificaciones de nivel lgico para las familias lgicas TTL, LSTTL y CMOS (esta ltima dada para la familia GS CD4000 serie B con una tensin de alimentacin de VDD=5V)

Descripcin VOH VOL VIH VIL IIH IIL IOH IOL


Valor mnimo de tensin de salida a 1 lgico Valor mximo de tensin de salida a 0 lgico Valor mnimo de tensin de entrada aceptable como un 1 lgico Valor mximo de tensin de entrada aceptable como un 0 lgico Corriente mxima absorbida a 1 lgico Corriente mxima suministrada a 0 lgico Corriente mxima de salida a 1 lgico Corriente mxima absorbida de salida a 0 lgico

TTL 2.4V 0.4V 2.0V 0.8V 40]A -1.6mA -400]A 16mA

CMOS 4.95V 0.05V 3.5V 1.5V 0.3]A -0.3]A -0.16mA 0.44mA

LSTTL 2.7V 0.5V 2.0V 0.8V 20]A -0.4mA -400]A 8mA

Otro problema que es comn a los buses es el de las reflexiones que se pueden producir en las lneas, debido a que un pulso situado en una lnea de un bus se comporta de manera parecida a una seal de radio frecuencia en una lnea de transmisin. Este fenmeno afecta sobre todo a las lneas de larga longitud, haciendo que aparezcan sobreoscilaciones y transitorios repentinos en la recepcin de los pulsos transmitidos por las lneas, que distorsionan los niveles lgicos transmitidos. Las reflexiones producidas en las lneas (figura 1.9) son debidas a la falta de adaptacin de impedancias entre el emisor y el receptor, de forma que el receptor no absorbe toda la energa transmitida y parte de esta energa se refleja hacia el emisor.

Los autores, 2001; Edicions UPC, 2001.

1 Estructura bsica de un sistema microprocesador

21

Emisin
Pulso corto

Recepcin

Pulso largo

Fig. 1.9 Reflexiones en el receptor debidas a reflexiones producidas en la lnea

Para que no se produzcan reflexiones la impedancia de entrada de los receptores debe ser idntica a la impedancia que presenta la lnea conectada a stos. La impedancia de una lnea trazada en un circuito impreso suele tener un valor comprendido entre los 100 y 200, por lo que la adaptacin se puede conseguir conectando una resistencia de adaptacin de 180 220 entre la entrada del receptor y masa, lo que se denomina terminacin pasiva. Terminacin pasiva 220 Receptor

Emisor

5V Terminacin activa Emisor 470 220 Receptor

Fig. 1.10 Terminaciones pasiva y activa de una lnea de un bus para eliminar o reducir las reflexiones en lneas de larga longitud

La terminacin pasiva, no obstante, presenta el problema de que la resistencia de adaptacin es una carga ms para el transmisor, por lo que reduce el nmero de receptores que se le pueden conectar. Esta situacin se puede mejorar utilizando un divisor de tensin que sita la lnea a la mitad del margen de tensin para la familia TTL, y que, adems, adapta el receptor a la impedancia caracterstica de la lnea (figura 1.10). Esta solucin se denomina terminacin activa. Con la terminacin activa se asegura que, al menos, la amplitud del pulso reflejado ser siempre menor que el valor del pulso transmitido, eliminando las reflexiones de forma paulatina.

1.3 Estructura general de un sistema basado en microprocesador


La estructura de los diferentes sistemas basados en microprocesadores suele presentar bastantes caractersticas comunes, como son los dispositivos de entrada/salida, las memorias para albergar

Los autores, 2001; Edicions UPC, 2001.

22

Microcontroladores MCS-51 y MCS-251

programas y datos, los dispositivos de comunicacin asncrona con otros sistemas, los dispositivos de entrada y visualizacin de informacin, como mediante teclados y visualizadores, etc. La figura 1.11 muestra la estructura general de un sistema basado en microprocesador, considerando una buena parte de los dispositivos necesarios para desarrollar satisfactoriamente cualquier aplicacin, sin llegar a especificar el tipo de microprocesador, los dispositivos y los perifricos empleados.

Memorias
RAM EPROM EEPROM

Timers

Generadores de reloj y sincronismo

Puerto serie

RS-232C RS-422 RS-485

CPU

Buses de direcciones, control y datos

Puertos de E/S

E/S analgicas

Acceso directo a memoria DMA

Controlador de teclado y visualizacin

Fig. 1.11 Diagrama general de bloques de un sistema basado en microprocesador

En la figura 1.11 se pueden distinguir puertos de E/S, memorias, temporizadores, puerto serie de comunicacin, etc. Cada uno de estos bloques suele estar implementado por un circuito integrado, CI, que proporcionan los fabricantes como soporte de sus microprocesadores o microcontroladores, y que facilitan la tarea del diseo y mejoran las prestaciones del sistema. Las memorias son uno de los elementos de los que hay mayor variedad y oferta en el mercado, donde se pueden encontrar memorias SRAM, DRAM, PROM, EPROM, EEPROM, FLASH, NOVRAM, etc. Es imprescindible en todo sistema que exista una memoria no voltil, como la PROM, la FLASH y la EPROM, para albergar el programa del sistema, como una memoria voltil, como la SRAM o DRAM, para albergar los datos generados y utilizados por el programa. En los sistemas basados en microcontrolador las memorias ms ampliamente utilizadas son del tipo EPROM y SRAM, aunque tambin se usan otro tipo de memorias como la OTPROM (One time programmable), la NOVRAM (Non-volatile RAM) y memorias del tipo serie que envan y reciben los datos va serie con la CPU. Por otra parte, existen circuitos integrados que proporcionan 2, 3 4 puertos de E/S, programables por el usuario y de propsito general. Estos circuitos integrados se utilizan en los microprocesadores/ microcontroladores, para disponer de E/S o para ampliar el nmero de E/S. A travs de los puertos de E/S se puede hacer el control de los perifricos, la transmisin y recepcin de datos entre la CPU y los perifricos, la activacin de actuadores, la lectura del estado de sensores, teclas, finales de carrera, etc. Un ejemplo de puerto de E/S es el 8255 de Intel Corporation que soporta hasta tres puertos de E/S de

Los autores, 2001; Edicions UPC, 2001.

Otros dispositivos

1 Estructura bsica de un sistema microprocesador

23

8 lneas cada uno, y el PI/T MC68230 de Motorola, que es una interfaz paralela, bidireccional o unidireccional, de 8 16 bits, con un temporizador programable de 24 bits. En aplicaciones que requieran de la generacin y del sincronismo de seales, o de la temporizacin de determinados sucesos, se necesitan circuitos integrados Timers, que son temporizadores/contadores capaces de contabilizar y temporizar seales de acuerdo con una seal de reloj de entrada. Adems, tambin hay circuitos integrados especficos para la generacin de varias seales de reloj y el sincronismo de sistemas basados en microprocesador. En este sentido, por ejemplo, se pueden encontrar el 8253 y 8254 de Intel, o el MFP MC68901 de Motorola. Este ltimo es un circuito multifuncin, con cuatro temporizadores programables, un controlador de hasta 16 fuentes de interrupcin, un puerto de E/S programable y un canal USART de comunicacin serie asncrona. Otro elemento importante es el puerto serie que proporciona el soporte al sistema microprocesador para poder comunicarse, va serie, con otros sistemas, empleando estndares del tipo RS-232C, RS422, etc. En este sentido existen en el mercado circuitos integrados que soportan la comunicacin serie asncrona, haciendo de puerto serie para el sistema microprocesador. Como CI integrado de este tipo, por ejemplo, se puede encontrar al 8250 de Intel que soporta un puerto serie para la comunicacin con otros sistemas, o el SIO MC68564 de Motorola que soporta la comunicacin serie sncrona y asncrona con otros sistemas. La variedad de circuitos integrados especficos que se ofrecen para el soporte de los sistemas basados en microprocesador es amplia. Prcticamente, se encuentran disponibles en el mercado circuitos integrados de todo tipo, como controladores del acceso directo a memoria (DMA), circuitos integrados capaces de leer un teclado matricial y de gestionar, al mismo tiempo, un visualizador compuesto por un nmero determinado de dgitos, circuitos integrados para el arbitraje y la gestin de los buses del sistema microprocesador, circuitos integrados para la gestin de interrupciones, circuitos integrados para el control y acceso de una unidad lectora de disquetes, circuitos integrados para detectar las cadas de tensin de la red elctrica, etc. El nmero de circuitos integrados de soporte a un sistema basado en microcontrolador es considerable y est sometido a un proceso continuo de mejora y renovacin, por lo que se debe procurar tener un buen conocimiento de estos dispositivos y estar al tanto de las nuevas propuestas que surgen de forma peridica en el mercado.

1.4 Estructura general de un sistema basado en microcontrolador


En un principio se desarrollaron los sistemas basados en microprocesador y se aplicaron al control de multitud de procesos industriales, a la computacin y procesado de datos y al procesado de seales. A medida que la tecnologa de silicio fue evolucionando, permitiendo la integracin de un mayor nmero de transistores en la misma rea de silicio, la complejidad de los microprocesadores aument tambin y se produjo una especializacin segn el campo de aplicacin. En este momento, los microprocesadores se especializan bsicamente en el entorno de la computacin y del procesado de datos, aunque tambin se aplican en determinados procesos industriales donde se necesita de una computacin intensa de datos. Por otra parte, aparecen los microcontroladores, especialmente concebidos para el mbito de control de procesos industriales y para la gestin y el control de mquinas diversas. Por ltimo, tambin surgen los procesadores digitales de seal (DSP), especialmente pensados para el procesado de seal, como, por el ejemplo, el procesado de la seal de

Los autores, 2001; Edicions UPC, 2001.

24

Microcontroladores MCS-51 y MCS-251

voz en telfonos mviles y el filtrado de seales de televisin; aunque tambin se emplean en el control de motores y en tareas de control, en general, donde las seales son de rpida variacin.

CI Microcontrolador Memorias
RAM EPROM EEPROM

Timers

Generadores de reloj y sincronismo

Puerto serie

RS-232C RS-422 RS-485

CPU

Buses de direcciones, control y datos

Puertos de E/S

E/S analgicas

Acceso directo a memoria DMA

Controlador de teclado y visualizacin

Fig. 1.12 Concepcin de un microcontrolador basada en la inclusin de la CPU y otros elementos de un sistema microprocesador en un nico circuito integrado

En cuanto al concepto de microcontrolador, ste se concibe como la inclusin de algunos de los dispositivos que aparecen en la figura 1.11 dentro del mismo circuito integrado. En consecuencia, segn la figura 1.12, un microcontrolador est formado por una CPU, ms los elementos imprescindibles para interactuar con el exterior y para solucionar y simplificar una buena parte de las aplicaciones que hasta el momento se venan realizando con los sistemas basados en microprocesador. En la actualidad los microcontroladores suelen incorporar, adems de la CPU, puertos de E/S, memoria ROM, EPROM, OTPROM o FLASH para albergar el programa realizado, memoria RAM, registros de propsito general que facilitan la tarea del programador, temporizadores y contadores para contabilizar y temporizar eventos, puerto serie con el que implementar estndares del tipo RS-232C, etc, convertidor analgico/digital para la lectura de seales analgicas, salidas con modulacin de pulsos, etc. En este momento, en el mercado existen multitud de fabricantes de microcontroladores que, adems, ofrecen una amplia gama de versiones, capaces de ajustarse a distintos tipos de aplicaciones. En consecuencia, el diseador debe tener muy claros los criterios de eleccin, en funcin de las prestaciones y los costos de las herramientas de desarrollo que se deben adquirir, como son los emuladores, las tarjetas de evaluacin y los programas de software para el desarrollo de la aplicacin.

Los autores, 2001; Edicions UPC, 2001.

Otros dispositivos

2 Las familias de microcontroladores de Intel y de otros fabricantes

25

2 Las familias de microcontroladores de Intel y de otros fabricantes


2.1 La familia MCS-48
La MCS-48 fue la primera familia de microcontroladores de 8 bits de la compaa Intel Corporation. Esta familia fue diseada para emplearse en pequeas aplicaciones y poda soportar hasta un mximo de 4k bytes de cdigo de programa y 256 bytes para datos. La MCS-48 ya no se fabrica en la actualidad. Las principales caractersticas que tena esta familia se resumen en la tabla 2.1.
Tabla 2.1 Principales caractersticas de la familia MCS-48

Versin bsica Versin con ROM Versin con EPROM Memoria RAM interna Memoria EPROM/ROM Temporizadores Fuentes de interrupcin Lneas de E/S

Microcontroladores 8035AHL 8039AHL 8048AH 8049AH 8748H 8749H Caractersticas 64 128 1k bytes 2k bytes 1 1 2 2 27 27

8049AHL 8050AHL 256 4k bytes 1 2 27

2.2 La familia MCS-51


La MCS-51 es en la actualidad la familia bsica de microcontroladores de 8 bits de Intel. Esta familia es adecuada para soportar aplicaciones sencillas y de mediana complejidad y se ha convertido en uno de los estndares del mercado, puesto que se ha utilizado en multitud de aplicaciones y, adems, otros fabricantes, como Siemems Components, Atmel, Philips Semiconductors, OKI Semiconductor, etc., proporcionan versiones especializadas de sta. La tabla 2.2 muestra los principales componentes de esta familia, donde se han excluido las versiones con memoria ROM interna, puesto que sta debe ser implementada por el propio fabricante mediante mscara en la fase de produccin, lo que supone que tan slo sea rentable en grandes series de produccin; est, pues, lejos del alcance de la economa de la mayor parte de los usuarios. Las principales caractersticas de la MCS-51 se listan a continuacin: - 32 lneas de entrada/salida (E/S), distribuidas en 4 puertos de 8 bits cada uno. - Memoria RAM interna de hasta 256 bytes. - 4 bancos de 8 registros de un byte cada uno. - rea de registros de funcin especial (SFR).

Los autores, 2001; Edicions UPC, 2001.

26

Microcontroladores MCS-51 y MCS-251

- Espacio de memoria para programas de hasta 64k. - Espacio de memoria para datos de hasta 64k. - Hasta 3 temporizadores de 16 bits cada uno. - Comunicacin serie asncrona (UART full-duplex). - De 5 a 6 fuentes de interrupcin con 2 niveles de prioridad. - 2 modos especiales de bajo consumo (Power Down y Idle). - Juego de instrucciones con capacidad de procesamiento booleano.
Tabla 2.2 Microcontroladores de la MCS-51 Versin 8031AH 8751BH 8032AH 8752BH 80C31BH 87C51 87C52 87C54 87C58 87L52 87L54 87L58 80C51FA 87C51FA 87C51FB 87C51FC 87L51FA 87L51FB 87L51FC 80C51GB 87C51GB 80C152JA 80C152JB
80C51SL-BG 87C51SLAH OTROM/ EPROM

bytes 4K EPROM

8K EPROM

4K EPROM 8K EPROM 16K EPROM 32K EPROM 8K OTPROM 16K OTPROM 32K OTPROM 8K EPROM 16K EPROM 32K EPROM 8K OTPROM 16K OTPROM 32K OTPROM 8K EPROM 16K EPROM

Mem. Lneas N de Lneas de N Modos Veloc. A/D RAM de E/S canales bajo reloj Timers interrup. PCA Bytes consumo Mhz 128 32 2 5 0 0 12 128 32 2 5 0 0 12 256 32 3 6 0 0 12 256 32 3 6 0 0 12 128 32 2 5 0 0 12,16 128 32 2 5 0 0 12,16,20,24 12,16,20,24 256 32 3 6 0 0 12,16,20,24 256 32 3 6 0 0 12,16,20,24 256 32 3 6 0 0 12,16,20 256 32 3 6 0 0 12,16,20 256 32 3 6 0 0 12,16,20 256 32 3 6 0 0 256 32 3 7 5 0 12,16 12,16,20,24 256 32 3 7 5 0 256 32 3 7 5 0 12,16,20,24 12,16,20,24 256 32 3 7 5 0 12,16,20 256 32 3 7 5 0 12,16,20 256 32 3 7 5 0 12,16,20 256 32 3 7 5 0 256 48 3 15 10 8 12,16 256 48 3 15 10 8 12,16 256 40 2 11 0 0 16.5 256 56 2 11 0 0 16.5 16 256 24 2 10 0 4 16 256 24 2 10 0 4

2.3 La familia MCS-151


La familia MCS-151 de microcontroladores de 8 bits es totalmente compatible, a nivel de juego de instrucciones y de encapsulado, con la MCS-51. Esta familia, al igual que la familia posterior MCS251, es una mejora y actualizacin en prestaciones de la familia MCS-51. El nmero de componentes de la MCS-151 es reducido y se muestra en la tabla 2.3, y sus principales caractersticas se resumen a continuacin: - Procesamiento paralelo de instrucciones Pipeline. - Juego de instrucciones y encapsulado compatibles con la MCS-51.

Los autores, 2001; Edicions UPC, 2001.

2 Las familias de microcontroladores de Intel y de otros fabricantes

27

- Espacio de memoria para programas de hasta 64k. - Espacio de memoria para datos de hasta 64k. - Memoria interna ROM/OTPROM de 8 16k bytes. - Memoria RAM interna de hasta 256 bytes. - Hasta 3 temporizadores de 16 bits cada uno. - 32 lneas de entrada/salida (E/S). - 7 fuentes de interrupcin con 4 niveles de prioridad. - Batera o array de contadores programable (PCA). - Salidas con modulacin de anchura de pulsos (PWM). - Temporizador de watchdog. - Comunicacin serie asncrona (UART full-duplex). - Terminal WAIT de estados de espera para memorias. - Modos no paginado y paginado de acceso a la memoria externa. - Modos especiales de bajo consumo (Power Down y Idle).
Tabla 2.3 Microcontroladores de la familia MCS-151

Versin 80C151SB 83C151SA 83C151SB 87C151SA 87C151SB

ROM/OTPROM 8K bytes ROM 16K bytes ROM 8K bytes OTPROM 16K bytes OTPROM

RAM interna 256 bytes 256 bytes 256 bytes 256 bytes 256 bytes

2.4 La familia MCS-251


La familia de microcontroladores de 8 bits MCS-251 es el resultado de la mejora y actualizacin de las familias MCS-51 y MCS-151. Esta familia presenta un aumento general de prestaciones con respecto a las anteriores, en cuanto al nmero de instrucciones, velocidad y flexibilidad; mantiene, al mismo tiempo, la compatibilidad tanto a nivel de hardware como de software, lo que posibilita que pueda sustituir, con un mnimo coste y de manera directa, a la MCS-51, y actualizar as las aplicaciones que estn soportadas por esta familia. El primer miembro de la familia MCS-251 es el 8XC251Sx que se comercializa en varias versiones, en funcin de la cantidad de memoria interna disponible. En la tabla 2.4 se muestran los microcontroladores que forman parte de esta familia, y a continuacin se listan sus principales caractersticas: - Procesamiento paralelo de instrucciones Pipeline. - 24 lneas de direccin internas que permiten un espacio de hasta 16 Mbytes de memoria. - Juego de instrucciones ampliado con respecto a la MCS-51, con instrucciones aritmticas y lgicas de 16 y de 32 bits. - Encapsulado y juego de instrucciones, en modo binario, compatibles con la MCS-51. - Acceso a los registros de propsito general a nivel de byte, de Word (2 bytes) y de Double Word (4 bytes).

Los autores, 2001; Edicions UPC, 2001.

28

Microcontroladores MCS-51 y MCS-251

- Puntero de la pila (registro Stack Pointer) de 16 bits, que permite acceder a una memoria de pila de hasta 64 kbytes. - Tiempo mnimo de ejecucin de una instruccin de 2 periodos de reloj. - Memoria interna ROM/OTPROM de 8 16k bytes. - Memoria RAM interna de hasta 1024 bytes. - Hasta 3 temporizadores de 16 bits cada uno. - 32 lneas de entrada/salida (E/S). - 7 fuentes de interrupcin con 4 niveles de prioridad. - Batera o array de contadores programable (PCA). - Salidas con modulacin de anchura de pulsos (PWM). - Temporizador de watchdog. - Comunicacin serie asncrona (UART full-duplex). - Terminal WAIT de estados de espera para memorias. - Modos no paginado y paginado de acceso a la memoria externa. - Modos especiales de bajo consumo (Power Down y Idle).
Tabla 2.4 Microcontroladores de la familia MCS-251

Versin 80C251SB 80C251SQ 83C251SA 83C251SB 83C251SP 83C251SQ 87C251SA 87C251SB 87C251SP 87C251SQ

OTPROM/ EPROM (kbytes) 0 0 0 0 0 0 8 16 8 16

Memoria interna ROM (kbytes) 0 0 8 16 8 16 0 0 0 0

RAM (bytes) 1024 512 1024 1024 512 512 1024 1024 512 512

Estas caractersticas proporcionan importantes mejoras con respecto a la familia MCS-51, como son el incremento de la velocidad de ejecucin para una misma frecuencia de reloj, el incremento de la eficiencia en los programas escritos en lenguaje C, debido al acceso en los tipos Word y Double Word, y la capacidad de procesar programas de mayor tamao.

2.5 Microcontroladores de otros fabricantes


2.5.1 Microcontroladores de Philips Philips Semiconductors tiene una gran variedad de microcontroladores de 8 bits basados en la arquitectura de la MCS-51. La oferta que tiene es muy extensa, por lo que es fcil hallar una versin que se ajuste a las necesidades de un proyecto. Este fabricante tiene microcontroladores con memoria EPROM, OTPROM o FLASH internas, versiones que soportan el bus serie I2C, temporizador de

Los autores, 2001; Edicions UPC, 2001.

2 Las familias de microcontroladores de Intel y de otros fabricantes

29

watchdog, array de contadores programable PCA, convertidores A/D de 8 y 10 bits, funcionamiento en baja tensin, etc. La tabla 2.5 muestra los principales componentes de esta familia.
Tabla 2.5 Microcontroladores de Philips Semiconductors
Lneas E/S (I/O) OTP o FLASH Interrupciones Carctersticas especiales A/D (canales) Proteccin programa RAM (bytes) Int. externas Max. freq. (MHz) A/D (bits) Watchdog

Versin

Timers

UART -

PWM

ROM

PCA

80C31/80C32 128-256 3 8xC51/8xC52 8k 8k 128-256 3 8xC54/8xC58 16-32k 16-32k 256 3 89C5x 4-32k 128-256 3 8xC51Fx 8-32k 8-32k 256 4 8xC51Rx+ 16-64k 16-64k 512-1024 4 89C51Rx+ 32-64k 512-1024 4 87LPC762 2k 128 2 87LPC764 87LPC767 87LPC768 87LPC769 8xC591 89C51Rx2 89C66x 8xC554 80/83C557E4 89C557E4 80C557E6 83C557E6 8xC557E8 8xC524 8xC528 80/83/87C552 80/83/87C652 8xC750 8xC748 8xC751 8xC575 8xC576 8xC749 8xC752 8xC591 8xC592 8xCE598 4k 128 2

4k 128 2 4k 128 2 4k 128 2 16k 16k 512 3 16-64k 512-1024 4 16-64k 1k-2k 4 16k 32k 48k 64k 16k 32k 8k 8k 1k 2k 2k 8k 8k 2k 2k 16k 16k 32k 16k 32k 48k 64k 16k 32k 8-16k 8-16k 1k 2k 2k 2k 2k 16k 16k 32k 512 1024 1536 2048 512 512 512 256 64 64 256 256 256 64 64 512 512 512 3 3 3 3 3 3 3 2 1 2 1 3 3 2 1 3 3 3

32 32 32 32 32 32 32

6 6 6 6 7 7 7

2 2 2 2 2 2 2 3 3 3 3 3 2 2 2 2

8 8 8 10 10 10 10 10

4 4 4 6 8 8 8 8 8 6 5 5 6 8 8

18 12 18 12 18 18 18 32 32 32 12 12 12 15 7 8

48 15 48 48 48 2 2 2

32 8 32 8 48 15 32 7 19 2 19 2 19 2 32 2 32 2 21 2 21 2 32 15 48 6 48 6

2 2 2 2

2 2 2

10 10 8 8 10 10 10

I2C -

2.7-5.5V,Low-power 33 2.7-5.5V,Low-power 33 2.7-5.5V,Low-power 33 MTP Flash 33 2.7-5.5V 33 2.7-5.5V 33 Flash-12V ISP 33 BOD,PUR,Keypad 20 interrupt.Low-power BOD,PUR,Keypad 20 interrupt.Low-power 51LPC con A/D 20 A/D y PWM 20 A/D y D/A 20 CAN 2.0B/PeliCAN 16 Flash,5V,ISP/IAP 33 Flash,5V,ISP/IAP 20/33 2.7-5.5V,Capture/ 16 compare Low EMI, 2 PWM 16 Capture/compare Low EMI, 2 PWM 16 Capture/compare Low EMI, 2 PWM 16 Capture/compare 24 16 24 24 16 16 16 16 16 16 16 CAN 2.0B/PeliCAN 16 CAN bus controller 16 CAN bus controller 16

Las versiones que tienen bus serie I2C se pueden conectar por medio de este bus a distintos perifricos y microcontroladores. El bus I2C utiliza tan slo dos terminales del microcontrolador, uno como lnea de datos y otro como lnea de reloj, y es capaz de operar en un sistema con multi-msters y de soportar multitud de perifricos en el mismo bus. Las versiones con un bus del tipo CAN (Control Area Network) se pueden utilizar en aplicaciones

Los autores, 2001; Edicions UPC, 2001.

30

Microcontroladores MCS-51 y MCS-251

para la industria del automvil y en sistemas de manufactura automatizada, pues inicialmente este bus fue concebido para reducir el nmero elevado de cables en un automvil. El bus CAN es un bus serie de alta velocidad formado por dos hilos, que puede llegar a distancias de hasta 40 metros y con el que se pueden realizar estructuras de bus con hasta 30 nodos de comunicacin.

2.5.2 Microcontroladores de Siemens Siemens es un fabricante que tiene una amplia gama de productos en multitud de sectores distintos. En el ramo de semiconductores tiene la familia C500 de microcontroladores, compatibles tanto a nivel de hardware como de software con la MCS-51. La tabla 2.6 muestra los principales componentes de esta familia. Los microcontroladores de Siemens pueden funcionar a altas frecuencias de reloj, pueden tener memoria ROM o OTPROM, puerto serie full-duplex, modos especiales de bajo consumo, varios registros de punteros de datos DPTR, etc.
Tabla 2.6 Microcontroladores de Siemens
N Interrupciones Punteros de datos DPTR (16 bits) 1 1 1 1 1 1 1 8 8 8 8 8 1 1 8 8 8 8 1 1 1 1 8 8 8 8

ROM Protegida

C501G-L/-1R C501G-E C504-L/-2R C504-2E C513-1R C513A-L/-R/-2R C513A-2E C505L-4E C505-L/-2R C505C-L/-2R C505A-4E C505CA-4E C515-L/-1R C515A-L/-4R C515C-L/-8R C515C-8E C517A-L/4R C509-L SAB 80C515 SAB 80C535 SAB 80C515A SAB 83C515A-5 SAB 80C517 SAB 80C537 SAB 80C517A SAB 83C517A-5

-/8k 8k OTP -/16k 16k OTP 8k -/12k/16k 16k OTP 32k OTP -/16k -/16k 32k OTP 32k OTP -/8k -/32k -/64k 64k OTP -/32k 8k 32k 8k 32k

256 256 512 512 256 512 512 512 512 512 1280 1280 256 1280 2304 2304 2304 3328 256 256 1280 1280 256 256 2304 2304

32 32 32 32 32 32 32 46 34 34 34 34 56 56 57 57 68 64 56 56 56 56 68 68 68 68

10 10 10 8 8 10 10 8 10 10 10 10 10 8 8 10 10 8 8 10 10

8 8 8 8 8 8 8 8 8 8 8 12 15 8 8 8 8 12 12 12 12

3 3 4 4 3 3 3 3 3 3 3 3 3 3 3 3 4 5 3 3 3 3 3 4 4 4

6 6 12 12 7 7 7 12 12 12 12 12 12 12 15 15 17 19 12 12 12 12 12 14 17 17

USART USART USART USART USART+SSC USART+SSC USART+SSC USART USART USART USART USART USART USART USART+SSC USART+SSC USART+UART USART+UART USART USART USART USART USART+UART USART+UART USART+UART USART+UART

6 6 4 4 4 4 4 4 4 4 4 21 29 4 4 4 4 21 21 21 21

Las versiones SAB80C517, SAB80C517A, SAB80C517A-5, SAB80C537, C517A-L/4R y C509-L tienen una unidad de multiplicacin y divisin por hardware, MDU, que es capaz de realizar divisiones de datos de 32 bits y multiplicaciones de datos 16 bits. Las versiones C505-L, C505-2R, C505CA-4E, C515C-L, C515-8R y C515C-8E soportan el bus serie FCAN 2.0B.

Los autores, 2001; Edicions UPC, 2001.

Max. freq. reloj (MHz) 40 40 40 40 12 12 16 20 20 20 20 20 24 24 10 10 24 16 20 20 18 18 16 16 18 18

Timers (16 bits)

PWM (canales)

A/D (Canales)

RAM (bytes)

Puerto serie

Lneas E/S

A/D (bits)

Watchdog

Versin

ROM

MDU

2 Las familias de microcontroladores de Intel y de otros fabricantes

31

2.5.3 Microcontroladores de Atmel El fabricante Atmel Corporation tiene una familia de microcontroladores de 8 bits basados en la arquitectura de la MCS-51. Una de las caractersticas ms relevantes de los microcontroladores de este fabricante es que todos ellos tienen memoria interna flash. Estos microcontroladores tienen un precio ms reducido que los microcontroladores con memoria interna EPROM. La tabla 2.7 muestra los microcontroladores con memoria flash de Atmel y las distintas caractersticas de cada uno. Las caractersticas generales de estos microcontroladores son: - Memoria interna flash para programas. - Memoria RAM interna. - Patillas bidireccionales de I/O accesibles bit a bit. - Varios temporizadores/ contadores de 16 bits. - UART Full-Duplex. - Mltiples fuentes de interrupcin. - La versin AT89S tiene 2K de memoria EEPROM interna, una interfaz SPI de bus serie y un temporizador de Watchdog.
Tabla 2.7 Caractersticas de los microcontroladores flash de Atmel
Caractersticas Memoria flash (bytes) Memoria RAM (bytes) Mem. EEPROM interna Interfaz serie SPI Proframacin In-system N de Timers N de bits de seguridad (Lock bits) Watchdog timer UART serie Salida de Power Down mediante interrupcin Comparador analgico Terminales de I/O Fuentes de interrupcin Bus externo de datos/ direcciones Modos Power Down y Idle Alimentacin Vcc Frecuencia Clock Patillas del encapsulado I/O Current Sink (por patilla) Corriente total mxima de I/O (mA) AT89C1051 AT89C2051 AT89C51 AT89LV51 AT89C52 AT89LV52 AT89C55 AT89S8252 1K 64 0

1 2 -

2K 128 0 SI 2 2

4K 128 0 SI 2 3

4K 256 0 SI 3 3

8K 256 0 SI 3 3

8K 256 0 SI 3 3

20K 256 0 SI 4 3 -

8K 256 2K

3 3

SI 15 3

SI 15 6

32 6

32 6

32 8

32 8

32 8

32 9

2.7-6.0 0-24 20 20mA 80mA

2.7-6.0 0-24 20 20mA 80mA

4.0-6.0 0-24 40/44 10mA 71mA

2.7-6.0 0-24 40/44 10mA 71mA

4.0-6.0 0-24 40/44 10mA 71mA

2.7-6.0 0-24 40/44 10mA 71mA

2.7-6.0 0-33 40/44 10mA 71mA

2.7-6.0 0-33 40/44 10mA 71mA

2.5.4 Microcontroladores de Dallas Semiconductor Dallas Semiconductor tiene un par de familias de microcontroladores compatibles con la MCS-51. Una de las familias de este fabricante se centra en la seguridad anticopia del programa, con encriptacin en tiempo real, y en utilizar memoria del tipo NOVRAM para almacenar el programa, en

Los autores, 2001; Edicions UPC, 2001.

32

Microcontroladores MCS-51 y MCS-251

lugar de ROM o EPROM. La segunda familia que oferta es de alta velocidad, capaz de ejecutar las instrucciones hasta tres veces ms rpidamente que la familia MCS-51. La primera familia est formada por los microcontroladores DS5000 y DS5002T, cuyas principales caractersticas son: - 100% compatible en hardware y software con la MCS-51. - NOVRAM de 8k 32kbytes. - Zona particionada para cdigo y para datos. - Cuatro puertos de E/S. - Memoria RAM de 128 bytes. - Dos temporizadores/contadores de 16 bits. - Una puerto UART serie. - Watchdog Timer. - Seguridad anticopia para el cdigo. - Generador aleatorio de nmero. - Interrupcin por fallo de tensin. La familia de alta velocidad est formada por los microcontroladores DS80C310, DS80C320, DS80C323, DSC390, DS83C520, DS83C530, DS87C520, DS87C530 y DS87C550. Las caractersticas comunes a estos microcontroladores son: - 100% compatible en hardware y software con la MCS-51. - Dos puertos serie UART de alta velocidad. - Tres temporizadores de 16 bits. - Deteccin de fallo de tensin. - Dos punteros de datos, DPTR, para acceder a memoria externa. - Temporizador de watchdog. - Memoria RAM interna de 256 bytes. La versin DS80C320 tiene 13 fuentes de interrupcin, de las que 6 corresponden a fuentes externas. Las versiones DS87C520 y DS87C530 tienen 13 y 14 fuentes de interrupcin, respectivamente, 1kbyte de memoria SRAM interna accesible con la instruccin MOVX y 16kbytes de memoria EPROM. La versin DS87C550 tiene estas mismas caractersticas y, adems, incluye un convertidor A/D de 10 bits y con 8 canales multiplexados, 8kbytes de memoria EPROM y 4 canales de PWM con una precisin de 8 bits. La versin DS80C310 es un modelo reducido de la DS80C320, pensada para las aplicaciones donde el coste es un factor importante. La versin DS80C323 es un modelo de bajo consumo y baja tensin de la DS80C320; tiene una frecuencia mxima de reloj de 18MHz, consume tan slo 10mA y puede alimentarse entre 2.7V y 5.5V. La versin DSC390 incorpora un bus serie CAN dual de alta velocidad, formado por dos interfaces CAN 2.0B. Esta versin tambin incorpora 4kbytes de memoria SRAM interna. Por ltimo, las versiones DS83C520 y la DS83C530 tienen 16kbytes de memoria ROM interna, al ser ideadas para grandes series de fabricacin.

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

33

3 Arquitectura de las familias MCS-51 y MCS-251


3.1 Arquitectura interna de la MCS-51
La figura 3.1 muestra el diagrama general de bloques para los microcontroladores de la familia MCS51, cuyas caractersticas generales ya se han descrito en el captulo 2. De esta arquitectura cabe resaltar el rea de registros especiales y el direccionamiento de la memoria interna.
P0.0 ... P0.7 P2.0 ... P2.7

VCC

Puerto 0
Registro de direcc. RAM

Puerto 2

Memoria

RAM
interna

Latch

Latch

VSS

Puerto 2

Puerto 0

Memoria EPROM/ ROM

ACC
TMP1 TMP2

Stack Pointer

SP
Registro de direcciones programa

ALU

PSW ALE EA RESET Control y secuenc. Registro de instrucciones PSEN

TCON TMOD TH0 TL0 SCON T2CON* TH1 TL1 SBUF RCAP2L* TH2* TL2* PCON RCAP2H* IE IP Interrupciones. Puerto serie. Temporizadores. PCA

BUFFER
Incrementador

PC PC DPTR

Latch

Latch

Puerto 1 OSC Puerto 1

Puerto 3

Puerto 3 * Slo en las versiones con 3

XTAL2

XTAL1

P1.0 ... P1.7

P3.0 ... P3.7

temporizadores

Fig. 3.1 Arquitectura interna de la familia MCS-51

Los autores, 2001; Edicions UPC, 2001.

34

Microcontroladores MCS-51 y MCS-251

El ncleo del microcontrolador est formado por la unidad de control, la unidad aritmtico-lgica (ALU), el registro de estado (PSW), el acumulador y el contador de programa (PC). Este ltimo es un registro de 16 bits que se utiliza como puntero hacia la memoria de programas y su valor apunta siempre a la direccin de memoria que contiene la instruccin a ejecutar. Cabe destacar, en esta figura, la importancia del acumulador, puesto que interviene en la mayor parte de las instrucciones, sobre todo en las instrucciones aritmticas. La familia MCS-51 tiene cuatro puertos: P0, P1, P2 y P3. Los puertos son de 8 bits, y cada bit puede ser configurado de forma individual como entrada o como salida (E/S), siendo transparente para el programador. La MCS-51 tiene versiones con memoria interna de programas EPROM, OTPROM o ROM; no obstante, en caso de necesitar memoria externa, los puertos P0 y P2 soportan un bus de direcciones de 16 bits y un bus de datos de 8 bits para acceder a sta. En este caso, el byte bajo del bus de direcciones y el bus de datos comparten el mismo puerto, P0, mediante una multiplexacin temporal entre ambos buses. En cuanto al byte alto del bus de direcciones, ste queda ntegramente soportado por el puerto P2. La multiplexacin temporal realizada en el puerto P0 es una manera hbil de optimizar el nmero de terminales del microcontrolador, minimizando el tamao de su encapsulado. En la figura 3.1 aparecen, adems, un bloque que representa la memoria RAM interna, con la cual opera el puntero de la pila (SP, Stack Pointer), el rea de registros especiales (SFR) y el puerto P3, que soporta las siguientes funciones alternativas: puerto de comunicacin serie asncrona, interrupciones externas, el control de lectura y escritura de la memoria externa de datos y las entradas de los temporizadores/contadores de la familia. El puerto P1 en las versiones 8X51C51FX soporta las entradas y salidas del array de contadores programable PCA. 3.1.1 Relacin de terminales La disposicin de los terminales de esta familia se muestra en la figura 3.2. En concreto se muestra el encapsulado de los microcontroladores 87C51BH en formato DIP y PLCC.
P1.4 P1.3

(/WR)/P3.6 (/RD)/P3.7

T2/P1.0 T2EX/P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RESET RXD/P3.0 TXD/P3.1 (/INT0)/P3.2 (/INT1)/P3.3 T0/P3.4 T1/P3.5 (/WR)/P3.6 (/RD)/P3.7 XTAL2 XTAL1 VSS

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

8 7 5 1 B H

VCC P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 (/EA)/(VPP) ALE/(/PROG) /PSEN P2.7/A15 P2.6/A14 P2.5/A13 P2.4/A12 P2.3/A11 P2.2/A10 P2.1/A9 P2.0/A80

P1.5 P1.6 P1.7 RESET RXD/P3.0 NC TXD/P3.1 (/INT0)/P3.2 (/INT1)/P3.3 T0/P3.4 T1/P3.5

7 8 9 10 11 12 13 14 15 16

44 43 42 41 40 39 38 37 36 35

P0.0/AD0 P0.1/AD1

NC VCC

P1.2 P1.1 P1.0

P0.2/AD2

P0.3/AD3

P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 (/EA)/(VPP) NC ALE/(/PROG) /PSEN P2.7/A15 P2.6/A14 P2.5/A13

8751BH

34 33 32 31 30

17 29 18 19 20 21 22 23 24 25 26 27 28

XTAL2 XTAL1 VSS

NC

A8/P2.0 A9/P2.1 A10/P2.2

A11/P2.3

Fig. 3.2 Microcontrolador 87C51BH en encapsulado DIP o PLCC

Los autores, 2001; Edicions UPC, 2001.

A12/P2.4

3 Arquitectura de las familias MCS-51 y MCS-251

35

La relacin de terminales que aparecen en la figura es la siguiente: - VCC: tensin de alimentacin: +5V. - VSS: terminal de masa. - P0.0, P0.1 P0.7: puerto bidireccional bit a bit de E/S P0. P0 puede soportar el byte bajo del bus de direcciones y el bus de datos mediante una multiplexacin temporal en el caso de tener que utilizar memoria externa (AD0,, AD7). - P2.0, P2.1 P2.7: puerto bidireccional bit a bit de E/S P2. P2 puede soportar el byte alto del bus de direcciones (A8,, A15) en el caso de tener que utilizar memoria externa. - P1.0, P1.1 P1.7: puerto bidireccional bit a bit de E/S P1. P1 es un puerto de propsito general, aunque para aquellas versiones que tienen 3 temporizadores, los terminales P1.0 y P1.1 realizan las funciones alternativas T2 y T2EX del temporizador Timer2, respectivamente. El puerto en las versiones con array de contadores programable PCA soporta las entradas y salidas de sta. Los terminales P1.3, P1.4, P1.5, P1.6, P1.7 son las entradas/salidas, CEX0, CEX1, CEX2, CEX3 y CEX4, de la PCA, respectivamente (tabla 3.1). Estos terminales actan como entradas de los mdulos 0, 1, 2, 3 y 4 de la PCA cuando trabaja en modo captura, respectivamente, y como salidas de los mismos mdulos cuando la PCA trabaja en modo comparacin y en modulacin de anchura de pulsos (PWM). - P3.0, P3.1 P3.7: puerto bidireccional bit a bit de E/S P3. P3 es un puerto de propsito general; no obstante soporta las funciones especiales ms importantes de la familia MCS-51, como las seales TXD y RXD del puerto de comunicacin serie, las entradas de interrupcin /INT0 y /INT1, las entradas externas T0 y T1 de los temporizadores y las seales de lectura y escritura en memoria externa de datos /RD y /WR, respectivamente (tabla 3.1). - ALE/(/PROG): este terminal (ALE, Addres Latch Enable) permite deshacer la multiplexacin temporal entre el byte bajo del bus de direcciones y el bus de datos, realizada en el puerto P0. La seal ALE suele conectarse a la seal de reloj de un latch de 8 bits, como por ejemplo el 74373, que permite deshacer la multiplexacin. En las versiones de la familia con memoria de programa interna EPROM o OTPROM, este terminal se emplea en modo /PROG en la fase de programacin de la memoria. -/PSEN: este terminal (/PSEN, Program Store Enable) se activa a 0 lgico cuando el microcontrolador accede a la memoria externa de programas y se pone a 1 lgico en caso contrario. - (/EA)/VPP: este terminal (/EA, External Acces) colocado a 1 lgico (Vcc) hace que el microcontrolador ejecute el cdigo almacenado en la EPROM, OTPROM o ROM internas. Si se coloca a 0 (masa), el microcontrolador ejecuta el cdigo de programa de la memoria externa de programas, y activa el bus de direcciones, el bus de datos y las seales de control. Como VPP, el terminal se utiliza para proporcionar la tensin de programacin necesaria de la memoria EPROM o OTPROM interna. - RESET: este terminal cuando se pone a 1 reinicializa el microcontrolador, poniendo el contador de programa (PC) a 0000H, el puntero de la pila (SP) a 07H, todos los puertos (P0 a P3) a FFH y la mayora de los registros a cero.

Los autores, 2001; Edicions UPC, 2001.

36

Microcontroladores MCS-51 y MCS-251

-XTAL1, XTAL2: estos terminales son la entrada de la seal de reloj del microcontrolador. Puede utilizarse un resonador cermico o un cristal de cuarzo (figura 3.3); aunque, tambin se puede utilizar una seal de reloj externa.
XTAL2

C MCS-51 C
XTAL1 VSS

Fig. 3.3 Oscilador con cristal de cuarzo o resonador cermico para la MCS-51. C=30pF10pF para cristales de cuarzo. C=40pF10pF para resonadores cermicos Tabla 3.1 Funciones alternativas de los puertos P1 y P3

Nombre P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7

Funcin alternativa T2* T2EX* ECI CEX0 CEX1 CEX2 CEX3 CEX4 RXD TXD /INT0 /INT1 T0 T1 /WR /RD

Descripcin de la funcin alternativa Entrada o salida de reloj del Timer 2. Entrada externa del Timer 2. Entrada externa de reloj del PCA. Entrada/salida del mdulo 0 del PCA. Entrada/salida del mdulo 1 del PCA. Entrada/salida del mdulo 2 del PCA. Entrada/salida del mdulo 3 del PCA. Entrada/salida del mdulo 4 del PCA. Recepcin del puerto de comunicacin serie. Transmisin del puerto de comunicacin serie. Interrupcin externa 0. Interrupcin externa 1. Entrada externa del Timer 0. Entrada externa del Timer 1. Habilitacin de escritura en memoria externa. Habilitacin de lectura de memoria externa.

* En todas las versiones con 3 temporizadores En las versiones con PCA (8XC51FX y 8XL51FX)

3.1.2 Puertos de entrada/salida La constitucin interna de cada uno de los puertos se muestra en la figura 3.4. En el caso del puerto P0, cualquier de sus terminales, al disponer de un par de transistores NMOS conectados a P0.X, puede tener tres estados diferentes: 1 lgico (Vcc) si el transistor NMOS1 est en conduccin y el transistor NMOS2 en corte, 0 lgico (tierra) si el transistor NMOS1 est en corte y el transistor NMOS2 en conduccin, y alta impedancia cuando ambos transistores estn en corte, por lo que el terminal queda flotante desconectado de Vcc y de masa.

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

37

El resto de los terminales que pertenecen a los puertos P1, P2 y P3, (figura 3.4), tienen una resistencia de Pull-up y un transistor NMOS conectado a tierra, por lo que tan slo pueden tener dos estados: 1 lgico si el transistor NMOS est en corte y 0 lgico si el transistor est en conduccin.
BIT DEL PUERTO 0 (P0)
DIREC/DATO LEE LATCH B1 P0.X BUS INT. ESCRIBE EN LATCH D Q LATCH Q CL
1

BIT DEL PUERTO 2 (P2)


DIREC LEE LATCH B1 P2.X BUS INT. N2 ESCRIBE EN LATCH D Q LATCH Q CL
1 0

VCC

VCC PULL-UP INTERNO

CONTROL N1

CONTROL

MUX

MUX

B2 LEE PIN LEE PIN

B2

BIT DEL PUERTO 3 (P3) y PUERTO 1 (P1)


LEE LATCH B1 P3.X BUS INT. ESCRIBE EN LATCH D Q LATCH Q CL Funcin alternativa de salida VCC PULL-UP INTERNO

B2 LEE PIN Funcin alternativa de entrada

Fig. 3.4 Arquitectura interna de los puertos de la familia MCS-51

Segn la figura 3.4, todos los terminales de los puertos tienen una bscula D interna que se emplea para almacenar la informacin que se desea leer o escribir en cada terminal, de manera que basta con que una instruccin ponga un estado determinado en un terminal, para que este estado se mantenga estable hasta que sea cambiado por otra instruccin del programa. Por ejemplo la instruccin SETB P1.1 pone a 1 lgico el terminal P1.1: para ello se almacena un 1 lgico en la bscula D, lo que pone al transistor asociado en corte, pues la puerta NAND fuerza un 0 lgico en su base. Los puertos P0 y P2 tienen adems un multiplexor, MUX, y una lgica adicional, que permite al microcontrolador utilizar estos puertos como tales o como bus de direcciones y de datos. En este ltimo caso, el microcontrolador emplea las seales DIREC, DATO y CONTROL para establecer los estados adecuados en los terminales de estos puertos. Los puertos P1 y P3 tienen la misma estructura, pues deben realizar distintas funciones alternativas, como son las entradas y salidas de la PCA, en las versiones 8XC51FX, y las entradas de interrupciones /INT0 e /INT1, las entradas T0 y T1 para los temporizadores internos, etc. Estas funciones alternativas se introducen mediante la puerta NAND que aparece en la figura 3.4.

Pull-up es el trmino anglosajn empleado para definir a una resistencia conectada a la tensin de alimentacin del circuito, Vcc. Esta resistencia asegura que el terminal est a la tensin Vcc cuando en transistor NMOS est en corte.

Los autores, 2001; Edicions UPC, 2001.

38

Microcontroladores MCS-51 y MCS-251

Todos los puertos tienen al menos un buffer conectado al pin de entrada (B1), y un buffer conectado a la salida de la bscula D (B2), que intervienen en el proceso de lectura de los puertos. El buffer B1 est gobernado por la seal Read Latch, mientras que el buffer B2 est gobernado por la seal Read Pin. En el juego de instrucciones de la MCS-51, existen instrucciones que leen el estado lgico procedente del buffer B2 y instrucciones que leen el estado lgico procedente del buffer B1. Estas ltimas son instrucciones que leen el estado lgico de la bscula D, modifican este estado y escriben el resultado obtenido en la bscula D. A este tipo de instrucciones se les denomina de lecturamodificacin- escritura y, en concreto, son las instrucciones: ANL, ORL, XRL, JBC, CPL, INC, DEC, DJNZ, (MOV PX.Y,C), CLR PX.Y y SETB PX.Y, siempre que operen con uno de los puertos. Estas instrucciones leen el estado de la bscula para evitar un posible error producido por una mala interpretacin del nivel lgico en la entrada del terminal de un puerto. En cuanto a la conexin de dispositivos externos, los puertos P1, P2 y P3 pueden soportar una corriente de entrada mxima en un terminal de 1.6mA en estado lgico cero, transistor NMOS en conduccin. En cambio, el puerto P0 puede soportar hasta una corriente de 3.2mA a cero lgico.

3.2 Organizacin de la memoria y de los registros internos de la MCS-51


En los microcontroladores de la familia MCS-51 se pueden distinguir tres tipos de memoria: - rea de memoria de programas y memoria de datos. - rea de memoria interna y de registros de propsito general. - rea de registros de funcin especial SFR, Special Function Registers. La memoria de programas y la memoria de datos son reas de memoria externa al microcontrolador, aunque hay versiones con memoria ROM, EPROM o OTPROM en su interior. La memoria interna y los registros de propsito general pertenecen a la estructura interna de la MCS-51. Los registros de funcin especial SFR son registros que configuran los recursos internos de la MCS-51, como son las interrupciones, el funcionamiento de los temporizadores, la comunicacin serie asncrona, etc. 3.2.1 rea de memoria de cdigo de programa y memoria de datos El mapa de memoria de la MCS-51 est segmentada en dos bloques de memoria de 64kbytes de tamao cada uno (figura 3.5), un bloque est destinado a almacenar el cdigo de programa (memoria de programa) y el otro a contener las variables y datos asociados al programa (memoria de datos). Estos dos bloques se direccionan a travs de las 16 lneas de direcciones, A0-A15, de la familia. La memoria de programa (figura 3.5a) es de slo lectura y suele ser externa, aunque se han de considerar las versiones con memoria ROM, EPROM y OTPROM interna, que son de tamao reducido y destinadas a albergar los programas realizados en aplicaciones poco complejas o de tipo medio . El bloque de memoria de datos (figura 3.5b) (64kbytes) es externo al microcontrolador y puede ser tanto de lectura como de escritura.
3 2

Notar que /PSEN es una seal de lectura que slo acta sobre la memoria externa de programas.
3

Hay versiones con 4k, 8k, 16k o 32kbytes de memoria interna de programas.

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

39

a)

Memoria de programa (slo lectura)


FFFFH FFFFH

b)

Memoria de datos (lectura/escritura)


FFFFH

c)
PSEN RD RD128k

Mem. externa Mem. externa


1000H/2000H 0FFFH/1FFFH

EA = 0

Mem. interna PSEN


0000H

Mem. RAM interna 8032/8052 128 bytes FFH (80H-FFH) FFH rea de registros especiales SFR 80H 7FH Mem. RAM interna 128 bytes 00H

Mem. externa

RD
0000H

EA = 1
0000H

WR

Fig. 3.5 Estructura de la memoria de la MCS-51

El microcontrolador activa diferentes seales en funcin del tipo de bloque de memoria al que accede. Si va a realizar una lectura del cdigo de programa, sita la direccin que desea leer en el bus de direcciones, A0-A15, y activa la seal /PSEN . Por contra, si va a realizar una lectura o escritura en la memoria de datos, sita la direccin correspondiente en A0-A15 y activa la seal /RD o /WR, segn vaya a leer o a escribir un dato, respectivamente. La CPU comienza a ejecutar el programa, tras un reset o al conectar la alimentacin, por la direccin 0000H, puesto que el contador de programa (PC) se inicializa con este valor. En las versiones con memoria interna de programa los microcontroladores pueden ir a buscar el cdigo de programa a la memoria interna o a la memoria externa , y para aclarar cul es el tipo de memoria del que debe leer el cdigo, dispone de la seal /EA. Si /EA est a 0 lgico, el microcontrolador ejecuta el cdigo almacenado en la memoria externa, y si /EA est a 1 lgico, ejecuta el cdigo almacenado en la memoria interna. En esta ltima situacin, el microcontrolador no activa la seal /PSEN ni los buses de direcciones y datos, puesto que no son necesarios. No obstante, el fabricante contempla la particularidad de que el cdigo de programa pueda estar almacenado en ambos tipos de memoria, parte en la memoria interna y el resto en la memoria externa. En este caso, el microcontrolador ejecuta primero el cdigo de programa de la memoria interna y, luego, pasa a ejecutar el cdigo almacenado en la memoria externa; activa entonces la seal /PSEN y los buses de direcciones y datos. Cabe destacar que esta particularidad carece de sentido, puesto que los microcontroladores con memoria EPROM o OTPROM tienen un coste ms elevado que el del resto, y su utilizacin slo se justifica por el mayor nmero de puertos tiles y por la reduccin del rea de circuito impreso que posibilitan. La memoria de programas y la memoria de datos pueden combinarse, si se desea, en un nico bloque de memoria de 128kbytes: para ello se deben combinar las seales /RD y /PSEN para que formen una
6 5 4

La seal /PSEN es activa cuando est en estado 0 lgico.


5

Habitualmente la memoria externa de programa se implementa mediante una memoria EPROM.


6

Debido a que los puertos P0 y P2 no deben formar el bus de direcciones y el bus de datos.

Los autores, 2001; Edicions UPC, 2001.

40

Microcontroladores MCS-51 y MCS-251

nica seal de lectura, lo que se consigue mediante una puerta AND lgica (figura 3.5c). 3.2.2 rea de memoria interna y de registros de propsito general Segn la figura 3.6, la familia MCS-51 tiene 128 bytes de memoria interna -posiciones de la 00H a la 7FH- y un rea para los registros de funcin especial (SFR) de 128 bytes -posiciones de la 80H a la FFH-. El rea de memoria interna est estructurada en tres partes: a) rea de registros de propsito general formado por cuatro bancos con ocho registros cada uno, b) rea accesible bit a bit y c) rea de memoria RAM general. a) Mem. Int
FFH * Slo 80H 7FH

b) SFR Slo direcc. directo


FFH
30H
7F 7E F E 20H 7 6 ............ ............ ............

7FH

Memoria RAM general 80 bytes rea direcc. bit a bit. 16 bytes, 128 bits Bancos de registros 32 bytes

direcc. indirecto Direcc. directo e indirecto

2FH
8 0

80H

18H 10H

BANCO 3 BANCO 2 BANCO 1 BANCO 0

1FH 17H 0FH 07H

00H

* Slo en 8032/8052

08H 00H

Fig. 3.6 a) Memoria interna de la MCS-51. b) Organizacin de los primeros 128 bytes de esta memoria

a) rea de registros de propsito general El rea de registros de propsito general -posiciones de la 00H a la 1FH (figura 3.6b)- est formada por cuatro bancos de registros con ocho registros cada uno, lo que hace un total de 32 registros disponibles. De estos cuatro bancos de registros, slo uno puede estar activo en un instante determinado, mediante una seleccin previa con los bits RS0 y RS1 del registro de estado (PSW Program Status Word, -tabla 3.2-). Luego, en realidad tan slo se pueden usar los ocho registros correspondientes al banco de registros seleccionado. A los ocho registros de cada banco de registros se les denomina R0, R1, R2, R3, R4, R5, R6 y R7, respectivamente. Estos registros, en realidad, ocupan las mismas posiciones de memoria que abarca cada uno de los bancos: por ejemplo, para el banco 0, el registro R0 est ubicado en la posicin 00H de la memoria interna, el registro R1 en la posicin 01H, el registro R2 en la posicin 02H, y as sucesivamente hasta el registro R7, que est en la posicin 07H de la memoria interna; siguiendo este orden el registro R0 del banco 1 ocupa la posicin 08H de la memoria interna, el registro R0 del banco 2 est en la posicin 10H de la memoria interna y el registro R0 del banco 3 ocupa la posicin 18H de la memoria interna.
Tabla 3.2 Seleccin del banco de registros

Banco 0 Banco 1 Banco 2 Banco 3

Direcciones 00H-07H 08H-0FH 10H-17H 18H-1FH

RS1 (PSW) 0 0 1 1

RS0 (PSW) 0 1 0 1

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

41

b) Posiciones direccionables bit a bit En la memoria interna de la MCS-51 existen 16 bytes posiciones entre 20H y 2FH (figura 3.7)- que son accesibles a nivel de bit, por lo que se dispone de 128 bits accesibles de manera individual.
Memoria RAM interna

Memoria RAM interna


0

2FH 7

2FH 7FH 7EH 7DH 7CH 7BH 7AH 79H 78H

21H 7 20H 7

6 6

5 5

4 4

3 3

2 2

1 1

0 0

21H 0FH 0EH D0H 0CH 0BH 0AH 09H 08H 20H 07H 06H 05H 04H 03H 02H 01H 00H

Fig. 3.7 Posiciones de la memoria interna que son direccionables bit a bit

Existen dos formas de acceder a cada bit de esta zona: la primera consiste es indicar el bit mediante un punto que lo define como bit de un byte. Por ejemplo, al bit 5 del byte 20H se puede acceder como 20H.5. La otra forma consiste en utilizar una direccin para cada uno de los bits de esta zona, donde hay un total de 128 bits; por tanto, el primer bit, el 20H.0, tiene asignada la direccin 00H y el ltimo bit, el 2FH.7, tiene asignada la direccin 7FH 127 en base decimal. c) rea de memoria RAM general El rea de memoria RAM general es una zona de 80 bytes comprendida entre las posiciones 30H y 7FH de la memoria interna (figura 3.6b). En las versiones 8032AH, 8052AH y 8752BH esta zona se ampla en 128 bytes ms, y est situada entre las direcciones 80H y FFH. 3.2.3 rea de registros especiales (SFR) El rea de registros especiales SFR (tabla 3.3) est ubicada entre las direcciones 80H y FFH de la memoria interna y contiene los registros que determinan el modo de funcionamiento y la configuracin de los recursos internos de la familia MCS-51. La tabla 3.3 muestra la situacin de los registros del SFR dentro del espacio de memoria y el valor que toman tras la realizacin de un reset. Los registros con el superndice * aparecen en todas las versiones con 3 temporizadores y los registros con el superndice aparecen en las versiones 8XC51FX. Las zonas en blanco de la tabla 3.3 no estn implementadas fsicamente, y quedan reservadas para futuras ampliaciones de registros que desee hacer el fabricante. La tabla 3.4 muestra el listado de los registros del SFR, una pequea descripcin de stos y la direccin que corresponde a cada registro. Se debe destacar que todos los registros de la tabla 3.3 que aparecen en la primera columna son accesibles bit a bit, mientras que el resto de registros no lo son. Los registros de la primera columna son aquellos que tienen una direccin que acaba en 0 8, es decir: 80H, 88H, 90H, 98H, A0H, etc. Por tanto, al bit 3 del acumulador se puede acceder como ACC.3, al bit 2 del registro B se puede acceder como B.2, etc.

Los autores, 2001; Edicions UPC, 2001.

42

Microcontroladores MCS-51 y MCS-251

Tabla 3.3 Situacin de los registros del SFR de la MCS-51 y su valor tras un reset F8 F0 E8 E0 D8 D0 C8 C0 B8 B0 A8 A0 98 90 88 80 ACC
00000000

CH B
00000000

CCAP0H

CCAP1H

CCAP2H

CCAP3H

CCAP4H

FF F7

00000000

XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX

CL

CCAP0H

CCAP1H

CCAP2H

CCAP3H

CCAP4H

EF E7

00000000

XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX

CCON PSW

CMOD

CCAPM0

CCAPM1

CCAPM2

CCAPM3

CCAPM4

DF D7

00X00000 00000000

00XXX000

X0000000

X0000000

X0000000

X0000000

X0000000

T2CON

T2MOD

RCAP2L

RCAP2H

TL2

TH2

CF C7 BF IPH

00000000 XXXXXX00 00000000

00000000

00000000

00000000

IP
X0000000

SADEN

00000000

P3
11111111

B7 AF A7

X0000000

IE
00000000

SADDR

00000000

P2
11111111

SCON
00000000

SBUF
XXXXXXXX

9F 97

P1
11111111

TCON
00000000

TMOD
00000000

TL0
00000000

TL1
00000000

TH0
00000000

TH1
00000000

8F PCON
00XX0000

P0
11111111
X=Estado indefinido

SP
00000111

DPL
00000000

DPH
00000000

87

* En todas las versiones con 3 temporizadores En las versiones con PCA (8XC51FX y 8XL51FX)

Las versiones con 256 bytes de memoria interna tienen los 128 bytes altos situados entre las posiciones 80H y FFH. En consecuencia, comparten las mismas direcciones que el SFR (80H-FFH), por lo que se produce un solapamiento en cuanto a asignacin de direcciones. Para resolver este conflicto y poder acceder a ambas zonas de la memoria interna, se utiliza el modo de direccionamiento de las instrucciones de la familia; en concreto, si el direccionamiento se realiza de forma directa (direccionamiento directo), se accede al rea de SFR; y si, por contra, el direccionamiento se realiza
8 7

de una forma indirecta (direccionamiento indirecto), se accede al rea ampliada de memoria. Los distintos modos de direccionamiento se tratarn en el captulo siguiente.

En el direccionamiento directo, la direccin es de forma directa un operando de la instruccin. Ej. MOV 90H, #3BH; Escribe 3BH en la localizacin 90H=P1 (Puerto P1) del SFR.
8

En el direccionamiento indirecto, la direccin est contenida en un registro del microcontrolador. Para un 8052: Ej. MOV R0, #90H; MOV @R0, #3BH; Escribe 3BH en la posicin de memoria interna 90H. Nota: # indica el nmero es un dato numrico y @ es el indicativo del direccionamiento indirecto.

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

43

Tabla 3.4 Registros del rea de SFR para la MCS-51 Smbolo P0 P1 P2 P3 SP DPL DPH PCON TCON TMOD TL0 TH0 TL1 TH1 SCON SBUF IE SADDR IPH IP SADEN T2CON* RCAP2L* RCAP2H* TL2* TH2* PSW CCON CMOD CCAPM0 CCAPM1 CCAPM2 CCAPM3 CCAPM4 ACC CL CCAP0L CCAP1L CCAP2L CCAP3L CCAP4L B CH CCAP0H CCAP1H CCAP2H CCAP3H CCAP4H Nombre Puerto 0. Puerto 1. Puerto 2. Puerto 3. Puntero de la Pila (Stack Pointer). Byte bajo del puntero de datos DPTR. Byte alto del puntero de datos DPTR. Control del consumo de energa (Power Control). Control de los temporizadores (Timer Control). Configuracin de los temporizadores (Timer Mode). Byte bajo del temporizador 0. Byte alto del temporizador 0. Byte bajo del temporizador 1. Byte alto del temporizador 1. Control de la comunicacin serie (Serial Control). Buffer de datos de la comunicacin serie (Serial Buffer). Habilitacin de interrupciones (Interrupt Enable). Direccin esclavo (Slave Address). Byte alto del registro de prioridad de interrupciones. Registro de prioridad (Interrupt Priority). Mscara de direcciones esclavo (Slave Address Mask). Control del temporizador 2. Byte bajo del registro de captura del temporizador 2. Byte alto del registro de captura del temporizador 2. Byte bajo del temporizador 2. Byte alto del temporizador 2. Registro de estado (Program Status Word). Registro de control del Timer/Counter del PCA. Registro de modo del Timer/Counter del PCA. Registro modo 0 del Timer/Counter del PCA. Registro modo 1 del Timer/Counter del PCA. Registro modo 2 del Timer/Counter del PCA. Registro modo 3 del Timer/Counter del PCA. Registro modo 4 del Timer/Counter del PCA. Acumulador. Byte bajo del Timer/Counter del PCA. Byte bajo del mdulo 0 de comparacin/captura del PCA. Byte bajo del mdulo 1 de comparacin/captura del PCA. Byte bajo del mdulo 2 de comparacin/captura del PCA. Byte bajo del mdulo 3 de comparacin/captura del PCA. Byte bajo del mdulo 4 de comparacin/captura del PCA. Registro B. Byte alto del Timer/Counter del PCA. Byte alto del mdulo 0 de comparacin/captura del PCA. Byte alto del mdulo 1 de comparacin/captura del PCA. Byte alto del mdulo 2 de comparacin/captura del PCA. Byte alto del mdulo 3 de comparacin/captura del PCA. Byte alto del mdulo 4 de comparacin/captura del PCA.

Direccin 80H 90H A0H B0H 81H 82H 83H 87H 88H 89H 8AH 8CH 8BH 8DH 98H 99H A8H A9H B7H B8H B9H C8H CAH CBH CCH CDH D0H D8H D9H DAH DBH DCH DDH DEH E0H E9H EAH EBH ECH EDH EEH F0H F9H FAH FBH FCH FDH FEH

* En todas las versiones con 3 temporizadores En las versiones con PCA (8XC51FX y 8XL51FX)

Los autores, 2001; Edicions UPC, 2001.

44

Microcontroladores MCS-51 y MCS-251

3.3 Arquitectura interna de la MCS-251


La figura 3.8 muestra el diagrama funcional de bloques de la arquitectura interna de los microcontroladores de la familia MCS-251. Al igual que en la MCS-51, esta familia dispone de cuatro puertos de entrada/salida, P0, P1, P2 y P3, de 8 bits cada uno, donde cada bit puede ser configurado individualmente como entrada o como salida, o bien puede realizar una funcin alternativa relacionada con los perifricos o con el acceso a la memoria externa. De la misma forma que para la MCS-51, los puertos P0 y P2 soportan el bus de datos y el bus de direcciones, para el caso de necesitar memoria externa. Las funciones alternativas de los puertos P1 y P3 estn relacionadas con los perifricos y con seales de control.
Puertos de entrada/salida y seales de perifricos P1.7:0 P3.7:0

Puertos de entrada/salida y busesde acceso a memoria P2.7:0 P0.7:0 Cdigo OTPROM/ROM 8Kbytes 16Kbytes

Puerto 0 drivers

Puerto 2 drivers

RAM 512 Bytes o 1024 Bytes

Puerto 1 drivers

Puerto 3 drivers

Memoria de datos (16)

Memoria de direcciones (16)

Temporizador watchdog Intefaz de los perifricos Temporizadores contadores

Interfaz del Bus

Secuenciador de instrucciones Bus de direcciones (24)

Control de interrupciones

Bus IB

PCA

Bus de datos (8)

SRC1 (8)

SRC2 (8)

Clock y reset

Puerto Serie

ALU

Registros de propsito general

Interfaz de la memoria de datos

Perifricos

DST (16) Ncleo de los C de la familia MCS-251 Clock y reset

Microcontroladores 8XC251SA/SB/SP/SQ Fig. 3.8 Diagrama funcional de la arquitectura interna de la familia MCS-251

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

45

La familia MCS-251 tiene una serie de innovaciones y mejoras con respecto a la MCS-51, sin dejar de ser compatible con sta en cuanto a encapsulado y juego de instrucciones. A pesar de esta compatibilidad, el juego de instrucciones en la MCS-251 ha sido considerablemente ampliado, e incluye instrucciones que operan con datos de 8, 16 y 32 bits y que facilitan el desarrollo de programas en lenguajes de alto nivel como el lenguaje C. Para mantener al mismo tiempo la compatibilidad con la MCS-51 y la ampliacin y mejora del juego de instrucciones, se han definido los modos de trabajo fuente source y binario binary. En el modo fuente se puede emplear las nuevas instrucciones y los tipos de direccionamientos ideados para la MCS-251, por lo que el cdigo de programa generado suele ser ms compacto y eficiente. En el modo binario se programa de la misma manera que con la MCS-51 y por tanto es completamente compatible con sta. Con este modo la MCS-251 puede sustituir a la MCS-51 de forma directa, en aplicaciones ya desarrolladas, y sin necesidad de tener que generar nuevos programas. El espacio de memoria que es capaz de direccionar la familia MCS-251 es de 16Mbytes tanto para cdigo de programa como para datos, puesto que el contador de programa es de 24 bits, pero en realidad el espacio de memoria real es de 256kbytes de memoria externa, ya que como bus de direcciones se dispone de los puertos P0 y P2, y las lneas A16 y A17, que son funciones alternativas de los puertos P3 y P1, respectivamente. La MCS-251 incorpora tambin cierta cantidad de memoria interna de programa y datos, as como un controlador de interrupciones y distintos perifricos como un temporizador Watchdog, tres temporizadores/contadores, un array de contadores programable (PCA) y un puerto de comunicacin serie. Una de las caractersticas de la MCS-51 consiste en que multiplexa temporalmente el byte bajo del bus de direcciones (A0-A7) y el bus de datos (D0-D7) en el puerto P0. Esta multiplexacin se mantiene para la MCS-251 y se denomina modo no paginado. Sin embargo, para la MCS-251 la multiplexacin temporal tambin se puede hacer entre el byte alto del bus de direcciones (A8-A15) y el bus de datos (D0-D7) en el puerto P2, pues de esta manera y como se explicar ms adelante el acceso a la memoria externa es ms eficiente, el puerto P0 en este caso permanecera estable con la direccin correspondiente al byte bajo del bus de direcciones (A0-A7). Esta manera de realizar la multiplexacin temporal en el puerto P2 se denomina modo paginado. La familia tambin incorpora dos modos de funcionamiento de bajo consumo denominados Idle y Power Down, que son adecuados para aplicaciones alimentadas con bateras. El modo Idle para la seal de reloj de la CPU, detiene la ejecucin del programa y ello hace que el consumo de energa sea un 40% menor, pero mantiene la seal de reloj en los perifricos, y permite que sigan en funcionamiento. El modo Power Down detiene las seales de reloj de la CPU y de los perifricos, con lo que consigue una reduccin en el consumo de energa de hasta un 60%.

3.3.1 Relacin de terminales La figura 3.9 muestra el encapsulado en formato DIP y PLCC, y la disposicin de terminales de la MCS-251.

Los autores, 2001; Edicions UPC, 2001.

46

Microcontroladores MCS-51 y MCS-251

8XC251Sx
P1.0/T2 P1.1/T2EX P1.2/ECI P1.3/CEX0 P1.4/CEX1 P1.5/CEX2 P1.6/CEX3/WAIT P1.7/CEX4/A17/WCLK RST P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD/A16 XTAL1 XTAL2 VSS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 VCC AD0/P0.0 AD1/P0.1 AD2/P0.2 AD3/P0.3 AD4/P0.4 AD5/P0.5 AD6/P0.6 AD7/P0.7 EA/VP ALE/PROG /PSEN A15/P2.7 A14/P2.6 A13/P2.5 A12/P2.4 A11/P2.3 A10/P2.2 A9/P2.1 A8/P2.0

P1.5/CEX2 P1.6/CEX3/WAIT P1.7/CEX4/A17/WCLK RST P3.0/RXD VCC2 P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1

6 5 4 3 2 1 44 43 42 41 40

P1.4/CEX1 P1.3/CEX0 P1.2/ECI P1.1/T2EX P1.0/T2 VSS1 VCC AD0/P0.0 AD1/P0.1 AD2/P0.2 AD3/P0.3

7 8 9 10 11 12 13 14 15 16 17

8XC251Sx

39 38 37 36 35 34 33 32 31 30 29

AD4/P0.4 AD5/P0.5 AD6/P0.6 AD7/P0.7 EA/VP VSS2 ALE/PROG PSEN A15/P2.7 A14/P2.6 A13/P2.5

Fig. 3.9 Microcontroladores 8XC251Sx en encapsulado DIP 40 pines y PLCC de 44 pines

La relacin de terminales de los microcontroladores de la familia MCS-251 es la siguiente: - VCC, VCC2: entradas de alimentacin. Vcc y VCC2 se deben poner a +5V. VCC2 permite reducir el ruido que puede haber en la lnea de alimentacin. - VSS, VSS1, VSS2: terminales de masa del microcontrolador. - P0.0, P0.1 P0.7: puerto bidireccional bit a bit de E/S P0. P0 puede soportar el byte bajo del bus de direcciones y el bus de datos mediante una multiplexacin temporal en el modo no paginado, en el caso de tener que utilizar memoria externa (AD0,, AD7). En las versiones con memoria interna de programa, el cdigo de programa se introduce a travs de este puerto, en la fase de programacin y verificacin. - P2.0, P2.1 P2.7: puerto bidireccional bit a bit de E/S P2. P2 puede soportar el byte alto del bus de direcciones y el bus de datos mediante una multiplexacin temporal, en el modo paginado (A8,, A15) de acceder a la memoria externa. - P1.0, P1.1 P1.7: puerto bidireccional bit a bit de E/S P1. P1 es un puerto de propsito general, no obstante soporta varias funciones especiales de la familia MCS-51 (tabla 3.5), que estn relacionadas con el temporizador Timer 2, con el array de contadores programable PCA, la seal WAIT que controla los estados de espera en los ciclos de acceso a la memoria externa, la lnea A17 del bus de direcciones y la seal WCLK que es la salida de reloj para estados de espera en el acceso de memoria externa. Los terminales P1.3, P1.4, P1.5, P1.6, P1.7 son entradas/salidas CEX0, CEX1, CEX2, CEX3, CEX4 de la PCA, respectivamente. Estos terminales actan como entradas de los mdulos 0, 1, 2, 3 y 4 de la PCA cuando trabaja en modo captura, respectivamente, y como salidas de los mismos mdulos cuando la PCA trabaja en modo comparacin y en modulacin de anchura de pulsos (PWM). La funcin alternativa de P1.7 se determina mediante RD1 y RD0 del registro de configuracin UCONFIG0. Si RD1=RD0= 0, su funcin es la lnea A17 del bus de direcciones. No obstante, si el bit WCON.1 est 1, en P1.7 se genera una seal cuadrada de frecuencia que es la mitad de la seal de reloj del microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

P3.6/WR P3.7/RD/A16 XTAL2 XTAL1 VSS VSS2 A8/P2.0 A9/P2.1 A10/P2.2 A11/P2.3 A12/P2.4

18 19 20 21 22 23 24 25 26 27 28

3 Arquitectura de las familias MCS-51 y MCS-251

47

- P3.0, P3.1 P3.7: puerto bidireccional bit a bit de E/S P3. P3 es un puerto de propsito general que soporta diversas funciones especiales de la familia MCS-51 al igual que el puerto P1 (tabla 3.5). Las funciones que soporta este puerto son las seales TXD y RXD del puerto de comunicacin serie, las entradas de interrupcin /INT0 y /INT1, las entradas externas T0 y T1 de los temporizadores, las seales de lectura y escritura en memoria externa /RD y /WR, y la lnea A16 del bus de direcciones. La funcin alternativa de P3.7 tambin depende del estado de los bits RD1 y RD0 de UCONFIG0. Si RD1=RD0= 1, su funcin alternativa es /RD y si RD1= 0 y, RD0 = 1 o RD1= 0 y RD0=0, su funcin alternativa es la lnea A16 del bus de direcciones.
Tabla 3.5 Descripciones de las funciones de los pines de los puertos de entrada/salida

Nombre Nombre del pin con Descripcin de la funcin alternativa del pin funcin alternativa P1.0 T2 Entrada/salida de reloj del Timer 2. P1.1 T2EX Entrada externa del Timer 2. P1.2 ECI Entrada externa de reloj del PCA. P1.3 CEX0 Entrada/salida del mdulo 0 del PCA. P1.4 CEX1 Entrada/salida del mdulo 1 del PCA. P1.5 CEX2 Entrada/salida del mdulo 2 del PCA. P1.6 CEX3 Entrada/salida del mdulo 3 del PCA. P1.7 CEX4, A17, WCLK E/S del mdulo 4 del PCA o A17 del bus de direcciones. P3.0 RXD Entrada de datos del puerto serie. P3.1 TXD Salida de datos del puerto serie. P3.2 /INT0 Entrada interrupcin externa 0. P3.3 /INT1 Entrada interrupcin externa 1. P3.4 T0 Entrada Timer 0. P3.5 T1 Entrada Timer 1. P3.6 /WR Habilitacin de escritura en memoria externa. P3.7 /RD, A16 Habilitacin de lectura en mem. externa o A16 del bus de direcciones - /PSEN: este terminal se activa cuando el microcontrolador realiza operaciones de lectura en la memoria externa en determinados rangos de direcciones, dependiendo del valor de los bits de configuracin RD1 y RD0. - (/EA)/VP: este terminal puesto a 1 hace que el microcontrolador ejecute el cdigo almacenado en las EPROM, OTPROM o ROM internas. Si se coloca a 0, el microcontrolador ejecuta el cdigo de programa de la memoria externa de programas, activa el bus de direcciones, el bus de datos y las seales de control. VP se utiliza para proporcionar la tensin de programacin necesaria de la memoria EPROM o OTPROM interna. - XTAL1, XTAL2: estos terminales son la entrada de la seal de reloj del microcontrolador. Puede utilizarse un resonador cermico o un cristal de cuarzo. Tambin se puede utilizar una seal externa de reloj. El esquema circuital es el mismo que el de la figura 3.3 para la MCS-51. - RST: entrada de reset del microcontrolador. Se debe colocar a nivel alto durante al menos 64 perodos de reloj para realizar la operacin de reset.

Los autores, 2001; Edicions UPC, 2001.

48

Microcontroladores MCS-51 y MCS-251

3.3.2 Estructura interna de los puertos de entrada/salida La estructura interna de los puertos de E/S es la misma que la descrita para la MCS-51, salvo alguna diferencia como el hecho de que el puerto P1 tenga funciones alternativas y se introduzcan los modos paginado y no paginado de direccionar la memoria. Debido a ello, en el puerto P2 se introduce la seal DATO para determinar los estados lgicos del puerto, puesto que en el modo paginado el puerto pasa a soportar el bus de datos adems del byte alto del bus de direcciones; y los puertos P1 y P3 pasan a tener la misma estructura interna (figura 3.10). La estructura interna de los puertos de la MCS-251 es prcticamente idntica a la estructura de la MCS-51, por lo que la explicacin de su funcionamiento se ha realizado en el apartado 3.1.2.
BIT DEL PUERTO 0 (P0)
DIRECC/DATO LEE LATCH B1 P0.X BUS INT. ESCRIBE EN LATCH D Q LATCH Q CL
1

BIT DEL PUERTO 2 (P2)


LEE LATCH B1 P2.X BUS INT. N2 ESCRIBE EN LATCH D Q LATCH Q CL
1 0

VCC

CONTROL N1

DIRECC/DATO CONTROL

VCC PULL-UP INTERNO

MUX

MUX

B2 LEE PIN

B2

BIT DEL PUERTO 1 y 3 (P1 y P3)


LEE LATCH B1 P3.X BUS INT. ESCRIBE EN LATCH D Q LATCH Q CL Funcin alternativa de salida VCC PULL-UP INTERNO

LEE PIN

LEE PIN

B2 Funcin alternativa de entrada

Fig. 3.10 Latchs de los bits de los puertos y buffers de entrada/salida para la MCS-251

3.4 Organizacin de los espacios de memoria de la MCS-251


En los microcontroladores de la familia MCS-251 (figura 3.11), se tienen tres espacios distintos de memoria: -El espacio de memoria para programas y datos. -El rea de registros de propsito general. -El rea de registros de funcin especial SFR. En la figura 3.11 se observa cmo los espacios de memoria de la familia MCS-251 se han ampliado considerablemente respecto a la familia MCS-51. El espacio de memoria para programas y datos de la MCS-251 se utiliza para almacenar el cdigo del programa que debe ejecutar el microcontrolador, as como los datos, resultados intermedios y

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

49

resultados finales relacionados con dicho programa. Este espacio tiene un tamao de 16Mbytes de posiciones de memoria distribuidas en 256 regiones de 64kbytes cada una, numeradas de la 00: a la FF:. La familia MCS-251 est diseada para tener hasta un mximo de 64kbytes de memoria interna no voltil, ubicada en la regin FF:. La memoria RAM interna est ubicada en la regin 00:, comenzando a partir de la direccin 00:0020H. La dimensin de la memoria interna depende de la versin de microcontrolador. El rea de registros de propsito general contiene 64 registros de 8 bits numerados decimalmente del 0 al 63. Estos registros tienen la funcin de guardar los datos y resultados que intervienen con ms frecuencia en el programa. El espacio SFR puede tener hasta 512 registros de 8 bits de funcin especfica que estn, en la mayora de los casos, relacionados con la programacin de los perifricos que incorpora el microcontrolador. Las direcciones de los registros de este rea van de la S:000H a la S:1FFH. En la direccin de un registro del rea SFR se utiliza el prefijo S: para diferenciarla de una direccin de memoria.
rea de memoria 16 Mbytes
FF:FFFFH

rea SFR 512 bytes


S:1FFH

S:000H

rea de registros de propsito general 64 bytes


63 00:0000H 0

Fig. 3.11 Espacio de direcciones para la familia MCS-251

3.4.1 rea de memoria En la figura 3.12 se muestra el rea de memoria de los microcontroladores 8XC251Sx. De los 16Mbytes de memoria tericamente tiles, tan slo se pueden usar 8 regiones de 64 kbytes, en concreto la 00:, 01:, 02:, 03:, FC:, FD:, FE: y FF:, donde se pueden almacenar indistintamente cdigo de programa o datos. El resto de regiones de memoria, de la 04: a la FB:, estn reservadas y no pueden ser utilizadas por el usuario. El nmero de lneas de direcciones de los microcontroladores de la serie 8XC251Sx es configurable por el usuario: el valor mximo es 18, lo que limita el nmero mximo de posiciones de memoria externa que se pueden direccionar de forma directa a 256kbytes. Las 8 posiciones de memoria que van de la direccin FF:FFF8H a la FF:FFFFH estn reservadas para la configuracin del dispositivo. En concreto, en la versin 8XC251Sx se utilizan slo los bytes

Los autores, 2001; Edicions UPC, 2001.

50

Microcontroladores MCS-51 y MCS-251

FF:FFF8H y FF:FFF9H para realizar la configuracin, el resto se reservan para la configuracin de futuras versiones de este microcontrolador. En la regin 00: se ubica la memoria RAM interna, en concreto entre la direccin 00:0020H y la 00:021FH, para aquellas versiones que disponen de 512 bytes de memoria RAM interna, o bien entre la direccin 00:0020H y la 00:041FH para aquellas versiones que disponen de 1Kbyte de posiciones de memoria RAM interna. La memoria RAM interna est destinada exclusivamente a guardar datos ya que no se puede ejecutar instrucciones almacenadas en ella. Los primeros 32 bytes de memoria, de la direccin 00:0000H a la 00:001FH, estn asociados al rea de registros. Por otra parte, las posiciones de memoria comprendidas entre la 00:0020H y la 00:007FH son accesibles a nivel de bit.
rea de memoria 16 Mbytes
FF:FFFFH

Regin FF:
Bytes de configuracin FF:FFF8H - FF:FFFFH FF:FFF7H

FF:0000H FE:FFFFH

Memoria externa
FF:2000H/FF:4000H

Memoria externa
FE:0000H FD:FFFFH

OTPROM/ROM interna
SB, SQ:16 Kbytes (FF:0000H - FF:3FFFH) SA, SP: 8 Kbytes (FF:0000H - FF:1FFFH)

Memoria externa
FD:0000H FC:FFFFH

Memoria externa
FC:0000H Regiones reservadas 04: a FB: 03:FFFFH

Memoria externa
03:0000H 02:FFFFH

Regin 00:
00:FFFFH

Memoria externa
02:0000H 01:FFFFH

Memoria externa
00:0220H/00:0420H

Memoria externa
01:0000H 00:FFFFH

RAM interna
SB, SQ: 1 Kbytes (00:0020H - 00:041FH) SA, SP: 512 bytes (00:0020H - 00:021FH) 32 bytes de registros de trabajo 00:0000H - 00:001FH

00:0000H

Fig. 3.12 Implementacin hardware del rea de memoria de los microcontroladores 8XC251SA, SB, SP y SQ

La memoria interna de lectura est ubicada en la direccin FF:. Las diferentes versiones del microcontrolador 8XC251Sx disponen de 0, 8 16kbytes de memoria interna del tipo ROM (83C251Sx) o OTPROM/EPROM (87C251Sx). En la figura 3.12 las zonas sombreadas se corresponden con la memoria interna, mientras que el resto de zonas se deben implementar, en caso que se utilicen, mediante de integrados de memoria externos.

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

51

3.4.2 rea de registros de propsito genrico El rea de registros de propsito general de la familia MCS-251 dispone de 64 registros numerados desde el 0 al 63, aunque los registros que estn ubicados entre las posiciones 32 y 55 estn reservados para futuras versiones, lo que reduce el nmero total de registros disponibles a 40, como se muestra en la figura 3.13. rea de registros 56 57 58 59 60 61 62 63

Posiciones 32-55 reservadas 24 16 8 0 25 17 9 1 26 27 18 19 10 11 2 3 28 20 12 4 29 21 13 5 30 22 14 6 31 23 15 7

Fig. 3.13 rea de registros de propsito general

Los registros situados entre la posicin 0 y 7 estn implementadas fsicamente en las direcciones 00:0000H a 00:001FH. Estas 32 posiciones de memoria constituyen un rea dentro del espacio de memoria denominada banco de registros, similar a la que poseen los microcontroladores de la familia MCS-51. Hay en total 4 bancos de registros de 8 posiciones cada uno, que aparecen representados en la figura 3.14.

rea de registros 63

rea de memoria
FF:FFFFH

8 0 1 2 3 4 5 6 7

0 1 2 3 4 5 6 7

00:0020H 18H 10H 08H 00H 1FH 17H 0FH 07H

Bancos de registros

Banco 3 Banco 2 Banco 1 Banco 0

Fig. 3.15 Ubicacin de las localizaciones 0 7 del rea de registros

Los autores, 2001; Edicions UPC, 2001.

52

Microcontroladores MCS-51 y MCS-251

Al igual que ocurre en la familia MCS-51, slo uno de los cuatro bancos es accesible a travs de los registros. El banco accesible o activo se selecciona a travs de los bits RS0 y RS1 del registro de estado PSW (tabla 3.6).
Tabla 3.6 Seleccin del banco de registros

Banco Banco 0 Banco 1 Banco 2 Banco 3

Rango de direcciones 00H-07H 08H-0FH 10H-17H 18H-1FH

Bits de seleccin de banco RS1 RS0 0 0 0 1 1 0 1 1

Despus de hacer un reset del microcontrolador, el banco activo por defecto es el banco cero, ya que los bits RS1 y RS0 se ponen a cero. Para cambiar de banco de registro se debe modificar el valor de los bits RS1 y RS0 mediante la instruccin adecuada. El rea de registros tiene la particularidad de que permite acceder a la informacin contenida en ella a nivel de byte, 16 bits (Word) y 32 bits (Dword), lo cual facilita la tarea de los compiladores de C para esta familia. No todos los registros del rea de registros son accesibles de las tres formas indicadas: las localizaciones que son accesibles a nivel de byte son las que van de la cero a la 15. Para identificar un registro al cual se accede a nivel de byte, se utiliza la letra R seguida del nmero de la localizacin correspondiente (figura 3.16). Por ejemplo, si se desea escribir el byte 5BH en la localizacin 9 se debe utilizar el nombre R9 para hacer referencia a esta localizacin: MOV R9,#5BH Slo el rango de localizaciones de la 0 a la 31 es accesible a nivel de Word. Un registro tipo Word est formado por dos localizaciones y se identifica con las letras WR seguido del nmero de la localizacin de menor peso que interviene en dicho registro. Por ejemplo, el registro WR2 est formado por las localizaciones 2 y 3. En la figura 3.16 estn indicados todos los registros Word disponibles. Todas las localizaciones del rea de registros son accesibles a nivel de Dword. Un Dword est formado por cuatro localizaciones y se identifica con las letras DR y el nmero de la localizacin de menor peso que interviene en el registro Dword. Por ejemplo, el registro DR28 est formado por las localizaciones 28, 29, 30 y 31. En la figura 3.16 se indican todos los registros Dwords posibles. Existen 4 registros del rea de registros que por motivos de compatibilidad con los microcontroladores de la familia MCS-51 poseen una funcin especfica. Estos registros son: - R10 es el registro B. - R11 es el registro acumulador (ACC o A). - DR56 es el registro puntero de datos extendido, DPX. - DR60 es el registro puntero de pila extendido, SPX. Los registros R10, R11, y algunas localizaciones de los registros DR56 y DR60, son accesibles tambin a travs del rea de registros de funcin especfica (SFR).

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

53

Una de las mejoras que tiene la familia MCS-251 respecto a la MCS-51, es que cualquiera de sus registros de tipo byte, del R0 al R15, puede realizar la funcin del acumulador en las instrucciones aritmticas y lgicas, lo que evita el cuello de botella que el acumulador supone para la MCS-51. En las instrucciones de la familia MCS-51 el registro acumulador era el principal registro en transferencias y operaciones aritmticas y lgicas. En cambio en la familia MCS-251 cualquier registro, del R0 al R15, puede realizar la tarea de acumulador. Por lo tanto, el acumulador no tiene, en esta familia, la importancia que posee en la familia MCS-51. El puntero de datos extendido DPX est ubicado en el registro DR56 (figura 3.16). Los tres bytes de menor peso del DPX (DPL, DPH y DPXL) son accesibles tambin a travs del rea SFR. Los registros DPL y DPH forman el puntero de datos DPTR de 16 bits. En la familia MCS-51 este registro se emplea de forma nica para acceder a la memoria externa de datos; sin embargo, para la familia MCS251 el acceso a la memoria externa o interna se puede hacer mediante cualquier registro de tipo Word o Dword. El registro DPXL ubicado en la localizacin 57 del rea de registros, permite seleccionar la regin de memoria (00:-FF:) a la que se desea acceder a travs del puntero de datos extendido. Registro byte

R8 R9 R10 R11R12 R13 R14 R15 R0 R1 R2 R3 R4 R5 R6 R7

rea de registros 56 57 58 59 60 61 62 63 Localizaciones 32-55 reservadas 24 16 8 0 25 17 9 1 26 27 18 19 10 11 2 3 28 20 12 4 29 21 13 5 30 22 14 6 31 23 15 7


WR24 WR16 WR8 WR0

Registro word

WR26 WR18 WR10 WR2

WR28 WR20 WR12 WR4

WR30 WR22 WR14 WR6

Registro dword DR56 DR60 0 1 2 3 4 5 6 7 Bancos de registros DR24 DR16 DR8 DR0 DR28 DR20 DR12 DR4

Fig. 3.16 Posibilidades de acceso al rea de registros

El registro Dword DR60 es el puntero de datos extendido, SPX (figura 3.17). El byte de la localizacin 63 es el puntero de pila, SP, de la familia MCS-51. EL byte de la localizacin 62 es la parte alta del puntero de pila, SPH. Estos dos bytes controlan el funcionamiento de la pila, que en la familia MCS-251 puede tener una dimensin mxima de 64 kbytes correspondientes a la regin 00: de memoria.

Los autores, 2001; Edicions UPC, 2001.

54

Microcontroladores MCS-51 y MCS-251

rea de registros
Parte alta del puntero de pila

Area SFR

SPH Puntero de pila SPH 60 61 62 SP 63 SP

S:BEH S:81H

DR60 = Puntero extendido de pila, SPX Parte baja del puntero extendido de datos DPXL Parte alta del puntero de pila DPH Parte baja del puntero de datos DPXL 56 57 DPH 58 DPL 59 DPL S:83H S:82H S:84H

DR56 = Puntero extendido de datos, DPX B ACC B ACC S:F0H S:E0H

R10, Registro B; R11, registro acumulador


Fig. 3.17 Registros dedicados y su correspondencia en el rea de registros SFR

3.4.3 rea de registros de funcin especfica SFR La mayora de los registros del rea de registros de funcin especfica (SFR) estn vinculados a la programacin de los perifricos de la familia MCS-251. En la tabla 3.7 aparecen los registros del rea SFR junto con el valor que adquieren cuando se realiza un reset del microcontrolador. Las direcciones del rea SFR que no estn ocupadas por registros (zonas sombreadas en la tabla 3.7) no estn implementadas, por lo que no se pueden utilizar. Al rea SFR slo se puede acceder a nivel de bit o byte, pero no a nivel de Word o Dword. En la tabla 3.8 se indican los distintos registros del rea SFR, junto con la direccin y una pequea descripcin de la funcin que realizan.

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

55

Tabla 3.7 Registros del rea SFR y sus valores de reset


0/8 F8 F0 E8 E0 D8 D0 C8 C0 B8 B0 A8 A0 98 90 88 80 ACC 00000000 CCON 00x00000 PSW 00000000 T2CON 00000000 IPL0 x0000000 P3 11111111 IE0 00000000 P2 11111111 SCON 00000000 P1 11111111 TCON 00000000 P0 11111111 0/8 B 00000000 CL 00000000 CCAP0L xxxxxxxx CCAP1L xxxxxxxx CCAP2L xxxxxxxx CCAP3L xxxxxxxx CCAP4L xxxxxxxx 1/9 CH 00000000 2/A CCAP0H xxxxxxxx 3/B CCAP1H xxxxxxxx 4/C CCAP2H xxxxxxxx 5/D CCAP3H xxxxxxxx 6/E CCAP4H xxxxxxxx 7/F FF F7 EF E7 CMOD 00xxx000 PSW1 00000000 T2MOD xxxxxx00 SADEN 00000000 CCAPM0 x0000000 CCAPM1 x0000000 CCAPM2 x0000000 CCAPM3 x0000000 CCAPM4 x0000000 DF D7 RCAP2L 00000000 RCAP2H 00000000 TL2 00000000 TH2 00000000 SPH 00000000 IPH0 x0000000 SADDR 00000000 WDTRS xxxxxxxx SBUF xxxxxxxx CF C7 BF B7 AF A7 9F 97 TMOD 00000000 SP 00000111 1/9 TL0 00000000 DPL 00000000 2/A TL1 00000000 DPH 00000000 3/B TH0 00000000 DPXL 00000001 4/C TH1 00000000 PCON 00xx0000 7/F 8F 87

5/D

6/E

Tabla 3.8 Registros del rea SFR Mnemnico Registros ACC B PSW PSW1 SP SPH DPTR DPL DPH DPXL PCON IE0 IPH0 IPL0 Nombre bsicos Acumulador Registro B Registro de estado (Program Status Word) Registro de estado 1 Parte baja del puntero de pila (Stack Pointer) Parte alta del puntero de pila Puntero de datos (Data Pointer) Parte baja del DPTR Parte alta del DPTR Parte baja del puntero extendido de datos Registro de control de potencia (Power Control) Registro de habilitacin de interrupciones Parte alta del registro de prioridad de interrupciones Parte baja del registro de prioridad de interrupciones Direccin S:E0H S:F0H S:D0H S:D1H S:81H S:BEH -S:82H S:83H S:84H S:87H S:A8H S:B7H S:B8H

Los autores, 2001; Edicions UPC, 2001.

56 Tabla 3.8 Registros del rea SFR (continuacin) Mnemnico Registros P0 P1 P2 P3 Puerto SCON SBUF SADEN SADDR Registros TL0 TH0 TL1 TL2 TL2 TH2 TCON TMOD T2CON T2MOD RCAP2L RCAP2H WDTRST Registros CCON CMOD CCAPM0 CCAPM1 CCAPM2 CCAPM3 CCAPM4 CL CH CCAP0L CCAP1L CCAP2L CCAP3L CCAP4L CCAP0H CCAP1H CCAP2H CCAP3H CCAP4H

Microcontroladores MCS-51 y MCS-251

Nombre de los puertos de entrada/salida Puerto 0 Puerto 1 Puerto 2 Puerto 3 de comunicacin serie Registro de control del puerto serie Registro buffer del puerto serie Mscara de direcciones esclavo (Slave Address Mask) Direccin esclavo (Slave Address) del Watchdog y de los Timer/Counter 0, 1 y 2 Parte baja del Timer/Counter 0 Parte alta del Timer/Counter 0 Parte baja del Timer/Counter 1 Parte alta del Timer/Counter 1 Parte baja del Timer/Counter 2 Parte alta del Timer/Counter 2 Registro de control de los Timer/Counter 0 y 1 Registro de control de modo de los Timer/Counter 0 y 1 Registro de control del Timer/Counter 2 Registro de control de modo del Timer/Counter 2 Byte bajo de captura del Timer/Counter 2 Byte alto de captura del Timer/Counter 2 Registro Watchdog del array de controladores programables (PCA) Registro de control del Timer/Counter PCA Registro de modo del Timer/Counter PCA Registro modo 0 del Timer/Counter PCA Registro modo 1 del Timer/Counter PCA Registro modo 2 del Timer/Counter PCA Registro modo 3 del Timer/Counter PCA Registro modo 4 del Timer/Counter PCA Byte bajo del Timer/Counter del PCA Byte alto del Timer/Counter del PCA Byte bajo del mdulo 0 de comparacin/captura del PCA Byte bajo del mdulo 1 de comparacin/captura del PCA Byte bajo del mdulo 2 de comparacin/captura del PCA Byte bajo del mdulo 3 de comparacin/captura del PCA Byte bajo del mdulo 4 de comparacin/captura del PCA Byte alto del mdulo 0 de comparacin/captura del PCA Byte alto del mdulo 1 de comparacin/captura del PCA Byte alto del mdulo 2 de comparacin/captura del PCA Byte alto del mdulo 3 de comparacin/captura del PCA Byte alto del mdulo 4 de comparacin/captura del PCA

Direccin S:80H S:90H S:A0H S:B0H S:98H S:99H S:B9H S:A9H S:8AH S:8CH S:8BH S:8DH S:CCH S:CDH S:88H S:89H S:C8H S:C9H S:CAH S:CBH S:A6H S:D8H S:D9H S:DAH S:DBH S:DCH S:DDH S:DEH S:E9H S:F9H S:EAH S:EBH S:ECH S:EDH S:EEH S:FAH S:FBH S:FCH S:FDH S:FEH

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

57

3.4.4 Compatibilidad con la arquitectura de la familia MCS-51 Las reas de memoria y los registros de la arquitectura MCS-51 estn contenidos dentro de los espacios de direcciones de la familia MCS-251, lo que posibilita la compatibilidad con los programas diseados para la familia MCS-51. En la figura 3.18 se muestra cmo quedan ubicados los espacios de direcciones de la familia MCS-51 dentro de la arquitectura de la familia MCS-251. Los 64kbytes de memoria de programa de la familia MCS-51 se corresponden con la regin FF: del rea de memoria de la familia MCS-251.

rea de memoria (16Mbytes)


FFFFH

rea SFR (512 Bytes)


S:1FFH S:100H 80H S:000H

Memoria de programa MCS-51


FF:0000H 0000H

SFRs MCS-51

FFH S:07FH

02:0000H FFFFH

Memoria externa de datos MCS-51


01:0000H 0000H

rea de registros (64 Bytes)


63

8 FFH

Reg. MCS-51
0

Memoria interna de datos MCS-51 00:0000H 00H

Fig. 3.18 Correspondencia de espacios de direcciones entre la familia MCS-51 y la MCS-251

Los 64kbytes de la memoria de datos externa se ubican en la regin de memoria especificada por el registro DPXL. Se puede acceder a este registro a travs de la localizacin 57 o a travs de la direccin S:084H del rea SFR. El valor que adquiere por defecto este registro despus de hacer un reset es el 01:, como se muestra en la figura 3.18, por lo que inicialmente la memoria externa de datos est ubicada en la regin 01:. La memoria externa de datos se puede reubicar en otra regin programando adecuadamente el registro DPXL. Los 256 bytes de memoria RAM interna de la familia MCS-51 estn ubicados en las direcciones del rea de memoria 00:0000H-00:00FFH. Los 128 bytes del rea SFR de la familia MCS-51 estn ubicados dentro de los 512 bytes del rea SFR de la familia MCS-251 a partir de la direccin S:080H, como se muestra en la figura 3.18, para mantener la compatibilidad con la familia MCS-251. Los registros de trabajo R0-R7 de la familia MCS-51, estn ubicados en los 32 primeros bytes del rea de memoria de la familia MCS-251 para mantener la compatibilidad.

Los autores, 2001; Edicions UPC, 2001.

58

Microcontroladores MCS-51 y MCS-251

3.5 Configuracin de la serie 8XC251Sx


Una de las caractersticas ms interesantes de la familia de microcontroladores MCS-251 es la posibilidad de configurar ciertas prestaciones de su funcionamiento para adaptarlo a las exigencias especficas de la aplicacin, lo que proporciona al usuario una gran flexibilidad en el diseo. Las opciones de configuracin abarcan diferentes categoras: [ [ [ Interfaz con la memoria externa. Modos de obtencin del cdigo de operacin. Seleccin de los bytes guardados en la pila por una interrupcin.

Reubicacin de los 8kbytes de memoria de lectura interna en la regin 00: para aquellas versiones que disponen de 16kbytes de memoria interna de tipo ROM/OTPROM/EPROM. Los bytes utilizados para configurar los microcontroladores de la serie 8XC251Sx son el UCONFIG0, en la direccin FF:FFF8H, y el UCONFIG1, en la direccin FF:FFF9H (figura 3.19).

UCONFIG0
---/WSA1 /WSA0 /XALE RD1 RD0 /PAGE SRC

/WSA1,0 : Control de insercin de estados de espera para memoria externa /XALE : Activacin de la seal ALE extendida RD1,0 : Seleccin del nmero de lneas del bus externo de direcciones /PAGE : Seleccin de modo paginado o no paginado SRC : Seleccin de modo fuente o modo binario

UCONFIG1
---------INTR WSB /WSB1 /WSB0 /EMAP

INTR : Seleccin de bytes almacenados en la pila por una interrupcin WSB : Activacin de estado de espera en accesos a memoria externa /WSB1,0 : Control de insercin de estados de espera para memoria externa /EMAP : Reubicacin de la memoria de lectura interna en la regin 00:
Fig. 3.19 Bytes de configuracin UCONFIG0 y UCONFIG1

Para los dispositivos que incorporan memoria ROM/OTPROM/EPROM interna, la informacin sobre la configuracin se almacena en memoria no volatil en estas direcciones. Para aquellas versiones de microcontrolador que no disponen de memoria ROM/OTPROM/EPROM interna la configuracin se almacena en memoria externa en las direcciones indicadas.

3.5.1 Configuracin del acceso a la memoria externa Existen distintas opciones que permiten configurar el acceso a la memoria externa de forma ms adecuada a la aplicacin que se est diseando:

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

59

1. 2. 3. 4.

La ubicacin del bus de datos en el puerto cero (modo no paginado) o el puerto 2 (modo paginado). El nmero de lneas del bus de direcciones externo (16, 17 o 18). Las regiones de memoria asignadas a las seales de control de lectura /RD y /PSEN. Los estados de espera en el acceso a la memoria externa (0, 1, 2 3 estados de espera).

La ubicacin de cierta cantidad de memoria de programa interna en la regin 00:.

3.5.1.1 Modos paginado y no paginado Con respecto a la ubicacin del bus de datos, se puede elegir entre dos posibilidades: modo paginado o modo no paginado, utilizando el bit /PAGE (bit 1 de la localizacin UCONFIG0). En el modo no paginado (/PAGE = 1) el bus de datos est ubicado en el puerto cero, al igual que en los microcontroladores de la familia MCS-51. Por tanto, este modo es el adecuado para aplicaciones donde se requiera compatibilidad a nivel de hardware con la familia MCS-51. En el modo paginado (/PAGE = 0) el bus de datos est ubicado en el puerto dos, lo que permite, bajo ciertas condiciones, reducir el tiempo de acceso a la memoria externa. En este modo se puede leer un cdigo de operacin en tan slo 2 ciclos de reloj, en lugar de los cuatro ciclos necesarios en el modo no paginado.

3.5.1.2 Nmero de lneas del bus de direcciones Los bits RD y RD1 (bits 2 y 3 de la localizacin UCONFIG0) permiten seleccionar el nmero de lneas de bus de direcciones externas y el rango de direcciones controlado por las seales de lectura /RD y /PSEN y la seal de escritura /WR. En la tabla 3.9 se muestran las distintas posibilidades de configuracin con respecto a los bits RD0 y RD1. RD1:0 = 00 (18 lneas de bus de direcciones) Si se programan los bits RD1 y RD0 a cero lgico se obtiene una configuracin de 18 lneas de bus externo de direcciones, lo que permite direccionar un total de 256kbytes de posiciones de memoria externas, que es la mxima cantidad de memoria que pueden direccionar los microcontroladores de la serie 8XC251Sx. Las 16 primeras lneas del bus de direcciones (de la A0 a la A15) estn soportadas por los puertos P0 y P2, la lnea A16 del bus de direcciones est ubicada en el canal P3.7 y la lnea de mayor peso, A17, en el canal P1.7. Con esta configuracin se utilizan dos seales para controlar el acceso ala memoria externa: [ /PSEN: controla las operaciones de lectura de la memoria externa para cualquier direccin (de la 00:0000H a la FF:FFFFH). [ /WR: controla las operaciones de escritura de la memoria externa para cualquier direccin (de la 00:0000H a la FF:FFFFH).

Los autores, 2001; Edicions UPC, 2001.

60

Microcontroladores MCS-51 y MCS-251

RD1:0 = 01 (17 lneas de bus de direcciones) Si se programan los bits RD1 y RD0 con los valores 0 y 1 respectivamente, se obtiene 17 lneas de bus externo de direcciones: las 16 primeras lneas, A0-A15, implementadas mediante los puertos P0 y P2, y la lnea A16 implementada con el canal P3.7. Con esta configuracin se pueden direccionar hasta 128kbytes de memoria externa. Las seales que controlan la lectura y escritura en la memoria externa son las mismas que para la configuracin RD1:0 = 00. RD1:0 = 10 (16 lneas de bus de direcciones) La configuracin RD1 =1 RD0 = 0 permite tener un total de 16 lneas de bus de direcciones, de la A0 a la A15, implementadas con los puertos P0 y P2. Esta configuracin permite direccionar hasta 64kbytes de memoria externa. Las seales de control de lectura y escritura son las mismas que en las dos configuraciones anteriores. RD1:0 = 11 (16 lneas de bus de direcciones) Con esta configuracin se tienen slo 16 lneas de bus externo de direcciones, implementadas en los puertos P0 y P2. Esta es la nica configuracin que mantiene la compatibilidad con la familia MCS-51 y para ello dispone de tres seales de control de acceso a la memoria externa (como en la familia MCS-51): [ /PSEN: seal de control de lectura en la memoria externa para las regiones FC:, FD:, FE: y FF:. [ /RD: seal de control de lectura en la memoria externa para las regiones 00:, 01:, 02: y 03:. [ /WR: seal de control de escritura en la memoria externa para las regiones 00:, 01:, 02: y 03:.
Tabla 3.9 Seleccin de seales de control para los posibles valores de RD1, RD0

RD1 RD0 P1.7/CEX/A17 P3.7/RD/A16 00 01 10 11 A17 P1.7/CEX4 P1.7/CEX4 P1.7/CEX4 A16 A16 P3.7 /RD

Direcciones asociadas a las seales de control PSEN RD WR Todas A16 Todas Todas A16 Todas Todas P3.7 Todas ] 80:0000H 7F:FFFFH 7F:FFFFH

3.5.1.3 Estados de espera en el acceso a la memoria externa Los estados de espera permiten alargar los ciclos de acceso a la memoria externa. Esto es necesario cuando la memoria externa a la que accede el microcontrolador no es suficientemente rpida. Cada estado de espera alarga la duracin del ciclo 2 perodos de reloj y es posible incluir hasta un mximo de 3 estados de espera. Se puede especificar la insercin de estados de espera de forma independiente en la regin 01:, lo cual permite ubicar una memoria lenta en esa regin manteniendo, sin embargo, un acceso rpido en el resto de regiones. Existen 4 bits para especificar los estados de espera: los bits WSA0 y WSA1 (bits 5 y 6 de la localizacin UCONFIG0), que permiten definir estados de espera para todas las regiones excepto la 01:, y los bits WSB0 y WSB1 (bits 1 y 2 de la localizacin UCONFIG1), que permiten definir estados

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

61

de espera en la regin 01:. En la tabla 3.10 se muestran los estados de espera que se introducen en funcin de los valores que adquieren los bits antes indicados.
Tabla 3.10 Configuracin de los estados de espera

Regiones 00: 02: 03: FC: FD: FE: FF:

01:

WSA1 WSA0 0 0 0 1 1 0 1 1 WSB1 WSB0 0 0 0 1 1 0 1 1

Estados de espera 3 2 1 0 3 2 1 0

Por otra parte poniendo a cero el bit /XALE (bit 4 de la localizacin UCONFIG0) se alarga el tiempo durante el cual la seal ALE est activa. 3.5.1.4 Configuracin del cdigo de operacin Con respecto a los modos de asignacin de cdigos de operacin a las instrucciones, el usuario puede seleccionar dos posibles modos: el modo binario que genera un cdigo de operacin compatible con los microcontroladores de la familia MCS-51, y el modo fuente, que es especfico de la familia MCS251. Cuando se configura el microcontrolador se debe elegir necesariamente uno de los dos modos. Se debe elegir aquel modo que permita obtener el cdigo ms eficiente. En principio los microcontroladores de la familia MCS-251 tienen dos tipos de instrucciones: [ [ Instrucciones originales de la familia MCS-51. Instrucciones exclusivas de la familia MCS-251.

En general, las instrucciones originales de la familia MCS-51 generan un cdigo ms eficiente en modo binario; en cambio las instrucciones exclusivas de la familia MCS-251 generan un cdigo ms eficiente en modo fuente. A modo de ejemplo se presenta en la tabla 3.11 varias instrucciones (de la familia MCS-51 y MCS251) con sus correspondientes cdigos de operacin obtenidos en los dos modos.
Tabla 3.11 Ejemplos de cdigos de operacin en modo binario y modo fuente

Instruccin DEC A SUBB A,R4 SUB R4,R4

Familia MCS-51 MCS-51 MCS-251

Cdigo de operacin Modo binario Modo fuente 14H 14H 9CH A5 9CH A5 9CH 9CH

Los autores, 2001; Edicions UPC, 2001.

62

Microcontroladores MCS-51 y MCS-251

3.5.1.5 Reubicacin de memoria de programa en la regin 00: Para las versiones del microcontrolador 8XC251Sx con 16kbytes de memoria interna, el usuario tiene la posibilidad de reubicar 8kbytes en la regin 00:, lo cual permite un acceso ms rpido a tablas de constantes almacenadas en esta memoria usando direccionamiento directo. Para poder realizar esta reubicacin ser necesario poner a cero el bit /EMAP (bit 0 de la localizacin UCONFIG1). Con este bit a cero, los 8kbytes de memoria de programa interna que van de la direccin FF:2000H a la direccin FF:3FFFH quedan reubicados en las direcciones 00:E000H-00:FFFFH (figura 3.20).

Regin FF:
FF:FFFFH EMAP = 0 FF:4000H FF:3FFFH 8 Kbytes FF:2000H FF:1FFFH 8 Kbytes FF:0000H 00:E000H

Regin 00:
00:FFFFH 8 Kbytes

00:DFFFH

00:0000H Fig. 3.20 Reubicacin de memoria de programa en la regin 00:

3.5.1.6 Bytes cargados en la pila por una interrupcin En cuanto a los bytes que se cargan en la pila por una interrupcin, el usuario puede elegir entre dos opciones: una de ellas permite cargar en la pila los dos primeros bytes del contador de programa (PC); la otra opcin carga los tres bytes del contador de programa y el registro de estado PSW1. El bit INTR (bit 4 de la localizacin UCONFIG1) configura una de las dos opciones. Si se pone este bit a cero se almacenan en la pila slo dos bytes del contador de programa. Si se pone a 1 se almacena todo el contador de programa ms el registro de estado.

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

63

4 Programacin de las familias MCS-51 y MCS-251


4.1 Introduccin
El desarrollo de los programas o del software necesarios para una aplicacin determinada de un sistema basado en un microcontrolador es una fase importante del diseo de este sistema; por ello, el programador debe tener un slido conocimiento del conjunto de instrucciones que incorpora el microcontrolador y de las tcnicas de programacin que se pueden desarrollar con las instrucciones disponibles. La finalizacin del programa est sujeta a un largo proceso de depuracin y de continuas modificaciones y mejoras realizadas durante el proceso de diseo. En el caso de aplicaciones sencillas, normalmente el programa tiene un tamao reducido, por lo que se realiza en lenguaje ensamblador mediante el conjunto de instrucciones que proporciona el fabricante del microcontrolador. No obstante, cuando la aplicacin resulta complicada y requiere de un tamao mayor de cdigo de programa, se suele combinar el uso de la programacin en bajo nivel (lenguaje ensamblador) con el empleo de la programacin en alto nivel (como pueden ser los lenguajes PLM o C). La realizacin del programa en lenguaje ensamblador permite obtener un tamao de cdigo de programa mucho ms compacto, eficiente y que usa mejor los recursos disponibles por el microcontrolador; sin embargo, el desarrollo del programa realizado en este lenguaje resulta ser ms tedioso y complicado de seguir por cualquier otro programador. Por otra parte, mediante el lenguaje en alto nivel, la complejidad y el tiempo de realizacin del programa resultan menores y ms fcil de entender por otros programadores, aunque el cdigo generado por estos lenguajes es de mayor tamao y de menos eficiencia. En consecuencia, los programas complejos y complicados se suelen hacer en lenguaje de alto nivel, combinando ste con pequeas rutinas en lenguaje ensamblador, encargadas de realizar la gestin de aquellas partes del hardware del sistema que necesitan de un cdigo ms optimizado, eficiente y compacto. Mientras que los programas que resultan ser reducidos y ms sencillos se suelen realizar en nicamente en lenguaje ensamblador. En este captulo se explicarn los distintos modos de direccionamiento y se describir el conjunto completo de instrucciones en lenguaje ensamblador soportados por las familias de microcontroladores MCS-51 y MCS-251 de Intel. Por ser la familia MCS-251 una versin mejorada de la familia MCS-51 y, adems, ser absolutamente compatible con sta a nivel de encapsulado y de programacin, el desarrollo de este captulo se orientar primero a la programacin de la familia MCS-51, para luego proceder a la explicacin de las mejoras introducidas en la familia MCS-251, con las que se superan las limitaciones en el uso de los registros y en el direccionamiento de la familia MCS-51. En la elaboracin de un programa en lenguaje ensamblador, el programador debe conocer las tcnicas ms comunes que se emplean en este lenguaje, y que resultan imprescindibles para llevar a cabo con

Los autores, 2001; Edicions UPC, 2001.

64

Microcontroladores MCS-51 y MCS-251

xito el programa que soluciona una aplicacin. Entre estas tcnicas se encuentran las siguientes: operaciones aritmticas con ms de un byte, operaciones aritmticas con signo, tratamiento de tablas, conversin de datos en diferentes formatos (hexadecimal-BCD, hexadecimal-siete segmentos, BCDhexadecimal, etc.), realizacin de rutinas de interrupcin, etc. La exposicin de estas tcnicas de programacin, junto con los ejemplos y ejercicios propuestos, son el tema central del siguiente captulo. Por tanto, este captulo, junto con el siguiente, constituye el ncleo fundamental que todo programador que desee trabajar con las familias de microcontroladores MCS-51 y MCS-251 debe considerar y conocer.

4.2 Tipos de direccionamiento


Una de las caractersticas de los microprocesadores o microcontroladores, en general, consiste en los distintos modos de direccionamiento que pueden soportar para llevar a cabo la ejecucin de cualquier instruccin del conjunto de instrucciones disponible. El modo de direccionamiento determina la forma de especificar el origen o el destino de los operandos de una instruccin, ya sean stos de tipo bit, byte, Word o double word. En concreto, las familias de microcontroladores MCS-51 y MCS-251 disponen de siete modos de direccionamiento distintos: - Direccionamiento inmediato. - Direccionamiento directo. - Direccionamiento por registro. - Direccionamiento indirecto. - Direccionamiento por desplazamiento o indexado. - Direccionamiento relativo. - Direccionamiento de bit.
Tabla 4.1 Notacin utilizada para la descripcin del direccionamiento y del conjunto de instrucciones comunes a la MCS-51 y a la MCS-251

Mnemnico dir8 dir16 dir11 #dato #dato16 Rn @Ri bit rel

Descripcin Direccin directa de 8 bits. Posiciones de memoria interna o rea de SFR. Direccin 16 bits de memoria empleada en direccionamientos directos. Direccin de 11 bits. Constante de 8 bits. Constante de 16 bits. Registro de tipo byte, R0 a R7. Direccionamiento indirecto a travs de R0 R1. Se accede a las posiciones (00HFFH) de la memoria interna. Bit de la memoria RAM interna o de un registro del rea de SFR accesible bit a bit. Direccin de salto. Puede ser un salto incondicional, condicional o de llamada a subrutina.

A lo largo de este captulo se emplear una notacin especfica que es til para realizar la descripcin del direccionamiento y de las instrucciones de las familias de microcontroladores. La tabla 4.1 muestra la notacin utilizada para la familia MCS-51 mientras que la tabla 4.2 muestra la notacin empleada para la familia MCS-251. Esta notacin tambin es vlida para la familia MCS-251. No obstante, como en la MCS-251 se

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

65

pueden emplear operandos del tipo byte Word y double word, la notacin para esta familia aumenta en cantidad, lo que se muestra en las tablas 4.2 y 4.3. En estas tablas se indica si la notacin es propia de las instrucciones de la familia MCS-51, de las nuevas instrucciones que incorpora la familia MCS-251 o de ambas.
Tabla 4.2 Notacin especfica utilizada en las instrucciones de la familia MCS-251

Notacin de los registros Rm Rms Rmd WRj WRjd WRjs @WRj+dis16

Descripcin

Registro tipo byte de R0 a R15. Registro fuente. Registro destino. Registro de tipo Word WR0, WR2, ., WR30. Registro destino. Registro fuente. Direccin de memoria (00:0000H-00:FFFFH) direccionada indirectamente por un registro de tipo Word (WR0-WR30) mas un valor de desplazamiento de 16 bits. Registro de tipo DR (Double Word) DR0, DR4, , DR28 DR56, DR60. DRk, Registro de destino. DRkd Registro fuente. DRks Direccin de memoria (00:0000H-00:FFFFH) direccionada indirectamente por un @DRk+dis24 registro de doble palabra (DR0, DR4, , DR56, DR60) ms un valor de desplazamiento de 24 bits. Dato inmediato Descripcin #0dato16 Constante de 32 bits que se direcciona de forma inmediata en una instruccin. Los #1dato16 16 bits de mayor peso del dato deben ser 0 (#0dato16) 1 (#1dato16). #short Constante igual a 1, 2 4, direccionada de forma inmediata en una instruccin. Direcciones Descripcin rel Direccin relativa de 8 bits expresada en complemento a 2. addr11 Direccin de 11 bits. addr16 Direccin de 16 bits. addr24 Direccin de 24 bits. Permite acceder a cualquier direccin de los 16Mbyte del espacio de memoria de la familia MCS-251.

4.2.1 Direccionamiento inmediato En el direccionamiento inmediato el operando de la instruccin es una constante que est definida dentro de la propia instruccin. Este tipo de direccionamiento es comn para las familias MCS-51 y MCS-251. Para la familia MCS-51 el tamao de la constante est limitado a 8 bits (1 byte), mientras que para la familia MCS-251 la constante puede ser de 8 bits (byte), 16 bits (Word) o 32 bits (Double word). En la familia MCS-51, por ejemplo, la instruccin MOV A, #09H pone el dato 09H mediante direccionamiento inmediato en el acumulador. Esta instruccin est formada por un cdigo mquina de 2 bytes: 74H y 09H. El byte 09H es el operando mientras que el byte 74H es el cdigo de operacin de la instruccin. El dato 09H est dentro de la propia instruccin; por tanto, es un

Los autores, 2001; Edicions UPC, 2001.

66

Microcontroladores MCS-51 y MCS-251

operando que la CPU coloca de forma directa en el acumulador, sin necesidad de obtenerlo de la memoria o de algn registro del microcontrolador. Este tipo de instruccin se usa de manera frecuente a lo largo de los programas y, especialmente, en la inicializacin de stos, puesto que se hace preciso asignar valores iniciales a las variables definidas por el programador. El direccionamiento inmediato tambin se emplea en aquellas instrucciones que operan nicamente con algn registro determinado del rea SFR, como puede ser el acumulador o el registro DPTR. Un ejemplo de ello es la instruccin INC A que incrementa en una unidad el acumulador. El cdigo mquina de esta instruccin est formado solamente por el byte 04H; luego en este mismo byte de cdigo est contenida la direccin del acumulador dentro del rea SFR como operando. Para la familia MCS-251 las constantes de 32 bits (Dword) deben tener todos los 16 bits de mayor peso a cero (indicado como #0dato16), o bien, todos a uno (indicado como #1dato16). Las instrucciones de incremento o decremento de esta familia, adems, incorporan un dato inmediato, que especifica el valor del tamao del incremento o decremento. Este valor puede ser 1, 2 4. Como ejemplo, las siguientes instrucciones de la familia MCS-51 utilizan el direccionamiento inmediato: INC A MOV A, #255; MOV A, #0FFH MOV A, #11111111b MOV DPTR, #1969H
1

;Incrementa el contenido del acumulador ;Coloca el nmero 255 en el acumulador ;Coloca 0FFH en el acumulador ;Coloca 0FFH (en binario) en el acumulador ;Coloca 1969H en el DPTR

Anlogamente, para la familia MCS-251 las siguientes instrucciones utilizan direccionamiento inmediato: INC WR0,#02H MOV DR4,#FFFF2350H 4.2.2 Direccionamiento directo En el direccionamiento directo la ubicacin del operando se especifica de forma directa mediante una direccin de ocho bits. Para la familia MCS-51, con este direccionamiento, es posible leer y escribir sobre cualquier direccin especificada, que puede corresponder con un byte de la memoria RAM interna (00H-7FH) o con un registro del rea SFR. Ejemplo: ADD A, 3BH ; Suma el contenido del acumulador (A) con el contenido de la posicin de ; memoria 3BH. El resultado se deja en el acumulador (A): ; A (A) + (3BH) ; Transfiere el contenido del puerto P0 (posicin 80H en el rea de SFR) al ; acumulador: A (80H) ;Incrementa el registro WR0 en dos unidades ;Carga el dato FFFF2350H en el registro DR4

MOV A, 80H

H indica que el nmero es hexadecimal y b que es uno binario. Cuando no lleva indicativo es un nmero decimal.

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

67

Para la familia MCS-251, el direccionamiento directo puede utilizar direcciones de 8 bits o de 16 bits. Con las direcciones de 8 bits se puede acceder a la memoria RAM interna (00H-7FH), para leer o escribir un byte o un Word, y tambin se puede acceder al rea de registros de funcin especfica SFR (S:080H-S:1FFH), para leer o escribir un byte nicamente. Con las direcciones de 16 bits se pueden realizar accesos de tipo byte o Word en memoria (00:0000H-00:FFFFH). Ejemplo: MOV R7,S:090H MOV R0,1200H ; Carga en el registro R7 el contenido del puerto P2 (direccin S:090H ; del rea SFR): R7 (S:090H) ; Transfiere el contenido de la direccin de memoria 1200H en el 2 ; registro R0: R0 (1200H)

4.2.3 Direccionamiento por registro En el direccionamiento por registro el dato que maneja la instruccin est incluido en uno de los registros del microcontrolador. En el direccionamiento por registro de la familia MCS-51 se utilizan los registros de propsito general, R0-R7, para almacenar el operando de la instruccin. A cada uno de estos registros se puede acceder mediante su nombre (direccionamiento por registro), o mediante su direccin (direccionamiento directo). Cuando una instruccin incluye un registro por su nombre, ste se codifica dentro de la propia instruccin mediante 3 bits, lo que permite compactar el cdigo generado por la instruccin. Por el contrario, cuando se accede al registro mediante su direccin, la instruccin debe contener la direccin del registro, por lo que el tamao de la instruccin se incrementa en 1 byte, que corresponde con la direccin dada para el registro. En consecuencia, es conveniente, en la medida de lo posible, utilizar los registros por su nombre, debido a que se obtiene as un cdigo ms compacto y eficiente. En el siguiente ejemplo las instrucciones de la familia MCS-51 transfieren el contenido del acumulador al registro R0, y luego el contenido del registro R7 al acumulador. Mediante los bits RS0 y RS1 del registro PSW se selecciona, de forma previa, el banco 2 de registros, por lo que los registros empleados, R0 y R7, se corresponden con las posiciones 10H y 17H de la memoria interna, respectivamente. Ejemplo: MOV PSW,#10H MOV R0, A ADD A, R7 ; Se selecciona el banco 2 de registros ; Transfiere el contenido del acumulador (A) al registro R0 ; R0 (A) ; Suma el contenido del registro R7 con el acumulador. ; A (A) + (R7)

Cuando un registro o una direccin se encuentra entre parntesis se refiere al contenido. (A) es el contenido del acumulador. (3B) es el contenido de la posicin de memoria 3BH. Las operaciones que se deben realizar se muestran a la derecha de la flecha (), y a la izquierda se indica sobre qu elemento se deja el resultado.

Los autores, 2001; Edicions UPC, 2001.

68

Microcontroladores MCS-51 y MCS-251

En cuanto a los registros del rea de registros de funcin especfica (SFR), existen algunas instrucciones que son propias de registros especficos, como es el caso del acumulador. Se puede acceder al acumulador de forma directa o mediante su direccin en el SFR (posicin E0H), de manera que las siguientes instrucciones son equivalentes: MOV A, #10H MOV 0E0H, #10H ; Almacena la constante 10H en el acumulador ; Almacena la constante 10H en la posicin E0H del SFR

La primera instruccin tiene un cdigo mquina de 2 bytes, 74H y 10H, mientras que la segunda tiene un cdigo mquina de 3 bytes, 75H, E0H y 10H. En la primera instruccin la direccin del acumulador est incluida en el cdigo de operacin, mientras que en la segunda instruccin para acceder al acumulador se debe especificar su direccin, incrementando, por tanto, en un byte el tamao de sta. Debe resaltarse que la familia de microcontroladores MCS-51 optimiza el tiempo de ejecucin y el tamao de cdigo de las instrucciones que utilizan de forma inmediata el acumulador A, el registro B y los registros del banco de registros seleccionado. En las instrucciones de la familia MCS-251 que soportan direccionamiento por registro, el operando puede estar ubicado en un registro tipo byte (del R0 al R15), en un registro tipo Word (WR0, WR2,, WR30), o en un registro tipo Dword (DR0, DR4, , DR28, DR56, DR60). Ejemplo: MOV R4, R8 MOV WR4,WR6 ; Transfiere el contenido del registro R8 al registro R4 ; R4 R8 ; Transfiere el contenido del registro WR6 al registro WR4 ; WR4 WR6

4.2.4 Direccionamiento indirecto En el direccionamiento indirecto la direccin del operando viene especificada por el contenido de un registro del microcontrolador. La familia MCS-51 utiliza el direccionamiento indirecto mediante los registros R0, R1, SP (puntero de la pila o Stack Pointer) y DPTR (puntero externo de datos o Data Pointer de 16 bits). De esta manera, se puede acceder tanto a la memoria interna como a la memoria externa de datos del microcontrolador. Debe notarse que como identificador de este tipo de direccionamiento se emplea el smbolo @, que debe ir delante del registro. A la memoria interna de datos (00H-FFH), se accede nicamente con los registros R0 y R1, aunque tambin se puede acceder mediante el puntero de la pila SP o Stack Pointer. Para acceder a la memoria externa de datos se pueden emplear los registros DPTR, R0 y R1. Los microcontroladores de la familia MCS-251 soportan el mismo modo de direccionamiento indirecto que el que se ha descrito para la familia MCS-51, pero, adems, tambin pueden emplear registros de tipo Word y Dword. Mediante los registros del tipo Word (@WRj, j=0, 2, 4, , 30) se puede acceder a las direcciones de memoria comprendidas en el margen (00:0000H-00:FFFFH). Mediante los registros del tipo Dword (@DRk, k = 0, 4, 8, , 28, 56 y 60) se puede acceder a los 16Mbytes del espacio de memoria; para ello se debe cargar previamente en los 24 bits de menor peso del registro la direccin a la que se desea acceder, teniendo a cero los 8 bits de mayor peso.

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

69

Ejemplo: MOV R0, #30H ADD A, @R0 ; Suma el contenido del acumulador (A) con el contenido de la posicin ; de memoria apuntada por el registro R0. Si (R0)=30H, la operacin es: ; A (A) + 30H MOV R1, #30H ; Pone 70H en la posicin de memoria interna 30H MOV @R1, #70H ; (30H) #70H MOV DPTR, #1000H ; Transfiere el contenido de la posicin de memoria apuntada por DPTR MOVX A, @DPTR ; al acumulador (A). Con MOVX se accede a la memoria externa de ; datos, activando un ciclo de lectura de dato en la memoria externa: ; A (1000H) MOV WR0, #2000H ;Carga en el registro R15 el contenido de la posicin de memoria ADD R15, @WR0 ; apuntada por el registro WR0. Si (WR0)=2000H, la operacin es: ; R15 (2000H) MOV DR4, #15000H ;Almacena el valor A0H en la posicin de memoria MOV R4,#00H ; FF:5000H #A0H MOV @DR4, #A0H

4.2.5 Direccionamiento por desplazamiento o indexado En el direccionamiento por desplazamiento o indexado el operando se obtiene mediante una direccin, cuyo valor es el resultado de la suma de una direccin base con un valor relativo de desplazamiento respecto de esta direccin base. El direccionamiento indexado est especialmente concebido para facilitar la lectura y el movimiento de tablas de datos en un programa. Para la familia MCS-51, en este direccionamiento se utilizan los registros DPTR y PC (contador de programa) como punteros que apuntan a la direccin inicial o base de la tabla de datos a tratar. La posicin concreta del dato dentro de la tabla, se obtiene mediante la suma del contenido del acumulador con la direccin base de la tabla; de esta forma el acumulador contiene la posicin relativa del dato dentro de la tabla. Se debe destacar que las nicas instrucciones que tienen este tipo de direccionamiento son la instruccin MOVC y la instruccin JMP, por lo que su uso est limitado a la lectura de tablas fijas en la memoria de cdigo de programas (MOVC) y a realizar saltos indexados de ejecucin del programa. Como ejemplo se plantea la lectura de una tabla de datos situada en la posicin 1000H de la memoria de programas, que se utiliza para realizar la conversin de datos expresados en formato BCD al formato siete segmentos, necesario para la posterior visualizacin en un dgito de siete segmentos. Ejemplo: MOV DPTR, #1000H MOV A, #05H MOVC A, @A+DPTR

; Pone en el DPTR la direccin de la tabla ; Pone en A el dato numrico 5, para realizar ; la conversin a siete segmentos

En este ejemplo el registro DPTR toma el valor 1000H y el acumulador el valor 05H, luego la instruccin MOVC realiza una lectura de un byte en la posicin 1005H de la memoria de programas, que resulta de sumar el DPTR con el acumulador (1000H + 05H). La tabla existente en la memoria de programas tiene la siguiente forma:

Los autores, 2001; Edicions UPC, 2001.

70

Microcontroladores MCS-51 y MCS-251

Direccin 1001H 1000H 1002H 1003H 1004H 1005H 1006H 1007H 1008H 1009H

Memoria C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H A=0 A=1 A=2 A=3 A=4 A=5 A=6 A=7 A=8 A=9

En la familia MCS-251 se utiliza este tipo de direccionamiento para realizar transferencias de datos entre el rea de registros y la memoria. El desplazamiento puede ser un valor de 16 bits que, sumado al contenido de un registro tipo Word (@WRj+dis16), dar como resultado la direccin de memoria a que se debe acceder. De esta forma se puede acceder a los primeros 64kbytes del espacio de memoria. El valor del desplazamiento puede ser positivo o negativo y se representa en complemento a 2 (-32768 < dis16 < 32767). Si el resultado de la suma excede los 16 bits slo se toman los 16 primeros para determinar la direccin de acceso. El desplazamiento puede ser tambin un valor de 24 bits (@DRk+dis24); en este caso el registro base debe ser un registro Dword (DR0, DR4, DR8, , DR28, DR56 o DR60). Con este tipo de desplazamiento es posible acceder de forma indirecta a los 16Mbytes del espacio de memoria de la MCS-251. Ejemplo: MOV WR0, #3000H ADD R4, @WR0+0030H MOV DR8, #02000H MOV R0, @DR8+0080H ; Carga en el registro R4 el contenido de la posicin de memoria ; apuntada por el registro WR0+30H. Si (WR0)=3000H, la ; operacin es: R4 (3030H) ; Almacena en el registro R0 el contenido de la posicin de ; memoria apuntada por el registro DR8+80H. Si (DR8)=2000H, ; la operacin es: R0 (2080H)

A modo de resumen, en las tablas 4.3 y 4.4 se presentan las distintas posibilidades de direccionamiento inmediato, directo, por registro, indirecto e indexado de las familias MCS-51 y MCS-251 respectivamente.

4.2.6 Direccionamiento de bit Este tipo de direccionamiento se caracteriza por permitir direccionar bits individualmente. El direccionamiento de bit tan slo se puede emplear en algunos registros del rea SFR o en las posiciones de la memoria RAM interna a que puede accederse bit a bit. La tabla 4.5 muestra, para las familias MCS-51 y MCS-251, las posiciones de la RAM interna y del rea del SFR a las que puede accederse de esta manera.

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251 Tabla 4.3 Direccionamiento por registro, inmediato, directo e indirecto para la MCS-51

71

Direcciona- Rango de direcciones miento del operando


Registro Inmediato Directo

Notacin

Comentarios

Indirecto

00H - 1FH R0-R7 (Banco seleccionado con PSW). El operando est en la #dato=#00-#FFH instruccin 00H - 7FH dir8=00H-7FH RAM interna. SFRs dir8=80H-FFH o nombre de un registro Direcciones del rea SFR. del SFR. 00H - FFH @R0, @R1 RAM interna o memoria de datos externa (MOVX). 0000H - FFFFH @DPTR, @A+DPTR Acceso a la memoria externa de datos (MOVX). 0000H - FFFFH @A+DPTR, @A+PC Acceso a la memoria de programa (MOVC).

Tabla 4.4 Direccionamiento por registro, inmediato, directo, indirecto y por desplazamiento para la MCS-251

Modo de direccionamiento
Registro

Rango de direcciones del operando

Notacin

Comentarios
R0-R7, WR0-WR6, DR0 y DR6 estn ubicados en el banco de registros seleccionado por RS0 y RS1. Se utiliza slo en instrucciones de incremento y decremento.

Inmediato 2 bits Inmediato 8 bits Inmediato 16 bits

00:0000H-00:001FH R0-R15,WR0-WR30, (R0-R7, WR0-WR3, DR0-DR28, DR56-DR60 DR0,DR2) (1) #short=1, 2 4

#dato8=#00H-#FFH #dato16=#0000H#FFFFH Directo 00:0000H-00:007FH dir8=00:0000HRAM interna 00:007FH direcciones de 8 bits SFRs dir8=S:080H-S:1FFH Direcciones del rea SFRs. o el nombre del registro Directo direcciones 00:0000H-00:FFFFH dir16=00:0000Hde 16 bits 00:FFFFH Indirecto direcciones 00:0000H-00:FFFFH @WR0-@WR30 de 16 bits Indirecto direcciones 00:0000H@DR0-@DR30, Los 8 bits de mayor peso del registro de 24 bits FF:FFFFH @DR56, @DR60 DRk deben ser 00H. El desplazamiento se expresa en Desplazamiento con 00:0000H-00:FFFFH @WRj+dis16 = complemento a 2. @WR0+0H hasta direcciones de 16 @WR30+FFFFH bits El desplazamiento se expresa en @DRk+dis24 = Desplazamiento con 00:0000Hcomplemento a 2. Los 8 bits de mayor @DR0+0H hasta direcciones de 24 FF:FFFFH peso del registro DRk debe ser 00H. @DR56+FFFFH, bits @DR56+(0H-FFFFH), @DR60+(0H-FFFFH) (1) Estos registros estn implementados en el espacio de memoria

Los autores, 2001; Edicions UPC, 2001.

72 Tabla 4.5 reas de direccionamiento de bit

Microcontroladores MCS-51 y MCS-251

Arquitectura MCS-51 MCS-251 RAM interna 20H-2FH 20H-7FH

Localizaciones de bit SFR Registros SFR cuya direccin acaba con 0 8: 80H, 88H, 90H, 98H, ,F8H. Todos los registros SFR definidos.

Tal y como se observa en esta tabla, el rango de bits que se puede direccionar a nivel de bit en la familia MCS-251 es mucho mayor que en la familia MCS-51. Para la familia MCS-51 existen dos maneras de direccionar los bits de la memoria RAM interna: i) Especificando la direccin donde est ubicado el bit junto con la posicin del bit dentro del byte que lo soporta. ii) Especificando la direccin propia del bit perteneciente al rango 00H-7FH. La figura 4.1 muestra de forma grfica estas dos posibles formas. Por ejemplo, el bit nmero 3 de la posicin de memoria 21H se puede referir como 21H.3, o bien como 0BH.

Memoria RAM interna

Memoria RAM interna

2FH 7

2FH

7FH 7EH 7DH 7CH 7BH 7AH 79H 78H

21H 7 20H 7

6 6

5 5

4 4

3 3

2 2

1 1

0 0

21H 20H

0FH 0EH D0H 0CH 0BH 0AH 09H 08H 07H 06H 05H 04H 03H 02H 01H 00H

Fig. 4.1 Direccionamiento de bits de la memoria RAM interna en la familia MCS-51

La familia MCS-51 dispone tambin de dos formas de direccionar, a nivel de bit, los bits del rea SFR: i) Especificando la direccin o nombre del registro donde est ubicado el bit junto con la posicin del bit dentro del byte que lo soporta. ii) Especificando la direccin propia del bit perteneciente al rango 80H-FFH. Por ejemplo, la direccin del bit 3 del acumulador se puede escribir como ACC.3, E0H.3 o E3H. En la familia MCS-251, la direccin de un bit se indica mediante la direccin donde est ubicado el bit y la posicin que ocupa dentro del byte que lo contiene. Para el caso de bits ubicados en el rea SFR, en lugar de la direccin se puede indicar, si se desea, el nombre del registro.

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

73

Area SFR
F8H F0H E8H E0H D8H D0H C8H C0H B8H B0H A8H A0H 98H 90H 88H 80H B ACC PSW T2CON IP P3 IE P2 SCON P1 TCON P0 FFH B F7H EFH ACC E7H DFH PSW D7H T2CON CFH C7H IP BFH P3 B7H IE AFH P2 A7H SCON 9FH P1 97H TCON 8FH P0 87H FEH F6H EEH E6H DEH D6H CEH C6H BEH B6H AEH A6H 9EH 96H 8EH 86H

Area SFR
FDH F5H EDH E5H DDH D5H CDH C5H BDH B5H ADH A5H 9DH 95H 8DH 85H FCH F4H ECH E4H DCH D4H CCH C4H BCH B4H ACH A4H 9CH 94H 8CH 84H FBH F3H EBH E3H DBH D3H CBH C3H BBH B3H ABH A3H 9BH 93H 8BH 83H FAH F2H EAH E2H DAH D2H CAH C2H BAH B2H AAH A2H 9AH 92H 8AH 82H F9H F1H E9H E1H D9H D1H C9H C1H B9H B1H A9H A1H 99H 91H 89H 81H F8H F0H E8H E0H D8H D0H C8H C0H B8H B0H A8H A0H 98H 90H 88H 80H

Fig. 4.2 Direccionamiento de bit en el rea SFR de la familia MCS-51

4.2.7 Direccionamiento relativo El direccionamiento relativo est vinculado a las instrucciones de salto. En este tipo de direccionamiento la instruccin incluye un valor que indica la magnitud del salto a realizar. El valor es de 8 bits y est expresado en complemento a 2, de forma que la magnitud del salto es de -128 posiciones de memoria hacia atrs o de 127 posiciones de memoria hacia delante, empezando a contar a partir de la direccin donde est ubicado el primer byte de la siguiente instruccin. Ejemplo: SJMP rel JC rel ;Realiza un salto incondicional cuya magnitud se indica con el valor de 8 bits rel ;Realiza un salto condicional donde la condicin de salto es CY=1

4.3 Conjunto de instrucciones de la familia MCS-51 y MCS-251


Una de las caractersticas ms importantes de cualquier microcontrolador o microprocesador reside en el conjunto de instrucciones que incorpora. El conjunto de instrucciones es el nico cdigo que la CPU es capaz de interpretar, decodificar y ejecutar. El desarrollo de programas para un microprocesador determinado requiere que el programador tenga un conocimiento completo de su conjunto de instrucciones y del modelo de programacin que permite ste; adems de un conocimiento detallado del tamao en cdigo mquina y del tiempo de ejecucin de cada una de las instrucciones, puesto que este conocimiento es vital en la determinacin de los tiempos de ejecucin de las rutinas generadas y para la reduccin, en la medida de lo posible, del tamao del cdigo generado por el programador. Mediante el conjunto de instrucciones de las familias MCS-51 y MCS-251 es posible realizar operaciones aritmticas y lgicas, como suma, resta, multiplicacin, divisin, and, or, or-exclusiva y

Los autores, 2001; Edicions UPC, 2001.

74

Microcontroladores MCS-51 y MCS-251

negacin, con datos de 8 bits. Tambin se pueden ejecutar instrucciones de intercambio de bytes, de salto, etc. Esta familia, adems, est concebida para poder operar a nivel de bit, por lo que puede realizar operaciones lgicas y de movimiento con bits. El conjunto de instrucciones de la familia de microcontroladores MCS-251 incorpora nuevas instrucciones que aprovechan las ventajas de la arquitectura de este microcontrolador manteniendo la compatibilidad con el conjunto de instrucciones de la familia MCS-51. Muchas de las nuevas instrucciones pueden operar con datos de 8 bits, 16 bits o 32 bits. Esta capacidad incrementa la eficiencia y facilidad de programacin de los microcontroladores de la familia MCS-251 en un lenguaje de alto nivel como el C. El conjunto de instrucciones que ejecutan las familias de microcontroladores MCS-51 y MCS-251 se dividen en tres grupos: instrucciones que operan con datos de 8 bits y con datos de 16 y 32 bits (slo para la familia MCS-251), instrucciones que operan con bits e instrucciones de control que permiten realizar saltos en la ejecucin del programa. Para poder comprender de forma correcta tanto el conjunto de instrucciones como los ejemplos empleados a lo largo de este captulo, es preciso explicar previamente el formato de las instrucciones, algunas directivas comunes del programa ensamblador y la definicin y uso de etiquetas dentro de un programa.

4.3.1 Formato de una instruccin En lenguaje ensamblador una instruccin puede esta formada por cuatro partes diferentes: una etiqueta, un mnemnico o palabra clave que identifica el tipo de instruccin, un operando fuente, y un operando destino. En las instrucciones las etiquetas son opcionales y son definidas por el programador. Las etiquetas se utilizan para distinguir una instruccin dentro del programa realizado, y para que la instruccin a la que se adjunta una etiqueta se pueda referenciar en cualquier instruccin de salto del programa. Para ello, cuando el programa ensamblador detecta una etiqueta le asigna, de manera automtica, la direccin de la instruccin a la que hace referencia. De esta forma, cualquier instruccin que contenga una direccin de salto puede emplear cualquier etiqueta definida dentro del programa. A modo de ejemplo se proponen las siguientes instrucciones: Etiqueta Retardo: Suma: Mnemnico MOV ADD MOV INC DJNZ SJMP PUSH 1er Operando R0 A 20H A R2 Salir A , Bucle , , , , 2 Operando #70H 70H @R0

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

75

Por ejemplo, en el caso de una etiqueta, la instruccin DJNZ R2, Bucle decrementa en una unidad el registro R2 y, si R2 es distinto de cero, realiza un salto a la direccin donde se halla la etiqueta Bucle; es decir, si se cumple la condicin R2 [ 0, se coloca la direccin asignada a Bucle en el contador de programa PC, de forma que la CPU pasa a ejecutar el programa por la direccin que representa la etiqueta. Las etiquetas tambin se emplean para referenciar el inicio de una subrutina. Las etiquetas pueden definirse tan slo una vez dentro de un mismo programa, sin embargo, pueden usarse tantas veces como sea necesario cuando se referencian por otra instruccin. El programador tiene libertad de emplear cualquier conjunto de caracteres para definir una etiqueta, salvo las limitaciones propias del programa ensamblador, por lo que se debe evitar la duplicacin de etiquetas con el mismo nombre dentro de un mismo programa. Las etiquetas se deben colocar en el extremo izquierdo de cada lnea de programa, y se debe guardar al menos un espacio entre la etiqueta y el resto de la instruccin. La etiqueta debe terminarse con dos puntos o sin ninguna puntuacin, dependiendo del programa ensamblador que se utilice. En este libro se emplean dos puntos al final de cada etiqueta a lo largo de toda la obra. El mnemnico de una instruccin es una palabra abreviada que indica la funcin que realiza la instruccin, como MOV, ADD, INC, JMP, etc. La familia MCS-51 dispone de 111 instrucciones en total y la familia MCS-251 de 213 instrucciones. Los operandos pueden ser registros, constantes o posiciones de memoria accedidas mediante los distintos tipos de direccionamientos que soporta el microcontrolador. Un operando tambin puede ser una direccin de salto en el caso de instrucciones de salto condicional o incondicional. En el caso de que una instruccin contenga dos operandos, se introduce una coma para hacer de separacin entre ambos. Las instrucciones operan de varias maneras diferentes sobre los operandos. Existen instrucciones con un nico operando donde ste constituye el origen y el destino de la operacin, como INC A, que primero lee el contenido del acumulador, lo incrementa en una unidad y deja el resultado en el mismo acumulador. Otras instrucciones operan con ambos operandos, dejando el resultado de la operacin en el primer operando: por ejemplo, la instruccin ADD A, #70H suma el contenido del acumulador con la constante 70H, dejando el resultado en el mismo acumulador. Por ltimo, si el programador quiere poner comentarios en una instruccin, basta con que aada un punto y coma al final de la instruccin, colocando el comentario a continuacin. Por ejemplo: MOV R0, A ; Salva el contenido del acumulador en R0

4.3.2 Directivas de ensamblador En la realizacin de un programa en lenguaje ensamblador, es habitual utilizar una serie de directivas que no generan cdigo mquina y que ayudan al programa ensamblador a dirigir y controlar el proceso de ensamblado. De todas las directivas existentes en lenguaje ensamblador se describirn slo las que se suelen emplear con mayor frecuencia. Las directivas principales son: ORG, EQU, DB y END.

Los autores, 2001; Edicions UPC, 2001.

76

Microcontroladores MCS-51 y MCS-251

La directiva ORG es una abreviacin de la palabra inglesa origin y permite especificar el valor de la direccin de memoria donde va a ser cargada la prxima instruccin o dato a ensamblar, o sea, inicializa el contador de programa con el valor que acompaa a la directiva. La sintaxis de esta directiva es la siguiente: ORG <direccin>

Esta directiva pone en el contador de programa, PC, la direccin indicada por <direccin>, de manera que la primera instruccin en ejecutarse es la primera que aparece tras esta directiva. La directiva ORG puede aparecer en cualquier parte del programa y el programador puede colocar tantas como crea conveniente. Esta directiva se puede utilizar para asignar una direccin concreta a una subrutina, para definir una posicin determinada de salto o para asignar una direccin a una tabla de datos. Ejemplo: ORG 0100H Inicio: MOV R0,#09H ADD A, R0 ;Determina la direccin 0100H ;Pone 09H en R0 ;Suma el acumulador con el valor 09H

A la etiqueta Inicio, al ir precedida de la directiva ORG, el ensamblador le asignar el valor de 0100H, de forma que las dos instrucciones del programa irn almacenadas en memoria a partir de la direccin 0100H. Si se desea asignar una direccin determinada a una subrutina basta con emplear la directiva ORG al inicio de la misma. Por ejemplo, si se desea que la subrutina de conversin de nmeros binarios a nmeros en formato ASCII comience en la direccin 2400H, se debe incluir la siguiente directiva: ORG 2400H Bin_ASCII: MOV A, R0 ........ RET

; Salva R0 en A ; Fin de la subrutina

La directiva EQU se utiliza para asignar a un smbolo alfanumrico un valor numrico o un string (cadena de caracteres). Es importante resaltar que esta directiva no reserva espacio en memoria, por lo que los valores que se definan mediante EQU los mantiene el ensamblador y los emplea en el proceso de ensamblado. La sintaxis de la directiva EQU es la siguiente: <smbolo> Ejemplo: num rea reg EQU 20H EQU num*num EQU A ; Asigna el valor 20H al smbolo num ; rea de un cuadrado ; Asigna al smbolo reg el nombre de un registro EQU <expresin>

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

77

La directiva DB reserva espacios de memoria de 8 bits (1 byte) a partir de la ubicacin de dicha directiva. El espacio reservado se llena con el valor, la lista de datos o la expresin que acompaa a la directiva. Si el dato que acompaa a la directiva va entre comillas se interpreta como constantes alfanumricas (caracteres), y el espacio reservado se carga con el cdigo ASCII asociado a dichas constantes. Si el dato no va entrecomillado se interpreta como valor numrico. Los caracteres numricos deben ir acompaados por comas. La sintaxis de esta directiva es: DB [[<espacio de datos>]] <dato> [ [[<espacio reservado>]]<dato>] Ejemplo: DB Ensamblador ; Reserva e inicializa 11 bytes con los valores de cdigo ASCII ; correspondientes a los caracteres de la palabra ensamblador DB 1,2 ; Reserva 2 bytes. Al primer byte le asigna el nmero 1 y al segundo el 2 DB [10]1,[10]2 ; Reserva 20 bytes. Los 10 primeros se ponen a 1 y los 10 restantes a 2 La directiva END indica el final del programa, por tanto, siempre es la ltima sentencia de un programa. El ensamblador termina el proceso de ensamblado cuando se encuentra con esta directiva.

4.3.3 Los registros de estado PSW y PSW1 La funcin de los registros de estado en las familias de microcontroladores MCS-51 y MCS-251 es diversa: incorporan bits o flags (banderas) que proporcionan informacin acerca del resultado de las operaciones aritmticas y lgicas realizadas por el microcontrolador, incorporan los bits de seleccin del banco de registros e incorporan bits cuya funcin es definible por el usuario. Los microcontroladores de la familia MCS-51 disponen de un nico registro de estado: el Program Status Word (PWS), mientras que los microcontroladores de la familia MCS-251 disponen de este mismo registro ms otro registro de estado adicional: el PSW1. Los registros PSW y PSW1 contienen cuatro tipos diferentes de bits: - Los bits CY, AC, OV, N y Z, que son indicadores que se ponen a 1 lgico automticamente como respuesta al resultado de una operacin. - El bit P que indica la paridad del acumulador. - Los bits RS0 y RS1, cuyo estado determina la seleccin del banco de registros activo que ubica los registros R0-R7. - Los bits F0 y UD, que son bits de propsito general definibles por el usuario. En las tablas 4.6 y 4.7 estn representados el contenido de los bits de los registros de estado PSW y PSW1. Hay que indicar que cinco bits del registro PSW estn repetidos en el registro PSW1. En estos casos la funcin de estos bits es la misma. En la tabla 4.8 se muestran las instrucciones cuya ejecucin afecta al valor de los bits CY, AC, OV, N y Z.

Los autores, 2001; Edicions UPC, 2001.

78 Tabla 4.6 Registro PSW

Microcontroladores MCS-51 y MCS-251

Nmero Mnemnico Funcin de bit 7 CY o C Bit de acarreo. CY se pone a 1 lgico si en las instrucciones de suma o resta se produce acarreo en el bit sptimo. CY tambin est afectado por las instrucciones RRC, RLC, MUL, DA, JBC y CJNE. 6 AC Bit de acarreo auxiliar. AC se activa si en las instrucciones de suma o resta se produce acarreo en el bit tercero. 5 F0 Bit F0. Este bit es de propsito general y definible por el usuario. 4:3 RS1:0 Estos dos bits permiten seleccionar el banco de registros que soportan los registros R0-R7. RS1 RS0 Banco Direcciones 0 0 0 00H - 07H 0 1 1 08H - 0FH 1 0 2 10H - 17H 1 1 3 18H - 1FH 2 OV Bit de rebasamiento o overflow. Este bit se pone a 1 lgico cuando se produce un error de overflow en operaciones de suma o resta. OV tambin se pone a 1 cuando el resultado de una multiplicacin es mayor de un byte, o cuando se realiza una divisin por cero. 1 UD Bit UD. Este bit es de propsito general y definible por el usuario. 0 P Bit de paridad. Indica la paridad del acumulador. Se pone a 1 cuando el nmero de unos de A es impar, y a 0 cuando es par.
Tabla 4.7 Registro PSW1

Nmero Mnemnico Funcin de bit 7 CY o C Bit de acarreo. Su funcin es idntica a la del bit CY del PSW. 6 AC Bit de acarreo auxiliar. Funcin idntica a la del bit AC del PSW. 5 N Bit negativo. Este indicador se pone a 1 cuando el resultado de la ltima operacin aritmtica o lgica es negativo, o sea, cuando el bit de mayor peso del resultado est a 1. En caso contrario se pone a cero. 4:3 RS1:0 Tienen la misma funcin que en el registro PSW. 2 OV Bit de rebasamiento. Tiene la misma funcin que en el registro PSW. 1 Z Bit de cero. Se pone a 1 cuando el resultado de la ltima operacin aritmtica o lgica es cero. En caso contrario, el bit Z se pone a cero. 0 Bit reservado.

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251 Tabla 4.8 Activacin de los bits de los registros PSW y PSW1

79

Tipo de instruccin Aritmtica

Instruccin ADD, ADDC, SUB, SUBB, CMP INC, DEC MUL, DIV DA ANL, ORL, XRL, CLR A, CPL A, RL, RRL, SWAP RLC, RRC, SRL, SLL, SRA CJNE DJNE CY X 0 X X X

Lgica Control de programa

Bits afectados OV AC N X X X X X X X X X X X

Z X X X X X X X X

4.3.4 Instrucciones aritmticas Las instrucciones aritmticas de la familia MCS-51, se pueden diferenciar en tres tipos distintos: a) instrucciones de suma y resta, b) instrucciones de incremento y decremento, y c) instrucciones de multiplicacin y divisin. La familia MCS-251 tiene los mismo tipos de instrucciones aritmticas que la MCS-51, y un tipo ms: la instruccin de comparacin. La tabla 4.9 muestra el conjunto de instrucciones aritmticas que posee la familia MCS-51, donde se realiza una breve descripcin de cada instruccin, mientras que la tabla 4.10 muestra las instrucciones aritmticas para la MCS-251. Se debe tener en cuenta que todas las instrucciones de la MCS-51 tambin se pueden ejecutar en la familia MCS-251, puesto que es compatible, en modo binario, con la MCS-51.
Tabla 4.9 Instrucciones aritmticas comunes a las familias MCS-51 y MCS-251

Mnemnico
ADD

<dest>,<src>
A, Rn A, dir8 A, @Ri A, #dato A, Rn A, dir8 A, @Ri A, #dato A Rn dir8 @Ri DPTR AB AB A

Descripcin
A=A+ Rn A=A+ (dir8) A=A+ (@Ri ) A=A+ dato A=A ] Rn A=A ] (dir8) ] C A=A ] (@Ri ) ] C A=A ] dato ] C A=A ] 1 Rn=Rn ] 1 (dir8) = (dir8) ] 1 (@Ri ) = (@Ri ) ] 1 DPTR = DPTR +1 Multiplica A por B. Deja el byte alto del resultado en B y el byte bajo en A Divide A por B Deja el cociente en A y el resto en B Ajuste decimal del acumulador

ADDC SUBB

INC DEC INC MUL DIV DA

Los autores, 2001; Edicions UPC, 2001.

80 Tabla 4.10 Instrucciones aritmticas de la familia MCS-251

Microcontroladores MCS-51 y MCS-251

Mnemnico ADD SUB

CMP

INC DEC MUL DIV

<dest>,<src> Rmd,Rms WRjd,WRjs DRkd,DRks Rm,#dato WRj,#dato16 DRk,#0dato16 Rm,dir8 WRj,dir8 Rm,dir16 WRj,dir16 Rm,@WRj Rm,@DRk Rmd,Rms WRjd,WRjs DRkd,DRks Rm,#dato WRj,#dato16 DRk,#0dato16 DRk,#1dato16 Rm,dir8 WRj,dir8 Rm,dir16 WRj,dir16 Rm,@WRj Rm,@DRk Rm,#short WRj,#short DRj,#short Rmd,Rms WRjd,WRjs Rmd,Rms WRjd,WRjs

Descripcin Rmd = Rmd Rms WRjd = WRjd WRjs DRkd = DRkd DRks Rm = Rm dato WRj = WRj dato16 DRk = DRk 0dato16 Rm = Rm (dir8) WRj = WRj (dir8, dir8+1) Rm = Rm (dir16) WRj = WRj (dir16,dir16+1) Rm = Rm (@WRj) Rm = Rm (@DRk) Rmd - Rms WRjd - WRjs DRkd - DRks Rm - #dato WRj - #dato16 DRk - #0dato16 DRk - #1dato16 Rm - (dir8) WRj - (dir8, dir8+1) Rm - (dir16) WRj - (dir16,dir16+1) Rm - (@WRj) Rm - (@DRk) Rn = Rn #short WRj = Wrj #short DRj = DRj #short Multiplica Rmd y Rms Multiplica WRjd y WRjs Divide Rmd por Rms Divide WRjd por WRjs

#short puede ser 1, 2 4.

4.3.4.1 Instrucciones de suma y de resta En la familia MCS-51, para realizar la suma de dos bytes se pueden emplear dos instrucciones: ADD y ADDC. La ejecucin de estas instrucciones afecta a los bits de acarreo (CY), de acarreo auxiliar (AC) y de rebasamiento (OV), que son tiles para detectar determinadas situaciones. Las instrucciones de suma ponen a 1 lgico el bit CY cuando el resultado de la suma es mayor que FFH; en caso contrario permanece a 0. En cuanto al bit de acarreo auxiliar, AC, se pone a 1 si en la suma se produce un acarreo entre el nibble bajo y el nibble alto, es decir, si se produce acarreo entre el bit 3 y el bit 4.

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

81

El bit de rebasamiento, OV, es un indicador til cuando se realiza la suma de dos nmeros enteros con signo en formato de complemento a dos. En este caso, el bit OV se pone a 1 en los siguientes supuestos: a) Si la suma de dos nmeros positivos en complemento a dos genera un resultado negativo. En este caso, el resultado de la suma debe estar comprendido entre 80H y FFH, de forma que el bit de signo sea igual a 1. b) Si la suma de dos nmeros negativos en complemento a dos genera un resultado positivo. En este caso, el resultado de la suma debe estar comprendido entre 00H y 7FH, de forma que el bit de signo sea igual a 0. En ambos supuestos el resultado de la suma es errneo, de manera que el bit de OV se pone a 1 para que el programador pueda considerar este error. En el siguiente ejemplo se suman dos nmeros positivos y dos nmeros negativos, de manera que se cumplen los supuestos a) y b).
Bit de signo 59H + 3AH 93H 0 101 1001 0 011 1010 1 001 0011 - 59H -3AH 1 010 0111 (A7H en compl. a 2) 1 100 0110 (C6H en compl. a 2)

C 0

C 1 0 110 1101 (6DH)

En este ejemplo se observa cmo en ambos casos el bit de signo del resultado no coincide con el bit de signo de los operandos, y el bit OV se pone a 1. Esta situacin se da cuando en la suma se produce un acarreo entre los bits 6 y 7 de los operandos, pero no se produce entre el bit 7 y el bit C. Lo mismo ocurre cuando el acarreo se da entre el bit 7 y el bit C, pero no entre el bit 6 y el bit 7. La instruccin ADDC es idntica a la instruccin ADD, salvo que, adems, suma el bit C al resultado. Con esta instruccin se pueden sumar nmeros enteros con un tamao mayor que 1 byte (precisin mltiple). Los ejemplos que utilizan esta instruccin se tratarn en el captulo siguiente. La resta de dos nmeros se realiza mediante la instruccin SUBB. Esta instruccin incluye el bit C en la resta. El bit de acarreo C se pone a 1 cuando se produce un desbordamiento, de manera que se puede emplear para realizar la resta con precisin mltiple. El bit de acarreo auxiliar, AC, se pone a 1 al producirse un acarreo entre el nibble bajo y el nibble alto (entre el bit 3 y el bit 4). El bit OV realiza la misma funcin que en las instrucciones de suma cuando se opera con nmeros en complemento a dos, de manera que se pone a 1 en los supuestos mencionados anteriormente. En la familia MCS-251 las instrucciones ADD y SUB permiten sumar y restar operandos de 8, 16 y 32 bits. El resultado de la suma se guarda en la ubicacin del operando destino. La instruccin ADDC es idntica a la instruccin ADD, salvo que, adems, suma el bit C al resultado. La instruccin SUBB resta los dos operandos que se especifican en la propia instruccin y, adems, resta el bit de acarreo C. La ejecucin de las instrucciones de suma y resta afecta, de la misma forma que la indicada para la familia MCS-51, a los bits del registro de estado CY, OV y AC; no obstante, tambin afecta a los bits Z y N del registro PSW1.

Los autores, 2001; Edicions UPC, 2001.

82

Microcontroladores MCS-51 y MCS-251

Ejemplo: ADD A,#3AH ; Suma del contenido del acumulador con el dato 34H

Si se supone que el contenido del acumulador es 59H el resultado de la suma ser:


59H + 3AH 93H 0 101 0 011 1 001 1001 1010 0011

C 0

En esta suma el bit de cero Z se pone a cero, puesto que el resultado es distinto de cero, mientras que el bit de signo N se pone a uno, para indicar con ello que el bit de mayor peso del resultado es 1.

4.3.4.2 Instrucciones de multiplicacin y de divisin Las instrucciones de multiplicacin (MUL) y divisin (DIV) permiten multiplicar y dividir dos operandos sin signo. En la familia MCS-51 slo es posible multiplicar o dividir el contenido del registro A por el contenido del registro B. La instruccin MUL AB realiza la multiplicacin sin signo del contenido del acumulador con el contenido del registro B, depositando el byte alto del resultado en el registro B y el byte bajo en el acumulador. El bit de acarreo C se pone siempre a 0 y el bit OV se pone a 1 slo cuando el resultado es superior a FFH; se pone a 0 en caso contrario. La instruccin DIV AB realiza la divisin sin signo entre el acumulador y el registro B. Tras la ejecucin de la instruccin el acumulador contiene el cociente de la divisin y el registro B contiene el resto de la divisin. El bit de acarreo C se pone siempre a 0. El bit de rebasamiento se activa cuando se ha producido una divisin por cero. Tras una divisin por cero el valor del cociente y del resto de la divisin resulta indeterminado. Para la familia MCS-251 las instrucciones de multiplicacin y de divisin permiten multiplicar o dividir cualquier par de registros tipo byte o Word. En multiplicaciones de registros de 8 bits el resultado de 16 bits se guarda en el registro tipo Word que contiene al registro destino. Por ejemplo, el producto de la instruccin MUL R3,R8 se guardara en el registro Word que contiene al registro R3, o sea, se guardara en WR2. En el caso de productos entre datos de 16 bits el resultado de 32 bits se guardara en el registro Dword que contiene al registro Word destino. Por ejemplo, el producto de la instruccin MUL WR6,WR14 se guardara en el registro DR4 que contiene al registro WR6. En divisiones de datos de 8 bits el resultado se guarda en el registro Word que contiene al registro destino. El cociente se guarda en el byte bajo mientras que el resto se guarda en el byte alto. Por ejemplo, el resultado de la instruccin DIV R5,R0 se guardara en el registro WR4. Concretamente en R4 se guardara el resto y en R5 el cociente. En divisiones de 16 bits el resultado se guarda en el registro Dword que contiene al registro Word destino. Por ejemplo, el resultado de la instruccin DIV WR8,WR16 se guardara en el registro DR8 (en la parte alta el resto y en la parte baja el cociente).

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

83

4.3.4.3 Instrucciones de incremento y decremento En la familia MCS-51 las instrucciones de incremento y de decremento son INC y DEC, respectivamente. Estas instrucciones tienen como funcin incrementar o decrementar en una unidad el operando indicado en la instruccin. Es importante observar cmo el registro DPTR se puede incrementar directamente mediante la instruccin INC, mientras que no se puede decrementar de la misma manera, puesto que la instruccin DEC no opera con este registro. La instruccin INC DPTR es de gran utilidad para la lectura de tablas en memoria externa. Las instrucciones de incremento y de decremento de la familia MCS-251 permiten, adems, incrementar o decrementar el contenido de registros tipo byte, Word o Dword en 1, 2 o 4 unidades. 4.3.4.4 Instruccin de comparacin La instruccin de comparacin CMP es exclusiva de la familia MCS-251 y calcula la diferencia entre dos operandos. El resultado generado por esta diferencia no se almacena pero s que se activan los flags CY, OV, AC, N y Z en los registros PSW y PSW1. La utilidad de la instruccin CMP est relaciona con las instrucciones de salto condicional.

4.3.4.5 Instruccin de ajuste decimal La instruccin de ajuste decimal, DA A, es til cuando se realizan sumas de nmeros en formato BCD con el registro acumulador como destino. En el formato BCD cada nibble de un byte representa un nmero decimal en base 10, por lo que su valor est comprendido entre 0 y 9. Cuando se desean sumar dos nmeros en formato BCD mediante las instrucciones ADD y ADDC, la suma que realizan es binaria, de manera que el resultado de sta puede no estar en formato BCD. Por tanto, en el caso de sumar nmeros en formato BCD, se debe emplear la instruccin DA A, que convierte el resultado de la suma al formato BCD. Por ejemplo, si se suman los nmeros BCD 19H y 22H mediante la instruccin ADD, el resultado es 3BH, mientras que el resultado esperado en BCD es 41H. La instruccin DA A realiza las siguientes operaciones: - Si los 4 bits bajos del acumulador (nibble bajo) tienen un valor mayor que 9 o si el bit AC est a 1, le suma el valor 6 a este nibble para hacer la conversin a BCD. - Si los 4 bits altos del acumulador tienen un valor mayor que 9 o si el bit C est a 1, le suma el valor 6 a estos bits para hacer la conversin a BCD. Por tanto, en la suma de los nmeros 19H y 22H en BCD, la instruccin DA suma 06H al acumulador, dando lugar al resultado de 41H en BCD. La suma de 85H y 25H en BCD, da como resultado el valor AAH; para ajustar este valor la instruccin DA le suma 66H, por lo que el valor en el acumulador es de 10H y el bit C est a 1; el resultado final es 110H.

4.3.5 Instrucciones lgicas La tabla 4.11 muestra la lista de instrucciones lgicas de la familia MCS-51 y la tabla 4.12 muestra las instrucciones lgicas de la familia MCS-251. Las operaciones lgicas que pueden realizar las familias MCS-51 y MCS-251 son: AND, OR, XOR y NOT.

Los autores, 2001; Edicions UPC, 2001.

84

Microcontroladores MCS-51 y MCS-251

Tabla 4.11 Instrucciones lgicas comunes a las familias MCS-51 y MCS-251

Mnemnico ANL ORL XRL

CLR CPL RL RLC RR RRC SWAP

<dest>,<src> A,Rn A,dir8 A,@Ri A,#dato dir8,A dir8,#dato A A A A A A A

Descripcin A = A AND OR XOR Rn A = A AND OR XOR (dir8) A = A AND OR XOR (@Ri) A = A AND OR XOR #dato (dir8) = (dir8) AND OR XOR A (dir8) = (dir8) AND OR XOR #dato A=0 Complementa el acumulador. Rotacin a la izquierda del acumulador. Rotacin a la izquierda con acarreo del acumulador. Rotacin a la derecha del acumulador. Rotacin a la derecha con acarreo del acumulador. Intercambia los nibbles del acumulador.

Tabla 4.12 Instrucciones lgicas de la familia MCS-251

Mnemnico ANL ORL XRL

SLL SRA SRL

<dest>,<src> Rmd,Rms WRjd,WRjs Rm,#dato WRj,#dato16 Rm,dir8 WRj,dir8 Rm,dir16 WRj,dir16 Rm,@WRj Rm,@DRk Rm WRj Rm WRj Rm WRj

Descripcin Rmd = Rmd AND OR XOR Rms WRjd = WRjd AND OR XOR WRjs Rm = Rm AND OR XOR #dato WRj = WRj AND OR XOR #dato16 Rm = Rm AND OR XOR (dir8) WRj = WRj AND OR XOR (dir8, dir8+1) Rm = Rm AND OR XOR (dir16) WRj = WRj AND OR XOR (dir16, dir16+1) Rm = Rm AND OR XOR (@WRj) Rm = Rm AND OR XOR (@DRk) Desplazamiento lgico a la izquierda de Rm. Desplazamiento lgico a la izquierda de WRj. Desplazamiento aritmtico a la derecha de Rm. Desplazamiento aritmtico a la derecha de WRj. Desplazamiento lgico a la derecha de Rm. Desplazamiento lgico a la derecha de WRj.

4.3.5.1 Instrucciones ANL, ORL, XRL y CLP Las instrucciones lgicas ANL y ORL se pueden utilizar para realizar mscaras, cambiando el estado de bits especficos de algn registro. Por ejemplo, si se desea forzar a cero, de forma simultnea, los bits de acarreo CY y de acarreo auxiliar AC del registro de estado PSW, se puede realizar de la siguiente forma: ANL A, #00111111b As slo se afecta a los bits mencionados mientras que se respeta el estado de los restantes bits del registro. En caso de querer forzar los mismos bits a 1 lgico se debe utilizar la instruccin ORL: ORL A, #11000000b

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

85

La instruccin XRL se puede emplear para realizar la comparacin de un registro con una constante determinada. Por ejemplo, la siguiente instruccin: XRL A, #19H pone a cero el acumulador si ste es igual a 19H; en caso contrario el acumulador tendr un valor distinto de cero. De esta forma es posible realizar comparaciones con constantes numricas, utilizando el acumulador como indicador de la comparacin. Por ltimo, la instruccin CPL realiza el complemento de cada uno de los bits del acumulador. Si el acumulador tiene por valor 35H, la ejecucin de CPL A pone el acumulador al valor CAH. Las instrucciones adicionales que posee la familia MCS-251 permiten realizar operaciones lgicas entre cualquier par de registros tipo byte o Word, o bien entre el contenido de un registro tipo byte o Word y un operando almacenado en la memoria. 4.3.5.2 Instrucciones de rotacin Las instrucciones de rotacin RL, RR, RLC y RRC desplazan el acumulador 1 bit hacia la izquierda o hacia la derecha. La instruccin RL A rota el acumulador un bit hacia la izquierda, por lo que el bit ms significativo (MSB) queda en la posicin del bit menos significativo (LSB). La instruccin RR A rota el acumulador un bit hacia la derecha; por tanto, el bit menos significativo (LSB) queda en la posicin del bit ms significativo (MSB). Las instrucciones RLC A y RRC A, efectan el mismo tipo de rotacin que el descrito, pero incluyendo el valor del bit de acarreo C. La figura 4.3 ilustra de manera clara el efecto de las rotaciones. a)
Carry Acumulador
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

b)

Carry

Acumulador
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

c)

Carry

Acumulador
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

d)

Carry

Acumulador
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

C
Fig. 4.3

a) RL A, b) RR A, c) RLC A, d) RRC A

La familia MCS-251 incorpora, adems, tres instrucciones de desplazamiento que operan con registros tipo byte y Word. La instruccin de desplazamiento lgico a la izquierda (SLL) desplaza un bit a la izquierda el contenido del registro indicado en la instruccin reemplazando el bit de menor peso del registro por un cero. La instruccin de desplazamiento lgico a la derecha (SRL) desplaza un bit a la derecha el contenido del registro indicado en la instruccin reemplazando el bit de mayor peso del registro por un cero. El desplazamiento aritmtico a la derecha es similar a la instruccin SRL con la nica diferencia de que el bit de mayor peso no cambia de valor (figura 4.4).

Los autores, 2001; Edicions UPC, 2001.

86

Microcontroladores MCS-51 y MCS-251

Carry

Rm
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

a)

0
Carry

Rm

b)

bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

C
Carry

c)
bit 7 bit 6 bit 5

Rm
bit 4 bit 3 bit 2 bit 1 bit 0

Fig. 4.4

a) SLL Rm, b) SRL Rm, c) SRA Rm

4.3.5.3 Instrucciones SWAP y CLR La instruccin SWAP A intercambia el valor de los nibbles alto y bajo del acumulador. Por ejemplo, si el acumulador vale 35H, tras la ejecucin de SWAP A pasa a valer 53H. La instruccin CLR A pone a cero el contenido del acumulador y ocupa un byte de cdigo.

4.3.6 Instrucciones de transferencia de datos Las instrucciones de transferencia de datos tienen como funcin copiar un dato de un registro o posicin de memoria a otro registro o posicin de memoria. Este conjunto de instrucciones incluye la instruccin MOV, las instrucciones de intercambio y las instrucciones de carga y descarga de la pila.
Tabla 4.13 Instrucciones de transferencia de datos comunes a las familias MCS-51 y MCS-251 Mnemnico MOV <dest>,<src> A,Rn A,dir8 A,@Ri A,#dato Rn,A Rn,dir8 Rn,#dato dir8,A dir8,Rn dir8,dir8 dir8,@Ri dir8,#dato @Ri,A @Ri,dir8 @Ri,#dato DPTR,#dato16 Descripcin A = Rn A = (dir8) A = (@Ri) A = #dato Rn = A Rn = (dir8) Rn = #dato (dir8) = A (dir8) = Rn (dir8) = (dir8) (dir8) = (@Ri) (dir8) = #dato (@Ri) = A (@Ri) = (dir8) (@Ri) = #dato DPTR = #dato16

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

87

4.3.6.1 La instruccin MOV La instruccin MOV, Move, (tablas 4.13 y 4.14) es la instruccin ms verstil para realizar transferencia de datos por los diferentes tipos de direccionamiento que soporta. En la familia MCS-51 las instrucciones MOV transfieren datos de tipo byte entre dos registros o bien entre un registro y una posicin de memoria (tabla 4.17), mientras que la familia MCS-251 incorpora nuevas instrucciones MOV que le permiten realizar transferencias de bytes, Words o Dwords entre registros o bien entre posiciones de memoria y registros (tabla 4.18).
Tabla 4.14 Instrucciones de transferencia de datos de la familia MCS-251 Mnemnico MOV <dest>,<src> Rmd,Rms WRjd,WRjs DRkd,DRks Rm,#dato WRj,#dato16 DRk,#0dato16 DRk,#1dato16 DRk,dir8 DRk,dir16 Rm,dir8 WRj,dir8 Rm,dir16 WRj,dir16 Rm,@WRj Rm,@DRk WRjd,@WRjs WRj,@DRk dir8,Rm dir8,WRj dir16,Rm dir16,WRj @WRj,Rm @DRk,Rm @WRjd,WRjs @DRk,WRj dir8,DRk dir16,DRk Rm,@WRj+dis16 WRj,@WRj+dis16 Rm,@DRk+dis24 WRj,@DRk+dis24 @WRj+dis16,Rm @WRj+dis16,WRj @DRk+dis24,Rm @DRk+dis24,WRj Descripcin Rmd = Rms WRjd = WRjs DRkd = DRks Rm = #dato WRj = #dato16 DRk = #0dato16 DRk = #1dato16 DRk = (dir8, dir8+1, dir8+2, dir8+3) DRk = (dir16, dir16+1, dir16+2, dir16+3) Rm = dir8 Wrj = (dir8, dir8+1) Rm = (dir16) Wrj = (dir16, dir16+1) Rm = (@WRj) Rm = (@DRk) WRjd = (@WRjs, @WRjs+1) WRj = (@DRk, @DRk+1) (dir8) = Rm (dir8, dir8+1) = WRj (dir16) = Rm (dir16, dir16+1) = WRj (@WRj) = Rm (@DRk) = Rm (@WRjd , @WRjd +1) = Wrjs (@DRk, @Drk+1) = WRj (dir8, dir8+1, dir8+2, dir8+3) = DRk (dir16, dir16+1, dir16+2, dir16+3) = DRk Rm = (@WRj+dis16) WRj = (@WRj+dis16, @WRj+dis16+1) Rm = (@DRk+dis24) WRj = (@Drk+dis24, @DRk+dis24+1) (@WRj+dis16) = Rm (@WRj+dis16, @WRj+dis16+1) = Rm (@DRk+dis24) = Rm (@DRk+dis24, @DRk+dis24+1) = Rm

4.3.6.2 Instrucciones MOVH, MOVS y MOVZ Las instrucciones MOVH, MOVS y MOVZ (tabla 4.15) son instrucciones propias de la familia MCS251. La instruccin MOVH, Move to High Word, carga en la parte alta del registro DRk, e indica en la instruccin el valor de 16 bits que acompaa a la instruccin. La instruccin MOVS, Move with Sign

Los autores, 2001; Edicions UPC, 2001.

88

Microcontroladores MCS-51 y MCS-251

Extension, carga en la parte baja del registro Word destino el valor almacenado en el registro Rm fuente, conservando el signo del valor transferido.
Tabla 4.15 Instrucciones de transferencia de datos de la familia MCS-251

Mnemnico MOVH MOVS MOVZ Ejemplo:

<dest>,<src> DRk(hi), #dato16 WRj,Rm WRj,Rm

Descripcin Carga el dato #dato16 en la parte alta de DRk. Carga el dato de Rm en WRj conservando el signo. Carga el dato de Rm en WRj con signo positivo.

MOVS WR0, R3

; Con R3 = 49H

El valor 49H es positivo por ser cero su bit de mayor peso; por tanto, despus de ejecutarse la instruccin queda WR0 = 0049H. MOVS WR0, R5 ; Con R5 = 95H El valor 95H es negativo ya que su bit de mayor peso es uno. Para conservar en este caso el signo del valor transferido se cargar en la parte alta de WR0 el valor FFH. Por tanto, al ejecutarse la instruccin queda WR0 = FF95H. La instruccin MOVZ, Move with Zero Extension, transfiere el contenido de un registro tipo byte a la parte baja de un registro tipo Word, y se carga en la parte alta el valor 00H. 4.3.6.3 Instrucciones MOVX y MOVC La familia MCS-51 dispone de instrucciones MOVX, Move External, y MOVC, Move Code, especficas para direccionar la memoria de datos externa (tabla 4.16).
Tabla 4.16 Instrucciones de transferencia de datos comunes a las familias MCS-51 y MCS-251

Mnemnico MOVX

MOVC

<dest>,<src> A,@Ri A,@DPTR @Ri,A @DPTR,A A,@A+DPTR A,@A+PC

Descripcin A = (@Ri) A = (@DPTR) (@Ri) = A (@DPTR) = A A = (A + DPTR) A = (A + PC)

En la instruccin MOVX siempre interviene el acumulador, ya sea como fuente o como destino. Con esta instruccin slo puede usarse direccionamiento indirecto a travs del registro Ri (@Ri, con i = 0 1), o a travs del registro DPTR. Mediante el registro @Ri slo se puede acceder a direcciones de 8 bits, mientras que con el DPTR se puede acceder a cualquier posicin del espacio de memoria externa de datos de la familia MCS-51. En los microcontroladores de la familia MCS-251 la instruccin MOVX tambin direcciona la memoria externa en la regin especificada por el registro DPXL, que se inicializa con el valor 01H despus de hacer un reset del microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

89

La instruccin MOVC permite leer datos en la memoria de programa mediante el direccionamiento indexado y el registro acumulador como destino del dato transferido. El registro DPTR o el registro PC se emplean como direccin base de la instruccin, mientras que el acumulador se utiliza como valor aadido, offset, para situarse en una determinada posicin respecto de la direccin base. La utilidad principal de la instruccin MOVC es para leer el contenido de tablas almacenadas en la memoria de programa de los microcontroladores de la familia MCS-51. En este caso los registros DPTR y PC almacenan la direccin de inicio de las tablas. Ejemplo: MOV A, #03H CALL TABLA; ; Pone en A el nmero 03H para leer el DATO_3 de la tabla

La subrutina tabla tendra el siguiente aspecto y estara situada en cualquier parte del programa: TABLA: MOVC A, @A+PC ; Al ejecutarse pone en A el dato DATO_3 RET ; PC apunta a la direccin de la instruccin RET en memoria DB DATO_1 ; Este dato se obtiene para A = 1 DB DATO_2 ; Este dato se obtiene para A = 2 DB DATO_3 ; Este dato se obtiene para A = 3 DB DATO_4 ; Este dato se obtiene para A = 4 ........ ........ DB DATO_n ; Este dato se obtienen para A = n+1 En este ejemplo, la base de la tabla es el contador de programa PC, pero al no ser ste accesible de forma directa por el programador, se toma como base la instruccin de retorno de la subrutina, RET. Luego, en el momento en que se ejecuta la instruccin MOVC, el PC contiene la direccin de la siguiente instruccin a ejecutar, por lo que lee uno de los datos que estn por debajo de la instruccin RET, dependiendo del valor del acumulador en el momento de ejecutar la instruccin MOVC. Este tipo de tablas puede tener un mximo de 255 elementos (mxima capacidad del acumulador, puesto que es un registro de 8 bits). En la instruccin MOVC el acumulador no puede ser igual a 0, ya que durante la ejecucin de MOVC el PC contiene la direccin de la instruccin RET, por lo que se devolvera el cdigo de la instruccin RET. En la familia MCS-251 la instruccin MOVC permite leer posiciones de memoria de la regin FF:.

4.3.6.4 Instrucciones PUSH y POP Las instrucciones PUSH y POP se utilizan para introducir y extraer datos de la pila. El control de la pila se realiza a travs del registro SP, Stack Pointer, en la familia MCS-51 (tabla 4.17), y a travs del registro SPX, Extended Stack Pointer, en la familia MCS-251 (tabla 4.18). La instruccin PUSH incrementa el Stack Pointer en una unidad (SP=SP+1) y copia el byte indicado en la pila. La instruccin POP realiza el proceso inverso, extrayendo, de la posicin apuntada por SP, un byte de la pila, para luego decrementar en una unidad el Stack Pointer (SP=SP-1).

Los autores, 2001; Edicions UPC, 2001.

90

Microcontroladores MCS-51 y MCS-251

Tabla 4.17 Instrucciones de transferencia de datos en la pila comunes a las familias MCS-51 y MCS-251

Mnemnico PUSH POP

<dest>,<src> dir8 dir8

Descripcin Mete el dato (dir8) en la pila. Mete en (dir8) un dato de la pila.

Tabla 4.18 Instrucciones de transferencia de datos en la pila de la familia MCS-251

Mnemnico PUSH

POP

<dest>,<src> #dato #dato16 Rm WRj DRk Rm WRj DRk

Descripcin Mete el dato #dato en la pila. Mete el dato #dato16 en la pila. Mete el contenido de Rm en la pila. Mete el contenido de WRj en la pila. Mete el contenido de DRk en la pila. Mete en Rm un dato de la pila. Mete en WRj un Word de la pila. Mete en DRk un Dword de la pila.

Con los microcontroladores de la familia MCS-51, que disponen de slo 128 posiciones de memoria RAM interna, se debe procurar que el puntero SP no sobrepase los 128 bytes, puesto que los datos introducidos por encima de esta posicin se perderan al no estar esta zona implementada fsicamente en el microcontrolador. La ejecucin de la instruccin POP con el SP apuntando a una direccin de memoria RAM interna no implementada, obtiene un valor indeterminado. Para las versiones de la MCS-51 con 256 bytes de memoria RAM interna, el SP puede llegar hasta el valor FFH. En todos los dispositivos de la familia MCS-51 la memoria reservada para la pila reside en la RAM interna. En la familia MCS-251 la pila est ubicada en la regin 00. 4.3.6.5 Las instrucciones de intercambio XCH y XCHD Las instrucciones de intercambio XCH, Exchange, producen un intercambio de datos entre el acumulador y el contenido de un registro o posicin de memoria. La instruccin XCHD A, @Ri es similar a la anterior, pero slo se intercambia el nibble bajo del acumulador con el de una posicin de memoria. Estas instrucciones son de gran utilidad en el desplazamiento de dgitos en formato BCD. En la tabla 4.19 estn indicadas las instrucciones de intercambio.
Tabla 4.19 Instrucciones de intercambio comunes a las familias MCS-51 y MCS-251

Mnemnico XCH

XCHD

<dest>,<src> A,Rn A,dir8 A,@Ri A, @Ri

Descripcin Intercambia A y Rn. Intercambia A y (dir8). Intercambia A y (@Ri). Intercambia el nibble bajo de A y (@Ri ).

4.3.7 Instrucciones booleanas Las instrucciones booleanas procesan la informacin a nivel de bit. Los bits que pueden direccionar estas instrucciones estn ubicados en la memoria RAM interna y en el rea SFR. Las familias MCS-51

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

91

y MCS-251 comparten el mismo conjunto de instrucciones booleanas, con la nica diferencia de que sus reas de direccionamiento a nivel de bit son diferentes. Las instrucciones booleanas (tabla 4.20) se pueden agrupar dentro de cuatro categoras: - Instrucciones que fuerzan un bit a 1 0 lgico. - Instrucciones lgicas. - Instrucciones de transferencia de bits. - Instrucciones de salto condicional.
Tabla 4.20 Instrucciones booleanas

Mnemnico CLR SETB CPL ANL ORL MOV JB JNB JBC

<dest>,<src> CY bit CY bit CY bit CY, bit CY, /bit CY, bit CY,/bit CY, bit bit, CY bit, rel bit, rel bit, rel

Descripcin Pone a cero el bit de acarreo. Pone a cero el bit direccionado. Pone a uno el bit de acarreo. Pone a uno el bit direccionado. Complementa el bit de acarreo. Complementa el bit direccionado. CY = CY AND (bit) CY = CY AND (/bit) CY = CY OR (bit) CY = CY AND (/bit) CY = bit bit = CY Salta si (bit) es 1. Salta si (bit) no es 1. Salta si (bit) es 1 y borra el bit.

Las instrucciones que fuerzan un bit a 1 o a 0 lgico son la instruccin SETB y la instruccin CLR. La instruccin SETB, Set bit, pone a 1 lgico el bit direccionado, mientras que la instruccin CLR, Clear bit, pone a cero el bit direccionado. Las instrucciones lgicas estn formadas por las instrucciones ANL, ORL y CPL. La instruccin ANL realiza la funcin and lgica, la instruccin ORL realiza la funcin or lgica y la instruccin CPL realiza la funcin de negacin lgica. En las instrucciones ANL y ORL tambin es posible tomar el bit direccionado de forma complementada, utilizando para ello la notacin /bit. A nivel de transferencia de bits se utiliza la instruccin MOV. Esta instruccin se transfiere el valor de cualquier bit (de las reas direccionables a nivel de bit) hacia el bit de acarreo o viceversa. Por ejemplo, el estado del bit 20H.0 de la memoria interna se puede poner en la patilla 0 de puerto P1, mediante las siguientes instrucciones: MOV MOV CY, 20H.0 P1.0,CY ;20H.0 es el bit 0 de la direccin 20H ;Coloca el bit de acarreo en P1.0

En este ejemplo, el bit de acarreo realiza las funciones de acumulador, pues contiene uno de los operandos que intervienen en la instruccin y guarda el resultado.

Los autores, 2001; Edicions UPC, 2001.

92

Microcontroladores MCS-51 y MCS-251

Las instrucciones de salto condicional ejecutan un salto de tipo relativo si el bit especificado en la instruccin tiene un determinado estado. En la instruccin JB, Jump on bit, efecta el salto si el bit direccionado vale uno, mientras que la instruccin JNB, Jump on not bit, realiza el salto si el bit direccionado vale cero. Con la instruccin JBC, Jump on bit then clear it, se produce el salto si el bit vale uno y, tras el salto, el bit direccionado se fuerza a cero. Se debe destacar que las instrucciones lgicas no incluyen la operacin XRL (or exclusiva). Una forma de realizar esta instruccin mediante software es la siguiente, donde se hace la funcin or exclusiva entre los bits 1 y 5 del puerto P1: MOV CY, P1.1 JNB P1.5, continua CPL CY continua: MOV

; Salta a continua si P1.5=0 ; Continuacin del programa

4.3.8 Instrucciones de control Las instrucciones de control permiten cambiar la secuencia de ejecucin de un programa y se pueden agrupar en instrucciones de salto incondicional, instrucciones de salto condicional e instrucciones de llamada y retorno de subrutina. Las instrucciones de control proporcionan al microcontrolador la direccin de la siguiente instruccin a ejecutar. Esta direccin puede ser proporcionada de forma explcita en la propia instruccin, o bien de forma implcita, como es el caso de la instruccin de retorno de subrutina.

4.3.8.1 Instrucciones de salto incondicional En la familia MCS-51 existen cinco tipos de salto incondicional: AJMP, LJMP, JMP @A+DPTR, NOP y SJMP. La familia MCS-251 tiene estos cinco tipos de salto y, adems, incorpora un tipo ms: EJMP. El conjunto de instrucciones de salto incondicional se muestra en la tabla 4.21, para la MCS51, y en la tabla 4.22, para la MCS-251. Las instrucciones AJMP, LJMP, EJMP y JMP @A+DPTR realizan un salto a la direccin indicada en la propia instruccin, mientras que en las instrucciones NOP y SJMP el salto que realizan es relativo al valor del contador de programa.
Tabla 4.21 Instrucciones de salto incondicional comunes a las familias MCS-51 y MCS-251

Mnemnico AJMP LJMP SJMP JMP NOP

<dest>,<src> dir11 dir16 rel @A+DPTR

Descripcin Salto absoluto. Salto largo. Salto relativo. Salto indirecto a la direccin A + DPTR. Salto a la siguiente instruccin.

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251 Tabla 4.22 Instrucciones de salto incondicional de la familias MCS-251

93

Mnemnico EJMP LJMP

<dest>,<src> addr24 @DRk @WRj

Descripcin Salto extendido. Salto extendido indirecto. Salto largo indirecto.

La instruccin AJMP, Absolute Jump, cambia los 11 bits de menor peso del contador de programa por la direccin de 11 bits especificada en la instruccin (de forma directa o a travs de un registro). De esta manera se puede saltar a cualquier direccin dentro del bloque de 2kbytes de memoria, donde est ubicada la instruccin de salto. La instruccin LJMP, Long Jump, para la familia MCS-51, cambia los 16 bits del contador de programa por la direccin que acompaa a la instruccin, mientras que para la familia MCS-251, cambia los 16 bits de menor peso del contador de programa por la direccin que acompaa a la instruccin. El rango del salto en este caso abarca los 64kbytes de la regin donde est ubicada la instruccin. La instruccin EJMP, Extended Jump, cambia los 24 bits del contador de programa por la direccin que acompaa a la instruccin. Esta instruccin permite saltar a cualquier direccin del espacio de memoria de la familia MCS-251. La instruccin JMP @A+DPTR realiza un salto a la direccin obtenida de la suma del contenido del acumulador con el contenido del registro DPTR. Ejemplo: MOV DPTR, #TABLA ; Pone en DPTR la direccin de comienzo de una tabla de saltos MOV A, INDICE ; Pone acumulador el valor del CASO al que se desea saltar RL A ; Se multiplica por dos el contenido del Acc JMP @A+DPTR ; Salta a la tabla de saltos TABLA: AJMP CASO_0 ; Si INDICE = 0 salta a CASO_0 AJMP CASO_1 ; Si INDICE = 1 salta a CASO_1 AJMP CASO_2 ; Si INDICE = 2 salta a CASO_2 AJMP CASO_3 ; Si INDICE = 3 salta a CASO_3 AJMP CASO_4 ; Si INDICE = 4 salta a CASO_4 4.3.8.2 Instrucciones de salto condicional Todas las instrucciones de salto condicional son instrucciones de salto relativo. La tabla 4.23 muestra el conjunto de instrucciones de salto condicional comunes a las familias MCS-51 y MCS-251, mientras que la tabla 4.24 muestra las instrucciones de salto condicional que incorpora exclusivamente la familia MCS-251. En las instrucciones JC y JNC la condicin de salto hace referencia al valor del bit de acarreo, y en las instrucciones JZ y JNZ la condicin de salto est relacionada con el contenido del acumulador. La instruccin CJNE, Compare and jump if not equal, realiza la comparacin de los dos operandos indicados en la instruccin y salta si no son iguales. El salto es de tipo relativo.

Los autores, 2001; Edicions UPC, 2001.

94

Microcontroladores MCS-51 y MCS-251

La instruccin DJNZ, Decrement and jump if not zero, decrementa el registro o posicin de memoria indicado en la instruccin y salta si el resultado no es cero. La instruccin DJNZ es muy til en el control de bucles. Para ejecutar un bucle N veces, se carga un contador con el valor N y se termina el bucle con la instruccin DJNZ. El siguiente ejemplo ejecuta cuatro veces el bucle marcado con la etiqueta INICIO.
Tabla 4.23 Instrucciones de salto condicional comunes a las familias MCS-51 y MCS-251

Mnemnico JC JNC JZ JNZ CJNE

DJNZ

<dest>,<src> rel rel rel rel A, dir8, rel A, #dato, rel Rn, #dato, rel @Ri, #dato, rel Rn,rel dir8,rel

Descripcin Salta si el bit de acarreo es 1. Salta si el bit de acarreo es 0. Salta si el acumulador es 0. Salta si el acumulador es distinto de 0. Compara A con el dato (dir8) y salta si no son iguales. Compara A con #dato y salta si no son iguales. Compara Rn con #dato y salta si no son iguales. Compara (@Ri) con #dato y salta si no son iguales. Decrementa Rn y salta si no es 0. Decrementa (dir8) y salta si no es 0.

Tabla 4.24 Instrucciones de salto condicional para la familia MCS-251

Mnemnico JE JNE JG JLE JSL JSLE JSG JSGE Ejemplo:

<dest>,<src> rel rel rel rel rel rel rel rel

Descripcin Salta si es igual (si Z=1). Salta si no es igual (si Z=0). Salta si es mayor que (si CY=Z=0). Salta si es menor o igual que (si Z=1 o CY=1). Salta si es menor que (con signo). (si N[OV). Salta si es menor o igual que (con signo). (si Z=1 si N[OV. Salta si es mayor que (con signo). (si Z=0 y N=OV). Salta si es mayor o igual que (con signo). (si N=OV).

MOV R4,#04H ; Registro que determina el nmero de veces que se va a ejecutar el bucle INICIO: MOV ; Direccin de comienzo del bucle ........ ; Instrucciones del bucle DJNZ R4,INICIO ; Si R4[0 salta a INICIO MOV ;Si R4=0 contina con la instruccin siguiente. El bucle se ejecuta 4 veces Las condiciones de salto de las instrucciones JE, JNE, JG, JLE, JSL, JSLE, JSG y JSGE, son exclusivas de la familia MCS-251, y estn relacionadas con el valor que toman los indicadores de los registros de estado despus de ejecutar una instruccin de comparacin (CMP). Los bits de los registros de estado que intervienen son el bit de acarreo, el bit de cero y el bit de signo. Cuando se ejecuta una instruccin de comparacin CMP <des>,<src> de dos nmeros positivos se puede obtener diversos resultados: - Si <des> = <src> entonces el bit Z = 1 - Si <des> [ <src> entonces el bit Z = 0

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

95

- Si <des> > <src> entonces Z = 0 y CY = 0 - Si <des> <src> entonces Z = 1 o CY = 1 Cuando los nmeros comparados tienen signo (son positivos o negativos) se deben analizar los bits de estado Z, N y OV para determinar la relacin existente entre los operandos: - Si <des> < <src> entonces el bit N [ OV - Si <des> <src> entonces el bit Z = 1 o N [ OV - Si <des> > <src> entonces Z = 0 y N = OV - Si <des> <src> entonces N = OV Existen instrucciones de salto condicional cuya condicin de salto se corresponde con el valor que adquieren los bits del registro de estado en los casos anteriormente considerados. En la tabla 4.25 se indica la relacin entre las instrucciones de salto condicional y el resultado de la comparacin de dos operandos.
Tabla 4.25 Instrucciones de salto condicional

Tipo de operando Positivo Con signo

= JE

JNE

Relacin > < JG JL JSG JSL

JGE JSGE

JLE JSLE

4.3.8.3 Instrucciones de llamada y de retorno a subrutina En la tabla 4.26 se muestran las instrucciones de salto y retorno de subrutinas para las familias MCS51 y MCS-251. Las instrucciones que son exclusivas de la familia MCS-251 se muestran en la tabla 4.27.
Tabla 4.26 Instrucciones de llamada y retorno de subrutina, comunes a las familias MCS-51 y MCS-251

Mnemnico ACALL LCALL RET RETI

<dest>,<src> dir11 dir16

Descripcin Llamada a subrutina de tipo absoluto. Llamada a subrutina tipo long. Retorno de subrutina. Retorno de la rutina de servicio a la interrupcin.

Tabla 4.27 Instrucciones de llamada y retorno de subrutina de la familia MCS-251

Mnemnico LCALL ECALL ERET

<dest>,<src> @WRj @DRk dir24

Descripcin Llamada a subrutina tipo long. Llamada a subrutina tipo extendido. Retorno extendido de subrutina.

La instruccin ACALL, Absolute call, utiliza 11 bits para indicar la direccin de comienzo de la subrutina. Mediante ACALL la subrutina debe comenzar dentro del mismo bloque de memoria de 2kbytes donde est ubicada la instruccin de llamada.

Los autores, 2001; Edicions UPC, 2001.

96

Microcontroladores MCS-51 y MCS-251

La instruccin LCALL, Long call, hace una llamada a subrutina con una direccin de 16 bits: la subrutina puede encontrarse en cualquier lugar dentro del espacio de 64kbytes de memoria de programa en la familia MCS-51 y dentro de la misma regin de memoria para la familia MCS-251. La instruccin ECALL, Extended Call, es exclusiva de la familia MCS-251 y permite realizar saltos a subrutinas ubicadas en cualquier posicin del espacio de memoria. Al ejecutarse una instruccin de llamada a subrutina se guarda, de forma automtica, en la pila la denominada direccin de retorno, que es la direccin donde se encuentra ubicada la siguiente instruccin del programa principal. El nombre de pila se le asigna a la zona de memoria donde el microcontrolador almacenar la direccin de retorno. Para la MCS-51 la memoria de la pila es la zona de memoria que est por encima del puntero de la pila SP. Por defecto el SP est inicializado a 07H, por lo que, tras un reset, la zona de la pila es la zona de la memoria interna situada a partir de la posicin 07H (de la 08H a la 7FH, o de la 08H a la FFH). Sin embargo, el valor de SP se puede modificar en cualquier momento mediante una instruccin MOV, y se puede definir cul va a ser la zona de la memoria interna que se utilizar como pila. En el caso de las instrucciones ACALL y LCALL, para la familia MCS-51, la direccin de retorno es de 2 bytes, correspondientes al registro PC, Program Counter; en el caso de la MCS-251, los dos bytes que se guardan son los de menor peso del PC. Con la instruccin ECALL se guardan en la pila los tres bytes del PC de la familia MCS-251. Con las instrucciones ACALL y LCALL, para almacenar la direccin de retorno en la memoria de la pila la CPU, se efecta el siguiente proceso: 1. Interpreta el cdigo de instruccin y se actualiza el valor de PC. PC=PC+3. 2. Incrementa el puntero de la pila, SP=SP+1, y se guarda el byte bajo de PC, PCLOW, en la posicin de memoria interna apuntada por SP. 3. Incrementa el puntero de la pila, SP=SP+1, y se guarda el byte alto de PC, PCHIGH, en la posicin de memoria interna apuntada por SP. 4. Pone en el contador de programa la direccin de salto de la subrutina. PC=Dir. subrutina. Las subrutinas deben finalizar con la instruccin RET, Return, que recupera el valor de la direccin de retorno guardada en la pila. Si el salto a la subrutina se ha realizado con la instruccin ECALL, ser necesario acabar la subrutina con la instruccin ERET, que permite recuperar los tres bytes del contador de programa almacenados en la pila. Con la instruccin RET la CPU efecta el siguiente proceso: 1. Lee la posicin de memoria que es apuntada por SP y pone el dato ledo en el byte alto de PC, PCHIGH. 2. Decrementa el puntero de la pila, SP=SP-1. 3. Lee la posicin de memoria que es apuntada por SP y pone el dato ledo en el byte bajo de PC, PCLOW. 4. Salta a la direccin que apunta el contador de programa PC. La instruccin RETI se utiliza para retornar desde una rutina de servicio de interrupcin. La nica diferencia entre RET y RETI, consiste en que RETI comunica al sistema de control de interrupciones que la interrupcin en curso ha finalizado. Por lo dems, RETI acta igual que la instruccin RET.

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

97

5 El modelo de programacin
Bajo la definicin de modelo de programacin se agrupa el uso combinado de las instrucciones y del conocimiento de la arquitectura interna del microcontrolador para formar rutinas de programa que den solucin a problemas que son comunes en la mayor parte de los diseos, como son la transferencia de bloques de datos en la memoria externa de datos, la realizacin y consulta de tablas de datos, la conversin de datos entre distintos formatos, rutinas aritmticas, etc. En este captulo se expondrn varias rutinas en lenguaje ensamblador que dan solucin a distintos problemas; pero debido al tratamiento simultneo de las dos familias de microcontroladores que se hace en esta obra, en primer lugar se expondrn las rutinas para la familia MCS-51, y en segundo lugar se expondrn las rutinas derivadas para la MCS-251, considerando, para ello, los nuevos tipos de direccionamiento y la flexibilidad en el acceso a los registros que tiene esta ltima familia.

5.1 Creacin y consulta a tablas


En la programacin de microcontroladores es frecuente utilizar tablas de datos en ciertos casos, como en la conversin entre distintos formatos de datos, como de hexadecimal a ASCII, de binario a 7segmentos, etc. En estos casos se genera una tabla especfica, donde cada elemento de la tabla est relacionado con el dato de entrada que se quiere convertir, de forma que el mismo dato de entrada se emplea como ndice para obtener el resultado de la conversin. Mediante tablas se puede tambin obtener nmeros primos segn un ndice o evitar el clculo de funciones matemticas no lineales como las funciones trigonomtricas o de cualquier otro tipo. Como ejemplo se muestra la rutina de conversin de hexadecimal (00H-0FH) al formato ASCII; para ello la tabla 5.1 muestra la correspondencia entre ambos formatos.
Tabla 5.1 Correspondencia entre un nmero hexadecimal (de 00H a 0FH) y su formato en ASCII
Binario ASCII 00H 30H 01H 31H 02H 32H 03H 33H 04H 34H 05H 35H 06H 36H 07H 37H 08H 38H 09H 0AH 0BH 0CH 0DH 0EH 39H 41H 42H 43H 44H 45H 0FH 46H

;******************************************************* ;Subrutina Bin_ASCII ;Convierte un n hexadecimal en ASCII ;Entrada y salida: A ;******************************************************* Bin_ASCII: INC A MOVC A,@A+PC RET DB 30H, 31H, 32H, 33H, 34H, 35H, 36H, 37H DB 38H, 39H, 41H, 42H, 43H, 44H, 45H, 46H

Los autores, 2001; Edicions UPC, 2001.

98

Microcontroladores MCS-51 y MCS-251

El ncleo de esta subrutina es la instruccin MOVC A, @A+PC. Cuando se ejecuta esta instruccin el contador de programa se actualiza para apuntar a la instruccin siguiente, RET, pues la tabla de datos est situada a continuacin de la instruccin RET. El acumulador es un ndice que apunta al dato en concreto dentro de la tabla. Si A vale 0H, la subrutina retornar el dato 30H, puesto que en primer lugar se ha incrementado en una unidad (instruccin INC A) y, por tanto, la suma del puntero indexado, A+PC, apunta al primer dato de la tabla; si A vale 01H la subrutina retorna 31H, si vale 02H retorna 32H, etc.

5.2 Transferencia de bloques de datos


Resulta frecuente tener que trasladar bloques de datos entre distintas zonas de la memoria. De estos bloques se suele tener su direccin base y su tamao, aunque la direccin de destino puede ser fija o variable, dependiendo del tipo de aplicacin. La solucin a este problema es distinta segn sea la familia de que se trate, pues el nmero de punteros disponibles es diferente para la MCS-51 y para la MCS-251. Para la MCS-51 la transferencia del bloque de datos se realiza en la memoria externa de datos, y tiene un nico puntero de 16 bits que consiste en el registro @DPTR. Con este puntero la solucin del problema resulta difcil, puesto que para trasladar un bloque de datos se necesitan al menos dos punteros de 16 bits, uno de origen y otro de destino. Para salvar este obstculo, se puede tratar de recurrir al uso de cualquiera de los dos punteros restantes de 8 bits, @R0 y @R1, que se pueden emplear con la instruccin MOVX. Estos punteros sitan su valor en el puerto P0, byte bajo del bus de direcciones, cuando se ejecutan las instrucciones de lectura y de escritura en la memoria de datos, (MOVX A,@Ri y MOVX @Ri,A). Mientras tanto, en el puerto P2, byte alto del bus de direcciones, se sita el contenido del registro P2 del rea de SFR. Por tanto, basta con colocar el byte alto de la direccin de destino del bloque de memoria en el registro P2 para que salga por el puerto P2. A continuacin se muestra una rutina que transfiere un bloque de 50 bytes desde la direccin origen 1200H a la direccin destino 3500H.
;************************************************* ;Rutina TRANS (transferencia de datos) ;Punteros: DPTR, R0 ;Tamao: R7 ;Modifica: DPTR, R0, R7, P2, A ;************************************************ TRANS: MOV DPTR, #1200H ;Direccin inicio MOV R0,#00H ;Direccin destino MOV P2,#35H MOV R7,#50 B_TR: MOVX A,@DPTR ;Lee en origen MOVX @R0,A ;Escribe en destino INC DPTR ;Incrementa punteros INC R0 DJNZ R7,B_TR ;Bucle R7 veces

La transferencia de datos, segn el ejemplo mostrado, est limitada a una misma pgina, es decir, a todas aquellas direcciones de 16 bits que tienen el mismo valor del byte alto de direccin, pues en el puerto P2 se mantiene este valor mientras se ejecuta la rutina. Si en esta rutina el primer byte a transferir del origen tiene como byte bajo de direccin el valor 00H, entonces el tamao mximo de datos que se pueden transferir es de 256 bytes; en caso contrario el tamao mximo que se puede transferir vendr delimitado por el inicio de la pgina siguiente.

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

99

A continuacin se muestra la misma rutina de transferencia solucionada con instrucciones de la familia MCS-251. En este caso se ha utilizado un nico registro tipo Word que combinado con instrucciones de direccionamiento indexado permite acceder a las direcciones origen y destino. Se puede observar cmo esta rutina es ms compacta y funcional que la anterior.
;***************************************************** ;Rutina TRANS para la familia MCS-251 ;Puntero: WR0 ;Tamao: R7 ;Modifica: WR0, R3 y R7 ;***************************************************** TRANS: MOV WR0,#1200H ;Direccin origen MOV R7,#50 ;Nmero de datos a transferir B_TR: MOV R3,@WR0 ;Lee dato en origen MOV @WR0+2300H,R3 ;Escribe en destino INC WR0 ;Incrementa el puntero DJNZ R7,B_TR ;Bucle R7 veces RET

5.3 Funciones booleanas


Los microcontroladores de las familias MCS-51 y MCS-251 estn capacitados para realizar funciones booleanas, tanto a nivel de bit como a nivel de byte, y tienen en comn el mismo juego de instrucciones booleanas. A nivel de bit, el microcontrolador puede realizar funciones lgicas y realizar otras tareas como leer el estado de un teclado, activar un rel, etc. A continuacin se expone un ejemplo de aplicacin de las instrucciones booleanas que consiste en la evaluacin de las funciones lgicas Y0 e Y1 (figura 5.1), con tres variables de entrada cada una, X0, X1 y X2. Las entradas se han conectado a los terminales P1.0, P1.1 y P1.2, y las funciones de salida se han conectado a P1.3 y P1.4.
;*********************************** ;Rutina F_BOL ;Entradas: P1.0, P1.1, P1.2 ;Salidas: P1.3, P1.4 ;Modifica: C, B.0 ;********************************* X0 EQU P1.0 ;entradas X1 EQU P1.1 X2 EQU P1.2 Y0 EQU P1.3 ;salidas Y1 EQU P1.4 F_BOL: MOV C,/X0 ANL C,X1 ORL C,X0; MOV Y0,C ;obtiene Y0 MOV C,X0 ORL C,X1 MOV B.0,C MOV C,X0 ORL C,X2 ANL C,B.0 MOV Y1,C ;obtiene Y1 SJMP F_BOL

x0 x1 x3 y0 y1

P1.0 P1.1 P1.2 P1.3 P1.4

Funciones lgicas
x0 x1 x3 y0

y1

Fig. 5.1 Funciones lgicas y conexionado con el microcontrolador

Los autores, 2001; Edicions UPC, 2001.

100

Microcontroladores MCS-51 y MCS-251

5.4 Retardos de tiempo


La realizacin de retardos es una de las tareas ms comunes en el desarrollo de aplicaciones, puesto que en muchos casos se deben activar dispositivos durante un tiempo determinado. Para realizar retardos de manera precisa se pueden emplear recursos del hardware del microcontrolador, como los temporizadores Timer0, Timer1 y Timer2, o el dispositivo PCA; en este caso se deben configurar y utilizar interrupciones de manera adecuada. Por otro lado, tambin se pueden realizar retardos mediante rutinas de software, para aquellos casos en los que no se requiere de precisin en los tiempos generados; pueden entonces destinarse los temporizadores y la PCA a otras tareas ms relevantes. De todas formas, se debe mencionar que el uso de retardos mediante software implica una explotacin poco eficiente del microcontrolador, puesto que ste pasa una buena parte de su tiempo realizando el retardo. Un retardo por software se hace bsicamente a travs de uno o varios bucles anidados, donde el nmero de anidamientos depende del tiempo de retardo requerido. Como ejemplo se propone una rutina de retardo con dos anidamientos, donde el nmero de veces que se ejecuta cada bucle depende de los registros R7 y R6. Este ejemplo es vlido tanto para la familia MCS-51 como para la MCS-251.
;************************************************* ;Subrutina RETARDO ;Registros afectados: R7, R6 ;************************************************ RETARDO: MOV R7,#10 L1: MOV R6,#100 L2: DJNZ R6,L2 ;Bucle interno DJNZ R7,L1 ;Bucle externo RET

El bucle interno formado por el registro R6 est dentro del bucle externo formado por el registro R7; luego a cada vuelta del bucle externo le corresponden 100 ejecuciones del bucle interno. De esta manera, sabiendo que para la MCS-51 el tiempo de ejecucin de las instrucciones MOV y DJNZ es de uno y dos ciclos mquina, respectivamente, y que un ciclo mquina equivale a 1s con una frecuencia de reloj de 12MHz, se puede determinar el tiempo exacto que tardar en ejecutarse la subrutina de retardo. La figura 5.2 muestra el diagrama de tiempos de la subrutina e indica tambin el cmputo del tiempo resultante -eq. (5.1).
MOV (1 s)

MOV (1 s)

tR 1 [ 1 2 R 6 2] R 7 2 2.033s

(5.1)

DJNZ (2 s)

R6 veces

R7 veces

tR

1 s 3

1 3 s

(R 6 1) s
1 s 2

1 s R7 2 4 .

(5.2)

DJNZ (2 s)

(R 7 1) s

1 s 1.009,16 s

RET (2 s)

Fig. 5.2 Diagrama de tiempos de la rutina de retardo

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

101

Para la familia MCS-251 el clculo del tiempo realizado es diferente (eq. (5.2)), puesto que trabajando en el modo fuente, la instruccin MOV Rn,#data tarda cuatro perodos de reloj en ejecutarse, la instruccin DJNZ Rn,rel posee dos tiempos de ejecucin distintos: 12 perodos de reloj si se cumple la condicin de salto y 6 perodos en caso contrario; y, por ltimo, el microcontrolador invierte 12 perodos de reloj en ejecutar la instruccin RET. El tiempo mximo que se puede obtener con una rutina de dos bucles anidados es de 130.818s para la MCS-51, que equivale a unos 0.13 segundos, y de 65.238,33s para la MCS-251, poniendo a FFH los registros R6 y R7. Si se desean obtener tiempos mayores es necesario realizar ms anidamientos. Una alternativa a la rutina anterior consiste en la siguiente rutina:
;************************************************ ;Subrutina RETARDO2 ;Registros afectados: R7, R6 ;************************************************ RETARDO2: MOV R7,#0 MOV R6,#0 L1: DJNZ R6,L1 ;Bucle interno DJNZ R7,L1 ;Bucle externo RET

A primera vista da la impresin de que los bucles de esta rutina dan cero vueltas, pues R6 y R7 valen cero. Pero si se observa en detalle la ejecucin de la instruccin DJNZ, resulta que esta instruccin primero decrementa el registro indicado, y luego examina la condicin de salto. Por tanto, si el registro vale cero, al decrementarse pasa a valer FFH, (00H-01H=FFH), y se ejecuta el bucle FFH+1 o 256 veces. Realizando el diagrama de tiempos para esta rutina, el tiempo que se obtiene es de 13.1588s para la MCS-51 y de 65.665,16s para la MCS-251, para una frecuencia de reloj de 12MHz.

5.5 Suma y resta de datos


La suma y resta de datos es sencilla de hacer mediante las instrucciones ADD, ADDC y SUBB, cuando los datos que intervienen son de 1 byte, pero resulta ms complicada cuando el tamao de los datos es mayor de 1 byte, es decir, cuando se tienen que sumar datos de 2, 3 4 bytes de tamao.
;************************************************ ;Subrutina SUMA_N (Suma de nmeros de N bytes) ;Entrada: Punteros: R0 a X, R1 a Y. R7: Tamao ;Salida: El resultado sustituye al operando X ;Modifica: A, R0, R1, R7, C ;************************************************ SUMA_N: CLR C ;Borra acarreo BUC_SUM: MOV A,@R0 ;Lee operando X ADDC A,@R1 ;Suma X con Y MOV @R0,A ;Resultado sustituye a X INC R0 ;Incrementa punteros INC R1 DJNZ R7,BUC_SUM ;Repite 7 veces RET

3 Suma

2 Suma

1 Suma

3DH + 5EH 0 9BH


Carry

ABH + 2CH 0 D8H


Carry

99H + 69H 1 02H


Carry

Fig. 5.3 Suma de dos datos de 3 bytes de tamao

Los autores, 2001; Edicions UPC, 2001.

102

Microcontroladores MCS-51 y MCS-251

Para resolver este problema se realiza una subrutina que es capaz de sumar datos de cualquier tamao en bytes, aunque, para este caso, ser suficiente con que sume datos de 3 bytes de tamao. Los datos que se debern sumar son X=2DAB99H y Y=5E2C69H en formato hexadecimal y estn almacenados a partir de las posiciones de la memoria interna 60H y 70H, respectivamente; es decir, el byte de menor peso del dato X (99H) estar ubicado en la direccin 60H, su byte intermedio (ABH) en la 61H y su byte ms significativo (2DH) en la 62H; lo mismo se hace con el dato Y a partir de la direccin 70H de la memoria interna. Para ejecutar esta subrutina se tienen primero que poner las direcciones 60H y 70H en los registros R0 y R1; ello se debe efectuar antes de llamar a la subrutina, por ejemplo
MOV MOV MOV LCALL R0,#60H R1,#70H R7,#3 SUMA_N ;Pone direccin de X en R0 ;Pone direccin de Y en R1 ;Pone tamao del dato en R7 ;Llama a la subrutina

La manera de operar de la subrutina se muestra claramente en la figura 5.3. La subrutina hace tres sumas consecutivas y obtiene los datos en cada una de ellas a travs de los punteros @R0 y @R1, que se actualizan con la instruccin INC. Esta subrutina es capaz de sumar datos de 4, 8 16 bytes, con la condicin previa de situar los datos en la memoria interna y poner en R0, R1 y R7 los valores adecuados. La razn de que el resultado generado en las operaciones sustituya a uno de los operandos, estriba en que para la MCS-51 tan slo se dispone de los punteros @R0 y @R1; se carece de un tercer puntero necesario para dejar el resultado en otras direcciones. El resto de los registros no pueden ser empleados como punteros, pero s como variables intermedias, pasando su contenido a R0 o R1, y conseguir, as, que hagan de punteros por medio de estos registros. Cabe resaltar que para la MCS-251 este tipo de problemas no existe, pues cualquiera de sus registros puede hacer de puntero. Las instrucciones de la familia MCS-251 permiten ejecutar la rutina de suma con un mayor rango de direcciones y guardar el resultado en direcciones distintas a las de ubicacin de los operandos. El ejemplo anterior de suma de dos datos de 3 bytes se puede resolver empleando las instrucciones de la familia MCS-251 que pueden sumar datos de hasta 4 bytes:
;***************************************************************** ;Rutina SUM_4 (Suma de datos de 4 bytes para la familia MCS-251) ;Puntero: WR8 ;Datos: DR0 y DR4 ;***************************************************************** SUM_4: MOV WR0,@WR8 ;Carga el dato en el registro DR0 MOV WR2,@WR8+2H B_TR: MOV WR4,@WR8+10d ;Carga el otro dato en el registro DR4 MOV WR6,@WR8+12d ADC DR0,DR4 ;Suma los dos datos MOV @WR8+20d,WR0 ;Carga el resultado en memoria MOV @WR8+22d,WR2 RET

El anterior programa suma dos datos de 4 bytes almacenados en las direcciones 60H y 70H a las que se accede con el registro WR8 utilizando el direccionamiento indexado. El mismo registro permitir

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

103

guardar el resultado de la suma a partir de la direccin 80H. Para ejecutar esta subrutina previamente se debe colocar la direccin inicial del dato en WR8.
MOV WR8,#0060H LCALL SUM_4bytes ;Carga el puntero con la direccin inicial del dato ;Llamada a la subrutina de suma de 4 bytes

Si el formato de los nmeros que se quiere sumar es BCD, basta con aadir la instruccin de ajuste decimal, DA A, tras la instruccin de suma ADDC, para obtener el resultado tambin en formato BCD, lo que se muestra en la siguiente subrutina. En este caso, si X=1969H y Y=1050H dar por resultado Z=0919H.
;************************************************ ;Subrutina SUMA_N (Para datos en formato BCD) ;Entrada: Punteros: R0 a X, R1 a Y. R7: Tamao ;Salida: El resultado sustituye al operando X ;Modifica: A, R0, R1, R7, C ;************************************************ SUMA_N: CLR C ;Borra Carry BUC_SN: MOV A,@R0 ;Lee dato X ADDC A,@R1 ;Suma X con Y DA A MOV @R0,A ;Resultado sustituye a X INC R0 ;Incrementa punteros INC R1 DJNZ R7,BUC_SN ;Repite R7 veces RET

En cuanto a la resta de datos de longitud mayor que un byte, se puede realizar una subrutina con este propsito simplemente reemplazando la instruccin de suma por la instruccin de resta, SUBB, en las subrutinas anteriores.

5.6 Contador en BCD


Es habitual en muchas aplicaciones realizar rutinas que hagan la funcin de contador en formato binario o BCD. Estas rutinas tienen por objetivo contabilizar objetos, eventos, pulsos de una seal cuadrada, etc. Los contadores en formato binario son sencillos de realizar, ya que hay instrucciones especficas para ello como INC, DEC, ADD, ADDC y SUBB; por el contrario, los contadores en formato BCD no son tan evidentes de hacer, pues la ALU del microcontrolador contiene un sumador binario, pero no un sumador en base decimal. Por otro lado, debe tenerse en cuenta que en aquellas aplicaciones donde el resultado de la cuenta se muestra a un operario, ste debe aparecer en formato decimal, para que se pueda interpretar de manera conveniente. El siguiente ejemplo muestra una subrutina para realizar un contador en BCD de cuatro cifras, es decir, que el mximo valor que puede alcanzar es 999. Cada cifra del contador est contenida en un registro: las unidades estn en el registro R0, las decenas en R1 y las centenas en R2. De esta forma, para visualizar posteriormente el valor del contador, slo se ha de volcar cada uno de los registros en el visualizador numrico correspondiente, ya sea de tipo LED o LCD.
1

Un visualizador numrico suele estar formado por varios dgitos tipo LED de 7 segmentos o de 16 segmentos, o por una pantalla de cristal de cuarzo (LCD).

Los autores, 2001; Edicions UPC, 2001.

104
;************************************************ ;Subrutina CONTA ;Registros afectados: R0, R1, R2 ;************************************************ CONTA: CJNE R0,#9,UNIDAD ;Compara unidad CJNE R1,#9,DECENA ;Compara decena CJNE R2,#9,CENTENA ;Compara centena MOV R0,#0 ;Al ser 999 pone a 000 MOV R1,#0 MOV R2,#0 RET UNIDAD: INC R0 ;Incrementa unidades RET DECENA:MOV R0,#0 ;Pone a 0 las unidades INC R1 ;Incrementa decenas RET CENTENA: MOV R0,#0 ;Pone a 0 unidades y decenas MOV R1,#0 INC R2 ;Incrementa centenas RET
CONTA

Microcontroladores MCS-51 y MCS-251

R0=9
NO

SI

R1=9
NO

SI

R2=9
NO

SI

R0=R0+1

R0=0 R1=R1+1

R0=0 R1=0 R2=R2+1 R0=0 R1=0 R2=0

RET

Fig. 5.4 Flujograma de la subrutina CONTA

El flujograma de la subrutina CONTA (figura 5.4), se observa cmo primero se comprueba si las unidades han llegado a 9; de no ser as se incrementa R0. En caso afirmativo, se incrementan las decenas y las unidades se ponen a cero. Procediendo de esta manera con el resto de dgitos, se completa la subrutina del contador, que se puede extender fcilmente a un mayor nmero de dgitos. A la hora de hacer una subrutina para descontar, el proceso es idntico al mostrado en la figura 5.4, pero cambiando la condicin existente por la de comprobar si las unidades, decenas y centenas son iguales a cero; los registros, en lugar de ponerse a cero, se ponen a 9, tal y como se indica en la figura 5.5. A continuacin se muestra la subrutina para descontar:
;************************************************ ;Subrutina DECRE ;Registros afectados: R0, R1, R2 ;************************************************ DECRE: CJNE R0,#0,D_UNI ;Compara unidad CJNE R1,#0,D_DECE ;Compara decena CJNE R2,#0,D_CENT ;Compara centena MOV R0,#9; ;Al ser 000 pone a 999 MOV R1,#9 MOV R2,#9 RET D_UNI: DEC R0 ;Decrementa unidad RET D_DECE: MOV R0,#9 ;Pone a 9 unidad DEC R1 ;Decrementa decena RET D_CENT: MOV R0,#9 ;Pone a 9 unidad MOV R1,#9 ;Pone a 9 decena DEC R2 ;Decrementa centena RET
DECRE

R0=0
NO

SI

R1=0
NO

SI

R2=0
NO

SI

R0=R0-1

R0=9 R1=R1-1

R0=9 R1=9 R2=R2-1 R0=9 R1=9 R2=9

RET

Fig. 5.5 Flujograma de la subrutina DECRE

En el caso de producirse un rebasamiento de los valores mximo y mnimo en las subrutinas CONTA y DECRE, respectivamente, se ha optado por actualizar el valor de todos los registros al valor inicial 000 y 999, respectivamente. Otra manera de realizar un contador en formato BCD, consiste en emplear de manera hbil la

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

105

instruccin de ajuste decimal DA A. Para ello, supngase que se desea realizar un contador de cuatro cifras en formato BCD, y que las posiciones de memoria interna 40H y 41H harn de contador; los cuatro bits bajos de 40H sern las unidades y sus cuatro bits altos, las decenas, los cuatro bits bajos de 41H sern las centenas y sus cuatro bits altos la unidad de millar del contador. Con un contador de cuatro cifras en las posiciones 40H y 41H, se puede llegar hasta un valor de 9999, es decir, ambas posiciones contienen el valor 99H. A continuacin se muestra la rutina CONTA que hace esta funcin:
;******************************************************** ;Subrutina CONTA ;Registros afectados: A, R0, R7, C, (40H), (41H) ;******************************************************** CONTA: MOV R7,#2 ;R7 controla el bucle MOV R0,#40H ;Pone direccin en puntero SETB C ;Pone C=1 BUC_CT: MOV A,@R0 ;Lee ADDC A,#0 ;Suma con acarreo DA A ;Ajuste decimal MOV @R0,A ;Guarda INC R0 ;Incrementa puntero DJNZ R7,BUC_CT ;Repite R7 veces RET

Esta rutina incrementa en una unidad el valor de las posiciones 40H y 41H. La rutina, al principio, incrementa 40H de 00H a 01H, de 01H a 02H, y as sucesivamente hasta llegar a 09H, pues la instruccin de ajuste decimal no modifica el valor del acumulador tras la instruccin de suma. En el siguiente incremento el valor de 40H pasa de 09H a 0AH, por lo que la instruccin DA A transforma este dato en 10H, al ser el nibble bajo mayor que 9. En los siguientes incrementos la instruccin DA A no modificar el acumulador, al menos hasta que llegue al valor de 1AH, momento en el cual lo transformar en 20H. As, la instruccin de ajuste decimal acta en los instantes en que el acumulador vale 1AH, 2AH, 3AH, , 9AH; este ltimo caso lo transforma en 00H y pone el bit de acarreo a uno, C=1, de manera que incrementa en una unidad el contenido de la posicin de 41H, pasando el contador a valer 0100H. La rutina CONTA basada en la instruccin de ajuste decimal tiene un menor tamao que la anterior y, adems, permite extender el mximo valor del contador a cualquier tamao; basta, para ello, con aumentar el nmero de bytes del contador, aumentado el nmero de posiciones de memoria que ocupa. Por el contrario, no es posible realizar del mismo modo una rutina que decremente el valor del contador, debido a que la instruccin de ajuste decimal no puede ir asociada a la instruccin SUBB de resta.
2

5.7 Multiplicacin y divisin de datos de 16 bits


Para llevar a cabo la multiplicacin de dos nmeros de 16 bits se deben realizar primero dos multiplicaciones de un nmero de 8 bits por otro de 16 bits (XL por YH-YL, y XH por YHYL)(figura 5.6a), que proporcionan dos resultados intermedios de 24 bits, ZN2-ZN0 al multiplicar XL

Consultar la instruccin de ajuste decimal en el apartado 4.3.4.5.

Los autores, 2001; Edicions UPC, 2001.

106

Microcontroladores MCS-51 y MCS-251

por YH-YL y ZM2-ZM0 al multiplicar XH por YH-YL. Estos resultados intermedios se suman para obtener un resultado final de 32 bits (ZS3-ZS0)(figura 5.6b). En consecuencia, la multiplicacin de dos nmeros de 16 bits estar basada en una subrutina, MUL8_16, que multiplica un nmero de 8 bits con un nmero de 16 bits. La subrutina MUL8_16 tiene un primer operando XL de 8 bits almacenado en R1 y un segundo operando de 16 bits; el byte alto est almacenado en R2 y el byte bajo en R3. La subrutina genera un resultado de 24 bits que se sita en los registros R5, R6 y R7, donde se almacenan los resultados ZT2, ZT1 y ZT0, respectivamente.
;********************************************** ;Subrutina MUL8_16 (8bits x 16 bits, XL x YH-YL) ;Entrada: R1=XL, R2=YH, R3=YL. ;Salida: 24 bits. R7=ZT0, R6=ZT1 y R5=ZT2. ;Modifica: A, B, C ;********************************************** MUL8_16: MOV A,R1 ;Lee XL MOV A,R3 ;Lee YL MUL AB ;(XL x YL) MOV R7,A ;Salva ZT0 MOV R6,B ;Salva ZN1 MOV A,R1 ;Lee XL MOV B,R2 ;Lee YH MUL AB ;(XL x YH) ADD A,R6 ;(ZM0+ZN1) MOV R6,A ;Salva ZT1 CLR A ;Borra A ADDC A,B ;(ZM1+acarreo) MOV R5,A ;Salva ZT2 RET

a) (x) (+) ZM1 ZT2

YH YL XL ZN1 ZN0 ZM0 ZT1 ZT0

b)

YH YL (x) XH XL ZN2 ZN1 ZN0 (+) ZM2 ZM1 ZM0 ZS3 ZS2 ZS1 ZS0

Fig. 5.6 a) Multiplicacin de un dato de 8 bits (XL) por otro de 16 bits (YH-YL). b) Multiplicacin de dos datos de 16bits (XH-XL y YH-YL)

La subrutina MUL16 multiplica dos datos de 16 bits cada uno. El primer y el segundo operando deben estar ubicados en los registros R0, R1, R2 y R3, donde se sitan XH, XL, YH e YL, respectivamente. La subrutina genera un resultado de 32 bits, ZS0, ZS1, ZS2 y ZS3, que se coloca en los registros R7, R6 , R5 y R4, respectivamente.
;************************************************ ;Subrutina MUL16 (16bits x 16 bit, YH-YL x XH-XL) ;Entrada: R0=XH, R1=XL, R2=YH, R3=YL ;Salida: 32 bits. R7=ZS0, R6=ZS1, R5=ZS2, R4=ZS3 ;Modifica: A, B, Registros R7 a R1 del banco 1 ;************************************************ MUL16: LCALL MUL8_16 ;(XL x YH-YL) SETB RS0 ;Cambia al banco 1 MOV R1,00H ;Lee XH MOV R2,02H ;Lee YH MOV R3,03H ;Lee YL LCALL MUL8_16 ;(XH x YH-YL) CLR C ;Borra acarreo CLR RS0 ;Cambia a banco 0 MOV A,R6 ;Lee ZN1 ADD A,0FH ;(ZN1+ZM0) MOV R6,A ;Salva ZS1 MOV A,R5 ;Lee ZN2 ADDC A,0EH ;(ZN2+ZM1+C) MOV R5,A ;Salva ZS2 CLR A ;Borra A ADDC A,0DH ;(ZM2+C) MOV R4,A ;Salva ZS3 RET

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

107

La subrutina MUL16 utiliza el banco 0 y el banco 1 de registros para almacenar los resultados intermedios de la subrutina MUL8_16. La primera multiplicacin, XL x YH-YL, utiliza el banco 0 de registros y la segunda multiplicacin, XH x YH-YL, utiliza el banco 1 de registros. Se cambia de banco de registros con el bit RS0 del registro de estado PSW. Al final de la subrutina MUL16 se trabaja con los registros del banco 0 y se accede a los registros del banco 1 mediante direccionamiento directo. Para usar la subrutina MUL16 se debe inicializar el puntero de la pila, SP, al menos con una direccin superior a la direccin ms alta del banco 1 de registros, ya que las instrucciones CALL, PUSH y POP escriben en las posiciones apuntadas por este puntero. Se trata de evitar, en consecuencia, que las instrucciones mencionadas escriban accidentalmente sobre el banco 1. El valor del SP se puede modificar fcilmente con la siguiente instruccin: MOV SP,#0FH. La familia MCS-251 dispone de instrucciones de multiplicacin de datos de 2 bytes, de forma que la subrutina MUL16 queda reducida, en la MCS-251, a una simple instruccin: MUL WR0,WR2

Esta instruccin multiplica el contenido de los registros R1 y R0 por el contenido de los registros R3 y R2, y guarda el resultado de 32 bits en los registros R3, R2, R1 y R0. De la misma forma que la expuesta, se pueden realizar subrutinas de multiplicacin de 24x16 bits, 24x24 bits, 32x16 bits y 32x32 bits, dependiendo de las necesidades de la aplicacin que se quiera realizar. La divisin de datos numricos sin signo de 16 bits de longitud se puede efectuar mediante un proceso iterativo en el cual de debe multiplicar el dividendo por 2-i, donde i est comprendido entre 0 y 15, y se debe restar el resultado del divisor (figura 5.7). La primera multiplicacin se realiza para i=15, por lo que desplazan XH y XL 16 bits hacia la derecha, -inicialmente XH est en R0 y XL en R1; luego se copia XH en R2 y XL en R3, y se pone R0 y R1 a cero, con lo que el dividendo pasa a estar formado por los registros R0, R1, R2 y R3, 32 bit en total, o sea, es una multiplicacin por 2-16 -, y se rota el dividendo obtenido una posicin hacia la izquierda, consiguiendo que la multiplicacin sea por 2-15. Posteriormente, se restan los 16 bits altos del dividendo, R0 y R1, con el divisor, es decir:

(dividendo x 2 -i )16 bits altos divisor


Esta operacin se efecta para comprobar si los 16 bits altos del dividendo son mayores, menores o iguales que los 16 bits del divisor, hecho que se refleja en el valor del bit de acarreo, pues en la resta se pueden dar dos casos: 1. El bit C se pone a 1, lo que implica: 2. El bit C de pone a 0, lo que implica:

(dividendo x 2 -i )16 bits altos divisor (dividendo x 2 -i )16 bits altos divisor

En el primer caso se complementa el bit de acarreo y se introduce en el cociente, CH y CL, mediante una rotacin con acarreo hacia la izquierda. En el segundo caso se sustituye XH y XL por el resultado de la resta, en ZH y ZL, se complementa el bit de acarreo y se introduce ste en los registros del cociente.

Los autores, 2001; Edicions UPC, 2001.

108

Microcontroladores MCS-51 y MCS-251

Este proceso se itera 16 veces hasta que i=0, entonces el resto de la divisin, que se halla situado en los mismos registros XH y XL, se coloca en los registros R2 y R3, respectivamente, y el cociente de la divisin (registros CH y CL), se coloca en los registros R0 y R1, respectivamente.
;****************************************************** ;Subrutina DIV16 Divisin de 16 bits (XH-XL)/(YH-YL) ;Entrada: Dividendo: XH=R0 y XL =R1. Divisor: YH=R4 y YL=R5. ;Salida: Cociente: CH=R0 y CL=R1. Resto: ZH=R2 y ZL=R3 ;Modifica: A, R0, R1, R2, R3, R7. Direcc. 08H, 09H, 0AH y 0BH. ;****************************************************** ;Variables temporales: XL EQU 01H ;XL en R1 (dir. directo) XH EQU 00H ;XH en R0 YL EQU 05H ;YL en R5 YH EQU 04H ;YH en R4 CL EQU 09H CH EQU 08H ZL EQU 0BH ZH EQU 0AH DIV16: MOV A,YL ;Lee dividendo ORL A,YH ;Comprueba si ste es cero JNZ DIV_ON ;Si es cero retorna SETB OV ;Pone ante bit OV a 1 RET DIV_ON: MOV R3,XL ; -(XH-XL) x 2-16 MOV R2,XH MOV XL,#0 ;XH=XL=00H MOV XH,#0 MOV CL,#0 ;Cociente MOV CH,#0 ;CH=CL=00H MOV ZL,#0 ;Resto MOV ZH,#0 ;ZH=ZL=00H MOV R7,#16 ;Itera 16 veces BUC_DIV: CLR C LCALL ROTA ;Rota 1 pos. izquierda (2-i ) LCALL SUB16 ;(dividendo x 2-i)16 bits - divisor JC XmenorqY ;si (dividendo x 2-i)16 bits < divisor MOV XL,ZL ;En caso contrario MOV XH,ZH ;XH=ZH, XL=ZL XmenorqY: LCALL ROTAC DJNZ R7,BUC_DIV ;Hasta 16 veces MOV R3,XL ;Divisin finalizada MOV R2,XH ;Pone Resto en R2 y R3. MOV R0,CH ;Pone cociente en R0 y R1. MOV R1,CL CLR OV RET ;****************************************************** ; ROTAC ;****************************************************** ROTAC: CPL C ;Complementa acarreo MOV A,CL ;Rota cociente 1 bit RLC A ;hacia la izquierda MOV CL,A MOV A,CH RLC A MOV CH,A RET

DIV16

divisor=0 NO

SI

OV=1 RET

(dividendo x 2-16) R7=16

C=0. Rota dividendo 1 posicin izquierda

(dividendo x 2-i )16 bits altos <divisor

NO

XH=ZH XL=ZL

SI
Rota Cociente 1 pos. izquierda

R7=0 SI
RET

NO

R7=R7-1

Fig. 5.7 Flujograma de la subrutina DIV16

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin ;****************************************************************** ;SUB16 -Resta de 16 bits (XH-XL)-(YH-YL) ;Entrada: XH=R0, XL=R1, YH=R2, YL=R3. ;Salida: ZH en 0AH y ZL en 0BH ;****************************************************************** SUB16: CLR C ;Subrutina de resta MOV A,XL ;(XH-XL) - (YH-YL) SUBB A,YL ;Resultado en ZH y ZL MOV ZL,A MOV A,XH SUBB A,YH MOV ZH,A RET ;****************************************************** ; ROTA ;****************************************************** ROTA: MOV A,R3 ;Subrutina de rotacin del RLC A ;dividendo 1 bit hacia la derecha MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,XL RLC A MOV XL,A MOV A,XH RLC A MOV XH,A RET

109

La familia MCS-251 puede realizar una divisin de 16 bits tan slo con una instruccin: DIV WR0,WR4. Esta instruccin divide el contenido de WR0 por el contenido de WR4, poniendo el cociente resultante en WR2 y el resto en WR0.

5.8 Suma y resta de datos con signo


La suma y resta de nmeros con signo se realiza de forma similar a la suma y resta de nmeros sin signo. La nica diferencia estriba en que el bit de overflow, OV, se pone a 1 cuando el resultado de las operaciones est fuera de rango. En la suma y resta de datos de 16 bits el bit OV se pone a 1 si la operacin con los bytes altos de los operandos el resultado est fuera de rango. En consecuencia, las rutinas realizadas de suma y resta de nmeros sin signo se pueden emplear para el caso de nmeros con signo, con la salvedad que tras la operacin hecha se ha de comprobar el estado del bit de overflow, por si el resultado est fuera de rango.
3

5.9 Multiplicacin y divisin de 16 bits con signo


La multiplicacin y divisin de datos con signo resulta ms fcil de llevar a cabo si los datos estn en un formato de valor absoluto y signo, de manera que la operacin se pueda realizar utilizando los algoritmos del apartado 5.7, obteniendo el signo del resultado a partir del signo de los operandos.

Vase el apartado 4.3.4.1, instrucciones de suma y resta.

Los autores, 2001; Edicions UPC, 2001.

110

Microcontroladores MCS-51 y MCS-251

Luego, si el formato de los datos est en complemento a dos, stos se deben pasar al formato mdulosigno, se debe realizar la multiplicacin o divisin de los operandos y pasar el resultado a complemento a dos. Al considerar el bit de signo de los operandos se observa que el resultado binario de la multiplicacin coincide con la funcin booleana XOR (figura 5.8). La funcin XOR a nivel de bit no existe en las familias MCS-51 y MCS-251; no obstante, esta funcin se puede realizar sencillamente teniendo en cuenta que si a las entradas de la funcin XOR se las denomina a y b, y z a su salida, z es igual a b, z=b, si a es cero y z es igual a b negado, z=/b, si a vale 1 lgico. Multiplicaci n de signos ++ = + +- = -+ = -- = + Multiplicaci n binaria de signos 00 = 0 01 = 1 10 = 1 11 = 0
Fig. 5.8 Multiplicacin binaria de signos

A continuacin se muestra la subrutina MUL16S que realiza la multiplicacin de dos nmeros de 16 bits con signo. Esta subrutina utiliza la subrutina anterior MUL16 para multiplicar en valor absoluto los dos operandos, por lo que MUL16S tendr los mismo registros de entrada y de salida que MUL16. Para determinar el bit de signo resultante de la multiplicacin se utilizan los bits de propsito general F0 y UD del registro de estado PSW, es decir, los bits PSW.5 y PSW.1, que son definibles por el usuario.
;***************************************************** ;Subrutina MUL16S ;Multiplica 16bitsx16bits con signo, (YH-YL)x(XH-XL) ;Entrada: R0=XH, R1=XL, R2=YH, R3=YL. ;Salida: 32 bits. R7=ZS0, R6=ZS1, R5=ZS2, R4=ZS3. ;Modifica: A, B, Registros R7 a R1 del banco 1. ;***************************************************** MUL16S: MOV A,R0 ;Lee XH RLC A ;Rota MOV PSW.5,C ;Guarda bit de signo de X MOV A,R2 ;Lee YH RLC A ;Rota MOV PSW.1,C ;Guarda bit de signo de Y JNB PSW.5,MOD_Y ;X es negativo? CLR C ;Borra acarreo CLR A ;Borra A SUBB A,R1 ;Complemento a 2 XL MOV R1,A ;Guarda XL CLR A ;Borra A SUBB A,R0 ;Complemento a 2 XH MOV R0,A ;Guarda XH MOD_Y: JNB PSW.1,M_ABS ;Y es negativo? CLR C ;Borra acarreo CLR A ;Borra A SUBB A,R3 ;Compl. a 2 de YL MOV R3,A ;Guarda YL CLR A ;Borra A SUBB A,R2 ;Compl. a 2 de YH MOV R2,A ;Guarda YH

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin M_ABS: LCALL MOV JNB CPL ES_0: JC RET CPL4: MOV SETB MOV LCALL CLR RET MUL16 C,PSW.5 PSW.1,ES_0 C CPL4 08H,#07 RS0 R7,#4 COMPL2_N RS0 ;Multiplica en valor absoluto ;Funcin XOR de los signos

111

;Resultado negativo ;Carga direcc. ZS0 ;Cambia a banco 1 ;N de bytes de ZS ;Compl. a 2 de ZS ;Cambia a banco 0

La subrutina MUL16S hace uso adems de la subrutina COMPL2_N que realiza el complemento a dos del resultado ZS de 4 bytes, generado por la multiplicacin. Esta subrutina es genrica y utiliza la direccin del operando (puntero @R0) y el tamao del operando (R7) como datos de entrada.
;********************************************** ;Subrutina COMPL2_N ;Realiza el complemento a 2 de un nmero de N bytes ;Entrada: R0 (Puntero a X), R7 (Tamao) ;Salida: Resultado sustituye al operando X ;Modifica: C, A, R0, R7 ;********************************************** COMPL2_N: CLR C BUC_CP: CLR A SUBB A,@R0 MOV @R0,A DEC R0 DJNZ R7,BUC_CP RET

Para la familia MCS-251 la subrutina MUL16S puede ser ms compacta. En este caso, los operandos se sitan dentro de la zona accesible bit a bit, de la 20H a la 2FH de la memoria RAM interna, para poder as acceder fcilmente a los bits de signo de los operandos.
;******************************************************************************** ;Subrutina MUL16S para la familia MCS-251 ;Entrada: XH en 20H, XL en 21H.YH en 22H, YL en 23H. ;Salida: 32 bits. R7=ZS0, R6=ZS1, R5=ZS2, R4=ZS3. Modifica: A, B, Reg. R7 a R1 del banco 1. ;********************************************************************************* MUL16S: JNB 20H.7,SAL1 SUB WR0,20H JMP SIGUE0 SAL1: MOV WR0,20H SIGUE0: JNB 22H.7,SAL2 SUB WR2,22H CPL 20H.7 SAL2: JMP SIGUE1 MOV WR2,22H SIGUE1: MUL WR0,WR2 JNB 20H.7,SIGUE2 SUB DR4,DR0 RET SIGUE2: MOV DR4,DR0 RET

La subrutina siguiente DIV16s realiza divisin con signo de dos nmeros de 16 bits, utilizando para ello la subrutina DIV16; por tanto, tiene los mismos parmetros de entrada y de salida que esta subrutina. En cuanto al resultado, en el caso que el dividendo sea positivo y el divisor sea negativo, y

Los autores, 2001; Edicions UPC, 2001.

112

Microcontroladores MCS-51 y MCS-251

viceversa, el cociente deber ser negativo; si ambos, dividendo y divisor, son positivos o negativos, entonces el cociente debe ser positivo. En cualquier caso, el resto se deja siempre positivo.
;************************************************************** ;Subrutina DIV16S Divisin de 16 bits con signo (XH-XL)/(YH-YL) ;Entrada: Dividendo: XH=R0 y XL =R1. Divisor: YH=R4 y YL=R5 ;Salida: Cociente: CH=R0 y CL=R1. Resto: ZH=R2 y ZL=R3 ;Modifica: A, R0, R1, R2, R3, R7. Direcc. 08H, 09H, 0AH, 0BH, 20H y 21H ;************************************************************** DIV16S: MOV 20H,R0 ;Pone XH en 20H MOV 21H,R4 ;Pone YH en 21H JNB 20H.7,MOD_Y ;X es negativo? SETB RS0 ;Cambio a banco 1 MOV R0,#01H ;Carga dir. XL en puntero R0 MOV R7,#2 ;N de bytes LCALL COMPL2_N ;Complementa a 2 MOD_Y: JNB 21H.7,M_ABS ;Y es negativo? MOV R0,#03H ;Carga dir. YL en puntero R0 MOV R7,#2 ;N de bytes CLR RS0 ;Cambio a banco 0 M_ABS: LCALL DIV16 ;Divisin en valor absoluto JB OV,SALIR JB 20H.7,DIVDN ;Si dato X es negativo JB 21H.7,CPLDIV ;Si dato Y es negativo SALIR: RET ;Dato X y dato Y son positivos DIVDN: JNB 21H.7,CPLDIV ;Si dato Y es positivo RET ;Dato X y dato Y son negativos CPLDIV: SETB RS0 ;Cambio a banco 1 MOV R0,#01H ;Carga dir. cociente MOV R7,#2 ;N de bytes LCALL COMPL2_N ;Complementa a 2 CLR RS0 ;Cambio a banco 0 RET

La subrutina DIV16S para la familia MCS-251 es la siguiente:


;******************************************************************* ;Subrutina DIV16S Para la familia MCS-251 ;Entrada: Dividendo: XH en 20H y XL en 21H. Divisor: YH en 22H y YL en 23H ;Salida: Cociente en WR6 y resto en WR4 ;******************************************************************* DIV16S: JNB 20H.7,SAL1 SUB WR0,20H JMP SIGUE SAL1: MOV WR0,20H SIGUE: JNB 22H.7,SAL2 SUB WR2,22H CPL 20H.7 SAL2: JMP SIGUE1 MOV WR2,22H SIGUE1: DIV WR0,WR2 JNB 20H.7,SIGUE2 SUB WR6,WR2 MOV WR4,WR0 RET SIGUE2: MOV DR4,DR0 RET

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

113

5.10 Ejemplos de aplicacin


A continuacin se describen una serie de ejemplos resueltos donde se aplican parte de las rutinas expuestas en este captulo. Los ejemplos descritos se pueden realizar, de forma ms efectiva y con una mejor explotacin de los recursos del microcontrolador, utilizando interrupciones, por lo que para algunos de los ejemplos se propondr su solucin alternativa en captulos posteriores, teniendo ya un mejor conocimiento del proceso de interrupciones y de los recursos internos de los microcontroladores de las familias MCS-51 y MCS-251. La estructura del programa, realizada en los ejemplos, en general ser parecida a lo largo de este libro. El programa tendr una rutina inicial, rutina Inicio, en la cual se configuran los recursos internos del microcontrolador y el modo de operar de ste. De esta rutina se pasa a una rutina Principal, que se encarga de llevar a cabo las funciones requeridas por la aplicacin. La rutina principal ser una rutina que forme un bucle infinito, pues las aplicaciones a resolver necesitan que el microcontrolador est constantemente pendiente de las tareas que debe efectuar. La rutina Inicio en algunos ejemplos no aparecer, pues, las soluciones adoptadas son sencillas, y no ser necesario poner un valor inicial a las variables empleadas.

5.10.1 Generacin de una seal cuadrada En un sistema es frecuente tener que generar una seal peridica de frecuencia determinada y lo ms simtrica posible. En este ejemplo, se propone la creacin de una seal cuadrada de 5kHz de frecuencia, que se extraer por la patilla P1.0 de un microcontrolador 8031 (figura 5.9). Para generar una frecuencia de 5kHz se precisa de un periodo de 200 s y, por tanto, cambiar el estado de la patilla P1.0 cada 100s. Para cambiar el estado de P1.0 se utilizar la instruccin CPL de complemento de un bit, y para generar un retardo de 100 s se utilizar una rutina de retardo como la descrita en el apartado 5.4. 8031
;*************************************************** ; Programa de generacin de una seal cuadrada ;*************************************************** ORG 0H LJMP Principal ;*************************************************** ; Rutina Principal ;*************************************************** ORG 0100H Principal: CPL P1.0 ;Complementa el estado lgico de P1.0 CALL Retardo ;Llama a la rutina de retardo SJMP Principal ;Bucle infinito a principal Retardo: MOV R7, #46 ;Pone 46 en R7 L1: DJNZ R7, L1 ;Bucle sobre L1 RET ;Retorno de subrutina

P1.0

T/2

T (200S)
Fig. 5.9 Generacin de una seal cuadrada con el microcontrolador

Para que la instruccin CPL se ejecute cada 100 s, se debe determinar de forma precisa el valor de carga del registro R7 de la subrutina de retardo. Para ello, si se considera que la frecuencia de reloj del microcontrolador es de 12MHz y que, entonces, un ciclo mquina tarda en efectuarse 1 s, y que la

Los autores, 2001; Edicions UPC, 2001.

114

Microcontroladores MCS-51 y MCS-251

instruccin CPL se ejecuta en 1 ciclo mquina, indicado como CM, la instruccin CALL se ejecuta en 2 CM, SJMP en 2 CM, MOV R7, #46 en 1CM, DJNZ en 2CM y RET en 2 CM. El tiempo de ejecucin de la rutina de retardo viene dado por:
t Re t 1 2 R 7 2 CM

Y el tiempo total en que se ejecuta la instruccin CPL a cada vuelta del bucle principal es: t CPL 1 2 2 t Re t 100CM 100s Se deduce que tRet debe valer 95 s, y que el registro R7 debe valer 46. El programa realizado se puede modificar para efectuar el parpadeo de un diodo led conectado por medio de un transistor al microcontrolador (fig 5.10). La resistencia R1 debe calcularse para limitar la corriente del diodo led a unos 20mA, valor ms que suficiente para mantener al diodo encendido de manera adecuada.
Vcc R1

80C31
VTH R2 P1.0 VCE LED

Fig. 5.10 Circuito de conexin de un diodo led al microcontrolador

La resistencia R2 se debe determinar para que el transistor entre en saturacin cuando la salida de P1.0 est a 1 lgico. La rutina modificada se muestra a continuacin:
;***************************************** ; Programa de parpadeo de un diodo led ;***************************************** ORG 0H LJMP Principal ;***************************************** ; Rutina Principal ;***************************************** ORG 0100H Principal: CPL P1.0 MOV R6, #0 MOV R7, #0 Retardo: DJNZ R6, Retardo DJNZ R7, Retardo SJMP Principal

El tiempo que tarda en ejecutarse la rutina de retardo, bucle formado por L1, deber ser suficiente para que el parpadeo del led sea perceptible. Este tiempo es: t L1 [2 (255 1) 2] (255 1) 131584s 0,13s La frecuencia de la seal cuadrada ser en este caso de 3,8Hz, aproximadamente.

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

115

5.10.2 Conexin de teclas al microcontrolador Las teclas o pulsadores son elementos que aparecen en la mayor parte de los sistemas basados en un microcontrolador, por lo que en este ejemplo se propone la conexin de teclas a cada uno de los puertos del microcontrolador, tal y como indica la figura 5.11.
Vcc

87C31
T1 T2 T3 T4 T5 P1.0 P1.1 P2.0 P2.1 P3.0 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 P0.0

R T6

74LS05/06

Vcc R
LED

Vcc

i VTH LED R Colector abierto

VCE

Fig. 5.11 Conexin de 4 teclas al microcontrolador

En la figura 5.11 se emplea el circuito integrado 74LS05, o el 74LS06, que contiene hasta 6 puertas inversoras en colector abierto. El terminal de salida de la puerta inversora es el colector de un transistor interno, cuyo emisor est conectado a masa, tal y como se ve en el detalle de esta figura. La puerta inversora puede soportar una corriente mxima de 25mA, para el 74LS05, y de 30mA a 40mA, para el 74LS06, valores ms que suficientes para encender de manera adecuada el diodo led que tiene conectado. La resistencia R se debe calcular de forma adecuada para que, considerando el valor de Vcc, de la tensin umbral del diodo led, VTH, y de la tensin colector-emisor del transistor en saturacin, VCE, la corriente i est limitada a unos 20mA, valor ms que suficiente para iluminar adecuadamente el diodo led. El valor de la resistencia R se puede determinar a partir de la siguiente ecuacin: R VCC VTH VCE i (5.1)

Los puertos P1, P2 y P3 (figura 3.4 del captulo 3) tienen una resistencia interna de pull-up conectada a cada una de las salidas, por lo que una tecla se puede conectar directamente a la patilla de uno de estos puertos. Debido a la resistencia de pull-up, el estado de una tecla no pulsada ser de 1 lgico y el estado de una tecla pulsada ser de 0 lgico (conexin directa a masa -fig. 5.12-), por lo que basta con leer el estado lgico del terminal del puerto para saber si la tecla est siendo pulsada o no. El puerto P0 de la MCS-51 no tiene resistencia interna de pull-up y en su lugar hay un transistor NMOS, debido a que este puerto debe tener la caracterstica de triestado. Por ello, para conectar una

Los autores, 2001; Edicions UPC, 2001.

116

Microcontroladores MCS-51 y MCS-251

tecla se debe poner una resistencia externa de pull-up, que proporcione un estado 1 lgico, cuando no se pulsa la tecla, y un estado 0 lgico, cuando se pulsa la tecla.

Puertos P1, P2 y P3
Vcc Pull-up

Vcc

Puerto P0
VDD

Fig. 5.12 Conexin de una tecla al terminal de los puertos de la MCS-51

El programa deber leer el estado de las teclas y encender un diodo led asociado a la tecla, en el caso de que se pulse. El diodo led se mantendr encendido mientras la tecla permanezca pulsada. Las instrucciones CLR que se utilizan para borrar los leds pueden sustituirse por una nica instruccin que escriba en todo el puerto P1. Para ello, se debe tener en cuenta que hay dos teclas conectadas a P1.0 y P1.1, respectivamente; deben ponerse estos terminales a 1 lgico, de forma que sea posible leer si la tecla ha sido pulsada o no.
;****************************************************************** ; Programa para la lectura de la teclas del circuito de la figura 5.11 ;****************************************************************** ORG 0H MOV P1, #0000 0011b ;Leds apagados. P1.0 y P1.1 como entradas LJMP Principal ;****************************************************************** ; Rutina Principal (Testeo de teclas y encendido/ apagado de leds) ;****************************************************************** ORG 0100H Principal: JNB P1.0, Tecla_T1 ;Comprueba si se ha pulsado T1 JNB P1.1, Tecla_T2 ;Comprueba si se ha pulsado T2 JNB P2.0, Tecla_T3 ;Comprueba si se ha pulsado T3 JNB P2.1, Tecla_T4 ;Comprueba si se ha pulsado T4 JNB P3.0, Tecla_T5 ;Comprueba si se ha pulsado T5 JNB P0.0, Tecla_T6 ;Comprueba si se ha pulsado T6 CLR P1.2 ;Apaga led conectado a P1.2 CLR P1.3 ;Apaga led conectado a P1.3 CLR P1.4 ;Apaga led conectado a P1.4 CLR P1.5 ;Apaga led conectado a P1.5 CLR P1.6 ;Apaga led conectado a P1.6 CLR P1.7 ;Apaga led conectado a P1.7 SJMP Principal Tecla_T1: MOV P1, #0000 0111b ;Enciende led de P1.2 y apaga el resto SJMP Principal ;Regresa a Principal Tecla_T2: MOV P1, #0000 1011b ;Enciende led de P1.3 y apaga el resto SJMP Principal ;Regresa a Principal Tecla_T3: MOV P1, #0001 0011b ;Enciende led de P1.4 y apaga el resto SJMP Principal ;Regresa a Principal Tecla_T4: MOV P1, #0010 0011b ;Enciende led de P1.5 y apaga el resto SJMP Principal ;Regresa a Principal Tecla_T5: MOV P1, #0100 0011b ;Enciende led de P1.6 y apaga el resto SJMP Principal ;Regresa a Principal

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin Tecla_T6: MOV P1, #1000 0011b SJMP Principal ;Enciende led de P1.7 y apaga el resto ;Regresa a Principal

117

Se puede escribir sobre todo el puerto P1, sustituyendo a las instrucciones CLR P1.X, con la siguiente instruccin MOV:
MOV P1, #0000 0011b ;Bits P1.0 y P1.1 a 1 lgico

La rutina principal lee el estado de cada tecla y apaga los leds conectados al puerto P1. Si se pulsa una tecla, se enciende el diodo led asociado y se salta a la etiqueta Principal, de forma que el led se mantiene encendido mientras se pulse la tecla. Al dejar de pulsar la tecla el programa apaga todos los leds. 5.10.3 Conexin de un dgito de 7 segmentos Los dgitos de visualizacin se usan de manera frecuente para indicar al usuario una determinada informacin. Los dgitos suelen estar formados por 7 segmentos o por 16 segmentos (hexadecimales), aunque existen en el mercado una gran variedad y gama de dgitos a disposicin del diseador. Los dgitos de 7 segmentos son adecuados para visualizar nmeros y algunas letras y smbolos, estos ltimos con poca definicin (figura 5.13). Los dgitos hexadecimales estn formados por 16 diodos led, por lo que tienen una mejor definicin para nmeros, letras y smbolos.
7 segmentos
a f g e c d DP a b c d e f g
DP

16 segmentos

nodo comn

Ctodo comn

DP

Fig. 5.13 Dgitos de 7 y de 16 segmentos

En este ejemplo se conectan tres teclas y un dgito de 7 segmentos al microcontrolador (figura 5.14). El programa debera leer el estado de las teclas y poner en el dgito la letra A si se pulsa la tecla T1, la letra b si se pulsa la tecla T2, y la letra C si se pulsa la tecla T3.
87C31
T1 T2 T3 P1.0 P1.1 P1.2 e P2.7
DP

74LS05/06
a b

P2.0 P2.1

Dgito 7 segmentos nodo comn a f g c b

Vcc VTH

Vcc i b c LED R

d DP VCE Colector abierto

Fig. 5.14 Conexin de un dgito de 7 segmentos al microcontrolador

En la conexin se utiliza, del mismo modo que el ejemplo anterior, un par de circuitos integrados 74LS05 74LS06 que contienen hasta 6 puertas inversoras en colector abierto. El dgito utilizado es

Los autores, 2001; Edicions UPC, 2001.

118

Microcontroladores MCS-51 y MCS-251

de nodo comn, el nodo est conectado a la tensin de alimentacin, Vcc, y cada diodo a una resistencia y a un colector del circuito integrado. La resistencia se debe calcular para que limite la corriente a un valor mximo de 20mA. El programa de este ejemplo se muestra a continuacin:
;******************************************************** ; Programa para la conexin de un dgito de 7-segmentos ;******************************************************** ORG 0H MOV P2, #0 ;Apaga todos los leds del dgito LJMP Principal ;******************************************************* ; Rutina Principal ;******************************************************* ORG 0100H Principal: JNB P1.0, Tecla_T1 ;Comprueba si se ha pulsado T1 JNB P1.1, Tecla_T2 ;Comprueba si se ha pulsado T2 JNB P2.0, Tecla_T3 ;Comprueba si se ha pulsado T3 MOV P2, #0 ;Borra el dgito SJMP Principal Tecla_T1: MOV P2, #0111 0111b ;Pone letra A en el dgito SJMP Principal ;Regresa a Principal Tecla_T2: MOV P2, #0111 1100b ;Pone la letra b en el dgito SJMP Principal ;Regresa a Principal Tecla_T3: MOV P2, #0011 1001b ;Pone la letra C en el dgito SJMP Principal ;Regresa a Principal

5.10.4 Conexin de un teclado matricial de 4 x 4 teclas Los teclados son un elemento imprescindible en un sistema debido a que posibilitan la relacin entre ste y el usuario al permitir la introduccin de datos y la seleccin de diferentes modos de operacin del programa, cuando la aplicacin es compleja. La figura 5.15 muestra la conexin de un teclado matricial de 4x4 teclas al puerto P1 de un 87C31. Existe una enorme variedad y diferentes tipos de teclados en el mercado; no obstante la disposicin de las teclas en stos suele ser matricial, disposicin del tipo fila/columna, de manera que una serie de teclas comparten una misma columna y otra serie de teclas comparte la misma fila (figura 5.15).
87C31 P1.0 P1.1 P1.2 P1.3 R
DP

74LS05/06 R a f e d nodo comn a g b c


DP

P2.0

Vcc

1 4 7 A

2 5 8 0

3 6 9 B

C D E F
P1.4 P1.5 P1.6 P1.7

P2.7

Fig. 5.15 Conexin de un teclado matricial al microcontrolador

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

119

La conexin del teclado con el microcontrolador resulta sencilla, pues utiliza los cuatro bits bajos de P1 como salidas conectadas a las columnas del teclado, y los cuatro bits altos como entradas conectadas a las filas del teclado. En este ejemplo se conecta un dgito de 7 segmentos para que se muestre un carcter determinado, correspondiente a la tecla pulsada. El programa deber efectuar la lectura del teclado matricial de manera continua. Cuando se pulse una tecla, se mostrar el carcter que tiene asociado la tecla en el dgito de 7 segmentos. En el dgito siempre se mostrar el cdigo de la ltima tecla pulsada. La deteccin de una tecla pulsada en el teclado matricial se realizar columna a columna, de forma secuencial, es decir, se pondr un dato en las columnas del teclado (patillas P1.0, P1.1, P1.2 y P1.3), que habilite slo una de las columnas, y se leer a continuacin el estado lgico de las filas del teclado (patillas P1.4, P1.5, P1.6 y P1.7), de manera que si se ha pulsado una tecla se detectar mediante el dato ledo en la filas. Tras haberse comprobado la columna, sta se inhabilitar y se proceder a habilitar la siguiente columna; este proceso se repetir hasta que se hayan testeado todas las columnas del teclado. Este procedimiento se debe repetir de forma continuada, comprobando cada una de las columnas del teclado matricial. Tal y como se ha conectado el teclado matricial al microcontrolador, la habilitacin de una columna se hace poniendo un 0 lgico en una de las patillas de salida de P1, o sea, P1.0, P1.1, P1.2 P1.3, y se inhabilita poniendo un 1 lgico. Luego, una columna estar habilitada, mientras el resto no. Si se pulsa una tecla de la columna habilitada, el estado lgico de la columna, 0 lgico, pasar a una de las filas, dependiendo de cul haya sido la tecla pulsada. En cambio, si no se pulsa ninguna tecla, el estado lgico que se lee es un 1 lgico, puesto que los terminales P1.4, P1.5, P1.6 y P1.7 estn configurados como entradas, es decir, su transistor NMOS (figura 3.4 del captulo 3) est en corte y el estado lgico que se lee corresponde al que proporciona la resistencia interna de pull-up. Sin embargo, en esta situacin, si se pulsa una tecla correspondiente de una columna inhabilitada, en la fila correspondiente se lee un 1 lgico, debido a que el estado de la columna es 1 lgico por estar inhabilitada. En definitiva, para habilitar la primera columna (teclas 1, 4, 7 y A) y inhabilitar el resto de columnas, se debe escribir en el puerto el dato 1111 1110b y configurar, adems, las patillas conectadas a las filas como entradas (estado 1 lgico, transistor NMOS en corte). Para habilitar la segunda columna, (teclas 2, 5, 8 y 0) e inhabilitar el resto, se debe poner 1111 1101b en P1. Para habilitar la tercera columna (teclas 3, 6, 9 y B) e inhabilitar el resto, se debe poner 1111 1011b en P1. Y, por ltimo, para habilitar la cuarta columna (teclas C, D, E y F) e inhabilitar el resto, se debe poner 1111 0111b en P1. El programa deber llevar a cabo la secuencia descrita de testeo por medio de un bucle infinito. Adems, tambin se utilizar una tabla para hacer la conversin a 7 segmentos del carcter que se quiere visualizar.
;****************************************************************** ; Programa de lectura de teclado matricial ;****************************************************************** ORG 0H MOV P2, #0 ;Apaga todos los leds del dgito MOV B, #0 ;Borra registro B LJMP Principal

Los autores, 2001; Edicions UPC, 2001.

120

Microcontroladores MCS-51 y MCS-251 ;****************************************************************** ; Rutina Principal ;****************************************************************** ORG 0100H Principal: MOV P1, #1111 1110b ;Habilita la primera columna CALL Det_tecla ;Subrutina de deteccin de tecla pulsada JNZ A, Colum_1 ;A 0 si se pulsa tecla MOV P1, #1111 1101b ;Habilita la segunda columna CALL Det_tecla JNZ A, Colum_2 ; A 0 si se pulsa tecla MOV P1, #1111 1011b ;Habilita la tercera columna CALL Det_tecla JNZ A, Colum_3 ; A 0 si se pulsa tecla MOV P1, #1111 0111b ;Habilita la cuarta columna CALL Det_tecla JNZ A, Colum_4 ; A 0 si se pulsa tecla Prin2: CALL Display MOV B, #0 ;Borra el registro B SJMP Principal ;Bucle infinito Colum_1: JNB P1.4, Tecla_1 ;Se ha pulsado la tecla 1? JNB P1.5, Tecla_4 ;Se ha pulsado la tecla 4? JNB P1.6, Tecla_7 ;Se ha pulsado la tecla 7? SJMP Tecla_A ;Si no es ninguna de la anteriores, es la tecla A Colum_2: JNB P1.4, Tecla_2 ;Se ha pulsado la tecla 2? JNB P1.5, Tecla_5 ;Se ha pulsado la tecla 5? JNB P1.6, Tecla_8 ;Se ha pulsado la tecla 8? SJMP Tecla_0 ;Si no es ninguna de la anteriores, es la tecla 0 Colum_3: JNB P1.4, Tecla_3 ;Se ha pulsado la tecla 3? JNB P1.5, Tecla_6 ;Se ha pulsado la tecla 6? JNB P1.6, Tecla_9 ;Se ha pulsado la tecla 9? SJMP Tecla_B ;Si no es ninguna de la anteriores, es la tecla B Colum_4: JNB P1.4, Tecla_C ;Se ha pulsado la tecla C? JNB P1.5, Tecla_D ;Se ha pulsado la tecla D? JNB P1.6, Tecla_E ;Se ha pulsado la tecla E? SJMP Tecla_F ;Si no es ninguna de la anteriores, es la tecla F Tecla_0: MOV B, #1 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_1: MOV B, #2 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_2: MOV B, #3 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_3: MOV B, #4 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_4: MOV B, #5 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_5: MOV B, #6 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_6: MOV B, #7 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_7: MOV B, #8 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_8: MOV B, #9 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_9: MOV B, #10 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_A: MOV B, #11 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_B: MOV B, #12 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_C: MOV B, #13 ;Pone en B cdigo para la lectura de tabla LJMP Prin2

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin Tecla_D:

121

MOV B, #14 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_E: MOV B, #15 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_F: MOV B, #16 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 ;********************************************************************** ; Subrutina para la detecccin de una tecla pulsada ; Lee el puerto P1 y retorna A=0 si no se pulsa una tecla y A 0 si se pulsa ;********************************************************************** Det_tecla: MOV A, P1 ;Lee puerto P1 (filas) ORL A, #0FH ;Fuerza 4 bits bajos a 1 lgico CPL A ;Complementa acumulador RET ;Si no se pulsan teclas A=0, A=1 en caso contrario ;********************************************************************** ; Subrutina de visualizacin de un caracter en el dgito de 7-segmentos ;********************************************************************** Display: MOV A, B ;Lee registro B CALL Vis_7seg ;Llama a la subrutina que pone el carcter de 7 segmentos MOV P2, A ;Pone el en P2, visualiza RET Vis_7seg: INC A ;Incrementa acumulador MOVC A, @A+PC ;Lectura de tabla de conversin RET DB 0000 0000b ;(A=1) dgito apagado. DB 0011 1111b ;(A=2) leds a, b, c, d, e y f encendidos, caracter 0 DB 0000 0110b ;(A=3) leds a y b encendidos, caracter 1. DB 0101 1011b ;(A=4) leds a, b, d, e y g encendidos, caracter 2. DB 0100 1111b ;(A=5) leds a, b, c, d y g encendidos, caracter 3 (A=0). DB 0110 0110b ;(A=6) leds b, c, f y g encendidos, caracter 4. DB 0110 1101b ;(A=7) leds a, c, d, f, y g encendidos, caracter 5. DB 0111 1101b ;(A=8) leds a, c, d, e, f y g encendidos, caracter 6. DB 0000 0111b ;(A=9) leds a, b y c encendidos, caracter 7. DB 0111 1111b ;(A=10) leds a, b, c, d, e, f, y g encendidos, caracter 8. DB 0110 0111b ;(A=11) leds a, b, c, f y g encendidos, caracter 9. DB 0111 0111b ;(A=12) leds a, b, c, e, f y g encendidos, caracter A. DB 0111 1100b ;(A=13) leds c, d, e, f y g encendidos, caracter b. DB 0011 1001b ;(A=14) leds a, d, e y f encendidos, caracter C DB 0101 1110b ;(A=15) leds b, c, d, e y g encendidos, caracter d DB 0111 1001b ;(A=16) leds a, d, e, f y g encendidos, caracter E DB 0111 0001b ;(A=17) leds a, e, f y g encendidos, caracter F.

5.10.5 Conexin de varios dgitos de 7 segmentos, aplicacin de Su turno La figura 5.16 muestra la forma de conectar varios dgitos de 7 segmentos a un 87C51 para una aplicacin donde se desea controlar el turno de atencin a un cliente, que es tan comn en tiendas y locales comerciales. Debido al tipo de aplicacin donde se ha de visualizar el nmero de orden del cliente, los dgitos se pueden controlar mediante el circuito integrado 4511, que es un conversor de formato BCD a 7 segmentos, de forma que colocando el nmero en BCD a la entrada del 4511, A0A3, ste activa los leds necesarios (salidas a, b, c, d, e, f, g y dp) para que el nmero aparezca en el dgito. El 4511 es capaz de suministrar hasta 25mA de corriente, valor ms que suficiente para tener un diodo led encendido de forma adecuada. Este circuito integrado tiene un latch interno que le permite almacenar el valor del ltimo nmero almacenado. El latch est gobernado por la entrada /EL, de manera que cuando /EL est a 0 lgico habilita el 4511 y activa los leds correspondientes al nmero

Los autores, 2001; Edicions UPC, 2001.

122

Microcontroladores MCS-51 y MCS-251

de entrada (A0-A3), y cuando en /EL se produce un flanco positivo (paso de 0 a 1 lgico), el latch almacena el ltimo dato presente en la entrada y mantiene encendidos los leds correspondientes.
87C51
Cuenta
T1

4511 Vcc (BCD-7seg)


A0 A1 A2 A3 /EL dp a b

Ctodo comn
Centenas a Decenas Unidades

P1.0 P2.0 P1.1 P1.2 P1.3 Rb P1.4

R
dp

Tr1 Rb Rb

Tr2

Tr3

Reset
T2

P1.5 P2.1 P1.6

Fig. 5.16 Conexin de varios dgitos de 7 segmentos al microcontrolador

El 4511 dispone de dos entradas de control adicionales, /ILT y /IB. La entrada /ILT enciende todos los leds del dgito conectado, para hacer as un chequeo del estado de los leds. La entrada /IB borra todos los leds del dgito conectado. En esta aplicacin se usar un microcontrolador 8751, el 4511, tres dgitos de 7 segmentos y tres transistores para controlar el encendido de cada uno de los dgitos. Por sencillez, las entradas /ILT y /IB del 4511 no se usarn, y la entrada /EL se conectar directamente a tierra, de forma que est siempre habilitado. El circuito formado por el 4511, un dgito conectado a ste (centenas) y el transistor de control de encendido del dgito, Tr1, se muestran en la figura 5.17. El 4511 tiene un transistor bipolar de salida, Tr0, conectado a la tensin de alimentacin Vcc. El 4511 enciende un diodo led, por ejemplo el led a de la figura 5.17, cuando el transistor bipolar Tr0 est en saturacin, de forma que la corriente circula a travs de la resistencia R, del diodo led a y del transistor Tr1. El diodo se encender siempre y cuando el transistor Tr1 est en saturacin.
Vcc 4511 (BCD-7seg)
A0 A1 A2 a b

Tr0 R
a Centenas

ia
R a b

A3

/EL

dp

R
dp

ib ia
Tr1 Tr1

Rb P1.4

Fig. 5.17 Detalle del circuito para la activacin del diodo led a

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

123

Las salidas del 4511 estn conectadas a los diodos de cada segmento, es decir, la salida que activa el diodo led a del dgito de las centenas, tambin est conectada al led a del dgito de las decenas y del dgito de las unidades. De esta forma, se simplifica el circuito y se reduce el nmero de terminales necesarios para los tres dgitos. En cuanto al consumo, debe considerarse que un dgito puede llegar a consumir hasta 160mA (8 diodos led y 20mA por diodo), por tanto, con tres dgitos se puede llegar a un consumo de 480mA, y si el nmero de dgitos es mayor el consumo de corriente se dispara considerablemente. Para evitar el consumo excesivo por parte de los dgitos y para utilizar el circuito realizado, los dgitos se deben encender de manera secuenciada, es decir, primero se enciende el dgito de las centenas, luego el dgito de las decenas y, por ltimo, el dgito de las unidades. Esta secuencia se puede llevar a cabo por medio de la activacin de los transistores conectados al ctodo comn de cada dgito (transistores Tr1, Tr2 y Tr3, respectivamente -fig. 5.18-). Esta secuencia se debe repetir con una frecuencia de 25Hz, como mnimo, para que el parpadeo no sea perceptible por una persona y que la imagen se visualice de manera correcta.
Dgito 1 Dgito 2 T/3 Dgito 2 Dgito 2 T/3 Dgito 3

P1.4

T/3

P1.5

T/3

Dgito 3

P1.6
T

T/3

T/3

Fig. 5.18 Secuencia de encendido de los dgitos del circuito de la figura 5.16

Los transistores TR1, Tr2 y Tr3 pueden ser cualquier tipo de transistor capaz de soportar como mnimo 200mA. Para el caso de un nmero elevado de dgitos se pueden emplear arrays de transistores drlintongs como los disponibles en los circuitos integrados de las series ULN2800A y ULN2980A, capaces de soportar corrientes de 350mA y 500mA. Las funciones bsicas que deber realizar el programa son: 1. 2. Controlar hasta un mximo de 199 peticiones. Cuando la cuenta exceda esta cantidad se deber poner a 000. Se tienen 2 pulsadores, uno de cuenta y otro de reset (de puesta a cero). El pulsador de cuenta siempre incrementar en uno el turno actual. El pulsador de reset pondr a 000 el valor de la cuenta.

La manera ms sencilla de hacer este programa consiste en realizar una rutina de cuenta en formato BCD, como la rutina CONTA descrita en el apartado 5.6. En esta rutina intervienen los registros R0, R1 y R2. El registro R0 se emplea para las unidades, R1 para las decenas y R2 para las centenas. El flujograma del programa se muestra en la figura 5.19.

Los autores, 2001; Edicions UPC, 2001.

124

Microcontroladores MCS-51 y MCS-251

;********************************************* ; Programa para la gestin del turno de espera ;********************************************* ORG 0H MOV P1, #0 ;Pone a cero la entrada del 4511 SUTURNO MOV R0, #0 ;Pone en corte Tr1, Tr2 y Tr3 MOV R1, #0 MOV R2, #0 Inicializaci n ;********************************************** ; Rutina Principal ;********************************************** Principal: JNB P2.0, Cuenta Rutina SI JNB P2.1, PaCero P2.0=0 contador Prin2: CALL Display SJMP Principal NO Cuenta: CALL CONTA SJMP Prin2 SI PaCero: MOV R0, #0 Rutina P2.1=0 MOV R1, #0 puesta a cero MOV R2, #0 NO SJMP Prin2 ;************************************************ ;Subrutina CONTA Refresca ;Registros afectados: R0, R1, R2 dgitos ;************************************************ Fig. 5.19 CONTA: CJNE R0, #9, UNIDAD ;Compara unidad CJNE R1, #9, DECENA ;Compara decena CJNE R2, #1, CENTENA ;Compara centena MOV R0, #0 ;Al ser 199 pone a 000 ;*********************************** MOV R1, #0 ;Subrutina de retardo RETA MOV R2, #0 ;(Retardo de 2+(2*256+2)*12+2= 6172 s) RET ;*********************************** UNIDAD: INC R0 ;Incrementa unidades RETA: MOV R7, #12 RET Buc2: MOV R6, #0 DECENA: MOV R0, #0 ;Pone a 0 las unidades Buc1: DJNZ R6, Buc1 INC R1 ;Incrementa decenas DJNZ R7, Buc2 RET RET CENTENA: MOV R0, #0 ;Pone a 0 unidades y decenas MOV R1, #0 INC R2 ;Incrementa centenas RET ;************************************************************************** ;Subrutina Display (Muestra en los dgitos el valor de la cuenta ;Registros afectados: R0, R1, R2 ;************************************************************************** Display: MOV P1, R2 ;Pone centenas en P1 (4 bits altos de R2 son cero) SETB P1.4 ;Enciende dgito centenas. Tr1 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.4 ;Apaga dgito centenas. Tr1 en corte MOV P1, R1 ;Pone decenas en P1 (4 bits altos de R1 son cero) SETB P1.5 ;Enciende dgito decenas. Tr2 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.5 ;Apaga dgito decenas. Tr2 en corte MOV P1, R0 ;Pone unidades en P1 (4 bits altos de R0 son cero) SETB P1.6 ;Enciende dgito unidades. Tr3 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.6 ;Apaga dgito unidades. Tr3 en corte RET

Cada uno de los dgitos se enciende durante un tiempo de 6172s, aproximadamente (suponiendo un reloj de 12MHz). Por tanto, el nmero se muestra cada 6172*3s, lo que supone una frecuencia de

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

125

refresco del nmero visualizado de 54Hz, aproximadamente. Esta frecuencia puede ser superior, puesto que se tiene una limitacin de frecuencia mnima, pero no en cuanto a frecuencia mxima. Luego, la frecuencia de refresco de todos los dgitos puede ser de 100Hz o de 1kHz, con la nica limitacin del ancho de banda de los transistores Tr1, Tr2 o Tr3 y del 4511. 5.10.6 Contador de piezas Con una pequea modificacin del circuito y del programa anterior se puede realizar un contador de piezas para una mquina en un proceso industrial (figura 5.20). En esta aplicacin se dispone de dos sensores que se simbolizan por una caja con un conmutador. Un sensor indica cundo se ha producido una pieza y el otro indica cundo el proceso posterior de control de calidad descarta una pieza defectuosa. Por tanto, el contador muestra siempre el nmero neto de piezas fabricadas.
Vcc Sensor Cuenta

87C51
P1.0 P2.0 P1.1 P1.2

4511 Vcc (BCD-7seg)


A0 A1 A2 A3 /EL dp a b

Ctodo comn
Millares a Centenas Decenas Unidades

Vcc

Sensor Descuenta P2.1 Reset P2.2

P1.3

R
dp

Rb P1.4 Rb P1.5 P1.6 Rb Rb Tr1 Tr2 Tr3 Tr4

Alarma P2.4

P1.7

Fig. 5.20 Circuito del ejemplo del contador de piezas

Al circuito anterior se le ha aadido un dgito ms, por lo que la cuenta puede llegar hasta 9999 piezas. Si el nmero de piezas llega a su mximo valor y se rebasa ste, por un pulso ms recibido, el contador debe mostrar el nmero mximo de 9999 y activar la seal de alarma conectada a la patilla P2.4 del microcontrolador. Si el contador est a 0000 y recibe un pulso del sensor de descuenta, se activar tambin la seal de alarma conectada a P2.4, para indicar un mal funcionamiento del sensor o al error en el proceso de control de calidad.
;********************************************************************** ; Programa para el contador de piezas ;********************************************************************** ORG 0H MOV P1, #0 ;Pone a cero la entrada del 4511. Pone en corte Tr1, Tr2, Tr3 y Tr4 MOV R0, #0 ;Pone a cero los registros de cada dgito MOV R1, #0 MOV R2, #0 MOV R3, #0 CLR P2.4 ;Pone P2.4 a cero, para no activar la alarma ;********************************************************************** ; Rutina Principal ;********************************************************************** Principal: JNB P2.0, Cuenta JNB P2.1, Descuenta JNB P2.2, PaCero Prin2: CALL Display SJMP Principal

Los autores, 2001; Edicions UPC, 2001.

126
Cuenta:

Microcontroladores MCS-51 y MCS-251 CALL CONTA SJMP Prin2 Descuenta: CALL DECRE SJMP Prin2 ;*********************************************************** ;Rutina PaCero ;*********************************************************** MOV R0, #0 ;Borra unidades MOV R1, #0 ;Borra decenas MOV R2, #0 ;Borra centenas MOV R3, #0 ;Borra millares CLR P2.4 ;Borra alarma SJMP Prin2 ;*********************************************************** ;Rutina CONTA ;Registros afectados: R0, R1, R2, R3 ;*********************************************************** CONTA: CJNE R0, #9, Unidad ;Compara unidad CJNE R1, #9, Decena ;Compara decena CJNE R2, #9, Centena ;Compara centena CJNE R3, #9, Millar ;Compara millar SETB P2.4 ;Activa la alarma RET Unidad: INC R0 ;Incrementa unidades RET Decena: MOV R0, #0 ;Pone a 0 las unidades INC R1 ;Incrementa decenas RET Centena: MOV R0, #0 ;Pone a 0 unidades y decenas MOV R1, #0 INC R2 ;Incrementa centenas RET Millar: MOV R0, #0 ;Pone a 0 unidades, decenas y centenas MOV R1, #0 MOV R2, #0 INC R3 ;Incrementa millares RET ;********************************************************** ;Rutina DECRE ;Registros afectados: R0, R1, R2 y R3 ;********************************************************** DECRE: CJNE R0, #0, D_uni ;Compara unidad CJNE R1, #0, D_dece ;Compara decena CJNE R2, #0, D_cent ;Compara centena CJNE R3, #0, D_mill ;Compara millar SETB P2.4 ;Activa la alarma RET D_uni: DEC R0 ;Decrementa unidad RET D_dece: MOV R0, #9 ;Pone a 9 unidad DEC R1 ;Decrementa decena RET D_cent: MOV R0, #9 ;Pone a 9 unidad MOV R1,#9 ;Pone a 9 decena DEC R2 ;Decrementa centena RET D_mill: MOV R0, #9 ;Pone a 9 unidad MOV R1,#9 ;Pone a 9 decena MOV R2,#9 ;Pone a 9 centena DEC R3 ;Decrementa millar RET

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin ;******************************************************************* ;Subrutina Display (Muestra en los dgitos el valor de la cuenta ;Registros afectados: R0, R1, R2 y R3 ;******************************************************************* Display: MOV P1, R3 ;Pone millares en P1 (4 bits altos de R3 son cero) SETB P1.4 ;Enciende dgito millares. Tr1 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.4 ;Apaga dgito millares. Tr1 en corte MOV P1, R2 ;Pone centenas en P1 (4 bits altos de R2 son cero) SETB P1.5 ;Enciende dgito centenas. Tr2 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.5 ;Apaga dgito centenas. Tr2 en corte MOV P1, R1 ;Pone decenas en P1 (4 bits altos de R1 son cero) SETB P1.6 ;Enciende dgito decenas. Tr3 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.6 ;Apaga dgito decenas. Tr3 en corte MOV P1, R0 ;Pone unidades en P1 (4 bits altos de R0 son cero) SETB P1.7 ;Enciende dgito unidades. Tr4 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.7 ;Apaga dgito unidades. Tr4 en corte RET ;************************************************************* ;Subrutina de retardo RETA (Retardo de 1+2*123+2= 251 s) ;************************************************************* RETA: MOV R7,#125 Buc1: DJNZ R7, Buc1 RET

127

En este caso cada dgito se enciende durante 251s, aproximadamente, lo que supone una frecuencia de refresco del nmero visualizado de 996Hz. Las rutinas Conta y Decre son una modificacin de las subrutinas iniciales explicadas en este captulo.

5.10.7 Control de un ascensor Esta aplicacin consiste en el diseo del sistema de control, basado en el C 8XC251, de un ascensor de carga de una mina de carbn. La tarea del ascensor consiste en elevar hasta la superficie las vagonetas cargadas de carbn. El ascensor se pone en funcionamiento cuando se coloca en su interior una vagoneta, a continuacin asciende hasta que llega a la superficie, donde descarga de forma automtica la vagoneta, y baja otra vez al interior de la mina con la vagoneta vaca (figura 5.21).
8XC251
P1.2 P0.0 P0.1 P1.3 P1.1

S2

M1

M0

Ascensor

Motor

S1

S3

Fig. 5.21 Diagrama del sistema de control de un ascensor

Los autores, 2001; Edicions UPC, 2001.

128

Microcontroladores MCS-51 y MCS-251

Una vez que el ascensor llega abajo se detiene y los operarios sacan la vagoneta del ascensor, la llenan de carbn y la vuelven a colocar dentro del ascensor; se repite de nuevo la secuencia. El sistema de control del ascensor incorpora tres sensores, S1, S2 y S3, activos a nivel alto, cuyo funcionamiento se describe a continuacin: S1: Este sensor est colocado dentro del ascensor y detecta la presencia de la vagoneta, en cuyo caso se pone a 1 lgico. Si no hay vagoneta, el sensor se pone a 0 lgico. S2: Este sensor est colocado en la exterior de la mina y detecta que el ascensor ha llegado hasta la superficie. S3: Este sensor est colocado en el interior de la mina y detecta que el ascensor ha llegado al fondo de la mina. Por otra parte, el sistema dispone de un motor que permite elevar o descender el ascensor. El motor est controlado mediante dos seales binarias, M1 y M0, que funcionan tal y como se indica en la tabla 5.2. En la figura 5.21 se detalla la conexin entre los sensores, los actuadores y el microcontrolador 8XC251.
INICIO SE INHIBEN LAS SALIDAS SE INICIALIZAN LAS ENTRADAS A 1 LOGICO

;************************************************************ ; Control del ascensor ;************************************************************ ORG FF:0000H ; El programa est almacenado a partir de la ; direccin FF:0000H de la memoria

VAGONETA EN EL ASCENSOR? SI

NO

;Inicializacin de los puertos ; Se inicializan P0.0 y P0.1 del puerto a 1 ; con lo que el motor estar detenido ; Los pines que trabajan como entrada, deben ; inicializarse a 1 lgico ; Programa de control SIGUE: JNB P1.1,SIGUE ; Detecta si coloca la vagoneta en el ascensor CLR P0.1 ; El ascensor sube SIGUE1: JNB P1.2,SIGUE2 ; Detecta si el ascensor llega a la superficie SETB P0.1 ; El ascensor baja CLR P0.0 ; SIGUE2: JNB P1.3,SIGUE3 ; Se detecta que el ascensor llega abajo SETB P0.0 ; El ascensor se detiene SIGUE4: JB P1.1,SIGUE4 ; Detecta si sacan la vagoneta del ascensor JMP SIGUE ; El programa vuelve al inicio SETB P0.0 SETB P0.1 MOV P1,#FFH

EL ASCENSOR SUBE

EL ASCENSOR LLEGA A LA SUPERFICIE? SI SI EL ASCENSOR BAJA

NO

NO EL ASCENSOR LLEGA ABAJO? SI SI

NO

EL ASCENSOR SE PARA

NO

NO SI VAGONETA EN EL ASCENSOR?

SI

Fig. 5.22 Diagrama de flujo del programa de control del ascensor

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

129

Tabla 5.2 Condiciones de funcionamiento del motor

M1 M0
0 0 1 1 0 1 0 1

Funcionamiento del motor


El motor est parado. El motor gira a la derecha y el ascensor sube. El motor gira a la izquierda y el ascensor baja. El motor est parado.

El programa que controla la secuencia de funcionamiento del ascensor debe detectar, mediante instrucciones de salto condicional, que se coloca una vagoneta en el interior del ascensor para, a continuacin, activar el motor con el fin de subir el ascensor. Mientras el ascensor sube, el programa debe detectar cundo llega a la superficie, testeando para ello el valor lgico de la entrada conectada al sensor S2. Cuando S2 se activa, se debe colocar en las salidas M0 y M1 el valor lgico 0 y 1, respectivamente, para que el ascensor baje. A continuacin, se debe detectar que el ascensor ha llegado abajo, testeando el sensor S3 con una instruccin de salto condicional. Por ltimo se detecta que se saca la vagoneta del ascensor, para seguidamente retornar al inicio del programa. En la figura 5.22 se muestra el diagrama de flujo del programa de control y el listado del programa.

5.10.8 Control de un calefactor Esta aplicacin trata del diseo de un sistema de control de un calefactor, basado en el microcontrolador 8XC251. Para controlar el calefactor se disponen de 3 sensores de temperatura activos a nivel alto: T1, T2 y T3; de un selector de temperatura ambiente S y de un actuador M que enciende o apaga el calefactor. El funcionamiento de los sensores de temperatura se describe a continuacin: T1: se activa a 1 lgico cuando la temperatura es igual o mayor que 20C. T2: se activa a 1 lgico cuando la temperatura es igual o mayor que 25C. T3: se activa a 1 lgico cuando la temperatura es igual o mayor que 30C. El selector de temperatura S es una entrada binaria que permite seleccionar entre dos rangos de temperatura ambiente: cuando S es igual a 0 lgico, la temperatura debe mantenerse entre 20 y 25C. Cuando S es igual a 1 lgico, la temperatura debe mantenerse entre 25 y 30C. El microcontrolador 8XC251 encender el calefactor y pondr la salida M a 1 lgico, cuando la temperatura sea inferior al valor mnimo del rango seleccionado con S. El calefactor debe permanecer encendido hasta que la temperatura supere el valor mximo del rango seleccionado, en cuyo caso, se debe apagar hasta que la temperatura sea de nuevo inferior al valor mnimo del rango seleccionado. En la figura 5.23 se detalla la conexin de los sensores y actuadores al microcontrolador 8XC251.
8XC251 P1.0 P1.1 P1.2 P1.3 P1.4 T1 T2 T3 CALEFACTOR S M

Fig. 5.23 Esquema conexin de los sensores/actuadores al microcontrolador 8XC251

Los autores, 2001; Edicions UPC, 2001.

130

Microcontroladores MCS-51 y MCS-251

El programa de control del calefactor debe detectar, en primer lugar, qu rango de temperatura est seleccionado. Esto se realiza testeando el valor lgico del pin P3.1. Si este bit est a 0 lgico, se salta a la rutina que mantiene la temperatura entre 20 y 25C, y si vale 1 lgico se ejecuta a la rutina que mantiene la temperatura entre 25 y 30C.
INICIO

SI RANGO = 25/30C ?

SI
NO SE ENCIENDE EL CALEFACTOR

RANGO = 20/25C ?

NO SE ENCIENDE EL CALEFACTOR

SI RANGO = 25/30C ?

NO TEMPERATURA > 25 C ?

SI RANGO = 20/25C ?
NO

NO TEMPERATURA > 30 C ? SI

SI SE APAGA EL CALEFACTOR

NO

SI RANGO = 25/30C ?

SE APAGA EL CALEFACTOR

NO

SI RANGO = 20/25C ?
NO

TEMPERATURA < 20 C ? SI SI

NO

TEMPERATURA < 25 C ? SI SI

NO

Fig. 5.24 Diagrama de flujo del programa de control del calefactor

Comprobando el valor lgico de los distintos sensores de temperatura y teniendo en cuenta el rango de temperatura seleccionado se decide si el calefactor debe estar activo o no. En la figura 5.24 se presenta el flujograma de esta aplicacin; a continuacin se presenta el listado del programa.
;*********************************************************************** ; Control del calefactor ;*********************************************************************** ORG FF:0000H ; El programa est almacenado en memoria a partir de la ; direccin FF:0000H MOV C,P1.3 ; En primer lugar se lee el valor del selector S para conocer en ; que rango de temperatura debe mantenerse la habitacin JC T25_30 ; Si S es igual a 1 lgico se salta a la direccin T25_30

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

131

En el caso de que S sea igual a 0 lgico, se enciende el calefactor hasta que se activa el sensor T2, lo cual quiere decir que la temperatura ha superado los 25C, en cuyo caso se desactiva el calefactor. El calefactor permanece apagado hasta que se desactiva T1; entonces se vuelve a encender. En todo momento se comprueba la entrada S para saltar a la direccin T25_30 en el caso que valga 1 lgico.
;************************************************************************ ; Rutina del rango 20-25C ;************************************************************************ T20_25: SETB P1.4 ; Se activa el calefactor SIGUE1: JB P1.3,T25_30 ; Se comprueba si est seleccionado el rango 20/25C JNB P1.1,SIGUE1 ; Si la temperatura es menor que 25C, el calefactor ; seguir encendido CLR P1.4 ; Se apaga el calefactor SIGUE2: JB P1.3,T25_30 ; Se comprueba si est seleccionado el rango 20/25C JB P1.0,SIGUE2 ; Si la temperatura es mayor que 20C, el calefactor ; seguir apagado JMP T20_25 ; Se vuelve al comienzo de la rutina

Cuando S es igual a 1 lgico, la temperatura de la habitacin debe mantenerse entre 25 y 30C. En este caso se debe encender el calefactor, y apagarse cuando se active el sensor T3. El calefactor permanecer apagado hasta que se desactive T2, repitindose nuevamente la secuencia. Como en el caso anterior, en todo momento se sensa la variable S para saltar a la rutina T20_25 en el caso que valga 0 lgico.
;***************************************************************************** ; Rutina del rango 25-30C ;***************************************************************************** T25_30: SETB P1.4 ; Se activa el calefactor SIGUE3: JNB P1.3,T20_25 ; Se comprueba si est seleccionado el rango 25/30C JNB P1.2,SIGUE3 ; Si la temperatura es menor que 30C, el calefactor ; seguir encendido CLR P1.4 ; Se apaga el calefactor SIGUE4: JNB P1.3,T20_25 ; Se comprueba si est seleccionado el rango 25/30C. JB P1.1,T25_30 ; Si la temperatura es mayor que 20C, el calefactor ; seguir apagado JMP T25_30 ; Se vuelve al comienzo de la rutina

5.10.9 Control de una cinta elevadora En esta aplicacin se debe disear un sistema de control de un elevador de una cinta transportadora basado en el microcontrolador 8XC251. La tarea del elevador es la llevar una caja de un determinado producto, que llega por la cinta A, hasta la cinta B o C. El sistema incorpora los siguientes detectores (figura 5.25): D1: Este detector est colocado junto a la cinta A. Cuando llega una caja a la plataforma elevadora, este sensor decide si hay que llevarla a la cinta B o a la cinta C. Si D1 es igual a 0 lgico, hay que llevar el producto a la cinta B, fig. 5.26, y si D1 es igual a 1 lgico, a la cinta C (figura 5.27). D2: Este sensor se activa (1 lgico) cuando la plataforma est a la altura de la cinta A. D3: Este sensor se activa (1 lgico) cuando llega un producto a la plataforma elevadora. D4: Este sensor se activa (1 lgico) cuando la plataforma elevadora ha llegado a la cinta B. D5: Este sensor se activa (1 lgico) cuando la plataforma elevadora ha llegado a la cinta C.

Los autores, 2001; Edicions UPC, 2001.

132
D4

Microcontroladores MCS-51 y MCS-251

Cinta B

CAJA Cinta A
D1 D2 D3

P1.4

8XC251

P1.1 P1.2 P1.3 P1.5 P3.0 P3.1


M1 M0

D5

Cinta C

Motor

Fig. 5.25 Diagrama del sistema de control


CAJA
Cinta B
Cinta B

Cinta A D1=0

Cinta A D1=1

CAJA
Cinta C

Cinta C

Motor Fig. 5.26 Elevacin de la caja a la cinta B, D1 igual a 0 lgico

Motor

Fig. 5.27 Descenso de la caja a la cinta C, D1 igual a 1 lgico

Por otra parte, el sistema dispone de un motor que permite ascender o descender la plataforma elevadora. El motor est controlado mediante dos seales binarias, M1 y M0, que funcionan tal y como se indica en la tabla 5.3.
Tabla 5.3 Condiciones de funcionamiento del motor.

M1 M0
0 0 1 1 0 1 0 1

Funcionamiento del motor


El motor est parado. El motor gira a la derecha y la plataforma sube. El motor gira a la izquierda y la plataforma baja. El motor est parado.

El programa que controla el funcionamiento de la plataforma elevadora debe cumplir las siguientes indicaciones: cuando llegue un producto a la plataforma elevadora (D3 igual a 1 lgico) la plataforma deber subir hasta la cinta B o bajar hasta la cinta C, dependiendo del valor que adquiera el detector D1. Una vez que la plataforma ha llegado a la cinta B o C, debe volver a la posicin original, junto a la cinta A, para esperar a que llegue un nuevo producto; entonces se vuelve a repetir el proceso. Inicialmente la plataforma elevadora se encuentra a la altura de la cinta A.

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

133

En una primera parte del programa se deben inicializar los puertos con el valor lgico adecuado. Los pines de los puertos que actan como entradas de datos, han de estar inicializados a 1 lgico y los pines que trabajan como salida han de inicializarse por defecto con el nivel inactivo. En la figura 5.28 se presenta el diagrama de flujo del programa de control de la plataforma elevadora y a continuacin se detalla el listado.
INICIO SE INHIBEN LAS SALIDAS SE INICIALIZAN LAS ENTRADAS A 1 LOGICO

PRODUCTO NO EN LA PLATAFORMA?

SI SI D1 = 1?

LA PLATAFORMA BAJA

NO LA PLATAFORMA SUBE

PLATAFORMA EN CINTA C? SI SI

NO

PLATAFORMA EN CINTA B? SI SI LA PLATAFORMA BAJA

NO

LA PLATAFORMA SUBE

PLATAFORMA EN CINTA A? SI EL MOTOR SE PARA

NO

PLATAFORMA EN CINTA A? SI EL MOTOR SE PARA

NO

Fig. 5.28 Diagrama de flujo del programa de control de la plataforma elevadora


;*********************************************************************************** ; Control de la plataforma elevadora ;*********************************************************************************** ORG FF:0000H ; El programa comienza a partir de la direccin FF:0000H de memoria ; Inicializacin de las entradas y salidas CLR P3.0 ; Los pines de salida se inicializan a cero lgico que es el CLR P3.1 ; nivel inactivo en este caso SETB P1.1 ; Los pines correspondientes a los puertos de entrada, como SETB P1.2 ; son los que estn conectados a los sensores, se inicializan SETB P1.3 ; con un uno lgico, para evitar que no se dae el transistor de SETB P1.4 ; salida SETB P1.5 ; ; Programa de control SAL1: JNB P1.3,SAL1 ; Se espera a que llegue un producto a la plataforma JB P1.1,SAL2 ; Si D1=1 la plataforma baja, en caso contrario sube SETB P3.0 ; La plataforma sube CLR P3.1 ;

Los autores, 2001; Edicions UPC, 2001.

134
SAL3: JNB P1.4,SAL3 CLR P3.0 SETB P3.1 SAL4: JNB P1.2,SAL4 CLR P3.1 SAL2: CLR P3.0 SETB P3.1 SAL5: JNB P1.5,SAL5 CLR P3.1 SETB P3.0 SAL6: JNB P1.1,SAL6 CLR P3.0 JMP SAL1

Microcontroladores MCS-51 y MCS-251 ; Se espera a que la plataforma llegue arriba ; La plataforma baja ; ; Se espera a que la plataforma llegue a la cinta A ; Paramos el motor ; La plataforma baja ; ; Se espera a que la plataforma baje hasta la altura de la cinta C ; La plataforma sube ; ; Se espera a que la plataforma llegue a la cinta A ; Se para el motor ; Vuelta al inicio

5.10.10 Control de la temperatura de un horno de coccin Se plantea, en este caso, una aplicacin donde se controla la temperatura de un horno de coccin, mediante un microcontrolador 8XC251Sx. Para poder controlar la temperatura del horno de coccin, el microcontrolador debe recibir la informacin del estado del sistema que le llega a travs de los puertos, procesar esa informacin mediante el algoritmo de control correspondiente y actuar sobre el sistema, tambin a travs de los puertos, para que el comportamiento del horno se mantenga dentro de los lmites fijados. En concreto, la accin de control a la que se somete el horno, tiene como objetivo mantener su temperatura dentro del margen comprendido entre los 275C y los 300C. El horno de coccin, cuyo esquema est representado en la figura 5.29, contiene los siguientes elementos: Un tanque de fuel-oil, que almacena el combustible que alimenta el quemador. Una bomba P, que impulsa el fuel-oil hacia el quemador B1 instalado en el horno, o bien hacia el tanque. Dos electrovlvulas V1 y V2. La electrovlvula V1 se encarga de controlar el paso del fuel-oil al quemador B1. La electrovlvula V2 se encarga de controlar el retorno del fuel-oil al tanque. Un horno de coccin, calentado por el quemador B1, que incorpora dos sensores de temperatura.
V2

Tanque Horno V1 P B1
T2 T1 Sensores de temperatura

Fig. 5.29 Esquema del horno de coccin

Para realizar el control del sistema se dispone de una serie de sensores y actuadores electromecnicos que permiten obtener informacin sobre el estado del sistema y actuar convenientemente sobre l. Todos los sensores y actuadores son activos a 1 lgico y presentan el siguiente funcionamiento:

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

135

1.

Sensores T1: Detector de temperatura del horno que se activa cuando la temperatura del horno aumenta por encima de 275C. T2: Detector de temperatura del horno que se activa cuando la temperatura del horno aumenta por encima de 300C. NL: Detector de nivel del tanque, que se activa cuando el nivel del tanque disminuye por debajo de un valor determinado.

2.

Actuadores PP: Accionador de la bomba P. Cuando se activa este actuador, la bomba P se pone en funcionamiento. XV1, XV2: Son los actuadores que abren o cierran las electrovlvulas V1 y V2, respectivamente. Cuando se activan, la vlvula correspondiente se abre y permite el paso del fuel-oil al quemador o al tanque. LR: Adems de los detectores y activadores antes descritos, el sistema dispone de un indicador rojo cuya activacin, a 1 lgico, indica que el horno se halla fuera de servicio.

La estrategia de control, que debe implementar el sistema de control del horno, se puede resumir en tres puntos: 1. Si el nivel del tanque disminuye por debajo del nivel indicado por el sensor NL, se debe parar la bomba, abrir la electrovlvula V2, cerrar V1 y sealizar que el sistema est fuera de servicio activando el indicador rojo. Si la temperatura del horno desciende por debajo de 275C, debe alimentarse el quemador con combustible abrindose la electrovlvula V1, cerrndose la electrovlvula V2, y activndose la bomba. Si la temperatura del horno supera el valor de 300C, se debe suspender la alimentacin del quemador cerrndose la electrovlvula V1, abrindose la electrovlvula V2 y activndose la bomba.

2.

3.

En la figura 5.30 est representado el esquema elctrico de la conexin del microcontrolador 8XC251Sx con los diferentes sensores y actuadores que intervienen en esta aplicacin.

8XC251Sx
P1.3 T1 T2 NL P0.0 P0.1 P0.2 P1.2 P1.1 P1.0 LR PP XV2 XV1

Fig. 5.30 Conexin de los sensores y actuadores con el microcontrolador 8XC251Sx

En la figura 5.31 est representado el diagrama de flujo de esta aplicacin. Estn reflejadas las tres opciones posibles, planteadas por la estrategia de control y la actuacin que se debe llevar a cabo en cada caso.

Los autores, 2001; Edicions UPC, 2001.

136
INICIO

Microcontroladores MCS-51 y MCS-251

NL = 1? NO

SI

Cerrar V1 Abrir V2 Parar la bomba Activar luz roja

T1 = 0? NO

SI

Abrir V1 Cerrar V2 Encender la bomba

T2 = 1? NO

SI

Cerrar V1 Abrir V2 Encender la bomba

Fig. 5.31 Organigrama del control del horno

Las primeras instrucciones del programa de control deben colocar, por motivos de seguridad, todos los pines de salida a su nivel inactivo, ya que las salidas slo se deben activar despus de procesar los datos de entrada, mediante el programa de control correspondiente. De igual modo, todos los pines de entrada debern ponerse a 1 lgico para evitar la destruccin del driver de salida correspondiente. A continuacin se detalla el listado del programa resultante.
;****************************************************************** ; Control del horno ;****************************************************************** ORG FF:0000H ; Direccin de inicio del programa MOV P1,#00H ; Se inicializan todas las salidas a su nivel inactivo SETB P0.0 ; Se inicializan todos los pines de entrada a 1 lgico SETB P0.1 ; SETB P0.2 ; INICIO: JNB P0.2,SALT1 ; Si el nivel del depsito est por debajo del valor CLR P1.2 ; permitido se para la bomba, CLR P1.0 ; se cierra la electrovlvula V1, SETB P1.1 ; se abre la electrovlvula V2, SETB P1.3 ; y se enciende la luz roja JMP INICIO ; Salto al INICIO SALT1: JB P0.0,SALT2 ; Si el sensor T1 est inactivo: SETB P1.0 ; se abre la electrovlvula V1, SETB P1.2 ; se activa la bomba, CLR P1.1 ; se cierra la electrovlvula V2, CLR P1.3 ; y se apaga la luz roja JMP INICIO ; Salto al INICIO SALT2: JNB P0.1,INICIO ; Si el sensor T2 est activo: CLR P1.0 ; Se cierra la electrovlvula V1, SETB P1.2 ; se activa la bomba, SETB P1.1 ; se abre la electrovlvula V2, CLR P1.3 ; y se apaga la luz roja JMP INICIO ; Salto al INICIO

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

137

6 Las interrupciones
6.1 Introduccin
Las interrupciones juegan un papel de suma importancia dentro de cualquier sistema basado en microprocesador o microcontrolador, pues estos deben habitualmente gestionar y controlar distintos perifricos asociados que, de forma continua, requieren la dedicacin de la CPU para llevar a buen trmino las tareas que tienen asignadas. Una interrupcin la realiza de forma asncrona un perifrico o un dispositivo conectado fsicamente al microcontrolador (figura 6.1), cuando requiere a la CPU el desvo del flujo de ejecucin del programa para gestionar y controlar los diversos sucesos que no se encuentran bajo su supervisin directa. De esta manera se mejora la eficiencia de la CPU, ya que sta no tiene que estar continuamente pendiente de si acontece o no un suceso en un instante de tiempo determinado, y puede realizar otras tareas de mayor inters, atendiendo a los sucesos tan slo cuando stos se producen. Los sucesos acontecidos pueden ser externos al sistema, como la activacin de un nivel lgico o un flanco en un terminal del microcontrolador, por parte de un perifrico, o bien internos, como el desbordamiento de un temporizador interno del microcontrolador al llegar ste a su mxima capacidad de cuenta.
Sensores y actuadores C Terminal de vdeo
1

Mdems

Teclado y visualizador

Discos magnticos

Impresora

Fig. 6.1 Diagrama de bloques del microcontrolador con distintos perifricos

Cuando se produce una interrupcin el microcontrolador ejecuta un proceso de atencin a la interrupcin (figura 6.2). En este proceso la CPU deja de ejecutar la secuencia de instrucciones en la que se encuentra y pasa a ejecutar la rutina de servicio a la interrupcin (RSI), que se encarga de efectuar la gestin del perifrico. Una vez terminada esta rutina, la CPU regresa a la secuencia donde se produjo la interrupcin, y sigue con el rumbo que tena. En el proceso de atencin a la interrupcin

Un perifrico es un dispositivo conectado al microcontrolador con una funcin especfica. Un perifrico puede ser una impresora, un mdem, un teclado alfanumrico, un terminal de vdeo, un sensor, un actuador, etc.

Los autores, 2001; Edicions UPC, 2001.

138

Microcontroladores MCS-51 y MCS-251

se realizan los siguientes pasos: 1. Termina de ejecutar la instruccin en curso. 2. Salva el valor del contador de programa, PC, en la pila, de manera que la CPU, al terminar el proceso, pueda seguir ejecutando el programa a partir de la instruccin siguiente a la ltima ejecutada. 3. La CPU salta a la direccin donde est almacenada la rutina de servicio de interrupcin (RSI) y ejecuta esta rutina, que tiene como finalidad atender al perifrico o dispositivo que ha generado la interrupcin. 4. La rutina RSI debe terminar con una instruccin de retorno de interrupcin, RETI. La CPU al ejecutar esta instruccin lee la direccin almacenada en la pila y la asigna al contador de programa, de manera que la CPU reanuda la ejecucin del programa a partir de la instruccin siguiente a la instruccin donde se produjo la interrupcin.
Programa principal RSI

Interrupcin

- Terminar instruccin en curso - Salvar el PC en la pila - Saltar a RSI

- Recuperar PC de pila Programa principal - Saltar a direcci n del PC

RETI

Fig. 6.2 Proceso de atencin a una interrupcin

A la direccin de salto a partir de la cual se almacena la rutina de RSI se la denomina vector de interrupcin. Segn el tipo de microcontrolador o microprocesador, las direcciones del vector de interrupcin pueden ser fijas, es decir, especificadas por el fabricante, o bien pueden ser definidas por el programador. Los vectores de interrupcin de las familias MCS-51 y MCS-251 son fijos y su valor viene predeterminado por el fabricante. Otro factor importante que se debe considerar en el proceso de interrupciones consiste en la habilitacin de mscaras y en el establecimiento de prioridades. Una mscara no es ms que un indicador de tipo bit que gobierna el estado de una puerta de transmisin conectada entre la entrada en interrupcin y la CPU. Al bit que realiza la funcin de mscara se le denomina bit de habilitacin
3

Se debe considerar que el microcontrolador puede tener varias fuentes de interrupcin, por lo que a cada fuente de interrupcin le corresponde una rutina especifica de RSI.
3

Una puerta de transmisin se realiza con puertas lgicas o bien con transistores bipolares o MOS. Tiene una entrada, una salida y una lnea de control. La activacin de la lnea de control deja pasar el estado lgico presente en su entrada a su salida; su desactivacin hace que la puerta est desconectada para evitar que el estado lgico de la entrada pase a la salida.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

139

de interrupcin. La activacin de un bit de habilitacin de interrupcin permite que la interrupcin pase de la lnea de entrada hacia la CPU, mientras que la desactivacin de este bit hace que la interrupcin no pueda pasar hacia la CPU, e inhiba la interrupcin; es decir, la interrupcin no es atendida a menos que su bit de habilitacin correspondiente est activado. Los bits de habilitacin de interrupciones permiten, pues, que el programador pueda activar o desactivar ciertas interrupciones, en las circunstancias que sean de su consideracin. Generalmente todas las entradas de interrupcin suelen tener un bit de habilitacin de interrupcin asociado; no obstante, puede haber alguna entrada de interrupcin que adolezca de este bit, lo que se denomina interrupcin no mascarable, en cuyo caso el programador no tiene control sobre la interrupcin y la CPU est obligada siempre a atenderla. Las interrupciones no mascarables se reservan para aquellos perifricos o sucesos de suma importancia, como, por ejemplo, la cada de tensin de la red elctrica, en que la CPU dispone de los pocos milisegundos en los que los condensadores de la fuente de alimentacin son capaces de sostener la tensin de alimentacin para salvar los registros que se consideren imprescindibles en una memoria estable, como una memoria E2PROM o una memoria RAM con una batera externa. El establecimiento de prioridades dentro del proceso de interrupcin se considera cuando existe la posibilidad de que varias interrupciones se produzcan de manera simultnea, por lo que es necesario estipular un orden de atencin a las interrupciones producidas. Para ello, las entradas de interrupcin suelen tener uno o varios bits asociados con los que el programador puede establecer un orden de prioridad en la atencin de las interrupciones.

6.2 Las interrupciones en la familia MCS-51


La familia MCS-51 puede llegar a tener hasta siete fuentes de interrupcin distintas (figura 6.3), todas ellas con un bit de habilitacin de interrupcin situado en el registro IE, Interrupt Enable -direccin A8H del SFR-, de forma que el programador puede habilitarlas o deshabilitarlas cuando sea necesario. Respecto a las prioridades, todos los componentes de la familia tienen dos niveles de prioridad que se determinan con un nico bit, para cada entrada de interrupcin, situado en el registro IP, Interrupt Priority -direccin B8H del SFR-, con excepcin de las versiones 8XC51Fx y 8XX52/54/58, que tienen hasta cuatro niveles de prioridad; incorporan, para ello, un segundo registro de prioridad denominado IPH, Interrupt Priority High -direccin B7H del SFR-. En este ltimo caso, el nivel de prioridad de una entrada de interrupcin se determina mediante sus bits correspondientes de los registros IP y IPH. Tres de las seis fuentes de interrupcin son externas al microcontrolador: /INT0, /INT1 y el puerto serie, RI y TI; las fuentes de interrupcin restantes son internas y corresponden a los tres temporizadores, Timer 0, Timer 1 y Timer 2, y al array de contadores programable PCA de la familia MCS-51. La interrupcin de los temporizadores se produce por un desbordamiento en su valor mximo; entonces se activan los bits de desbordamiento correspondientes: TF0, TF1 o TF2. La interrupcin de la PCA se genera mediante cualquiera de los bits EF, CCF0, CCF1, CCF2, CCF3, CCF4 y CCF5 del registro CCON, PCA Counter Control Register; cada uno de estos bits de

Los autores, 2001; Edicions UPC, 2001.

140

Microcontroladores MCS-51 y MCS-251

interrupcin tiene asociado un bit de habilitacin de interrupcin, bits ECF y ECCFn de los registros CMOD, PCA Counter Mode Register y CCAPMn, PCA Compare/Capture Modules. El Timer 2 tiene un bit adicional de interrupcin, EXF2, que realiza una peticin de interrupcin si se detecta un flanco de bajada en el terminal T2 del microcontrolador. Tal y como muestra la figura 6.3, las interrupciones externas /INT0 y /INT1 se pueden activar tanto por nivel lgico (cero lgico), como por flanco descendente, mediante la programacin de los bits IT0 y IT1 del registro TCON, Timer Control (tabla 6.2), respectivamente. Poner uno de estos bits a cero lgico hace que la interrupcin se active por nivel lgico, mientras que a uno lgico se activa por flanco descendente.
Registro IE 0 INT0 IT0 1 IE0 EX0

ET0 TF0

0 INT1 IT1 1 IE1

EX1

ET1 TF1 0 CF 1 ECF () EC

0 CCFn 1 RI TI TF2 EXF2 (*) ET2 ECCFn


5

ES

EA Inhibici n global
* En las versiones con 3 temporizadores En las versiones con PCA

Fig. 6.3 Fuentes de interrupcin de la familia MCS-51

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

141

Al producirse una interrupcin en una de las entradas externas de interrupcin, /INT0 o /INT1, ya sea por nivel lgico o por flanco descendente, el bit correspondiente, IE0 o IE1 del registro TCON, se activa a uno lgico, indicando de esta manera que se ha realizado una peticin de interrupcin, y la CPU pone en marcha el proceso de atencin a la interrupcin, siempre y cuando la interrupcin est habilitada de antemano. En este proceso, los bits IE0 e IE1 se ponen a cero lgico de forma automtica cuando la interrupcin se ha activado por flanco descendente. Sin embargo, si la interrupcin se ha activado por nivel lgico, los bits IE0 y IE1 se deben borrar por software dentro de la rutina de RSI. El estado de las interrupciones externas /INT0 e /INT1 se comprueba una vez cada ciclo mquina, de forma que la entrada de interrupcin, para el caso de que est activada por flanco descendente, se debe sostener a nivel lgico alto al menos un ciclo mquina, y sostener a nivel lgico bajo al menos otro ciclo mquina ms, para que el flanco descendente sea detectado y se active el bit IE0 o IE1, correspondiente. En el caso de que la interrupcin est activada por nivel lgico, la entrada de interrupcin se debe sostener a nivel lgico bajo al menos durante 1 ciclo mquina, para que la interrupcin sea detectada por la CPU. En las interrupciones internas producidas por los temporizadores Timer 0 o Timer 1, se activan los bits TF0 o TF1, segn corresponda, del registro TCON a uno lgico, al realizar la peticin de interrupcin. Estos bits se mantienen en este estado hasta que la CPU atiende la peticin, momento en el cual los pone a cero lgico de forma automtica. El temporizador Timer 2 puede producir una interrupcin a travs de la activacin a uno lgico de los bits TF2 o EXF2. Estos bits no se ponen a cero lgico de manera automtica, sino que los debe poner el programador por software. Las interrupciones producidas por el puerto serie activan a uno lgico los bits TI o RI del registro SCON, cuando el microcontrolador transmite un dato o cuando recibe un dato, respectivamente. Estos bits los debe poner a cero lgico el programador mediante software. La tabla 6.1 muestra los bits de peticin de interrupcin asociados a cada una de las fuentes de interrupcin.
Tabla 6.1 Fuentes de interrupcin, bits activados y tabla de vectores de salto para la MCS-51 Fuente de interrupcin /INT0 Timer 0 /INT1 Timer 1 Puerto serie Timer 2 PCA Bit que activa IE0 TF0 IE1 TF1 RI, TI TF2, EXF2 CF, CCFn Borrado por hardware No, por nivel. Si, por flanco. Si. No, por nivel. Si, por flanco. Si. No. No. No. n=0, 1, 2, 3, 4. Registro TCON TCON TCON TCON SCON T2CON CCON Vector de salto 0003H 000BH 0013H 001BH 0023H 002BH 0033H

Los autores, 2001; Edicions UPC, 2001.

142 Tabla 6.2 Registro TCON para la familia MCS-51


(MSB) TF1 TR1 TF0 Registro TCON TR0 IE1 IT1 IE0

Microcontroladores MCS-51 y MCS-251

(LSB) IT0

Bit
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

Comentario
Bit de rebasamiento del Timer 1. Se pone a 1 por hardware en el rebasamiento. La CPU lo pone a 0 cuando procesa la interrupcin y salta a la rutina de RSI. Bit de marcha/paro del Timer 1. Se pone a 1 0 por software para poner en marcha o parar el Timer 1 Bit de rebasamiento del Timer 0. Se pone a 1 por hardware en el rebasamiento. La CPU lo pone a 0 cuando procesa la interrupcin y salta a la rutina de RSI. Bit de marcha/paro del Timer 1. Se pone a 1 0 por software para poner en marcha o parar el Timer 1 Bit de interrupcin del terminal /INT1. Se pone a 1 en una peticin de interrupcin, se pone a 0 por hardware si /INT1 est activada por flanco descendente. Bit de seleccin de interrupcin por nivel o por flanco descendente de /INT1. A 0 la interrupcin se activa por nivel, a 1 se activa por flanco descendente. Bit de interrupcin del terminal /INT0. Se pone a 1 en una peticin de interrupcin, se pone a 0 por hardware si /INT0 est activada por flanco descendente. Bit de seleccin de interrupcin por nivel o por flanco descendente de /INT0. A 0 la interrupcin se activa por nivel, a 1 se activa por flanco descendente.

6.2.1 Vectorizacin de interrupciones en la MCS-51 Cuando se produce una interrupcin la CPU desva el flujo de ejecucin de instrucciones hacia las rutinas de atencin de interrupciones, RSI, definidas por el programador. En la MCS-51 las direcciones de salto hacia las rutinas de RSI son fijas y estn predefinidas por el fabricante en lo que se denomina tabla de vectores de salto (tabla 6.1). En esta tabla, se observa cmo la interrupcin /INT0 provoca un salto a la direccin 03H de la memoria de programas, la TIMER0 a la 0BH, la /INT1 a la 013H, etc. A partir de estas direcciones debe situarse la rutina de RSI que corresponda. En la tabla 6.1 tambin se observa que el espacio existente entre los vectores de interrupcin es de tan slo 8 bytes. Este espacio suele ser insuficiente para albergar una rutina de RSI, por lo que, en estas posiciones, se suele insertar una instruccin de salto, LJMP, AJMP o SJMP, hacia la rutina de RSI que atienda a la interrupcin; as, se puede situar esta rutina en cualquier zona del espacio de memoria disponible por el microcontrolador. El retorno de una rutina de RSI se debe realizar con la instruccin RETI, para que la CPU diferencie este retorno, del retorno de subrutina (instruccin RET).
;************************************************************** ;Vectorizacin de interrupciones ;************************************************************** ORG 03H ;Posiciona la instruccin siguiente en 03H LJMP RSI_INT0 ;Salto a la rutina de RSI ORG 0BH ;Posiciona instruccin siguiente en 0BH LJMP RSI_TIMER0 ;Salto a la rutina de RSI ORG 013H ;Posiciona instruccin siguiente en 013H LJMP RSI_INT1 ;Salto a la rutina de RSI RSI_INT0: MOV ..... ;Rutina de RSI para /INT0 : RETI RSI_TIMER0: MOV ..... ;Rutina de RSI para TIMER0 : RETI

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones RSI_INT1: MOV ..... : RETI ;Rutina de RSI para INT1

143

La estructura del programa cuando se utilizan interrupciones estar formada por una rutina de vectorizacin, como la mostrada en este apartado. El registro PC se inicializa a 0000H tras un reset o la puesta en marcha del microcontrolador, por lo que la primera instruccin que se ejecuta es la contenida en la direccin 0000H. La estructura de un programa, tambin, en general contempla una rutina Inicio, donde se determinan los valores de las variables que se van a utilizar y el modo de operar del microcontrolador, y una rutina Principal, donde se llevan a cabo la mayor parte de las tareas que debe gestionar la CPU, aunque, parte de estas tareas puedan solventarse mediante interrupciones. En conclusin, la rutina de vectorizacin anterior debe, adems, incluir en la direccin 0000H una instruccin de salto hacia la rutina Inicio, tal y como se muestra en la rutina siguiente:
;**************************************************** ;Vectorizacin de interrupciones ;**************************************************** ORG 0H LJMP Inicio ;Salto a la rutina Inicio ORG 03H LJMP RSI_INT0 ORG 0BH LJMP RSI_TIMER0 ORG 013H LJMP RSI_INT1

6.2.2 Habilitacin de interrupciones y establecimiento de prioridades en la MCS-51 Cada una de las fuentes de interrupcin de la MCS-51 dispone de un bit de habilitacin/deshabilitacin en el registro IE, Interrupt Enable, del rea de SFR (tabla 6.3). En el registro IE el bit de mayor peso, IE.7 o tambin EA, es el bit de inhibicin global y afecta de forma directa a todos los bits de habilitacin de interrupciones establecidos dentro del mismo registro IE. Poniendo el bit EA a cero lgico se inhabilitan todas las interrupciones del microcontrolador, aunque existan bits de habilitacin de interrupcin activados; por contra, poniendo el bit EA a uno lgico, se habilitan slo las interrupciones que tienen su bit de habilitacin activado. La mayor parte de los componentes de la MCS-51 tienen dos niveles de prioridad, con excepcin de las versiones 8XC51Fx y 8XC52/54/58, que tienen hasta cuatro niveles de prioridad. El nivel de prioridad se determina con el registro de prioridades IP, Interrupt Priority, del rea de SFR (tabla 6.4). Poniendo un bit de este registro a uno lgico se fija la prioridad a nivel alto y a cero lgico se fija a nivel bajo. Para el caso de que dos o ms interrupciones tengan el mismo nivel de prioridad y se produzca una peticin simultnea de interrupcin, el fabricante asigna un nivel de prioridad por defecto a cada una de las fuentes de interrupcin del microcontrolador (tabla 6.5), de forma que en una peticin simultnea de interrupcin, la CPU atienda primero a la interrupcin con mayor prioridad segn la tabla 6.5.

Los autores, 2001; Edicions UPC, 2001.

144 Tabla 6.3 Registro IE de habilitacin de interrupciones para la MCS-51


(MSB) EA EC Registro IE ET2* ES ET1 EX1 ET0

Microcontroladores MCS-51 y MCS-251

(LSB) EX0

BIT EX0 ET0 EX1 ET1 ES ET2* EC EA

COMENTARIO EX0 = 1 habilita la interrupcin en INT0. EX0 = 0 la inhabilita ET0 = 1 habilita la interrupcin del Timer 0. ET0 = 0 la inhabilita. EX1 = 1 habilita la interrupcin en INT1. EX1 = 0 la inhabilita. ET1 = 1 habilita la interrupcin del Timer 1. ET1 = 0 la inhabilita. ES = 1 habilita la interrupcin del puerto serie. ES = 0 la inhabilita. ET2 = 1 habilita la interrupcin del Timer 2. ET2 = 0 la inhabilita. EC =1 habilita la interrupcin de la PCA. EC = 0 la inhabilita. EA = 1 permite todas las habilitaciones o inhabilitaciones anteriores. EA = 0 no reconoce ninguna interrupcin.
* En las versiones con 3 temporizadores En las versiones con PCA

Tabla 6.4 Registro de prioridades IP


(MSB) Registro IP PPC PT2* PS PT1 PX1 PT0 (LSB) PX0

BIT PX0 PT0 PX1 PT1 PS PT2* PPC -

COMENTARIO Bit de prioridad de /INT0. Bit de prioridad del Timer 0. Bit de prioridad de /INT1. Bit de prioridad del Timer 1 Bit de prioridad del puerto serie. Bit de prioridad del Timer 2. Bit de prioridad de la PCA. Bit reservado.
* En las versiones con 3 temporizadores En las versiones con PCA

Tabla 6.5 Nivel de prioridad asignado por defecto en la MCS-51 Prioridad (ms alta).......1 2 3 4 5 6 (ms baja).......7 Fuente /INT0 Timer 0 /INT1 Timer 1 PCA Puerto Serie Timer 2*
* En las versiones con 3 temporizadores En las versiones con PCA

Las versiones 8XC51Fx y 8XC52/54/58 tienen cuatro niveles de prioridad que se determinan por medio de los registros IP y IPH (tabla 6.6). En la tabla 6.7 se indica el nivel de prioridad segn el estado de los bits correspondientes a cada una de las fuentes de interrupcin.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

145

Tabla 6.6 Registro de prioridades IPH para las versiones 8XX52/54/58 y 8XC51Fx de la MCS-51
(MSB)
PPCH PT2H*

Registro IPH PSH

(LSB)

PT1H PX1H PT0H PX0H

BIT PX0H PT0H PX1H PT1H PSH PT2H PPCH -

COMENTARIO Bit alto de prioridad de /INT0. Bit alto de prioridad del Timer 0. Bit alto de prioridad de /INT1. Bit alto de prioridad del Timer 1. Bit alto de prioridad del puerto serie. Bit alto de prioridad del Timer 2. Bit alto de prioridad de la PCA. Bit reservado.

Slo en las versiones 8XC51Fx.

Tabla 6.7 Niveles de prioridad para las versiones 8XX52/54/58 y 8XC51Fx de la MCS-51 Bits de prioridad IPH.x IP.x 0 0 0 1 1 0 1 1 Nivel de prioridad Nivel 0 Nivel 1 Nivel 2 Nivel 3 (Menor)

(Mayor)

6.2.3 Tiempos de respuesta del proceso de interrupcin Las fuentes de interrupcin en la MCS-51 se comprueban en la fase 2 del estado 5 de cada ciclo mquina, denominado S5P2 (figura 6.4), y se evala su estado en el siguiente ciclo mquina del microcontrolador. En consecuencia, si la CPU encuentra que una de las fuentes est activa, entonces genera un salto automtico hacia la rutina de RSI correspondiente. Aunque, este salto puede ser abortado por cualquiera de las condiciones siguientes: 1. 2. Se halla en proceso una interrupcin de mayor o igual prioridad. El ciclo mquina en el que se ha producido la interrupcin no es el ltimo de la instruccin en curso de ejecucin por parte de la CPU, por lo que debe esperar a que se termine de ejecutar la instruccin. La instruccin actual en curso es una instruccin RETI o cualquier otra que escriba en los registros IE o IP.

3.

La lectura de las peticiones de interrupcin realizadas por el microcontrolador carece de memoria, por lo que si una peticin de interrupcin resulta abortada por una de las condiciones anteriores, en un ciclo mquina determinado, y esta peticin no se sostiene por parte del perifrico de manera que vuelva a detectarse en el ciclo maquina siguiente, entonces la interrupcin no es atendida; es decir, en caso de rechazo de la interrupcin, sta debe ser sostenida por el perifrico el tiempo necesario hasta que la CPU la atienda. La CPU reconoce la peticin de una interrupcin cuando vectoriza la interrupcin, es decir, cuando salta a la rutina de RSI correspondiente. Segn el tipo de interrupcin, la CPU, adems, borra el bit

Los autores, 2001; Edicions UPC, 2001.

146

Microcontroladores MCS-51 y MCS-251

activado en la peticin de interrupcin (tabla 6.1), como es el caso de los bits TF0 y TF1, o de los bits IE0 e IE1, slo cuando la interrupcin ha sido activada por flanco descendente. En otros casos el bit activado por la interrupcin se debe borrar por software.
Ciclo C1 Ciclo C2 Ciclo C3 Ciclo C4 Ciclo C5

S5P2

S6

Comprobaci n de interrupciones

Consulta de interrupciones activas

Salto a la rutina de RSI

Rutina de RSI

Fig. 6.4 Diagrama de tiempos del salto a la rutina de RSI en el proceso de interrupciones

La CPU guarda en la memoria interna de la pila el contenido del registro PC (dos bytes) y, luego, salta a la rutina RSI correspondiente. La CPU ejecuta la rutina de RSI hasta que encuentra una instruccin RETI, que le indica que se ha llegado al final del proceso de interrupcin; recupera entonces los dos bytes almacenados en la pila y los asigna al registro PC, por lo que la ejecucin del programa regresa al punto de partida donde se inici la interrupcin. El tiempo transcurrido (figura 6.4), desde que se produce la interrupcin (S5P2 del ciclo C1), hasta que la CPU comienza a ejecutar la rutina de RSI (ciclo C5), es de como mnimo tres ciclos mquina. El tiempo de respuesta es mayor si el salto resulta abortado por una de las condiciones mencionadas. En el primer caso, si una interrupcin de mayor o igual prioridad est en proceso, el tiempo de espera depender de la rutina de RSI en ejecucin. En el segundo caso, cuando la CPU debe esperar a que se finalice la ejecucin de la instruccin actual, el tiempo de espera, en el peor caso , no puede ser superior a tres ciclos mquina. En el tercer caso, si una instruccin RETI, o la escritura del registro IE o IP, est en progreso, el tiempo adicional de espera no puede ser superior a cinco ciclos mquina. En definitiva, el tiempo de respuesta de una interrupcin estar comprendido entre tres y nueve ciclos mquina. Ejemplo 6.1 Conexin de teclas al microcontrolador Se conectan cuatro teclas al puerto P1 de un microcontrolador 80C31 (figura 6.5). Las entradas del puerto P1 tienen una resistencia interna de pull-up (figura 3.4), por lo que un terminal del puerto, por ejemplo P1.0, estar en el estado 1 lgico (Vcc) cuando no se pulsa la tecla T1, y a 0 lgico (masa) cuando se pulsa T1. Luego, la deteccin de si una tecla ha sido pulsada o no, consiste en leer el estado lgico del puerto P1, y ver si hay algn cero en una de sus patillas. En la figura 6.5 cada una de las teclas est conectada a una puerta AND, de manera que la pulsacin de cualquiera de las cuatro teclas causar un 0 lgico en la entrada de interrupcin /INT0, y provocar una interrupcin en el caso de que est habilitada.
4

El peor caso corresponde a las instrucciones MUL y DIV que tardan en ejecutarse cuatro ciclos mquina.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

147
T1 T2 T3 T4

P1.0 P1.1 P1.2 P1.3

80C31
/INT0

Fig. 6.5 Conexin de cuatro teclas a un microcontrolador en el ejemplo 6.1

En este ejemplo se debe habilitar la interrupcin /INT0 y crear una rutina RSI capaz de detectar la tecla que ha sido pulsada. Para ello, se utilizar el registro B como registro indicador de la pulsacin de una tecla, y se le asignar el valor 00H cuando no se haya pulsado ninguna tecla, y los valores 01H, 02H, 03H y 04H, cuando se pulsen las teclas T1, T2, T3 y T4, respectivamente. La interrupcin /INT0, en este ejemplo, se establecer por nivel lgico (bit IT0 del registro TCON a 0 lgico). Se debe tener en cuenta que todos los bits accesibles de los registros TCON, IE y IP quedan a 0 lgico tras un reset del microcontrolador.
;********************************************************************** ; Rutina de vectorizacin (ejemplo 6.1) ;********************************************************************** ORG 0H LJMP Inicio ORG 03H LJMP RSI_INT0 ;********************************************************************** ; Rutina de Inicio. (Se habilita las interrupciones y /INT0 por flanco descendente) ;********************************************************************** Inicio: SETB PX0 ;Prioridad alta para la interrupcin /INT0 (Registro IP) SETB EX0 ;Activa el bit de habilitacin de /INT0 (Registro IE) SETB EA ;Activa el bit de habilitacin general (Registro IE) LJMP Principal ;********************************************************************** ; Programa Principal ;********************************************************************** ORG 0300H Principal: SJMP Principal ;Bucle infinito sin propsito definido ;********************************************************************** ; Rutina de RSI de /INT0 ;********************************************************************** RSI_INT0: JNB P1.0, Tecla_1 ;Es la tecla T1? JNB P1.1, Tecla_2 ;Es la tecla T2? JNB P1.2, Tecla_3 ;Es la tecla T3? SJMP Tecla_4 ;Si no es ninguna de las anteriores, es la tecla T4 Tecla_1: MOV B, #01H ;Pone 01H en el registro B SJMP Salir ;Ir a Salir Tecla_2: MOV B, #02H ;Pone 02H en el registro B SJMP Salir ;Ir a Salir Tecla_3: MOV B, #03H ;Pone 03H en el registro B SJMP Salir ;Ir a Salir Tecla_4: MOV B, #04H ;Pone 04H en el registro B Salir: CLR IE0 ;Se pone a cero para que /INT0 pueda interrumpir de nuevo. RETI ;Final de interrupcin

Los autores, 2001; Edicions UPC, 2001.

148

Microcontroladores MCS-51 y MCS-251

La ejecucin de las instrucciones del programa empieza por la direccin 0H, pues, en la puesta en marcha del microcontrolador, se ejecuta un reset interno que sita el registro PC a 00H. La primera instruccin, entonces, es una instruccin de salto a la rutina Inicio, donde se configura la forma de operar de la interrupcin /INT0, mediante los registros TCON, IE y IP. De esta rutina, la CPU pasa a ejecutar la rutina Principal, que slo consiste en un bucle infinito, sin ningn objetivo especfico. Esto es as, por el funcionamiento casi exclusivo del programa mediante interrupciones, de manera que la CPU est siempre ejecutando instrucciones de la rutina Principal, a la espera de que las interrupciones se produzcan, lo que causa el salto automtico hacia las rutinas de RSI. En el momento que se pulsa una tecla, se provoca la interrupcin /INT0 y se ejecuta la rutina RSI_INT0. Esta rutina comprueba de forma secuencial, mediante la instruccin JNB, cul ha sido la tecla pulsada, colocando en el registro B el valor adecuado, segn los objetivos marcados en este ejemplo. Al final de la rutina, el bit IE0, debido a que la interrupcin /INT0 se ha habilitado por nivel lgico, se borrar por software para que se produzca una nueva interrupcin en /INT0. La lectura de las teclas, en el programa realizado, se hace de manera secuencial, por lo que el programa es incapaz de detectar una pulsacin simultnea de varias teclas, y da por vlida la tecla que lee primero; es decir, en el caso de pulsarse las teclas conectadas T1 y T2, en el registro B se colocara el cdigo correspondiente a la tecla T1. Este problema se solventa en el siguiente ejemplo que consiste en una modificacin del actual.

Ejemplo 6.2 Conexin de teclas y de un dgito de siete segmentos Este ejemplo se basa en el anterior, con las siguientes modificaciones: Se incorporan un dgito de siete segmentos conectado al puerto P2 y una tecla adicional, T5, conectada a la entrada de interrupcin /INT1 (figura 6.6). El microcontrolador empleado es el 87C51 y utiliza exclusivamente su memoria de programa interna. El programa debe ser capaz de detectar la pulsacin de varias teclas al mismo tiempo, e indica esta situacin a travs del encendido de todos los leds del dgito conectado. La pulsacin de una tecla, T1, T2, T3 o T4, se indicar poniendo el nmero 1, 2, 3 o 4, en el dgito, respectivamente. En el dgito siempre se mostrar la ltima tecla pulsada. La pulsacin de T5 apagar todos los leds del dgito T5.

En la figura 6.6 se emplea el circuito integrado 7405 que contiene hasta 6 puertas inversoras en colector abierto. La puerta inversora est formada por un nico transistor, del cual se dispone de su colector, tal y como se ve en el detalle de la figura. La puerta inversora puede soportar una corriente mxima de 25mA, valor ms que suficiente para encender de manera adecuada el diodo LED que tiene asociado.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

149

87C51
T1 T2 T3 T4 P1.0 P1.1 P1.2 P1.3 P2.7 P2.0 P2.1

74LS05/06
a b

nodo comn a f g e c d DP b

Vcc

DP

/INT0 T5

/INT1

Fig. 6.6 Circuito del ejemplo 6.2

La resistencia R se debe calcular de forma que, considerando el valor de Vcc, de la tensin umbral del diodo LED, VTH, y la tensin colector-emisor del transistor en saturacin, VCE, la corriente est limitada a unos 20mA. Su valor se puede determinar a partir de la siguiente ecuacin: R] VCC [ VTH [ VCE i

La interrupcin /INT1 se habilita por flanco descendente, mientras que la interrupcin /INT0 se habilita por nivel lgico, de manera que en la rutina RSI de /INT0 se debe borrar el bit IE0. Sin embargo, en la rutina RSI de /INT1 el bit IE1 se borra de forma automtica.
;************************************************************************ ;Rutina de vectorizacin (ejemplo 6.2) ;************************************************************************ ORG 0H LJMP Inicio ORG 03H LJMP RSI_INT0 ORG 013H LJMP RSI_INT1 ;************************************************************************ ; Rutina de Inicio ; Se habilita las interrupciones y /INT0 por flanco descendente ;************************************************************************ Inicio: SETB IT1 ;Interrupcin /INT1 activa por flanco descendente SETB PX1 ;Prioridad alta para /INT1 SETB EX0 ;Activa el bit de habilitacin de /INT0 SETB EX1 ;Activa el bit de habilitacin /INT1 SETB EA ;Activa el bit de habilitacin general ;************************************************************************ ; Programa Principal ;************************************************************************ Principal: MOV A, B ;Lee el registro B CALL Siete_seg ;Codifica en 7 segmentos para mostrar en dgito MOV P2, A ;Carga en dgito SJMP Principal ;Bucle infinito a Principal

Los autores, 2001; Edicions UPC, 2001.

150
Siete_seg:

Microcontroladores MCS-51 y MCS-251 INC A MOVC A, @A+PC RET DB 0000 0000b ;Todos los leds apagados DB 0000 0110b ;leds b y c encendidos, caracter 1, tecla T1 DB 0101 1011b ;leds a, b, d, e y g encendidos, caracter 2, tecla T2 DB 0100 1111b ;leds a, b, c, d y g encendidos, caracter 3, tecla T3 DB 0110 0110b ;leds b, c, f y g encendidos, caracter 4, tecla T4 DB 1111 1111b ;Todos los leds encendidos, varias teclas pulsadas ;************************************************************************ ; Rutina de RSI de /INT0 ;************************************************************************ RSI_INT0: MOV A,P1 ;Lee el puerto P1 ORL A,#F0H ;Mscara, fuerza los 4 bits altos de P1 a 1 lgico CJNE A, #11111110b, Dif_1 ;Es tecla T1? MOV B, #01H ;Pone 01H en el registro B SJMP Salir ;Ir a Salir Dif_1: CJNE A, #11111101b, Dif_2 MOV B, #02H ;Pone 02H en el registro B SJMP Salir ;Ir a Salir Dif_2: CJNE A, #11111011b, Dif_3 MOV B, #03H ;Pone 03H en el registro B SJMP Salir ;Ir a Salir Dif_3: CJNE A, #11110111b, Varias_tec MOV B, #04H ;Pone 04H en el registro B SJMP Salir ;Ir a Salir Varias_tec: MOV B, #05H ;Pone 05H en el registro B Salir: CLR IE0 ;Se pone a cero para que /INT0 pueda interrumpir de nuevo. RETI ;Final de interrupcin ;************************************************************************ ; Rutina de RSI de /INT1 ;************************************************************************ RSI_INT1: MOV B, #0 ;Borra el registro B RETI ;No es necesario borrar el bit IE1, ya que es por flanco

La rutina Principal de este ejemplo se encarga de leer el contenido del registro B y de poner en el dgito el carcter correspondiente segn sea el valor de B. El registro B puede valer 00H al principio, si no se ha pulsado ninguna tecla, o tras pulsar la tecla T5; puede valer 01H, 02H, 03H o 04H, al pulsar las teclas T1, T2, T3 o T4, respectivamente; y puede valer 05H en el caso de que se pulsen varias teclas al mismo tiempo. Con el valor del registro B se lee la tabla Siete_seg, que proporciona el cdigo en siete segmentos, correspondiente al carcter que se quiere mostrar en el dgito del ejemplo. De todas formas, la tabla Siete_seg se puede suprimir colocando en el registro B, directamente, el cdigo del carcter que deber mostrar en el dgito, segn sea el caso.

Ejemplo 6.3 Conexin de teclas al microcontrolador mediante el 74LS148 El 74LS148 es un circuito integrado codificador con prioridad que se puede emplear para conectar varios perifricos a una misma lnea de interrupcin, o bien, como en este caso, a la conexin de hasta 8 teclas al microcontrolador, empleando para ello el sistema de interrupciones.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

151

Segn el circuito de la figura 6.7, el codificador con prioridad codifica en binario la tecla pulsada, sacando el cdigo por las tres lneas de salida: A1, A2 y A3. Con el 74LS148, si se pulsan varias teclas a la vez, aparece a su salida el cdigo correspondiente a la entrada con mayor prioridad (la entrada 7 es la de mayor prioridad, y la entrada 0 la de menor prioridad). Cuando se pulsa una tecla la lnea de salida /GS del codificador se pone a cero lgico, de manera que puede generar una interrupcin conectndola a la entrada /INT0 del microcontrolador. La entrada /EI del 74LS148 es de habilitacin del circuito integrado. /EI se conecta directamente a masa para que el codificador est siempre habilitado. La tabla de verdad del codificador se puede ver en la tabla 6.15.
T1 T2 T3 T4 T5 T6 T7 T8

74LS148
0 1 2 3 4 5 6 7 /EI /GS A1 A2 A3

87C51
P1.0 P1.1 P1.2 T9 P1.4 P2.7 P2.0 P2.1

7405
a b

nodo comn a f g e c d DP b

Vcc

DP

/INT0

Fig. 6.7 Circuito del ejemplo 6.3

El programa que se debe realizar en este ejemplo ha de mostrar el nmero de la ltima tecla pulsada en el dgito de siete segmentos, mientras que la pulsacin de la tecla T9 debe borrar el dgito. La interrupcin /INT0 se debe activar por nivel lgico.
;************************************************************************ ;Rutina de vectorizacin (ejemplo 6.3) ;************************************************************************ ORG 0H LJMP Inicio ORG 03H LJMP RSI_INT0 ;************************************************************************ ; Rutina de Inicio (Habilitacin de interrup., /INT0 por nivel) ;************************************************************************ ORG 0200H Inicio: SETB PX0 ;Prioridad alta para /INT0 SETB EX0 ;Activa el bit de habilitacin de /INT0 SETB EA ;Activa el bit de habilitacin general LJMP Principal ;************************************************************************ ; Programa Principal ;************************************************************************ ORG 0300H Principal: JB P1.4, Rut_ok ;Salta a Rut_ok si no se pulsa T9 MOV B,#0 ;Borra B (por tanto dgito) si se pulsa T9 Rut_ok: MOV A, B ;Lee el registro B MOV P2, A ;Carga en dgito SJMP Principal ;Bucle infinito a Principal

Los autores, 2001; Edicions UPC, 2001.

152

Microcontroladores MCS-51 y MCS-251 ;************************************************************************ ; Rutina de RSI de /INT0 ;************************************************************************ ORG 0400H RSI_INT0: MOV A,P1 ;Lee el puerto P1 ANL A,#07H ;Mscara, fuerza P1 a 0, excepto P1.0, P1.1 y P1.2 CALL Tecla_in ;Ejecuta subrutina Tecla_in MOV B,A ;Guarda cdigo en B CLR A ;Borra A CLR IE0 ;Borra bit IE0, para una posterior interrupcin RETI ;Retorno de interrupcin Tecla_in: INC A MOVC A,@A+PC RET DB 0111 1111b ;leds a, b, c, d, e, f y g encendidos, caracter 8, tecla T8 DB 0000 0111b ;leds a, b y c encendidos, caracter 7, tecla T7 DB 0111 1101b ;leds a, c, d, e, f y g encendidos, caracter 6, tecla T6 DB 0110 1101b ;leds a, c, d, f, y g encendidos, caracter 5, tecla T5 DB 0110 0110b ;leds b, c, f y g encendidos, caracter 4, tecla T4 DB 0100 1111b ;leds a, b, c, d y g encendidos, caracter 3, tecla T3 DB 0101 1011b ;leds a, b, d, e y g encendidos, caracter 2, tecla T2 DB 0000 0110b ;leds b y c encendidos, caracter 1, tecla T1

La rutina de RSI de /INT0 lee directamente el valor del puerto P1, aplica una mscara al valor ledo, puesto que slo interesa el valor de las patillas P1.0, P1.1 y P1.2 del puerto, y pone el cdigo del carcter en siete segmentos, correspondiente a la tecla pulsada, en el registro B. La rutina Principal comprueba el estado de la tecla T9 con la instruccin JB P1.4, Rut_ok, y sita el valor del registro B, procedente de la rutina RSI_INT0, en el puerto P2, para su visualizacin. El registro B se pone a cero cuando se pulsa la tecla T9.

6.3 El sistema de interrupciones en la familia MCS-251


Los microcontroladores de la familia MCS-251, como otros microcontroladores y microprocesadores de propsito general, incorporan un circuito gestionador de interrupciones. Este circuito puede recibir peticiones de interrupcin de ocho fuentes: siete fuentes que pueden ser habilitadas o inhibidas mediante programa, y que por ese motivo se denominan mascarables, y la instruccin TRAP, que permanece siempre habilitada. Las interrupciones mascarables estn formadas por dos interrupciones externas (/INT0 y /INT1), tres interrupciones correspondientes a los temporizadores (Timer 0, Timer 1 y Timer 2), una interrupcin del array de contadores programables (PCA) y una interrupcin del puerto de comunicacin serie. En la figura 6.8 estn representadas las distintas fuentes de interrupcin. Las interrupciones pueden ocurrir como resultado de la actividad interna del C (por ejemplo el rebasamiento de un Timer) o por la activacin de seales elctricas externas al C, como, por ejemplo, la recepcin de un dato por el puerto de comunicacin serie. Las interrupciones pueden ser habilitadas o inhibidas individualmente, excepto la instruccin TRAP, y pueden programarse en uno de cuatro niveles de prioridad. Cada fuente de interrupcin (excepto la instruccin TRAP) dispone de uno o varios flags, o banderas de peticin de interrupcin, que pueden ser activados por programa o por hardware; su nivel activo es uno lgico.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones INT0 INT1

153

8XC251Sx

Timer 0

Timer 1 CPU Controlador de interrupciones Timer 2 Instruccin TRAP Puerto serie

PCA

Fig. 6.8 Fuentes de interrupcin del microcontrolador 8XC251Sx

Una fuente de interrupcin activa su flag de interrupcin cuando desea realizar una peticin de interrupcin a la CPU. En la tabla 6.8 se muestran los flags de interrupcin asociados a cada una de las fuentes de interrupcin, y su ubicacin. Para algunas interrupciones el flag se borra por hardware cuando la CPU atiende a la interrupcin. Los flags de interrupcin tambin pueden ser borrados por programa, mediante una instruccin, por ejemplo, del tipo CLR bit.
Tabla 6.8 Flags de peticin de interrupcin

Fuente de interrupcin
/INT0 Timer 0 /INT1 Timer 1 Puerto Serie Timer 2 PCA

Flag que activa


IE0 TF0 IE1 TF1 RI, TI TF2, EXF2 CF, CFX

Ubicacin de los flags


bit 1 TCON bit 5 TCON bit 3 TCON bit 7 TCON bits 0 y 1 SCON bit 7 y 6 T2CON bit 7, 0,.., 4 CCON

X=0,.., 4

En lneas generales, el proceso de interrupcin de los microcontroladores de la familia MCS-251 sigue las pautas comentadas en el apartado de introduccin. Este proceso comienza cuando el circuito gestionador de interrupciones recibe una peticin de interrupcin. La CPU termina de ejecutar la instruccin en curso y almacena en la pila el contador de programa (PC) para, a continuacin, realizar un salto a la RSI de la interrupcin activa (figura 6.9).
Tiempo de respuesta
Oscilador Estados Peticin interrupcin externa

Finalizacin de la instruccin en curso

Push PC

Call ISR

RSI

Fig. 6.9 Proceso de atencin a una interrupcin externa

Los autores, 2001; Edicions UPC, 2001.

154

Microcontroladores MCS-51 y MCS-251

Existen dos causas que pueden bloquear el salto a la RSI: 1. Se est ejecutando una interrupcin de igual o mayor nivel de prioridad. En este caso el sistema de interrupcin deber esperar a que finalice la ejecucin de la RSI de la interrupcin ms prioritaria. 2. La instruccin que se est ejecutando en ese momento es la instruccin RETI o se est escribiendo en los registros IE0, IPH0 o IPL0. En este caso se deber ejecutar, al menos, una instruccin ms antes de que el sistema salte a la RSI. El nmero de bytes almacenados en la pila depende del valor del bit INTR ubicado en el byte de configuracin, CONFIG1. Si este bit est a uno lgico, se guardarn en la pila cuatro bytes, los tres bytes del contador de programa y el registro de estado PSW1. Si el bit INTR est a cero, se guardan en la pila, nicamente, los dos bytes de menor peso del contador de programa. Cada una de las fuentes de interrupcin de la familia MCS-251 tiene asociada una direccin diferente de comienzo de la RSI, denominada vector de interrupcin. En la tabla 6.9 estn indicados los vectores de interrupcin para cada una de las fuentes de interrupcin.
Tabla 6.9 Vectores de interrupcin

Direcciones de comienzo de la RSI


Fuente /INT0 Timer 0 /INT1 Timer 1 Puerto serie Timer 2 PCA TRAP Direccin FF:0003H FF:000BH FF:0013H FF:001BH FF:0023H FF:002BH FF:0033H FF:007BH

La rutina de servicio a la interrupcin finaliza con la instruccin RETI. La funcin de esta instruccin es la de indicar a la CPU que ha sido completada la ejecucin de la RSI y extraer de la pila la direccin de retorno y colocarla en el PC. Cabe destacar, segn la tabla 6.8, que entre la direccin de comienzo de la RSI de una fuente de interrupcin y la siguiente hay tan slo ocho posiciones de memoria, que en la mayora de los casos es insuficiente para albergar la RSI. Por este motivo, si se utilizan interrupciones consecutivas, por ejemplo /INT0 y Timer 0, la RSI deber comenzar con un salto incondicional hacia una direccin de memoria situada en una zona del espacio de memoria disponible para almacenar las instrucciones de la RSI. A continuacin se presenta, a modo de ejemplo, un listado de instrucciones cuya funcin es reubicar la localizacin de las RSI de las fuentes de interrupcin del Timer 0, Timer 1 y PCA.
;****************************************************************************************** ; REUBICACION DE LAS RSI DE LAS FUENTES DE INTERRUPCION Timer 0, Timer 1 y PCA ;****************************************************************************************** RSI _TIMER0 EQU 2000H ; Direccin de comienzo de la RSI del Timer 0 RSI _TIMER1 EQU 2200H ; Direccin de comienzo de la RSI del Timer 1 RSI _PCA EQU 2400H ; Direccin de comienzo de la RSI del PCA ORG FF:000BH ; Vector de interrupcin del Timer 0 JMP RSI_TIMER0

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones ORG FF:001BH JMP RSI_TIMER1 ORG FF:0033H JMP RSI_PCA RSI_TIMER0: ..... RETI RSI_TIMER1: ..... RETI RSI_PCA: ..... RETI ; Cdigo de la RSI del PCA ; Cdigo de la RSI del Timer 1 ; Vector de interrupcin del Timer 1 ; Vector de interrupcin del PCA ; Cdigo de la RSI del Timer 0

155

6.3.1 Habilitacin de las interrupciones


Cada una de las fuentes de interrupcin de los microcontroladores de la familia MCS-251, con excepcin de la instruccin TRAP, puede ser individualmente habilitada o inhibida poniendo a uno o a cero lgico el bit correspondiente del registro de habilitacin de interrupciones IE0. Este registro est ubicado en el rea de registros de funcin especfica, SFR, en la direccin S:0A8H. En la tabla 6.10 aparecen los bits que componen el registro IE0. Cabe destacar que este registro contiene un bit de habilitacin global de interrupciones: EA. Si EA est a uno lgico, las interrupciones pueden ser habilitadas o inhibidas individualmente por los bits del registro IE0. Si EA est a cero lgico, todas las interrupciones, excepto la TRAP, estarn inhibidas.
Tabla 6.10 Registro habilitador de interrupciones IE0

IE0 b7 EA Nmero de bit


7

Direccin: S:0A8H b6 b5 EC ET2 Nombre del bit


EA

b4 ES

Valor de reset: 0000 0000b b3 b2 b1 ET1 EX1 ET0 Funcin

b0 EX0

6 5 4 3 2 1 0

EC ET2 ES ET1 EX1 ET0 EX0

Bit de habilitacin general de interrupciones: poniendo a uno lgico este bit se habilitan todas las interrupciones que estn individualmente habilitadas por los bits 0-6. Poniendo a cero este bit se inhiben todas las interrupciones excepto la interrupcin TRAP, que no puede inhibirse. Bit de habilitacin de la interrupcin del PCA: poniendo a uno lgico este bit se habilita la interrupcin del PCA. Bit de habilitacin de la interrupcin del Timer 2: poniendo a uno lgico este bit se habilita la interrupcin del Timer 2. Bit de habilitacin de la interrupcin del puerto serie : poniendo a uno lgico este bit se habilita la interrupcin del puerto serie. Bit de habilitacin de la interrupcin del Timer 1: poniendo a uno lgico este bit se habilita la interrupcin del Timer 1. Bit de habilitacin de la interrupcin externa 1: poniendo a uno lgico este bit se habilita la interrupcin externa 1. Bit de habilitacin de la interrupcin del Timer 0: poniendo a uno lgico este bit se habilita la interrupcin del Timer 0. Bit de habilitacin de la interrupcin externa 0: poniendo a uno lgico este bit se habilita la interrupcin externa 0.

Los autores, 2001; Edicions UPC, 2001.

156

Microcontroladores MCS-51 y MCS-251

6.3.2 Niveles de prioridad de las interrupciones


Cada una de las siete fuentes de interrupcin de la familia MCS-251 puede programarse individualmente en uno de cuatro niveles de prioridad. La programacin de los niveles de prioridad permite establecer el orden en que se deben atender las interrupciones en caso de una activacin simultnea. El establecimiento de las prioridades se consigue poniendo a uno o cero lgico el bit correspondiente en dos registros de prioridad de interrupciones: Interrupt Priority High Register, IPH0, e Interrupt Priority Low Register, IPL0 (tablas 6.11 y 6.12 respectivamente). Por tanto, cada fuente de interrupcin tiene asociados dos bits de programacin de prioridad, un bit en el registro IPH0 y otro en el registro IPL0. El bit ubicado en el registro IPH0 es el bit ms significativo (MSB), mientras que el bit ubicado en el registro IPL0 es el bit menos significativo (LSB). El valor de estos dos bits define el nivel de prioridad de la fuente de interrupcin. Los niveles posibles son cuatro: nivel 0, 1, 2 o 3: el nivel 0 es el de menor prioridad y el nivel 3 el de mayor prioridad (tabla 6.13).
Tabla 6.11 Interrupt Priority High Register (IPH0)

IPH0 b7 ---Nmero de bit


7 6 5 4 3 2 1 0

Direccin: S:0B7H b6 b5 IPH0.6 IPH0.5 Nombre del bit


--IPH.6 IPH.5 IPH.4 IPH.3 IPH.2 IPH.1 IPH.0

b4 IPH0.4

Valor de reset: 0000 0000b b3 b2 b1 IPH0.3 IPH0.2 IPH0.1 Funcin

b0 IPH0.0

Reservado. Bit alto de prioridad de interrupcin del PCA. Bit alto de prioridad de interrupcin del Timer 2. Bit alto de prioridad de interrupcin del puerto serie. Bit alto de prioridad de interrupcin del Timer 1. Bit alto de prioridad de la interrupcin externa 1, /INT1. Bit alto de prioridad de interrupcin del Timer 0. Bit alto de prioridad de la interrupcin externa 0, /INT0.

Tabla 6.12 Interrupt Priority Low Register (IPL0)

IPL0 b7 ---Nmero de bit


7 6 5 4 3 2 1 0

Direccin: S:0B8H b6 b5 IPL0.6 IPL0.5 Nombre del bit


--IPL.6 IPL.5 IPL.4 IPL.3 IPL.2 IPL.1 IPL.0

b4 IPL0.4

Valor de reset: 0000 0000b b3 b2 b1 IPL0.3 IPL0.2 IPL0.1 Funcin

b0 IPL0.0

Reservado. Bit bajo de prioridad de interrupcin del PCA. Bit bajo de prioridad de interrupcin del Timer 2. Bit bajo de prioridad de interrupcin del Puerto Serie. Bit bajo de prioridad de interrupcin del Timer 1. Bit bajo de prioridad de la interrupcin externa 1, /INT1. Bit bajo de prioridad de interrupcin del Timer 0. Bit bajo de prioridad de la interrupcin externa 0, /INT0.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

157

Tabla 6.13 Niveles de prioridad de las interrupciones

IPH0.X (MSB)
0 0 1 1

IPL0.X (LSB)
0 1 0 1

Nivel de prioridad
0 Menor prioridad 1 2 3 Mayor prioridad

El funcionamiento del mecanismo de niveles de prioridad est sujeto a unas reglas muy sencillas: 1. Una interrupcin programada en un nivel bajo puede ser interrumpida por una interrupcin programada en un nivel de prioridad mayor, pero no por una interrupcin de nivel igual o menor. Si una interrupcin est programada en el nivel tres no podr ser interrumpida por ninguna fuente de interrupcin. Si dos o ms interrupciones se activan al mismo tiempo la CPU atender en primer lugar a la interrupcin de mayor nivel de prioridad. Una vez ejecutada la rutina de la interrupcin ms prioritaria, la CPU atender al resto de fuentes de interrupcin siguiendo un orden decreciente de prioridades. Si se reciben peticiones de interrupcin simultneas correspondientes a fuentes programadas en un mismo nivel de prioridad, el orden de respuesta seguir una secuencia preestablecida indicada en la tabla 6.14.

2. 3.

4.

Tabla 6.14 Prioridades dentro del mismo nivel

Prioridad
1 (Prioridad mayor) 2 3 4 5 6 7 (Prioridad menor)

Fuente de interrupcin
/INT0 Timer 0 /INT1 Timer 1 Puerto serie Timer 2 PCA

Ejemplo 6.4 Atencin a mltiples interrupciones Seguidamente se plantea un caso prctico de programacin de varias fuentes de interrupcin en distintos niveles de prioridad. En concreto se consideran cuatro fuentes de interrupcin programadas en los siguientes niveles: Timer 0 en nivel 3, /INT1 en nivel 2, puerto serie en nivel 2 y PCA en nivel 1. Para realizar esta asignacin de niveles de prioridad se deben programar los registros de prioridad de interrupcin con los siguientes valores: IPH0 = 16H (0001 0110), IPL0 = 42H (0100 0010). Si en estas condiciones se produce en primer lugar una peticin de interrupcin del PCA, la CPU pasar a ejecutar la RSI del PCA. Si mientras se ejecuta la RSI del PCA, ocurre una peticin simultnea de interrupcin de las fuentes /INT1 y puerto serie, la CPU dejar de

Los autores, 2001; Edicions UPC, 2001.

158

Microcontroladores MCS-51 y MCS-251

ejecutar la RSI del PCA para ejecutar las RSI de las interrupciones que se han activado, dado que poseen un nivel de prioridad mayor. Las interrupciones /INT1 y puerto serie poseen el mismo nivel de prioridad pero, teniendo en cuenta el orden establecido en la tabla 6.14, se ejecutar primero la RSI de la interrupcin /INT1 y, a continuacin, la RSI del puerto serie. Si, por ejemplo, se activa la interrupcin Timer 0 mientras se est ejecutando la RSI del puerto serie, la CPU pasa a ejecutar la RSI del Timer 0, porque posee un nivel de prioridad mayor que el puerto serie. Una vez ejecutada la RSI del Timer 0, la CPU finalizar la ejecucin de la RSI del puerto serie y, a continuacin, acabar de ejecutar la RSI del PCA para, finalmente, continuar ejecutando el programa Principal. En la figura 6.10 se representa, de forma esquemtica, la secuencia que sigue la CPU en la atencin a las distintas fuentes de interrupcin de este ejemplo.
PROGRAMA PRINCIPAL

RSI_/INT1

RSI_PCA

Int. PCA

Int. /INT1 y PS

RETI RSI_PUERTO_ SERIE RSI_T0

RETI

Int. T0

RETI

RETI

Fig. 6.10 Esquema de la secuencia de atencin a las interrupciones del ejemplo 6.4

6.3.3 Interrupciones externas /INT0 e /INT1


Las interrupciones /INT0 e /INT1 posibilitan el control de perifricos externos mediante el mecanismo de interrupciones. En la figura 6.11 est representada, a modo de ejemplo, la conexin de dos perifricos externos a las entradas de interrupcin /INT0 e /INT1.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

159

El perifrico externo interrumpe al C y activa la entrada de interrupcin. El C responder saltando a la direccin de comienzo de la RSI asociada a la interrupcin activada. Las interrupciones externas /INT0 e /INT1 se pueden programar para ser activas por flanco descendente o por nivel bajo, dependiendo del valor de los bits IT0 e IT1 del registro TCON. Con el bit IT0 a cero lgico, la interrupcin /INT0 se activa por nivel, mientras que con IT0 a uno lgico, la interrupcin /INT0 se activa por flanco descendente. La misma relacin se produce entre el bit IT1 y la interrupcin /INT1. Cuando se genera una interrupcin externa del tipo /INT0 o /INT1, se activa el correspondiente flag de peticin de interrupcin, bits IE0 o IE1, del registro TCON (tabla 6.15). Si la interrupcin se ha activado por flanco descendente, los flags de peticin de interrupcin se borran por hardware cuando la CPU salta a la rutina de atencin a la interrupcin para proceder a su ejecucin. Si la interrupcin se activa por nivel, el flag de interrupcin se deber borrar mediante una instruccin dentro de la RSI. Para este caso, la causa que ha generado la interrupcin externa /INT0 o /INT1 debe desactivarse antes de que acabe la RSI o se generar una nueva peticin de interrupcin.

8XC251
Perifrico 1 INT0 (P3.2) INT

Perifrico 2 INT1 (P3.3) INT

Fig. 6.11 Conexin de perifricos externos a las entradas de interrupcin del C 8XC251Sx

Para detectar la peticin de interrupcin, la CPU lee el estado de los pines asociados a las interrupciones externas /INT0 e /INT1 una vez cada ocho perodos de reloj. Tanto si la interrupcin externa est programada por nivel como por flanco, ser necesario mantener un nivel bajo durante al menos diez perodos para garantizar la deteccin de la interrupcin.
Tabla 6.15 Interrupciones externas

Fuente de interrupcin Flag Bit de configuracin por flanco o nivel Vector de interrupcin
/INT0 /INT1 IE0 IE1 IT0 IT1 FF:0003H FF:0013H

Si la aplicacin diseada requiere el control de ms de dos perifricos externos, se deber incluir en el diseo algn sistema, hardware y/o software, que permita determinar qu perifrico o perifricos han interrumpido, y en el caso que haya interrumpido ms de uno, en qu orden se deben atender. El establecimiento del orden de prioridad se puede hacer externamente, utilizando un controlador de prioridad de interrupciones (PIC), o bien, mediante software, programando en la RSI el orden de atencin a los distintos perifricos.

Los autores, 2001; Edicions UPC, 2001.

160

Microcontroladores MCS-51 y MCS-251

Ejemplo 6.5 Control de mltiples perifricos externos mediante un codificador de prioridad A continuacin se presenta un ejemplo de sistema de gestin de mltiples fuentes de interrupcin externas mediante un codificador de prioridad 74LS148 (figura 6.12), cuyo funcionamiento se detalla en la tabla 6.16. En este ejemplo, se han considerado 8 perifricos cuyas salidas de interrupcin estn conectadas a las entradas del codificador de prioridad. Las salidas de datos A2, A1 y A0 del codificador de prioridad estn a su vez conectadas a las tres lneas de menor peso del puerto P1 del microcontrolador 8XC251Sx.
Perifrico 7 Perifrico 6 Perifrico 5 Perifrico 4 Perifrico 3 Perifrico 2 Perifrico 1 Perifrico 0 INT INT INT INT INT INT INT INT

74LS148
7 6 5 4 3 2 1 0 E1 GS EO

8XC251

A1 A2 A3

P1.0 P1.1 P1.2 INT0

Fig. 6.12 Establecimiento de prioridades mediante el codificador de prioridad 74LS148 Tabla 6.16 Tabla de verdad del codificador de prioridad 74LS148 EI
H L L L L L L L L L

0
X H X X X X X X X L

1
X H X X X X X X L H

ENTRADAS 2 3 4
X H X X X X X L H H X H X X X X L H H H X H X X X L H H H H

5
X H X X L H H H H H

6
X H X L H H H H H H

7
X H L H H H H H H H

A2
H H L L L L H H H H

A1
H H L L H H L L H H

SALIDAS A0 /GS
H H L H L H L H L H H H L L L L L L L L

/EO
H L H H H H H H H H

Si uno o varios perifricos activan las entradas del codificador 74LS148, ste pondr a cero su salida /GS, y se realizar una peticin de interrupcin al C 8XC251Sx a travs de la entrada /INT0. Al mismo tiempo, en las salidas de datos A2, A1 y A0, aparece la combinacin binaria correspondiente a la entrada activa de mayor peso. Por tanto, la prioridad en la atencin a los perifricos se establece mediante el orden en que se conectan stos a las entradas del codificador, de forma que el perifrico que est conectado a la entrada siete es el de mayor prioridad, y el que est conectado a la entrada cero el de menor prioridad. En la rutina de servicio a la interrupcin /INT0, se deber determinar cul de los perifricos ha interrumpido, mediante la lectura del puerto P1, y saltar a la rutina especfica que lo atiende.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

161

Por otro lado, se debe establecer una tabla de vectores de salto, donde se adjudique una direccin de comienzo de la RSI de cada uno de los perifricos (tabla 6.17). Lgicamente, las rutinas de atencin a los perifricos se deben colocar en zonas de memoria que no se utilicen para otro fin.
Tabla 6.17 Direcciones de comienzo de las rutinas de atencin a los perifricos

Perifrico
7 6 5 4 3 2 1 0

Valor de P1
00 H 01 H 02 H 03H 04H 05H 06 H 07H

Direccin inicio RSI


FF:1100 H FF:1180 H FF:1200 H FF:1280 H FF:1300 H FF:1380 H FF:1400 H FF:1480 H

;*********************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION INT0 ;*********************************************************************************** ORG FF:0003H JMP SRI_INT0 ; La RSI comienza en la direccin FF:1000H para tener ms espacio de memoria. ORG FF:1000H SRI_INT0: MOV A,P1 ; Se lee la combinacin binaria que proporciona el codificador. ANL A,#07H ; Unicamente se toman los 3 bits significativos de P1. RL A ; Se multiplica por dos. MOV DPTR,#JMP_TBL ; En funcin de la combinacin leda se salta a la rutina JMP @A+DPTR ; que atiende al perifrico que ha interrumpido. JMP_TBL: AJMP RUT7 ; Salto a la rutina que atiende al perifrico siete. AJMP RUT6 ; Salto a la rutina que atiende al perifrico seis. AJMP RUT5 ; Salto a la rutina que atiende al perifrico cinco. AJMP RUT4 ; Salto a la rutina que atiende al perifrico cuatro. AJMP RUT3 ; Salto a la rutina que atiende al perifrico tres. AJMP RUT2 ; Salto a la rutina que atiende al perifrico dos. AJMP RUT1 ; Salto a la rutina que atiende al perifrico uno. AJMP RUT0 ; Salto a la rutina que atiende al perifrico cero. ORG FF:1100H RUT7: ; Instrucciones de la rutina que atiende al perifrico siete. ........ RETI ORG FF:1180H RUT6: ; Instrucciones de la rutina que atiende al perifrico seis. ........ RETI ORG FF:1200H RUT5: ; Instrucciones de la rutina que atiende al perifrico cinco. ........ RETI ORG FF:1280H RUT4: ; Instrucciones de la rutina que atiende al perifrico cuatro. ........ RETI ORG FF:1300H RUT3: ; Instrucciones de la rutina que atiende al perifrico tres. ........ RETI

Los autores, 2001; Edicions UPC, 2001.

162
ORG FF:1380H RUT2: ........ RETI ORG FF:1400H RUT1: ........ RETI ORG FF:1480H RUT0: ........ RETI

Microcontroladores MCS-51 y MCS-251

; Instrucciones de la rutina que atiende al perifrico dos.

; Instrucciones de la rutina que atiende al perifrico uno.

; Instrucciones de la rutina que atiende al perifrico cero.

Ejemplo 6.6 Control de mltiples perifricos externos mediante chequeo En este ejemplo se utiliza una secuencia de chequeo para determinar la prioridad de atencin a ocho perifricos externos conectados a la entrada de interrupcin /INT0 (figura 6.13). Las salidas de interrupcin de cada perifrico se han conectado a la entrada /INT0 a travs de un driver de salida en colector abierto. Basta que un perifrico active su salida de interrupcin para que la entrada de interrupcin /INT0 pase a cero lgico. El perifrico que interrumpe activa al mismo tiempo un bit del puerto P1. Cuando ocurre una interrupcin, la RSI se encarga de leer el puerto P1 y averiguar por chequeo qu perifrico o perifricos han interrumpido y atenderlos siguiendo un orden establecido en la propia RSI. En la figura 6.14 est representado el flujograma correspondiente a este ejemplo. La prioridad de cada perifrico se establece con el orden de chequeo de los bits del puerto P1. En este ejemplo, se verifica en primer lugar el bit P1.7, de forma que es el perifrico 7 el ms prioritario. El perifrico 0 es el menos prioritario porque se verifica en ltimo lugar.
Perifrico 7 Perifrico 6 Perifrico 5 Perifrico 4 Perifrico 3 Perifrico 2 Perifrico 1 Perifrico 0 INT INT INT INT INT INT INT INT

8XC251
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0

Colector Abierto INT0

+5V Fig. 6.13 Conexin de ocho perifricos a la entrada de interrupcin /INT0

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones ;***************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION INT0 ;***************************************************************** ORG FF:0003H JMP SRI_INT0 ; La rutina comienza en la direccin FF:1000H ORG FF:1000H ; para tener ms espacio de memoria SRI_INT0: JB P1.7,SIG6 ; Si P1.7 (bit MSB) es cero salta a la CALL SRI_7 ; rutina de atencin del perifrico 7 SIG6: JB P1.6,SIG5 ; Si P1.6 es cero salta a la rutina CALL SRI_6 ; de atencin del perifrico 6 SIG5: JB P1.5,SIG4 ; Si P1.5 es cero salta a la rutina CALL SRI_5 ; de atencin del perifrico 5 SIG4: JB P1.4,SIG3 ; Si P1.4 es cero salta a la rutina CALL SRI_4 ; de atencin del perifrico 4 SIG3: JB P1.3,SIG2 ; Si P1.3 es cero salta a la rutina CALL SRI_3 ; de atencin del perifrico 3 SIG2: JB P1.2,SIG1 ; Si P1.2 es cero salta a la rutinala rutina CALL SRI_2 ; de atencin del perifrico 2 SIG1: JB P1.1,SIG0 ; Si P1.1 es cero salta a la rutina CALL SRI_1 ; de atencin del perifrico 1 SIG0: JB P1.0,FIN ; Si P1.0 es cero salta a la rutina CALL SRI_0 ; de atencin del perifrico 0 FIN: RETI SRI_7: ; Instrucciones de la rutina de atencin del perifrico 7 ....... RET SRI_6: ; Instrucciones de la rutina de atencin del perifrico 6 ....... RET SRI_5: ; Instrucciones de la rutina de atencin del perifrico 5 ....... RET SRI_4: ; Instrucciones de la rutina de atencin del perifrico 4 ....... RET SRI_3: ; Instrucciones de la rutina de atencin del perifrico 3 ....... RET SRI_2: ; Instrucciones de la rutina de atencin del perifrico 2 ....... RET SRI_1: ; Instrucciones de la rutina de atencin del perifrico 1 ....... RET SRI_0: ; Instrucciones de la rutina de atencin del perifrico 0 ....... RET

163
RSI /INT0 LEER EL PUERTO P1

P1.7 = 0?
NO

SI

RUTINA DEL PERIFRICO 7

P1.6 = 0?
NO

SI

RUTINA DEL PERIFRICO 6

P1.5 = 0?
NO

SI

RUTINA DEL PERIFRICO 5

P1.4 = 0?
NO

SI

RUTINA DEL PERIFRICO 4

P1.3 = 0?
NO

SI

RUTINA DEL PERIFRICO 3

P1.2 = 0?
NO

SI

RUTINA DEL PERIFRICO 2

P1.1 = 0?
NO

SI

RUTINA DEL PERIFRICO 1

P1.0 = 0?
NO

SI

RUTINA DEL PERIFRICO 0

RETI

Fig. 6.14 Flujograma de la RSI del ejemplo 6.6

6.3.4 Interrupcin de los Timers


Los flags de peticin de interrupcin de los Timers 0 y 1, TF0 y TF1, se activan por rebasamiento del Timer correspondiente, excepto cuando el Timer 0 est programado en modo 3, en cuyo caso se activan exclusivamente por rebasamiento de los registros TH0 y TL0 del Timer 0. Cuando el Timer 0 1 genera una interrupcin, el flag de peticin de interrupcin se borra automticamente cuando la CPU ejecuta la rutina de servicio a la interrupcin.

Los autores, 2001; Edicions UPC, 2001.

164

Microcontroladores MCS-51 y MCS-251

El Timer 2 posee dos flags de interrupcin, TF2 y EXF2, ubicados en el registro T2CON (tabla 6.7). La activacin de cualquiera de estos bits genera una peticin de interrupcin a la CPU y su borrado debe realizarse por software. Por tanto, la rutina de servicio a la interrupcin deber determinar cul de los dos bits ha generado la interrupcin y borrarlo. A continuacuin se presenta el flujograma (figura 6.15) y el listado de un ejemplo de RSI del Timer 2. Este programa incorpora las instrucciones que permiten detectar cul de los dos flags de interrupcin del Timer 2 se ha activado, y actuar en consecuencia, de forma que si el flag activo es TF2, se ejecuta la rutina RUTINA_TF2, y si el flag activo es EXF2, se ejecuta la rutina RUTINA_EXF2.
;**************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 2 ;**************************************************************** ORG FF:002BH ; Direccin de comienzo de la RSI del Timer 2 como origen del programa JMP FF:0300H ;Salto a la direccin FF:0300H donde comienza la rutina del Timer 2 ORG FF:0300H ; Programa de inicio de la RSI del Timer 2 JBC TF2, RUTINA_TF2 ;Si el flag activo es TF2 se pone a 0 lgico y se salta a ;la rutina que debe ejecutarse en caso de activacin del flag TF2 CLR EXF2 ; Si el flag TF2 no esta activo se borra el flag EXF2 y se ; ejecuta la rutina RUTINA_EXF2 ;Instrucciones de la rutina RUTINA_EXF2 ...... RETI ;Instrucciones de la rutina RUTINA_TF2 RUTINA_TF2: . . . . . . . RETI

RSI Timer 2

SI TF2=1? NO
EXF2=0 RUTINA_EXF2

TF2=0 RUTINA_TF2

RETI

Fig. 6.15 Flujograma de la RSI del Timer 2

6.3.5 Interrupcin del array de contadores programables (PCA)


El array de contadores programables tiene asociados seis flags de interrupcin: el flag de rebasamiento del Timer del PCA, CF, y cinco flags pertenecientes a los cinco mdulos de comparacin y captura de que dispone el PCA, CCF0, CCF1, CCF2, CCF3 y CCF4. La activacin de cualquiera de estos flags genera una peticin de interrupcin a la CPU por parte del PCA. Los flags no se borran automticamente cuando la CPU ejecuta la rutina de servicio a la interrupcin del PCA, por lo que, normalmente, la rutina deber resolver cul, o cules de los seis flags se han activado, y borrarlos. En la figura 6.16 se representa el flujograma y, a continuacin, el listado de la RSI del PCA. En esta rutina se comprueban de forma secuencial todos los flags de interrupcin asociados al PCA. Si se detecta un flag activo se borra y se ejecuta una rutina especfica asociada a ese flag. Mediante el orden de comprobacin de los flags de interrupcin se puede establecer el orden de prioridad de atencin a los distintos mdulos que componen el PCA.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones ;************************************************************* ; RUTINA DE SERVICIO A LA INTERRUPCION DEL PCA ;************************************************************* PCA EQU FF:0400H ;Etiqueta a la direccin de la RSI del PCA ORG FF:0033H ;Direccin vector de interrupcin del PCA JMP PCA ;Salto a la rutina de la RSI del PCA ORG FF:0400H ;Programa de RSI del PCA JBC CF, RUTINA_CF ;Salta si CF=1 y borra el flag. POL_CCF0: JBC CCF0,RUTINA_CCF0 ;Salta si CCF0=1 y borra el flag POL_CCF1: JBC CCF1,RUTINA_CCF1 ;Salta si CCF1=1 y borra el flag POL_CCF2: JBC CCF2,RUTINA_CCF2 ;Salta si CCF2=1 y borra el flag POL_CCF3: JBC CCF3,RUTINA_CCF3 ;Salta si CCF3=1 y borra el flag POL_CCF4: JBC CCF4,RUTINA_CCF4 ;Salta si CCF4=1 y borra el flag ; ;Instrucciones de la RUTINA_CF ...... JMP POL_CCF0 ; Cuando termina la ejecucin de RUTINA_CF ; salto a comprobar el siguiente bit ; Instrucciones de la RUTINA_CCF0 ....... JMP POL_CCF1 ;Cuando termina la ejecucin de RUTINA_CCF0 ; salto a comprobar el siguiente bit ....... ; Instrucciones de la RUTINA_CCF4 ....... RETI ; Cuando termina la ejecucin de RUTINA_CCF4 ; termina la ejecucin de la RSI.

165

RSI PCA

CF=1?
NO

SI

RUTINA_CF

CCF0=1?
NO

SI

RUTINA_CCF0

CCF1=1?
NO

SI

RUTINA_CCF1

CCF2=1?
NO

SI

RUTINA_CCF2

CCF3=1?
NO

SI

RUTINA_CCF3

CCF4=1?
NO

SI

RUTINA_CCF4

RETI

Fig. 6.16 Flujograma de la RSI del PCA

6.3.6 Interrupcin del puerto serie


El puerto serie tiene asociado dos flags de interrupcin: el flag de interrupcin para recepcin, RI, y el flag de interrupcin para transmisin, TI. Ambos flags estn ubicados en el registro SCON (tabla 6.7). La activacin de cualquiera de estos dos flags genera una peticin de interrupcin a la CPU por parte del puerto serie. Tal y como ocurre con la interrupcin del Timer 2 y del PCA, el borrado de los flags TI y RI debe realizarse por programa. Por tanto, en la RSI del puerto serie se deben incluir instrucciones que determinen cul de estos flags se ha activado, y lo borren. A continuacin se representa el flujograma (figura 6.17) y el listado de un ejemplo de RSI del puerto serie. Este programa incorpora las instrucciones que permiten detectar el flag de interrupcin que se ha activado y actuar en consecuencia, de forma que si el flag activo es TI, se ejecuta la rutina RUT_TI, y si el flag activo es RI, se ejecuta la rutina RUT_RI.

Los autores, 2001; Edicions UPC, 2001.

166
;****************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 2 ;****************************************************************** ORG FF:0023H ; Direccin de comienzo de la RSI del puerto serie JMP FF:0400H ; Salto a la direccin de la rutina del puerto serie ORG FF:0400H ; Programa de inicio de la RSI del Timer 2 JBC TF2, RUT_TI ; Si el flag activo es TI se pone a 0 lgico y ; salta a la rutina correspondiente CLR RI ; Si el flag TI no est activo se borra el flag RI y ; se ejecuta la rutina RUT_RI ;Instrucciones de la RUT_RI ...... RETI ;Instrucciones de la RUT_TI RUT_TI: ....... RETI

Microcontroladores MCS-51 y MCS-251

RSI puerto serie

SI TI = 1? NO
RI = 0 RUT_RI

TI = 0 RUT_TI

RETI

Fig. 6.17 Flujograma de la RSI del puerto serie

Ejemplo 6.7 Control del ndice de acidez (pH) del agua de un depsito Se plantea a continuacin, como ejemplo ilustrativo de la utilizacin del sistema de interrupciones del microcontrolador 8XC251Sx, un caso prctico de control de una planta de tratamiento de aguas residuales. El objetivo de este ejemplo es mostrar el funcionamiento de las interrupciones por lo que respecta a la habilitacin, los niveles de prioridad, el manejo de los flags de interrupcin, etc. La planta que se debe controlar dispone de un sistema que neutraliza la acidez de las aguas residuales provenientes de una planta de fabricacin de papel (figura 6.18). El sistema posee un depsito donde se mezcla el agua residual con la cantidad adecuada del componente neutralizador, cuya funcin es disminuir la acidez del agua, de forma que el agua de salida del depsito posea un pH superior a 5.5. El sistema de control incorpora dos sensores activos a nivel alto: Un detector de rebosamiento, S1, que se activa cuando el agua contenida en el depsito supera la altura mxima permitida. Un detector de pH, M, que se activa cuando el pH del agua es inferior a 5.5. El sistema de control dispone adems de dos actuadores V1 y V2, activos a nivel alto, cuya funcin es realizar la apertura de dos vlvulas. Cuando se activa el actuador V1 se abre la vlvula que permite la entrada de las aguas residuales al depsito. Cuando se activa el actuador V2 se abre la vlvula que permite el vertido de neutralizador en el depsito. Por ltimo, existen dos indicadores luminosos, A1 y A2, activos a nivel alto, cuya funcin es la de monitorizar la apertura de las vlvulas V1 y V2.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

167

Neutralizador

A1 Sistema de control A2

Entrada de aguas residuales

V1

V2 S1 M Medidor pH Descarga

Fig. 6.18 Esquema de la planta que se desea controlar

En la figura 6.19 est representado el esquema elctrico donde se detalla la conexin del C 8XC251Sx con los diferentes sensores y actuadores que intervienen en esta aplicacin. Cabe destacar que los sensores S1 y M estn conectados a las entradas de interrupcin /INT0 e /INT1 a travs de sendas puertas inversoras, debido a que las interrupciones externas se activan a nivel bajo, mientras que estos sensores son activos a nivel alto.
8XC251
P1.2 P1.3 S1 M INT0 INT1 P1.0 P1.1 A1 A2 V1 V2

Fig. 6.19 Conexin de sensores y actuadores con el C 8XC251Sx

La estrategia que debe llevar a cabo el sistema de control para gestionar el funcionamiento de la planta de tratamiento de aguas residuales se puede resumir en dos puntos: La vlvula V1 debe permanecer abierta hasta que el sensor S1 se active; entonces se cerrar durante treinta segundos. Si una vez pasado este tiempo el sensor S1 sigue activo, se repetir la operacin de cierre de la vlvula V1. Mientras V1 est abierta, el indicador A1 permanecer encendido; en caso contrario el indicador parpadear. La vlvula V2 debe estar cerrada hasta que se active el sensor M y entonces abrirse durante cinco segundos. Una vez transcurrido ese tiempo, si el sensor M continua activo, se repetir la operacin de apertura de la vlvula V2. El indicador A2 se activa cuando la vlvula V2 est abierta y parpadea cuando est cerrada.

Los recursos utilizados para resolver esta aplicacin son cuatro: La interrupcin externa /INT0, que se encarga de detectar la activacin del sensor S1. La interrupcin se activa por nivel para que pueda ser atendida por la CPU mientras el sensor S1 se encuentre a uno lgico. La interrupcin externa /INT1, cuya funcin es detectar la activacin del medidor de pH. Esta interrupcin tambin se programa por nivel por el mismo motivo que la /INT0.

Los autores, 2001; Edicions UPC, 2001.

168

Microcontroladores MCS-51 y MCS-251

El Timer 0, que se encarga de temporizar el intervalo de 30 s, tiempo que debe permanecer abierta la vlvula V1 cuando se active S1. El Timer 1, que se encarga de temporizar los 5 s de apertura de la vlvula V2. El programa esta compuesto de una rutina principal y de cuatro rutinas de atencin a la interrupcin, una por cada fuente de interrupcin utilizada en la aplicacin. La funcin del programa principal ser bsicamente la de habilitar y programar los niveles de prioridad de las diversas fuentes de interrupcin utilizadas, as como la de ejecutar la secuencia de parpadeo de los indicadores luminosos A1 y A2. Para habilitar las cuatro fuentes de interrupcin se ponen a uno lgico los bits correspondientes del registro habilitador de interrupciones IE0: EX0, ET0, EX1 y ET1. Esto se consigue cargando en el registro IE0 el valor 8FH (10001111b). Por otra parte, se deben poner a uno lgico los bits IT0 e IT1 del registro TCON, con el objetivo de que las interrupciones externas /INT0 e /INT1 se activen por nivel. Esto se consigue almacenando en el registro TCON el valor 0AH (0000 1010b). A continuacin se debe establecer la prioridad de las interrupciones. En principio se adjudica a las interrupciones /INT0 y Timer 0 una prioridad mayor que a las interrupciones /INT1 y Timer 1, dado que la situacin de rebasamiento requiere una actuacin ms urgente que la superacin del nivel de pH. Las fuentes /INT0 y Timer 0 se programan con nivel de prioridad tres, mientras que las fuentes de interrupcin /INT1 y Timer 1 se programan con un nivel de prioridad menor, por ejemplo con nivel cero. Por tanto, los registros de nivel de prioridad IPH0 e IPL0 quedan: IPH0 = 03H y IPL0 = 03H. Por ltimo, se debe poner el bit INTR del byte de configuracin CONFIG1 a uno lgico. De esta forma, cuando la CPU ejecute una interrupcin, se cargarn en la pila, automticamente, los tres bytes del contador de programa, PC, y el registro de estado, PSW1. En cuanto a la rutina de retardo, que se utiliza para temporizar el parpadeo de los indicadores luminosos, estar compuesta de dos bucles anidados, basados en decrementar los registros R0 y R1. Modificando el valor de los registros R0 y R1 se puede variar el tiempo de ejecucin de la rutina y, por tanto, la frecuencia de parpadeo. Para calcular el tiempo de retardo hay que determinar el nmero de veces que se ejecuta cada instruccin, as como el tiempo que tarda en ejecutarse cada una de ellas. En la figura 6.20 se muestran los flujogramas correspondientes al programa principal y a la rutina de retardo. En la figura 6.21 se muestran los flujogramas de las rutinas de atencin a las interrupciones /INT0 y Timer 0. Las tareas que debe realizar la rutina de atencin a la interrupcin /INT0 son: Cerrar la vlvula V1. Inicializar el Timer 0 para que temporice 30 s. Inhibir la interrupcin /INT0 para impedir que se ejecute de forma repetida la RSI de la /INT0 mientras el sensor S1 se encuentra activo y no ha finalizado la temporizacin de 30s.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

169

Si consideramos que la frecuencia de reloj es de 1.2 MHz, se puede determinar, mediante un clculo sencillo, que el Timer 0 debe rebasar varias veces para temporizar 30 s. En la RSI del Timer 0 se debe contar el nmero de rebasamientos que sufre este temporizador. Cuando el Timer 0 rebasa un nmero de veces equivalente a 30 s se abre la vlvula V1, se detiene el funcionamiento del Timer 0 y se habilita de nuevo la interrupcin /INT0, de forma que si el sensor S1 contina activo se repite de nuevo la secuencia de cierre de V1.
PRINCIPAL RETARDO

INICIALIZAR: IE0 = 8FH TCON = 0AH IPH0 = 03H IPL0 = 03H

R0 = 10H

R1 = FFH

P1.2 = 1 P1.3 = 1

DECREMENTA R1

RETARDO

R1 = 0?
SI

NO

P1.2 = 0 P1.3 = 0

DECREMENTA R0

RETARDO

R0 = 0?
SI

NO

RET

Fig. 6.20 Flujograma del programa principal y de la rutina de retardo


INT0 T0

CERRAR VLVULA V1

T = 30s? SI PARAR T0

NO

INICIALIZAR T0

ACTIVACIN T0 ABRIR VLVULA V2 INHIBIR INT0 BORRAR IE0 RETI HABILITAR INT0

RETI

Fig. 6.21 Flujogramas de las rutinas de servicio a las interrupciones /INT0 y Timer 0

Los autores, 2001; Edicions UPC, 2001.

170

Microcontroladores MCS-51 y MCS-251

Las rutinas de atencin a las interrupciones /INT1 y Timer 1 tienen funciones similares a las interrupciones /INT0 y Timer 0. En la figura 6.22 se presentan los flujogramas correspondientes a ambas rutinas.
INT1 T1

ABRIR VLVULA V2

T = 5s? SI PARAR T1

NO

INICIALIZAR T1

ACTIVACIN T1 CERRAR VLVULA V2 INHIBIR INT1 BORRAR IE1 RETI HABILITAR INT1

RETI

Fig. 6.22 Flujogramas de las rutinas de servicio a las interrupciones /INT1 y Timer1

A continuacin se presentan el listado del programa principal y de la rutina de retardo.


;**************************************************************************** ; VECTORIZACION INTERRUPCIONES ;**************************************************************************** ORG FF:0003H ; Vector de interrupcin de /INT0 JMP RSI_INT0 ORG FF:000BH ; Vector de interrupcin del Timer 0 JMP RSI_T0 ORG FF:0013H ; Vector de interrupcin de /INT1 JMP RSI_INT1 ORG FF:001BH ; Vector de interrupcin del Timer 1 JMP RSI_T1 ;****************************************************************************** ; PROGRAMA PRINCIPAL ;****************************************************************************** ORG FF:0000H JMP PRINCIP ORG FF:0100H ; Programacin del nivel de prioridad de las interrupciones externas 0 y 1 PRINCIP: MOV IE0,#8FH ; Habilitacin de las interrupciones MOV TCON,#0AH ; Se programa /INT0 e /INT1 por nivel MOV IPL0,#03H ; Programacin de los niveles de prioridad MOV IPH0,#03H SETB INTR ; Cuando la CPU vectorice una interrupcin cargar en la pila ; los 3 bytes del PC y el registro de estado PSW1 ;Secuencia de parpadeo de los indicadores luminosos A1 y A2 SALTO0: SETB P1.2 SETB P1.3 CALL RETARDO CLR P1.2 CLR P1.3 CALL RETARDO JMP SALTO0

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones ;************************************************************************ ; RUTINA DE RETARDO ;************************************************************************* ORG FF:0200H RETARDO: MOV R0,#10H ; R0 = 10H SALT2: MOV R1,#FFH ; R1 = FFH SALT1: DJNZ R1,SALT1 ; Decrementa R1 y si es distinto de 0 salta a SALT1 DJNZ R0,SALT2 ; Decrementa R2 y si es distinto de 0 salta a SALT2 RET ;************************************************************************ ; RUTINA DE SERVICIO A LA INTERRUPCION INT0 ;************************************************************************* ORG FF:0300H RSI_INT0: CLR P1.0 ; Se cierra la vlvula V1 SETB TMOD.0 ; Se programa el Timer 0 en modo 1 MOV TH0,#3CH ; Se inicializa el Timer 0 para temporizar 0.5 s MOV TL0,#AFH ; MOV R3,#00H ; El registro R3 contar los rebasamientos del Timer 0 SETB TR0 ; Puesta en marcha del Timer 0 CLR EX0 ; Se inhibe la interrupcin /INT0 RETI

171

Clculo del valor inicial del Timer 0 Para temporizar los treinta segundos se inicia el Timer 0 para que tarde 0.5 s en rebasar (de forma que se deben contabilizar 60 rebasamientos en la RSI del Timer 0 para abrir de nuevo la vlvula V1). Para temporizar 0.5 s, con una frecuencia de reloj de 1.2 MHz, el Timer 0 debe incrementarse 50.000 veces (C350H); luego se ha de cargar dicho Timer con la combinacin resultante de restar a FFFFH el valor C350H: FFFFH - C350H = 3CAFH
;************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 0 ;*************************************************************************** ORG FF:0400H RSI_T0: INC R3 ; Se incrementa el contador de rebasamientos CMP R3,59d ; Se compara el nmero de rebasamientos con 59 JNC SIGUE ; Si el nmero de rebasamientos es menor o igual que 59 continua temporizando CLR TR0 ; En caso contrario se detiene el Timer 0 y CLR P1.0 ; se abre la vlvula V1 SETB EX0 ; Se habilita de nuevo la interrupcin /INT0 CLR IE0 ; Se borra el flag de la interrupcin /INT0 SIGUE: RETI ; Retorno al programa principal ;**************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION INT1 ;***************************************************************************** ORG FF:0500H RSI_INT1: SETB P1.1 ; Se abre la vlvula V2. SETB TMOD.4 ; Se programa el Timer 1 en modo 1 MOV TH1,#3CH ; Se inicializa el Timer 1 para temporizar 0.5 s MOV TL1,#AFH ; MOV R4,#00H ; El registro R4 contar los rebasamientos del Timer 1 SETB TR1 ; Puesta en marcha del Timer 1 CLR EX1 ; Se inhibe la interrupcin /INT1 RETI

Los autores, 2001; Edicions UPC, 2001.

172

Microcontroladores MCS-51 y MCS-251

;************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 1 ;************************************************************************** ORG FF:0600H RSI_T1: INC R4 ; Se incrementa el contador de rebasamientos CMP R4,09d ; Se compara el nmero de rebasamientos con 9 JNC SIGUE1 ; Si el nmero de rebasamientos es menor o igual que 9 continua temporizando. CLR TR1 ; Se detiene el Timer 1 SETB P1.1 ; Se abre la vlvula V2 SETB EX1 ; Se habilita la interrupcin /INT1 CLR IE1 ; Se borra el flag de la interrupcin /INT1 SIGUE1: RETI ; Retorno al programa principal

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

173

7 Temporizadores/contadores internos y watchdog


7.1 Introduccin
Los microcontroladores de las familias MCS-51 y MCS-251 disponen de hasta tres contadores internos de 16 bits, denominados Timer 0, Timer 1 y Timer 2, que pueden ser configurados de forma individual para operar en diversos modos de trabajo. Estos contadores, en general, se incrementan en una unidad cada vez que les entra un pulso de reloj, el cual puede provenir de la frecuencia de reloj del microcontrolador o bien de un terminal externo, por lo que, en el primer caso, al Timer se le denomina temporizador y, en el segundo caso, se le denomina contador. Por otra parte hay microcontroladores que incorporan un contador adicional, cuya misin consiste en hacer de dispositivo de watchdog (perro guardin). Este contador se emplea para reiniciar la CPU cuando sta, por problemas de interferencia electromagntica, o por algn fallo interno, pierde el rumbo habitual de ejecucin de las instrucciones, fenmeno que resulta fcil de distinguir por la gestin catica que hace la CPU de sus perifricos. El Timer de watchdog es un contador que se incrementa con cada pulso del reloj de la CPU; genera entonces un reset interno que inicializa el microcontrolador cuando llega a desbordamiento. Con el Timer de watchdog, para que se active este reset interno, deben pasar unos pocos milisegundos, que es el tiempo necesario para que el contador de watchdog llegue al desbordamiento. De manera que, cuando el watchdog est activado, el programador debe insertar instrucciones de refresco o de inicializacin del Timer cada cierto intervalo de instrucciones. Se trata, pues, de que el watchdog no llegue desbordarse, mientras el flujo de ejecucin de instrucciones por parte de la CPU sea correcto. Si la CPU pierde el control del sistema, las instrucciones se ejecutan de forma catica, por lo que la serie de instrucciones de refresco del watchdog no se ejecutan con la regularidad prevista, lo que causa el desbordamiento del Timer y un auto-reset de la CPU para inicializar el sistema. El Timer de watchdog est presente en los microcontroladores de la familia MCS-251 y slo en la versin 87C51GB de la familia MCS-51, versin que no se explica en este libro, pues se explica tan slo para la familia MCS-251. Se debe tener en cuenta que la homologacin de muchos productos basados en microcontroladores se somete a pruebas con intensas interferencias electrostticas y electromagnticas, con el propsito de que la CPU pierda el rumbo habitual de ejecucin. En este caso, el sistema debe inicializarse.

Los autores, 2001; Edicions UPC, 2001.

174

Microcontroladores MCS-51 y MCS-251

7.2 Temporizadores/contadores para la MCS-51


7.2.1 Timer 0 y Timer 1 El Timer 0 y el Timer 1 son contadores de 16 bits que estn presentes en todos los microcontroladores de la MCS-51. El valor de estos contadores se refleja en los registros TH0 y TL0, para el Timer 0, y en los registros TH1 y TL1, para el Timer 1. El registro THx constituye el byte alto del contador y el registro TLx el byte bajo. El Timer 0 y el Timer 1 pueden funcionar con cuatro modos de trabajo distintos, seleccionables mediante el registro TMOD, Timer Mode. Los modos de trabajo son: modo 0, temporizador/contador de 13 bits; modo 1, temporizador/contador de 16 bits; modo 2, temporizador/contador de 8 bits con autorrecarga; y modo 3, varios contadores. La figura 7.1 muestra el esquema funcional del Timer 0 y del Timer 1, para los modos 0 y 1 de funcionamiento, con temporizador de 13 y 16 bits, respectivamente. En esta figura se resaltan, con un cuadro de puntos, dos bloques: el bloque de seleccin de temporizador/contador y el bloque de la lgica de control. Estos bloques son comunes al Timer 0 y al Timer 1 y a los modos de funcionamiento 0, 1 y 2 de los Timers.
Temporizador/contador XTAL1 12 Interrupcin 0 Tx C/T TR x GATE INT x Lgica de control TL x 1
(8 5* bits)

Puerta de transmisin

THx
(8 bits)

TF x

* Modo

0: Temporizador/contador de 13 bits Modo 1: Temporizador/contador de 16 bits x=01

Fig. 7.1 Esquema funcional para los Timers 0 y 1 en los modos 0 y 1 de funcionamiento

El bloque de seleccin de temporizador/contador, mediante el bit C / T del registro TMOD, Timer Mode, selecciona la fuente de entrada de pulsos del Timer, que puede provenir directamente de la seal de reloj del microcontrolador dividida por 12, para C / T a 0 lgico, o de una entrada de pulsos externa a travs del terminal Tx del microcontrolador, para C / T a 1 lgico. El bloque de lgica de control utiliza una puerta de transmisin para dejar pasar, o no, los pulsos de reloj hacia el contador (figura 7.1). En este bloque intervienen el bit TRx, Timer Run, del registro TCON, el bit GATE del registro TMOD y el terminal de entrada /INTx, con el propsito de controlar el paso de pulsos de reloj hacia el contador, lo que a partir de este momento se definir como puesta en marcha o parada del contador. Con los bits TRx y GATE se puede poner en marcha o parar el Timer de forma directa, por software, o bien, por medio del estado lgico del terminal /INTx, por hardware.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

175

Observando el circuito de la lgica de control, se deduce que si el bit GATE se pone a 0 lgico, en la entrada de la puerta OR (figura 7.1), habr un 1 lgico y, por tanto, un 0 lgico en la entrada de la puerta AND; en esta situacin queda claro que la puerta est gobernada por el estado lgico del bit TRx. Entonces, si TRx vale 0 lgico, la puerta queda abierta y el Timer parado, y si TRx vale 1 lgico, la puerta queda cerrada y el Timer en marcha, y se incrementa a cada pulso de entrada. En esta situacin, con el bit GATE a 0 lgico, la puesta en marcha o la parada del Timer depende del estado del bit TRx, y queda, en consecuencia, gobernado por software. Si GATE se pone a 1 lgico, a la entrada de la puerta OR, tras la puerta inversora (figura 7.1), habr un 0 lgico; luego, el estado lgico de la puerta OR depender directamente del estado lgico del terminal /INTx. Si al mismo tiempo, el bit TRx se pone a 1 lgico, queda claro que el gobierno de la puerta de transmisin depender del terminal /INTx, que pondr en marcha el Timer cuando /INTx est a 1 lgico, y parar el Timer cuando /INTx est a 0 lgico, lo que se mencionar, a partir de ahora, como puesta en marcha o parada del contador por hardware, es decir, por el estado lgico de /INTx. La determinacin del modo de funcionamiento del Timer 0 y del Timer 1 se realiza con los bits M0 y M1 del registro TMOD: existen, en efecto, en este registro un par de bits para cada Timer (tabla 7.1). El contenido del registro TCON se muestra en la tabla 6.2.
Tabla 7.1 Registro TMOD
(MSB) GATE C/T M1 Registro TMOD M0 GATE C/T M1 (LSB) M0

Timer 1

Timer 0

Bit GATE

Comentario GATE a 0 lgico hace que el Timer se gobierne mediante TRx, con TRx a 1 lgico se pone en macha el Timerx y con TRx a 0 lgico se detiene (x=0 1). GATE a 1 lgico, junto con TRx a 1, hace que el Timer se gobierne por hardware, mediante el estado lgico de la entrada /INTx. Selecciona entre pulsos de la seal de reloj o pulsos del terminal Tx. Si C/T est a 0 se toman los pulsos de la seal de reloj y si C/T est a 1 se toman de Tx. Seleccin del modo de trabajo Modo 0. Temporizador/contador de 13 bits. Modo 1. Temporizador/contador de 16 bits. Modo 2. Temporizador/contador de 8 bits con autorrecarga. Modo 3. Varios contadores.

C/T M1 M0 0 0 0 1 1 0 1 1

7.2.1.1 Modo 0. Temporizador/contador de 13 bits En el modo 0, el Timer 0 y el Timer 1 operan como temporizadores/contadores de 13 bits (figura 7.1), empleando, en realidad, el registro TLx como un divisor previo de 5 bits, que puede dividir la frecuencia de la seal de entrada de los Timers hasta por 32; y el registro THx como un contador de 8 bits conectado a la salida de TLx. Los tres bits altos de TLx estn en un estado indeterminado, que debe ser ignorado.

Los autores, 2001; Edicions UPC, 2001.

176

Microcontroladores MCS-51 y MCS-251

El sentido del contador es siempre ascendente y se incrementa con cada pulso de entrada. El rebasamiento del Timer se produce cuando pasa de tener todos los bits de uno lgico a cero lgico; entonces se activa el bit correspondiente de rebasamiento, TFx, y se genera una interrupcin a la CPU.

7.2.1.2 Modo 1. Temporizador/contador de 16 bits En el modo 1 el Timer 0 y el Timer 1 operan como un temporizador/contador de 16 bits (figura 7.1). En este modo los registros TLx y THx son dos contadores de 8 bits que estn conectados en cascada para formar el contador de 16 bits. Al igual que en el modo 0, en el modo1 el sentido del contador es ascendente, y el rebasamiento se produce al pasar el contenido de los registros TLx y THx de todos los bits de uno lgico a cero lgico. El rebasamiento entonces activa el bit TFx y genera una interrupcin a la CPU.

7.2.1.3 Modo 2. Temporizador/contador de 8 bits con autorrecarga En el modo 2 el Timer 0 y el Timer 1 funcionan como un temporizador/contador de 8 bits con autorrecarga (figura 7.2). El contador est formado por el registro TLx, mientras que el registro THx hace la funcin de registro de recarga. En este modo de trabajo, cuando se produce un desbordamiento en el contador, el bit TFx se activa de manera automtica, causa una interrupcin a la CPU y hace, al mismo tiempo, que el contenido de THx se cargue en el registro TLx, por lo que el contador comienza a contar pulsos a partir del valor cargado. Este proceso de recarga no modifica el valor del registro THx, mediante el cual se pueden generar perodos de tiempo precisos a partir del valor situado en THx.
XTAL1 12 0 Tx C/T TR x TH x GATE INT x x=01 TL x 1 TF x Interrupcin

Fig. 7.2 Esquema funcional para los Timers 0 y 1 en el modo 2 de funcionamiento

Ejemplo 7.1 Generacin de una seal peridica Es habitual en un sistema tener que generar seales peridicas: en el caso de la MCS-51 se pueden llevar a cabo empleando uno o varios de sus temporizadores. En este ejemplo se usa el Timer 0 en el modo 2 de 8 bits con autorrecarga, para generar una seal binaria de 5kHz de frecuencia. Para determinar el perodo de la seal se emplear el registro TH0 del Timer 0. La seal generada se extraer a travs de la patilla P1.0 del microcontrolador (figura 7.3).

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog ;*************************************************************** ; Generacin de una seal peridica ; Rutina de Vectorizacin ;*************************************************************** ORG 0H LJMP Inicio ORG 0BH LJMP RSI_Timer0 ;*************************************************************** ; Rutina de Inicio ;*************************************************************** Inicio: SETB PT0 ;Asigna prioridad alta al Timer 0 SETB ET0 ;Habilita interrupcin del Timer 0 SETB EA ;Habilita bit de interrupcin general MOV TMOD,#02H ;M1=1 y M0=0 (Modo 2), ; GATE=0 y C/T=0 del Timer 0 MOV TL0, #156 ;Pone valor 156 en TL0 (256-100) MOV TH0, #156 ;Pone valor de recarga en TH0 (256-100) SETB TR0 ;Pone marcha el contador ;*************************************************************** ; Rutina de Principal ;*************************************************************** Principal: SJMP Principal ;Bucle infinito sin una tarea concreta ;*************************************************************** ; Rutina de servicio del Timer0 ;*************************************************************** RSI_Timer0:CPL P1.0 ;Complementa P1.0. Pasa de 1 a 0, y de 0 a 1 RETI ;Fin de rutina. El bit TF0 se borra automticamente

177

MCS-51

P1.0

Fig. 7.3 Generacin de seal en el ejemplo 7.1

En el programa realizado se habilita la interrupcin del Timer 0 (ET0=1, EA=1), se le da prioridad alta a la interrupcin del Timer 0 (PT0=1), y se configura el Timer 0 en el modo 2 de 8 bits con autorrecarga (M1=1 y M0=0, registro TMOD). La puesta en marcha del Timer 0 es por software (GATE=0, registro TMOD), el Timer 0 cuenta pulsos procedentes del reloj del microcontrolador (C/T=0, registro TMOD), y, al final de la rutina Inicio, se pone en marcha el Timer (TR0=1). El Timer 0 est gestionado completamente por interrupciones, de manera que cada vez que llega a desbordamiento se activa el bit TF0, TF0=1, se produce una interrupcin a la CPU y se recarga el valor del registro TH0 en el registro TL0. En la rutina de atencin a la interrupcin del Timer 0, RSI_Timer0, basta con complementar el estado lgico de la patilla P1.0, para generar la frecuencia requerida. Con esta instruccin el microcontrolador lee el estado de la patilla, lo complementa (pasa de 0 lgico a 1 lgico, y viceversa) y escribe el nuevo estado en la patilla. El bit de rebasamiento se activa con la peticin de interrupcin y se borra, de forma automtica, cuando la CPU atiende a la interrupcin ejecutando la rutina RSI_Timer0. Para determinar el valor de recarga del registro TH0, se debe considerar que el perodo necesario para generar frecuencia de 5 kHz es de 200 [s, por lo que la patilla P1.0 se debe complementar cada 100 [s, es decir, la mitad del perodo. Adems, desde que se produce la interrupcin (estado S5P2 del ciclo mquina), hasta que se vectoriza la interrupcin del Timer 0, transcurren tres ciclos mquina en el mejor de los casos, y la instruccin CPL P1.0 se ejecuta

Los autores, 2001; Edicions UPC, 2001.

178

Microcontroladores MCS-51 y MCS-251

en un ciclo mquina. Por tanto, el estado lgico de la patilla P1.0 cambiar, al menos, cuatro ciclos mquina despus de que se halla activado el bit TF0. El valor de recarga de TH0 debe ser de 156, es decir, el valor de la diferencia entre 256 (valor de rebasamiento) y el tiempo deseado, 100 [s. Se debe tener en cuenta que para un reloj de 12MHz, el Timer 0 se incrementa cada microsegundo y que un ciclo mquina tiene la duracin de 1 [s. Ejemplo 7.2 Generacin de diversas frecuencias En este ejemplo se generarn distintas frecuencias por la patillas P1.6 y P1.7 del microcontrolador, en funcin del estado de las teclas T1, T2, T3, T4, T5 y T6. Las cuatro primeras teclas estn conectadas a la entrada de interrupcin /INT0 mediante puertas AND lgico, de forma que su pulsacin causar una interrupcin a la CPU.
T1 T2 T3 T4 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 T5 T6

80C31
P1.6 /INT0 P1.7

f1 f2

Fig. 7.4 Generacin de diversas frecuencias del ejemplo 7.2

En este ejemplo el microcontrolador debe generar en la patilla P1.6 una frecuencia de 4kHz, 5kHz, 10kHz y 20kHz, si se pulsan las teclas T1, T2, T3 o T4, respectivamente. Las teclas T5 y T6 afectarn a la frecuencia de la patilla P1.7. Al pulsar T5 se generar en P1.7 una frecuencia de 25kHz; al pulsar T6 la frecuencia ser de 50kHz. Inicialmente, por defecto, en P1.6 y en P1.7 se generar una frecuencia de 2kHz. Cuando se pulse una tecla se generar la frecuencia correspondiente, y cuando no se pulse ninguna se volver a generar la frecuencia inicial de 2kHz.
;******************************************************************** ; Generacin de una seal peridica ;******************************************************************** ORG 0H ; Vectorizacin de interrupciones LJMP Inicio ORG 03H LJMP RSI_Int0 ORG 0BH LJMP RSI_Timer0 ORG 01BH LJMP RSI_Timer1 ;******************************************************************** ; Rutina de Inicio ;******************************************************************** Inicio: SETB IT0 ;Interrupcin /INT0 activa por flanco descendente SETB PT0 ;Asigna prioridad alta al Timer 0

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog SETB PT1 ;Asigna prioridad alta al Timer 1 SETB EX0 ;Habilita interrupcin de /INT0 SETB ET0 ;Habilita interrupcin del Timer 0 SETB ET1 ;Habilita interrupcin del Timer 1 SETB EA ;Habilita bit de interrupcin general MOV TMOD, #22H ;Timer 0 y 1 en Modo 2, con GATE=0 y C/T=0 MOV TL0, #6 ;(256-250) carga valor inicial para frec. de 2kHz MOV TH0, #6 ;carga valor inicial para frec. de 2kHz MOV TL1, #6 ;carga valor inicial para frec. de 2kHz MOV TH1, #6 ;carga valor inicial para frec. de 2kHz SETB TR0 ;Pone marcha el Timer 0 SETB TR1 ;Pone marcha el Timer 1 LJMP Principal ;Ir hacia rutina principal ;******************************************************************** ; Rutina de servicio de /INT0 ;******************************************************************** RSI_Int0: JNB P1.0, Tecla_T1 ;Ha pulsado la tecla T1? JNB P1.1, Tecla_T2 ;Ha pulsado la tecla T2? JNB P1.1, Tecla_T3 ;Ha pulsado la tecla T3? SJMP Tecla_T4 ;Tiene que ser la tecla T4 Tecla_T1: MOV TH0, #131 ;(256-125) valor de recarga para 4kHz RETI Tecla_T2: MOV TH0, #156 ;(256-100) valor de recarga para 5kHz RETI Tecla_T3: MOV TH0, #206 ;(256-50) valor de recarga para 10kHz RETI Tecla_T4: MOV TH0, #231 ;(256-25) valor de recarga para 20kHz RETI ;******************************************************************** ; Rutina de servicio del Timer0 ;******************************************************************** RSI_Timer0:CPL P1.6 ;Complementa P1.6 RETI ;Fin de subrutina. El bit TF0 se borra automticamente ;******************************************************************** ; Rutina de servicio del Timer1 ;******************************************************************** RSI_Timer1:CPL P1.7 ;Complementa P1.7 RETI ;Fin de subrutina. El bit TF0 se borra automticamente ;******************************************************************** ; Rutina de Principal ;******************************************************************** Principal: JNB P1.4, Tecla_T5 JNB P1.5, Tecla_T6 MOV TH0, #6 ;frecuencia por defecto de 2kHz en Timer 0 MOV TH1, #6 ;frecuencia por defecto de 2kHz en Timer 1 SJMP Principal ;Bucle infinito Tecla_T5: MOV TH1, #236 ;(256-20) valor de recarga para 25kHz SJMP Principal Tecla_T6: MOV TH1, #246 ;(256-10) valor de recarga para 50kHz SJMP Principal

179

En la rutina de inicio se ha activado la interrupcin /INT0 por flanco descendente, por lo que la interrupcin slo se producir una vez, cuando se pulse una tecla, al detectar la CPU un flanco de bajada. En la rutina de inicio se le asigna prioridad alta al Timer 0 y al Timer 1, por ser el ncleo de este ejemplo. El Timer 0 y el Timer 1 se configuran en el modo 2 de autorrecarga contando pulsos del reloj.

Los autores, 2001; Edicions UPC, 2001.

180

Microcontroladores MCS-51 y MCS-251

Para determinar el valor de los registros TH0 y TH1, de acuerdo con la frecuencia especificada, se debe tener en cuenta que la frecuencia se genera a travs de la instruccin CPL en la rutina de RSI de cada Timer. La instruccin CPL complementa el valor del terminal del puerto cada vez que un temporizador llega a rebasamiento, por lo que para generar una frecuencia se debe emplear la mitad del perodo de sta. Con una frecuencia de reloj de 12 MHz, el perodo de cada pulso de reloj es de 1 [s, los temporizadores, pues, se incrementan cada microsegundo. Luego, para generar una frecuencia determinada en el Timer 0 1, el valor del registro TH0 o TH1 debe ser: TH 0,1 ] Valor de rebasamiento Perodo reloj 2

En este ejemplo, para generar una frecuencia de 2 kHz el valor de TH0 es de 236, para 4 kHz el valor es de 131, etc. El Timer 0 llega a rebasamiento cuando TL0 pasa de FFH a 00H, por lo que el valor de rebasamiento, es decir, el valor mximo del Timer, es de 256 o FFH+1. La pulsacin de las teclas T5 y T6 se detecta mediante software en la rutina principal, donde continuamente se lee el estado de estas teclas, y se asigna al registro TH1 el valor de 236 para generar una frecuencia de 25 kHz, o el valor 246 para generar una frecuencia de 50 kHz.

7.2.1.4 Modo 3. Varios contadores En el modo 3 los registros TL0 y TH0 del Timer 0 trabajan como dos contadores independientes de 8 bits cada uno (figura 7.5); de manera que se emplear en aquellas aplicaciones que requieren de un temporizador o contador de 8 bits adicional. En el modo 3 el contador formado por TL0 utiliza todos los bits de control propios del Timer 0, para llevar a cabo el mismo tipo de funcionamiento que el descrito para los otros modos; o sea, usa los bits C/T, GATE, TR0 y /INT0. No obstante, para el contador formado por el registro TH0 slo se dispone del bit de control TR1, por lo que este contador tiene su funcionamiento restringido: slo puede ponerse en marcha y pararse mediante el bit TR1. El contador TH0, adems, slo puede contar pulsos procedentes del reloj del microcontrolador. A nivel de desbordamiento, el contador formado por TL0 afecta al bit TF0, mientras que el contador formado por TH0 afecta al bit TF1, que en los otros modos pertenece al Timer 1. En cuanto al Timer 1, para el modo 3, es obvio que no puede utilizar los bits TR1 y TF1 en su funcionamiento usual, lo que significa que, cuando el Timer 1 se desborde, no se activar el bit TF1, y que tampoco se podr usar el bit TR1 para activar o para parar el Timer. La forma de arrancar y parar el Timer 1 consiste en entrar y salir de su propio modo 3; es decir, entrando en el modo 3 se pone en marcha el Timer 1, y saliendo del modo 3 se detiene el Timer 1. De todos modos, el Timer 1 puede ser utilizado por el puerto serie como base para la generacin de la velocidad de transmisin en baudios o en cualquier otra aplicacin en donde no se necesite producir una interrupcin.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

181

XTAL1

12 0

1/12 Fosc Interrupcin TL0 1 TF0

T0 C/T TR0 GATE INT0

Interrupcin 1/12 Fosc TR1 TH0 TF1

Fig. 7.5 Esquema funcional en el modo 2 de funcionamiento

7.2.2 Timer 2 El Timer 2 es un contador de 16 bits que est formado a partir de los registros TL2 y TH2, de 8 bits cada uno, conectados en cascada. Este Timer est presente en todas las versiones de la MCS-51 con tres temporizadores internos, y puede trabajar hasta con cuatro modos distintos de funcionamiento: modo autorrecarga, modo captura, modo Baud Rate y modo Clock-out. La forma de trabajar con el Timer 2 se determina a partir de los registros T2MOD y T2CON, (tablas 7.2 y 7.3, respectivamente). Estos registros permiten determinar el modo de funcionamiento del Timer 2, controlar su puesta en marcha, programar su modo de operacin (contador o temporizador) y detectar el desbordamiento. En la tabla 7.4 se indican los cuatro modos de operacin en los que puede funcionar el Timer 2, dependiendo del estado de los bits RCLK, TCLK, CP/RL2 y T2OE.

Tabla 7.2 Registro T2MOD para el control del Timer 2


(MSB) -Registro T2MOD -----(LSB) T2OE DCEN

Bit -T2OE DCEN

Comentario Bit reservado. Bit de habilitacin del Timer 2. En el modo Clock-out, T2OE conecta la salida de desbordamiento con el terminal T2. Bit de sentido de cuenta. DECEN=0 hace que el sentido de la cuenta sea ascendente. DCEN=1 hace que el sentido pueda ser ascendente o descendente.

Los autores, 2001; Edicions UPC, 2001.

182 Tabla 7.3 Registro T2CON para el control del Timer 2


(MSB)
TF2

Microcontroladores MCS-51 y MCS-251

Registro T2CON
EXF2 RCLK TCLK EXEN2 TR2

(LSB)
C/T2 CP/RL2

Bit TF2 EXF2 RCLK TCLK EXEN2

Comentario Bit de desbordamiento. TF2=1 al producirse un desbordamiento. Este bit no se activa si RCLK=1 o TCLK=1. Debe borrarse por software. Bit de entrada externa. EXF2 se pone a 1 lgico al producirse un flanco descendente en el terminal T2EX, siempre y cuando EXEN2 est habilitado. Bit de reloj en recepcin. RCLK se pone a 1 lgico cuando se produce un desbordamiento en el Timer 0. Bit de reloj en transmisin Bit de habilitacin de entrada externa. En general, si EXEN2=1 permite la activacin de EXF2 con un flanco de descendente en T2EX. Tambin realiza funciones especficas en todos los modos de funcionamiento del Timer. Bit de puesta en marcha y parada. TR2=1 pone en marcha el Timer 2. TR2=0 detiene el Timer 2. Bit de seleccin de temporizador/contador. Con C/T2=0 el Timer cuenta pulsos de reloj (12). Con C/T2=1 el Timer cuenta pulsos de la entrada T2. Bit de captura/recarga. Con CP/RL2=1 se produce una captura al aplicar un flanco negativo en T2EX, si EXEN2=1. Con CP/RL2=0 se produce una recarga al aplicar un flanco negativo en T2EX, si EXEN2=1. Si RCLK=1 o TCLK=1 se ignora CP/RL2 y se fuerza la recarga del Timer 2 al producirse un desbordamiento en su valor.

TR2 C/T2 CP/RL2

Tabla 7.4 Modos de trabajo del Timer 2

Modo Modo autorrecarga Modo captura Modo Baud Rate Modo Clock-out

RCLK o TCLK 0 0 1 X
X= Estado indeterminado

CP/RL2 0 1 X 0

T2OE 0 0 X 1

7.2.2.1 Modo captura El Timer 2 en el modo captura funciona como un temporizador o contador de 16 bits (figura 7.6). Cuando se produce un desbordamiento, al pasar todos los bits de TL2 y TH2 de uno a cero lgico, se activa el bit de rebasamiento TF2 del registro T2CON y se genera una interrupcin automtica. En este modo, si el bit EXEN2 del registro T2CON se pone a 1 lgico y se produce un flanco de bajada en el terminal T2EX del microcontrolador, el valor actual de los registros TH2 y TL2 se copia en los registros RCAP2H y RCAP2L del rea de SFR, hecho al que se le denomina captura. Al mismo tiempo, el flanco de bajada producido hace que el bit EXF2 del registro T2CON se ponga a 1 lgico y se genera una interrupcin automtica. As pues, en este modo las fuentes de interrupcin hacia la CPU pueden ser por medio del bit de rebasamiento TF2, o bien por medio del bit EXF2. En este ltimo caso, se puede considerar al terminal T2EX como una nueva fuente de interrupcin externa, al igual que /INT0 y /INT1. En el caso de que produzca una interrupcin, la rutina de RSI que se ejecuta

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

183

es la misma, tanto para el bit TF2, como para el bit EXF2, de forma que la rutina de RSI debe comprobar cul de las dos posibles interrupciones se ha activado. La puesta en marcha y la parada del Timer 2 se realiza con el bit TR2 del registro T2CON. Con TR2 a 1 lgico se pone en marcha el Timer, que queda habilitado para contar pulsos; con TR2 a 0 lgico se detiene el Timer.
XTAL1 12 0 T2 C/T2 TL2 1 TR2 Interrupcin TH2 TF2

RCAP2H RCAP2L EXF2 EXEN2

T2EX

Fig. 7.6 Modo captura del Timer 2

7.2.2.2 Modo autorrecarga El modo autorrecarga configura al Timer 2 como un temporizador o contador de 16 bits, con recarga automtica del valor contenido en los registros RCAP2L y RACP2H hacia los registros TL2 y TH2, respectivamente (figuras 7.7 y 7.8). En este modo de funcionamiento, el Timer 2 puede operar de dos formas diferentes: como un contador ascendente, o bien como un contador ascendente descendente, segn sea el valor del bit DCEN, Down counter enable bit del registro T2MOD. Para este ltimo caso, si DCEN est a 0 lgico el sentido de la cuenta es ascendente, y si DCEN est a 1 lgico el sentido de la cuenta es descendente. Se debe tener en cuenta que el bit DCEN por defecto, tras un reset o al iniciar el microcontrolador, se pone a 0 lgico.

a) Contador ascendente (DCEN=0) Cuando DCEN se pone a 0 lgico, el Timer 2 opera como un contador ascendente de 16 bits (figura 7.7). En este caso, la recarga del Timer 2, es decir, la copia de los registros RCAP2H y RCAP2L en los registros TH2 y TL2, respectivamente, se puede hacer por el desbordamiento del Timer, al activarse el bit TF2, o bien, al producirse un flanco de bajada en el terminal T2EX, siempre y cuando el estado del bit EXEN2 lo permita. En este ltimo caso, el flanco de bajada tambin puede causar la activacin del bit EXF2 y provocar una interrupcin. El bit DCEN, tras un reset del microcontrolador, se pone a 0 lgico, as que, por defecto el Timer 2 en el modo autorrecarga funciona como un contador ascendente de 16 bits.

Los autores, 2001; Edicions UPC, 2001.

184

Microcontroladores MCS-51 y MCS-251

XTAL1

12 0 TH2 1 TL2 TF2

T2 C/T2

TR2

RCAP2H RCAP2L

Interrupcin

T2EX EXEN2

EXF2

Fig. 7.7 Modo autorrecarga del Timer 2 con DCEN=0

b) Contador ascendente/descendente (DCEN=1) Cuando DCEN se pone a 1 lgico, el Timer 2 opera como un contador ascendente/descendente (figura 7.8), donde el sentido de la cuenta se determina mediante el estado lgico aplicado del terminal T2EX del microcontrolador. Cuando T2EX est a 1 lgico, el Timer 2 cuenta de forma ascendente, en cuyo caso, el Timer puede llegar a desbordamiento; se activa entonces el bit TF2, se produce una recarga del valor de los registros RCAP2H y RCAP2L hacia TH2 y TL2, respectivamente, y se genera una interrupcin automtica siempre y cuando se haya habilitado de forma previa. Cuando T2EX est a 0 lgico, el Timer 2 cuenta en sentido descendente, es decir, se decrementa su valor con cada pulso de entrada. En este sentido de la cuenta, el Timer 2 tambin puede llegar a un rebasamiento, que se produce cuando el contenido de los registros TH2 y TL2 llega a ser igual al valor almacenado en los registros RCAP2H y RCAP2L, respectivamente. En este caso, se activa el bit TF2, y se produce una peticin de interrupcin y una recarga del valor FFH en cada uno de los registros, TH2 y TL2. Al mismo tiempo, cuando se produce cualquiera de los dos tipos de desbordamiento mencionados, el bit EXF2 complementa su valor; es decir, si EXF2 est a 1 lgico, cambia su valor a 0 lgico, y viceversa. El bit EXF2 no genera peticin de interrupcin al microcontrolador, y se puede utilizar como el bit 17 del contador, es decir, se contempla el contador como un Timer de 17 bits (donde EXF2 es el bit 17).

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

185
Valor de recarga para la cuenta hacia abajo FFH FFH Complemento EXF2

XTAL1

12 0
TH2 TL2 TF2 Interrupcin

1 T2 C/T2
RCAP2H RCAP2L Valor de recarga para la cuenta hacia arriba

TR2
Sentido de la cuenta 1 = ascendente T2EX 0 = descendente

Fig. 7.8 Modo autorrecarga del Timer 2 con DCEN=0

7.2.2.3 Modo generador de baudios para el puerto serie (Baud Rate Generator Mode) En este modo, el Timer 2 queda configurado como generador de baudios para fijar la velocidad de transmisin del puerto de comunicacin serie del microcontrolador. Este modo se selecciona al activar los bits RCLK y/o TCLK de registro T2CON (tabla 7.4).

7.2.2.4 Modo Clock-out En el modo Clock-out el Timer 2 genera una seal de reloj por el terminal T2 del microcontrolador de frecuencia variable y simtrica (figura 7.9). El Timer 2 se incrementa con una frecuencia de valor FOSC/2 (la mitad de la frecuencia de reloj del microcontrolador), hasta que sufre un desbordamiento, y causa la recarga automtica de los registros TH2 y TL2 con el valor contenido en los registros RCAP2H y RCAP2L, respectivamente. En este modo el desbordamiento del Timer no genera peticin de interrupcin, como ocurre con los otros modos. La interrupcin, sin embargo, s que se genera al detectar un flanco de bajada en la entrada T2EX, siempre y cuando el bit EXEN2 est activado (figura 7.9). La frecuencia de la seal de reloj generada se establece modificando el valor de los registros RCAP2H y RCAP2L, segn la siguiente ecuacin: Frec _ reloj ] FOSC 4(65535RCAP 2H,RCAP 2L

El rango de frecuencias que se puede generar est comprendido entre los 61Hz y los 4MHz, para una frecuencia de reloj de 16MHz. A modo de resumen, para que el Timer 2 trabaje en modo Clock-out, el bit T2OE del registro T2MOD se debe poner a 1 lgico, el bit C/T2 del registro T2CON se debe poner a 0 lgico, y el bit TR2 debe estar a 1 lgico.

Los autores, 2001; Edicions UPC, 2001.

186

Microcontroladores MCS-51 y MCS-251

El Timer 2 se puede usar como generador de baudios para el puerto serie y, tambin de forma simultnea, como generador de reloj, aunque las frecuencias generadas no se pueden determinar de forma independiente, pues comparten los mismos registros de recarga.
XTAL1 12 0 TH2 1 TR2 C/T2 T2 TL2

RCAP2H RCAP2L

2 T2OE T2EX EXF2 Interrupcin EXEN2

Fig. 7.9 Modo Clock-out para el Timer 2

7.2.3 Timer 0, 1 y 2 como contador


Los Timers 0, 1 y 2 pueden contar pulsos procedentes de los terminales T0, T1 y T2, respectivamente. Para ello los bits C / T del registro TMOD, en el caso de los Timers 0 y 1, y el bit C / T 2 para el Timer 2, deben estar a 1 lgico. Los registros de los Timers se incrementan cada vez que se detecta, en los terminales T0, T1 y T2, una transicin de 1 a 0 lgico. El estado lgico de cada uno de estos terminales de entrada se comprueba en la fase 2 del estado 5, S5P2, de cada ciclo mquina. El valor de los registros de los Timers se incrementa cuando en un ciclo mquina se detecta un 1 lgico y un 0 lgico en el siguiente ciclo. El nuevo valor de los registros se muestra en el estado S3P1 del ciclo mquina siguiente al que se ha detectado la transicin. La mxima frecuencia del terminal de entrada es fclok/24, puesto que se tarda dos ciclos mquina en reconocer una transicin de 1 a 0 lgico. Para una frecuencia de reloj de 12MHz la mxima frecuencia de terminal T0, T1 o T2 es de 500kHz. Ejemplo 7.3 Refresco de cuatro dgitos de siete segmentos y teclado matricial En el captulo 5 se explicaba un ejemplo en el que se efectuaba la lectura de un teclado matricial (apartado 5.10.4), y tambin un ejemplo de un contador de piezas para una mquina de un proceso industrial (apartado 5.10.6). Estos dos ejemplos se pueden combinar en uno solo: es decir, un contador de piezas con un teclado matricial que da capacidad de configuracin al usuario. La figura 7.10 muestra el circuito, en el cual se adjunta al contador de piezas un teclado matricial de 8 teclas, formado por dos filas con cuatro teclas cada una.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog


Vcc
a

187
4511 (BCD-7seg) A0 a A1 A2 A3 /EL dp b

7405

87C51
P2.0 P0.0 P0.1 P0.2

Vcc R
a Millares

Ctodo comn Centenas Decenas

Unidades

R
nodo comn
dp

P2.7

P0.3

R
dp

Vcc

Sensor Cuenta P1.2

P0.4 P0.5 P0.6

Tr1

Tr2

Tr3

Tr4

Vcc

Sensor Descuenta P1.3 Reset /INT0 /INT1

P0.7

Up
P1.0 P1.1

Right

Enter

F1

Down

Left

Clear

F2

Fig. 7.10 Circuito del contador de piezas con teclado matricial del ejemplo 7.3

Los cuatro dgitos de la figura 7.10 se deben encender de manera secuenciada para que el nmero se distinga correctamente, tal y como se explicaba en el apartado 5.10.6. Al mismo tiempo, la lectura del teclado matricial tambin precisa de una secuencia de escrutinio, en la cual se comprueba, columna a columna, si se han pulsado las teclas asociadas. En consecuencia, en el circuito de la figura 7.10, se desea utilizar la secuencia de refresco de los cuatro dgitos de siete segmentos, para efectuar, a la vez, la secuencia de escrutinio de las columnas del teclado matricial. Esta secuencia se llevar a cabo automticamente mediante las interrupciones del Timer 2. Las filas del teclado matricial pueden activar la entrada de interrupcin /INT1 mediante la puerta AND de la figura 7.10. La secuencia situar un 0 lgico en la patilla P0.7, mientras las patillas P0.4, P0.5 y P0.6 permanecen a 1 lgico, pondr el transistor Tr4 en saturacin y encender el dgito correspondiente a las unidades. Si en este momento se pulsan las teclas F1 o F2, se provocar una interrupcin en /INT1. Transcurrido un tiempo determinado, el 0 lgico se sita en el terminal P0.5, mientras los otros terminales estn a 1 lgico; se pone, as, el transistor Tr3 en saturacin y se enciende el dgito de las decenas. De esta manera se procede hasta que se pone un 0 lgico en la patilla P0.7 y se enciende el dgito correspondiente a los millares. En este caso, la secuencia se repetir con una frecuencia de 1 kHz, que establecern las interrupciones del Timer 2. Cada vez que llega un pulso de cuenta se debe incrementar el valor del contador, y cuando se activa el sensor de descuenta se debe decrementar el contador. Si el valor del contador sobrepasa el valor 9999, ste no se incrementar, y si llega un pulso de descuenta cuando el valor es de 0000, el contador no se decrementar. La tecla reset activa la interrupcin /INT0 y pone a cero el valor del contador.

Los autores, 2001; Edicions UPC, 2001.

188

Microcontroladores MCS-51 y MCS-251

Cuando se detecte que una tecla ha sido pulsada se mostrar un carcter determinado que indique, en el dgito conectado al puerto P2, la tecla pulsada. Para la tecla Up se mostrar el carcter U, para la tecla Rigth se mostrar el carcter r, para Enter el carcter E, para F1 el carcter 1., para Down el carcter d, para Left el carcter L, para Clear el carcter C y para F2 el carcter 2.. El dgito conectado al puerto P2 mostrar siempre el carcter correspondiente a la ltima tecla pulsada.
;********************************************************************** ; Refresco de 4 dgito de siete segmentos y de teclado matricial ;********************************************************************** ORG 0H ; Vectorizacin de interrupciones LJMP Inicio ORG 03H LJMP RSI_Int0 ORG 013H LJMP RSI_Int1 ORG 02BH LJMP RSI_Timer2 ;********************************************************************** ; Rutina de Inicio ;********************************************************************** Inicio: MOV P2, #0 ;Apaga el dgito conectado a P2 SETB IT0 ;Interrupcin /INT0 activa por flanco descendente SETB IT1 ;Interrupcin /INT1 activa por flanco descendente SETB PX1 ;Asigna prioridad alta a /INT1 SETB EX0 ;Habilita interrupcin de /INT0 SETB EX1 ;Habilita interrupcin de /INT1 SETB ET2 ;Habilita interrupcin del Timer 2 MOV T2CON, #0 ;Timer 2 funcionando en 16 bits con autorrecarga MOV T2MOD, #0 ;Timer 2 (DCEN=0) MOV RCAP2L, #05H ;Carga recarga para interrumpir cada 250 [s MOV RCAP2H, #0FFH ; en RCAP2L y RCAP2H MOV TL2, #05H MOV TH2, #0FFH SETB EA ;Habilita bit de interrupcin general SETB TR2 ;Pone en marcha el Timer 2 ;********************************************************************** ; Rutina Principal ;********************************************************************** Principal: JNB P1.2, Conta ;Comprueba si se ha pulsado Cuenta JNB P1.3, Decre ;Comprueba si se ha pulsado Descuenta MOV P2, B ;Carga B en P2, para mostrar en dgito SJMP Principal ;Bucle infinito ;********************************************************************** ; Rutina de servicio de /INT0 ;********************************************************************** RSI_Int0: MOV R0, #0 ;Borra unidades MOV R1, #0 ;Borra decenas MOV R2, #0 ;Borra centena. MOV R3, #0 ;Borra millares MOV P2, #0 ;Apaga dgito conectado a P2 MOV B, #0 ;Borra registro B RETI ;********************************************************************** ; Rutina de servicio de /INT1 ;********************************************************************** RSI_Int1: JNB P1.0, Fila_0 ;Ha pulsado una tecla de la fila 0? SJMP Fila_1 ;Si no, debe ser la fila 1

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog JNB P0.4, Tec_Up JNB P0.5, Tec_Rigth JNB P0.6, Tec_Enter SJMP Tec_F1 Fila_1: JNB P0.4, Tec_Down JNB P0.5, Tec_Left JNB P0.6, Tec_Clear SJMP Tec_F2 Tec_Up: MOV B, #0011 1110b ;Leds b, c, d, e y f encendidos, carcter U RETI Tec_Rigth: MOV B, #0101 0000b ;Leds e y g encendidos, carcter r RETI Tec_Enter: MOV B,#0111 1001b ;Leds a, d, e, f y g encendidos, carcter E RETI Tec_F1: MOV B, #1000 0110b ;Leds b, c y dp encendidos, carcter 1. RETI Tec_Down: MOV B, #0101 1110b ;Leds b, c, d, e y g encendidos, carcter d RETI Tec_Left: MOV B, #0011 1000b ;Leds d, e y f encendidos, carcter L RETI Tec_Clear: MOV B, #0011 1001b ;Leds b, c, d, e y f encendidos, carcter U RETI Tec_F2: MOV B, #1101 1011b ;Leds a, b, d, e, g y dp encendidos, carcter 2. RETI ;********************************************************************** ; Rutina de servicio del Timer 2 ;********************************************************************** RSI_Timer2:ORL P0, #0F0H ;Apaga todos los dgitos T_Uni: CJNE R5, #0, T_Dece INC R5 SJMP T2_Uni T_Dece: CJNE R5, #1, T_Cent INC R5 SJMP T2_Dec T_Cent: CJNE R5, #2, T_Millar INC R5 SJMP T2_Cent T_Millar: MOV R5, #0 SJMP T2_Millar T2_Uni: MOV A, R0 ;Carga en A ORL A, #0F0H ;Fuerza los 4 bits altos a 1 lgico MOV P0, A ;Pone unidades en P0 (4 bits altos de R0 son cero) CLR P0.7 ;Enciende dgito unidades. Tr4 en saturacin SJMP T2_Salir T2_Dec: MOV A, R1 ;Carga en A ORL A, #0F0H ;Fuerza los 4 bits altos a 1 lgico MOV P0, A ;Pone decenas en P0 (4 bits altos de R0 son cero) CLR P0.6 ;Enciende dgito decenas. Tr3 en saturacin SJMP T2_Salir T2_Cent: MOV A, R2 ;Carga en A ORL A, #0F0H ;Fuerza los 4 bits altos a 1 lgico MOV P0, A ;Pone centenas en P0 (4 bits altos de R0 son cero) CLR P0.5 ;Enciende dgito centenas. Tr2 en saturacin SJMP T2_Salir T2_Millar: MOV A, R3 ;Carga en A ORL A, #0F0H ;Fuerza los 4 bits altos a 1 lgico MOV P0, A ;Pone millares en P0 (4 bits altos de R0 son cero) CLR P0.4 ;Enciende dgito millares. Tr1 en saturacin T2_Salir: CLR TF2 ;Borra TF2 RETI Fila_0:

189

Los autores, 2001; Edicions UPC, 2001.

190

Microcontroladores MCS-51 y MCS-251 ;********************************************************************** ;Rutina Conta ;********************************************************************** Conta: CJNE R0, #9, Unidad ;Compara unidad CJNE R1, #9, Decena ;Compara decena CJNE R2, #9, Centena ;Compara centena CJNE R3, #9, Millar ;Compara millar SJMP Principal Unidad: INC R0 ;Incrementa unidades SJMP Principal Decena: MOV R0, #0 ;Pone a 0 las unidades INC R1 ;Incrementa decenas SJMP Principal Centena: MOV R0, #0 ;Pone a 0 unidades y decenas MOV R1, #0 INC R2 ;Incrementa centenas SJMP Principal Millar: MOV R0, #0 ;Pone a 0 unidades, decenas y centenas MOV R1, #0 MOV R2, #0 INC R3 ;Incrementa millares SJMP Principal ;********************************************************************** ;Rutina Decre ;********************************************************************** Decre: CJNE R0, #0, D_uni ;Compara unidad CJNE R1, #0, D_dece ;Compara decena CJNE R2, #0, D_cent ;Compara centena CJNE R3, #0, D_mill ;Compara millar LJMP Principal D_uni: DEC R0 ;Decrementa unidad LJMP Principal D_dece: MOV R0, #9 ;Pone a 9 unidad DEC R1 ;Decrementa decena LJMP Principal D_cent: MOV R0, #9 ;Pone a 9 unidad MOV R1, #9 ;Pone a 9 decena DEC R2 ;Decrementa centena LJMP Principal D_mill: MOV R0, #9 ;Pone a 9 unidad MOV R1, #9 ;Pone a 9 decena MOV R2, #9 ;Pone a 9 centena DEC R3 ;Decrementa millar LJMP Principal

En la rutina de Inicio el puerto P2 se pone a cero, debido a que inicialmente est a FFH (o sea, todos sus terminales a 1 lgico); por tanto, debe ponerse a cero para que ninguno de los leds del dgito est encendido. En la rutina, las entradas /INT0 y /INT1 se configuran activas por flanco descendente y se habilitan las interrupciones de /INT0, de /INT1 y del Timer 2. El Timer 2 se configura para que funcione como un temporizador de 16 bits con autorrecarga; para ello se colocan los bits RCLK, TCLK y CP/RL2, del registro T2CON, a 0 lgico. El Timer cuenta pulsos internos del reloj del microcontrolador, por lo que el bit C/T2 del registro T2CON se pone a 0 lgico. En el Timer 2 es necesario inhibir las interrupciones procedentes del terminal T2EX (figura 7.7); por tanto, el bit EXEN2 tambin se pone a 0 lgico. Por ltimo, para que el temporizador funcione slo en sentido ascendente, el bit DCEN del registro T2MOD se pone a 0 lgico.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

191

Para que la secuencia de refresco de los dgitos sea de 1kHz, el valor de recarga del Timer ha de ser de FF05H, pues el perodo de la secuencia es de 1ms y, al haber cuatro dgitos, el tiempo que debe permanecer encendido cada dgito es de 0.250 ms. FF05H es el resultado de restar 250 (o FAH) de 64k (o FFFFH). El puerto P0 inicialmente tambin tiene todos sus terminales en estado 1 lgico, lo que no supone ningn inconveniente, pues las puertas inversoras conectadas a los transistores Tr1, Tr2, Tr3 y Tr4, aseguran que los transistores estn en corte y los dgitos permanezcan apagados. La rutina de RSI del Timer 2 utiliza el registro R5 como contador en base 3, y determina el dgito que se va a encender, segn sea el valor de R5. Si vale cero se enciende el dgito correspondiente a las unidades, si vale 1 se enciende el dgito de las decenas, si vale 2 se enciende el dgito de las centenas y si vale 3 se enciende el dgito de los millares. El valor de R5 se actualiza con la instruccin INC, de forma que cada vez que la rutina de RSI se ejecuta, el registro se incrementa en una unidad, excepto cuando vale 3, que se pone a cero. El contenido de los registros R0, R1, R2 o R3 se carga en el acumulador y se fuerzan sus cuatro bits altos a 1 lgico mediante una instruccin ORL, de manera que todos los dgitos estn apagados y se encienda el dgito que corresponda con la instruccin CLR. La rutina principal est formada por un bucle infinito en el cual se comprueba el estado de los sensores cuenta y descuenta, y donde se pone, en el dgito conectado a P2, el carcter de la tecla pulsada en el teclado matricial.

7.3 Temporizadores para la MCS-251


Los microcontroladores de la familia MCS-251 disponen de 3 temporizadores/contadores de 16 bits, denominados Timer 0, Timer 1 y Timer 2. Estos perifricos pueden ser configurados de forma individual para operar en diversos modos de trabajo, bien como temporizadores o bien como contadores. Cuando operan como temporizadores, cada Timer se incrementa una vez cada cierto intervalo de tiempo; cuando funcionan como contadores se incrementan cada vez que ocurre una transicin negativa en un pin concreto del microcontrolador. Por otra parte, el microcontrolador incorpora un temporizador watchdog que permite generar un reset por software, si se produce alguna anomala en la ejecucin del programa. Cada Timer est compuesto por dos registros de 8 bits ubicados en el rea de registros de funcin especfica, SFR. En concreto, el Timer 0 est formado por los registros TH0 y TL0, el Timer 1 por los registros TH1 y TL1 y el Timer 2 por los registros TH2 y TL2 (tabla 7.1). Tambin se dispone de cuatro registros ubicados en el rea SFR que permiten controlar y programar adecuadamente las prestaciones de funcionamiento de los Timers. Los registros de programacin asociados al Timer 0 y al Timer 1 son: TMOD, registro de control de modo del temporizador/contador, y TCON, registro de control del temporizador/contador.

Los autores, 2001; Edicions UPC, 2001.

192

Microcontroladores MCS-51 y MCS-251

Los registros de programacin para el Timer 2 son: T2MOD, registro de control de modo del Timer 2, y T2CON, registro de control del Timer 2.
Tabla 7.5 Registros asociados a los Timers 0, 1 y 2 y al timer watchdog de la familia MCS-251

Mnemnico
TL0 TH0 TL1 TH1 TL2 TH2 TCON TMOD T2CON T2MOD RCAP2L RCAP2H WDTRST

Descripcin
Registros del Timer 0 Registros del Timer 1 Registros del Timer 2 Registro de control de los Timers 0 y 1 Registro de control de modo de los Timers 0 y 1 Registro de control del Timer 2 Registro de control de modo del Timer 2 Registros de recarga y captura del Timer 2 Registro de Timer watchdog

Direccin
S:08AH S:08CH S:08BH S:08DH S:0CCH S:0CDH S:088H S:089H S:0C8H S:0C9H S:0CAH S:0CBH S:0A6H

7.4 Funcionamiento de los Timers


En la figura 7.11 est representado el esquema funcional bsico de los Timers 0, 1 y 2. La parte central del Timer est constituida por dos registros de 8 bits: THx y TLx (x = 0, 1 y 2), conectados en cascada para formar un temporizador de 16 bits.
XTAL1 12 Desbordamiento 0 1 Tx x = 0, 1 2 C/Tx TRx THx (8 bits) TLx (8 bits) TFx Peticin de interrupcin

Fig. 7.11 Estructura bsica de los Timers 0, 1 y 2

Los Timers pueden ser programados para que trabajen como temporizador o como contador, mediante el bit C/Tx, con x = 0, 1 2, dependiendo del Timer de que se trate. En la tabla 7.6 se indica la ubicacin de cada uno de estos bits.
Tabla 7.6 Ubicacin de los bits C/Tx

Bit
C/T0 C/T1 C/T2

Ubicacin
TMOD.2 TMOD.6 T2CON.1

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

193

7.4.1 Funcionamiento como temporizador Cuando se pone el bit C/Tx a cero, el Timer correspondiente trabaja como temporizador. En este caso, el Timer se incrementa en una unidad cada doce perodos de seal de reloj o, lo que es lo mismo, cada 6 estados. Las nicas excepciones a este comportamiento estn en dos modos de funcionamiento del Timer 2, Baud Rate y Clock-out, donde el incremento es cada dos perodos de reloj. Este modo de operacin se utiliza bsicamente para medir intervalos temporales de forma relativamente fcil. Ejemplo 7.4 Diseo de una rutina de retardo con el Timer 0 Se desea disear una rutina de retardo de 1 ms de duracin utilizando el Timer 0, con una frecuencia de reloj de 12MHz. En este caso el Timer se incrementa en una unidad cada microsegundo, luego, para temporizar 1ms, el Timer 0 se deber incrementar 1.000 veces. De esta forma, controlando el nmero de incrementos que sufre el Timer se obtiene la rutina de retardo deseada.
;**************************************************************************** ; RUTINA DE RETARDO ;**************************************************************************** ORG FF:0000H ; ... CALL RETARDO ; ORG FF:0100H ; La rutina de retardo empieza en la direccin FF:1000H RETARDO: MOV R0,TH0 ; Se carga el valor del Timer en el registro WR0 MOV R1,TL0 ; MOV WR2,#1000D ; Se carga en el registro WR2 el valor 1.000 decimal CMP WR2,WR0 ; Se compara el contenido del Timer 0 con 1.000 JG RETARDO ; Si el contenido del Timer 0 es menor o igual a 1.000 ; continuamos en la rutina de retardo RET ; En el momento que el contenido del Timer 0 sea mayor a 1.000 se termina la rutina de retardo

7.4.2 Funcionamiento como contador Para que un Timer funcione como contador se debe programar su bit C/Tx a 1 lgico. En este caso, el Timer se incrementa en una unidad cada vez que se aplica un flanco de bajada en un pin determinado. En la tabla 7.7 se especifica el pin asociado a cada Timer.
Tabla 7.7 Entradas externas de cuenta de los Timers 0, 1 y 2

Pin
T0 T1 T2

Tipo
I I I/O

Descripcin
Entrada externa de reloj del Timer 0. Entrada externa de reloj del Timer 1. Entrada/salida externa de reloj del Timer 2.

Ubicacin
P3.4 P3.5 P1.0
1

La CPU comprueba el estado de las entradas externas de los Timers en cada ciclo de perifrico , en concreto en el segundo perodo del estado 5. Cuando la CPU detecta un 1 lgico en un ciclo y un cero lgico en el siguiente ciclo, el Timer correspondiente se incrementa en una unidad (figura 7.12). El
1

Un ciclo de perifrico equivale a 12 perodos de reloj agrupados en 6 estados, cada uno de ellos compuesto por dos perodos.

Los autores, 2001; Edicions UPC, 2001.

194

Microcontroladores MCS-51 y MCS-251

valor del Timer se actualiza en el primer perodo del estado 3 del ciclo de perifrico que viene despus de detectar el flanco de bajada.
Ciclo de perifrico S5P5 1 T2, T1, T0 0 Ciclo de perifrico S5P5

Fig. 7.12 Proceso de incremento de un Timer programado como contador

Teniendo en cuenta que un ciclo de perifrico tiene una duracin de 12 perodos de reloj, se necesitan, como mnimo, 24 perodos de reloj para reconocer un flanco de bajada, por lo que la mxima velocidad de cuenta es de fclock/24.

7.5 Timer 0 y Timer 1


Para controlar el funcionamiento de los Timers 0 y 1 se utilizan los registros TMOD y TCON (tablas 7.8 y 7.9). Los cuatro bits de menor peso del registro TMOD estn asociados al Timer 0 y los cuatro bits de mayor peso controlan el funcionamiento del Timer 1. Por otra parte, los bits 4 y 5 del registro TCON estn relacionados con el Timer 0, y los bits 6 y 7 con el Timer 1. Estos bits permiten programar el modo de funcionamiento de los Timers, controlar su puesta en marcha, programar su modo de operacin, como contador o como temporizador, y detectar su desbordamiento. 7.5.1 Habilitacin de los Timers 0 y 1 Para habilitar el funcionamiento de los Timers 0 o 1, se debe poner a 1 lgico el bit TR0 o el bit TR1, respectivamente (tabla 7.9). Para que el Timers 0 o el Timer 1 funcionen se debe cumplir, adems, una segunda condicin. En el caso del Timer 0 se debe cumplir que el bit GATE0 (tabla 7.8) est a 0 lgico, o bien, que la entrada de interrupcin externa cero /INT0, que est ubicada en el pin P3.2, est a 1 lgico. Por otra parte, el Timer 1 funciona cuando el bit GATE1 (tabla 7.8) est a 0 lgico, o se ha puesto a 1 lgico el pin correspondiente a la entrada de interrupcin externa uno /INT1, que est ubicada en el pin P3.3. Esta segunda condicin permite controlar el funcionamiento del Timer mediante dos estrategias diferentes: ) Control por software: programando el valor lgico del bit GATEx (con x = 0 1). ) Control por hardware: aplicando un nivel de tensin adecuando al pin /INTx (con x = 0 1).

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

195

Tabla 7.8 Registro de control de modo, TMOD, de los Timers 0 y 1

TMOD b7 GATE1 Nmero de bit


7

Direccin: S:089H b6 b5 C/T1 M11

b4 M01

Valor de reset: 0000 0000b b3 b2 b1 GATE0 C/T0 M10 Funcin

b0 M00

Nombre del bit


GATE1

6 5, 4

2 1, 0

Bit GATE del Timer 1. Con GATE1 = 0, el Timer 1 se pone en marcha si TR1=1. Si GATE1 = 1 y TR1 = 1, el Timer 1 se pone en marcha colocando un 1 lgico en el pin /INT1 (P3.3). C/T1 Seleccin de temporizador/contador del Timer 1. C/T1 = 0: el Timer 1 funciona como temporizador. C/T1 = 1: el Timer 1 funciona como contador. M11, M01 Selector de modo del Timer 0. M11 M01 0 0 Modo 0: El Timer 0 funciona como un Timer de 13 bits. 0 1 Modo 1: El Timer 0 funciona como un Timer de 16 bits. 1 0 Modo 2: El Timer 0 funciona como un Timer de 8 bits (TL0) y se recarga con el valor que hay en TH0 cuando sufre desbordamiento. 1 1 Modo 3: El Timer se para. GATE0 Bit GATE del Timer 0 Cuando GATE0 = 0, el Timer 1 se pone en marcha con TR0=1. Si GATE0 = 1 y TR0 = 1, el Timer 0 se pone en marcha colocando un 1 lgico en el pin /INT0 (P3.2). C/T0 Seleccin de temporizador/contador del Timer 0. C/T0 = 0: el Timer 0 funciona como temporizador. C/T0 = 0: el Timer 0 funciona como contador. M10, M00 Selector de modo del Timer 0. M10 M00 0 0 Modo 0: El Timer 0 funciona como un Timer de 13 bits. 0 1 Modo 1: El Timer 0 funciona como un Timer de 16 bits. 1 0 Modo 2: El Timer 0 funciona como un Timer de 8 bits (TL0) y se recarga con el valor que hay en TH0 cuando sufre desbordamiento. 1 1 Modo 3: El Timer 0 funciona como dos Timers de 8 bits: TL0 y TH0.

Tabla 7.9 Registro de control, TCON, de los Timers 0 y 1

TCON b7 TF1

Direccin: S:088H b6 b5 TR1 TF0

b4 TR0

Valor de reset: 0000 0000b b3 b2 b1 IE1 IT1 IE0 Funcin

b0 IT0

Nmero Nombre de bit del bit


7 TF1

6 5

TR1 TF0

TR0

Flag de desbordamiento del Timer 1. Se pone a 1 cuando el Timer 1 sufre desbordamiento, o sea cuando pasa de la combinacin todo unos a la combinacin todo ceros. Flag de puesta en marcha del Timer 1. Cuando est a 1 lgico el Timer 1 est habilitado para funcionar, en caso contrario esta parado. Flag de desbordamiento del Timer 0. Se pone a 1 cuando el Timer 0 sufre desbordamiento, o sea cuando pasa de la combinacin todo unos a la combinacin todo ceros. Flag de puesta en marcha del Timer 0. Cuando est a 1 lgico el Timer 0 est habilitado para funcionar; en caso contrario esta parado.

Los autores, 2001; Edicions UPC, 2001.

196

Microcontroladores MCS-51 y MCS-251

Dependiendo de las caractersticas de la aplicacin que se quiera desarrollar, se debe realizar un control del Timer por software, o bien por hardware. Ejemplo 7.5 Control por hardware del Timer 0 En este ejemplo se trata de realizar con el microcontrolador 8XC251Sx una de las pruebas del control de calidad de una produccin de bateras de plomo-cido para coches. Esta prueba consiste en someter a la batera a una descarga de alta intensidad, al mismo tiempo que se mide el tiempo durante el cual la batera es capaz de suministrar ms de 400A manteniendo una tensin superior a 12 voltios. Si este tiempo est entre los 20ms y los 30ms, la batera se considera en buen estado; en caso contrario, se considera defectuosa. Este tiempo se puede medir utilizando uno de los Timers del microcontrolador, por ejemplo el Timer 0. Para realizar esta medida se monta el dispositivo mostrado en la figura 7.13 que incorpora un sensor de corriente, un sensor de tensin y una puerta AND cuya salida se ha conectado al pin P3.2, /INT0, para poder controlar mediante hardware el Timer 0. El sensor de corriente se activa cuando la corriente es mayor o igual a 400A. Por otra parte, el sensor de tensin se activa para una tensin mayor o igual a 12V. El nivel activo de ambos sensores es 1 lgico, de forma que, cuando los dos estn activos, la salida de la puerta AND es 1 lgico. La prueba del control de calidad exige medir el tiempo en que ambos detectores estn activos en una situacin de descarga brusca. Esta aplicacin requiere un control por hardware del Timer 0, de forma que se incremente durante todo el tiempo que los dos sensores permanezcan simultneamente activos, o sea, durante todo el tiempo que la entrada P3.2 est a 1 lgico.
8XC251
P3.2, INT0

Detector de tensin R Detector de corriente

P3.2

+ 12V

Fig. 7.13 Dispositivo de control de calidad de la batera

Cuando alguno de los dos sensores pase a cero lgico, la salida de la puerta AND pasar a cero y el Timer 0 detendr su funcionamiento. A partir del nmero de incrementos que ha sufrido el Timer 0 durante el tiempo que ha estado funcionando, se puede determinar si la batera es vlida, o si, por el contrario, est defectuosa. En concreto, el intervalo temporal que se desea medir est comprendido entre 20ms y 30ms. Si, por ejemplo, la frecuencia de la seal de reloj es de 12MHz, el temporizador se incrementa una vez cada 1s. Por tanto, 20ms se corresponden con 20.000 incrementos y 30ms se corresponden con 30.000 incrementos. La batera pasar de forma positiva el control de calidad siempre que el nmero de incrementos que haya sufrido el Timer 0, durante el tiempo en que los dos sensores estn activos, est comprendido entre 20.000 y 30.000. En la figura 7.14 est representado el diagrama de flujo del programa que controla el

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

197

funcionamiento de esta aplicacin. Bsicamente, el programa comienza con instrucciones que inicializan a cero los registros del Timer 0, TH0 y TL0. A continuacin se programan adecuadamente los registros TMOD y TCON para que el Timer 0 trabaje en modo 1, como temporizador, y controlado por hardware (figura 7.15). El programa contina con un par de instrucciones de salto condicional que tienen como objetivo detectar el intervalo de activacin simultnea de los dos sensores. Una vez que ha finalizado la prueba, se compara el contenido de los registros del Timer 0, TH0 y TL0, con los valores 20.000 y 30.000, para determinar si el estado de la batera es correcto.
INICIO

TMOD
TIMER 0 TEMPORIZADOR CONTROL HARDWARE GATE1 C/T1 0 0 M11 0 M10 GATE0 C/T0 0 1 0 M10 0 M00 1

P3.2=0? NO

SI

Habilitacin del funcionamiento del Timer 0 por hardware Timer 0 programado como temporizador Timer 0 programado en modo 1

P3.2=1? NO

SI

TCON
TF1 SI TR1 TF0 TR0 IE1 IT1 IE0 IT0

TIMER 0<20.000? NO SI TIMER 0>30.000? NO BATERA CORRECTA BATERA DEFECTUOSA

Habilitacin del funcionamiento del Timer 0 Puesta a cero del flag de interrupcin del Timer 0

Fig. 7.15 Programacin y habilitacin del Timer 0

Fig. 7.14 Diagrama de flujo de la aplicacin


;******************************************************************************* ; PROGRAMA DE CONTROL CALIDAD DE BATERAS ;******************************************************************************* ORG FF:0000H ; El programa comienza en la direccin FF:0000H MOV TH0,#00H ; Se inicializa los registros del Timer 0 a cero . MOV TL0,#00H ; MOV TMOD,#0AH ; Se programa el Timer 0 en modo 1 como temporizador y MOV TCON,#10H ; controlado por hardware. SALT1: JNB P3.2, SALT1 ; Se espera la activacin de la salida de la puerta AND. SALT2: JB P3.2, SALT2 ; Se espera durante el tiempo que est activa la salida de la puerta AND. MOV R0,TH0 ; MOV R1,TL0 ; CMP WR0,#20000D ; Se compara el contenido del Timer 0 con 20.000. JC DEFEC ; Salta si es menor que 20.000. CMP WR0,#30000D ; Salta si el contenido del Timer es mayor que 30.000.

Los autores, 2001; Edicions UPC, 2001.

198
JLE CORRECTA DEFEC: SETB P0.0 CORRECTA: NOP

Microcontroladores MCS-51 y MCS-251 ; Salta si es menor o igual que 30.000. ; Si la batera est defectuosa se pone a 1 el pin P0.0.

Por otra parte, un ejemplo clsico de control del Timer mediante programa es la realizacin de rutinas de retardo como la explicada en el apartado 7.4.1. 7.5.2 Desbordamiento de los Timers 0 y 1 Los Timers 0 y 1 se incrementan desde el valor inicial que se ha cargado en sus registros, THx y TLx, hasta que se produce un desbordamiento de los mismos. El desbordamiento tiene lugar cuando el contenido de los registros THx y TLx llega al valor mximo posible, combinacin todo unos, y se incrementa una vez ms. El desbordamiento de un Timer se detecta fcilmente mediante los flags de desbordamiento del registro TCON, TF0 para el Timer 0 y TF1 para el Timer 1 (tabla 7.9). Detectar el desbordamiento de los Timers es muy importante para que la aplicacin funcione correctamente. Ejemplo 7.6 Temporizacin de 0.1s mediante el Timer 1 En este ejemplo se debe temporizar 0.1s utilizando el Timer 1 de un microcontrolador 8XC251Sx que funciona con un reloj de 12MHz. Con esta frecuencia de reloj el Timer 1 se incrementa en una unidad cada microsegundo. Por tanto, para temporizar 0.1s el Timer 1 debe incrementarse 100.000 veces. Si el Timer se programa en modo 1 y se ha cargado con el valor inicial cero, sufre desbordamiento cuando se incrementa 216 = 65.536 veces. Una vez sufrido desbordamiento, el Timer 1 se debe incrementar 34.464 veces ms para llegar a contabilizar los 100.000 incrementos necesarios. En la figura 7.16 est representado el diagrama de flujo del programa que controla esta temporizacin. El programa comienza con instrucciones que inicializan a cero los registros del Timer 1, TH1 y TL1. A continuacin se programa adecuadamente el registro TMOD para que el Timer 1 trabaje en modo 1, como temporizador y controlado por software (figura 7.17). Tambin se programa el registro TCON para poner a cero el flag de desbordamiento del Timer 1, TF1, y para habilitar su funcionamiento. Una vez puesto en marcha el Timer, se debe detectar el momento en el que ste sufre desbordamiento. Esto se consigue fcilmente mediante una instruccin de salto condicional: la condicin de salto debe ser el valor del flag de desbordamiento TF1. Mientras este flag est a cero el programa ejecuta el salto de forma continuada. Cuando el Timer 1 rebasa, el flag se pone a 1, la condicin de salto ya no se cumple y por lo tanto no se efecta dicho salto. Llegados a este punto el Timer 1 deber incrementarse 34.464 veces ms para contabilizar los 100.000 incrementos correspondientes a un intervalo de 0.1s. Las siguientes instrucciones del programa colocan a cero el flag de desbordamiento, detienen el funcionamiento del Timer 1 e inicializan su contenido con el valor adecuado para que al incrementarse 34.464 veces llegue a desbordamiento. Este valor es 216 34.464 =31.072d = 7960H.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

199

INICIO

TMOD
GATE1 C/T1 M11 M10 GATE0 C/T0 M10 M00

0
TIMER 1 TEMPORIZADOR CONTROL SOFTWARE

Timer 1 programado en modo 1 Timer 1 programado como temporizador Habilitacin del funcionamiento del Timer 1 por software

TF1=0?

SI

NO INICIALIZAR EL TIMER 1 CON 31.072d

TCON
TF1=0? SI

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

NO

Habilitacin del funcionamiento del Timer 1


DETENER EL TIMER 1

Puesta a cero del flag de interrupcin del Timer 1

Fig. 7.16 Diagrama de flujo de la aplicacin

Fig. 7.17 Programacin y configuracin del Timer 1

;****************************************************************************** ; PROGRAMA DE TEMPORIZACIN DE 0.1s ;****************************************************************************** ORG FF:0000H ; El programa comienza en la direccin FF:0000H MOV TH1,#00H ; Se inicializa los registros del Timer 1 a cero. MOV TL1,#00H ; MOV TMOD,#10H ; Se programa el Timer 1 en modo 1 como temporizador y MOV TCON,#40H ; controlado por hardware. SALT1: JNB TF1, SALT1 ; Se espera la activacin del flag de desbordamiento TF1. CLR TF1 ; Se pone a cero el flag TF1. MOV TH0,#79H ; Se inicializan los registros del Timer 1 con el valor MOV TL0,#60H ; adecuado para que rebase al incrementarse 34.464 veces. SALT1: JNB TF1, SALT1 ; Se espera la activacin del flag de desbordamiento TF1. NOP ; Ha finalizado la temporizacin de 0.1s.

7.5.3 Modos de funcionamiento de los Timers 0 y 1 Los Timers 0 y 1 pueden funcionar en cuatro modos de trabajo distintos, que se seleccionan programando adecuadamente los bits M00 y M10 para el Timer 0, y los bits M01 y M11 para el Timer 1 del registro TCON (tabla 7.8). a) Modo 0: Temporizador/contador de 13 bits En este modo de trabajo los Timers 0 y 1 funcionan como un contador de 13 bits, implementado mediante los 8 bits del registro THx y los 5 bits de menor peso del registro TLx. En este modo de trabajo se ignoran los tres bits de mayor peso del registro TLx. En la figura 7.18 se presenta el esquema de funcionamiento de los Timers 0 y 1 para los modos de funcionamiento 0 y 1.

Los autores, 2001; Edicions UPC, 2001.

200
XTAL1 12

Microcontroladores MCS-51 y MCS-251

Desbordamiento 0 1 Tx C/Tx TRx GATEx INTx THx (8 bits) TLx (8 bits) TFx

Peticin de interrupcin

Modo 0: Temporizador/contador de 13 bits Modo 1: Temporizador/contador de 16 bits x=01

Fig. 7.18 Modos 0 y 1 para los Timers 0 y 1

Ejemplo 7.7 Generacin de una seal cuadrada En este ejemplo se trata de generar una seal cuadrada utilizando el Timer 0 programado en modo cero, con una frecuencia de la seal de reloj de 12MHz. La funcin del Timer, en esta aplicacin, ser la de controlar la duracin del perodo de la onda cuadrada. La idea es inicializar el Timer con el valor cero, ponerlo en funcionamiento y, cada vez que rebase, complementar el valor lgico del pin P0.0, de forma que, con los sucesivos desbordamientos del Timer 0, se genere la onda cuadrada en el pin P0.0 (figura 7.19).
8XC251

P0.0

Fig. 7.19 Esquema del generador de onda cuadrada

Si la frecuencia de reloj es de 12MHz, el Timer 0 se incrementa una vez cada microsegundo, por lo que tarda en rebasar 213s, o sea, 8.192ms. Esto significa que cada semiperiodo de la onda cuadrada tiene una duracin aproximada de 8.2ms. En la figura 7.20 est representado el diagrama de flujo del programa que controla la generacin de la onda cuadrada. El programa comienza con instrucciones que inicializan a cero los registros del Timer 0, TH0 y TL0. Seguidamente se programa adecuadamente el registro TMOD para que el Timer 0 trabaje en modo 0, como temporizador y controlado por software. Tambin se programa el registro TCON para poner a cero el flag de desbordamiento del Timer 0, TF0, y para habilitar el funcionamiento del Timer 0. Una vez puesto en marcha el Timer, se debe detectar el momento en el que sufre desbordamiento. Esto se consigue fcilmente mediante una instruccin de salto condicional, donde la condicin de salto es el valor del flag de desbordamiento TF0. Mientras este flag est a cero, el programa ejecuta el salto de forma continuada. Cuando el Timer 0 rebasa, el flag se pone a 1, la condicin de salto ya no se cumple y, por tanto, el programa contina su ejecucin por la siguiente instruccin.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

201
INICIO

TIMER 0 TEMPORIZADOR CONTROL SOFTWARE

TF0=0? NO

SI

COMPLEMENTAR P0.0

PONER A CERO TF0

Fig. 7.20 Diagrama de flujo de la aplicacin

A continuacin se debe complementar el pin P0.0, poner a cero el flag de desbordamiento y saltar de nuevo al inicio para repetir la secuencia de forma indefinida.
;****************************************************************************** ; PROGRAMA DE TEMPORIZACIN DE GENERACIN DE ONDA CUADRADA ;****************************************************************************** ORG FF:0000H ; El programa comienza en la direccin FF:0000H MOV TH0,#00H ; Se inicializa los registros del Timer 0 a cero . MOV TL0,#00H ; MOV TMOD,#00H ; Se programa el Timer 0 en modo 0 como temporizador y MOV TCON,#10H ; controlado por software. SALT1: JNB TF0, SALT1 ; Se espera la activacin del flag de desbordamiento TF0. CPL P0.0 ; Se complementa el pin P0.0 CLR TF0 ; Se pone a cero el flag TF0. JMP SALT1 ; Se salta al inicio para repetir la secuencia.

b) Modo 1: Temporizador/contador de 16 bits Cuando los Timers 0 o 1 estn programados en modo 1, actan como un Timer de 16 bits implementado por los registros THx y TLx. Ejemplo 7.8 Generador de onda cuadrada con el Timer 1 controlado por interrupciones En el ejemplo 7.7 se utiliza el Timer 0 controlado mediante la tcnica de testeo para temporizar el perodo de la onda generada. En este ejemplo se va a desarrollar la misma aplicacin pero con el Timer 1 controlado mediante interrupciones, para poder comparar qu diferencias, a nivel de diseo del programa, supone el control de perifricos por interrupciones con respecto al control por testeo. El programa deber constar de dos partes: ) Un programa principal que incluya las instrucciones necesarias para habilitar las fuentes de interrupcin utilizadas en la aplicacin, as como las instrucciones de programacin e inicializacin de los perifricos.

Los autores, 2001; Edicions UPC, 2001.

202

Microcontroladores MCS-51 y MCS-251

) Una rutina de servicio a la interrupcin del Timer 1 que deber incluir las instrucciones necesarias para atender a este Timer 1 cuando interrumpa. El programa principal deber incluir una instruccin que habilite la fuente de interrupcin del Timer 1, poniendo a 1 lgico los bits adecuados del registro IE0 (figura 7.21). Asimismo, se incluirnyen instrucciones para programar el Timer 1 como temporizador en modo 1, para inicializar los registros TH1 y TL1 a cero, y para habilitar su funcionamiento (figura 7.22).
IE0
EA 1 EC 0 ET2 0 ES 0 ET1 EX1 ET0 EX0 1 0 0 0

Habilita las interrupciones que estn a 1

Habilita la interrupcin del Timer 1

Fig. 7.21 Habilitacin de la interrupcin del Timer 1 TMOD


GATE1 C/T1 M11 M10 GATE0 C/T0 M10 M00

TCON
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

0
Timer 1 programado en modo 1

Timer 1 programado como temporizador Habilitacin del funcionamiento del Timer 1 por programa

Habilitacin del funcionamiento del Timer 1 Puesta a cero del flag de interrupcin del Timer 1

Fig. 7.22 Programacin y habilitacin del Timer 1

A continuacin se presenta el flujograma (figura 7.23) y el listado del programa principal.


PROGRAMA PRINCIPAL

;************************************************************************ ; PROGRAMA PRINCIPAL ;************************************************************************ ORG FF:0000H ; El programa principal se ubica a partir de JMP PRINCIP ; la direccin FF:0100H. ORG FF:0100H PRINCIP: MOV IE0,#88H ; Habilitacin de la fuente de interrupcin Timer 1. MOV TMOD,#20H ; Configuracin del Timer 1 en modo 1 como ; temporizador. MOV TH1,#00H ; Inicializacin del Timer 1 a cero lgico. MOV TL1,#00H MOV TCON,#40H ; Habilitacin del funcionamiento del Timer 1 y ; borrado del flag de interrupcin.

HABILITACIN INTERRUPCIN TIMER 1

PROGRAMACIN Y PUESTA EN MARCHA DEL TIMER 1

Fig. 7.23 Flujograma del programa principal

Una vez habilitado el Timer 1, ste se incrementa automticamente cada 12 perodos de reloj. Cuando el Timer sufre rebasamiento, se activa el flag de interrupcin TF1 y el microcontrolador salta a ejecutar la rutina de servicio de la interrupcin que est ubicada a partir de la direccin FF:001BH. En la rutina se debe incluir una instruccin que complemente el pin P0.0. Seguidamente se presenta el listado de la RSI del Timer 1.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog ;******************************************************************************* ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 1 ;******************************************************************************* ORG FF:001BH CPL P0.0 ; Se complementa el pin P0.0. RETI ; Retorno de RSI.

203

Para mejorar el diseo del ejemplo 7.8 se puede aadir un pulsador externo que controle el funcionamiento del generador, de forma que cuando se active el pulsador, el microcontrolador detenga la generacin de la onda cuadrada, inhiba la interrupcin del Timer 1 y ponga a cero el pin P0.0. Si se aprieta de nuevo el pulsador, el microcontrolador vuelve a generar la onda cuadrada. Si el pulsador se conecta a la entrada de interrupcin /INT0, permite controlar su activacin mediante el mecanismo de interrupcin (figura 7.24).
Tp

8XC251
+5V 10 k 1k
4.[F Fig. 7.24 Esquema elctrico de la conexin del pulsador al microcontrolador 8XC251

P0.0 INT0

Para poder llevar a cabo esta mejora del diseo es necesario modificar algunas instrucciones del programa principal y disear una rutina de atencin a la interrupcin /INT0. En concreto, se debe modificar el contenido del registro IE0 para habilitar la fuente de interrupcin /INT0, y el registro TCON para programar la interrupcin /INT0 por flanco de bajada (figura 7.25).
IE0
EA 1 EC 0 ET2 0 ES 0 ET1 1 EX1 0 ET0 EX0 0 1
TF1 TR1 TF0

TCON
TR0 IE1 IT1 IE0 IT0

Programacin de /INT0 por flanco de bajada


Habilita las interrupciones que estn a 1 Habilita la interrupcin /INT0 Habilita la interrupcin del Timer 1

Habilitacin del funcionamiento del Timer 1 Puesta a cero del flag de interrupcin del Timer 1

IPH0
b7 b6 b5 b4 b3 b2 b1 b0 --0 0 0 0 0 0 0

IPL0
--0 0 0 0 0 0 1 Bits de prioridad de la interrupcin PCA Bits de prioridad de la interrupcin Timer 2 Bits de prioridad de la interrupcin puerto serie Bits de prioridad de la interrupcin Timer 1 Bits de prioridad de la interrupcin INT1 Bits de prioridad de la interrupcin Timer 0 Bits de prioridad de la interrupcin INT0

Fig. 7.25 Habilitacin de /INT0 y programacin de los niveles de prioridad

Los autores, 2001; Edicions UPC, 2001.

204

Microcontroladores MCS-51 y MCS-251

Por otra parte, se puede considerar que la fuente de interrupcin /INT0 es ms prioritaria que la interrupcin Timer 1, puesto que su activacin habilita o inhibe la interrupcin del Timer 1. Por este motivo, se programa la interrupcin /INT0 con un nivel de prioridad mayor que la interrupcin Timer 1. Por ejemplo, se puede programar la interrupcin /INT0 con el nivel 1 y la interrupcin Timer 1 con el nivel 0. Teniendo en cuenta estas modificaciones, el listado del programa principal quedar de la siguiente manera:
;******************************************************************************* ; PROGRAMA PRINCIPAL ;******************************************************************************* ORG FF:0000H JMP PRINCIP ORG FF:0100H ; El programa principal se ubica a partir de la direccin FF:0100H. PRINCIP: MOV IE0,#89H ; Habilitacin de las fuentes de interrupcin Timer 1 y /INT0. MOV TMOD,#20H ; Programacin del Timer 1 en modo 1 como temporizador. MOV TH0,#00H ; Inicializacin del Timer 1 a cero lgico. MOV TL0,#00H MOV TCON,#41H ; Habilitacin del Timer 1 y borrado del flag de interrupcin ; Programacin de la interrupcin /INT0 activa por flanco de bajada. MOV IPH0,#00H ; Se programa la interrupcin /INT0 con nivel 1 y la MOV IPL0,#01H ; interrupcin Timer 1 con nivel 0.

Por otra parte, la RSI de la interrupcin /INT0 debe incluir instrucciones que controlen la habilitacin de la interrupcin del Timer 1 y pongan a cero el pin P0.0 si es necesario. En la figura 7.26 est representado el flujograma de la RSI de la interrupcin /INT0.
RSI /INT0

;******************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION INT0 ;******************************************************** ORG FF:0003H JNB ET1,HAB ; Si la int. del Timer 1 est inhibida se habilita. CLR ET1 ; Si la int. del Timer 1 est activa se inhibe. CLR P0.0 ; Se pone a cero el pin P0.0. RETI ; Retorno de RSI. HAB: SETB ET1 ; Se habilita la interrupcin Timer 1. RETI ; Retorno de RSI.

INTERRUPCIN TIMER 1 ACTIVA? SI SE INHIBE INT. TIMER 1

NO

SE HABILITA INT. TIMER 1

SE PONE A CERO P0.0

RETI

Fig. 7.26 Flujograma de la RSI de la interrupcin /INT0

Ejemplo 7.9 Control del ndice de acidez (pH) del agua de un depsito Se plantea a continuacin, como ejemplo ilustrativo de la utilizacin del sistema de interrupciones del microcontrolador 8XC251Sx, un caso prctico de control de una planta de tratamiento de aguas residuales. El objetivo de este ejemplo es mostrar el funcionamiento de las interrupciones en lo que respecta a la habilitacin, los niveles de prioridad, el manejo de los flags de interrupcin, etc.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

205

La planta que se debe controlar dispone de un sistema que neutraliza la acidez de las aguas residuales provenientes de una planta de fabricacin de papel (figura 7.27). El sistema posee un depsito donde se mezcla el agua residual con la cantidad adecuada del componente neutralizador, cuya funcin es disminuir la acidez del agua, de forma que el agua de salida del depsito posea un pH superior a 5.5. El sistema de control incorpora dos sensores activos a nivel alto: ) Un detector de rebosamiento, S1, que se activa cuando el agua contenida en el depsito supera la altura mxima permitida. ) Un detector de pH, M, que se activa cuando el pH del agua es inferior a 5.5. El sistema de control dispone adems de dos actuadores, V1 y V2, activos a nivel alto, cuya funcin es realizar la apertura de dos vlvulas. Cuando se activa el actuador V1 se abre la vlvula que permite la entrada de las aguas residuales al depsito. Cuando se activa el actuador V2 se abre la vlvula que permite el vertido de neutralizador en el depsito. Por ltimo, existen dos indicadores luminosos, A1 y A2, activos a nivel alto, cuya funcin es la de monitorizar la apertura de las vlvulas V1 y V2.

Neutralizador

A1 Sistema de control A2

Entrada de aguas residuales

V1

V2 S1 M Medidor pH Descarga

Fig. 7.27 Esquema de la planta

En la figura 7.28 est representado el esquema elctrico en que se detalla la conexin del C 8XC251Sx con los diferentes sensores y actuadores que intervienen en esta aplicacin. Cabe destacar que los sensores S1 y M estn conectados a las entradas de interrupcin /INT0 e /INT1 a travs de sendas puertas inversoras, debido a que las interrupciones externas se activan a nivel bajo, mientras que estos sensores son activos a nivel alto.
8XC251
P1.2 P1.3 S1 M INT0 INT1 P1.0 P1.1 A1 A2 V1 V2

Fig. 7.28 Conexin sensores y actuadores con el C 8XC251Sx

Los autores, 2001; Edicions UPC, 2001.

206

Microcontroladores MCS-51 y MCS-251

La estrategia que debe llevar a cabo el sistema de control para gestionar el funcionamiento de la planta de tratamiento de aguas residuales se puede resumir en dos puntos: ) La vlvula V1 debe permanecer abierta hasta que el sensor S1 se active, en cuyo caso se cerrar durante treinta segundos. Si una vez pasado este tiempo el sensor S1 sigue activo, se repetir la operacin de cierre de la vlvula V1. Mientras V1 est abierta, el indicador A1 permanecer encendido; en caso contrario el indicador parpadear. ) La vlvula V2 debe estar cerrada hasta que se active el sensor M, en cuyo caso se abrir durante cinco segundos. Una vez transcurrido ese tiempo, si el sensor M contina activo, se repetir la operacin de apertura de la vlvula V2. El indicador A2 se activa cuando la vlvula V2 est abierta y parpadea cuando est cerrada. Los recursos utilizados para resolver esta aplicacin son cuatro: ) La interrupcin externa /INT0, que se encarga de detectar la activacin del sensor S1. La interrupcin se activa por nivel para que pueda ser atendida por la CPU mientras el sensor S1 se encuentre a uno lgico. ) La interrupcin externa /INT1, cuya funcin es detectar la activacin del medidor de pH. Esta interrupcin tambin se programa por nivel por el mismo motivo que la /INT0. ) El Timer 0, que se encarga de temporizar el intervalo de 30s, tiempo que debe permanecer abierta la vlvula V1 cuando se active S1. ) El Timer 1, que se encarga de temporizar los 5s de apertura de la vlvula V2. ) El programa est compuesto de una rutina principal y de cuatro rutinas de atencin a la interrupcin, una para cada fuente de interrupcin utilizada en la aplicacin. La funcin del programa principal ser bsicamente la de habilitar y programar los niveles de prioridad de las diversas fuentes de interrupcin utilizadas, as como la de ejecutar la secuencia de parpadeo de los indicadores luminosos A1 y A2. Para habilitar las cuatro fuentes de interrupcin utilizadas, se ponen a uno lgico los bits correspondientes del registro habilitador de interrupciones IE0: EX0, ET0, EX1 y ET1. Esto se consigue cargando en el registro IE0 el valor 8FH (10001111b). Por otra parte, se deben poner a uno lgico los bits IT0 e IT1 del registro TCON, con el objetivo de que las interrupciones externas /INT0 e /INT1 se activen por nivel. Esto se consigue almacenando en el registro TCON el valor 0AH (0000 1010b). A continuacin se debe establecer la prioridad de las interrupciones. En principio se adjudica a las interrupciones /INT0 y Timer 0 una prioridad mayor que a las interrupciones /INT1 y Timer 1, dado que la situacin de rebasamiento requiere una actuacin ms urgente que la superacin del nivel de pH. Las fuentes /INT0 y Timer 0 se programan con nivel de prioridad tres, mientras que las fuentes de interrupcin /INT1 y Timer 1 se programan con un nivel de prioridad menor, por ejemplo con nivel cero. Por tanto, los registros de nivel de prioridad IPH0 e IPL0 quedan: IPH0 = 03H y IPL0 = 03H. Por ltimo, se debe poner el bit INTR del byte de configuracin CONFIG1 a uno lgico. De esta forma, cuando la CPU ejecute una interrupcin, se cargarn en la pila, automticamente,

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

207

los tres bytes del contador de programa, PC, y el registro de estado, PSW1. En cuanto a la rutina de retardo, que se utiliza para temporizar el parpadeo de los indicadores luminosos, estar compuesta de dos bucles anidados basados en decrementar los registros R0 y R1. Modificando el valor de los registros R0 y R1 se puede variar el tiempo de ejecucin de la rutina y, por tanto, la frecuencia de parpadeo. Para calcular el tiempo de retardo hay que determinar el nmero de veces que se ejecuta cada instruccin, as como el tiempo que tarda en ejecutarse cada una de ellas. En la figura 7.29 se muestran los flujogramas correspondientes al programa principal y a la rutina de retardo. En la figura 7.30 se muestran los flujogramas de las rutinas de atencin a las interrupciones /INT0 y Timer 0. Las tareas que debe realizar la rutina de atencin a la interrupcin /INT0 son: ) Cerrar la vlvula V1. ) Inicializar el Timer 0 para que temporice 30s. ) Inhibir la interrupcin /INT0 para impedir que se ejecute de forma repetida la RSI de la /INT0 mientras el sensor S1 se encuentra activo y no ha finalizado la temporizacin de 30s. Si consideramos que la frecuencia de reloj es de 1.2MHz, se puede determinar, mediante un clculo sencillo, que el Timer 0 debe rebasar varias veces para temporizar 30s.
PRINCIPAL RETARDO

INICIALIZAR: IE0 = 8FH TCON = 0AH IPH0 = 03H IPL0 = 03H

R0 = 10H

R1 = FFH

P1.2 = 1 P1.3 = 1

DECREMENTA R1

RETARDO

R1 = 0?
SI

NO

P1.2 = 0 P1.3 = 0

DECREMENTA R0

RETARDO

R0 = 0?
SI

NO

RET

Fig. 7.29 Flujograma del programa principal y de la rutina de retardo

En la RSI del Timer 0 se debe contar el nmero de rebasamientos que sufre este temporizador. Cuando el Timer 0 rebase un nmero de veces equivalente a 30s se abrir la vlvula V1, se detendr el

Los autores, 2001; Edicions UPC, 2001.

208

Microcontroladores MCS-51 y MCS-251

funcionamiento del Timer 0 y se habilitar de nuevo la interrupcin /INT0, de forma que si el sensor S1 contina activo se repetir de nuevo la secuencia de cierre de V1.
INT0 T0

CERRAR VLVULA V1

T = 30s? SI PARAR T0

NO

INICIALIZAR T0

ACTIVACIN T0 ABRIR VLVULA V2 INHIBIR INT0 BORRAR IE0 RETI HABILITAR INT0

RETI

Fig. 7.30 Flujogramas de las rutinas de servicio a las interrupciones /INT0 y Timer 0

Las rutinas de atencin a las interrupciones /INT1 y Timer 1 tienen funciones similares a las interrupciones /INT0 y Timer 0. En la figura 7.31 se presentan los flujogramas correspondientes a ambas rutinas.
INT1 T1

ABRIR VLVULA V2

T = 5s? SI PARAR T1

NO

INICIALIZAR T1

ACTIVACIN T1 CERRAR VLVULA V2 INHIBIR INT1 BORRAR IE1 RETI HABILITAR INT1

RETI

Fig. 7.31 Flujogramas de las rutinas de servicio a las interrupciones /INT1 y Timer 1.

A continuacin se presentan el listado del programa principal y de la rutina de retardo.


;**************************************************************************** ; VECTORIZACION INTERRUPCIONES ;**************************************************************************** ORG FF:0003H ; Vector de interrupcin de /INT0. JMP RSI_INT0 ORG FF:000BH ; Vector de interrupcin del Timer 0. JMP RSI_T0

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog ORG FF:0013H ; Vector de interrupcin de /INT1. JMP RSI_INT1 ORG FF:001BH ; Vector de interrupcin del Timer 1. JMP RSI_T1 ;****************************************************************************** ; PROGRAMA PRINCIPAL ;****************************************************************************** ORG FF:0000H JMP PRINCIP ORG FF:0100H ; Programacin del nivel de prioridad de las interrupciones externas 0 y 1 PRINCIP: MOV IE0,#8FH ; Habilitacin de las interrupciones MOV TCON,#0AH ; Se programa /INT0 e /INT1 por nivel MOV IPL0,#03H ; Programacin de los niveles de prioridad MOV IPH0,#03H SETB INTR ; Cuando la CPU vectorice una interrupcin cargar en la pila ; los 3 bytes del PC y el registro de estado PSW1. ;Secuencia de parpadeo de los indicadores luminosos A1 y A2 SALTO0: SETB P1.2 SETB P1.3 CALL RETARDO CLR P1.2 CLR P1.3 CALL RETARDO JMP SALTO0 ;************************************************************************ ; RUTINA DE RETARDO ;************************************************************************* ORG FF:0200H RETARDO: MOV R0,#10H ; R0 = 10H. SALT2: MOV R1,#FFH ; R1 = FFH. SALT1: DJNZ R1,SALT1 ; Decrementa R1 y si es distinto de 0 salta a SALT1. DJNZ R0,SALT2 ; Decrementa R2 y si es distinto de 0 salta a SALT2. RET ;************************************************************************ ; RUTINA DE SERVICIO A LA INTERRUPCION INT0 ;************************************************************************* ORG FF:0300H RSI_INT0: CLR P1.0 ; Se cierra la vlvula V1. SETB TMOD.0 ; Se programa el Timer 0 en modo 1. MOV TH0,#3CH ; Se inicializa el Timer 0 para temporizar 0.5 s. MOV TL0,#AFH ; MOV R3,#00H ; El registro R3 contar los rebasamientos del Timer 0. SETB TR0 ; Puesta en marcha del Timer 0. CLR EX0 ; Se inhibe la interrupcin /INT0. RETI

209

Clculo del valor inicial del Timer 0 Para temporizar los treinta segundos se inicia el Timer 0 para que tarde 0.5s en rebasar, de forma que se deben contabilizar 60 rebasamientos en la RSI del Timer 0 para abrir de nuevo la vlvula V1. Para temporizar 0.5s, con una frecuencia de reloj de 1.2MHz, el Timer 0 debe incrementarse 50.000 veces (C350H); luego se ha de cargar dicho Timer con la combinacin resultante de restar a FFFFH el valor C350H: FFFFH - C350H = 3CAFH

Los autores, 2001; Edicions UPC, 2001.

210

Microcontroladores MCS-51 y MCS-251

;***************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 0 ;***************************************************************************** ORG FF:0400H RSI_T0: INC R3 ; Se incrementa el contador de rebasamientos. CMP R3,59d ; Se compara el nmero de rebasamientos con 59. JNC SIGUE ; Si el nmero de rebasamientos es menor o igual que 59 contina temporizando. CLR TR0 ; En caso contrario se detiene el Timer 0 y CLR P1.0 ; se abre la vlvula V1. SETB EX0 ; Se habilita de nuevo la interrupcin /INT0. CLR IE0 ; Se borra el flag de la interrupcin /INT0. SIGUE: RETI ; Retorno al programa principal. ;**************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION INT1 ;***************************************************************************** ORG FF:0500H RSI_INT1: SETB P1.1 ; Se abre la vlvula V2. SETB TMOD.4 ; Se programa el Timer 1 en modo 1. MOV TH1,#3CH ; Se inicializa el Timer 1 para temporizar 0.5 s. MOV TL1,#AFH MOV R4,#00H ; El registro R4 contar los rebasamientos del Timer 1. SETB TR1 ; Puesta en marcha del Timer 1. CLR EX1 ; Se inhibe la interrupcin /INT1 RETI ;************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 1 ;************************************************************************** ORG FF:0600H RSI_T1: INC R4 ; Se incrementa el contador de rebasamientos CMP R4,09d ; Se compara el nmero de rebasamientos con 9 JNC SIGUE1 ; Si el nmero de rebasamientos es menor o igual que 9 ; continua temporizando. CLR TR1 ; Se detiene el Timer 1 SETB P1.1 ; Se abre la vlvula V2 SETB EX1 ; Se habilita la interrupcin /INT1 CLR IE1 ; Se borra el flag de la interrupcin /INT1 SIGUE1: RETI ; Retorno al programa principal

c) Modo 2: Temporizador/contador de 8 bits con autorrecarga El modo 2 configura a los Timers 0 o 1 como temporizador/contador de 8 bits, implementado con el registro TLx (con x = 0 1).
XTAL1 12 0 1 Tx C/Tx Recarga TRx GATEx INTx THx (8 bits) x=01 TLx (8 bits) Desbordamiento TFx Peticin de interrupcin

Fig. 7.32 Modo 2 de autorrecarga de los Timers 0 y 1

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

211

En este modo de trabajo cuando el Timer sufre desbordamiento se activa el flag TFx y automticamente se carga el contenido del registro THx en el registro TLx, de forma que el Timer comienza a contar a partir del valor cargado en el registro THx. El proceso de recarga no modifica el contenido del registro THx. En la figura 7.32 est representado el esquema del Timer 0 o de Timer 1 funcionando en modo 2. Ejemplo 7.10 Contador mdulo 12 con el Timer 1 Este ejemplo consiste en la realizacin de un contador mdulo 12 con el Timer 1 programado en modo 2. El contador cuenta desde el valor inicial 3 hasta el 15. En la figura 7.33 se muestra el esquema general de un contador mdulo 12, que incluye las salidas de cuenta, una entrada de reloj y una entrada de habilitacin del contador.
Contador de 4 bits Seal de habilitacin Habilitador del contador Entrada de cuenta

Salida de cuenta: 3-15

Seal de reloj

Fig. 7.33 Esquema general de un contador mdulo 12

En la figura 7.34 se muestra cmo se puede realizar este contador utilizando el microcontrolador 8XC251Sx. Basta con conectar la seal de reloj a la entrada de cuenta del Timer 1 (pin P3.5), conectan la seal de habilitacin del contador a la entrada de control por hardware del Timer 1 (pin P3.3); las salidas del contador pueden tomarse de los cuatro bits de menor peso del puerto 0. 8XC251
+5V INT1 P0.0 P0.1 P0.2 Entrada de cuenta P0.3 T1

Salida de cuenta: 3-15

Fig. 7.34 Contador mdulo 12 con el microcontrolador 8XC251Sx

El programa comienza configurando el Timer 1 como contador en modo 2 y controlado por hardware. Seguidamente se deben inicializar los registros TH1 y TL1 con el valor adecuado para esta aplicacin. A continuacin se vuelca el contenido del registro TL0 sobre el puerto P0 de forma continuada, con el objetivo de visualizar sobre este puerto los incrementos que sufre el contador a medida que va recibiendo los pulsos aplicados en la entrada de cuenta. El valor elegido para inicializar los registros del Timer 1 es el F3H, de forma que al volcar este contenido sobre el puerto P0, en los cuatro bits de menor peso aparece el valor 3H (valor inicial de cuenta). A medida que el Timer 1 se incrementa se puede seguir el incremento a travs del puerto P0. Cuando se llega al valor FH (15d) y se recibe un nuevo pulso se produce desbordamiento y el registro TL1 se carga de nuevo con F3H (figura 7.35).

Los autores, 2001; Edicions UPC, 2001.

212

Microcontroladores MCS-51 y MCS-251

Desbordamiento

F3H

F4H

F5H

FEH

FFH

TL0

P0:3=3H

P0:3=4H

P0:3=5H

P0:3=EH

P0:3=FH

P0

Fig. 7.35 Evolucin del contador mdulo 12

En la figura 7.36 est representado el diagrama de flujo del programa que controla el funcionamiento del contador mdulo 12.
INICIO

TIMER 1 CONTADOR CONTROL HARDWARE

TH1 = TL1 = F3H

CARGAR TL1 EN P0

Fig. 7.36 Diagrama de flujo del contador mdulo 12

Seguidamente se presenta el listado del programa.


;**************************************************************************************** ; PROGRAMA DE TEMPORIZACIN DE GENERACIN DE ONDA CUADRADA ;**************************************************************************************** ORG FF:0000H ; El programa comienza en la direccin FF:0000H MOV TH1,#F3H ; Se inicializa los registros del Timer 0 a cero . MOV TL1,#F3H MOV TMOD,#E0H ; Timer 0 en modo 0 como temporizador y controlado por software. SETB TR1 SALT1: MOV P0,TL1 ; Se copia el contenido del registro TL0 en el puerto cero. JMP SALT1

d) Modo 3: Timer 0: dos temporizadores/contadores de 8 bits; Timer 1: parado Cuando el Timer 0 se programa en modo 3, los registros TL0 y TH0 operan como dos temporizadores independientes de 8 bits (figura 7.37). Este modo se utiliza en aquellas aplicaciones que requieren un temporizador o contador adicional. En este modo de funcionamiento, el registro TL0 utiliza todos los bits de control del Timer 0 para su funcionamiento normal: C/T0, GATE0, TR0 y TF0. En cambio, las prestaciones de funcionamiento del registro TH0 se ven muy reducidas debido a que los nicos flags que controlan su funcionamiento son el TR1 y el TF1. El flag TR1 permite habilitar el funcionamiento del registro TH0 y el flag TF1 se activa cuando este registro sufre desbordamiento.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

213

Por otra parte, el registro TH0 slo puede operar como temporizador y no como contador (figura 7.37).
XTAL1 12 0 1 T0 C/T0 TR0 GATE0 1/12 Fosc INT0 TR1 Desbordamiento TH0 (8 bits) TF1 Peticin de interrupcin 1/12 Fosc Desbordamiento TL0 (8 bits) TF0

Peticin de interrupcin

Fig. 7.37 Modo 3 del Timer 0, dos Timers de 8 bits

Por este motivo, cuando el Timer 0 est programado en modo 3, el Timer 1 no puede utilizar los flags TR1 y TF1 para su normal funcionamiento. Esto significa que cuando el Timer 1 desborde no se activar el flag TF1; igualmente, no se puede utilizar el bit TR1 para habilitar el funcionamiento de este Timer. Por otra parte, cuando el Timer 1 se programa en modo 3 se detiene su funcionamiento. Este modo puede utilizarse para detener el Timer 1 cuando el Timer 0 est programado en modo 3 y el bit TR1 no est disponible.

7.6 Timer 2
El Timer 2 es un temporizador/contador de 16 bits implementado mediante dos registros de 8 bits conectados en cascada: TH2 y TL2. Para controlar su funcionamiento se dispone de 2 registros: T2MOD y T2CON (tablas 7.10 y 7.11).
Tabla 7.10 Registro de control de modo del Timer 2

T2MOD b7 -Nmero de bit


7:2 1

Direccin: S:0C9H b6 b5 ---

b4 --

Valor de reset: XXXX XX00b b3 b2 b1 --T2OE Funcin

b0 DCEN

Nombre del bit


-T2OE

DCEN

Reservado. Estos bits estn reservados para futuras aplicaciones y no se pueden utilizar. Bit de habilitacin del Timer 2. Cuando el Timer 2 trabaja en modo Clock-out, este bit conecta la salida de reloj con el pin T2. Bit de cuenta atrs. Este bit configura al Timer 2 como un contador ascendente o descendente.

Los autores, 2001; Edicions UPC, 2001.

214 Tabla 7.11 Registro de control del Timer 2

Microcontroladores MCS-51 y MCS-251

T2CON b7 TF2 Nmero de bit


7

Direccin: S:0C8H b6 b5 EXF2 RCLK

b4 TCLK

Valor de reset: 0000 0000b b3 b2 b1 EXEN2 TR2 C/T2 Funcin

b0 CP/RL2

Nombre del bit


TF2

EXF2

RCLK

4 3

TCLK EXEN2

TR2

C/T2

CP/RL2

Flag de desbordamiento del Timer 2. Este flag se pone a 1 cuando el Timer 2 sufre desbordamiento, o sea, cuando pasa de la combinacin todo unos a la combinacin todo ceros. Este bit no se activa si RCLK=1 o TCLK=1. Flag externo del Timer 2. Este flag se pone a 1 cuando se produce un flanco negativo en el pin T2EX con el flag EXEN2=1. Bit de reloj en recepcin. Este flag se pone a 1 cuando el Timer 0 sufre desbordamiento, o sea cuando pasa de la combinacin todo unos a la combinacin todo ceros. Bit de reloj en transmisin. Bit de habilitacin externa del Timer 2. Cuando este bit est a 1 y se produce una transicin negativa en el pin T2EX, se produce una recarga o captura, a menos que el Timer 2 se utilice como generador de Baud Rate del puerto de comunicacin serie. Si el bit EXEN2 est a cero se ignoran las transiciones en el pin T2EX. Bit de puesta en marcha del Timer 2. Cuando est a 1 lgico el Timer 2 est habilitado para funcionar; en caso contrario esta parado. Bit de seleccin de contador/temporizador: C/T2 = 0: el Timer 2 funciona como temporizador. C/T2 = 1: el Timer 2 funciona como contador. Bit de captura/recarga. Cuando este bit est a 1 se produce una captura al aplicar un flanco negativo en la entrada T2EX con EXEN2=1. Cuando este bit est a cero se produce un recarga al aplicar un flanco negativo en la entrada T2EX con EXEN2=1. Si RCLK=1 o TCLK=1, se ignora el bit CP/RL2 y se fuerza la recarga del Timer 2 cuando sufre desbordamiento.

Los bits de los registros T2MOD y T2CON permiten programar el modo de funcionamiento de los Timers, controlar su puesta en marcha, programar su modo de operacin (contador o temporizador) y detectar el desbordamiento. En la tabla 7.12 se indican los cuatro modos de operacin en los que puede funcionar el Timer 2.
Tabla 7.12 Modos de operacin del Timer 2

Modo
Modo autorrecarga Modo captura Modo Baud Rate Clock-out programable

RCLK o TCLK
0 0 1 X

CP/RL2
0 1 X 0

T2OE
0 0 X 1

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

215

7.6.1 Modo captura En el modo captura, el Timer 2 funciona como un temporizador o contador de 16 bits (figura 7.38). Cuando el Timer 2 sufre desbordamiento se activa el flag TF2, con lo que se genera una peticin de interrupcin al microcontrolador. Si el bit EXEN2 est a 1 lgico, un flanco de bajada en el pin T2EX captura el valor actual de los registros del Timer 2, TH2 y TL2, en los registros RCAP2H y RCAP2L respectivamente. Al mismo tiempo, el flanco de bajada en el pin T2EX produce la activacin del bit EXF2, lo cual genera una peticin de interrupcin al microcontrolador.
XTAL1 12 Desbordamiento 0 1 T2 C/T2 Peticin de interrupcin RCAP2H RCAP2L T2EX EXF2 TR2 TH2 (8 bits) TL2 (8 bits) TF2

EXEN2

Fig. 7.38 Modo captura del Timer 2

7.6.2 Modo autorrecarga El modo autorrecarga configura al Timer 2 como un temporizador o contador de 16 bits con recarga automtica. En este modo de funcionamiento el Timer opera como un contador ascendente o ascendente/descendente, segn sea el valor del bit DCEN (Down Counter Enable Bit). Cuando se realiza un reset del microcontrolador, el bit DCEN se pone automticamente a cero, de forma que si se programa el Timer 2 en modo autorrecarga, ste funcionar como contador ascendente.

a) Contador ascendente (DCEN=0) Cuando DCEN=0, el Timer 2 opera como un contador ascendente (figura 7.39). El valor del bit EXEN2 permite dos posibilidades de funcionamiento dentro de este modo. Si EXEN2=0, el Timer 2 cuenta hacia arriba hasta el valor FFFFH y activa el flag TF2 cuando sufre desbordamiento. Con el desbordamiento se recarga, en los registros del Timer 2, TH2 y TL2, el valor contenido en los registros de recarga/captura, RCAP2H y RCAP2L, respectivamente. Si EXEN2=1, los registros del Timer se recargan por dos motivos distintos: cuando se produce desbordamiento y cuando se aplica un flanco de bajada en el pin T2EX. El flanco de bajada en T2EX tambin activa el bit EXF2, que realiza una peticin de interrupcin al microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

216
XTAL1

Microcontroladores MCS-51 y MCS-251

12

0 1

TH2 (8 bits) TR2

TL2 (8 bits)

Desbordamiento

T2 C/T2

Recarga

RCAP2H RCAP2L

TF2 T2EX EXF2 EXEN2

Peticin de interrupcin

Fig. 7.39 Modo autorecarga del Timer 2 con DCEN = 0

b) Contador ascendente/descendente (DCEN=1) Cuando DCEN=1, el Timer 2 opera como un contador ascendente/descendente (figura 7.40). La direccin de cuenta se puede controlar mediante el valor lgico aplicado al pin T2EX. Cuando este pin est a nivel alto, 1 lgico, el Timer 2 cuenta de forma ascendente. En este caso, cuando el Timer llega a FFFFH y se incrementa otra vez, se produce desbordamiento y se activa el flag TF2, lo que genera una peticin de interrupcin al microcontrolador. El desbordamiento tambin produce la recarga automtica de los registros del Timer 2, TH2 y TL2, con el valor almacenado en los registros de recarga/captura, RCAP2H y RCAP2L, respectivamente.
Valor de recarga para cuenta hacia abajo FFH FFH Complemento XTAL1 12 EXF2 Peticin de interrupcin TF2

0 T2 C/T2 1 TR2

TH2 (8 bits)

TL2 (8 bits)

Desbordamiento

Direccin de cuenta 1 = ascendente T2EX 0 = descendente RCAP2H RCAP2L Valor de recarga para cuenta hacia arriba

Fig. 7.40 Timer 2: modo autorecarga con DCEN = 1

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

217

Cuando T2EX vale 0 lgico, el Timer 2 cuenta hacia abajo. El desbordamiento del Timer 2 ocurre, en este caso, cuando el contenido de los registros TH2 y TL2 es igual al valor cargado en los registros RCAP2H y RCAP2L, respectivamente. El desbordamiento provoca la activacin del flag TF2 y recarga los registros del Timer con el valor FFFFH. Por otra parte, cuando el Timer sufre desbordamiento, en la cuenta ascendente o descendente, el bit EXF2 cambia de valor. En este modo de funcionamiento el bit EXF2 no genera ninguna peticin de interrupcin al microcontrolador y puede utilizarse como bit 17 del Timer 2.

7.6.3 Modo de generador de baudios (Baud Rate Generator Mode) En este modo el Timer 2 queda configurado como generador de baudios para fijar la velocidad de transmisin del puerto de comunicacin serie. Para seleccionar este modo es necesario activar los bits RCLK y/o TCLK de registro T2CON (tabla 7.12).

7.6.4 Modo Clock-out En este modo de funcionamiento, el Timer 2 funciona como un reloj de frecuencia variable con un ciclo de trabajo del 50% (figura 7.41) y se incrementa con una frecuencia FOSC/2 hasta que sufre desbordamiento; entonces se recarga automticamente los registros TH2 y TL2 con el valor contenido en los registros RCAP2H y RCAP2L, respectivamente. En el modo Clock-out, el desbordamiento del Timer 2 no genera peticin de interrupcin.
XTAL1 2 0 1 T2 C/T2 TR2 Desbordamiento

TH2 (8 bits)

TL2 (8 bits)

RCAP2H RCAP2L 2 T2OE Peticin de interrupcin T2EX EXF2

EXEN2

Fig. 7.41 Timer 2: modo generacin de reloj

La frecuencia de la seal de reloj que se genera con este modo se puede programar adecuadamente fijando el valor de los registros RCAP2H y RCAP2L:

Los autores, 2001; Edicions UPC, 2001.

218

Microcontroladores MCS-51 y MCS-251

Frecuencia reloj ]

FOSC 4 ( 65535 RCAP 2 H , RCAP2 L

(7.1)

Si el microcontrolador funciona con un reloj de 16MHz, se podr programar un rango de frecuencias de 61Hz a 4MHz. La seal de reloj, generada en este modo, est disponible en el pin T2. Para programar el Timer 2 en el modo Clock-out se debe poner a 1 lgico el bit T2OE del registro T2MOD. Tambin se debe poner a cero lgico el bit C/T2, para que el Timer 2 funcione como temporizador y para habilitar al mismo tiempo el pin T2 como salida de reloj. Los registros RCAP2H y RCAP2L se inicializan adecuadamente, segn la expresin 7.1, para fijar la frecuencia de la seal generada. Por otra parte, los registros TH2 y TL2 se cargan con el mismo valor, o con otro distinto, dependiendo de la aplicacin. Finalmente, se activa el bit TR2 para poner en marcha el Timer 2. Es posible utilizar el Timer 2 como generador de baudios y como generador de reloj de forma simultnea. Ejemplo 7.11 Control de llenado de un garaje Esta aplicacin consiste en contar el nmero de coches que hay en un garaje mediante el microcontrolador 8XC251Sx. La cuenta est controlada por el Timer 2, que debe trabajar como contador bidireccional: incrementndose cada vez que entra un coche y decrementndose cuando sale. Por tanto, se debe programar el Timer 2 en modo autorrecarga con DCEN=1. Para detectar la presencia de vehculos y su direccin, entrada o salida, se dispone de tres sensores de presencia, S1, S2 y S3, activos a nivel alto (figura 7.42).
G AR A JE

S1

S3

S2

Sistema de control

Fig. 7.42 Esquema de la entrada al garaje

Para realizar esta aplicacin se conecta el sensor S3 a la entrada de cuenta del Timer 2: T2. Cada vez que un coche entra o sale del garaje, el sensor S3 genera un pulso en esta entrada, de forma que el Timer se incrementa o decrementa, dependiendo del valor lgico aplicado en el pin T2EX (figura 7.43). Los sensores S1 y S2 controlan la direccin de cuenta a travs de la bscula RS conectada a la entrada T2EX. Si el vehculo entra en el garaje se activa, en primer lugar, el sensor S2 y, por tanto, se aplica un pulso a la entrada S de la bscula RS. Como resultado, la salida Q de la bscula se pone a 1, T2EX=1, lo que permite al Timer 2 incrementarse cuando el vehculo genera un pulso en la entrada T2. Igualmente, si el vehculo sale del garaje, se activa el sensor S1 que pone a cero la bscula RS, y el Timer 2 se decrementa al activarse el sensor S3.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

219

8XC251
S1 S2 S3
R S T2 Q T2EX

R 0 0 1 1

S 0 1 0 1

Q+ Q 1 0 X

Fig. 7.43 Conexin de los sensores al [C 8XC251Sx y tabla de funcionamiento de una bscula RS

En esta aplicacin, el Timer 2 debe trabajar como contador bidireccional; se deber programar, por tanto, en modo autorrecarga con DCEN=1. Para ello se deben inicializar los siguientes bits: RCLK = TCLK = 0, CP/RL2 = 0, T2OE = 0 y el bit DCEN = 1. Los bits RCLK, TCLK y CP/RL2 estn ubicados en el registro T2CON, mientras que el bit T2OE y DCEN estn ubicados en el registro T2MOD. Seguidamente se deben inicializar los registros del Timer 2 a cero, y ponerlo en marcha.
;******************************************************************************** ; PROGRAMA DE CONTROL DEL GARAJE ;******************************************************************************** ORG FF:0000H ; El programa est almacenado a partir de la direccin de memoria FF:0000H CLR RCLK ; Se pone a cero el bit RCLK del registro T2CON. CLR TCLK ; Se pone a cero el bit TCLK del registro T2CON. CLR CP/RL2 ; Se pone a cero el bit CP/RL2 del registro T2CON. CLR T2OE ; Se pone a cero el bit T2OE del registro T2MOD. SETB C/T2 ; Se programa el Timer 2 como contador. SETB DCEN ; El Timer 2 trabaja como contador Up/Down SETB TR2 ; Se habilita el funcionamiento del Timer 2. MOV TL2,#00H ; Se inicializa el contador a cero. MOV TH2,#00H ;

7.7 Timer watchdog


Los microcontroladores de la serie 8XC251Sx contienen un Timer watchdog, WDT, que genera un reset automtico del microcontrolador si pasa un cierto tiempo sin recargar el contenido de este Timer. La utilidad del WDT es la de posibilitar el reset del microcontrolador en casos de funcionamiento inadecuado del programa.

7.7.1 Descripcin de funcionamiento El WDT es un Timer de 14 bits que se incrementa automticamente cada ciclo de perifrico, o sea, cada 12 perodos de reloj, y su funcionamiento est controlado por el registro WDTRST, ubicado en la direccin S:0A6H del rea de registros de funcin especfica. El Timer WDT se gestiona bsicamente a travs de dos operaciones: ) ) Un reset del microcontrolador borra e inhibe el funcionamiento del Timer WDT. Escribiendo una secuencia especfica de dos bytes en el registro WDTRST se borra y habilita el Timer WDT.

Los autores, 2001; Edicions UPC, 2001.

220

Microcontroladores MCS-51 y MCS-251

Una vez habilitado para funcionar, el Timer WDT se incrementa cada 12 perodos de seal de reloj y, si no se borra, sufre desbordamiento cuando llega a la combinacin 3FFFH+1; entonces genera, adems, un reset al microcontrolador 8XC251Sx. Si, por ejemplo, la frecuencia de reloj del microcontrolador es de 16MHz, el ciclo de perifrico es de 750ns y el Timer WDT desborda en 750ns x 16384 = 12,288ms.

7.7.2 Utilizacin del Timer WDT Se puede utilizar el Timer WDT para que, en caso de funcionamiento errneo del programa, se realice un reset del microcontrolador. La idea es que desde el programa de la aplicacin se borre peridicamente el Timer WDT, antes de que desborde. Si el programa entra en secuencia de funcionamiento errnea, el Timer WDT no se borrar y cuando sufra desbordamiento se efectuar el reset el Timer WDT quedar automticamente inhibido. Para borrar el Timer WDT se debe escribir en el registro WDTRST una secuencia de dos bytes: 1EH y 1EH. Esta operacin habilita y borra el Timer WDT, de forma que comienza de nuevo a incrementarse a partir del valor inicial 0000H. A lo largo del programa se deber escribir la secuencia de dos bytes para borrar y habilitar de nuevo el Timer WDT antes de que desborde.

7.7.3 Timer WDT durante el modo Idle El Timer WDT contina su funcionamiento mientras el microcontrolador est en modo de operacin Idle. Esto significa que el usuario debe controlar el funcionamiento de este Timer durante el modo Idle. Por ejemplo, se puede utilizar el Timer 0 programado convenientemente para desbordar antes que el Timer WDT. Cuando el Timer 0 desborda, genera una interrupcin al microcontrolador. En la rutina de interrupcin del Timer 0 se pone a cero el Timer WDT, se inicializa el Timer 0 y se coloca de nuevo el microcontrolador en modo Idle.

7.7.4 Timer WDT durante Power Down Cuando el microcontrolador est en el modo Power Down se paran todos los relojes del microcontrolador. Esto detiene automticamente el funcionamiento del Timer WDT y mantiene su valor de cuenta. Cuando el microcontrolador sale de este modo de funcionamiento, mediante la activacin de las entradas /INT0 o /INT1, el Timer WDT contina su cuenta por donde la dej. Para asegurarse de que el Timer WDT no llega a desbordamiento en un tiempo corto despus de que el microcontrolador sale del modo Power Down, se debe inicializar justo antes de entrar en dicho modo de funcionamiento.

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

221

8 Memoria externa
8.1 Introduccin
Muchas aplicaciones realizadas con microcontroladores de las familias MCS-51 y MCS-251 se pueden resolver con versiones que disponen de memoria interna de programa, por lo que no es necesario, en estas versiones, el uso de circuito integrados de memoria adicionales. Las versiones con memoria interna EPROM son tiles para elaborar prototipos, pero ms an son viables las versiones con memoria EPROM del tipo OTP, One-Time Programmable, y las versiones con memoria EEPROM tipo flash de Atmel, ya que las primeras carecen de la ventana de cuarzo para borrar las memorias EPROM, lo que simplifica su encapsulado y reduce considerablemente su coste, y las segundas disponen de una tecnologa que permite un coste reducido. De toda maneras, segn la aplicacin, puede ser necesario ampliar la capacidad de memoria de los microcontroladores, o emplear versiones que carezcan de memoria interna; en estos casos resulta imprescindible usar circuitos integrados de memoria externa para resolver la aplicacin. Entonces, es importante conocer correctamente la forma de conectar los circuitos de memoria al microcontrolador y saber determinar si las memorias son compatibles a nivel temporal con el microcontrolador.

8.2 Memorias semiconductoras


En un sistema basado en microprocesador o microcontrolador es necesario conocer los distintos tipos de memoria que se pueden utilizar, as como la formar de realizar el acceso a stas. Las memorias que ms se emplean son memorias no voltiles de slo lectura, ROM, destinadas a almacenar el cdigo de programa generado en la aplicacin. Estas memorias mantienen la informacin almacenada en ausencia de tensin de alimentacin. Las memorias voltiles de lectura/escritura, RAM, se emplean para contener las variables temporales utilizadas en el mismo programa de la aplicacin. Los tipos de memoria ROM ms usuales se clasifican en funcin de la forma de grabar los datos: -ROM, Read Only Memory: esta memoria se graba mediante la configuracin interna del circuito integrado durante el proceso de fabricacin. Luego, se debe proporcionar el programa de la aplicacin al fabricante y resulta adecuada para largas series de fabricacin. -PROM, ROM Programmable: la memoria PROM incorpora fusibles en la constitucin de cada celda interna de memoria, por lo que puede programarse por el usuario. La forma de grabar un dato en esta memoria suele consistir en aplicar una sobrecorriente al fusible de una celda de forma que cause su destruccin; en consecuencia, tan slo puede grabarse una vez.

Los autores, 2001; Edicions UPC, 2001.

222

Microcontroladores MCS-51 y MCS-251

-EPROM, Erasable Programmable ROM: esta memoria emplea un transistor MOS de puerta flotante como elemento bsico de cada una de sus celdas. Puede grabarse elctricamente y borrarse mediante su exposicin a una fuente de rayos ultravioleta, para lo cual dispone de un encapsulado especial cermico con una ventana de cristal de cuarzo que encarece su coste. Esta memoria es adecuada para realizar prototipos y para series cortas de fabricacin, aunque, en su versin OTP, One Time Programmable, se reduce considerablemente su costo debido a que se elimina la ventana de cuarzo del encapsulado, por lo que slo puede programarse una vez y no se puede borrar. -EEPROM o E2PROM, Electrically Erasable and Programmable ROM: esta memoria utiliza el mismo transistor MOS de puerta flotante que la memoria EPROM, pero con una modificacin tecnolgica que permite grabar y borrar el transistor MOS elctricamente mediante efecto tnel . La memoria EEPROM no tiene ventana de cuarzo, por lo que tiene un coste ms reducido que la memoria EPROM. El tiempo de lectura de esta memoria es parecido al tiempo de lectura de las memorias RAM; no obstante, su tiempo de escritura, del orden de milisegundos, es demasiado elevado, lo que fuerza a establecer estados de espera en el proceso de escritura. Esta memoria es adecuada para aquellos sistemas que necesitan tener datos almacenados de forma estable, pero que pueden modificarse con cierta frecuencia. -FLASH: este tipo de memoria es de reciente aparicin y son memorias EEPROM que tienen una configuracin interna estructurada, a nivel de circuito, en bloques de bits, lo que permite reducir de manera considerable el rea de silicio respecto a su homloga EEPROM, lo que reduce, por tanto, su coste e incrementa su capacidad. El tiempo de escritura y de lectura de estas memorias es comparable con el requerido para las memorias RAM. Estas memorias se proporcionan con capacidades considerables, del orden del megabit, lo que hace que se apliquen para el almacenamiento de imgenes en cmaras digitales y en la sustitucin de la cinta magntica de los contestadores telefnicos. El problema que presentan estas memorias es que pueden soportar un nmero bastante menor de ciclos de lectura/escritura que las memorias EEPROM. Las memorias del tipo RAM, Ramdom Access Memory, de lectura/escritura, se utilizan bsicamente para grabar datos y resultados relacionados con el programa que ejecuta la aplicacin, y son voltiles, es decir, pierden la informacin contenida cuando se interrumpe la tensin de alimentacin del circuito integrado. Existen dos tipos de memorias RAM: -SRAM, Static RAM: esta memoria suele tener por base un biestable del tipo RS formado por cuatro transistores que almacenan el bit concreto, y un par de transistores adicionales que se usan para efectuar las operaciones de lectura/escritura. -DRAM, Dynamic RAM: existen muchos tipos de memorias DRAM en el mercado y se utilizan de forma masiva dentro del mercado de ordenadores destinados a la computacin y el procesamiento de datos. La clula bsica de esta memoria consiste en un nico transistor y un condensador implementado en silicio de manera que su tamao es sumamente reducido, por lo
1

El efecto tnel requiere de una capa muy delgada de xido aislante, SiO2, de alta calidad, para evitar que los electrones que atraviesan el xido entre la puerta flotante y el drenador del transistor MOS queden atrapados en esta capa por los defectos del xido.

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

223

que suelen ser memorias de alta capacidad de almacenamiento. La informacin se almacena en el condensador de celda de la memoria, utilizando para ello la carga y descarga del condensador, factor que hace que sean memorias de bajo consumo. Tienen el inconveniente de que deben regrabarse cada pocos milisegundos, debido a que se producen pequeas fugas en las cargas de los condensadores que causan la prdida del estado lgico almacenado, lo que hace que tengan una circuitera interna compleja para el refresco de la memoria.

8.3 Estructura externa de las memorias


En la figura 8.1 se presenta el esquema genrico de cualquier tipo de memoria y se indican cules son las entradas/salidas ms comunes de este tipo de dispositivos.
Entradas de direcciones A0,...,An-1

n
Entradas/salidas de datos

Memoria
Entradas de control

Fig. 8.1 Esquema general de un circuito integrado de memoria

Las memorias que se emplean para sistemas basados en un microcontrolador, suelen tener una estructura interna de celdas de tipo matricial, organizada en filas y columnas, donde cada celda contiene un bit de informacin, el nmero de columnas agrupa 8 bits (que forman un byte), y donde el nmero de filas determina la capacidad de la memoria. El tamao de estas memorias es de 256x8bits o 256bytes, 1kx8bits o 1kbyte, 2kbytes, 4kbytes, 8kbytes y as sucesivamente en potencias de 2. En estos sistemas tambin se utilizan memorias serie con un nico bit de entrada/salida. El dato a leer o escribir en estas memorias puede tener varios tamaos: es comn que sea de 8bits, de 16bits o de 32bits. Estas memorias suelen tener un encapsulado reducido y unas pocas lneas de control. Para acceder a cada posicin de memoria se dispone de un nmero determinado de lneas de direccin, dependiendo del tamao de la memoria que se desea emplear, de manera que se cumple la siguiente relacin: m = 2n, donde m es el tamao de la memoria en bytes y n el nmero de lneas de direccin. Las memorias (figura 8.1) tambin suelen tener 8 lneas de entrada/salida de datos, en las que se introducen los bytes que se quieren escribir o grabar. Se efecta su escritura o lectura, segn sea el caso, por medio de la activacin de las lneas de control que tienen asociadas. En lneas generales las memorias ROM, PROM y EPROM suelen tener una o ms seales del tipo CS, Chip Select, o CE, Chip Enable, y OE, Output Enable, para seleccionar y realizar la lectura de la memoria, respectivamente. En el caso de las memorias EPROM, stas suelen tener dos seales de control: /CE, habilitacin o seleccin del circuito integrado, y /OE, habilitacin de la salida. La tabla 8.1 resume los modos de funcionamiento de la memoria EPROM, considerando todos los posibles valores /CE y /OE.

Los autores, 2001; Edicions UPC, 2001.

224 Tabla 8.1 Lneas de control de una memoria EPROM

Microcontroladores MCS-51 y MCS-251

/OE L H X

/CE L L H

Salidas Dato Triestado Triestado

Modo Lectura Salidas inhibidas Bajo consumo

L=Low, 0 lgico. H=High, 1 lgico. X= indeterminado, 0 1 lgicos. Triestado= salidas en alta impedancia.

En la tabla 8.1 se observa cmo las salidas presentan un estado triestado en el cual cada lnea se pone en estado de alta impedancia, esta situacin se da en la mayor parte de las memorias semiconductoras, cuando la seal CE es inactiva, ya que la memoria entra un estado de bajo consumo, con un consumo al menos un 25% menor de lo habitual. En cuanto a las memorias del tipo RAM, suelen tener como seales de control /CS o /CE, que habilita el funcionamiento del circuito integrado, y RD/(/WR), Read/Write (lectura/escritura), que determina si se va a leer o escribir en la memoria; aunque, en lugar de esta seal combinada lectura/escritura, puede tener una lnea propia, /OE, para la lectura, y otra, /WE, Write Enable, para la escritura. La tabla 8.2 resume el funcionamiento de esta memoria considerando las lneas /CS y RD/(/WR), y la tabla 8.3 muestra su funcionamiento considerando las lneas /CE, /OE y /WE.
Tabla 8.2 Lneas de control de una memoria RAM

/CS H L L

RD/ WE

X H L

E/S de datos Triestado Salida dato Entrada dato

Modo de funcionamiento Inhabilitada Lectura Escritura

L=Low, 0 lgico. H=High, 1 lgico. X= indeterminado, 0 1 lgicos. Triestado= salidas en alta impedancia

Tabla 8.3 Lneas de control de una memoria RAM con las entradas de lectura/escritura separadas

/CE H L L L L

/OE X L H L H

/WE X H L L H

E/S de datos Tri-estado Salida dato Entrada dato Entrada dato Tri-estado

Modo Standby Lectura Escritura Escritura Inhabilitada

L=Low, 0 lgico. H=High, 1 lgico. X= indeterminado, 0 1 lgicos. Triestado= salidas en alta impedancia. Standby= estado de espera

8.4 Ciclos de fetch, de lectura y de escritura


El acceso a la memoria por parte del microcontrolador se puede efectuar de tres formas distintas, denominadas ciclos, donde se lleva a cabo, en cada una de ellas, una secuencia determinada de tiempos. Estos ciclos son: -Ciclo de fetch o de lectura de cdigo de operacin: el ciclo de fetch es una operacin de lectura de la memoria externa, donde la informacin leda es el cdigo de operacin de las instrucciones que debe ejecutar el microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

225

-Ciclo de lectura: el ciclo de lectura efecta una lectura sobre la memoria externa para leer un operando de una instruccin, que puede ser un dato o una direccin. -Ciclo de escritura: el ciclo de escritura escribe un dato sobre la memoria. La duracin de estos ciclos es diferente dependiendo del tipo de ciclo y es distinto para las familias MCS-51 y MCS-251. La duracin habitual de estos ciclos para la MCS-251 es de dos o tres estados, mientras que para la MCS-51 suele ser al menos de un ciclo mquina. Durante este tiempo se activan las seales involucradas en el acceso a la memoria externa de forma adecuada.

8.5 Conexin entre la MCS-51 y la memoria externa


En la conexin entre un microcontrolador de la MCS-51 y la memoria externa intervienen el bus de direcciones, el bus de datos y las lneas de control para gestionar la lectura/escritura en la memoria externa. El bus de direcciones para la MCS-51 es de 16 lneas y est soportado por los puertos P0 y P2 del microcontrolador. El bus de datos es de 8 bits y est ubicado en el puerto P0. El puerto P0 soporta, pues, el byte bajo del bus de direcciones y el bus de datos, de forma simultnea, mediante una multiplexacin temporal que se indica con la seal ALE. Esta multiplexacin temporal se puede deshacer con un latch externo de 8 bits (figura 8.2) conectando el puerto P0 al latch y la seal ALE a la entrada de reloj de ste.
MCS-51
P2
Memoria RAM/ EPROM

A15A8

P0 Latch ALE
CLK

D7D0 A7A0

Fig. 8.2 Conexin del bus de direcciones y de datos con una memoria externa, para la MCS-51

Adems de la seal ALE, en la MCS-51 existen ms lneas de control: /EA, /PSEN, /RD y /WR. /EA External Access inhibe, a 0 lgico, el acceso a la memoria interna de programas del microcontrolador. /PSEN se activa cuando se accede a la memoria externa de programa. /RD se activa cuando el microcontrolador procede a la lectura de la memoria externa de datos (RAM). Y /WR se activa al escribir en la memoria externa de datos. 8.5.1 Diagramas de tiempos para la MCS-51 Las figuras 8.3, 8.4 y 8.5 muestran los diagramas de tiempos del ciclo de fetch, de lectura y de escritura para la MCS-51. En las tablas 8.4 y 8.5 se indica el valor de los tiempos asociados para una frecuencia de reloj de 16MHz.
Tabla 8.4 Valores mnimos en nanosegundos de los tiempos indicados en los ciclos de fetch, de lectura y de escritura para la MCS-51, con una frecuencia de reloj de 16MHz

tLL
85

tAL
8

tLA
28

tLC
23

tCC
143

tCI
0

tRR tWW tDR


275 275 0

tLW tAW
138 120

tWHLH
23

tDWX tDW tWD


3 288 13

Los autores, 2001; Edicions UPC, 2001.

226

Microcontroladores MCS-51 y MCS-251

Tabla 8.5 Valores mximos de los tiempos en nanosegundos de los tiempos indicados en los ciclos de fetch, de lectura y de escritura para la MCS-51, con una frecuencia de reloj de 16MHz

tLIV tCIV tCIF tAIV


150 83 38
t LL
ALE

tCC tAFC tRD tDFR tLD


143
t LIV

tAD
398

tLW
238

tWHLH
103

tAFR
0

208

10

148

55
t CY

350

t LC
PSEN

t CC

t AL
P0

t LA
AD0..AD7

t CIV
INSTRUC

t CIF
AD0..AD7 INSTRUC

t AFC t AIV
P2 AD8..AD15

t CI
AD8..AD15

Fig. 8.3 Diagrama de tiempos de un ciclo fetch en memoria externa para la MCS-51
t LD t WHLH

ALE

PSEN

t LW
RD

t RR t DFR t DR
ENTRADA DEL DATO

t AL

t LA t AW
AD0..AD7

t RD t AFR
AD8..AD15

P0

t AD
P2

Fig. 8.4 Diagrama de tiempos de un ciclo de lectura en memoria externa para la MCS-51
t WHLH
ALE

PSEN

t LW
WD

t WW t DWX t WD

t AL
P0

t AW t LA
AD0..AD7

t DW
SALIDA DEL DATO

P2

AD8..AD15

Fig. 8.5 Diagrama de tiempos de un ciclo escritura en memoria externa para la MCS-51

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

227

En la ejecucin del ciclo de fetch para la MCS-51 se realizan los siguientes pasos: 1. 2. 3. 4. Colocar el byte alto y el byte bajo del bus de direcciones en el puerto P2, lneas A8,, A15, y P0, lneas A0,, A7, respectivamente. Forzar a que la seal ALE tenga un flanco de bajada para que el contenido del puerto P0, lneas A0,, A7, se almacenen en el latch. Una vez que la direccin est presente a la entrada de la memoria, se activa la seal /PSEN para realizar la lectura de la memoria. La memoria coloca el cdigo de operacin en el bus de datos, puerto P0; el microcontrolador lee este dato coincidiendo con el flanco de subida de /PSEN.

8.6 Ejemplos de conexin para la MCS-51


Ejemplo 8.1 Conexin de memorias EPROM y RAM La figura 8.6 muestra un ejemplo de conexin de una memoria EPROM 27C256 de 32kbytes y una memoria RAM 6164 de 8kbytes a un microcontrolador 80C31. Segn esta figura, la seal de habilitacin de la memoria EPROM, /CE, est conectada directamente a lnea A15 del bus de direcciones, de forma que cuando A15=0 la memoria est seleccionada, y cuando A15=1, no lo est. Este hecho implica que siempre que el cdigo de las instrucciones del programa est ubicado dentro de las primeras 32k direcciones, de las 64k direcciones posibles, la memoria EPROM quedar seleccionada, pues en el bus de direcciones aparece una direccin correspondiente a este rango. Estos rangos de direcciones donde se seleccionan las memorias EPROM, RAM o cualquier otro dispositivo que tenga que seleccionarse por medio de una direccin concreta, se denominan Mapa de memoria. El mapa de memoria donde se indican los rangos de direcciones de seleccin de las memorias EPROM y RAM de este ejemplo se muestran en la figura 8.7. En el circuito de la figura 8.7 se utiliza el circuito integrado 74LS373, constituido por 8 bsculas D con salida triestada, para deshacer la multiplexacin temporal en el puerto P0 entre las 8 lneas del bus de datos y las 8 lneas bajas del bus de direcciones. La seal de reloj de las bsculas est conectada a la seal ALE, de manera que cuando ALE est a 1 lgico, el estado lgico presente a la entrada de las 8 bsculas D pasa a la salida, y cuando la seal ALE pasa a 1 lgico, las bsculas mantienen el ltimo estado lgico presente en sus entradas. La lectura de la memoria EPROM se realiza a travs de la seal /PSEN (activa a 0 lgico y conectada a la entrada /OE de la memoria), para ello la memoria se debe seleccionar previamente con A15. La seleccin de la memoria RAM se realiza por medio de la seal /CS, que selecciona la memoria cuando est a 0 lgico. La seal /CS se ha conectado directamente a la lnea de direccin A13, de manera que la memoria se selecciona siempre que el microcontrolador realiza una lectura o escritura en los primeros 8kbytes de los 64kbytes posibles para la MCS51. No obstante, la memoria RAM se selecciona cada vez que la seal /CS est a 0 lgico, lo que ocurre cuando las direcciones del bus estn dentro de uno de los siguientes rangos de direcciones: 0000H-0FFFH, 2000H-2FFFH, 4000H-4FFFH, 6000H-6FFFH, 8000H-8FFFH,

Los autores, 2001; Edicions UPC, 2001.

228

Microcontroladores MCS-51 y MCS-251

A000H-AFFFH, C000H-CFFFH y E000H-EFFFH. Fuera de estas zonas la memoria no est seleccionada, tal y como se indica en la figura 8.7.

80C31
P0

RAM 6164 (8 kbytes)


D7D0

EPROM 27C256 (32 kbytes)


D7D0

Latch
D7D0 Q7Q0 A7A0

A13 ALE /EA P2 /RD /WR A15 /PSEN

74LS373
CLK A12A8

A7A0

A14A8

/CS /OE /WE

/OE

/CE

Fig. 8.6 Conexin de una memoria RAM de 8kbytes y una memoria EPROM de 32kbytes al 80C31

c)

Memoria de datos
0000H

RAM (8 k)
1FFFH 2000H Zona Imagen (8k) 2FFFH 4000H Zona Imagen (8k) 4FFFH 6000H Zona Imagen (8k) 6FFFH 8000H Zona Imagen (8k) 8FFFH

a) Memoria de programas
0000H

b)

Memoria de datos
0000H

RAM (8 kbytes) EPROM (32 kbytes)


7FFFH 8000H 1FFFH 2000H

Sin memoria

Sin memoria

A000H Zona Imagen (8k) AFFFH C000H Zona Imagen (8k) CFFFH E000H Zona Imagen (8k) EFFFH

FFFFH

FFFFH

Fig. 8.7 Mapa de memoria del circuito de la figura 8.6. a) Mapa de la memoria de programas. b) Mapa de la memoria de datos. c) Mapa de la memoria de datos considerando imgenes

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

229

80C31
P0

RAM1 6164 (8 kbytes)


D7D0

RAM2 6164 (8 kbytes)


D7D0

EPROM 27C256 (32 kbytes)


D7D0

Latch
D7D0 Q7Q0 A7A0 A7A0

A13 ALE /EA P2 /RD /WR A15 /PSEN

74LS373
CLK A12A8 A12A8

A7A0

A14A8

/CS /OE /WE

/CS /OE /WE

/OE

/CE

Fig. 8.8 Conexin de dos memorias RAM de 8kbytes y una memoria EPROM de 32kbytes al 80C31

Segn el mapa de memoria de la figura 8.7, la capacidad de memoria RAM del sistema puede ampliarse en 8kbytes ms conectando un circuito integrado de memoria RAM 6164 adicional, como se muestra en la figura 8.8. La memoria RAM2 se sita en las zonas del mapa de memoria de datos que no es imagen; para ello se conecta la lnea A13 mediante una puerta lgica NOT a la seal /CS de la memoria. Con el circuito de la figura 8.8, la memoria RAM1 se selecciona cuando la lnea A13 est a 0 lgico, mientras que la memoria RAM2 se selecciona cuando la lnea A13 est a 1 lgico. La memoria RAM2 ocupa las zonas sombreadas que hay en el mapa de memoria de la figura 8.7, y se selecciona cuando las direcciones del bus estn dentro de uno de los siguientes rangos de direcciones: 1000H-1FFFH, 3000H-3FFFH, 5000H5FFFH, 7000H-7FFFH, 9000H-9FFFH, B000H-BFFFH, D000H-DFFFH y F000H-FFFFH. Para utilizar ms circuitos integrados de memoria se necesita emplear una lgica de seleccin de la memoria algo ms compleja, que garantice la conexin de ms memorias y de otros dispositivos al microcontrolador; para ello en el siguiente ejemplo se propone el uso de un decodificador en la seleccin de las memorias. Ejemplo 8.2 Seleccin de memorias mediante el 74LS138 La figura 8.9 muestra el circuito de conexin de dos memorias EPROM 27C128 de 16kbytes cada una, y de dos memorias RAM 6164 de 8kbytes cada una. La seleccin de las memorias se efecta con el decodificador de 3 a 8 lneas 74LS138. Las salidas Y0-Y7 del 74LS138 se activan a 0 lgico cuando en las entradas, C, B y A, aparece el cdigo correspondiente de la salida, segn la tabla de verdad del decodificador de la figura 6.18. Las entradas G1, /G2A y /G2B son las lneas de habilitacin del decodificador y deben estar a 1, 0 y 0 lgicos, respectivamente, para que el decodificador funcione correctamente. El decodificador queda inhabilitado si la entrada G1 est a 0 lgico o cualquiera de las entradas /G2A o /G2B est a 1 lgico, es decir, si cualquiera de estas entradas est inhabilitada.

Los autores, 2001; Edicions UPC, 2001.

230

Microcontroladores MCS-51 y MCS-251

80C31
P0

RAM1 6164 (8 kbytes)


D7D0

RAM2 6164 (8 kbytes)


D7D0

EPROM1 27C128 (16 kbytes)


D7D0

EPROM2 27C128 (16 kbytes)


D7D0

Latch
D7D0 Q7Q0 A7A0 A7A0

A7A0

74LS373 ALE /EA A15 A14 A13 P2 /PSEN /WR /RD


CLK A12A8 A12A8 A13A8

A7A0

A13A8

/CS /OE /WE

/CS /OE /WE

/OE

/CE

/OE

/CE

74LS138
Vcc G1 /G2A /G2B C B A Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
Entradas Habilit. Seleccin G1 G2* C B A X H X X X L X X X X H L L L L H L L L H H L L H L H L L H H H L H L L H L H L H H L H H L H L H H H *G2=G2A+G2B

Salidas Y0 H H L H H H H H H H Y1 H H H L H H H H H H Y2 H H H H L H H H H H Y3 H H H H H L H H H H Y4 H H H H H H L H H H Y5 H H H H H H H L H H Y6 H H H H H H H H L H Y7 H H H H H H H H H L

Fig. 8.9 Conexin de dos memorias RAM y de dos memorias EPROM con el 74LS138

Conectando la lnea A15 a la entrada C del 74LS138, la lnea A14 a la entrada B y la lnea A13 a la entrada A, la salida Y0 del decodificador se activa siempre y cuando las lneas A15, A14 y A13 estn a 0 lgico, lo que ocurre en el rango de direcciones comprendido entre 0000H y 1FFFH, es decir, las primeras 8k posiciones del mapa de memoria. De la misma forma, cada una de las restantes entradas se activa con un rango de 8k posiciones del mapa de memoria, segn la tabla 8.6.
Tabla 8.6 Espacio de memoria en el cual se activan las salidas del 74LS138 en la figura 8.9

Salida activa
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7

Espacio de memoria
0000H-1FFFH 2000H-3FFFH 4000H-5FFFH 6000H-7FFFH 8000H-9FFFH A000H-BFFFH C000H-DFFFH E000H-FFFFH

Memoria habilitada
RAM1 y EPROM1 RAM2 y EPROM1 EPROM2 EPROM2 -

Las lneas de seleccin de las memorias RAM1 y RAM2, al tener una capacidad de 8kbytes, se conectan directamente a las salidas Y0 y Y1 del decodificador, respectivamente. La memoria EPROM1 tiene una capacidad de 16kbytes, por lo que su lnea de seleccin, /CE, est conectada a las salidas Y0 e Y1 por medio de una puerta AND. Esta memoria se habilita siempre y cuando el microcontrolador efecte una lectura en los primeros 16kbytes del mapa de

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

231

memoria. De la misma forma, la entrada /CE de la memoria EPROM2 se conecta a las salidas Y2 y Y3; se habilita cuando el microcontrolador realiza una lectura en el espacio comprendido entre 4000H y 7FFFH del mapa de memoria.

8.7 Conexin con la memoria externa para la familia MCS-251


La interfaz de acceso a la memoria externa comprende todas las lneas del microcontrolador que intervienen en la conexin con la memoria externa. Estas lneas estn agrupadas en tres buses: bus de direcciones, bus de datos y bus de control. El bus de direcciones puede ser de 16, 17 18 lneas, configurable por el usuario. En cualquier caso, independientemente de la opcin elegida, los 16 bits de menor peso del bus de direcciones estn implementados por los puertos P0 y P2. Si se configura el microcontrolador para tener 17 lneas de bus de direcciones, el bit de mayor peso del bus, A16, est ubicado en el pin P3.7. Si se utilizan 18 lneas de bus de direcciones, la lnea de mayor peso, A17, est ubicada en el pin P1.7. En la tabla 8.7 se indica la localizacin de las diferentes lneas del bus de direcciones.
Tabla 8.7 Ubicacin del bus de direcciones

Bus de direcciones
A0,,A7 A8,,A15 A16 A17

Ubicacin
P0.0,,P0.7 P2.0,,P2.7 P3.7 P1.7

El bus de datos es de 8 bits y su ubicacin es configurable por el usuario, quien debe elegir entre dos opciones: modo paginado y modo no paginado (tabla 8.8).
Tabla 8.8 Posibilidades de ubicacin del bus de datos

Bus de datos
Modo no paginado Modo paginado

Ubicacin
P0.0,,P0.7 P2.0,,P2.7

Caractersticas
Compatible con el 8XC51 Acceso ptimo a la memoria externa

El modo paginado es ms eficiente en el acceso a la memoria externa, ya que reduce el tiempo invertido por el microcontrolador para leer los cdigos de operacin de las instrucciones, pero no es compatible con los microcontroladores de la familia MCS-51. En cuanto a las conexiones externas, la diferencia entre ambos modos radica en la ubicacin del bus de datos. En el modo no paginado el bus de datos est implementado por el puerto P0, que al mismo tiempo implementa las 8 lneas de menor peso del bus de direcciones, de la A0 a la A7. Debido a esta duplicidad de tareas, el puerto P0 debe conectarse a un registro, o latch, de 8 bits, cuya carga est controlada por la seal ALE, a fin de almacenar la parte baja de la direccin (figura 8.10). En cambio, si el microcontrolador est configurado en modo paginado, es el puerto P2 el que realiza la funcin de bus de datos, al mismo tiempo que implementa las 8 lneas del bus de direcciones que van de la A8 a la A15. En este caso el latch se conecta al puerto P2, a fin de almacenar los bits de direcciones A8,..,A15.

Los autores, 2001; Edicions UPC, 2001.

232

Microcontroladores MCS-51 y MCS-251

8XC251Sx
P2

RAM/ EPROM

8XC251Sx

RAM/ EPROM

A15:8 D7:0 P2 ALE P0 Latch

D7:0 A15:8 A7:0

P0 ALE

Latch

A7:0

Modo no paginado

Modo paginado

Fig. 8.10 Estructura del bus en modo no paginado y modo paginado

El bus de control est compuesto por todas aquellas seales que permiten controlar qu tipo de operacin, de lectura o escritura se realiza sobre la memoria externa. El microcontrolador 8XC251Sx dispone de dos seales de control de lectura, /RD y /PSEN, y una de escritura, /WR (tabla 8.9). El rango de direcciones asociadas a estas seales de control depende del valor de los bits de configuracin RD1 y RD0.
Tabla 8.9 Seales de acceso a la memoria externa

Nombre Tipo
A17 A16 A15:8 AD7:0 ALE /EA /PSEN O O O I/O O I O

Descripcin
Lnea de direccin A17. Lnea de direccin A16. Parte alta del bus de direcciones. Bus de datos y parte baja del bus de direcciones (nodo no paginado). Address Latch Enable. Controla la carga del registro de 8 bits que est conectado al puerto que realiza las funciones de bus de datos. External Access. Esta entrada inhibe, si esta a cero lgico, el acceso a la memoria OTPROM/ROM interna del microcontrolador. Program Store Enable. Esta seal controla las operaciones de lectura en la memoria externa. El rango de direcciones para las que opera esta seal de control depende de los bits de configuracin RD1 y RD0. Seal de lectura o lnea A16 del bus de direcciones. Dependiendo del valor de los bits de configuracin RD1 y RD0 esta lnea controla la lectura de memoria externa en las direcciones [ 7F:FFFFH, o bien implementa la lnea de mayor peso del bus de direcciones. Seal de escritura. Esta seal controla las operaciones de escritura en la memoria externa.

Multiplexado con P1.7/CEX4 P3.7/RD P2.0,..,P2.7 P0.0,..,P0.7 /PROG

/RD

P3.7/A16

/WR

P3.6

Existen otras seales de control auxiliar que intervienen en el acceso a la memoria externa, como son la seal ALE (Address Latch Enable) y /EA (External Access). La seal ALE est ubicada en el pin 30 del microcontrolador (encapsulado DIP) y controla la carga del registro que est conectado al bus de datos. El pin /EA se corresponde con el pin 31 del microcontrolador (encapsulado DIP) e inhibe, cuando est a 0 lgico, el acceso a la memoria interna del tipo ROM. En la tabla 8.9 se resume la totalidad de seales que intervienen, por parte del microcontrolador, en el acceso a la memoria externa.

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

233

8.8 Configuraciones de acceso a la memoria externa


Como ya se ha comentado en los apartados anteriores, el usuario puede escoger entre diversas opciones de configuracin de acceso a la memoria externa, que bsicamente consisten en elegir el nmero de lneas del bus de direcciones y la ubicacin del bus de datos. En los apartados siguientes se estudiarn algunas de estas configuraciones a travs de ejemplos prcticos. 8.8.1 18 bits de bus de direcciones (RD1, RD0 = 00) Se va ha considerar, en primer lugar, la configuracin que permite tener 18 lneas de bus de direcciones: RD1 = 0 y RD0 = 0. Con 18 lneas de bus de direcciones se pueden direccionar hasta 256Kbytes de memoria externa. Para esta configuracin las seales que controlan las operaciones de lectura/escritura en la memoria externa son dos: ] /PSEN: controla las operaciones de lectura en la memoria externa para cualquier direccin, de la 00:0000H a la FF:FFFFH. ] /WR: controla las operaciones de escritura en la memoria externa para cualquier direccin, de la 00:0000H a la FF:FFFFH. Ejemplo 8.3 Conexin de una memoria RAM de 256Kbytes En la figura 8.11 se presenta un ejemplo de conexin de una memoria RAM de 256Kbytes de capacidad al microcontrolador 8XC251Sx: se puede observar cmo el registro est conectado al puerto P0, al igual que las entradas de datos de la memoria RAM. Esto significa que el bus de datos est ubicado en el puerto P0, por tanto, el microcontrolador est trabajando en modo no paginado.

8XC251S x

RAM 256Kbytes
D7:0

P0 ALE EA P2 A16 A17 WR PSEN

Latch

A7:0

A15:8 A16 A17 OE CE WE

Fig. 8.11 Conexin de una memoria RAM de 256Kbytes al microcontrolador 8XC251Sx en modo paginado

La seal ALE controla la carga del registro y se activa cuando en el puerto P0 est disponible la parte baja de la direccin (A0, , A7). Esta parte baja quedar almacenada en el registro, cuyas salidas estn conectadas a las 8 lneas de direcciones de menor peso de la memoria RAM. El puerto P2 est conectado a las lneas de direcciones A8, ..., A15 de la memoria RAM. Las

Los autores, 2001; Edicions UPC, 2001.

234

Microcontroladores MCS-51 y MCS-251

dos ltimas lneas de direcciones del microcontrolador, A16 y A17, estn conectadas a las dos entradas de direcciones de mayor peso de la memoria RAM. Para controlar las operaciones de lectura y escritura se han conectado las salidas /WR y /PSEN del microcontrolador a las entradas de control de la memoria RAM, /WE (Write Enable) y /OE (Output Enable), respectivamente. Por otra parte, la entrada /CE de la memoria RAM est conectada a masa, de forma que el integrado de memoria RAM est permanentemente habilitado. Tambin se puede observar en la figura 8.11 que el pin /EA del microcontrolador est conectado a masa, lo que significa que la memoria ROM interna est inhibida y no es accesible. El microcontrolador puede realizar tres tipos de operaciones, denominadas ciclos, sobre la memoria externa: 1. Ciclo de lectura: el microcontrolador ejecuta un ciclo de lectura sobre la memoria externa para leer un operando, que puede ser un dato o una direccin, almacenado en una posicin de la memoria externa. 2. Ciclo de escritura: el microcontrolador ejecuta un ciclo de escritura sobre la memoria externa para escribir el contenido de una posicin de memoria. 3. Ciclo de fetch o de lectura de cdigo de operacin: el ciclo de fetch es una operacin de lectura de la memoria externa, donde la informacin leda es el cdigo de operacin de la siguiente instruccin que debe ejecutar el microcontrolador. Estas operaciones tienen una duracin de dos o tres estados, durante los cuales se activan las seales involucradas en el acceso a la memoria externa, en el momento y orden adecuado, como se puede observar en los cronogramas correspondientes. En la figura 8.12 est representado el cronograma del ciclo de fetch para el modo no paginado, que tiene una duracin de dos estados, o sea, cuatro perodos de reloj. En la ejecucin del ciclo de fetch se realizan los siguientes pasos: 1. Al comienzo del ciclo de fetch se coloca la parte alta de la direccin, donde est almacenado el cdigo de operacin que va a leer el microcontrolador, en el puerto P2 (A8, , A15). Si se utiliza un bus de direcciones de 17 18 lneas tambin aparece en ese momento su valor correspondiente en sus respectivas ubicaciones (P3.7 y P1.7). 2. A continuacin el microcontrolador coloca la parte baja de la direccin (A0, , A7) en el puerto P0. 3. El microcontrolador hace pasar la seal ALE por un flanco de bajada de forma que se carga en el registro el contenido del puerto P0, o sea, las lneas A0, , A7 del bus de direcciones. 4. Una vez que la direccin est disponible en las entradas de direcciones de la memoria, el microcontrolador activa la seal de lectura, indicando con ello a la memoria que ya puede colocar un dato vlido en el bus de datos. 5. Si todo va bien la memoria RAM responde a la activacin de la seal de lectura colocando el cdigo de operacin en el bus de datos. El microcontrolador lee este cdigo coincidiendo con el flanco de subida de /PSEN.

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

235
Estado 1 XTAL Estado 2

ALE

/RD, /PSEN

4 2 5
A7:0 D7:0

P0

1
A17, A16, P2 A17,A16,A15:8

Fig. 8.12 Ciclo de fetch en modo no paginado

En la figura 8.13 est representado el cronograma del ciclo de lectura en modo no paginado. Este ciclo tiene una duracin de 6 perodos de reloj. La secuencia de un ciclo de lectura es similar a la del ciclo de fetch, con la nica diferencia que tiene una duracin mayor.
Estado 1 XTAL Estado 2 Estado 3

ALE

/RD, /PSEN

P0

A7:0

D7:0

A17, A16, P2

A17, A16, A15:8

Fig. 8.13 Ciclo de lectura en modo no paginado

En la figura 8.14 est representado el cronograma correspondiente al ciclo de escritura en modo no paginado, cuya duracin tambin es de 6 perodos de reloj. La secuencia de activacin de las seales de control tambin es similar a la del ciclo de lectura, con la nica diferencia que, en este caso, el microcontrolador activa la seal de escritura /WR en lugar de la seal de lectura. Si se opta por trabajar en modo paginado, se deber conectar el registro, o latch, de 8 bits a la salida del puerto P2 (figura 8.15). Trabajar en modo paginado tiene como principal ventaja un ahorro de tiempo en el acceso a la memoria externa. Esto es debido a que el ciclo de fetch, en determinadas circunstancias, se ejecuta en tan slo un estado en lugar de dos. En efecto, cuando el microcontrolador debe leer el siguiente cdigo de operacin en una direccin donde los bits A8, , A15 del bus de direcciones han cambiado con respecto al valor que tenan para la instruccin anterior, la lectura dura dos estados. Ahora bien, la lectura de los siguientes cdigos de operacin dura un solo estado, siempre y cuando los bits A8, , A15 del bus de direcciones no cambien.

Los autores, 2001; Edicions UPC, 2001.

236
Estado 1 XTAL Estado 2

Microcontroladores MCS-51 y MCS-251


Estado 3

ALE

/WR A7:0 D7:0

P0

A17, A16, P2

A17, A16, A15:8

Fig. 8.14 Ciclo de escritura en modo no paginado

8XC251Sx

RAM 256Kbytes
D7:0

P2 ALE EA P0 A16 A17 WR PSEN

Latch

A15:8

A7:0 A16 CE A17 OE WE

Fig. 8.15 Conexin de una memoria RAM de 256Kbytes al microcontrolador 8XC251Sx en modo paginado

En la figura 8.16 se presenta el cronograma para estas dos situaciones. El primer ciclo de fetch tiene una duracin de 2 estados, porque hay un cambio de los bits A8, , A15, con respecto a la direccin anterior. En el segundo ciclo de fetch se mantiene el valor de los bits A8, , A15 y, por tanto, la duracin es de solo 1 estado.
Ciclo 1, cambio de pgina Estado 1 XTAL Estado 2 Ciclo 2 misma pgina Estado 1

ALE

/PSEN

A17, A16, P0

A17, A16, A7:0

A17, A16, A7:0

P2

A15:8

D7:0

D7:0

Fig. 8.16 Ciclo de fetch en modo paginado

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

237

Finalmente, en las figuras 8.17a) y 8.17b) se presenta el cronograma de los ciclos de lectura y escritura en modo paginado. La nica diferencia con respecto a los cronogramas del modo no paginado (figuras 8.13 y 8.14) es que el bus de datos est ubicado en el puerto P2.
Estado 1 XTAL Estado 2 Estado 3

Estado 1 XTAL

Estado 2

Estado 3

ALE

ALE

/RD, /PSEN A17, A16, A7:0

/WR

A17, A16, P0 A15:8

A17, A16, P0
D7:0

A17, A16, A7:0

P2

P2

A15:8

D7:0

a)

b)

Fig. 8.17 a) Ciclo de lectura y b) ciclo de escritura en modo paginado

Hay diseos en los que la memoria externa utilizada tiene un retardo importante y no puede responder al microcontrolador con la rapidez necesaria. En estos casos, para que no se produzcan lecturas o escrituras errneas se deben introducir ciclos de espera. Los ciclos de espera resuelven este problema, ya que alargan el ciclo de fetch, el ciclo de lectura y el de escritura, el tiempo suficiente para que la memoria externa responda adecuadamente. Configurando convenientemente el microcontrolador es posible introducir 0, 1, 2 3 ciclos de espera para las seales /RD, /WR y /PSEN. En la figura 8.18 est representado el cronograma del ciclo de fetch con un estado de espera adicional que proporciona a la memoria externa un tiempo suplementario, equivalente a dos periodos de reloj, para que coloque el cdigo de operacin en el bus de datos. En la figura 8.19 est representado el ciclo de lectura con un estado de espera adicional. Tambin es posible introducir un estado de espera en la seal ALE para poder cargar adecuadamente el registro cuando ste es excesivamente lento. En la figura 8.20 se muestra un ciclo de fetch donde se ha introducido un estado de espera en la seal ALE.
Estado 1 XTAL Estado 2 Estado 3

ALE

/RD, /PSEN A7:0 D7:0

P0

A17, A16, P2

A17, A16, A15:8

Fig. 8.18 Ciclo de fetch en modo no paginado con un estado de espera adicional

Los autores, 2001; Edicions UPC, 2001.

238
Estado 1 XTAL Estado 2 Estado 3

Microcontroladores MCS-51 y MCS-251


Estado 4

ALE

/WR A7:0 D7:0

P0

A17, A16, P2

A17, A16, A15:8

Fig. 8.19 Ciclo de escritura en modo no paginado con un estado de espera


Estado 1 XTAL Estado 2 Estado 3

ALE

/RD, /PSEN

P0

A7:0

D7:0

A17, A16, P2

A17, A16, A15:8

Fig. 8.20 Ciclo de fetch en modo no paginado con un estado de espera en la seal ALE

Ejemplo 8.4 Conexin de una memoria EPROM y otra RAM de 128Kbytes cada una En la figura 8.21 se presenta un ejemplo de conexin de la memoria externa al microcontrolador para una configuracin de 18 lneas de bus de direcciones y modo no paginado. En este caso se ha conectado al microcontrolador una memoria RAM de 128Kbytes de capacidad y una memoria EPROM de la misma capacidad.

8XC251S x

RAM 128Kbytes D7:0

EPROM 128Kbytes D7:0 A7:0 A15:8 A16

P0 ALE P2 EA A16 A17 WR PSEN

Latch

A7:0 A15:8 A16 CE OE WE

OE

CE

Fig. 8.21 Esquema de conexin en modo no paginado (RD1, RD0 = 00)

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

239

En la figura 8.22 se muestra cmo queda distribuido el espacio de direcciones del microcontrolador entre los integrados de memoria considerados en este ejemplo. En esta figura se puede observar que la memoria RAM est vinculada a las direcciones de las regiones 00:, 01:, FC: y FD:, mientras que la memoria EPROM est vinculada a las direcciones de las regiones FE:, FF:, 02: y 03:. A cada posicin fsica de la memoria RAM se puede acceder a travs de dos direcciones distintas, una perteneciente a las regiones 00: 01:, y la otra perteneciente a las regiones FC: o FD: que se denominan zonas imagen. Igualmente se puede acceder a cualquier posicin de la memoria EPROM utilizando dos direcciones distintas: una perteneciente a las regiones FE: o FF:, y la otra perteneciente a las regiones 02: o 03: (zonas imagen). En la figura 8.23 se puede observar las direcciones de memoria externa asociadas a cada uno de los circuitos integrados de la figura 8.21, junto con las regiones del mapa de memoria del microcontrolador al que estn vinculadas esas direcciones.
Espacio de memoria (512Kbytes) FFFFH FF: 0000H FE: FD: FC: Memoria EPROM externa 128Kbytes

Memoria externa 256Kbytes


Memoria RAM externa 128Kbytes (imagen)

A17 A16

1 1 0

1 0 1 0

EPROM

03:, FF: 02:, FE:

03: 02: 01: 0000H 00: 0420H 00:0000H FFFFH

RAM

01:, FD: 00:, FC:

Memoria EPROM externa 128Kbytes (imagen)

Fig. 8.23 Regiones asociadas a las memorias RAM y EPROM

Memoria RAM externa 128Kbytes 1056 Bytes de memoria RAM interna

Fig. 8.22 Espacio de memoria para el ejemplo 8.2

8.8.2 17 bits de bus de direcciones (RD1, RD0 = 01) Con esta configuracin se dispone de 17 lneas de bus de direcciones externo: las 16 primeras lneas, A0-A15, implementadas mediante los puertos P0 y P2, y la lnea A16 implementada en el pin P3.7. Esta configuracin permite direccionar hasta 128Kbytes de memoria externa. La lnea A16 del bus de direcciones externo selecciona entre las dos regiones de 64Kbytes de memoria externa. En este caso las direcciones de las regiones 00:, 02:, FC: y FE: (todas ellas con el bit A16 =0) permiten acceder a la primera regin de 64Kbytes de memoria externa. Por otra parte, las direcciones de las regiones 01:, 02:, FD: y FF: (todas ellas con el bit A16=1) posibilitan el acceso a la otra regin de 64Kbytes de memoria externa (figura 8.24).

Los autores, 2001; Edicions UPC, 2001.

240

Microcontroladores MCS-51 y MCS-251

A16

Memoria externa 128Kbytes 64Kbytes 01:, 03:, FD:, FF: 64Kbytes 00:, 02:, FC:, FE:

1 0

Fig. 8.24 Regiones asociadas a las direcciones de memoria externa para RD1, RD0 = 01

Ejemplo 8.5 Conexin de una memoria RAM de 128Kbytes En la figura 8.25 est representada la conexin de una memoria RAM de 128Kbytes de capacidad al microcontrolador 8XC251Sx, configurado con 17 lneas de bus de direcciones en modo no paginado.
8XC251Sx
RAM 128Kbytes D7:0

P0 ALE EA P2 A16 WR PSEN

Latch

A7:0

A15:8 A16 OE CE WE

Fig. 8.25 Esquema de conexin modo no paginado

8.8.3 16 bits de bus de direcciones (RD1, RD0 = 10) Esta configuracin permite tener un total de 16 lneas de bus de direcciones, de la A0 a la A15, implementadas con los puertos P0 y P2, lo que posibilita direccionar hasta 64Kbytes de memoria externa. Para esta configuracin todas las regiones de memoria interna (00:, 01:, 02:, 03:, FC:, FD:, FE: y FF:) estn ubicadas en la misma regin de memoria externa de 64Kbytes (figura 8.26).
Memoria externa 64Kbytes 64Kbytes 00:, 01:, 02:, 03:, FC:, FD:, FE:, FF:
Fig. 8.26 Regiones asociadas a las direcciones de memoria externa para RD1, RD0 = 10

8.8.4 16 bits de bus de direcciones (RD1, RD0 = 11) Esta configuracin es la nica compatible con los microcontroladores de la familia MCS-51. Por este motivo, dispone de 16 lneas de bus de direcciones y de tres seales de control de acceso a la memoria externa: ] /PSEN: seal de control de lectura de la memoria externa para las regiones FC:, FD:, FE: y FF:. ] /RD: seal de control de lectura de la memoria externa para las regiones 00:, 01:, 02: y 03:. ] /WR: seal de control de escritura de la memoria externa para las regiones 00:, 01:, 02: y 03:.

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

241

Para que la compatibilidad con la familia MCS-51 sea completa, se debe configurar al microcontrolador 8XC251Sx para que trabaje en modo no paginado. Ejemplo 8.6 Conexin de una memoria RAM de 64Kbytes en modo paginado En la figura 8.27 est representado un ejemplo de conexin de una memoria RAM de 64Kbytes al microcontrolador 8XC251Sx configurado en modo paginado. En esta aplicacin el cdigo del programa se almacena en la memoria interna ROM/OTPROM/EPROM. 8XC251S x
RAM 64 Kbytes D7:0 P2 ALE EA P0 WR A7:0 CE A15:8

Latch

PSEN

OE

WE

Fig. 8.27 Ejemplo de conexin para modo paginado (RD1, RD0 = 10)

Ejemplo 8.7 Conexin de una memoria RAM de 64Kbytes en modo no paginado En la figura 8.28 se muestra el esquema de un ejemplo de conexin, para esta configuracin, de un microcontrolador 8XC251Sx con una memoria RAM de 64Kbytes. En este caso, se ha conectado la entrada de escritura de la memoria RAM, /WE, a la salida de escritura del microcontrolador, /WR. Por otra parte, se ha conectado la entrada de habilitacin de lectura, /OE, a la salida de una puerta lgica que realiza la operacin AND entre las dos seales de control de lectura del microcontrolador, /PSEN y /RD. De esta forma, siempre que se ejecute una lectura en la memoria externa, para cualquier regin del mapa de memoria disponible (00:, 01:, 02:, 03:, FC:, FD:, FE: y FF:), se activar la entrada de lectura de la memoria RAM. 8XC251S x
RAM 64 Kbytes D7:0

P0 ALE EA P2 RD

Latch

A7:0

A15:8 CE OE

WR

PSEN

WE

Fig. 8.28 Ejemplo de conexin en modo no paginado (RD1, RD0 = 11)

Los autores, 2001; Edicions UPC, 2001.

242

Microcontroladores MCS-51 y MCS-251

A pesar de que slo se dispone de 16 lneas de bus de direcciones en esta configuracin, es posible direccionar hasta un total de 128Kbytes de memoria externa utilizando de forma separada las seales de control /PSEN, /WR y /RD (ejemplo 8.8). Ejemplo 8.8 Conexin de dos memorias de 64Kbytes con RD1, RD0 = 11 En la figura 8.29 se muestra la conexin de dos integrados de memoria, de 64Kbytes cada uno, al microcontrolador 8XC251Sx, configurado con RD1, RD0 = 11. La memoria RAM se controla exclusivamente con las seales /WR y /RD, de forma que se habilitar su funcionamiento para aquellas direcciones correspondientes a las regiones 00:, 01:, 02: y 03:. Por otra parte, el integrado de memoria EPROM se controla con la seal /PSEN; esto significa que slo se habilita cuando se efectan lecturas en direcciones correspondientes a las regiones FC:, FD:, FE: y FF:.

8XC251Sx

RAM 64 Kbytes D7:0

EPROM 64 Kbytes D7:0 A7:0 A15:8

P0 ALE P2 EA WR PSEN RD

Latch

A7:0 A15:8

WE OE CE OE CE

Fig. 8.29 Ejemplo de conexin en modo no paginado (RD1, RD0 = 11)

Ejemplo 8.9 Diseo de la decodificacin de memoria de un sistema microprocesador Se pretende disear un sistema basado en el microcontrolador 8XC251 que se ajuste al mapa de memoria de la figura 8.30, estando el microcontrolador configurado para ser compatible con la familia MCS-51: modo no paginado y 16 lneas de bus de direcciones (RD1, RD0 = 11).
Mapa de memoria controlado por /PSEN VAC O FFFFH C000H BFFFH A000H 9FFFH VACO EPROM EPROM 2000H 1FFFH 0000H VACO Mapa de memoria controlado por /WR y /RD FFFFH RAM C000H BFFFH VACO 6000H 5FFFH 4000H 3FFFH 0000H

RAM

Fig. 8.30 Mapa de memoria del sistema microcontrolador

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

243

Para realizarlo se dispone de un circuito integrado de memoria EPROM de 32Kbytes y de un circuito integrado de memoria RAM de 32Kbytes (figura 8.31).
EPROM
OE DO D7 A0 CE A14 15 CE 8 OE WE

RAM
DO D7 A0 A14

15

Fig. 8.31 Integrados de memoria utilizados

En la decodificacin del mapa de memoria se ha utilizado el decodificador 74138 cuyo esquema elctrico y tabla de verdad aparecen en la figura 8.32.
74LS138 G1 G2A G2B C B A Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
Entradas Habilit. Seleccin G1 G2* C B A X H X X X L X X X X H L L L L H L L L H H L L H L H L L H H H L H L L H L H L H H L H H L H L H H H * G2=G2A+G2B Salidas Y0 H H L H H H H H H H Y1 H H H L H H H H H H Y2 H H H H L H H H H H Y3 H H H H H L H H H H Y4 H H H H H H L H H H Y5 H H H H H H H L H H Y6 H H H H H H H H L H Y7 H H H H H H H H H L

Fig. 8.32 Decodificador octal 74138

En la figura 8.33 est representado el esquema elctrico correspondiente a la decodificacin de la memoria externa.
8XC251
ALE P0 P2 RD PSEN LATCH 8 BITS

EPROM
A0,...,A12 OE CE D0,...,D7

WR

RAM
0V 0V 5V

A13 A14 A15

74138 Y0 G2A Y1 G2B Y2 G1 Y3 Y4 A Y5 B Y6 C Y7

PSEN

RD

D0,...,D7 A0,...,A14 OE CE WE

PSEN

RD WR

Fig. 8.33 Esquema elctrico de la decodificacin de memoria

Los autores, 2001; Edicions UPC, 2001.

244

Microcontroladores MCS-51 y MCS-251

Ejemplo 8.10 Decodificacin de memoria de un sistema microprocesador con RD1, RD0=10 Se desea disear un sistema basado en el microcontrolador 8XC251Sx que se ajuste al mapa de memoria de la figura 8.34. El microcontrolador est configurado para trabajar en modo no paginado con 16 lneas de bus de direcciones (RD1, RD0 = 10). Para realizarlo se disponen de integrados de memoria PROM de 4Kbytes e integrados de memoria RAM de 4K x 4 bits cuyos esquemas elctricos aparecen en la figura 8.35.
VAC O FFFFH B000H AFFFH 9000H 8FFFH VACO 1000H 0FFFH 0000H

RAM

PROM

Fig. 8.35 Esquema elctrico de las memorias RAM y PROM

Fig. 8.34 Mapa de memoria del sistema C

Para implementar los 4Kbytes de memoria PROM, de la direccin 0000H a la 0FFFH, slo es necesario un circuito integrado. En la tabla 8.10 se indican los valores de las lneas del bus de direcciones que habilitan el integrado de memoria PROM.
Tabla 8.10 Direcciones asociadas a la memoria PROM

A15 A14 A13 A12 A11 . . . . . . .A0 0 0 0 0 0....... 0 0 0 0 0 X.......X 0 0 0 0 1....... 1

Direcciones 0000H ...... 0FFFH

Se accede a la memoria PROM cuando las cuatro lneas de mayor peso del bus de direcciones valen 0 lgico, A15=A14=A13=A12=0; por tanto, la funcin que habilita o selecciona el funcionamiento de la memoria PROM es:
CSPROM = A 15 A 14 A 13 A 12

Esta funcin se implementa mediante una puerta NOR de cuatro entradas (figura 8.36).

PSEN

Fig. 8.36 Decodificacin de la memoria PROM

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

245

La salida de esta puerta NOR estar conectada a una de las entradas de habilitacin de la memoria, CS2, mientras que la otra entrada de habilitacin, CS1, est conectada a la seal de lectura de memoria externa, /PSEN. Por otra parte, para implementar la zona de memoria RAM de 8Kbytes se divide sta en dos zonas de 4Kbytes cada una (figura 8.37), ya que los integrados de memoria RAM disponibles son de 4Kbytes.

9000 H RAM 1 9FFF H A000 H RAM 2 AFFF H

Fig. 8.37 Ubicacin de las memorias RAM

Para cubrir cada zona de memoria RAM (RAM 1 y RAM 2) necesitamos utilizar dos integrados de memoria RAM de 4K x 4 bit: uno se encargar de almacenar los 4 bits de menor peso del dato y el otro almacenar los 4 bits de mayor peso. En la tabla 8.11 se indican los valores de las lneas del bus de direcciones que permiten el acceso a la zona RAM 1.
Tabla 8.11 Direcciones asociadas a la memoria RAM 1

A15 A14 A13 A12 A11 . . . . . . .A0 1 0 0 1 0....... 0 0 0 0 0 X.......X 1 0 0 1 1....... 1

Direcciones 9000 H ...... 9FFF H

Vemos, pues, que para acceder a la zona de memoria RAM 1, las cuatro lneas de mayor peso del bus de direcciones deben adquirir los siguientes valores: A15=1, A14=0, A13=0 y A12=1. Por tanto, la funcin que selecciona la zona de memoria RAM 1 es:

CSRAM1 = A15 A14 A13 A12


En la tabla 8.12 se indican los valores del bus de direcciones que permiten acceder a la memoria RAM 2.
Tabla 8.12 Direcciones asociadas a la memoria RAM 2

A15 A14 A13 A12 A11 . . . . . . .A0 1 0 1 0 0....... 0 0 0 0 0 X.......X 1 0 1 0 1....... 1

Direcciones A000 H ...... AFFF H

Los autores, 2001; Edicions UPC, 2001.

246

Microcontroladores MCS-51 y MCS-251

Para acceder a la zona de memoria RAM 2, las cuatro lneas de mayor peso del bus de direcciones deben adquirir los siguientes valores: A15=1, A14=0, A13=1 y A12=0. La funcin que selecciona la zona de memoria RAM 2 es:

CSRAM 2 = A15 A14 A13 A12


Podemos implementar ambas funciones mediante puertas NAND de cuatro entradas y puertas NOT. En la figura 8.38 aparece el esquema elctrico de conexin de los integrados de memoria RAM.

WR PSEN

WR PSEN

WR PSEN

WR PSEN

Fig. 8.38 Conexin de las memorias RAM

En la figura 8.39 aparece el esquema elctrico del decodificador 74138 conectado adecuadamente para generar las seales de habilitacin de las memorias PROM y RAM.

74138
0V A14 5V G2A G2B G1

A12 A13 A15

A B C

Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7

CSPROM

CSRAM1 CSRAM2

Fig. 8.39 Circuito de habilitacin de las memorias

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

247

9 Puerto de comunicacin serie


9.1 Introduccin
Es frecuente que un sistema basado en microprocesador tenga que transmitir datos hacia otro sistema, o hacia un perifrico, o un terminal del sistema. La informacin se puede enviar en serie a travs de una simple lnea, o canal de comunicacin; o en paralelo, lo que requiere de un nmero considerable de lneas. La transmisin serie es adecuada para largas distancias por su simplicidad, y la transmisin paralelo es adecuada en distancias relativamente cortas, debido a que el nmero de lneas hace que sea una solucin con un elevado costo. Para transmitir datos por la lnea telefnica a largas distancias es conveniente emplear un mdem, que transforme las seales digitales a un formato analgico y que, as, haga ocupar un ancho de banda menor, debido a que la transmisin digital directa resulta inapropiada por el enorme ancho de banda que supone. No obstante, cuando las lneas de comunicacin son propias del sistema, la transmisin se puede hacer ntegramente en formato digital, para lo cual existen varios estndares de comunicacin, como el RS-232, el RS-422, el RS-485 y otros. El formato de la informacin a transmitir en una comunicacin serie puede ser de 7 8 bits, coincidiendo con los empleados por la tabla de caracteres ASCII. La transmisin puede ser sncrona o asncrona y puede efectuarse en varios sentidos: simplex, half-duplex y full-duplex. Cuando la comunicacin serie es sncrona se enva una seal de reloj en la transmisin que marca las pautas de la comunicacin. Esta seal se puede proporcionar a travs de una lnea adicional entre los sistemas que se quiere comunicar, o bien, se puede extraer de alguna forma especifica de codificacin: en ese caso el receptor obtiene la seal de reloj de la propia seal recibida. En el caso de que la comunicacin sea asncrona tanto el transmisor como el receptor deben secuenciar la comunicacin de acuerdo con una base de tiempos, pues la transmisin o la recepcin pueden ocurrir en cualquier momento. En este tipo de comunicacin la inactividad en la transmisin se indica mediante un nivel lgico alto. El inicio de la transmisin de un carcter, en una comunicacin serie asncrona, se indica mediante una transicin brusca entre un nivel lgico alto y un nivel lgico bajo, a partir del cual se extrae cada uno de los bits hacia la lnea, con intervalos fijos de tiempo t (figura 9.1): los intervalos de tiempo en la comunicacin determinan la velocidad de transmisin en bits por segundo, bits/seg, o baudios. El primer bit de la transmisin consiste en un bit de inicio (start), que es un cero lgico. Luego le siguen los bits del dato, comenzando por el bit menos significativo y finalizando con un bit, o dos, de parada (stop).

Los autores, 2001; Edicions UPC, 2001.

248

Microcontroladores MCS-51 y MCS-251

Al principio de establecer las bases de la comunicacin serie, se utilizaban dos bits de stop por cuestiones tecnolgicas del momento. No obstante, en la actualidad es suficiente con emplear un solo bit de stop. El bit de stop (figura 9.1) se indica manteniendo un nivel lgico alto durante un intervalo t, tras el cual, puede procederse a transmitir el siguiente dato. As, la inclusin del bit de start y el de stop, en la comunicacin serie asncrona, resulta imprescindible para separar y distinguir los datos transmitidos.
t
Inactivo Bit start Bit stop (LSB) 0 1 1 0 2 0 3 1 4 1 5 0 6 0 (MSB) 7 0 Inactivo

Estado

Fig. 9.1

Generalmente, el dato en una comunicacin serie es de 8 bits, a los que se puede aadir un noveno bit de paridad, con el fin de detectar errores en la transmisin. El sentido de la transmisin es simplex cuando se realiza en una nica direccin, del emisor al receptor, es haf-duplex cuando se puede realizar en ambas direcciones, emisor-receptor y receptoremisor (pero no en ambas direcciones simultneamente), y full-duplex cuando se pueden enviar datos en ambas direcciones de forma simultnea. En la transmisin asncrona se puede dar el caso de que un sistema sea lento a la hora de procesar los datos que recibe, por lo que ste debe ser capaz de indicarle al transmisor su incapacidad de procesar ms datos y que, por tanto, se espere hasta una nueva transmisin. Este problema se suele solventar mediante el protocolo XON/XOFF, en el cual se dispone de dos caracteres ASCII de control, DC1 (XON) y DC3 (XOFF), para detener y para reanudar la comunicacin, respectivamente. Cuando el receptor no puede procesar ms datos enva un carcter XOFF al emisor, tras el cual el emisor deja de transmitir hasta que recibe un carcter XON.

9.2 La comunicacin serie en la MCS-51


El puerto de comunicacin serie de la MCS-51 permite realizar transmisiones de datos en serie en los modos sncrono y asncrono. Para la transmisin sncrona dispone de un nico modo de funcionamiento, modo 0, y para la transmisin asncrona full-duplex con velocidad de transmisin programable dispone de los modos 1, 2 y 3 de funcionamiento. La generacin de la velocidad de transmisin del puerto serie se puede basar tanto en el Timer 1 como en el Timer 2, y utiliza sus recursos para determinar la base de tiempos de la transmisin. El puerto serie, adems, tiene un sistema automtico que es capaz de detectar un error en el bit de stop. Adems, el bit de paridad se puede emplear en la transmisin para poder detectar un error de 1 bit en la comunicacin; para ello el bit de paridad se transmite con el dato como noveno bit de transmisin. El puerto tambin tiene un sistema de reconocimiento de direcciones, el cual permite la conexin de varios microcontroladores entre s. La determinacin de la velocidad de transmisin depende del modo en que se est operando. Por ejemplo, para el Timer 1, en el modo 0 tan slo se permite una velocidad de transmisin, mientras que

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

249

en el modo 2 pueden programarse dos velocidades de transmisin, y en los modos 1 y 3 se pueden programar distintas velocidades de transmisin. Los terminales asociados al puerto serie son TXD, terminal P3.1, y RXD, terminal P3.0. En el modo 0, el terminal TXD soporta la seal de reloj de la transmisin sncrona. Los registros asociados al puerto de comunicacin serie son SBUF, SCON en toda la familia MCS-51, y los registros SADDR y SADEN para las versiones 8XC52/54/58, 8XC51FX y 87C51GB. El registro SBUF, Serial Buffer, es el buffer del puerto serie, que almacena el dato recibido o enviado por el puerto. El registro SCON, Serial Control (tabla 9.1), es el registro de control que permite programar las caractersticas de funcionamiento del puerto. El registro SADDR se utiliza para definir la direccin del microcontrolador que hace la funcin de esclavo, cuando ste se encuentra en un entorno de comunicacin multiprocesador. Finalmente, el registro SADEN especifica el byte de mscara para el microcontrolador esclavo, en la comunicacin multiprocesador.
Tabla 9.1 Registro SCON para la MCS-51
(MSB)
SM0 * FE/SM0

Registro SCON
SM1 SM2 REN TB8 RB8 TI

(LSB)
RI

Bit

Comentario

FE/SM0 Frame Error o bit 0 de seleccin de modo del puerto serie. Esta opcin slo es valida para las versiones 8XC51Fx de la MCS-51. Este bit acta como FE o SM0 segn sea el estado del registro SMOD0 (bit 6 del registro PCON), si SMOD0=1 acta como FE y si SMOD=0 acta como SM0. El bit FE se activa a 1 lgico cuando se detecta un bit de stop invlido en la recepcin de un dato. Una vez activo, este bit no se borra por otros datos recibidos y se debe borrar por software. SM0 es el bit de seleccin del puerto serie; su modo de funcionamiento se selecciona junto con SM1. SM0 Bit 0 de seleccin de modo del puerto serie. Aparece con este formato en la MCS-51, excepto para las versiones 8XC51Fx.. SM0 junto con SM1, determina el modo de funcionamiento del puerto serie. SM1 Bit 1 de seleccin de modo del puerto serie. SM1 SM0 Modo 0 0 0 0 1 1 1 0 2 1 1 3 SM2 Bit 2 de modo del puerto serie. Permite habilitar, o no, la comunicacin serie, en entornos multiprocesador. REN Bit de habilitacin de la recepcin. REN=1 habilita la recepcin de un dato y REN=0 la inhabilita. TB8 Bit noveno de transmisin. Es el dcimo bit en la transmisin de un dato para los modos 2 y 3. RB8 Bit noveno de recepcin. Obtiene el valor del dcimo bit del dato transmitido en los modos 2 y 3. TI Bit de interrupcin en transmisin. Se pone a 1 cuando finaliza la transmisin del dato. Debe borrarse por software. RI Bit de interrupcin en recepcin. Se pone a 1 cuando se recibe un dato. Debe borrarse por software.
* Para la MCS-51, excepto para la versin 8XC51Fx. Slo para la versin 8XC51Fx.

En el puerto de comunicacin serie el registro SBUF est duplicado, de manera que uno de los registros est conectado al terminal TXD y el otro registro est conectado al terminal RXD. Esta duplicidad del registro SBUF permite poder transmitir y recibir datos simultneamente (comunicacin full-duplex). Sin embargo, con el registro SBUF se trabaja de una manera sencilla, pues se trata a ste como a un nico registro: se transmite un dato al cargarlo en SBUF, y se lee un dato de SBUF cuando ste se ha recibido.

Los autores, 2001; Edicions UPC, 2001.

250

Microcontroladores MCS-51 y MCS-251

9.3 Modos de funcionamiento del puerto serie


El puerto de comunicacin serie de la MCS-51 puede funcionar con cuatro modos distintos de funcionamiento: modos 0, 1, 2 y 3. El modo 0 se emplea para la comunicacin sncrona y los modos 1, 2 y 3 en la comunicacin asncrona. En cualquiera de los modos de funcionamiento del puerto serie, la transmisin se efecta en el momento que se carga el registro SBUF con un dato mediante una instruccin de escritura. La recepcin de un dato debe habilitarse de antemano, poniendo a 1 lgico el bit REN del registro SCON y poniendo a cero el bit RI. Cuando se recibe un dato el bit RI se pone a 1 lgico y activa el proceso de interrupcin del puerto, en el cual debe realizarse la lectura del registro SBUF por medio de la rutina de RSI.

9.3.1 Modo 0. Modo sncrono Este modo se determina mediante la puesta a cero lgico de los bits SM0 y SM1 del registro SCON. La velocidad de transmisin de datos es de FOSC/12, donde FOSC es la frecuencia de reloj del microcontrolador. El terminal TXD genera la seal de reloj que sincroniza la comunicacin, y la transmisin y recepcin de datos se lleva a cabo a travs del terminal RXD.

9.3.2 Modos 1, 2 y 3. Modos asncronos En los modos 1, 2 y 3 se pueden enviar datos a travs de la lnea TXD y recibirlos a travs de la lnea RXD de forma simultnea (full-duplex). En la figura 9.2 se muestra la trama del dato en la transmisin de estos modos.
Noveno bit (Slo modos 2 y 3)
Bit 1

D0
Bit de start

D1

D2

D3

D4

D5

D6

D7

TB8
Bit de stop

Dato de 8 bits

Fig. 9.2 Trama de datos para los modos 1, 2 y 3

a) Modo 1 En el modo 1, la trama de datos est formada por 10 bits. El primer bit de la trama es el bit de start, a 0 lgico, le siguen los 8 bits del dato, y finaliza con un dcimo bit que consiste en el bit de stop, a 1 lgico. La base de tiempos se puede generar, en este modo, por medio del Timer 1, del Timer 2 (en aquellas versiones que disponen de tres Timers) o de ambos Timers. La velocidad de transmisin del puerto serie, en baudios, depende del tiempo de desbordamiento de los Timers. Por defecto, la velocidad de transmisin la establece el Timer 1, y viene dada en baudios por la frmula siguiente:

Frec. transmisin [ 2 X

Frec. rebasamiento del Timer 1 32

(9.1)

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

251

donde X puede valer 0 1 lgico. Para la MCS-51, excepto las versiones 8XC51Fx, el bit X se corresponde con el bit SMOD del registro PCON. Para las versiones 8XC51Fx el bit X se corresponde con el bit SMOD1 del registro PCON. En realidad el bit SMOD y SMOD1 son el mismo bit con distintos nombres, y corresponden al bit 7 del registro PCON. En la comunicacin serie se debe evitar que el Timer provoque una interrupcin cada vez que llega a desbordamiento; para ello debe de inhibirse la interrupcin del Timer mediante el bit ET del registro IE. El Timer 1 se suele configurar en el modo 2, como temporizador de 8 bits con autorrecarga (modo 2), aunque puede tambin configurarse en los modos 0, 2 y 3. Para este caso, la velocidad de transmisin depender del valor cargado el registro TH1 del Timer 1: Frec. transmisin [ 2 X FOSC 32 12 ]256 TH1 (9.2)

donde FOSC es la frecuencia de reloj del microcontrolador. El bit X, al igual que para la ecuacin (9.1), es el sptimo bit del registro PCON. La tabla 9.2 muestra distintas frecuencias de transmisin que se pueden obtener con el Timer 1 en el modo 2 de funcionamiento.
Tabla 9.2 Timer 1 como generador de baudios para el modo 2 de funcionamiento

Frecuencia
(Baudios)

62.5 Kbaud (Max) 19.2 Kbaud 9.6 Kbaud 4.8 Kbaud 2.4 Kbaud 1.2 Kbaud 137.5 Baud 110.0 Baud b) Modo 2

Frecuencia Oscilador 12.0 MHz 11.059 MHz 11.059 MHz 11.059 MHz 11.059 MHz 11.059 MHz 11.059 MHz 6.0 MHz

SMOD 1 1 0 0 0 0 0 0 C/T 0 0 0 0 0 0 0 0

Timer 1 Valor recarga TH1 FFH FDH FDH FAH F4H E8H 1DH 72H

En el modo 2, la trama de bits del puerto serie est compuesta de 11 bits. El primer bit es el bit de start, le siguen los 8 bits del dato ms un noveno bit definible por el usuario, y termina con un bit de stop. El noveno bit del dato transmitido se corresponde con el estado del bit TB8 del registro SCON. En la recepcin, este noveno bit se ubica en el bit RB8 del registro SCON. Para transmitir en este modo se debe poner el noveno bit a transmitir en el bit TR8, antes de realizar la escritura del dato en el registro SBUF. La recepcin se debe habilitar antes que se produzca, poniendo para ello el bit REN a 1 lgico y el bit RI a 0 lgico. En el modo 2 slo se permiten dos velocidades de comunicacin para el puerto serie, dependiendo del valor del bit X: Frec. transmisin [ 2 X FOSC 64 (9.3)

El bit X tiene la misma correspondencia que la definida para el resto de modos de funcionamiento.

Los autores, 2001; Edicions UPC, 2001.

252

Microcontroladores MCS-51 y MCS-251

c) Modo 3 El modo 3 del puerto serie es similar al modo 2, con la nica diferencia que la velocidad de la comunicacin del puerto serie se obtiene de la misma manera que en el modo 1.

9.3.3 El Timer 2 como base para el puerto serie El Timer 2 tiene un modo de funcionamiento especfico utilizado para fijar la velocidad de comunicacin de datos por el puerto serie, Baud Rate Generator Mode (figura 9.3). Para seleccionar este modo se deben programar adecuadamente los bits RCLCK y TCLCK del registro T2CON, como se muestra en la tabla 9.3.
Rebasamiento del Timer 1 2 0 1
X XTAL1

0 1
TH2 TR2 C/T2 TL2

1 16 0
RCLCK

RX Clock

T2

1 16 0
RCAP2H RCAP2L TCLCK Peticin de interrupcin

TX Clock

T2EX EXEN2

EXF2

X=SMOD para la MCS-51, excepto para la versin 8XC51Fx. X=SMOD1 para la versin 8XC51Fx.

Fig. 9.3 Diagrama de bloques del Timer 2 funcionando en el modo generador de Baud Rate Tabla 9.3 Seleccin del Timer 2 como generador de baudios

RCLCK 0 0 1 1

TCLCK 0 1 0 1

Generador de baudios en recepcin Timer 1 Timer 1 Timer 2 Timer 2

Generador de baudios en transmisin Timer 1 Timer 2 Timer 1 Timer 2

Cuando el Timer 2 se selecciona como generador de baudios funciona de forma similar al modo autorrecarga. Los registros TH2 y TL2 se recargan con el valor de los registros RCAP2H y RCAP2L, en cada desbordamiento. La velocidad de comunicacin depende del valor puesto en estos registros: Frec. transmisin [ 32 ]65536 FOSC (RCAP 2H ,RCAP2L ) (9.4)

En la figura 9.3 se muestra el diagrama de bloques del Timer 2 configurado en modo generador de

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

253

baudios. En la tabla 9.4 se indican las distintas velocidades de comunicacin y el valor a cargar en los registros RCAP2H y RCAP2L para conseguir distintas velocidades de transmisin.
Tabla 9.4 Timer 2 como generador de baudios para los modos 1 y 3 del puerto serie

Baudios 375.0 Kbaud 9.6 Kbaud 4.8 Kbaud 2.4 Kbaud 1.2 Kbaud 300.0 baud 110.0 baud 300.0 baud 110.0 baud

Frecuencia oscilador 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 6.0 MHz 6.0 MHz

RCAP2H RCAP2L FFH FFH FFH D9H FFH B2H FFH 64H FEH C8H FBH 1EH F2H AFH FDH 8FH F9H 57H

9.4 Deteccin de errores


En las versiones 8XC51Fx es posible detectar errores en la recepcin del bit de stop para los modos de trabajo 1, 2 y 3, para lo cual se debe poner a 1 lgico el bit SMOD0 del registro PCON. Con esta opcin habilitada, el puerto serie comprueba el bit de stop de cada dato recibido y si es errneo se pone a 1, de manera automtica, el bit FE del registro SCON. En consecuencia, para emplear este recurso, se debe examinar el estado del bit FE cada vez que se recibe un dato. El bit FE no es modificado por datos posteriores recibidos en el puerto serie, y se debe borrar por software, por lo que se deber incluir una instruccin que lo borre cada vez que se active. Ejemplo 9.1 Control de una impresora de 40 columnas En los equipos de tipo comercial, como una balanza electrnica o un terminal punto de venta, se utilizan impresoras de 40 columnas para la impresin del tiquet de la compra del usuario. Estas impresoras se conectan al sistema basado en microcontrolador mediante el bus RS-232C, que es un bus de comunicacin para distancias cortas y velocidades de comunicacin moderadas. Con el bus RS-232C slo se pueden conectar un emisor y un receptor, y las velocidades de comunicacin ms comunes son: 300, 1.200, 2.400, 4.800, 9.600 y 19.200. Los niveles de tensin del bus son bipolares, el transmisor debe generar un nivel de tensin entre -5 y -15V para un 1 lgico, y entre +5 y +15V para un 0 lgico. El receptor responde con una tensin ms negativa que -3V para un 1 lgico, y con una tensin ms positiva que +3V para un 0 lgico. Para realizar la interfaz con el bus existen distintos circuitos integrados de interfaz entre niveles TTL y RS-232, y viceversa. Los circuitos integrados ms comunes son el MC1488, que tiene cuatro transmisores, y el MC1489A, que tiene cuatro receptores. Estos circuitos integrados los realizan distintos fabricantes y son de bajo coste. El MC1488 necesita una tensin de alimentacin entre 9V y 15V. Para niveles CMOS se pueden usar el DS14C88 y el DS14C89A de National Semiconductor, para la interfaz entre CMOS y RS-232, y viceversa.

Los autores, 2001; Edicions UPC, 2001.

254

Microcontroladores MCS-51 y MCS-251

El nmero mnimo de seales con el que se puede realizar la comunicacin bidireccional entre dos equipos es: TXD para la transmisin, RXD para la recepcin y una lnea de masa (figura 9.4).
Equipo A MC1488 TXD MC1489 RXD Equipo B

RXD MC1489 MC1488

TXD

Fig. 9.4 Conexin de dos equipos distantes mediante RS-232

En este ejemplo se desea conectar una impresora de 40 columnas a un 87C51 mediante el bus RS-232 (figura 9.5). El microcontrolador se utiliza en una aplicacin de etiquetaje, donde se imprime un nmero asignado al producto y un texto determinado segn el tipo de producto. Las etiquetas son autoadhesivas y se pegan al producto mediante un aplicador automtico. 87C51
/INT0

Entrada de producto
MC1488 RS-232

Impresora
RXD TXD

TXD RXD P2.0 P2.1 P2.5 GND


MC1489

Tipo de producto

Fig. 9.5 Conexin de una impresora va RS-232

El control de la impresora se realiza mediante caracteres ASCII reservados para ello. El microcontrolador iniciar la comunicacin con la impresora envindole el carcter ASCII STX Start of text, que se corresponde con el nmero hexadecimal 02H. Tras este carcter se le puede enviar un carcter de comando como LF, Line feed, (0AH); CAN, Cancel, (18H); ESC, Escape, (1BH); carcter de impresin en negrita, cursiva, etc. Tras este comando, se le enva el texto que se quiere imprimir en ASCII, y por ltimo el comando de impresin CR, Carriage return, (0DH), por lo que se imprimir el texto transmitido. En este ejemplo se trata tan slo de imprimir el texto PRODUCTO N: seguido de cuatro cifras que identifican el tipo de producto. La aplicacin tiene un interruptor de final de carrera como sensor de la llegada del producto conectado a la entrada de interrupcin /INT0. El

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

255

interruptor proporciona un 0 lgico cuando hay un producto a etiquetar y un 1 lgico cuando no hay producto. La empresa tiene 64 tipos de productos diferentes, codificados con cuatro cifras cada uno. Los cdigos de estos productos se han almacenado en la memoria de programas. El microcontrolador recibe en el puerto P2 seis lneas de entrada que identifican el tipo de producto, al mismo tiempo que se activa el interruptor final de carrera conectado a /INT0. El programa de este ejemplo se muestra a continuacin
;************************************************************************** ; Programa para la comunicacin y control de una impresora de 40 columnas ;************************************************************************** ORG 0H ; Vectorizacin LJMP Inicio ORG 03H LJMP RSI_INT0 ORG 023H ;Vectorizacin del puerto de comunicacin serie LJMP RSI_RS ;************************************************************************** ; Rutina de Inicio ;************************************************************************** Inicio: MOV SP, #30H ;Sita SP en la 30H SETB IT0 ;Interrupcin INT0 por flanco descendente SETB EX0 ;Habilita interrupcin INT0 SETB ES ;Habilita interrupcin del puerto de comunicacin serie SETB SM1 ;Configura la comunicacin serie en el modo 1 SETB REN ;Habilita la recepcin de un dato por el puerto serie MOV TMOD, #20H ;Timer 1 en Modo 2, GATE=0 y C/T=0 MOV TL1, #0FDH ;Valor de TL1, para velocidad de 9600 baudios MOV TH1, #0FDH ;Valor de recarga de Timer 1, para velocidad de 9600 baudios SETB EA ;Habilita bit de interrupcin general SETB TR1 ;Pone marcha el Timer 1 (Genera la base de tiempos de la RS-232). MOV R6, #01H ;R6 se utiliza para indicar que se puede transmitir LJMP Principal ;Ir hacia rutina principal ;************************************************************************** ; Rutina de servicio de INT0 ;************************************************************************** RSI_INT0: MOV R7, #01 ;R7=1 para indicar inicio de transmisin RETI ;************************************************************************** ; Rutina de servicio del puerto serie ;************************************************************************** RSI_RS: JNB TI, Recibe ;Si no interrumpe TI, entonces es RI CLR TI ;Borra bit TI RETI Recibe: CLR RI ;Borra bit RI RETI ;*************************************************************************** ; Rutina Principal (R7 se emplea como indicador de final de conversin. R7=1 Conversin finalizada) ;*************************************************************************** Principal: CJNE R7, #01, Principal ;Bucle de espera a que R7 sea igual a 01H MOV R7, #0 ;Borra R6 MOV R1, P2 ;Lee P2 para saber el tipo de producto MOV A, R1 ANL A, #3FH ;Mscara con 3FH MOV R1, A ACALL Imprime_cod ;Realiza la lectura del A/D SJMP Principal ;Bucle infinito

Los autores, 2001; Edicions UPC, 2001.

256

Microcontroladores MCS-51 y MCS-251 ;************************************************************************** ; Subrutina de Impresin ;************************************************************************** Imprime_cod: MOV R5, #14 ;Nmero de caracteres del texto MOV R0, #10H ;Pone direccin 10H en puntero Imp_buc: CLR C ;Borra acarreo MOV A, #14 ;Pone dato 14 en A SUBB A, R5 ;Resta de 14-R5, contador de 0 a 14. LCALL Tab_tex ;Toma un caracter del texto MOV A, @R0 ;Pone caracter ledo en memoria interna INC R0 ;Incrementa puntero DJNZ R5, Imp_buc ;Realiza bucle hasta final de texto (14 caracteres) Lee_cod: MOV A, R1 ;Situado el texto, falta situar cdigo en la memoria MOV B, #2 ;Multiplica A por 2 MUL AB PUSH A ;Guarda A en la pila LCALL Tabla_cod ;Lee byte alto del cdigo LCALL Bin_ASCII ;Llama a la rutina de conversin de binario a ASCII MOV @R0, B ;Guarda B en la memoria INC R0 ;Incrementa puntero MOV @R0, A ;Guarda A en la memoria INC R0 ;Incrementa puntero POP A ;Recupera la situacin de producto en la tabla INC A ;Posicin de byte bajo del cdigo en la tabla LCALL Tabla_cod ;Lee byte bajo del cdigo LCALL Bin_ASCII ;Llama a la rutina de conversin de binario a ASCII MOV @R0, B ;Guarda B en la memoria INC R0 ;Incrementa puntero MOV @R0, A ;Guarda A en la memoria LCALL Print ;Salta a la subrutina de impresin LJMP Principal Tab_text: INC A ;Tabla con el texto a imprimir MOVC A, @A+PC RET DB PRODUCTO N: Tabla_cod: INC A ;Tabla con los cdigos de los productos MOVC A, @A+PC ;Lee tabla de cdigos RET DB 10H, 15H ;Cdigo del producto n 1 DB 25H, 46H ;Cdigo del producto n 2 DB 1AH, 1FH ;Cdigo del producto n 3 DB 78H, 22H ;Cdigo del producto n 1 ........... ; .................... ........... ; .................... DB 99H, 56H ;Cdigo del producto n 64 Print: MOV R0, #10H ;Pone puntero con direccin de buffer de impresin MOV R5, #18 ;Pone tamao de caracteres a imprimir MOV A, #02H ;Pone caracter STX en A LCALL Transmite ;Transmite dato Print_buc: MOV A, @R0 ;Lee texto del buffer de memoria LCALL Transmite ;Transmite dato INC R0 ;Incrementa puntero DJNZ R5, Print_buc ;Realiza bucle hasta enviar el buffer entero MOV A, #0DH ;Pone caracter CR en A LCALL Transmite ;Transmite caracter LJMP Principal ;Regresa al bucle principal Bin_ASCII: PUSH A ;Guarda A en la pila ANL A, #0F0H ;Mscara. Borra los 4 bits bajos, mantiene los altos SWAP A LCALL Tab_BinASCII MOV B, A POP A ;Recupera A de la pila

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie ANL A, #0FH ;Mscara. Borra los 4 bit bajos LCALL Tab_BinACSII RET Transmite: MOV SBUF, A ;Transmite dato contenido en A RET Tab_BinASCII: INC A ;Tabla de conversin de binario a ASCII MOVC A, @A+PC RET DB 30H, 31H, 32H, 33H, 34H, 35H, 36H, 37H DB 38H, 39H, 41H, 42H, 43H, 44H, 45H, 46H

257

En este programa se utiliza el registro R7 como indicativo de que ha entrado un producto. La transmisin consiste en ir colocando los datos contenidos a partir de la posicin 10H de memoria interna que se utiliza como buffer de datos para la transmisin. En total se transmiten cada vez 18 caracteres: 14 caracteres correspondientes al texto y 4 caracteres correspondientes al cdigo de cuatro cifras del producto. El cdigo del producto se ha situado en la subrutina Tab_cod y est formado por dos bytes. En el programa primero se lee el byte alto del cdigo en la tabla, que se desglosa en dos bytes en formato ASCII: el primero corresponde a los 4 bits altos y el otro a los 4 bits bajos. Luego se lee el byte bajo del cdigo, que se convierte a ASCII de la misma manera que el primer byte. A la impresora se transmite primero el carcter STX (02H), seguido de 18 bytes, almacenados en el buffer de memoria a partir de la posicin 10H y que corresponden al texto y al cdigo de producto, y por ltimo el carcter CR (0DH), que hace que se impriman los datos transmitidos. Para realizar la comunicacin se ha seleccionado una velocidad de 9.600 baudios; para ello se configura el puerto serie en el modo 1, en el que se transmiten 10 bits: 1 bit de start, 8 bits del dato y 1 bit de stop. El Timer 1 del microcontrolador se utiliza como base de tiempos para la transmisin, por lo que debe estar configurado en el modo 2 de 8 bits con autorrecarga, con el bit C/T a 0 lgico, con el bit SMOD a 0 lgico, con el valor FDH de recarga en el registro TH1, y con una frecuencia de reloj de 11.059MHz. Ejemplo 9.2 Comunicacin multipunto mediante RS-485 En la industria de la alimentacin es frecuente tener mltiples cmaras frigorficas en distintos puntos de una nave industrial, o bien dentro de una misma rea comercial. La regulacin y la monitorizacin de la temperatura en cada una de las cmaras frigorficas es de suma importancia, especialmente en el sector de los congelados, donde es imprescindible controlar en todo momento el estado de conservacin y la calidad de un producto. En la figura 9.6 se propone una red de comunicacin basada en la norma RS-485, para realizar el control y la monitorizacin entre un ordenador central que hace la funcin de maestro y las cmaras frigorficas que hacen la funcin de esclavos. En esta aplicacin se ha escogido la norma RS-485 porque es un sistema de transmisin diferencial que permite la comunicacin bidireccional de hasta 32 equipos en un bus de datos comn, permite la transmisin a gran distancia y a gran velocidad, y los emisores deben incorporar autoproteccin contra la sobrecarga de acceso (es decir, la situacin de tener mltiples emisores intentando acceder al mismo tiempo a la lnea de transmisin). Las principales caractersticas de la RS-485 son:

Los autores, 2001; Edicions UPC, 2001.

258

Microcontroladores MCS-51 y MCS-251

La mxima longitud de cable es de 1.200 metros. La velocidad mxima de transmisin es de 10Mbits/seg. Impedancia de entrada del receptor de 12k4. Margen de modo comn de la entrada del receptor de -7V a +12V. Sensibilidad de la entrada diferencial de 200mV en un margen de modo comn de -7V a +12V.

La interfaz con el bus RS-485 se implementa con el circuito integrado DS3695 o el DS75176 de National Semiconductor, que tiene un transmisor y un receptor diferencial, cuyo estado se controla con las entradas DE y /RE, respectivamente. Cada una de las cmaras frigorficas tiene un circuito electrnico formado por un microcontrolador 87C51, cuatro dgitos de siete segmentos donde se visualiza la temperatura en grados centgrados de la cmara, un DS1620 de Dallas Semiconductor que hace de sensor de temperatura y de acondicionador de seal, y un DS3695 para la interfaz RS-485 (figura 9.7). Esclavo 1
Nodo 0
RT + _

Direcci n
DE

Maestro TXD RXD


DI

DS3695
+
/RE

Nodo 1

RXD
RO DI

RO

R
DE /RE

TXD

DS3695

DS3695
+
/RE

Direcci n
DE

Direcci n

Nodo 2

RXD
RO DI

TXD

Esclavo 2 Direcci n
DS3695
+ RT _
/RE DE

RXD
RO DI

Nodo N D

TXD

Esclavo N
Fig. 9.6 Red de comunicacin basada en la RS-485

Para realizar la comunicacin en la red se debe establecer un protocolo, en el que se definen una serie de reglas con las que se gestionar la comunicacin entre las cmaras frigorficas y el

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

259

equipo maestro. Cada una de las conexiones en la red RS-485 se denomina nodo. Cada nodo puede, mediante un protocolo, enviar o recibir mensajes o bloques de datos de la red.
87C51 DS1620

RXD TXD P1.1 Direccin

DS3695

RS-485
DE /RE

Fig. 9.7 Componentes del circuito de una cmara frigorfica

Las funciones que deber realizar el circuito electrnico de cada una de las cmaras son monitorizar la temperatura de la cmara en el visualizador de cuatro dgitos de siete segmentos y transmitir la temperatura de la cmara al equipo maestro cada vez que ste se lo pida. Para comprobar el estado de la red y de la interfaz con cada nodo, el equipo maestro enviar un comando y un dato a cada uno de los esclavos, lo que forzar al esclavo a transmitir el dato recibido al maestro. De esta forma el equipo maestro puede comprobar si hay alguna anomala en la red o en la interfaz de un nodo determinado. La red estar formada por un equipo central que har de maestro y por veinticinco esclavos. El protocolo estar formado por tres bytes. El primer byte se corresponder con el nmero del nodo destino de la transmisin. A cada nodo se le asignar un nmero: el nodo 0 se corresponder con el nodo maestro y los nodos esclavos se numerarn consecutivamente como nodo 1, nodo 2, , nodo 25. El segundo byte del protocolo ser el nmero del nodo que origina el mensaje. Y, por ltimo, el tercer byte se corresponder con un comando ejecutable por el nodo esclavo, que podr ser el carcter ASCII DC1 (11H) o DC2 (12H). El comando DC1 indicar al nodo esclavo que debe transmitir los datos correspondientes a la temperatura al nodo maestro, y el comando DC2 indicar que se va a hacer un chequeo de la lnea por parte del nodo maestro. La lectura de la temperatura en cada microcontrolador estar almacenada en las posiciones 20H y 21H de la memoria interna. La posicin 20H contendr el byte de menor peso y la posicin 21H el byte de mayor peso. En consecuencia, cuando un nodo esclavo reciba el comando DC1, le transmitir al nodo maestro estos dos bytes correspondientes a la temperatura de la cmara frigorfica. El nodo esclavo, en este caso, transmitir un primer byte correspondiente al nmero del nodo maestro (00H), un segundo byte que corresponde con el nmero del nodo esclavo y los dos bytes correspondientes al valor de la temperatura de la cmara. En el caso que un nodo esclavo reciba el comando DC2 de chequeo de la red, ste pasar a la espera de un dato concreto que le debe transmitir el nodo maestro. Para ello, el nodo maestro

Los autores, 2001; Edicions UPC, 2001.

260

Microcontroladores MCS-51 y MCS-251

transmite un primer byte correspondiente al nmero del esclavo y un segundo byte que consiste en la constante AAH. A continuacin se muestra el programa que realiza la comunicacin de un microcontrolador 87C51 como el nodo esclavo nmero 2 de la red. En este programa no se considera el control del DS1620 ni la visualizacin en los cuatro dgitos de siete segmentos de la figura 9.7. La velocidad de comunicacin se ha configurado para 19.200 baudios, y se ha programado el puerto serie en el modo asncrono 1, al igual que en el ejemplo anterior. El Timer 1 est configurado en el modo 2 de 8 bits con autorrecarga, con el bit C/T a 0 lgico, con el bit SMOD a 1 lgico, con el valor FDH de recarga en el registro TH1 y con 11.059MHz de frecuencia de reloj.
;************************************************************************** ; Programa para la comunicacin del bus RS-485 del segundo mdulo esclavo ;************************************************************************** ; Declaracin de constantes y de variables ;************************************************************************** ID_MOD EQU #02H ;Nmero de identificacin de este mdulo ID_Master EQU #00H ;Nmero de identificacin del maestro DC1 EQU #11H ;Valor del comando DC1 DC2 EQU #12H ;Valor del comando DC2 Orden_in EQU 10H ;Variable que indica el n de byte recibido Haz_Eco EQU 13H ;Variable que indica el la accin de eco Dato_Eco EQU 14H ;Variable que contendr el dato enviado por el maestro Temp_bajo EQU 20H ;Variable que contiene el byte bajo de la temperatura Temp_alto EQU 21H ;Variable que contiene el byte bajo de la temperatura ;************************************************************************** ; ; Rutina de Vectorizacin ;************************************************************************** ORG 0H LJMP Inicio ORG 023H ;Vectorizacin del puerto de comunicacin serie LJMP RSI_RS ;************************************************************************** ; Rutina de Inicio (Configuracin de la comunicacin a 19200 baudios) ;************************************************************************** Inicio: MOV Orden_in, #0 ;Pone a 0 MOV Orden_out, #0 ;Pone a 0 MOV Orden_tx, #0 ;Pone a 0 MOV SP, #30H ;Reubica el Stack Pointer CLR P1.1 ;Establece el sentido RS-485 en recepcin SETB ES ;Habilita interrupcin del puerto de comunicacin serie ORL PCON, #80H ;Pone el bit 7 de PCON, bit SMOD, a 1 lgico SETB SM1 ;Configura la comunicacin serie en el modo 1 SETB REN ;Habilita la recepcin de un dato por el puerto serie MOV TMOD, #20H ;Timer 1 en Modo 2, GATE=0 y C/T=0 MOV TL1, #0FDH ;Valor de TL1, para velocidad de 19200 baudios MOV TH1, #0FDH ;Valor de recarga de Timer 1, para velocidad de 19200 baudios SETB EA ;Habilita bit de interrupcin general SETB TR1 ;Pone marcha el Timer 1 (Genera la base de tiempos de la RS-485) LJMP Principal ;Ir hacia rutina principal ;************************************************************************** ; Rutina de servicio del puerto serie ;************************************************************************** RSI_RS: JNB TI, Recibe ;Si no interrumpe TI, entonces es RI CLR TI ;Borra bit TI RETI

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie Recibe: MOV A, SBUF ;Lee dato recibido CJNE Orden_in, #0, Es_byte2 ;Identifca si se recibe el 1, el 2 o el 3 byte SJMP S_byte1 CJNE Orden_in, #01, S_byte3 ;Si no es el byte1 ni el byte2, entonces es el byte3 SJMP S_byte2 CJNE A, ID_MOD, Salir ;Comprueba que sea este mdulo, si no es sale INC Orden_in ;Incrementa contador. Pasa a la espera del siguiente byte SJMP Salir CJNE A, ID_Master, Salir ;Comprueba que le enva el mensaje el mod. maestro INC Orden_in ;Incrementa contador. Pasa a la espera del siguiente byte SJMP Salir CJNE A, DC1, Es_DC2 ;Comprueba que sea el comando DC1 o DC2 MOV Orden_in, #0 ;Inicializa contador MOV Orden_tx, #01H ;Da la orden de transmitir la temperatura de la cmara SJMP Salir CJNE A, DC2, Es_Eco ;Comprueba que sea el comando DC2. Si no, aborta MOV Orden_in, #0 ;Inicializa contador MOV Haz_Eco, #01H ;Activa el eco. Pasa a la espera del caracter de eco SJMP Salir CJNE Haz_Eco, #01H, Abortar ;Aborta la recepcin MOV Dato_Eco, A ;Guarda dato recibido en memoria, para transmitirlo MOV Orden_tx, #02H ;Da la orden de transmitir el dato recibido MOV Haz_Eco, #0 ;Borra indicador de eco MOV Orden_in, #0 ;Inicializa contador CLR RI RETI

261

Es_byte2: S_byte1:

S_byte2:

S_byte3:

Es_DC2:

Es_Eco:

Abortar: Salir:

;*************************************************************************** ; Rutina Principal ;*************************************************************************** Principal: CJNE Orden_tx, #0, Es_trans_1 ;Comprueba si se debe transmitir la SJMP Principal ;temperatura Es_trans_1: CJNE Orden_tx, #01H, Es_trans_2 ;Comprueba si debe transmitir Eco MOV Orden_tx, #0 ;Borra variable LCALL Trans_temp ;Transmite la temperatura SJMP Principal Es_trans_2: MOV Orden_tx, #0 ;Borra variable LCALL Trans_Eco ;Transmite el dato recibido SJMP Principal ;*************************************************************************** ; Subrutina Trans_temp para la transmisin de la temperatura ;*************************************************************************** Trans_Temp: MOV A, ID_Master ;Carga n de identificacin del maestro LCALL Transmite MOV A, ID_MOD ;Carga el n de identificacin de este mdulo LCALL Transmite MOV A, Temp_alto ;Carga el byte alto de la temperatura leda por el .C LCALL Transmite MOV A, Temp_bajo ;Carga el byte bajo de la temperatura leda por el .C LCALL Transmite RET ;*************************************************************************** ; Subrutina Trans_Eco para Eco con el dato enviado por el .C ;*************************************************************************** Trans_Eco: MOV A, ID_Master ;Carga n de identificacin del maestro LCALL Transmite MOV A, ID_MOD ;Carga el n de identificacin de este mdulo LCALL Transmite MOV A, Dato_Eco ;Carga el dato a enviar de Eco LCALL Transmite RET

Los autores, 2001; Edicions UPC, 2001.

262
Transmite: SETB P1.1 MOV SBUF, A CLR P1.1 RET

Microcontroladores MCS-51 y MCS-251 ;Establece el sentido RS-485 en transmisin ;Transmite dato contenido en A ;Establece el sentido RS-485 en recepcin

La rutina principal est continuamente pendiente de la operacin con el nodo maestro, que viene indicada por la variable Orden_tx. Esta variable puede valer 01H cuando se debe transmitir la temperatura leda por el microcontrolador, o bien 02H cuando debe transmitir el dato recibido por parte del nodo maestro. Las entradas DE y /RE del DS3695 determinan el sentido de la comunicacin con la red, y ambas estn conectadas a la patilla P1.1 (figura 9.7), de manera que cuando P1.1 est a 0 lgico el DS3596 est configurado para recibir datos y a 1 lgico para transmitir datos. El terminal P1.1 establece el sentido de la comunicacin. En la rutina de RSI del puerto serie se utiliza la variable Orden_in como contador de 0 a 2 que indica el orden del byte recibido por parte del nodo maestro. El protocolo establece que, para dirigirse al microcontrolador del ejemplo (nodo 2), el nodo maestro debe transmitir el dato 02H (destino del mensaje), el dato 00H (origen del mensaje) y un comando de orden que puede ser DC1 o DC2. En el caso de recibir el carcter DC2, la rutina de RSI inicializa la variable Orden_in y pasa a la espera del dato que se debe transmitir como eco. En el caso de que el destino de la comunicacin no sea este nodo, o bien que el origen de la comunicacin no sea el nodo maestro, el proceso obviar los datos recibidos, y pasar a la espera de un mensaje del nodo maestro.

9.5 La comunicacin serie en la MCS-251


El puerto de comunicacin serie permite realizar comunicaciones en serie en modo sncrono y asncrono. En concreto dispone de un modo de operacin sncrono, el modo 0, y de tres modos de comunicacin asncronos full-duplex, los modos 1, 2 y 3, con velocidades de transmisin programables. Asimismo, implementa un sistema de deteccin de errores y de reconocimiento de direcciones, que permite la comunicacin, a travs del canal serie, entre varios microcontroladores. En el modo 0, slo se permite una velocidad de transmisin, mientras que en el modo 2 es posible programar dos velocidades de transmisin. En cambio, en los modos 1 y 3 se pueden programar distintas velocidades de transmisin, generadas por los Timers 1 y 2. En la tabla 9.5 se muestran las seales asociadas al puerto de comunicacin serie. Bsicamente consiste en dos pines: TXD para transmitir datos y RXD para recibir datos.
Tabla 9.5 Seales asociadas al puerto de comunicacin serie Nombre pin TXD Tipo Descripcin O Transmisin de datos. En modo 0, TXD genera la seal de reloj que sincroniza la transmisin. En los modos 1, 2 y 3, es el pin de transmisin de datos serie. I/O Recepcin de datos. En modo 0, RXD transmite y recibe los datos en serie. En los modos 1, 2 y 3, es el pin de recepcin de datos en serie. Ubicacin P3.1

RXD

P3.0

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

263

En la tabla 9.6 se muestran los registros asociados al puerto de comunicacin serie. El registro SBUF almacena el dato recibido o enviado por el puerto serie. El registro SCON permite programar las caractersticas de funcionamiento del puerto serie y los registros SADDR y SADEN estn relacionados con la configuracin de la direccin del puerto serie en el caso de que se trabaje en entornos multiprocesador.
Tabla 9.6 Registros asociados al puerto de comunicacin serie Mnemnico SBUF SCON SADDR SADEN Descripcin Buffer del puerto serie. Este registro est compuesto por dos registros: en uno se carga el dato recibido y en el otro se almacena el dato enviado. Registro de control del puerto serie. Este registro permite programar las prestaciones de funcionamiento del puerto serie. Direccin del puerto serie. Define la direccin individual del dispositivo esclavo. Habilitacin de la direccin del puerto serie. Especifica el byte de mscara que se utiliza para definir la direccin de un dispositivo esclavo. Direccin S:099H S:098H S:0A8H S:0B8H

En la tabla 9.7 se indica brevemente la funcin de cada uno de los bits del registro SCON.
Tabla 9.7 Registro de control del puerto de comunicacin serie

SCON b7 FE/SM0 Bit


7 FE

Direccin: S:098H b6 b5 SM1 SM2

b4 REN

Valor de Reset: 0000 0000b b3 b2 b1 TB8 RB8 TI Funcin

b0 RI

Mnemnico

SM0 6 SM1

5 4 3 2

SM2 REN TB8 RB8

1 0

TI RI

Bit de Frame Error. Para seleccionar esta opcin de funcionamiento se debe colocar a 1 lgico el bit SMOD0 del registro PCON. En este caso, el bit FE se pone a 1 cuando se detecta un error en el bit de stop del dato recibido. Bit 0 del modo del puerto serie. Para seleccionar esta opcin se debe poner a 0 el bit SMOD0. Los bits SM0 y SM1 permiten seleccionar el modo de trabajo del puerto. Bit 1 de modo del puerto serie. Programando adecuadamente los bits SM0 y SM1 se puede seleccionar el modo de trabajo del puerto serie. SM0 SM1 Modo 0 0 0 0 1 1 1 0 2 1 1 3 Bit 2 de modo del Puerto Serie. Este bit permite habilitar, o no, la comunicacin serie en entornos multiprocesador. Bit de habilitacin de recepcin. Este bit se pone a 1 lgico para habilitar la recepcin, y se pone a 0 lgico, para habilitar la transmisin. Bit 8 del dato transmitido. En los modos 2 y 3, se escribe en este bit el valor del noveno bit que se transmite. Bit 8 del dato recibido. En el modo 1 este bit adquiere, automticamente, el valor del bit de stop recibido, si SM2=0. En los modos 2 y 3, este bit adquiere automticamente el valor del noveno bit recibido si SM2=0. Flag de interrupcin en transmisin. Este bit se pone a 1 lgico cuando finaliza la transmisin del dato. Se debe borrar por programa. Flag de interrupcin en recepcin. Este bit se pone a 1 lgico despus de recibir un dato. Debe ponerse a cero por programa.

En la figura 9.8 se observa el esquema del puerto de comunicacin serie. Este perifrico incorpora un registro denominado SBUF que almacena el dato a transmitir o el dato recibido. Fsicamente este registro est compuesto por dos registros distintos, un registro conectado al pin TXD, que almacena el

Los autores, 2001; Edicions UPC, 2001.

264

Microcontroladores MCS-51 y MCS-251

dato a transmitir, y otro registro conectado al pin RXD, a travs de un registro de desplazamiento, que almacena el dato recibido por el puerto serie. Esta duplicidad de registros permite poder transmitir y recibir datos al mismo tiempo (comunicacin full-duplex).
IB bus

Escribir SBUF

Leer SBUF

T xD

SBUF transmisin

SBUF recepcin

Modo 0 transmisin SBUF Registro de desplazamiento

Cargar SBUF

R xD

Peticin de interrupcin RI SCON Control del puerto serie TI

Fig. 9.8 Diagrama de bloques del puerto de comunicacin serie

9.6 Modos de operacin


El puerto de comunicacin serie soporta cuatro modos de operacin distintos: uno sncrono, el modo 0, y tres asncronos, los modos 1, 2 y 3.

9.6.1 Modo 0 o sncrono Para programar el puerto de comunicacin serie en modo cero hay que colocar los bits SM0 y SM1 del registro SCON, a cero lgico. En este modo la velocidad de transmisin de datos es FOSC/12 y la transmisin-recepcin de datos se produce a travs del pin RXD, mientras que por el pin TXD se genera la seal de reloj que sincroniza la transmisin. Los ocho bits del dato se transmiten y se reciben comenzando por el bit de menor peso, LSB, y acabando por el bit de mayor peso, MSB. Para transmitir un dato hay que poner a cero el bit REN del registro SCON y escribir en el registro SBUF el dato a transmitir. La transmisin se inicia cuando se ejecuta la instruccin de escritura en el registro SBUF. En la figura 9.9 se muestra el cronograma correspondiente a la transmisin de un dato. La transmisin comienza por el bit de menor peso del dato a transmitir, D0, en el estado S6P2 del ciclo de perifrico que viene a continuacin de la ejecucin de la instruccin SBUF. En el estado S3P1 del siguiente ciclo de perifrico, la salida TXD pasa a cero para generar el primer pulso de la seal de reloj que sincroniza la transmisin. Este flanco de bajada en TXD se utiliza para comunicar al receptor que ya

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

265

hay un bit vlido en el pin RXD. En cada ciclo de perifrico se transmite un nuevo bit hasta acabar con el bit de mayor peso, D7. Al finalizar la transmisin, la lnea RXD se queda con el valor 1 lgico y se activa el flag de interrupcin TI.
TXD S3P1 Escribir en SBUF S6P2 Registro S6P2 RXD D0 S6P2 S6P2 D1 S6P2 D2 S6P2 D6 D7 S6P2 S6P1

TI S1P1

Fig. 9.9 Temporizacin del puerto serie transmitiendo en modo cero

En la figura 9.10 se muestra el cronograma correspondiente a la recepcin de un dato. El proceso de recepcin comienza cuando se escribe en el registro SCON la combinacin binaria que pone los bits SM0, SM1 y RI a cero y el bit REN a 1 lgico. Un ciclo de perifrico despus de ejecutada esta instruccin, en el estado S3P1, la salida TXD pasa a 0 lgico para generar el primer pulso de la seal de reloj que sincroniza la recepcin. Este flanco de bajada avisa al dispositivo transmisor para que coloque en la entrada RXD el primer bit, D0, del dato a transmitir. El microcontrolador lee el bit suministrado por el transmisor en el estado S5P2 de ese mismo ciclo de perifrico e introduce el bit ledo en el registro de recepcin en el estado S6P2. Despus de haber ledo los ocho bits del dato se activa el flag de interrupcin RI del registro SCON. El dato recibido se puede leer ejecutando una instruccin de lectura del registro SBUF.
TXD S3P1 Escribir en SCON S6P2 Registro S6P2 D0 RXD S6P2 RI S1P1 S6P2 S5P2 S6P2 D1 S6P2 D6 S6P2 D7
REN = 1, RI = 0

S6P1

Fig. 9.10 Temporizacin del puerto serie recibiendo en modo cero

Ejemplo 9.3 Comunicacin va serie entre un 8XC251Sx y un perifrico en modo 0 En este ejemplo se trata de disear una rutina que controle la transmisin a un perifrico, a travs del puerto serie, de los datos almacenados entre las direcciones 50H y 60H de la memoria del microcontrolador 8XC251Sx. El perifrico dispone de un registro de desplazamiento con entrada serie y salida paralelo, para recibir los datos que le enva el puerto serie programado en modo cero. La entrada serie del registro de desplazamiento se conecta a la salida de datos del puerto serie (pin P3.0 o RXD),

Los autores, 2001; Edicions UPC, 2001.

266

Microcontroladores MCS-51 y MCS-251

mientras que la entrada de reloj se conecta al pin P3.1, para poder sincronizar la carga de datos en el registro de desplazamiento con la seal de reloj del puerto serie (figura 9.11).
8XC251Sx

Perifrico
Registro de desplazamiento

P3.0 P3.1

TXD Seal de reloj

Entrada serie Reloj Salida paralelo

Fig. 9.11 Conexin del microcontrolador al perifrico a travs del puerto serie

El programa debe comenzar con instrucciones que configuren el puerto de comunicacin serie en modo 0 y habilitado para transmitir. Si se realiza el control del puerto serie mediante interrupciones, se debe habilitar la interrupcin de este perifrico y disear una rutina de servicio de interrupcin del puerto serie que enve un dato cada vez que se active el flag TI. Para recorrer el margen de posiciones de memoria que contienen los datos a transmitir se utiliza un registro como puntero de memoria inicializado con el valor 50H. Si la frecuencia de la seal de reloj del microcontrolador es, por ejemplo, de 12MHz, la velocidad de transmisin en este modo es de 1Mbaud. A continuacin se presenta el listado del programa principal y de la rutina de servicio a la interrupcin del puerto serie.
;------------------------------------------------------------------------------------------------------------; PROGRAMA PRINCIPAL DE LA TRANSMISION SERIE ;------------------------------------------------------------------------------------------------------------ORG FF:0000H ; Se salta a una zona de memoria con espacio suficiente JMP INICIO ; para almacenar las instrucciones del programa principal. ORG FF:0500H ; Programacin del puerto serie INICIO: CLR SM1 ; Se programa el puerto serie en modo 0. CLR SM0 ; CLR REN ; Se habilita la transmisin por el puerto serie. SETB ES ; Se habilita la interrupcin del puerto serie. SETB EA ; Se activa el bit habilitador de interrupciones. SETB INTR ; Cuando la CPU vectorice una interrupcin cargar en ; la pila los 3 bytes del PC y el registro de estado. ; Inicializacin del puntero MOV R0, #50H ; Se inicializa el registro R0 con el valor 50H. MOV SBUF,R0 ; Se enva el primer dato de la zona de memoria por el puerto serie. ;------------------------------------------------------------------------------------------------------------; RUTINA DE SERVICIO A LA INTERRUPCION DEL PUERTO SERIE ;------------------------------------------------------------------------------------------------------------ORG FF:0023H ; Vector de interrupcin del puerto serie. JMP RSI_PS ; Se salta a una zona de memoria con espacio suficiente ; para almacenar las instrucciones de la rutina. ORG FF:1000H RSI_PS: CLR TI ; Se borra el flag TI. INC R0 ; Se incrementa el puntero R0. MOV SBUF,R0 ; Se enva el dato por el puerto serie. CMP R0,#60H ; Se compara el contenido del puntero con la ltima ; posicin de memoria de la zona a transmitir.

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie JNE CONT CLR ES RETI ; Si todava no se han enviado todos los datos se retorna ; al programa principal. ; Si se ha terminado la transmisin se borra el flag de ; interrupcin del puerto serie. ; Se retorna al programa principal.

267

9.6.2 Modos 1, 2 y 3. Modos asncronos Cuando se programa el puerto de comunicacin serie en alguno de los modos asncronos, se pueden enviar datos, a travs de la lnea TXD, y recibir datos, a travs de la lnea RXD, de forma simultnea. En la figura 9.12 est representada la trama del dato que se transmite en los modos asncronos, los modos 1, 2 y 3.
D0 D1 D2 D3
Dato Bit de Start Noveno bit (slo modos 2 y 3) Bit de Stop

D4

D5

D6

D7

D8

Fig. 9.12 Trama de datos para los modos 1, 2 y 3

a) Modo 1 En el modo 1, la trama de datos est compuesta de 10 bits: hay un primer bit de start o comienzo del dato, que vale cero lgico, e indica el comienzo de la transmisin del dato; a continuacin vienen los 8 bits del dato a transmitir y finalmente el bit de stop, que siempre vale 1 lgico. Para enviar un dato en modo 1 basta con poner a cero el bit REN, bit 4 del registro SCON y, a continuacin, escribir en el registro SBUF el dato que se desea enviar. La transmisin comienza una vez escrito el dato en el registro SBUF. Para recibir un dato en modo 1, en primer lugar se debe habilitar la recepcin poniendo a 1 lgico el bit REN. La recepcin comienza cuando se detecta un flanco de bajada en el pin RXD. La velocidad de transmisin en el modo 1 depende de la velocidad de desbordamiento del Timer 1 y/o del Timer 2. Se puede seleccionar cualquiera de ellas o ambos Timers para fijar la velocidad de transmisin y/o recepcin. El Timer que fija por defecto la velocidad de transmisin es el Timer 1, y sta viene dada por la frmula siguiente, en baudios o bits/s: Velocidad de transmisin: 2SMOD1 Velocidad de rebasamiento del Timer 1 [baudios] 32 Si se desea utilizar el Timer 1 como generador de baudios, se debe inhibir la interrupcin del Timer 1, poniendo a cero el bit ETI del registro IE0 y se debe configurar como contador o como temporizador en el modo de trabajo que se desee. En muchas aplicaciones se configura el Timer 1 como temporizador en el modo 2. En este caso, la velocidad de transmisin depender del valor cargado inicialmente en el registro del Timer 1, TH1: Velocidad de transmisin: 2SMOD1
FOSC [baudios] 32 12 ]256 TH1

Los autores, 2001; Edicions UPC, 2001.

268

Microcontroladores MCS-51 y MCS-251

Tabla 9.8 Timer 1 como generador de baudios para los modos 1 y 3 del puerto serie Baudios 62.5 Kbaud (Max) 19.2 Kbaud 9.6 Kbaud 4.8 Kbaud 2.4 Kbaud 1.2 Kbaud 137.5 Baud 110.0 Baud 110.0 Baud Frecuencia Oscilador 12.0 MHz 11.059 MHz 11.059 MHz 11.059 MHz 11.059 MHz 11.059 MHz 11.059 MHz 6.0 MHz 12.0 MHz SMOD1 1 1 0 0 0 0 0 0 0 C/T 0 0 0 0 0 0 0 0 0 Timer 1 Modo Valor recarga 2 FFH 2 FDH 2 FDH 2 FAH 2 F4H 2 E8H 2 1DH 2 72H 1 FEEBH

Se pueden obtener velocidades de transmisin bajas configurando el Timer 1 en modo 1, habilitando su interrupcin e inicializndolo, adecuadamente, en la rutina de servicio a la interrupcin. Si por ejemplo, la frecuencia de reloj es de 12MHz y se recarga el Timer 1 en la rutina de interrupcin con el valor FEEBH, se consigue fijar la velocidad de transmisin en 110.0 Baudios. Con otros valores de recarga se pueden conseguir velocidades ms bajas. El Timer 2 tiene un modo de funcionamiento especfico, denominado Baud Rate Generator Mode, utilizado para fijar la velocidad de transmisin o de recepcin de datos por el puerto serie. Para seleccionar el Timer 2 como generador de baudios, en transmisin y/o recepcin, se deben programar adecuadamente los bits RCLCK y TCLCK del registro T2CON, tal y como se muestra en la tabla 9.9.
Tabla 9.9 Seleccin del Timer 2 como generador de baudios

RCLCK
0 0 1 1

TCLCK
0 1 0 1

Generador de baudios Generador de baudios en recepcin en transmisin


Timer 1 Timer 1 Timer 2 Timer 2 Timer 1 Timer 2 Timer 1 Timer 2

Cuando el Timer 2 se selecciona como generador de baudios funciona de forma similar al modo autorrecarga. Al sufrir desbordamiento, los registros TH2 y TL2 se recargan con el valor de los registros RCAP2H y RCAP2L, que se inicializan por programa. La velocidad de transmisin depende de los valores cargados en estos registros: Velocidad de transmisin:
FOSC 32 ]65536

(RCAP2H , RCAP2L )

[baudios]

En la figura 9.13 se muestra el esquema del Timer 2 configurado en modo generador de baudios. En la tabla 9.10 se indican distintas velocidades de transmisin de acuerdo con los valores de los registros RCAP2H y RCAP2L.

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

269
2

Rebasamiento del Timer 1

0 1

SMOD1
XTAL1

0 1

TH2 (8 bits) TR2

TL2 (8 bits)

16
0

RX Clock

T2 C/T2

RCLCK
1 0 RCAP2H RCAP2L

16

TX Clock

TCLCK
Peticin de interrupcin

T2EX

EXF2

EXEN2

Fig. 9.13 Esquema del Timer 2 trabajando en el modo generador de Baud Rate Tabla 9.10 Timer 2 como generador de baudios para los modos 1 y 3 del puerto serie

Baudios
375.0 Kbaud 9.6 Kbaud 4.8 Kbaud 2.4 Kbaud 1.2 Kbaud 300.0 baud 110.0 baud 300.0 baud 110.0 baud

Frecuencia oscilador
12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 6.0 MHz 6.0 MHz

RCAP2H
FFH FFH FFH FFH FEH FBH F2H FDH F9H

RCAP2L
FFH D9H B2H 64H C8H 1EH AFH 8FH 57H

Ejemplo 9.4 Comunicacin va serie entre dos microcontroladores 8XC251Sx en modo 1 En este ejemplo se trata de disear un canal de comunicacin que transmita, va serie entre dos puntos remotos, datos de 8 bits. Para implementar este sistema se utilizan dos microcontroladores de la serie 8XC251Sx. Uno de ellos, denominado emisor, recibe un dato de entrada a travs de un canal paralelo de 8 bits que est conectado al puerto P1 y lo enva a travs del puerto de comunicacin serie a otro microcontrolador 8XC251Sx, denominado receptor, que lo recibe y lo reenva en formato paralelo por el puerto P1 (figura 9.14). Para indicar que hay un nuevo dato en el puerto P1, listo para ser ledo por el microcontrolador emisor, se activa la entrada de interrupcin externa cero con un flanco negativo.
Emisor
8XC251Sx
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 INT0

Receptor
8XC251Sx TXD RXD P3.0
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 P2.0

P3.1

Dato vlido de entrada

Dato vlido de salida

Fig. 9.14 Esquema del canal de comunicacin

Los autores, 2001; Edicions UPC, 2001.

270

Microcontroladores MCS-51 y MCS-251

El microcontrolador receptor (figura 9.14) tambin dispone de una salida de dato vlido ubicada en el pin P2.0. Por esta salida se genera un pulso positivo para indicar que ya est disponible en el puerto P1 un nuevo dato recibido por el puerto serie. Para realizar la transmisin, se programa en modo 1 el puerto serie de los dos microcontroladores, con una velocidad de transmisin/recepcin de 9.600 baudios. Esta aplicacin requiere el diseo de dos rutinas, una rutina de envo de datos, para el microcontrolador emisor, y una rutina de recepcin para el microcontrolador receptor. La rutina del emisor comienza programando el puerto serie en modo 1. A continuacin se debe habilitar la interrupcin externa cero, programar el Timer 1 como temporizador en modo 2 e inicializar adecuadamente los registros TH1 y TL1 para que la velocidad de transmisin sea de 9.600 baudios. Si consideramos que la frecuencia de la seal de reloj es de 11.059MHz y que el bit SMOD1 est a 0 lgico, se debe cargar el valor FDH en TH1 y TL1 para obtener una velocidad de transmisin de 9.600 baudios. Por otra parte, la rutina de servicio a la interrupcin /INT0 incluye instrucciones que ejecutan el envo del dato ledo en el puerto P1 por el puerto serie. En cualquier caso, se debe garantizar que no se enviar un nuevo dato hasta que no finalice la transmisin del dato en curso. Por este motivo, se chequea de forma reiterada el bit TI mientras ste valga 0 lgico. Cuando termine la transmisin del dato, este bit pasar a 1 lgico, y finalizar la rutina de servicio a la interrupcin /INT0. A continuacin se presenta el listado del programa principal y de la rutina de servicio a la interrupcin externa cero del microcontrolador emisor.
;------------------------------------------------------------------------------------------------------------; PROGRAMA PRINCIPAL DE LA TRANSMISION SERIE ;------------------------------------------------------------------------------------------------------------ORG FF:0000H ; JMP TRSER ; Salto al programa principal. ORG FF:0100H ; Programacin del puerto serie TRSER: SETB SM1 ; Se programa el puerto serie en modo 1. CLR SM0 ; CLR REN ; Se habilita la transmisin por el puerto serie. ; Programacin del Timer 1 MOV TMOD,#20H ; Se programa el Timer 1 en modo 2, como MOV TL0,#FDH ; temporizador y se inicializa con el valor FDH para que MOV TH0,#FDH ; la velocidad de transmisin sea de 9,6Kbaud. CLR SMOD1 ; Se pone a cero el bit SMOD1. ; Programacin de la interrupcin /INT0 SETB EX0 ; Se habilita la interrupcin /INT0. SETB EA ; Se activa el bit habilitador de interrupciones. SETB INTR ; Para cargar en la pila 3 bytes del PC y el registro de estado. SETB IT0 ; Interrupcin /INT0 activa por flanco descendente. ;------------------------------------------------------------------------------------------------------------; RUTINA DE SERVICIO A LA INTERRUPCION /INT0 ;------------------------------------------------------------------------------------------------------------ORG FF:0003H ; Vector de interrupcin de /INT0. JMP RSI_INT0 ; Salto a la rutina de RSI. ORG FF:2000H RSI_INT0: MOV R0,P1 ; Se carga el dato del puerto P1 en el registro R0.

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie MOV SBUF,R0 JNB TI,SIGUE CLR TI RETI

271
; Carga el dato en SBUF para comenzar la transmisin serie. ; Bucle de espera mientras dura la transmisin del dato. ; Se borra el flag TI. ; Se retorna al programa principal.

SIGUE:

La rutina del receptor tiene en comn con la del emisor la programacin del Timer 1 y la programacin del puerto serie, excepto en el bit REN, que debe ponerse a 1 lgico para habilitar la recepcin. La rutina tambin incluye instrucciones que detectan cundo se ha recibido un nuevo dato mediante el chequeo continuo del bit RI. Cuando se active este bit, se cargar el dato recibido, que est ubicado en el registro SBUF, en el puerto P1, al mismo tiempo que se generar un pulso positivo en la salida P2.0. A continuacin se presenta el listado del programa que controla el funcionamiento del microcontrolador receptor.
;------------------------------------------------------------------------------------------------------------; PROGRAMA PRINCIPAL DE LA TRANSMISION SERIE ;------------------------------------------------------------------------------------------------------------ORG FF:0000H ; Programacin del puerto serie SETB SM1 ; Se programa el puerto serie en modo 1. CLR SM0 ; SETB REN ; Se habilita la recepcin por el puerto serie. ; Programacin del Timer 1 MOV TMOD,#20H ; Se programa el Timer 1 en modo 2, como MOV TL0,#FDH ; temporizador y se inicializa con el valor FDH para que MOV TH0,#FDH ; la velocidad de transmisin sea de 9,6Kbaud. CLR SMOD1 ; Se pone a cero el bit SMOD1. ; Control de la recepcin de datos por el puerto serie. SIGUE: JNB RI,SIGUE ; Bucle de espera hasta que no se reciba un nuevo dato por el puerto serie. CLR RI ; Se borra el flag RI. MOV R0,SBUF ; Se carga el dato recibido en el registro R0. MOV P1,R0 ; Se carga el dato en el registro P1. SETB P2.0 ; Se genera un pulso positivo por el pin P2.0 para CLR P2.0 ; indicar que hay un nuevo dato en el puerto P1. JMP SIGUE ; Salta a la instruccin de chequeo de RI para detectar la recepcin de un nuevo dato.

b) Modo 2 Cuando el puerto serie est programado en el modo 2, la trama de bits que se transmite o se recibe est compuesta por 11 bits: 1 bit de start, 8 bits de datos, comenzando siempre por el bit de menor peso, un noveno bit programable por el usuario y un bit de stop. Los datos se transmiten por el pin TXD y se reciben por el pin RXD. En la transmisin, el noveno bit transmitido se corresponde con el valor del bit TR8 del registro SCON, mientras que en la recepcin, el noveno bit se almacena en el bit RB8 del dicho registro. El procedimiento para transmitir en modo 2 comienza seleccionando el modo de trabajo; a continuacin se pone a 0 lgico el bit REN, se escribe el bit TR8 con el valor del noveno bit a transmitir y se carga en el registro SBUF el dato que se desea enviar por el puerto serie. La transmisin comienza justo despus de escribir el registro SBUF. La recepcin se produce cuando se recibe un flanco descendente por el pin RXD, mientras el bit REN est a 1 lgico. En este modo de trabajo, slo se permiten dos velocidades de transmisin/recepcin, dependiendo del valor del bit SMOD1:

Los autores, 2001; Edicions UPC, 2001.

272

Microcontroladores MCS-51 y MCS-251

Velocidad puerto serie: 2 SMOD1 FOSC [baudios] 64 c) Modo 3 El modo 3 del puerto serie es similar al modo 2, con la nica diferencia que la velocidad de transmisin/recepcin se obtiene de la misma manera que en el modo 1.

9.7 Deteccin de errores


El puerto de comunicacin serie permite detectar errores en la recepcin del bit de stop para los modos de trabajo 1, 2 y 3. Para ello, basta poner a 1 lgico el bit SMOD0, que est ubicado en el registro PCON. Cuando esta opcin est habilitada, el puerto serie verifica el bit de stop de cada dato recibido: cuando este bit es errneo se pone a 1 lgico, automticamente, el bit FE del registro SCON. Si se utiliza este recurso, se deben incluir en el programa instrucciones que examinen el bit FE cada vez que se reciba una dato, para detectar posibles errores. Una vez activo, el bit FE slo se puede borrar por programa, por lo que se deben incluir instrucciones especficas que borren el bit FE cada vez que se ponga a 1 lgico.

9.8 Comunicacin multiprocesador


Los modos de trabajo 2 y 3 posibilitan la comunicacin, en entornos multiprocesador, a travs del puerto serie. Esta prestacin permite el control de la comunicacin serie en un sistema donde varios procesadores, que actan como esclavos, comparten la misma lnea de comunicacin serie junto con un procesador maestro que realiza el control de la comunicacin. Para habilitar la opcin de comunicacin multiprocesador, se debe poner a 1 lgico el bit SM2 del registro SCON. En la figura 9.15 se muestra un ejemplo de entorno de comunicacin multiprocesador, donde se puede observar que el pin de transmisin serie, TXD, del microcontrolador que acta de maestro, est conectado al pin de recepcin serie, RXD, de los microcontroladores esclavos, mientras que el pin RXD del maestro est conectado al pin TXD de los esclavos. Por otra parte, cada microcontrolador dispone de una direccin que lo identifica y que posibilita al microcontrolador maestro comunicarse con un microcontrolador esclavo concreto.
8XC251 Maestro
TXD RXD

8XC251 Esclavo
TXD RXD

8XC251 Esclavo
TXD RXD

8XC251 Esclavo
TXD RXD

Fig. 9.15 Comunicacin en entorno multiprocesador

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

273

Para que llevar a cabo la comunicacin va serie en un entorno multiprocesador, todos los microcontroladores esclavos deben tener su bit SM2 a 1 lgico. En estas condiciones, cuando el microcontrolador que acta de maestro quiere comunicarse con algn esclavo debe, en primer lugar, transmitir a travs del puerto serie un dato con la direccin del esclavo. El noveno bit del dato transmitido ser un 1 lgico como indicativo de que se enva una direccin. Todos los esclavos leern esa direccin, pero slo aquel que reconozca su propia direccin pondr el bit RB8 a 1 lgico, al mismo tiempo que activar su flag de interrupcin RI para generar una interrupcin. El microcontrolador esclavo, que ha sido direccionado, pondr a cero su bit SM2, preparndose, de este modo, para recibir los bytes de datos enviados por el maestro. Los bytes de datos tienen el noveno bit a 0 lgico; por tanto, son ignorados por todos los esclavos que tienen su bit SM2 a 1. De este modo, el nico microcontrolador esclavo que responde al maestro es el que ha reconocido su direccin.

9.9 Reconocimiento automtico de direcciones


La direccin individual de cada microcontrolador se especifica en los registros SADDR y SADEN. Por otra parte, el microcontrolador se identifica mediante dos tipos de direcciones denominadas direcciones given y direcciones broadcast.

9.9.1 Direcciones given La direccin individual del microcontrolador se almacena en el registro SADDR; por otra parte, el registro SADEN contiene una mscara de bits que permiten tomar, indistintamente, como 0 1 lgico, aquellos bits del registro SADDR que en el registro SADEN estn a 0 lgico. De este modo se puede direccionar ms de un esclavo al mismo tiempo. Por ejemplo, si en el registro SADDR est almacenado el valor 1001 0011 y en el registro SADEN el valor 0101 1111, el microcontrolador responde a las direcciones: X0X1 0011. En este caso, las combinaciones posibles de valores que pueden tomar los bits 5 y 7, dan lugar a 4 direcciones distintas asociadas al mismo microcontrolador y denominadas direcciones given. En los casos extremos, si el registro SADEN almacena el valor 0000 0000, el microcontrolador responde a cualquier direccin, y si el registro SADEN est cargado con el valor 1111 1111, slo responde a la direccin almacenada en el registro SADDR. Ejemplo 9.5 Direccionamiento de diferentes esclavos utilizando direcciones given Se dispone de tres microcontroladores esclavos con las siguientes direcciones y mscaras: Esclavo A: SADDR = 1111 0001 SADEN = 1111 1010 Given = 1111 0X0X SADDR = 1111 0011 SADEN = 1111 1001 Given = 1111 0XX1

Esclavo B:

Los autores, 2001; Edicions UPC, 2001.

274

Microcontroladores MCS-51 y MCS-251

Esclavo C:

SADDR = 1111 0011 SADEN = 1111 1101 Given = 1111 00X1

Si nos fijamos en las direcciones anteriores, se puede comprobar que, para el esclavo A, el bit de menor peso de la direccin es indeterminado, mientras que en los esclavos B y C vale 1 lgico. Entonces, para comunicarse exclusivamente con el esclavo A, la direccin deber tener el bit de menor peso a cero, como, por ejemplo, la direccin 1111 0000. Por otra parte, para el esclavo A, el segundo bit vale 0 mientras que en los esclavos B y C es indeterminado. Luego, para comunicarse con los esclavos B y C, pero no con el A, el microcontrolador maestro deber enviar una direccin que tenga el segundo bit a 1 lgico, por ejemplo la direccin 1111 0011. Para los esclavos A y B el tercer bit es indeterminado, mientras que para el esclavo C el tercer bit de la direccin vale 0. Para comunicarse con los esclavos A y B, pero no con el C, el maestro deber enviar una direccin con el tercer bit a 1 lgico, por ejemplo la direccin 1111 0101. Si el microcontrolador maestro debe comunicarse con los tres esclavos a la vez, enva una direccin con el primer bit a 1 lgico, el segundo bit a 0 lgico y el tercero a 0 lgico, por ejemplo la direccin 1111 0001.

9.9.2 Direcciones broadcast Las direcciones broadcast se forman realizando la operacin OR lgica entre el contenido del registro SADDR y el contenido del registro SADEN, donde los ceros representan bits indeterminados, por ejemplo: SADDR = 0101 0110 SADEN = 1111 1100 Broadcast (SADDR) or (SADEN) = 1111 111X Ejemplo 9.6 Direccionamiento de diferentes esclavos utilizando direcciones broadcast Se dispone de tres microcontroladores esclavos con las siguientes direcciones y mscaras: Esclavo A: SADDR = 1111 0001 SADEN = 1111 1010 Broadcast = 1111 1X11 SADDR = 1111 0011 SADEN = 1111 1001 Broadcast = 1111 1X11 SADDR = 1111 0010 SADEN = 1111 1101 Given = 1111 1111

Esclavo B:

Esclavo C:

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

275

Para los esclavos A y B, el bit tercero es indeterminado, mientras que para el esclavo C es igual a 1 lgico. En este caso, para comunicarse con todos los esclavos el microcontrolador maestro debe enviar la direccin FFH. Si el maestro debe comunicarse con los esclavos A y B pero no con el C debe enviar la direccin FBH. Ejemplo 9.7 Comunicacin multiprocesador en modo 2 Se dispone de un sistema que incorpora cinco microcontroladores, un maestro y cuatro esclavos, denominados A, B, C y D, conectados entre s a travs del puerto serie para trabajar en entorno multiprocesador (figura 9.16).

8XC251 Maestro
TXD RXD

8XC251 Esclavo A
TXD RXD

8XC251 Esclavo B
TXD RXD

8XC251 Esclavo C
TXD RXD

8XC251 Esclavo D
TXD RXD

Fig. 9.16 Comunicacin en entorno multiprocesador

En la tabla 9.11 se especifica el contenido de los registros SADDR y SADEN de los distintos esclavos, as como las direcciones given y broadcast resultantes.
Tabla 9.11 Direcciones de los microcontroladores esclavos.

Esclavo A SADDR SADEN Given Broadcast


0000 0001 1111 1100 0000 00XX 1111 11X1

Esclavo B
0000 0010 1111 1010 0000 0X1X 1111 1X1X

Esclavo C
0000 0100 1111 0101 0000 X1X0 1111 X1X1

Esclavo D
0000 1000 1111 0011 0000 XX00 1111 1X11

Para controlar esta aplicacin, se debe disear un programa que gestione el envo de datos entre el maestro y los esclavos. La secuencia de transferencia de datos es la siguiente: En primer lugar el maestro transmite a los esclavos A y D, los datos contenidos entre las direcciones de memoria 50H y 5FH. A continuacin, enva al esclavo C los datos almacenados en las posiciones de memoria de la 60H a la 6FH. Finalmente, el maestro transmite a todos los esclavos el contenido de la direccin 70H. El programa del microcontrolador que realiza las funciones de maestro, incluye instrucciones que programan el puerto serie en modo 2 y que lo habilitan para transmitir. A continuacin, vienen las instrucciones que realizan la transmisin de datos a los distintos esclavos. Para mandar datos a los esclavos A y D se puede utilizar la direccin 0000 0000, que es comn a ambos esclavos. Para transmitir datos al esclavo C se utiliza la direccin 0000 1110, que es exclusiva de este esclavo. Finalmente, para direccionar todos los esclavos simultneamente se

Los autores, 2001; Edicions UPC, 2001.

276

Microcontroladores MCS-51 y MCS-251

puede emplear la direccin 1111 1111. A continuacin se detalla el programa de control de transmisin de datos del maestro.
;------------------------------------------------------------------------------------------------------------; PROGRAMA PRINCIPAL DEL MAESTRO ;------------------------------------------------------------------------------------------------------------ORG FF:0000H ; Programacin del puerto serie SETB SM0 ; Se programa el puerto serie en modo 2. CLR SM1 ; CLR REN ; Se habilita la transmisin por el puerto serie. SETB SMOD1 ; Se pone el bit SMOD1 a 1 lgico. ; Envo de datos a los esclavos A y D. SETB TB8 ; Se coloca el 9 bit a 1 para indicar a los esclavos que se enva una direccin. MOV SBUF,#00H ; El maestro enva por el puerto serie la direccin de los esclavos A y D. SIG1: JNB TI,SIG1 ; El maestro espera a que se acabe la transmisin. CLR TI ; Se borra el flag TI. CLR TB8 ; El maestro se dispone a enviar los datos. MOV R0,#10H ; Se carga un contador con el nmero de datos a enviar. MOV R1,#50H ; Se carga un puntero con la direccin de memoria ; donde estn almacenados los datos. SIG2: MOV SBUF,@R1 ; Se enva un dato. INC R1 ; Se incrementa el puntero en una unidad. SIG3: JNB TI,SIG3 ; El maestro espera a que se acabe la transmisin. CLR TI ; Se borra el flag de interrupcin en transmisin. DJNZ R0,SIG2 ; Se decrementa el contador de datos transmitidos. ; Envo de datos al esclavo C. SETB TB8 ; Se coloca el 9 bit a 1 para indicar a los esclavos que se enva una direccin. MOV SBUF,#0EH ; El maestro enva por el puerto serie la direccin del esclavo C. SIG4: JNB TI,SIG4 ; El maestro espera a que se acabe la transmisin. CLR TI ; Se borra el flag TI. CLR TB8 ; El maestro se dispone a enviar los datos. MOV R0,#10H ; Se carga un contador con el nmero de datos a enviar. MOV R1,#60H ; Se carga un puntero con la direccin de memoria donde estn los datos. SIG5: MOV SBUF,@R1 ; Se enva un dato. INC R1 ; Se incrementa el puntero en una unidad. SIG6: JNB TI,SIG6 ; El maestro espera a que se acabe la transmisin. CLR TI ; Se borra el flag de interrupcin en transmisin. DJNZ R0,SIG5 ; Se decrementa el contador de datos transmitidos. ; Envo de datos a todos los esclavos. SETB TB8 ; Se coloca el noveno bit a 1 lgico para indicar a los ; esclavos que se enva una direccin. MOV SBUF,#FFH ; El maestro enva por el puerto serie una direccin comn a todos los esclavos. SIG7: JNB TI,SIG7 ; El maestro espera a que se acabe la transmisin. CLR TI ; Se borra el flag TI. CLR TB8 ; El maestro se dispone a enviar los datos. MOV SBUF,70H ; Se enva el dato de la direccin 70H. SIG8: JNB TI,SIG8 ; El maestro espera a que se acabe la transmisin. CLR TI ; Se borra el flag de interrupcin en transmisin.

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

277

10 El array de contadores programables (PCA)


10.1 Introduccin
El array de contadores programable, PCA, est formado por un temporizador/contador de 16 bits y por cinco mdulos de comparacin/captura. El temporizador/contador de 16 bits se utiliza como base de tiempos de los mdulos del PCA y su valor se distribuye a todos ellos a travs de un bus interno de 16 lneas (figura 10.1). El array de contadores programable est disponible en las versiones 8XC51FX de la familia MCS-51 y en toda la familia MCS-251. El modo de funcionamiento y la forma de operar del PCA es el mismo para las dos familias, por lo que su explicacin en este captulo es vlida para ambas. Cada uno de los mdulos puede ser programado de forma independiente para realizar capturas de flancos, comparacin, generacin de seal de modulacin de anchura de pulsos PWM, etc. Adems, el mdulo cuatro del PCA puede realizar la funcin de temporizador watchdog. Los registros CMOD y CCON controlan el modo de operacin del temporizador/contador del PCA, mientras que los registros CCAPMx, con x = 0, , 4, se encargan de controlar el modo de operacin de los mdulos de comparacin/captura del PCA. En las tablas 10.1 y 10.2 se muestra el contenido de los registros CCON y CMOD, respectivamente, y se indica el nombre y la funcin de cada uno de los bits que componen estos registros. En la tabla 10.3 estn listados los registros relacionados con la programacin y funcionamiento del PCA.
Tabla 10.1 Registro de control CCON del temporizador/contador del PCA CCON b7 CF b6 CR b5 --b4 CCF4 Valor de reset: 00X0 0000B b3 b2 b1 CCF3 CCF2 CCF1 b0 CCF0

Bit
7

Mnemnico
CF

Funcin
Flag de desbordamiento del temporizador/contador del PCA. Este flag se activa cuando el Timer del PCA sufre desbordamiento. Esto genera una interrupcin al microcontrolador si el bit ECF (registro CMOD) est activo. Este bit se borra por programa. Bit de control de puesta en marcha del temporizador/contador del PCA. Bit de puesta en marcha del Timer del PCA. Debe estar a 1 lgico para que el Timer funcione. Reservado. Flags del mdulo de comparacin/captura. Se pone a 1 lgico, automticamente, cuando el comparador se activa, lo que genera una interrupcin al microcontrolador si el bit ECCFx correspondiente est activo. Debe ser borrado por programa.

6 5 4:0

CR --CCF4:0

Los autores, 2001; Edicions UPC, 2001.

278 Tabla 10.2 Registro de modo CMOD del temporizador/contador del PCA CMOD b7 CIDL

Microcontroladores MCS-51 y MCS-251

b6 WDTE

b5 ---

b4 ---

Valor de reset: 00XX X000B b3 b2 b1 --CPS1 CPS0

b0 ECF

Bit
7

Mnemnico
CIDL

Funcin
Bit de control del PCA temporizador/contador en modo Idle. Cuando CIDL=1 inhibe al Timer del PCA durante el modo Idle. Si CIDL=0 el Timer del PCA funciona durante el modo Idle. Bit de habilitacin del Timer watchdog. WDTE=1 habilita el Timer watchdog del mdulo 4 del PCA. WDTE=0 inhibe el Timer watchdog del PCA Bits reservados. Los valores de estos bits son indeterminados. No deben utilizarse. Bits de seleccin de las entradas del PCA temporizador/contador. CPS1 CPS0 0 0 FOSC/12 0 1 FOSC/4 1 0 Desbordamiento del Timer 0 1 1 Reloj externo en el pin ECI (frecuencia mx. =FOSC/8) Bit de habilitacin de la interrupcin del PCA temporizador/contador. Cuando ECF=1 se habilita el bit CF en el registro CCON para generar una peticin de interrupcin.

WDTE

5:3 2:1

--CPS1:0

ECF

Tabla 10.3 Registros asociados al PCA

Mnemnico
CL CH CCON

Descripcin
Temporizador/contador del PCA. Estos dos registros de 8 bits implementan fsicamente el temporizador/contador de 16 bits del PCA. Registro de control del temporizador/contador del PCA. Contiene los bits de puesta en marcha y desbordamiento del temporizador; y los flags de interrupcin de los 5 mdulos de comparacin/captura. Registro de modo del temporizador/contador del PCA. Contiene los bits para habilitar el temporizador/contador del PCA durante el modo de funcionamiento Idle, para habilitar el temporizador watchdog, para seleccionar la entrada del temporizador/contador y para habilitar la interrupcin por desbordamiento del temporizador/contador del PCA. Registros de comparacin/captura del mdulo 0 del PCA. Estos registros cargan el valor comparado o capturado. Cuando el PCA trabaja en modo PWM, el registro de menor peso controla el ciclo de trabajo de la onda de salida. Registros de comparacin/captura del mdulo 1 del PCA. Idem Registros de comparacin/captura del mdulo 2 del PCA. Idem Registros de comparacin/captura del mdulo 3 del PCA. Idem Registros de comparacin/captura del mdulo 4 del PCA. Idem Registros de modo de los mdulos de comparacin/captura del PCA. Contiene los bits que permiten seleccionar el modo de operacin de los mdulos de comparacin/captura y habilitacin del flag de comparacin captura.

CMOD

CCAP0H CCAP0L CCAP1H CCAP1L CCAP2H CCAP2L CCAP3H CCAP3L CCAP4H CCAP4L CCAPM0 CCAPM1 CCAPM2 CCAPM3 CCAPM4

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

279

10.2 Temporizador/contador del PCA


En la figura 10.1 se muestra el esquema asociado al temporizador/contador del PCA, formado por los registros CH y CL de 8 bits cada uno.
Mdulos de comparacin y captura Mdulo 0 Mdulo 1 Bus de 16 bits Mdulo 3 Mdulo 2 Mdulo 4 16 bits CH (8 bits) CL (8 bits) CF CCON.7 Rebasamiento P1.3/CEX0 P1.4/CEX1 P1.5/CEX2 P1.6/CEX3 P1.7/CEX4/A17 Peticin de interrupcin

Fosc /12 Fosc /4 Timer 0, desbordamiento P1.2/ECI

00 01 10 11

Temporizador/contador del PCA

CPS1

CPS0

CIDL

ECF CMOD.0

CMOD.2 CMOD.1 CMOD.7 IDL PCON.0 Modo Idle CR CCON.6 Run Control

Fig. 10.1 Array de contadores programables

Los bits CPS1 y CPS0 del registro CMOD seleccionan una de las cuatro posibles fuentes de entrada del temporizador/contador: 1. 2. 3. 4. FOSC/12: para CPS1, CPS0 = 00, el temporizador/contador se incrementa cada ciclo de perifrico, en concreto en el perodo 2 del estado 5, S5P2. FOSC/4: para CPS1, CPS0 = 01, el temporizador/contador se incrementa cada cuatro perodos de seal de reloj. Desbordamiento del Timer 0: para CPS1, CPS0 = 10, el temporizador/contador se incrementa cada vez que desborda el Timer 0. Pin P1.2/ECI: si se programan los bits CPS1, CPS0 = 11, el temporizador/contador se incrementa cuando se aplica un flanco descendente en el pin P1.2/ECI. La frecuencia mxima de incremento para este caso es de FOSC /8.

El PCA dispone de tres bits relacionados con la habilitacin del funcionamiento del temporizador. El bit CR, ubicado en el registro CCON, pone en marcha el temporizador si la salida de la puerta NAND est a 1 lgico (figura 10.1). En caso de que el microcontrolador est trabajando en el modo Idle de bajo consumo (bit IDL del registro PCON a 1 lgico), el temporizador del PCA seguir funcionando mientras el bit CIDL, registro CMOD, est a cero lgico. Es posible leer el contenido de los registros CH y CL del temporizador/contador del PCA en cualquier momento, pero no se puede escribir en estos registros mientras el temporizador est funcionando.

Los autores, 2001; Edicions UPC, 2001.

280

Microcontroladores MCS-51 y MCS-251

10.3 Mdulos de comparacin/captura del PCA


El PCA dispone de cinco mdulos de comparacin/captura: cada uno de ellos incorpora dos registros de comparacin/captura, registros CCAPxH/CCAPxL, con x = 0, , 4, y un comparador de 16 bits. Los registros de comparacin/captura almacenan el valor del Timer del PCA cuando ocurre un evento externo, captura, o bien, cuando se activa la salida del comparador del mdulo. En el modo PWM, el byte bajo, CCAPxL, controla el ciclo de trabajo de la seal generada. Cada uno de los mdulos puede ser programado mediante su correspondiente registro CCAPMx en uno de estos modos de funcionamiento: Modo de captura de flanco positivo, flanco negativo o ambos. Modo de comparacin. En este modo se consiguen diferentes funcionamientos: temporizador controlado por software de 16 bits, salida de alta velocidad, temporizador watchdog de 16 bits, o bien, PWM de 8 bits. Sin operacin.

10.3.1 Modo captura El modo captura permite medir perodos, anchos de pulso, ciclos de trabajo y diferencia de fase entre cinco seales. En la figura 10.2 se muestra el esquema correspondiente al modo captura.
Temporizador/contador del PCA Entrada de cuenta CH (8 bits) Captura CL (8 bits)

CEXx I/O Externa

CCAPxH CCAPxL x = 0, 1, 2, 3 4 X=01 CCFx Registro CCON X 7 O CAPPx CAPNx O O O Enable ECCFx 0 Peticin de interrupcin

Registro de modo CCAPM x

Fig. 10.2 Modo de captura de 16 bits

El microcontrolador verifica los pines de entrada CEX0, CEX1, CEX2, CEX3 y CEX4 para detectar transiciones positivas y/o negativas en la seal binaria aplicada en estos pines (tabla 10.4).
Tabla 10.4 Seales externas asociadas al PCA

Nombre Tipo
ECI CEX0 CEX1 CEX2 CEX3 CEX4 I I/O

Descripcin
Entrada externa del temporizador/contador del PCA. Esta seal es la entrada de reloj externo para el temporizador/contador del PCA. Entradas/salidas externas de los mdulos de comparacin/captura. Cada mdulo de comparacin/captura tiene asociado como pin de entrada/salida un pin del puerto P1.

Ubicacin
P1.2 P1.3 P1.4 P1.5 P1.6 P1.7/A17

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

281

Cuando un mdulo de comparacin/captura, que est programado en modo captura, detecta una transicin en su entrada CEXx, se carga en los registros CCAPxH/ CCAPxL el valor actual de los registros del Timer del PCA. El objetivo de esta operacin es registrar el momento en que se produjo la transicin de la seal de entrada, con una resolucin equivalente a un perodo de reloj del Timer del PCA. Al producirse la captura, tambin se activa el flag de comparacin/captura CCFx del registro CCON. Por otra parte, si el bit de habilitacin de interrupcin del registro CCAPMx, ECCFx, est activo, el PCA realiza una peticin de interrupcin al microcontrolador. En la rutina de servicio a la interrupcin del PCA se debe borrar el flag de interrupcin activo y guardar el valor capturado en los registros CCAPxH/CCAPxL en la memoria RAM, ya que con la siguiente captura se reemplaza ese valor. Para configurar un mdulo del PCA en modo captura se debe programar adecuadamente el bit CAPPx (captura de flanco positivo), y CAPNx (captura del flanco negativo) del registro CCAPMx de dicho mdulo. En la tabla 10.5 se especifica el contenido de los registros CCAPMx y en la tabla 10.6 se indica el valor que deben tomar estos bits para programar los mdulos del PCA en las distintas configuraciones posibles. Por ejemplo, para capturar una transicin positiva se debe activar el bit CAPPx y borrar el bit CAPNx. Si se desea capturar una transicin negativa, el bit activo debe ser CAPNx, mientras que el bit CAPPx debe estar a cero. Si ambos bits estn a 1 lgico, se capturan flancos positivos y negativos.
Tabla 10.5 Registros de comparacin/captura del PCA

CCAPMx b7 --Bit
7 6

b6 ECOMx

b5 CAPPx

b4 CAPNx

b3 MATx

Valor de reset: X000 0000B b2 b1 b0 TOGx PWMx ECCFx

Mnemnico
--ECOMx

Funcin
Reservado. Este bit no se puede utilizar. Modos de comparacin. Cuando este bit est a 1 lgico se habilita el comparador del mdulo. Este comparador se utiliza para generar un Timer, salidas de alta velocidad, un modulador de anchura de pulso o un temporizador watchdog. Modo captura positiva. Cuando este bit est a 1 lgico, habilita la captura de flancos positivos en la entrada externa CEXx. Modo captura negativa. Cuando este bit est a 1 lgico, habilita la captura de flancos negativos en la entrada externa CEXx. Si se pone este bit a 1 lgico, se habilita el flag de interrupcin del mdulo cuando se activa el comparador. Conmutacin. CuandoTOGx=1, estando el comparador habilitado, la salida CEXx conmuta de valor cada vez que se activa el comparador. Modo PWM. Cuando PWMx=1 se configura el mdulo como modulador de anchura de pulsos con 8 bits de resolucin y con salida por el pin CEXx. Habilitacin de interrupciones. Este bit habilita las interrupciones generadas al activarse el comparador del mdulo.

5 4 3 2 1 0

CAPPx CAPNx MATx TOGx PWMx ECCFx

Los autores, 2001; Edicions UPC, 2001.

282 Tabla 10.6 Modos de trabajo del PCA

Microcontroladores MCS-51 y MCS-251

ECOMx CAPPx CAPNx MATx TOGx PWMx ECCFx


0 X X X 1 1 1 1 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 X 0 0 0 0 0 0 1 0 0 X X X X X 0 X

Modo
Sin operacin Captura con el flanco positivo de la entrada CEXx Captura con el flanco negativo de la entrada CEXx Captura con el flanco positivo o negativo de la entrada CEXx Comparacin: software Timer Comparacin: salida de alta velocidad Comparacin: PWM de 8 bits Comparacin: watchdog en el mdulo M4

Ejemplo 10.1 Funcionamiento del PCA en modo captura En este ejemplo se trata de medir el desfase entre dos seales senoidales, Va(t) y Vb(t), de igual frecuencia pero de distinta fase, utilizando dos mdulos del PCA programados para capturar flancos positivos. En la figura 10.3 se muestra el esquema del montaje propuesto para medir el desfase. Este esquema incorpora dos comparadores que digitalizan dos seales senoidales con una precisin de 1 bit. La salida de los comparadores se aplica a la entrada de los mdulos 0 y 1 del PCA, CEX0 y CEX1, respectivamente. La salida del comparador vale 1 lgico cuando la seal de entrada es positiva y 0 lgico cuando es negativa.

8XC251Sx
Va(t)

Comparador
+

Vb(t) +

CEX0

Desfase

CEX1

Fig. 10.3 Detector de desfase

Los mdulos 0 y 1 del PCA trabajan en modo captura de flanco positivo, de forma que capturan el valor de los registros del Timer del PCA cuando la entrada correspondiente pasa por un flanco positivo. Midiendo el tiempo transcurrido entre el flanco de subida en la entrada CEX0 y el flanco de subida en la entrada CEX1 y, conociendo la frecuencia de la seal de reloj y el perodo de las seales Va(t) y Vb(t), se puede determinar, en grados, el retardo entre ambas seales. El perodo de la seal de entrada se obtiene realizando la diferencia entre los valores capturados por el mdulo 0 en dos flancos de subida consecutivos. Para simplificar el programa que controla esta aplicacin se puede considerar que el perodo de las seales de entrada es inferior a la mitad del tiempo que tarda el Timer del PCA en sufrir

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

283

desbordamiento, teniendo en cuenta que el reloj de entrada del Timer es FOSC/4 y FOSC=16MHz. El programa de control de la aplicacin estar compuesto por un programa principal de configuracin e inicializacin de perifricos y por una rutina de servicio a la interrupcin del PCA. En el programa principal se incluye, en primer lugar, una instruccin que inicializa un contador de capturas del mdulo 0, que permite contabilizar las dos capturas necesarias para obtener el perodo de la seal. Asimismo, se deben programar adecuadamente los registros CCAPM0 y CCAPM1, para configurar los mdulos 0 y 1 del PCA en modo captura del flanco positivo; se deber inicializar el registro CMOD para seleccionar la entrada FOSC/4 como reloj del Timer del PCA; se deben poner a cero los registros de los mdulos 0 y 1 (CCAP0H/CCAP0L y CCAP1H/CCAP1L); y se deben habilitar los flags de interrupcin del Timer del PCA, y del mdulo 0, ubicados en el registro CCON. El flag de interrupcin de mdulo 1 se habilita en la rutina RSI del PCA, despus de que el mdulo 0 haya capturado el primer flanco. Finalmente, se pone en marcha el Timer del PCA, activando el bit CR del registro CCON, y se habilita la interrupcin del PCA en el registro de habilitacin de interrupciones. En la figura 10.4 se muestra cmo se deben programar los registros CCON y CMOD, segn las especificaciones del enunciado.
CCON
CF CR --CCF4 CCF3 CCF2 CCF1 CCF0

Puesta en marcha del Timer del PCA Borrado de los flags de interrupcin de los mdulos 0 y 1

CMOD
CIDL WDTE ------CPS1 CPS0 ECF

Seleccin de la entrada F OSC/4

Fig. 10.4 Programacin de los registros CCON y CMOD

En la figura 10.5 se muestran los bits que hay que activar en los registros CCAPM0 y CCAPM1, para programar los mdulos 0 y 1 en el modo captura de flanco positivo.

Los autores, 2001; Edicions UPC, 2001.

284 CCAPM0, CCAPM1


--ECOM x CAPPx CAPNx MATx TOGx

Microcontroladores MCS-51 y MCS-251

PWM x ECCF0

Habilita el modo de captura de flanco positivo Habilita la interrupcin del mdulo 0 Fig. 10.5 Programacin de los registros CCAPM0 y CCAPM1

A continuacin se detalla el programa principal del medidor de desfase.


;---------------------------------------------------------------------------------------------------------; PROGRAMA PRINCIPAL DEL MEDIDOR DE DESFASE ;---------------------------------------------------------------------------------------------------------ORG FF:0000H ; El programa comienza en la direccin FF:0000H JMP FF:2000H ; Se salta a la direccin FF:2000H donde hay espacio de memoria ; suficiente para colocar el resto de instrucciones del programa. ORG FF:2000H ; MOV R6,#00H ; Se carga a cero un contador de capturas del mdulo 0. CLR CCF0 ; Se borra el flag de interrupcin del mdulo cero. CLR CCF1 ; Se borra el flag de interrupcin del mdulo uno. SETB ECCF0 ; Se habilita al mdulo 0 para interrumpir. SETB CPS0 ; Se selecciona como entrada de reloj del timer del PCA CLR CPS1 ; la seal FOSC/4. MOV CCAP0H,#0H ; Se inicializan a cero los registros de MOV CCAP0L,#0H ; comparacin/captura de los mdulos 0 y 1. MOV CCAP1H,#0H ; MOV CCAP1L,#0H ; MOV CL,#00H ; Se inicializa a cero el timer del PCA. MOV CH,#00H ; SETB CR ; Se pone en marcha el timer del PCA. SETB EC ; Habilitacin de la interrupcin generada por el PCA. SETB EA ;

En la rutina RSI del PCA se debe determinar cul de los dos mdulos ha interrumpido y almacenar, en algn registro tipo Word, el valor capturado por ese mdulo. La siguiente interrupcin est generada necesariamente por una captura de flanco positivo del otro mdulo. El valor capturado en este caso se cargar en otro registro tipo Word. Finalmente, se deja que el primer mdulo vuelva a capturar otro flanco positivo. Realizando la diferencia entre ambos valores capturados, se determina el periodo de la seal (figura 10.6). Perodo Segundo flanco Primer flanco
Fig. 10.6 Medida del perodo de la seal

Teniendo el perodo y los valores de captura del primer flanco de ambos mdulos, es posible calcular el desfase entre ambas seales, que en grados vendr dado por: FP Vb[t ] FP Va [t ] 360 Periodo (10.1)

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

285

donde FPVb(t) es el valor de captura del primer flanco positivo de la seal Vb(t) y FPVa(t) es el valor de captura del primer flanco positivo de la seal Va(t). A continuacin se detalla el listado de la rutina de servicio a la interrupcin del PCA.
;---------------------------------------------------------------------------------------------------------; RUTINA DE SERVICIO A LA INTERRUPCIN DEL PCA ;---------------------------------------------------------------------------------------------------------ORG FF:0033H ; La rutina comienza en la direccin FF:0033H JMP FF:1000H ; Se salta a la direccin FF:1000H donde hay espacio de memoria ; suficiente para colocar el resto de instrucciones de la rutina. ORG FF:1000H ; JB CCF1,FP1 ; Si ha interrumpido el mdulo 1 se salta a FP1. CLR CCF0 ; Se borra el flag de interrupcin del mdulo cero. SETB ECCF1 ; Se habilita al mdulo 1 para interrumpir. INC R6,#1H ; Se incrementa el contador de capturas. CMP R6,#02H ; Si se han realizado dos capturas se inhibe la interrupcin del JE SAL1 ; mdulo 1 y se pasa a calcular el desfase. MOV R0,CCAP0H ; Se carga el contenido de los registros de comparacin/captura del MOV R1,CCAP0L ; mdulo 0 del PCA en el registro WR0. RETI ; Se retorna al programa principal SAL1:MOV R2,CCAP0H ; Se carga la segunda captura del mdulo 0 del PCA en el registro MOV R3,CCAP0L ; WR2. CLR ECCF0 ; Se inhiben futuras interrupciones del mdulo 0. MOV WR8,WR2 ; SUB WR8,WR0 ; Se calcula el perodo. MOV WR10,#360d ; Se carga el valor 360 en WR10. DIV WR8,WR10 ; Se divide el periodo entre 360 para determinar a cuantos ; incrementos del timer equivale a un grado. SUB WR4,WR2 ; Se obtiene el tiempo entre las dos capturas de las seales desfasadas. DIV WR4,WR10 ; Se obtiene el desfase en grados RETI ; Se retorna al programa principal. FP1: CLR CCF1 ; Se borra el flag de interrupcin del mdulo 1. CLR ECCF1 ; Se inhibe futuras interrupciones del mdulo 1. MOV R4,CCAP1H ; Se carga el contenido de los registros de comparacin/captura del MOV R5,CCAP1L ; mdulo 1 del PCA en el registro WR4. RETI ; Se retorna al programa principal.

Ejemplo 10.2 Medida del ancho de un pulso El PCA puede medir el ancho de un pulso digital capturando los flancos positivo y negativo del pulso (figura 10.7) y efectuando la diferencia entre el valor de las dos capturas. Si se conoce cul es el tipo de flanco que se produce primero, el PCA puede configurarse para capturar cualquiera de los flancos del pulso, tanto positivo como negativo. Por contra, si se desconoce este hecho se puede determinar qu flanco realizar la primera captura eligiendo el modo adecuado de funcionamiento del PCA. En este ejemplo se supone que el primer flanco que se produce es el flanco positivo.
W 87C51FA
P1.3/CEX0

1 Captura

2 Captura

Ancho = Tpo (2 Captura)-Tpo (1 Captura)

Fig. 10.7 Medida del ancho de un pulso con el 87C51FA

Los autores, 2001; Edicions UPC, 2001.

286

Microcontroladores MCS-51 y MCS-251

La rutina para efectuar la medida del ancho del pulso se muestra a continuacin.
;************************************************************************ ; Rutina para la lectura del ancho de un pulso mediante el PCA ;************************************************************************ CAPTL EQU 20H ;Posicin para el byte bajo de la 1 captura CAPTH EQU 21H ;Posicin para el byte alto de la 2 captura ANCHOL EQU 22H ;Posicin para el byte bajo del ancho de pulso ANCHOH EQU 23H ;Posicin para el byte alto del ancho de pulso Orden_captura EQU 24H.0 ;Indicador de si ha sido la 1 o la 2 captura ORG 00H LJMP Inicio ORG 033H LJMP RSI_PCA ;************************************************************************ ; Inicio (En esta rutina slo se configura el PCA para la lectura del ancho) ;************************************************************************ Inicio: MOV CMOD, #0 ;Inicializa el temporizador del PCA MOV CL, #0 ;Se escoge una entrada de (1/12)xFosc MOV CH, #0 ;Borra los registros CL y CH MOV CCAPM0, #21H ;Configura el mdulo 0 para capturar el flanco positivo SETB EC ;Habilita la interrupcin del PCA SETB EA ;Activa el bit de habilitacin general SETB CR ;Pone en marcha el temporizador del PCA CLR Orden:_captura ;Borra el bit de orden de captura. Esta es la primera captura ;************************************************************************ ; Rutina de RSI del PCA ;************************************************************************ RSI_PCA: CLR CCF0 ;Borra el bit del mdulo 0 de comparacin/captura JB Orden_captura, Captura_2 ;Comprueba si se trata de la primera o segunda captura Captura_1: MOV CAPTL, CCAP0L ;Guarda el byte bajo de la captura MOV CAPTH, CCAP0H ;Guarda el byte alto de la captura MOV CCAPM0, #11H ;Configura el mdulo 0 para capturar el flanco negativo SETB Orden_captura RETI Captura_2: PUSH ACC ;Guarda el acumulador y el registro de estado en la pila PUSH PSW CLR C ;Borra el bit de acarreo para efectuar una resta de 16 bits MOV A, CCAP0L ;Lee el byte bajo de la 2 captura SUBB A, CAPTL ;Efecta la resta con el byte bajo de la 1 captura MOV ANCHOL ;Guarda resultado MOV A, CCAP0H ;Lee el byte alto de la 2 captura SUBB A, CAPTH ;Efecta la resta con el byte alto de la 1 captura MOV ANCHOH ;Guarda resultado MOV CCAPM0, #21H ;Configura el mdulo 0 para capturar el siguiente flanco + CLR Orden_captura POP PSW ;Recupera el PSW de la pila POP ACC ;Recupera el acumulador de la pila RETI

En esta rutina se utiliza el mdulo 0 para realizar la captura de los flancos, positivo y negativo, del pulso. Para ello, primero se pone el dato 21H en el registro CCAPM0, lo que configura al mdulo para una captura del flanco positivo, poniendo los bits CAPP0 y ECCF0, de captura positiva y de habilitacin de interrupcin, respectivamente, a 1 lgico. Y, luego, al efectuarse esta captura, se pone el dato 11H en CCAPM0, que configura al mdulo para una posterior captura del flanco negativo (bits CAPN0 y ECCF0 a 1 lgico).

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

287

Al producirse la primera captura del flanco positivo de la seal, en la rutina de atencin a la interrupcin del PCA, RSI_PCA, los registros CCAP0L y CCAP0H del mdulo se almacenan en las posiciones 20H y 21H, respectivamente, de la memoria RAM interna. Cuando se realiza la segunda captura, el valor de estos registros se recupera de la memoria interna para efectuar una resta de 16 bits con el valor actual de la captura. De esta forma, el valor de la diferencia entre las capturas es el valor de 16 bits del ancho del pulso a medir, y se guarda en las posiciones 22H y 23H de la memoria RAM interna. Para que la aplicacin funcione correctamente en los registro CL y CH no debe producirse un desbordamiento, puesto que el programa no considera esta posibilidad.

10.3.2 Modos de comparacin Los modos de comparacin permiten a los mdulos del PCA operar como temporizadores, como contadores, o bien, como moduladores de anchura de pulsos, PWM. El funcionamiento del mdulo, en estos modos, est basado en el comparador de 16 bits que incorpora cada mdulo, cuya funcin ser bsicamente la de comparar el contenido de los registros de comparacin/captura con los registros del Timer del PCA, y activar su salida cuando los contenidos de ambos registros sean iguales. En total hay cuatro modos de comparacin: modo temporizador por software de 16 bits, modo de salida de alta velocidad, modo de temporizador watchdog y modo PWM. Para que un mdulo del PCA funcione en alguno de los modos de comparacin se debe llevar a cabo el siguiente procedimiento general: 1. 2. 3. 4. 5. 6. Poner a 1 lgico el bit ECOMx del registro CCAPMx, correspondiente al mdulo que deseamos programar en algn modo de comparacin (tablas 10.3 y 10.4). Programar adecuadamente el resto de bits del registro CCAPMx para seleccionar el modo concreto de funcionamiento. Seleccionar la seal de entrada del Timer del PCA. Cargar el valor de comparacin en los registros de comparacin/captura del mdulo. Poner a 1 lgico el bit de puesta en marcha del Timer del PCA. Poner a cero el flag de interrupcin del mdulo de comparacin/captura una vez activo.

a) Modo temporizador de 16 bits Para trabajar en este modo se ponen a 1 lgico los bits ECOMx y MATx del registro CCAPMx (tabla 10.6). En este modo de funcionamiento, el comparador que incorpora el mdulo compara el contenido de los registros de comparacin/captura con el contenido de los registros del Timer del PCA. Cuando el contenido de estos registros coincide, se activa el flag de interrupcin del mdulo, CCFx, ubicado en el registro CCON. Si el bit de habilitacin de interrupcin del mdulo est activo se produce una peticin de interrupcin. En la figura 10.8 se muestra el esquema de bloques, correspondiente a los modos de funcionamiento de temporizador de 16 bits y de salida de alta velocidad.

Los autores, 2001; Edicions UPC, 2001.

288
Mdulo de comparacin y captura CCAP xH CCAP xL

Microcontroladores MCS-51 y MCS-251

Timer/ counter del PCA Entrada de cuenta CH (8 bits) CL (8 bits)

Comparador de 16 bits

CEX x Peticin de interrupcin Enable ECCF x 0

CCF x CCON X 7 0 Reset Escribir CCAP xL 1 Escribir CCAP xH ECOM x 0 0 MAT x TOG x 0

Registro de modo CCAPM x X=01 x = 0, 1, 2, 3, 4

Fig. 10.8 Modos de trabajo temporizador de 16 bits y salida de alta velocidad

b) Modo de salida de alta velocidad En este modo de funcionamiento, se genera una seal binaria de salida a travs del pin CEXx, asociado al mdulo, que conmuta de valor cada vez que se activa el comparador del mdulo (figura 10.8). La conmutacin de este pin es independiente de la atencin a la interrupcin. Esto permite dar una respuesta ms rpida y precisa a la activacin del comparador. Para programar un mdulo en este modo de funcionamiento se deben poner a 1 lgico los bits ECOMx, MATx, y TOGx del registro CCAPMx (tabla 10.6). c) Modo temporizador watchdog El temporizador watchdog, WDT, tiene como funcin generar un reset del microcontrolador si no se inicializan de forma regular sus registros. El WDT se utiliza en aplicaciones sometidas a fenmenos que pueden inducir al microcontrolador a ejecutar errneamente el programa, como son el ruido elctrico, derivas instantneas de la tensin de alimentacin, descargas elctricas, etc. Los microcontrolador de la serie 8XC251Sx disponen de dos WDT: uno de 14 bits y otro de 16 bits, que es una opcin de funcionamiento del mdulo 4 del PCA. Cuando el Timer del PCA alcanza el valor cargado en los registros de comparacin/captura del mdulo 4, se genera un reset del microcontrolador, que tiene el mismo efecto que un reset externo. Para programar el mdulo 4 como WDT, se ponen a 1 lgico los bits ECOM4 y MAT4 del registro CCAPM4 y el bit WDTE del registro CMOD; tambin debe seleccionarse la entrada del Timer del PCA, programando los bits CPS0 y CPS1 del registro CMOD. El valor de comparacin se carga en los registros CCAP4H/CCAP4L, aunque, si se desea, tambin se puede cargar un valor inicial distinto de cero en los registros del Timer del PCA, CH/CL. La diferencia entre estos valores multiplicada por

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

289

el perodo de reloj de entrada del Timer del PCA, determina el tiempo que tarda el WDT en generar un reset, si no se realiza ninguna accin que lo evite, como por ejemplo: 1. 2. 3. Cambiar peridicamente el valor de los registros CCAP4H/CCAP4L antes de que se active el comparador. Cambiar repetidamente el contenido del temporizador del PCA antes de que alcance el valor del mdulo 4. Inhibir la salida del mdulo 4 poniendo a cero el bit WDTE = 0 antes de que se active el comparador y habilitarlo de nuevo despus de que se halle activado.

La segunda opcin no es recomendable cuando se utilizan otros mdulos del PCA, pues el temporizador del PCA es la base de tiempos de todos los mdulos y su cambio afectara al funcionamiento del resto de los mdulos. La tercera opcin puede ser poco conveniente, pues podra ocurrir un error en la ejecucin del programa cuando se tuviese inhibido el mdulo 4, de manera que el watchdog no intervendra y la situacin no se solucionara. La primera opcin es la ms viable debido a que no se inhabilita el watchdog, pero se debe cambiar peridicamente el contenido de CCAP4H/CCAP4L por el programa para actualizar el watchdog. En la siguiente rutina se muestra la inicializacin del PCA para utilizar el mdulo 4 como watchdog en un microcontrolador 8XC51FX:
;************************************************************************ ; Rutina de inicializacin del mdulo 4 en modo watchdog para 8XC51FX ;************************************************************************ INI_WATCHDOG: MOV CCAPM4, #4CH ;Mdulo en modo de comparacin MOV CCAP4L, #0FFH ;Se escribe primero en el byte bajo del mdulo MOV CCAP4H, #0FFH ;Los valores de comparacin se deben cambiar ;antes de que el temporizador del PCA llegue a ;desbordamiento, es decir, a FFFFH ORL CMOD, #40H ;Activa el bit WDTE para habilitar el watchdog ;sin tener que afectar al resto de bits de CMOD

A continuacin se muestra la subrutina, para un microcontrolador 8XC51FX, que permite actualizar los registros del mdulo 4 del PCA:
;************************************************************************ ; Subrutina de refresco del watchdog del PCA para 8XC51FX ;************************************************************************ WATCHDOG: CLR EA ;Inhabilita las interrupciones MOV CCAP4L, #0 ;Borra el byte bajo, de forma que la prxima comparacin MOV CCAP4H, CH ;est dentro de 255 incrementos del PCA SETB EA ;Habilita las interrupciones RETI

En la figura 10.9 se muestra el diagrama de bloques del mdulo 4 cuando est programado como WDT.

Los autores, 2001; Edicions UPC, 2001.

290
Mdulo de comparacin y captura CCAP4H CCAP4L

Microcontroladores MCS-51 y MCS-251

Timer/ counter del PCA Entrada de cuenta CH (8 bits) CL (8 bits)

Comparador de 16 bits WDTE CMOD.6

Reset PCA WDT

X 7 0 Reset Escribir CCAP4L 1 Escribir CCAP4H

ECOM4

X 0

Registro de modo CCAPM4 X=01

Fig. 10.9 Modo watchdog

c) Modo PWM Los cinco mdulos de comparacin/captura pueden programarse independientemente en modo PWM. La seal PWM est disponible en la salida CEXx, con una resolucin de ancho de pulso de 8 bits. Para programar un mdulo del PCA en modo PWM se deben activar los bits ECOMx y PWMx del registro CCAPMx. En este modo de funcionamiento, se compara el registro CL del Timer del PCA con el registro CCAPxL. Cuando CL es menor que CCAPxL, la salida CEXx es un 0 lgico. Para valores de CL mayores o iguales que CCAPxH, la salida permanece a 1 lgico hasta que el registro CL sufre desbordamiento y vuelve, automticamente, a 0 lgico. En ese momento se recarga el registro CCAPxL con el contenido del registro CCAPxH, empezando, as, un nuevo perodo de la seal PWM (figura 10.10). El ciclo de trabajo de la seal PWM se controla mediante el valor almacenado en el registro CCAPxL, mientras que el valor del registro CCAPxH proporciona el ciclo de trabajo del siguiente perodo. Cargando el valor adecuado en el registro CCAPxH se puede variar el ciclo de trabajo desde un 0.4%, para un valor de 255, hasta el 100%, para un valor de 0. En la figura 10.11 se muestran las seales PWM obtenidas para distintos valores del registro CCAPxL. La frecuencia de la seal PWM generada en este modo de funcionamiento es igual a la frecuencia de la seal de entrada del temporizador del PCA dividida por 256. La mayor frecuencia de entrada del Timer es FOSC/4, que da lugar a una frecuencia de seal PWM de 15.6kHz, considerando una frecuencia de reloj de 16MHz.

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

291

CCAPxH El rebasamiento de CL carga el contenido de CCAPxH en CCAPxL

CCAPxL X=01 x = 0, 1, 2, 3, 4 8 8 0 CL < CCAPxL Comparador de 8 bits CL CCAPxL Habilitacin 1 CEXx CL (8 bits)

X 7

ECOMx

PWMx

0 0

Registro de modo CCAPMx

Fig. 10.10 Modo PWM 8 bits


Ciclo de trabajo 0.4% 10% 50% 90% 100%

CCAPxL 255 230 128 25 0

Seal PWM

Fig. 10.11 Ciclo de trabajo variable

Ejemplo 10.3 Generador de seal programable En este ejemplo se debe controlar la frecuencia de trabajo de un generador de seal realizado mediante un oscilador controlado por tensin, VCO, y el mdulo 0 del PCA trabajando en modo PWM. El VCO genera en su salida un seal cuya frecuencia es proporcional a la tensin de entrada, en concreto:

f o Vi

256 (kHz) 5

(10.2)

donde fo es la frecuencia de salida y Vi la tensin de entrada en voltios.

Los autores, 2001; Edicions UPC, 2001.

292

Microcontroladores MCS-51 y MCS-251

En la figura 10.12 se muestra el esquema de esta aplicacin: se observa que se ha conectado la entrada de tensin del VCO a la salida CEX0 del mdulo 0 a travs de un filtro paso-bajo.
8XC251Sx
R
CEX0

VCO

Vi
C

fo

Fig. 10.12 Esquema del generador de seal controlado por microcontrolador

La tensin de entrada del VCO es el resultado de filtrar la seal de salida PWM generada por el mdulo 0. Si la seal PWM tiene una frecuencia suficientemente alta respecto a la frecuencia de corte del filtro paso-bajo, la tensin de salida del filtro, Vi, ser prcticamente constante, y su valor igual a la componente continua de la seal PWM generada (figura 10.13).
T Ta

Va
C
Fig. 10.13 Seal PWM filtrada

Vi=Va Ta/T

Si se considera que el margen dinmico de la salida CEX0 est entre 0 y 5V, y teniendo en cuenta que el ciclo de trabajo de la seal PWM oscila entre 0.004 y 1, la frecuencia generada por el VCO estar comprendida entre 1kHz, para un ciclo de trabajo de 0.004, y 256kHz, para un ciclo de trabajo de 1, con una resolucin de 1kHz. El programa asociado a la aplicacin debe incluir instrucciones que configuren adecuadamente el registro CCAPM0 para que el mdulo 0 del PCA trabaje en modo PWM, que programen el registro CMOD para seleccionar la entrada FOSC/4 como reloj del Timer del PCA, e instrucciones que inicialicen los registros CCAP0H y CCAP0L para obtener el ciclo de trabajo deseado. Teniendo en cuenta la expresin 10.2, el valor cargado en el registro CCAP0H es, directamente, el valor de frecuencia en kHz, que se obtendr a la salida del VCO. Finalmente, se pone en marcha el Timer del PCA activando el bit CR del registro CCON. A continuacin se detallan las instrucciones del programa principal de esta aplicacin.
;---------------------------------------------------------------------------------------------------------; PROGRAMA DEL GENERADOR DE FRECUENCIA ;---------------------------------------------------------------------------------------------------------ORG FF:0000H ; El programa comienza en la direccin FF:0000H JMP FF:2000H ; Se salta a la direccin FF:2000H donde hay espacio de memoria ; suficiente para colocar el resto de instrucciones del programa. ORG FF:2000H ; SETB ECCM0 ; Se programan adecuadamente los bits del registro CCAPM0 SETB PWM0 ; para que el mdulo cero trabaje en modo PWM. CLR CAPP0 ;

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA) CLR CAPN0 ; CLR MAT0 ; CLR TOG0 ; CLR ECCF0 ; MOV CCAP0L,#5H ; Se carga en los registros CCAP0H y CCAP0L el valor de la MOV CCAP0H,#5H ; frecuencia que se desea generar (por ejemplo 5kHz). MOV CL,#00H ; Se inicializa a cero el timer del PCA. MOV CH,#00H ; SETB CR ; Se pone en marcha el timer del PCA.

293

Ejemplo 10.4 Medida de frecuencia La medida de la frecuencia de una seal digital (figura 10.14) se puede efectuar con el PCA del microcontrolador. Para ello, es necesario medir el tiempo T de duracin de un tren de N pulsos de la seal digital. El mdulo de captura del PCA se debe configurar para capturar los flancos positivos, de forma que cada captura se producir con cada nuevo pulso de la seal. T 87C51FA
P1.3/CEX0

Captura 1

Captura N

T = Tpo (Captura 1)-Tpo (Captura N) Fig. 10.14 Medida de la frecuencia de una seal con el 87C51FA

La frecuencia de la seal se obtiene dividiendo el nmero N de capturas por el tiempo T transcurrido: Frecuencia N Nmero de capturas T Tiempo (10.3)

La rutina para la medida de la frecuencia se muestra a continuacin, donde se supone que la duracin T del tren de N pulsos es menor que el tiempo de desbordamiento del temporizador del PCA.
;************************************************************************ ; Rutina para la medida de la frecuencia de una seal mediante el PCA ;************************************************************************ CAPTL EQU 20H ;Posicin para el byte bajo de la 1 captura CAPTH EQU 21H ;Posicin para el byte alto de la 2 captura PERIODOL EQU 22H ;Byte bajo del tiempo T PERIODOH EQU 23H ;Byte alto del tiempo T NUM_CAP EQU 24H ;Determina el nmero de capturas a realizar FLANCO EQU 25H.0 ;Bit que indica si es la primera captura en efectuarse ORG 00H LJMP Inicio ORG 033H ;Vectorizacin del PCA LJMP RSI_PCA

Los autores, 2001; Edicions UPC, 2001.

294

Microcontroladores MCS-51 y MCS-251 ;************************************************************************ ; Inicio (En esta rutina slo se configura el PCA para la medida de la frecuencia) ;************************************************************************ Inicio: MOV CMOD, #0 ;Inicializa el temporizador del PCA MOV CL, #0 ;Se escoge una entrada de (1/12)xFosc MOV CH, #0 ;Borra los registros CL y CH MOV CCAPM0, #21H ;Configura el mdulo 0 para capturar el flanco positivo SETB EC ;Habilita la interrupcin del PCA SETB EA ;Activa el bit de habilitacin general SETB CR ;Pone en marcha el temporizador del PCA MOV NUM_CAP, #10 ;Determina el nmero de capturas a efectuar = a 10 pulsos CLR FLANCO ;Borra el bit de indicacin de la primera captura ;************************************************************************ ; Rutina de RSI del PCA ;************************************************************************ RSI_PCA: CLR CCF0 ;Borra el bit del mdulo 0 del comparacin/ captura JB FLANCO, CAPT_SIG ;Comprueba si es la primera captura CAPT_1: MOV CAPTL, CCAP0L ;Guarda el byte bajo de la primera captura MOV CAPTH, CCAP0H ;Guarda el byte alto de la primera captura SETB FLANCO ;Pone a 1 lgico para el resto de las capturas RETI CAPT_SIG: DJNZ NUM_CAP, Salir ;Mientras no llegue a 10 pulsos salir PUSH ACC ;Guarda ACC y PSW en la pila PUSH PSW CLR C ;Borra el bit de acarreo MOV A, CCAP0L ;Lee el byte bajo de la captura N, para resta de 16 bits SUBB A, CAPTL ;Resta con el byte bajo de la primera captura MOV PERIODOL, A ;Guarda el resultado MOV A, CCAP0H ;Lee el byte alto de la captura N SUBB A, CAPTH ;Resta con el byte alto de la primera captura MOV PERIODOH, A ;Guarda el resultado MOV NUM_CAP, #10 ;N de capturas a efectuar para la siguiente medida CLR FLANCO ;Borra bit para la siguiente medida POP PSW ;Recupera ACC y PSW POP ACC Salir: RETI

En esta rutina no se incluye la divisin de N por el valor T obtenido. sta es una divisin de 16 bits que se puede realizar mediante la rutina DIV16 del apartado 5.7. Ejemplo 10.5 Medida del ciclo de trabajo de una seal PWM El ciclo de trabajo de una seal de modulacin de anchura de pulso, PWM, se determina por la relacin existente entre el tiempo que la seal permanece a 1 lgico, TON, y el perodo T de la seal. Por tanto, para calcular el ciclo de trabajo deben medirse estos tiempos, por lo que se debe configurar el mdulo de captura del PCA para que capture tanto los flancos positivos como los flancos negativos de la seal. T
TON

87C51FA
P1.3/CEX0

Captura 1

Captura 3 Captura 2

Fig. 10.14 Medida del ciclo de trabajo de una seal PWM mediante el 87C51FA

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

295

La seal PWM tiene un perodo T constante que determina su frecuencia (figura 10.14). El ciclo de trabajo de la seal viene dado por la relacin:
Ciclo de trabajo TON T

(10.4)

Para efectuar la medida de TON y TOFF se deben realizar tres capturas dentro de un mismo perodo (figura 10.14). Con la diferencia entre la captura 2 y la captura 1 se mide el tiempo TON, y con la diferencia entre la captura 3 y la captura 1 se determina el perodo T de la seal, de forma que para calcular el ciclo de trabajo se debe realizar la siguiente divisin:
Ciclo de trabajo TON T po (Captura 2) T po (Captura 1) T T po (Captura 3) T po (Captura 1)

(10.5)

;************************************************************************ ; Rutina para la medida del ciclo de trabajo de una seal PWM ;************************************************************************ CAPTL EQU 20H ;Posicin para el byte bajo de la 1 captura CAPTH EQU 21H ;Posicin para el byte alto de la 2 captura ANCHOL EQU 22H ;Byte bajo del tiempo TON ANCHOH EQU 23H ;Byte alto del tiempo TON PERIODOL EQU 24H ;Byte bajo del periodo de la seal T PERIODOH EQU 25H ;Byte alto del periodo de la seal T FLANCO1 EQU 26H.0 ;Bits de indicacin del tipo de captura (1, 2 o 3) FLANCO2 EQU 26H.1 ORG 00H LJMP Inicio ORG 033H ;Vectorizacin del PCA LJMP RSI_PCA ;************************************************************************ ; Inicio (En esta rutina slo se configura el PCA para la medida del ciclo de trabajo) ;************************************************************************ Inicio: MOV CMOD, #0 ;Inicializa el temporizador del PCA MOV CL, #0 ;Se escoge una entrada de (1/12)xFosc MOV CH, #0 ;Borra los registros CL y CH MOV CCAPM0, #21H ;Configura el mdulo 0 para capturar el flanco positivo SETB EC ;Habilita la interrupcin del PCA SETB EA ;Activa el bit de habilitacin general SETB CR ;Pone en marcha el temporizador del PCA CLR FLANCO0 CLR FLANCO1 ;************************************************************************ ; Rutina de RSI del PCA ;************************************************************************ RSI_PCA: CLR CCF0 ;Borra el bit del mdulo 0 del comparacin/ captura JB FLANCO1, CAPT_2 ;Comprueba si es el primer flanco positivo CAPT_1: MOV CAPTL, CCAP0L MOV CAPTH, CCAP0H SETB FLANCO1 MOV CCAPM0, #31H ;Bits CCAP0 y CCAPN a 1 lgico, captura RETI ;flanco positivo y negativo CAPT_2: PUSH ACC ;Guarda ACC y PSW en la pila PUSH PSW JB FLANCO2, CAPT_3 ;Comprueba si es la segunda captura CLR C ;Si es la segunda captura pasa a hacer la resta de 16 bits MOV A, CCAP0L ;Lee el byte bajo de la captura actual SUBB A, CAPTL ;Resta con el byte bajo de la primera lectura MOV ANCHOL, A ;Guarda resultado en ANCHOL

Los autores, 2001; Edicions UPC, 2001.

296
MOV A, CCAP0H SUBB A, CAPTH MOV ANCHOH, A SETB FLANCO2 POP PSW POP ACC RETI CLR C MOV A, CCAP0L SUBB A, CAPTL MOV PERIODOL, A MOV A, CCAP0H SUBB A, CAPTH MOV PERIODOH, A MOV CCAPM0, #21H CLR FLANCO1 CLR FLANCO2 POP PSW POP ACC RETI

Microcontroladores MCS-51 y MCS-251 ;Lee el byte alto de la captura actual ;Resta con el byte alto de la primera lectura ;Guarda resultado en ANCHOH ;Configura para la tercera captura ;Recupera ACC y PSW de la pila

CAPT_3:

;Pasa a efectuar la resta entre la 3 y la 1 captura ;Lee el byte bajo de la captura actual (3 captura) ;Resta con el byte bajo de la primera lectura ;Guarda resultado en PERIODOL ;Lee el byte alto de la captura actual (3 captura) ;Resta con el byte alto de la primera lectura ;Guarda resultado en PERIODOH ;Configura el mdulo para captura de flanco positivo ;Borra bit ;Borra bit ;Recupera ACC y PSW de la pila

En esta rutina falta efectuar la divisin de 16 bits entre las variables ANCHO y PERIODO, que se puede realizar mediante la rutina DIV16 del apartado 5.7.

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

297

11 Entradas y salidas analgicas


11.1 Introduccin
En el control de procesos industriales se precisa tener el valor instantneo de determinadas seales analgicas, de forma que se pueda aplicar un algoritmo de control que gestione y dote de ciertas caractersticas al sistema que se desea controlar. De la misma forma, en el procesado de seal tambin es necesario tener el valor instantneo de la seal analgica, sobre la que se aplican ciertos algoritmos 1 2 digitales como pueden ser filtros FIR o IIR , con el fin de extraer determinadas caractersticas de la seal medida. En consecuencia, es habitual tener convertidores del tipo analgico/digital, A/D, y digital/analgico, D/A, en un sistema basado en microcontrolador, para efectuar el control de sistemas, monitorizar el estado de seales analgicas y efectuar el procesado digital de seales. Mediante los convertidores A/D se obtiene el valor discreto de la seal analgica, mientras que con los convertidores D/A se convierte un valor discreto en analgico, pues es necesario que un microcontrolador intervenga de esta manera en determinados sistemas. La familia MCS-51 de Intel no dispone de conversores A/D ni D/A, con la excepcin de la versin 87C51GB, que tiene un conversor A/D de 8 bits de resolucin con hasta 8 canales multiplexados de entrada. De la misma forma, la familia MCS-251 tampoco tiene convertidores A/D y D/A. Por tanto, en estas familias los convertidores A/D y D/A se deben conectar externamente al microcontrolador. En este sentido, se pueden emplear los puertos del microcontrolador para enviar datos, recibir datos y realizar el control de los conversores A/D y D/A. No obstante, la modulacin de anchura de pulsos, PWM, que se puede generar con los microcontroladores que disponen de PCA, se puede utilizar como conversor D/A para las aplicaciones donde se requiere el control de un motor, debido a que la accin de control de un motor se suele realizar mediante el ciclo de trabajo de una seal PWM. Hay otros fabricantes de la familia MCS-51 que proporcionan versiones con convertidor A/D, como por ejemplo el SAB80C515A de Siemens, que incorpora un conversor A/D de 10 bits. Por tanto, el diseador, en funcin de los costos de desarrollo, siempre puede optar por conectar conversores A/D y D/A comerciales al microcontrolador, o bien, por emplear versiones que ya los tengan incorporados. Este captulo se centra en la conexin de convertidores A/D y D/A al microcontrolador, vlida para la MCS-51 y para la MCS-251, as como para otros microcontroladores del mercado. Tambin, se

1 2

Los filtros FIR son filtros digitales no recursivos, ampliamente tratados en la teora clsica del procesado de seal. A diferencia de los FIR, los filtros IIR son recursivos, es decir, con realimentacin de la salida del filtro.

Los autores, 2001; Edicions UPC, 2001.

298

Microcontroladores MCS-51 y MCS-251

expone la implementacin de varias tcnicas de conversin A/D de bajo coste, en las que se utilizan algunos de los recursos internos del microcontrolador.

11.2 Conexin de un convertidor D/A


La figura 11.1 muestra la conexin del convertidor digital/analgico MC1408DAC de 8 bits de Motorola, que es un convertidor sencillo y de bajo costo. El convertidor est basado en una estructura en escalera de resistencias del tipo R-2R, que se muestra en la figura 11.2. Segn esta figura, cada una de las entradas binarias del convertidor controla directamente el estado de un conmutador del circuito, de manera que controla la suma de las corrientes de cada rama al nodo de la entrada negativa del amplificador operacional. La corriente en cada una de las ramas tiene un valor proporcional a potencias sucesivas de 2, es decir, en la rama del bit D8 la corriente es la mitad de la corriente de entrada, en la rama del bit D7 la corriente est dividida por 4, y as sucesivamente. De esta manera, la corriente de salida es proporcional a la palabra digital de entrada del convertidor, D0-D8. La corriente finalmente obtenida se convierte en tensin mediante el amplificador operacional de salida (figura 11.2), cuya ganancia puede ajustarse a fondo de escala, o sea, con todas las entradas a 1 lgico, con la resistencia RT del amplificador, para que la tensin de salida tenga un valor determinado.
+5V

MCS-51 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 A8 A7 A6 A5 A4 A3 A2 A1

MC1408

+5V 1k 1.25k + LM336 1.25k 2.5V 5k +12V _ + 100pF -12V -12V

VREF (+)

VREF (-)
2mA Io COMP

Vo [0-10V]

VEE
RANGE GND

Fig. 11.1 Conexin del convertidor MC1408DAC a la MCS-51

En el circuito de la figura 11.1, el diodo zener de 2.5V y las resistencias de 1.25k se emplean para establecer una fuente de corriente precisa de 2mA. La corriente Io de salida del convertidor D/A se convierte en tensin mediante el amplificador operacional, de manera que la tensin de salida de este amplificador es: Vo ] 2mA [ Entrada binaria [ 5k 256

Con esta frmula, la corriente a fondo de escala, es decir, con la palabra binaria con todos los bits a 1 lgico, es de 2mA; por tanto, la tensin mxima a fondo de escala ser de 10V. Este valor se puede modificar mediante la resistencia RT de realimentacin del amplificador operacional. El tiempo de respuesta del convertidor D/A es un parmetro que determina su mxima velocidad de

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

299

conversin; el MC1408DAC tiene un tiempo de establecimiento settling time de 300ns. Y, la resolucin del MC1408DAC, para el fondo de escala de 10V, es de 39.1mV, que equivale al incremento de la tensin de salida que se produce cuando el bit de menor peso de entrada del DAC cambia de valor.
+V I I/256 R I/256 2R D0
1

I/128 I/128 2R D1
1 0

I/4 I/4 2R D7
1 0

I/2 I/2 2R D8
1 0

2R
0

RT

Vo ] Io [ RT

Io ] Di [
i

I 28
i

Io

i ] 0,1,...,7

Fig. 11.2 Estructura en escalera R-2R del convertidor MC1408DAC

Ejemplo 11.1 Generacin de una senoide mediante el MC1408DAC En este ejemplo, se trata de realizar un programa para la MCS-51 con el circuito de la figura 11.1, que sea capaz de sintetizar una seal senoidal de 1.25kHz de frecuencia. Para ello, se debe tener en cuenta que la tensin de salida Vo del circuito es unipolar, y que se debe especificar un nmero de muestras de salida para que la seal tenga una forma adecuada. En este caso, se obtienen 32 muestras de la seal (figura 11.3), es decir, 16 muestras por cada semiperodo, para representar la seal senoidal.
V
10

7.5

2.5

0 0 0 4 45 8 90 12 135 16 180 20 225 24 270 28 315 32 360

Fig. 11.3 Seal senoidal a generar, formada por 32 muestras

La seal senoidal tiene una componente continua de 5V, de manera que su valor oscilar entre 0V y 10V, segn la siguiente expresin: Vo ] 5V ( 5V [ sin () donde es el ngulo de cada muestra de la senoide. En la tabla 11.1 se presenta el valor de cada una de las muestras de salida del convertidor D/A, en voltios, y el valor binario

Los autores, 2001; Edicions UPC, 2001.

300

Microcontroladores MCS-51 y MCS-251

correspondiente a la entrada del convertidor. En el programa de este ejemplo se debe implementar la tabla de datos, D7-D0, que debe extraer por el puerto del microcontrolador. El Timer 1, mediante interrupcin, determinar la base de tiempos de extraccin de los datos por el puerto P1. Para generar una frecuencia de 1.25kHz el peiodo de la seal debe ser de 0.8ms, y el de cada muestra de salida de 0.8ms/32, es decir, cada muestra se debe extraer cada 25)s. Este perodo se puede generar con el Timer 1, configurado en el modo 2 de 8 bits con autorrecarga. Con una frecuencia de reloj de 12MHz, y con el Timer contando pulsos internos, bit C/T a 0 lgico, se puede hacer que el Timer interrumpa cada 25)s, poniendo el registro TH1 al valor E7H, es decir, a la diferencia entre el valor de rebasamiento del Timer y 25)s (256)s-25)s).
Tabla 11.1 Valores de las muestras para la generacin de la seal senoidal formada por 32 muestras con una separacin de 11.25 cada una
0 11.25 22.5 33.75 45 56.25 67.5 78.75 90 101.25 111.5 123.75 135 146.25 157.5 168.75 sin( ) 0 0.195 0.382 0.555 0.707 0.831 0.923 0.980 1 0.980 0.923 0.831 0.707 0.555 0.382 0.195 Vo (V) 5 5.975 6.913 7.777 8.535 9.157 9.619 9.904 10 9.904 9.619 9.157 8.535 7.777 6.913 5.975 D7-D0 80H 99H B1H C7H DAH EAH F6H FDH FFH FDH F6H EAH DAH C7H B1H 99H 180 191.25 202.5 213.75 225 236.25 247.5 258.75 270 281.25 292.5 303.75 315 326.25 337.5 348.75 sin( ) 0 -0.195 -0.382 -0.555 -0.707 -0.831 -0.923 -0.980 -1 -0.980 -0.923 -0.831 -0.707 -0.555 -0.382 -0.195 Vo (V) 5 4.024 3.086 2.222 1.464 0.842 0.380 0.096 0 0.096 0.380 0.842 1.464 2.222 3.086 4.024 D0-D7 80H 67H 4FH 39H 25H 13H 08H 02H 00H 02H 08H 13H 25H 39H 4FH 67H

El programa para generar la seal senoidal en la MCS-51 se muestra a continuacin:


;************************************************************************ ; Generacin de una seal senoidal peridica de 32 muestras para la MCS-51 ;************************************************************************ ORG 0H ; Tabla de vectores de salto LJMP Inicio ORG 01BH LJMP RSI_Timer1 ;************************************************************************ ; Rutina de Inicio ;************************************************************************ Inicio: SETB ET1 ;Habilita interrupcin del Timer 1 SETB PT1 ;Asigna prioridad alta al Timer 1 SETB EA ;Habilita bit de interrupcin general MOV TMOD, #20H ;Timer 1 en el Modo 2, GATE=0 y C/T=0 MOV TL1, #E7H ;(256-25) carga valor inicial para frecuencia de 1.25kHz MOV TH1, #E7H ;Carga valor inicial para frecuencia de 1.25kHz SETB TR1 ;Pone marcha el Timer 1 ;************************************************************************* ; Rutina de Principal ;************************************************************************* Principal: SJMP Principal ;Bucle infinito sin ninguna funcin definida

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

301

;************************************************************************ ; Rutina de servicio del Timer1 ;************************************************************************ RSI_Timer1:MOV A, R7 ;Pone R7 en A, (1)s). CALL Tab_Seno ;LLamada a subrutina de tabla, (2)s). MOV P1, A ;Pone dato ledo en A, (1)s). CJNE R7, #31, Borra ;Mira si el contador R7 supera su valor max., (2)s). INC R7 ;Incrementa contador R7, (1)s). RETI ;Fin de rutina. El bit TF1 se borra automticamente, (2)s). Borra: MOV R7, #0 ;Borra R7, (1)s). RETI ;Fin de rutina. El bit TF1 se borra automticamente, (2)s). Tab_Seno: INC A ;Incrementa ndice de lectura de la tabla, (1)s). MOVC A, @A+PC ;Lectura indexada de la tabla, (2)s). RET ;Retorno de subrutina, (2)s). DB 80H, 99H, B1H, C7H, DAH, EAH, F6H, FDH ;Tabla de datos DB FFH, FDH, F6H, EAH, DAH, C7H, B1H, 99H DB 80H, 67H, 4FH, 39H, 25H, 13H, 08H, 02H DB 00H, 02H, 08H, 13H, 25H, 39H, 4FH, 67H

La rutina principal de este ejemplo consiste en un bucle infinito sin ninguna funcin definida, puesto que la seal senoidal se genera totalmente por interrupcin. El registro R7 se utiliza como un contador entre 0 y 31, que ndica el orden del dato a leer en la tabla definida por la subrutina Tab_seno. Este contador se borra cada vez que se ha extrado la ltima muestra de la seal senoidal. Para determinar el instante preciso en el cual se extrae por el puerto P1 una muestra de la seal senoidal, se debe tener en cuenta el tiempo en que se genera la interrupcin, el tiempo en que tarda el microcontrolador en saltar a la rutina de RSI y el tiempo que tarda la rutina en poner el dato correspondiente en el puerto P1. El Timer 1 causa una interrupcin cada 31)s, el tiempo mnimo en saltar a la rutina de RSI es de 3 ciclos mquina, o sea, de 3)s para una frecuencia de reloj de 12MHz, y la rutina, para poner el dato ledo en el puerto, debe ejecutar seis instrucciones, lo que supone un tiempo de 8)s. En definitiva, desde que se produce la interrupcin hasta que la muestra aparece en el puerto P1 transcurren 11)s. Por tanto, cada muestra aparecer 11)s despus de que se produzca la interrupcin del Timer (figura 11.4).
Muestra 1 Muestra 2 Muestra n

11)s 16)s

31)s Fin proceso int. 31)s

Int. T1

Int. T1

Int. T1

Int. Timer 1

Int. T1

Fig. 11.4 Secuencia de tiempos de la seal y de la interrupcin generada por el Timer 1

Una vez sacada la muestra por el puerto P1, la rutina de RSI puede tardar 2 3 instrucciones ms en terminar de ejecutarse por completo, lo que, en el peor caso, supone un tiempo de 5)s adicionales. En consecuencia, el tiempo en que se finaliza el proceso de interrupcin es de 16)s, por lo que la interrupcin del Timer 1 no puede producirse por debajo de este tiempo. Este hecho supone que, si se quiere modificar la frecuencia de la seal senoidal, el perodo de

Los autores, 2001; Edicions UPC, 2001.

302

Microcontroladores MCS-51 y MCS-251

cada muestra de la seal no puede ser inferior al proceso de interrupcin; es posible generar, para este caso, una seal senoidal con una frecuencia mxima de 1.953Hz. No obstante, esta frecuencia se puede disminuir reduciendo la cantidad de muestras de la seal, o bien aumentando la frecuencia de la seal de reloj del microcontrolador.

11.3 Convertidor A/D de bajo coste mediante aproximaciones sucesivas


El convertidor digital/analgico anterior, MC1408DAC, se puede emplear, junto con un comparador y con el microcontrolador, para realizar un convertidor analgico/digital de bajo coste (figura 11.5), basndose en la tcnica de aproximaciones sucesivas.
+5V +5V

MCS-51 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 A8 A7 A6 A5 A4 A3 A2 A1

MC1408
1.25k

1k + LM336 1.25k 2.5V 5k +12V Io _ + 100pF -12V +5V +5V + _ -12V Vo

VREF (+)

VREF (-)
2mA

LF355

COMP

VEE
RANGE GND

P3.4 LM393

VIN

Fig. 11.5 Convertidor A/D de 8 bits de bajo coste mediante aproximaciones sucesivas

La tcnica de aproximaciones sucesivas se centra en la bsqueda binaria, por parte del microcontrolador, de un valor de tensin de entrada Vin desconocido, comparndolo, para ello, con valores conocidos de tensin, obtenidos a partir de un convertidor D/A y de una tensin de referencia Vref. Como el convertidor D/A y el circuito empleado en la figura 11.5 son los mismos, prcticamente, que en el apartado anterior, las tensiones mxima y mnima que se pueden generar en la salida Vo son 10V y 0V, respectivamente. El valor mximo se corresponde con la palabra digital 11111111 y el valor mnimo con 00000000 del puerto P1. La bsqueda binaria se inicia poniendo Vo a la mitad del fondo de escala, o sea, a (Vmax-Vmin)/2, por lo que en el puerto P1 se debe poner el bit ms significativo a 1 lgico y el resto de bits a 0 lgico (10000000)(figura 11.6). La tensin Vo generada por el D/A se compara con la seal Vin, de forma que la salida del comparador es 0 lgico si Vin es mayor que Vo (Vin>Vo), y 1 lgico si Vin en menor que Vo (Vin<Vo). El microcontrolador debe leer el estado de la comparacin, y si Vin es mayor que Vo, entonces le debe sumar a la tensin actual Vo la mitad del margen superior que queda hasta llegar al fondo de escala, es decir, (Vmax+Vo)/2, lo que se consigue poniendo a 1 lgico el bit 6 del puerto

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

303

P1 (P1=11000000). Si, al contrario, resulta que Vin es menor que Vo, entonces le debe restar a la tensin actual Vo la mitad del margen inferior que queda hasta llegar al mnimo de tensin, 0V, es decir, (Vo-Vmin)/2, lo que se consigue poniendo a 0 lgico el bit 7 y a 1 lgico el bit 6 del puerto P1 (P1=01000000). Este procedimiento se contina de forma sucesiva, hasta llegar a determinar el estado del bit 0 del puerto P1. La conversin de la seal se lleva a cabo de esta manera en tan slo 8 pasos, empezando por el bit ms significativo y terminando por el bit menos significativo. La figura 11.6 muestra el algoritmo que hay que realizar con la tcnica de aproximaciones sucesivas. En este algoritmo Vo(k) representa el valor de Vo actual y Vo(k+1) representa el valor de Vo futuro a realizar. La conversin finaliza en 8 iteraciones, de forma que, partiendo del inicio, si tomamos el bit ms significativo (MSB) como bit b(i), con i=7, se pueden dar dos situaciones en el algoritmo, dependiendo del resultado de la comparacin entre Vin y Vo. En el caso de que Vin sea mayor que Vo, Vin>Vo, se ejecuta la segunda ecuacin del algoritmo (ecuacin 2), que en realidad se lleva a cabo simplemente forzando el bit b(i-1) a 1 lgico, es decir, para este caso, poniendo el bit b(6) a 1 lgico. Al contrario, si Vin es menor que Vo, Vin<Vo, se ejecuta la primera ecuacin del algoritmo (ecuacin 1), que se lleva a cabo poniendo el bit b(i) a 0 lgico y el bit b(i-1) a 1 lgico, es decir, poniendo en este caso el bit b(7) a 0 lgico y el bit b(6) a 1 lgico. Este algoritmo se iterar hasta llegar a evaluar el bit b(0).
Inicio

Poner bit MSB (bit 7) a 1 lgico

Vin > Vo NO
Vo (k ( 1) ] Vo( k )

SI

Vo (k ) V mn 2

Vo(k ( 1) ] Vo(k ) (

V mx Vo(k ) 2

NO

Es el bit LSB (bit 0) SI Fin (Vo Vin)

Fig. 11.6 Flujograma del algoritmo de aproximaciones sucesivas

Los autores, 2001; Edicions UPC, 2001.

304

Microcontroladores MCS-51 y MCS-251

La subrutina que realiza la conversin para la MCS-51 se muestra a continuacin:


;**************************************************************************** ; Subrutina CONV de aproximaciones sucesivas para el circuito de la figura 11.5 ;**************************************************************************** CONV: MOV P1, #0 ;Borra puerto P1, (2)s) SETB P1.7 ;Pone a 1 lgico el bit 7, (1)s) JNB P3.4, B1 ;Lee el estado de la comparacin, (2)s) CLR P1.7 ;Borra el bit 7, (1)s) B1: SETB P1.6 ;Pone a 1 lgico el bit 6, (1)s) JNB P3.4, B2 ;Lee el estado de la comparacin, (2)s) CLR P1.6 ;Borra el bit 6, (1)s) B2: SETB P1.5 ;Pone a 1 lgico el bit 5, (1)s) JNB P3.4, B3 ;Lee el estado de la comparacin, (2)s) CLR P1.5 ;Borra el bit 5, (1)s) B3: SETB P1.4 ;Pone a 1 lgico el bit 4, (1)s) JNB P3.4, B4 ;Lee el estado de la comparacin, (2)s) CLR P1.4 ;Borra el bit 4, (1)s) B4: SETB P1.3 ;Pone a 1 lgico el bit 3, (1)s) JNB P3.4, B5 ;Lee el estado de la comparacin, (2)s) CLR P1.3 ;Borra el bit 3, (1)s) B5: SETB P1.2 ;Pone a 1 lgico el bit 2, (1)s) JNB P3.4, B6 ;Lee el estado de la comparacin, (2)s) CLR P1.2 ;Borra el bit 2, (1)s) B6: SETB P1.1 ;Pone a 1 lgico el bit 1, (1)s) JNB P3.4, B7 ;Lee el estado de la comparacin, (2)s) CLR P1.1 ;Borra el bit 1, (1)s) B7: SETB P1.0 ;Pone a 1 lgico el bit 0, (1)s) JNB P3.4, B8 ;Lee el estado de la comparacin, (2)s) CLR P1.0 ;Borra el bit 0, (1)s) B8: RET ;Conversin finalizada (2)s)

El tiempo de conversin de esta rutina, depender del valor de la seal analgica Vin. No obstante, se pueden determinar el peor y mejor caso a ejecutar por la subrutina. El peor caso consistir en un valor de Vin que obligue la ejecucin de todas las instrucciones de la subrutina. Teniendo en cuenta un reloj de 12MHz para el microcontrolador, la subrutina tiene una primera instruccin que borra el puerto P1 y que tarda 2)s en ejecutarse. El resto de las instrucciones son una secuencia de puesta a 1 lgico, lectura del comparador y borrado, que tarda 4)s, es decir, 1)s para la puesta a 1 lgico, 2)s para la lectura del comparador y 1)s para el borrado. Esta secuencia se repite hasta ocho veces, por lo que el tiempo de conversin, en el peor de los casos, es:
tpeor ] 2 ( (1 ( 2 ( 1) [ 8 ( 2 ] 44)s

El mejor de los casos consiste en una seal Vin tal que no se ejecute ninguna de las instrucciones CLR, por lo que el tiempo de conversin es:
tmejor ] 2 ( (1 ( 2) [ 8 ( 2 ] 28)s

En consecuencia, con la subrutina mostrada y el circuito de la figura 11.5 el tiempo de conversin estar comprendido entre 28)s y 44)s.

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

305

11.4 Conexin de un convertidor A/D


La figura 11.7 muestra la conexin entre el convertidor analgico/digital ADC0809 de 8 bits de National Instruments y un microcontrolador de la familia MCS-51. El ADC0809 puede leer la seal procedente de hasta 8 canales de entrada, seleccionables mediante tres lneas de direccin, S2-S0, que actan sobre un multiplexor interno. Este convertidor est basado en la tcnica de conversin por aproximaciones sucesivas.
+5V +12V 1.8k
+

Bus datos
D0-D7

Vcc +Vref

P0
A10 A11 S0 S1 S2

-Vref

LM336-5

MCS-51
Canal 0

A12

ADC0809

IN0 IN1 IN2 IN3 IN4 IN5 IN6 IN7 EOC GND

Inicio y lectura de conversin


74LS04 OE a
e

P2

A10 A11 A12 A13 A14 A15

Canal 1 Canal 2 Canal 3 Canal 4 Canal 5 Canal 6 Canal 7

74LS08 ALE START c A15 A14 A13 1k


c a

/INT0

74LS04

CLOCK

1k
b

74LS04 680pF

Fig. 11.7 Conexin del convertidor ADC0809 a la MCS-51

Las salidas del convertidor A/D son triestadas, D0-D7, por lo que se pueden conectar directamente al bus de datos de un sistema microprocesador. El convertidor precisa de una tensin de referencia externa de 5V y de una seal de reloj comprendida entre 10kHz y 1280kHz. El tiempo de conversin del convertidor es de 64 perodos de reloj desde el momento en que se inicia la conversin, por lo que para una frecuencia de 640kHz el tiempo de conversin es de unos 100)s, aproximadamente, y de 50 )s para una frecuencia de 1280kHz. La figura 11.8 muestra el diagrama de bloques del convertidor, que est compuesto por un multiplexor analgico de 8 canales, un comparador, un registro de aproximaciones sucesivas (SAR), una escalera de resistencias R-2R y una serie de interruptores que actan sobre la escalera de resistencias.

Los autores, 2001; Edicions UPC, 2001.

306
START CLOCK

Microcontroladores MCS-51 y MCS-251

A/D 8 bits Control y sincronizacin EOC Interrupcin

8 entradas analgicas

Multiplexor analgico de 8 canales COMPARADOR

Registro de aproximaciones sucesivas (SAR) Buffer-latch triestado de salida Ramificacin de interruptores 8 bits de salida

3 bits de direccin ALE

Descodificador y latch de direcciones

Escalera de resistencias (256R)

Vcc

GND

+Vref

-Vref

OE

Fig. 11.8 Diagrama de bloques del ADC0809 de National Instruments

La figura 11.9 muestra el diagrama de tiempos del convertidor. El proceso de conversin del convertidor empieza poniendo la lnea de control ALE a 1 lgico, lo que hace que se carguen las direcciones S2-S0 en el latch interno de direcciones, seleccionando el canal analgico de entrada. Aplicando un pulso en la seal de START se inicia la conversin de la seal, se borran los registros internos del convertidor en el flanco de subida, y se inicia la conversin en el flanco de bajada. La seal EOC, End of Conversion, pasa a 0 lgico en los primeros 8 perodos de reloj desde el flanco de subida de la seal START, lo que indica el final de la conversin en el flanco de subida de EOC. Una vez producido este flanco, se puede leer el dato obtenido por la conversin, para lo cual debe aplicarse un pulso positivo a la seal OE, Output Enable, de forma que el dato se site en las 8 lneas del bus de datos. Las salidas del convertidor permanecen en estado triestado hasta que se pone el dato convertido en el bus de datos. Segn la figura 11.7, las salidas D0-D7 del convertidor se conectan directamente al bus de direcciones del microcontrolador, puerto P0. El inicio de la conversin se realiza aplicando un pulso en las lneas START y ALE del convertidor. Estas entradas (figura 11.7) estn conectadas a las lneas A15, A14 y A13 del bus de direcciones, mediante dos puertas AND, de forma que estarn a 1 lgico slo cuando A15, A14 y A13 estn a 1 lgico. Al mismo tiempo, las lneas A12, A11 y A10 del bus de direcciones, estn conectadas a las entradas de seleccin del canal analgico, I2, I1 y I0, respectivamente. De esta forma, el inicio de la conversin en el convertidor y la seleccin del canal analgico pueden efectuarse situando una direccin concreta en el bus de direcciones, que se corresponda con los rangos de direcciones de la tabla 11.2.

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas


64 perodos de reloj CLOCK

307

irecciones S0-S2 ALE


Ts
50% 50% 50% 50%

Th

START Entrada analgica IN0-IN7 EOC


Tc

ESTABLE Tl Teoc

OE
Th2

Salidas D0-D7

TRIESTADO

DATO VLIDO

Fig. 11.9 Diagrama de tiempos del ADC0809.

Segn la tabla 11.2, escribiendo cualquier dato en el bus de datos por medio de la instruccin MOVX y escogiendo el canal analgico de entrada con una de las direcciones de la tabla, puede iniciarse el proceso de conversin del convertidor. La seal EOC est conectada mediante una puerta inversora a la entrada de interrupcin /INT0 del microcontrolador; en consecuencia, el flanco de subida en EOC, que indica el final de conversin del convertidor, aparece como un flanco de bajada a la entrada de /INT0, que causar una interrupcin si /INT0 est habilitada por flanco descendente.
Tabla 11.2 Rango de direcciones del mapa de memoria para iniciar la conversin, junto con la seleccin del canal analgico de entrada y para la lectura del dato Rango de direcciones Funcin C000H-DFFFH Lectura del dato convertido E000H-E3FFH Inicio conversin, seleccin canal 0 E400H-E7FFH Inicio conversin, seleccin canal 1 E800H-EBFFH Inicio conversin, seleccin canal 2 EC00H-EFFFH Inicio conversin, seleccin canal 3 F000H-F3FFH Inicio conversin, seleccin canal 4 F400H-F7FFH Inicio conversin, seleccin canal 5 F800H-FBFFH Inicio conversin, seleccin canal 6 FC00H-FFFFH Inicio conversin, seleccin canal 7

La seal OE del convertidor est conectada tambin a dos puertas AND y a una puerta NOT, de manera que OE estar a 1 lgico si se sita una direccin con la combinacin 1, 1 y 0 lgicos, en las lneas A15, A14 y A13, respectivamente. En definitiva, el dato convertido se puede leer, en la rutina de RSI de /INT0, ejecutando una lectura en cualquiera de las direcciones comprendidas en el rango C000H-DFFFH, mediante la instruccin MOVX.

Los autores, 2001; Edicions UPC, 2001.

308

Microcontroladores MCS-51 y MCS-251

Ejemplo 11.2 Monitorizacin del estado de las bateras de un SAI Los equipos de alimentacin ininterrumpida, SAI, se utilizan para mantener la tensin de la red elctrica en los equipos informticos, en el caso de que se produzcan cortes repentinos de la red. Estos equipos tienen una serie de bateras que, en el caso de producirse un corte, aportan la energa necesaria para que, durante un intervalo de tiempo, sea posible cerrar los sistemas y guardar la informacin ms importante. El estado de las bateras se debe comprobar regularmente para poder detectar anomalas en el proceso de carga y descarga, e indicar el momento en el cual una batera es defectuosa. En este ejemplo se quiere utilizar un microcontrolador de la familia MCS-51 para monitorizar el estado de las bateras, es decir, para leer su valor y proporcionrselo al sistema de control del SAI, que suele llevarse a cabo por medio de un procesador digital de seal DSP. Segn la figura 11.10, el equipo SAI tiene un total de ocho bateras de 12V, que forman dos ramas de cuatro bateras cada una conectadas en paralelo, y que entrega la energa necesaria para mantener la tensin de la red elctrica en los equipos informticos. El microcontrolador debe leer la tensin de cada una de las bateras cuando la DSP se lo indique mediante la transmisin del carcter ASCII 05H va RS-232C. Una vez finalizada la lectura de todos los canales del A/D, el microcontrolador debe transmitir a la DSP la lectura 3 efectuada de cada batera va RS-232C; para ello debe transmitir el carcter 11H (XON ), que se tomar por la DSP como carcter de inicio de la transmisin, los datos correspondientes a la lectura efectuada en cada batera y el carcter 13H (XOFF) de final de transmisin. En el circuito de la figura 11.10 tan slo se utiliza una memoria EPROM de 2kbytes de capacidad para albergar el programa. No es necesario utilizar ningn circuito integrado de memoria RAM externa, pues se usa la memoria interna del microcontrolador. La memoria EPROM se selecciona mediante las lneas A12, A13, A14 y A15 del bus de direcciones, que estn conectadas a una serie de puertas AND (figura 11.10), que hacen que la memoria est seleccionada en el rango de direcciones comprendido entre 0000H y 0FFFH, o sea, en las primeras 4kdirecciones del mapa de memoria (figura 11.11); aparece, por tanto, una zona imagen en el rango [0800H-0FFFH] de 2kdirecciones. El convertidor A/D utiliza los mismos rangos de direcciones para el inicio de la conversin y para la seleccin del canal que los mostrados en la tabla 11.2. La rutina de monitorizacin utiliza el registro R7 como indicador del final de conversin del convertidor A/D. El tiempo de conversin del convertidor es de unos 100)s. La salida E0C del convertidor A/D (figura 11.10) est conectada a la entrada de interrupcin /INT0 del microcontrolador a travs de una puerta NOT. El final de la conversin se indica con un flanco

Para controlar el flujo en la comunicacin entre dos sistemas que procesan la informacin a distinta velocidad, es frecuente emplear el protocolo XON/XOFF, en el cual se utilizan los caracteres ASCII 11H (XON) y 13H (XOFF), para iniciar y para detener la transmisin, respectivamente. En este caso, XON y XOFF se usan para indicar el inicio y el final de la transmisin por parte del microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

309

de subida en EOC, que aparece en /INT0 como un flanco de bajada y provoca una interrupcin. La rutina de RSI de /INT0 se limita a poner R7 al valor 01H, indicando de esta manera que la conversin ha terminado.

MCS-51
P0 RXD TXD A13 /INT0 ALE P2 /EA /PSEN

EPROM 27C16 (2 kbytes)


D74D0

Latch
D74D0 74LS08 Q74Q0 A74A0 /CE d A12

74LS373
CLK A104A8 /OE

+5V
+ V1 _ + V2 _ + V3 _ + V4 _ + V5 _ + V6 _ + V7 _ + V8 _

+12V

IN0 IN1 Sensado y acondicionamiento de seal IN2 IN3 IN4 IN5 IN6 IN7 A10 A11 S0 S1 S2 EOC GND A la DSP

Vcc D0-D7 +Vref


+

1.8k

ADC0809

-Vref a 74LS08 ALE START b

LM336-5V 74LS04 e c A15 A14 A13 1k c a 1k b

OE

SAI d MC1488 74LS04

A12

CLOCK

RS-232C

74LS04 MC1489 680pF

Fig. 11.10 Convertidor ADC0809 y microcontrolador para la monitorizacin de las bateras de un equipo SAI

De la misma forma que R7, el registro R6 se emplea por la rutina de RSI del puerto serie para indicar que se ha recibido, va RS-232C, el carcter ASCII 05H, que corresponde a la orden de lectura del A/D. La rutina de RSI, al recibir este carcter, pone el registro R6 al valor 01H, para que en la rutina principal se proceda a la lectura de todos los canales del convertidor A/D. La rutina principal tiene un bucle de espera de recepcin, de la orden de lectura del convertidor A/D, que est pendiente del valor del registro R6. Cuando la rutina detecta que R6 se ha puesto a 01H, sta pasa a leer cada uno de los canales del convertidor A/D. Para ello, inicia la

Los autores, 2001; Edicions UPC, 2001.

310

Microcontroladores MCS-51 y MCS-251

conversin mediante la escritura con MOVX de cualquier dato en una de las direcciones de inicio y de seleccin de canal que aparece en la tabla 11.2. Luego, la rutina pasa a la espera del final de la conversin mediante un bucle que examina continuamente el estado del registro R7. Finalmente, la rutina pasa a leer el dato obtenido por el convertidor efectuando una lectura en la direccin C000H con la instruccin MOVX. Terminada la lectura de todos los canales, la rutina principal pasa a transmitir cada uno de los datos obtenidos a la DSP va RS-232C.

b)

Memoria de datos
0000H

Sin memoria

a) Memoria de programas
0000H

BFFFH
C000H Lectura dato (1k) DFFFH E000H Ini. y Canal 0 (1k) E3FFH E400H Ini. y Canal 1 (1k) E7FFH E800H Ini. y Canal 2 (1k) EBFFH EC00H Ini. y Canal 3 (1k) EFFFH F000H Ini. y Canal 4 (1k) F3FFH F400H Ini. y Canal 5 (1k) F7FFH F800H Ini. y Canal 6 (1k) FBFFH FC00H Ini. y Canal 7 (1k) FFFFH

EPROM (2 kbytes)
07FFH 0800H

Imagen (2 kbytes)
0FFFH 1000H

Sin memoria

FFFFH

Fig. 11.11 Mapa de memoria del circuito de la figura 11.10. a) Mapa de la memoria de programas. b) Mapa de la memoria de datos

La velocidad de transmisin de los datos es de 9.600 baudios; para ello se realiza la comunicacin asncrona del puerto serie en el modo 1, en el que se transmiten 10 bits: 1 bit de start, 8 bits del dato y 1 bit de stop. El Timer 1 del microcontrolador se utiliza como base de tiempos para la transmisin, por lo que debe estar configurado en el modo 2 de 8 bits con autorrecarga, con el bit C/T a 0 lgico, con el valor FDH de recarga en el registro TH1 y con 11.059MHz de frecuencia de reloj. El programa que realiza la monitorizacin de las bateras para la MCS-51 se muestra a continuacin:
;************************************************************************** ; Monitorizacin de las bateras de un SAI para la MCS-51 ;************************************************************************** ; Declaracin de variables ;************************************************************************** Conv_Canal_0 EQU #E000H ;Inicio de conversin y seleccin del canal 0 Conv_Canal_1 EQU #E400H ;Inicio de conversin y seleccin del canal 1 Conv_Canal_2 EQU #E800H ;Inicio de conversin y seleccin del canal 2 Conv_Canal_3 EQU #EC00H ;Inicio de conversin y seleccin del canal 3

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

311

Conv_Canal_4 EQU #F000H ;Inicio de conversin y seleccin del canal 4 Conv_Canal_5 EQU #F400H ;Inicio de conversin y seleccin del canal 5 Conv_Canal_6 EQU #F800H ;Inicio de conversin y seleccin del canal 6 Conv_Canal_7 EQU #FC00H ;Inicio de conversin y seleccin del canal 7 Lectura_AD EQU #C000H ;Lectura del A/D CA0 EQU 20H ;Direccin 20H de la memoria RAM interna CA1 EQU 21H ;Direccin 21H de la memoria RAM interna CA2 EQU 22H ;Direccin 22H de la memoria RAM interna CA3 EQU 23H ;Direccin 23H de la memoria RAM interna CA4 EQU 24H ;Direccin 24H de la memoria RAM interna CA5 EQU 25H ;Direccin 25H de la memoria RAM interna CA6 EQU 26H ;Direccin 26H de la memoria RAM interna CA7 EQU 27H ;Direccin 27H de la memoria RAM interna ;************************************************************************** ; Rutina de Vectorizacin ;************************************************************************** ORG 0H LJMP Inicio ORG 03H LJMP RSI_INT0 ORG 023H ;Vectorizacin del puerto de comunicacin serie LJMP RSI_RS ;************************************************************************** ; Rutina de Inicio ;************************************************************************** Inicio: SETB IT0 ;Interrupcin INT0 por flanco descendente SETB EX0 ;Habilita interrupcin INT0 SETB ES ;Habilita interrupcin del puerto de comunicacin serie SETB SM1 ;Configura la comunicacin serie en el modo 1 SETB REN ;Habilita la recepcin de un dato por el puerto serie MOV TMOD, #20H ;Timer 1 en Modo 2, GATE=0 y C/T=0 MOV TL1, #0FDH ;Valor de TL1, para velocidad de 9600 baudios MOV TH1, #0FDH ;Valor de recarga de Timer 1, para velocidad de 9600 baudios SETB EA ;Habilita bit de interrupcin general SETB TR1 ;Pone marcha el Timer 1 ;*************************************************************************** ; Rutina de Principal ; R7 se emplea como indicador de final de conversin. R7=1 Conversin finalizada. ;*************************************************************************** Principal: CJNE R6, #01, Principal ;Bucle de espera a que R6 sea igual a 01H MOV R6, #0 ;Borra R6 ACALL Lectura_AD ;Realiza la lectura del A/D SJMP Principal ;Bucle infinito ;************************************************************************** ; Rutina de servicio de INT0 ;************************************************************************** RSI_INT0: MOV R7, #01H ;Indica mediante R7 el final de la conversin RETI ;************************************************************************** ; Rutina de servicio del puerto serie ;************************************************************************** RSI_RS: JNB TI, Recibe ;Si no interrumpe TI, entonces es RI CLR TI ;Borra bit TI RETI Recibe: MOV A, SBUF ;Lee puerto serie CJNE A, #05H, Noesorden MOV R6, #01H ;Da la orden de lectura del A/D Noesorden: CLR RI ;Borra bit RI RETI

Los autores, 2001; Edicions UPC, 2001.

312

Microcontroladores MCS-51 y MCS-251 ;*************************************************************************** ; Subrutinas ;*************************************************************************** Lectura_AD:MOV R7, #0 ;Borra R7 para la lectura del canal 0 MOV DPTR, #Conv_Canal_0 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 0 Espera_C0: CJNE R7, #01H, Espera_C0 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA0, A ;Guarda en la memoria interna, pos. 20H Canal_1: MOV R7, #0 ;Borra R7 para la lectura del canal 1 MOV DPTR, #Conv_Canal_1 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 1 Espera_C1: CJNE R7, #01H, Espera_C1 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA1, A ;Guarda en la memoria interna, pos. 21H Canal_2: MOV R7, #0 ;Borra R7 para la lectura del canal 2 MOV DPTR, #Conv_Canal_2 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 2 Espera_C2: CJNE R7, #01H, Espera_C2 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA2, A ;Guarda en la memoria interna, pos. 22H Canal_3: MOV R7, #0 ;Borra R7 para la lectura del canal 3 MOV DPTR, #Conv_Canal_3 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 3 Espera_C3: CJNE R7, #01H, Espera_C3 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA3, A ;Guarda en la memoria interna, pos. 23H Canal_4: MOV R7, #0 ;Borra R7 para la lectura del canal 4 MOV DPTR, #Conv_Canal_4 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 4 Espera_C4: CJNE R7, #01H, Espera_C4 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA4, A ;Guarda en la memoria interna, pos. 24H Canal_5: MOV R7, #0 ;Borra R7 para la lectura del canal 5 MOV DPTR, #Conv_Canal_5 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 5 Espera_C5: CJNE R7, #01H, Espera_C5 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA5, A ;Guarda en la memoria interna, pos. 25H Canal_6: MOV R7, #0 ;Borra R7 para la lectura del canal 6 MOV DPTR, #Conv_Canal_6 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 6 Espera_C6: CJNE R7, #01H, Espera_C6 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA6, A ;Guarda en la memoria interna, pos. 26H Canal_7: MOV R7, #0 ;Borra R7 para la lectura del canal 7 MOV DPTR, #Conv_Canal_7 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 7 Espera_C7: CJNE R7, #01H, Espera_C7 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA7, A ;Guarda en la memoria interna, pos. 27H ACALL Trans_datos RET

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas Trans_datos: MOV SBUF, #11H MOV SBUF, CA0 MOV SBUF, CA1 MOV SBUF, CA2 MOV SBUF, CA3 MOV SBUF, CA4 MOV SBUF, CA5 MOV SBUF, CA6 MOV SBUF, CA7 MOV SBUF, #13H RET ;Caracter XON de inicio de transmisin ;Transmite dato canal 0 ;Transmite dato canal 1 ;Transmite dato canal 2 ;Transmite dato canal 3 ;Transmite dato canal 4 ;Transmite dato canal 5 ;Transmite dato canal 6 ;Transmite dato canal 7 ;Caracter XOFF de final de transmisin

313

Ejemplo 11.3 Control de la velocidad de un motor En esta aplicacin se debe controlar, mediante un sistema basado en el microcontrolador 8XC251, la velocidad de un motor de corriente continua de pequea potencia. En la figura 11.12 aparece el esquema general del sistema de control y de la planta a controlar. El microcontrolador 8XC251 est configurado con 16 lneas de bus de datos: RD1, RD0 = 10.

8XC251

DAC

Vo Motor Vi Tacmetro

ADC

Fig. 11.12 Diagrama del sistema de control del motor DC

El objetivo del control es mantener constante la velocidad del motor, independientemente de las condiciones de carga del mismo. Mediante un convertidor digital/analgico, DAC, de 8 bits se fija la tensin de alimentacin del motor. Conectado al eje del motor se encuentra otro motor que realiza funciones de tacmetro, generando una tensin proporcional a la velocidad de giro. A travs de un convertidor analgico/digital, ADC, de 8 bits, el microcontrolador adquiere la tensin que genera el tacmetro, determinando de este modo la velocidad de giro real del motor. El proceso de control que realiza el microcontrolador 8XC251 consiste en comparar la velocidad real del motor con la deseada, y modificar convenientemente la combinacin binaria aplicada al DAC para que ambas velocidades, la real y la deseada, se aproximen lo ms posible. a) Conexin del DAC al microcontrolador 8XC251 El DAC utilizado es el AD557 de Analog Devices (figura 11.13). El AD557 es un DAC de 8 bits que incorpora todos los elementos necesarios para conectarlo directamente a un microcontrolador. El AD557 dispone de un registro donde se escribe el dato de 8 bits que se debe convertir. Para escribir en este registro, basta aplicar el dato a las entradas de datos del convertidor (D0,...,D7), al mismo tiempo que se activan, a 0 lgico, las entradas /CS y /CE.

Los autores, 2001; Edicions UPC, 2001.

314

Microcontroladores MCS-51 y MCS-251

D0,..,D7 DAC CE AD557 CS


Fig. 11.13 Conversor AD557

Vo

Para ahorrar pines de entrada/salida se puede conectar el convertidor DAC al microcontrolador como si de un integrado de memoria se tratase, adjudicndole una direccin o rango de direcciones dentro del mapa de memoria del sistema microcontrolador. En este caso, se direcciona el convertidor en la posicin de memoria externa 0032H. Para realizar la conversin de un dato, basta grabarlo en la direccin de memoria XX:0032H, donde XX simboliza cualquier regin del mapa de memoria disponible para el usuario: 00:, 01:, 02:, 03:, FC:, FD:, FE: o FF:. Teniendo en cuenta estas consideraciones, la conexin entre el microcontrolador y el DAC quedar como aparece en la figura 11.14.
8XC251
P0
A0 A1 A2 A3 A4 A5 A6 A7

D0,...D7 CS DAC CE AC 557

ALE P2 WR
8

LATCH 8 BITS

Fig. 11.14 Esquema elctrico de la conexin microcontrolador - DAC

En el esquema de la figura 11.14 se observa que se ha conectado la salida de escritura, /WR, del microcontrolador 8XC251, a la entrada de habilitacin del convertidor, /CE. Esto se ha hecho as, para que se active dicha entrada cuando el microcontrolador realice una operacin de escritura, y no de lectura. Por otra parte, se ha conectado la entrada de seleccin de integrado, /CS, a la salida de una puerta NAND, cuyas entradas, a su vez, estn conectadas a las lneas del bus de direcciones del microcontrolador. Tal y como se ha realizado la conexin, la salida de esta puerta NAND se activa, a 0 lgico, cuando en el bus de direcciones aparece la direccin 0032H, o sea, cuando el microcontrolador 8XC251 direcciona, para leer o escribir, la posicin de memoria 0032H. En definitiva, con la conexin realizada, para que se activen las entradas /CE y /CS del convertidor ser necesario que el microcontrolador realice una operacin de escritura en la direccin de memoria 0032H. Las siguientes instrucciones tienen como objetivo cargar un dato cualquiera denominado X, de 8 bits, en el DAC, escribiendo dicho dato en la direccin 0032H:
MOV R11,#XH MOV WR0,#0032H MOV @WR0,R11

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

315

b) Conexin del ADC al microcontrolador 8XC251 Para realizar la conversin analgico-digital de la tensin generada por el tacmetro se utiliza el ADC modelo AD673 de Analog Devices (figura 11.15). El AD673 es un convertidor de 8 bits que incorpora todos los elementos necesarios para conectarlo a un microcontrolador. Este dispositivo dispone de las siguientes seales: D0,..,D7: Salidas de datos triestadas. A travs de estas salidas podemos leer la combinacin binaria resultado de realizar la conversin de la tensin de entrada Vi procedente del tacmetro. /OE: Habilitacin de salida. La activacin de esta seal, a 0 lgico, nos permite leer el dato resultado de la conversin analgico-digital. C: Entrada de inicio de conversin. Para iniciar la conversin debemos aplicar un pulso a esta entrada, o sea, primero un 0 lgico, luego un 1 y, seguidamente, otro 0 lgico. /DR: Salida de Data Ready o dato vlido. Esta salida se activa, a 0 lgico, cuando el ADC finaliza la conversin. La activacin de esta salida indica al microcontrolador que ya ha terminado el proceso de conversin y que el dato vlido est disponible para ser ledo por el microcontrolador.
8 D0,..,D7 OE C DR

ADC AD673

Vi

Fig. 11.15 Convertidor AD673

En la figura 11.16 aparece el esquema elctrico simplificado de la conexin del 8XC251 al ADC. Las lneas de datos y la lnea /OE del AD673 estn conectadas convenientemente, a las lneas del microcontrolador 8XC251, para que la lectura del dato se realice cuando se ejecute una instruccin de lectura de la posicin 00:0200H de la memoria externa. Para realizar el control del ADC por interrupciones, se ha conectado la salida /DR del convertidor a la entrada /INT0 del microcontrolador, de forma que cuando finaliza la conversin se realiza una peticin de interrupcin al microcontrolador. En el programa principal de la aplicacin se incluyen instrucciones que configuran la interrupcin /INT0 para que sea activa por flanco descendente con un nivel de prioridad alto.
8XC251 P0 ALE
7

ADC AD673

Latch
OE Vi C DR

P2
P2.1 1

P1.0 INT0

Fig. 11.16 Conexin del microcontrolador 8XC251 con el AD673

Los autores, 2001; Edicions UPC, 2001.

316

Microcontroladores MCS-51 y MCS-251

En la rutina de servicio a la interrupcin /INT0 se incluyen las instrucciones que implementan el algoritmo de control de la velocidad de giro del motor. En el diseo de esta rutina se han considerado los siguientes aspectos: 1. El valor de la velocidad deseada est almacenado en la posicin 20H de la memoria RAM interna del microcontrolador. 2. El dato que proporciona el convertidor ADC es la velocidad real. Ambos valores, velocidad deseada y real, estn expresados en binario con 8 bits de precisin. 3. El valor que se graba en el convertidor DAC, y que fija la velocidad real actual del motor, est almacenado, inicialmente, en la posicin 30H de la memoria RAM interna. La RSI diseada debe leer el dato vlido que le proporciona el convertidor ADC, comparar ese dato a velocidad real con el valor de la velocidad ideal que est almacenado en la posicin 20H de la memoria RAM interna, y modificar el valor grabado en el DAC segn la siguiente estrategia: Si la velocidad real es mayor, como mnimo en dos unidades, que la velocidad ideal, se decrementar en una unidad la combinacin binaria aplicada al DAC. Si la velocidad real es menor, como mnimo en dos unidades, que la velocidad ideal, se incrementar en una unidad la combinacin binaria aplicada al DAC. En caso contrario no se modificar la combinacin binaria escrita en el DAC. La RSI tambin debe generar las seales adecuadas para que el convertidor ADC comience una nueva conversin. A continuacin se detallan las instrucciones del programa principal y de la RSI de la interrupcin /INT0:
;******************************************************************************** ; Control de la velocidad del motor DC ;******************************************************************************** ;Programa principal ORG FF:0000H ; El programa principal comienza en la direccin FF:0000H. JMP 0200H ; Para no interferir con la RSI de la interrupcin /INT0 se reubica a partir ORG FF:0200H ; de la direccin FF:0200H MOV TCON,#01H ; Configura /INT0 para que sea activa por flanco descendente. MOV IE,#81H ; Habilita la interrupcin externa cero. MOV IPH0,#01H ; Estas instrucciones programan la interrupcin INT0 MOV IPL0,#01H ; con nivel de prioridad mximo, nivel 3. ;******************************************************************************** ; RSI de la interrupcin /INT0 ;******************************************************************************** ORG FF:0003H ; La rutina de RSI de /INT0 comienza en la direccin FF:0003H. JMP FF:0100H ; Debido al tamao de la rutina de RSI se realiza salto a la ; direccin FF:0100H, donde se dispone de memoria libre. MOV WR0,#0200H ; Se carga en el registro palabra WR0 la direccin 0200H. MOV R11,@WR0 ; Pone en R11 el contenido de la direccin 0200H, que es dato convertido. CJNE A,20H,SIGUE ; Compara la velocidad real con la deseada (almacenada en dir. 20H) JMP FIN ; Si las velocidades son iguales salta a FIN y va al programa principal. SIGUE: JNC RESTA ; Salto a RESTA si la velocidad real es mayor que la deseada. MOV 22H,A ; Si la velocidad real es menor que la deseada, realizo la MOV A,20H ; diferencia entre la velocidad deseada y la velocidad real. CLR C ; SUB A,22H ; CJNE A,#02H,SIGUE2 ; Se compara la diferencia de velocidades con 2. JMP FIN ; Si la diferencia es igual a dos salta a FIN y va al programa principal.

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas SIGUE2: JC FIN ; Si la diferencia es menor que dos salta a FIN y retorna al programa principal, ; en caso contrario se debe aumentar la combinacin binaria aplicada al DAC ; (direc. 32H) y se salta a FIN para volver al programa principal. INC 30H ; Se incrementa la posicin de memoria 30H JMP CARGA ; Se salta a CARGA donde se cargar el incremento en la direccin 32H

317

RESTA: SUB A,20H ; Se hace la resta entre la velocidad real y la deseada. SIGUE2: CJNE A,#02H,SIGUE3 ; Se compara la diferencia con dos. JMP FIN ; Si la diferencia es igual a 2 el programa acaba SIGUE3 JC FIN ; Si la diferencia es menor que dos el programa acaba. DEC 30H ; Se decrementa el contenido de la posicin 30H. CARGA: MOV A,30H ; Se carga el resultado del decremento en el Acumulador. MOV DR0,#0032H ; Se carga el resultado en la posicin de memoria MOVH DR0,#0001H ; 01:0032H. MOV @DR0,R11 ; FIN: RETI ; Se retorna al programa principal.

En la figura 11.17 se presenta el diagrama de flujo de la rutina de servicio a la interrupcin externa cero, /INT0.
INICIO DE LA ISR DE INT0

SE LEE LA VELOCIDAD REAL

S REAL>DESEADA? DIFERENCIA = REAL-DESEADA NO DIFERENCIA = DESEADA-REAL NO DIFERENCIA>2 ? NO DIFERENCIA>2 ?

SI S SE DECREMENTA COMBINACIN DAC SE CARGA EL NUEVO VALOR EN EL DAC

S SE INCREMENTA COMBINACIN DAC SE CARGA EL NUEVO VALOR EN EL DAC

RETI

RETI

Fig. 11.17 Organigrama de la RSI de la interrupcin /INT0

11.5 Conversin A/D utilizando los temporizadores del microcontrolador


Los temporizadores de la MCS-51 se pueden utilizar para medir el ancho de un pulso digital de forma precisa. El valor de una seal analgica, en un momento determinado, se puede hacer proporcional al ancho de un pulso digital, comparando la seal analgica con una seal en forma triangular o en forma de diente de sierra (figura 11.18). En consecuencia, es posible tener una lectura digital del valor de la seal usando los temporizadores del microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

318
Vmx

Microcontroladores MCS-51 y MCS-251

Vin Diente de sierra


k k+1 k+2 k+3 k+4 k+5

Vo + Vin, seal analgica _ Vo w T

Fig. 11.18 Obtencin de una seal discreta Vo cuyo ancho de pulso w es proporcional al valor en un momento dado de la seal analgica Vin

Utilizando la seal en diente de sierra, la relacin entre el ancho de pulso w a medir y el valor de la seal analgica se puede deducir, fcilmente, de la figura 11.18, y viene dado por la expresin: w Vin (k ) ] Vmx 1 T (11.1)

donde Vin(k) es el valor de la seal analgica en el instante k, Vmx es el mximo valor de tensin que puede tomar la seal en diente de sierra, T es el perodo de la seal de diente de sierra y w es el ancho del pulso obtenido de la seal analgica. El ancho del pulso de la seal Vo se puede medir de forma precisa con el Timer 0 o con el Timer 1, debido a que la puesta en marcha y la parada de estos temporizadores puede efectuarse por medio de las entradas de interrupcin /INT0 y /INT1, respectivamente. Por ejemplo, para el Timer 0 poniendo el bit GATE del registro TMOD a 1 lgico y el bit TR0 del registro TCON a 1 lgico, el temporizador se pone en marcha cuando /INT0 est a 1 lgico y se detiene cuando est a 0 lgico (figura 7.1). De la misma forma, se puede gobernar al Timer 1 mediante la entrada /INT1, poniendo los bits GATE y TR1 a 1 lgicos.

MCS-51
/INT0

W Fig. 11.19 Lectura de ancho de un pulso a travs de /INT0 y del Timer 0 para la MCS-51

Las entradas /INT0 y /INT1 se pueden, adems, utilizar para generar una interrupcin que indique el final de la conversin, activando, para ello, las interrupciones por flanco descendente. Por ejemplo, para el Timer 0 (figura 11.19), el temporizador se pone en marcha cuando /INT0 est a 1 lgico y se detiene cuando /INT0 pasa a 0 lgico; pero, adems, el flanco descendente de /INT0 puede generar una interrupcin que se puede aprovechar como indicativo de final de conversin. El Timer puede llegar a desbordamiento cuando el ancho de los pulsos a medir sea de una valor considerable. En este caso, es conveniente que el Timer genere una interrupcin cuando llegue a desbordamiento, que permita contabilizar el nmero de desbordamientos producidos en la rutina de

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

319

RSI del Timer. La figura 11.20 muestra un pulso cuyo ancho causa varios desbordamientos en el Timer, hecho que determina la manera de calcular el valor medido.
Puesta en marcha Desbordamientos interrupcin del Timer Parada Interrupcin /INT0

64 k

64 k

64 k

ltimo lectura del Timer

Fig. 11.20 Pulso con un ancho que provoca varios desbordamientos del Timer

En este caso, considerando que el Timer tiene el bit C/T a 0 lgico, que est configurado en el modo 1 como temporizador/contador de 16 bits y que la frecuencia de reloj del microcontrolador es de 12MHz, el ancho de un pulso se puede determinar mediante la siguiente ecuacin: W ] M [ 65536 ( V )s (11.2)

donde M es el nmero de desbordamientos producidos en el Timer, V es el valor de la ltima lectura del Timer y 65.536 o FFFFH es el valor de desbordamiento del Timer. La precisin en la medida del ancho del pulso depender de la base de tiempos empleada por los Timers. Con C/T a 0 lgico (figura 7.1), y con una frecuencia de reloj de 12MHz, la precisin del temporizador es de un microsegundo. Con C/T a 1 lgico la precisin del Timer depender de la seal de reloj externa (terminales T0 para el Timer 0 y T1 para el Timer 1). Las rutinas de RSI del Timer 0 y de /INT0 se muestran a continuacin, para el caso de la figura 11.19, donde se desea medir el ancho w de un pulso que puede causar varios desbordamientos. En la rutina de RSI del Timer 0 se utiliza el registro R7 como contador del nmero de desbordamientos cometidos por este.
;************************************************************************ ; Rutina de Inicio ;************************************************************************ SETB IT0 ;Activa /INT0 por flanco descendente SETB EX0 ;Habilita interrupcin de /INT0 SETB ET0 ;Habilita interrupcin del Timer 0 SETB EA ;Habilita bit de interrupcin general MOV TMOD, #09H ;M1=0 y M0=1 (Modo 1), GATE=1 y C/T=0, para Timer 0. SETB TR0 ;Pone marcha el Timer 0 ;************************************************************************ ; Rutina de servicio del Timer 0 ;************************************************************************ RSI_Timer0:INC R7 ;Incrementa contador del n de desbordamientos RETI ;************************************************************************ ; Rutina de servicio de /INT0 ;************************************************************************ RSI_INT0: MOV R6, TH0 ;Lee byte alto del Timer 0 MOV R5, TL0 ;Lee byte bajo del Timer 0 MOV B, R7 ;Guarda R7 en registro B

Los autores, 2001; Edicions UPC, 2001.

320
MOV TH0, #0 MOV TL0, #0 MOV R7, #0 RETI

Microcontroladores MCS-51 y MCS-251 ;Pone a cero el Timer ;Borra R7

La rutina de inicio configura el Timer 0 en el modo 1 como temporizador/contador de 16 bits, contando pulsos internos de reloj (C/T = 0), y con el bit GATE a 1 lgico. La rutina de RSI del Timer0 tan slo contabiliza el nmero de desbordamientos de ste. La rutina de RSI de /INT0 guarda la ltima lectura del Timer en los registros R5 y R6 (figura 11.20), y a continuacin borra los registros del Timer. El valor del ancho del pulso W se debe obtener de la ecuacin (11.2); para ello, se debe multiplicar el registro B de 1 byte por el dato FFFFH de 2 bytes, y luego sumar al resultado el valor ledo de los registros TH0 y TL0 del Timer. Este clculo se puede hacer en la rutina de RSI de /INT0 o en cualquier otra parte del programa. Ejemplo 11.4 Conversin A/D por modulacin de anchura de pulsos utilizando los Timers 0 y 1 En la figura 11.21 se muestra un circuito de conversin analgico/digital con un microcontrolador de la familia MCS-51, que utiliza el Timer 0 para generar la forma peridica de la seal en diente de sierra, con un perodo Tm, y el Timer 1 para medir el ancho del pulso recibido a travs de la entrada de interrupcin /INT1.
S C Control interruptor S P1.0

Diente de sierra Vi -Vr


R
_ +

Vcc
Rt

MCS-51

Vo Vin Seal analgica

+ _

/INT1

Fig. 11.21 Circuito de conversin A/D mediante modulacin de anchura de pulsos con una seal en forma de diente de sierra, empleando un microcontrolador de la MCS-51

La seal en forma de diente de sierra se genera por medio del amplificador operacional, que hace de circuito integrador con reset, y por medio de la patilla P1.0 del microcontrolador que controla el cierre y la apertura del interruptor S. El integrador tiene una tensin negativa de entrada constante, -Vr, por lo que produce a la salida una tensin Vo positiva en forma de rampa (figura 11.22), cuya pendiente es proporcional a los valores de Vr, R, C y del tiempo de integracin Tm.
Vo ]
Vi RC

Vi T RC

m]

Vo ]

Vr [ T RC

(11.3)

T Fig. 11.22

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

321

La seal analgica Vin de entrada proviene de un sensor de temperatura ambiente cuyo margen de tensin est comprendido entre 0.1V, para -15C, y 5V, para 55C. El valor mximo de la tensin de salida del integrador, para adecuarse al margen de la seal analgica, debe ser algo mayor que 5V; en este caso se toma el valor de 5.1V. La seal analgica tiene una variacin temporal lenta, por lo que se toma una frecuencia de muestreo de 5 muestras por segundo, que es ms que suficiente para tener una representacin temporal adecuada de la seal. Para obtener esta frecuencia, el perodo de muestreo Tm ha de ser de 0.2s, por lo que, teniendo en cuenta que el Timer 0 llega a desbordamiento cada 64k pulsos de entrada, es decir, cada 65.536)s, el nmero de desbordamientos que debe tener el Timer es de:
N desbordamientos ] Tiempo 0,2s ] ] 3.051 65536)s 65536)s

Luego, es suficiente con hacer que el Timer 0 desborde tres veces para generar, de forma aproximada, la frecuencia de muestreo requerida. A partir de la ecuacin (11.3) se determina que con una tensin Vr negativa de 5V, una resistencia de 200k y un condensador de 980nF, la tensin mxima alcanzada por la rampa en 0.2s es de 5.1V, aproximadamente. El programa que realiza la conversin A/D por modulacin de anchura de pulsos para la MCS51 se muestra a continuacin:
;************************************************************************** ; Conversin A/D por modulacin de anchura de pulsos para la MCS-51 ;************************************************************************** ; Rutina de Vectorizacin ;************************************************************************** ORG 0H LJMP Inicio ORG 0BH LJMP RSI_Timer0 ORG 013H LJMP RSI_INT1 ORG 01BH LJMP RSI_Timer1 ;************************************************************************** ; Rutina de Inicio ;************************************************************************** Inicio:SETB IT1 ; Activa la interrupcin /INT1 por flanco descendente SETB EX1 ; Habilita interrupcin /INT1 SETB ET0 ; Habilita la interrupcin del Timer 0 SETB ET1 ; Habilita la interrupcin del Timer 1 SETB EA ; Habilita bit de interrupcin general MOV TMOD, #91H ; Timer 1 (Modo 1, GATE=1, C/T=0).Timer 0 (Modo 1, GATE=0, C/T=0) SETB TR0 ; Pone en marcha el Timer 0 SETB TR1 ; Pone en marcha el Timer 1 ;*************************************************************************** ; Rutina de Principal ;*************************************************************************** Principal: CJNE R3, #01, Principal ;Bucle de espera a que R6 sea igual a 01H MOV R3, #0 ;Borra R6 ACALL Calcula_w ;Realiza el clculo del ancho W del pulso SJMP Principal ;Bucle infinito

Los autores, 2001; Edicions UPC, 2001.

322

Microcontroladores MCS-51 y MCS-251 ;************************************************************************** ; Rutina de servicio de INT1 ;************************************************************************** RSI_INT1: MOV R6, TH1 ;Pone TH1 en R6 MOV R5, TL1 ;Pone TL1 en R5 MOV B, R7 ;Pone R7 en B MOV TH1, #0 ;Pone a cero el Timer 1 MOV TL1, #0 MOV R7, #0 ;Borra R7 MOV R3,#1 ;Indica con R3 el final de la lectura RETI ;************************************************************************** ; Rutina de servicio de Timer 0 (Cierra el interruptor S cada 3 desbordamientos del Timer 0) ;************************************************************************** RSI_Timer0: CJNE R4, #02H, Cont_S ;Si distinto a 02H va a Cont_S MOV R4, #0 ;Pone a cerro contador de desbordamientos SETB P1.0 ;Cierra el interruptor S (reset rampa) CLR P1.0 ;Abre interruptor S RETI Cont_S: INC R4 ;Incrementa contador (contador de 0 a 2) RETI ;************************************************************************** ; Rutina de servicio de Timer 1 ;************************************************************************** RSI_Timer1: INC R7 RETI ;*************************************************************************** ; Subrutina de clculo del ancho del pulso ; entrada: B=N de rebasamientos del Timer 1, R6=TH1 y R5=TL1 ;Salida: W= FFFFH x B + (TH1,TL1), R0=byte alto, R1=byte intermedio, R0=byte bajo ;*************************************************************************** Calcula_w: MOV A, B ;Pone B (rebasamientos Timer 1) en A MOV B, #FFH ;Pone FFH en B MUL AB ;Multiplica MOV R2, A ;Guarda A en R0 CLR C ;Borra bit de acarreo ADD A, B ;Suma A y B MOV R1, A ;Guarda resultado en R1 CLR A ;Borra A ADDC A, B ;Suma el acarreo anterior a B MOV R0, A ;Resultado R0=byte alto, R1=byte intermedio y ;R2=byte bajo CLR C ;Borra acarreo MOV A, R5 ;R6=TL1, pone TL1 en A ADD A, R2 ;Suma TL1 y R2 MOV R2, A ;Guarda resultado en R2 MOV A, R6 ;R6=TH1, pone TH1 en A ADDC A, R1 ;Suma TH1 y R1 con acarreo MOV R1, A ;Guarda resultado en R1 CLR A ;Borra A ADDC A, R0 ;Suma el acarreo a R0 MOV R0, A ;Guarda resultado en R0 RET

La rutina de RSI de /INT1 utiliza el registro R3 como indicativo de final de lectura del ancho del pulso w. El registro R3 se pone al valor 01H cuando se ha finalizado la lectura. La rutina principal est formada por un bucle de espera del final de la lectura. Este bucle, si detecta que R3 es igual a 01H, borra el registro y ejecuta la subrutina Calcula_w que efecta el clculo del ancho del pulso. La subrutina implementa la ecuacin (11.2) y tiene por entrada el nmero de

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

323

rebasamientos del Timer 1 en el registro B, el ltimo valor de TH1 en el registro R6 y el ltimo valor de TL1 en el registro R5. Las operaciones que efecta la subrutina Calcula_w se muestran en la figura 11.23. La subrutina Calcula_w, de acuerdo con la ecuacin (11.2), debe multiplicar el contenido del registro B por 65.536, o FFFFH. Esta multiplicacin se lleva a cabo en dos partes: una primera multiplicacin de B por FFH y una suma posterior de los resultados. La instruccin MUL AB slo se ejecuta una vez, puesto que el byte alto y el byte bajo del dato FFFFH son los mismos. El resultado de la suma, M0, M1 y M2 (figura 11.23), se almacena en los registros R0, R1 y R2, respectivamente. FFFFH xB C1 C2 C3 C4 M0 M1 M2 + TH1 TL1 S0 S1 S2
Fig. 11.23 Operaciones que realiza la subrutina Calcula_w

Al resultado de la multiplicacin se le suma el valor de los registros del Timer 1, que estn almacenados en los registros R6 y R5. El resultado final de la suma, S0, S1 y S2, se sita en los registros R0, R1 y R2, respectivamente. Para efectuar el reset del circuito integrador es suficiente con poner a 1 lgico la patilla P1.0 con la instruccin SETB en la rutina de RSI del Timer 0, cerrando el interruptor S y forzando la salida Vo a cero voltios. La siguiente instruccin pone a 0 lgico la patilla P1.0, abriendo el interruptor S y dejando actuar al integrador como tal. En el programa realizado no se contempla ningn uso posterior del valor de temperatura ledo por el microcontrolador. Este valor se puede visualizar en una serie de dgitos de siete segmentos y se puede utilizar para realizar una regulacin de la temperatura del sistema medido. Ejemplo 11.5 Sistema de adquisicin de temperatura con el sensor MAX6576 En la figura 11.24 se presenta el esquema de un sistema de adquisicin de temperatura donde se utiliza un sensor de temperatura MAX6576, de la compaa MAXIM, que suministra una seal binaria cuyo perodo es proporcional a la temperatura absoluta: Perodo = C T(K) (11.1)

donde C es una constante de proporcionalidad que puede tener cuatro posibles valores entre 10s/K y 640s/K, seleccionables mediante las entradas TS0 y TS1.

Los autores, 2001; Edicions UPC, 2001.

324

Microcontroladores MCS-51 y MCS-251

+2.7 a +5.5V
VDD

8XC251

MAX6576
TS0 TS1 OUT P0.0

Fig. 11.24 Sistema de adquisicin de temperatura con el sensor MAX6576

En esta aplicacin, la funcin del microcrontrolador es la de calcular la temperatura de acuerdo con el perodo medido de la onda cuadrada, mediante uno de los temporizadores del C. Con las entradas TS0 y TS1 conectadas a masa, la constante de proporcionalidad perodo/ temperatura, C, adquiere el valor 10s/K, por lo que el perodo viene dado por: Perodo = 10s/K T(K) (11.2)

El programa que controla esta aplicacin debe configurar el Timer 0 para que trabaje como temporizador en modo 1, e inicializar su valor a cero. Seguidamente se pone en marcha durante el tiempo equivalente a un perodo de la onda cuadrada. A partir del valor que tiene el Timer 0, una vez detenido su funcionamiento, se calcula la temperatura. Si la frecuencia de la seal de reloj del microcontrolador es de 12MHz, el Timer 0 se incrementa una vez cada microsegundo, por lo que la relacin entre la temperatura y el nmero de incrementos sufrido por el Timer 0 vendr dado por: Temperatura (C) = (N 2731)/10 donde N es el nmero de incrementos sufrido por el Timer 0. A continuacin se detalla el programa que controla el funcionamiento del sistema de adquisicin de temperatura del ejemplo 11.5.
;************************************************************* ; Control de la sistema de adquisin del ejemplo 11.5 ;************************************************************* ;Programa principal ORG FF:0000H ; El programa principal comienza en la direccin FF:0000H. MOV TMOD,#01H ; Se configura el Timer 0 como temporizador en modo 1. MOV TH0,#00H ; Se inicializa el Timer 0 con el valor 0. MOV TL0,#00H ; SIG1: JB P0.0,SIG1 ; Se espera a que comience un perodo con un 1 lgico SIG2: JNB P0.0,SIG2 ; SETB TR0 ; Se pone en marcha el Timer 0. SIG3: JB P0.0,SIG3 ; Se espera a que pase el perodo. SIG4: JNB P0.0,SIG4 ; CLR TR0 ; Se detiene el Timer 0.

(11.3)

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas MOV R2,#TH0 MOV R3,#TL0 MOV WR0,#2731D MOV WR4,#10D SUB WR2,WR0 DIV WR2,WR4

325
; Se carga en el registro WR2 el contenido del Timer 0. ; ; ; ; Se resta del contenido del Timer 0 el valor 2731 y se divide entre 10 ; para obtener la temperatura en grados centgrados en el registro WR2.

Ejemplo 11.6 Adquisicin de temperatura con el sensor MAX6577 La compaa MAXIM dispone de otro sensor de temperatura, el MAX6577, que genera una onda cuadrada cuya frecuencia es proporcional a la temperatura en K: Frecuencia = F T(K) (11.4)

donde F es el coeficiente de proporcionalidad, que puede adquirir uno de entre cuatro posibles valores entre 0.0675Hz/K y 4Hz/K, seleccionables mediante las entradas TS0 y TS1. En la figura 11.25 se muestra el esquema elctrico de un sistema de adquisicin y visualizacin de temperatura basado en el microcontrolador 8XC251 y en el sensor MAX6577.
+5V 8XC251 P1.0 +2.7 a +5.5V
VDD

P1.1 P1.2 P1.3 P1.4


T0

MAX6577
TS0 TS1 OUT

P1.5 P1.6 P1.7

Fig. 11.25 Esquema elctrico del ejemplo 11.6

En este ejemplo la entrada TS0 del sensor MAX6577 est conectada a la tensin de alimentacin, mientras que la entrada TS1 est conectada a masa, de modo que el factor de escala F vale 1Hz/K. La seal de salida del sensor se introduce en la entrada de cuenta del Timer 0. La temperatura medida se muestra en binario y en grados centgrados a travs de los leds conectados al puerto P1. La estrategia de control de esta aplicacin consiste en medir la frecuencia de la seal de salida del sensor de temperatura, contando los pulsos que genera durante un segundo. Para ello se utiliza el Timer 0 para contar los pulsos, y el Timer 1, controlado mediante interrupcin, para temporizar 1 segundo. Si se considera que la frecuencia de funcionamiento del microcontrolador es de 12MHz, el Timer 1 se incrementa en una unidad cada mocrosegundo. Si se incializa este Timer con el valor 3CB0H, tarda 50ms en llegar a rebasamiento, por lo que debe rebasar 20 veces para temporizar un segundo.

Los autores, 2001; Edicions UPC, 2001.

326

Microcontroladores MCS-51 y MCS-251

Una vez transcurrido 1s, se resta el nmero 273 al valor contenido en el Timer 0 para obtener la temperatura en grados centgrados. Este valor de temperatura se carga posteriormente en el puerto P1 para ser visualizado a travs de los leds. A continuacin se muestra el listado del programa que controla el sistema de adquisin de temperatura.
;************************************************************* ; Control de la sistema de adquisin del ejemplo 11.6 ;************************************************************* ;Programa principal ORG FF:0000H ; El programa principal comienza en la direccin FF:0000H., pero se ; reubica en la direccin FF:1000H para no interferir con la RSI del Timer 1. JMP 1000H ORG FF:1000H ; Comienzo del programa principal. MOV TMOD,#15H ; Se programa el Timer 1 como temporizador y el Timer 0 como ; contador. MOV TH0,#00H ; Se inicializa el Timer 0 a cero. MOV TL0,#00H ; MOV TH1,#3CH ; Se incializa el Timer 1 para temporizar 20ms. MOV TL1,#B0H ; MOV TCON,#50H ; Se pone en marcha los Timers 0 y 1. MOV R0,#20D ; Se inicializa el contador R0 con 20. MOV IE,#88H ; Habilita la interrupcin del Timer 1 y se activa el bit EA. CLR F0 ; ESPERA:JNB F0,ESPERA; ; RSI del Timer 1 ORG FF:001BH MOV TH1,#3CH MOV TL1,#B0H DJNZ TICKS,FIN MOV R10,TH0 MOV R11,TL0 SUB WR10,#273D CPL A MOV P1,R11 MOV TH0,#00H MOV TL0,#00H MOV R0,#20D FIN: RETI

; Direccin de comienzo de la RSI del Timer 1. ; ; ; ; Se carga el valor del Timer 0 en el registro WR0 ; ; Se resta 273 al valor del Timer 0 para obtener la temperatura ; en grados centgrados. ; Se complementa el valor de la temperatura para activar los leds a nivel ; bajo. ; Se inicializa de nuevo el Timer 0 a cero. ; ; Se inicializa el contador R0 con 20.

Los autores, 2001; Edicions UPC, 2001.

12 Modos especiales de funcionamiento

327

12 Modos especiales de funcionamiento


12.1 Introduccin
Los modos especiales de funcionamiento Idle y Power Down se utilizan principalmente en aquellas aplicaciones donde el consumo es un factor crtico, como por ejemplo los equipos porttiles, los equipos de comunicaciones mviles, etc. El modo ONCE, On-Circuit Emulation, se utiliza para realizar el test de las aplicaciones. Estos modos se pueden encontrar en microcontroladores de las familias MCS-51 y MCS-251.

12.2 Registro de control de potencia (PCON)


El registro de funcin especfica PCON tiene dos bits de control del puerto de comunicacin serie, varios bits para seleccionar los modos de funcionamiento Idle y Power Down, un bit de Power Off, que detecta fallos en la tensin de alimentacin, y dos bits de propsito general (tabla 12.1).

12.2.1 Bits de control del puerto serie El bit SMOD1 del registro PCON permite doblar la velocidad de transmisin del puerto de comunicacin serie. Por otra parte, el bit SMOD0 del registro PCON determina la funcin del bit 7 del registro SCON. En el caso que SMOD0 est a 1 lgico, el bit SCON.7 permite leer o escribir el bit Framing Error (FE). Cuando SMOD0 est a cero el bit SCON.7 trabaja como bit SM0 del puerto de comunicacin serie.

12.2.2 Bit de Power Off (POF) El bit de Power Off se pone automticamente a 1 lgico cuando la tensin de alimentacin del microcontrolador, Vcc, aumenta desde Vcc<3V hasta Vcc>3V. Con la activacin de este bit se pone de manifiesto que el contenido de la memoria RAM interna es indeterminado, circunstancia que ocurre, por ejemplo, cuando se aplica la tensin de alimentacin al integrado. Este bit puede ser puesto a uno o a cero por programa. En general, este bit se verifica despus de un reset del microcontrolador, para determinar si el reset se ha realizado por una puesta en marcha de la aplicacin, por un fallo de la alimentacin, o bien ha sido un reset efectuado con el microcontrolador en funcionamiento normal. En los dos primeros casos, este bit se pone a 1 para indicar que el contenido de la memoria voltil interna es indeterminado; en este

Los autores, 2001; Edicions UPC, 2001.

328

Microcontroladores MCS-51 y MCS-251

caso lo habitual es borrar el bit mediante una instruccin. En el tercer caso, este bit permanece a 0 lgico. Si se detecta que el bit POF se pone a 1 por otro motivo, por ejemplo, si se produce una deriva en la tensin de alimentacin que provoca que Vcc baje por debajo de 3V, se deber realizar un reset por software para reinicializar el microcontrolador.
Tabla 12.1 Registro de control de potencia

PCON b7 SMOD1 Bit 7

b6 SMOD0

b5 --

b4 POF

Valor de Reset: 00XX 0000b b3 b2 b1 GF1 GF0 PD

b0 IDL

Mnemnico SMOD1

SMOD0

5 4

-POF

3 2 1

GF1 GF0 PD

IDL

Funcin Bit de doble velocidad de transmisin. Cuando este bit est a uno se dobla la velocidad de transmisin de datos del puerto de comunicacin serie, cuando se utiliza el Timer 1 y el puerto serie est trabajando en el modo 1, 2 o 3. Seleccin de SCON.7. Cuando este bit est a 1 lgico, el bit SCON.7 permite leer o escribir el bit Framing Error. Cuando este bit est a cero, el bit SCON.7 realiza la funcin de SM0. Reservado. Este bit est reservado y no puede ser utilizado por el usuario. Bit de Power Off. Este bit se pone a uno lgico cuando la tensin de alimentacin baja por debajo de los 3 voltios o cuando se aplica la alimentacin al microcontrolador. Con esta activacin se indica que el contenido de la memoria RAM interna es indeterminado. Este bit se puede borrar por software. Bit de propsito general. Bit de propsito general. Bit de modo Power Down. Cuando este bit est a 1 lgico se activa el modo Power Down. Este bit se pone a cero cuando se realiza un reset del microcontrolador, o bien, cuando se realiza una peticin de interrupcin. Bit de modo Idle. Cuando este bit est a 1 lgico se activa el modo Idle. Este bit se pone a cero cuando se realiza un reset del microcontrolador, o bien, cuando se realiza una peticin de interrupcin.

12.3 Modo Idle


El modo Idle es un modo de consumo reducido que permite reducir la potencia consumida por el microcontrolador cerca del 40% de la potencia de consumo nominal. En este modo se impide que la seal de reloj llegue a la CPU, detenindose la ejecucin del programa (figura 12.1), aunque los perifricos del microcontrolador siguen recibiendo la seal de reloj, lo que permite su normal funcionamiento.

Los autores, 2001; Edicions UPC, 2001.

12 Modos especiales de funcionamiento

329

Durante el modo Idle el contenido de los registros de la CPU permanece intacto, as como el contenido de la memoria RAM interna y de los registros del rea SFR. Para entrar en el modo de funcionamiento Idle se debe poner a uno lgico el bit IDL del registro PCON. Existen dos formas de salir del modo Idle: Generando una interrupcin que est habilitada. Cuando se activa una fuente de interrupcin que est habilitada se pone a cero automticamente el bit IDL. Despus de ejecutar la rutina de servicio a la interrupcin, el microcontrolador contina ejecutando el programa principal por la instruccin siguiente a aquella que puso el bit IDL a uno lgico. Realizando un reset del microcontrolador. Cuando se aplica un nivel alto al pin de reset del microcontrolador, se borra automticamente el bit IDL. El microcontrolador contina ejecutando de forma momentnea el programa principal por la instruccin siguiente a la que activ el bit IDL, hasta que el algoritmo de reset interno toma el control e inicializa el contador de programa con la direccin FF:0000H.

12.4 Modo Power Down


El modo Power Down coloca al microcontrolador 8XC251Sx en modo de consumo muy reducido. En este modo de trabajo se para completamente la actividad del reloj, de forma que tanto la CPU como los perifricos detienen su funcionamiento. El contenido de todos los registros, as como de la memoria RAM interna, se mantienen invariables en este modo de trabajo. Para entrar en este modo de trabajo se debe poner a 1 lgico el bit PD del registro PCON. La instruccin que pone a 1 el bit PD es la ltima que se ejecuta antes de que el microcontrolador entre en el modo Power Down.
XTAL2 C1 C2 XTAL1 Clock Gen Interrupciones Puerto serie Timers CPU IDL PD

OSC

Fig. 12.1 Control del reloj mediante los bits Idle y Power Down

Hay dos maneras de salir del modo Power Down: Generando una interrupcin externa. Cuando se activa una fuente de interrupcin externa que est habilitada para interrumpir, el bit PD se pone a cero automticamente, de forma que la CPU y los perifricos vuelven a recibir la seal de reloj. Inmediatamente despus, la CPU ejecuta la rutina de servicio a la interrupcin y, a continuacin, sigue ejecutando el programa principal por la instruccin siguiente a la que activ el bit PD.

Los autores, 2001; Edicions UPC, 2001.

330

Microcontroladores MCS-51 y MCS-251

Realizando un reset del microcontrolador. Cuando se aplica un nivel alto al pin de reset del microcontrolador se pone a cero el bit PD, lo que permite a la CPU y los perifricos continuar con su funcionamiento normal. El microcontrolador contina ejecutando de forma momentnea el programa principal por la instruccin siguiente a la que activ el bit IDL, hasta que el algoritmo de reset interno toma el control e inicializa el contador de programa con la direccin FF:0000H.

12.5 Modo ONCE (On-Circuit Emulation)


El modo ONCE permite realizar el test del sistema sin extraer el microcontrolador 8XC251Sx de la placa de circuito impreso, lo que facilita el proceso de depuracin y comprobacin del programa. En este modo, el microcontrolador permanece aislado elctricamente del sistema. En la MCS-251, para entrar en el modo ONCE se debe seguir la siguiente secuencia: 1. 2. Aplicar un nivel alto en el pin de reset (RST). Mientras se mantiene el pin de reset a 1 lgico se debe aplicar y mantener los pines /PSEN, P0.7, P0.6, P0.5, P0.3, P0.2, P0.1 y P0.0 a nivel bajo y el pin P0.4 a nivel alto. Se deja de aplicar la seal de reset, para a continuacin dejar de aplicar los niveles lgicos indicados en el puerto P0 y el pin /PSEN.

3.

En la MCS-51, para entrar en el modo ONCE se debe: 1. Poner a 0 lgico la patilla ALE mientras el microcontrolador est en la fase de reset y el terminal /PSEN est a 1 lgico. Mantener ALE a 0 lgico mientras el reset (terminal RST) es desactivado.

2.

Para la MCS-51, cuando el microcontrolador est en el modo ONCE, el puerto P0 permanece flotante en estado de alta impedancia, y el resto de los puertos, junto con el terminal ALE y /PSEN, estn conectados dbilmente a 1 lgico. Para salir del modo ONCE basta con efectuar un reset del microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

Apndice Juego de instrucciones de la familia MCS-51 y MCS-251

331

JUEGO DE INSTRUCCIONES DE LA FAMILIA MCS-51


Mnemnico dir8 dir16 dir11 #dato #dato16 Rn @Ri bit rel Descripcin de los smbolos empleados Direccin directa de 8 bits. Posiciones de memoria interna o rea de SFR. Direccin 16 bits de memoria empleada en direccionamientos directos. Direccin de 11 bits. Constante de 8 bits. Constante de 16 bits. Registro de tipo byte, R0 a R7. Direccionamiento indirecto a travs de R0 o R1. Se accede a las posiciones (00H-FFH) de la memoria interna. Bit de la memoria RAM interna o de un registro del rea de SFR accesible bit a bit. Direccin de salto. Puede ser un salto incondicional, condicional o de llamada a subrutina. Bytes Tpo* 1 2 1 2 1 2 2 2 2 3 2 3 1 2 2 3 1 1 1 1 1 1 2 2 1 2 1 1 1 2 1 2 1 2 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 4 4 1

Mnemnico <dest>,<src>

MOV

MOVX

MOVC PUSH POP XCH XCHD

ADD

ADDC SUBB

INC DEC INC MUL DIV DA

Descripcin Instrucciones de transferencia de datos A, Rn A = Rn. Copia el valor de Rn en A A, dir8 A = (dir8) Copia el contenido de la direccin dir8 en A A, @Ri A = (@Ri) Copia el valor direccionado por @Ri en A A, #dato A = #dato Pone el dato en A Rn, A Rn = A Copia el valor de A en Rn Rn, dir8 Rn = (dir8) Copia el contenido de la direccin dir8 en Rn Rn, #dato Rn = #dato Pone el dato en Rn dir8, A (dir8) = A Copia el valor de A en la direccin dir8 dir8, Rn (dir8) = Rn Copia el valor de Rn en la direccin dir8 dir8, dir8 (dir8) = (dir8) Copia de la direccin src a la direccin dest dir8, @Ri (dir8) = (@Ri) Copia la posicin direccionada por @Ri en la direccin dir8 dir8, #dato (dir8) = #dato Copia el dato en la direccin dir8 @Ri, A (@Ri) = A Copia A en la posicin direccionada por @Ri @Ri, dir8 (@Ri) = (dir8) Copia la direccin dir8 en la posicin direccionada por @Ri @Ri, #dato (@Ri) = #dato Copia el dato en la posicin direccionada por @Ri DPTR,#dato16 DPTR = #dato16 Pone el dato de 16 bits en el DPTR A, @Ri A = (@Ri) Copia en A el byte de la RAM externa apuntada por @Ri A, @DPTR A = (@DPTR) Copia en A el byte de la RAM externa apuntada por @DPTR @Ri, A (@Ri) = A Copia A en posicin de RAM externa apuntada por @Ri @DPTR, A (@DPTR) = A Copia A en posicin de RAM externa apuntada por @DPTR A, @A+DPTR A = (A + DPTR) Pone en A el byte de cdigo apuntado por @A+DPTR A, @A+PC A = (A + PC) Pone en A el byte de cdigo apuntado por @A+PC dir8 Mete el byte de la direccin dir8 en la pila dir8 Mete el byte de la direccin dir8 en al pila A, Rn Intercambia A y Rn A, dir8 Intercambia A y el byte de la direccin dir8 A, @Ri Intercambia A y el byte apuntado por @Ri A, @Ri Intercambia los cuatro bits bajos de A y del byte apuntado por @Ri Instrucciones aritmticas A, Rn A=A+ Rn Suma A con Rn, pone el resultado en A A, dir8 A=A+ (dir8) Suma A con el byte de la direccin dir8, pone el resultado en A A, @Ri A=A+ (@Ri) Suma A con el byte apuntado por @Ri, pone el resultado en A A, #dato A=A+ dato Suma A con el dato, pone el resultado en A A, Rn A=A Rn Suma (+) para ADDC y resta (-) para SUBB A, dir8 A=A (dir8) C Suma (+) para ADDC y resta (-) para SUBB A, @Ri A=A (@Ri ) C Suma (+) para ADDC y resta (-) para SUBB A, #dato A=A dato C Suma (+) para ADDC y resta (-) para SUBB A A=A 1 Signo + para INC. Signo - para DEC Rn Rn=Rn 1 Signo + para INC. Signo - para DEC dir8 (dir8) = (dir8) 1 Signo + para INC. Signo - para DEC @Ri (@Ri ) = (@Ri ) 1 Signo + para INC. Signo - para DEC DPTR DPTR = DPTR +1 Incremento del DPTR AB Multiplica A por B. Deja el byte alto del resultado en B y el byte bajo en A AB Divide A por B. Deja el cociente en A y el resto en B A Ajuste decimal del acumulador

Los autores, 2001; Edicions UPC, 2001.

332
Mnemnico <dest>,<src>

Apndice 1 Juego de instrucciones de la familia MCS-51 Descripcin Bytes Tpo* Instrucciones lgicas A, Rn A = A AND o OR o XOR Rn Funcin AND, OR o XOR lgica 1 1 A, dir8 A = A AND o OR o XOR (dir8) Funcin AND, OR o XOR lgica 2 1 A, @Ri A = A AND o OR o XOR (@Ri) Funcin AND, OR o XOR lgica 1 1 A, #dato A = A AND o OR o XOR #dato Funcin AND, OR o XOR lgica 2 1 dir8, A (dir8) = (dir8) AND o OR o XOR A Funcin AND, OR o XOR lgica 2 dir8, #dato (dir8) = (dir8) AND o OR o XOR #dato Funcin AND, OR o XOR lgica 2 3 A A=0 Borra el acumulador 1 1 A Complementa el acumulador 1 1 A Rotacin a la izquierda del acumulador 1 1 A Rotacin a la izquierda con acarreo del acumulador 1 1 A Rotacin a la derecha del acumulador 1 1 A Rotacin a la derecha con acarreo del acumulador 1 1 A Intercambia los 4 bits bajos del acumulador con sus 4 bits altos 1 1 Instrucciones booleanas C Pone a cero el bit de acarreo 1 1 bit Pone a cero el bit direccionado 2 1 C Pone a uno el bit de acarreo 1 1 bit Pone a uno el bit direccionado 2 1 C Complementa el bit de acarreo 1 1 bit Complementa el bit direccionado 2 1 C, bit C = C AND (bit) AND lgica entre C y el bit, resultado lo pone en C 2 2 C, /bit C = C AND (/bit) AND lgica entre C y el bit complementado, resultado en C 2 2 C, bit C = C OR (bit) OR lgica entre C y el bit, resultado lo pone en C 2 2 C, /bit C = C AND (/bit) OR lgica entre C y el bit complementado, resultado en C 2 2 C, bit C = bit Pone el valor del bit en el bit de acarreo C 2 1 bit, C bit = C Pone el valor del bit de acarreo en el bit indicado 2 2 Instrucciones de salto incondicional dir11 Salto absoluto. Salta a una direccin de 11 bits 2 2 dir16 Salto largo. Salta a cualquier direccin del espacio de memoria 3 2 rel Salto corto con direccionamiento relativo 2 2 @A+DPTR Salto indirecto a la direccin A + DPTR 1 2 Salto a la siguiente instruccin 1 1 Instrucciones de salto condicional rel Salta si el bit de acarreo est a 1 lgico 2 2 rel Salta si el bit de acarreo est a 0 lgico 2 2 bit, rel Salta si el bit direccionado est a 1 lgico 3 2 bit, rel Salta si el bit direccionado est a 0 lgico 3 2 bit, rel Salta si el bit direccionado est a 1 lgico y luego lo pone a 0 lgico 3 2 rel Salta si el acumulador vale cero 2 2 rel Salta si el acumulador es distinto de cero 2 2 A, dir8, rel Compara A con el valor de la direccin dir8 y hace un salto relativo si son distintos 3 2 A, #dato, rel Compara A con el dato y hace un salto relativo si son distintos 3 2 Rn, #dato, rel Compara Rn con el dato y hace un salto relativo si son distintos 3 2 @Ri,#dato,rel Compara el byte apuntado por @Ri y hace un salto relativo si son distintos 3 2 Rn, rel Decrementa Rn en una unidad y hace un salto relativo si Rn es distinto de cero 2 2 dir8, rel Decrementa el byte de dir8 y hace un salto relativo si es distinto de cero 3 2 Instrucciones de llamada y retorno a subrutinas dir11 Llamada a subrutina de tipo absoluto, direccin de 11 bits 2 2 dir16 Llamada a subrutina tipo long, direccin de 16 bits 3 2 Retorno de subrutina 1 2 Retorno de la rutina de servicio a la interrupcin 1 2 *El tiempo de ejecucin, Tpo, viene dado en ciclos mquina

ANL ORL XRL

CLR CPL RL RLC RR RRC SWAP CLR SETB CPL ANL ORL MOV AJMP LJMP SJMP JMP NOP JC JNC JB JNB JBC JZ JNZ CJNE

DJNZ ACALL LCALL RET RETI

Los autores, 2001; Edicions UPC, 2001.

Apndice Juego de instrucciones de la familia MCS-51 y MCS-251

333

JUEGO DE INSTRUCCIONES ADICIONALES DE LA FAMILIA MCS-251


Notacin de los registros Rm Rms Rmd WRj WRjd WRjs @WRj+dis16 DRk, DRkd DRks @DRk+dis24 Dato inmediato #0dato16 #1dato16 #short Direcciones rel addr11 addr16 addr24 Descripcin Registro tipo byte de R0 a R15 Registro fuente Registro destino Registro de tipo Word WR0, WR2, ., WR30 Registro destino Registro fuente Direccin de memoria (00:0000H-00:FFFFH) direccionada indirectamente a travs de un registro de tipo Word (WR0-WR30) ms un valor de desplazamiento comprendido entre 0 y 64 Kbytes Registro de tipo DR (Double Word) DR0, DR4, , DR28 DR56, DR60. Registro de destino Registro fuente. Direccin de memoria (00:0000H-00:FFFFH) direccionada indirectamente a travs de un registro Double Word (DR0, DR4, , DR56, DR60) ms un valor de desplazamiento de 0 a 64 Kbytes. Descripcin Un valor de 32 bits que se direcciona de forma inmediata en una instruccin. Los 16 bits de mayor peso del dato deben ser 0 (#0data16) 1 (#1data16). Un valor igual a 1, 2 4, que es direccionado de forma inmediata en una instruccin. Descripcin Direccin relativa de 8 bits expresada en complemento a 2. Direccin de 11 bits. Direccin de 16 bits. Direccin de 24 bits. Permite acceder a cualquier direccin de los 16 Mbyte del espacio de memoria de la familia MCS-251. <dest>,<src> Rmd,Rms WRjd,WRjs DRkd,DRks Rm,#data WRj,#data16 DRk,#0data16 Rm,dir8 WRj,dir8 Rm,dir16 WRj,dir16 Rm,@WRj Rm,@DRk Rmd,Rms WRjd,WRjs DRkd,DRks Rm,#data WRj,#data16 DRk,#0data16 DRk,#1data16 Rm,dir8 WRj,dir8 Rm,dir16 WRj,dir16 Rm,@WRj Rm,@DRk Rm,#short WRj,#short DRj,#short Rmd,Rms WRjd,WRjs Descripcin Instrucciones aritmticas Rmd = Rmd Rms WRjd = WRjd WRjs DRkd = DRkd DRks Rm = Rm data WRj = WRj data16 DRk = DRk 0data16 Rm = Rm (dir8) WRj = WRj (dir8, dir8+1) Rm = Rm (dir16) WRj = WRj (dir16,dir16+1) Rm = Rm (@WRj) Rm = Rm (@DRk) Rmd - Rms WRjd - WRjs DRkd - DRks Rm - #data WRj - #data16 DRk - #0data16 DRk - #1data16 Rm - (dir8) WRj - (dir8, dir8+1) Rm - (dir16) WRj - (dir16,dir16+1) Rm - (@WRj) Rm - (@DRk) Rn = Rn #short WRj = Wrj #short DRj = DRj #short Multiplica Rmd y Rms Multiplica WRjd y WRjs Bytes 2 2 2 3 4 4 3 3 4 4 3 3 2 2 2 3 4 4 4 3 3 4 4 3 3 2 2 2 2 2 Tclock 2 4 8 4 6 10 4 6 4 6 4 6 2 4 8 2 6 10 10 4 6 4 6 2 6 2 2 6 10 22

Mnemnico ADD SUB

CMP

INC DEC MUL

Los autores, 2001; Edicions UPC, 2001.

334
Mnemnico DIV <dest>,<src>

Apndice 1 Juego de instrucciones de la familia MCS-51 Bytes 2 2 2 2 3 4 3 3 4 4 3 3 2 2 2 2 2 2 2 2 2 3 4 4 4 3 4 3 3 4 4 3 3 3 3 3 3 4 4 3 3 3 3 3 4 4 4 4 4 Tclock 20 40 2 4 4 6 4 6 4 6 4 6 2 2 2 2 2 2 2 2 4 4 4 8 8 10 10 4 6 4 6 4 6 6 8 6 8 6 8 6 8 8 10 12 12 10 12 12 14

ANL ORL XRL

SLL SRA SRL

MOV

Descripcin Instrucciones aritmticas (continuacin) Rmd,Rms Divide Rmd por Rms WRjd,WRjs Divide WRjd por WRjs Instrucciones lgicas Rmd = Rmd AND OR XOR Rms Rmd,Rms WRjd = WRjd AND OR XOR WRjs WRjd,WRjs Rm = Rm AND OR XOR #data Rm,#data WRj = WRj AND OR XOR #data16 WRj,#data16 Rm,dir8 Rm = Rm AND OR XOR (dir8) WRj,dir8 WRj = WRj AND OR XOR (dir8, dir8+1) Rm,dir16 Rm = Rm AND OR XOR (dir16) WRj = WRj AND OR XOR (dir16, dir16+1) WRj,dir16 Rm = Rm AND OR XOR (@WRj) Rm,@WRj Rm = Rm AND OR XOR (@DRk) Rm,@DRk Rm Desplazamiento lgico a la izquierda de Rm WRj Desplazamiento lgico a la izquierda de WRj Rm Desplazamiento aritmtico a la derecha de Rm WRj Desplazamiento aritmtico a la derecha de WRj Rm Desplazamiento lgico a la derecha de Rm WRj Desplazamiento lgico a la derecha de WRj Instrucciones de transferencia de datos Rmd,Rms Rmd = Rms WRjd,WRjs WRjd = WRjs DRkd,DRks DRkd = DRks Rm,#data Rm = #data WRj,#data16 WRj = #data16 DRk,#0data16 DRk = #0data16 DRk,#1data16 DRk = #1data16 DRk,dir8 DRk = (dir8, dir8+1, dir8+2, dir8+3) DRk,dir16 DRk = (dir16, dir16+1, dir16+2, dir16+3) Rm,dir8 Rm = dir8 WRj,dir8 Wrj = (dir8, dir8+1) Rm,dir16 Rm = (dir16) WRj,dir16 Wrj = (dir16, dir16+1) Rm,@WRj Rm = (@WRj) Rm,@DRk Rm = (@DRk) WRjd,@WRjs WRjd = (@WRjs, @WRjs+1) WRj,@DRk WRj = (@DRk, @DRk+1) dir8,Rm (dir8) = Rm dir8,WRj (dir8, dir8+1) = WRj dir16,Rm (dir16) = Rm dir16,WRj (dir16, dir16+1) = WRj @WRj,Rm (@WRj) = Rm @DRk,Rm (@DRk) = Rm @WRjd,WRjs (@WRjd , @WRjd +1) = Wrjs @DRk,WRj (@DRk, @Drk+1) = WRj dir8,DRk (dir8, dir8+1, dir8+2, dir8+3) = DRk dir16,DRk (dir16, dir16+1, dir16+2, dir16+3) = DRk Rm,@WRj+dis16 Rm = (@WRj+dis16) WRj,@WRj+dis16 WRj = (@WRj+dis16, @WRj+dis16+1) Rm,@DRk+dis24 Rm = (@DRk+dis24) WRj,@DRk+dis24 WRj = (@Drk+dis24, @DRk+dis24+1)

Los autores, 2001; Edicions UPC, 2001.

Apndice Juego de instrucciones de la familia MCS-51 y MCS-251 Bytes 4 4 4 4 4 2 2 3 4 2 2 2 2 2 2 1 3 1 3 1 3 3 3 3 3 3 3 4 4 4 4 2 2 2 2 2 2 2 2 2 2 2 2 4 2

335
Tclock 10 12 12 14 4 2 2 6 10 6 10 18 4 8 16 2 6 2 6 2 6 4 4 4 4 4 6 6/12 6/12 12/18 10 12 10 2/8 2/8 2/8 2/8 2/8 2/8 2/8 2/8 16 22 26 18

Mnemnico MOV

MOVH MOVS MOVZ PUSH

POP

CLR SETB CPL ANL ORL MOV JB JNB JBC EJMP LJMP JE JNE JG JLE JSL JSLE JSG JSGE LCALL ECALL ERET

<dest>,<src> Descripcin Instrucciones de transferencia de datos (continuacin) @WRj+dis16,Rm (@WRj+dis16) = Rm @WRj+dis16,WRj (@WRj+dis16, @WRj+dis16+1) = Rm @DRk+dis24,Rm (@DRk+dis24) = Rm @DRk+dis24,WRj (@DRk+dis24, @DRk+dis24+1) = Rm DRk(hi),#data16 DRk(hi) = data16 WRj,Rm WRj = MSB, Rm WRj,Rm WRj = 0, Rm Instrucciones de transferencia de datos en la pila Mete el dato #data en la pila #data Mete el dato #data16 en la pila #data16 Mete el contenido de Rm en la pila Rm Mete el contenido de WRj en la pila WRj Mete el contenido de DRk en la pila DRk Mete en Rm un dato de la pila Rm Mete en WRj un Word de la pila WRj Mete en DRk un Dword de la pila DRk Instrucciones booleanas CY Pone a cero el bit de acarreo bit Pone a cero el bit direccionado CY Pone a uno el bit de acarreo bit Pone a uno el bit direccionado CY Complementa el bit de acarreo bit Complementa el bit direccionado CY, bit CY = CY AND (bit) CY, /bit CY = CY AND (/bit) CY, bit CY = CY OR (bit) CY,/bit CY = CY AND (/bit) CY, bit CY = bit bit, CY bit = CY bit, rel Salta si (bit) es 1 bit, rel Salta si (bit) no es uno bit, rel Salta si (bit) es uno y borran el bit Instrucciones de salto incondicional addr24 Salto extendido @DRk Salto extendido indirecto @WRj Salto largo indirecto Instrucciones de salto condicional rel Salta si es igual (si Z=1) rel Salta si no es igual (si Z=0) rel Salta si es mayor que. (si CY=Z=0) rel Salta si es menor o igual que. (si Z=1 o CY=1) rel Salta si es menor que (con signo). (si N[OV) rel Salta si es menor o igual que (con signo). (si Z=1 si N[OV) rel Salta si es mayor que (con signo). (si Z=0 y N=OV) rel Salta si es mayor o igual que (con signo). (si N=OV) Instrucciones de llamada y retorno de subrutina @WRj Llamada a subrutina tipo long @DRk Llamada a subrutina tipo extendido dir24 Retorno extendido de subrutina

Los autores, 2001; Edicions UPC, 2001.

You might also like