Você está na página 1de 5

Roteiro

Monitor de Tenso com PIC 16F877A


Franklin Verssimo Matos da Silva - 200711796
Fundao Universidade Federal de Rondnia, Ncleo de Cincia e Tecnologia, Departamento de Engenharia Eltrica - DEE Bacharelado em Engenharia Eltrica - 9o Perodo - Disciplina de Sistemas Microprocessados

I. I NTRODUO

PIC 16F877 um microcontrolador da famlia de 8 bits e ncleo de 14 bits fabricado pela Microchip Technology. O nmero 16 signica que ele faz parte da famlia "MID-RANGE", sendo um microcontrolador da famlia de 8 bits. Isto signica que a ALU(Arithmetic and Logique Unit ou Unidade Aritmtica e Lgica em portugus) lida com palavras de no mximo 8 bits. A letra F indica que a memria de programa deste PIC do tipo "Flash". Cada linha da memria uma palavra de 14 bits. Os trs ltimos nmeros permitem identicar precisamente o PIC, que neste caso um PIC do tipo 877. A referncia 16F877 pode ter um suxo do tipo -XX", onde XX representa a freqncia mxima do relgio que o PIC pode receber. O ?Processador utiliza a memria FLASH no armazenamento dos programas. Possui 8k linhas tendo cada linha 14 bits. Usado em sistemas de automao com grande nmero de aplicaes devido ao seu nmero de pinos ele muito verstil para projetos que envolve um grande poder de processamento. Controle em comunicao visual como: Placares eletrnicos, painel de mensagem, controle de display de LCD ou LED, painel de senha, relgios de hora e temperatura em vias pblicas . II. O BJETIVO O objetivo deste trabalho realizar uma simulao no software PROTEUS de um monitor de tenso com um PIC 16F877A, onde ser mostrado o valor mensurado em um LCD e em um Virtual Terminal. Ainda, ser possvel visualizar interrupes no PIC se a tenso mensurada ultrapassar certo valor denido, e/ou se o pino de interrupo do PIC for ativado. III. M ATERIAIS E M TODO

Figura 1.

Na programao do PIC, o sinal analgico convertido em digital, e enviado para ser exibido no LCD, e tambm para o Virtual Terminal atravs das portas Rx e Tx (serial).

Figura 2.

Computador padro Software Proteus Software PIC-C IV. C IRCUITO NO P ROTEUS

Para a implementao do circuito monitor de tenso, foi utilizado um PIC16F877A. As tenses de 12Vcc e 24Vcc so ativadas por botes e entram na porta A0 do PIC. Como as entradas analgicas do microcontrolador s suportam uma tenso de 0 a 5V, h um circuito divisor de tenso entre a fonte e a porta A0.

Ao passo que o valor de tenso mensurado ultrapasse o valor j denido na programao de 18Vcc, ocorre uma interrupo no microcontrolador, sendo exibida a mensagem INTERRUPTION no LCD e no Virtual Terminal. Outro modo de ocorrer uma interrupo no microcontrolador pela porta de interrupo RB0, onde ao ser ativado o boto de interrupo, envia um pulso para a porta, causando a interrupo no PIC. Da mesma forma, exibida a mensagem INTERRUPTION no LCD e no Virtual Terminal.

Figura 3.

Figura 4.

Figura 5.

V. C DIGO EM C O cdigo utilizado para o PIC16F877A encontra-se em anexo. R EFERNCIAS


[1] Boylestad, Robert L., Nashelsky, Louis., "Dispositivos Eletrnicos e Teoria de Circuitos", 8o edio, Pearson Prentice Hall, 2004.

Anexo I Cdigo no PIC-C

#include "codigoteste1.h" #include "mod_lcd.c"

float t; int a; int b; int c;

#int_EXT void EXT_isr(void) { a++; if (a==2) a=0; lcd_escreve ("\fINTERRUPTION"); // Escreve no LCD "INTERRUPTION" lcd_pos_xy (1, 2); // Posiciona o LCD na primeira coluna e segunda linha printf (lcd_escreve, "%5.2f V ", t); // Escreve no LCD o valor de tenso lido

printf("INTERRUPTION \r"); // Escreve no virtual terminal "INTERRUPTION" }

void main() {

setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL); setup_psp(PSP_DISABLED);

setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); enable_interrupts(INT_EXT); enable_interrupts(GLOBAL);

set_adc_channel(0);

lcd_ini(); // Inicia o LCD

while (true){ // Lao while (enquanto verdadeiro)

if (t<=18) { b=0; c=0; } // Se t<=18, faz-se b=0 e c=0

if (t>18) { b=1; // Se t>18, faz-se b=1

if (c==0){ // Se c==0 lcd_escreve ("\fINTERRUPTION"); // Escreve no LCD "INTERRUPTION" printf("INTERRUPTION \r"); // Escreve no virtual terminal "INTERRUPTION" } c=1; } output_high(pin_c0); // Sada alta no pino C0

set_adc_channel(0); // Seta o ADC canal 0 delay_us(10); // Espera 10 microsegundos

t=read_adc(); // Atribui t ao valor lido no adc t=t*512/1024; // Converso do valor analgico t para digital delay_ms(1000); // Espera 1000 milisegundos

if ((a==0)&(b==0)) // Se a==0 e b==0 (ao mesmo tempo) { lcd_escreve ("\fTENSAO MENSURADA"); // Escreve no LCD "TENSAO MENSURADA" lcd_pos_xy (1, 2); // Posiciona o LCD na primeira coluna e segunda linha printf (lcd_escreve, "%5.2f V ", t); // Escreve no LCD o valor de tenso lido

printf("%5.2f V\r", (float)t); // Escreve no virtual terminal o valor da tenso

} } }