TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: musede en 27 de Marzo de 2010, 16:12:48

Título: Ayuda con 12F508
Publicado por: musede en 27 de Marzo de 2010, 16:12:48
Hola, primero que nada no s si este post va aqui o en primeros pasos...

La question es que quiero usar el PIC12F508 para generar una onda cuadrada en la salida e indicar
mediante LEDs que frecuencia esta sacando. Esta es la configuracion de pines:

GP0,GP1,GP2,GP5 salidas a LEDs con anodo comun.
GP4 Salida onda cuadrada.
GP3 entrada de pulsador con resistencia de pull-up externa.

Este es el codigo en C:

Citar

#include "12c508a.h"

#use delay(clock=4000000)
#use fast_io(b)
#fuses INTRC,NOWDT,NOPROTECT,NOMCLR

int iEntrada=0;

void main()
{

SET_TRIS_B(0b001000);

//Comprobar  el pulsador.
   if(input(PIN_B4) == FALSE)
   {
      // Esperar a se deje de pulsar.
      while (input(PIN_B4) == FALSE)
      {
      }
      
      // Esperar un tiempo para evitar rebotes.
      delay_ms(150);
      
      // Cambiar frecuencia salida
      iEntrada ++;
      if(iEntrada >=4) iEntrada = 0;

      //Indicar en los LEDs la frecuencia seleccionada.
      switch(iEntrada){
         case 0x0:
            output_low(PIN_B5);
            output_high(PIN_B0);
            output_high(PIN_B1);
            output_high(PIN_B2);
         break;
         case 0x1:
            output_low(PIN_B0);
            output_high(PIN_B1);
            output_high(PIN_B2);
            output_high(PIN_B5);
         break;
         case 0x2:
            output_low(PIN_B1);
            output_high(PIN_B0);
            output_high(PIN_B2);
            output_high(PIN_B5);
         break;
         case 0x3:
            output_low(PIN_B2);
            output_high(PIN_B1);
            output_high(PIN_B0);
            output_high(PIN_B5);
         break;
      }
   }

   //Salida de frecuencia
   switch(iEntrada)
   {
      case 0:
         output_high(PIN_B4); delay_ms(100);
         output_low(PIN_B4); delay_ms(100);
         break;
      case 1:
         output_high(PIN_B4); delay_ms(200);
         output_low(PIN_B4); delay_ms(200);
         break;
      case 2:
         output_high(PIN_B4); delay_ms(400);
         output_low(PIN_B4); delay_ms(400);
         break;
      case 3:
         output_high(PIN_B4); delay_ms(800);
         output_low(PIN_B4); delay_ms(800);
         break;
   }
}

Y el problema, que muchos de ustedes ya sabran cual es con solo ver el codigo, es que no me coje
la entrada. Pero yo que estoy aprendiendo no se porque no me coje la entrada...

Espero que alguno de ustedes me pueda dar alguna indicacion... Gracias a todos!
Título: Re: Ayuda con 12F508
Publicado por: pablomanieri en 27 de Marzo de 2010, 16:27:02
Código: [Seleccionar]

if(input(PIN_B4) == FALSE)
   {
      // Esperar a se deje de pulsar.
      while (input(PIN_B4) == FALSE)
      {
      }

Dices que tienes conectado un pulsador a GP3, pero usas GP4 para hacer el testeo  :lol:


Deberías agregar un ciclo infinito, porque tal como está el código, solo se ejecuta una sola vez .





Título: Re: Ayuda con 12F508
Publicado por: MGLSOFT en 28 de Marzo de 2010, 03:56:46
Primero, como dice pablo, fallta el ciclo infinito, que deberia ir despues del set_tris.

Segundo, y lo estoy comprobando, me parece que en esos micros los pines se llaman GPx , a diferencia de los demas... Estaba equivocado, la notacion esta bien.

Este programa anda como quieres...
Código: C
  1. #include "12c508a.h"
  2.  
  3. #use delay(clock=4000000)
  4. #use fast_io(b)
  5. #fuses INTRC,NOWDT,NOPROTECT,NOMCLR
  6.  
  7. int iEntrada=0;
  8.  
  9. void main()
  10. {
  11.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  12. SET_TRIS_B(0b001000);
  13.  
  14. While(true)
  15. {
  16. //Comprobar  el pulsador.
  17.    if(input(PIN_B3) == FALSE)
  18.    {
  19.       // Esperar a se deje de pulsar.
  20.       while (input(PIN_B3) == FALSE)
  21.       {
  22.       }
  23.      
  24.       // Esperar un tiempo para evitar rebotes.
  25.       delay_ms(150);
  26.      
  27.       // Cambiar frecuencia salida
  28.       iEntrada ++;
  29.       if(iEntrada >=4) iEntrada = 0;
  30.  
  31.       //Indicar en los LEDs la frecuencia seleccionada.
  32.       switch(iEntrada){
  33.          case 0x0:
  34.             output_low(PIN_B5);
  35.             output_high(PIN_B0);
  36.             output_high(PIN_B1);
  37.             output_high(PIN_B2);
  38.          break;
  39.          case 0x1:
  40.             output_low(PIN_B0);
  41.             output_high(PIN_B1);
  42.             output_high(PIN_B2);
  43.             output_high(PIN_B5);
  44.          break;
  45.          case 0x2:
  46.             output_low(PIN_B1);
  47.             output_high(PIN_B0);
  48.             output_high(PIN_B2);
  49.             output_high(PIN_B5);
  50.          break;
  51.          case 0x3:
  52.             output_low(PIN_B2);
  53.             output_high(PIN_B1);
  54.             output_high(PIN_B0);
  55.             output_high(PIN_B5);
  56.          break;
  57.       }
  58.    }
  59.  
  60.    //Salida de frecuencia
  61.    switch(iEntrada)
  62.    {
  63.       case 0:
  64.          output_high(PIN_B4); delay_ms(100);
  65.          output_low(PIN_B4); delay_ms(100);
  66.          break;
  67.       case 1:
  68.          output_high(PIN_B4); delay_ms(200);
  69.          output_low(PIN_B4); delay_ms(200);
  70.          break;
  71.       case 2:
  72.          output_high(PIN_B4); delay_ms(400);
  73.          output_low(PIN_B4); delay_ms(400);
  74.          break;
  75.       case 3:
  76.          output_high(PIN_B4); delay_ms(800);
  77.          output_low(PIN_B4); delay_ms(800);
  78.          break;
  79.    }
  80. }
  81.  
  82. }
Título: Re: Ayuda con 12F508
Publicado por: musede en 28 de Marzo de 2010, 07:53:30
pablomanieri y MGLSOFT, muchas gracias a los dos!

Menudo par de despistes que he tenido, con lo del ciclo infinito y con no poner el pin que uso...

MGLSOFT, pero hay algo que no tengo claro, son dos cosas:

Citar
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
-Esta linia que hace? Porque ademas despues no usas el TMR0 no?
-La directiba #use fast_io(b) realmente que hace? lo que encuentro por ahi no esta muy bien explicado...

Por cierto, no se que hago mal pero no puedo habrir el esquematico.
Título: Re: Ayuda con 12F508
Publicado por: pablomanieri en 28 de Marzo de 2010, 08:12:49
Musede, no se si me permites que te conteste yo, :lol:

Código: [Seleccionar]
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
esa línea configura el timer0, pero en este programa no lo usas para nada, así que se puede obviar

la directiva
Código: [Seleccionar]
#use fast_io (b)en resumen, le dice al compilador que la configuración de los puertos la vas a realizar tú mediante
Código: [Seleccionar]
set_tris_b(xxx).
con esto se logra que la configuración de los pines de entrada y salida solo se realice cuando colocas
Código: [Seleccionar]
set_tris_b(xxx), y no cada vez que se lee o se escribe en el puerto, logrando así que el acceso a los puertos sea más rápido, de ahí el fast_io.


El diseño no lo puedes abrir porque está guardado con una versión más reciente de ISIS
Título: Re: Ayuda con 12F508
Publicado por: musede en 28 de Marzo de 2010, 08:25:35
Te lo permito no, te lo pido porfavor! jeje

Entonces lo del fast_io es mas o menos lo que tenia entendido, pero ahora esta mas claro.
Suponia que el setup_timer_0 configuraria el TMR0, pero por eso que despues no lo usa preguntava, por si era
para ajustar el oscilador interno...

Y... los parametros que se le indican dentro del () el primero sera la referencia de base de tiempo y el segundo el prescaler?
Título: Re: Ayuda con 12F508
Publicado por: pablomanieri en 28 de Marzo de 2010, 08:40:54
Efectivamernte así es.
Si te fijas en el archivo de cabecera del 12c508a

Código: [Seleccionar]
//////// Standard Header file for the PIC12C508A device ////////////////
#device PIC12C508A
#nolist
//////// Program memory: 512x12  Data RAM: 25  Stack: 2
//////// I/O: 6   Analog Pins: 0
//////// C Scratch area: 07   ID Location: 0200
//////// Oscilator Calibration Address: 05
//////// Fuses: LP,XT,INTRC,RC,NOWDT,WDT,PROTECT,NOPROTECT,NOMCLR,MCLR
////////
////////////////////////////////////////////////////////////////// I/O
// Discrete I/O Functions: SET_TRIS_x(), OUTPUT_x(), INPUT_x(),
//                         PORT_x_PULLUPS(), INPUT(),
//                         OUTPUT_LOW(), OUTPUT_HIGH(),
//                         OUTPUT_FLOAT(), OUTPUT_BIT()
// Constants used to identify pins in the above are:

#define PIN_B0  48
#define PIN_B1  49
#define PIN_B2  50
#define PIN_B3  51
#define PIN_B4  52
#define PIN_B5  53

////////////////////////////////////////////////////////////////// Useful defines
#define FALSE 0
#define TRUE 1

#define BYTE int8
#define BOOLEAN int1

#define getc getch
#define fgetc getch
#define getchar getch
#define putc putchar
#define fputc putchar
#define fgets gets
#define fputs puts

////////////////////////////////////////////////////////////////// Control
// Control Functions:  RESET_CPU(), SLEEP(), RESTART_CAUSE()
// Constants returned from RESTART_CAUSE() are:
#define WDT_FROM_SLEEP  3     
#define WDT_TIMEOUT     11   
#define MCLR_FROM_SLEEP 19   
#define MCLR_FROM_RUN   27   
#define NORMAL_POWER_UP 25   
#define BROWNOUT_RESTART 26   

////////////////////////////////////////////////////////////////// Timer 0
// Timer 0 (AKA RTCC)Functions: SETUP_COUNTERS() or SETUP_TIMER_0(),
//                              SET_TIMER0() or SET_RTCC(),
//                              GET_TIMER0() or GET_RTCC()
// Constants used for SETUP_TIMER_0() are:
#define T0_INTERNAL   0
#define T0_EXT_L_TO_H 32
#define T0_EXT_H_TO_L 48

#define T0_DIV_1      8
#define T0_DIV_2      0
#define T0_DIV_4      1
#define T0_DIV_8      2
#define T0_DIV_16     3
#define T0_DIV_32     4
#define T0_DIV_64     5
#define T0_DIV_128    6
#define T0_DIV_256    7


#define T0_8_BIT      0     

#define RTCC_INTERNAL   0      // The following are provided for compatibility
#define RTCC_EXT_L_TO_H 32     // with older compiler versions
#define RTCC_EXT_H_TO_L 48
#define RTCC_DIV_1      8
#define RTCC_DIV_2      0
#define RTCC_DIV_4      1
#define RTCC_DIV_8      2
#define RTCC_DIV_16     3
#define RTCC_DIV_32     4
#define RTCC_DIV_64     5
#define RTCC_DIV_128    6
#define RTCC_DIV_256    7
#define RTCC_8_BIT      0     

// Constants used for SETUP_COUNTERS() are the above
// constants for the 1st param and the following for
// the 2nd param:

////////////////////////////////////////////////////////////////// WDT
// Watch Dog Timer Functions: SETUP_WDT() or SETUP_COUNTERS() (see above)
//                            RESTART_WDT()
// WDT base is 18ms
//

#define WDT_18MS        8   
#define WDT_36MS        9   
#define WDT_72MS       10   
#define WDT_144MS      11   
#define WDT_288MS      12   
#define WDT_576MS      13   
#define WDT_1152MS     14   
#define WDT_2304MS     15   

#define DISABLE_PULLUPS            0x40  // for 508 and 509 only
#define DISABLE_WAKEUP_ON_CHANGE   0x80  // for 508 and 509 only
#ifndef PIN_CHANGE_FROM_SLEEP
#define PIN_CHANGE_FROM_SLEEP      0x90  // for 508 and 509 only
#endif


#list

Tienes las declaracioens de los puertos, las configuraciones disponibles del timer y el resto de las características.
Si vas a la hoja de datos del micro, ahí encuentras todos los datos que necesitas para poder configurarlo correctamente. Luego debes encontrar su equivalente en C, y así haces lo que quieres hacer.
Título: Re: Ayuda con 12F508
Publicado por: MGLSOFT en 28 de Marzo de 2010, 12:21:27
pablomanieri y MGLSOFT, muchas gracias a los dos!

Menudo par de despistes que he tenido, con lo del ciclo infinito y con no poner el pin que uso...

MGLSOFT, pero hay algo que no tengo claro, son dos cosas:

Citar
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
-Esta linia que hace? Porque ademas despues no usas el TMR0 no?
-La directiba #use fast_io(b) realmente que hace? lo que encuentro por ahi no esta muy bien explicado...

Por cierto, no se que hago mal pero no puedo habrir el esquematico.

No la quites, solo comentala y veras que hace... :mrgreen: :mrgreen:

Si no esta el pin B2 no funciona como salida, porque queda asignado al timer como tock... :lol: :lol: :lol:
En la hoja de datos lo dice bien claro.. :mrgreen: :mrgreen:

Aqui esta la imagen del archivo de pruebas...

(http://img715.imageshack.us/img715/1862/esquema12c508a.jpg)
Título: Re: Ayuda con 12F508
Publicado por: micronet3 en 28 de Marzo de 2010, 13:06:29
el include si compila, pero, no seria mas correcto asi?
Citar
#include<12f508.c>
Título: Re: Ayuda con 12F508
Publicado por: MGLSOFT en 28 de Marzo de 2010, 13:17:17
En realidad no me concentre en eso, porque el problema era otro, pero si es cierto, hay que cambiar el include, porque es de otro micro, y ese micro es OTP.
Buen apunte... :mrgreen:
Título: Re: Ayuda con 12F508
Publicado por: musede en 28 de Marzo de 2010, 13:47:38
Segun tengo entendido la libreria es la misma, no? microchip dice que se considere el mismo PIC y
el mplab no tiene la libreria del 12F508...
Título: Re: Ayuda con 12F508
Publicado por: MGLSOFT en 28 de Marzo de 2010, 14:31:21
Segun tengo entendido la libreria es la misma, no? microchip dice que se considere el mismo PIC y
el mplab no tiene la libreria del 12F508...

Lo probe y CCS tampoco la trae... :shock: :shock:
Título: Re: Ayuda con 12F508
Publicado por: musede en 28 de Marzo de 2010, 14:36:34
Please consider this device:  PIC12F508.

http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010102
Título: Re: Ayuda con 12F508
Publicado por: musede en 28 de Marzo de 2010, 18:36:26
Código: C
  1. #include "12c508a.h"
  2.  
  3. #use delay(clock=4000000)
  4. #use fast_io(b)
  5. #fuses INTRC,NOWDT,NOPROTECT,NOMCLR
  6.  
  7. int iEntrada = 0;
  8.  
  9. void main()
  10. {
  11.  
  12. setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  13.  
  14. set_tris_b(0b001000);
  15.  
  16.  
  17.  
  18.         for(;;){
  19.                 if(input(PIN_B3) == FALSE)
  20.                 {
  21.                         // Esperar a que lse deje de pulsar el pulsador.
  22.                         while (input(PIN_B3) == FALSE)
  23.                         {
  24.                         }
  25.                        
  26.                         // Esperar un temps de precaucion per a evitar rebotes
  27.                         delay_ms(150);
  28.                        
  29.                         // Cambiar frecuencia
  30.                         iEntrada ++;
  31.                         if(iEntrada >=4){
  32.                                  iEntrada = 0;
  33.                         }
  34.  
  35.                         //Indicar en els LEDs la frecuencia seleccionada
  36.                         switch(iEntrada){
  37.                                 case 0x0:
  38.                                         output_low(PIN_B5);
  39.                                         output_high(PIN_B0);
  40.                                         output_high(PIN_B1);
  41.                                         output_high(PIN_B2);
  42.                                 break;
  43.                                 case 0x1:
  44.                                         output_low(PIN_B0);
  45.                                         output_high(PIN_B1);
  46.                                         output_high(PIN_B2);
  47.                                         output_high(PIN_B5);
  48.                                 break;
  49.                                 case 0x2:
  50.                                         output_low(PIN_B1);
  51.                                         output_high(PIN_B0);
  52.                                         output_high(PIN_B2);
  53.                                         output_high(PIN_B5);
  54.                                 break;
  55.                                 case 0x3:
  56.                                         output_low(PIN_B2);
  57.                                         output_high(PIN_B1);
  58.                                         output_high(PIN_B0);
  59.                                         output_high(PIN_B5);
  60.                                 break;
  61.                         }
  62.                 }
  63.        
  64.                 //Salidas de frecuencias
  65.                 switch(iEntrada)
  66.                 {
  67.                         case 0x0:
  68.                                 output_high(PIN_B4); delay_ms(1000);
  69.                                 output_low(PIN_B4); delay_ms(1000);
  70.                                 break;
  71.                         case 0x1:
  72.                                 output_high(PIN_B4); delay_ms(4000);
  73.                                 output_low(PIN_B4); delay_ms(4000);
  74.                                 break;
  75.                         case 0x2:
  76.                                 output_high(PIN_B4); delay_ms(6000);
  77.                                 output_low(PIN_B4); delay_ms(6000);
  78.                                 break;
  79.                         case 0x3:
  80.                                 output_high(PIN_B4); delay_ms(90000);
  81.                                 output_low(PIN_B4); delay_ms(90000);
  82.                                 break;
  83.                 }
  84.         }
  85. }

Asi es como esta por el momento el codigo con la ayuda de todos ustedes, pero sigue sin funcionar...
iEntrada no incrementa, no se si es porque se desconfigura el tris o porque... creo que lo he provado ya todo!
Se que la primera vez si que me coje el pulsador porque si cambio
Código: C
  1. if(iEntrada >=4) iEntrada = 0;

por

Código: C
  1. if(iEntrada ==4) iEntrada = 0;

empieza por la ultima y cuando le doy al pulsador pasa iEntrada a 0 i al caso 0x0, despues por mucho que le
de al pulsador, o no incrementa o no lo coje...
Deberia poner el set_tris dentro del for? No se que mas provar.
Título: Re: Ayuda con 12F508
Publicado por: AKENAFAB en 28 de Marzo de 2010, 18:56:12
puede que sea una burrada xD

Código: [Seleccionar]
while (input(PIN_B3) == FALSE)
Pero prueba con esto

Código: [Seleccionar]
while (!input(PIN_B3) )
Código: [Seleccionar]
if(input(PIN_B3) == FALSE)
por

Código: [Seleccionar]
if(!input(PIN_B3) )
Título: Re: Ayuda con 12F508
Publicado por: AKENAFAB en 28 de Marzo de 2010, 19:37:36
Código: [Seleccionar]
#include <12F508.h>

#use delay(clock=4000000)

#fuses INTRC,NOWDT,NOPROTECT,NOMCLR
#use fast_io(B)

int iEntrada = 0;

void main()
{

//setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

set_tris_b(0b001000);
output_b(0);



   while(1){
      if(!input(PIN_B3) )
      {
         // Esperar a que lse deje de pulsar el pulsador.
         while (!input(PIN_B3) ) {  }
        
         // Esperar un temps de precaucion per a evitar rebotes
         delay_ms(150);
        
         // Cambiar frecuencia
         iEntrada ++;
         if(iEntrada >3){
             iEntrada = 0;
         }

         //Indicar en els LEDs la frecuencia seleccionada
         switch(iEntrada){
            case 0x0:
               output_low(PIN_B5);
               output_high(PIN_B0);
               output_high(PIN_B1);
               output_high(PIN_B2);
            break;
            case 0x1:
               output_low(PIN_B0);
               output_high(PIN_B1);
               output_high(PIN_B2);
               output_high(PIN_B5);
            break;
            case 0x2:
               output_low(PIN_B1);
               output_high(PIN_B0);
               output_high(PIN_B2);
               output_high(PIN_B5);
            break;
            case 0x3:
               output_low(PIN_B2);
               output_high(PIN_B1);
               output_high(PIN_B0);
               output_high(PIN_B5);
            break;
         }
      }
  
      //Salidas de frecuencias
      switch(iEntrada)
      {
         case 0:
            output_high(PIN_B4); delay_ms(1000);
            output_low(PIN_B4); delay_ms(1000);
            break;
         case 1:
            output_high(PIN_B4); delay_ms(4000);
            output_low(PIN_B4); delay_ms(4000);
            break;
         case 2:
            output_high(PIN_B4); delay_ms(6000);
            output_low(PIN_B4); delay_ms(6000);
            break;
         case 3:
            output_high(PIN_B4); delay_ms(90000);
            output_low(PIN_B4); delay_ms(90000);
            break;
      }
   }  //while
}


En simulador si funciona

Ya se lo que pasa xD

Que cuando no presionas el boton sigue con el patron y se va al siguiente bloque has de presionar el boton cuando esta en los delays y como son grandes , en 1 segundo no leera los bootones en 3s , en 6 y en 9segundos
Código: [Seleccionar]
switch(iEntrada)
      {
         case 0:
            output_high(PIN_B4); delay_ms(1000);
            output_low(PIN_B4); delay_ms(1000);
            break;
         case 1:
            output_high(PIN_B4); delay_ms(4000);
            output_low(PIN_B4); delay_ms(4000);
            break;
         case 2:
            output_high(PIN_B4); delay_ms(6000);
            output_low(PIN_B4); delay_ms(6000);
            break;
         case 3:
            output_high(PIN_B4); delay_ms(90000);
            output_low(PIN_B4); delay_ms(90000);
            break;
      }

El pulsador debe estar con resistencia de pull-up
Título: Re: Ayuda con 12F508
Publicado por: musede en 28 de Marzo de 2010, 19:42:18
AKENAFAB, el pulsador tiene la resistencia de pull-up y he comprovado que le llegan 4.85v y cuando pulso 0v.
he provado lo que decias en tu anterior post y nada...
Título: Re: Ayuda con 12F508
Publicado por: AKENAFAB en 28 de Marzo de 2010, 19:50:20
Es que entra al switch case aunque no presiones nada y ahi se va cada segundo si es 0.

while(1){
      if(!input(PIN_B3) )
      {
         //Ejecuta todo esto si se presiono el boton
      }
   
--->//  SE PRESIONE O NO EL BOTON SIEMPRE ANDA EJECUTANDO LO SIGUIENTE  //<----

Y cuando ejecuta el DElay tarda 1s,3s,6,9s durante ese tiempo no se revisa el boton , espero haberme explicado.

Puede que dentro de los CASE revises el estado del boton y salgas del case en caso de que cambie.


      //Salidas de frecuencias
      switch(iEntrada)
      {
         case 0:
            output_high(PIN_B4); delay_ms(1000);
            output_low(PIN_B4); delay_ms(1000);
            break;
         case 1:
            output_high(PIN_B4); delay_ms(4000);
            output_low(PIN_B4); delay_ms(4000);
            break;
         case 2:
            output_high(PIN_B4); delay_ms(6000);
            output_low(PIN_B4); delay_ms(6000);
            break;
         case 3:
            output_high(PIN_B4); delay_ms(90000);
            output_low(PIN_B4); delay_ms(90000);
            break;
      }
   }  //while
}

Espero haberme explicado!

Saludos!
Título: Re: Ayuda con 12F508
Publicado por: musede en 28 de Marzo de 2010, 19:59:38
Te has explicado perfectamente, no queria comprovarlo en los cases por no hacerlo perder tiempo y que fuese mas exacto.
Creo que hechare mano de los benditos samples de microchip y lo hare con otro pic con interrupciones...
Título: Re: Ayuda con 12F508
Publicado por: MGLSOFT en 28 de Marzo de 2010, 20:46:12
No  es necesario usar otro pic.
En vez de usar delay_ms(xxxx), haz una funcion que llame a delay_ms(100) tantas veces como necesites y en medio de esa funcion comprueba el estado del boton, de paso ya tiene el antirrebotes armado y todo.
Cuando detectas el boton pulsado marcas un bit que utilizas como bandera, y esa bandera es la que compruebas en el While.
Cada vez que pases por el while reseteas esa bandera y ya deberia funcionar como quieres...

Es facil !!   ... escribirlo!! :D :D :D

Esa funcion seria algo asi:

Código: C
  1. int1 bandera_puls;      //variable tipo bit, va declaracion como global, antes del main...
  2.  
  3. //esta funcion permite temporizar segundos y a la vez detectar un boton en tiempos iguales siempre.
  4.  void delay_cent_sec (int secyfrac)        
  5.     {
  6.        int loops;
  7.        for (loops=0;loops<=secyfrac;loops++)
  8.            {
  9.                delay_ms(100);
  10.                bandera_puls=input(pin_B3);
  11.             }
  12.     }


Aqui se llama a la funcion:
Código: C
  1. delay_cent_sec (65);        // temporiza 6,5 segundos   (el maximo de delay_ms es 65535, por eso no pasar de 65


de la ayuda de CCS

Citar
Syntax:
 delay_ms (time)
 
Parameters:
 time - a variable 0-65535(int16) or a constant 0-65535