quinta-feira, 2 de abril de 2015

Usando os registradores que manipulam os PORTs no Arduino

A Placa do Arduino UNO tem a seguinte Pinagem (os quadradinhos em rosa mostram os numeros dos pinos adotados pelos fabricantes de Arduino):


Sabemos que o coração do Arduino é o chip Microcontrolador ATmega328 fabricado pela ATMEL.
Este chip, que é quem efetivamente manda nesta placa, tem a seguinte  pinagem, com seus 3 PORTs (B, C e D):


Os registradores de PORT permitem de manipulação mais rápida dos pinos de  I/O do microcontrolador em uma placa Arduino.
Ao invés de usar DigitalWrite( ) e DigitalRead( ), é vantajoso usar diretamente os registradores DDRx, PORTx e PINx.
 Os chips usados ​​na placa Arduino (o ATmega8 e ATmega168) tem três PORTS:

PORT B (pino digital de 8 a 13)
PORT C (pinos de entrada analógica)
PORT D (pinos digitais 0-7)
Cada PORT é controlada por três registradores, para os quais também são definidas variáveis ​​na linguagem Arduino.

O registrador DDR, determina se o pino é uma entrada ou saída.

O registrador PORT  controla se o pino está em nivel alto (1) ou em nivel baixo (0),
e o registrador PIN lê o estado dos pinos definidos como entrada usando-se a função pinMode ().

Os pin-outs dos chips ATMega8, ATmega168 e ATmega328 mostram os PORTS.

O chip mais moderno ATmega328P (que equipa o Arduino UNO) segue a mesma pinagem do ATMega168.

Os registradores DDR e PORT podem ser tanto de escrita e leitura.

Registradores PIN são apenas para leitura.

PORTD está mapeado no Arduino para os pinos digitais 0-7
-------------------------------------------------------
PORTD mapeia os pinos 0 até 7 da placa do Arduino;

DDRD - Port D Data Direction Register - leitura/escrita
PORTD - Port D Data Register - Leitura/escrita
PIND - Port D Input Pins Register - somente leitura
-------------------------------------------------------
PORTB mapeia os pinos 8 até 13. Os dois bits mais altos (6 e 7) mapeiam os pinos do cristal e não são utilizaveis (uma vez que já tem um cristal de quartzo de 16MHz ligados a eles).

DDRB - Port B Data Direction Register - leitura/escrita
PORTB - Port B Data Register - leitura/escrita
PINB - Port B Input Pins Register - somente leitura
-------------------------------------------------------
PORTC mapeia os pinos ANALOGICOS 0 até 5.
Pins 6 e 7 somente são acessiveis no Arduino Mini

DDRC - Port C Data Direction Register - leitura/escrita
PORTC - Port C Data Register - leitura/escrita
PINC - Port C Input Pins Register - somente leitura

Cada bit destes registradores correspondem a um único pino do chip.

Por exemplo, o bit mais baixo (bit 0) de DDRB, PORTB, e PINB refere-se ao pino PB0 (pino digital 8).


Para um mapeamento completo dos números de pinos do Arduino para PORTs e bits, consulte o diagrama para o chip em questão: ATmega8, ATmega168. (Note que alguns bits de um PORT  pode ser usado para outros fins diferentes de I/O).
Seja cuidadoso para evitar de mudar os valores dos bits dos registradores correspondente a eles.

Exemplos:

Referindo-se aos pinos do diagrama acima, os registradores PORTD controlam pinos digitais de 0 até 7 do Arduino.

Você deve observar, no entanto, que os pinos 0 e 1 são utilizados para comunicação serial para programação e depuração do Arduino.
Deve-se evitar mudar os registradores que controlam estes pinos, a menos que seja necessário para as funções de entrada e saída serial.
Esteja ciente de que mudanças na configuração destes pinos pode interferir com o download do programa ou de depuração.

DDRD é o registrador de controle de direção para PortD (pinos digitais 0-7 do Arduino).
Neste registrador de controle, os bits definem as entradas ou saídas, por exemplo:

DDRD = B11111110;            // Define pinos 1-7 como saídas, o pino 0 como entrada.

DDRD = DDRD | B11111100;  //  Este modo é mais seguro, uma vez que define os pinos 2-7 como saídas
                                                  //  Sem alterar o valor dos pinos 0 e 1, que são RX e TX, usados na                                                            // comunicação serial


PORTD é o registrador que controla o estado das saídas.

 Por exemplo;

PORTD = B10101000;             // Ajusta os pinos digitais 7,5 e 3 com nivel ALTO

Você medirá 5 volts nestes pinos somente se tais pinos foram definidos como saídas usando o registrador DDRD ou a função pinMode( ).

PIND é o registro de entrada. Ele vai ler todos os pinos de entrada digitais ao mesmo tempo.



-------------------------------------
Por que usar a manipulação de PORT no Arduino ?

 Aqui estão alguns dos aspectos positivos de acessar diretamente os registradores que controlam os PORTs:

Você pode precisar de ser capaz de comutar pinos muito rapidamente, ou seja, dentro de frações de um microssegundo.
 Se você olhar para o código-fonte em lib / metas / arduino / wiring.c, você vai ver que digitalRead( ) e digitalWrite( ) utilizam cada um cerca de uma dúzia de linhas de código, que são compilados em muito poucas instruções de máquina.
Cada instrução de máquina requer um ciclo do clock de 16MHz, o que pode adicionar delays indesejáveis em aplicações sensíveis ao tempo.
O acesso direto ao PORT pode fazer o mesmo trabalho em um número bem menor de ciclos de clock.
Às vezes pode ser necessário definir vários pinos de saída, exatamente no mesmo tempo.
 Chamando digitalWrite (10, HIGH); seguido por digitalWrite (11, HIGH); fará com que o pino 10 vá para o nível alto vários microssegundos antes pino 11, o que pode confundir certos circuitos digitais externos sensíveis ao tempo de borda de subida.
Alternativamente, você pode setar os dois pinos em nivel alto, exatamente ao mesmo tempo no tempo usando PORTB | = B1100;
Se você estiver com pouca memória de programa, você pode usar esses truques para tornar seu código menor.
Ela exige muito menos bytes de código compilado para escrever simultaneamente um grupo de pinos de hardware ao mesmo tempo através dos registradores de portas do que gastaria usando um loop "for" para definir cada pino separadamente.
 Em alguns casos, isso pode fazer a diferença entre o seu programa caber na memória flash do microcontrolador utilizado no Arduino.

Nenhum comentário:

Postar um comentário