Todo sobre sistemas embebidos - Sergio Salas Arriarán - E-Book

Todo sobre sistemas embebidos E-Book

Sergio Salas Arriarán

0,0
20,99 €

oder
-100%
Sammeln Sie Punkte in unserem Gutscheinprogramm und kaufen Sie E-Books und Hörbücher mit bis zu 100% Rabatt.
Mehr erfahren.
Beschreibung

Todo sobre sistemas embebidos es una guía teórica y práctica para el aprendizaje de la metodología de programación y diseño de aplicaciones con sistemas embebidos de 8 bits de CPU, específicamente tomando como modelo el microcontrolador PIC18F4550 de la marca Microchip. El libro trata de enfocar aquellos aspectos que son de suma importancia conocer para el diseño y desarrollo de hardware basado en sistemas embebidos: entender la arquitectura del microcontrolador, conocer las herramientas de desarrollo disponibles en el mercado y la Internet para el diseño de firmware, dominio del lenguaje ensamblador, dominio de un lenguaje de alto nivel como el ANSI C. También se busca explicar el funcionamiento de los módulos periféricos internos del microcontrolador y ejemplos de diseño de hardware y firmware de diversas aplicaciones reales.

Das E-Book können Sie in Legimi-Apps oder einer beliebigen App lesen, die das folgende Format unterstützen:

EPUB
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



© Universidad Peruana de Ciencias Aplicadas (UPC)

Primera publicación: setiembre de 2015

 

Edición:

Corrección de estilo:

Diseño de cubierta:

Diagramación:

Diana Félix

Luigi Battistolo

Christian Castañeda

Diana Patrón Miñán / Christian Castañeda

Editor del proyecto editorial

Universidad Peruana de Ciencias Aplicadas S.A.C.

Av. Alonso de Molina 1611, Lima 33 (Perú)

Teléf: 313-3333

www.upc.edu.pe

Primera edición: setiembre de 2015

Versión ebook 2015

Digitalizado y Distribuido por Saxo.com Perú S.A.C.

www.saxo.com/esyopublico.saxo.comTelf: 51-1-221-9998Dirección: Av. 2 de Mayo 534 Of. 304, MirafloresLima-Perú

Universidad Peruana de Ciencias Aplicadas (UPC)Centro de Información

Salas Arriarán, Sergio. Todo sobre sistemas embebidos. Arquitectura, programación y diseño de aplicaciones prácticas con el PIC18F

Lima: Universidad Peruana de Ciencias Aplicadas (UPC), 2015

ISBN de la versión impresa: 978-612-318-033-1

ISBN de la versión pdf: 978-612-318-034-8

ISBN de la versión epub y mobi: 978-612-318-035-5

Conceptos básicos - Arquitectura del microcontrolador PIC18F - El compilador para PIC18F. El MPLAB X IDE - El lenguaje ensamblador del PIC18F - Rutinas típicas en lenguaje ensamblador - Interrupciones -Los puertos de entrada y salida - El lenguaje ANSI C - Los módulos de temporización - El convertidor analógico digital - El módulo mejorado de comunicación serial síncrona asíncrona (EUSART) - La interfaz serial periférica - La interfaz serial I2C - El módulo USB.

006.22 SALA

Todos los derechos reservados. Esta publicación no puede ser reproducida, ni en todo ni en parte, ni registrada en o transmitida por un sistema de recuperación de información, en ninguna forma ni por ningún medio, sea mecánico, fotoquímico, electrónico, magnético, electroóptico, por fotocopia o cualquier otro, sin el permiso previo, por escrito, de la editorial.

El contenido de este libro es responsabilidad del autor y no refleja necesariamente la opinión de los editores.

A mis alumnos, quienes con su interés, a través de constantes preguntas einquietudes, me animaron al desarrollo de esta obra.

A mis excolegas del INICTEL-UNI, por su compañerismo y lasexperiencias compartidas.

A mis padres, por las enseñanzas a lo largo de toda la vida.

Contenido

Prólogo

Introducción

Capítulo 1. Conceptos básicos

1.1 Definiciones básicas

1.2 Sistemas embebidos

1.3 Lenguajes de programación

1.4 La familia PIC18F4X de Microchip

1.5 Herramientas de desarrollo para Microchip

1.6 Características específicas del PIC18F4550

Capítulo 2. Arquitectura del microcontrolador PIC18F

2.1 La Unidad central de proceso (CPU)

2.2 Las unidades de memoria

2.3 Almacenamiento de las instrucciones en la memoria de programa

2.4 Las interfaces de entrada y salida (E/S)

2.5 El Reset

2.6 Temporización y opciones de reloj

2.7 Modos de ahorro de energía

2.8 El Perro guardián

Capítulo 3. El compilador para PIC18F. El MPLAB X IDE

3.1 IDE

3.2 Creación de un nuevo proyecto en MPLAB X usando el compilador MPASM

3.3 Elaboración de un programa sencillo. Partes del código y reglas básicas

3.4. Simulación de un programa en lenguaje ensamblador

3.5 Los archivos de configuración

3.6 El compilador MPLAB XC8

3.7 Creación de un nuevo proyecto en MPLAB usando el compilador MPLAB XC8

3.8 Proceso de grabación del microcontrolador PIC18F4550

Capítulo 4. El lenguaje ensamblador del PIC18F

4.1 El conjunto de instrucciones

4.2 Modos de direccionamiento

4.3 El Puntero de programa

4.4 La pila de direcciones

4.5 Instrucciones para el manejo de tablas en la memoria de programa

4.6 Acceso a la memoria EEPROM de datos

4.7 Directivas para el lenguaje ensamblador

Capítulo 5. Rutinas típicas en lenguaje ensamblador

5.1 Diseño de un diagrama de flujo

5.2 Rutinas básicas de retardo de tiempo

5.3 Conversión de bases

5.4 Operaciones matemáticas

5.5 Detección de teclas pulsadas en un teclado matricial

Capítulo 6. Interrupciones

6.1 El concepto de interrupción

6.2 El vector de interrupción

6.3 La prioridad de una interrupción

6.4 Latencia de una interrupción

6.5 Ejemplo de configuración de una interrupción externa

Capítulo 7. Los puertos de entrada y salida

7.1 Los puertos de entrada y salida del PIC18F4550

7.2 Ejemplo de control de un teclado matricial mediante la interrupción de cambio de estado del Puerto B

7.3 Manejo de un módulo LCD alfanumérico basado en el controlador HD44780

Capítulo 8. El lenguaje ANSI C

8.1 Historia del lenguaje ANSI C

8.2 La estructura de un programa en lenguaje C

8.3 Los tipos de datos

8.4 Los operadores en ANSI C

8.5 Sentencias condicionales e iterativas

8.6 Funciones y librerías

8.7 Arreglos y punteros

8.8 Estructuras y uniones

8.9 Tipos de variables compuestos

8.10 Uso del lenguaje ensamblador dentro de ANSI C

8.11 Manejo de interrupciones en MPLAB XC8

8.12 Las directivas del preprocesador

8.13 Ejemplos de aplicaciones con lenguaje ANSI C

Capítulo 9. Los módulos de temporización

9.1 Los temporizadores del PIC18F4550

9.2 Diseño de un semáforo sincronizado con el 0

9.3 Diseño de un reloj en tiempo real con el Timer 1

9.4 El módulo de entrada de captura

9.5 El modo de comparación de salida

9.6 El modo de modulación por ancho de pulso (PWM)

Capítulo 10. El convertidor analógico digital

10.1 Fundamentos de un sistema de adquisición de datos

10.2 La conversión analógica digital

10.3 El teorema del muestreo

10.4 El convertidor analógico digital del PIC18F4550

10.5 Ejemplos de aplicaciones con el convertidor analógico digital del PIC18F4550 Timer

Capítulo 11. El módulo mejorado de comunicación serial síncrona asíncrona (EUSART)

11.1 Nociones básicas de la comunicación serial

11.2 La tasa de bit y el formato NRZ

11.3 El estándar RS232

11.4 El módulo EUSART del PIC18F4550

11.5 Ejemplos de aplicación con el EUSART del PIC18F4550

Capítulo 12. La interfaz serial periférica

12.1 Fundamentos de la comunicación serial síncrona SPI

12.2 Pines del SPI

12.3 Formatos de transmisión del bus SPI

12.4 El módulo SPI del PIC18F4550

12.5 Ejemplos de aplicación con el bus SPI del PIC18F4550

Capítulo 13. La interfaz serial I2C

13.1 Características del protocolo I2C

13.2 Transferencia de datos en el protocolo I2C

13.3 Arbitrariedad

13.4 Direccionamiento de periféricos

13.5 Formato de transferencia de datos

13.6 Registros de configuración del PIC18F4550

13.7 Programación del módulo MSSP en modo I2C

13.8 Ejemplos de aplicación con el módulo I2C del PIC18F4550

Capítulo 14. El módulo USB

14.1 Fundamentos del bus USB

14.2 Modos de transferencia

14.3 El proceso de enumeración

14.4 Las clases de descriptores

14.5 El módulo USB del PIC18F4550

14.6 La librería MLA (Microchip Library Application) para dispositivos USB de Microchip

14.7 Ejemplo de comunicación entre el PIC18F4550 y un computador a través del puerto USB

Bibliografía

Foto: Milagros Segura Zurita

Sergio Salas Arriarán es ingeniero electrónico de la Universidad Peruana de Ciencias Aplicadas y Magíster en Ingeniería Biomédica por la Pontificia Universidad Católica del Perú (PUCP). Se ha desempeñado como Investigador y Desarrollador Tecnológico en el INICTEL-UNI. Ha ejercido la docencia en la Universidad de San Martín de Porres, la Universidad Tecnológica del Perú y la Escuela Naval. Asimismo, cuenta con experiencia como catedrático en la Maestría en Ciencias con mención en Telecomunicaciones de la Universidad Nacional de Ingeniería (UNI). Actualmente, es Profesor a Tiempo Completo de la escuela de Ingeniería Electrónica de la Universidad Peruana de Ciencias Aplicadas (UPC).

Prólogo

Escribir un libro académico es dejar una huella para siempre. Decidir hacerlo no solamente conlleva capacidad, conocimientos, experiencia, dedicación y sacrificio, sino también la intención de que quienes lo lean y lo utilicen puedan aprender su contenido de una manera más fácil y comprensible. Ello constituye un gran desafío, que únicamente puede tener éxito cuando el autor domina el tema y cuando el estilo utilizado para transmitir el conocimiento es muy motivador, utilizando adecuadamente las herramientas audiovisuales disponibles.

En el presente libro, titulado Todo sobre sistemas embebidos, Sergio Salas, su autor, ha logrado de manera efectiva compendiar, en sus catorce capítulos, todos los elementos necesarios para la cabal comprensión de dichos sistemas y de sus aplicaciones, a través de ejemplos prácticos. La ruta propuesta para ello comienza por tratar los conceptos básicos acerca de los sistemas de numeración utilizados en la electrónica digital, lo que le sirve de soporte para poder explicar la arquitectura del microcontrolador PIC18F, el cual ha sido elegido en el texto por ser uno de los más populares en la actualidad. Contando con dicha base, procede a explicar el compilador MPLAB X IDE, así como el lenguaje ensamblador con sus rutinas típicas. Introduce luego el concepto de interrupciones en un microcontrolador, y a continuación describe en forma detallada los puertos de entrada y salida del microcontrolador PIC18F4550. Luego justifica la utilidad del lenguaje ANSI C, y lo explica mostrando en todo momento aplicaciones prácticas actuales. Cumplido lo anterior, trata el importante tema de la temporización y sus elementos. A esta altura del camino, el punto siguiente sobre la conversión analógica digital permite apreciar cómo adquirir datos a partir de un sensor y cómo convertirlas de su formato analógico original a uno digital, lo cual hace posible el desarrollo de soluciones para aplicaciones específicas que se puedan necesitar de acuerdo con la identificación de un problema real. Como el microcontrolador debe intercambiar datos con el mundo exterior, el texto completa su esquema desarrollando el módulo mejorado de comunicación serial asíncrona (EUSART), el protocolo de comunicación serial síncrono half dúplex SPI (Serial Peripheral Interface), y, por último, el módulo USB (Universal Serial Bus). A lo largo de cada capítulo, es de destacar la exposición clara y pedagógica, apoyada en la utilización de videos y en preguntas de repaso que, sin duda, distinguen este libro de otros disponibles en la literatura, y que además posibilita y pone en práctica uno de los paradigmas del modelo educativo de la Universidad Peruana de Ciencias Aplicadas (UPC): el de adquirir nuevos conocimientos haciendo las cosas por uno mismo.

El libro está dirigido a estudiantes de pregrado, y es directamente aplicable al curso Sistemas Embebidos de la UPC, ya sea de las carreras de Ingeniería Electrónica, Ingeniería de Telecomunicaciones y Redes, e Ingeniería Mecatrónica. Pero también genera interés en carreras afines, así como en ingenieros que deseen introducirse o actualizarse en este importante tema que, dicho sea de paso, nos encamina al fascinante mundo de internet de las cosas, donde tendremos cada vez más aplicaciones y soluciones para todo tipo de problemas en todos los escenarios que podamos imaginar.

Sin duda alguna, esta obra constituye un valioso aporte para el diseño y la implementación de aplicaciones innovadoras en todos los proyectos de ingeniería que incluyan sistemas embebidos, y contribuye de manera eficaz al desarrollo tecnológico propio que tanto se requiere para la mejora del bienestar y de la competitividad del país.

Carlos R. Valdez Velásquez-López, Dr. Eng.Director de la Escuela de Ingeniería ElectrónicaUniversidad Peruana de Ciencias Aplicadas (UPC)

Introducción

En la enseñanza de sistemas embebidos, tanto para estudiantes universitarios como para alumnos a nivel técnico, no se encuentran materiales bibliográficos que involucren temas de arquitectura de sistemas embebidos, lenguajes de programación en ensamblador y ANSI C, que expliquen el funcionamiento y las características de los módulos periféricos de un microcontrolador y que muestren aplicaciones reales basadas en estos dispositivos. Todos estos temas se encuentran de forma separada y en su mayoría, la bibliografía está en idioma inglés. Por esta razón, se decidió tomar todo el material y la experiencia utilizada para la enseñanza de un curso sobre sistemas embebidos y volcarlos en un libro de texto que presente esta información de forma ordenada y simple.

Este libro se ha desarrollado pensando en estudiantes que se introducen al mundo de los sistemas embebidos por primera vez, o que cuentan también con cierta experiencia y desean profundizar conceptos para conocer nuevos ejemplos de aplicaciones con microcontroladores. De la misma manera, el libro está orientado a ingenieros que tengan cierta experiencia en el desarrollo de hardware digital o a docentes en el campo de sistemas embebidos que deseen ingresar al mundo de los micro-controladores de la familia PIC18F de Microchip.

Se ha tomado como base para el desarrollo del libro el curso de microcontroladores que se ofrece en las carreras de Ingeniería Electrónica, Ingeniería de Telecomunicaciones y Redes e Ingeniería Mecatrónica de la Facultad de Ingeniería de la Universidad Peruana de Ciencias Aplicadas de Lima, Perú.

Para mostrar ejemplos aplicados se utiliza el PIC18F4550, ya que es uno de los microcontroladores más populares de la empresa Microchip, se encuentra fácilmente en el mercado nacional a un costo bastante accesible y permite desarrollar un sinnúmero de aplicaciones prácticas para soluciones de problemas reales, ya sea en la industria electrónica de consumo o electrónica médica, entre otras. Todos los ejemplos mostrados en el libro se basan en el microcontrolador propuesto. Sin embargo, la gran mayoría de estos se pueden migrar fácilmente a cualquier otro modelo de microcontrolador de la misma familia, ya que los lenguajes de programación utilizados y la arquitectura son compatibles.

Adicionalmente, el PIC18F4550 es uno de los pocos microcontroladores de la familia PIC18F que cuenta con un módulo USB interno, el cual permite que sea conectado al computador a través de este protocolo a velocidades de 1.5Mpbs y 12Mbps, lo que abre las puertas a una serie de aplicaciones relacionadas a interfaces de comunicación con el computador. Es por esta razón que el libro contiene un capítulo dedicado a este tema tan interesante, además de un ejemplo real.

El presente libro pretende ser lo más claro y explicativo posible, a fin de que el lector pueda obtener el máximo provecho. De esta manera, en el aula los alumnos tendrán un mejor entendimiento sobre los temas a tratar en el curso sobre sistemas embebidos, y podrán convertir una sesión de clase explicativa en un debate entre el profesor y los estudiantes, lo cual enriquecerá el nivel de los proyectos propuestos que se puedan producir como resultado de la asignatura.

Cada capítulo del libro trata un tema diferente, pero a la vez necesario para poder entender los capítulos siguientes. Los ejemplos que presentan están listos para que el lector los pueda utilizar directamente en la programación del sistema embebido. Todos estos programas han sido probados en módulos de desarrollo y su funcionamiento se encuentra completamente verificado. El contenido de cada capítulo ha sido dividido de tal manera que el lector primero aprenda a programar en lenguaje ensamblador, entendiendo la arquitectura del microcontrolador y sus modos de acceso a memoria y uso de periféricos de entrada y salida. La segunda parte explica el lenguaje ANSI C, con lo cual algunos ejemplos suben en complejidad, en virtud de la facilidad que conlleva el uso de un lenguaje de alto nivel.

En el primer capítulo se presentan aspectos básicos de los sistemas de numeración binaria, conversión entre bases, las operaciones aritméticas y lógicas en el sistema binario y la representación de cifras decimales, BCD y ASCII. Luego, se explica claramente el concepto de sistema embebido y las herramientas que ofrece Microchip para poder programar y depurar los microcontroladores de la familia PIC18F y otros más. Finalmente, se analizan los elementos más importantes de esta familia y se detallan las características particulares del microcontrolador modelo de este libro: El PIC18F4550.

Posteriormente, el segundo capítulo muestra los detalles de la arquitectura del PIC18F. Se presentan las características del microprocesador, sus registros internos y unidad aritmética lógica. Luego, se explican las distintas unidades de memoria que existen en la familia de microcontroladores PIC18F y las interfaces de entrada y salida, las opciones de Reset, los módulos de temporización, las características del funcionamiento del reloj y los modos de bajo consumo.

En el tercer capítulo se muestra la herramienta de desarrollo: El MPLAB X IDE. Se explica con ejemplos cómo crear un nuevo proyecto, editar un programa, simularlo y grabarlo en la memoria FLASH del microcontrolador. Primero se realiza la demostración con el lenguaje ensamblador y luego se hace lo propio con el lenguaje ANSI C. Esta metodología deberá ser usada por el lector para la verificación del resto de ejemplos presentados en el libro.

El cuarto capítulo detalla las instrucciones del lenguaje ensamblador del PIC18F. Cada instrucción se presenta con un ejemplo que ayuda a entender su forma de operación. A continuación se presentan las directivas del lenguaje ensamblador, las cuales también han sido ejemplificadas, con el objetivo de mostrar claramente su función.

En el quinto capítulo se explica la metodología para plantear un programa en lenguaje ensamblador. Se plantean rutinas básicas que son útiles para la mayoría de aplicaciones, como retardo de tiempo, conversión de bases y operaciones matemáticas. Finalmente, se muestra una técnica para detectar las teclas pulsadas de un teclado matricial conectado al microcontrolador a través de uno de sus puertos.

Seguidamente, el sexto capítulo aborda el tema de las interrupciones. Se explica el concepto y luego se analiza la estructura de las interrupciones ofrecidas por el PIC18F. Luego se muestra un ejemplo sencillo en el que se configurará la interrupción externa 0 del PIC18F4550 para detectar flancos generados por un pulsador.

En el séptimo capítulo se presentan los puertos de entrada y salida del PIC18F4550. Mediante estos conceptos, se muestran ejemplos de configuración y control de un teclado matricial y un módulo LCD alfanumérico.

Luego, en el octavo capítulo se aborda la sintaxis completa del lenguaje ANSI C. Se explican sus instrucciones con ejemplos sencillos y se muestra la forma de creación de librerías haciendo uso del compilador XC8. Se mencionan temas más específicos, como el uso de ensamblador dentro del ANSI C, el manejo de interrupciones y el uso de directivas del preprocesador. Finalmente, se muestran programas de ejemplo, aplicados haciendo uso del lenguaje C y de los periféricos del microcontrolador.

En el noveno capítulo se emprende el tema de los módulos de temporización del microcontrolador. Aquí se presenta la teoría y el mecanismo de funcionamiento de un temporizador, además de diversos ejemplos de funcionamiento. Posteriormente, se explican los modos de Entrada de captura, comparación de salida y generador de PWM, los cuales se ejemplificarán con aplicaciones reales que requieren el uso de servomotores y sensores infrarrojos para su puesta a prueba.

El décimo capítulo toca el tema del convertidor analógico digital del PIC18F. Se presenta la teoría básica de digitalización de señales analógicas y algunos aspectos importantes, como el teorema del muestreo. Luego, se explica el módulo ADC del PIC18F4550 y el método de configuración. Finalmente, se muestran dos ejemplos aplicados para medir el voltaje de forma digital y la temperatura ambiente haciendo uso de un sensor LM35.

Más adelante, en el decimoprimer capítulo se aborda el tema de la comunicación serial asíncrona y el estándar RS232. Se analiza el módulo EUSART del PIC18F y su forma de configuración. Luego, se muestran ejemplos aplicados para obtener una comunicación entre el PIC18F4550 y un computador a través del puerto RS232 y otra aplicación médica muy interesante: el diseño de un oxímetro de pulso para medir el nivel de saturación de oxígeno y pulso cardiaco de un paciente.

En el decimosegundo capítulo se presenta la interfaz serial periférica (SPI), la cual corresponde a uno de los módulos de comunicación síncrona del microcontrolador bastante utilizada por muchos dispositivos periféricos en estos días. Se explica el módulo MSSP del microcontrolador y los registros de configuración. Luego, se muestran dos ejemplos de aplicación: un reloj en tiempo real haciendo uso del circuito integrado DS1305 y el diseño de una matriz de LED basada en el circuito integrado MAX6952.

Posteriormente, el decimotercer capítulo trata de la interfaz serial síncrona I2C. Se explican las características del protocolo y los métodos de intercambio de información entre dos o más dispositivos conectados mediante esta interfaz. Luego, se explica el módulo MSSP del microcontrolador configurado en modo I2C y el método de configuración. Se analiza la librería “i2c” del MPLAB XC8 y se muestran dos ejemplos aplicados: uno para obtener la temperatura de un sensor digital como el DS1621 y el acceso de lectura y escritura sobre una memoria EEPROM modelo 24LC08.

El último capítulo toca el tema de la interfaz USB. Se explican de forma general los fundamentos del bus, los métodos de transferencia, el proceso de enumeración y las clases de dispositivo. Luego, se analizan las características más relevantes del módulo USB del PIC18F4550 y se presenta la librería MLA de Microchip, que permite manipular el módulo USB del microcontrolador a través de funciones amigables que manejan los detalles de la configuración, facilitando la elaboración de aplicaciones. Al finalizar el capítulo, se muestra un ejemplo de comunicación entre el PIC18F4550 y el computador a través del bus USB usando la clase CDC.

Capítulo 1. Conceptos básicos

Para la correcta comprensión del contenido del presente capítulo y de los capítulos siguientes, es necesario tener en claro ciertos conceptos básicos acerca de los sistemas de numeración utilizados en la electrónica digital (básicamente, el sistema binario y el hexadecimal), los tipos de operaciones matemáticas relacionadas con estas bases numéricas y las diversas interpretaciones que se pueden obtener de las cifras binarias.

1.1 Definiciones básicas

A continuación se presenta una serie de conceptos importantes sobre electrónica digital; los tipos de base numérica binaria, decimal y hexadecimal; los métodos aritméticos para obtener los cambios de base, operaciones lógicas y aritméticas en estos sistemas numéricos; y los formatos de numeración BCD y ASCII, que son sumamente utilizados en las aplicaciones con sistemas embebidos.

1.1.1 El sistema de numeración binario y hexadecimal

En el mundo de los dispositivos lógicos digitales, las operaciones realizadas siempre involucran patrones numéricos en formato binario. La unidad mínima de este formato es el bit. Un bit se representa por dos niveles o estados lógicos: ‘1’ o ‘0’. Normalmente, un nivel ‘1’ lógico viene a estar físicamente representado por una magnitud en voltios, y el nivel ‘0’, en otra magnitud de voltaje. Por ejemplo, en la tecnología TTL1, el nivel lógico ‘1’ se encuentra determinado en el rango entre 2 V y 5.5 V, mientras que el nivel ‘0’ está entre 0V y 0.8 V. Cualquier nivel de voltaje fuera de este rango (entre 0.8 y 2 V) es considerado como un estado indeterminado o ‘X’, con el cual será imposible realizar operaciones lógicas a nivel digital.

Las cifras binarias, por lo general, no se componen de un solo bit. Normalmente, están compuestas por una cantidad múltiplo de ocho bits. En el gráfico 1.1 se muestran los tipos de arreglos binarios más utilizados en la electrónica digital.

Gráfico 1.1. Arreglos binarios más comunes usados en la electrónica digital

 

Tamaño

Valor mínimo y máximo

Denominación

1 bit

0 – 1

Bit

4 bits

0000 – 1111

Nibble

8 bits

0000 0000 – 1111 1111

Byte

16 bits

0000 0000 0000 0000 –1111 1111 1111 1111

Word

32 bits

0000 0000 0000 00000000 0000 0000 0000 –1111 1111 1111 11111111 1111 1111 1111

Double Word

Elaboración propia.

Una cifra binaria posee la siguiente nomenclatura: (código binario)2, donde el subíndice 2 indica la base. Por ejemplo, la cifra 010100002 es un byte con un valor equivalente al número 80 en base decimal (base 10). La nomenclatura para la base hexadecimal se representa antecediendo un 0x sobre el código hexadecimal. Por ejemplo, la cifra mostrada se puede representar como 0x50 en la base hexadecimal. El bit ubicado en el extremo derecho de la cifra en base binaria es conocido como el bit LSB2 y representa el valor menos significativo. De la misma manera, el bit del extremo izquierdo es considerado el bit MSB3 o más significativo. Al igual que en el sistema de numeración decimal, una cifra ubicada en la posición de las centenas o millares (izquierda) presenta mayor significancia que una cifra ubicada en la posición de las decenas o unidades (derecha).

En el sistema binario, la base numérica utilizada es 2. Esto significa que cada bit puede estar representado únicamente por dos cifras: ‘0’ o ‘1’. La posición del bit dentro de la cifra especifica un valor formado por la cifra 2 elevado a una potencia y multiplicado por el valor del bit (‘0’ o ‘1’). El valor de dicha potencia es la posición del bit en la cifra. Por ejemplo, si se observa el* gráfico 1.2, en el byte de la figura, el bit LSB tiene un aporte de 20 (ya que 0 es la posición menos significativa), mientras que el bit MSB aporta con 27. Esto implica que el valor de la cifra es el siguiente:

Al igual que en el caso de las cifras decimales, donde existen prefijos como kilo (103), Mega (106) o Giga (109), entre otros que son usados para abreviar magnitudes elevadas, existen también los mismos prefijos para definir grandes magnitudes en cifras binarias formadas por longitudes con base en 8 bits (1 byte). Es así que para el sistema binario:

Gráfico 1.2. Ejemplo sobre los pesos de cada bit de una cifra binaria

Elaboración propia.

Al igual que en el sistema de numeración binario, se emplean otros sistemas numéricos para representar cifras en otras bases. Uno de los más usados en la programación de sistemas embebidos es la base hexadecimal4. En ella cada cifra tiene un peso, dependiendo de una potencia en base 16. En este sistema existen 16 cifras diferentes (valores de 0 a 15) para representar una magnitud. Por ejemplo, para las cifras del 0 al 9 se utilizan los mismos dígitos que en el sistema decimal. Para completar los 6 dígitos restantes se utilizan letras del alfabeto, como el siguiente caso:

En el número hexadecimal mostrado en el gráfico 1.3, cada cifra representa un nibble, dado que se tienen 16 posibles valores diferentes y esto equivale a una combinación de 4 bits (24 estados). Cada dígito representa una potencia de 16, según su posición en la cifra. En el ejemplo, el valor decimal equivalente del número hexadecimal mostrado es el siguiente:

El sistema de numeración hexadecimal es el preferido cuando se quiere representar magnitudes superiores a 28 y, al mismo tiempo, se desea mantener la visualización del código binario. Esto permite obtener una mejor comprensión del orden de la cifra sin perder de vista su forma a nivel binario (ya que es fácilmente visible el código binario a partir de cada nibble o dígito hexadecimal).

Gráfico 1.3. Ejemplo sobre los pesos de cada cifra hexadecimal

Elaboración propia.

1.1.2 Conversiones entre bases

La base decimal es el formato más utilizado por los seres humanos para interpretar las cifras numéricas que operan diariamente para sus tareas cotidianas. Las personas comunes y corrientes han aprendido a realizar operaciones aritméticas en base a este sistema de numeración. Entonces, la pregunta que cae por su propio peso es la siguiente: «¿por qué el programador debe conocer otros sistemas de numeración, como el binario y el hexadecimal?» La respuesta a esta pregunta es obvia: porque al programar un sistema embebido no se debe pensar como seres humanos sino como un computador, y el sistema de numeración utilizado por estas máquinas es, por naturaleza, el binario.

Durante la programación de un sistema embebido no es necesario que el programador realice las conversiones de bases en el código ingresado. Para el software de programación de sistemas embebidos, el uso de una base u otra es indiferente. La conversión de una base es un proceso automáticamente efectuado por el compilador en el momento de generar el código de salida del programa. Sin embargo, el programador debe conocer las diferentes bases para poder interpretar las cifras mentalmente y así agilizar la implementación de su algoritmo. La base decimal es por excelencia la más sencilla de interpretar por cualquier ser humano. Por tal motivo, se toma como referencia en las conversiones de base.

Convertir una cifra de base binaria a decimal es bastante simple y ya se explicó en el subcapítulo 1.1.1. Solo basta con multiplicar cada dígito binario (‘0’ o ‘1’) por su correspondiente peso (base dos elevado a la posición del dígito) y sumar todos los dígitos resultantes. Por ejemplo, si se tiene la cifra binaria 101010102, la transformación a la base decimal se haría de la siguiente manera:

Para realizar la conversión de una cifra binaria a hexadecimal, el procedimiento también resulta sumamente sencillo. Si se toma como ejemplo el valor binario 0101110000112, primero se deberá separar la cifra en el número total de nibbles que lo componen. Para este caso son tres: 01012, 11002 y 00112. Cada nibble posee su equivalente en cifra hexadecimal. Por ejemplo, 01012 es 0x5, 11002 es 0xC (doce) y 00112 es 0x3. Por lo tanto, la cifra hexadecimal equivalente es 0x5C3.

El proceso de conversión de decimal a binario es ligeramente más complejo que en los casos anteriores. Consiste en realizar divisiones sucesivas entre 2 hasta lograr que el cociente final de la división sea 1. Si se desea convertir el valor decimal 17 a código binario, se deben realizar las siguientes operaciones sucesivas:

La cifra binaria equivalente se forma al tomar el último cociente como bit MSB y los residuos restantes como los dígitos ordenados de izquierda a derecha. La cifra binaria, entonces, estará compuesta de 5 dígitos y será el valor 100012.

Si se repite el ejercicio con una cifra decimal par, se podrá notar que el bit LSB siempre será ‘0’, ya que la primera división entre 2 de un número par dará como residuo 0. El dígito MSB siempre será ’1’ para cualquier cifra. Por ejemplo, para convertir el número 18 a base decimal se tiene la siguiente operación:

Como resultado se obtiene el código binario 100102, del cual se puede observar que el bit LSB es ‘0’.

La conversión de base hexadecimal a decimal es muy parecida a la de binario a decimal, con la diferencia de que cada elemento tiene asociada una potencia en base 16. Por ejemplo, se tiene un número hexadecimal cuyo valor es 0xFA28. Para convertirlo a su equivalente en base decimal, se debe observar que el número en base 16 estará compuesto por 4 cifras:

La cifra 0xF es la de mayor significancia (MS5), por lo cual le corresponde un peso de 163, mientras que la cifra 0x8 es la menos significativa (LS6) y, por lo tanto, le corresponde el menor peso, de 160. Posteriormente, se multiplica cada cifra por su respectiva potencia de 16 según el orden:

Para pasar de una base decimal a hexadecimal el procedimiento también resulta ser similar al caso de la conversión decimal a binaria. La diferencia radica en que las divisiones sucesivas se realizan sobre un divisor de 16. Suponiendo que se tiene el número 39 481 en base decimal y se desea transformar a base hexadecimal, el procedimiento sería el siguiente:

El resultado de la conversión de 39 481 a hexadecimal es, entonces, 0x9A39. La división sucesiva deberá detenerse cuando el último cociente obtenido sea un valor menor a 15 (0xF).

Un proceso mucho más sencillo y que no requiere de cálculos aritméticos es la conversión binaria a hexadecimal. Como ejemplo, se cuenta con el número binario 11100110110000102 y se desea transformar a base hexadecimal. El primer paso de este proceso es dividir el número binario en grupos de cuatro bits o nibbles. Si no se cuenta con un número de bits múltiplo de cuatro, se deberán agregar varios ‘0’ a la izquierda para completar los dígitos. Entonces, el número binario se divide de la siguiente manera:

Por tanto, la cifra hexadecimal equivalente es 0xE6C2.

La conversión hexadecimal a binario es un proceso muy similar al anterior. Simplemente se deberá tomar cada cifra del número hexadecimal, para convertirla al nibble correspondiente en código binario. Por ejemplo, se tiene el número hexadecimal 0xABCD2 y se desea convertirlo a binario. El procedimiento es como se muestra:

De esta manera, el resultado de la conversión es 101010111100110100102. Se puede observar que no es conveniente expresar una cifra de esta magnitud en base binaria, ya que resulta muy larga y difícil de interpretar. Durante la programación de sistemas embebidos, el programador es libre de utilizar cualquiera de las tres bases vistas (base binaria, decimal y hexadecimal). Sin embargo, muchos programadores optan por utilizar la combinación de las tres bases en sus programas, ya que, para ciertas circunstancias, algunas bases se adecúan mejor que otras. Por lo general, un programador opta por la base decimal cuando realiza operaciones matemáticas. La base hexadecimal se utiliza para manejar direcciones de memoria (que usualmente son magnitudes elevadas) o cargar códigos binarios a registros, y la base binaria suele ser utilizada para la asignación de estados a los puertos de entrada y salida (E/S) del sistema embebido.

Si bien es cierto que existen otras bases, como la octal (base 8), estas son poco utilizadas, debido a que no son versátiles y no resultan atractivas para la mayoría de programadores (al parecer, conocer tres bases numéricas ya es suficiente). No obstante, la mayoría de compiladores siguen aceptando este tipo de base.

1.1.3 Operaciones lógicas

En el mundo digital existen dos maneras de operar las cifras binarias (o en la base en que se interpreten, pues finalmente todo número es manejado de forma binaria en un sistema embebido). Cada cifra puede ser operada en modo aritmético o en modo lógico. El modo aritmético se presentará en el siguiente subcapítulo. A continuación se muestra el modo lógico.

El modo lógico se basa en las operaciones lógicas. Estas se obtienen mediante la manipulación de los patrones binarios en base a las reglas creadas por George Boole7 a mediados del siglo XIX, las cuales constituyen el álgebra de Boole. El álgebra de Boole opera sobre variables que pueden ser verdaderas o falsas. Las reglas de esta álgebra son actualmente utilizadas en las operaciones lógicas binarias en los sistemas digitales, ya que cada cifra binaria puede ser tratada como verdadero (nivel binario ‘1’) y falso (nivel binario ‘0’)8.

Las operaciones lógicas típicas más empleadas en los sistemas embebidos son las siguientes:

• NOT

• OR

• AND

• XOR

• SWAP

• SHIFT

Cabe señalar que las operaciones lógicas son fundamentales en la programación de sistemas embebidos, ya que permiten la implementación de una serie de operaciones vitales para el funcionamiento del programa. Por ejemplo, invertir el estado de un pin de entrada y salida de un sistema embebido, configurar un registro interno, realizar operaciones de conversión binario BCD o implementar el proceso de división, entre otras. Estos son ejemplos en los cuales se requiere hacer uso intensivo de las operaciones lógicas.

La operación lógica más simple de todas es la NOT (negación). Esta operación simplemente invierte un estado verdadero a falso y viceversa. En el caso binario, negar un bit significa cambiar su estado de ‘1’ a ‘0’ o de ‘0’ a ‘1’. Por ejemplo, se tiene una variable de nombre A que representa un bit. Por lo tanto, A puede tomar dos valores: ‘0’ o ‘1’. Si se niega el valor de A, entonces Ā (se denomina a esta variable ‘A negado’. En otras literaturas se considera A´ también como ‘A negado’) denota la negación. El símbolo para la compuerta lógica que realiza la negación se muestra en el gráfico 1.4, junto con su tabla de verdad.

Gráfico 1.4. a) Tabla de verdad de la operación lógica NOT. b) Símbolo de la compuerta NOT

Elaboración propia.

También es posible realizar la operación lógica NOT sobre un conjunto de bits, que podrían ser un nibble o un byte. Si la variable A equivale al siguiente valor:

Entonces:

La operación lógica OR, también conocida como OR inclusiva (IOR), es otra de las operaciones básicas del álgebra de Boole. Su lógica es muy similar a la suma, excepto cuando ambos operandos son ‘1’9. En una operación OR deben existir al menos dos operandos, y basta que uno de ellos sea ‘1’ para que el resultado de la operación sea ‘1’. En el gráfico 1.5 se observa la tabla de verdad y el símbolo de la compuerta lógica OR.

También es posible combinar las operaciones. Por ejemplo, se puede negar la operación OR entre A y B, lo cual se conoce como la operación NOR. Esto daría el siguiente resultado para los valores dados de A y B:

Gráfico 1.5. a) Tabla de verdad de la operación lógica OR. b) Símbolo de la compuerta OR

Elaboración propia.

En muchos sistemas embebidos, la operación NOR no forma parte del conjunto de instrucciones. Por lo cual, para su implementación, se deben ejecutar las operaciones OR y NOT de manera combinada.

La operación lógica AND toma dos variables binarias y realiza un proceso muy similar al de la multiplicación, sin tomar en cuenta el acarreo. En esta operación basta que uno de los operandos sea ‘0’ para que todo el resultado de la operación dé ‘0’. En el gráfico 1.6 se muestra la tabla de verdad y el símbolo de la compuerta lógica AND.

Gráfico 1.6. a) Tabla de verdad de la operación lógica AND. b) Símbolo de la compuerta AND

Elaboración propia.

También se puede combinar la operación lógica AND con la NOT para obtener un operador NAND. Este tipo de operación tampoco es muy común en el conjunto de instrucciones de sistemas embebidos con arquitectura tipo RISC10. Por ejemplo, la operación NAND de las variables A y B se muestra a continuación:

Hasta el momento se han analizado las tres operaciones lógicas fundamentales. Si se combinan estos tres operadores, se logrará obtener una nueva operación lógica que se encuentra disponible en la arquitectura de la gran mayoría de sistemas embebidos: el operador XOR (OR exclusivo). Este operador genera un resultado verdadero solo si una de las entradas es verdadera y la otra es falsa. Pero si ambas entradas a la operación XOR son iguales, el resultado será falso.

Si A y B son dos variables binarias, entonces la operación XOR se denota de la siguiente manera:

En el gráfico 1.7 se muestra la tabla de verdad de la operación lógica XOR y el símbolo de su compuerta.

Gráfico 1.7. a) Tabla de verdad de la operación lógica AND. b) Símbolo de la compuerta XOR

Elaboración propia.

El valor obtenido es diferente de 000000002, lo cual será siempre así si es que ambos operandos no son iguales.

La operación SWAP no posee un símbolo lógico. Si bien es cierto, no es una operación lógica propiamente dicha sino el resultado de la combinación de operaciones básicas, muchos sistemas embebidos utilizan una instrucción de nombre swap para alterar el contenido de un byte de información.

Otra de las operaciones clásicas realizadas por todo sistema embebido es la operación shift o de desplazamiento binario. En una cifra binaria, cada bit posee una posición. Con el operador shift es posible realizar un cambio de posición de cada bit, ya sea para la derecha o para la izquierda.

Nuevamente, la operación shift no es una compuerta, sino un conjunto de operaciones que involucran el movimiento de los bits en un registro. Esta operación está incluida en el conjunto de instrucciones de todo sistema embebido y resulta muy útil para una gama de aplicaciones en las cuales se requiere multiplicar, dividir o convertir de binario a BCD, entre otras.

1.1.4 Operaciones aritméticas

Otra de las formas que existen para manipular los números binarios a nivel digital es a través de operaciones aritméticas. Las operaciones aritméticas típicas que involucran a los sistemas embebidos de mediano rango son las siguientes:

• Suma

• Resta

• Multiplicación

Las reglas de la aritmética que se conocen para el sistema decimal son muy similares al sistema binario. La diferencia es que el sistema binario es más simple y las reglas que hay que aprender para efectuar una suma, por ejemplo, son más sencillas que en el caso de la base decimal. En general, para llevar a cabo una sumatoria en el sistema binario se deben tener en cuenta únicamente tres reglas:

El acarreo es una parte fundamental en la suma. Por ejemplo, en la suma decimal es común que se produzca un acarreo cuando la sumatoria supera el valor de nueve. Se empieza sumando las cifras menos significativas y se termina cuando la última suma involucra a las dos cifras más significativas de los operandos (o a solo uno de ellas). Si se analiza la siguiente suma decimal: 137 + 26, sucederá lo siguiente:

En general, para la base decimal el acarreo es un número entre 0 y 1. Para el caso de la base binaria, el acarreo también será una cifra entre 02 y 12, ya que la suma de dos dígitos binarios solo puede dar ‘0’, ‘1’ o 102. En el caso de que se quiera realizar la suma de los siguientes dígitos binarios: 011011002 y 100110102, primero, se comienza sumando las cifras menos significativas, de la siguiente manera:

Como se puede observar, el resultado posee un bit más (9 bits en total) que los dos operandos. Esto se debe al acarreo que se ha ido arrastrando desde la cuarta operación. En el ejemplo anterior, el primer operando 011011002 representa la cifra decimal 108, y el segundo operando 100110102 representa la cifra decimal 154. El resultado es 1000001102, cuyo valor decimal es 262, y corresponde a la suma de 108 + 154.

Uno de los formatos utilizados por los sistemas embebidos para poder operar números positivos y negativos es el complemento a 2. Las cifras binarias pueden interpretarse de dos formas: positivas o negativas. Por ejemplo, la cifra 100100112 puede interpretarse de dos maneras: como 147 en base decimal o –109 (complemento a 2).

En el formato complemento a 2, una cifra se puede interpretar como positiva o negativa. En este formato, el bit MSB representa el signo. Si este bit es ‘1’, entonces el número tendrá una representación negativa. Para obtener el valor negativo de una determinada magnitud en código binario, se debe obtener su complemento a 2. Esto se logra realizando los siguientes pasos:

1. Escribir la cifra binaria.

2. Realizar la operación NOT sobre toda la cifra.

3. Sumar el bit 12 a la cifra negada.

4. Si la cifra inicial representa una magnitud positiva, el resultado será la representación negativa en complemento a 2. Si la cifra inicial es una magnitud negativa, el resultado será la representación positiva en complemento a 2.

Las reglas de adición pueden combinar cifras sin signo y complemento a 2 sin ninguna distinción. Por ejemplo, en la siguiente sumatoria: (–9) + 8 + 1 + (–4), el resultado es el complemento a 2 de 4. En cifras binarias sería lo siguiente:

111101112 (–9) +000010002 (8) + 000000012 (1) +111111002 (–4)

El procedimiento consiste en sumar cada bit empezando por los bits LSB de cada una de las cuatro cifras:

Se puede observar que el resultado presenta 9 bits de longitud. Sin embargo, los bits más significativos son 12, lo cual se puede interpretar como ceros a la izquierda o cifras no significantes para una magnitud complemento a 2. Si se niega Resultado y se suma 1, el resultado interpretado será 0000001002 o –4, lo cual es equivalente al resultado obtenido en base decimal.

Las técnicas utilizadas para restar números en base decimal también son muy similares a las que se aplican para la resta en base binaria. El proceso comienza restando los bits LSB hasta llegar a los bits MSB. En cualquier resta binaria en la que una cantidad mayor debe ser restada de una menor, se presentará un dígito de acarreo, que en este caso es prestado del bit de la posición izquierda. De esta manera, las reglas básicas de sustracción binaria son las siguientes:

Por ejemplo, si se desea restar 56 – 37 en decimal, se debe realizar el siguiente procedimiento:

Uno de los detalles más interesantes se da cuando se restan dos números y el minuendo es menor que el sustraendo. Cuando esto ocurre, el número debe ser interpretado como negativo o complemento a 2. Por ejemplo, si se realiza la resta 72 – 94, el resultado es –22. Obviamente, para esto se han tenido que intercambiar las posiciones de los operandos, haciendo que 94 sea el minuendo y 72 el sustraendo.

En el caso de una resta binaria, el resultado de restar un minuendo menor que el sustraendo da el complemento a 2 del resultado de realizar la resta invirtiendo los roles del sustraendo y el minuendo. Por ejemplo, se sabe que 72 es 010010002 y 94 es 010111002. Al realizar la resta, se obtiene el siguiente resultado: 111010102, el cual es el complemento a 2 de 22.

Otra forma de realizar la misma operación resulta de sumar 72 con –94. Para el caso del sistema decimal, la operación sigue siendo una resta. Sin embargo, para el sistema binario se pueden aplicar las mismas reglas de la adición, sumando 72 con el complemento a 2 de 94. En este caso, –94 es 101000102. Entonces, sumando 010010002 + 101000102, se obtiene el valor 111010102, que resulta también ser –22 en complemento a 2.

La multiplicación binaria sigue un proceso muy similar al caso decimal. En esta última, los operandos son alineados uno encima del otro, y es el de menor longitud el de la posición inferior. Por ejemplo, si se desea multiplicar 123 x 14, el proceso para el cálculo será el siguiente:

Como se puede observar, el operando con la cifra más extensa se coloca en la parte superior y el operando de menor longitud en la parte inferior. Se multiplica el dígito menos significativo del operando inferior por cada uno de los dígitos de la cifra superior. Luego, se multiplica el segundo operando más significativo por todos los dígitos de la cifra superior, pero el resultado se coloca en la parte inferior, dejando una columna derecha libre. Finalmente, se suman los dígitos de cada columna respectiva y se obtiene el resultado.

En el caso binario el procedimiento es muy similar, con la ventaja de que los dígitos por multiplicar son bits y los resultados de cada multiplicación solo pueden ser ‘0’ o ‘1’. La multiplicación de cada dígito binario es en realidad una operación AND. El procedimiento consiste en ubicar el operando de mayor longitud sobre el de menor longitud, de la misma manera que en el procedimiento de multiplicación de cifras decimales. Luego, se debe realizar la operación AND entre cada dígito del operando corto y cada dígito de la cifra superior, empezando desde el bit LSB hasta culminar con el bit MSB del operador inferior.

Como resultado, se obtiene el valor binario 0110101110102, que es equivalente a 1722. Cabe resaltar que este tipo de operación solo aplica para cifras positivas. Para multiplicar cifras en complemento a 2, se debe optar por otra metodología como sumas sucesivas.

1.1.5 Punto fijo y Coma flotante

En muchas ocasiones es necesario representar una cifra de forma fraccional; para esto, existen dos maneras de hacerlo en código binario. Estos formatos son el Punto fijo y la Coma flotante.

El formato de Punto fijo es el más simple y no requiere de mucha carga computacional por parte del sistema embebido para ser operado. Este formato fue introducido al inicio de la década de 1980 y se encuentra basado en un tamaño fijo de bits, tanto para la parte fraccional como para la parte entera.

En el formato de Punto fijo, se debe establecer un punto decimal imaginario dentro del código binario. Por ejemplo, para una cifra binaria con el siguiente formato: 1010.10112, se muestra un byte que contiene un punto fijo entre ambos nibbles. Esta posición indica que los bits a la izquierda del punto decimal son considerados la parte entera de la cifra, mientras que los bits ubicados al lado derecho del punto son considerados la parte fraccionaria. En este caso, se han asignado 4 bits para la parte entera y 4 bits para la parte fraccionaria. Esto no necesariamente ha de ser así, ya que se pueden asignar diferentes tamaños para cada sección.

La interpretación de la cifra debe ser dada de dos maneras. Para la parte entera, se mantiene el formato entero. Para la parte fraccionaria, las potencias asignadas a la posición de cada bit presentan exponente negativo. En el gráfico 1.8 se muestra la forma como se obtiene el valor decimal de la cifra 1010.10112.

Gráfico 1.8. Conversión del formato punto fijo a decimal fraccionario

Elaboración propia.

Como se puede observar, la parte entera y fraccionaria se calcula por separado, para luego unirse en una sola cifra, incorporando el punto decimal. La mínima cantidad que puede ser expresada en formato Punto fijo es 0000.00002, que representa 0.0, mientras que el valor máximo es 1111.11112, que equivale a 15.9375. En muchos casos, el bit MSB de la parte entera es asumido como el signo de la cifra. En ese sentido, considerando el cuarto bit MSB de la parte entera el signo (‘1’ negativo y ‘0’ positivo), el rango de valores máximo y mínimo que puede tener la cifra va desde –7.9375 hasta 7.9375 (tomar en cuenta que es diferente del formato complemento a 2, pues en este caso corresponde al formato complemento a 111).

La precisión del formato de Punto fijo aumenta conforme el número de bits asignados a la etapa fraccionaria es incrementado. En la práctica, este método es utilizado por muchos sistemas embebidos de baja capacidad, aunque en muchas ocasiones es dejado de lado, por su falta de precisión.

Para mejorar la precisión de las cifras fraccionarias existe el formato de Coma flotante. En este formato se divide un conjunto de bits (normalmente entre 24 y 32 bits) en tres partes: signo, exponente y mantisa. En el gráfico 1.9 se muestra una representación del formato de Coma flotante para un número de 32 bits.

Gráfico 1.9. Representación en Coma flotante para un número de 32 bits

Elaboración propia.

Por lo general, el bit de signo (S) toma la posición más significativa de todo el registro de 32 bits y ocupa un espacio de 1 bit. El valor ‘0’ indica que la cifra debe ser interpretada como positiva, mientras que el valor ‘1’ representa una magnitud negativa.

El exponente especifica directamente la magnitud entera de la cifra en Coma flotante. El sector del exponente está compuesto por un número de bits, por lo general, menor que el asignado a la mantisa. El código binario del exponente representa un factor, al cual se le restará una cifra base. El resultado de esta resta será el exponente de un factor 2 al cual se le multiplicará un número fraccionario. La base viene a ser el máximo valor que se puede formar con el número de bits menos uno asignado al exponente. Esto implica que, para 8 bits de exponente, la base será 127, ya que es el máximo valor posible formado por 7 bits. Evidentemente, el exponente puede ser negativo, con lo cual se tendría la representación de una cifra netamente fraccionaria y menor que 1.

La mantisa especifica el valor fraccionario de la cifra en Coma flotante. Mientras más bits posea la mantisa, mayor será la precisión decimal de la cifra. Mientras que la base de la fracción es 2n, donde n es el número de bits de la mantisa12.

Como ejemplo, se cuenta con un número en Coma flotante compuesto por 13 bits. En este formato se utiliza un bit de signo, 4 bits para el exponente y 8 bits para la mantisa. El número presenta el siguiente código binario: 01000101000002. Entonces, la cifra decimal se obtendrá de la siguiente manera:

Por lo tanto, la cifra se calcula de la siguiente manera:

En el mundo de los sistemas embebidos, el uso de números en formato Coma flotante es sumamente preferido por parte de los programadores para simplificar cálculos fraccionales y obtener una buena precisión. Sin embargo, la carga computacional que requiere este formato para realizar las operaciones de suma, resta y multiplicación es bastante elevada para sistemas embebidos que no poseen una arquitectura optimizada para esto.

1.1.6 El sistema de numeración BCD

El formato BCD (Binary Coded Decimal) es bastante utilizado en los sistemas embebidos para el manejo de dispositivos periféricos, en los cuales se requiere presentar datos numéricos (por ejemplo, Displays 7 segmentos, módulos LCD alfanuméricos, entre otros). En este formato, cada dígito decimal es reemplazado por su equivalente en el sistema binario, pero solo utilizando cuatro bits. En el gráfico 1.10 se muestra el valor BCD para cada dígito decimal.

Gráfico 1.10. Códigos BCD para cada dígito decimal

 

Dígito decimal

Formato BCD

0

00002

1

00012

2

00102

3

00112

4

01002

5

01012

6

01102

7

01112

8

10002

9

10012

Elaboración propia.

Si la cifra que se representará en BCD es mayor que 9, se tendrán que agregar cuatro bits más al código para representar dos cifras decimales. En otras palabras, si la cifra decimal tiene m dígitos, esta misma cifra tendrá 4xm bits en formato BCD.

Por ejemplo, la cifra 9512 se codifica en BCD de la siguiente manera: 10010101000100102. Esto es diferente del formato binario, ya que la cifra 9512 requiere 14 bits para su representación.

Aunque parezca sorprendente, la aritmética en el formato BCD no resulta muy sencilla para un sistema embebido, por lo cual, normalmente se deben operar las cifras en formato binario, y luego aplicar una técnica para realizar la conversión de base binaria a formato BCD.

1.1.7 El sistema de numeración ASCII

El formato ASCII (American Standard Code for Information Interchange) es un sistema de codificación binario empleado para representar caracteres en el alfabeto latino. Como se trata de un estándar estadounidense, este formato representa todos los caracteres usados en el idioma inglés. El formato ASCII actualmente se utiliza para que los sistemas embebidos puedan configurar diversos dispositivos, tales como pantallas LCD alfanuméricas, módems, cámaras digitales, etc. Inclusive, los lenguajes de programación incluyen dentro de su sintaxis la opción de interpretación de caracteres ASCII.

El estándar ASCII utiliza 7 bits para representar los caracteres del alfabeto latino. Existen otros caracteres extendidos que se obtienen al generar códigos de 8 bits y que permiten representar caracteres de los idiomas español o japonés.

Los primeros 32 caracteres del código ASCII son conocidos como «comandos de control». Estos cumplen con la función específica de configurar algunas opciones del texto sin imprimir ningún carácter en pantalla. Originalmente, el código ASCII fue usado para enviar información a dispositivos de texto, como teleimpresoras, pero ellos, al estar actualmente en obsolescencia, han dejado muchos de estos códigos sin una función útil. En el gráfico 1.11 se muestran los códigos ASCII para los caracteres de control. Los comandos que aparecen con un * son los que actualmente son utilizados en las diversas aplicaciones de los sistemas embebidos.

Gráfico 1.11. Códigos ASCII para los caracteres de control

 

Comando ASCII

Código hexadecimal

Función

NUL

0x00

Carácter nulo

SOH

0x01

Inicio de encabezado

STX

0x02

Inicio de texto

ETX

0x03

Fin de texto

EOT

0x04

Fin de transmisión

ENQ

0x05

Consulta

ACK