








Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Os melhores documentos à venda: Trabalhos de alunos formados
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Comunidade
Peça ajuda à comunidade e tire suas dúvidas relacionadas ao estudo
Descubra as melhores universidades em seu país de acordo com os usuários da Docsity
Guias grátis
Baixe gratuitamente nossos guias de estudo, métodos para diminuir a ansiedade, dicas de TCC preparadas pelos professores da Docsity
Avr Automação
Tipologia: Notas de estudo
1 / 14
Esta página não é visível na pré-visualização
Não perca as partes importantes!
O microcontrolador
Breve introdução
O surgimento da microeletrônica no início da década de 70 possibilitou a criação de processadores em uma única pastilha ou chip. Porém, só era possível processar as informações com o auxílio de periféricos, ou seja, dispositivos de entrada e saída (I/O) e memórias. Surge o computador.
A crescente integração e a necessidade logo permitiu encapsular um microprocessador, memórias e periféricos de entrada e saída em um único chip, surgindo assim o microcontrolador e uma nova era para eletrônica a dos microcontroladores.
O microcontrolador AVR
Nosso curso terá início com o microcontrolador AT90S2313 ou Attiny2313 (versão melhorada) e com o tempo será substituído por outros de maior porte como o ATmega 8 e o ATmega16.
AT90S2313 ATtiny
Descrição e conexão de alguns pinos:
VCC ⇒ Alimentação positiva 5,0 VDC
Lembre-se: o microcontrolador é um componente que trabalha com grandezas digitais (1 e 0). Por isso não ultrapasse os valores determinados, se não poderá danificar o componente.
GND ⇒ Terra ou referência
RESET ⇒ Em nível lógico baixo, o micro controlador para de executar as instruções em nível alto ele continua. Lembrando: Baixo = 0 VDC e Alto = 5,0 VDC
Importante: Para efetuar o reset o pino deve estar em nível 0 em pelo menos 50 ns ou mais.
XTAL1 e 2 ⇒ Nestes pinos deve ser conectado um cristal oscilador que dará a base de tempo para o processamento das informações.
Os valores dos capacitores C1 e C2 estão entre 17pF e 33pF. Lembrar que estes capacitores são cerâmicos.
Descrever todos os pinos seria uma tarefa cansativa, tanto para o leitor como para o leitor, então eles serão descritos à medida que estiverem sendo usados.
Conectando a alimentação, o clock e o reset do microcontrolador.
Explorando os I/O dos microcontroladores AVR
Os microcontroladores possuem portas ou “PORTS” que são pinos bidirecionais, ou seja, podem ser podem ser configuradas, via software, como entrada ou saída. O AT90S2313 tem dois conjuntos de portas que são:
PORTB ⇒ Corresponde a oito pinos que vão do PB0 ao PB
Três registros de oito bits são responsáveis pelo controle e configuração destas portas e estão associados a cada pino do PORTB. Estes registros são:
PORTB - Data register (Registro de dados)
Comanda os pinos configurados como saída, ou seja, envia “0” ou “1”.
BIT 7 6 5 4 3 2 1 0 $18 ($38) PORTB7 PORTB6 PORTB5 PORTB4 PORTB3 PORTB2 PORTB1 PORTB Read/write R/W R/W R/W R/W R/W R/W R/W R/W Initial value 0 0 0 0 0 0 0 0
DDRB Data Direction Register (Registro de direção de dados)
Configura a porta se “0” será entrada, se “1” será saída.
BIT 7 6 5 4 3 2 1 0 $17 ($37) DDRB7 DDRB6 DDRB5 DDRB4 DDRB3 DDRB2 DDRB1 DDRB Read/write R/W R/W R/W R/W R/W R/W R/W R/W Initial value 0 0 0 0 0 0 0 0
PINB Input Pins Adress (Registro de entrada de endereço)
Comanda os pinos configurados como entrada, ou seja, recebe “0” ou “1”.
BIT 7 6 5 4 3 2 1 0 $16 ($36) PINB7 PINB6 PINB5 PINB4 PINB3 PINB2 PINB1 PINB Read/write R R R R R R R R Initial value N/A N/A N/A N/A N/A N/A N/A N/A
#include <90S2313.h> // chama biblioteca do microcontrolador utilizado.
void main (void) { DDRB=0b11111111; // configura todo o PORTB como saída. PORTB=0b00000000; // envia “0” para todo o PORTB ascendendo os LEDs }
Se o projetista desejar ascender somente o LED conectado ao PORTB.4 (pino 16) b asta modificar o código. Vejamos:
#include <90S2313.h> // chama biblioteca do microcontrolador utilizado.
void main (void) { DDRB=0b11111111; // configura todo o PORTB como saída. PORTB=0b11101111; // envia “0” somente para o PORTB.4 ascendendo somente este LED }
PORTD ⇒ Corresponde a oito pinos que vão do PD0 ao PD
Três registros de oito bits são responsáveis pelo controle e configuração destas portas e estão associados a cada pino do PORTD. Estes registros são:
PORTD - Data register (Registro de dados)
Comanda os pinos configurados como saída, ou seja, envia “0” ou “1”.
BIT 7 6 5 4 3 2 1 0 $12 ($32) ---^ PORTD6^ PORTD5^ PORTD4^ PORTD3^ PORTD2^ PORTB1^ PORTD Read/write --- R/W R/W R/W R/W R/W R/W R/W Initial value --- 0 0 0 0 0 0 0
DDRD Data Direction Register (Registro de direção de dados)
Configura a porta se “0” será entrada, se “1” será saída.
BIT 7 6 5 4 3 2 1 0 $11 ($31) --- DDRB6 DDRB5 DDRB4 DDRB3 DDRB2 DDRB1 DDRB Read/write --- R/W R/W R/W R/W R/W R/W R/W Initial value --- 0 0 0 0 0 0 0
PIND Input Pins Adress (Registro de entrada de endereço)
Comanda os pinos configurados como entrada, ou seja, recebe “0” ou “1”.
BIT 7 6 5 4 3 2 1 0 $10 ($30) --- PINB6 PINB5 PINB4 PINB3 PINB2 PINB1 PINB Read/write --- R R R R R R R Initial value --- N/A N/A N/A N/A N/A N/A N/A
Lembrando que o bit 7 desses registros não tem valor relevante algum, pois o controle e configurações são do bit 0 ao bit 6.
Uma explicação mais prática.
Reforçando que só é possível programar conhecendo a placa de desenvolvimento ou aplicação, uma vez que já adicionamos LEDs ao PORTB adicionaremos agora quatro botões push buttons normalmente abertos ao PORTD.
Os botões são entradas de informações, ou seja, os pinos onde elas estão conectadas devem ser entradas, neste caso do PORTD.2 ao PORTD.5 devem ser configurados, via software, como entrada.
As chaves estão conectadas à terra do microcontrolador e a alguns pinos do PORTD, ou seja, se pressionarmos, por exemplo, o botão conectado ao PORTD.5 este recebe um sinal de terra ou “0”. Porém, se o botão estiver em sua condição, normalmente aberto, o PORTD.5 não recebe nem “0” (terra) nem “1” 5VCC. Assim, devemos programa-lo no estado inicial “1” e se receber “0” executará uma função.
Programa exemplo 02:
Pressionado o botão conectado ao PORTD.2 ascende o LED conectado ao PORTB.7.
Antes de iniciarmos os programa devemos recapitular alguns comandos básicos de linguagem C.
executar um comando sujeito ao resultado de um teste.
Estrutura:
if (condição) comando A else comando B
Descrição:
Se a condição proposta for verdadeira o comando A será executado, senão o comando B será executado.
PINA Input Pins Adress (Registro de entrada de endereço)
Comanda os pinos configurados como entrada, ou seja, recebe “0” ou “1”.
BIT 7 6 5 4 3 2 1 0 ---- ---- ---- ---- ---- PINA2 PINA1 PINA Read/write ---- ---- ---- ---- ---- R/W R/W R/W Initial value ---- ---- ---- ---- ---- N/A N/A N/A
Outros microcontroladores estudados neste curso, como o Atmega16 chegam ter 32 portas de I/O o que sem dúvida auxilia na elaboração de projetos de maior complexbilidade.
Reforçando conceitos sobre o hardware
Como já foi dito, só é possível o projetista programar um microcontrolador se ele conhecer o hardware de aplicação ou desenvolvimento. Pensando nisso, o hardware e o microcontrolador serão mudados, a fim de reforçar o conjunto software hardware.
A Idéia
Usaremos agora o attiny2313 para controlar o sentido de um motor DC, ou seja, se o botão horário for pressionado ele gira no sentido horário se o botão anti-horário for pressionado ele gira no sentido anti- horário.
A nova placa de aplicação
Notem que, somente as saídas PB0 e PB7 do Attiny2313 foram utilizadas e nelas estão conectados transistores NPN (necessitam receber “1” para chaveamento). As entradas estão ligadas diretamente a um resistor e a fonte VCC, ou seja, já estão recebendo “1” os botões se pressionados enviarão “0”.
Agora, vamos ao programa:
#include <tiny2313.h> // chama biblioteca do microcontrolador utilizado.
void main (void)
{
// configurando os pinos
DDRD. 4=0; // configura o PORTD.4 como entrada. DDRD. 5=0; // configura o PORTD.5 como entrada.
DDRB. 0=1; // configura o PORTB.0 como saída DDRB. 7=1; // configura o PORTB.7 como saída
// fim das configurações
While (1) // loop infinito.
// Programa principal.
{ if (PIND.4==0) // Se o PIND.4 for igual a “0” ( botão pressionado). PORTB.7=1; // O PORTB.7 será “1” e o sentido anti-horário. else // senão PORTB.7=0; // o PORTB.7 será “0” motor parado.
if (PIND.5==0) // Se o PIND.5 for igual a “0” ( botão pressionado). PORTB.0=1; // O PORTB.5 será “1” e o sentido horário. else // senão PORTB.0=0; // o PORTB.7 será “1” motor parado. }
}
Mais conceitos sobre linguagem C
A função delay () ⇒ Permite ao programador inserir uma pausa entre uma execução e outra, porém para que a função seja reconhecida devemos inserir a biblioteca delay.h. Vejamos um exemplo.
Gerando Clock com o Attiny2313 (Pisca-Pisca)
#include <tiny2313.h> // chama biblioteca do microcontrolador utilizado. #include <delay.h> // chama biblioteca delay.
void main (void) {
// Configurações iniciais
DDRB=0b11111111; // configura todo o PORTB como saída. PORTB=0b11111111; // garante que os leds estejam inicialmente todos desligados.
// programa principal
While (1) // loop infinito.
{ PORTB=0b11111110; // envia “0” para o PORTB.0 e o LED1 acende. Delay_ms(100);
PORTB=0b11111101; // envia “0” para o PORTB.1 e o LED2 acende. Delay_ms(100);
PORTB=0b11111011; // envia “0” para o PORTB.2 e o LED3 acende. Delay_ms(100);
PORTB=0b11110111; // envia “0” para o PORTB.3 e o LED4 acende. Delay_ms(100);
PORTB=0b11101111; // envia “0” para o PORTB.4 e o LED5 acende. Delay_ms(100);
PORTB=0b11011111; // envia “0” para o PORTB.5 e o LED6 acende. Delay_ms(100);
PORTB=0b10111111; // envia “0” para o PORTB.6 e o LED7 acende. Delay_ms(100);
PORTB=0b01111111; // envia “0” para o PORTB.7 e o LED8 acende. Delay_ms(100); } }
Um seqüencial de 8 LEDs com Attiny
Agora que já conhecemos mais uma função da linguagem C podemos montar um circuito seqüencial, porém, utilizaremos botões, assim, se o Botão A for pressionado a seqüência será do LED1 ao LED8 e se o Botão A não for pressionado os LEDs deverão permanecer todos apagados.
Solução:
Agora será necessário o comando if-else e a função delay. Vejamos o programa:
#include<tiny2313.h> #include<delay.h>
void main (void)
{ // configurando os pinos
DDRB=0b11111111; //configura todo o PORTB como saída PORTB=0b11111111; //garante que a saída seja inicialmente 1 (apagados)
DDRD.2=0; DDRD.3=0;
while(1)
if(PIND.2==0) // se o PIND.2 for "0" executa que esta entre as chaves { PORTB=0b11111110; delay_ms(100);
PORTB=0b11111101; delay_ms(100);
PORTB=0b11111011; delay_ms(100);
PORTB=0b11110111; delay_ms(100);
PORTB=0b11101111; delay_ms(100);
PORTB=0b11011111; delay_ms(100);
PORTB=0b10111111; delay_ms(100);
PORTB=0b01111111; delay_ms(100); } else // senão todo o PORTB vai a zero PORTB=0b00000000; }
em outras linguagens.
Estrutura:
for ( Início da variável; Termino desejado para variável; Incremento ou decremento da variável ); Comando;
Descrição:
Uma variável de controle, geralmente um contador, recebe um valor inicial. O trecho de programa que pertence ao laço é executado e ao final a variável de controle é incrementada ou decrementada e comparada com o valor final que ela deve alcançar. Caso a condição de término tenha sido atingida o laço é interrompido.
#include<attiny2313.h>
void main (void)
{ // Declarando as variáveis
unsigned int tempo; //declara uma variável de 16 bit chamada tempo
// Configurando as portas
DDRB=0b11111111; // configura todo o PORTB como saída PORTB=0b00000000; // comanda o PORTB para que seja inicialmente "0"
// Inicio do programa
while(1) // looping infinito
{
for(tempo=0; tempo<=60000; tempo++); // Para o tempo entre 0 e 15ms a saída será 1 PORTB=0b00100001; // Vermelho 2 e Verde 1
for(tempo=0; tempo<=60000; tempo++); // Para o tempo entre 0 e 15ms a saída será 0 PORTB=0b00100010; // Vermelho 2 e Amarelo 1
for(tempo=0; tempo<=60000; tempo++); // Para o tempo entre 0 e 15ms a saída será 0 PORTB=0b10000100; // Verde 2 e Vermelho
for(tempo=0; tempo<=60000; tempo++); // Para o tempo entre 0 e 15ms a saída será 0 PORTB=0b01000100; // Amarelo 2 e Vermelho } }
Mais sobre C - Operadores
Os operadores indicam ao compilador a necessidade de se fazer manipulações matemáticas ou lógicas.
Aritméticos ⇒ São usados para calcular expressões matemáticas. Sendo classificados em duas categorias: os binários ou unários. Os operadores unários atuam na inversão de valores. Veja a tabela abaixo.
Operadores Descrição = Atribuição
Operador unário Ação
Incremento e decremento ⇒ O operador de incremento (++) soma um ao seu operando enquanto que o de decremento (--) subtrai um. Eles podem ser pré-fixados ou pós-fixados conforme mostra a tabela abaixo:
Operadores Ação ++ Incremento de 1 à variável -- Decremento de 1 da variável
Relacionais ⇒ São responsáveis pelas comparações de expressões nos programas. A lista completa se encontra abaixo:
Operadores Descrição
Maior = Maior igual < Menor <= Menor igual == Igualdade != Diferente
Lógicos ⇒ Os operados lógicos servem para interligar mais de uma operação relacional. E assim como os relacionais retornam zero para falso e um para verdadeiro.
Operadores Descrição && Lógica AND || Lógica OR ! Lógica NOT
Continua ...