Você está na página 1de 3

Universidade Federal de Itajubá

UNIFEI 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 7­6­5­4­2­1­0 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 colocando­se o valor 1 (um) e desabilitados colocando­se 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

Você também pode gostar