• Nenhum resultado encontrado

PMR5229 Projeto de Sistemas Mecatrônicos com Microprocessadores. Jun Okamoto Jr.

N/A
N/A
Protected

Academic year: 2021

Share "PMR5229 Projeto de Sistemas Mecatrônicos com Microprocessadores. Jun Okamoto Jr."

Copied!
21
0
0

Texto

(1)

com Microprocessadores

Jun Okamoto Jr.

13 de setembro de 2010

(2)

Introdução

Esse documento contém uma descrição dos recursos do PIC16F873 que são uti-lizados nas atividas de laboratório do curso de PMR5229 e PMR2729. As infor-mação aqui contidas foram compiladas da documentação da família PIC16F87X da Microchip e da documentação do compilador C da HI-TECH. Esses dois do-cumentos devem servir como referência ao longo do curso.

1.1 Sistema de Desenvolvimento

Todo o desenvolvimento de software será feito utilizando-se o MPLAB e o com-pilador C da HI-TECH, ambos disponíveis sem custo no site da Microchip (http://www.microchip.com). Nesse curso é utilizado o ICD2 BR para gra-var o microcontrolador PIC16F873 que estará disponível para cada bancada no laboratório.

Os computadores do laboratório contém os MPLAB e o compilador C da HI-TECH instalados para uso nas aulas de laboratório. Os alunos poderão instalar os dois pacotes de software em seus próprios computadores para fazerem o desenvolvimento dos programas fora das aulas.

Todos os exemplos de programas aqui apresentados são baseados no HI-TECH C.

1.2 Estrutura do Programa

Sugere-se uma estrutura básica para o programa a ser desenvolvido durante o curso. O programa principal consiste de um loop de controle onde derá estar toda a lógica da aplicação. Nesse curso será utilizada somente uma rotina de interrupção baseada em timer.

#i n c l u d e <htc . h> // d e f i n i ç õ e s dos m i c r o c o n t t o l a d o r e s #i n c l u d e <s t d i o . h> // I /O b á s i c o ( p r i n t f , s p r i n t f , . . . )

(3)

#d e f i n e . . .

/∗ Configuração dos f u s í v e i s ver pic1687x . h

WDTDIS − d e s a b i l i t a watchdog timer

HS − c r i s t a l de a l t a v e l o c i d a d e (20MHz) LVPDIS − d e s a b i l i t a programação de baixa tensão BORDIS − d e s a b i l i t a brown out r e s e t ∗/ __CONFIG(WDTDIS & HS & LVPDIS & BORDIS ) ;

/∗ V a r i á v e i s Globais ∗/ /∗ s u b r o t i n a s ∗/ /∗ Rotina de tratamento de i n t e r r u p ç õ e s ∗/ void i n t e r r u p t i s r ( void ) { } /∗ Programa P r i n c i p a l ∗/ void main ( void ) {

// −> Declaração de v a r i á v e i s // −> I n i c i a l i z a ç ã o de v a r i á v e i s // −> Configurações do processador // −> i n i c i a l i z a ç ã o dos d i s p o s i t i v o s while ( 1 ) { // Loop p r i n c i p a l } // fim do loop p r i n c i p a l } // fim do programa p r i n c i p a l

Variáveis globais que são usadas na rotina de tratamento de interrupções deve ser declaradas como volatile.

(4)

Microcontrolador PIC 16F873

A família 16 dos microcontroladores PIC da Microchip é composta por uma série de microcontroladores de 8-bits de dados com instruções de 14-bits e recursos básicos de I/O, timers, conversores A/D e canais de cominicação serial.

O microntrolador PIC16F873 é disponível em encapsulamento DIP (dual in line package) de 28 pinos e possui as seguintes características:

• Frequência de operação até 20MHz • 4kbytes de memória flash para programas • 192 bytes de memória RAM de dados • 128 bytes de memória EEPROM

• 3 portas de I/O: 1 de 6 bits, e 2 de 8 bits • 3 Timers: 2 PWM

• 2 canais de comunicação serial:1 sincrono e 1 assincrono • 5 entradas de conversores A/D de 10-bits

• 13 interrupções

Assim como a maioria dos microcontroladores as configuraçãoes do PIC16F873 são feitas por meio de SFRs (Special Function Registers). Esses registrado-res estão pregistrado-resentes em endereços específicos no microcontrolador e cada um, ou conjunto de alguns, configuram o funcionamento dos diversos módulos do microcontrolador.

As informações apresentadas a seguir foram retiradas do data sheet PIC16F87X da Microchip e foram resumidas para o caso particular da aplicação a ser desen-volvida nesse curso. Assim, para um conhecimento mais aprofundado e utiliza-ção geral do hardware e software da família de microcontroladores PIC16F87X deve ser consultado o data sheet. Foi incluida nessa seção também uma des-crição das rotinas de bibliotecas em HI-TECH C que estão disponíveis para

(5)

utilização no curso. Essas bibliotecas foram retiradas da Internet e adaptadas para as caracterísiticas do hardware utilizado no curso. As rotinas presentes nas bibliotecas implementam em Lingugem C as diversas configurações necessárias para cada módulo do PIC16F873 e funções de acesso à cada um dos módulos.

2.1 Características especiais da CPU

Todos os dispositivos da família PIC16F87x possuem um conjunto de caracte-rísticas cujo propósito é maximizar a confiabilidade do sistema, minimizar custo através da eliminação de componentes externos, prover modos de operação de economia de energia e oferecer proteção de código. Essas características são as seguintes:

• Seleção de oscilador • RESET

– Reset ao ligar (POR – Power-on Reset)

– Temporização ao ligar (PWRT - Power-up Timer)

– Temporização de inicialização do oscilador (OST – Oscillator Start-up Timer)

– Brown-out Reset (BOR) • Interrupções

• Watchdog Timer (WDT) • SLEEP

• Proteção de código

• Localização de identificadores

• Programação serial em circuito (ICSP)

• Programação serial em circuito com baixa tensão • Depuração em circuito

Algumas dessa caracteristicas podem ser definidas através da programação de bits de configuração, enquanto que outras estão sempre presentes no micro-controlador e não permitem alteração de configuração. Além disso, somente algumas dessas características são relevantes para esse curso e somente algumas devem ser definidas. As demais possuem seus detalhes descritos no data sheet do PIC16F87X. Na documentação original do PIC16F87X essa seção vem no final do documento, mas no caso desse curso inicia-se esse capítulo por aqui pois correspondem a primeira inicialização presente no programa.

(6)

2.1.1 Configuração do oscilador

A família do PIC16F87x pode operar com quatro modos diferentes de oscilador. O usuário pode programar dois bits de configuração (FOSC1 e FOSC0) para selecionar um desses quatro modos:

• LP – cristal de baixa potência • XT – cristal/ ressonador

• HS – cristal de alta velocidade/ressonador • RC – resistor/capacitor

Nos modos LP, XT e HS um cristal ou ressonador cerâmico pode ser conectado entre os pinos OSC1/CLKIN e OSC2/CLKOUT para criar um oscilador. Ainda nesses modos, uma fonte externa de clock, com frequência FOSC, pode ser conectada ao pino OSC1/CLKIN. Nesse caso, o pino OSC2/CLKOUT funciona como saída de clock com uma frequência FOSC/4. O modo LP é usado para frequências até 200 kHz, o modo XT para frequências entre 200kHz e 4 MHz e o modo HS para frequências entre 4MHz e 20 MHz.

O modo RC pode ser utilizado quando uma precisão muito grande na fre-quencia de oscilação do clock nem uma frequência de oscilação muito alta não são necessárias. Nesse caso pode-se utilizar somente uma resistor e um capa-citor externos conectados ao pino OSC1/CLKIN. Nesse caso também o pino OSC2/CLKOT funciona como saída de clock com uma frequência FOSC/4.

No curso é utilizado um cristal de 20MHz para a criação de um oscilador. Assim o modo a ser configurado é o HS.

2.1.2 RESET

A família PIC16F87X diferencia entre vários tipos de Reset dos quais alguns podem ser definidos através de bits de configuração. O pino MCLR (Master Clear) é o sinal de hardware usado para causar um Reset no microcontrolador, tanto em operação normal quanto se o microcontrolador se encontrar no modo SLEEP. Uma das características especiais dessa família de microcontroladores é a existência de um sistema de Reset ao ligar (POR – Power-on Reset) que elimina componentes RC externos normalmente usados para criar um pulso de Limpa-ao-ligar no pino de Reset do microcontrolador. Esse sistema gera um pulso interno quando uma subida do VDD é detectada (na faixa de 1,2V a 1,7V). Para de utilizar essa característica basta ligar o pino MCLR diretamente (ou através de um resistor) ao VDD. Durante o processo de Reset o Timer de

inicialização do oscilador (OST) provê um atraso de 1024 ciclos do oscilador (da entrada OSC1) após o atraso do Timer de Power-up (PWRT) terminar (se PWRT estiver habilitado). Esse procedimento garante que o oscilador a cristal ou ressonador tenha iniciado e estabilizado. O time-out do OST somente ocorre para os modos LP, XT e HS e somente no POR ou acordando do modo SLEEP. Os outros tipos de reset podem ser definidos pela programação de bits de configuração:

(7)

• Temporização ao ligar (PWRT – Power-up Timer) – O Timer de Power-up fornece 72 ms de time out ao ligar somente do sistema de Reset ao ligar (POR). O Timer de Power-up opera a partir de um oscilador RC interno. O microcontrolador é mantido em Reset enquanto o PWRT estiver ativo. O atraso introduzido pelo PWRT permite que o VDDsuba para um nível

aceitável. O bit 3 de configuração permite habilitar/desabilitar o PWRT. • Brown-out Reset (BOR) – Se a tensão VDD cair abaixo de VBOR (cerca

de 4V) por um tempo maior do que TBOR (cerca de 100�s), ocorre um

Reset do microcontrolador. Essa situação é chamada de Brown-out. Se VDD cair abaixo de VBOR por um tempo menor do que TBOR, o RESET

pode não ocorrer. Uma vez que tenha ocorrido o Reset por Brown-out, o dispositivo permanecerá em Reset até que a tensão VDD suba para um

valor superior a VBOR. O Timer de Power-up (PWRT) manterá o

dispo-sitivoo em RESET por TPWRT (cerca de 72ms). O Timer de Power-up sempre estará habilitado se o circuito de Brown-out Reset estiver habili-tado, independentemente do estado do bit de configuração de PWRT. O circuito de Brown-out pode ser habilitado ou desabilitado pelo bit 6 de configuração.

2.1.3 Interrupções

O PIC16F873 possui 13 interrupções1 agrupadas num único pedido geral de

interrrupção para o microcontrolador. Cada interrupção pode ser mascarada individualmente, através de um bit específico. Além disso, todas podem ser habilitadas e desabilitadas através do bit GIE (INTCON<7>). Se GIE = 1 todas a interrupções que não estiverem mascaradas poderão gerar um pedido de interrupção para o microcontrolador. Caso contrário, se GIE = 0, todas as interrupções estarão desabilitadas e não serão tratadas pelo microcontrolador.

Na ocorrência de um pedido de interrupção atendido o GIE é automati-camente limpo (GIE = 0), desabilitando assim qualquer pedido de interrupção subsequente. No retorno da rotina de interrupção, o GIE é automaticamente re-habilitado (GIE = 1) permitindo que novas interrupções não mascaradas sejam tratadas.

É importante observar que cada interrupção que ocorre "seta" um flag especí-fico e que esse flag é "setado" independente das interrupções estarem habilitadas ou não. Por exemplo, no caso da interrupção do Timer 0, seu estouro causará o flag T0IF ir para 1, mesmo que GIE = 0. Por outro lado, mesmo que GIE = 1, no caso da interrupção do Timer 0, essa só será atendida se T0IE = 1, isto é, se a interrupção estiver desmascarada.

Assim, deverá existir uma única rotina geral para tratamento de interrupções que deverá testar se cada interrupção a ser tratada possui seu flag de pedido igual a 1 e se está desmascarada. Essa rotina não aceita parâmetros e não retorna nenhum valor. Por exemplo, no caso de interrupção do Timer 0, deve-se testar se T0IF = 1 e se T0IE = 1 ao mesmo tempo. Somente nessa condição é

(8)

que essa interrupção deverá ser tratada. O mesmo dever ser feito para as outras interrupções. O trecho de programa abaixo ilustra esse exemplo.

void i n t e r r u p t i s r ( void ) { // única r o t i n a g e r a l de

// tratamento de i n t e r r u p ç õ e s , // o nome pode s e r qualquer i f ( T0IE && T0IF ) { // se a in te ru p ç ão do Timer 0 ocorreu

// tratamento da i n t e r r u p ç ã o do Timer 0 }

i f (TXIE && TXIF) { // se a i n t e r r u p ç ã o de transmissão // s e r i a l ocorreu // tratamento da i n t e r r u p ç ã o de transmissão s e r i a l } . . . }

2.1.4 Timer de Watchdog

O Timer de Watchdog é um sistema usado para se colocar um dispositivo num estado conhecido caso alguma coisa dê errado durante uma operação normal. O que pode dar errado pode estar relacionado com hardware ou software. No caso da família PIC16F87X, o Timer de Watchdog gera um sinal de RESET para o microcotrolador ou acorda o microcontrolador se estiver em modo SLEEP.

No caso, o Timer de Watchdog (WDT) é um oscilador RC interno do chip que funciona independente do microcontrolador e não requer componentes ex-ternos. Além disso, o seu oscilador RC é separado do oscilador RC do pino OSC1/CLKIN, isso significa que o WDT funcionará mesmo que o clock nos pinos OSC1/CLKIN e OSC2/CLKOUT pare. O bit TO no registrador de STA-TUS será limpo no time-out do WDT. O WDT poderá ser permanentemente desabilitado limpando-se o bit de configuração WDTE.

2.1.5 Programação serial no circuito

A família de microcontroladores PIC16F87X podem ser programados enquanto o microcontrolador está conectado ao circuito (ICSP – In-Circuit Serial Pro-gramming). Isso é feito através de duas linhas, uma para clock e outra para dados e mais três linhas para VDD, terra e tensão de programação. A ICSP dispensa a retirada do chip do circuito para que seja apagado e programado, essa característica é muito conveniente pois pode-se colocar o microcontrolador no circuito e jamais removê-lo mesmo durante o ciclo de desenvolvimento de software.

O gravador IDC2 BR usado no curso é capaz de usar esse método para programar diversas famílias de microntroladores PIC incluindo a PIC16F87X. A Figura 2.1 mostra a conexão entre o ICD2 BR e o microcontrolador 16F873.

(9)

Figura 2.1: Conector para ICSP entre ICD2 BR e microcontrolador PIC16F873

2.1.6 Programação ICSP com baixa tensão

O bit LVP da palavra de configuração habilita a programação ICSP com baixa tensão. Esse modo permite que o microcontrolador seja programado através do ICSP com uma fonte de tensão VDD. Isso significa que a tensão de programação VPP não precisa ser elevada até VIHH (que é cerca de 14V) mas pode ser deixada dentro da faixa de tensão normal de operação VDD. Nesse modo o pino RB3/PGM é dedicado para a função de programação e não pode mais ser usado como pino de I/O de uso geral. Durante a programação VDD é aplicado ao pino MCLR. Para entrar no modo de programação, VDD é aplicado ao pino RB3/PGM, desde que o bit LVP esteja "setado". É importante notar que o bit LVP vem de fábrica como default "1", assim, é necessário limpar LVP na etapa de configuração de bits caso se deseje utilizar o pino RB3/PGM como pino de I/O geral.

2.1.7 Programação dos bits de configuração

Os bits de configuração podem ser programados (com valor "0") ou deixados sem programar (com valor "1") que é o valor default de fábrica. Quando o mi-crocontrolador está apagado o valor da palavra de configuração é 3FFFh. Esses bits estão organizados numa palavra de 14-bits e estão mapeados no endereço 2007h. Esse endereço está além do espaço de memória de programa do usuário e pode ser acessado somente durante a programação do microcontrolador.

No HI-TECH C a função macro __CONFIG é utilizada para programar esses bits. São disponíveis também uma série de definições que são utilizadas junto com a macro __CONFIG. Essas definições devem ser compostas num único valor através da função AND bit a bit (&). As definições disponíveis são:

• Configuração do oscilador: LP, XT, HS e RC

• Watchdog: WDTEN – habilita watchdog; WDTDIS – desabilita watchdog • Power up timers: PWRTEN – habilita power up timer; PWRTDIS –

desabilita power up timer

• Brown ou reset: BOREN – habilita brown out reset; BORDIS – desabilita brown out reset

• Programação ICSP com baixa tensão: LVPEN – habilita programação ICSP com baixa tensão; LVPDIS – desabilita programação ICSP com baixa tensão

• Proteção de código: PROTECT – protege código do programa; UNPRO-TECT – não protege código do programa

(10)

• Proteção de memória flash: WRTEN – protege escrita na memória flash; WRTDIS – não protege escrita na memória flash

• Debuger: DEBUGEN – habilita debugger; DEBUGDIS – desabilita de-bugger

Para utilizar a função macro e as definições deve ser incluido o header htc.h que carregara as definições para o microcontrolador correto. As definições apre-sentadas acima vão um pouco além das utilizadas no curso. Mais informações sobre essas definições e configurações deve ser consultado o data sheet da família PIC16F87X.

As configurações utilizadas no curso são mostradas no trecho de programa abaixo:

#i n c l u d e <htc . h> // g e r a l para todos os mi cro co ntrol ado re s , // as d e f i n i ç õ e s do m i c r o c o n t r o l a d o r c o r r e t o // s e r ã o i n c l u í d a s automaticamente

. . .

/∗ Programa b i t s de c o n f i g u r a ç ã o :

HS − o s c i l a d o r de a l t a f r e q u e n c i a WDTDIS − d e s a b i l i t a watchdog timer

LVPDIS − não u t i l i z a programação ICSP com baixa tensão , i s s o l i b e r a o uso do pino RB3/PRGM para I /O BORDIS − d e s a b i l i t a o brown out r e s e t

∗/

__CONFIG(HS & WDTDIS & LVPDIS & BORDIS ) ;

2.2 Portas de entrada e saída

As portas de entrada e saída utilizam pinos do microcontrolador que são multi-funcionais. Qualquer função programada num desses pinos desabilita a função de entrada e saída. Assim, se nenhuma função for programada num desses pinos sua função padrão será de entrada ou saída. Se um determinado pino será usado para entrada ou para saída, isso deve ser configurado num SFR: TRISA, TRISB e TRISC para as portas A, B e C, respectivamente, para o PIC16F873. A Porta A possui 6-bits enquanto que as portas B e C possuem 8-bits cada. A programação de um bit igual a 0 num SFR TRISx configura o bit da porta para saída, enquanro que a programação de um bit igual a 1 configura a porta para entrada.

Por exemplo, a linha de programa abaixo configura os bits 2 e 3 da Porta C para saída:

TRISC = 0 xf3 ; // b i t s 2 e 3 da Porta C são s a í d a

Para se alterar o valor de um bit de uma porta, ou seja, fazer com que o valor de um pino mude pode-se atribuir o valor ao pino diretamente como se fosse a atribuição de valor à uma variável:

(11)

RC2 = 1 ; // b i t 2 da Porta C = n i v e l l ó g i c o HIGH

Da mesma maneira pode-se ler o valor de um bit de uma porta que corres-ponde ao valor lógico de um pino:

b i t var ; // v a r i á v e l do t i p o b i t . . .

var = RC4; // o v a l o r do b i t 4 , Porta C é a t r i b u i d o // à v a r i á v e l ’ var ’

2.3 Timer 0

O módulo do Timer 0 possui as seguintes características: • contador/timer de 8-bits (sempre incrementando) • pode ser escrito e lido

• prescaler de 8-bits programável por software • seleção de clock interno ou externo

• interrupção no transbordo de FFh para 00h • seleção de borda para o clock externo

O Timer 0 possui dois modos de operação: contador e timer. No modo contador, o Timer 0 conta pulsos que entram no pino RA4/T0CKI. Já no modo timer, é utilizado o clock interno do microcontrolador (CLKOUT) que corresponde a frequência do oscilador dividido por 4 (FOSC/4). O modo timer será utilizado nesse curso e é descrito com mais detalhes a seguir.

O modo timer é selecionado fazendo-se o bit T0CS igual a 0 (OPTION_REG<5>). Nesse modo o CLKOUT passa opcionalmente por um pre-scaler de 8-bits que pode dividir a frequência desse clock por valores entre 2 e 256 em incrementos de potências de 2 (2, 4, 8, 16, 32, 64, 128, 256). O valor de divisão da frequência é selecionado através de 3 bits, PS2, PS1 e PS0 (OPTION_REG<3:0>).

Esse prescaler é compartilhado com o Watchdog Timer e deve-se selecionar se o pre-scaler será usado com o Timer 0 ou com o Watchdog. Programando-se 1 no bit PSA (OPTION_REG<3>) configura o prescaler para uso com o Watchdog e programando-se 0 no mesmo bit configura seu uso para o Timer 0. As configurações que podem ser definidas pelo OPTION_REG podem ser vistas na página 48 do data sheet do PIC16F87x.

O Timer 0 incrementa a cada pulso de clock, seja interno ou recebido no pino T0CKI. Sempre que ocorre a mudança de valor da contagem de FFh para 00H (transbordo ou estouro) é gerada uma interrupção sinalizada pelo bit T0IF (INTCOM<2>) que vai para 1. Essa interrupção pode ser mascarada se o bit T0IE (INTCON<5>) for limpo (T0IE = 0). Se for esse o caso o pedido de interrupção não será gerado, mas mesmo assim o bit T0IF irá para 1. No caso

(12)

de ocorrer a interrupção, o bit T0IF deve ser limpo por software pela rotina de tratamento de interrupção do Timer 0 antes de se re-habilitar essa interrupção.

O trecho de programa abaixo mostra como configurar o Timer 0: #d e f i n e TMR0_PRESCALER 7 // d i v i d e por 256

. . .

void main ( void ) { . . .

OPTION &= 0 b11000000 ; // T0CS=0, T0SE=0, PSA=0, // PS2=0, PS1=0, PS0=0 OPTION |= TMR0_PRESCALER; // c o n f i g u r a o p r e s c a l e r T0IE = 1 ; // h a b i l i t a a i n t e r r u p ç ã o do // Timer 0 . . . }

Deve-se lembrar que a operação AND bit a bit (&) programa zeros e a operação OR bit a bit (|) programa uns. No HI-TECH C o registrador OP-TION_REG é definido simplesmente como OPTION.

A rotina de tratamento de interrupção deve verificar se os bits T0IE e T0IF são ambos iguais a 1 para, somente nesse caso, executar o tratamento necessário para a interrupção do Timer 0. Nessa rotina de tratamento do Timer 0 um novo valor de contagem incial deve ser carregado no Timer 0 para se ajustar o tempo que deverá decorrer até a próxima interrupção.

Num exemplo prático, deseja-se gerar uma interrupção periódica a cada 5 ms aproximadamente usando-se o Timer 0, considerando-se que a frequência do oscilador do microcontrolador é 20 MHz.

Assim, a frequência de clock interno CLKOUT é 5 MHz (= 20 MHz / 4). Configurando-se o prescaler para divisão por 256, tem-se que:

• Período do clock interno = 200 ns

• Saída do prescaler = 51,20 �s (= 200 ns × 256)

• Valor a ser programado como contagem inicial no Timer 0 = 157 (= 255 − 98) pois 51,20 �s × 98 = 5,0176 ms

Na prática deve-se descontar 5 do ...

O trecho de programa abaixo corresponde a rotina de tratamento de inter-rupção para esse exemplo:

#d e f i n e POLLING_PERIOD 98 // 5 ,0716 ms

#d e f i n e TMR_SETTING (0 x f f − (POLLING_PERIOD − 5)) // v al o r // da contagem i n c i a l do Timer 0 . . .

void i n t e r r u p t i s r ( void ) { // r o t i n a g e r a l de tratamento // de i n t e r r u p ç õ e s

i f ( T0IE && T0IF ) { // se f o r i n t e r r u p c ã o do Timer 0 TMR0 = TMR0_SETTING; // r e c a r r e g a a contagem i n c i a l

(13)

T0IF = 0 ; // limpa o f l a g de i n t e r r u p ç ã o // executa aqui o que f o r n e c e s s á r i o

} }

2.4 Cominicação serial

O PIC16F873 possui dois módulos de comunicação serial: o Master Synchronous Serial Port (MSSP), que opera em dois modos (SPI e I2C), e o Universal

Synch-ronous Asynchonous Receiver Transmitter (USART), também conhecido como Interface de Comunicação Serial. O primeiro módulo é utilizado para comuni-cação serial entre o microcontrolador e dispositivos internos de um computador enquanto que o segundo módulo pode também ser utilizado para comunicação entre dispositivos externos e o microcontrolador. Nesse curso será utilizado somente o segundo módulo que será visto em detalhes a seguir.

A Interface de Comunicação Serial pode operar de maneira sincrona ou assin-crona. No modo sincrono de operação, existe um sincronismo entre o transmissor e o receptor de dados através de um sinal de clock que controla um fluxo de bits em série numa única linha (Figuras 10-9 a 10-11 do data sheet do PIC16F873). Desse modo o receptor armazena os bits comandado pelo clock do transmissor. Já no modo assincrono existe um conjunto de parametros que define como será feita a transferência de dados entre um dispositivo e outro e ambos os dispo-sitivos são primeiramente configurados com o mesmo cojunto de parâmetros. A partir daí os dados podem ser transferidos em série (por uma única linha) iniciando-se com um start bit, depois 8 ou 9 bits de dados e terminando com um stop bit (Figura 10-2, 10-3 e 10-5 do data sheet do PIC16F873).

Nesse curso será utilizado o modo de comunicação assincrona da interface. Nesse caso, essa interface é capaz de operação de transmissão e recepção si-multâneos (full duplex) para tanto utiliza dois pinos de entrada e saída confi-gurados para transmissão de dados (RC6/TX/CK) e para recepção de dados (RC7/RX/DT). Isso significa que se a Interface de Comunicação Serial for uti-lizada, os bits 6 e 7 da Porta C serão ocupados com essa função e não poderão ser utilizados para entrada e saída através da configuração do SFR TRISC.

Na família do PIC16F873, o conjunto de parâmetros a ser configurado para definir o modo de operação da Interface de Comunicação Serial é determinado pela programação de uma série de bits em 3 SFRs:

• TXSTA – Registrador de controle e status de transmissão • RCSTA – Registrador de controle e status de recepção • SPBRG – Registrador do gerador de taxa de Baud

Os bits que devem ser programados no TXSTA são os seguintes para comuni-cação assincrona:

(14)

• TX9 – habilita transmissão em 9-bits: 1 = seleciona transmissão em 9-bits; 0 = seleciona transmissão em 8-bits

• TXEN – habilita transmissão: 1 = transmissão habilitada; 0 = transmis-são desabilitada

• SYNC – seleciona o modo de operação da USART: 1 = modo sincrono; 0 = modo assincrono

• BRGH – seleciona operação de taxa de Baud no modo assincrono (sem efeito no modo sincrono): 1 = alta velocidade; 0 = baixa velocidade. A princípio a escolha entre alta velocidade e baixa velocidade dependeria da frequencia do oscilador. Na prática pode-se escolher BRGH = 1 mesmo para baixas frequencias do oscilador, deve-se priorizar a minimização do erro na taxa de Baud.

No RXSTA devem ser programados os seguintes bits para comunicação assin-crona:

• SPEN – habilita a porta serial: 1 = porta serial habilitada (configura os pinos RC7/RX/DT e RC6/TX/CK para uso na porta serial e não como entrada e saída); 0 = desabilita porta serial

• RX9 – habilita recepção de 9-bits: 1 = seleciona recepção de 9-bits; 0 = seleciona recepção de 8-bits

• CREN – habilita recepção contínua no modo assincrono: 1 = habilita recepção contínua; 0 = desabilita recepção contínua

O registrador SPBRG controla o período de um timer de 8-bits dedicado para a Interface de Comunicação Serial. No modo assincrono, o valor prgramado no bit BRGH define a fórmula que é utilizada para se obter a taxa de Baud a partir do valor programado no SPBRG. Assim, para BRGH = 0 tem-se

[SPBRG] = FOSC

64 × BaudRate− 1

onde [SPBRG] é o valor a ser programado no registrador SPBRG, FOSC é a

frequência do oscilador do microcontrolador. No caso de BRGH = 1, tem-se

[SPBRG] = FOSC

16 × BaudRate− 1

No curso é utilizada uma taxa de Baud de 19.200 bps. Com uma frequencia do oscilador de 20MHz, escolhe-se BRGH = 1, o que resulta no valor a ser programado no SPBRG de 64. Como esse valor é inteiro, a taxa de Baud resultante pode não ser exata. Assim, nesse caso, a programação desse valor gera uma taxa de 19.231 bps resultando num erro de 0,16%. No curso é utilizado

(15)

comprimento da palavra de dados de 8-bits tanto para transmissão como para recepção, assim, TX9 = 0 e RX9 =0.

A configura ção e utilização da transmissão assincrona deve seguir os seguin-tes passos:

1. Inicializar o registrador SPBRG para a taxa de Baud apropriada. 2. Habilitar a porta serial assincrona limpando o bit SYNC e "setando" o bit

SPEN.

3. Se são desejadas interrupções, "setar" o bit TXIE. 4. Se for desejada transmissão de 9-bits, "setar" o bit TX9.

5. Habilitar a transmissão "setando" o bit TXEN, que também "setará"o bit TXIF.

6. Se a transmissão de 9-bits estiver selecionada, esse bit deve ser carregado no bit TX9D.

7. Carregar o dados no registrador TXREG (inicia a transmissão).

8. Se utilizando interrupção, assegurar que GIE e PEEIE do registrador INT-CON estão "setados".

A configuração e utilização da recepção assincrona deve seguir os seguintes pas-sos:

1. Inicializar o registrador SPBRG para a taxa de Baud apropriada. 2. Habilitar a porta serial assincrona limpando o bit SYNC e "setando" o bit

SPEN.

3. Se são desejadas interrupções, "setar" o bit RCIE. 4. Se for desejada transmissão de 9-bits, "setar" o bit TX9. 5. Habilitar a recepção "setando" o bit CREN.

6. O bit de flag RCIF será "setado" quando a recepção for completada e um pedido de interrupção será gerado se o bit RCIE estiver "setado". 7. Ler o registrador RCSTA para pegar o nono bit (se estiver habilitado) e

determinar se algum erro ocorreu durante a recepção.

8. Ler os 8 bits de dados recebidos através da leitura do registrador RCREG. 9. Se algum erro ocorreu, limpar o erro limpando o bit CREN.

10. Se utilizando interrupção, assegurar que GIE e PEEIE do registrador INT-CON estão "setados".

(16)

Para configuração e utilização da Interface de Comunicação Serial no HI-TECH C foi criada uma biblioteca com as seguintes funções:

• void serial_setup(void) – Essa função configura todos os parâmetros necessários para a operação do canal serial a 19.200 bps, com palavra de dados de 8-bits, considerando a frequencia do oscilador do microcontrola-dor como sendo 20 MHz. Deve ser chamada uma única vez na seção de inicialização dos dispositivos.

• unsigned char getch(void) – Recebe um caracter ASCII pelo canal se-rial. Essa função não retorna enquanto não for recebido um caracter. • unsigned char chkchr(void) – Essa função verifica se existe um

carac-ter no buffer de recepção. Se existir, retorna o caraccarac-ter, senão retorna o valor 255.

• void putch(unsigned char c) – Envia um caracter ASCII pelo canal serial.

• void putst(register const char * str) – Envia um string pelo ca-nal serial

Para a utilização dessas funções deve ser incluido o header serial.h e antes dele o always.h que contém definições utilizadas pelo serial.h.

2.5 Conversor A/D

O módulo de conversão analógica para digital (A/D) do PIC16F873 possui 5 entradas. A conversão é feita pelo método de aproximações sucessivas e gera um resultado de 10-bits. As tensões de referência alta e baixa podem ser con-figuradas por software para alguma combinação de VDD (=5V), VSS (=0V), RA2 ou RA3.

Esse módulo possui 4 registradores: • ADCON0 – Registrador de controle 0 • ADCON1 – Registrador de controle 1

• ADRESH – Registrador da parte mais significativa do resultado • ADRESL – Registrador da parte menos significativa do resultado No registrador ADCON1 devem ser configurados os seguintes bits:

• ADFM – indica se o resultado da conversão é justificado à direita ou à esquerda: 1 = justificado à direita – os 6 bits mais significativos de ADRESH são lidos como zero; 0 = justificado à esquerda – os 6 bits menos significativos de ADRESL são lidos como zero

(17)

• PCFG3:PCFG0 – esse conjunto de 4 bits configura quais bits são canais de A/D, quais são digitais e quais são usados como tensão de referência. A Tabela 2.1 mostra todas as configurações possíveis para o PIC16F873. A tabela original do data sheet inclui informações sobre outros modelos da mesma família.

Tabela 2.1: Bits de controle de configuração dos canais A/D (adaptado da página 112 do data sheet do PIC16F87x para o caso do PIC16F873

PCFG3:

PCFG0 AN4RA5 AN3RA3 AN2RA2 AN1RA1 AN0RA0 VREF+ VREF- CHAN/Refs2

0000 A A A A A VDD VSS 5/0 0001 A VREF+ A A A RA3 VSS 4/1 0010 A A A A A VDD VSS 5/0 0011 A VREF+ A A A RA3 VSS 4/1 0100 D A D A A VDD VSS 3/0 0101 D VREF+ D A A RA3 VSS 2/1 011x D D D D D VDD VSS 0/0

1000 A VREF+ VREF- A A RA3 RA2 3/2

1001 A A A A A VDD VSS 5/0

1010 A VREF+ A A A RA3 VSS 4/1

1011 A VREF+ VREF- A A RA3 RA2 3/2

1100 A VREF+ VREF- A A RA3 RA2 3/2

1101 D VREF+ VREF- A A RA3 RA2 2/2

1110 D D D D A VDD VSS 1/0

1111 D VREF+ VREF- D A RA3 RA2 1/2

O registrador ADCON0 controla a operação do módulo A/D. Para cada canal A/D definido pelos bits CHS2:CHS0 pode ser configurada a frequência de conversão para FOSC/2, FOSC/8, FOSC/32 ou FRC (frequência determinada pelo oscilador RC interno do módulo A/D) através dos bits ADCS1:ADCS0. Os seguintes bits são usados para controle da conversão:

• ADON – bit que liga o canal de conversão A/D: 1 = módulo de conversão A/D está em operação; 0 = o módulo de conversão A/D está desligado e não consome corrente de operação.

• GO/DONE – bit de status de conversão A/D: 1 = conversão A/D em progresso (a escrita deste bit inicia o processo de converão); 0 = conversão A/D parada (este bit é limpo automaticamente ao terminar o processo de conversão).

Os seguintes passos devem ser seguidos para se fazer uma conversão A/D: 1. Configurar o módulo A/D:

(18)

• Selecionar o canal de entrada A/D (ADCON0)

• Selecionar a frequência do clock de conversão A/D (ADCON0) 2. Configurar a interrupção A/D (caso desejado):

• Limpar o bit ADIF • "Setar" o bit ADIE • "Setar" o bit PEIE • "Setar" o bit GIE

3. Esperar o tempo de aquisição necessário. 4. Iniciar o processo de conversão:

• Fazer o bit GO/DONE = 1 (ADCON0)

5. Esperar o processo de conversão ser completado por um de dois métodos: • Esperar o bit GO/DONE ser limpo (sem interrupções habilitadas);

OU

• Esperar pela interrupção de A/D

6. Ler o resultado da conversão A/D no par de registradores (ADRESH:ADRESL), limpar o bit ADIF caso necessário.

7. Para a próxima conversão, prosseguir com o passo 1 ou 2 conforme ne-cessário. O tempo de conversão A/D por bit é definida como TAD. Um

tempo mínimo de 2TAD é necessário antes que uma nova conversão seja

iniciada.

Para configuração e utilização do módulo de conversão analógica para digital (A/D) no HI-TECH C foi criada uma biblioteca com as seguintes funções:

• void adc_setup(unsigned char ADC_Channel) – Essa função configura os canais A/D de 0, 1 e 3, onde o número do canal é o parâmetro de entrada ADC_Channel. Essa função deve ser modificada caso se deseje alterar a configuração dos canais. Ela está configurada previamente para canais analógicos 0, 1 e 3 e digitais 2 e 5, com tensão de referência dada pelo VDD. A alteração deve ser feita no arquivo adc.c. Deve ser chamada uma única vez para cada canal na seção de inicialização dos dispositivos. • unsigned int read_adc(unsigned char ADC_Channel) – Recebe o va-lor do canal A/D passado como parâmetro com 10-bits alinhados à es-querda. Essa função aguarda o término da conversão antes de retornar. Essa função configura a frequencia de conversão para FOSC/32 para a frequência do oscilador de 20MHz.

(19)

Figura 2.2: Forma de onda de um sinal PWM com vários valores de Duty Cycle.

2.6 PWM

PWM significa Pulse Width Modulation ou modulação por largura de pulso. Um sinal de PWM possui um periodo constante e a cada ciclo o tempo que o sinal permanece no nível lógico HIGH em relação ao período total pode ser descrito por uma porcentagem. Essa porcentagem é chamada de Duty Cycle. Por exemplo, um sinal de PWM com Duty Cycle de 50% tem a forma de uma onda quadrada, na metade do período o sinal está em nível lógico HIGH e na outra metade do período o sinal está em nível lógico LOW. A Figura 2.2 mostra algumas situações para os valores do Duty Cicle.

Um sinal de PWM pode ser utilizado para variar a energia entregue a um determinado dispositivo. Um valor de 0% de Duty Cycle significa que nenhuma energia é entregue ao dispositivo. Por outro lado, 50% de Duty Cycle significa que 50% de energia é entregue ao dispositivo. Uma das aplicações de um sinal de PWM é o controle a corrente que passa pelo enrrolamento de um motor CC e consequentemente variação de sua velocidade. A Figura 2.3 mostra um arranjo para controle de velocidade em malha fechada de um motor CC com um microcontrolador gerando um sinal de PWM e lendo sinais digitais de um encoder. A leitura de encoder será explicada posteriormente no Capítulo 3 na experiência correspondente.

A geração de sinais de PWM é feita através dos módulos CCP no PIC16F873. Existem 2 módulos CCP (Captura/Comparação/PWM) na família PIC16F87X. Cada módulo contém um registrador de 16-bits que pode operar como:

• Registrador de captura de 16-bits (CCPR1H e CCPR1L) • Registrador de comparação de 16-bits (CCPR1H e CCPR1L)

• Registrador Master/Slave de Duty Cicle do PWM (CCPR1L: master de 8-bits e CCPR1H: slave de 8-bits)

(20)

Figura 2.3: Controle de velocidade de um motor CC com um microcontrolador gerando sinal de PWM.

Os 2 módulos CCP1 e CCP2 são idênticos na operação, com a excessão do evento de disparo especial. Nos modos de captura e comparação é necessário o uso do Timer 1, enquanto que para o modo de PWM é necessário o uso do Timer 2. Será abordado no curso somente o modo de PWM, os modos de captura e comparação não serão vistos. Como a configuração e uso dos dois módulos é semenlhante, então será visto aqui somente o módulo CCP1.

No modo de PWM o pino CCP1 produz uma saída de sinal PWM com a resolução de 10-bits. Como o pino CCP1 está multiplexado com o pino do bit 2 da Porta C, o bit TRISC<2> deve ser limpo para tornar o pino CCP1 uma saída.

O período do PWM pode ser definido através da escrita de um valor no registrador PR2 e pode ser calculado aplicando-se a seguinte fórmula:

Período PWM = [(PR2) + 1] × 4 × TOSC× (prescale do TMR2)

Quando o valor da contagem do Timer 2 (TMR2) for igual ao valor do PR2, ocorres os três eventos eguintes no próximo ciclo de incremento:

• O valor do TMR2 é limpo

• O valor do pino CCP1 é colocado em nível lógico HIGH (a menos que o Duty Cycle do PWM esteja programado para 0%, neste caso o nível lógico permanece em LOW)

• O valor do Duty Cycle do PWM que estiver no registrado CCPR1L é armazenado no CCPR1H.

O Duty Cycle do PWM é especificado escrevendo-se um valor de 10-bits, sendo os 8-bits mais significativos escritos no registrador CCPR1L e os 2-bits me-nos significativos escritos me-nos bits 5 e 4 do registrador CCP1CON. A seguinte equação é utilizada para calcular o Duty Cycle do PWM no tempo:

Duty Cycle do PWM = (CCPR1L:CCP1CON<5:4>×TOSC×(prescale do TMR2)

O registrador CCPR1L e os bits 5 e 4 de CCP1CON pode ser escrito a qualquer momento, mas o valor do Duty Cycle somente será alterado quando

(21)

Figura 2.4: Sinal de saída de PWM no pino CCP1

o valor de CCPR1L for armazenado em CCPR1H o que ocorre somente após os valores de TMR2 e PR2 serem verificados como sendo iguais (i.e., somente quando o período do PWM estiver completo). No modo PWM o registrador CCPR1H somente pode ser lido. O registrador CCPR1H e os bits 5 e 4 do registrador CCP1CON são usados como buffer slave do Duty Cycle. Isso é essencial para a operação do PWM sem pulsos espurios.

A Figura 2.4 mostra a saída do pino CCP1 e a sua relação com os valores de TMR2, PR2 e Duty Cycle.

Os seguites passos devem ser feitos para configurar o módulo CCP para operação em PWM:

1. Definir o período do PWM escrevendo no registrador PR2.

2. Definir o Duty Cycle do PWM escrevendo no registrador CCPR1L e nos bits 5 e 4 do registrador CCP1CON.

3. Definir o pino CCP1 com saída limpando o bit TRISC<2>.

4. Definir o valor de prescale do TMR2 escrevendo no registrador T2CON 5. Configurar o módulo CCP1 para operação em PWM

Referências

Documentos relacionados

Local de realização da avaliação: Centro de Aperfeiçoamento dos Profissionais da Educação - EAPE , endereço : SGAS 907 - Brasília/DF. Estamos à disposição

aquilo e comentou na semana passada na palavra livre que a administração começou perdendo tirando a EPAGRI daqui, e acha que perdeu bastante, quando a gente coloca

Se você tiver, no mínimo, três anos de vinculação ao Plano, terá direito ao Benefício Proporcional Diferido (BPD), que consiste em manter o saldo de Conta de

Eu considero a duplicação como o coração de um sistema para multinível porque se ela não acontecer, você não se beneficiará daquilo que mais nos seduz: a possibilidade de

Vários trabalhos têm demonstrado que a mortali- dade por síndrome ascítica é maior nos machos do que nas fêmeas, acreditando-se que este fato esteja relacionado com a maior

Mestrado em: Nutrição Humana ou Nutrição Clínica ou Saúde Coletiva ou Ciências da Saúde ou Ciências ou Saúde ou Alimentos e Nutrição e Desenvolvimento na

Nesta tela, deve ser selecionada a flag Recepção, no quadro Operação, selecionar no layout, a opção Pedido de Vendas Jotec e clicar no botão Procurar para informar o arquivo que

Segurando o medalhão próximo à face dele, ela, alcançado a mão dela dentro do capuz preto sentir para sentir a pulsação no pescoço dele.. A fechando olhos em alívio, ela