Professional Documents
Culture Documents
MICROCONTROLADORES
AULA 5
1
CONVERSA INICIAL
2
Dessas, as mais usadas e com maior número de componentes são
as PIC12, PIC16 e PIC18. As famílias PIC14 e PIC17 foram
famílias intermediárias na evolução da linha. A família
PIC24F/PIC24H é composta por componentes de 16 bits e é a mais
recente. Já a família dsPIC30/dsPIC33 traz os controladores
híbridos de 16 bits. No final de 2007, foi lançada também a família
PIC32, composta por componentes de 32 bits. Quanto ao tipo de
memória, os componentes mais antigos (que ainda continuam
sendo fabricados) têm memória do tipo EPROM. Já os mais novos
utilizam somente flash. A tendência do mercado é trabalhar
somente com flash, principalmente nas etapas de ensino e
desenvolvimento. O tipo de memória flash pode ser identificado por
uma letra “F” no nome do componente (por exemplo, PIC12F679,
PIC16F628, PIC18F4550).
Dentro da família PIC18 há várias subfamílias, cada uma composta
de vários componentes. Os componentes diferem entre si em:
Quantidade de memória RAM;
Quantidade de memória EEPROM de dados (alguns não têm nada);
Quantidade de memória Flash de programa;
Número de pinos (18,28,40, ...);
Frequência máxima de clock;
Periféricos;
O quesito “periférico” é uma das principais características dos
PIC. Dentre os disponíveis nas várias famílias, podemos citar:
timers, conversores A/D, comparadores analógicos, módulos
USART (comunicação serial RS232), Módulos MSSP (I2C e SPI
master), módulos CCP (Captura, comparação e PWM), etc.
A linha PIC18 é composta por microcontroladores com core de 8
bits de alto desempenho. Buscou-se manter certa compatibilidade
com a linha PIC16, o que pode ser observado no funcionamento
de diversos periféricos e no conjunto de instruções. Contudo
muitas mudanças se fizeram necessárias, principalmente na
arquitetura e no mapeamento de memória, para superar certas
limitações apresentadas pela família PIC16.
(Disponível em:
<http://www.ebah.com.br/content/ABAAAfSy8AG/xm118-documenta-
integrada-rev-b?part=6>. Acesso em: 01 de dezembro de 2016).
3
O tamanho dessa memória também varia muito de modelo para
modelo. Outra característica muito importante da memória de
programa do PIC é que ela pode ser acessada por software,
possibilitando que o programa seja reescrito dinamicamente, ou ainda,
que ela seja usada como uma expansão da memória E2 PROM de
dados.
4
gerenciar somente 2k de memória. Então como é que podemos usar estas
instruções com toda a memória de programa? Segundo Souza (2002, p. 12):
5
A pilha é um local fisicamente separado da memória de programa,
onde serão armazenados os endereços de retorno quando utilizamos
instruções de desvio para rotinas de chamada. Quando o programa é
desviado para o começo de uma rotina através da instrução correta
(CALL ou interrupção), o endereço seguinte ao ponto que estava sendo
executado é armazenado na pilha para que, ao fim da rotina, o
programa passa a retornar novamente ao ponto em que estava.
Tomando como exemplo o PIC 16F877A, este possui uma pilha de 8
níveis, com isto é possível o armazenamento de 8 endereços de
retorno, possibilitando 8 desvios consecutivos. Caso se tente chamar
um número de rotinas maiores que o tamanho da pilha, o endereço de
retorno mais antigo será perdido, pois será reescrito com um novo
endereço.
Outra característica que devemos saber sobre a pilha é o seu tamanho
em bits. Este tamanho representa a quantidade de endereços que o
sistema de retorno automático poderá gerenciar. No nosso caso, a
pilha armazena endereços de 13 bits, o que é suficiente para o
gerenciamento de 8k de memória de programa. Para o PIC tomado
como exemplo, possui exatamente 8k, os retornos através da pilha não
apresentam problemas com a paginação da memória de programa. Na
Figura 2, temos apresentação do mapa de memória de programa,
contendo a região específica de endereço.
6
TEMA 3: ORGANIZAÇÃO MEMÓRIA DE DADOS
7
Fica fácil percebemos que só existe 7 bits para endereçamento de
todos os registradores. Acontece que, com estes números de bits só
podemos gerenciar 128 endereços diferentes. Por isso, a Microchip
dividiu a memória de dados em grupos de 128 bytes, aos quais deu o
nome de Banco, diferenciando assim da nomenclatura utilizada para
memória de programa (Página).
No caso do nosso exemplo, o PIC 16F877A, sua memória de dados é
composta de 4 bancos. De maneira análoga ao sistema utilizado na
memória de programa, aqui também os demais bits (2) necessários
para o complemento do gerenciamento são utilizados como chaves
seletoras para o banco atual, e encontram-se no registrador STATUS
<RP1:RP0>, como pode ser observado na Figura 3.
Devido a esta estruturação, antes de utilizarmos qualquer comando
que trabalhem com os registradores (RAM) devemos comutar para o
banco onde o mesmo se encontra. Os registradores de uso comum
podem ser armazenados nos endereços de 070h a 07Fh, para que
possam ser acessados diretamente em qualquer um dos 4 quatro
bancos disponíveis. (SOUZA, 2002, p.14 e 15)
Figura 3: Seleção banco de memória dados, por dois bits do registrador de Status
8
chave seletora de banco será o bit STATUS<IRP>. (SOUZA, 2002,
p.15)
Figura 4: Seleção banco memória de dados indireto por um bit do registrador de Status
TEMA 4: REGISTRADORES
Registradores especiais
Os registradores especiais, denominados SFRs (Special Functions
Registers) encontram-se na memória RAM e são utilizados pelo
microcontrolador para a execução do programa e processamento da ULA. Estes
registradores podem ser escritos e lidos tanto pelo usuário quanto pelo hardware,
e servem também para a configuração de muitas funções e para a utilização de
todos os periféricos. O mapa da memória apresentada pela Tabela 2 apresenta
9
a posição de todos os registradores especiais e seus devidos nomes e, na
Tabela 3, temos os bits associados a cada SFRs do
Bank 0. Os registradores podem ser classificados em duas classes, periféricos
e núcleo.
10
Tabela 3: Bits associados aos SFRs do Bank 0
Registrador de Status
Este registrador contém o Status decorrente das operações na ALU, a
posição de RESET e a seleção de BANK para a memória de dados. O registro
de Status é utilizado como condições de saltos condicionais quando os bits dos
flags são afetados: Z, DC, C. Na Figura 5, temos a apresentação de como é
constituído o registrador de status.
11
Figura 5: Bits do registrador de Status
PCL E PCLATH
O contador do programa especifica o endereço da instrução a ser
executada. Para o PIC 16F877A, o tamanho do PC é de 13 bits, sendo o byte
LSB chamado de registro PCL e o byte MSB chamado de registro PCH, conforme
apresentado na Figura 6. O registro PCH contém a denominação para PC<12;8>
bits, sendo que 13 bits do PC podem acessar 213 = 8192 words.
12
Figura 6: Registrador do Contador de Programa
PCH PCL
2 01 00 0 0 0 0 0 0 0 0 0 0 0
OPTION
Esse registrador serve para configurar uma série de opções para
operação do microcontrolador, tais como: habilitação dos resistores de pull-up
referente ao port de saída B (Port B), configurações do prescaler (divisor de
frequência para base de tempo do timer), configurações do TMR0 (timer 0) e
seleção da borda para reconhecimento de uma interrupção.
TIRS
É o registrador responsável por configurar os pinos das portas como
entrada ou saída. Quando é colocado “1” em um bit do TRIS do respectivo port,
o pino é configurado como entrada. Para configurar o pino como saída,
13
atribuímos “0” no bit relacionado. Resumidamente, temos: “1” Input (Entrada) e
“0” Output (Saída).
PORTS
O registrador port representa especificamente as entrada e saídas digitais
para respectivo dispositivo. Para o PIC 16F877A, temos os
seguintes ports:
PORTA com 6 bits, PORTB, com 8 bits, PORTC com 8 bits, PORTD com 8 bits,
PORTE com 3 bits.
8
14 8
acumulador. No canto superior esquerdo temos a memória de
programa (FLASH), saindo deste bloco temos um barramento de 14
bits (Program Bus). Mais a direita esta a memória de dados (RAM). Ela
já possui um barramento de 8 bits (Data Bus). Totalmente do lado
direito encontram-se os PORTs, de PORTA a PORTE. Na parte inferior
podem ser encontrados os demais periféricos, tais como: EEPROM
(memória de dados não volátil), os Timers (TMR0, TMR1 e TMR2), os
A/Ds de 10 bits, os modos CCP (Compare, Capture e PWM) e as
comunicações seriais (SPI, I2C e USART). Observe que entre todos os
periféricos a comunicação é feita através de um barramento de 8 vias.
Um pouco mais ao centro, podemos encontrar ainda o registrador de
status (STATUS reg), onde algumas informações importantes sobre as
operações aritméticas da ULA ficam armazenadas, e os programas
(Program Couter) e a pilha de 8 níveis (Stack).
Temos ainda os circuitos internos de reset, POR, BOR, osciladores,
Watchdog Timer (WDT) e sistema de programação.
15
Figura 7: Estrutura interna PIC 16F877A
16
Ciclo de máquina
Conforme Souza (2002, p. 10):
O conceito básico que deve ser conhecido é que neste
microcontrolador (assim como na maioria dos modelos da linha PIC), o
clock interno (Ckint) é equivalente ao clock externo (Ckextou Fosc)
dividido por 4. Com isso teremos:
Ck ext
Ckint
4
Desta forma, quando trabalhamos, por exemplo, com um cristal de 4
MHz, o PIC estará trabalhando internamente com uma frequência de
1MHz. Para nós, mais importante que o clock interno, é o período desta
frequência (o inverso da mesma), que é equivalente ao tempo de
duração de um ciclo de máquina, popularmente chamado de CM ou
Tcy. Assim sendo teremos:
1
Tcy
Ck int
Continuando com nosso exemplo de 4MHz externo, nosso ciclo de
máquina (CM) será de 1µs. Mas afinal de contas, qual o motivo da
necessidade da divisão do clock externo por 4? Isto pode ser
visualizado e explicado quando entendermos o funcionamento interno
do processador. Para execução de uma única instrução
pelo processador.
Para execução de uma instrução pelo processador, várias operações
necessitam ser realizadas. Como não existe capacidade de
processamento paralelo, estas operações são executadas em
subciclos do ciclo de máquina pela divisão do clock externo. Estes
subciclos são chamadas de Q1, Q2, Q3 e Q4.
O PC (contador de programa) é incrementado automaticamente no
início de Q1. Durante o decorrer dos 4 tempos (Q1 a Q4) a instrução
previamente carregada para dentro da ULA é executada, sendo
trocadas informações com a memória de dados e o registrador Work
sempre que necessário. Por último, ao final do tempo Q4, a próxima
instrução (lembre-se que o PC já foi incrementado) é buscada da
memória de programa e armazenada na ULA.
Esta característica de buscar a informação num ciclo de máquina e
executá-la no próximo é conhecida como Pipeline. Ela permite que
quase todas as instruções sejam executadas em apenas um ciclo,
gastando assim 1µs (para nosso exemplo de 4Mhz) e tornando o
sistema muito mais rápido. A únicas exceções referem-se as instruções
que geram “saltos” no program counter (PC), como chamadas de
rotinas e retornos. Ao executar estas instruções o Pipeline deve ser
primeiramente limpo para depois poder ser carregado novamente com
o endereço correto, consumindo para isso 2 ciclos de máquina.
17
O diagrama da Figura 8 ilustra os 4 subciclos (Q1 a Q4), relativo ao
conceito de Pipeline.
SÍNTESE
18
REFERÊNCIAS
SOUZA, D. J. de. Desbravando o PIC. 6. ed. São Paulo: Érica 2003. ISBN 85-
7194-867-4
Sites consultados
19