Posts com Tag ‘RTOS’

Caro(a) Colega,

semana que vem inicia-se o curso sobre como partir do bare-metal e chegar a um sistema operacional de tempo real RTOS para sistemas embarcados, oferecido pelo CECContinuing Education Center numa parceria entre o IEEE, o site de conteúdo Design News e patrocinado pela Digikey. Confira a resenha:

Embedded systems have been developed without using a real-time operating system for decades. These systems have used bare-metal scheduling techniques that have proven sufficient in many systems. As devices become more connected, complicated and feature rich, bare-metal techniques are no longer the optimal solution for developing a real-time embedded system.

In this course, we’ll walk developers through the transition from bare-metal software through effectively using Real-time Operating Systems (RTOS).

 

Aproveite! Clique na figura a seguir para fazer a sua inscrição ou obter mais informações.

Abraço,

.

Henrique

consulte sempre um engenheiro eletrônico


 

Caro(a) Colega,

o webcast de hoje é sobre os fundamentos dos sistemas operacionais de tempo real, usando o FreeRTOS. Confira a resenha:

Embedded system complexity has reached the point where many systems require a real-time operating system. In this webinar, attendees will become familiar with the design methodologies necessary to properly schedule tasks in addition to understanding when and where to use mutexes, semaphores and message queues. Important concepts such as preventing priority inversions, deadlock and thread starvation will be examined. The webinar will provide hands-on demonstrations using the NXP’s  K64 Freedom Board which uses as ARM Cortex-M4 processor with the Atollic TrueStudio toolchain.

Register today.

Topics Covered in this Webinar Include:

  • Creating and managing tasks
  • Methods and techniques for creating and using mutexes
  • Methods and techniques for creating and using semaphores
  • Methods and techniques for creating and using message queues
  • Example uses for task synchronization services in a real-time embedded system
  • Review scheduling dangers such as priority inversion, deadlock and thread starvation along with recommendations to prevent these dangerous situations
  • Best practices for using an RTOS in an embedded system
  • Tracing task execution using Percepio’s Tracealyzer
  • Recommendations for going further

 

Abraço,

.

Henrique

consulte sempre um engenheiro eletrônico

.

Caro(a) Colega,

o webcast de amanhã é sobre “Desenvolvimento de sistemas de tempo real com Linux embarcado”, em português. Não perca!!! Confira a resenha:

A Internet das Coisas e o aumento de interfaces multimídia são tendências mundiais que afrontam os engenheiros no desenvolvimento de sistemas embarcados. A primeira, principalmente, em funções dos novos requisitos de conectividade e a segunda relativo às necessidades de interfaces de usuário ricas e intuitivas. Estes novos requisitos são desafiadores, principalmente para os projetos de sistemas existentes que ainda utilizam a abordagem de microcontroladores. Os application processors da linha i.MX são baseados em núcleos ARM® Cortex-A e permitem a utilização de sistemas operacionais ricos em recursos e de alto nível de abstração, sendo um subsídio para o desenvolvimento rápido e de baixo risco e atendendo as tendências mais modernas. O benefício de utilizar um SO de alta abstração proporciona, por outro lado, uma preocupação justificada quanto ao determinismo do controle a ser implementado no sistema.

Neste Webinar você conhecerá diferentes abordagens para desenvolvimento de sistemas determinísticos (Sistemas Embarcados de Tempo Real) em Application Processors das linhas i.MX6 e i.MX7. Você vai conhecer:

  • a utilização de Linux Embarcado com o Paths de tempo real, Real-time Linux;
  • a utilização de Linux Embarcado com Xenomai;
  • a utilização de processador multicore heterogêneo (i.MX7).

Para cada abordagem, serão consideradas as vantagens e desvantagens, custo e desempenho e uma pequena demonstração técnica que possibilita verificar a efetiva diferença entre utilizar o Linux puro e as ferramentas de tempo real.

Nota: A Toradex recomenda que todos os participantes façam perguntas durante a sessão de Q&A que acontecerá no final do webinar.

Data do Webinar: 14 de dezembro de 2016

Horário: 13:00 horário de Brasília

Palestrante: Guilherme Fernandes, CEO, Toradex Brasil

Linguagem: Português

Faça o seu registro gratuitamente: Desenvolvimento de Sistemas de Tempo Real com Linux Embarcado

.

Abraço,

.

Henrique

consulte sempre um engenheiro eletrônico


Caro(a) Colega,

semana que vem inicia-se o curso sobre como acelerar projetos de Sistemas Operacionais de Tempo Real baseados em microcontroladores, utilizando-se a plataforma Renesas Synergy, oferecido pelo CECContinuing Education Center numa parceria entre o IEEE, o site de conteúdo Design News e patrocinado pela Digikey.

Aproveite! Clique na figura a seguir para fazer a sua inscrição ou obter mais informações. Confira também os cursos arquivados.

Cursos arquivados

Abraço,

.

Henrique

consulte sempre um engenheiro eletrônico

. Curso Renesas

Caro(a) Colega,

semana que vem tem curso gratuito sobre o desenvolvimento de uma aplicação de RTOS utilizando-se o FreeRTOS.  É imperdível! Consulte também os cursos arquivados do CEC. Vale a pena conferir.

Abraço,

.

Henrique

consulte sempre um engenheiro eletrônico

===========================================================================================================

Cursos arquivados

===========================================================================================================

 

CEC Continiuing Education Center - IEEE - Design News
New Free Online Course:
Hands-On Develop an RTOS Application
Using freeRTOS
February 22 – 26 at 11:00 AM Pacific/2:00 PM Eastern
30 to 45 minutes per day
 .
 .

This hands-on course will teach you how to use freeRTOS, a free, open-source cross-platform real-time operating system. We will begin with a look at RTOS basics and work through an example, step-by step, of how to create an RTOS application from scratch. We will use the popular and inexpensive ARM-based STMicroelectronics’ STM32 Nucleo board, an inexpensive Arduino shield (interface board), the Atollic TrueStudio integrated development environment, and the STMVLDiscovery kit. The instructor, Charles Lord, will provide code so that attendees can follow along.

.

  • February 22 – Day 1: Introduction to freeRTOS / RTOS Refresher
    In this leadoff class, we will review the basics of how a task-switching RTOS operates and the design criteria we need to begin our hands-on design project. We will look at the freeRTOS real-time operating system and the elements that we will be using in our project.
  • February 23 – Day 2: RTOS System Development Setup
    Our toolset will be an important part of making our project successful. We will install and investigate these tools, followed by learning how to set them up, consisting of the STMicro STM32 Nucleo and the Atollic TrueStudio IDE, in tandem with the freeRTOS download.
  • February 24 – Day 3: Changing Processors & Making It Work
    A common challenge of RTOS implementations is their limitation to certain chips, development boards, and toolchains. We will bring up our initial solution using the STM32F100 board and then look at how we will have to modify the code to work with our designated STM32 Nucleo processor and board.
  • February 25 – Day 4: Defining and Running the Project
    In this penultimate class, we will take what we learned so far and define the tasks of our project. We will look at some simple “lightweight” elements that we may choose for our project, such as messaging, events, semaphores, and mutexes.
  • February 26 – Day 5: Troubleshooting Our RTOS Design
    Now that our code is written, we will need to test and debug it. In this final class, we will see how the debugger works with the RTOS to provide task-level debugging. The finished code will be available to help course students follow along and compare with their own code.
You can earn IEEE professional development hours by attending CEC cources.
For full details click here.
Reserve Your Place Now Reserve Your Place Now
Busy then? Register anyway – You can listen when it’s convenient for you. The lectures will be available on-demand immediately after the live class ends.
Sponsored by:
Digi-Key

sku_147734_1-550x550

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 o 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:

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.

Teclado_1_Cod

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.

Teclado_1

Figura 2: Teclado matricial com seleção por linhas separadas

Rotinas padronizadas em C para o 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.

ROTINA DE LEITURA DE MATRIZ DE CONTATOS I (Sinais de seleção codificados) – Definições e Inicializações

 Software_1

.

ROTINA DE LEITURA DE MATRIZ DE CONTATOS II (Sinais de seleção separados) – Definições e Inicializações

Software_2

.

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

 debounce

.

Rotina de  Identificação de Contatos – Definições e Inicializações

Ident

.

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.

ROTINA DE LEITURA DE MATRIZ DE CONTATOS I (Sinais de seleção codificados)

Scan1AScan1b

 .

ROTINA DE LEITURA DE MATRIZ DE CONTATOS II (Sinais de seleção separados)

 Scan2AScan2b

.

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.

Debounce

.

Rotina que identifica os contatos acionados

Esta rotina varre a matriz de teclas, verifica se há teclas acionadas, determina a posição dessas teclas e o número total de teclas acionadas. Se houver teclas acionadas, a rotina sinaliza com um flag ()  para ativar o próximo passo do programa de tratamento de teclas.

Testa_Contato
.

Rotina de execução de ações em função dos contatos

Exec

 .

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.

Timer_0

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.

.

  Exemplo1Exemplo2Exemplo3Exemplo4Exemplo5Exemplo6Exemplo7Exemplo8Exemplo9Exemplo10Exemplo11

Exemplo12

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).

Teclado_Soft_1a

 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.

Teclado_Soft_2

 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.

Teclado_Soft_3Figura 5: Selecionando o modo Debug do programa

.

Antes de entrar no modo de depuração, aparece na tela a mensagem da Figura 6. Clique no “OK” para continuar.

Displ_9

 Figura 6: Aviso de que no modo de avaliação, o código fica limitado a 2K

.

Teclado_Soft_3

   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 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.

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

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

Licença Creative Commons
Esta obra, “Sistemas Operacionais de Tempo Real – Teclados Matriciais“, de Henrique Frank W. Puhlmann, foi licenciada sob uma Licença Creative Commons Atribuição-NãoComercial-CompartilhaIgual 3.0 Não Adaptada.

Displ_1

Introdução

Este artigo faz parte da série de artigos que apresenta Bibliotecas de funções e rotinas padronizadas em linguagem C para microcontroladores da família MCS-51, que podem facilmente ser adaptadas para outros microcontroladores. Para a melhor compreensão do que será desenvolvido aqui, é recomendável que você leia os seguintes artigos

A filosofia utilizada para o desenvolvimento das rotinas para os displays de 7 segmentos é a mesma utilizada nas rotinas apresentadas no artigo Sistemas Operacionais de Tempo Real – Timers. Cria-se um temporizador virtual por software, que é baseado na interrupção de um timer de hardware definindo assim a frequência com a qual os displays são atualizados. Deve-se escolher uma frequência de atualização alta o suficiente para que  não se tenha a desagradável sensação de que o display está “piscando”. Em geral essa frequência é da ordem de 20 a 30 vezes por segundo para cada display. A transferência de dados entre o programa principal e a rotina de interrupção é feita através de um vetor dedicado cujo conteúdo é o que deve ser apresentado no display e de eventuais mecanismos para controlar o acesso a esse vetor.

A biblioteca permite que se opere com algumas soluções de hardware distintas, tais como linhas de seleção multiplexadas, ou então separadas, dependendo do tipo de solução e compromissos desenvolvidos no projeto. Também é ilustrado como se pode de maneira simples codificar as letras e símbolos a serem mostrados nos displays.

Arquitetura de Hardware

Para que se possa desenvolver rotinas de programação padronizadas para os displays de 7 segmentos e cuja adaptação ao hardware seja simples é necessário definir arbitrariamente e fixar alguns modelos físicos para as conexões. A mais óbvia é a alocação de um port inteiro de 8 bits para gerar os segmentos e o ponto decimal dos displays. Para recordar como que é uma interface com um display de 7 segmentos, veja um exemplo na Figura 1.

Displ_2

Figura 1: Conexões de acionamento de um display de 7 segmentos

Acionamento dos segmentos de LED

A atribuição dos segmentos de LED aos pinos do Port foi arbitrária. Por questão de simplicidade eles foram conectados em sequência numa mesma porta: bits 0123456 nos segmentos ABCDEFG. e o ponto decimal foi colocado no bit 7. Pode-se observar na Figura 2 uma ilustração simplificada disso. Essa solução de hardware para conexão dos segmentos do display ao microcontrolador é pressuposta nas rotinas em linguagem C da biblioteca, que serão apresentadas mais adiante, agrupadas como ROTINA DOS DISPLAYS DE 7 SEGMENTOS I e ROTINA DOS DISPLAYS DE 7 SEGMENTOS II. O que diferencia os dois grupos, são as formas de seleção dos displays.

 Displ_3

Figura 2: Exemplo de alocação dos segmentos dos displays a um port de 8 bits

 Nessa atribuição arbitrária, pode-se formar os dígitos e alguns caracteres caracteres conforme ilustrado na Tabela 1 .

Tabela 1: Códigos para acender os segmentos de acordo com o dígito ou caracter desejado

Programa_1

Outra forma de conectar o display de LED de 7 segmentos a um microprocessador é por meio de um decodificador BCD para 7 segmentos, tais como por exemplo os circuitos integrados 74LS49 [1], ou então o 74HC4511 [2]. Na Figura 3 é ilustrada uma solução de hardware onde é utilizado um decodificador desse tipo, com a atribuição arbitrária dos pinos e ports utilizada nas rotinas padronizadas em linguagem C agrupadas como  ROTINA DOS DISPLAYS DE 7 SEGMENTOS III.
 

Displ_4

Figura 3: Solução de hardware com decodificador BCD / 7 segmentos

 Formas de seleção dos displays

Nas rotinas padronizadas foram previstas duas formas de seleção dos displays: linhas de seleção separadas, utilizadas nos grupos de rotinas ROTINA DOS DISPLAYS DE 7 SEGMENTOS II e III, e linhas de seleção codificadas, utilizadas na ROTINA DOS DISPLAYS DE 7 SEGMENTOS I.

Linhas Separadas

As linhas de seleção separadas são alocadas num segundo Port.A definição das variável do programa padronizado, permite que se selecione em que bit do Port começam as linhas. Essas linhas de seleção devem estar necessariamente alocadas em ordem crescente nos pinos do Port. Veja por exemplo o código em C mostrado na Figura 4.

No exemplo da figura, foram definidos que são 3 displays, os segmentos conectados ao Port 3, as linhas de seleção ao Port 1 e será utilizado o ponto decimal. Na parte específica relacionado com as linhas de seleção, é definido que as linhas estão alocadas nos pinos 6 e 7 do Port 1 (0xE0)

 Programa_2

 Figura 4: Definições relacionadas com as linhas de seleção

Linhas codificadas

Nessa forma de seleção dos displays são utilizados poucos pinos do port para codificar o número do display a ser ativado em código binário. Ou seja, 1 bit seleciona até dois displays, 2 bits quatro etc. A intenção foi a de economizar pinos nos Ports do microcontrolador, especialmente se o número de displays for grande. É necessária a utilização de um decodificador / multiplexador na saída do Port, conforme ilustrado na Figura 5. Um exemplo desse tipo de componente é o 74LS139 [3].

Displ_5

 Figura 5: Solução de hardware usando um decodificador

Rotinas padronizadas em C para os displays de 7 segmentos

O código em linguagem C para os displays 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 display terminar a contagem, é executado um trecho curto de código para atualizar os displays. No programa principal são inseridas algumas inicializações.

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.

ROTINA DOS DISPLAYS DE 7 SEGMENTOS I  (Sinais de seleção codificados)

Programa_3a

Programa_3b

Programa_3c

ROTINA DOS DISPLAYS DE 7 SEGMENTOS II  (Sinais de seleção separados)

Programa_4a

Programa_4b

Programa_4c

ROTINA DOS DISPLAYS DE 7 SEGMENTOS III  (Utiliza decodificador BCD para 7 segmentos e sinais de seleção separados)

Programa_5a

Programa_5b

Programa_5c

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 dos displays, amarrando as particularidades do hardware com o software. O que deve ser configurado:

  • #define DISPLAY_INVERTIDO: Essa linha deve ser colocada como comentário, se acaso as saídas para os segmentos não necessitam de inversão lógica;
  • #define TEM_PONTO_DECIMAL: Essa linha deve ser colocada como comentário, se acaso não for utilizado o ponto decimal;
  • #define NUMERO_DE_DISPLAYS: Nessa linha deverá ser colocado o número de displays multiplexados que existem no hardware;
  • #define FREQ_DE_INTERRUP_TIMER_DISPLAYS: é a frequência de atualização de um display multiplicada pelo número de displays;
  • #define NUMERO_DE_LINHAS_DO_DISPLAY: Aqui é definido o número de linhas de seleção que serão utilizadas;
  • #define PORTA_DE_SAIDA_DOS_DISPLAYS: Aqui deve ser definida em que Port estão conectados os segmentos dos displays;
  • #define PORTA_DE_SAIDA_DA_SELECAO_DOS_DISPLAYS: Aqui é definido em que Port estão conectadas as linhas de seleção;
  • #define MASCARA_DA_SELECAO_DE_DISPLAY: Aqui é definida a posição e abrangência das linhas de seleção;
  • #define SELETOR_DOS_SINAIS_DE_SELECAO_DISPLAY: Define a posição do bit de seleção que será deslocado em anel para selecionar os diversos displays;
  • #define SAIDAS_INVERTIDAS_SEL_DISP : Colocar essa linha como comentário, se acaso as linhas de seleção não precisarem ser invertidas;
  • unsigned char ucFilaDeSaidaDosDisplays[NUMERO_DE_DISPLAYS]: É necessário dimensionar e inicializar corretamente esse vetor.

As demais variáveis e constantes são calculadas automaticamente pelo programa.

.

Código a ser inserido na rotina de interrupção do Timer 0

Os trechos de códigos a seguir implementam um temporizador virtual para o acionamento dos displays. Sempre que o contador termina a contagem, é desligado o display atual e ativado o próximo, tomando as providências de hardware para isso.

ROTINA DOS DISPLAYS DE 7 SEGMENTOS I  (Sinais de seleção codificados)

Programa_6

ROTINA DOS DISPLAYS DE 7 SEGMENTOS II (Sinais de seleção separados)

 Programa_7

ROTINA DOS DISPLAYS DE 7 SEGMENTOS III   (Utiliza decodificador BCD para 7 segmentos e sinais de seleção separados)

Programa_8

Programa_8a

Código a ser inserido nas inicializações do programa principal

O trecho de código a seguir inicializa uma variável auxiliar e desativa as linhas de seleção dos displays.

Programa_9

Como transferir dígitos para os displays?

Da forma como foi projetado esse programa, o gerenciamento do display propriamente dito é totalmente automático e transparente para o programa principal. Você só precisa converter o dígito para o código, usando-o como índice na tabela ucTabelaDeDisplayDeSeteSegmentos[dígito] e transferí-lo para a fila de saída dos displays (ucFilaDeSaidaDosDisplays[]) na posição correspondente. Veja no exemplo a seguir.

EXEMPLO

Nesse programa foi aproveitado o mesmo programa desenvolvido para a demonstração de operação dos timers [5] de tempo real, acrescidos os trechos relativos aos displays. 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. Confira o código no quadro abaixo.

Programa_10a

Programa_10b

Programa_10c

Programa_10d

Programa_10e

  Programa_10f

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 [4];
  • Baixe o arquivo Testa_Display.zip [6];
  • Instale os arquivos de Testa_Display.zip num diretório para testes;
  • Navegue até o diretório de testes e acione o arquivo Testa_Display.uvproj (2 “clickes”)  (Figura 6).

 Displ_6

Figura 6: Arquivos no diretório de teste

Nesse instante deverá abrir o programa Keil e a tela deverá ser a retratada na Figura 7. 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.

 Displ_7

Figura 7: Programa Keil pronto com o programa exemplo carregado

A seguir coloque o programa no modo de Debug (Figura 8, Figura 9 e Figura10) para que se possa iniciar a simulação.

 Displ_8

Figura 8: Selecionando o modo Debug do programa

Antes de entrar no modo de depuração, aparece na tela a mensagem da Figura 9. Clique no “OK” para continuar.

 Displ_9

Figura 9: Aviso de que no modo de avaliação, o código fica limitado a 2K

 Displ_10

Figura 10: 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.

 É 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.

Resumo

Neste artigo técnico foram apresentadas algumas possíveis soluções padronizadas para acionamento de displays de 7 segmentos com auxílio de um timer de hardware. Essas soluções constituem uma biblioteca padronizada para a utilização dos displays de 7 segmentos 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.

 Este artigo é o terceiro 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

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 (este artigo) – É apresentada uma biblioteca desenvolvida em linguagem C para a inicialização e o uso em displays de 7 segmentos;
  • Teclados Matriciais – É 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/sdls111/sdls111.pdf

[2] http://www.nxp.com/documents/data_sheet/74HC_HCT4511_CNV.pdf

[3] http://www.ti.com/lit/ds/symlink/sn54s139.pdf

[4] https://www.keil.com/demo/eval/c51.htm

[5] https://consulteengenheiroeletronico.wordpress.com/2013/09/28/biblioteca-de-funcoes-e-rotinas-padronizadas-em-linguagem-c-para-mcs-51-timers/

[6] http://www.embarcados.com.br/download/Testa_Display.zip

Licença Creative Commons
Esta obra, “Sistemas Operacionais de Tempo Real – Displays de 7 segmentos“, de Henrique Frank W. Puhlmann, foi licenciada sob uma Licença Creative Commons Atribuição-NãoComercial-CompartilhaIgual 3.0 Não Adaptada.