Autor Tema: Adquisicion de Datos 16f877  (Leído 2487 veces)

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

Desconectado kuekue

  • PIC10
  • *
  • Mensajes: 1
Adquisicion de Datos 16f877
« en: 22 de Enero de 2009, 03:09:56 »
Estimados amigos soy nuevo en TodoPic; me da mucho gusto saber que existe un foro de calidad tecnica y sobretodo para compartir informacion valiosa que nos hace crecer en conocimientos.Felicidades.
Por otra parte, estoy haciendo una tarjeta de adquisicion de datos con 16f877; un teclado telefonico y un lcd 4x20; exhibo 3 opciones en lcd, 1(auto),2(canal), 3 (opcion).Cuando escojo la opcion 1 se muestra todas las entradas analogas; en la opcion 2 se muestra solamente un canal a escojer y en opcion 3 se hace la rutina de calibracion de las entradas.
Actualmente estoy en la opcion1 se muestran todos los canales, pero estando en esta opcion oprimo cualquiera de las otras 2 y se hace un completo desorden y el pic se traba.

Podrian ayudarme o darme algun tip para poder continuar.Gracias

Les anexo el programa
#include<16f877.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#include<LCD420.c>
#define use_portb_kbd   //teclado conectado a puerto b
#include <KBD.c>

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)


#byte porta=5
#byte portb=6
#byte portc=7
#byte portd=8
#byte porte=9

#bit porte0=0x9.0

float canal0;
float canal1;
float canal2;
float canal3;
float canal4;
float canal5;
float canal6;
float canal7;




//#define inc portc,0
//#define dec portc,1
//#define start portc,2

char k;

void main()
{

   port_b_pullups(true);
   set_tris_c(255);
   lcd_init();
   kbd_init();
   lcd_putc("\f");
   lcd_gotoxy(1,1);
   lcd_putc("ADC*16F877*Kbd*Lcd");
   lcd_gotoxy(1,4);
   lcd_putc("<1>Aut");
   lcd_gotoxy(8,4);
   lcd_putc("<2>Ch");
   lcd_gotoxy(14,4);
   lcd_putc("<3>Opc");
   While(1)
   {

      k=kbd_getc();
      while((k=='\0'))
         {
            k=kbd_getc();
         }
            if((k!='*')&&(k!='#'))
            {
               switch (k)
                  {
                  case '1': lcd_init(); //inicializa lcd
                              delay_ms(5);
                              setup_adc(adc_clock_internal);      // selecciona el reloj interno

                              setup_adc_ports(all_analog);        //todas las entradas analogicas

                              disable_interrupts(global);

                              while(k='1')
                                 {
                                       lcd_gotoxy(9,1);    //unidades
                                       lcd_putc("V");       //unidades
                                       lcd_gotoxy(9,2);    //unidades
                                       lcd_putc("V");       //unidades

                                       lcd_gotoxy(9,3);    //unidades
                                       lcd_putc("P");       //unidades
                                       lcd_gotoxy(9,4);    //unidades
                                       lcd_putc("K");       //unidades

                                       lcd_gotoxy(20,1);    //unidades
                                       lcd_putc("A");       //unidades
                                       lcd_gotoxy(20,2);    //unidades
                                       lcd_putc("B");       //unidades

                                       lcd_gotoxy(20,3);    //unidades
                                       lcd_putc("C");       //unidades
                                       lcd_gotoxy(20,4);    //unidades
                                       lcd_putc("D");       //unidades

                                       lcd_gotoxy(1,1);
                                       lcd_putc("Ch0=");
                                       set_adc_channel(0);     //selecciona canal 0
                                       canal0=read_adc();      // lee canal cero
                                       delay_ms(2);            //espera 2 milisegundos para estabilizar
                                       canal0=(canal0*5)/255;  //calculo de entrada canal0
                                       lcd_gotoxy(5,1);
                                       printf(lcd_putc,"%3.2f",canal0);    //pone en lcd valor de canal 0
                                       delay_ms(30);          //espera 30 milisegundos para estabilizar

                                       lcd_gotoxy(1,2);
                                       lcd_putc("Ch1=");
                                       set_adc_channel(1);     //selecciona canal 1
                                       canal1=read_adc();     //lee canal 1
                                       delay_ms(2);           //espera 2 milisegundos para estabilizar
                                       canal1=(canal1*5)/255;  //calculo de entrada canal 1
                                       lcd_gotoxy(5,2);
                                       printf(lcd_putc,"%3.2f",canal1);    //pone en lcd valor canal 1
                                       delay_ms(30);

                                       lcd_gotoxy(1,3);
                                       lcd_putc("Ch2=");
                                       set_adc_channel(2);     //selecciona canal 2
                                       canal2=read_adc();     //lee canal 2
                                       delay_ms(2);           //espera 2 milisegundos para estabilizar
                                       canal2=(canal2*5)/255;  //calculo de entrada canal2
                                       lcd_gotoxy(5,3);
                                       printf(lcd_putc,"%3.2f",canal2);    //pone en lcd valor de canal 2
                                       delay_ms(30);          //espera 30 milisegundos para estabilizar

                                       lcd_gotoxy(1,4);
                                       lcd_putc("Ch3=");
                                       set_adc_channel(3);     //selecciona canal 3
                                       canal3=read_adc();     //lee canal 3
                                       delay_ms(2);           //espera 2 milisegundos para estabilizar
                                       canal3=(canal3*5)/255;  //calculo de entrada canal 3
                                       lcd_gotoxy(5,4);
                                       printf(lcd_putc,"%3.2f",canal3);    //pone en lcd valor canal 3
                                       delay_ms(30);

                                       lcd_gotoxy(12,1);
                                       lcd_putc("Ch4=");
                                       set_adc_channel(4);     //selecciona canal 4
                                       canal4=read_adc();      // lee canal 4
                                       delay_ms(2);            //espera 2 milisegundos para estabilizar
                                       canal4=(canal4*5)/255;  //calculo de entrada canal 4
                                       lcd_gotoxy(16,1);
                                       printf(lcd_putc,"%3.2f",canal4);    //pone en lcd valor de canal 4
                                       delay_ms(30);          //espera 30 milisegundos para estabilizar

                                       lcd_gotoxy(12,2);
                                       lcd_putc("Ch5=");
                                       set_adc_channel(5);     //selecciona canal 5
                                       canal5=read_adc();     //lee canal 5
                                       delay_ms(2);           //espera 2 milisegundos para estabilizar
                                       canal5=(canal5*5)/255;  //calculo de entrada canal 5
                                       lcd_gotoxy(16,2);
                                       printf(lcd_putc,"%3.2f",canal5);    //pone en lcd valor canal 5
                                       delay_ms(30);

                                       lcd_gotoxy(12,3);
                                       lcd_putc("Ch6=");
                                       set_adc_channel(6);     //selecciona canal6
                                       canal6=read_adc();     //lee canal6
                                       delay_ms(2);           //espera 2 milisegundos para estabilizar
                                       canal6=(canal6*5)/255;  //calculo de entrada canal6
                                       lcd_gotoxy(16,3);
                                       printf(lcd_putc,"%3.2f",canal6);    //pone en lcd valor de canal 6
                                       delay_ms(30);          //espera 30 milisegundos para estabilizar

                                       lcd_gotoxy(12,4);
                                       lcd_putc("Ch7=");
                                       set_adc_channel(7);     //selecciona canal 7
                                       canal7=read_adc();     //lee canal 7
                                       delay_ms(2);           //espera 2 milisegundos para estabilizar
                                       canal7=(canal7*5)/255;  //calculo de entrada canal 7
                                       lcd_gotoxy(16,4);
                                       printf(lcd_putc,"%3.2f",canal7);    //pone en lcd valor canal 7
                                       delay_ms(30);

                                    }

                              lcd_putc("\f");
                            //lcd_gotoxy(3,2);
                            //lcd_putc("");
                            //lcd_putc("AUTO");
                            break;
                  case '2': lcd_gotoxy(3,2);
                            lcd_putc("");
                            lcd_putc("CANAL");
                            break;
                  case '3': lcd_gotoxy(3,2);
                            lcd_putc("");
                            lcd_putc("OPCION");
                            break;
                  default: lcd_gotoxy(3,2);
                           lcd_putc("");
                           lcd_putc("No Valida");


                  }

            }


      }

 }

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Adquisicion de Datos 16f877
« Respuesta #1 en: 22 de Enero de 2009, 12:18:52 »
No se entiende muy bien como es la estructura del programa, y ademas porque colocas un lcd_init() dentro de la opcion 1?

Yo cambiaria la forma de seleccionar el menu, por ejemplo, inicializado el programa y mostrando el menu, si se presiona la opcion 1, 2 o 3, setee un bit que indique esta eleccion y llame a la funcion correspondiente. y para salir de esta que se pulse * o # y resete en bit.
La idea es testear teclas, si hay uno ya activado, ir a la funcion, retornar y volver a testear teclas.-
No contesto mensajes privados, las consultas en el foro

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: Adquisicion de Datos 16f877
« Respuesta #2 en: 29 de Enero de 2009, 18:09:57 »
kuekue hacer un menu son de las cosas que mas difícil me ha tocado hacer, ya que se requiere mucho orden, y veo que eso es lo que no tienes en tu programa. Tal vez lo haces y lo recuerdas porque lo estas escribiendo en el momento pero si lo dejas por un día ya te pierdes y te toca analizar una vez mas tu propio programa.

Te recomiendo que organice todo por funciones, por ejemplo: cuando despliegas menú principal llame a principal(), y si toma la opción 1 llame a opcion1() y así cuando por alguna razón tengas que editar un menu solo edites puntualmente.

Créeme sera todo mas fácil una vez hagas esto, y sobre todo el código sera mas rápido y eficiente.

Hay algo que las personas le da PEREZA hacer, pero es muy importante cuando haces menus, y antes de empezar hacer un DIAGRAMA DE FLUJO, y después si sentarse a programar, yo llevo casi 2 años programando y logro hacer muchos programas sin un diagrama de flujo pero cuando lo hago mi programa es mas limpio y eficaz, sobre todo cuando utilizo MENU.