1 / 27 Sistemas Operacionais de Tempo Real - Teclados Matriciais por Henrique Frank W. Puhlmann Introdução Chaves eletromecânicas são uma forma quase primitiva de interface entre um sistema eletrônico e um ser humano. Por meio delas, podemos selecionar, programar e responder a estímulos do sistema. As chaves organizadas em arranjos matriciais, por exemplo, formam dispositivos mais complexos, que conhecemos por teclados. Este artigo trata de rotinas padronizadas em linguagem C para microcontroladores da família MCS-51, para configurar e tratar as particularidades de um teclado, gerando os sinais de estímulo e realizando a leitura, realizando também debouncing por software, identificando a(s) tecla(s) acionada(s) e preparando uma rotina para o tratamento dessa(s) tecla(s). Para uma melhor compreensão do que será tratado nesse artigo, recomendo a leitura dos seguintes artigos técnicos: Leitura de chaves mecânicas e o processo de debounce Teclado matricial e varredura de teclas Sistemas Operacionais de Tempo Real - Introdução Sistemas Operacionais de Tempo Real - Timers
2 / 27 Arquitetura de Hardware Na biblioteca de rotinas padronizadas, que será apresentada a seguir, são consideradas duas formas distintas de seleção da matriz de teclas: Seleção por linhas codificadas A seleção por linhas codificadas, como ilustrado na Figura 1, pode ser realizada utilizando-se um decodificador/ Multiplexador na saída dos sinais de seleção. Um componente desse tipo é o 74LS139 [1]. Nessa forma de seleção do teclado são utilizados poucos pinos do port para codificar o número da linha de seleção a ser ativada em código binário. Ou seja, 1 bit seleciona até duas linhas, 2 bits quatro etc. A intenção foi a de economizar pinos nos ports do microcontrolador, especialmente se o teclado for grande. A rotina da biblioteca para essa configuração foi batizada de ROTINA DE LEITURA DE MATRIZ DE CONTATOS I.. Figura 1: Teclado matricial com seleção por linhas codificadas Seleção por linhas separadas A seleção com linhas separadas é realizada conforme ilustrado na Figura 2. A rotina da biblioteca para essa configuração foi batizada de ROTINA DE LEITURA DE MATRIZ DE CONTATOS II.
3 / 27 Figura 2: Teclado matricial com seleção por linhas separadas Rotinas padronizadas em C para teclados matriciais O código em linguagem C para os teclados matriciais segue o mesmo padrão do desenvolvido para os timers em Sistemas Operacionais de Tempo Real Timers. Tem um conjunto de definições e variáveis, uma parte a ser inserida na rotina de interrupção do timer, de forma que quando o timer virtual do teclado terminar a contagem, é sinalizado para o programa principal que a contagem terminou. No programa principal são inseridas algumas inicializações, as rotinas de leitura do teclado, debounce e tratamento da tecla. Essa solução é um pouco diferente da implementada para os displays de 7 segmentos, pois entende-se que tratar teclado não é uma tarefa prioritária para um sistema e não necessita de uma temporização precisa. Assim, o trecho de código para a leitura do teclado não foi colocado dentro da rotina de interrupção do timer. Assim ela é executada na medida em que é possível. Definições e variáveis A seguir os códigos exemplo referentes às definições e configurações correspondentes às arquiteturas descritas anteriormente. Esse trecho de código é inserido tipicamente num arquivo do tipo.h do programa.
4 / 27 ROTINA DE LEITURA DE MATRIZ DE CONTATOS I (Sinais de seleção codificados) - Definições e Inicializações
ROTINA DE LEITURA DE MATRIZ DE CONTATOS II (Sinais de seleção separados) - Definições e Inicializações 5 / 27
6 / 27 São utilizadas algumas convenções com relação às definições e uso das constantes. Em todo o programa, 1 quer dizer ligado ou ativo e 0 desligado ou inativo. Este trecho de código é na sua essência o configurador do teclado, amarrando as particularidades do hardware com o software. O que deve ser configurado: #define FREQ_DE_INTERRUP_TIMER_MATRIZ_DE_CONTATOS: Define a frequência com a qual é realizada um a varredura completa do teclado. 10 vezes por segundo é uma taxa razoável; #define NUMERO_DE_LINHAS_DA_MATRIZ: Define o número de linhas de seleção da matriz de teclas; #define PORTA_DE_ENTRADA_DA_MATRIZ: Define em que port estão conectadas as entradas do teclado; #define PORTA_DE_SAIDA_DA_SELECAO_DA_MATRIZ: Define em que port estão conectadas as linhas de seleção das teclas; #define MASCARA_DA_MATRIZ: Aqui é definida a posição e abrangência das linhas de entrada; #define MASCARA_DA_SELECAO: Filtra os bits dos sinais de seleção; #define SELETOR_DOS_SINAIS_DE_SELECAO: Define posição do primeiro bit do conjunto de seleção que será deslocado em anel para selecionar as colunas de teclas ; #define SAIDAS_INVERTIDAS : Colocar essa linha como comentário, se acaso as linhas de seleção não precisarem ser invertidas; #define INCREMENTO_PARA_O_CONTADOR_DE_SELECAO: Define o "mais 1" no contador, no caso da seleção codificada; unsigned char ucmatrizdecontatosdeentrada[numero_de_linhas_da_matriz]: É necessário iniciar com zeros essa matriz; As demais variáveis e constantes são calculadas automaticamente pelo programa. Rotina de debounce - Definições e Inicializações
7 / 27 Rotina de Identificação de Contatos - Definições e Inicializações Código a ser inserido no corpo do programa principal O código a seguir testa um flag (bflagdetemporizacaodamatrizdecontatos) que é ativado pela rotina de interrupção quando for terminada a contagem do temporizador virtual de leitura do teclado. Se o flag foi acionado, é realizada a varredura do teclado e testado se há teclas acionadas. Se houver teclas acionadas, a rotina sinaliza com outro flag (bflagdenovaleituradematrizdecontatos) de que há contatos acionados. Nesse código estão indicadas as rotinas de debounce, identificação dos contatos acionados e de execução de ações em função dos contatos acionados. Esses códigos serão apresentados mais adiante.
8 / 27 ROTINA DE LEITURA DE MATRIZ DE CONTATOS I (Sinais de seleção codificados)
ROTINA DE LEITURA DE MATRIZ DE CONTATOS II (Sinais de seleção separados) 9 / 27
10 / 27 Rotina de debounce Na saída da rotina de leitura de contatos é acionado um flag (bflagdenovaleituradematrizdecontatos) para sinalizar que há novos dados. Esse flag é testado e se afirmativo inicia-se o processo de debounce. A rotina de debounce basicamente testa se o que foi lido está estável há pelo menos N leituras. Se não, é reiniciado o contador de debounce. Como a frequência de leitura do teclado é baixa, o valor de N pode ser pequeno também, por exemplo 2 ou 3. Quando a rotina decide que a leitura está estável e tem tecla acionada, é acionado um flag (bflagdeterminodedebounce) para ativar o próximo passo do tratamento de teclas.
11 / 27 Rotina que identifica os contatos acionados Esta rotina varre a matriz de teclas, verifica se há teclas acionadas. Se positivo, determina a posição dessas teclas e o número total de teclas acionadas. Se houver teclas acionadas, a rotina sinaliza com um flag (bflagresultadosmatrizdecontatos) para ativar o próximo passo do programa de tratamento de teclas.
12 / 27 Rotina de execução de ações em função dos contatos Código a ser inserido na rotina de interrupção do Timer 0 O trecho de código a seguir implementa um temporizador virtual para temporização do início de varredura do teclado. Sempre que o contador termina a contagem, o contador é reinicializado e é sinalizado que a temporização terminou.
13 / 27 EXEMPLO Nesse programa foi aproveitado o mesmo programa desenvolvido para a demonstração de operação dos timers e displays de 7 segmentos de tempo real, acrescidos os trechos relativos ao teclado. Aqui será programado o Timer 0 no modo 2 de operação, com o microcontrolador operando com um clock de 4 MHz e uma frequência de interrupção de 1,5 khz. Foram definidos 3 displays de 7 segmentos do tipo II com a seleção separada, e atualizados a cada 30 contagens cada um. Também foi definido um teclado matricial, cujas linhas de entrada estão alocadas aos bits 0 a 2 do Port 2 e as linhas de seleção aos bits 4 a 7 do mesmo Port. Confira o código no quadro abaixo.
14 / 27
15 / 27
16 / 27
17 / 27
18 / 27
19 / 27
20 / 27
21 / 27
22 / 27
23 / 27
24 / 27 Simulação do Exemplo Se você quiser simular o programa exemplo acima e explorá-lo um pouco mais, siga os seguintes passos:. Instale o KEIL C51 μvision [2]; Baixe o arquivo Testa_Teclado.zip [3]; Instale os arquivos de Testa_Teclado.zip num diretório para testes; Navegue até o diretório de testes e acione o arquivo Testa_teclado.uvproj (2 clickes ) (Figura 3). Figura 3: Arquivos no diretório de teste Nesse instante deverá abrir o programa Keil e a tela deverá ser a retratada na Figura 4. Esse painel permite navegar no código em C, editá-lo e compilá-lo. Não é necessário fazer isso para realizar a simulação, mas você poderá posteriormente alterar alguns parâmetros do código e testar o programa com as novas alterações.
25 / 27 Figura 4: Programa Keil pronto com o programa exemplo carregado A seguir coloque o programa no modo de Debug (Figura 5, Figura 6 e Figura 7) para que se possa iniciar a simulação. Figura 5: Selecionando o modo Debug do programa
26 / 27 Antes de entrar no modo de depuração, aparece na tela a mensagem da Figura 6. Clique no OK para continuar. Figura 6: Aviso de que no modo de avaliação, o código fica limitado a 2K Figura 7: Modo Debug de operação Observe que já estão destacados os painéis de monitoramento do Timer 0, do Port 1, cujo bit 1 deverá ser alternado a cada término de contagem do temporizador de software do teste do timer e cujos bits 5, 6 e 7 são usados como linhas de seleção dos 3 displays, e o Port 3, onde aparecem os códigos de cada dígito de 7 segmentos. Nessa simulação, aparecem os números 1, 2 e 3 respectivamente nos displays 0, 1 e 2. Também aparece o painel de monitoramento do Port 2, onde os bits de 0 a 2 são as entradas do teclado e os bits 4 a 7 os sinais de seleção da matriz É possível utilizar as teclas de função F11 para executar o programa passo a passo ou F5 para entrar em execução. Recomendo que você inicie a simulação utilizando o passo a passo para poder observar detalhadamente como que funciona o mecanismo de operação desse programa.
27 / 27 Resumo Neste artigo técnico foram apresentadas algumas possíveis soluções padronizadas para a leitura e tratamento de teclados matriciais com auxílio de um timer de hardware. Essas soluções constituem uma biblioteca padronizada para a utilização dos teclados matriciais em microcontroladores da família MCS-51, codificada em C, para ser compilada no programa da Keil. Depois foi desenvolvido um programa exemplo para que você possa simular o que foi apresentado e observar os detalhes dessa implementação. Repare que a aplicação tem uma complexidade razoável e foi montada a partir das rotinas de biblioteca em menos de meia hora. E funciona!!!! Este artigo é o quarto da série de artigos que abordam algumas funções comuns em projetos de sistemas embarcados de tempo real. Confira os demais artigos (em breve). Sistemas Operacionais de Tempo Real Sistemas Operacionais de Tempo Real - Introdução - Apresentação introdutória do que é um sistema operacional e as características que o tornam um sistema de tempo real. Também são apresentadas algumas estruturas que facilitam o seu projeto. Bibliotecas de funções e rotinas padronizadas em linguagem C para MCS-51 Timers - É apresentada uma biblioteca desenvolvida em linguagem C para a inicialização e o uso dos Timers do MCS-51; Displays de 7 segmentos É apresentada uma biblioteca desenvolvida em linguagem C para a inicialização e o uso em displays de 7 segmentos; Teclados Matriciais (este artigo) É apresentada uma biblioteca desenvolvida em linguagem C para varredura, leitura, debounce, identificação da tecla acionada e desvio para a rotina de tratamento. A forma como as rotinas foram escritas, permitem sua fácil reutilização em outros projetos; Periféricos (Em breve) - É apresentada uma biblioteca desenvolvida em linguagem C para a inicialização e o uso de alguns periféricos, tais como conversores A/D, sensor de temperatura e memórias seriais. Referências [1] http://www.ti.com/lit/ds/symlink/sn54s139.pdf [2] https://www.keil.com/demo/eval/c51.htm [3] http://www.embarcados.com.br/download/testa_teclado.zip