Sistemas de controle - Robotizado
Sistemas de Numeração, Codificação e Organização de Dados
1. Sistemas de Numeração:
Desde tempos remotos o homem utiliza a escrita para registrar e transmitir
informação. A escrita vai do antigo hieróglifo egípcio até o alfabeto latino atual.
O alfabeto, como conjunto de símbolos, se desenvolve originalmente na Grécia e
posteriormente em Roma e constitui a origem de nosso alfabeto atual.
Uma das primeiras tentativas de registro de quantidades sob a forma escrita foi o
sistema de numeração indo-arábico, do qual são derivados os atuais sistemas de numeração
decimal.
Sistema de numeração é o conjunto de símbolos utilizados para representação de
quantidades e as regras que definem a forma de representação. Um sistema de numeração é
determinado fundamentalmente pela base (número de símbolos utilizados). A base é o
coeficiente que determina qual o valor de cada símbolo de acordo com a sua posição.
Muitos sistemas modernos de computação não representam valores numéricos
usando o sistema decimal. Em vez disso, eles simplesmente usam o binário ou o sistema de
numeração de complemento de dois. Para entender as limitações da aritmética do
computador, você deve entender como os computadores representam os números.
1.1
Uma Revisão do Sistema Decimal:
Você já deve ter utilizado o sistema decimal (base 10) por tanto tempo que
provavelmente o acha muito natural. Quando você vê um número como "123", você não
pensa sobre o valor 123; ao contrário, você gera uma imagem mental de quantos itens este
valor representa. Na realidade, contudo, o número 123 representa:
+
+
1
2
3
Centena
Dezenas
Unidades
Ou seja:
123
10
1 10
2
2 10
1
3 10
0
Cada dígito aparecendo à esquerda do ponto decimal (ou da virgular, conforme a
preferência) representa um valor entre 0 e 9 que multiplica uma potência positiva de base
dez.
De modo semelhante, dígitos aparecendo à direita do ponto decimal representam
um valor entre 0 e 9 que multiplica uma potência negativa de base dez.
Por exemplo, o valor 123,456 significa:
123,45610
1 10 2
2 101
3 10 0
4 10
1
5 10
2
6 10
3
Ou seja:
100 + 20 + 3 + 0.4 + 0.05 + 0.006 = 123,456 10
1.2
O Sistema de Numeração Binário
Muitos dos modernos sistemas de computação (incluindo o IBM PC e seus
descendentes) operam utilizando a lógica binária. O computador representa valores
utilizando dois níveis de tensão elétrica (geralmente 0v e +5v). Com esses dois níveis nós
podemos representar exatamente dois valores. Esses podem ser quaisquer dois valores, mas
por convenção utilizamos os valores zero e um, ou seja, o sistema de numeração binário
possui apenas dois algarismos: 0 e 1. Por isso a sua base é dois (base 2 dois dígitos).
Assim, o sistema de numeração binário funciona exatamente como o sistema
decimal, com duas exceções:
O sistema binário permite apenas os dígitos 0 e 1 (e não 0-9);
O sistema binário utiliza potências de dois, o que é diferente das
potências de dez.
Cada algarismo ou digito binário é chamado de bit. Este termo “bit” tem origem na
contração de duas palavras inglesas “binary digit”, ou seja digito binário.
Então, é muito fácil converter um número em binário para decimal, pois vale as
mesmas regras:
Cada bit aparecendo à esquerda do ponto decimal representa um valor entre 0 e 1
que multiplica uma potência positiva de base dois.
De modo semelhante, dígitos aparecendo à direita do ponto decimal representam
um valor entre 0 e 1 que multiplica uma potência negativa de base dois..
Por exemplo, o valor binário 110010,1 representa:
110010,12
1 25 1 2 4
16
0 23
110010,12
32
0
Ou seja:
110010,1 2 = 50,5 10
0 22
0
1 21
2
0 20 1 2
0
1
0,5
1.2.1 Conversão de números em decimal para números em binário
Para converter números em decimal para binário é um pouco mais difícil. Para
números em base 10 inteiros podemos seguir a seguinte técnica:
Toma-se o número decimal a ser convertido para binário e procede-se sucessivas
divisões por 2, com quocientes inteiros, e restos que poderão ser 0 ou 1. Divide-se
sucessivamente por 2, até obtermos um quociente igual a zero. O valor convertido
corresponde aos restos das divisões sucessivas, sendo que o último resto obtido é o
algarismo mais significativo do numero binário.
Exemplo: Converte 25210 para binário:
252
MENOS
0
SIGNIFICATIVO
2
126
0
2
63
2
31
1
2
15
1
2
7
1
2
3
1
2
1
1
2
0
1
MAIS SIGNIFICATIVO
Ou seja:
252 10 = 11111100 2
Muitas calculadoras cientificas fazem essas operações de conversão entre bases
numéricas, usando a função (modo) Bin Dec ou Dec Bin, mas a maioria delas só aceita
trabalhar com números binários e decimais inteiros para tais conversões.
A fim de conferir se o resultado da conversão exemplificada anteriormente está
realmente correto, podemos tirar uma prova de seu resultado, fazendo a reconversão:
bit 7
27
bit 6
26
bit 5
25
bit 4
24
bit 3
23
bit 2
22
bit 1
21
bit 0
20
1
1
1
1
1
1
0
0
1.2
7
128
1.2
64
6
1.2
32
5
1.2
16
4
1.2
8
3
1.2
4
2
0.2
0
1
0.2
0
2
0
=
252 10
Uma outra técnica pode ser utilizada, e que é de fato a técnica mais usada pelos
profissionais mais experimentados na manipulação de números binários. Com a prática,
está técnica se torna mais rápida que a técnica de divisão sucessiva por dois. È necessário
apenas estar bem familiarizado com a potencia de base dois.
Exemplo: Suponhamos que desejamos converter o número 1257 10 para binário.
Vamos escrever então uma série de potência de base dois, que termine na maior
potências de dois (2n) que pode ser subtraída do número decimal o qual deseja-se
converter, desde que o resultado da diferença seja igual ou maior que zero.
211
210
29
28
27
26
25
24
23
22
21
20
2048
1024
512
256
128
64
32
16
8
4
2
1
maior potências de dois que
ao ser subtraída de 1257
resultando em uma diferença
maior ou igual a zero
A diferença
é positiva
1257 10 – 1024 10 = 233 10
Então, fazemos a operação de subtração:
Uma vez realizada esta operação, assinalar o valor “1” na posição 210, como sendo
o algarismo mais significativo do número convertido;
1024 512
2
10
2
9
256
2
8
128
2
7
64
32
16
8
4
2
1
6
5
4
3
2
1
20
2
2
2
2
2
2
1
Caso a diferença tivesse sido igual a zero, nós deveríamos agora assinalar o valor
“0” para cada uma das potências de base dois imediatamente inferior (29; 28; 27, e assim
sucessivamente até atingir 20);
Mas caso resto um saldo de diferença, ou seja, uma diferença maior que zero, e que
neste caso é de 233 10, assim, devemos ir buscar na nossa série a próxima potência de base
dois imediatamente inferior, que no caso é 29, e tentar subtraí-la do saldo com a condição
de que o resultado da diferença seja igual ou maior que zero. Assinalar o valor “1” para o
caso dessa operação de subtração poder ser realizada, caso contrário assinalar “0”;
Bem, como a potência de base dois imediatamente inferior é 29, ou seja, 512 10,,
assim não é possível subtraí-la de 233 10, sem que o resultado fique negativo. Então não
vamos realizar esta subtração: vamos assinalar “0” e vamos prosseguir para a próxima
potência de base dois imediatamente inferior.
1024 512
210
29
1
0
256
128
64
32
16
8
4
0
0
28
27
26
25
24
23
22
21
20
Então damos uma olhada na nossa série e constatamos que a potência de base dois
imediatamente inferior é no caso 28, ou seja 256 e devemos tentar subtraí-la do saldo,
desde que o resultado da diferença seja igual ou maior que zero. Assinalar o valor “1” para
o caso dessa operação de subtração poder ser realizada, caso contrário assinalar “0”;
Como 256 10 é superior a 233 10, não fazemos a subtração, assinalamos “0” e
prosseguimos para a próxima potência imediatamente inferior.
1024 512
256
10
2
9
2
1
0
0
2
8
128
2
7
64
32
16
8
4
2
1
6
5
4
3
2
1
20
2
2
2
2
2
2
A próxima potência de dois é 27 ou 128 10. Então, fazemos a operação de subtração:
233 10 – 128 10 = 105 10
Uma vez realizada esta operação, assinalar o valor “1” na posição 27, e prosseguir
para a próxima potencia de dois.
1024 512
256
128
64
32
16
8
4
2
1
26
25
24
23
22
21
20
210
29
28
27
1
0
0
1
Assim sucessivamente, prosseguimos testando a possibilidade de subtrair ou não o
valor da potência de dois do saldo restante e assinalando “1” se for possível subtrair e “0”
se não for possível subtrair, até alcançarmos a última posição, que no caso é 20., ou seja 1.
Assim, para o número decimal 1257, temos por fim o seguinte resultado:
1024
512
256
128
64
32
16
8
4
2
1
210
29
28
27
26
25
24
23
22
21
20
1
0
0
1
1
1
0
1
0
0
1
Para tirarmos a prova, basta somar todos os valores em decimal de cada uma das
potências de dois que foram assinalados por “1” na série:
Assim:
1024 + 128 + 64 + 32 + 8 + 1 = 1257
Números binários, embora tenham pequena importância em linguagens de alto
nível, aparecem por toda parte em programas em linguagem assembly.
1.2.2 Formatos Binários
Na verdade, todo número binário é formado por um número infinito de dígitos (ou
bits). Por exemplo, podemos representar em binário o número decimal 5 por:
Qualquer número de bits de valor zero pode
preceder o número binário sem alterar o seu valor total.
101
ou
00000101
ou
0000000000101
ou
Adotamos a convenção de ignorar quaisquer zeros
à esquerda. Por exemplo, o valor 1012 representa em
000000000000101
binário o número decimal cinco. Uma vez que os
microprocessadores e microcontroladores funcionam com grupos de bits, também
chamados barramentos de dados, com tamanhos que variam: 8 bits, 16 bits, 32 bits, etc, é
muito conveniente completar com zeros para estender todos os números binários para
algum de quatro ou oito bits. Então, seguindo esta convenção, representaremos o número
cinco como 01012 ou 000001012.
As pessoas, principalmente aquelas que estão trabalhando com números contábeis,
acostumaram-se a separar cada três dígitos com um ponto (ou uma virgula) para tornar
números grandes mais fáceis de ler. Por exemplo, 6.203.435.208 é muito mais fácil de ler e
compreender do que 6203435208. Adotaremos uma convenção similar nesta apostila para
números binários. Separaremos cada grupo de quatro bits binários com um espaço. Por
exemplo, o número binário 1010111110110010 será escrito 1010 1111 1011 0010.
O bit mais à direita em um número binário é o bit da posição zero (X0), e a cada bit
à esquerda tem o valor de índice incrementado de 1 sucessivamente.
Um valor binário de oito bits usa os bits de zero a sete:
X7 X6 X5 X4
X3 X2 X1
X0
Um valor binário de 16 bits usa as posições de zero até quinze:
X15 X14 X13 X12
X11 X10 X9 X8
X7 X6 X5 X4
X3 X2 X1 X0
O Bit mais à direita, X0, geralmente é referido como o “bit menos significativo”
(LSB – Less Significant Bit). O bit mais à esquerda é tipicamente chamado de alta ordem
(MSB – Most Significant Bit). Iremos nos referir aos bits intermediários pelos seus
respectivos números de índice.
1.3
O Sistema de Numeração Hexadecimal
Um grande problema com o sistema binário é a verbosidade. Para representar o
valor 128 10 em binário requer oito algarismos ou bits. A forma decimal requer apenas três
dígitos decimais e, assim, representa números muito mais compactamente do que o sistema
binário de numeração o faz.
Este fato não foi esquecido pelos engenheiros que desenvolveram os sistemas de
computadores binários. Quando tratam de valores grandes, números binários rapidamente
tornam-se pesados. Infelizmente, os computadores pensam em binário, então na maior
parte do tempo é conveniente utilizar o sistema binário de numeração.
O sistema de numeração hexadecimal (base 16) é bastante conveniente para
resolver esse problema, pois este sistema oferece duas características que procuramos:
São muito compactos;
É fácil convertê-los para binário e vice-versa.
Por causa disso, muitos dos sistemas de computação binários passaram a usar o
sistema hexadecimal de numeração. Uma vez que a base de um número hexadecimal é 16,
cada dígito à esquerda do ponto hexadecimal representa algum valor vezes uma potência
sucessiva de 16.
Por exemplo, o número 1234 16 (hexadecimal) é igual à:
16 3
4096
1
1 . 16 3
16 2
256
2
2 . 16 2
16 1
16
3
3 . 16 1
16 0
1
4
4 . 16 0
4096
512
48
4
16
= 4660 10
Cada dígito hexadecimal pode representar um dos dezesseis valores entre 0 e 15.
Assim precisamos de 16 símbolos para representar os algarismo hexadecimal.
Usaremos para isso os mesmos símbolos usados no sistema decimal (0, 1, 2, ... , 9)
e, já que há apenas dez símbolos de dígitos decimais, precisamos “inventar” seis dígitos
adicionais para representar os valores no intervalo de 10 até 15. Ao invés de criar novos
símbolos para esses dígitos, usaremos as letras A até F, sendo A=10; B=11; C=12; D=13;
E=14 e F=15, respectivamente.
Exemplo de número hexadecimal válido: 2F5C 16 = 15964 10
16 3
4096
2
2 . 16 3
8192
16 2
256
F
15 . 16 2
7680
16 1
16
5
5 . 16 1
80
16 0
1
C
12 . 16 0
12
16
= 15964 10
Na maioria dos computadores não podemos entrar um subscrito para denotar o
valor da base de um número associado. Uma vez que freqüentemente precisaremos entrar
com números hexadecimais em um computador, vamos precisar de uma convenção
diferente para representar os números em hexadecimal. Em programação assembly é
bastante comum a seguinte convenção:
Todo valor numérico começa com um símbolo decimal;
Todo valor hexadecimal termina com a letra "h" – Ex: 2F5Ch ;
Todo valor binário termina com a letra "b" – Ex:
1010 0110b;
Números decimais podem ter um sufixo "t" ou "d".
1.3.1 Conversão de Números Binários
Hexadecimal
Como você pode ver, números em hexadecimal são compactos e fáceis de ler. Além
disso, você pode facilmente converter entre hexadecimal e binário e vice versa. Considere
o seguinte exemplo de número binário:
10111110110100 2
Para convertermos de binário para hexadecimal procedemos a seguinte técnica:
Dividimos o número binário em grupamentos de 4 bits a partir do bit menos
significativo: 10 1111 1011 0100 2 e tratamos cada grupamento como se fosse um
número isoladamente:
21
1
20
0
23
1
22
1
21
1
20
1
23
1
22
0
21
1
20
1
23
0
22
1
21
0
20
0
1.2
0
1.8
1.4
1.2
1.1
1.8
0
1.2
1.1
0
1.4
0
0
2
2
15
F
11
B
4
4
2
16
10 1111 1011 0100 2 = 2FB4 16
Assim:
Já para convertermos de hexadecimal para binário procedemos a seguinte técnica:
Cada dígito hexadecimal deve gerar um grupo de 4 bits. Considere o seguinte
exemplo de número hexadecimal: 7D8 16
7
7
D
13
8
8
16
23
22
21
20
23
22
21
20
23
22
21
20
8
4
2
1
8
4
2
1
8
4
2
1
0
1
1
1
1
1
0
1
1
0
0
0
2
Portanto, 7D8 16 = 111 1101 1000 2
Considere também tabela a seguir, tabela, para
facilitar a tarefa de conversão Binário / Hexadecimal:
Esta tabela fornece toda a informação que você
precisa para converter qualquer número hexadecimal em
um número binário e vice-versa. Compare isto com a
dificuldade da conversão entre decimal e binário ou
decimal e hexadecimal!
Já que a conversão entre hexadecimal e binário é
uma operação que você precisará efetuar repetidamente,
você deveria gastar alguns minutos e memorizar a tabela
ao lado. Mesmo se você tiver uma calculadora que fará a
conversão para você, descobrirá que a conversão manual
será muito mais fácil e conveniente quando tiver que
converter entre binário e hexadecimal.
Binário
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Hexadecimal
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
1.3.2 Conversão de Números Decimais para Hexadecimais
Para converter em decimal para hexadecimal é um pouco mais difícil. Para
números em base 10 inteiros podemos seguir a seguinte técnica:
Toma-se o número decimal a ser convertido para hexadecimal e procede-se
sucessivas divisões por 16, com quocientes inteiros, e restos que poderão variar entre 0 e
15. Divide-se sucessivamente por 16, até obtermos um quociente igual a zero. O valor
convertido corresponde aos restos das divisões sucessivas, sendo que o último resto obtido
é o algarismo mais significativo do numero hexadecimal.
Exemplo: Converte 523710 para hexadecimal:
5237
MENOS
5
SIGNIFICATIVO
16
327
7
16
20
4
16
1
1
16
0
MAIS SIGNIFICATIVO
Ou seja:
5237 10 = 1475 16
Para convertermos números em hexadecimal para decimal, podemos simplesmente
decompor o número em hexadecimal numa série de potências de base dezesseis. O
algarismo menos significativo do número hexadecimal é associado a base dezesseis de
expoente zero (160) e para cada algarismo a esquerda, incrementa-se em 1 o expoente da
base.
Exemplo: Converter 3FC16 para a base decimal:
162
161
160
256
16
1
3
F
C
3
15
12
3 . 256
15 . 16
12 . 1
768
240
12
Portanto:
1.4
16
1020 10
3FC16 = 102010
O Sistema de Codificação BCD
A conversão de um número decimal no seu equivalente binário é chamada
codificação. Um número decimal expresso como um código binário ou número binário.
como foi apresentado até aqui, é conhecido como código binário puro. Usamos este nome
para diferenciá-lo de outros tipos de códigos binários usados em computadores. Destes
outros código, o mais aplicado é o código BCD.
1.4.1 O Código BCD 8421:
O código BCD é uma forma de representação decimal, ou seja, é um sistema de
representação dos algarismos decimais de 0 até 9 com um código binário de 4 bits. A
diferença entre representar um número decimal em código binário puro e em BCD é que,
ao usarmos o código binário puro convertemos “o valor do número decimal” e, por sua
vez, quando usamos o código BDC convertemos, na verdade, “cada algarismo do número
decimal” em binário.
O código BCD mais tradicional é o BCD 8421, que usa o sistema de pesos
posicionais 8421 do código binário puro. Como exemplo, velamos como fica o número
decimal 97, quando convertido para os dois casos:
Conversão Decimal
BCD 8421
Conversão Decimal
Binário Puro
9
1001
7
0111
97
0110 0001
Se compararmos os dois resultados de conversão, constatamos grande diferença,
pois: 1001 0111 0110 0001 .
Para reconverter (decodificar), diferente do que fazemos na conversão de código
binário puro para decimal, e semelhante ao que fazemos na conversão de código binário
puro para hexadecimal, precisamos primeiro, dividir o binário BCD em grupos de quatro
bits, a partir da direita e só então, podemos converter os código BCD em seus equivalentes
decimais, gerando algarismo por algarismo decimal, simplesmente somando os pesos das
posições de bits onde aparece 1 (veja abaixo a tabela de peso binário). O usual código 8421
BCD e os equivalentes decimais são mostrados na outra tabela.
Tabela de Peso Binário
Decimal 23 (8) 22 (4) 21 (2) 20 (1)
0
0
0
0
0
1
0
0
0
1
2
0
0
1
0
3
0
0
1
1
4
0
1
0
0
5
0
1
0
1
6
0
1
1
0
7
0
1
1
1
8
1
0
0
0
9
1
0
0
1
DECIMAL
0
1
2
3
4
5
6
7
8
9
10
Observe que cada dígito decimal é
representado pelo seu código BCD 8421
equivalente de quatro bits. Convém deixar
sempre um espaço entre cada grupo de 4 bits
para evitar confusão do formato BCD com o
código binário puro. Este método de
11
12
13
14
15
BCD 8421
BINÁRIO
0000
0000
0001
0001
0010
0010
0011
0011
0100
0100
0101
0101
0110
0110
0111
0111
1000
1000
1001
1001
0001 0000
1010
0001 0001
1011
0001 0010
1100
0001 0011
1101
0001 0100
1110
0001 0101
1111
representação também se aplica às frações decimais.
Como exemplo, convertemos o número BCD no seu equivalente decimal:
0110 0010 1000,1001 0101 0100 = 628,954
O código BCD simplifica a interface o ser humano e a máquina, mas é menos
eficiente que o código binário puro. Usam-se mais bits para representar um dado número
decimal em BCD que em notação binária pura.
1.4.2 Outros Códigos de 4 bits:
Existem diversos códigos de 4 bits além do código BCD natural (8421), alguns são
códigos BCD diferente do BCD natural, com diferentes correspondências de valores
binários para cada algarismo decimal, como por exemplo o BCD Excesso-3, BCD 2421
(ou BCD Aiken), e BCD 5421. O importante código Gray, que não é um código do tipo
BCD, também é um código de 4 bits muito importante.
Decimal
0
1
2
3
4
5
6
7
8
9
BCD
8421
(Natural)
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
Excesso-3 ou BCD 2 4 2 1
Código de
Código
Stibitz
Aiken
0011
0000
0100
0001
0101
0010
0110
0011
0111
0100
1000
1011
1001
1100
1010
1101
1011
1110
1100
1111
BCD
5421
Código
Gray
0000
0001
0010
0011
0100
1000
1001
1010
1011
1100
0000
0001
0011
0010
0110
0111
0101
0100
1100
1101
O código BCD Aiken é um código semelhante ao código BCD natural, no entanto
com "pesos" ou "valores" diferentemente distribuídos. No BCD natural, os pesos são: 8-42-1, Aiken distribuição de código é: 2-4-2-1. A
razão para essa codificação é conseguir uma
0 0000
9 1111
adequada simetria complementar no conjunto dos
valores binários que codificam os algarismos
1 0001
8 1110
decimais, de modo que um binário somado ao seu
complemento resulte sempre em 9. Analise a
2 0010
+ 7 1101 9
tabela a seguir.
3 0011
6 1100
O código Aiken é muito útil para subtração
e divisão e ainda é utilizado em relógios digitais,
4 0100
5 1011
calculadoras e outros dispositivos semelhantes.
O código Excesso-3 (XS-3) é também um código binário para codificação de
decimal, conhecido ainda como código de Excesso-N, que segue o mesmo princípio de
conversão de BCD natural, considerando o número decimal algarismo por algarismo, e
convertendo estes para binário, deferindo deste por incrementar 3 unidades ao resultado
binário de cada algarismo decimal.
Para codificarmos, por exemplo, o número decimal 127, nós codificamos
simplesmente cada um dos dígitos decimais resultando em: 0100 0101 1010.
A principal vantagem da codificação XS-3 sobre codificação BCD é que um
número decimal pode ser complementado de 9 (por subtração) tão facilmente como um
número binário pode ser complementado de 1, bastando inverter todos os bits.
A adição em XS-3 trabalha em um algoritmo diferente da adição de codificação
BCD ou da adição da codificação binária pura. Quando adicionamos dois números XS-3, o
resultado não é um número XS-3. Por exemplo, quando você adiciona 1 e 0 em XS-3, a
resposta parece ser de 4 em vez de um. Para corrigir esse problema, quando você terminar
de adicionar cada dígito, você tem que subtrair 3 (binário 0011) se o dígito decimal for
inferior a 10 e adicionar 3 se o número decimal for igual ou superior a 10 (acondicionando
o número).
Já o código Gray é um sistema de código binário onde de um número para outro
apenas um bit varia. Para que ele seja cíclico e mantenha a característica mencionada é
necessário se usar todas as 16 variações de 4 bits. Daí o fato dele não ser tratado como uma
codificação do tipo BCD.
Este sistema de codificação surgiu quando os circuitos lógicos digitais se
realizavam com válvulas termiônicas, para evitar problemas de ruídos e retardos de
comutação e, atualmente, ele tem uma aplicação toda especial com dispositivos
eletromecânicos e ópticos, como os transdutores de posição “encoders”. O disco de leitura
óptica de um encoder absoluto, produz erro de leitura quando vários bits modificavam-se
simultaneamente na variação de uma posição angular para outra posição vizinha. Tal erro
resulta do fato de alguns bits variarem antes de outros. O uso do código Gray garantiu que
qualquer mudança variaria apenas um bit, além do que, encoders rotativos se beneficiam
da natureza cíclica dos códigos Gray, porque os valores da primeira e última posição da
seqüência da seqüência também diferem apenas por um bit.
O código Gray tem muitas aplicações interessantes como por exemplo em
algoritmos genéticos, algoritmo de torre de Hanói, elaboração de mapas de Karnaugh,
correção de erros em comunicação digital, Robótica, formação de ciclo Hamiltoniano em
um hipercubo, etc.
Propriedades
⇒ Palavras adjacentes variam apenas 1 bit
⇒ Cíclico
⇒ Refletido
⇒ Bit mais significativo é igual ao código binário natural
Método tabular de conversão
A maneira mais fácil de construir a tabela de conversão base 10 para
gray é usar um espelho. Começando no bit de índice 0, escrevemos o
bit 0 e 1. Em seguida, aplicamos um espelho ao conjunto {01}, ficando o
bit 0 com a seguinte ordenação {0110}. Agora, a primeira metade dos
bit's do índice 1 tomam o valor 0, e a outra metade o valor 1. O bit
seguinte obtém-se aplicando o 'espelho' a todos os bits anteriores.
Algumas vantagens de se usar codificação BCD são:
Muitos valores não-inteiros, como o decimal de 0,2, por exemplo, têm uma
representação de valor de posições infinita em binário (0,001100110011 ...) mas
tem um valor de posições finito em decimal codificado binário (0,0010).
Conseqüentemente, um sistema de frações decimais baseadas em BCD, evita erros
de representação e de cálculo de tais valores;
Escala por um fator de 10 (ou uma potência de 10) é simples, isto é útil quando um
fator de escala decimal é necessário para representar uma quantidade não-inteira
em calculadoras científicas e financeiras.
O arredondamento em um limite de dígitos decimais é mais simples. Adição e
subtração em decimal não necessita de arredondamento.
O alinhamento de dois números decimais (por exemplo 1,3 + 27,08) é feito de uma
maneira simples, com deslocamentos exatos.
A conversão para uma forma caractere ou para exibição (por exemplo, para um
formato baseado em texto, como XML, ou acionar os sinais para um display de sete
segmentos) é um mapeamento simples, por dígitos e pode ser feito em tempo linear.
Conversão de binário puro envolve uma lógica relativamente complexa que
abrange dígitos, e para um número grande nenhum algoritmo de conversão de
tempo linear é conhecido.
Desvantagens:
O padrão BCD requer quatro bits por dígito decimal, o que significa a necessidade
de cerca de 20% a mais de espaço de armazenamento do que uma codificação
binária pura. Quando acondicionados de modo que três dígitos decimais são
codificados em dez bits, a sobre-necessidade de armazenamento é reduzida para
cerca de 0,34%, à custa de uma codificação que se encontra em desarranjo com os
limites padronizados de bytes de 8-bits comuns nos hardwares existente, resultando
em implementações mais lentas nesses sistemas .
Algumas operações são mais complexas de se implementar. Circuitos somadores
lógicos, por exemplo, exigem lógica extra, algo em torno de 20% a mais de
circuito, se comparado ao emprego do binário puro, para levá-los a envolver e a
gerar o bit de carry em tempo. A multiplicação, por sua vez, requer o uso de
algoritmos que são um pouco mais complexos do que a desloca, carrega e soma (é
necessária uma multiplicação binária que exige deslocamentos binários e adições,
que são feitas por dígitos ou por grupo de dígitos)
Implementações práticas existentes de operações de BCD são tipicamente mais
lentas do que as operações em representações binárias, especialmente em sistemas
embarcados, devido ao suporte limitado dos processadores para as operações
nativas em BCD.
1.5
Organização de Dados:
Na matemática pura um número binário qualquer pode assumir um número
arbitrário de bits. Computadores, por outro lado, geralmente trabalham com alguns
grupamentos de tamanho de números específicos de bits. Coleções comuns são bits
simples, grupos de quatro bits (chamados Nibbles), grupos de oito bits (chamados Bytes),
grupos de 16 bits (chamados Words) e outros.
Os tamanhos dos grupamentos não são arbitrários. Há uma boa razão para esses
valores particulares de tamanho de grupamento. Esta seção descreverá os grupos de bits
mais comumente utilizados nos chips dos microcontroladores e microprocessadores.
1.5.1 Bits
A menor "unidade" de dado em um computador binário é um bit sozinho. Uma vez
que um único bit é capaz de representar apenas dois diferentes valores (geralmente zero ou
um) você pode ter a impressão de que há um número bem pequeno de itens que você possa
representar com um único bit. Não é verdade! Há um infinito número de itens que você
pode representar com um simples bit.
Com um único bit, você pode representar quaisquer dois itens distintos. Exemplos
incluem "zero ou um", "verdadeiro ou falso", "ligado ou desligado", "macho ou fêmea",
"certo ou errado", "sim ou não", etc. Contudo, você não está limitado a representar tipos de
dados binários (isto é, aqueles objetos que tem apenas dois valores distintos).
Você poderia utilizar um único bit para representar os números 723 e 1245. Ou
talvez 6254 e 5. Você poderia também utilizar um único bit para representar as cores
vermelha e azul. Poderia até mesmo representar dois objetos não relacionados com um
único bit. Por exemplo, você poderia representar a cor vermelha e o número 3256 com um
único bit. Você pode representar quaisquer dois diferentes valores com um simples bit.
Contudo, pode representar apenas dois valores diferentes com um bit.
Para “confundir” ainda mais, diferentes bits podem representar diferentes coisas.
Por exemplo, um bit poderia ser utilizado para representar os valores zero e um, enquanto
um bit adjacente poderia ser utilizado para representar os valores verdadeiro e falso. Como
você pode dizer apenas olhando estes bits? A resposta, é claro, é que você não pode. Mas
isto ilustra toda a idéia por trás das estruturas de dados em computadores: dados são o que
você define que eles sejam.
Se você usa um bit para representar uma variável booleana (verdadeiro / falso)
então aquele bit (pela sua definição) representa verdadeiro ou falso. Para o bit ter qualquer
significado verdadeiro, você deve ser consistente. Isto é, se você está utilizando um bit
para representar verdadeiro ou falso em um determinado ponto de um programa, você não
poderá (ou melhor, não deverá) utilizar o valor verdadeiro / falso armazenado naquele bit
para depois representar vermelho ou azul, em outro ponto do programa.
Uma vez que muitos itens que você tentará modelar necessitarão de mais de dois
valores diferentes, valores de simples bits não serão o mais popular tipo de dado que você
utilizará. Contudo, já que todo o resto consiste de grupos de bits, os bits desempenharão
uma importante função em seus programas. É claro, há muitos tipos de dados que
requerem dois valores distintos, então parecerá que bits sejam muito importantes nestes
casos. Contudo, em breve veremos que bits individuais são difíceis de manipular, então
freqüentemente utilizaremos outros tipos de dados para representar valores booleanos.
1.5.2 Nibbles
Um Nibble é uma coleção de quatro bits. Ele não seria uma estrutura de dados de
especial interesse exceto por dois itens: os números representados em código BCD (Binary
Code Decimal) e números em hexadecimais. Tomam-se grupos de quatro bits para
representar um único dígito em código BCD ou um algarismo em hexadecimal. Com um
Nibble, podemos representar até 16 valores distintos. No caso de números decimais, os
valores 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E e F são representados com quatro bits. BCD
utiliza dez dígitos diferentes (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) e requer quatro bits. De fato,
quaisquer 16 valores distintos podem ser representados com um Nibble, no entanto os
dígitos em hexadecimal e em código BCD são os itens primários que nós podemos
representar com um único Nibble.
1.5.3 Byte
Sem dúvida, a mais importante estrutura de dados utilizada pelos
microcontroladores e microprocessadores é o Byte. Um Byte consiste de oito bits e é o
menor item de dado endereçável na maioria dos microcontroladores e microprocessadores.
As locações da memória principal e os endereços de E/S são todos dados em Bytes. Isto
significa que o menor item que pode ser individualmente acessado por um programa de um
sistema com microprocessador / microcontrolador é um valor de 8 bits. Para acessar algo
menor requer que você leia o Byte que contém o dado e remova os bits indesejados. Os bits
em um Byte são normalmente numerados de zero a sete utilizando a convenção mostrada
abaixo:
bit 7
27
bit 6
26
bit 5
25
bit 4
24
bit 3
23
bit 2
22
bit 1
21
bit 0
20
X7
X6
X5
X4
X3
X2
X1
X0
Bit 0 é o bit de mais baixa ordem ou bit menos significativo, e o bit 7 é o bit de
mais alta ordem ou mais significativo do Byte. Referiremos a todos os outros pelos seus
números.
Note que um Byte também contém exatamente dois Nibbles:
bit 7
27
bit 6
26
bit 5
25
bit 4
24
bit 3
23
bit 2
22
bit 1
21
bit 0
20
X3
X2
X1
X0
Y3
Y2
Y1
Y0
Os bits Y0 até Y3 compreendem o Nibble de baixa ordem (menos significativo), os
bits X0 até X3 formam o Nibble de alta ordem (mais significativo). Como um Byte contém
exatamente dois Nibbles, valores de Byte requerem dois dígitos em hexadecimal.
Uma vez que um Byte contém oito bits, ele pode representar 28, ou 256 valores
diferentes. Geralmente, utilizaremos um Byte para representar valores numéricos no
intervalo de 0 a 255, ou então números num sistema sinalizado no intervalo -128 a 127,
códigos de caracteres ASCII / IBM e outros tipos de dados especiais que não requerem
mais do que 256 valores diferentes. Muitos tipos de dados têm bem menos do que 256
itens então oito bits geralmente são suficientes.
Já que a maioria dos microcontroladores e microprocessadores são máquinas
endereçáveis por Bytes, é mais eficiente manipular todo um Byte do que um bit individual
ou um Nibble. Por esta razão, muitos programadores utilizam um Byte inteiro para
representar tipos de dados que não requerem mais do que 256 itens, mesmo que menos de
8 bits fossem suficientes. Por exemplo, freqüentemente representamos valores booleanos
verdadeiro e falso por 00000001 e 00000000 (respectivamente).
Provavelmente o mais importante uso para um Byte é guardar o código de um
caractere. Caracteres digitados no teclado, exibidos na tela e impressos na impressora são
na verdade referidos dentro dos sistemas de processamento digital por valores numéricos.
Para permitir a comunicação com o resto do mundo o IBM PC usa uma variante do
conjunto de caracteres ASCII. Há 128 códigos definidos no conjunto de caracteres padrão
ASCII / IBM. Este código utiliza ainda os outros 128 valores restantes para códigos de
caracteres estendidos incluindo caracteres Europeus, símbolos gráficos, letras Gregas e
alguns símbolos matemáticos, etc.
1.5.4 Word
Uma Word (palavra) é um grupo de 16 bits. Numeraremos os bits em uma Word
começando do zero e indo até o quinze. A numeração dos bits aparece abaixo:
bit
15
215
bit
14
214
bit
13
213
bit
12
212
bit
11
211
bit
10
210
bit
9
29
bit
8
28
bit
7
27
bit
6
26
bit
5
25
bit
4
24
bit
3
23
bit
2
22
bit
1
21
bit
0
20
X15 X14 X13 X12 X11 X10
X9
X8
X7
X6
X5
X4
X3
X2
X1
X0
Semelhante ao que acontece como Byte, o bit 0 é o de baixa ordem (menos
significativo) e o bit 15 é o de alta ordem (mais significativo). Quando referenciamos os
outros bits em uma Word usamos o número de suas respectivas posições.
bit
15
215
bit
14
214
bit
13
213
bit
12
212
bit
11
211
bit
10
210
bit
9
29
bit
8
28
bit
7
27
bit
6
26
bit
5
25
bit
4
24
bit
3
23
bit
2
22
bit
1
21
bit
0
20
X7
X6
X5
X4
X3
X2
X1
X0
Y7
Y6
Y5
Y4
Y3
Y2
Y1
Y0
Note que uma Word contém exatamente dois Bytes. Os bits X0 a X7 formam o Byte
de baixa ordem, os bits Y0 a Y7 formam o Byte de alta ordem:
Naturalmente, uma Word pode ser quebrada em quatro Nibbles como mostrado
abaixo:
bit
15
215
bit
14
214
bit
13
213
bit
12
212
bit
11
211
bit
10
210
bit
9
29
bit
8
28
bit
7
27
bit
6
26
bit
5
25
bit
4
24
bit
3
23
bit
2
22
bit
1
21
bit
0
20
P3
P2
P1
P0
Q3
Q2
Q1
Q0
R3
R2
R1
R0
S3
S2
S1
S0
O Nibble zero (S0 até S3) é o Nibble de baixa ordem (menos significativo) na Word
e o Nibble três (P0 até P3) é o de alta ordem (mais significativo). Os outros dois Nibbles são
o Nibble um (R0 até R3) e Nibble dois (Q0 até Q3).
Com 16 bits, você pode representar 216 (65536) valores ou itens diferentes. Esses
podem ser valores no intervalo 0 a 65535, ou de -32768. até +32767, para um sistema
sinalizado ou qualquer outro tipo de dado com não mais do que 65536 valores ou itens. Os
três maiores usos para Words são valores inteiros, deslocamentos e valores de segmentos.
Words podem representar valores inteiros no intervalo de 0 a 65535 ou de -32768 a
32767 em um sistema sinalizado. Valores numéricos sem sinal são representados por
valores binários correspondendo aos bits na Word. Valores numéricos com sinal usam a
forma de complemento de dois para valores numéricos. Valores de segmentos, os quais são
sempre de 16 bits de comprimento, constituem o endereço do parágrafo de um segmento
de código, dado, extra ou pilha na memória.
NOTA:
O termo Word (palavra) é utilizado também, de uma forma geral, para
designar a um grupamento de n bits qualquer (depende do processador ou do
sistema de código usado). Por exemplo, os primeiros microprocessadores
eram de quatro bits e a esse grupamento de quatro bits também chamamos
de palavra binária, O Código ASCII, como vimos, representa símbolos
alfanuméricos, podendo representá-los em grupamentos de sete bits ou, se
estendido, de oito bits – a ambos esses grupamentos podemos também, de
forma genérica, chamarmos de palavra binária.
1.5.5 Double Word
Uma Double Word é exatamente o que seu nome indica, um par de Words. Então,
uma quantidade de Double Word é de 32 bits de comprimento como mostrado abaixo:
31
23
15
7
0
Naturalmente, esta Double Word pode ser dividida em duas Words, sendo uma de
alta e outra de baixa ordem. Pode também ser dividida em quatro Bytes ou oito Nibbles:
Double Words podem representar todo tipo de diferentes coisas. Primeiro e
principalmente é usada para guardar endereços segmentados. Um outro item comum
representado com um Double Word é um valor inteiro de 32 bits (o qual permite números
sem sinal em um intervalo de 0 até 4.294.967.295 ou números com sinal em um intervalo
de -2.147.483.648 até 2.147.483.647).
Valores de ponto flutuante de 32 bits também cabem dentro de uma Double Word.
Muitas das vezes, usaremos Double Words para guardar endereços segmentados.
OBS:
Dado
Elementos distintos de uma informação;
Informação
Coleção de dados representada de forma compreensível ao ser
humano.
Download

Cap_0_Aula_ Sistemas_Numeracao_Robotica