Exame de Época Normal da disciplina de Introdução aos Sistemas Embebidos Ano lectivo de 2003/2004 1º Semestre Licenciatura em Engenharia de Sistemas e Computação Licenciatura em Engenharia de Sistemas e Informática Duração: 2 horas + meia hora de tolerância (total: 2H30) Só é permitido o esclarecimento de dúvidas na interpretação do enunciado durante os primeiros 20 minutos do teste. Por isso, leia o teste com cuidado antes de começar a resolução. Só podem abandonar a sala após a primeira meia hora de teste e só é permitida a entrada de alunos até à primeira meia hora de teste. É permitida a utilização de calculadora e do documento sobre o micrococontrolador PIC. BOA SORTE! Teste de Introdução aos Sistemas Embebidos 2003/2004 1. [2v] Enuncie, para um sistema embebido hipotético, cinco critérios que poderão ser utilizados para seleccionar um determinado microcontrolador. 2. Pretende-se implementar em assembly do PIC16C54 uma subrotina, wait, que permita programar tempos de espera de 10 a 500 ciclos com precisão de mais ou menos 5 ciclos: (a) [2v] escreva o código da subrotina, assumindo que esta recebe um parâmetro que permite programar o tempo de espera; (b) [2v] Indique uma equação que baseada no código da subrotina permita a um utilizador calcular o valor do parâmetro de entrada de modo a programar o tempo de espera desejado (de acordo com o intervalo de valores supracitado). 3. [4v] Um microprocessador tem uma entrada de 1 bit que permite receber sequências de bits de outro dispositivo. As sequências são apresentadas em grupos de 17 bits em que o primeiro bit representa o checksum invertido dos 16 bits seguintes. Supondo a existência da função int read_port(), que por cada vez que é executada retorna o valor de um novo bit presente na entrada, implemente em C o código da função int read16() que retorna nos 16 bits menos significativos a sequência de bits lida após o bit de checksum. Em caso do checksum não estar correcto, a função deve retornar um ‘1’ no décimo sétimo bit. Considere que as variáveis do tipo int são representadas por 32 bits. 4. [4v] A verificação de que todas as linhas de dados do barramento de dados estão a funcionar é um dos testes realizados a memórias do sistema. Escreva uma função em código C que permita testar o barramento de dados de 16 bits de uma memória conectada a um microprocessador (note que tanto o microprocessador como o sistema não têm hierarquia de memórias). A memória tem espaço de endereçamento de 0x0000 a 0xFFFF. A função deve retornar o valor zero caso o teste tenha tido sucesso e o valor um em caso contrário. 5. Pretende-se implementar um sistema embebido para controlar uma máquina de vender bebidas em lata. A máquina suporta bebidas de 3 tipos (A, B, e C). Os tipos A e B são referentes a bebidas com preço de 1 Euro, e o tipo C a uma bebida com preço de 2 Euros. A máquina aceita moedas de cinquenta cêntimos, 1 euro, e de 2 euros. Sempre que seja necessário, a máquina deve dar troco. Para tal, a quantia a retornar é realizada com base em moedas de cinquenta cêntimos. A Figura 1 ilustra as linhas de entrada e de saída da unidade de controlo. A entrada TIPO indica qual foi a bebida seleccionada e as entradas UM, DOIS, e MEIO indicam a introdução de uma moeda de um euro, dois euros, ou de cinquenta cêntimos. A máquina só tem uma ranhura para as moedas e não aceita moedas sem o utilizador ter seleccionado o tipo de bebida. A linha MOEDA serve para indicar a libertação de uma moeda de cinquenta cêntimos de troco (cada moeda é libertada pela existência de uma transição de zero para um nesta linha). Cada uma das linhas TIPO A, B, e C serve para libertar a respectiva lata de bebida. MOEDA UM DOIS MEIO Unidade de Controlo TIPO A TIPO B TIPO C TIPO Figura 1. Linhas de entrada e de saída da unidade de controlo da máquina. 1 de 2 Teste de Introdução aos Sistemas Embebidos 2003/2004 Realize as tarefas seguintes: (a) [3v] desenhe um ASM Chart para a máquina sequêncial que representa a unidade de controlo do sistema; (b) [3v] escreva o código C do main que implemente a máquina anterior supondo a existência das seguintes funções e definições: int read(int port): lê o valor na entrada especificada (o valor é retornado como int). A função fica à espera que haja uma transição ascendente na entrada sob leitura. void write(int port, int value): escreve o valor na saída especificada #define PORT_UM 1 // identifica a linha de entrada UM #define PORT_DOIS 2 // identifica a linha de entrada DOIS #define PORT_MEIO 3 // identifica a linha de entrada MEIO #define PORT_TIPO 4 // identifica a linha de entrada TIPO #define TIPO_A 1 // identifica uma bebida do Tipo A #define TIPO_B 2 // identifica uma bebida do Tipo B #define TIPO_C 3 // identifica uma bebida do Tipo C #define PORT_MOEDA 5 // identifica a linha de saída MOEDA #define PORT_TIPO_A 6 // identifica a linha de saída TIPO A #define PORT_TIPO_B 7 // identifica a linha de saída TIPO B #define PORT_TIPO_C 8 // identifica a linha de saída TIPO C 2 de 2