Você está na página 1de 57

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

2 A FAMÍLIA DOS MICROCONTROLADORES PIC

A seguir será abordada uma discussão relativa aos microcontroladores da família PIC

18fxx31, visto que existem várias famílias de microcontroladores para as mais diversas

aplicações.

2.1 Introdução

A família de microcontroladores PIC 18fxx31 é caracterizada pela alta performance

computacional a um custo relativamente baixo comparado a outros projetos utilizando microcontroladores possibilitando então uma boa relação custo-benefício no desenvolvimento de um sistema de automação.

Dentre seus diversos periféricos podemos ressaltar os seguintes:

Módulo de controle de Modulação por Largura de pulso com inserção de tempo de banda morta (Dead Time) programável.

Módulo de realimentação de movimento com capacidade para medição de posicionamento e velocidade através de Encoder incremental, captura de borda para medição de largura de pulso.

Conversor Analógico – Digital de 10 bits de alta velocidade.

Múltiplas opções de fonte de clock.

Controle de otimização de consumo de energia.

Canais de comunicação serial.

As características descritas acima possibilitam ao usuário de microcontroladores desenvolver uma infinidade de projetos como, por exemplo, controle de velocidade e posição de eixos, fontes chaveadas, equipamentos de instrumentação e outras aplicações no segmento de automação industrial.

Outras características importantes desta família de microcontroladores são as opções de trabalho em modo de gerenciamento de energia. Esta possibilidade permite que o projetista reduza de maneira bem significativa o consumo de energia do produto favorecendo aplicações alimentadas por baterias.

Outra característica importante dos microcontroladores PIC é a conectividade. Os microcontroladores PIC 18fxx31 possuem dois módulos de comunicação serial, o módulo SSP ( Synchronous Serial Port ) ou Porta Serial Síncrona que programa um módulo de comunicação serial síncrona do tipo Mestre – Escravo, e existe também o módulo EUSART (Enhanced Universal Synchronous Asynchronous Receiver Transmitter) ou módulo receptor e transmissor síncrono e assíncrono que possibilita o usuário a implementar vários tipos de comunicação inclusive para leitura de memórias externas como cartões SD e outros dispositivos.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Os microcontroladores PIC podem ser encontrados nos principais tipos de encapsulamentos existentes no mercado, sendo o de aplicação mais comum o encapsulamento DIP.

nos principais tipos de encapsulamentos existentes no mercado, sendo o de aplicação mais comum o encapsulamento
nos principais tipos de encapsulamentos existentes no mercado, sendo o de aplicação mais comum o encapsulamento

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

2.2 ARQUITETURA DO MICROCONTROLADOR PIC-18FXX431

A figura a seguir ilustra a arquitetura interna dos microcontroladores PIC-18f2x31

a arquitetura interna dos microcontroladores PIC-18f2x31 Figura 2.1 : Diagrama de blocos da arquitetura do

Figura 2.1: Diagrama de blocos da arquitetura do microcontrolador PIC 18fXX31

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

2.2.1 OSCILADOR

Os microcontroladores PIC podem trabalhar basicamente com três fontes de clock tendo cada uma delas características próprias de funcionamento. Os blocos osciladores dividem- se em osciladores primários, secundários e bloco oscilador interno.

Os osciladores primários são aqueles conectados aos pinos OSC1 e OSC2 que podem ser malhas de circuito RC, bloco oscilador interno, cristais e ressonadores.

Os osciladores secundários são aqueles que não são conectados aos pinos OSC1 e OSC2. Estes osciladores podem continuar funcionando mesmo quando o microcontrolador estiver trabalhando em modo de gerenciamento de energia. Os microcontroladores da família PIC- 18fxx31 oferecem apenas o Timer1 como oscilador secundário.

O tipo de oscilador a ser utilizado pode ser programado no registrador de configuração do dispositivo durante o momento de gravação do chip.

Neste capítulo será discutido apenas o módulo oscilador interno do microcontrolador, pois este será utilizado em todas as nossas aplicações apenas por uma questão prática para programarmos os protótipos o que não impede o usuário de utilizar as outras fontes de clock. Deixa-se então como sugestão um estudo mais aprofundado sobre osciladores, a consulta ao datasheet do microcontrolador.

As características de utilização e operação do oscilador interno devem ser configuradas no registrador OSCCON como mostra a figura a seguir:

Registrador 2.1

R/W-0

R/W-0

R/W-0

R/W-0

R (1)

R-0

R/W-0

R/W-0

IDLEN

IRCF2

IRCF1

IRCF0

OSTS

IOFS

SCS1

SCS0

bit 7

Bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

Habilita o modo “Idle” 1= Modo “Idle” habilitado. A CPU não recebe sinal de clock quando em modo de gerenciamento de energia. 0= Modo “Idle” desabilitado. A CPU recebe sinal de clock quando em modo de gerenciamento de energia.

Bit 6-4Bits IRCF2:IRCF0: (Internal Oscillator Frequency Select Bits) – Bits de seleção de frequência do oscilador interno.

1

1

1

8 MHz ( Modo oscilador sem divisão de freqüência (direto))

1

1

0

4 MHz

1

0

1

2 MHz

1

0

0

1 MHz

0

1

1

500 kHz

0

1

0

250 kHz

0

0

1

125 kHz

0

0

0

31 kHz (Módulo oscilador RC interno direto)

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Bit 3

OSTS: Oscillator Start-up Time-out Status bit (Bit de Status do temporizador de estabilização do sinal de clock). 1= tempo de estabilização expirou, oscilador primário está funcionando. 0= tempo de estabilização não expirou, oscilador ainda não está pronto.

Bit 2

IOFS: INTOSC Frequency Stable Bit – Bit de estabilidade de freqüência do modo oscilador RC interno. 1= Freqüência do oscilador interno estável. 0= Freqüência do oscilador interno não está instável.

Bit 1-0SCS1:SCS0: System Clock Select bits – Bits de seleção do clock do sistema. 1x = Bloco oscilador interno selecionado (Modo RC)

01

= Oscilador do Timer 1 ( Modo Secundário )

00

= Oscilador primário.

Nota 1: Depende do estado do bit IESO no registrador de configuração 1H.

Legenda:

R: Bit de leitura - n: Valor de RESET

W: Bit de escrita ‘1’: Bit é setado

u: Bit não implementado (lido como ‘0’)

‘0’: Bit é zerado

x: Valor desconhecido

Para configurarmos o registrador OSCCON em um desejado valor, basta faze-lo no próprio programa de usuário.

Quando trabalhando em linguagem C basta escrever a seguinte instrução.

OSCCON=0x72;

A instrução acima configura o microcontrolador para trabalhar com o modo oscilador interno na freqüência de 8 MHz.

2.2.1.2 Configuração do oscilador no processo de gravação do microcontrolador.

No processo de gravação do microcontrolador devemos também indicar no ambiente de desenvolvimento qual é o tipo de oscilador utilizado, para realizar este procedimento no MPLAB 7.40 devemos clicar no menu ConfigureConfiguration Bits e aparecerá a tela a seguir.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

família de Microcontroladores PIC Prof. João Luis Sanches Figura 2.2(a) : Tela de configuração da palavra

Figura 2.2(a): Tela de configuração da palavra de configuração do microcontrolador

Clicando na coluna Setting em cima da categoria Oscillator, é demostrado um conjunto de possibilidades de seleção de osciladores.

um conjunto de possibilidades de seleção de osciladores. Figura 2.2(b) : Opções de escolha do oscilador.

Figura 2.2(b): Opções de escolha do oscilador.

Vale lembrar que para nossas aplicações escolheremos sempre entre a opção “IN RC-Port on RA6,Port on RA7” que significa a seleção de oscilador interno com os pinos RA6 e RA7 liberados para funcionar como pinos de Entrada/Saída.

2.2.2 PORTAS DE E/S (ENTRADA/SAÍDA) DIGITAL

Como em todos os microcontroladores, com o objetivo de reduzir tamanho e quantidade de pinos em um chip, os microcontroladores da família PIC se utilizam do compartilhamento de funções de seus pinos. Sendo assim um mesmo pino pode ser utilizado como entrada analógica ou Entrada/Saída Digital, ou ainda um pino pode ser usado como tensão de referência de um conversor Analógico – Digital ou como pino de Entrada/Saída Digital.

Este capítulo demonstrará como configurarmos os pinos do microcontrolador como Entrada/Saída Digitais e sua utilização na resolução de situações problema utilizando microcontroladores tendo sempre como base o compilador C18 da Microchip.

2.2.2.1 Características dos pinos de E/S

Dependendo do dispositivo selecionado e as características disponíveis, existem até 5 PORT’s disponíveis nos microcontroladores da família PIC. Alguns pinos de E/S são multiplexados com funções alternativas dependendo dos periféricos disponíveis. Em geral, quando um periférico é habilitado, o respectivo pino não deve ser utilizado como E/S de uso geral.

Cada PORT possui três registradores para seu controle. Esses são:

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

• Registrador TRIS (registrador de direção do pino).

• Registrador PORT (escreve ou lê dados na porta).

• Registrador LAT (latch de saída).

A figura 2.3 mostra um esquema simplificado de um pino de PORT de E/S.

mostra um esquema simplificado de um pino de PORT de E/S. Figura 2.3 : Estrutura de

Figura 2.3: Estrutura de um circuito dos pinos de Entrada/Saída

Analisando a figura 1.15, podemos observar que dois flip-flop’s que funcionam como latches controlam o nível lógico e as funções de entrada ou saída do pino.

Quando configuramos o pino como entrada ou saída digital, devemos escrever um dado no registrador TRISx. Uma escrita neste registrador, faz com que o hardware gere um sinal de transição negativa no clock do flip-flop “TRIS Latch”, este então copia o valor presente no barramento de dados para a saída do referido flip-flop. Observando a saída do flip-flop descrito, é possível notar que ele habilita ou desabilita a saída do flip-flop de dados “DATA Latch”.

Portanto, se o respectivo bit do registrador TRISx for igual a ‘1’, quando a instrução de escrita em TRISx for executada, o buffer de conexão entre o pino e o latch de dados é colocado em alta Impedância configurando então o respectivo pino como entrada.

Qualquer instrução de leitura no registrador PORTx habilita o terceiro flip-flop e copia o dado presente no pino para o barramento de dados principal do microcontrolador.

Caso seja carregado um nível lógico ‘0’ em um bit do registrador TRISx, este é copiado para a saída do flip-flop “TRIS Latch” e por conseqüência habilita o buffer de conexão entre o Latch de dados e o pino de saída do microcontrolador. Sendo assim, qualquer escrita no registrador PORTx, o hardware habilita o flip-flop “DATA Latch” que por sua vez copia este dado para o pino através do buffer.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

2.2.2.2 Configuração do PORTA, para e/s digital

Para configurarmos os pinos do PORTA como E/S digitais, devemos primeiramente configurar o registrador ANSEL0, que determina a opção dos pinos como entradas analógicas ou digitais uma vez que esta porta é multiplexada com os módulos analógicos.

Para configurarmos o registrador ANSEL0 para que os pinos do PORTA funcionem como E/S digitais, devemos escrever em seu respectivo bit o nível lógico ‘0’.

ENTRADA/SAIDA DIGITAL

ENTRADA ANALÓGICA

0 O 1 S ANSx
0
O
1
S
ANSx

PINO DO MICROCONTROLADOR

Figura 2.4: Estrutura de configuração do PORTA como entrada analógica ou como E/S digital

Exemplo:

ANSEL0 – Analog Select Register

Registrador 2.2

ANS7

ANS6

ANS5

ANS4

ANS3

ANS2

ANS1

ANS0

ANSEL0 =0x0f; // configura o registrador ANSEL0 de forma que os bits RA4:RA7 funcionem como E/S digital, e os demais funcionem como entrada analógica.

ANSEL0bits.ANS0=0; // Configura o pino somente o pino RA0 para funcionar como E/S Digital.

Observação: Os pinos RA6 e RA7 podem ser configurados como E/S digitais somente se trabalharem com oscilador interno, pois estes pinos são compartilhados com as entradas de oscilador externo. Uma vez configurado o registrador ANSEL0 devemos configurar o registrador TRISA que define quais pinos funcionarão como entradas e quais funcionarão como saída.

O registrador responsável para configuração do PORTA como Entrada ou Saída é o TRISA, cada bit desse registrador, corresponde a um bit do PORTA. Se carregarmos nível lógico “0” no bit 0 do TRISA0, configuramos o pino RA0 para funcionar como saída digital. E se carregarmos com 1 o referido pino funcionará como entrada Digital.

Exemplo:

TRISA=0xC3;//Configura os pinos RA7,RA6,RA1,RA0 como entrada e os pinos RA5,RA4,RA3,RA2 como saída. TRISAbits.TRISA2=1; // Configura somente o pino RA2 como saída digital.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Desta maneira devemos proceder para qualquer configurar qualquer PORT de Entrada / Saída do microcontrolador PIC.

2.2.2.3 Configuração do PORTB, para E/S digital

Antes de comentarmos sobre a configuração do PORTB, vamos discutir algumas peculiaridades desta porta de dados.

O

PORTB possui as seguintes características:

Multiplexação com as saídas em modulação por largura de pulso (PWM).

Resistores de PULL-UP internos habilitados por software.

Possibilidade de geração de interrupção por mudança de estado no PORTB.

Cada uma das características específicas descritas será tratada em detalhes posteriormente. Mas agora trataremos da configuração do PORTB para funcionar como Entrada ou Saída digital.

O PORTB é uma porta bidirecional de 8 bits. O registrador de direção dos pinos do PORTB

é o registrador TRISB, colocando novel lógico 1 em um bit do registrador TRISB, este

configura o respectivo bit do PORTB para funcionar como entrada, isto é, coloca o driver de saída em alta impedância fazendo com que este pino possa ser ligado a uma fonte de tensão externa para que seu nível de tensão possa ser lido e posteriormente processado.

Exemplo:

TRISB=0xAA; // Configura os pinos RB7,RB5,RB3 e RB1 como entrada e os pinos RB6, RB4, RB2 e RB0 //como saída.

TRISBbits.TRISB7=0; // Configura apenas o bit RB7 como saída (Configuração por bit).

Uma característica importante do PORTB é que este possui resistores de PULL-UP internos que podem ser ativos através do bit RBPU localizado no bit 7 do registrador INTCON2 sendo este ativo em nível lógico zero.

Uma vez configurado o PORTB como entrada ou saída o acesso a leitura e/ou escrita nos pinos se faz direto pelo registrador PORTB. Veja alguns exemplos a seguir.

TRISB=0x03; // Configura RB0 e RB1 como entrada e os demais pinos como

saída. if (PORTBbits.RB0&&PORTBbits.RB1) // Se os dois pinos estiverem com nível //lógico igual a 1

{

PORTB=0xC0; // Seta somente os pinos RB7 e RB6.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

}

else

// Caso RB0 ou RB1 estejam em nível lógico zero.

{

 

PORTB=0x30; //Seta somente os pinos RB5 e RB4.

}

Observe no trecho de programa acima que embora a instrução escreva o dado nos oito bits de maneira simultânea somente os bits que estão configurados como saída sofrem a alteração de estado em seus pinos, pois os que estão configurados como entrada estão com seus drivers de saída em alta impedância.

2.2.2.3 Configuração do PORTC, para E/S digital

O PORTC não difere das outras portas de E/S no que se refere às configurações destes

como entrada ou saída digital. Para configurarmos seus pinos basta carregar o respectivo

conteúdo em seus registradores TRISC e PORTC.

A diferença básica desta porta de dados está no circuito eletrônico de entrada tendo esta

porta entradas do tipo Shmitt Trigger sendo acionado por tensões entre 0,2VDD para tensão mínima e 0,8VDD para a máxima tensão. O diagrama de blocos do PORTC é demonstrado

na figura a seguir.

de blocos do PORTC é demonstrado na figura a seguir. Figura 2.5 : Diagrama do circuito

Figura 2.5: Diagrama do circuito interno do pino RC0.

Além desta característica, o PORTC também compartilha seus pinos com demais periféricos que serão abordados futuramente.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

2.2.2.4 Configuração do PORTD, para E/S digital

Para configurarmos o PORTD como entrada ou saída digital, os registradores que devemos configurar são o TRISD e o PORTD para escrita e/ou leitura e posterior processamento.

O PORTD também possui funções compartilhadas com outros periféricos em seus pinos,

porém as configurações serão abordadas nas discussões posteriores sobre os periféricos.

2.2.2.5 Configuração do PORTE, para E/S digital

O PORTE é uma porta de 4 bits sendo que os pinos RE0/AN6, RE1/AN7 e RE2/AN8 são

configurados individualmente como entradas analógicas ou Entrada/Saída digital. E seus registradores de configuração são o TRISE, o ANSEL0 bits 6 e 7, e o ANSEL1 bit 0.

O pino RE3/Vpp/MCLR só pode ser configurado como entrada digital. Sua configuração

está no bit de controle denominado MCLRE no registrador CONFIG3H bit 7 que é o bit de habilitação do reset externo. Este pino pode ser configurado durante o processo de gravação

utilizando o MPLAB no menu ConfigureConfiguration Bits e altere a opção Máster Clear Enable.

2.2.3

EXERCÍCIOS RESOLVIDOS

2.2.3.1

Escreva uma linha de código em linguagem C para o compilador C18 que configure

um microcontrolador PIC 18F2431 para trabalhar com o oscilador interno na freqüência de

4MHz.

Solução

Para resolvermos este problema devemos configurar o registrador OSCCON (Registrador

2.1)

O bit 7 do registrador OSCCON só é relevante para aplicações no modo de gerenciamento

de energia, portanto para a solução do exercícios consideramos este como zero já que não estamos trabalhando em modo de gerenciamento de enrgia.

Os bits IRCF2:IRCF0 para 4 MHz devem ser preenchido com 110.

Os bits 2 e 3 são bits somente de leitura, portanto permanecerão com zero.

O bit SCS1 deve estar em 1 para habilitar o microcontrolador funcionando com oscilador

interno.

Portanto configuramos o registrador com o seguinte valor:

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

IDLEN

IRCF2

IRCF1

IRCF0

OSTS

IOFS

SCS1

SCS0

0

1

1

0

0

0

1

0

A linha de comando pode ser uma das seguintes:

OSCCON=0b01100010;// Carga do registrador com notação em binário. ou

OSCCON=0x72;

ou

OSCCONbits.IRCF2=1;//Configuração do registrador bit a bit.

OSCCONbits.IRCF1=1;

OSCCONbits. SCS1=1;

2.2.3.2 Elabore uma função em linguagem C que configure todos os dispositivos de Entrada/Saída digitais necessários para o correto funcionamento do sistema demonstrado na figura a seguir.

10

9

8

5

4

2

3

7

DS2 a A b A c d e f g DP
DS2
a
A
b
A
c
d
e
f
g
DP

1

6

Dpy Red-CC

Q1

BC-548

Figura 2.6

Solução:

+5VCC

g DP 1 6 Dpy Red-CC Q1 BC-548 Figura 2.6 Solução: +5VCC S0 R2 10K S1

S0

R2DP 1 6 Dpy Red-CC Q1 BC-548 Figura 2.6 Solução: +5VCC S0 10K S1 R3 10K

10K

S1

R3

10K

DS1

10 1 a 9 b A A 6 8 c 5 d 4 e 2
10
1
a
9
b
A A 6
8
c
5
d
4
e
2
f
3
g
7
DP
Dpy Red-CC
Q2
R6
BC-548
100K

U1

RB0/PWM0

RC0/T1OSO/T1CKI

RB1/PWM1

RC3/T0CKI/T5CKI/INT0

RB2/PWM2

RC2/CCP1/FLTB

RB3/PWM3

RC1/T1OSI/CCP2/FLTA

RB4/KBI0/PWM5

RC4/INT1/SDI/SDA

RB5/KBI1/PWM4/PGM

RC5/INT2/SCK/SCL

RB6/KBI2/PGC

RC6/TX/CK/SS

RB7/KBI3/PGD

RC7/RX/DT/SDO

RD0/T0CKI/T5CKI

RD1/SDO

RD2/SDI/SDA

RA0/AN0

RD3/SCK/SCL

RA1/AN1

RD4/FLTA

RA2/AN2/VREF-/CAP1/INDX

RD5/PWM4

RA3/AN3/VREF+/CAP2/QEA

RD6/PWM6

RA4/AN4/CAP3/QEB

RD7/PWM7

RA5/AN5/LVDIN

OSC2/CLKO/RA6

RE0/AN6

OSC1/CLKI/RA7

RE1/AN7

RE2/AN8

MCLR/VPP/RE3

AVSS

AVDD

VSS

VDD

PIC18F4431-I/P

33 34 35 36 37 38 39 40
33
34
35
36
37
38
39
40

GNDVSS VDD PIC18F4431-I/P 33 34 35 36 37 38 39 40 8 9 10 R1 1

8 9 10 R1 1 10K 11 32
8
9
10
R1
1
10K
11
32

D2

2 3 4 R7 5 100K 6 7 14 13
2
3
4
R7
5
100K
6
7
14
13

12 10 R1 1 10K 11 32 D2 2 3 4 R7 5 100K 6 7 14

31 R1 1 10K 11 32 D2 2 3 4 R7 5 100K 6 7 14 13

GND

D1

R4
R4

470 Ohm

R5 470 Ohm
R5
470 Ohm

GND

Para configurarmos o PORTA devemos alterar valores dos registradores ANSEL0 e do registrador TRISA.

O registrador ANSEL0 poderá ser carregado diretamente com zero visto que não existe nenhuma entrada analógica no circuito proposto.

Observamos que apenas os pinos RA0 e RA1 estão sendo utilizados como saídas digitais, portanto os bits TRISA0 e TRISA1 deverão ser carregados com nível lógico zero.

Para configurarmos o PORTC devemos observar que os pinos RC0 e RC3 estão sendo utilizados como entrada e os pinos RC4 e RC7 como saída, portanto os bits TRISC4 e

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

TRISC7 deverão ser carregados com nível lógico zero e os bits TRISC0 e TRISC3 deverão ser carregados com nível lógico 1.

E por fim o PORTB está todo sendo utilizado como saída devendo portanto o registrador

TRISB estar com todos os seus bits iguais a zero.

Registrador

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

ANSEL0

X

(1)

X

X

X

X

X

0

0

TRISA

X

X

X

X

X

X

0

0

TRISB

0

0

0

0

0

0

0

0

TRISC

0

X

X

0

1

X

X

1

Nota 1: X = Irrelevante

Portanto a função pode ser escrita da seguinte maneira:

void Config_ES(void)

{

ANSEL0bits.ANS0=0;

ANSEL0bits.ANS1=0;

TRISAbits.TRISA0=0;

TRISAbits.TRISA1=0;

TRISB=0;

TRISCbits.TRISC7=0;

TRISCbits.TRISC4=0;

TRISCbits.TRISC3=1;

TRISCbits.TRISC0=1;

}

Observações:

É importante lembrar que o valor de reset para os registradores TRISx e ANSx é sempre

‘1’. Portanto haveria necessidade de configurar somente os bits que necessitam de nível lógico ‘0’.

2.2.3.3 Considerando o esquema elétrico da figura 2.6, elabore um programa para que a cada pulso na chave S1, o LED L1 mude seu estado.

Solução:

O fluxograma de contexto que representa a situação proposta pode ser modelado da maneira a seguir:

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

1 S
1
S

N

INICIO

PIC Prof. João Luis Sanches 1 S N INICIO CONFIGURAR PORTAS DE E/S INICIALIZAR PORTAS DE

CONFIGURAR PORTAS DE E/S

João Luis Sanches 1 S N INICIO CONFIGURAR PORTAS DE E/S INICIALIZAR PORTAS DE E/S N

INICIALIZAR PORTAS DE E/S

N S1 PRESSIONA DA? S ATRASO DE 250 Ms APROX. N S1 PRESSIONA DA? S
N
S1
PRESSIONA
DA?
S
ATRASO DE 250 Ms
APROX.
N
S1
PRESSIONA
DA?
S
1

INVERTE ESTADO

DE L1

Analisando o fluxograma proposto devemos observar que logo no início devemos configurar alguns registradores para a correta inicialização do dispositivo, esses registradores são os seguintes:

OSCCON Configura o oscilador que o microcontrolador trabalhará. Admitindo uma freqüência de trabalho em 8MHz com oscilador interno, o valor a ser carregado no registrador deve ser 72h.

TRISC Configura os pinos de entrada e saída solicitados para funcionar o projeto. Devemos apenas carregar nível lógico ‘0’ no bit TRISC3 do registrador.

Considerando que todos os componentes estejam instalados durante o funcionamento do sistema, é importante lembrar que se carregarmos os registradores por byte devemos lembrar que não podemos carregar nível lógico ‘0’ nos bits do registrador TRISx que possuam dispositivos de entrada conectados em seus pinos.

Para gerarmos o atraso para a realização do debounce da chave S1, utilizaremos a função Delay10KTCYx ( ) que se localiza no arquivo “delays.h” da biblioteca de funções do

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

compilador C18. Esta função gera atrasos em múltiplos de 10000 vezes o tempo de um ciclo de instrução. Este tempo depende do valor fornecido como parâmetro para a função que pode ser de 1 até 255.

Devemos lembrar que o tempo de um ciclo vale o equivalente a quatro pulsos de clock, trabalhando a 8MHz, este tempo é de 0,5µs multiplicado por 10000 temos 5ms. Para sabermos o valor a ser inserido como parâmetro para a função basta dividirmos o tempo total de atraso desejado pela base de tempo gerada pela função.

N =

t

TOTAL

250[

ms

]

=

t base

5[

ms

]

N = 50

Portanto o parâmetro de entrada para a função deverá ser 50.

O código fonte para a solução do problema pode ser descrito como segue:

//-----------------------------------------------------------------------

#include<p18f2431.h>

#include<delays.h>

void main()

{

OSCCON=0x72;

TRISCbits.TRISC4=0;//Configura RC4 como saída (L1) TRISCbits.TRISC3=1;//Confirma RC3 como entrada PORTCbits.RC4=0;//Inicializa L1 desligado

while(1)

{

while(!PORTCbits.RC3);//Aguarda S1 ser pressionada Delay10KTCYx(50);//Atraso de 250ms if(!PORTCbits.RC3) continue;//Se RC3 for zero volta para o //inicio do laço

while(PORTCbits.RC3);

PORTCbits.RC4=!PORTCbits.RC4;//Inverte estado de L1

}

}

//----------------------------------------------------------------------

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

2.2.3.4 Dado o circuito da figura 2.7, para que o motor M1 entre em funcionamento quando a tecla S1 for pressionada e desligue quando a tecla S0 for pressionda.

+5VCC

U1 11 21 RC0/T1OSO/T1CKI RB0/PWM0 12 22 S0 S1 F4 RC1/T1OSI/CCP2/FLTA RB1/PWM1 13 23 RC2/CCP1/FLTB
U1
11
21
RC0/T1OSO/T1CKI
RB0/PWM0
12
22
S0
S1
F4
RC1/T1OSI/CCP2/FLTA
RB1/PWM1
13
23
RC2/CCP1/FLTB
RB2/PWM2
24
14
RB3/PWM3
RC3/T0CKI/T5CKI/INT0
25
15
RB4/KBI0/PWM5
RC4/INT1/SDI/SDA
26
16
RB5/KBI1/PWM4/PGM
RC5/INT2/SCK/SCL
K1
27
17
RB6//KBI2/PGC
RC6/TX/CK/SS
28
18
U2
RB7/KBI3/PGD
RC7/RX/DT/SDO
R1
2
470R
RA0/AN0
3
RA1/AN1
4
RA2/AN2/VREF-/CAP1/INDX
Optoisolador
5
RA3/AN3/VREF+/CAP2/QEA
R3
6
GND
R4
R5
RA4/AN4/CAP3/QEB
10K
10
10K
10K
OSC2/CLKO/RA6
+5VCC
9
OSC1/CLKI/RA7
R2
1
MCLR/VPP/RE3
8
7
10K
AVSS
AVDD
19
20
VSS
VDD
PIC18F2431-I/SP
GND
R S T F1 F2 F3 +24VCC Fusíveis Contator Tripolar F4 Relé de Sobrecarga GND
R
S
T
F1
F2
F3
+24VCC
Fusíveis
Contator Tripolar
F4
Relé de Sobrecarga
GND
M3~

Figura 2.7: Sistema de partida de motor controlado por microcontrolador

Solução:

Primeiramente faremos o fluxograma de funcionamento do sistema proposto.

FLUXOGRAMA DE CONTEXTO INICIO CONFIGURAR PORTAS DE INICIALIZAR PORTAS DE N N S0 S1 PRESSIONADA
FLUXOGRAMA DE CONTEXTO
INICIO
CONFIGURAR
PORTAS DE
INICIALIZAR
PORTAS DE
N
N
S0
S1
PRESSIONADA
OU F4 ABERTO?
PRESSIONADA E
F4 FECHADO?
S
S
DESLIGA M1.
LIGA M1.

Observações:

FLUXOGRAMA TECNOLÓGICO INICIO TRISB1←0 RB1←0 RC0=0 ou N RC1=1 e N RC2=0? RC2=1? S S
FLUXOGRAMA TECNOLÓGICO
INICIO
TRISB1←0
RB1←0
RC0=0 ou
N
RC1=1 e
N
RC2=0?
RC2=1?
S
S
RB1←0
RB1←1

Veja que para ligar o motor é necessário que o contator de potência tenha seus contatos fechados. Estes contatos são fechados através da bobina que por sua vez é excitada através

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

da saturação do transistor do fotoacoplador. Analisando o diodo do fotoacoplador é possível observar que este é polarizado através de um sinal em nível lógico ‘1’ (TTL) vindo do pino RB1 do microcontrolador. Portanto, para ligarmos o motor basta “setar” o pino RB1 do microcontrolador.

É importante observar também que o botão S0 é do tipo normalmente fechado, e para

verificarmos se o mesmo está pressionado, devemos verificar se existe nível lógico ‘0’ no pino RC0.

O código fonte proposto a seguir pode resolver a situação demostrada.

#include<p18f2431.h>

void main()

 

{

 

OSCCON=0x72;//Configura osc. interno de 8MHz p/ microcontrolador TRISCbits.TRISC0=1;//Configura pino RC0 como entrada TRISCbits.TRISC1=1;//Configura pino RC1 como entrada TRISBbits.TRISB1=0;//Configura pino RB1 como saída PORTBbits.RB1=0;//Inicializa saída de controle do motor

while(1)

{

if((!PORTCbits.RC0)||(!PORTCbits.RC2))

 

PORTBbits.RB1=0;// Desliga M1

 

else

{

 

if((PORTCbits.RC1)&&(PORTCbits.RC2))

PORTBbits.RB1=1;//Liga M1

 

}

}

}

2.2.3.5 Reescreva o programa do exercício 2.2.3.4 construindo uma função com o nome Config_Sys ( ) que contenha todas as instruções de configuração e inicialização do algoritmo.

#include<p18f2431.h>

/***********************************************************************/

*/

/*

/***********************************************************************/

void Config_Sys(void)

Declaração da função de configuração e inicialização

{

OSCCON=0x72;//Configura osc. interno de 8MHz p/ microcontrolador TRISCbits.TRISC0=1;//Configura pino RC0 como entrada TRISCbits.TRISC1=1;//Configura pino RC1 como entrada TRISBbits.TRISB1=0;//Configura pino RB1 como saída PORTBbits.RB1=0;//Inicializa saída de controle do motor

}

/***********************************************************************/

*/

/*

/***********************************************************************/

void main()

Função principal

{

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Config_Sys();//Chamada para a função

while(1)

{

if(!PORTCbits.RC0)//Verifica se S0 está sendo pressionado PORTBbits.RB1=0;// Desliga M1

else

{

if(PORTCbits.RC1)

PORTBbits.RB1=1;//Liga M1

}

}

}

/***********************************************************************/

/*

*/

/***********************************************************************/

FIM DO CÓDIGO

2.2.3.6 Considerando a figura 2.7, elabore um programa em linguagem C para que a cada vez que a chave S1 for pressionada o motor funcione por 3 segundos e depois desligue.

Solução:

A esta altura já temos um sólido conhecimento nas configurações dos pinos de Entrada/Saída digital do microcontrolador PIC que utilizamos como base em nossos projetos.

Neste exercício chamamos a atenção do leitor para a utilização das rotinas de geração de atraso já que neste exercício precisamos gerar um atraso aproximadamente de quatro segundos.

Já sabemos do exercício 2.2.3.3 que o compilador C18 possui em sua biblioteca padrão um conjunto de funções para geração de atraso. Naquele exercício gerávamos atrasos de 250 milisegundos para um eliminador de bounce.

Agora temos que gerar um atraso de 4 segundos. Pois bem, para isso faremos a chamada da função utilizada no exercício 2.2.3.3 8, porém agora com parâmetro de entrada igual a 100 gerando então 500 milisegundos de atraso. Chamaremos esta função 8 vezes através de um laço de repetição para conseguirmos obter os 4 segundos desejados.

Observe o fluxograma a seguir.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Delay_4_seg ( ) X← 0 N X<8 S Delay10KTCYx (100) X← X+1 FIM
Delay_4_seg ( )
X← 0
N
X<8
S
Delay10KTCYx (100)
X← X+1
FIM

Segue abaixo o fluxograma principal.

INICIO

X← X+1 FIM Segue abaixo o fluxograma principal. INICIO TRISC1 ← 1 TRISB1 ← 0 N

TRISC11

TRISB10

o fluxograma principal. INICIO TRISC1 ← 1 TRISB1 ← 0 N RC1=1? S RB1← 1 Delay_4_seg
N RC1=1? S RB1← 1 Delay_4_seg ( ) RB1← 0
N
RC1=1?
S
RB1← 1
Delay_4_seg ( )
RB1← 0

Função em linguagem C

void Delay_4_seg(void)

{

 

int x=0;

while(x<8)

{

Delay10KTCYx(100);

x++;

}

}

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Observe que neste fluxograma já existe a chamada para a função de atraso de 4 segundos (Delay_4_seg ( )).

A seguir apresenta-se o código fonte em linguagem C que transcreve o fluxograma proposto.

/**********************************************************************/

#include<p18f2431.h>

#include<delays.h>

/**********************************************************************/

/*

/**********************************************************************/ void Delay_4_seg(void)

*/

Função Delay_4_seg( )para gerar atraso de 4 segundos aprox.

{

int x=0;

while(x<8)

{

Delay10KTCYx(100);//Gera atraso de 500 mS aprox. x++;

}

}

/**********************************************************************/

/*

*/

/**********************************************************************/

Início da Função Principal

void main()

 

{

 

OSCCON=0x72;

TRISCbits.TRISC1=1;

TRISBbits.TRISB1=0;

while(1)

{

if(PORTCbits.RC1==1)

{

 

PORTBbits.RB1=1;

Delay_4_seg();

PORTBbits.RB1=0;

 

}

}

}

/***********************************************************************/

/

/***********************************************************************/

*/

FIM DO CÓDIGO

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

2.2.3.7 O controle de descida da faca de uma prensa é feito através dos componentes representados no diagrama de blocos da figura 2.8. Baseado no diagrama pede-se.

RB2 RB3 RB4 S1 S2 RB5 RB6 RB7 RB1 VS1 VS2 B1 B2 B3 PIC
RB2
RB3
RB4
S1
S2
RB5
RB6
RB7
RB1
VS1
VS2
B1
B2
B3
PIC 18F4431

Figura 2.8: Sistema Eletro hidráulico

a) Elaborar o diagrama elétrico completo do sistema considerando os dados fornecidos a seguir.

Bobinas da válvula: 12VCC Chaves fim de curso: Contatos Normalmente Abertos. Botoeiras: Contatos Normalmente Abertos. Pedal: Contato Normalmente Aberto.

b) Elaborar o fluxograma e o programa em linguagem C para que o sistema funcione obedecendo os critérios descritos a seguir.

A faca somente poderá descer se o operador estiver com as duas botoeiras (B1 e B2) acionadas e o pedal também acionado.

Caso o acionamento do pedal seja interrompido e as duas botoeiras permaneçam acionadas simultaneamente, a faca deverá permanecer parada enquanto o acionamento do pedal estiver interrompido.

Caso o operador libere o acionamento de qualquer uma das botoeiras, a faca deverá subir até o seu limite superior (fim se curso S1 acionado).

Toda vez que a faca descer até o fim de seu curso (fim de curso S2 acionado), esta deverá retornar a sua posição de repouso.

Solução:

Item a)

A figura 2.9 apresenta uma possível solução para o problema proposto.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Observe que todos os elementos sensores do circuito são de contato normalmente aberto conectados ao microcontrolador através de resistores de PULL DOWN, tal informação é importante para a construção do algoritmo pois desta maneira podemos concluir que todos os elementos são ativos em nível lógico alto.

É importante observar também o circuito de interface para a saída, pois temos fotoacopladores e relés que proporcionam uma melhor proteção do microcontrolador através da isolação galvânica entre a bobina do relé e o pino do microcontrolador.

5V 24V VDD D1 D2 B1 B2 B3 S1 S2 R6 RB3 RB5 VS1 VS2
5V
24V
VDD
D1
D2
B1
B2
B3
S1
S2
R6
RB3
RB5
VS1
VS2
RB2
A1
RD1
RB7
R7
RB6
RB4
VSS
A2
R1
R2
R3
R4
R5
PIC 18F2431

Figura 2.9: Circuito eletroeletrônico proposto para a solução do exercício 2.2.3.7

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Item b) O fluxograma a seguir representa o contexto de funcionamento do circuito.

INICIO

representa o contexto de funcionamento do circuito. INICIO CONFIGURAR PORTAS DE E/S INICIALIZAR SAÍDAS N Botões

CONFIGURAR PORTAS DE E/S

funcionamento do circuito. INICIO CONFIGURAR PORTAS DE E/S INICIALIZAR SAÍDAS N Botões pressionados S SUBIR

INICIALIZAR

SAÍDAS

N Botões pressionados S SUBIR PARAR N Pedal pressionado? N Totalmente recuado? S S S
N
Botões
pressionados
S
SUBIR
PARAR
N Pedal
pressionado?
N Totalmente
recuado?
S
S
S
Totalmente
avançado?
PARAR
N
DESCER

A seguir, o mesmo fluxograma representando os elementos tecnológicos utilizados.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

INICIO
INICIO
de Microcontroladores PIC Prof. João Luis Sanches INICIO TRISB ← CFh RB4 ← 0 RB5 ←

TRISBCFh

PIC Prof. João Luis Sanches INICIO TRISB ← CFh RB4 ← 0 RB5 ← 0 N

RB40

RB50

N RB6 e RB7 =1? S RB5←0 RB4←1 RB5←0 N RB1=1 ? N RB2=1 ?
N
RB6 e RB7
=1?
S
RB5←0
RB4←1
RB5←0
N RB1=1
?
N RB2=1
?
S
S
S
RB3=1
RB4←0
?
N
RB5←1

O código fonte proposto a seguir pode implementar o modelo lógico proposto segundo o fluxograma.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

/***********************************************************************/

*/

/***********************************************************************/

/*

CÓDIGO FONTE DO EXERCÍCIO 2.2.3.7

#include<p18f2431.h>

 

void main()

{

OSCCON=0x72;

TRISB=0xCF;

PORTBbits.RB4=0;

PORTBbits.RB5=0;

while(1)

{

if((PORTBbits.RB6==1)&&(PORTBbits.RB7==1))

{

 

if(PORTBbits.RB1==1)

{

if(PORTBbits.RB3==1)goto SOBE;

PORTBbits.RB5=1;

}

else

{

PORTBbits.RB5=0;

}

 

}

else

{

SOBE:

while(PORTBbits.RB2==0)

{

PORTBbits.RB5=0;

PORTBbits.RB4=1;

}

PORTBbits.RB4=0;

 

}

}

}

/***********************************************************************/

/

/***********************************************************************/

*/

FIM DO CÓDIGO

Observe que na solução existe um salto “goto” para um rótulo denominado de “SOBE”, isto foi necessário devido a um desvio imposto pelo fluxograma.

2.2.3.8 Dado o esquema a seguir, elaborar um programa em linguagem C para que faça varredura das teclas do teclado matricial e quando um tecla é detectada, seu valor deverá ser armazenado em um vetor de dados até que a tecla ENTER seja pressionada. Quando esta for pressionada, o número formado pelo teclado deverá ser armazenado, a função deverá retornar o número digitado.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

R2 10K 1 2 3 4 U1 11 RB0/PWM0 RC0/T1OSO/T1CKI 12 RB1/PWM1 RC1/T1OSI/CCP2/FLTA 13 RB2/PWM2
R2
10K
1
2
3
4
U1
11
RB0/PWM0
RC0/T1OSO/T1CKI
12
RB1/PWM1
RC1/T1OSI/CCP2/FLTA
13
RB2/PWM2
RC2/CCP1/FLTB
14
RB3/PWM3
RC3/T0CKI/T5CKI/INT0
15
RB4/KBI0/PWM5
RC4/INT1/SDI/SDA
R3
16
RB5/KBI1/PWM4/PGM
RC5/INT2/SCK/SCL
17
10K
RB6//KBI2/PGC
RC6/TX/CK/SS
18
RB7/KBI3/PGD
RC7/RX/DT/SDO
5
6
7
8
RA0/AN0
1
RA1/AN1
MCLR/VPP/RE3
RA2/AN2/VREF-/CAP1/INDX
R1
RA3/AN3/VREF+/CAP2/QEA
RA4/AN4/CAP3/QEB
1K
+5VCC
OSC2/CLKO/RA6
OSC1/CLKI/RA7
R4
8
7
10K
AVSS
AVDD
19
20
VSS
VDD
9
0
,
GND
PIC18F2431-I/SP
ENTER
GND

Figura 2.10: Esquema de microcontrolador com teclado matricial.

Analisando o esquema proposto, é possível observar que as colunas deverão ser energizadas e as linhas deverão ser lidas conforme a tabela de endereços a seguir.

ELEMENTO DA MATRIZ

PINO DO MICROCONTROLADOR

COLUNA1

RB3

COLUNA2

RB4

COLUNA3

RB5

COLUNA4

RB6

LINHA1

RB0

LINHA2

RB1

LINHA3

RB2

Tabela 2.2: Relação dos elementos da matriz do teclado com os pinos do microcontrolador

2.2.4 TEMPORIZADOR/CONTADOR

Os temporizadores /contadores, nada mais são do que contadores binários de 8 ou 16 bits com fonte de clock parametrizada pelo programador. Os pulsos vindos da fonte de clock incrementam o contador de acordo com sua parametrização, e ao limite da contagem (overflow) um flag é setado e dependendo da configuração pode gerar interrupção para futuro tratamento ou não.

Os microcontroladores da família PIC podem possuir até quatro tipos de timers para utilização em diversas aplicações.

2.2.4.1 O módulo TIMER0

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

O TIMER0 é um contador/temporizador que possui as seguintes características:

Módulo de 8 ou 16 bits selecionável por software;

Fonte

de

clock

interna

ou

externa,

possibilitando

temporização externos.

a

leitura

de

eventos

de

Quando selecionada a fonte de clock interno, a freqüência de entrada é igual à

f OSC /4.

Seleção de borda para o clock externo.

As figuras 2.10 e 2.11 mostram os diagramas de blocos do TIMER0 com detalhes e seus respectivos bits de controle.

O registrador T0CON é um registrador de leitura e escrita que controla todas as funções do

TIMER0, incluindo prescaler e fonte de clock.

T0CON: TIMER0 CONTROL REGISTER (REGISTRADOR DE CONTROLE DO

TIMER0)

Registrador 2.3

REGISTER (REGISTRADOR DE CONTROLE DO TIMER0) Registrador 2.3 bit 7: TMR0ON: Bit de controle On/Off do

bit 7: TMR0ON: Bit de controle On/Off do TIMER0 1= Habilita a contagem do TIMER0. 0= Para a contagem. bit 6: T016BIT: Bit de controle do modo de operação com 16 bits 1= O TIMER0 é configurado como contador/temporizador de 8 bits. 0= O TIMER0 é configurado como contador/temporizador de 16 bits. bit 5: T0CS: Bit de controle da fonte de clock. 1= Habilita fonte de clock Externa (pino T0CKI). 0= Habilita fonte de clock interna f OSC /4 bit 4: T0SE: Bit de controle da borda de transição do sinal de clock externo. Se configurado para funcionar com fonte de clock interna, este bit não possui significado. 1= Incrementa o contador em transição negativa no pino T0CKI. 0= Incrementa o contador em transição positiva no pino T0CKI.

bit 3: PSA: Bit de controle do Prescaler do TIMER0. 1= Prescaler desabilitado. 0= Contador operando com prescaler na fonte de clock com valor dependente do nível lógico dos bits T0PS2,T0PS1 e T0PS0 como mostra a tabela a seguir:

bit 2-0 T0PS2:T0PS0: Bits de seleção do prescaler do TIMER0.

0

0

0

= 1:2

0

0

1

= 1:4

0

1

0

= 1:8

0

1

1

= 1:16

1

0

0

= 1:32

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

1 1

0 1:64

=

1 0

1 1:128

=

1 1

1 1:256

=

Tabela 2.1

= 1 0 1 1:128 = 1 1 1 1:256 = Tabela 2.1 Figura 2.10 –

Figura 2.10 – Diagrama de blocos do bloco Temporizador / Contador 0

– Diagrama de blocos do bloco Temporizador / Contador 0 Figura 2.11 – Diagrama de blocos

Figura 2.11 – Diagrama de blocos do Contador/Temporizador 0 no modo de 16 bits.

Funcionamento do TIMER0

O TIMER0 pode funcionar como contador ou temporizador.

Para configurarmos o modo temporizador, devemos colocar nível lógico 0 no bit T0CS e o timer passa a funcionar como temporizador com fonte de clock de f CLOCK /4. Se um valor é inscrito no registrador TMR0, o incremento é perdido nos dois próximos ciclos de instrução. O usuário pode contornar este problema escrevendo um valor ajustado ao registrador TMR0.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

O modo contador é selecionado colocando-se um nível lógico alto no bit T0CS. Nessa

configuração o registrador TMR0 terá seu conteúdo incrementado em toda borda de subida

ou descida no pino RC3/T0CKI, A borda depende da configuração presente no bit T0SE.

Quando a fonte de clock do sistema é externa, é importante que essa fonte seja sincronizada com o a fase interna do sinal de clock (Tosc). Também existe um atraso entre a borda de descida do sinal e o incremento do registrador após a sincronização.

De qualquer forma todas estas características, não influem de forma significativa onde o controle de tempo não requer extrema precisão.

Prescaler

O módulo temporizador/contador 0 possui ainda um contador de 8 bits funcionando como

prescaler. Este contador não pode ser lido ou escrito. Este contador de realizar a divisão da freqüência do sinal de incremento do registrador

TMR0 permitindo uma melhor aplicabilidade do módulo temporizador/contador.

Os bits PSA e T0PS2:T0PS0 determinam a utilização e a taxa de divisão de freqüência do sinal de incremento.

Para habilitarmos a utilização do prescaler, basta colocarmos nível lógico baixo no bit PSA conforme as figuras (2.10 e 2.11). Quando o prescaler é habilitado, a taxa de divisão é selecionada conforme a tabela 2.1.

Quando qualquer instrução de acesso ao registrador TMR0 for executada, o contador do prescaler é automaticamente resetado, porem não irá desabilitar o prescaler.

Importante: A habilitação do prescaler é feita totalmente por software e pode ser alterada durante a execução do programa do usuário.

Interrupção do TIMER0

A interrrupção do TIMER0 é gerada quando ocorre transbordo (overflow) no registrador

TMR0. Para o modo de 16 bits a transição ocorre no valor FFFFh para 0000h e no modo de 8 bits ocorre no valor FFh para 00h. Na ocorrência do transbordo, o bit TMR0IF vai para nível lógico alto. A interrupção pode ser habilitada ou não através do bit TMR0IE.

Sempre que ocorrer um flag de transbordo do TIMER0, o bit TMR0IF deve ser setado por software durante o tratamento da interrupção antes de habilitar o timer novamente.

Leitura e escrita no modo de 16 bits.

O registrador TMR0H não é o registrador de byte mais significativo do registrador TMR0

do temporizador/contador TIMER0 (vide fig. 2.2), mas sim um buffer auxiliar para carga

do byte mais significativo do registrador TMR0 quando este está no modo de 16 bits. O

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

registrador TMR0H é sempre atualizado com o byte mais significativo de TMR0 quando uma instrução de leitura no registrador TMR0L é realizada. A escrita no byte mais significativo do TMR0 deve sempre passar pela carga do registrador TMR0H. E para efetivamente carregarmos o byte mais significativo do TMR0 com o conteúdo de TMR0H é necessária uma instrução de escrita em TMR0L.

Os registradores envolvidos na configuração e no funcionamento do TIMER0 são:

                 

Valor em

Valor durante

Nome

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

POR,BOR

RESET

TMR0L

 

Registrador de byte menos significativo do módulo TIMER0

 

xxxx xxxx

uuuu uuuu

TMR0H

 

Registrador de byte mais significativo do módulo TIMER0

 

0000

0000

0000

0000

INTCON

GIE/GIEH

PEIE/GIEL

TMR0IE

INT0IE

RBIE

TMR0IF

INT0IF

RBIF

0000

000x

0000

000u

T0CON

TMR0ON

T016BIT

T0CS

T0SE

PSA

T0PS2

T0PS1

T0PS0

1111

1111

1111

1111

TRISA

RA7 (1)

RA6 (1)

 

Direção da porta de dados

 

1111

1111

1111

1111

Tabela 2.2 Legenda: ‘x’= Não reconhecido; ‘u’= Não alterado. Nota 1: RA6 e RA7 são habilitados como pino de E/S dependendo do modo selecionado para a fonte de clock na palavra de configuração do dispositivo.

Exemplo de aplicação do TIMER0

Tomando como base o circuito a seguir, elaborar um programa que responda de forma que toda vez que a chave S1 for acionada, o led conectado a saída permaneça por 1 segundo ligado e em seguida desliga aguardando mais um pulso na chave. Dados: Clock Interno de 8 MHz

+ 5V

+ 5V VDD R2 + 5V RB0 PIC 18f2431 R1 S1 R3 RA4 VSS
+ 5V
VDD
R2
+ 5V
RB0
PIC
18f2431
R1
S1
R3
RA4
VSS

Figura 2.12

Solução:

Primeiramente determina-se o valor de carga do registrador TMR0 (TMR0H E TMR0L)

f TIMER

=

 OSC   f  4   , onde P.S é o fator
OSC
  f
4
 , onde P.S é o fator de divisão do prescaler.
P S
.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Observação: Se o prescaler não estiver sendo utilizado o valor de P.S é um. Utilizando o prescaler fazendo a divisão por 128 temos:

f

TIMER

N

(

CARGA

=

( ) 8 *10 6 4
(
)
8 *10 6
4

128

15625[

)

=

65536

txf

(

TIMER

)

=

Hz

]

65536

1

segx

15625

=

65536

15625

=

C

2

F

7

h

portanto, o valor a ser carregado no registrador TMR0H é C2h e o valor a ser carregado no registrador TMR0L é F6h.

Agora devemos construir um fluxograma de funcionamento da rotina proposta.

INICIO

um fluxograma de funcionamento da rotina proposta. INICIO ANSEL0.4 ← 0 TRISA.4 ← 1 TRISB.0 ←

ANSEL0.4 0 TRISA.41 TRISB.0 0 T0CON 0x06 INTCON 0

← 1 TRISB.0 ← 0 T0CON ← 0x06 INTCON ← 0 TMR0H=0xC2; TMR0L=0xF7; RB0 ← 0

TMR0H=0xC2;

TMR0L=0xF7;

RB0 0

S RA4=0? N
S
RA4=0?
N

RB0 1 TMR0ON 1

S TMR0IF=0 N
S TMR0IF=0
N

TMR0IF 0 TMR0ON 0

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

De posse do fluxograma, o próximo passo é elaborarmos o programa em linguagem C baseado no compilador C18 da Microchip.

Código Fonte em C

/***********************************************************************/

/*

/***********************************************************************/

*/

CÓDIGO FONTE DO EXERCÍCIO 2.2.4.6

#include<p18f2431.h>

/***********************************************************************/

/*Função config_SYS() é uma fção auxiliar para a configuração do

*/

/* microcontrolador

*/

/***********************************************************************/ void config_SYS(void)

{

OSCCON=0x72;/*Configura o registrador para que o microcontrolador trabalhe com oscilador interno de 8MHz*/ ANSEL0bits.ANS4=0;/*Configura o pino RA4 para trabalhar como E/S digital.*/ TRISAbits.TRISA4=1;/*Configura pino RA4 como entrada digital*/ TRISBbits.TRISB0=0;/*Configura o pino RB0 como saída digital*/ T0CON=0x06;/*Configura timer0 para funcionar em modo 16bits com prescaler 1:128/* INTCON=0;/*Desabilita interrupções e zera o flag do timer0*/

}

/***********************************************************************/

/*

*/

/***********************************************************************/

Início da função principal main()

void main()

{

config_SYS();//Chama funcionamento do sistema.

while(1)

{

a

rotina

TMR0H=0xC2;

TMR0L=0xF6;

PORTBbits.RB0=1;

while(PORTAbits.RA4);

PORTBbits.RB0=0;

T0CONbits.TMR0ON=1;

while(!INTCONbits.TMR0IF);

INTCONbits.TMR0IF=0;

T0CONbits.TMR0ON=0;

}

}

de

configuração

inicial

de

/***********************************************************************/

/*

*/

FIM DO PROGRAMA

/***********************************************************************/

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

2.2.5 EXERCÍCIOS PROPOSTOS

2.2.5.1 Qual deve ser o valor carregado no registrador T0CON para configurar o TIMER0

no modo de 8 bits funcionando com prescaler 1:128 e fonte de clock interno.?

2.2.5.2 Considerando as configurações do exercício anterior e freqüência de clock de 8

MHz, qual deve ser a freqüência do sinal de flag TMR0IF gerado se os valores iniciais de carga do registrador TMR0L forem: a) 0, b) 100, c) 80.

2.2.5.3 Descreva as características de configuração do TIMER0 se o conteúdo carregado no

registrador T0CON for: a) 0x06, b) 0x78, c) 0x70.

2.2.5.4 Elabore um fluxograma e o seu respectivo programa em linguagem C para que uma

forma de onda quadrada com freqüência de 1kHz seja gerada no pino RB1 do microcontrolador PIC 18f4431 durante o momento em que a chave S1 que está conectada através de um resistor de pull-down no pino RB0 estiver fechada.

Dados: f (OSC) =4MHz, timer0 operando no modo de 16 bits.

2.2.5.5 Elabore o fluxograma e o programa em linguagem C para que os motores mostrados

no esquema proposto pela figura 2.4 entrem em funcionamento na seqüência (M1,M2,M3,M4) após um pulso dado na chave S1 obedecendo um intervalo de 5 segundos para cada motor. Após um pulso na botoeira S0, os motores deverão ser desligados.

Dados: f (OSC) =8MHz, timer0 operando no modo de 16 bits.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

S0

+5V BARRAMENTO TRIFÁSICO 220V +24V R S T F1 DRIVER 1 7 S1 F2 VDD
+5V
BARRAMENTO
TRIFÁSICO 220V
+24V
R
S
T
F1
DRIVER 1
7
S1
F2
VDD
M1
25
21
F3
RB4
RB0
START/STOP
R1
R2
26
22
RB5
RB1
R9
R10
23
RB2
24
RB3
F4
DRIVER 2
F5
M2
F6
START/STOP
R3
R4
F7
DRIVER 3
VSS
F8
M3
8
F9
START/STOP
R5
R6
F10
DRIVER 4
F11
M4
F12
START/STOP
R7
R8
PIC 18F2431

Figura 2.13 – Diagrama do sistema de controle de partidas consecutivas de motores.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

2.2.6 INTERRUPÇÃO

Interrupção é um evento externo ou interno que obriga o microprocessador ou microcontrolador a parar o processamento do programa principal temporariamente para atender uma rotina de maior prioridade. Estes eventos podem ser overflow de temporizadores/contadores, mudanças de estado em algum pino do microcontrolador, e outros eventos que serão descritos a seguir.

Na ocorrência da interrupção o processamento é direcionado para um endereço de memória de programa específico denominado de vetor de interrupção que depende do evento de interrupção que é gerado. A partir deste endereço temos a rotina de tratamento de interrupção ou um salto para uma rotina de tratamento de interrupção caso esta esteja em outro endereço da memória de programa.

Após o tratamento da interrupção, uma instrução específica de retorno de interrupção faz com que o fluxo de execução do programa retorne para o ponto que estava sendo executado antes da ocorrência da interrupção.

A figura a seguir ilustra o esquema de tratamento de uma interrupção em um sistema microprocessado.

VETOR_DE_INTERRUPÇÃO: SALTO PARA ROTINA DE TRATAMENTO INÍCIO_DA_ROTINA_PRINCIPAL: INSTRUÇÃO1; INSTRUÇÃO2; . .
VETOR_DE_INTERRUPÇÃO:
SALTO PARA ROTINA DE TRATAMENTO
INÍCIO_DA_ROTINA_PRINCIPAL:
INSTRUÇÃO1;
INSTRUÇÃO2;
.
.
.
.
.
.
.
.
.
.
.
.
OCORRÊNCIA DO EVENTO DE INTERRUPÇÃO
.
.
.
INSTRUÇÃON;
ROT_TRATAMENTO_INTERRUPÇÃO: INSTRUÇÃO1;
INSTRUÇÃO2;
.
.
.
.
.
.
.
.
.
INSTRUÇÃON;
RETORNO_DE_INTERRUPÇÃO;

Latência de Interrupção

A latência de interrupção é definida como o tempo decorrido entre o evento de interrupção (tempo em que o flag é setado), e o início do tratamento desta (salto para o vetor de interrupção).

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Na família de microcontroladores PIC 18fXX31, as interrupções síncronas (geralmente internas) são de aproximadamente um ciclo de instrução enquanto que as interrupções assíncronas (geralmente externas) podem levar de 2 à 4 ciclos de instrução

Estrutura de interrupções nos microcontroladores PIC 18FXX31

A figura a seguir mostra um diagrama lógico da estrutura de interrupções dos microcontroladores PIC da família 18FXX31.

dos microcontroladores PIC da família 18FXX31. Figura 2.15: Estrutura de interrupções dos

Figura 2.15: Estrutura de interrupções dos microcontroladores PIC 18FXX31

Analisando a estrutura mostrada na figura 2.15 é possível observar que os microcontroladores desta família possuem dois níveis de prioridade de interrupção em que o usuário pode configurar através dos registradores de interrupção que serão discutidos posteriormente.

Para cada nível de prioridade podemos habilitar interrupção dos seguintes periféricos:

TIMER0;

PSP (Parallel Slave Port) – Porta paralela escrava;

Conversor A/D;

Recepção de dados da EUSART;

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Mudança de estado no PORTB;

Pino INT0;

Pino INT1;

Pino INT2.

Para o esquema proposto de interrupções temos dois vetores que se localizam no endereço 0008h da memória de programa para interrupções de alta prioridade e o endereço 0018h para interrupções de baixa prioridade. Para utilizarmos qualquer interrupção devemos habilitar o bit GIEL ou GIEH dependendo da prioridade desejada.

Para cada fonte de interrupção temos 3 bits sendo dois de configuração e um de flag da interrupção. Para configurarmos uma interrupção devemos habilitar a fonte de interrupção e definir a prioridade.

Quando ocorre a interrupção o flag desta é ativo provocando então a para da CPU para atendimento do evento de interrupção ocorrido.

É importante lembrar que após o tratamento da interrupção o flag deve ser resetado por software através do programa de usuário.

Registradores

Existem treze registradores para controle de interrupção dos microcontroladores PIC 18FXX31. Estes registradores são:

RCON

INTCON

INTCON2

INTCON3

PIR1,PIR2,PIR3

PIE1,PIE2,PIE3

IPR1,IPR2,IPR3

Registrador 2.4 – INTCON

• IPR1,IPR2,IPR3 Registrador 2.4 – INTCON Bit 7: GIE/GIEH: Bit de habilitação geral Quando IPEN

Bit 7:

GIE/GIEH: Bit de habilitação geral Quando IPEN =0:

1=Habilita todas as interrupções não mascaradas. 0=Desabilita todas as interrupções.

Quando IPEN=1:

1= Habilita todas as interrupções em prioridade alta. 0= Desabilita todas as interrupções em prioridade alta.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Bit 6:

PEIE/GIEL: Bit de habilitação da interrupção de Periféricos

Quando IPEN =0:

1= Habilita todas as interrupções de periféricos não mascaradas. 0= Desabilita todas as interrupções de periféricos.

Quando IPEN=1:

1= Habilita todas as interrupções de periféricos em prioridade baixa. 0= Desabilita todas as interrupções de periféricos em prioridade baixa.

Bit 5:

TMR0IE: Bit de habilitação de interrupção do TIMER 0

Bit 4:

1=Habilita a interrupção do TIMER 0. 0=Desabilita a interrupção do TIMER 0. INT0IE: Bit de habilitação da interrupção do pino externo INT0

1= Habilita interrupção externa INT0. 0= Desabilita interrupção externa INT0.

Bit 3:

RBIE: Bit de habilitação de interrupção por mudança de estado no PORTB

1= Habilita interrupção por mudança de estado no PORTB. 0= Desabilita interrupção por mudança de estado no PORTB.

Bit 2:

TMR0IF: Flag de estouro do TIMER0

1= Ocorreu overflow no TIMER0. 0= Não ocorreu overflow no TIMER0 (operando normalmente).

Bit 1:

INT0IF: Flag de interrupção externa no pino INT0

1= Interrupção no pino INT0 ocorreu. 0= Interrupção no pino INT0 não ocorreu.

Bit 0:

RBIF: Flag de interrupção por mudança de estado no PORTB

1= Pelo menos um dos pinos de RB4 a RB7 mudou de estado. 0= Não houve mudança de estado nos pinos de RB4 a RB7.

Registrador 2.5 – INTCON2

estado nos pinos de RB4 a RB7. Registrador 2.5 – INTCON2 Bit 7: RBPU: Bit de

Bit 7:

RBPU: Bit de habilitação dos resistores de pull-up do PORTB

1= Todos os resistores de pull-up estão desabilitados. 0= Resistores de pull-up estão habilitados.

Bit 6:

INTEDG0: Bit de seleção da borda de atuação da interrupção INT0

1= Interrupção ocorre na borda de subida. 0= Interrupção ocorre na borda de descida.

Bit 5:

INTEDG1: Bit de seleção da borda de atuação da interrupção INT1

1= Interrupção ocorre na borda de subida.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

0= Interrupção ocorre na borda de descida.

Bit 4:

INTDG2 Bit de seleção da borda de atuação da interrupção INT2

1= Interrupção ocorre na borda de subida. 0= Interrupção ocorre na borda de descida.

Bit 3:

Não Implementado (lido como 0)

Bit 2:

TMR0IP: Bit de seleção de prioridade de interrupção do TIMER0

1= Alta prioridade. 0= Baixa prioridade.

Bit 1:

Não Implementado (lido como 0)

Bit 0:

RBIP:

Bit de seleção de prioridade de interrupção por mudança de estado no

PORTB

1= Alta prioridade. 0= Baixa prioridade.

Registrador 2.6 – INTCON3

prioridade. 0= Baixa prioridade. Registrador 2.6 – INTCON3 Bit 7: INT2IP: Bit de seleção de prioridade

Bit 7:

INT2IP: Bit de seleção de prioridade de interrupção externa INT2

1= Alta prioridade. 0= Baixa prioridade.

Bit 6:

INTIP: Bit de seleção de prioridade de interrupção externa INT1

1= Alta prioridade. 0= Baixa prioridade.

Bit 5:

Não Implementado (lido como 0)

Bit 4:

INT2IE: Bit de habilitação da interrupção externa INT2

1= Habilita interrupção externa INT2. 0= Desabilita interrupção externa INT2.

Bit 3:

INT1IE: Bit de habilitação da interrupção externa INT1

1= Habilita interrupção externa INT1. 0= Desabilita interrupção externa INT1.

Bit 2:

Não Implementado (lido como 0)

Bit 1:

INT2IF: Flag de ocorrência de interrupção no pino INT2

1= Ocorrência de interrupção no pino INT2. 0= Não ocorreu interrupção no pino INT2.

Bit 0:

INT1IF: Flag de ocorrência de interrupção no pino INT1

1= Ocorrência de interrupção no pino INT1. 0= Não ocorreu interrupção no pino INT1.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Registrador 2.7 – PIR1 (Peripheral Interrupt Request)

Registrador 2.7 – PIR1 (Peripheral Interrupt Request) Bit 7: Não Implementado (lido como 0) Bit 6:

Bit 7:

Não Implementado (lido como 0)

Bit 6:

ADIF: Flag de ocorrência de interrupção do conversor A/D

1= Uma conversão A/D acaba de ser concluída. 0= Conversão A/D não está concluída.

Bit 5:

RCIF: Flag de ocorrência de interrupção por presença de dados no buffer de recepção da USART

1= O buffer de recepção da USART RCREG está cheio. 0= O buffer de recepção da USART RCREG está vazio.

Bit 4:

TXIF: Flag de ocorrência de interrupção de transmissão de dados através da USART

1= O buffer de transmissão da USART TXREG está vazio ( Registrador é resetado quando o existe uma escrita no registrador TXREG). 0= O buffer de transmissão da USART TXREG está cheio.

Bit 3:

SSPIF: Flag de interrupção da porta de comunicação serial síncrona

1= A transmissão e/ou recepção foi completa. 0= Aguardando uma operação de recepção ou transmissão.

Bit 2:

CCP1IF: Flag de interrupção do módulo CCP1

Modo de captura:

1= Uma captura no registrador TIMER1 ocorreu. 0= Nenhuma captura no registrador TIMER1 ocorreu.

Modo de comparação:

1= O valor de TMR1 se igualou ao valor de CCPR1. 0= O valor de TMR1 está diferente do valor de CCPR1.

Módulo de PWM:

Não utilizado neste modo.

Bit 1:

TMR2IF: Flag de estouro do TIMER2

1= Ocorreu overflow no TIMER2. 0= Não ocorreu overflow no TIMER2 (operando normalmente).

Bit 0:

TMR1IF: Flag de estouro do TIMER1

1= Ocorreu overflow no TIMER1. 0= Não ocorreu overflow no TIMER1 (operando normalmente).

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Registrador 2.8: PIR2

Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches Registrador 2.8: PIR2

Bit 7:

OSFIF: Flag de interrupção por falha no clock do sistema

1= Clock do sistema falhou, entrada de clock foi chaveada para o oscilador interno. 0= Clock do sistema operando normalmente.

Bit 5:6: Não implementado (lido como 0)

Bit 4:

EEIF: Flag de interrupção da operação da EEPROM ou Flash.

1= Uma operação de escrita foi concluída. 0= Uma operação de escrita não foi concluída ou ainda não foi iniciada.

Bit 3:

Não implementado (lido como 0)

Bit 2:

LVDIF: Flag de interrupção por detecção de baixa tensão

1= Tensão da fonte caiu a um nível de tensão abaixo do especificado. 0= Tensão da fonte é superior ao nível de baixa tensão especificado.

Bit 1:

Não implementado (lido como 0)

Bit 0:

CCP2IF: Flag de interrupção do módulo CCP2

Modo de captura:

1= Uma captura no registrador TIMER1 ocorreu. 0= Nenhuma captura no registrador TIMER1 ocorreu.

Modo de comparação:

1= O valor de TMR1 se igualou ao valor de CCPR1. 0= O valor de TMR1 está diferente do valor de CCPR1.

Módulo de PWM:

Não utilizado neste modo.

Registrador 2.9: PIR3

de PWM: Não utilizado neste modo. Registrador 2.9: PIR3 Bit 7:5: Não implementado (lido como 0)

Bit 7:5: Não implementado (lido como 0)

Bit 4:

PTIF: Flag de interrupção da base de tempo do temporizador do módulo PWM

1= O contador de base de tempo do módulo PWM atingiu o valor do registrador PTPER. Interrupção é enviada dependendo dos ajustes do postscaler.

0= O contador de base de tempo do módulo PWM não atingiu o valor do registrador PTPER.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Bit 3:

IC3DRIF: Flag de interrupção por captura de borda ou de mudança de direção do contador POSCNT

Módulo de Captura de borda habilitado (IC1):

1= Valor do registrador TMR5 foi capturado por uma borda na entrada CAP3. 0= Valor do TMR5 não foi capturado.

Módulo de quadratura de encoder habilitado:

1= Direção de rotação foi modificada. 0= Direção de rotação não foi modificada.

Bit 2:

IC2QEIF: Flag de interrupção do módulo de captura de borda CCP2 ou por alcance do valor máximo do registrador de posição.

Módulo de Captura de borda habilitado (IC2):

1= Valor do registrador TMR5 foi capturado por uma borda na entrada CAP2. 0= Captura do TIMER5 não foi capturado.

Módulo de quadratura de encoder habilitado:

1= O registrador de posição POSCNT atingiu o valor máximo especificado em MAXCNT.

0= O registrador de posição POSCNT não atingiu o valor máximo especificado em MAXCNT.

Bit 1:

IC1IF: Flag de interrupção do módulo de captura IC1

Módulo IC1 habilitado:

1= Valor do registrador TMR5 foi capturado por uma borda na entrada CAP1. 0= Valor do TMR5 não foi capturado.

Módulos de quadratura de encoder e medição de velocidade habilitados:

1= Valor do TIMER5 foi capturado através de uma borda ativa na entrada de medição de velocidade (terminais QEA e QEB). 0= Valor do TIMER5 não foi capturado.

Bit 0:

TMR5IF: Flag de interrupção do TIMER5

1= Base de tempo do TIMER5 alcançou o valor de PR5. 0= Base de tempo do TIMER5 não alcançou o valor de PR5.

Registrador 2.10 – PIE1 (Peripheral Interrupt Enable)

PR5. Registrador 2.10 – PIE1 (Peripheral Interrupt Enable) Bit 7: Não implementado (lido como 0) Bit

Bit 7:

Não implementado (lido como 0)

Bit 6:

ADIE: Bit de habilitação da interrupção do conversor A/D

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

1= Habilita interrupção do conversor A/D. 0= Desabilita interrupção do conversor A/D.

Bit 5:

RCIE: Bit de habilitação da interrupção de recepção do canal serial.

1= Habilita interrupção de recepção serial. 0= Desabilita interrupção de recepção serial.

Bit 4:

TXIE: Bit de habilitação da interrupção de transmissão do canal serial.

1= Habilita interrupção de transmissão serial. 0= Desabilita interrupção de transmissão serial.

Bit 3:

SSPIE: Bit de habilitação da interrupção da interface serial síncrona.

1= Habilita interrupção da interface serial síncrona. 0= Desabilita interrupção da interface serial síncrona.

Bit 2:

CCP1IE: Bit de habilitação da interrupção do módulo CCP1.

1= Habilita interrupção do módulo CCP1. 0= Desabilita interrupção do módulo CCP1.

Bit 1:

TMR2IE: Bit de habilitação da interrupção do TIMER2.

1= Habilita interrupção do TIMER2. 0= Desabilita interrupção do TIMER2.

Bit 0:

TMR1IE: Bit de habilitação da interrupção do TIMER1.

1= Habilita interrupção do TIMER1. 0= Desabilita interrupção do TIMER1.

Registrador 2.11 – PIE2

interrupção do TIMER1. Registrador 2.11 – PIE2 Bit 7: OSFIE: Bit de habilitação de interrupção por

Bit 7:

OSFIE: Bit de habilitação de interrupção por falha do oscilador.

1= Habilitado.

0= Desabilitado.

Bit 6-5:Não implementado (lido como 0)

Bit 4:

EEIE: Bit de habilitação de interrupção de escrita na EEPROM.

1= Habilitado.

0= Desabilitado.

Bit 3:

Não implementado (lido como 0)

Bit 2:

LVDIE: Bit de habilitação de interrupção de detecção de baixa tensão.

1= Habilitado.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

0= Desabilitado.

Bit 1:

Não implementado (lido como 0)

Bit 0:

CCP2IE: Bit de habilitação da interrupção do módulo CCP2.

1= Habilita interrupção do módulo CCP2. 0= Desabilita interrupção do módulo CCP2.

Registrador 2.12 – PIE3

interrupção do módulo CCP2. Registrador 2.12 – PIE3 Bit 7-5: Não implementado (lido como 0) Bit

Bit 7-5:Não implementado (lido como 0)

Bit 4:

PTIE: Bit de habilitação de interrupção da base de tempo do módulo PWM.

1= Habilitado.

0= Desabilitado.

Bit 3:

IC3DRIE: Bit de habilitação da interrupção por captura de borda ou de mudança de direção do contador POSCNT

Módulo de Captura de borda habilitado (IC1):

1= Habilitado.

0= Desabilitado.

Módulo de quadratura de encoder habilitado:

1= Habilitado.

0= Desabilitado.

Bit 2:

IC2QEIE: Bit de habilitação da interrupção do módulo de captura de borda CCP2 ou por alcance do valor máximo do registrador de posição.

Módulo de Captura de borda habilitado (IC2):

1= Habilitado.

0= Desabilitado.

Módulo de quadratura de encoder habilitado:

1= Habilitado.

0= Desabilitado.

Bit 1:

IC1IE: Bit de habilitação da interrupção do módulo de captura IC1

1= Interrupção do módulo IC1 habilitada. 0= Interrupção do módulo IC1 desabilitada.

Bit 0:

TMR5IE: Bit de habilitação da interrupção do TIMER5.

1= Habilita interrupção do TIMER5. 0= Desabilita interrupção do TIMER5.

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Registrador 2.13 – IPR1 (Peripheral Interrupt Priority)

Registrador 2.13 – IPR1 (Peripheral Interrupt Priority) Bit 7: Não implementado (lido como 0) Bit 6:

Bit 7:

Não implementado (lido como 0)

Bit 6:

ADIP: Bit de habilitação de prioridade de interrupção do conversor A/D.

Bit 5:

1= Alta prioridade. 0= Baixa prioridade. RCIP: Bit de habilitação de prioridade de interrupção da recepção serial.

1= Alta prioridade. 0= Baixa prioridade.

Bit 4:

TXIP: Bit de habilitação de prioridade de interrupção da transmissão serial.

1= Alta prioridade. 0= Baixa prioridade.

Bit 3:

SSPIP: Bit de habilitação de prioridade de interrupção módulo SSP.

1= Alta prioridade. 0= Baixa prioridade.

Bit 2:

CCP1IP: Bit de habilitação de prioridade de interrupção do módulo CCP1.

1= Alta prioridade. 0= Baixa prioridade.

Bit 1:

TMR2IP: Bit de habilitação de prioridade de interrupção do TIMER2.

1= Alta prioridade. 0= Baixa prioridade.

Bit 0:

TMR1IP: Bit de habilitação de prioridade de interrupção do TIMER1.

1= Alta prioridade. 0= Baixa prioridade.

Registrador 2.14 – IPR2

prioridade. 0= Baixa prioridade. Registrador 2.14 – IPR2 Bit 7: OSFIP: Bit de prioridade de interrupção

Bit 7:

OSFIP: Bit de prioridade de interrupção por falha do oscilador

1= Alta prioridade. 0= Baixa prioridade.

Bit 6:5: Não implementado (lido como 0)

Bit 4:

EEIP: Bit de prioridade de interrupção da EEPROM

58

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

1= Alta prioridade. 0= Baixa prioridade.

Bit 3:

Não implementado (lido como 0)

Bit 2:

LVDIP: Bit de prioridade de interrupção por detecção de baixa tensão

1= Alta prioridade. 0= Baixa prioridade.

Bit 1:

Não implementado (lido como 0)

Bit 0:

CCP2IP: Bit de prioridade de interrupção do módulo CCP2

1= Alta prioridade. 0= Baixa prioridade.

Registrador 2.15 – IPR3

prioridade. 0= Baixa prioridade. Registrador 2.15 – IPR3 Bit 7-5: Não implementado (lido como 0) Bit

Bit 7-5:Não implementado (lido como 0)

Bit 4:

PTIP: Bit de prioridade de interrupção da base de tempo do módulo PWM

1= Alta prioridade. 0= Baixa prioridade.

Bit 3:

IC3DRIP: Bit de prioridade da interrupção por captura de borda ou de mudança de direção do contador POSCNT

Módulo de Captura de borda habilitado (IC3):

1= Interrupção IC3 com alta prioridade. 0= Interrupção IC3 com baixa prioridade.

Módulo de quadratura de encoder habilitado:

1= Alta prioridade. 0= Baixa prioridade.

Bit 2:

IC2DRIP: Bit de prioridade da interrupção por captura de borda ou de mudança de direção do contador POSCNT

Módulo de Captura de borda habilitado (IC2):

1= Interrupção IC2 com alta prioridade. 0= Interrupção IC2 com baixa prioridade.

Módulo de quadratura de encoder habilitado:

1= Alta prioridade. 0= Baixa prioridade.

Bit 1:

IC1IP: Bit de prioridade da interrupção do módulo de captura IC1

59

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Bit 0:

1= Alta prioridade. 0= Baixa prioridade.

TMR5IP: Bit de prioridade da interrupção do TIMER5.

1= Alta prioridade. 0= Baixa prioridade.

Registrador 2.16 – RCON

prioridade. 0= Baixa prioridade. Registrador 2.16 – RCON Bit 7: IPEN: Bit de habilitação prioridade de

Bit 7:

IPEN: Bit de habilitação prioridade de interrupções

1= Habilita níveis de prioridade de interrupções. 0= Desabilita níveis de prioridade de interrupções.

Bit 6-5: Não implementado (lido como 0)

Bit 4:

RI: Não estudado.

Bit 3:

RI: Não estudado.

Bit 2:

RI: Não estudado.

Bit 1:

RI: Não estudado.

Bit 0:

RI: Não estudado.

Portanto para habilitarmos uma determinada interrupção, devemos primeiramente habilitar a interrupção desejada através dos registradores PIE’s e INTCON’s dependendo do tipo de interrupção desejada, e em seguida construir a rotina de tratamento de interrupção.

Importante: Todos os flags de interrupção (com exceção do canal serial) devem ser resetados após o tratamento de interrupção através no programa de usuário. Para evitar recursividade.

Tratamento de interrupções utilizando o compilador C18 da Microchip. Para construirmos uma rotina de tratamento de interrupção, primeiramente devemos construir o código a partir do endereço de memória de programa que aponta para o vetor de interrupção do dispositivo utilizado. Para realizar esta operação utiliza-se a diretiva #pragma code seguido do nome do código e o endereço absoluto da memória de programa onde se deseja alocar o código.

Exemplo:

#pragma code meu_código=0x0020

Esta diretiva define que as instruções a seguir serão alocadas a partir do endereço 0020h.

60

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Vale lembrar que esta diretiva pode ser utilizada para alocação de programas independentemente do tratamento de interrupções. O MPLAB C18 não aloca automaticamente a RSI (Rotina de Serviço de Interrupção) no vetor de interrupção, portanto através da diretiva mencionada acima devemos inserir o vetor de interrupção.

Geralmente no vetor de interrupção colocamos o uma instrução de salto “GOTO” para o respectivo segmento onde se localiza a rotina de tratamento de interrupção. Observe o exemplo a seguir.

#pragma code low_vector=0x0018

void interrupt_low_vector(void)

{

_asm

GOTO low_RSI

_endasm

}

#pragma code

#pragma interruptlow low_RSI

void low_RSI

{

/*

.

.

. */

}

Quando declaramos a diretiva #pragma interruptlow low_RSI estamos informando ao compilador que este segmento de programa se refere a uma rotina de tratamento de interrupção. Com isso o compilador procede de maneira adequada para tratamento de interrupção como, por exemplo, salvamento de contexto entre outras funções.

2.2.7 EXERCÍCIOS RESOLVIDOS

2.2.7.1 Elabore o programa em linguagem C para que uma forma de onda quadrada com freqüência de 1kHz seja gerada no pino RB1 do microcontrolador PIC 18f2431 trabalhando com uma freqüência de clock de 8MHz.

Solução:

Primeiramente devemos determinar o valor a ser carregado nos registradores TMR0H e TMR0L. Para determinarmos este valor devemos primeiramente saber de quanto em quanto tempo deverá ser gerada a interrupção, observando a figura 2.16 é possível visualizar que a interrupção deverá ser gerada a cada 500 microssegundos.

61

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

0

mudança de estado 1 0 500 1000 t(µS)
mudança de estado
1
0 500
1000
t(µS)

Figura 2.16: Mudança de estado do pino do RB1

Portanto devemos configurar o TIMER0 para gerar interrupções a cada 500 microssegundos, e a cada interrupção a saída RB1 deverá mudar de estado. Então devemos primeiramente determinar qual valor deverá ser carregado no registrador TMR0 para gerar interrupções no período desejado.

Do estudo sobre Timer (Cap. 2.2.4) temos:

f TIMER

=

 OSC   f  4   e P S .
OSC
  f
4
 e
P S
.

N

(

CARGA

)

=

65535 txf

(

TIMER

)

.

Utilizando o prescaler 1:1 e f OSC = 8MHz temos:

f

TIMER

=

 8 ⋅ 10 6     4 
 8
10 6
4

1

f

TIMER

O N de carga será:

N

( CARGA

) =

65535

500 10

6

= 2

x

2

MHz

10

6

N

(

CARGA

)

=

64535

=

FC

17

h

Portanto teremos TMR0H=FCh e TMR0L=17h

A seguir temos o código fonte sugerido e comentado em linguagem C para o compilador MPLAB C18.

/***********************************************************************/

*/

/***********************************************************************/

/*

RESOLUÇÃO DO EXERCÍCIO 2.2.7.1

#include<p18f2431.h>

#include<timers.h>

/***********************************************************************/

/*

/***********************************************************************/

*/

Protótipo da função high_RSI

void high_RSI(void);

/***********************************************************************/ /* A função Config_Int() tem a finalidade de configurar os registrado- */

*/

/***********************************************************************/

/* necessários para o funcionamento da interrupção.

62

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

void Config_Int(void)

{

 

INTCONbits.TMR0IE=1;//Habilita interrupção do TIMER0 INTCON2bits.TMR0IP=1;//Habilita prioridade de interrupção do TIMER0 INTCONbits.TMR0IF=0;//Reseta o flag de overflow do TIMER0

INTCONbits.GIEH=1;

}

/***********************************************************************/ /* A função Config_Sys() tem a finalidade de configurar os registrado- */

*/

/***********************************************************************/

/* de E/S e configuração do TIMER0

void Config_Sys(void)

{

 

OSCCON=0x72;

TRISBbits.TRISB1=0;

TMR0H=0xFC;

TMR0L=0x17;

OpenTimer0(T0_16BIT&T0_SOURCE_INT&T0_PS_1_1);

T0CONbits.TMR0ON=0;

}

/***********************************************************************/

Declaração da função de desvio para o tratamento da interrupção */

/***********************************************************************/

/*

#pragma code high_vector=0x08 void high_vector(void)

{

_asm

GOTO high_RSI

_endasm

}

#pragma code

/***********************************************************************/

*/

/***********************************************************************/

/*

Função de tratamento da interrupção

#pragma interruptlow high_RSI void high_RSI(void)

{

INTCONbits.TMR0IF=0;

PORTBbits.RB1=!PORTBbits.RB1;

TMR0H=0xFC;

TMR0L=0x17;

}

#pragma code

/***********************************************************************/

/*

*/

/***********************************************************************/

Função Principal

void main()

{

Config_Sys();

63

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

Config_Int();

while(1);

}

/***********************************************************************/

*/

/*

/***********************************************************************/

Fim do Código

2.2.7.2 Considerando o exercício 2.2.3.7, e adicionando um botão com contato N.F com a função de parada de emergência no pino INT0, como deve ficar o novo código fonte do exercício sabendo-se que quando o botão de emergência estiver pressionado o sistema deverá permanecer bloqueado?

Solução:

Para a solução deste problema, algumas modificações serão feitas no algoritmo já pronto, uma delas é a amarração do início do funcionamento da máquina somente se o botão de emergência estiver solto.

Outra modificação é com relação à interrupção, pois teremos que ativar a interrupção INT0 para que a máquina possa ter seu processo interrompido independentemente de qualquer ação que a mesma deva estar executando.

Para habilitarmos a interrupção INT0 devemos carregar nível lógico ‘1’ nos bits 7 e 4 do registrador 2.4 (INTCON)

O flag da interrupção INT0 está localizado no bit 1 do mesmo registrador.

O bit de seleção de borda de atuação da interrupção INT0 é o bit 6 do registrador 2.5 (INTCON2), o nome deste bit é INTEDG0.

Considerando que o contato do botão de emergência é do tipo N.F, e que este esteja conectado ao pino INT0 através de um resistor de PULL-DOWN, toda vez que este botão for pressionado será gerada uma borda de descida no pino INT0, portanto a borda de atuação da interrupção deverá ser de descida (bit INTEDG0=0).

Segue a seguir o código fonte sugerido para a solução do exercício:

/***********************************************************************/

/*

/***********************************************************************/

*/

CÓDIGO FONTE DO EXERCÍCIO 2.2.7.2

#include<p18f2431.h>

/***********************************************************************/

/*

*/

/***********************************************************************/

Protótipo da função high_RSI

void high_RSI(void);

64

UMC – ACET – Tec. Automação Industrial Microprocessadores (I) – A família de Microcontroladores PIC Prof. João Luis Sanches

/***********************************************************************/

*/

/*

/***********************************************************************/

Declaração da função de tratamento da interrupção

void Config_Interrupcao(void)

{

 

INTCONbits.INT0IF=0;

INTCONbits.INT0IE=1;

INTCONbits.GIEH=1;

}

/***********************************************************************/

Declaração da função de desvio para o tratamento da interrupção */

/***********************************************************************/

/*

#pragma code high_vector=0x08 void high_vector(void)

{

_asm

GOTO high_RSI

_endasm

}

#pragma code

/***********************************************************************/

*/

/*

/***********************************************************************/

Função de tratamento da interrupção

#pragma interrupt high_RSI void high_RSI(void)

{

INTCONbits.INT0IF=0;

while(PORTBbits.RB2==0)

{

 

PORTBbits.RB5=0;

PORTBbits.RB4=1;

}

while(PORTCbits.RC3==0);

}

#pragma code

/***********************************************************************/

/*

*/

/***********************************************************************/

Função Principal

void main()

{

OSCCON=0x72;

TRISB=0xCF;

PORTBbits.RB4=0;

PORTBbits.RB5=0;

Config_Interrupcao();

while(PORTCbits.RC3==0);

while(1)