Autor Tema: No cuenta TIMER0  (Leído 2304 veces)

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

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
No cuenta TIMER0
« en: 03 de Diciembre de 2009, 07:13:50 »
Hola a todos,

No soy capaz en este programa de que el TIMER0 funcione como contador, el programa viene de otra versión anterior que hice, y funciona, el problema ha surgido en éste cuando he implementado el uso de #INT_RB y #INT_EXT.. El caso es que las deshabilito y sigue sin funcionar.. me tiene mosqueado.

De qué podrá ser?

Gracias de antemano.

Código: C
  1. #int_TIMER0                                      
  2. void TIMER0_isr(void)                              
  3.  {                                            
  4.  delay_ms(30);
  5.  contador=1;
  6.  set_timer0(255);
  7.  }
  8.  
  9. #int_EXT
  10. void Start_isr(void)                                  //interrupción de Marcha
  11.  {
  12.   delay_ms(30);
  13.   if (uni!=0 || cen!=0)                        
  14.   {delay_ms(30); Stop=0; Marcha();}
  15.  }
  16.  
  17.  
  18. #int_RB
  19. int8 Pulsadores_isr()
  20. {
  21.  
  22. if (CENTENAS==1)                           //Pulsador incremental CENTENAS
  23. {delay_ms(400); cen++;}
  24.  
  25. if (UNIDADES==1)                          //Pulsador incremental UNIDADES
  26. {delay_ms(400); uni++;}
  27.                                                       //Son los encargados de que los pulsadores de entrada
  28.                                                       //Lleven el conteo de preselección
  29. if (uni>9) {dec++; uni=0;}               //Si unidades >9, incrementa centenas y pon uni a 0
  30. if (dec>9) dec=0;                             //Si decenas >9, pon nuevamente a 0
  31. if (cen>9) {mil++; cen=0;}               //Lo mismo pero con centenas y millar
  32. if (mil>9) mil=0;  
  33.  
  34. uni2=0; dec2=0; cen2=0; mil2=0;
  35.  
  36. }
  37.  
  38.  
  39. void main()                                  
  40. {
  41. set_tris_a(0b010000);                          
  42. set_tris_b(0b11110001);
  43.  
  44. lcd_init();
  45.  
  46. setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);    
  47. ext_int_edge(L_TO_H);
  48.  
  49. enable_interrupts(int_timer0);
  50. enable_interrupts(int_EXT);
  51. enable_interrupts(int_RB);
  52. enable_interrupts(global);
  53.  
  54. clear_interrupt(int_RB);
  55. clear_interrupt(int_EXT);
  56. clear_interrupt(int_timer0);
  57.  
  58. reset();                                      
  59.  
  60. lcd_init();                                    
  61.  
  62. inicial();
  63.  
  64. while (true)
  65.    {
  66.                                                  
  67.  lcd_gotoxy(1,1);  lcd_putc("INTRODUCE EL N");      
  68.  lcd_gotoxy(15,1); lcd_putc(223);                        
  69.  lcd_gotoxy(1,2);  lcd_putc("DE ESPIRAS");
  70.  lcd_gotoxy(12,2); printf(lcd_putc,"%u",mil);                            
  71.  lcd_gotoxy(13,2); printf(lcd_putc,"%u",cen);    
  72.  lcd_gotoxy(14,2); printf(lcd_putc,"%u",dec);    
  73.  lcd_gotoxy(15,2); printf(lcd_putc,"%u",uni);  
  74.  
  75.    }
  76. }
  77.  
  78.  
  79. void marcha()
  80.  {                    
  81.  
  82. lcd_putc("\f");      
  83.  
  84. while(true){                      
  85.  
  86.  
  87.   lcd_gotoxy(1,1); printf(lcd_putc,"BOBINANDO.....");    
  88.   lcd_gotoxy(1,2);  lcd_putc("ESPIRAS N");
  89.   lcd_gotoxy(10,2); lcd_putc(223);
  90.   lcd_gotoxy(12,2); printf(lcd_putc,"%u",mil2);                          
  91.   lcd_gotoxy(13,2); printf(lcd_putc,"%u",cen2);    
  92.   lcd_gotoxy(14,2); printf(lcd_putc,"%u",dec2);    
  93.   lcd_gotoxy(15,2); printf(lcd_putc,"%u",uni2);  
  94.          
  95.                                        
  96.          
  97. if (contador==1) {uni2++; contador=0;}      
  98. if (uni2>9) {dec2++; uni2=0;}                
  99. if (dec2>9) {cen2++; dec2=0;}
  100. if (cen2>9) {mil2++; cen2=0;}
  101.  
  102.  
  103. if (mil2==mil && dec2==dec &&                              
  104. cen2==cen && uni2==uni)  { lcd_putc("\f"); break; fin();}  
  105. }
  106. }

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: No cuenta TIMER0
« Respuesta #1 en: 03 de Diciembre de 2009, 07:36:20 »
¿Un delay_ms dentro de una interrupción?, ¡eso es pecado mortal  :D !

Te aconsejo que lo saques de ahí, seguro que el timer está desbordando desde dentro de la propia interrupción y por eso puede hacer cosas raras.

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: No cuenta TIMER0
« Respuesta #2 en: 03 de Diciembre de 2009, 08:03:13 »
El caso es que sigue
¿Un delay_ms dentro de una interrupción?, ¡eso es pecado mortal  :D !

Te aconsejo que lo saques de ahí, seguro que el timer está desbordando desde dentro de la propia interrupción y por eso puede hacer cosas raras.

Vale, vale ya los quité  :D, pero no se ponía un retardo para evitar los rebotes de los pulsadores?

Y sigue haciendo cosas raras..

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: No cuenta TIMER0
« Respuesta #3 en: 03 de Diciembre de 2009, 08:08:54 »
Poner un delay para evitar rebotes es una técnica habitual, pero no dentro de una interrupción. Lo puedes hacer en el main de tu programa, o incluso utilizar el propio timer para contar el tiempo de pulsación sin mantener al micro esperando.

¿Qué cosas raras te hace ahora?

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: No cuenta TIMER0
« Respuesta #4 en: 03 de Diciembre de 2009, 08:15:03 »
Gracias por la aclaración, Nocturno, tomo nota.

Sigue sin contar, he vuelto a poner los componentes nuevamente en proteus, ya que a veces tengo fallos y lo soluciono haciendo el esquema de nuevo, pero sigue en las mismas, no lo entiendo...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: No cuenta TIMER0
« Respuesta #5 en: 03 de Diciembre de 2009, 09:24:33 »
Lo he revisado de nuevo: ¿qué hacen las funciones reset() e inicial() ?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: No cuenta TIMER0
« Respuesta #6 en: 03 de Diciembre de 2009, 09:30:25 »
Puede ser que en alguna de las funciones que no muestras estés actuando sobre el puerto A? Si es el caso, coloca #use fast_io(a) parta asegurar que no haya cambios en el tris del puerto por alguna mala implementación.


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

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: No cuenta TIMER0
« Respuesta #7 en: 03 de Diciembre de 2009, 09:57:31 »
Reset es una puesta a 0 de todas las variables al iniciar y al finalizar. Inicial es una simple pantalla de presentación al iniciar.

Código: C
  1. void reset(){                                        
  2. mil=0; dec=0; cen=0; uni=0;                  
  3. uni2=0; dec2=0; cen2=0; mil2=0;
  4. contador=0;
  5. output_b(0x00);
  6. Stop=0;
  7. lcd_putc("\f");                              
  8. }

e inicia..

Código: C
  1. void inicial()                                
  2. {
  3. lcd_gotoxy(2,1); lcd_putc("**************");  
  4. lcd_gotoxy(2,2); lcd_putc("INOXSTEEL 2009");  
  5. delay_ms(3000);
  6. lcd_putc("\f");
  7. }

He probado usando como interrupción para conteo RB0 a modo de prueba, pero tampoco va, la variable contador tampoco se  incrementa... mosca me tiene  :5]

SuKy, #use fast_io(a) está puesto al principio, pero no lo mostré por no poner mucho código, sorry  :oops:

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: No cuenta TIMER0
« Respuesta #8 en: 03 de Diciembre de 2009, 10:09:04 »
Pues a los 40 segundos en la simulación, después de setear los parámetros, empieza a contar...  :shock: en lo uno va a abrir la puerta, estaba contando.. pero lento... será el proteus??

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: No cuenta TIMER0
« Respuesta #9 en: 03 de Diciembre de 2009, 12:57:51 »
Me atrevería a asegurar que es el Proteus. En la parte de abajo tienes un indicador del tiempo de proceso, y cuando la simulación está agobiada, verás que los segundos del Proteus corren más lentos que el tiempo real. Seguramente en tu caso los 40 primeros segundos está corriendo muy lento.

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: No cuenta TIMER0
« Respuesta #10 en: 03 de Diciembre de 2009, 17:19:56 »
Pues el caso es que el tiempo corre bien y CPU Load está en un 30%, pero, si en vez de usar la función marcha, la incluímos en el main dentro de un while, funciona a partir de los 40 sec comentados, sin embargo reseteando el mclr una vez completa el while ya funciona bien...   :?

Código: C
  1. void main()                                
  2. {
  3. set_tris_a(0b111111);
  4. set_tris_b(0b11110001);
  5.  
  6.  
  7. lcd_init();
  8.  
  9. enable_interrupts(int_RTCC);
  10. setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
  11. enable_interrupts(int_EXT);
  12.  
  13. enable_interrupts(int_RB);
  14. ext_int_edge(L_TO_H);
  15. enable_interrupts(global);
  16.  
  17. clear_interrupt(int_RB);
  18. clear_interrupt(int_EXT);
  19. clear_interrupt(int_RTCC);
  20.  
  21. reset();                                      
  22.  
  23. lcd_init();                                  
  24.  
  25. inicial();
  26.  
  27.  while (stop==0)
  28.  {
  29.  
  30.  lcd_gotoxy(1,1);  lcd_putc("INTRODUCE EL N");      
  31.  lcd_gotoxy(15,1); lcd_putc(223);                        
  32.  lcd_gotoxy(1,2);  lcd_putc("DE ESPIRAS");
  33.  lcd_gotoxy(12,2); printf(lcd_putc,"%u",mil);                            
  34.  lcd_gotoxy(13,2); printf(lcd_putc,"%u",cen);    
  35.  lcd_gotoxy(14,2); printf(lcd_putc,"%u",dec);    
  36.  lcd_gotoxy(15,2); printf(lcd_putc,"%u",uni);  
  37.  
  38.  }
  39.  
  40. while (Stop==1)
  41.  {
  42.   lcd_gotoxy(1,1); printf(lcd_putc,"BOBINANDO.....");    
  43.   lcd_gotoxy(1,2);  lcd_putc("ESPIRAS N");
  44.   lcd_gotoxy(10,2); lcd_putc(223);
  45.   lcd_gotoxy(12,2); printf(lcd_putc,"%u",mil2);                          
  46.   lcd_gotoxy(13,2); printf(lcd_putc,"%u",cen2);    
  47.   lcd_gotoxy(14,2); printf(lcd_putc,"%u",dec2);    
  48.   lcd_gotoxy(15,2); printf(lcd_putc,"%u",uni2);  
  49.  
  50.  
  51. if (contador==1) {uni2++; contador=0;}      
  52. if (uni2>9) {dec2++; uni2=0;}                
  53. if (dec2>9) {cen2++; dec2=0;}
  54. if (cen2>9) {mil2++; cen2=0;}
  55.  
  56. if (mil2==mil && dec2==dec &&                              
  57. cen2==cen && uni2==uni)  {Stop=0; lcd_putc("\f"); fin();}    
  58. }
  59. }

Voy a probar con la 7.6 de proteus en vez de la 7.5 Sp3, a ver si cambia algo. Con el Pic Simulator si se ve como incrementa el timer0....

Total, 1 día prueba que te prueba pensando que funciona mal, cuando lo que supuestamente va mal es el simulador.

Un saludo.



 

anything