pmr5229 – projeto de sistemas mecatrônicos com...

21
PMR5229 – Projeto de Sistemas Mecatrônicos com Microprocessadores Jun Okamoto Jr. 13 de setembro de 2010

Upload: phamdat

Post on 20-Sep-2018

221 views

Category:

Documents


0 download

TRANSCRIPT

PMR5229 – Projeto de Sistemas Mecatrônicoscom Microprocessadores

Jun Okamoto Jr.

13 de setembro de 2010

Capítulo 1

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 PIC16F87Xda 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 DesenvolvimentoTodo 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 nolaboratório.

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

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

1.2 Estrutura do ProgramaSugere-se uma estrutura básica para o programa a ser desenvolvido durante ocurso. O programa principal consiste de um loop de controle onde derá estartoda a lógica da aplicação. Nesse curso será utilizada somente uma rotina deinterrupção baseada em timer.

#inc lude <htc . h> // d e f i n i ç õ e s dos mic rocont to l adore s#inc lude <s td i o . h> // I /O bás i co ( p r i n t f , s p r i n t f , . . . )

1

CAPÍTULO 1. INTRODUÇÃO 2

#de f i n e . . .

/∗ Conf iguração dos f u s í v e i sver pic1687x . hWDTDIS − d e s a b i l i t a watchdog t imerHS − c r i s t a l de a l t a ve l o c idade (20MHz)LVPDIS − d e s a b i l i t a programação de baixa tensãoBORDIS − d e s a b i l i t a brown out r e s e t ∗/

__CONFIG(WDTDIS & HS & LVPDIS & BORDIS) ;

/∗ Var iáve i s Globais ∗/

/∗ subro t ina s ∗/

/∗ Rotina de tratamento de i n t e r rupçõ e s ∗/void i n t e r r up t i s r ( void ) {

}

/∗ Programa Pr 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// −> Conf igurações do proce s sador// −> i n i c i a l i z a ç ã o dos d i s p o s i t i v o s

whi l e (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çõesdeve ser declaradas como volatile.

Capítulo 2

Microcontrolador PIC 16F873

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

O microntrolador PIC16F873 é disponível em encapsulamento DIP (dual inline 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 PIC16F873são feitas por meio de SFRs (Special Function Registers). Esses registrado-res estão presentes em endereços específicos no microcontrolador e cada um,ou conjunto de alguns, configuram o funcionamento dos diversos módulos domicrocontrolador.

As informações apresentadas a seguir foram retiradas do data sheet PIC16F87Xda 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 PIC16F87Xdeve 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

3

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 4

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

2.1 Características especiais da CPUTodos os dispositivos da família PIC16F87x possuem um conjunto de caracte-rísticas cujo propósito é maximizar a confiabilidade do sistema, minimizar custoatravés da eliminação de componentes externos, prover modos de operação deeconomia de energia e oferecer proteção de código. Essas características são asseguintes:

• 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 debits 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, somentealgumas dessas características são relevantes para esse curso e somente algumasdevem ser definidas. As demais possuem seus detalhes descritos no data sheetdo PIC16F87X. Na documentação original do PIC16F87X essa seção vem nofinal do documento, mas no caso desse curso inicia-se esse capítulo por aquipois correspondem a primeira inicialização presente no programa.

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 5

2.1.1 Configuração do osciladorA 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) paraselecionar 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 conectadoentre os pinos OSC1/CLKIN e OSC2/CLKOUT para criar um oscilador. Aindanesses modos, uma fonte externa de clock, com frequência FOSC, pode serconectada ao pino OSC1/CLKIN. Nesse caso, o pino OSC2/CLKOUT funcionacomo saída de clock com uma frequência FOSC/4. O modo LP é usado parafrequências até 200 kHz, o modo XT para frequências entre 200kHz e 4 MHz eo 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ãosã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 pinoOSC2/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 RESETA família PIC16F87X diferencia entre vários tipos de Reset dos quais algunspodem ser definidos através de bits de configuração. O pino MCLR (MasterClear) é o sinal de hardware usado para causar um Reset no microcontrolador,tanto em operação normal quanto se o microcontrolador se encontrar no modoSLEEP. Uma das características especiais dessa família de microcontroladoresé a existência de um sistema de Reset ao ligar (POR – Power-on Reset) queelimina componentes RC externos normalmente usados para criar um pulso deLimpa-ao-ligar no pino de Reset do microcontrolador. Esse sistema gera umpulso interno quando uma subida do VDD é detectada (na faixa de 1,2V a1,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 deinicializaçã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 (sePWRT estiver habilitado). Esse procedimento garante que o oscilador a cristalou ressonador tenha iniciado e estabilizado. O time-out do OST somente ocorrepara 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 deconfiguração:

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 6

• Temporização ao ligar (PWRT – Power-up Timer) – O Timer de Power-upfornece 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 VDD suba para um nívelaceitá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 (cercade 4V) por um tempo maior do que TBOR (cerca de 100�s), ocorre umReset do microcontrolador. Essa situação é chamada de Brown-out. SeVDD cair abaixo de VBOR por um tempo menor do que TBOR, o RESETpode 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 umvalor superior a VBOR. O Timer de Power-up (PWRT) manterá o dispo-sitivoo em RESET por TPWRT (cerca de 72ms). O Timer de Power-upsempre estará habilitado se o circuito de Brown-out Reset estiver habili-tado, independentemente do estado do bit de configuração de PWRT. Ocircuito de Brown-out pode ser habilitado ou desabilitado pelo bit 6 deconfiguração.

2.1.3 InterrupçõesO PIC16F873 possui 13 interrupções1 agrupadas num único pedido geral deinterrrupção para o microcontrolador. Cada interrupção pode ser mascaradaindividualmente, através de um bit específico. Além disso, todas podem serhabilitadas e desabilitadas através do bit GIE (INTCON<7>). Se GIE = 1todas a interrupções que não estiverem mascaradas poderão gerar um pedidode interrupção para o microcontrolador. Caso contrário, se GIE = 0, todas asinterrupçõ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çãosubsequente. No retorno da rotina de interrupção, o GIE é automaticamente re-habilitado (GIE = 1) permitindo que novas interrupções não mascaradas sejamtratadas.

É importante observar que cada interrupção que ocorre "seta" um flag especí-fico e que esse flag é "setado" independente das interrupções estarem habilitadasou 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çõesque deverá testar se cada interrupção a ser tratada possui seu flag de pedidoigual a 1 e se está desmascarada. Essa rotina não aceita parâmetros e nãoretorna nenhum valor. Por exemplo, no caso de interrupção do Timer 0, deve-setestar se T0IF = 1 e se T0IE = 1 ao mesmo tempo. Somente nessa condição é

1Alguns microcontroladores da família PIC16F87X possuem 14 interrupções

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 7

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

void i n t e r r up t i s r ( void ) { // única r o t i na g e r a l de// tratamento de in t e r rupçõe s ,// o nome pode s e r qualquer

i f (T0IE && T0IF) { // se a inte rupção do Timer 0 ocorreu// tratamento da in t e r rupção do Timer 0

}i f (TXIE && TXIF) { // se a in t e r rupção de transmis são

// s e r i a l ocorreu// tratamento da in t e r rupção de transmissão s e r i a l

}. . .

}

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

No caso, o Timer de Watchdog (WDT) é um oscilador RC interno do chipque funciona independente do microcontrolador e não requer componentes ex-ternos. Além disso, o seu oscilador RC é separado do oscilador RC do pinoOSC1/CLKIN, isso significa que o WDT funcionará mesmo que o clock nospinos 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 permanentementedesabilitado limpando-se o bit de configuração WDTE.

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

O gravador IDC2 BR usado no curso é capaz de usar esse método paraprogramar 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.

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 8

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

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

2.1.7 Programação dos bits de configuraçãoOs bits de configuração podem ser programados (com valor "0") ou deixadossem 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. Essesbits estão organizados numa palavra de 14-bits e estão mapeados no endereço2007h. Esse endereço está além do espaço de memória de programa do usuárioe pode ser acessado somente durante a programação do microcontrolador.

No HI-TECH C a função macro __CONFIG é utilizada para programar essesbits. São disponíveis também uma série de definições que são utilizadas juntocom a macro __CONFIG. Essas definições devem ser compostas num único valoratravé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 – desabilitabrown out reset

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

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

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 9

• 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çõessobre essas definições e configurações deve ser consultado o data sheet da famíliaPIC16F87X.

As configurações utilizadas no curso são mostradas no trecho de programaabaixo:#inc lude <htc . h> // g e r a l para todos os microcontro ladore s ,

// as d e f i n i ç õ e s do microcontro lador c o r r e t o// se rão i n c l u í d a s automaticamente

. . .

/∗ Programa b i t s de con f i gu ração :HS − o s c i l a d o r de a l t a f r equenc i aWDTDIS − d e s a b i l i t a watchdog t imerLVPDIS − 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 /OBORDIS − 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ídaAs 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çãode entrada e saída. Assim, se nenhuma função for programada num dessespinos 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. Aprogramação de um bit igual a 0 num SFR TRISx configura o bit da porta parasaída, enquanro que a programação de um bit igual a 1 configura a porta paraentrada.

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

TRISC = 0 xf3 ; // b i t s 2 e 3 da Porta C são sa ídaPara 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 sefosse a atribuição de valor à uma variável:

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 10

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 ; // va r i á v e l do t ipo b i t. . .var = RC4; // o va lo r do b i t 4 , Porta C é a t r i bu ido

// à va r i á v e l ’ var ’

2.3 Timer 0O 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 afrequência do oscilador dividido por 4 (FOSC/4). O modo timer será utilizadonesse 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 quepode dividir a frequência desse clock por valores entre 2 e 256 em incrementosde 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 selecionarse 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 oWatchdog e programando-se 0 no mesmo bit configura seu uso para o Timer0. As configurações que podem ser definidas pelo OPTION_REG podem servistas na página 48 do data sheet do PIC16F87x.

O Timer 0 incrementa a cada pulso de clock, seja interno ou recebido nopino T0CKI. Sempre que ocorre a mudança de valor da contagem de FFh para00H (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 bitT0IE (INTCON<5>) for limpo (T0IE = 0). Se for esse o caso o pedido deinterrupção não será gerado, mas mesmo assim o bit T0IF irá para 1. No caso

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 11

de ocorrer a interrupção, o bit T0IF deve ser limpo por software pela rotina detratamento 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:

#de f i n e TMR0_PRESCALER 7 // d iv id e por 256. . .void main ( void ) {

. . .OPTION &= 0b11000000 ; // T0CS=0, T0SE=0, PSA=0,

// PS2=0, PS1=0, PS0=0OPTION |= TMR0_PRESCALER; // con f i gu ra o p r e s c a l e rT0IE = 1 ; // h a b i l i t a a in t e r rupção do

// Timer 0. . .

}

Deve-se lembrar que a operação AND bit a bit (&) programa zeros e aoperaçã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 T0IFsão ambos iguais a 1 para, somente nesse caso, executar o tratamento necessáriopara a interrupção do Timer 0. Nessa rotina de tratamento do Timer 0 um novovalor de contagem incial deve ser carregado no Timer 0 para se ajustar o tempoque deverá decorrer até a próxima interrupção.

Num exemplo prático, deseja-se gerar uma interrupção periódica a cada 5ms aproximadamente usando-se o Timer 0, considerando-se que a frequência dooscilador 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:

#de f i n e POLLING_PERIOD 98 // 5 ,0716 ms#de f i n e TMR_SETTING (0 x f f − (POLLING_PERIOD − 5) ) // va l o r

// da contagem i n c i a l do Timer 0. . .void i n t e r r up t i s r ( void ) { // ro t i na g e r a l de tratamento

// de i n t e r rupçõ e si f (T0IE && T0IF) { // se f o r in t e r rupcão do Timer 0

TMR0 = TMR0_SETTING; // r e ca r r ega a contagem i n c i a l

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 12

T0IF = 0 ; // limpa o f l a g de in t e r rupção

// executa aqui o que f o r n e c e s s á r i o

}}

2.4 Cominicação serialO PIC16F873 possui dois módulos de comunicação serial: o Master SynchronousSerial Port (MSSP), que opera em dois modos (SPI e I2C), e o Universal Synch-ronous Asynchonous Receiver Transmitter (USART), também conhecido comoInterface de Comunicação Serial. O primeiro módulo é utilizado para comuni-cação serial entre o microcontrolador e dispositivos internos de um computadorenquanto que o segundo módulo pode também ser utilizado para comunicaçãoentre dispositivos externos e o microcontrolador. Nesse curso será utilizadosomente 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 transmissore o receptor de dados através de um sinal de clock que controla um fluxo de bitsem 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 comum 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ãoser 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 paradefinir o modo de operação da Interface de Comunicação Serial é determinadopela 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:

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 13

• 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 (semefeito no modo sincrono): 1 = alta velocidade; 0 = baixa velocidade. Aprincípio a escolha entre alta velocidade e baixa velocidade dependeria dafrequencia do oscilador. Na prática pode-se escolher BRGH = 1 mesmopara baixas frequencias do oscilador, deve-se priorizar a minimização doerro 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 ospinos RC7/RX/DT e RC6/TX/CK para uso na porta serial e não comoentrada 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 = habilitarecepção contínua; 0 = desabilita recepção contínua

O registrador SPBRG controla o período de um timer de 8-bits dedicado paraa Interface de Comunicação Serial. No modo assincrono, o valor prgramado nobit BRGH define a fórmula que é utilizada para se obter a taxa de Baud a partirdo 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 é afrequê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 frequenciado oscilador de 20MHz, escolhe-se BRGH = 1, o que resulta no valor a serprogramado no SPBRG de 64. Como esse valor é inteiro, a taxa de Baudresultante pode não ser exata. Assim, nesse caso, a programação desse valorgera uma taxa de 19.231 bps resultando num erro de 0,16%. No curso é utilizado

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 14

comprimento da palavra de dados de 8-bits tanto para transmissão como pararecepçã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 bitSPEN.

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 bitTXIF.

6. Se a transmissão de 9-bits estiver selecionada, esse bit deve ser carregadono 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 bitSPEN.

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 umpedido de interrupção será gerado se o bit RCIE estiver "setado".

7. Ler o registrador RCSTA para pegar o nono bit (se estiver habilitado) edeterminar 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".

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 15

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

• void serial_setup(void) – Essa função configura todos os parâmetrosnecessários para a operação do canal serial a 19.200 bps, com palavra dedados de 8-bits, considerando a frequencia do oscilador do microcontrola-dor como sendo 20 MHz. Deve ser chamada uma única vez na seção deinicializaçã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 caracter, senão retorna ovalor 255.

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

• 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 antesdele o always.h que contém definições utilizadas pelo serial.h.

2.5 Conversor A/DO módulo de conversão analógica para digital (A/D) do PIC16F873 possui 5entradas. A conversão é feita pelo método de aproximações sucessivas e geraum 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 deADRESH são lidos como zero; 0 = justificado à esquerda – os 6 bitsmenos significativos de ADRESL são lidos como zero

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 16

• PCFG3:PCFG0 – esse conjunto de 4 bits configura quais bits são canaisde 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 modelosda mesma família.

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

PCFG0

AN4

RA5

AN3

RA3

AN2

RA2

AN1

RA1

AN0

RA0VREF+ VREF-

CHAN

/Refs2

0000 A A A A A VDD VSS 5/00001 A VREF+ A A A RA3 VSS 4/10010 A A A A A VDD VSS 5/00011 A VREF+ A A A RA3 VSS 4/10100 D A D A A VDD VSS 3/00101 D VREF+ D A A RA3 VSS 2/1011x D D D D D VDD VSS 0/01000 A VREF+ VREF- A A RA3 RA2 3/21001 A A A A A VDD VSS 5/01010 A VREF+ A A A RA3 VSS 4/11011 A VREF+ VREF- A A RA3 RA2 3/21100 A VREF+ VREF- A A RA3 RA2 3/21101 D VREF+ VREF- A A RA3 RA2 2/21110 D D D D A VDD VSS 1/01111 D VREF+ VREF- D A RA3 RA2 1/2

O registrador ADCON0 controla a operação do módulo A/D. Para cadacanal A/D definido pelos bits CHS2:CHS0 pode ser configurada a frequência deconversão para FOSC/2, FOSC/8, FOSC/32 ou FRC (frequência determinadapelo oscilador RC interno do módulo A/D) através dos bits ADCS1:ADCS0. Osseguintes 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ãoA/D está em operação; 0 = o módulo de conversão A/D está desligado enão consome corrente de operação.

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

Os seguintes passos devem ser seguidos para se fazer uma conversão A/D:

1. Configurar o módulo A/D:

• Configurar os pinos/referência de tensaão e I/O digital (ADCON1)

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 17

• 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. Umtempo mínimo de 2TAD é necessário antes que uma nova conversão sejainiciada.

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 configuraos canais A/D de 0, 1 e 3, onde o número do canal é o parâmetro deentrada ADC_Channel. Essa função deve ser modificada caso se desejealterar a configuração dos canais. Ela está configurada previamente paracanais analógicos 0, 1 e 3 e digitais 2 e 5, com tensão de referência dadapelo VDD. A alteração deve ser feita no arquivo adc.c. Deve ser chamadauma ú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 afrequência do oscilador de 20MHz.

Para a utilização dessas funções deve ser incluido o header adc.h.

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 18

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

2.6 PWMPWM 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 queo sinal permanece no nível lógico HIGH em relação ao período total pode serdescrito por uma porcentagem. Essa porcentagem é chamada de Duty Cycle.Por exemplo, um sinal de PWM com Duty Cycle de 50% tem a forma de umaonda quadrada, na metade do período o sinal está em nível lógico HIGH e naoutra metade do período o sinal está em nível lógico LOW. A Figura 2.2 mostraalgumas situações para os valores do Duty Cicle.

Um sinal de PWM pode ser utilizado para variar a energia entregue a umdeterminado dispositivo. Um valor de 0% de Duty Cycle significa que nenhumaenergia é entregue ao dispositivo. Por outro lado, 50% de Duty Cycle significaque 50% de energia é entregue ao dispositivo. Uma das aplicações de um sinalde PWM é o controle a corrente que passa pelo enrrolamento de um motorCC e consequentemente variação de sua velocidade. A Figura 2.3 mostra umarranjo para controle de velocidade em malha fechada de um motor CC comum microcontrolador gerando um sinal de PWM e lendo sinais digitais de umencoder. A leitura de encoder será explicada posteriormente no Capítulo 3 naexperiê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 de8-bits e CCPR1H: slave de 8-bits)

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 19

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

Os 2 módulos CCP1 e CCP2 são idênticos na operação, com a excessão doevento de disparo especial. Nos modos de captura e comparação é necessário ouso do Timer 1, enquanto que para o modo de PWM é necessário o uso do Timer2. Será abordado no curso somente o modo de PWM, os modos de captura ecomparaçã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 aresolução de 10-bits. Como o pino CCP1 está multiplexado com o pino do bit2 da Porta C, o bit TRISC<2> deve ser limpo para tornar o pino CCP1 umasaída.

O período do PWM pode ser definido através da escrita de um valor noregistrador 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 oDuty Cycle do PWM esteja programado para 0%, neste caso o nível lógicopermanece 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, sendoos 8-bits mais significativos escritos no registrador CCPR1L e os 2-bits me-nos significativos escritos nos bits 5 e 4 do registrador CCP1CON. A seguinteequaçã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 aqualquer momento, mas o valor do Duty Cycle somente será alterado quando

CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 20

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ósos valores de TMR2 e PR2 serem verificados como sendo iguais (i.e., somentequando o período do PWM estiver completo). No modo PWM o registradorCCPR1H somente pode ser lido. O registrador CCPR1H e os bits 5 e 4 doregistrador 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 valoresde TMR2, PR2 e Duty Cycle.

Os seguites passos devem ser feitos para configurar o módulo CCP paraoperaçã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 nosbits 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