Roteiro - Monitor de Tensão com PIC 16F877A

download Roteiro - Monitor de Tensão com PIC 16F877A

of 5

Transcript of Roteiro - Monitor de Tensão com PIC 16F877A

  • Roteiro

    Monitor de Tenso com PIC 16F877A

    Franklin Verssimo Matos da Silva - 200711796Fundao 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. INTRODUO

    O PIC 16F877 um microcontrolador da famlia de8 bits e ncleo de 14 bits fabricado pela MicrochipTechnology. O nmero 16 significa que ele faz parte da famlia"MID-RANGE", sendo um microcontrolador da famlia de 8bits. Isto significa que a ALU(Arithmetic and Logique Unit ouUnidade Aritmtica e Lgica em portugus) lida com palavrasde no mximo 8 bits. A letra F indica que a memria deprograma deste PIC do tipo "Flash". Cada linha da memria uma palavra de 14 bits. Os trs ltimos nmeros permitemidentificar precisamente o PIC, que neste caso um PIC dotipo 877. A referncia 16F877 pode ter um sufixo do tipo-XX", onde XX representa a freqncia mxima do relgioque o PIC pode receber. O ?Processador utiliza a memriaFLASH no armazenamento dos programas. Possui 8k linhastendo cada linha 14 bits. Usado em sistemas de automaocom grande nmero de aplicaes devido ao seu nmerode pinos ele muito verstil para projetos que envolve umgrande poder de processamento. Controle em comunicao vi-sual como: Placares eletrnicos, painel de mensagem, controlede display de LCD ou LED, painel de senha, relgios de horae temperatura em vias pblicas .

    II. OBJETIVO

    O objetivo deste trabalho realizar uma simulao nosoftware PROTEUS de um monitor de tenso com um PIC16F877A, onde ser mostrado o valor mensurado em um LCDe em um Virtual Terminal. Ainda, ser possvel visualizarinterrupes no PIC se a tenso mensurada ultrapassar certovalor definido, e/ou se o pino de interrupo do PIC forativado.

    III. MATERIAIS E MTODO

    Computador padro Software Proteus Software PIC-C

    IV. CIRCUITO NO PROTEUS

    Para a implementao do circuito monitor de tenso, foiutilizado um PIC16F877A. As tenses de 12Vcc e 24Vccso ativadas por botes e entram na porta A0 do PIC. Comoas entradas analgicas do microcontrolador s suportam umatenso de 0 a 5V, h um circuito divisor de tenso entre afonte e a porta A0.

    Figura 1.

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

    Figura 2.

    Ao passo que o valor de tenso mensurado ultrapasseo valor j definido na programao de 18Vcc, ocorre umainterrupo no microcontrolador, sendo exibida a mensagemINTERRUPTION no LCD e no Virtual Terminal.

    Outro modo de ocorrer uma interrupo nomicrocontrolador pela porta de interrupo RB0, ondeao ser ativado o boto de interrupo, envia um pulso paraa porta, causando a interrupo no PIC. Da mesma forma, exibida a mensagem INTERRUPTION no LCD e no VirtualTerminal.

  • Figura 3.

    Figura 4.

    Figura 5.

    V. CDIGO EM C

    O cdigo utilizado para o PIC16F877A encontra-se emanexo.

    REFERNCIAS[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_EXTvoid 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 linhaprintf (lcd_escreve, "%5.2f V ", t); // Escreve no LCD o valor de tenso lidoprintf("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 (t18, faz-se b=1

    if (c==0){ // Se c==0lcd_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 0delay_us(10); // Espera 10 microsegundos

    t=read_adc(); // Atribui t ao valor lido no adct=t*512/1024; // Converso do valor analgico t para digitaldelay_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 linhaprintf (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

    }}}