Protocolo UART, Temporizadores e Interrupções no AVR 328
Classificado em Eletrônica
Escrito em em português com um tamanho de 2,89 KB.
1. Registrador TSR e Protocolo UART
Por que existe um "0" no "LSB" (Least Significant Bit) do registrador TSR? Qual o significado mais plausível para a representação "(8)" associada ao "MSB" (Most Significant Bit)?
O "0" no LSB do TSR implementa o "start bit" do protocolo UART, sendo o primeiro bit a sair do registrador de deslocamento. O "(8)" no MSB simboliza a opção de envio de até nove bits (0 a 8). O nono bit, "TX9D", é genérico, tipicamente usado para paridade.
2. Interrupções do Transmissor
Qual evento da operação do transmissor é sinalizado pela interrupção no diagrama? No AVR 328, existe uma segunda interrupção para o registrador de deslocamento de TX vazio. Qual bit se aproxima de um sinalizador desse tipo de ocorrência?
A interrupção sinalizada pelo flag "TXIF", ligado a "TXREG", indica que "TXREG" foi esvaziado. No AVR 328, há a interrupção de fim de transmissão (TSR vazio). O bit "TRMT" se assemelha a essa funcionalidade, sendo o único associado ao TSR que recebe valor.
3. Cálculo da Taxa de Comunicação
A taxa de comunicação é dada por: BaudRate = Fosc/[64(X + 1)], onde Fosc é a frequência do clock e X é o valor do registrador SPBRG. Calcule X para 9.600 bits/s com clock de 16 MHz.
X = 25
4. Registrador OCRnA e Interrupções
Qual a utilidade do registrador OCRnA?
O OCRnA realiza comparação com o valor de contagem, sinalizando a igualdade no bit "OCnA" e gerando interrupção, se habilitada.
Como funcionam as duas interrupções sinalizadas (Int.Req.)? Como configurar o mesmo temporizador para gerar ambas em um programa?
TOVn: overflow da contagem em "TCNTn"; OCnA: igualdade entre contagem e OCRnA. A configuração para ambas deve ser no modo normal. A contagem não é zerada na igualdade, permitindo dois tempos: toc = clktn * OCnA
e tov = clktn * TCNTn
.
Para que serve a linha "Direction" (saída do bloco Control Logic)?
Para selecionar entre contagem normal e regressiva em "TCNTn".
5. Interrupções Externas no Arduino e AVR 328
A função attachInterrupt(interrupt, function, mode)
ativa e define tratadores para interrupções externas. Como configurar ambas as interrupções, sendo INT0 em modo CHANGE e INT1 em modo RISING, usando a biblioteca AVRLib?
EICRA = (1 << ISC00) | (1 << ISC10) | (1 << ISC11); EIMSK = (1 << INT0) | (1 << INT1);
Como definir o tratador das interrupções externas usando ISR()
, INT0_vect
e INT1_vect
?
ISR(INT0_vect) { /* tratador da int. ext. 0 */ }
ISR(INT1_vect) { /* tratador da int. ext. 1 */ }