MICROCONTROLADORES PIC - Teoria - parte 1

REGISTRADORES E PINOS DE I/O



MICROCONTROLADORES - UMA BREVE HISTÓRIA

Na década de 80, quando a Intel lançou o seu microcontrolador 8051 ela não poderia prever a revolução que hora se iniciava na eletrônica. Muitos fabricantes como Motorola, Hitachi, National, e outros, trataram logo de lançar o seu. Muitos desses preferiram apenas “clonar” o microcontrolador Intel, outros não.



Um microcontrolador basicamente é a integração de um microprocessador com outros periféricos. Enquanto a maioria dos microprocessadores possui apenas a CPU (Unidade de processamento central), ALU (Unidade de lógica e aritmética), linhas para dados, linhas para endereços e linhas para controle e acesso de memória externa, alguns microcontroladores possuem tudo isso e mais os periféricos para comunicação serial, timer’s, Watchdog Timer, Osciladores, I/O’s (portas para o acesso ao mundo exterior), etc. Podemos então entender um microcontrolador como um “cérebro” (CPU) com “braços” (I/O’s). 


PARTES INTEGRANDES DE UM MICROCONTROLADOR GENÉRICO




CPU - A CPU ou “Unidade de processamento central” é responsável por todo o processamento de dados do microcontrolador. É ela que interpreta os comandos, faz a leitura de dados e ativa as portas de I/O’s ou periféricos se necessário

ALU - A Unidade de lógica e aritmética realiza todos os cálculos que envolvam registros e ou lógica para tomada de decisões. Ela é ligada e controlada pela CPU em um microcontrolador.


I/O’s - As linhas de I/O de um microcontrolador são responsáveis pela “entrada” e “saída” do mesmo. São estes os “braços” do microcontrolador. Podemos colher um determinado dado através delas, e responder também através das mesmas.


PERIFÉRICOS

Os periféricos, são circuitos que permitem maior flexibilidade ao microcontrolador. Estes variam de acordo com o tipo e modelo. Geralmente escolhemos nosso microcontrolador de acordo com nossas necessidades. Os periféricos mais comuns nos microcontroladores são:

- USART’s – portas para comunicação serial RS232/RS485 muito utilizadas;
- A/D – portas para conversão Analógico/Digital;
- Portas I2C, SPI, ETC – portas para comunicação. Permitem interligar periféricos externos e/ou outros microcontroladores para a realização de tarefas mais complexas;
- Timer’s – permitem maior flexibilidade em operações onde necessitamos de temporizações;
- Watchdog Timer – O cão de guarda permite vigiar o processamento da CPU. Ele opera separadamente. Se o programa se perder, o WDT reset a CPU evitando travamentos;
- Osciladores – Muitos microcontroladores necessitam de poucos componentes internos para realizarem seu clock, pois possuem circuitos osciladores internos que facilitam nosso trabalho.


O MICROCONTROLADOR PIC16F84A

EscolhÍ este microcontrolador por algumas características interessantes, as quais destaco:

  • Baixo custo (na época - 2002);

  • É facilmente encontrado em lojas especializadas;

  • Excelente documentação;

  • Serve como porta de entrada para a maioria dos microcontroladores Microchip, já que estes mantêm a compatibilidade no set de instruções e outras.

Porém sua maior vantagem é a gravação. Ela pode ser feita com um pequeno circuito eletrônico, de custo muito baixo, através da porta paralela ou serial de qualquer PC. Se você não tem um, veja um dos meus projetos PROGPICII.

Suas principais características são:

  • 1024 bytes de memória FLASH, que pode ser gravada várias vezes;

  • 68 bytes de memória RAM;

  • 64 bytes de memória EEPROM;

  • 13 pinos de I/O configuráveis individualmente;

  • Timer de 8 bits com “divisor escalar”;

  • Interrupções “externa e interna”;

  • Arquitetura RISC com set de instruções de fácil aprendizado, com apenas 35 instruções;

  • Watchdog Timer;

  • Possibilidade para 4 tipos de osciladores, configuráveis via software;

  • Entre outras.


ARQUITETURA

A Microchip foi uma das precursoras do uso da tecnologia RISC (Computador com Set reduzido de Instruções) em microcontroladores. Esta tecnologia é baseada na arquitetura HARVARD, que separa a memória de dados da memória de programa. Assim temos um bus para dados e outro para programa.

O PIC16F84 tem um bus de dados (RAM) com 8 bits (1 byte) e um bus de programa com 14 bits . Isto permite que o microcontrolador carregue na CPU o “operador”+”operando” em um único ciclo de máquina. Isso aumenta a velocidade do chip, permitindo uma melhor performance se comparado a outros microcontroladores que não utilizam esta arquitetura.

Outros microcontroladores, como o 8051, utilizam a tecnologia CISC (Computador com Set de instruções complexas), baseada na arquitetura “Van Neuman”. Nesta arquitetura a memória de dados e a memória de programa utilizam o mesmo bus. Assim, o microcontrolador necessita de mais ciclos para carregar o “operador” e o “operando”. Na figura abaixo é dado um demonstrativo entre as duas tecnologias.



PINAGEM (PIN-OUT)

A pinagem da PIC16F84 pode ser vista na figura abaixo. E na tabela seguinte pode-se ver o descritivo de cada pino, sua função e uso.



Tabela - Descrição dos pinos do PIC16F84A

Nome Pino

Tipo

Estrutura

Descrição

OSC1/CLKIN

16

Entrada

Shimitt Trigger/CMOS

Entrada osciladora

OSC2/CLKOUT

15

Saída


Saída Osciladora


MCLR

4

Entrada/Programação

Shimitt Trigger

Reset e Entrada para voltagem de programação


RA0

17

Entrada/Saída

TTL

Portas de entrada e saída

RA1

18

Entrada/Saída

TTL

RA2

1

Entrada/Saída

TTL

RA3

2

Entrada/Saída

TTL

RA4/T0CKI

3

Entrada/Saída

Shimitt Trigger

Porta de entrada e saída ou entrada do clock externo para timer e contador.


RB0/INT

6

Entrada/Saída

TTL/ Shimitt Trigger

Portas de entrada e saída. O port B possui pull-up internos programáveis.

RB1

7

Entrada/Saída

TTL


RB2

8

Entrada/Saída

TTL


RB3

9

Entrada/Saída

TTL


RB4

10

Entrada/Saída

TTL

Permite interrupção se alterar nível

RB5

11

Entrada/Saída

TTL


RB6

12

Entrada/Saída

TTL/ Shimitt Trigger


RB7

13

Entrada/Saída

TTL/ Shimitt Trigger


Vss

5

Alimentação


Terra

Vdd

14

Alimentação


Positivo +5V


MEMÓRIA

A memória da PIC16F84 para programa não pode ser acessada pelo usuário, a não ser durante a gravação do programa (existem meios de acessar a memória de programa em tempo de execução - modo apenas leitura). Ela tem 1K x 14 bytes, que a princípio pode parecer pequena, mas como o PIC utiliza a tecnologia RISC, garante uma excelente otimização da área de programa. Na figura abaixo pode-se ver o mapa de memória de programa.



PC – Program counter: Neste registro o microcontrolador guarda a posição atual do programa. A cada instrução lida, o PC é incrementado em uma posição.

Stack Level 1 ... Stack Level 8: Nestes registradores são guardados os endereços de retorno para o microcontrolador, quando utilizamos a instrução “CALL”. Note que temos apenas 8 níveis.

Reset Vector: Sempre que nosso microcontrolador for “resetado”, ele apontará para esta posição de memória.

Interrupt Vector: Quando tivermos uma interrupção (interna ou externa), o microcontrolador apontará para este endereço.

User memory space: Memória de programa. Área dedicada ao nosso programa.


REGISTRADORES

Os registradores do PIC16F84 estão divididos em duas partes. A primeira é conhecida como SFR (Registros de Função Especial) e GPR (Registros de Propósito Geral). Estes registros dividem-se em dois bancos. 


REGISTRADOR STATUS

Este registrador possui o estado atual da Unidade Lógica Aritmética, do Reset e do banco de registros selecionado.


Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Leitura

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

IRP

RP1

RP0

TO

PD

Z

DC

C

bit 7


bit 0

bit 7 - IRP – Este registro não é utilizado pela PIC16F84, sempre lido sempre como “0”

bit 6, 5 - RP1, RP0 – Registros de seleção do banco de registros

  • 00 = Banco 0 (00H – 7FH)

  • 01 = Bano 1 (80H – FFH)

bit 4 - TO – Time-out

  • 1 = Após power-up (ligar), instrução CLRWDT (limpar Cão de Guarda) ou instrução SLEEP (dormir)

  • 0 = Um time-out do WDT ocorreu

bit 3 - PD – Power-down

  • 1 = Após power-up (ligar) ou instrução CLRWDT (limpar Cão de Guarda)

  • 0 = execução da instrução SLEEP (dormir)

bit 2 - Z – Zero

  • 1 = O resultado da operação aritmética ou lógica é igual a zero.

  • 0 = O resultado da operação aritmética ou lógica não é zero.

bit 1 - DC – Digito Carry/borrow

  • 1 = Ocorreu um transbordamento do 4º bit menos significativo

  • 0 = Não ocorreu o transbordamento do 4º bit menos significativo

bit 0 - C – Carry

  • 1 = Ocorreu um transbordamento do 7º bit mais significativo

  • 0 = Não ocorreu um transbordamento do 7º bit mais significativo


REGISTRADOR OPTION_REG

Com este registrador podemos configurar a interrupção externa através de RB0, a interrupção do timer, o divisor para o timer e os resistores de pull-up da parte mais significativa do PORTB.


Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

RBPU

INTEDG

T0CS

T0SE

PSA

PS2

PS1

PS0

bit 7


bit 0

bit 7 - RBPU – Habilita/desabilita pull-up’s do PORTB

  • 1 = pull-up desabilitados

  • 0 = pull-up habilitado

bit 6 - INTEDG – Seleção de borda para interrupção

  • 1 = Interrupção ativa na subida de borda em RB0/INT

  • 0 = Interrupção ativa na descida de borda em RB0/INT

bit 5 -T0CS – Captura do clock do timer

  • 1 = Transição em RA4/T0CKI

  • 0 = Instrução interna, oscilador interno

bit 4 - T0SE – Seleção de borda para clock

  • 1 = Incrementa no nível alto para baixo na transição em RA4/T0CKI

  • 0 = Incrementa no nível baixo para alto na transição em RA4/T0CKI

bit 3 - PSA – Seleção da Divisão Escalar do Timer

  • 1 = Divisão ligada ao WDT

  • 2 = Divisão ligada ao TMR0

bits 2..0 - PS2...PS0 – Divisão para contagem do timer e WDT (Cão de Guarda)

Valor

Proporção no TMR0

Proporção no WDT

000

1 : 2

1 : 1

001

1 : 4

1 : 2

010

1 : 8

1 : 4

011

1 : 16

1 : 8

100

1 : 32

1 : 16

101

1 : 64

1 : 32

110

1 : 128

1 : 64

111

1 : 256

1 : 128



REGISTRADOR INTCOM

Este registrador controla as várias interrupções. Também podemos, através deste registrador, saber exatamente qual interrupção foi solicitada.

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

GIE

EEIE

T0IE

INTE

RBIE

T0IF

INTF

RBIF

bit 7


bit 0

bit 7 - GIE – Bit de habilitação global das interrupções

  • 1 = Habilita todas as interrupções

  • 0 = Desabilita todas as interrupções

bit 6 - EEIE – Habilita interrupção de “fim de escrita” para EEPROM

  • 1 = Habilita interrupção de “fim de escrita”

  • 0 = Desabilita interrupção de “fim de escrita”

bit 5 - T0IE – Habilita interrupção para over-flow do Timer

  • 1 = Habilita interrupção pelo timer

  • 0 = Desabilita interrupção pelo timer

bit 4 - INTE – Habilita interrupção pelo pino RB0/INT

  • 1 = Habilita interrupção pelo pino RB0/INT

  • 0 = Desabilita interrupção pelo pino RB0/INT

bit 3 - RBIE – Habilita interrupção na mudança de estado no PORTB

  • 1 = Habilita interrupção na mudança de estado no PORTB

  • 0 = Desabilita interrupção na mudança de estado no PORTB

bit 2 - T0IF – Flag para leitura da interrupção over-flow para o timer

  • 1 = Houve interrupção pelo timer

  • 0 = Não houve interrupção pelo timer

bit 1 - INTF – Flag para leitura da interrupção pelo pino RB0/INT

  • 1 = Houve interrupção pelo pino RB0/INT

  • 0 = Não houve interrupção pelo pino RB0/INT

bit 0 - RBIF – Flag para leitura da interrupção na mudança de estado no PORTB

  • 1 = Houve interrupção na mudança de estado no PORTB

  • 0 = Não houve interrupção na mudança de estado no PORTB


REGISTRADOR PCL

Este registrador contém o endereço da instrução a executar. Ele é incrementado automaticamente e contém os 8 bits menos significativos do PC (Progam Couter).


REGISTRADOR STACK

Este registrador contém os endereços de retorno para as sub-rotinas que utilizam a instrução CALL ou de retorno após a execução de uma interrupção. Note que no PIC16F84 só existem 8 níveis de stack, ou seja, não é possível executar mais que oito instruções CALL sem executar ao menos uma instrução RETURN. Se isso for ignorado, o PIC ficarrá “desorientado” e o microcontrolador não funcionará corretamente.


REGISTRADORES INDF e FSR

Estes registradores permitem endereçar indiretamente o banco de memória RAM. Isso é muito útil quando deseja-se, por exemplo, escrever ou ler dados seqüencialmente na memória. O registrador FSR deve conter o endereço indireto de memória que precisa-se ler ou escrever. No registro INDF será encontrado o dado do endereço apontado indiretamente por FSR.


REGISTRADORES PORTA e PORTB

Estes registradores contêm o estado atual dos “port’s” de I/O. Pode-se através de instruções acessa-los individualmente ou de forma “inteira”. Sem dúvida alguma estes registradores são os mais utilizados no PIC. Sempre que for preciso escrever ou ler um pino de I/O, estes registradores serão utilizado.


REGISTRADORES TRISA e TRISB

Estes registradores permitem configurar os pinos de I/O como entrada ou saída. Isto é feito de acordo com cada necessidade. TRISA configura o “PORTA” e TRISB configura o “PORTB”. Se for preciso configurar um pino de I/O como entrada faz-se o bit deste pino igual a 1 e para saída o bit deve ser igual a zero.

Os outros registradores, que não foram comentados aqui, serão discutidos no decorrer desta pequena série, pois estão ligados diretamente aos periféricos do microcontrolador.


CONTROLE DE I/O’s DO PIC16F84

No PIC16F84 existem 13 pinos de I/O que podem ser configurados individualmente como entrada ou saída através dos registros TRISA e TRISB. A leitura e/ou escrita também pode ser feita individualmente através dos registradores PORTA ou PORTB.

Os pinos de I/O da PORTA tem características TTL, exceto o pino RA4 que se comporta como um Schimitt Trigger. Isto porque este pino pode receber um sinal de clock externo para incrementar o timer do PIC. Quando isto não é necessário, o pino tem o mesmo comportamento dos outros. Temos na PORTA 5 pinos de I/O.

No PORTB os pinos de I/O também têm características TTL, exceto o pino RB0 que pode assumir características Shimitt Trigger quando configurado para receber uma interrupção externa. Temos no PORTB 8 pinos de I/O.

Todos os pinos de I/O do PIC16F84 conseguem fornece uma corrente de até 25mA para a carga, que é mais que suficiente para ascender um LED. Note que este dreno é por pino e não por PORT. Porém, por prudência, não é recomendado ultrapassar o limite de 20 mA por pino de I/O.


CONCLUSÃO

O mundo dos microcontroladores é realmente fascinante, porém ele exigirá dos que se propõe a conquista-lo um pouco de dedicação e paciência. Muitas dúvidas irão surgir no decorrer desta leitura, mas todas poderão ser sanadas com uma re-leitura mais atenta, até que tudo fique claro. Nas próximas partes desta série serão oferecidos alguns exemplos e projetos práticos que auxiliarão na compreensão da teoria apresentada.



Este artigo foi publicado, com minha autorização, na revista Mecatrônica Fácil nrº 6 de setembro/outubro de 2002. 



Copyright deste conteúdo reservado para Márcio José Soares e protegido pela Lei de Direitos Autorais LEI N° 9.610, de 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou parcial do conteúdo desta página em outros pontos da internet, livros ou outros tipos de publicações comerciais ou não, sem a prévia autorização por escrito do autor.