Sei sulla pagina 1di 12

MDULO M 09

OBJETIVOS

PIC: Conversor A/D e LCD

Compreender a operao do conversor A/D do PIC; Aprender a utilizar as funes do drive de LCD ; Desenvolver uma IHM usando o LCD e o teclado da placa de experimentos;

CONVERSOR A/D O mdulo do conversor A/D possui 8 entradas analgicas, que possuem um capacitor de sampleand-hold. A sada do sample-and-hold conectada a entrada do conversor A/D a partir de um multiplex 8 x 1. O conversor A/D gera uma palavra binria de 10 bits para representar o valor de tenso na entrada analgica selecionada. O mdulo A/D tem duas entradas de tenso de referncia (alta e baixa), que so selecionadas por software, entre algumas opes de combinao pr-estabelecidas. Uma caracterstica apenas presente no mdulo conversor A/D que o mesmo pode operar mesmo o PIC estando no modo SLEEP. Para operar neste modo o sinal de clock do conversor A/D (CAD) deve ser derivado do oscilador RC interno do PIC. O conversor A/D possui quatro registradores: Registrador do byte mais significado do resultado da converso (ADRESH); Registrador do byte menos significado do resultado da converso (ADRESL); Registrador de controle 0 (ADCON0) e Registrador de controle 1. Os registradores ADRESH:ADRESL contm os 10 bits do resultado da converso. Quando a mesma concluda, o resultado carregado nesses registradores, o bit GO/DONE (bit 2 do Reg. ADCON0) resetado e o flag de interrupo, bit ADIF, setado. Aps a configurao do mdulo como desejado, o canal cujo sinal analgico deve ser convertido, deve ser selecionado antes da converso ser iniciada. Os canais de entrada analgicos devem ter seus correspondentes bits TRIS ajustado para que os pinos das portas A e E se comportem como entradas. Aps o perodo de aquisio do sinal ter finalizado (aproximadamente 20s) a converso A/D pode ser iniciada conforme os seguintes passos: 1. Configure o mdulo A/D Configure os pinos de entrada analgica, as tenses de referncia e os pinos de I/O digital (ADCON1); Selecione o canal de entrada analgica (ADCON0); Selecione a freqncia do sinal de clock do conversor A/D (ADCON0); Ative o mdulo A/D; 2. Configure a interrupo do mdulo A/D (se desejado); Resete o bit ADIF; Sete o bit ADIE; Sete o bit GIE; 3. Aguarde o tempo de aquisio requerido; 4. Inicie a converso

Sete o bit GO/DONE (ADCON0) 5. Aguarde o tempo de converso ter transcorrido; Realize um POLLING no bit GO/DONE, verificando se o seu valor zero (indicativo de fim de converso A/D); ou aguarde pela interrupo gerada pelo mdulo A/D ao fim da converso; 6. Leia o par de registradores (ADRESH:ADRESL), resete o bit ADIF se a interrupo do conversor A/D est sendo utilizada; 7. Para realizar uma nova converso retorne ao passo 1 ou 2 (antes de uma nova converso ser iniciada, deve ser aguardado um tempo de 2TAD, que o tempo de converso por bit, cujo valor definido na tabela 1). O conversor A/D necessita de no mnimo 12 TAD para realizar uma converso de 10 bits. A fonte do clock do conversor A/D selecionada por software entre as possibilidades abaixo: 2Tosc 8Tosc 32Tosc Oscilador RC interno Para uma converso correta, o clock do conversor A/D deve ser selecionado para garantir um TAD mnimo de 1.6s. A tabela 1 mostra os valores de TAD em funo da seleo da fonte do clock. Tabela1 TAD x Mxima freqncia de converso

Se o bit GO/DONE for resetado durante uma converso, esta ser abortada. Os registradores de resultado do mdulo A/D no sero atualizados com a parcialmente concluda converso. Assim, os registradores ADRESH:ADRESL continuaram armazenando o valor da ltima converso concluda (ou o ltimo valor escrito para os registradores ADRESH:ADRESL). Aps uma converso ser abortada, um tempo de 2TAD necessrio antes de uma nova converso ser iniciada. Aps este tempo, a aquisio do canal selecionado automaticamente iniciada. O par de registradores ADRESH:ADRESL comporta 16 bits, assim, o valor convertido de 10 bits pode ser justificado a direita ou esquerda, de acordo com o bit seleo de formato do conversor A/D (ADFM), que controla a justificao. Os bits extras no utilizados so carregados com 0 (zeros). Quando o mdulo A/D no estiver sendo utilizado, os registradores ADRESH:ADRESL podem ser usados como dois registradores de propsito geral de 8 bits.

Justificao do resultado da converso A/D

Diagrama de blocos do conversor A/D

Registrador ADCON0 - Controla a operao do mdulo A/D.

Registrador ADCON1 Configura a funo dos pinos das portas (A e E)

Os registradores ADCON1 e TRIS controlam a operao dos pinos das portas A/D. Os pinos das portas que sero entradas analgicas devem ter seus correspondentes bits TRIS setados. Se o bit est resetado, o nvel de tenso da sada digital ser convertido. A operao do conversor A/D independe do estado dos bits CHS2:CHS0 e dos bits TRIS Observaes: 1 Quando o registrador da porta lido, qualquer pino configurado como um canal de entrada analgica ser lido como zero (nvel baixo). Pinos configurados como entradas digitais iro se converter em entradas analgicas. Nveis analgicos em uma entrada configurada como digital, no afetaro a preciso da converso. 2 Nveis analgicos em qualquer pino que definido como uma entrada digital (incluindo os pinos AN7:AN0) podem fazer com que o buffer de entrada consuma corrente que est fora das especificaes do dispositivo.

Registradores associados com o mdulo do conversor A/D

As rotinas abaixo implementam as funes utilizadas para escrever caracteres e/ou mensagens em um LCD (Display de Cristal Lquido) de 16 colunas por 2 linhas. / *====================================================================== ====================================================================== ARQUIVO - DRIVER: LCD_16x2_LIB.C DATA DE CRIAO: 03/11/2003 REVISO: 1.0 DATA DA ULTIMA REV: 03/12/2004 ULTIMA REV: 1.1 MICROCONTROLADOR: FAMILIA PIC FUNO: DESCRIO: BIBLIOTECA DE MANIPULAO DO DISPLAY DE CRISTAL LQUIDO (LCD 16X2). AUTOR: TC. LCIO HLIO

======================================================================= =====================================================================*/ #ifndef #define #define #define #define #define #define CS_LCD CS_LCD RS_LCD D4_LCD D5_LCD D6_LCD D7_LCD PIN_E0 PIN_E1 PIN_D4 PIN_D5 PIN_D6 PIN_D7 // Pino de Controle "CS - CHIP //SELECT" do LCD --------- (pino 6). // Pino de Controle "RS - REGISTER //SELECT" do LCD ----- (pino 4). // Pino do Barramento de Dados "D4 //4" do LCD --- (pino 11). // Pino do Barramento de Dados "D5 //5" do LCD --- (pino 12). // Pino do Barramento de Dados "D6 //6" do LCD --- (pino 13). // Pino do Barramento de Dados "D7 -

Dado Dado Dado Dado

//7" do LCD --- (pino 14). #endif #define lcd_type 2 #define lcd_seg_lin 0x40 // 0=5x7, 1=5x10, 2=2 linhas // Endereo da segunda linha na RAM do //LCD

// A constante abaixo define a seqncia de inicializao do LCD. byte CONST seq_ini_lcd[4] = {0x20 | (lcd_type << 2), 0x0c, 1, 6}; /*===================================================================== FUNO: ENVIA_NIBBLE_LCD() PARMETROS: BYTE, DADO... RETORNO: BYTE, NENHUM. DESCRIO: ENVIA UM DADO DE QUATRO BITS PARA O BARRAMENTO DO DISPLAY.

=====================================================================*/ void envia_nibble_lcd( byte dado ) { output_bit(D4_LCD,bit_test(dado,0)); output_bit(D5_LCD,bit_test(dado,1)); output_bit(D6_LCD,bit_test(dado,2)); output_bit(D7_LCD,bit_test(dado,3)); output_high(CS_LCD); output_low(CS_LCD); // Coloca os quatro bits nas // saidas.

// D um pulso no pino de Enable (CS).

/*===================================================================== FUNO: PARMETROS: RETORNO: DESCRIO: ENVIA_BYTE_LCD() BYTE, ENDERECO, DADO... BYTE, NENHUM. ENVIA UM DADO DE QUATRO BITS PARA O BARRAMENTO DO DISPLAY.

=====================================================================*/ void envia_byte_lcd( boolean endereco, byte dado ) { output_low(RS_LCD); //Coloca o pino "RS" em "0". output_bit(RS_LCD,endereco); //Configura o pino "RS" dependendo do //modo selecionado. delay_us(100); // Aguarda 100 us.

output_low(CS_LCD); // Desabilita o Display. envia_nibble_lcd(dado >> 4); // Envia a primeira parte do byte. envia_nibble_lcd(dado & 0x0f); // Envia a segunda parte do byte. }

/*===================================================================== FUNO: PARMETROS: RETORNO: DESCRIO: INI_LCD() BYTE, NENHUM. BYTE, NENHUM. ROTINA DE INICIALIZAO DO LCD.

=====================================================================*/ void ini_lcd_16x2() { byte conta; output_low(CS_LCD); output_low(D4_LCD); output_low(D6_LCD); output_low(D7_LCD); output_low(RS_LCD); output_low(CS_LCD); delay_ms(15); // Envia uma seqncia de 3 vezes o valor "0x03" e depois o valor // "0x02" para configurar o barramento do LCD no modo de 4 bits. for(conta = 1 ;conta <= 3 ; ++conta) { envia_nibble_lcd(3); delay_ms(5); } envia_nibble_lcd(2); // Envia uma "string" de inicializao do Display. for(conta = 0; conta <=3 ; ++conta) envia_byte_lcd(0,seq_ini_lcd[conta]); }

/*===================================================================== FUNO: PARMETROS: RETORNO: DESCRIO: XY_LCD() BYTE, X,Y. BYTE, NENHUM. ROTINA DE...

=====================================================================*/ void posicao_xy_lcd( byte x, byte y) { byte endereco; if(y != 1) endereco = lcd_seg_lin; else endereco = 0; endereco += x-1; envia_byte_lcd(0,0x80|endereco); }

/*==================================================================== FUNO: PARMETROS: RETORNO: DESCRIO: EXIBE_LCD() BYTE, C... BYTE, NENHUM. ROTINA PARA EXIBIR TEXTOS (CARACTERES) E COMANDOS.

=====================================================================*/ void exibe_lcd( char caracter) { switch (caracter) { case '\f' : // Envia um byte de Comando de Limpar (CLEAR) o //Display. envia_byte_lcd(0,1); delay_ms(2); break; case '\n' : posicao_xy_lcd(1,2); break; case '\b' : envia_byte_lcd(0,10); break; // Envia um Caracter (ASCII) para o Display. default: envia_byte_lcd(1,caracter); break; } }

Referncias
1 PIC16F87X Datasheet Microchip Technology Incorporated. USA. Nov 1999.

10

PREPARAO 1 Descreva como ficam distribudos os 10 bits da palavra digital gerada pelo conversor A/D, aps uma converso, quando utilizada a justificao direita e a esquerda. 2 - Considerando que o conversor A/D realiza uma converso de 10bits no tempo mnimo (12T ad) e que o clock do PIC de 4MHz, determine que opo para os bits ADCS2: ADCS1: ADCS0 deve ser escolhida na tabela 1, para essa freqncia de Clock e qual o tempo total de converso, baseado na seleo de ADCS2: ADCS1: ADCS0 e no clock do PIC. 3 - Descreva a operao realizada por cada uma das funes abaixo e tambm o que representa cada opo dos parmetros da funo em termos do funcionamento do bloco ao qual a funo est associada (quando houver):
SETUP_ADC (mode) mode: ADC_OFF ADC_CLOCK_DIV_2 ADC_CLOCK_DIV_8 ADC_CLOCK_DIV_32 ADC_CLOCK_INTERNAL SETUP_ADC_PORTS (value) value: NO_ANALOGS ALL_ANALOG AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF VRefh=A3 AN0_AN1_AN2_AN3_AN4 AN0_AN1_AN2_AN4_VSS_VREF VRefh=A3 AN0_AN1_AN3 AN0_AN1_VSS_VREF VRefh=A3 AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF VRefh=A3 VRefl=A2 AN0_AN1_AN2_AN3_AN4_AN5 AN0_AN1_AN2_AN4_AN5_VSS_VREF VRefh=A3 AN0_AN1_AN4_AN5_VREF_VREF VRefh=A3 VRefl=A2 AN0_AN1_AN4_VREF_VREF VRefh=A3 VRefl=A2 AN0_AN1_VREF_VREF VRefh=A3 VRefl=A2 AN0 AN0_VREF_VREF VRefh=A3 VRefl=A2 READ_ADC (mode) mode: ADC_START_AND_READ ADC_START_ONLY ADC_READ_ONLY SET_ADC_CHANNEL (chan)

4 Elabore um programa em C para o PIC 16F877 que incremente uma varivel do tipo LONG a cada 524ms. Utilize a interrupo do Overflow do Timer 1, ajustando o Timer1 para gerar um overflow no perodo indicado acima. Na rotina de interrupo devem ser implementadas as seguintes operaes: a) Incremento da varivel do tipo LONG a cada 524ms; b) Escrita da mensagem Contagem = <valor da varivel LONG>, na linha superior do display, a cada 524ms. O termo entre < > corresponde ao valor da varivel, que deve aparecer aps o texto Contagem =;

11

Implemente tambm uma rotina, utilizando a interrupo do CAPTURE do bloco CCPx, para identificar quando um boto pressionado (transio de 1 para 0). Na rotina do CAPTURE, SET/RESET um flag (varivel do tipo SHORT), que libera ou inibi o incremento do valor da varivel do tipo LONG na interrupo do Timer 2, segundo a seguinte lgica: Flag setado (igual a 1) libera contagem; Flag resetado (igual a 0) inibe contagem (congela a contagem); A rotina dever funcionar da seguinte forma: o flag inicia a execuo com zero, quando o boto for pressionado pela primeira vez, o seu valor muda para 1. Aps uma segunda ativao do boto o valor do flag volta para zero e na seqncia o mesmo fica trocando de estado cada vez que o boto for pressionado. 5 Escreva uma rotina em C que faa a leitura do valor de um sinal analgico aplicado na entrada AN0 a cada 524 ms. A cada leitura o valor lido (de 10 bits) deve ser apresentado no display atravs da seguinte mensagem: Valor Lido: XXX, onde os caracteres XXX correspondem ao valor de 10 bits, no formato hexadecimal. Utilize a rotina de interrupo do Timer1 da questo anterior para implementar a leitura/escrita da mensagem a cada 524ms

12

Potrebbero piacerti anche