Giter Club home page Giter Club logo

timer-assembly's Introduction

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

timer-assembly's People

Contributors

laraesquivel avatar israelbraitt avatar diego10rocha avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.