Sumário
01 / Descrição geral do projeto
1.1 Escopo
Desenvolver, em grupo, um sistema embarcado baseado no Arduino Mega 2560 para monitorar três reservatórios e controlar suas respectivas bombas. Três potenciômetros deverão simular, de forma independente, os níveis de água. As bombas serão representadas por LEDs.
O usuário deverá construir um programa em linguagem assembly pelo monitor serial. O montador deverá validar e converter cada instrução em uma palavra binária, armazenando-a em uma memória simulada de 128 posições. O executor deverá buscar, decodificar e executar essas palavras binárias.
O foco é a aplicação dos conceitos de Arquitetura de Computadores. O sketch e a documentação deverão identificar entrada/saída, Unidade de Controle (UC), Unidade Lógica e Aritmética (ULA), memória e registradores simulados.
1.2 Não escopo
- Acionamento de bombas reais, motores ou cargas de potência.
- Teclado matricial, sensor ultrassônico, comunicação em rede ou eletrônica avançada.
- Reprodução fiel da ISA de um processador comercial.
1.3 Objetivos
- Aplicar programa armazenado e ciclo de busca, decodificação e execução.
- Projetar uma ISA e relacionar assembly, código binário e endereçamento hexadecimal.
- Implementar aquisição analógica, comparação, desvios e controle de saídas.
- Inspecionar memória e registradores para explicar a execução do programa.
- Organizar o sketch em funções claras e documentadas.
02 / Funcionalidades do produto
2.1 Elementos arquiteturais obrigatórios
| Elemento | Requisito |
|---|---|
MEM_PROG | 128 palavras de largura fixa W, uma instrução completa por posição. Endereços de 0x00 a 0x7F. O grupo define W e o tipo ou estrutura de armazenamento. |
PC | Contador que determina o endereço da próxima instrução. |
IR | Registrador que recebe a palavra binária completa buscada em memória. |
ACC | Acumulador que recebe o percentual lido por READ ou INFO e o resultado da diferença calculada por CMP. |
NIVEL e validade | Três registradores de nível, associados às bombas 1, 2 e 3, e indicação de que cada leitura já foi realizada. |
FLAG_L, FLAG_Z, FLAG_G | Indicadores de menor, igual e maior, atualizados por CMP, e indicação de que existe uma comparação válida. |
| Controle | Ponteiro de carga, quantidade de posições ocupadas, modo de operação e estado de execução. |
| Saídas | Estados independentes das três bombas, dos três alarmes preventivos e dos três alarmes corretivos. |
Os elementos deverão ter uso efetivo, nomes identificáveis e comentários sobre seu papel arquitetural. A UC implementa a busca, decodificação, execução e atualização do PC. A ULA realiza a diferença e a comparação. A arquitetura simulada deverá ser distinguida da arquitetura física do ATmega2560.
2.2 Modelo de operação do sistema
2.2.1 Entrada e montagem — LOAD
O comando LOAD inicia um novo programa: interrompe a execução, desliga bombas e alarmes, apaga o display, limpa a memória e os estados internos e posiciona o ponteiro de carga em 0x00. Todas as posições são zeradas, mas permanecem marcadas como não carregadas.
O usuário envia uma instrução assembly por linha, confirmada por Enter. O montador valida o mnemônico e os operandos, gera a palavra binária e a grava na próxima posição livre. A confirmação deverá mostrar endereço hexadecimal e palavra binária completa. A carga avança uma posição somente após uma instrução válida. Nenhuma instrução será executada durante a carga.
END finaliza a carga. O montador deverá verificar se os destinos dos desvios correspondem a posições carregadas; referências futuras são permitidas durante a digitação. Pendências impedem RUN ou AUTO e devem ser informadas. Para corrigir o programa, o usuário pode iniciar nova carga com LOAD.
Comentários de linha no programa assembly
O montador deverá aceitar o caractere ; como início de comentário. Todo o texto a partir do primeiro ; até o fim da linha deverá ser ignorado antes da validação e da codificação. O comentário pode aparecer após uma instrução ou ocupar uma linha inteira.
; Programa de exemplo READ 1 ; Lê o nível do reservatório da bomba 1 INFO 1 ; Mostra a faixa de nível no display HALT ; Encerra o programa
Linhas vazias e linhas contendo apenas comentários não ocupam posições de memória e não avançam o ponteiro de carga. Comentários não fazem parte da palavra binária. No exemplo, READ 1 ocupa 0x00, INFO 1 ocupa 0x01 e HALT ocupa 0x02.
2.2.2 Execução passo a passo e automática
RUN inicia uma sessão passo a passo em 0x00. A execução de uma instrução ocorre somente ao receber STEP ou *. AUTO inicia execução contínua em 0x00. Ambos preservam o programa e reinicializam registradores, validade das leituras e comparações e saídas, com bombas e alarmes desligados e display apagado.
- Buscar a palavra em
MEM_PROG[PC]. - Carregar a palavra completa em IR.
- Extrair opcode e operandos por operações sobre os bits.
- Executar a ação e atualizar os estados.
- Avançar PC em uma posição ou carregar o destino do desvio.
É proibido executar o programa reinterpretando strings assembly. A conversão para binário acontece na montagem; durante a execução, o controle deve depender exclusivamente das palavras armazenadas. Textos podem ser mantidos para consulta, sem determinar a ação executada.
2.2.3 Parada e estados internos
HALT encerra normalmente a execução e mantém as saídas. STOP cancela a execução ou uma espera e desliga bombas e alarmes. Após parada, novos passos são ignorados até RUN ou AUTO. Erros de execução também interrompem o programa, desligam bombas e alarmes e geram diagnóstico no monitor serial.
Depois de cada instrução, mostrar: endereço executado, palavra de IR em binário, mnemônico decodificado, ACC em decimal com sinal, indicadores, níveis e estados das saídas. Mostrar o próximo PC em hexadecimal quando houver continuidade; em parada, informar o estado, sem apresentar um endereço fictício.
2.2.4 Comandos do ambiente
| Comando | Função |
|---|---|
LOAD | Iniciar nova carga e reinicializar o sistema. |
END | Finalizar a carga e validar destinos de desvios. |
RUN | Iniciar execução passo a passo em 0x00. |
STEP ou * | Executar uma instrução na sessão passo a passo. |
AUTO | Iniciar execução contínua em 0x00. |
STOP | Interromper a execução e desligar bombas e alarmes. |
MEM | Consultar todas as 128 posições de memória. |
MEM 0x00 0x0F | Consultar um intervalo inclusivo de endereços. |
STATUS | Consultar modo, PC, registradores, indicadores e saídas. |
Comandos do ambiente não são instruções da ISA e não ocupam a memória de programa. MEM e STATUS deverão estar disponíveis durante carga, parada e execução; não podem alterar PC, memória ou saídas. Durante AUTO, a consulta poderá pausar a execução entre instruções e retomá-la ao final. STEP adicional durante WAIT deverá ser rejeitado, sem enfileiramento. STOP deve continuar sendo atendido durante WAIT e programas com laços.
2.3 Conjunto de instruções
x identifica a bomba (1, 2 ou 3); n é um percentual inteiro decimal entre 0 e 100; a é um endereço hexadecimal com prefixo 0x; t é uma quantidade inteira decimal de unidades de 100 ms, com limite definido pelo grupo.
| Mnemônico | Descrição funcional |
|---|---|
READ x | Ler a entrada analógica do reservatório x, converter em percentual inteiro e armazenar em NIVEL[x] e ACC. Marcar a leitura como válida. |
ON x | Ligar o LED que representa a bomba x. |
OFF x | Desligar o LED que representa a bomba x. |
ALARM x | Ativar o estado de manutenção corretiva da bomba x e o buzzer. Informar a identificação da bomba no monitor serial. |
LED x | Ativar o LED de manutenção preventiva da bomba x. |
INFO x | Realizar nova leitura, atualizar NIVEL[x] e ACC, marcar leitura válida e mostrar a faixa no display. Informar bomba, percentual e dígito no monitor serial. |
SILENCE x | Desativar o estado de manutenção corretiva da bomba x. O buzzer só desliga quando não houver nenhum alarme corretivo ativo. |
LEDOFF x | Desativar o LED de manutenção preventiva da bomba x. |
CMP x, n | Comparar o último nível válido da bomba x com n, sem nova leitura. Armazenar NIVEL[x] − n em ACC e atualizar FLAG_L, FLAG_Z e FLAG_G, exatamente um verdadeiro. |
JMP a | Desviar incondicionalmente para a. |
JL a | Desviar se FLAG_L for verdadeiro. |
JE a | Desviar se FLAG_Z for verdadeiro. |
JG a | Desviar se FLAG_G for verdadeiro. |
WAIT t | Aguardar t unidades de 100 ms antes de permitir a próxima instrução, mantendo atendimento ao monitor serial. |
HALT | Encerrar a execução e manter o estado das saídas. |
Somente CMP altera os indicadores de comparação. READ e INFO atualizam os níveis, mas não os indicadores. CMP sem leitura válida e desvio condicional sem comparação válida são erros. Se a condição de desvio for falsa, a execução segue para a posição seguinte. Alarmes são independentes do comando da bomba: ALARM e LED não a desligam automaticamente.
2.3.1 Codificação binária arbitrada pelo grupo
- Definir um opcode exclusivo para cada instrução e justificar a quantidade de bits.
- Definir a largura fixa W e a disposição dos campos de cada formato, incluindo operandos de CMP.
- Prever endereços de
0x00a0x7F, identificação das três bombas e percentual de 0 a 100. - Definir o preenchimento de campos não utilizados e a detecção de combinações inválidas.
- Apresentar tabela de mnemônicos, opcodes binários, formatos e exemplos completos. Não basta codificar o opcode: os operandos também devem estar na palavra armazenada.
- Calcular a capacidade lógica da memória em bits (128 × W) e explicar o espaço efetivamente ocupado pela implementação.
2.4 Código e descrição de cada funcionalidade
| Código | Funcionalidade e requisito | Relação arquitetural |
|---|---|---|
| F01 | Receber uma linha assembly pelo monitor serial e validar a sintaxe. | Entrada / linguagem de montagem |
| F02 | Montar opcode e operandos conforme a codificação definida pelo grupo. | Montador / ISA |
| F03 | Gravar uma palavra por posição e controlar ocupação e carga. | Memória de programa |
| F04 | Buscar palavras binárias, carregar IR, decodificar e atualizar PC. | UC / ciclo de instrução |
| F05 | Ler três entradas analógicas e converter em percentuais. | Entrada de dados / registradores |
| F06 | Comparar níveis e implementar desvios condicionais. | ULA / fluxo de controle |
| F07 | Controlar independentemente as bombas simuladas. | Saída digital |
| F08 | Gerenciar alarmes preventivos e corretivos por bomba. | Saída / estados |
| F09 | Exibir a faixa atual no display compartilhado. | Codificação / saída |
| F10 | Consultar memória na tabela END | PALAVRA BINÁRIA. | Endereçamento / inspeção |
| F11 | Executar WAIT, HALT, STOP e tratar falhas. | Temporização / controle |
2.5 Representação dos níveis e tratamento de erros
Converter a leitura analógica para percentual inteiro entre 0 e 100, documentando a fórmula e o arredondamento. O display deverá seguir a convenção abaixo.
| Percentual inteiro | Dígito |
|---|---|
| 0 a 10% | 1 |
| 11 a 20% | 2 |
| 21 a 30% | 3 |
| 31 a 40% | 4 |
| 41 a 50% | 5 |
| 51 a 60% | 6 |
| 61 a 70% | 7 |
| 71 a 90% | 8 |
| 91 a 100% | 9 |
A faixa do dígito 8 é deliberadamente mais ampla para manter o dígito 1 para até 10% e o dígito 9 para acima de 90%. O display mantém a última indicação até outra instrução INFO ou reinicialização.
ACC deverá representar diferenças entre −100 e +100. O grupo deverá documentar sua largura e a representação em complemento de 2. Uma diferença negativa de CMP é um resultado válido, exibido no monitor serial, e não um erro do display. INFO exibe uma faixa de nível, não o conteúdo negativo de ACC.
Rejeitar mnemônico desconhecido, bomba inexistente, operandos fora da faixa, endereço sem notação hexadecimal, excesso de operandos e memória cheia. A linha rejeitada não altera a memória nem avança a carga. Na execução, validar a palavra e impedir acesso a posições não carregadas. Ao chegar à última posição sem HALT ou desvio válido, interromper com erro, sem retornar automaticamente a 0x00.
2.6 Consulta de memória e notação dos endereços
0x e dois dígitos, de 0x00 a 0x7F. A regra vale para entrada de destinos, PC, ponteiro de carga, tabelas, exemplos, documentação e mensagens de erro. Quantidades de posições, bombas, percentuais e tempos podem ser decimais.O comando MEM deverá apresentar as 128 posições em ordem crescente. A forma MEM 0x00 0x0F limita a consulta ao intervalo inclusivo. Intervalos invertidos ou fora da memória devem ser rejeitados.
END | PALAVRA BINÁRIA 0x00 | <W bits armazenados nesta posição> 0x01 | <W bits armazenados nesta posição> 0x02 | <W bits armazenados nesta posição> ...
O quadro é apenas um modelo de apresentação: na implementação, a segunda coluna deverá conter exclusivamente os W dígitos 0 ou 1 efetivamente armazenados, com zeros à esquerda. Não deverá apresentar mnemônicos nem códigos gerados novamente a partir de texto. Como o grupo arbitra a codificação, não são fornecidas palavras binárias de exemplo.
Posições não carregadas deverão aparecer com W zeros. A quantidade de posições ocupadas e o intervalo carregado devem ser informados fora da tabela. O controle de ocupação deverá ser separado do conteúdo: uma palavra zerada não determina, por si só, se a posição é executável.
03 / Descrição detalhada do esquema elétrico
3.1 Relação de componentes
- Arduino Mega 2560 e cabo USB para o monitor serial.
- Três potenciômetros lineares de 10 kΩ.
- Três LEDs de funcionamento e três LEDs de manutenção preventiva.
- Um buzzer ativo ou módulo de buzzer compatível com a placa.
- Um display de sete segmentos de um dígito.
- Resistores limitadores por LED e por segmento, protoboard e jumpers.
3.2 Conexões
Ligar os extremos de cada potenciômetro a 5 V e GND e seu cursor à entrada analógica correspondente. Usar terra comum e resistor em série em cada LED e segmento. Documentar a polaridade do display, os resistores adotados e o circuito de acionamento do buzzer, respeitando as características dos componentes e os limites elétricos da placa. O display deverá ser comandado pelas saídas digitais.
3.3 Pinagem de referência
| Pino | Elemento |
|---|---|
| A0, A1, A2 | Potenciômetros dos reservatórios 1, 2 e 3, respectivamente |
| 22 a 28 | Segmentos a, b, c, d, e, f e g, respectivamente |
| 30, 31, 32 | LEDs das bombas 1, 2 e 3 |
| 33, 34, 35 | LEDs preventivos das bombas 1, 2 e 3 |
| 45 | Sinal de controle do buzzer |
A pinagem deverá ser seguida e identificada no esquema. Os números desta tabela identificam pinos físicos, não endereços de instruções.
04 / Setup de testes
Para cada teste, registrar entrada, resultado esperado, resultado obtido e evidência. Utilizar as palavras binárias definidas pelo grupo.
4.1 Montagem e programa armazenado
Carregar READ 1, ON 1, OFF 1 e HALT, uma por linha. Demonstrar que a carga não aciona as saídas e que as instruções ocupam 0x00, 0x01, 0x02 e 0x03. Consultar MEM e explicar cada campo de uma palavra.
Repetir a carga incluindo comentários após as instruções, linhas vazias e linhas contendo apenas comentários. Comprovar que as palavras binárias e seus endereços permanecem iguais aos da versão sem comentários.
4.2 Ciclo de instrução
Executar o programa anterior passo a passo. Apresentar endereço executado, IR binário e próximo PC, identificando no código a busca e a decodificação por bits.
4.3 Leitura independente
Ajustar os três potenciômetros para níveis distintos e executar READ para cada bomba. Verificar registradores e ACC, incluindo os extremos de 0% e 100%.
4.4 Comparação e desvios
Testar nível menor, igual e maior que o limite. Demonstrar CMP, os três indicadores e os desvios correspondentes. Explicar o resultado negativo de uma comparação, por exemplo 20 − 30 = −10, e sua representação em complemento de 2.
4.5 Bombas e alarmes
Acionar e desligar cada bomba e LED preventivo. Ativar ALARM 1 e ALARM 2; executar SILENCE 1 e comprovar que o buzzer permanece ativo; executar SILENCE 2 e comprovar seu desligamento.
4.6 Display
Executar INFO para as três bombas, verificando identificação no monitor serial e dígito no display. Testar todos os limites da tabela, incluindo 10/11%, 70/71% e 90/91%. Podem ser usados dados de teste controlados para verificar os limites, além da demonstração física com potenciômetros.
4.7 Memória e endereçamento
Exibir MEM completo e por intervalo. Carregar todas as 128 posições, até 0x7F, e demonstrar a rejeição de uma instrução adicional. Verificar que a consulta não modifica o programa, o PC ou as saídas.
4.8 Tratamento de erros
Testar instrução desconhecida, bomba inválida, endereço decimal, intervalo inválido, comparação sem leitura e desvio condicional sem comparação. Demonstrar também a detecção de opcode inválido e de execução em posição não carregada; para a corrupção da palavra, poderá ser utilizada uma versão de teste documentada.
4.9 Controle automático
Escrever um programa assembly que leia periodicamente os níveis das três bombas, ligue cada uma abaixo de 30%, desligue acima de 80% e preserve seu estado de 30% a 80%, inclusive. As decisões deverão estar no programa armazenado, usando CMP e desvios. Verificar subida e descida do nível, WAIT e atendimento a STOP durante o laço.
4.10 HALT e avaliação conceitual
Demonstrar HALT em programa finito e comprovar que passos posteriores não executam instruções até novo RUN ou AUTO. Cada integrante deverá localizar memória, PC, IR, ACC, UC, ULA e montador, explicando o percurso assembly → palavra binária → memória → busca → decodificação → execução.
05 / Regras de elaboração do sketch
5.1 Clareza e organização
Usar funções, indentação consistente, nomes significativos e comentários sobre os elementos arquiteturais. Separar interface serial, montagem, memória, decodificação, execução, aquisição analógica e acionamento das saídas.
5.2 Estrutura mínima
Implementar funções para receber linha, remover comentários iniciados por ponto e vírgula, validar operandos, codificar instrução, gravar palavra, consultar memória, buscar/decodificar/executar, comparar níveis, exibir faixa, controlar alarmes e tratar erros. A temporização de WAIT deverá manter o atendimento aos comandos do monitor serial.
5.3 Implementações não aceitas
- Código integralmente concentrado no loop, sem organização funcional.
- Elementos arquiteturais apenas nominais, sem uso efetivo.
- Execução imediata durante a carga ou execução baseada em strings.
- Consulta de memória que reconstrua palavras a partir do texto em vez de ler a memória.
- Controle automático fixo no sketch, substituindo as decisões do programa assembly.
5.4 Identificação do grupo
Incluir no início do sketch comentário com matrícula, nome e participação de cada integrante: TA — trabalhou ativamente; TP — trabalhou parcialmente; NT — não trabalhou.
06 / Regras de avaliação
6.1 Peso e organização
O trabalho corresponde a 30% da nota da AP1. O desenvolvimento deverá ser realizado pelos grupos definidos em sala, com indicação de um representante. Não serão aceitas entregas individuais ou fora do grupo definido.
6.2 Representante e presença
O representante deverá organizar a pasta do grupo no repositório, submeter os artefatos e conduzir a apresentação com participação dos demais integrantes. A presença de todos é obrigatória. A ausência implica redução de 40% da nota individual e não poderá ser compensada por envio posterior de material.
6.3 Condições de entrega
Os arquivos previstos na seção 8 deverão estar disponíveis localmente para demonstração durante a apresentação. O protótipo deverá estar montado e funcional. Somente após a conclusão da apresentação do grupo, o representante deverá publicar os arquivos na pasta correspondente no repositório indicado na seção 7. Os arquivos enviados deverão corresponder à versão apresentada. Não será permitido alterar o código durante a avaliação. Os únicos entregáveis exigidos são os cinco itens da seção 8.
6.4 Sequência da apresentação
- Apresentar o projeto e sua relação com a disciplina.
- Explicar a ISA arbitrada, seus formatos e a memória.
- Identificar PC, IR, ACC, UC e ULA no sketch.
- Demonstrar carga, consulta MEM, execução e funcionalidades.
- Executar os testes solicitados e encerrar um programa por HALT.
Para cada funcionalidade, explicar sua função, localizar a implementação, executá-la e comparar o resultado esperado ao obtido.
6.5 Critérios
| Conceito | Nota | Critério |
|---|---|---|
| Excelente | 10,0 | Todas as funcionalidades implementadas e atendidas. |
| Ótimo | 9,0 | Pequenas falhas em funcionalidades. |
| Bom | 7,0 | Muitas funcionalidades não atendidas. |
| Insuficiente | 0,0 | Projeto não apresentado ou sem funcionamento mínimo. |
6.6 Penalizações específicas
| Situação | Consequência |
|---|---|
| Ausência de integrante | −40% da nota individual. |
| Participação TP | −40% da nota individual. |
| Participação NT | Nota individual 0,0 no trabalho. |
| Repositório incompleto | Poderá invalidar a avaliação. |
| Ausência de HALT, memória binária efetiva ou ciclo de busca/decodificação | Falha conceitual grave. |
| Ausência de definição documentada dos códigos binários, consulta MEM ou notação hexadecimal dos endereços | Requisito obrigatório não atendido. |
| Ausência de tratamento de erros e limites | Redução de nota. |
| Pinagem em desacordo | Poderá inviabilizar a avaliação. |
6.7 Datas de entrega e apresentação
| Turma | Data | Horário |
|---|---|---|
| Quarta-feira — turma4a | 30 de setembro de 2026 | Segundo tempo de aula |
| Quinta-feira — turma5a | 1º de outubro de 2026 | Segundo tempo de aula |
A apresentação ocorrerá na data e no horário correspondentes à turma. A publicação dos arquivos no repositório deverá ocorrer somente após a apresentação do respectivo grupo.
07 / Repositório
O repositório do trabalho é github.com/claytonjasilva/trabalhoAP1-2026.2.
Cada representante deverá enviar ao professor seu nick (nome de usuário) no GitHub, para receber acesso ao repositório e poder inserir o material na pasta de seu grupo.
A pasta de cada grupo deverá seguir um dos formatos abaixo, substituindo o campo entre sinais de menor e maior pela matrícula do representante, sem incluir esses sinais no nome:
- Turma de quarta-feira:
turma4a-<matricula do representante>. - Turma de quinta-feira:
turma5a-<matricula do representante>.
Exemplos ilustrativos: turma4a-123456 e turma5a-123456. Cada grupo deverá colocar os arquivos de entrega em sua própria pasta, somente após concluir sua apresentação.
08 / Entregáveis
- Sketch devidamente identificado, com matrícula, nome e participação de cada integrante, conforme a seção 5.4.
- Tabela em arquivo .md com o código binário arbitrado pelo grupo, o respectivo assembly e a descrição de cada instrução. No mesmo arquivo, explicar a largura da palavra e os campos de opcode e operandos.
- Esquema contendo as ligações realizadas no protótipo.
- Protótipo funcional, apresentado em aula.
- Testes realizados e programas usados em assembly, em arquivo .md, contendo resultados esperados e obtidos. Quando houver indicação de posições de instruções, utilizar endereços em hexadecimal.