Autor Tema: dsPic30f4013 problema con voltimetro  (Leído 249 veces)

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

Desconectado emmmr

  • PIC10
  • *
  • Mensajes: 4
dsPic30f4013 problema con voltimetro
« en: 15 de Diciembre de 2016, 00:48:02 »
Hola. Tal vez ustedes puedan ayudarme, mi problema es que estoy tratando de realizar un voltímetro pero el voltaje que se visualiza en el lcd no es el correcto y además que cuando llego a un voltaje este ya no responde y se queda congelado. Este es el codigo que utilizó:

#include "p30f4013.h"
#define fcy 4000000

 _FOSC(CSW_FSCM_OFF & XT_PLL4)
_FWDT (WDT_OFF)
_FBORPOR (PBOR_OFF & PWRT_16 & MCLR_EN)
_FGS (CODE_PROT_OFF)

                 //DECLARACIONES DE FUNCIONES Y VARIABLES
int vob;
unsigned int v=0;
unsigned int va=0;
unsigned int ve=0;
unsigned int vi=0;
unsigned int vo=0;
 int main(void);
void control_modo(void);
void adc(void);
void modo_caracter(void);
void retardo_ms( unsigned int ms );
void dato_lcd(void);
void lineasegunda(void);
void lineaprimera(void);
void calculos(void);
unsigned int val;

int main(void)
{
   TRISC=0x9FFF; // PIN RS DEL LCD RC13 ,ENABLE DEL LCD RC14                   
   TRISB=0x1000; //PUERTO B COMO SALIDA(excepto el RB12 que usaremos para entrada analogica)
   LATB=0x0038;
   control_modo();
   LATB=0x000C;
   control_modo();
   LATB=0x0001;
   control_modo();
adc(); // Llama función adc
ADCON1bits.ADON = 1; // Habilita ADC
   while(1)   
      {ADCON1bits.SAMP = 1; // Bit para habilitar muestreo
      retardo_ms(3); // Tiempo para realizar el muestreo
      ADCON1bits.SAMP = 0; // Retiene dato
      while(!ADCON1bits.DONE); //Se ha realizado la conversión?
      v=ADCBUF0/2; // Datos se guardan en ADCBUF0 y se convierte en v (valor en decivoltios)
      lineaprimera();
        lineasegunda();
      retardo_ms(100);
   vob=v;

   while(v==vob){ADCON1bits.SAMP = 1; // Bit para habilitar muestreo
      retardo_ms(3); // Tiempo para realizar el muestreo
      ADCON1bits.SAMP = 0; // Retiene dato
      while(!ADCON1bits.DONE); //Se ha realizado la conversión?
      v=ADCBUF0/2;
            }
        LATB=0X0001;//VUELVE AL INICIO DE CODIGO
        control_modo();
         }
   

}
void control_modo (void){
   LATCbits.LATC13=0;// MODO CONTROL
   dato_lcd();}

void modo_caracter (void){
   LATCbits.LATC13=1 ;// MODO DATO
     dato_lcd(); }

void dato_lcd(void){ 
    LATCbits.LATC14=1; // HABILITAMOS EL LCD
    retardo_ms(1);
    LATCbits.LATC14=0 ;// DESHABIKITAMOS EL LCD
    retardo_ms(1);}

void retardo_ms( unsigned int ms ){
unsigned int periodo=0;
T1CON =0;
TMR1 = 0; // Reset Timer
IPC0bits.T1IP =1;
periodo=((fcy/256)*ms)/1000;
PR1= periodo; // Tiempo en el registro del timer
IFS0bits.T1IF=0; // Limpia bandera del timer
IEC0bits.T1IE=0; // Deshabilita timer
T1CON=0x8030; // configura TICON = 0100000000110000
while(IFS0bits.T1IF==0);
}


   void lineasegunda(void){
   calculos();
    LATB=0x00C0;//para ubicar en segunda linea el puntero
      control_modo();
   LATB=0X0020;//espacio
     modo_caracter();
   LATB=0X0020;//espacio
     modo_caracter();
   LATB=va ;//cifra alta de voltaje, vea funcion "calculos"
     modo_caracter(); 
     LATB=ve ;//segunda cifra alta de voltaje
     modo_caracter ();
      LATB=0x002E ;//. un punto
     modo_caracter ();
     LATB=vi;//tercera cifra alta de voltaje
     modo_caracter();
      LATB=vo;//cifra baja de voltaje
     modo_caracter();
LATB=0X0020;//espacio
     modo_caracter();
LATB=0X0056;//V
     modo_caracter();
LATB=0X004F;//O
     modo_caracter();
LATB=0X004C;//L
     modo_caracter();
LATB=0X0054;//T
     modo_caracter();
LATB=0X0049;//I
     modo_caracter();
LATB=0X004F;//O
     modo_caracter();
LATB=0X0053;//S
     modo_caracter();
     }

void lineaprimera(void){
      LATB=0X0020;//espacio
     modo_caracter();
      LATB=0X0020;//espacio
     modo_caracter();
    LATB=0X0056;//V
     modo_caracter();
   LATB=0X004F;//O
     modo_caracter();
   LATB=0X004C;//L
     modo_caracter();
   LATB=0X0054;//T
     modo_caracter();
   LATB=0X0049;//I
     modo_caracter();
   LATB=0X004D;//M
     modo_caracter();
   LATB=0X0045;//E
     modo_caracter();
     LATB=0X0054;//T
     modo_caracter();
   LATB=0X0052;//R
     modo_caracter();
LATB=0X004F;//O
     modo_caracter();
   LATB=0X0020;//espacio
     modo_caracter();
LATB=0X0044;//D
     modo_caracter();
LATB=0X0043;//C
     modo_caracter();
   }

void adc (void){
TRISBbits.TRISB12=1; // Entrada analógica RB12
ADPCFG = 0x0000; // Todas entradas analógicas
ADCON1bits.ASAM=0; // El muestreo inicia cuando bit SAMP=1
ADCON1bits.SSRC=0; // Termina el muestreo e inicia la conversión
ADCHSbits.CH0NA=0; // La entrada negativa será Vss
ADCHSbits.CH0SA=12; // Entrada positiva será AN12
ADCON2bits.CSCNA=0; // Muestreo secuencial (scan) deshabilitado
ADCON2bits.VCFG=0; // Referencia para la conversión: Referencia
//positiva=AVdd, Negativa=AVss
ADCON2bits.BUFM=0; // Configurado como buffer de 16 palabras
ADCON2bits.SMPI=0; // Después de la conversión se genera la interrupción
ADCON2bits.ALTS=0; // Solo muestra un Canal
ADCON3bits.ADRC=0; // Reloj del ADC es derivado del sistema
ADCON3bits.ADCS=21; // Tiempo de conversión.
}

void calculos(void){
va=(v/1000)+48;
ve=((v%1000)/100)+48;
vi=(((v%1000)%100)/10)+48;
vo=(((v%1000)%100)%10)+48;
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5556
Re:dsPic30f4013 problema con voltimetro
« Respuesta #1 en: 15 de Diciembre de 2016, 01:02:36 »
Por que creaste una funcion retardo_ms() si podes usar __delay_ms()?

Si se bloquea en algun punto y no posees debugger, lo mejor que podes hacer es activar algunas salidas y medirlas, de esa forma sabes donde se bloqueo. que lo mas seguro es que quedo dentro de un while y no sale
Tambien buscaria mejorar el tema de la libreria del LCD, hay muchas cosas para mejorarle y que te facilitarian la vida, trata de buscar alguna libreria y fijate como lo realizan.
Ejemplo esto:

Código: C
  1. void lineaprimera(void){
  2.       LATB=0X0020;//espacio
  3.      modo_caracter();
  4.       LATB=0X0020;//espacio
  5.      modo_caracter();
  6.     LATB=0X0056;//V
  7.      modo_caracter();
  8.    LATB=0X004F;//O
  9.      modo_caracter();
  10.    LATB=0X004C;//L
  11.      modo_caracter();
  12.    LATB=0X0054;//T
  13.      modo_caracter();
  14.    LATB=0X0049;//I
  15.      modo_caracter();
  16.    LATB=0X004D;//M
  17.      modo_caracter();
  18.    LATB=0X0045;//E
  19.      modo_caracter();
  20.      LATB=0X0054;//T
  21.      modo_caracter();
  22.    LATB=0X0052;//R
  23.      modo_caracter();
  24. LATB=0X004F;//O
  25.      modo_caracter();
  26.    LATB=0X0020;//espacio
  27.      modo_caracter();
  28. LATB=0X0044;//D
  29.      modo_caracter();
  30. LATB=0X0043;//C
  31.      modo_caracter();
  32.    }
Por algo asi:

Código: C
  1. void lineaprimera(void){
  2.       GotoXY(1,1); //Primera fila, primera columna
  3.       EnviarTXT("  VOLTIMETRO DC");
  4.    }

Y podes resumir los calculos en algo mas sencillo tambien:

Código: C
  1.         va = (v / 1000) + 48;
  2.         ve = ((v % 1000) / 100) + 48;
  3.         vi = ((v % 100) / 10) + 48;
  4.         vo = (v % 10) + 48;
« Última modificación: 15 de Diciembre de 2016, 01:11:57 por KILLERJC »


 

anything