Você está na página 1de 5

Universidade Federal da Bahia

Escola Politécnica
Departamento de Engenharia de Elétrica e de Computação
ENGC50 – Sistemas Microprocessados - 2a Lista de Exercı́cios

1. Quais são os estados tı́picos envolvidos na execução de uma instrução?


2. Quais são as abordagens usuais para tratar interrupções múltiplas?
3. Caracterize a Arquitetura Harvard e a Arquitetura Von Neumman.
4. Considere um microprocessador de 8 bits, onde uma operação de adição entre os números 0x02 e
0x03 acabou de ser realizada. Qual o valor dos seguintes flags?
• carry
• zero
• even parity
• half-carry
5. Repita a questão 4 para a adição entre −1 e +1.
6. Um microprocessador possui uma instrução capaz de mover uma string de bytes de uma área da
memória para outra. A busca e decodificação da instrução leva 10 ciclos de clock. A seguir são
necessários 15 ciclos de clock para transferir cada byte. O microprocessador opera com 10 GHz de
frequência.
(a) Determine a duração de 1 ciclo de instrução para o caso de uma string de 64 bytes.
(b) Qual seria o máximo atraso para atender uma interrupção, se a instrução não puder ser
interrompida?
(c) Repita o ı́tem anterior assumindo que a instrução pode ser interrompida no inı́cio da trans-
ferência de cada byte.
7. Qual a função da seção ”Boot Flash”na organização da memória Flash do ATmega328?
8. Como está organizado o espaço de memória SRAM do ATmega328?
9. Em qual região do espaço de memória SRAM estão localizados os registradores de controle e acesso
aos periféricos do microcontrolador?
10. Operandos armazenados na região dos SFR (I/O Registers) podem alimentar a ALU?
11. Qual a função dos registradores DDRB, DDRC e DDRD?
12. Quais as funções dos registradores PORTB, PORTC, PORTD?
13. De que forma o bit PUD desabilita o pull-up de todas as portas simultaneamente?
14. Mostre qual seria o conjunto de linhas de código em C para:
(a) Configurar PORTB como porta de saı́da.
(b) Configurar PORTC como entrada TRISTATE e atribuir o seu valor à variável input.
(c) Configurar PORTD como entrada e ativar o pull-up.
(d) Configurar PORTD como entrada, ativar o pull-up e atribuir os 4 bits menos significativos
(nibble inferior) à variável low e o nibble superior à variável high.
(e) Configure o nibble superior de PORTB como entrada com pull-up ativado e com o nibble
inferior como saı́da.
(f) Faça a leitura dos pinos de entrada da porta configurada no item 14e e atribua o valor repre-
sentado por estes bits à variável x.
(g) Escreva o número 0x5 nos pinos de saı́da da porta configurada no item 14e.
15. Escreva um programa em C para fazer o PORTB alternar 200 vezes entre os valores 0xAA e 0x55.
16. Considere o código a seguir:
#include < a vr / i o . h>
i nt main ( void )
{
DDRB = DDRB & 0 b01111111 ;
PORTB |= (1 < < 7 );
while ( 1 )
{
i f (PINB & 0 b10000000 )
DDRB = DDRB & 0 b11101111 ;
else
DDRB = DDRB | 0 b00010000 ;
}
return 0 ;
}

(a) Explique a funcionalidade deste programa.


(b) Altere o código de tal forma que um LED conectado a um dos pinos do PORTB pisque cada
vez que o registrador DDRB tiver seu valor alterado.

17. Considere que um circuito da Figura 4. Escreva um programa em C para provocar a mudança de
estado do LED em PB5 cada vez que o push-button em PD2 for pressionado.

Figura 1: Circuito com LED.

18. O circuito da Figura 2 controla a temperatura de um forno elétrico usando uma estratégia ON/OFF.
Usando interrupções, escreva um programa em C para atender às seguintes especificações:

Figura 2: Controle da temperauira de um forno.


• Os sensores de temperatura estão ligados aos pinos de interrupção INT0 e INT1.
• Sensor de 120◦ C provoca interrupção INT0 e sensor de 100◦ C provoca a interrupção INT1.
• Quando o sensor associado ao pino INT0 é ativado, na borda de descida, então a temperatura
do forno ultrapassou 120◦ C,e o forno deve ser desligado, uma vez que a temperatura atingiu o
seu valor máximo.
• Quando o sensor associado ao pino INT1 é ativado, na borda de descida, indicando que a
temperatura do forno está abaixo de 100◦ C, o forno deve ser ligado, por estar abaixo da
temperatura limite inferior.
19. Quando se faz uso da interrupção por mudança de estado de pino (PCINTx), é possı́vel restringir
o disparo da subrotina de interrupção apenas aos casos de transição de descida (falling edge) ou de
subida (rising edge) do sinal? Escreva um código exemplo.
20. Em relação à questão 19, sabemos que até 8 pinos podem compartilhar o mesmo vetor PCINTx
(PORTB, PORTC, PORTD). Por isso, quando uma interrupção é disparada, é necessário descobrir
qual evento provocou o disparo.
Escreva um código em C que para identificar o evento que foi responsável pela interrupção, consi-
derando um exemplo onde todos os pinos do PORTB estão sendo usados como fonte.
21. Considerando o circuito da Figura 3, escreva o código C para mostrar no display de 7 segmentos a
sequência 0, 2, 4, 6, 8. O display de 7 segmentos está conectado ao PORTD do ATmega328.

Figura 3: Display de 7 segmentos.

22. Considere a Figura 4 e o exemplo de código a seguir:

Figura 4: Circuito com LED.


#include < a vr / i o . h>
#include < a vr / i n t e r r u p t . h>
i nt main ( void ) {
DDRD &= ˜(1 < < DDD2 ) ;
PORTD |= (1 < < PORTD2 ) ;
EICRA |= (1 < < ISC00 ) ;
EIMSK |= (1 < < INT0 ) ;
sei ();
while ( 1 ) {
/∗ main program l o o p h e r e ∗/
}
}
ISR ( INT0 vect ) {
/∗ i n t e r r u p t code h e r e ∗/
}

Figura 5: Registradores do ATmega328.

Altere e complemente o código para que aconteça a mudança de estado do LED em PB5 cada vez
que o push-button em PD2 (INT0) for pressionado. A Figura 5 mostra os registradores associados
às interrupções externas do ATmega328.
23. Durante o atendimento a uma interrupção, o registrador PC (Contador de Programa) sofre
alguma alteração? Justifique.
24. Qual o valor de PORTB após as seguintes operações:
(a) PORTB=0x35 & 0x0F;
(b) PORTB=0x04 | 0x68;
(c) PORTB=0x54 ∧ 0x78;
(d) PORTB= ∽ 0x55;
25. Escreva um programa para monitorar continuamente o bit PB7. Quando o bit estiver em nı́vel
alto, deve-se enviar o valor 0xAA ao PORTD, e quando PB7 estiver em nı́vel baixo, PORTD deve
receber o valor 0x55.
26. Considerando que o pino INT0 está conectado a um botão que está normalmente em nı́vel alto,
complete o código abaixo de tal forma que PB5 fique piscando sempre que INT0 estiver em nı́vel
baixo.
#include < a vr / i o . h>
#include < a vr / i n t e r r u p t . h>
i nt main ( void ) {
.
.
.
EICRA . . .
EIMSK . . .
sei ();
while ( 1 ) {

}
}
ISR ( INT0 vect ) {

Você também pode gostar