Autor Tema: duda. encender leds con timer  (Leído 5321 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
duda. encender leds con timer
« en: 24 de Noviembre de 2010, 09:34:26 »
Hola . Estoy haciendo un programa para apagar y encender leds con la novedad del timer. El asunto es que cuando se pulse el pulsador el led este encendido durante 5s ( a traves del timer 0). El código he intentado organizarlo mucho, para seguir los consejos de mi director de proyecto. Como pueden ver, esta hecho a partir de estados. Los dos estados que hay son:

Idle_Low: Apagado ( es como un estado de sleep). Cuando se pulsa el pulsador sale de este estado.

Idle_High: Cuando se pulsa el pulsador se viene a este estado, se cuentan 5s ( en estos 5s el led permanece encendido) y después vuelve al estado de Low.

Un diagrama muy sencillo.

No se porque pero no me acaba de funcionar. Les agradecería que le echaran un ojo a ver que es lo que pasa. Les adjunto el código con el circuito proteus.

Muchas gracias por la ayuda!

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: duda. encender leds con timer
« Respuesta #1 en: 26 de Noviembre de 2010, 05:57:09 »
Sigo sin poder resolverlo.. que alguien me ayude por favor. Gracias de antemano.

Edito: Subo la ultima version...
« Última modificación: 26 de Noviembre de 2010, 06:13:01 por edu1989 »

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: duda. encender leds con timer
« Respuesta #2 en: 26 de Noviembre de 2010, 08:17:01 »
Si pusiera tu codigo completo tendria mas exitos  :mrgreen:
Saludo

« Última modificación: 26 de Noviembre de 2010, 10:03:53 por stk500 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: duda. encender leds con timer
« Respuesta #3 en: 26 de Noviembre de 2010, 08:25:26 »
Pongo el codigo aquí: Utilitzo el compilador Hi-Tech PICC18.
Código: [Seleccionar]

/* =================================================================================
Global variables 
  ================================================================================= */
static bit LED @ PORTBIT(PORTB, 1);
static bit polsador @ PORTBIT(PORTB, 0);



static char present_state = Idle_Low; // state variable
static char future_state = Idle_Low; // state variable

static char button;
static int timer_count=0;

/* =================================================================================
Main function
  ================================================================================= */
void main(void){

init_system ();
LED = 0;

while(1) {
output_logic();
future_state_logic();
}

}

/* =================================================================================
Function definitions
  ================================================================================= */

//*****************************************************************************
//Future_state_logic routine
//*****************************************************************************
char future_state_logic(void){
char error = 0;
button = read_inputs();

switch (present_state) {
case Idle_Low:
if (button == 1) {
future_state = Idle_High;
}
else{
future_state = Idle_Low;
}
break;

case Idle_High:
if(TMR0IF==0){ // Timer no desbordado
TMR0IE=1; // TMR0 Overflow Interrupt Enable bit se va a la funcion de interrupcion
future_state=Idle_High;

}
else{ // Timer desbordado
TMR0IF=0;
future_state=Idle_Low;
}
break;

default:
error = 1;
}
return (error);
}

//*****************************************************************************
//Output logic routine
//*****************************************************************************
char output_logic(void){
unsigned char error = 1;

switch (present_state) {

case Idle_Low:
LED = 0;
error = 0;
break;

case Idle_High:
if(TMR0IF==0){ // Timer no desbordat
TMR0IE=1; // TMR0 Overflow Interrupt Enable bit se va a la funcion de interrupcion
LED=1;

}
else{ // Timer desbordat

LED=0;
}


error = 0;
break;


default:
error = 1;
LED=0;
break;
}

return (error);
}

//*****************************************************************************
//Init operations 
//*****************************************************************************
void init_system (void){

ADCON1=0x0F; // Todos los bits como digitales
TRISB=1; // Todos los pones se comportaran como salidas menos RB0 2^0=1

INTEDG0=1; // Door switch rising edge starts an INT interrupt request
INT0IE=1; //Enables the INT0 external interrupt

timer_count=0; // Counting oscillator pulses.Increments at Fosc/4= 25us
PSA=1; //pre-scaler OFF.

GIE=1;

}

//***************************************************************************
//Interrupt Service Routine (only for the generation of the FSM's CLK sisgnal
//                           using Timer0)
//***************************************************************************


static void interrupt service_routine (void){ //Interrupt is the key word here


if(TMR0IF) {

timer_count=TIMER_INIT_VALUE ; // Load TMR0 with (256 - 56) = 200. 200*25 = 5000us
// Every 5000000 us ( 5s) Timer0 will overflow and trigger an interruption

/* State register */

if(timer_count==1000){ // 5x10^6 / 5000 = 1000
present_state = future_state; // like a Data flip-flop
TMR0IF = 0; // clear interrupt flag
}
else
timer_count=+timer_count; // Actualiza timer_count
}

if(INT0IF){ //INT0 External Interrupt Flag bit
/* State register */

INT0IF=0;
present_state = future_state;

}
}

//*****************************************************************************
//Scan inputs
//*****************************************************************************
char read_inputs (void){
char value = 0;
if (polsador == 0){
value = 1;
  }
return (value);
}

//*****************************************************************************
//Time delay routine.   
//*****************************************************************************
void time_delay(unsigned int delay){

unsigned int i;
for(i = 0; i <= delay ;i++){
NOP();
}
}


Edito para poner el codigo de esta forma y no en carpeta. Gracias. Stk500 no te preocupes que no me he enfadado ni me ha sentado mal.
« Última modificación: 26 de Noviembre de 2010, 09:11:37 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: duda. encender leds con timer
« Respuesta #4 en: 26 de Noviembre de 2010, 17:55:05 »

...............

Edito para poner el codigo de esta forma y no en carpeta. Gracias. Stk500 no te preocupes que no me he enfadado ni me ha sentado mal.

  Edu, no veo la necesidad de esta aclaración. Hasta te diría que da la impresión que es el comienzo de una pelea.

Realmente estoy de acuerdo con el comentario de stk500, porque para quienes entran al foro es más fácil ver el programa directamente con el navegador, a tener que descargarlo y recién ahí poder observarlo. Siempre que se pueda es conveniente poner el código en el propio post.

  Ahora me voy a poner a estudiarlo, a ver si te puedo dar una mano.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: duda. encender leds con timer
« Respuesta #5 en: 26 de Noviembre de 2010, 18:58:35 »
  Por lo que veo, en ningún momento se enciende el timer0 así que nunca va a contar y nunca va a generar la interrupción.

  Yo te recomiendo que no sigas así. Estás copiando código (a veces mal) y probando cosas pero sin saber lo que estás haciendo.

  Yo empecé leyendo los siguientes libros que bajé de internet y la verdad que aprendí bastante, incluso aprendí a programar en C ya que nunca lo había hecho.

  Aprenda lenguaje ANSI C como si estuviera en primero
  An introduction to programming PIC in C
  Programming 8 bit PIC Microcontrollers in C
  Compilador C Ccs Y Simulador Proteus Para Microcontroladores Pic
  Advanced PIC Microcontroller Projects in C
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: duda. encender leds con timer
« Respuesta #6 en: 26 de Noviembre de 2010, 22:44:48 »
Te contestare por partes:

No es el principio de ninguna pelea lo que he dicho, me ha enviado un mensaje privado que no iba con mala intención y directamente he respondido aquí. Por tanto si que veo la necesidad de hacer esta aclaración.

No había pensado en la posibilidad de copiar el código aquí, si hubiese conocido esta posibilidad diciendome ad desde el principio creo que la hubiera llevado a cabo. Creía mas fácil adjuntar los archivos y ver el programita montado con el mplab o similar

No estoy copiando código. Este código esta hecho por mi 100% y entiendo que hace cada linea que he puesto. Ya me imagino que algo mal esta sucediendo y por eso pregunto en el foro. Pensaba que el timer se encendía cuando entraba en la función de interrupciones. Que no sepa o pregunte alguna duda que te resulte tonta o poco importante no significa que este copiando código... Que en el ejemplo del puerto serie cogiese un código ya hecho creo que no significa nada.
No creo que encuentres por ahí programas con una estructura como el mío.

Por ultimo decirte que no creo que sea una pregunta tan inútil, lo he configurado he calculado el contador para llegar a los 5s que quiero. Creo que es mas un problema mas técnico como para que salga resuelto en un libro.




Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: duda. encender leds con timer
« Respuesta #7 en: 26 de Noviembre de 2010, 23:45:33 »
Te contestare por partes:

No es el principio de ninguna pelea lo que he dicho, me ha enviado un mensaje privado que no iba con mala intención y directamente he respondido aquí. Por tanto si que veo la necesidad de hacer esta aclaración.


  Ah, bueno. Yo lo decía porque al leer sólo tu texto parecía -o al menos me dio esa impresión a mi- que lo estabas diciendo como con ira. Pero listo, ya está aclarado.

Te contestare por partes:

No es el principio de ninguna pelea lo que he dicho, me ha enviado un mensaje privado que no iba con mala intención y directamente he respondido aquí. Por tanto si que veo la necesidad de hacer esta aclaración.

No había pensado en la posibilidad de copiar el código aquí, si hubiese conocido esta posibilidad diciendome ad desde el principio creo que la hubiera llevado a cabo. Creía mas fácil adjuntar los archivos y ver el programita montado con el mplab o similar

No estoy copiando código. Este código esta hecho por mi 100% y entiendo que hace cada linea que he puesto. Ya me imagino que algo mal esta sucediendo y por eso pregunto en el foro. Pensaba que el timer se encendía cuando entraba en la función de interrupciones. Que no sepa o pregunte alguna duda que te resulte tonta o poco importante no significa que este copiando código... Que en el ejemplo del puerto serie cogiese un código ya hecho creo que no significa nada.
No creo que encuentres por ahí programas con una estructura como el mío.

Por ultimo decirte que no creo que sea una pregunta tan inútil, lo he configurado he calculado el contador para llegar a los 5s que quiero. Creo que es mas un problema mas técnico como para que salga resuelto en un libro.


  Voy a resumirlo en pocas palabras.... Te pido disculpas entonces, porque al leer tu código pero ver los comentarios en ingles me dio toda la sensación que era copiado.

  Y la pregunta no me pareció tonta, es más, en ningún momento dije que fuera una pregunta tonta.
  En mi respuesta puse "por lo que veo...." porque tal vez a mi también se me esté pasando alguna cosa por alto. Y por ello no quise escribir directamente "mira, el problema es tal y tal"

  Nuevamente te pido disculpas por el malentendido. Nos leemos...
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: duda. encender leds con timer
« Respuesta #8 en: 27 de Noviembre de 2010, 09:30:18 »
No pasa nada, es normal que lo pensaras pero cuando lo estuve haciendo iba copiando del datasheet la frase exacta de lo que era ese bit, por eso esta en ingles jej
Voy a mirar lo que me dijiste de inicializar el timer, te parece correcto la otra parte del código AngelCris?

Gracias.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: duda. encender leds con timer
« Respuesta #9 en: 27 de Noviembre de 2010, 10:19:33 »
  Creo que hay un error en la rutina de interrupción del Timer0. Primero hay que tener en cuenta que en los 18Fxx el timer0 puede funcionar en 8 bits o 16 bits. Con el tema de cuando genera la interrupción, es en el caso de que trabaje a 8 bits, cuando pasa de 255 a 0  y empieza la cuenta nuevamente.
  O sea que cuando ingresas a la rutina de interrupción, ya hizo por lo menos toda una cuenta.

   Perdón pero no entiendo la cuenta que hacés dentro de la rutina de interrupción.  :oops:
   Si lo que querés es que el timer0 cuente 200 veces, tenés que hacer así: 256 (que si está en 8 bits es la cantidad de pulsos que cuenta para el desbordamiento) - 200 (la cantidad de pulsos que querés contar), entonces el registro TMR0 = 56. Y de ésta manera al Timer0 le van a ingresar 200 pulsos y se va a generar la interrupción.

  También veo que cada vez que entrás a dicha rutina asignás el valor a "timer_count" y luego hacés el if, esa evaluación va a ser siempre la misma ya que estás asignando el valor "TIMER_INIT_VALUE" constantemente.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: duda. encender leds con timer
« Respuesta #10 en: 27 de Noviembre de 2010, 14:15:05 »
Encontré dos maneras de hacerlo funcionar.
Una es que el timer0 esté corriendo siempre y dentro de la interrupción de éste es donde hago "present_state = future_state".
Otra forma es que dentro del case de la función "future_state_logic()" asigne directamente el valor a "present_state" y allí enciendo el timer0.

Esta es la opción con el Timer0 corriendo siempre.

Código: C
  1. #include <htc.h>
  2.  
  3. #define         PORTBIT(adr, bit) ( (unsigned)(&adr)*8 + (bit) )
  4. #define         Idle_Low 1
  5. #define         Idle_High 2
  6. #define PIC_CLK 4000000 //4MHz
  7. #define TIMER_INIT_VALUE 56
  8.  
  9. /*  =================================================================================
  10.     Global variables  
  11.     ================================================================================= */
  12.  
  13. static bit flag = 0;                          // esta variable la voy a usar para determinar cuando pasaron                                                 //los 5 segundos
  14.  
  15. static bit LED @ PORTBIT(PORTB, 1);
  16. static bit polsador @ PORTBIT(PORTB, 0);
  17. static char present_state = Idle_Low;          // state variable
  18. static char future_state = Idle_Low;           // state variable
  19. static char button;
  20. static int timer_count = 0;
  21.  
  22.  
  23. static void interrupt service_routine (void);   // This is the interrupt service routine
  24.  
  25. void init_system (void);
  26. void time_delay (unsigned int);
  27. char output_logic(void);
  28. char future_state_logic(void);
  29. char read_inputs (void);
  30.  
  31. /*  =================================================================================
  32.     Main function
  33.     ================================================================================= */
  34. void main(void)
  35. {
  36.   init_system();
  37.   LED = 0;
  38.   while(1)
  39.   {
  40.     output_logic();
  41.     future_state_logic();
  42.   }
  43. }
  44.  
  45. /*  =================================================================================
  46.     Function definitions
  47.     ================================================================================= */
  48.  
  49. //*****************************************************************************
  50. //Future_state_logic routine
  51. //*****************************************************************************
  52. char future_state_logic(void)
  53. {
  54.   char error = 0;
  55.  
  56.   button = read_inputs();
  57.   switch (present_state)
  58.   {
  59.     case Idle_Low:  if (button == 1)
  60.                     {
  61.                       future_state = Idle_High;
  62.                       flag = 0;                     // borro el flag del tiempo
  63.                       timer_count = 0;              // inicializo el contador
  64.                     }
  65.                     else
  66.                       future_state = Idle_Low;
  67.                     break;
  68.  
  69.     case Idle_High:
  70.                     if (flag == 0) future_state = Idle_High;  // si no pasaron 5s
  71.                     else                                      // si pasaron 5s
  72.                       future_state = Idle_Low;
  73.                     break;
  74.  
  75.     default:
  76.                     error = 1;
  77.   }
  78.   return (error);
  79. }
  80.  
  81. //*****************************************************************************
  82. //Output logic routine
  83. //*****************************************************************************
  84. char output_logic(void)
  85. {
  86.   unsigned char error = 1;
  87.  
  88.   switch (present_state)
  89.   {
  90.     case Idle_Low:
  91.                     LED = 0;
  92.                     error = 0;
  93.                     break;
  94.  
  95.     case Idle_High:
  96.                     if (flag == 0)                 // si no pasaron 5s
  97.                     {
  98.                       LED = 1;
  99.                       future_state = Idle_High;
  100.                     }
  101.                     else                           // si pasaron 5s
  102.                     {
  103.                       LED = 0;
  104.                       future_state = Idle_Low;
  105.                     }
  106.  
  107.                     error = 0;
  108.                     break;
  109.  
  110.     default:
  111.                     error = 1;
  112.                     LED = 0;
  113.                     break;
  114.   }
  115.   return (error);
  116. }
  117.  
  118. //*****************************************************************************
  119. //Init operations  
  120. //*****************************************************************************
  121. void init_system (void)
  122. {
  123.   ADCON1 = 0x0F;          // Todos los bits como digitales
  124.   TRISB = 1;              // Todos los pones se comportaran como salidas menos RB0 2^0=1
  125.   INTEDG0 = 1;            // Door switch rising edge starts an INT interrupt request
  126.   INT0IE = 1;             //Enables the INT0 external interrupt
  127.   timer_count = 0;        // Counting oscillator pulses.Increments at Fosc/4= 25us
  128.  
  129.  //PSA = 1;                //pre-scaler OFF.
  130.   T0PS3 = 1;              // prescaler apagado (lo tube que poner así porque sino daba error)
  131.  
  132.   T0CS = 0;               // cuenta desde (Fosc/4)      
  133.   TMR0IF = 0;             // borro el flag de interrupcion del timer0
  134.   TMR0IE = 1;             // habilito la interrupcion del timer0
  135.   GIE = 1;
  136. }
  137.  
  138. //***************************************************************************
  139. //Interrupt Service Routine (only for the generation of the FSM's CLK sisgnal
  140. //                           using Timer0)
  141. //***************************************************************************
  142.  
  143. static void interrupt service_routine (void)
  144. {       //Interrupt is the key word here
  145.   if (TMR0IF)
  146.   {
  147.  
  148.     TMR0 = 6;                                // asigno 6 para que cuente 250 ciclos
  149.                                              // cada cilco dura 1us     (1/(Fosc/4))
  150.  
  151.  
  152.      if ((present_state == Idle_High) && (flag == 0))
  153.        timer_count++;                          // si esta encendido y no pasaron 5s, incrementar contador
  154.  
  155.      present_state = future_state;             // like a Data flip-flop
  156.  
  157.      if (timer_count == 20000) flag = 1;      // si pasaron 5s, activo el flag
  158.                                               // tiempo = timer_count * 250 uS
  159.  
  160.     TMR0IF = 0;                               // clear interrupt flag
  161.  
  162.   }
  163.   if (INT0IF)
  164.   {                                           //INT0 External Interrupt Flag bit
  165.                                               /* State register */
  166.     INT0IF = 0;
  167.     present_state = future_state;
  168.   }
  169. }
  170.  
  171. //*****************************************************************************
  172. //Scan inputs
  173. //*****************************************************************************
  174. char read_inputs (void)
  175. {
  176.   char value = 0;
  177.   if (polsador == 0)
  178.   {
  179.     value = 1;
  180.   }
  181.   return (value);
  182. }
  183.  
  184. //*****************************************************************************
  185. //Time delay routine.  
  186. //*****************************************************************************
  187. void time_delay(unsigned int delay)
  188. {
  189.   unsigned int i;
  190.  
  191.   for(i = 0; i <= delay ;i++)
  192.   {
  193.     NOP();
  194.   }
  195. }

Y esta es la versión en la que sólo enciendo el Timer0 cuando me interesa contar los 5s

Código: C
  1. #include <htc.h>
  2.  
  3. #define         PORTBIT(adr, bit) ( (unsigned)(&adr)*8 + (bit) )
  4. #define         Idle_Low 1
  5. #define         Idle_High 2
  6. #define PIC_CLK 4000000 //4MHz
  7. #define TIMER_INIT_VALUE 56
  8.  
  9. /*  =================================================================================
  10.     Global variables  
  11.     ================================================================================= */
  12.  
  13. static bit flag = 0;                          // esta variable la voy a usar para determinar cuando pasaron                                                 //los 5 segundos
  14.  
  15. static bit LED @ PORTBIT(PORTB, 1);
  16. static bit polsador @ PORTBIT(PORTB, 0);
  17. static char present_state = Idle_Low;          // state variable
  18. static char future_state = Idle_Low;           // state variable
  19. static char button;
  20. static int timer_count = 0;
  21.  
  22.  
  23. static void interrupt service_routine (void);   // This is the interrupt service routine
  24.  
  25. void init_system (void);
  26. void time_delay (unsigned int);
  27. char output_logic(void);
  28. char future_state_logic(void);
  29. char read_inputs (void);
  30.  
  31. /*  =================================================================================
  32.     Main function
  33.     ================================================================================= */
  34. void main(void)
  35. {
  36.   init_system();
  37.   LED = 0;
  38.   while(1)
  39.   {
  40.     output_logic();
  41.     future_state_logic();
  42.   }
  43. }
  44.  
  45. /*  =================================================================================
  46.     Function definitions
  47.     ================================================================================= */
  48.  
  49. //*****************************************************************************
  50. //Future_state_logic routine
  51. //*****************************************************************************
  52. char future_state_logic(void)
  53. {
  54.   char error = 0;
  55.  
  56.   button = read_inputs();
  57.   switch (present_state)
  58.   {
  59.     case Idle_Low:  if (button == 1)
  60.                     {
  61.                       future_state = Idle_High;
  62.                       flag = 0;                     // borro el flag del tiempo
  63.                       timer_count = 0;              // inicializo el contador
  64.                     }
  65.                     else
  66.                       future_state = Idle_Low;
  67.                     break;
  68.  
  69.     case Idle_High:
  70.                     if ((flag == 0) && (TMR0ON == 0))
  71.                     {
  72.                       timer_count = 0;
  73.                       TMR0 = 6;
  74.                       T0CON = 0b01001000;
  75.                       TMR0IF = 0;
  76.                       TMR0IE = 1;
  77.                       TMR0ON = 1;
  78.                       present_state = Idle_High;
  79.                     }
  80.                     else
  81.                       if (flag == 1) present_state = Idle_Low;
  82.  
  83.                     break;
  84.  
  85.     default:
  86.                     error = 1;
  87.   }
  88.   return (error);
  89. }
  90.  
  91. //*****************************************************************************
  92. //Output logic routine
  93. //*****************************************************************************
  94. char output_logic(void)
  95. {
  96.   unsigned char error = 1;
  97.  
  98.   switch (present_state)
  99.   {
  100.     case Idle_Low:
  101.                     LED = 0;
  102.                     error = 0;
  103.                     break;
  104.  
  105.     case Idle_High:
  106.  
  107.                    if (flag == 0) LED = 1;            // tiempo < 5s prendo le led
  108.                     else
  109.                       LED = 0;                         // pasaron 5s apago el led
  110.                     error = 0;
  111.                     break;
  112.  
  113.     default:
  114.                     error = 1;
  115.                     LED = 0;
  116.                     break;
  117.   }
  118.   return (error);
  119. }
  120.  
  121. //*****************************************************************************
  122. //Init operations  
  123. //*****************************************************************************
  124. void init_system (void)
  125. {
  126.   ADCON1 = 0x0F;          // Todos los bits como digitales
  127.   TRISB = 1;              // Todos los pones se comportaran como salidas menos RB0 2^0=1
  128.   INTEDG0 = 1;            // Door switch rising edge starts an INT interrupt request
  129.   INT0IE = 1;             //Enables the INT0 external interrupt
  130.   timer_count = 0;        // Counting oscillator pulses.Increments at Fosc/4= 25us
  131.  
  132.  //PSA = 1;                //pre-scaler OFF.
  133.   T0PS3 = 1;              // prescaler apagado (lo tube que poner así porque sino daba error)
  134.  
  135.   TMR0ON = 0;          // apago el timer0
  136.   GIE = 1;
  137. }
  138.  
  139. //***************************************************************************
  140. //Interrupt Service Routine (only for the generation of the FSM's CLK sisgnal
  141. //                           using Timer0)
  142. //***************************************************************************
  143.  
  144. static void interrupt service_routine (void)
  145. {       //Interrupt is the key word here
  146.   if (TMR0IF)
  147.   {
  148.  
  149.  
  150.     TMR0 = 6;                                // asigno 6 para que cuente 250 ciclos
  151.                                              // cada cilco dura 1us     (1/(Fosc/4))
  152.  
  153.     timer_count++;                              // incremento el contador
  154.    
  155.     if (timer_count == 20000)                       // si llegue a 5s
  156.     {
  157.       TMR0ON = 0;                              // apago el timer0
  158.       flag = 1;
  159.       TMR0IE = 0;                              // desabilito la interrupcion
  160.     }
  161.     TMR0IF = 0;                                // borro el flag
  162.   }
  163.   if (INT0IF)
  164.   {                                           //INT0 External Interrupt Flag bit
  165.                                               /* State register */
  166.     INT0IF = 0;
  167.     present_state = future_state;
  168.   }
  169. }
  170.  
  171. //*****************************************************************************
  172. //Scan inputs
  173. //*****************************************************************************
  174. char read_inputs (void)
  175. {
  176.   char value = 0;
  177.   if (polsador == 0)
  178.   {
  179.     value = 1;
  180.   }
  181.   return (value);
  182. }
  183.  
  184. //*****************************************************************************
  185. //Time delay routine.  
  186. //*****************************************************************************
  187. void time_delay(unsigned int delay)
  188. {
  189.   unsigned int i;
  190.  
  191.   for(i = 0; i <= delay ;i++)
  192.   {
  193.     NOP();
  194.   }
  195. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: duda. encender leds con timer
« Respuesta #11 en: 28 de Noviembre de 2010, 13:49:23 »
Muchas gracias! He estado probando y cuenta 2s en vez de 5s.. los calculos estan hechos a partir de fosc=20Mhz no? a lo mejor es otra fosc.. aunque en el datasheet me parecio que era esta. Ya miraré a ver...
 a ti te cuenta hasta 5s?

Otra cosa.. En esta parte:

Código: [Seleccionar]
//*****************************************************************************
//Init operations 
//*****************************************************************************
void init_system (void){

ADCON1=0x0F; // Todos los bits como digitales
TRISB=1; // Todos los pones se comportaran como salidas menos RB0 2^0=1

INTEDG0=1; // Door switch rising edge starts an INT interrupt request
INT0IE=1; //Enables the INT0 external interrupt

timer_count=0; // Counting oscillator pulses.Increments at Fosc/4= 25us
  PSA=1; //pre-scaler OFF.
//TOPS3=1;

TMR0ON=0; // Apagar el timer
GIE=1;

}

He desactivado el pre-escaler con el PSA=1 ya que el bit TOPS3  no existe. Existe tanto el TPS0,TPS1 Y TPS2. A cual te referias?

Muchas gracias por todo.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: duda. encender leds con timer
« Respuesta #12 en: 28 de Noviembre de 2010, 22:17:45 »
Muchas gracias! He estado probando y cuenta 2s en vez de 5s.. los calculos estan hechos a partir de fosc=20Mhz no? a lo mejor es otra fosc.. aunque en el datasheet me parecio que era esta. Ya miraré a ver...
 a ti te cuenta hasta 5s?

Otra cosa.. En esta parte:

Código: [Seleccionar]
//*****************************************************************************
//Init operations 
//*****************************************************************************
void init_system (void){

ADCON1=0x0F; // Todos los bits como digitales
TRISB=1; // Todos los pones se comportaran como salidas menos RB0 2^0=1

INTEDG0=1; // Door switch rising edge starts an INT interrupt request
INT0IE=1; //Enables the INT0 external interrupt

timer_count=0; // Counting oscillator pulses.Increments at Fosc/4= 25us
  PSA=1; //pre-scaler OFF.
//TOPS3=1;

TMR0ON=0; // Apagar el timer
GIE=1;

}

He desactivado el pre-escaler con el PSA=1 ya que el bit TOPS3  no existe. Existe tanto el TPS0,TPS1 Y TPS2. A cual te referias?

Muchas gracias por todo.

  Hice los cálculos para un cristal de 4MHz, con ésto cada paso es de 1us (1/Fosc/4). Entonces cuento 250 veces y se produce una interrupción, luego incremento un contador hasta 20000 y esa es la cuenta 20000 * 250 us = 5s.

  Sí, se que no existe TOPS3 y que el bit se llama PSA. Pero usando PSA me tiraba error, entonces me fije en las definiciones del HiTech y no figuraba PSA sino TOPS3 por eso use ese. Seguramente es un error en la versión del Compilador que estoy usando (es la 9.51lp para linux).

  Te dejo la parte del pic18f4550.h que usa este compilador

Código: C
  1. /* Definitions for T0CON register */
  2. static          near bit        T0PS0           @ ((unsigned)&T0CON*8)+0;
  3. static          near bit        T0PS1           @ ((unsigned)&T0CON*8)+1;
  4. static          near bit        T0PS2           @ ((unsigned)&T0CON*8)+2;
  5. static          near bit        T0PS3           @ ((unsigned)&T0CON*8)+3;
  6. static          near bit        T0SE            @ ((unsigned)&T0CON*8)+4;
  7. static          near bit        T0CS            @ ((unsigned)&T0CON*8)+5;
  8. static          near bit        T08BIT          @ ((unsigned)&T0CON*8)+6;
  9. static          near bit        TMR0ON          @ ((unsigned)&T0CON*8)+7;
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: duda. encender leds con timer
« Respuesta #13 en: 30 de Noviembre de 2010, 07:55:19 »
Muchas gracias AngelCris, ahora si que todo funciono a la perfección. Voy a abrir un nuevo post con nuevas ideas  para el programa en cuestión, de mi trabajo. Voy a ponerme ya a hacerlo y tengo alguna duda.. es un proyecto algo complejo.

Me gustaría que te pasaras a verlo. Muchas gracias por toda tu ayuda, me esta valiendo peso en oro.