Autor Tema: Ayuda con los pulsos  (Leído 7081 veces)

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

Desconectado adak

  • PIC10
  • *
  • Mensajes: 6
Re: Ayuda con los pulsos
« Respuesta #15 en: 21 de Diciembre de 2009, 01:01:37 »
yo creo que funcionara en el pic18f2550 asi mismo como está, el programa que subi no tiene nada estricto para solo el 16f84a, solo tenes que cambiar donde dice '#include <pic16f84a.h>' por '#include <pic18f2550.h>'   si el compilador que usas es el de HI-TECH.

Desconectado adak

  • PIC10
  • *
  • Mensajes: 6
Re: Ayuda con los pulsos
« Respuesta #16 en: 21 de Diciembre de 2009, 01:16:30 »
de nada mikepvr!  :mrgreen:

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Ayuda con los pulsos
« Respuesta #17 en: 21 de Diciembre de 2009, 01:20:22 »
Bueno mikepvr, si lo quieres hacer con INT_EXT io lo haria asi:

Código: C
  1. #include <18f2550.h>
  2. ///Faltan las configuraciones, te la dejo de tarea  :mrgreen:
  3. #use delay(clock=4000000)
  4. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
  5.  
  6. int1 flag_listo = 0;
  7. int16 cont_pulsos = 0;
  8. int16 cont_pulsos_rec;
  9.  
  10. #INT_EXT
  11. void interrupt_ext (void)
  12. {
  13. cont_pulsos++;
  14. }
  15.  
  16. #INT_RTCC
  17. void timer0 (void)
  18. {
  19. set_timer0(3036);
  20. cont_pulsos_rec = cont_pulsos;
  21. cont_pulsos = 0;
  22. flag_listo = 1;
  23. }
  24.  
  25. void main (void)
  26. {
  27.     setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16);
  28.     ext_int_edge(H_TO_L);    
  29.     enable_interrupts(INT_RTCC);
  30.     enable_interrupts(INT_EXT);
  31.     enable_interrupts(GLOBAL);
  32.     set_tris_b (1);
  33.     set_timer0(3036);
  34. do{
  35.     if(flag_listo)
  36.     {
  37.     flag_listo = 0;
  38.     printf("Pulsos: %Lu\r\n",cont_pulsos_rec);
  39.     }
  40. }while(1);
  41. }


Saludos navideños  :)


A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado mikepvr

  • PIC10
  • *
  • Mensajes: 13
Re: Ayuda con los pulsos
« Respuesta #18 en: 21 de Diciembre de 2009, 01:46:58 »
Muchas gracias Kallitos, al parecer te lo aventaste :) esque me di cuenta que hay varias maneras de hacerlo, y no daba con una, pero vere que tal me va con lo que hiciste.

Solo tengo una duda...   obtendria el mismo resultado utilizando el Timer1 como contador?




El ejemplo de Adak me convencio mucho pero lo malo que tendria que adaptarlo para el CCS, debido aa que ya estoy trabando con CCS para la comunicacion para el USB, entocnes me quedo con CCS, si algun valiente se avienta la conversion del ejemplo de Adak, agradecido, sin embargo gracias Adak.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Ayuda con los pulsos
« Respuesta #19 en: 21 de Diciembre de 2009, 01:54:33 »
Hay muchas maneras de hacer las cosas, depende del nivel de programacion que tengas y de los recursos con los que cuentes.

Prueba el codigo.

Saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con los pulsos
« Respuesta #20 en: 21 de Diciembre de 2009, 08:37:29 »
El ejemplo de Adak me convencio mucho pero lo malo que tendria que adaptarlo para el CCS, debido aa que ya estoy trabando con CCS para la comunicacion para el USB, entocnes me quedo con CCS, si algun valiente se avienta la conversion del ejemplo de Adak, agradecido, sin embargo gracias Adak.

No es tan complicado de entender, y te recomiendo que le dediques tiempo a estudiar como funciona el microcontrolador en general, sus módulos, sino veo complicado que llegues a buen puerto  :? Ya los compañeros hicieron un esfuerzo para mostrarte como puede hacerse, ahora falta tu esfuerzo de adaptarlo a tu proyecto...

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Ayuda con los pulsos
« Respuesta #21 en: 21 de Diciembre de 2009, 09:07:10 »
 ;-)
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado adak

  • PIC10
  • *
  • Mensajes: 6
Re: Ayuda con los pulsos
« Respuesta #22 en: 21 de Diciembre de 2009, 15:00:22 »
Código: [Seleccionar]
#include <htc.h>
         #include <pic16f84a.h>
         __CONFIG(0x3FFB&0x3FFD&0x3F7F);
         int a,i;    /*variables int para contador ya que seran valores grandes(como dijiste aproximadamente 20 por segundo)*/
         char q,m,g;    /*variable 'q' para el minuto y 'm' para sensar el minuto*/
       
/*****Interrupcion del TMR0*****/
/*****                     *****/
 interrupt isr_tmr0(void)
          {
           i++;                               /*variable 'i'para milisegundos*/
             if(i>=957)
               {     
                 q++;
                 i=0;
                }
           if(m==2&&a>0)
                  {                            /*si 'm' es igual a 2 y 'a' es mayor que cero*/
                     a--;                     /*decrementar 'a'*/
                     RB7=1;                /*enviar 1 a la salida RB7*/ 
                   }
            if(a==0)
                    {
                      m=0;
                        }
         T0IF = 0;
         TMR0 = 130;
          }
         

/*****Programa principal*****/
/*****                  *****/
       main()
         {
           a=0;                        /*poner todas las variables a cero para empezar*/
           i=0;                         /*                                               */
           q=0;                        /*                                               */             
           m=0;
           g=0;                      /*                                               */
           for;;
           if(RB0==0&&g==0)
                   {                     /*cada vez que RB0 este en nivel bajo*/           
                      a++;            /*aumentará la variable 'a'*/
                     g++;
                   }if(RB0==1)
                                {
                                  g=0;   /*variable 'g'*/
                                  }
           if(q==60)
                 {
                   m=2;              /*la variable 'm' avisa que ya se cumplio un minuto*/
                  q=0;                /*se reinicia el minutero*/
                 }
           RB0=0;                   /*enviar un cero a la salida RB0*/
         }
 /*********/
 /*   FIN */
 /*********/         

Probá este programita, lo termié hace unos minutos..
Sensa el pin RB0 cada un minuto y cuando detecta un nivel bajo aumenta el valor de la variable 'a', luego envia la cantidad de pulsos equivalentes al valor de la variable 'a' a la pata RB7, con una frecuencia de 1Khz :-/

Modifique algo del codigo que subi, como puedes ver la variable 'g' permitira un solo aumento de la variable 'a' (por bajada de la pata RB0), de lo contrario la variable 'a' aumentara demasiado debido a la velocidad de las instrucciones y sera un desastre, ah y por sierto este programa funciona con un cristal de 4Mz,   Adios! Feliz Navidad a todos!
« Última modificación: 21 de Diciembre de 2009, 15:05:49 por adak »

Desconectado mikepvr

  • PIC10
  • *
  • Mensajes: 13
Re: Ayuda con los pulsos
« Respuesta #23 en: 28 de Diciembre de 2009, 18:58:09 »
Hola de nuevo compañeros, voviendo de probar el codigo de KALLITOS junto con el modulo de coneccion del usb y no hace lo que quiero. :(. Lo que si, establece conexion usb con la computadora ya lo he probado en proteus y fisicamente y si funciona. Pero la lectura de pulsos lo simule en Proteus para visualizarle en hyperterminal y nada.  aqui el codigo del programa.

Código: [Seleccionar]
#include <18F2550.h> // Definición de registros internos.

#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

#use delay(clock=48000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

#define LED_V PIN_B6
#define LED_R PIN_B7

#define ON output_high
#define OFF output_low

int1 flag_listo = 0;
int16 cont_pulsos = 0;
int16 cont_pulsos_rec;

#INT_EXT
void interrupt_ext (void)
{
cont_pulsos++;
}

#INT_RTCC
void timer0 (void)
{
set_timer0(3036);
cont_pulsos_rec = cont_pulsos;
cont_pulsos = 0;
flag_listo = 1;
}


void main(void) {

   ON(LED_R);
   OFF(LED_V);
   
   usb_cdc_init();
   usb_init();
   usb_wait_for_enumeration();
   
   OFF(LED_R);           
   ON(LED_V);
   
   set_tris_b(0x01);
   setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16);
   ext_int_edge(H_TO_L);   
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   set_tris_b (1);
   set_timer0(3036);
   do{
   if(flag_listo)
   {
   flag_listo = 0;
   printf("Pulsos: %Lu\r\n",cont_pulsos_rec);
   }}while(1);
   
   while(!usb_cdc_connected()) {}
   // espera a detectar una transmisión de la PC (Set_Line_Coding).
   do{
      usb_task();
      if (usb_enumerated()){  // Espera a que el dispositivo sea enumerado por el host.
         if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
            if(usb_cdc_getc()=='x'){ //¿lo que llegó fué el caracter x?
               printf(usb_cdc_putc, "Se recibe el caracter x.\n\r");
               //si, entonces envía una cadena hacia el PC
             }
            if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
               printf(usb_cdc_putc, "Se recibe el caracter a.\n\r");
               //si, entonces envía una cadena hacia el PC
             }
         }
        }
       }while (TRUE); // bucle infinito.
}


Dejare los archivos de proteus y el .hex por si acaso, al compilar el .hex no me genera errores, solo se comunica pero no manda los pulsos, los pulsos los simulo con un switch, bueno espero si pueden hacer que simule bien para probarlo fisicamente.

Desconectado mikepvr

  • PIC10
  • *
  • Mensajes: 13
Re: Ayuda con los pulsos
« Respuesta #24 en: 31 de Diciembre de 2009, 07:03:58 »
Una pregunta compañeros...  dentro de mi programa tengo un switch y escojo una opcion del switch (opcion 1), obvio ejecuta una condicion de esa opcion siempre i cuando este seleccionada esa opcion, pero cuando selecciono otra opcion del switch(opcion 2), hace la instruccion de la nueva opcion seleccionada y deja de  hacer la condicion de la primera opcion,,, como puedo seguir ejecutando la condicion de la primera opcion aun asi cuando escoja la segunda opcion del switch?

Código: [Seleccionar]
switch(op)
case "1":

   if(cont_pulsos==0b00010011)
   contador++

break;

case "2":
   printf.... el contador es...

break;

« Última modificación: 02 de Enero de 2010, 19:38:20 por mikepvr »