Beruflich Dokumente
Kultur Dokumente
Maio de 2018
Sumário
2
3
5.3.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.3.2 Configuração dos registradores do Timer1 para geração de onda qua-
drada (modo CTC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.3.3 Configuração da frequência da onda quadrada . . . . . . . . . . . . . 28
5.4 PWM rápido (fast PWM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Introdução ao microcontrolador
ATMega 328p
Memórias:
Periféricos:
Recursos de Reset:
Watchdog timer ;
Power-on reset;
Brown-out reset;
4
5
2.2 Configurações
Configuração como “saı́da”de pinos de E/S digital, no caso do pino PB1, porta B
(demais pinos e portas têm identificadores similares):
6
7
#include <avr/io.h>
#include <util/delay.h>
void setup(){
DDRB = 0xff; // 8 pinos da porta B configurados como saı́das
}
void main(void){
setup();
while (1) {
PORTB ^= 0xFF; // Complementa saı́da
_delay_ms(100);
}
}
8
Referências
Datasheet do componente ATMega 328p
3.1 Introdução
O mecanismo de interrupções está presente em microprocessadores para permitir o tra-
tamento de eventos assı́ncronos. Por “eventos assı́ncronos”entende-se a sinalização de
condições tais como, por exemplo, o pressionar de um botão por operador de máquina, o
transcurso de um intervalo de tempo definido por relógio externo, o recebimento de pacote
de transmissão serial, e o fim de uma conversão de analógico para digital.
No caso do programa estar preparado corretamente, a ocorrência de evento de inter-
rupção provoca a execução de uma função associada à interrupção. Esta função recebe o
nome de tratador de interrupção, ou interrupt service routine - ISR na nomenclatura em
inglês.
No microcontrolador ATmega 328p há vinte e seis fontes de interrupções, conforme
apresentadas na Tabela 3.1. Associado a cada interrupção, consta o endereço da instrução
de desvio para o respectivo tratador.
Com isso, pode-se descrever como a função do Arduino attachInterrupt() realiza a
ligação entre o evento de interrupção e o tratador correspondente:
o endereço do tratador é usado para compor a instrução jump localizada no endereço
mostrado na Tab. 3.1;
9
10
não contém periféricos em suas pastilhas, pois usam todo o recurso tecnológico disponı́vel
de fabricação de circuitos semicondutores para maximização do poder de processamento.
3. Habilitação da interrupção.
11
Neste momento, interessa conhecer detalhes de hardware e software associados às inter-
rupções externas, conforme apresentado a seguir. Tanto as interrupções cuja sinalização é
configurável (interrupções externas 0 e 1) como as interrupções por mudança de nı́vel serão
estudadas. Demais eventos geradores de interrupção do ATmega 328p mostrados na Tab.
3.1 serão estudados quando da análise dos periféricos aos quais estão associados.
Sintaxe:
Parâmetros:
Figura 3.2: Registrador de configuração dos modos de acionamento das interrupções INT0
e INT1.
Em programas Arduino escritos para uso direto dos recursos do ATmega 328p, o código
a seguir habilita a interrupção externa 0, modo FALLING:
void setup(){
EICRA = ( 1 << ISC01 ); // ISC01 = 1, resultando em "0000 0010" binário
EIMSK = ( 1 << INT0 ); // INT0 = 0, resultando em "0000 0001" binário
}
void loop(){
// Código do programa principal vem aqui
}
ISR( INT0_vect ){
// Código do tratador vem aqui
}
como resultado, tem-se o deslocamento do “1” para a esquerda “bit id” vezes.
Ou seja, linha EICRA = ( 1 << ISC01 ) equivale a escrever EICRA = 2 ou, ainda,
EICRA = 0b10.
14
PCINT0: pinos PB0 a PB7 (8 pinos), correspondentes aos eventos PCINT0 a PCINT7;
PCINT1: pinos PC0 a PC6 (7 pinos), correspondentes aos eventos PCINT8 a PCINT14;
PCINT2: pinos PD0 a PD7 (8 pinos), correspondentes aos eventos PCINT16 a PCINT23.
Note que há certa confusão na nomenclatura adotada pela Atmel, pois os eventos PCINT0
a PCINT2 do grupo PCINT0 têm a mesma denominação dos três grupos. Na prática, o
contexto do programa tende a deixar claro a qual elemento se refere o sı́mbolo (a um dos
três grupos ou a eventos do grupo PCINT0).
3.4.1 Configurações
O uso das interrupções de mudança de nı́vel envolve os três passos de configuração
comuns a todas as interrupções do ATmega 328p. São eles:
ISR( PCINTi_vect ){
.. código ..
},
Figura 3.6: Registradores de configuração dos pinos aptos a sinalizarem ocorrências das
interrupções PCINT.
void setup() {
PCICR = ( 1 << PCIE0 ); // Habilita interrupç~
oes PCINT do grupo 0
PCMSK0 = ( 1 << PCINT5 ); // Configura evento 5 do grupo 0 (pino 13 do
// Arduino) para sinalizar interrupç~
ao
}
void loop() {
// programa principal vem aqui
}
// Tratador da interrupç~
ao por mudança no pino 13
// do Arduino - grupo PCINT0
//
ISR( PCINT0_vect ){
// código do tratador vem aqui
}
16
Apêndice
Lista de tratadores reconhecidos pela AVRLibc para ATmega
328p
Capı́tulo 4
Contadores/temporizadores do
ATmega 328p
17
18
Figura 4.2: Evolução das saı́das do contador de 4 bits, indicando que um bit de
saı́da Qi é complementado sempre que todos os bits anteriores valem 1 e ocorre uma
transição positiva do pulso de clock. (Fonte: Electronics-tutorials em www.electronics-
tutorials.ws/counter/count 3.html).
3. no caso do flip-flop com saı́da QC , a porta lógica “E” (&) implica em mudança na
saı́da quando QA e QB forem 1; e assim por diante.
Figura 4.3: Evolução das saı́das em contador de 2 bits em um intevalo de 1 s. Note que na
saı́da QA tem frequência dividida por 2 em relação à frequência dos pulsos de clock, e QB
tem frequência fP /4.
TCNT1: contagem em 16 bits (módulo 216 = 65.536), geração de onda quadrada e PWM,
módulo de captura de eventos;
O diagrama da Fig. 4.4 mostra o esquema básico dos contadores deste microcontrolador,
com n sendo substituı́vel por 0, 1 ou 2 de acordo com o contador em análise. O registrador
T CN T n representa os contadores em si, cujo avanço se dá pelo sinal “Count”. Os sinais
“Clear” e “Direction” comandam, respectivamente, a atribuição de zero ao contador e a
direção de contagem, se progressiva ou regressiva. “TOVn” sinaliza que a contagem atingiu
o valor máximo (Timer OVerflow ) e “clkTn ” é o sinal de clock. A figura indica, ainda, que
o sinal “TOVn” está associado a um evento de interrupção (Int. Req.), a serem abordados
mais adiante.
Os três contadores / temporizadores têm comportamentos semelhantes, distinguindo-se
por funcionalidades especı́ficas e pelo módulo de contagem. Neste documento, opta-se por
analisar em detalhes o contador TCNT1, por ser de 16 bits (permitindo temporizações
relativamente longas, compatı́veis com acionamentos e amostragens próximos da escala de
1 s) e por conter mais funcionalidades do que os demais.
20
Figura 4.4: Diagrama do esquema básico dos três contadores do ATmega 328p, com a
letra n nos sı́mbolos podendo ser lida como 0, 1 ou 2; o registrador TCNTn representa
os contadores em si e mantém o valor da contagem; “Count” provoca o avanço da conta-
gem, “Clear” zera o valor de contagem, e “Direction” comanda contagem progressiva ou
regressiva. “TOVn” sinaliza que a contagem atingiu o valor máximo (Timer Overflow ) e
“clkTn ” é o sinal de clock.
4.3.1 Caracterı́sticas
O timer 1 disponibiliza vários recursos ao programador, dos quais interessam neste
capı́tulo aquelas relacionadas às temporizações periódicas. Ainda assim, apresentam-se
abaixo todas as funcionalidades do periférico, algumas das quais serão abordadas em
capı́tulos posteriores. São elas:
Bloco Clock Select, o qual define se o avanço da contagem se dá por pulso externo
no pino “T1” (modo de contagem de pulsos) ou de acordo com “clock” interno pré-
escalonado (From Prescaler ).
com Nc sendo o número de contagens (pulsos) realizadas e fp sendo a frequência dos pulsos
de avanço do contador. Se não for usada divisão de frequência, então
fp = fCLK IO ,
Tabela 4.1: Valores de divisão de frequência do ATmega 328p, indicando os valores res-
pectivos dos bits de configuração (localizados no registrador TCCR1B); notar que CS12 =
CS11 = CS10 = 0 implica em temporizador desligado.
23
Por essa razão, temporizadores de sistemas microcontrolados têm divisores de frequência
associados, os quais permitem o uso de ondas de pulsos com frequências menores do que
o clock do sistema. No caso do ATmega 328p, as divisões de frequência disponı́veis estão
mostradas na Tab. 4.1.
Com o uso de prescalers, a expressão (4.2) pode ser reescrita como:
PRSC
Tc = Nc , (4.3)
fCLK IO
com PRSC ∈ {1, 8, 64, 256, 1024} no caso do ATmega 328p.
Em aplicações práticas, o programador está interessado em obter um certo tempo de-
sejado Td para temporização de eventos periódicos. Isso implica em determinar:
Solução: A Tab. 4.2 mostra os valores de Nc para diferentes valores de PRSC. Observa-se
que nem todas as contagens são adequadas para o timer 1, pois:
Assim, apenas os valores de PRSC igual a 64 e 256 devem ser considerados. A escolha
entre eles é arbitrária.
PRSC Nc
1 1.600.000
8 200.000
64 25.000
256 6.250
1024 1.562,5
CTC : Neste modo, o contador volta para zero no momento da comparação com OCR1A,
daı́ a designação em inglês como Clear Timer on Compare.
Tabela 4.3: Configuração de bits para operação em modo normal e em modo CTC (Clear
Timer on Compare).
TCCR1B: registrador de configuração com bits para modo CTC e para valor de prescaler.
Para uso das formas de onda, segue-se o procedimento de configuração dos temporiza-
dores conforme discutido nas seções seguintes. Aborda-se apenas o temporizador 1, de 16
bits. Os demais têm configurações similares.
27
28
Tabela 5.1: Tabela de configuração de TCCR1A para onda quadrada, modo CTC.
Registradores envolvidos:
00: a operação não gera forma de onda, caracterizando a forma usual de uso do Timer1 e
liberando o pino associado à OC1x para operar como pino de E/S digital convecional;
01: modo “toggle”, isto é, a saı́da em OC1x é complementada a cada igualdadade entre a
contagem em TCNT1 e o valor em OCR1A;
29
Figura 5.2: Localização dos bits de configuração do registrador TCCR1A; para geração de
ondas quadradas no modo “toggle”, deve-se atribuir 1 aos bits COM1A0 (para geração em
OC1A) e COM1B0 (para geração em OC1B).
Figura 5.3: Localização dos bits de configuração do registrador TCCR1B; para o modo
CTC, o bit WGM12 deve ser colocado em 1.
Registradores envolvidos:
Conforme indicado na Tabela 16-4 do manual do componente (ver acima), há cinco
modos diferentes de configuração do PWM rápido:
Figura 5.5: Ilustração da geração de onda PWM; segmentos horizontais (–) indicam
condição de igualdade com registradores de comparação.
Introdução à programação
modular em linguagem C
6.1 Introdução
Os módulos de programas em linguagem C consistem de códigos auto-contidos e defi-
nidos em arquivos individualizados. Assim, os blocos implementam códigos agrupados de
acordo com funcionalidades comuns em arquivos separados.
As principais utilidades dos módulos são:
Facilitar a verificação de erros no programa, uma vez que os módulos sejam separados
e conectados apenas por meio de interfaces “leves” e bem definidas.
32
33
#include <avr/io.h>
void setup(){
DDRB = ( 1 << DDB1 ); // Configura pino PB1 como saı́da
}
void main(void){
setup();
while (1) {
PORTB ^= ( 1 << PB1 ); // Complementa saı́da
}
}
int main(void){
setup();
while (1){
complementPortB( PINB1 ); // Complementa PB1
}
}
portasES.c
3. No ı́cone de pasta do projeto, clique com o botão direito e, no menu que aparece,
escolha “Add → New item..”;