Clase Sistemas de Numeración - v2

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 35

MICROCONTROLADORES

Sistemas de Numeración
Universidad del Quindío
Introducción
¿Por qué es importante dominar los sistemas de numeración empleados en
electrónica digital?

Con los sistemas de numeración podemos representar la estructura de la información que


es almacenada en los sistemas digitales. Toda la información es almacenada en forma
binaria (Sistema en base 2).

¿Es posible identificar qué clase


de información contiene el
bloque?

Segmento de código
Para poder comprender la información allí almacenada, es indispensable dominar los
sistemas básicos de numeración como son: El sistema binario y el sistema hexadecimal.

Conocer la estructura de los sistemas de numeración y sus aplicaciones


Objetivo
Profundizar los conceptos mediante el diseño de funciones.
Sistema Binario
La información en un computador es almacenado en forma binaria, es decir, mediante
la representación de dos símbolos (0-1).

Mapa de memoria de un
Sistema hipotético

Cómo conocer el valor en


decimal o base 10
asumiendo que la
información es almacenada
sin signo ?

MSB LSB
𝑛𝑛

𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉 = � 𝑏𝑏𝑖𝑖 2𝑖𝑖 Donde 𝑏𝑏𝑖𝑖 : Corresponde a cada dígito binario


𝑖𝑖= −𝑝𝑝 𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑟𝑟: Corresponde al resultado en base 10
Sistema Binario

Convertir a base 10 el número binario:

Procedimiento: Identificar la posición 0 del número binario


𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉 = 1𝑥𝑥27 + 1𝑥𝑥24 + 1𝑥𝑥22 + 1𝑥𝑥21 + 1𝑥𝑥20 = 151

Conversión de un número en base 10 a binario

• Se realizan divisiones sucesivas por la base anotando el residuo de cada


operación
• Se repiten las divisiones hasta que el cociente sea menor que la base.
• Se forma el numero iniciando desde el cociente tomando todos los residuos
anteriores en sentido inverso.

Valores posicionales del sistema binario


Sistema Binario
151 ÷ 2 = 75 1
75 ÷ 2 = 37 1
37 ÷ 2 = 18 1
18 ÷ 2 = 9 0
9 ÷ 2 = 4 1
4 ÷ 2 = 2 0
2 ÷ 2 = 1 0

El número 151 en binario equivale a: 1 0 0 1 0 1 1 1

Ejercicio:

1. Convertir a binario el siguiente número: 249 1 1 1 1 1 0 0 1


2. Convertir a decimal el siguiente número: 11101011 235
Sistema Hexadecimal

Es el sistema compuesto por 16 símbolos divididos en: Números (0 - 9) y letras (A - F).


Este sistema es muy empleado para representar números grandes con pocos dígitos –
Ej. La memoria de datos de un PC

Representación de números hexadecimales:

0x123 Representación estándar


123h
Representación dependiendo del compilador
$123

Para representar un número hexadecimal en base 10 se utiliza la siguiente fórmula

𝑛𝑛

𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉 = � ℎ𝑖𝑖 16𝑖𝑖 Donde ℎ𝑖𝑖 : Corresponde a cada dígito hexadecimal


𝑖𝑖= −𝑝𝑝 𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑟𝑟: Corresponde al resultado en base 10
Sistema Hexadecimal
Ejemplo: Convertir el número 0x2CD a base 10

1. Procedimiento: Identificar la posición 0 del número hexadecimal


0x2CD Posición menos significativa
2. Aplicar la fórmula

𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉𝑉 = 2𝑥𝑥162 + 12𝑥𝑥161 + 13𝑥𝑥160 = 720

Para convertir un número de base 10 a base hexadecimal se realiza el mismo


procedimiento que al convertir un número en base 10 a base binaria. Se debe tener
en cuenta la base
Ejercicio: Convertir el numero 2043 a base hexadecimal
2043 ??????

0x7FB
Sistema Hexadecimal
Valores posicionales del sistema hexadecimal

¿Qué relación existe entre los valores posicionales del sistema hexadecimal frente a los
valores posicionales del sistema binario?

Conversión entre base binaria y base hexadecimal sin pasar por base 10
Pasar de binario a
hexadecimal
1 2 E 0x12E
Se agrupan de a 4 bits
Sistema Hexadecimal - Binario
Ejemplo: Convertir 0xF6AB a binario Tabla guía

F 6 A B
1111 0110 1010 1011

Ejemplo: Convertir 0xFF11 a binario

F F 1 1
1111 1111 0001 0001

Ejemplo: Convertir el número binario a


hexadecimal: 1101001011001100

1101 0010 1100 1100


D 2 C C El resultado es 0xD2CC
Operaciones aritméticas de números binarios (Suma y Resta)

Para llevar a cabo la suma entre números binarios tener en cuenta lo siguiente:

1. Las operaciones se realizan entre dos operandos


2. El tamaño de los dos operandos debe ser el mismo
3. Se realiza la suma de manera normal teniendo en cuenta el límite dado por la base

Ejemplo: Realizar la suma entre 171 y 67 Se convierte a binario

170 → 1 0 1 0 1 0 1 1
67 → 0 1 0 0 0 0 1 1
Base 10
𝟏𝟏 𝟏𝟏 𝟏𝟏 𝟎𝟎 𝟏𝟏 𝟏𝟏 𝟏𝟏 𝟎𝟎 237
1 1
0 0 0 0 0
1 1
1 0 1 0 1 0
0 1 1
0 1 0 0 0
01 01 01 11 10
01 00 01

No acarreo final
Resultado ???? Acarreo (Carry)
Operadores a nivel de bits
Los operadores a nivel de bits son: AND(&), OR(|), XOR(^),
NOT(~), desplazamiento a la izquierda (<<) y desplazamiento a la derecho (>>)

AND (&): Su salida es verdadera cuando ambos bits son verdaderos, falso
en caso contrario
Realizar la siguiente 0x3A6B & 0x00F3
operación:
0x3A6B 0011 1010 0110 1011
0x00F3 0000 0000 1111 0011
&
0x0063 0000 0000 0110 0011

OR (|): Su salida es falsa cuando ambos bits son falsos, verdadero en caso
contrario Realizar la siguiente 152 | 5
operación:

|
1001 1101 0x9D
Operadores a nivel de bits
XOR (^): Su salida es verdadera cuando ambos bits son diferentes, falso en
caso contrario.
Realizar la siguiente 0x6B ^ 0xF3
operación:
0x6B 0110 1011
0xF3 1111 0011 ^
0x98 1001 1000

La aplicación de la XOR se encuentra en los códigos de corrección de errores


Operadores a nivel de bits
NOT (~): Su salida es verdadera cuando su entrada es falsa, falso cuando
su entrada es verdadera.

Esta operador es la base del complemento a 2, operación


realizada para cambiar de signo un número entero.

Complemento a 2

Para aplicar complemento a 2 a un número se debe realizar el siguiente


procedimiento:
Ejemplo: Convertir el número 25 a -25
• Aplicar complemento a 1
Primero se convierte a binario: 8 bits
el cual es negar bit a bit el
número. 0001 1001 = 0x19

Complemento a 1: ~(0001 1001)


• Al resultado anterior sumar 1 1110 0110
para obtener el
Se suma 1: 1110 0110
complemento a 2. +1
-25 1110 0111 = 0xE7
Operadores a nivel de bits
Suponer que se tiene la siguiente declaración de variable: int valor = -75

Expresar en hexadecimal su representación en memoria.


Primero expresar el número en binario considerando que es positivo

¿Cuántos bits son necesarios 16


75 = 0000 0000 0100 1011
para expresar el valor?

Se saca el complemento a 1: ~(0000 0000 0100 1011)


1111 1111 1011 0100

Se suma 1: 1111 1111 1011 0100


+1
1111 1111 1011 0101 0xFFB5 = -75

¿De qué tamaño en bytes es la


variable valor?

Ejecución en C++ Builder 4 bytes


Operaciones aritméticas de números binarios (Suma y Resta)

Para llevar a cabo la resta entre dos operando se dice que es lo mismo que sumar el
negativo de un operando.

Ejemplo: Realizar la operación 5 - 3


+3 0000 0011
5 0000 0101
- 3 0000 0011
Complemento a 2
al sustraendo
1111 1100
+1
1111 1101 −3
La operación se convierte en: 5 + (-3) =
5 0000 0101
+ Resultado ???
−3 1111 1101
+2
𝟏𝟏 𝟎𝟎𝟎𝟎𝟎𝟎𝟎𝟎 𝟎𝟎𝟎𝟎𝟎𝟎𝟎𝟎

Si al hacer una suma en complemento a 2 (resta) y el valor da con acarreo, indica que el
resultado es positivo y el acarreo se ignora.
Si al hacer una suma en complemento a 2 (resta) y el valor da sin acarreo, indica que el
resultado es negativo. Para saber el verdadero resultado de la operación se debe sacar de
nuevo complemento a 2 a dicho resultado.
Representación de números con signo y sin signo

Determinación de la capacidad de almacenamiento de números sin signo:


positivos
Sin signo:
0 2𝑛𝑛 − 1
negativos positivos
Con signo:
2𝑛𝑛 −1 0 2𝑛𝑛−1 − 1

Donde n es la cantidad de bits que representa el número binario.

Por ejemplo: Número de 8 bits. Sin signo [0 / 255] y con signo [-128 / 127]
Número de 16 bits. Sin signo [0 / 65535] y con signo [-32768 / 32767]

Suponer que los números enteros son de 16 bits y se tiene la siguiente definición:

𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢 𝑖𝑖𝑖𝑖𝑖𝑖 𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣 = 82000; ¿Es posible definirlo? ¿Cuál es el valor real?

Convertimos el número a hexadecimal: 0𝑥𝑥14050

¿Cuántos bits posee? 17


Representación de números con signo y sin signo

Según el formato entero en uso, solo se puede almacenara 16 bits del número, por lo
tanto, el valor hexadecimal permitido es:

0𝑥𝑥4050 𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣 = 16464 ≠ 82000; ERROR DE


Llevado a decimal ASIGNACIÓN

Suponer la siguiente definición: 𝑖𝑖𝑖𝑖𝑖𝑖 𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣 = −50000;

Se convierte a binario asumiendo positivo: 1100 0011 0101 0000 0𝑥𝑥𝑥𝑥350


0011 1100 1010 1111
El verdadero valor de la variable +1
es -15536 y no -50000 15356;
0011 1100 1011 0000

A pesar que el valor 50000 está dentro del rango de 16 bits de representación de números
enteros, el valor -50000 está por fuera del rango que abarca positivos y negativos por lo
que el verdadero valor de la variable no es -50000 sino que corresponde a -15356.
Operadores a nivel de bits
Operador de desplazamiento (<< / >>)
Operador (<<): Desplazamiento hacia la izquierda
Sintaxis: valorEntero << cantidad_bits:
Ejemplo: Realizar la siguiente operación: 12 << 3
El valor entero se pasa a binario: 0000 1100 << 3 ?
Se desplaza el número 3 veces hacia la izquierda 0110 0000 = 96

Al desplazar un número hacia la izquierda se está efectuando una multiplicación


entre el número y 2 elevado la cantidad de bits a desplazar.

Operador (>>): Desplazamiento hacia la derecha


Ejemplo: Realizar la siguiente operación: 48 >> 4
El valor entero se pasa a binario: 0011 0000 >> 4 ?
Se desplaza el número 4 veces hacia la derecha 0000 0011 = 3

Al desplazar un número hacia la derecha se está efectuando una división entre el


número y 2 elevado la cantidad de bits a desplazar.
Operadores a nivel de bits
Ejemplo: Realizar una función que permita convertir un número entero en su
representación binaria. Tener en cuenta que el formato se compone de 16/32 bits

Planteamiento de la solución:
1. Realizando divisiones sucesivas y guardando el residuo de cada operación y el
cociente. Tener presente que el número debe ser escrito en orden inverso.

2. Analizar bit a bit el número a convertir y por intermedio de enmascaramiento


darnos cuenta el estado de cada bit, para de esta manera almacenar el resultado
en un arreglo.

Por ejemplo, se desea convertir a binario el número 125

Convertimos manualmente a binario el número anterior: 0111 1101


Analizamos bit a bit Enmascaramiento (&)
1. 0111 1101 2. 0111 1101 3. 0111 1101
0000 0001 & 0000 0010 & 0000 0100 &
0000 0001 0000 0000 0000 0100
Operadores a nivel de bits
4. 0111 1101 5. 0111 1101 6. 0111 1101
0000 1000 & 0001 0000 & 0010 0000 &
0000 1000 0001 0000 0010 0000

7. 0111 1101 8. 0111 1101


0100 0000 & 1000 0000 &
0100 0000 0000 0000

El operando 2 es un número diferente en cada revisión. Se puede notar


que la secuencia es dada por:

0000 0001 1 1<<0 ¿Se puede codificar


0000 0010 2 1<<1 esto en un ciclo? SI
0000 0100 4 1<<2
0000 1000 8 1<<3
0001 0000 16 1<<4 for(i=0;i<8;i++){
32 1<<5 op2 = 1<<i;
0010 0000
64 }
0100 0000 1<<6
1000 0000 128 1<<7

Codificación en C
Codificado con desplazamiento
Ejemplo
Prototipo: void intToBinary(unsigned int dato, char bin[]);
El valor binario se almacena en un arreglo tipo char
Programa principal
Ejemplo

Ejecución: Considerar que se desea convertir el numero 25 a binario

¿Corresponde al número 25 en binario? NO


¿Cuál es el error de la visualización? El número esta invertido

¿Cuál es la solución? Invertir el proceso


de revisión bit a bit
Ejemplo
El proceso invertido de revisión puede ser implementado de dos maneras:

Forma 1

Forma 2
Aplicaciones de los operadores a nivel de bits

Caso de análisis: Suponga que usted tiene una variable de 8 bits sin signo llamada <A>
cuyo valor inicial es el siguiente:

𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢 𝑐𝑐𝑐𝑐𝑐𝑐𝑐 𝐴𝐴 = 75; 𝐴𝐴 = 0100 1011


Binario

Objetivo: Modificar el bit 2 y 7 de la variable <A> y almacenar el nuevo resultado en <A>


escribiendo una línea de código.

𝐴𝐴 = 0100 1011 𝐴𝐴 = 𝟏𝟏100 1𝟏𝟏11

Procedimiento

1. Realizar las operaciones de forma escrita para tener un panorama visual.


2. Con la ayuda visual, escribir la línea de código que genere el cambio pedido.
Modificar primero un bit y luego modificar el otro!
Panorama 0100 1011
visual ¿Cuál es el valor del segundo operando y
que clase de operación se debe hacer?
0100 1111
Aplicaciones de los operadores a nivel de bits
0100 1011 𝐴𝐴
| 1≪2 A nivel de código 𝐴𝐴 = 𝐴𝐴 | 1 ≪ 2 ;
0000 0100
0100 1111

Ahora se continúa con el siguiente bit, partiendo del resultado parcial.


0100 1111 0100 1111 |
1000 0000 A nivel de código 𝐴𝐴 = 𝐴𝐴 | 1 ≪ 7 ;
1100 1111 1100 1111

Como las operaciones son conmutativas, pueden ser resueltas en diferente orden y escrita
en una sola línea de código:

𝐴𝐴 = 𝐴𝐴 ( 1 ≪ 2 (1 ≪ 7)); 𝐴𝐴 | = 1≪2 (1 ≪ 7));

Caso de análisis: Suponga que usted tiene una variable de 8 bits sin signo llamada <B>
cuyo valor inicial es el siguiente:
𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢𝑢 𝑐𝑐𝑐𝑐𝑐𝑐𝑐 B = 255; B= 1111 1111
Binario
Aplicaciones de los operadores a nivel de bits

Objetivo: Modificar el bit 0 y 3 de la variable <B> y almacenar el nuevo resultado en <B>


escribiendo una línea de código.

Panorama 1111 1111


¿Cuál es el valor del segundo operando y
visual que clase de operación se debe hacer?
1111 1110

1111 1111 1111 1111


& B= B & ~ 1 ≪ 0 ;
0000 0001 1111 1110 1111 1110
Negación
1111 1110

Se repite el procedimiento para el siguiente bit:


1111 1110 1111 1110 1111 1110
&
0000 1000 1111 0111 1111 0111
1111 0110 Negación
1111 0110
Se puede escribir la expresión en una sola línea: B= B & ~ 1 ≪ 3 ;
B= B & ~ 1 ≪ 0 (1 ≪ 3)); B & = ~ 1 ≪ 0 (1 ≪ 3));
Aplicaciones de los operadores a nivel de bits
Ahora suponemos que dentro de una palabra de 8 bits se encuentran grupos que tienen
relación entre si, por ejemplo, a figuras geométricas y su respectivo color, por ejemplo:

𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣 = 10011010 Color

Tabla para el color


No importa (don’t care)
Figura

Puede ser definido como una enumeración o lista de


constantes

enum{NEGRO,ROJO, CAFÉ,AMARILLO,…};

Tabla para la figura Pueden ser tratado como constantes definidas

#define CIRCULO 0
#define CUADRADO 1
#define RECTANGULO 2
#define ELIPSE 3
Aplicaciones de los operadores a nivel de bits
Objetivo: Almacenar en la variable <valor> el respectivo comando para que identifique la
figura como una elipse de color violeta, es decir, la palabra final sería:

𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣 = 11011101 Color violeta

Elipse
¿Cómo sería el procedimiento a ejecutar?
1. Iniciar con un grupo en particular, por ejemplo, el color

La estrategia más apropiada para modificar una cierta cantidad de bits que representan un
grupo en particular es resumida en los siguientes pasos:

a. Definir una máscara (mask): Una máscara es un valor que contiene 1’s en los bits del
grupo respectivo

#define MASK_COLOR 0x07 -> 111

b. Definir un desplazamiento (shift): Es una variable que indicar la posición del grupo en
la variable
#define SHIFT_COLOR 0
Aplicaciones de los operadores a nivel de bits

c. Con el valor de la mascara y el desplazamiento, se debe poner en 0’s los bits del grupo a
analizar
valor = 1101 0000 Ceros en los bits del grupo

valor = valor & ~(MASK_COLOR << SHIFT_COLOR);

d. Una vez los bits del grupo están en cero, se puede concatenar el nuevo valor solicitado

valor = 1101 0101 Color violeta en el grupo

valor = (valor & ~(MASK_COLOR << SHIFT_COLOR)) | (VIOLETA << SHIFT_COLOR);

2. Continuar con el siguiente grupo de bits. Definición de máscara y desplazamiento.

#define MASK_FIGURA 0x03 -> 11


#define SHIFT_FIGURA 6

a. Cero en los bits valor = valor ~(MASK_FIGURA << SHIFT_FIGURA);


Aplicaciones de los operadores a nivel de bits

b. Concatenación del nuevo valor en el grupo:

valor = valor ~(MASK_FIGURA << SHIFT_FIGURA) | (ELIPSE << SHIFT_FIGURA);

En resumen:

valor = (valor & ~(MASK_COLOR << SHIFT_COLOR)) | (VIOLETA << SHIFT_COLOR);


valor = valor ~(MASK_FIGURA << SHIFT_FIGURA) | (ELIPSE << SHIFT_FIGURA);

Ejemplo: Los microcontroladores AVR posee internamente un conversor analógico – digital


(ADC) y para configurarlo se debe configurar unos registros en particular. Por ejemplo, el
registro ADMUX permite seleccionar el canal de lectura, la referencia del voltaje y la
justificación del resultado.

Referencia de voltaje Canal


Justificación del resultado
Aplicaciones de los operadores a nivel de bits
Implementar tres funciones que permitan asignar un valor de referencia específico, que
permita controlar la justificación del resultado y que permita asignar un canal de lectura.

Tabla de selección de referencia


ADLAR = 0: Justifica el resultado hacia la
derecha

ADLAR = 1: Justifica el resultado hacia la


izquierda

El prototipo de las funciones es dado por:


void setReference(unsigned char ref); Fija la referencia
void setResult(unsigned char jus); Justifica el resultado
void setChannel(unsigned char ch);
Asigna el canal
El primer paso es definir las constantes respectivas para las máscaras y desplazamiento de
cada grupo.

Observación: Cuando el grupo es dado por un solo bit no hay necesidad de definir
máscaras y desplazamientos.
Aplicaciones de los operadores a nivel de bits
Definición de constantes:
Referencias
#define REF_AREF 0 void setReference(unsigned char ref)
#define REF_AVCC 1 {
#define REF_RESERVADO 2 ADMUX = (ADMUX & ~(REF_MASK << REF_SHIFT)) |
#define REF_2_56V 3 (ref << REF_SHIFT);
}
#define REF_MASK 0x03
#define REF_SHIFT 6

Mascaras para canales void setChannel(unsigned char ch)


{
ADMUX = (ADMUX & ~(CHANNEL_MASK << CHANNEL_SHIFT)) |
#define CHANNEL_MASK 0x1F
(ch & CHANNEL_MASK);
#define CHANNEL_SHIFT 0
}

Justificación
void setResult(unsigned char jus)
#define LEFT 0 {
#define RIGHT 1 if(jus == RIGHT)
ADMUX &= ~(1<<ADLAR);
else
ADMUX |= (1<<ADLAR);
}
Aplicaciones de los operadores a nivel de bits
Con las funciones implementadas, escribir un programa que permita configurar el conversor
analógico a digital para trabajar a una referencia de voltaje interno a 2.56V, justificado a la
izquierda y leer el canal 5. Escriba una función que imprima en pantalla el valor binario del
registro.

Cuál es el valor en el registro ADMUX?


Aplicaciones de los operadores a nivel de bits

Ejercicio: El microcontrolador AVR posee un módulo de interrupciones externas para


atender eventos digitales, para ese propósito se debe configurar un registro llamado
MCUCR que posee la siguiente información.

don’t care y no se necesitan para la


activación de la interrupción externa INT 1 INT 0

Escriba una función que


permita configurar una
determinada interrupción

Defina las constantes


necesarias y el prototipo de
la siguiente función.
Aplicaciones de los operadores a nivel de bits
Prototipo de la función:

void setInterrupt(unsigned char nInt, unsigned char type);


LOW
EXTINT0
nInt type CHANGE

EXTINT1 FALLING

RISING

Escriba una función principal que muestre en pantalla el valor del registro MCUCR cuando
se necesita configurar la interrupción 1 por flanco de bajada (FALLING).

También podría gustarte