• Nenhum resultado encontrado

Descrição dos pinos de entrada e saída e de funções especiais. Descrição dos modos de acesso: individual e por porto

N/A
N/A
Protected

Academic year: 2021

Share "Descrição dos pinos de entrada e saída e de funções especiais. Descrição dos modos de acesso: individual e por porto"

Copied!
10
0
0

Texto

(1)

Tópicos

• Descrição dos pinos de entrada e saída e de funções especiais • Descrição dos modos de acesso: individual e por porto • Acesso individual aos pinos

Objetivos

• Compreender o que são periféricos em um sistema microcontrolado • Compreender os modos de operação dos pinos de interface do Arduíno

Habilidades

• Utilização das rotinas de acesso individual aos pinos de entrada e saída • Acesso direto aos portos de entrada e saída do Arduíno

Bases Tecnológicas

Plataforma online 123d.circuits.io

Bibliografia Recomendada

• Primeiros passos com o Arduíno - Massimo Banzi e Michael Shiloh • Microcontrolador 8051 Detalhado - Denys E. C. Nicolosi

– Parte II - Capítulo 1

• Folha de dados do microcontrolador ATMega328: http://www.atmel.com/Images/

Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_ datasheet_Summary.pdf

• Documentação oficial do Arduíno

https://www.arduino.cc/en/Reference/PortManipulation https://www.arduino.cc/en/Tutorial/DigitalPins

https://www.arduino.cc/en/Reference/PinMode https://www.arduino.cc/en/Reference/DigitalRead https://www.arduino.cc/en/Reference/DigitalWrite

(2)

1

Periféricos

Um microprocessador/microcontrolador deve ser utilizado para um propósito bem definido, por exemplo: • Armazenar dados em um dispositivo de memória externo

• Controlar um processo (residencial ou industrial)

• Atuar como interface entre o usuário e uma outra máquina • Controlar um terminal bancário, impressoras, brinquedos e etc

• Controlar um sistema de injeção de combustível (ler sensores e ligar válvulas)

Para realizar essas funções, é necessário acessar informações em dispositivos que chamamos de periféricos. Alguns exemplos de periféricos são:

• Dispositivos de armazenamento em massa (HD, CD-ROM etc) • Sensores – chaves liga/desliga – sensores de posição – sensores de temperatura – sensores de pressão • Timers • Conversores

– Analógico para digital

– Digital para analógico (usando PWM por exemplo) • Controladores de comunicação

– Protocolo RS232

– Protocolo I2C: Inter-Integrated Circuit – Protocolo SPI: Serial Peripheral Interface – Protocolo 1248 para portas paralelas (ECP/EPP) • Controladores de interrupções • Watchdog Timer • Atuadores – válvulas – aquecedores – motores

• Impressoras, lâmpadas, displays e monitores

No caso dos microcontroladores, alguns dos periféricos já estão incluídos dentro do chip ou pastilha. Por exemplo, o microcontrolador ATMega328, usado na plataforma Arduíno UNO possui:

• 1K byte de memória EEPROM para armazenamento não volátil de informações • 2 timers de 8 bits

• 1 timer de 16 bits

• 1 timer do tipo watchdog: Usado para reiniciar o microcontrolador em caso de travamento de software (cão de guarda)

(3)

• Seis canais PWM: Modulação por largura de pulso (Pulse width modulation), pode ser usada para construir conversores Digital->Analógico

• Seis canais para conversão Analógico->Digital com resolução de 10 bits • Interface Serial RS232

• Interface para protocolo SPI • Interface para protocolo I2C

Além disso, existem os pinos de entrada e saída, disponíveis para realizar funções especiais, seja dos periféricos já integrados ao Arduíno, seja para comunicação com outros periféricos.

No total, o Arduíno Uno possui 20 pinos de entrada/saída, numerados de 0 até 19. Esses pinos podem ser acessados individualmente ou em grupos (os chamados portos de entrada/saída), além de alguns poderem ser usados para funções especiais

Pino Nome no microcontrolador E/S Digital Entrada Analógica Função especial Periférico Função PWM Porto

0 PD0 0 RX Serial D 1 PD1 1 TX 2 PD2 2 INT 0 Interrupções 3 PD3 3 INT 1 PWM 4 PD4 4 5 PD5 5 PWM 6 PD6 6 7 PD7 7 8 PB0 8 B 9 PB1 9 PWM 10 PB2 10 SS SPI PWM 11 PB3 11 MOSI PWM 12 PB4 12 MISO 13 PB5 13 SCK 14 PC0 14 0 C 15 PC1 15 1 16 PC2 16 2 17 PC3 17 3 18 PC4 18 4 SDA I2C 19 PC5 19 5 SCL

2

Acesso aos pinos de entrada/saída digital

Vamos apresentar agora os modos de configuração e acesso aos pinos de entrada/saída digital, de modo individual. Em geral os pinos 14 até 19 são utilizados para a leitura de sinais analógicos, restando então 14 pinos (numerados de 0 até 13) para entrada digital. Contudo isso não impede que, em caso de necessidade, os pinos 14 até 19 sejam configurados como pinos de E/S digital, perdendo-se a funcionalidade de leitura/conversão de sinais analógicos.

É possível realizar a configuração e o acesso aos pinos de entrada/saída digital de modo individual ou em blocos, segundo o porto ao qual pertencem os pinos. A seguir listamos algumas vantagens e desvantagens de cada modo

Acesso individual Acesso em grupo (Porto) Mais simples, pouca atenção Mais complicado, requer mais atenção

O código escrito é mais fácil de ser entendido e debugado código complexo, mais difícil de ser compreendido e debugado Mesmo código funciona em qualquer modelo de Arduíno pode requerer mudanças para operar em outros modelos

Acesso mais lento aos pinos Acesso mais rápido aos pinos Muda os pinos um a um, com atraso entre eles Muda todos os pinos de uma vez, sem atrasos

Código roda mais lento Código roda mais rápido Código ocupa mais memória Código ocupa menos memória

(4)

2.1

Acesso individual aos pinos de entrada/saída

Para utilizar um pino de entrada/saída, precisamos primeiro configurar o modo de operação do pino. No Arduíno existem três modos de operação para pinos de entrada/saída digital

1. INPUT: O pino atua como uma entrada digital, devendo ser conectado a um ponto com nível lógico (alto ou baixo) bem definido. Se deixarmos o pino flutuando (solto), o resultado da leitura é imprevisível, por isso pode ser necessário usar resistores de pull-up (puxar para cima) ou de pull-down (puxar para baixo)

2. INPUT_PULLUP: O pino atua como entrada digital, mas um resistor de pullup (puxar para cima) é conectado internamente. Esse resistor garante um nível lógico alto, caso a entrada esteja desconectada. É muito prático pois permite a ligação de um sensor (uma chave por exemplo), sem elementos adicionais. Observe que ao acionar a chave teremos nível lógico baixo na entrada e normalmente esse comportamento é o contrário do que esperamos.

3. OUTPUT: O pino atua como saída digital.

No acesso individual aos pinos de entrada/saída digital, usamos rotinas (funções) da biblioteca do Arduíno: void pinMode( int pin, int mode ) Essa rotina recebe dois parâmetros e não retorna nenhum valor:

Parâmetros:

1. O primeiro parâmetro indica o pino que desejamos configurar, pode ser qualquer um no intervalo de 0 até 13, ou se não desejamos utilizar o conversor analógico/digital, podemos utilizar também os pinos de 14 até 19.

2. O segundo parâmetro indica o modo de operação do pino e pode assumir os valores já convenientemente definidos pela biblioteca do Arduíno:

(a) INPUT

(b) INPUT_PULLUP (c) OUTPUT

bool digitalRead( int pin ) Essa recebe apenas um parâmetro de entrada e retorna um valor: Parâmetros:

1. O único parâmetro indica o número do pino a ser lido. Pode ser qualquer pino que já tenha sido confi-gurado como INPUT ou como INPUT_PULLUP.

(5)

Retorna:

1. Um valor booleano (verdadeiro ou falso) correspondente ao nível lógico lido.

void digitalWrite( int pin, bool valor ) Essa rotina recebe dois parâmetros e não retorna nenhum valor Parâmetros:

1. O primeiro parâmetro indica o pino no qual desejamos escrever. Pode ser qualquer pino que já tenha sido configurado como OUTPUT.

2. O segundo parâmetro indica o nível lógico a ser escrito, podemos usar os valores já convenientemente definidos pela biblioteca do Arduíno:

(a) LOW: para nível lógico baixo (b) HIGH: para nível lógico alto

Exemplos

Utilizando as rotinas pinMode, digitalWrite e digitalRead, complete o programa de forma a configurar os pinos 0 até 3 como saídas e os pinos 4 até 7 como entradas. Em seguida, na rotina de loop faça com que o nível lógico lido nas entradas (pino) seja escrito nas saídas (pino-4)

pino 4 -> pino 0 pino 5 -> pino 1 pino 6 -> pino 2 e, pino 7 -> pino 3

Este programa pode ser testado no circuito disponível emhttps://123d.circuits.io/circuits/1842531-exemplo_ de_acesso_aos_portos_usando_input ' & $ % v o i d s e t u p ( ) { f o r ( i n t p i n o = 4 ; p i n o < 8 ; p i n o + + ) { pinMode ( p i n o , INPUT ) ; pinMode ( p i n o−4, OUTPUT ) ; } } v o i d l o o p ( ) { b o o l n i v e l ; f o r ( i n t p i n o = 4 ; p i n o < 8 ; p i n o + + ) { n i v e l = d i g i t a l R e a d ( p i n o ) ; d i g i t a l W r i t e ( p i n o−4, n i v e l ) ; } }

(6)

Exercícios

Modifique o programa anterior para utilizar entradas com resistor de pull-up. Também modifique o pro-grama de modo que, uma saída vá a nível lógico alto quando a chave da entrada correspondente for pres-sionada (lembre-se que na configuração INPUT_PULLUP a entrada lê nível lógico baixo quando a chave é pressionada)

Dica: Usando o operador “!” da linguagem C/C++, é possível retornar 0 (falso) para qualquer valor diferente de 0 e um (verdadeiro) para qualquer valor igual a zero.

    b o o l a ; a = ! d i g i t a l R e a d ( 4 ) ; / / r e s u l t a em n í v e l l ó g i c o a l t o c a s o a c h a v e s e j a p r e s s i o n a d a / / em uma e n t r a d a p u l l−up Resposta:

Esse programa pode ser testado no circuito disponível emhttps://123d.circuits.io/circuits/1842499-exemplo_ de_acesso_aos_portos_usando_INPUT_PULLUP ' & $ % v o i d s e t u p ( ) { f o r ( i n t p i n o = 4 ; p i n o < 8 ; p i n o + + ) { pinMode ( p i n o , INPUT_PULLUP ) ; pinMode ( p i n o−4, OUTPUT ) ; } } v o i d l o o p ( ) { b o o l n i v e l ; f o r ( i n t p i n o = 4 ; p i n o < 8 ; p i n o + + ) { n i v e l = ! d i g i t a l R e a d ( p i n o ) ; d i g i t a l W r i t e ( p i n o−4, n i v e l ) ; / / As l i n h a s a s e g u i r também f u n c i o n a m / / n i v e l = d i g i t a l R e a d ( p i n o ) ; / / d i g i t a l W r i t e ( p i n o−4, ! n i v e l ) ; } }

(7)

2.2

Acesso simultâneo aos pinos de entrada e saída

No modo simultâneo acessamos todos os pinos de um porto ao mesmo tempo. O Arduíno UNO possui três portos de entrada/saída, são chamados de PORTD, PORTB e PORTC. Cada um desses portos possui três registradores com funções bem definidas, que listamos a seguir:

PORTD: Possui oito bits e se refere aos pinos de entrada/saída de números 0 até 7. Registradores:

DDRD: Registro de direção de dados (Data Direction Register) para o PORTD. Cada bit desse registro permite configurar um dos pinos como entrada ou saída digital. Nível lógico alto (nível lógico 1) indica que o pino correspondente é uma saída, enquanto nível lógico baixo (nível lógico 0) indica que o pino é uma entrada. O código a seguir ilustra algumas possibilidades de configuração: ' & $ % / / C o n f i g u r a o s p i n o s 0 a t é 6 como e n t r a d a s / / e a p e n a s o p i n o 7 como s a í d a DDRD = B10000000 ; / / idem DDRD = 1 2 8 ; / / C o n f i g u r a t o d o s o s p i n o s de 0 a t é 7 como e n t r a d a s DDRD = B00000000 ; / / idem DDRD = 0 ; / / C o n f i g u r a t o d o s o s p i n o s de 0 a t é 3 como s a í d a s / / e o s p i n o s de 4 a t é 7 como e n t r a d a s DDRD = B00001111 ; / / idem DDRD = 1 5 ;

Em muitas situações estamos preocupados apenas com alguns pinos e não desejamos modificar o valor dos demais. Para isso podemos utilizar as construções a seguir:

' & $ % / / Faz uma o p e r a ç ã o l ó g i c a OU e n t r e o v a l o r / / de DDRD e o b i n á r i o B00000001 . O e f e i t o / / é que o b i t 0 é c o n f i g u r a d o como s a i d a / / e o s d e m a i s permanecem i n a l t e r a d o s DDRD = DDRD | B00000001 ;

/ / Faz uma o p e r a ç ã o l ó g i c a AND e n t r e o v a l o r / / de DDRD e o b i n á r i o B11111101 . O e f e i t o / / é que o b i t 1 é c o n f i g u r a d o como e n t r a d a / / e o s d e m a i s permanecem i n a l t e r a d o s

DDRD = DDRD & B11111101 ;

PORTD: Registro dos dados de saída para o PORTD. Cada bit desse registro permite escrever nível lógico baixo ou nível lógico alto no pino de saída correspondente. Devemos tomar muito cuidado ao escrever nesse porto pois além de armazenar o valor de um pino de saída, ele também indica se um um pino de entrada tem resistor de pull-up ou não. Assim, se no mesmo porto houverem pinos configurados como entradas e pinos configurados como saída, devemos prestar muita atenção em escrever apenas nos bits correspondentes às saídas, mantendo inalterados os bits correspondentes às entradas:

(8)

'

&

$

% / / Supondo que t o d o o PORTD f o i c o n f i g u r a d o

/ / como s a í d a , podemos e s c r e v e r b y t e m e u _ b y t e ; m e u _ b y t e = 5 5 ; PORTD= m e u _ b y t e ; / / p a r a c o l o c a r o v a l o r b i n á r i o / / c o r r e s p o n d e n t e a 55 n o s p i n o s de 0 a t é / / 7 do A r d u í n o .

PIND: Registro dos dados de entrada para o PORTD. Cada bit desse registro permite ler o nível lógico presente no correspondente pino de entrada (Na verdade, ao tentar ler um pino de saída, estaremos lendo o nível lógico presente nesse pino também):

'

&

$

% / / Supondo que t o d o o PORTD f o i c o n f i g u r a d o

/ / como e n t r a d a , podemos e s c r e v e r b y t e m e u _ b y t e ; m e u _ b y t e = PIND ; / / p a r a c o l o c a r o v a l o r b i n á r i o / / l i d o n o s p i n o s 0 a t é 7 do A r d u í n o / / na v a r i á v e l m e u _ b y t e

PORTB: Possui seis bits e se refere aos pinos de entrada/saída de números 8 até 13. Registradores:

DDRB: Registro de direção de dados (Data Direction Register) para o PORTB. Seu funcionamento é análogo ao registro DDRD, mas os bits de número 6 e 7 devem ser ignorados.

PORTB: Registro dos dados de saída para o PORTB. Seu funcionamento é análogo ao registro PORTD, mas os bits de número 6 e 7 devem ser ignorados.

PINB: Registro dos dados de entrada para o PORTD. Seu funcionamento é análogo ao registro PIND, mas os bits de número 6 e 7 devem ser ignorados.

PORTC: Possui seis bits e se refere aos pinos de entrada/saída de números 14 até 19 (normalmente usados como entradas analógicas).

Registradores:

DDRC: Registro de direção de dados (Data Direction Register) para o PORTC. Seu funcionamento é análogo ao registro DDRD, mas os bits de número 6 e 7 devem ser ignorados.

PORTC: Registro dos dados de saída para o PORTC. Seu funcionamento é análogo ao registro PORTD, mas os bits de número 6 e 7 devem ser ignorados.

PINC: Registro dos dados de entrada para o PORTD. Seu funcionamento é análogo ao registro PIND, mas os bits de número 6 e 7 devem ser ignorados.

(9)

Exemplos

Utilizando acesso direto ao PORTD, escreva o programa de forma a configurar os pinos 0 até 3 como saídas e os pinos 4 até 7 como entradas pull-up. Em seguida, na rotina de loop faça com que o nível lógico lido nas entradas (pino) seja invertido e escrito nas saídas (pino-4). Dessa forma, a saída 0 irá a nível lógico alto apenas quando a chave presente na entrada pull-up do pino 4 estiver pressionada.

pino 4 -> pino 0 pino 5 -> pino 1 pino 6 -> pino 2 e, pino 7 -> pino 3

Dica: Usando o operador “~” da linguagem C/C++, é possível inverter todos os bits do valor de uma variável (ou retorno de função). Exemplo:

    b y t e a = 1 2 8 ; a = ~ a ; / / r e s u l t a em a = 127 Resposta:

Esse exemplo pode ser testado no circuito disponível emhttps://123d.circuits.io/circuits/1842408-exemplo_ de_acesso_direto_aos_portos

(10)

' & $ % v o i d s e t u p ( ) { / / p i n o s 0 a t é 3 s ã o s a í d a s / / p i n o s 4 a t é 7 s ã o e n t r a d a s / / e s c r e v e m o s B00001111 no r e g i s t r o DDRD DDRD = B00001111 ; / / c o n f i g u r a m o s a s e n t r a d a s como t i p o PULLUP / / u s a n d o o r e g i s t r o c o m p a r t i l h a d o PORTD . / / Ao mesmo tempo , e s c r e v e m o s n í v e l l ó g i c o / / b a i x o n a s s a í d a s de 0 a t é 3 . PORTD = B11110000 ; } v o i d l o o p ( ) { b y t e v a l o r ; / / Vamos l e r o v a l o r d a s e n t r a d a s / / e j á i n v e r t e m o s , de f o r m a que n í v e l l ó g i c o / / a l t o i n d i q u e que a c h a v e c o r r e s p o n d e n t e f o i / / p r e s s i o n a d a ( e n t r a d a s p u l l−up )

/ / N o t e que não usamos o o p e r a d o r ” ! ” . v a l o r = ~PIND ; / / Os b i t s de 4 a t é 7 s ã o a s e n t r a d a s . / / Os b i t s de 0 a t é 3 possuem v a l o r e s i n d e s e j a d o s / / r e f e r e n t e s à s s a í d a s a n t e r i o r e s . / / Devemos n o s l i v r a r d e l e s / / com um d e s l o c a m e n t o de 4 b i t s p a r a a d i r e i t a v a l o r = v a l o r >> 4 ; / / ou e q u i v a l e n t e m e n t e , com uma d i v i s ã o p o r 16 / / v a l o r = v a l o r / 16 / / Vamos e s c r e v e r o s b i t s de s a í d a .

/ / Mas devemos t o m a r c u i d a d o p a r a não z e r a r / / i n a d v e r t i d a m e n t e um d o s b i t s c o r r e s p o n d e n t e s / / à s e n t r a d a s . P a r a i s s o c r i a m o s uma m á s c a r a / / e f a z e m o s uma o p e r a ç ã o OU com o v a l o r / / b i n á r i o B11110000 . / / I s s o s i g n i f i c a que o s b i t s 4 a t é 7 da v a r i á v e l / / v a l o r f i c a m em n í v e l l ó g i c o a l t o , e o s b i t s / / de 0 a t é 3 não s e a l t e r a m . b y t e m a s c a r a ; m a s c a r a = B11110000 ; v a l o r = v a l o r | m a s c a r a ; / / f i n a l m e n t e podemos e s c r e v e r com s e g u r a n ç a no / / r e g i s t r o PORTD PORTD = v a l o r ; }

Referências

Documentos relacionados

Neste tipo de situações, os valores da propriedade cuisine da classe Restaurant deixam de ser apenas “valores” sem semântica a apresentar (possivelmente) numa caixa

Frente ao exposto, este trabalho teve por objetivo avaliar discentes da disciplina de Matemática Discreta nos conteúdos de lógica formal, teoria dos conjuntos e

Com o objetivo de compreender como se efetivou a participação das educadoras - Maria Zuíla e Silva Moraes; Minerva Diaz de Sá Barreto - na criação dos diversos

(grifos nossos). b) Em observância ao princípio da impessoalidade, a Administração não pode atuar com vistas a prejudicar ou beneficiar pessoas determinadas, vez que é

E ele funciona como um elo entre o time e os torcedores, com calçada da fama, uma série de brincadeiras para crianças e até área para pegar autógrafos dos jogadores.. O local

No acórdão Oosthoek’s Uitgeversmaatschappij ( 70 ), que o Governo austríaco refere nas suas observações, o Tribunal de Justiça concluiu, relativamente à compatibilidade de

Controlador de alto nível (por ex.: PLC) Cabo da válvula Tubo de alimentação do ar de 4 mm Pr essão do fluido Regulador de pressão de precisão Regulador de pressão de

Além do teste de força isométrica que foi realiza- do a cada duas semanas, foram realizados testes de salto vertical (squat jump e countermovement jump), verificação da