Lista de Exercícios A2 Nota: Aluno: RA: Curso: Turma: 1
1 Em um sistema microprocessado, interrupção é o nome dado a um mecanismo que permite interromper a execução normal do programa, para atender a um evento assíncrono. O Arduíno UNO possui dois pinos que podem ser configurados para aceitar interrupções externas, pino 2 e pino 3. Sabendo disso, responda: (1 ponto) 1.1 Quais os modos de disparo possíveis e como funcionam? 1.2 Qual função da biblioteca padrão do Arduíno é utilizada para configurar interrupções externas? 1.3 Como seria a chamada a esta função (resposta do item anterior) para configurar uma interrupção no pino 2, de modo que sempre que o nível lógico presente neste pino passar de baixo para alto (de 0 para 1), então o programa normal seja interrompido e uma rotina chamada minha_isr seja executada? 2
2 Analise o programa a seguir (1 ponto) v o l a t i l e i n t s e n t i d o = 1 ; i n t c o n t a d o r = 0 ; a t t a c h I n t e r r u p t ( d i g i t a l P i n T o I n t e r r u p t ( 2 ), i s r _ u p, RISING ) ; a t t a c h I n t e r r u p t ( d i g i t a l P i n T o I n t e r r u p t ( 3 ), isr_down, RISING ) ; S e r i a l. b e g i n ( 9 6 0 0 ) ; void loop ( ) { i f ( c o n t a d o r >= 100){ s e n t i d o = 1; i f ( c o n t a d o r <= 0){ s e n t i d o = 1 ; c o n t a d o r = c o n t a d o r + s e n t i d o ; S e r i a l. p r i n t l n ( c o n t a d o r ) ; d e l a y ( 5 0 0 ) ; void i s r _ u p ( ) { s e n t i d o = 1 ; void isr_down ( ) { s e n t i d o = 1; 3
2.1 Quais rotinas de serviço de interrupção são definidas? 2.2 Descreva de modo sucinto o comportamento do programa. Não se esqueça de dizer o que é escrito na porta serial, a que intervalo essa informação é atualizada e o que ocorre com essa informação ao ocorrer cada uma das duas interrupções definidas. 4
3 Escreva um programa completo no Arduíno Uno, de maneira que: (2 pontos) Interrupções externas sejam configuradas nos pinos 2 e 3. Essas interrupções devem ser disparadas quando o nível lógico passar de alto para baixo. Os pinos 4 e 5 devem ser configurados como saídas digitais. Ao ocorrer uma interrupção no pino 2, o nível lógico presente no pino 4 deve passar para nível lógico alto. Ao ocorrer uma interrupção no pino 3, o nível lógico presente no pino 4 deve passar para nível lógico baixo. 5
4 Escreva um programa completo no Arduíno Uno, de maneira que: (2 ponto) Interrupções externas sejam configuradas nos pinos 2 e 3. Essas interrupções devem ser disparadas quando o nível lógico passar de alto para baixo. Os pinos 4 e 5 devem ser configurados como saídas digitais. Ao ocorrer uma interrupção no pino 2, o nível lógico presente no pino 4 deve trocar (se era baixo, passa para alto e vice versa). Ao ocorrer uma interrupção no pino 3, o nível lógico presente no pino 5 deve trocar (se era baixo, passa para alto e vice versa). 6
5 Interrupções internas ocorrem dentro da mesma pastilha ou chip que contém o microcontrolador, são geradas por periféricos internos. Um exemplo de interrupção interna no Arduíno Uno são as geradas pelos timers. A seguir apresentamos alguns trechos de código para configurar o Timer1, para cada caso, responda qual o intervalo de tempo entre as interrupções geradas (1 ponto) 5.1 O código abaixo configura o Timer1 para produzir interrupções em um intervalo de n o I n t e r r u p t s ( ) ; TCCR1A = B00000000 ; TCCR1B = B00001010 ; TCNT1 = 0 ; OCR1A = 19999; TIMSK1 = B00000010 ; i n t e r r u p t s ( ) ; 5.2 O código abaixo configura o Timer1 para produzir interrupções em um intervalo de n o I n t e r r u p t s ( ) ; TCCR1A = B00000000 ; TCCR1B = B00001011 ; TCNT1 = 0 ; OCR1A = 19999; TIMSK1 = B00000010 ; i n t e r r u p t s ( ) ; 7
5.3 O código abaixo configura o Timer1 para produzir interrupções em um intervalo de n o I n t e r r u p t s ( ) ; TCCR1A = B00000000 ; TCCR1B = B00001100 ; TCNT1 = 0 ; OCR1A = 19999; TIMSK1 = B00000010 ; i n t e r r u p t s ( ) ; 5.4 O código abaixo configura o Timer1 para produzir interrupções em um intervalo de n o I n t e r r u p t s ( ) ; TCCR1A = B00000000 ; TCCR1B = B00001101 ; TCNT1 = 0 ; OCR1A = 19999; TIMSK1 = B00000010 ; i n t e r r u p t s ( ) ; 8
5.5 O código abaixo configura o Timer1 para produzir interrupções em um intervalo de n o I n t e r r u p t s ( ) ; TCCR1A = B00000000 ; TCCR1B = B00001010 ; TCNT1 = 0 ; OCR1A = 59999; TIMSK1 = B00000010 ; i n t e r r u p t s ( ) ; 9
6 Analise o programa a seguir (1 ponto) v o l a t i l e long i n t c o n t a d o r = 0 ; i n t n i v e l = LOW; pinmode ( 1 3, OUTPUT ) ; n o I n t e r r u p t s ( ) ; TCCR1A = B00000000 ; TCCR1B = B00001010 ; TCNT1 = 0 ; OCR1A = 49999; TIMSK1 = B00000010 ; i n t e r r u p t s ( ) ; void loop ( ) { i f ( c o n t a d o r > 150){ d i g i t a l W r i t e ( 1 3, HIGH ) ; e l s e { d i g i t a l W r i t e ( 1 3, LOW) ; ISR ( TIMER1_COMPA_vect ) { c o n t a d o r ++; i f ( c o n t a d o r >= 200){ c o n t a d o r = 0 ; 10
6.1 Quais rotinas de serviço de interrupção são definidas? 6.2 Suponha que há um LED conectado ao pino digital treze, e que este acenderá sempre que o nível lógico presente for alto. Durante quanto tempo (aproximadamente) este LED permanece aceso e quanto tempo permanece apagado? 11
7 Analise o programa a seguir (2 pontos) S t r i n g comando = ; bool comando_completo = f a l s e ; u n s i g n e d i n t c o n t a d o r = 0 ; S e r i a l. b e g i n ( 9 6 0 0 ) ; comando. r e s e r v e ( 6 4 ) ; void loop ( ) { l e r _ s e r i a l ( ) ; i f ( comando_completo ) { i f ( comando == A ) { S e r i a l. p r i n t l n ( B ) ; i f ( comando == c o n t a d o r ) { S e r i a l. p r i n t l n ( c o n t a d o r ) ; comando = ; comando_completo = f a l s e ; c o n t a d o r ++; void l e r _ s e r i a l ( ) { w h i l e ( S e r i a l. a v a i l a b l e ( ) > 0) { c h a r dado = ( c h a r ) S e r i a l. r e a d ( ) ; i f ( dado == ; ) { comando_completo = t r u e ; e l s e { comando += dado ; 12
7.1 O que deveria ocorrer se o Arduíno receber a sequencia de dados A; na porta serial? O que será devolvido por esta linha de dados? 7.2 O que deveria ocorrer se o Arduíno receber a sequencia de dados contador; na porta serial? O que será devolvido por esta linha de dados? 7.3 Modifique a rotina loop para que, ao receber a sequencia de dados metade; na porta serial, o valor presente na variável contador seja reduzido à metade. 13