Primeiros Passos

mutchuloko
Mensagens: 1
Registrado em: Ter Fev 02, 2016 10:55 pm

Primeiros Passos

Mensagem por mutchuloko » Qui Fev 04, 2016 5:27 pm

Microcontroladores Família AVR


Primeiros Passos

Instalação de Ferramentas
Pinagens
Estruturas de Código em C
Digital Input/Output


Ferramentas Necessárias

  • Linux Setup:
    -Para usuários GNU/Linux  é necessária a instalação do GNU Tool Chain
    1. Debian-Based:

      Código: Selecionar todos

      $sudo apt-get install avrdude binutils-avr avr-libc gcc-avr
    2. Red-Hat ou Fedora:

      Código: Selecionar todos

      $sudo yum intsall avrdude avr-gcc avr-binutils avr-libc
    3. Archlinux:

      Código: Selecionar todos

      $sudo pacman -S avrdude avr-gcc avr-binutils avr-libc
      [/color]
    Importante e necessário, para não ter que fazer logado como usuário root, adicionar o usuário aos grupos uucp e lock
    Mais informção no site: Arduino no Archlinux

    Código: Selecionar todos

    $sudo gpasswd "usuário" uucp
    $sudo gpasswd "usuário" lock
  • Windows Setup:
    -Instalando o Atmel-Studio (Software oficial da Atmel) já é o suficiente.
  • Mac Setup:
    -AVR CrossPack é a maneira para compilar seus códigos do AVR no Mac. Está incluso todas as ferramentas para compilar, AVRDUDE, e mais.
Pinagens

Imagem
  • Port B (PB7:0) XTAL1/XTAL2/TOSC1/TOSC2
    • Port B é uma porta bidirecional(I/O) de 8-bits com resistor de pull-up interno.
    • Como inputs, os pinos do Port B, que são por default low, serão fonte de corrente se ativados os resistores de pull-up
    • Serão tri-state quando uma condição de reset se tornar ativo, mesmo se o clock não é executado
    • PB6 pode ser usado como input para o amplificador de inversão do Oscilador e input para operar o circuito do clock interno
    • PB7 pode ser usado como input para o amplificador de inversão do Oscilador. Se o Oscilador RC Calibrado é usado como uma pequena fonte de clock, PB7 e PB6 são usados como entrada TOSC2/1 para o Timer/Counter2 Assíncrono, se o bit AS2 em ASSR está setado
  • Port C (PC5:0)
    • Port C é uma porta bidirecional(I/O) de 7-bits com resistor de pull-up interno.
    • Como entrada, os pinos Port C, que são por default low, serão fonte de corrente se ativados os resistores de pull-up
    • Serão tri-state quando uma condição de reset se tornar ativo, mesmo se o clock não está executando
  • PC6/(~RESET)
    Note que as características do PC6 deferem dos outros pinos do Port C.
    • Se o RSTDISBL Fuse é programado, PC6 é usado como um pino de I/O
    • Se o RSTDISBL Fuse é programado, PC6 é usado como uma entrada de Reset. Aplicando sinal de nível low no pino por um período mais longo que o comprimento mínimo do pulso gerará um Reset, mesmo se o clock não está executando
  • Port D (PD7:0)
    • Port D é uma porta bidirecional(I/O) de 8-bits com resistor de pull-up interno.
    • Como entrada, os pinos Port D, que são por default low, serão fonte de corrente se ativados os resistores de pull-up
    • Serão tri-state quando uma condição de reset se tornar ativo, mesmo se o clock não está executando
    Há mais algumas funções alternativas para cada Port que será abordado em um outro tópico
Estrutura do Código C para AVR

Código: Selecionar todos

#include <avr/io.h>
[Provavelmente algumas funções definições]
int main (void){
[Inicialização do chip (Definição de saídas e entradas, etc...)]
	 while(1){
		//Código
	 }
	 return(0);
}
Usando Loops

Todo loop funcionará enquanto uma condições especificada for verdadeira. Então para que o loop se torne infinito, sua condições deve ser sempre verdadeira ou 1. 
No caso de C não existe variáveis booleanas, então ele reconhece uma condição ou comparação com 1 ou em branco(no caso do for(;;)) sendo verdadeira.
Há três tipos de loop em C que podem ser usados para nosso código, são eles:
Enquanto verdadeiro, faça:
[code]while(1){ 
      //Código
}[/code]
Faça, enquanto verdadeiro:
[code]do{
       //Código
}while(1);[/code]
Para uma condição inicial até uma condição final, faça:
[code]for(;;){      
       //Código
}[/code]
Manipulando os Ports(I/O)

Todos os PORTS do AVR são configuráveis como sendo input ou output digital.
Os PORTS são B, C e D que estão no datasheet como PB[0..7], PC[0..6] e PD[0..7].
Será  falado nas próximas aulas os ports com entradas analógicas no qual é muito utilizado em comunicação com sensores.

Para implementar em linguagem C é necessário conhecer dois registradores.

Data Direction Register(DDRn): Define a direção dos PORTS, se é entrada ou saída, caso seja setado com bit igual a 1 lógico o PORT será configurado como saída caso contrário será configurado como entrada.

Data Register(PORTn): Basicamente configura o pino em nível lógico alto (High/1) ou baixo (Low/0), porém há mais combinações entre o PORTn e o DDRn que deixa de ser somente High ou Low. Segue a tabela abaixo com essas configurações:

[align=center]Imagem[/align]

Port Input Pin(PIN): Somente de leitura do pino, mutio útil para fazer comparações dos estados do pinos

Exemplo Blink:
[align=center]Imagem[/align]
[align=center]Imagem[/align]

 Pode ser usado a plataforma e a própria IDE do Arduino para usar os códigos em C puro para AVR

-Material Necessário
 [list][*]1 resistor 220ohm
 [*]1 LED [/list]


[code]
#include <avr/io.h>       // Possui toda a configuração do uC
#include <util/delay.h> // Adiciona a funcao delay

int main(void)
{
    DDRB |= (1 << PB0);   // Configura o PORTB PB0 como saída
    PORTB = 0b11111110;// Neste caso o PB0 será saída com nível lógico low e o resto dos ports estarão 
                                    //com o pull-up habilitado
    
    //Loop Inifinito
    while(1){
        PORTB |= (1 << PB0);   // Liga o LED, atribui nível lógico High ao PORTB PB1
        _delay_ms(500);          // Delay de 500ms ou 0.5s
        PORTB &= ~(1 << PB0); // Desliiga o LED, atribui nível lógico low ao PORTB PB1
        _delay_ms(500);          // Delay de 500ms ou 0.5s       
    }     
    return 0;
}

[/code]

É possível configurar os registradores de várias maneiras, tanto para DDRn quanto para PORTn os métodos sãos os mesmos:
     [list][*]Hexadecimal: DDRB = 0x01; PORTB PB0 como saída
     [*]Binário         : DDRB = 0b00000001; O mesmo efeito
     [*]Operador lógico Bitwise(Método que será explicado um outra hora): DDRB |= (1 << PB1) ;[/list]
É o mesmo que DDRB = DDRB | (1 << PB0) ; O barra significa ou lógico

Pode ser utilizado qualquer um sem necessidade de escolher apenas um método
Pode-se utilizar para mais portas ao mesmo tempo DDRB |= (1 << PB0) | (1 << PB1)
No datasheet é recomendado que sempre ative os resistores de pull-up nas portas que não serão utilizadas 


 Algumas explicação que serão focadas em outro tópico:
PORTB &= ~(1 << PB0) 
[list][*]&= significa que estou fazendo um and lógico na port PB0
       [*]~ significa que estou fazendo um not lógico no dado da porta, logo estou invertendo seu nível, de high(1) para low(0), portanto qualquer and lógico com um valor zero seu resultado será zero(0 ou Low)[/list]
         
Uma outra lógica para esse exemplo, é usando um operador lógico chamado XOR ou OU Exclusivo:
[code]
while(1){
    PORTB ^= (1 << PB0);
    _delay_ms(500);
}[/code]

[list][*] ^= significa que estou fazendo um XOR no port PB0[/list]

Lógica XOR:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0

Responder