Autor Tema: VOLTIMETRO  (Leído 2873 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Ginho_rj

  • PIC12
  • **
  • Mensajes: 87
VOLTIMETRO
« en: 17 de Abril de 2004, 17:23:00 »
SOU NOVO AQUI NESTE FORUM E ACHO QUE TODOS JA PERCEBERAM QUE SOU BRASILEIRO ,ACHEI SUPER LEGAIS ALGUNS PROJETOS AQUI,E NOTEI MUITAS DUVIDAS SIMPLES E PRETENDO NA MEDIDA DO POSSIVEL AJUDA-LOS,MINHA PRIMEIRA AJUDA É UM VOLTIMETRO JA QUE VI MUITAS DUVIDAS(DUDAS) COM RELAÇÃO AO CONVERSOR AD VI ALGUNS CODIGOS QUE UTILIZAVAM INTERRUPÇÕES MAS(PERO) SAIBAM QUE FICA MUITO LENTO O PROGRAMA,ENTAO AÍ ESTA  E DE QUEBRA UMA INICIALIZAÇÃO E COMUNICAÇÃO COM O LCD EM MODO 8 BITS:



#include   <16f877A.h>   // microcontrolador utilizado
#device adc=10
#include   <MATH.h>   // Biblioteca de função matemática

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                         Configurações para gravação                     *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#fuses   xt,wdt,noprotect,put,brownout,nolvp,nocpd,nowrt   // configuração dos fusíveis

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                 Definições para uso de Rotinas de Delay                   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#use   delay(clock=4000000, RESTART_WDT)
#use   rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                           Constantes internas                           *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definição de constantes facilita a programação e a manutenção.
#define   t_filtro 500            // tamanho do filtro

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                 Definição e inicialização das variáveis                 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Neste bloco estão definidas as variáveis globais do programa.

   float conversao = 0;      // armazena o resultado da conversão AD

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                   Definição e inicialização dos port"s                  *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#use   fast_io(a)
#use   fast_io(b)
#use   fast_io(c)
#use   fast_io(d)
#use   fast_io(e)

#byte   porta = 0x05
#byte   portb = 0x06
#byte   portc = 0x07
#byte   portd = 0x08
#byte   porte = 0x09

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                    Declaração dos flags de software                     *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definição de flags ajuda na programação e economiza memória RAM.

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                               ENTRADAS                                  *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// As entradas devem ser associadas a nomes para facilitar a programação e
//futuras alterações do hardware.

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                                SAÍDAS                                   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// As saídas devem ser associadas a nomes para facilitar a programação e
//futuras alterações do hardware.

#bit rs = porte.0            // via do lcd que sinaliza recepção de dados ou comando
#bit enable = porte.1            // enable do lcd

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *      Rotina que envia um COMANDO para o LCD                 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void comando_lcd(int caracter)
{
   rs = 0;               // seleciona o envio de um comando
   portd = caracter;         // carrega o portd com o caracter
   enable = 1 ;            // gera pulso no enable
   delay_us(1);            // espera 3 microsegundos
   enable = 0;            // desce o pino de enable

   delay_us(40);            // espera mínimo 40 microsegundos

   return;               // retorna
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *      Rotina que envia um DADO a ser escrito no LCD              *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void escreve_lcd(int caracter)
{
   rs = 1;               // seleciona o envio de um comando
   portd = caracter;         // carrega o portd com o caracter
   enable = 1;            // gera pulso no enable
   delay_us(1);            // espera 3 microsegundos
   enable = 0;            // desce o pino de enable

   delay_us(40);            // espera mínimo 40 microsegundos

   return;               // retorna
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *              Função para limpar o LCD                 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void limpa_lcd()
{
   comando_lcd(0x01);         // limpa lcd
   delay_ms (2);
   return;
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *           Inicialização do Display de LCD                 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void inicializa_lcd()
{
   comando_lcd(0x30);         // envia comando para inicializar display
   delay_ms(4);            // espera 4 milisengundos

   comando_lcd(0x30);         // envia comando para inicializar display
   delay_us(100);            // espera 100 microsengundos

   comando_lcd(0x30);         // envia comando para inicializar display

   comando_lcd(0x38);         // liga o display, sem cursor e sem blink

   limpa_lcd();            // limpa lcd

   comando_lcd(0x0c);         // display sem cursor

   comando_lcd(0x06);         // desloca cursor para a direita

   return;               // retorna
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                      Tela Principal                    *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void tela_principal()
{
while(1)
{

   comando_lcd(0x86);         // posiciona o cursor na linha 0, coluna 0
   printf (escreve_lcd, "Voltimetro");   // imprime mensagem no lcd

   comando_lcd(0xcd);         // posiciona o cursor na linha 1, coluna 14
   printf (escreve_lcd, " V");      // imprime mensagem no lcd

   return;

      }
            // retorna da função
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                          Configurações do Pic                           *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

   void main()
{

      // configura microcontrolador
      setup_adc_ports (RA0_RA1_RA3_analog);
      setup_adc (adc_clock_div_32);
      setup_counters (rtcc_internal, WDT_2304MS);
      set_adc_channel (1);

      // configura os tris
      set_tris_a(0b11011111);         // configuração da direção dos pinos de I/O
      set_tris_b(0b00000000);
      set_tris_c(0b11111101);
      set_tris_d(0b00000000);
      set_tris_e(0b00000100);

      // inicializa os ports
                     // inicializa os ports
      porta=0x00;            // limpa porta
      portb=0x00;            // limpa portb
      portc=0x00;            // limpa portc
      portd=0x00;            // limpa portd
      porte=0x00;            // limpa porte

      inicializa_lcd();         // configura o lcd
      tela_principal();         // imprime a tela principal no LCD




/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                              Rotina principal                           *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
loop:
   while(TRUE)               // rotina principal
   {
         RESTART_WDT();               // incia o watch-dog timer
         conversao = read_adc();      // inicia conversão AD
         conversao = (conversao * 5);   // faz regra de 3 para converter o valor,
         conversao = (conversao / 1023); // das unidades de AD em Volts.

}
         comando_lcd(0xCa);      // posiciona o cursor na linha 1, coluna 2
         printf (escreve_lcd,"%1.2f", conversao);   // envia dados para o display de LCD
                           // 1 número inteiro e 2 casas decimais.



delay_ms(100);



   }

}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                         Fim do Programa                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */






Desconectado Ginho_rj

  • PIC12
  • **
  • Mensajes: 87
RE: VOLTIMETRO
« Respuesta #1 en: 21 de Abril de 2004, 22:26:00 »
ninguem gostou ou sera que acabou com alguma duvida???

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: VOLTIMETRO
« Respuesta #2 en: 22 de Abril de 2004, 06:19:00 »
Lo he mirado sin profundizar y te hago algunos comentarios al código:

- Yo quitaría los return de las funciones, sobran (en una sobra el while también)

- Para calcular la resolución con 10 bits hay que dividir entre 1024 y no entre 1023

- 1 número inteiro e 9 casas decimais ---> serían 2 decimales (error de escritura)

Yo lo hice un poco más corto, mira aquí: http://miarroba.com/foros/ver.php?temaid=1771162&foroid=85505

Un saludo

Desconectado Ginho_rj

  • PIC12
  • **
  • Mensajes: 87
RE: VOLTIMETRO
« Respuesta #3 en: 23 de Abril de 2004, 00:09:00 »
o valor de cada bit é igual a :

5/(210-1)=4,8876...mV

ou seja:

5/1023

Quanto a 9 casas decimasi realmente foi um erro de digitação ,me desculpe o certo é duas casas.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: VOLTIMETRO
« Respuesta #4 en: 23 de Abril de 2004, 00:31:00 »
Te sobra el -1, míratelo bien.