Baixe o app para aproveitar ainda mais
Prévia do material em texto
UNIFEI Universidade Federal de Itajubá Instituto de Engenharia de Sistemas e Tecnologias da Informação IESTI 2a Prova de ELT024 – Programação para Sistemas Embarcados Prof. Rodrigo Maximiano Antunes de Almeida (10 pts Questão 1) Existem 8 leds conectados à porta D e estes são ligados com nível alto (5 volts ou bit = 1). Dado o programa abaixo, indique o estado de cada led (ligado/desligado). #include “config.h” #include “basico.h” void main(void) interrupt 0 { TRISD = 0xE3; PORTD = 0xAA; for(;;); } Resposta: Para um led estar ligado é necessário que esteja com nível alto (1) e o seu bit de configuração correspondente esteja configurado como saída (0). TRISD = 0b11100011; PORTD = 0b10101010; Ligados 00001000 Apenas o led 3 está ligado, os leds 7654210 estão desligados. (15 pts Questão 2) Configure os registros INTCON e RCON para que apenas a interrupção do TIMER0 funcione. Escolha o modo de compatibilidade. Obs.: todos os bits dos registros podem ser habilitados colocandose o valor 1 (um) e desabilitados colocandose o valor (0). INTCON = 0b________; // |||||||| // ||||||| -> RBIF: Flag de interrupção da porta B└ // |||||| -> INT0IF: Flag de interrupção externa 0└ // ||||| -> TMR0IF: Flag de interrupção do timer 0└ // |||| -> RBIE: Bit que habilita interrupção na porta B└ // ||| -> INT0IE: Bit que habilita interrupção externa└ // || -> TMR0IE: Bit que habilita interrupção do Timer 0└ // | -> PEIE/GIEL: p/ IPEN = 1: habilita interrupções de baixa prioridade└ // | p/ IPEN = 0: habilita interrupções dos periféricos // -> GIE/GIEH: p/ IPEN = 1: habilita interrupções de alta prioridade└ // p/ IPEN = 0: habilita todas as interupções RCON = 0b________; // |||||||| // ||||||| -> BOR: Flag de brown-out reset└ // |||||| -> POR: Flag de power-on reset└ // ||||| -> PD: Flag de detecção de power-down└ // |||| -> TO: Flag de detecção do watchdog└ // ||| -> RI: Flag de reset por software└ // || -> não usado└ // | -> BOR: habilitação de detecção do Brown-out└ // -> IPEN: habilita modo de prioridade (1) ou modo de compatibilidade (0)└ Resposta (a letra X indica que não importa o valor) INTCON = 0b11100XXX; RCON = 0b0XXXXXXX; (20 pts Questão 3) Escreva uma função de tratamento de interrupções. Esta função será responsável por armazenar o valor AD numa variável global para que o programa principal possa ler este valor posteriormente. A flag responsável por indicar fim de conversão é o bit 6 do registro PIR1. Resposta: //static não é essêncial neste caso, mas é uma boa pratica. static int ValorADGlobal; void UmNomeQualquer (void) interrupt 1 { if (BitTst(PIR1,6)) // teste para saber se a flag do AD está ligada { ValorADGlobal = LeVAlorAD(); BitClr(PIR1,6); } } (25 pts Questão 4) Monte um programa que: 1) recebe um caractere via comunicação serial e se este valor for uma letra, exibe no LCD. Caso este character for um número, ele deve ser exibido no display de 7 segmentos. unsigned char RecebeSerial(void); void AtualizaDisplay(void); void MudaDigito(unsigned char valor, unsigned char posicao); //valor em número normal void EnviaDadosLCD(unsigned char valor); //valor em codificação ASCII Resposta: #include "basico.h" #include "config.h" #include "serial.h" #include "lcd.h" #include "disp7seg.h" void main (void) interrupt 0 { unsigned char serialTemp; InicializaSerial(); InicializaAD(); InicializaLCD(); InicializaDisplays(); for(;;) { serialTemp = RecebeSerial(); if ((serialTemp >= 'a') && (serialTemp <= 'z')) { EnviaDadosLCD(serialTemp); } else if ((serialTemp>=48) && (serialTemp<=57)) { MudaDigito(serialTemp – 48, 0); } AtualizaDisplay(); } } (30 pts Questão 5) Na porta B estão ligadas 8 chaves. Faça uma biblioteca “chaves” que: 1) Inicializa as variáveis, 2) Realiza o debounce das teclas, 3) Retorna qual chave está ligada. Resposta: //--------------------------------------------------------------- // chaves.c #include "basico.h" #include "chaves.h" char chaves; void InicializaChaves (void) { TRISB = 0xFF; //configura a porta b como entrada } void DebounceChaves (void) { static char debounce; static char tempo; if (debounce != PORTB) { debounce = PORTB; tempo = 10; //dez chamadas para realizar o debounce } else { tempo--; //se for igual diminui o tempo } if (tempo == 0) //fim do tempo atualiza a var global { chaves = debounce; } } char RetornaChave(void) { if (BitTst(chaves,0)){ return 0; } if (BitTst(chaves,1)){ return 1; } if (BitTst(chaves,2)){ return 2; } if (BitTst(chaves,3)){ return 3; } if (BitTst(chaves,4)){ return 4; } if (BitTst(chaves,5)){ return 5; } if (BitTst(chaves,6)){ return 6; } if (BitTst(chaves,7)){ return 7; } return 8; //se nenhuma estiver pressionada retorna 8 } //--------------------------------------------------------------- // chaves.h #ifndef CHAVES_H #define CHAVES_H void InicializaChaves (void); void DebounceChaves (void); char RetornaChave(void); #endif //CHAVES_H
Compartilhar