Aplicações: Conversão de Códigos e Motor de Passo
Aplicação 1 Conversão de Código ASCII para Hexadecimal Alguns periféricos, tais como Teclados Alfa-numéricos, Monitores de Vídeo, Displays de Cristal Líquido, comunicam-se usando o código ASCII (American Standard Code for Information Interchange) Como toda a operação (lógica ou aritmética) realizada pelo Microcontrolador é feita em Binário, e nós utilizamos a representação Hexadecimal para facilidade de interpretação, se for usado um teclado ASCII para entrada dos dados deve-se proceder à conversão de ASCII para Hexadecimal. 2
Supondo, por exemplo, que se queira inserir números Hexadecimais através do Teclado do PC conectado via RS232 com um Microcontrolador 8051 e utilizar esses dados para deslocar um Motor de passo de um número fixo de passos. Valores Hexadecimais possíveis: 00 a FF O Teclado gera códigos ASCII para todos os números, letras, sinais gráficos e comandos, de acordo com a Tabela ASCII. 3
Teclado ASCII Se o usuário quiser inserir em uma aplicação qualquer um código Hexadecimal (um byte), via Teclado ASCII. Por exemplo 3F 3F (00111111) Digita 3 Teclado gera 33h (00110011), ASCII do dígito 3 Digita F Teclado gera 46h (01000110), ASCII do dígito F Como transformar os dois códigos digitados (33h e 46h) em apenas um byte Hexadecimal (3F) que é o correspondente ao valor digitado pelo usuário? 4
Duas possibilidades: 1. Ou o dígito é um número ( 0 a 9 ) 2. Ou o dígito é uma letra (A a F) Número 0 1 2 3 4 5 6 7 8 9 30h 31h 32h 33h 34h 35h 36h 37h 38h 39h Letra A B C D E F 41h 42h 43h 44h 45h 46h 5
Digitado no Teclado 3 F Códigos ASCII Gerados 33 46 3F 33 46 Logo, 33h para ser decodificado para seu valor 3h 33h 30h = 3h e, 46h para ser decodificado para seu valor Fh 46h 37h = Fh Ou seja, se o valor digitado for um número basta subtrair 30h do código ASCII e, se o valor digitado for uma letra basta subtrair 37h do código ASCII 6
O primeiro dígito é o MSB e seu resultado hexadecimal gerado é 03h O segundo dígito é o LSB e seu resultado hexadecimal gerado é 0Fh Logo, no exemplo, para montar o caractere (MSB LSB) deve-se rotacionar o MSB de 4 posições e fundir (OU lógico) com o LSB. 03 30 MSB OR 0F LSB 3F 00110000 00001111 00111111 7
Conversão ASCII-HEXA de um dígito Sub-rotina CONV O dígito ASCII entra pelo Acumulador 8
Conversão ASCII-HEXA de dois dígitos Converte o MSB Troca os nibles Converte o LSB Funde (OR) os dois bytes gerando apenas um hexadecimal 9
10
11
Aplicação 2 Conversão de Hexadecimal para Código ASCII Como toda operação (lógica ou aritmética) realizada pelo Microcontrolador é feita em Binário, e nós utilizamos a representação Hexadecimal para facilidade de interpretação, se for usado um Display ou um Monitor de Vídeo ASCII para saída dos dados deve-se proceder à conversão de Hexadecimal para ASCII. 12
Microcontrolador ASCII 33 46 Hexadecimal 3F (00111111) Conversor A/D 13
Hexadecimais possíveis (8 bits): de 00 a FF Se for um dígito numérico 0 ---- 9 deve-se somar 30h para se obter o ASCII equivalente entre 30h --- 39h Se for uma letra A ---- F deve-se somar 37h para se obter o ASCII equivalente entre 41h --- 46h Como não existem valores hexadecimais impossíveis de serem representados em ASCII, não é necessário adicionar nenhum filtro. 14
Conversão HEXA-ASCII de um dígito Sub-rotina CONV2 15
Exemplo O conteúdo do Acumulador contém o código 3F Hexadecimal (8 Bits) que deverá ser enviado para o monitor de vídeo em ASCII, para ser visualizado. Logo, 3F 03 + 30h 33h 0F + 37h 46h Deve-se, então, dividir o byte em dois com o valor dos dois nibles posicionados na parte menos significativa de cada um, zerando-se o nible mais significativo de cada byte. 16
Conversão HEXA-ASCII de dois dígitos O valor em Hexadecimal entra pelo Acumulador. Ex: A = 3Fh Os valores dos dois dígitos em ASCII saem em: R0 = LSB Ex: R0 = 46h A = MSB Ex: A = 33h 17
18
19
Aplicação 3 Conversão de Hexadecimal para BCD BCD Decimal Codificado em Binário Neste exemplo será utilizado sempre o BCD Packed (ou BCD 8421), cuja representação de 2 dígitos BCD é realizada com apenas 1 Byte. 20
Conversão de Hexadecimal para BCD Decimal Hexa 00 00 01 01 02 02 03 03 04 04 05 05 06 06 07 07 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 08 08 09 09 10 0A 11 0B 0 0 0 0 1 0 0 1 Logo, se o número Hexa estiver entre 0A e 13, soma-se 1x06 12 0C 13 0D 14 0E 15 0F 16 10 0 0 0 1 0 0 0 0 21
Se o número hexa estiver entre 14 e 1D soma-se 2x06 14+06=1A+06=20 15+06=1B+06=21 16+06=1C+06=22 17+06=1D+06=23 18+06=1E+06=24 19+06=1F+06=25 1A+06=20+06=26 1B+06=21+06=27 1C+06=22+06=28 1D+06=23+06=29 Decimal Hexa 17 11 18 12 19 13 20 14 21 15 22 16 23 17 24 18 25 19 26 1A 27 1B 28 1C 29 1D 30 1E 31 1F 32 20 33 21 34 22 35 23 36 24 Logo, se o número Hexa estiver entre 0A e 13, somase 1x06 11+06=17 12+06=18 13+06=19 Se o número estiver entre 1E e 27 soma-se 3x06 1E+06+06+06=30 1F+06+06+06=31 20+06+06+06=32 21+06+06+06=33 22+06+06+06=34 22
O algoritmo pode ficar bastante complexo seguindo este raciocínio. O 8051 possui uma instrução que faz o Ajuste Decimal do Acumulador DA A Esta instrução somente deve ser utilizada quando a operação realizada anteriormente foi com números BCD. Exemplo: 19 + 1 = 1A DA A 20 A instrução não opera corretamente onde isto não acontece. Exemplo: 1F + 1 = 20 DA A 26 23
Algoritmos para conversão Hexa-BCD Algoritmo_1: 1. Entrar com o número Hexadecimal a ser convertido em R0 2. Inicializar um contador BCD em Zero 3. Decrementar R0 até zero e simultaneamente incrementar o contador BCD 4. Quando o valor do número Hexadecimal chegar em zero, o Acumulador terá realizado o mesmo número de contagens em BCD O maior número hexadecimal de dois dígitos que pode ser convertido é o : 63h = 99 em BCD 24
Este exemplo não testa se o número Hexadecimal a ser convertido é menor que 63h, o que deve ser feito externamente no programa principal. 25
Algoritmo_2: 1. Dividir o número Hexadecimal (8 BITS), a ser convertido, por 10 (0Ah) 2. O resultado da divisão gera um número BCD unpacked, com o MSB no Acumulador e o LSB no registrador B 3. Transformar o BCD unpacked para BCD packed (8421) 09 09 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 99 1 0 0 1 1 0 0 1 26
Exemplo: Programa que gera um Contador BCD na Porta P1, de 00 a 99, continuamente retornando a zero. 27
Aplicação 4 MOTOR DE PASSO Step Motor Define-se MOTOR DE PASSO como um atuador incremental eletromagnético. 28
Definição prática: O Motor de Passo converte pulsos digitais de entrada em movimentos angulares em seu eixo. 29
Características importantes Deslocamento angular diretamente proporcional ao número de pulsos de entrada. Erro angular por passo pequeno ( 5% do passo) e não acumulativo. Possibilita trabalho em malha aberta. Capacidade de trabalho em baixíssimas freqüências. Retenção de posição sem uso de freio, etc... 30
CURVA CARACTERÍSTICA 31
TEORIA DE OPERAÇÃO 32
Circuito de Controle UNIPOLAR simplificado 33
Comutação nas Fases (excitação dupla) 34
Sistema Típico de Controle com Motor de Passo 35
Circuito Acionador (Indexer + Driver) de Motor de Passo (excitação dupla) 36
Exemplo de Conexão de um Microcontrolador 89S52 com um Driver/Indexador de Motor de Passo Clock Direção Inibe 37
O Clock, na descida de borda, armazena a Direção (1 ou 0) que o motor girará na próxima subida de borda. Clock Direção Direção = 0 Horário Direção = 1 Anti-horário Inibe Inibe = 1 Operação Normal Inibe = 0 Pára o Motor de Passo Frequência do clock (Hz) = Passos por Segundo (pps) no Motor 38
Exemplo de Comando de um pulso em um Motor de Passo (Usando subrotina de Atraso). 39
Comando de Motor de Passo usando Timer e Interrupção 40