---
tags: ele-21
---
# Relatório da Aula 2 - Laboratório de EEA-27 2020
Alunos:
- Lucas Barioni Toma
- Michel Marcos Sena Farias
Consulte o manual do ATMEGA2560 (disponibilizado na pasta Referências), nas
seções USART (pag. 200 a 226) e Interrupt (pag. 101 a 108)
- 1. Configure os registradores abaixo para que a USART0, 1 e 2 operem com 8 bits de dados, 1 stop bit, sem paridade, transmissor e receptor ligados, modo assíncrono, baud rate de 9600bps (fosc=16MHz), sem interrupção. Preencha os valores dos registradores, em hexadecimal abaixo:

onde:
n=0 para USART0;
n=1 para USART1;
n=2 para USART2;
```c
UCSRnA = 0x00;
UCSRnB = 0x18; // 1<<RXENn | 1<<TXENn
UCSRnC = 0x06; // 1<<UCSZn1 | 1<<UCSZn0
UBRRHn = 0x00; // UBRR = 103 & 0xFF00
UBRRLn = 0x67; // UBRR = 103 & 0x00FF
```
- 2. A USART0 deve ser configurada para gerar uma interrupção quando um dado completo (válido) for recebido em seu receptor. Redefina os registradores para que essa interrupção seja gerada e apresente qual o endereço do vetor de interrupção.
```c
UCSR0A = 0x00;
UCSR0B = 0x98; // 1<<RXCIE0 | 1<<RXEN0 | 1<<TXEN0
UCSR0C = 0x06; // 1<<UCSZ01 | 1<<UCSZ00
UBRRH0 = 0x00; // UBRR = 103 & 0xFF00
UBRRL0 = 0x67; // UBRR = 103 & 0x00FF
```
Endereço do vetor de interrupção (vetor 26): `0x0032`;
- 3. Quando um dado completo é recebido pela USART0, uma interrupção é gerada e desvia o fluxo do programa para o endereço do vetor de interrupção. Neste endereço encontra-se um fragmento de programa que trata dessa interrupção, chamado de Interrupt Driver. Após o atendimento, retorna para o mesmo ponto do programa onde a interrupção foi invocada. Para este projeto, quando um dado for recebido pela USART0, o mesmo deve ser retransmitido para a USART1. Sendo assim, descreva o conteúdo do Interrupt Driver, lembrando que os registradores que tratam dos dados recebidos e a serem transmitidos pelas USARTs são os registradores UDRn.
```c
/*********************************
* INTERRUPT DRIVER DA USART0 *
*********************************/
// USART0 interrupt service routine
ISR(USART0_RX_vect) {
char byteFromUSART0 = UDR0;
int isReadyToTransmit = 0; // false
while(!isReadyToTransmit){
isReadyToTransmit = UCSR1A & (1<<UDRE1);
}
UDR1 = byteFromUSART0;
return(0);
}
```