Você está na página 1de 29

Dispositivos

Periféricos
Portas de Entrada e Saída.
Introdução
• Portas de E\S.
• Comunicação
do uC com o
“exterior”.

2
Introdução
• PIC18F2550 tem 4 portas de E\S:
• 1 Porta de 8 bits, 2 de 7 bits e 1 de 1 bit.
• PORTA (RA0:RA6)
• PORTB (RB0:RB7)
• PORTC (RC0:RC2 e RC4:RC7)
• PORTE (RE 3)

3
• PIC18F4550 tem 5 portas de E\S:
• 2 Porta de 8 bits, 2 de 7 bits e 1 de 4 bits.
• PORTA (RA0:RA6)
• PORTB (RB0:RB7)
• PORTC (RC0:RC2 e RC4:RC7)
• PORTD(RD0:RD7)
• PORTE (RE0:RE3)

4
Introdução – PIC 18F4550

5
PIC 18F4550

6
Registradores
• Cada porta de E\S tem 3 registradores associados ao seu uso
no microcontrolador PIC:
• TRIS – Define a direção do pino, ou seja, se este é entrada ou
saída.
• PORT – Escreve ou lê o nível lógico da porta.
• LAT – Semelhante ao PORT, só que na leitura retorna o ultimo
valor escrito.

7
8
• Diagrama geral de um pino de E\S

•Pino como entrada:


RAx = 1 - > Escreve 1 no Latch
RAx = 0 - > Escreve 0 no Latch
•Var=RAx -> Lê o valor do pino.

Pino como saída:


RAx = 1 - > Coloca 1no pino e no Latch
RAx = 0 - > Coloca 0 no pino e no Latch 9
Registradores
• Registrador TRIS: cada bit determina a direção de cada pino
independente dos demais.

• Para configurar pino como entrada:


TRISAx = 1; (Input)
• Para configurar pino como saída:
TRISAx = 0; (Output)
10
• O PIC18F2550/4550 não tem o bit TRISA7
Registradores
• Exemplo:
• TRISA = 0b00110011;
• Pinos RA6 e RA3:RA2 configurados como saída.
• Pinos RA5:RA4 e RA1:RA0 configurados como entrada.

11
Registradores
• Registrador PORTx: cada bit determina a leitura\escrita de cada
pino.

• Pino como entrada:


RAx = 1 - > Escreve 1 no Latch
RAx = 0 - > Escreve 0 no Latch
• Var=RAx -> Lê o valor do pino.
• Pino como saída:
RAx = 1 - > Coloca nível lógico alto no pino e no Latch. 12
RAx = 0 - > Coloca nível lógico baixo no pino e no Latch.
Qual a diferença entre PORTA e
LATA ?
• Só tem diferença quando o pino é configurado como entrada
(TRIS do pino = 1).

•POR QUÊ?

13
Registradores
• Observação!
• Para a utilização dos PINOS da PORTA e RB0:RB3 do PORTB é
necessário ajustar o ADCON1.
• ADCON1 deve ser carregado com o valor 0x0F.
• Mais detalhes na aula sobre conversor AD.

14
15
Sintaxe do Código
• No compilador XC8 podemos carregar valores nos
registradores carregando um byte, ou escrevendo apenas um
bit.
• Sintaxe para a escrita de uma byte: NomedoRegistrador =
Byte.
• Exemplo:
• PORTB = 0x0E;
• PORTA = 0b00110011;
• PORTC = 255;

16
Sintaxe do Código
• Sintaxe para a escrita de um bit:
• NomedoRegistradorbits.NomedoBit.
• Nome do bit seguindo o Datasheet.
• Exemplo:
• PORTBbits.RB0 = 1;
• LATAbits.LATA6 = 0;
• TRISCbits.TRISC0 = 1;

17
Sintaxe do Código
• Leitura de um PORT:
• Variável = PORTx; (x pode ser A,B,C ou E)
• Antes de fazer a leitura é necessário configurar a porta como
entrada.
• TRISx = 0b11111111;
• Configura todos os pinos do PORTx como entrada.

18
Sintaxe do Código
• Código exemplo:

void main () void main ()


{ {
TRISB = 0xFF; char x;
while(1) TRISB = 0xFF;
{ while(1)
if(PORTB==0xFF) {
{ x = PORTB;
// Faz algo! if(x==0xFF)
} {
} // Faz algo!
} }
} 19
}
Sintaxe do Código
• Leitura de um pino:
• Variável = PORTxbits.NomeDoBit; (x pode ser A,B,C ou E)
• Antes de fazer a leitura é necessário configurar o pino como
entrada.
• TRISxbits.TRISxy = 1; (x – PORT y - PINO)
• Configura o pino y do PORTx como entrada.

20
Sintaxe do Código
• Exemplo:

void main () void main ()


{ {
TRISCbits.TRISC2 = 1; bit x;
while(1) TRISCbits.TRISC2 = 1;
{ while(1)
if (PORTCbits.RC2 == 0) {
{ x = PORTCbits.RC2;
// Faz algo! if (x== 0)
} {
} // Faz algo!
} }
} 21
}
Sintaxe do Código
• Escrita de um PORT:
• PORTx = variável; (x pode ser A,B,C ou E)
• Antes de fazer a escrita é necessário configurar a porta como
saída.
• TRISx = 0b00000000;
• Configura todos os pinos do PORTx como saída.

22
Sintaxe do Código
• Exemplo
void main ()
{
TRISC = 0;
TRISB = 0xFF;
while(1)
{
if(PORTB==0xFF)
{
PORTC = 0xFF;
}
else
{
PORTC = 0x00;
} 23
}
}
Sintaxe do Código
• Escrita em um pino:
• PORTxbits.NomeDoBit = Valor; (x pode ser A,B,C ou E)
• Antes de fazer a escrita é necessário configurar o pino como
saída.
• TRISxbits.TRISxy = 0; (x – PORT y - PINO)
• Configura o pino y do PORTx como saída.

24
Sintaxe do Código
• Exemplo void main ()
{
bit x;
TRISCbits.TRISC2 = 1;
TRISBbits.TRISB0 = 0;
while(1)
{
x = PORTCbits.RC2;
if (x== 0)
{
PORTBbits.RB0 = 1;
}
else
{
PORTBbits.RB0 = 0;
} 25
}
}
Sintaxe do Código
• Uso da diretiva #define para nomear registros e bits.
• Ex:
• #define BOTAO PORTCbits.RC2
• #define LED PORTBbits.RB0
• Utilizando estas definições no código do exemplo anterior,
temos:

26
Sintaxe do Código
void main ()
{
bit x;
TRISCbits.TRISC2 = 1;
TRISBbits.TRISB0 = 0;
while(1)
{
if (BOTAO== 0)
{
LED = 1;
}
else
{
LED = 0;
}
}
27
}
Exercícios
• 1) Através de uma chave no pino RC0 acender um led no pino
RB7 quando esta estiver aberta e apagar o led quando a chave
estiver fechada.
• 2) Considere 4 chaves conectadas aos pinos da PORTB nos
pinos RB0:RB3 e um LED conectado ao PINO RB7. Acender o
LED quando a combinação de bits for igual a 0b1001. Onde
RB3 é o bit mais significativo.

28
Exercícios
• 3) Considere 4 chaves conectadas aos pinos da PORTB nos
pinos RB0:RB3 e um display de sete segmentos conectado no
PORTC. Crie um programa capaz de decodificar o valor binário
das chaves no seu correspondente hexadecimal no display de
7 segmentos.

29