Hola amigos
Hoy quiero explicar la relación de términos de sistemas aritméticos como los on por ejemplo el sistema binario, el casi no usado octal, hexadecimal, y lo que son los valores que puede asumir un dígito en cada uno de estos sistemas, el margen de valores que resulta como consequencia de lo anterior y finalmente implicaciones para aquellos que quieren programar soluciones, donde el contador, también conocido como Timer es requerido. El reloj o temporizador es la fuente de los ticks que impulsan el controlador. Sigue un ejemplo y explica porque existen Timer de 8 y 16 bits en los controladores e informaciones del asimplicaciones en otros campos.
Todo aque que entienda de que demonios estoy hablando en este primer párafo puede dejar de leer esto, porque ya lo sabe todo! El objetivo por lo tanto es darles aquellos conocimientos que os permitan entender lo dicho!
Empiezo por los sistemas aritméticos con foco en su relevancia en la electrónica digital:
Hay que empesar explicando que todos los sistemas aritméticos basan en la expresión:
X = A^B
Unos ejemplos:
2^0=1
2^1=2
2^2=4
2^3=8
2^4=16
2^5=32
2^6=64
2^7=128
2^8=256
Aquí A se llama “Base” y B se llama “Exponente”
Por lo tanto el sistema aritmético que usamos a diario, el sistema métrico, tiene la base = 10.
10^1= 10
10^2=100.
Los nombres de los sistemas aritméticos reflejan el número de permutaciones que existen en el sistema para un dígito. Quiero explicar el significado de permutación para así poder usarlo de ahora en adelante.
Permutacion se llama la gama de valores posibles, en nuestro caso de un dígito. Ejemplo, el sistema binario, se llama así, pues tiene 2 posibles permutaciones de un dígito, el “0” y el “1”.
Pasemos ahora a nmbrar algunos de los sistemas aritméticos y listar las permutaciones que tiene cada uno de estos:
Sistema binario, 2 permutaciones, “0” y “1”
Sistema octal, 8 permutaciones, “0”, “1”, “2”, “3”, “4”, “5”, “6” y “7”
Sistema decimal, 10 permutaciones, me ahoro listarlas
Sistema hexadecimal, 16 permutaciones, “0” a “9” y “A”, “B”…”F”
Pasemos ahora a como se implementan sistemas aritméticos no binarios en el entorno de la electrónica digital que solo conoce el sistema binario y porque ciertos sistemas aritméticos son usados en la electrónica digital y en todo lo que a ordenadors y controladores se refiere.
El sistema binario es lo único que hoy en día conocen los circuitos electrónicos a nivel de la hardware, hay tensión aplicada, por ejemplo 5V, lógicamante es un “1”, no hay tensión y hablamos del “0”. Si ahora queremos ver el contenido de un registro en un controlador de 16 bit, entonces la representación binaria es: “0000 0000 0000 0000”
Como pueden ver he escrito los 16 bits de un registro en bloques de 4 bits, pues es mucho mas facil de leer que si los escribiría en un solo bloque, donde no podría estar seguro sin un estricto control que no me he olvidado de un bit o si he escrito uno demas. Así puedo indicar una de las razones, por las cuales el sistema aritmético hexadecimal es tan usado en la electrónica digital. Esos 4 bits por eso tienen un nombre propio, así como el “Bit” es el nombre para cada dígito binario, el “nibble” es el nombre para grupos de 4 bits! Un registro de 8 bits por lo tanto consiste de 2 nibbles y uno de 16 bits de 4 nibbles.
Ahora usamos el término recién aprendido de las “permutaciones”. Los 4 bits de un nibble tienen 16 permutaciones posibles a las cuales a cada permutación se les asigna un dígito del sistema aritmético hexadecimal!
“0000” equivale “0” hexadecimal equivale decimal “0”
“0001” equivale “1” hexadecimal equivale decimal “1”
“0010” equivale “2” hexadecimal equivale decimal “2”
“0011” equivale “3” hexadecimal equivale decimal “3”
“0100” equivale “4” hexadecimal equivale decimal “4”
“0101” equivale “5” hexadecimal equivale decimal “5”
“0110” equivale “6” hexadecimal equivale decimal “6”
“0111” equivale “7” hexadecimal equivale decimal “7”
“1000” equivale “8” hexadecimal equivale decimal “8”
“1001” equivale “9” hexadecimal equivale decimal “8”
“1010” equivale “A” hexadecimal equivale decimal “10”
“1011” equivale “B” hexadecimal equivale decimal “11”
“1100” equivale “C” hexadecimal equivale decimal “12”
“1101” equivale “D” hexadecimal equivale decimal “13”
“1110” equivale “E” hexadecimal equivale decimal “14”
“1111” equivale “F” hexadecimal equivale decimal “15”
Como pueden ver, los números árabes solo conocen 10 dígitos diferentes, así el sistema hexadecimal usa las letras de “A” a “F” para poder representar los dígitos adicionales. También es facil de ver cuanto mas facil es representar cualquier permutación binaria usando el sistema hexadecimal, aquí el ejemplo del registro de 16 bits en representación hexadecimal:
“00 00” o “h00 00”, donde la “h” nos dice que es un sistema hexadecimal, una “b” nos diría que es un sistema binario! El contenido del registro en el sistema binario es: “b0000 0000 0000 0000”
Ahora vemos que un byte con el valor “0” podemos representarlo en una de estas formas:
b0000 0000 representación binaria
h00 representación hexadecimal o abreviado “hex” de un byte que contiene 8 bits.
El sistema octal tendría 8 permutaciones para lo que bastan 3 bits como pueden ver arriba. Ya que esta representación que usa 3 bits no tiene mucha aplicación práctica este sistema existe pero no es muy usado.
Pero he usado este ejemplo para dar el paso a explicar la importancia del número de bits de un controlador, de un registro y de un contador!
Un controlador de 8 bits, como lo son los famosos, ya legendarios Z80, 8051 y 6800, implementa todas sus funciones internas paralelizando 8 unidades. Significa que los registros son de 8 bits, pero tendrá algunos de 16 bits, ya explicaré porque, los buses por llamarlos las carreteras de datos internas, son de 8 carriles, uno para cada uno de los 8 bits. Todo interno está adaptado a processar 8 bits al tiempo. Usemos este ejemplo por ser mas sencillo por consistir de menos bits, pero lo que diré se puede aplicar directamente a todos los otros controladores, sean de 16 bits, de 32 bits o de 64 bits como son procesadores en los oderenadores mas modernos!
El número decimal mas grande que puedo expresar usando 8 bits es “d256” (sistema aritmético decimal!). Si quiero expresar también números negativos, entonces solo puedo expresar números entre “-128” y “+127”. Esto son 256 valores diferentes, el límite de los 8 bits! Porque difiere el número decimal negativo del positivo? Pues no hay que olvidar el “0”, así tenemos 128 valores negativos y 128 valores positivos incluyendo el “0”! Para explicarlo hay que decir que cuando una variable o constante en un programa es de 8 bits, del tipo “byte”, y que se define de poder contener valores negativos, esto es así! En el caso de nuestra tabla arriba con los 16 valores de un nibble, que se muestra en la representación binaria, entre la mitad superior y la inferior son identicas con excepción del primer dígito binario a la izquierda. La mitad superior, de “0” a “7” tiene el primer bit a la izquierda con el valor “0” y la otra mitad con el valor “1”. Así se ha determinado arbitrariamente , que la primera mitad de datos es positiva y la segunda negativa.
Pero que es el efecto de esto? Es que ya es imposible representar un valor decimal de “d128” a “d255” en un solo byte, lo que es posible si solo represento valores positivos!
La solución es usar múltiples bytes, en este caso 16 bits. Pero ya aparece el segundo problema! Como vemos en la representación binaria de la tabla grande de arriba los bits que representan los números hexadecimales o decimales van aumentando de la derecha a la izquierda! Esto se denómina en inglés como “most significant bit” o “least significan bit”! Siendo la expresión “most” indicativo que se trata en nuestra tabla con los bits a la izquierda siendo los mas significativos, o para decirlo en otras palabras, representan un valor mayor, y viceversa para “least”!
Esta relación se expresa como “big endian”. Pero también puede ser al reves, siendo el orden de la izquierda a la derecha? Esto puede ser de la una u otra forma, aunque con los bits creo que siempre es como lo represento, pero en algun sitio de la hoja de datos el dato puede aparecer, en especial si es “little endian”!
Aquí un ejemplo donde si es de muy alta importancia, porque difiere, es en el orden de los bytes! Los sistemas de Windows son “little endian” los de Linux con frequencia “big endian”. Y aquí llegamos otra vez al hilo rojo de este mensaje. En los Atmel rije el sistema “big endian” significa que si un registro es de 2 bytes, entonces el byte a la izquierda se usa para los valores grandes y el de la derecha para los valores pequenos.
Aquí el ejemplo:
“h80 01”, “b1000 0000 0000 0001” “d32769” y el valor
“h00 01”, “b0000 0000 0000 0001” “d1” y el valor
“hFF FF”, “b1111 1111 1111 1111” “d65535” 0 64k!
En este sistema “big endian” el byte a la izquierda es el para los digitos grandes. En el sistema “little endian” es al reves habiendo que representar los bytes como sigue:
“h01 80” para el valor decimal “d32769” “little endian” y “h80 01” en “big endian”.
Como pueden ver los compiladores esconden muchos de estos detalles de nosotros los programadores, pero en ciertas operaciones hay que saber de esto y en especial programando en assembler o muy cercano a la hardware lo que es el caso en nuestros usos!
Indiqué arriba que la representación decimal de la representación hexadecimal “hFF FF” equivale a “d65.535” y que esto se puede también escribir como “64k”. Aquí entra otro de los trucos del marketing, en especial en lo relacionado a la capacidad de discos duros!
El truco viene de la diferencia en valores decimales de “1k” en términos del marketing y de la realidad en los ordenadores! 1k en expresión decimal representa “1.000” unidades, en representación de los ordenadores que basan en el sistema binario es 2^10=1024 unidades. El marketing por lo tanto divide el número de posiciones de memoria en un disco duro por 1000 y expresa la capacidad del disco en kbytes, cuando dejamos el sistema operacional del ordenador decirnos cuanta memoria hay disponible el ordenador lo divide por 1024 resultando en una capacidad inferior a la declarada por el vendedor del disco duro como capacidad después de formar el disco duro! Así para motivo de promoción el disco parece mas grande de lo que realmente es sin que el vendedor mienta! Ven como en la vida diaria esta materia aparentemente tan seca y exótica se confronta con nosotros en lo diario!
Habiendo así pasado al tema de la capacidad o del alcanze de los números según el sistema aritmético que se usa y del número de bnits o bytes disponibles, pasemos al caso del contador o “Timer” en los controladores, que se volverá importante al momento de crear, usar la función de “PWM” en un variador electrónico o para decodificar la señal de la receptora!
Un contador de 8 bits solo puede contar de “0” a 255” y entonces vuelve a empesar por “0”.
Un contador de 16 bits puede contar de “0” a “ 65536” y entonces vuelve a empesar por “0”.
Estos númerales expresan el número de permutaciones posibles, de valores posibles y depende directamente del número de bits disponibles para expresar un número cualquiera, pero estando limitado al valor máximio posible! Para darles una idea:
Imaginemosnos un contador de 8 bits y una velocidad del temporizador del controlador de 16MHz. El controlador recibirá 16.777.216 clicks del temporizador y estos se aplican al contador. Dividimos este número por 256, el número de permutaciones del contador de 8 bits y nos da 65.536. Este es el número de veces que el contador vuelve a empesar a contar desde “0”, o cada 0,015 milésimas de un segundo el contador vuelve a iniciarse!
Ahora lo mismo con un contador de 16 bits y un temporizador de 16Mhz. Dividimos 16.777.216 por 65.536, el número de permutaciones de un contador de 16 bits, y el resultado es 256! O sea que cada approx. 4 milésimas de segundo el contador vuelve a contar de “0”!
Otra forma de decirlo, el contador 8 bits se vuelve a iniciar 256 veces cuando el contador de 16 bits a contado una sola vez de 0 hasta el máximo!
Un ejemplo donde veremos en forma breve donde esto es relevante en los programas de la tarjeta experimental. Ss cuando medimos la longitud del impulso de control de un servo del receptor del radio control. Este impulso tiene, según la posición del stick de control de la emisora una valor entre 1 milésima de segundo y 2 milésimas de segundo para cada canal de la receptora y esto se repite cada 20 milisegundos! Esto significa que con el temporizador andando a 16Mhz el contador de 16 bits vuelve a reiniciarse 5 veces en el período de 20 ms! Del contador de 8 bits ni hablemos, este lo hara 1280 veces en 20 ms o de 320 a 640 veces durante el impulso de un solo canal!
Pero el tema de las permutaciones posibles dependiendo del número de bits disponibles, también tiene importancia en las posibilidades de usar memoria en un controlador o en un ordenador.
Un controlador de la primera generación de 8 bits solo puede tener 256 direcciones diferentes de memoria a las cuales puede acceder usando un registro de 8 bits como dirección. Esto ya en los primeros tiempos de los controladores fue totalmente insuficiente, por lo que los controladores Z80 o 8051, los prcesores de todos los procesadores de Intel hasta el día de hoy se implemento un sistema y en los de Motorola con el 6800 uno diferente!
Los controladores Z80 8051 y similares realizaron un concepto de segmentación. Segmentos son subdiviciones. Muchos recordarán que los primeros controladores y ordenadores basados en estos solo podían usar 64kbytes de memoria, el número de permutaciones posibles con 16 bits, 2^16=64k.
Para esto se usa el truco de combianr 2 registros de 8 bits a uno de 16 bits. Pero así el controlador tenía que leer 2 direcciones de la memoria para cargar una dirección, lo que mínimo reduce la velocidad de ejecución de programas y del acceso a un dato en la memoria por el divisor 2, toma el doble de tiempo. Entonces para poder manejar operaciones mas rápidas los Z80 usan los segmentos que tienen tal tamaño que se puede acceder a una posición de memoria con solo leer un byte. El Byte de mas valor, recuerden lo de “big endian” y “little endian”, se usa para seleccionar un segmento y una posición de esta memoria dentro del segmento con el segundo byte, logrando así doblar la velocidad de ejecución de los programas sin perder la posiblidad depoder acceder 64k de direciones posibles. Con el tiempo el tamaño de estos segmentos aumentó hasta que finalment dejaron de existir. Pero este método de4 segmentos también se utilizó para crear segmentos explícitos para aceder portales y registros del controlador y así beneficiarse de la velocidad mucho mas alta. Esto en Inglés se llama I/O memory space, o segmento de memoria para entraas y salidas.
El problema que esta técnica implica es que el compilador en el caso de lenguas como Basic y C siempre tenía que verificar que el destino de la dirección que desea acceder este dentro del segmento actual y tiene que interumpir la ejecuación del programa para cambiar al segmento adecuado. Esto aún hace los controladores mas lentos.
Motorola con los 6800 y posteriores implementó la memoria en 16 bits, y así tambien lo hacen los Atmel y PICs pudiendo acceder toda la memoria con un acceso, pero permitiendo por programación inteligente beneficiarse de segmentos virtuales con sentencias especiales y así tener la misma ventaja de velocidad que los controladores del tipo Z80.
Bueno, se que es mucha información y pesada,pero es un mensaje que permite estudiarse si el tema de los sistemas aritméticos y de las permutaciones de un contador resultan siendo un tema, lo que lo serán definitivamente!
Terminología y Conceptos en el contexto de la Electrónica
- Hellmut1956
- Miembro Leal
- Mensajes: 1305
- Registrado: Sab Nov 29, 2008 2:06 pm
- Ubicación: Mammendorf, Alemania
Sistemas aritméticos y su importancia
--------------------
Saludos Hellmut
Saludos Hellmut