Skip to content

Temporizador com contagem regressiva (timer) em ARM Assembly para Raspberry Pi Zero W com interface em display LCD.

Notifications You must be signed in to change notification settings

israelbraitt/timer-assembly

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Aplicação de temporização (timer) com Raspberry Pi Zero

Este projeto consiste na implementação de uma aplicação em Assembly responsável por implementar um temporizador com contagem regressiva (timer) e mostrar os dígitos em um display LCD. O controle da aplicação é realizado com botões que tem as funções de iniciar/parar a contagem e reiniciar a partir de um tempo definido.

Equipe de desenvolvimento

Descrição do problema

É necessário desenvolver um aplicativo de temporização (timer) que apresente a contagem num display LCD. O tempo inicial deverá ser configurado diretamente no código. Além disso, deverão ser usados 2 botões de controle: 1 para iniciar/parar a contagem e outro para reiniciar a partir do tempo definido.

Solução

Requisitos Concluidos

  • Código Escrito em Assembly
  • O sistema deve permitir configurar o tempo de contagem
  • Usar os botões para configurar iniciar, parar e reiniciar a contagem
  • Usar os mesmsos botões para iniciar/parar a contagem
  • Limpar Display
  • Escrever caractere
  • Posicionar Cursor
  • Biblioteca

Recursos utilizados

  • Raspberry Pi Zero W

  • Display LCD Hitachi HD44780U

  • Botões

  • GPIO Extension Board


    Raspberry Pi Zero W


    Kit Completo do Laboratório.

GPIO do Raspberry Pi Zero

A Raspberry Pi Zero possui 40 pinos de GPIO (General Purpose Input/Output), que são portas programáveis de entrada e saída de dados, utilizadas para promover uma interface entre os periféricos.

A pinagem dos periféricos é feitas de acordo com as informações descritas à seguir.

Push-Buttons:

start/pause: GPIO-5
reset: GPIO-19

Display LCD:

RS: GPIO-25
RW: GND
E:  GPIO-01
D4: GPIO-12
D5: GPIO-16
D6: GPIO-20
D7: GPIO-21

Display

Para a utilização do display LCD HD44780U foram implementadas as instruções presentes na documentação oficial do mesmo através de código em assembly, de forma que os bits fossem tranferidos pelos pinos do display.

As instruções implementadas incluem: inicializar, limpar, escrever um dígito no display, entre outras descritas na documentação. Além dessas, também foram implementadas outras que possibilitam a realização da contagem.

A placa Raspberry Pi Zero será responsável por controlar as informações enviadas para o display, além de executar os comandos necessários para a execução da aplicação e processar os sinais recebidos pelos botões. O display e os botões estão ligados à Raspberry Pi Zero por meio da GPIO Extension Board.

Temporizador

Foi implementado um temporizador, o qual é controlado atráves dos butões da placa: um para iniciar e pausar a contagem(GPIO-5) e outro para reiniciar. O temporizador conta a partir de números com no máximo duas casas deciamais.

Arquitetura ARMv6

O processador da Raspberry Pi Zero possui arquitetura ARMv6, isso implica na utilização do conjunto de instruções da linguagem assembly desta arquitetura para a solução do problema. O ARMv6 é uma arquitetura RISC, o que implica em um conjunto de instruções mais simples e pequeno. Os processadores ARM fornecem registradores de propósito geral e de propósito especial. Alguns registros adicionais estão disponíveis em modos de execução privilegiados.

Em todos os processadores ARM, os seguintes registradores estão disponíveis e acessíveis em qualquer modo de processador:

13 registradores de uso geral R0-R12. Um ponteiro de pilha (SP) R13. Registro de um link (LR) R14. Um contador de programa (PC) R15. Um Registro de Status do Programa de Aplicativo (APSR).

Os processadores ARM suportam os seguintes tipos de dados na memória:

Byte - 8 bits

Half Word -16 bits

Word - 32 bits

Doubleword - 64 bits.

Os registradores do processador têm 32 bits de tamanho.

Como Executar

Os arquivos base do códgio assembly encontra-se no caminho diretório (timer-assembly). Para executar o produto desenvolvido, utiliza-se o arquivo makefile. Para isso, dentro de um terminal linux, abra o diretório que contém os arquivos bases mencionados anteriormente e execute os seguinte comando:

  • make all
  • sudo ./last_stable_version

Tipos de Instruçoes

Instruções aritméticas

Instruções aritméticas fornecem a capacidade computacional para processamento de dados numéricos. Abaixo estão as instruções utilizadas no código:

  • ADD - adição
  • SUB - subtração

Instruções lógicas (booleanas) operam sobre bits de uma palavra, como bits e não como números

Instruções lógicas (booleanas) operam sobre bits de uma palavra, como bits e não como números. Abaixo estão as instruções utilizadas no código:

  • AND - função lógica "and"
  • ORR - função lógica "or"
  • LSL - deslocamento de bits para a esquerda

Transferência de dados

Transferência de dados move dados entre a memória e os registradores. Abaixo estão as instruções utilizadas no código:

  • LDR - carrega da memória para o registrador
  • STR - carrega do registrador para a memória
  • MOV - move valor para os registradores

Instruções de desvio são utilizadas para desviar a execução do programa para uma nova instrução

Instruções de desvio são utilizadas para desviar a execução do programa para uma nova instrução. Todas as instruções utilizadas estão abaixo:

  • B - desvio incondicional
  • BEQ - desvio se condição for igual a zero
  • BLEQ - desvia e depois retorna para onde parou se a condição for igual a zero
  • BGT - desvia se a condição for maior que zero
  • BNE - desvia se a condição for diferente de zero

Instruções aritmética com logicas e com desvio.

Instruções que convenientemente se associam a outras criando um desvio a partir de uma condicional. As instruções utilizadas estão abaixo:

  • ADDEQ - adição se o a flag levantada for de valores igual
  • SUBNE - subtração se a flag levantada for de valores diferentes
  • MOVNE- movimentação de dados se a flag levantada for de valores diferentes

Testes

Teste do projeto em geral foram feitos a partir de casos de testes que consistiam na utilização das principais funções do código.

Abaixo está uma descrição de um caso de teste.

  • Iniciar contagem clicando o botão
  • Inciar contagem segurando o botão
  • Pausar a contagem clicando o botão
  • Pausar a contagem segurando o botão
  • Reiniciar a contagem clicando o botão
  • Reiniciar a contagrm segurando o botão
  • Contagem de um dígito visivel no display
  • Contagem de dois dígitos visivel no display
  • Trocar contagem de dois dígitos para um
  • Trocar contagem de um dígito para dois
  • Clear deve ocorrer ao iniciar o display
  • Clear deve ocorrer antes de escrever um dígito

Conclusão

Um aplicativo de temporização foi desenvolvido em Assembly em uma Raspberry Pi Zero W, a qual possui um processador de arquitetura ARMv6. Por meio desta aplicação é possível realizar contagens regressivadas de um segundo de 0 a 99. Além de iniciar e parar a contagem no mesmo botão, e em outro reiniciar a contagem. A qual a partir do código é possível modificar o valor que será contato e todo o processo pode ser visualizado do display LCD em anexo a Raspberry.

Todavia, o código está fortemente acoplado, e não foi possível no momento fazer a biblioteca sem que o código parasse de funcionar, precisariamos de mais tempo, em torno de uma semana para tornar a parte do display como uma biblioteca, além de aumentar a quantidade de dígitos do display. Com esses ajustes futuros, o código pode ser corrigido e reutilizado como biblioteca em breve.

Materiais de referência

Raspberry Pi Documentation

Display LCD HD44780U

BCM2835 ARM Peripherals

About

Temporizador com contagem regressiva (timer) em ARM Assembly para Raspberry Pi Zero W com interface em display LCD.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Assembly 98.4%
  • Makefile 1.6%