Autor Tema: :: Pruebas de timer con CCS ::  (Leído 5342 veces)

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

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
:: Pruebas de timer con CCS ::
« en: 24 de Julio de 2012, 15:52:25 »
Hola
estoy haciendo pruebas con los timer0 y timer 1 y ccs
pero parece que no funciona algo muy bien..

Código: C++
  1. #Priority INT_TIMER0, INT_TIMER1
  2. int8 proceso = 0;
  3.  
  4. #INT_TIMER0
  5. void prueba_timer0(void){
  6. output_high(PIN_B6);
  7. proceso=0;
  8. //proceso=proceso+1;
  9. }
  10.  
  11.  
  12. #INT_TIMER1
  13. void prueba1(void){
  14. output_high(PIN_B7);
  15. proceso=proceso+1;
  16. }
  17.  
  18. void main()
  19. {
  20.  
  21. int8 numero1=0;
  22. int8 numero2=0;
  23. int8 numero3=0;
  24.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  25.    setup_adc(ADC_CLOCK_DIV_2);
  26.    setup_spi(SPI_SS_DISABLED);
  27.    setup_wdt(WDT_OFF);
  28.    setup_timer_0(RTCC_INTERNAL);
  29.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  30.    //setup_timer_1(T1_DISABLED);
  31.    setup_timer_2(T2_DISABLED,0,1);
  32.    setup_comparator(NC_NC_NC_NC);
  33.    setup_vref(FALSE);
  34. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  35.  
  36.    // TODO: USER CODE!!
  37.    set_timer0(0); //rebasa en menor tiempo
  38.    set_timer1(15536); //rebasa a 10ms
  39.    While(true){
  40.    
  41.       if(proceso==1){
  42.          printf("\n\r proceso:0 numero: %d"numero1);
  43.          numero1=numero1+1;
  44.          //set_timer0(0);
  45.          output_low(PIN_B7);
  46.        }
  47.       if(proceso==2){
  48.          printf("\n\r proceso:1 numero: %d"numero1);
  49.          numero2=numero2+1;
  50.          //set_timer0(0);
  51.          output_low(PIN_B7);
  52.       }
  53.       if(proceso==3){
  54.          printf("\n\r proceso:2 numero: %d"numero1);
  55.          numero3=numero3+1;
  56.          //set_timer0(0);
  57.          output_low(PIN_B7);
  58.       }
  59.       if(proceso>3){
  60.          //proceso=0;
  61.          set_timer0(255); //rebasa a 10ms
  62.          set_timer1(15536); //rebasa a 10ms
  63.          
  64.       }
  65.       else{
  66.          printf("\n\r proceso= %d"proceso);
  67.       }
  68.  
  69.    }//fin while
  70.    
  71.  
  72. }

pongo el codigo, es muy sencillo pero no funciona.
solo imprime proceso 0
los timer en proteus se ven como corren como locos,
pero la funcion ni enciende led, ni incrementa variable ni na..

sigo luchando..

« Última modificación: 24 de Julio de 2012, 16:06:46 por pajaro »

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re: :: Pruebas de timer con CCS ::
« Respuesta #1 en: 24 de Julio de 2012, 18:17:09 »
Pues de momento veo un error, a la velocidad que cuentan los TIMER's y sin ningun tipo de retardo, contador o variable que cuente impulsos y al cabo de algunos de ellos, suficientes como para ver encender y apagar el led, pues lo encienda o apague.
Resumiendo, creo que funciona bien el programa, pero tu no ves los led's encenderse porque lo hacen tan rapidamente que no puedes verlo.

Saludos.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Pruebas de timer con CCS ::
« Respuesta #2 en: 24 de Julio de 2012, 19:35:51 »
Hola
la idea es sustituir los delay_ms() por una variable de timer
y lo mismo con el delay_us(), sustituirlos con variables de timer
por ejemplo que se aumenten con cada interrupcion.

tendre que orientar de otra forma esto de los timer.

sigo rulando

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: :: Pruebas de timer con CCS ::
« Respuesta #3 en: 25 de Julio de 2012, 01:53:24 »
un problema que veo es que con tu timer 0 estas reinciando tu variable proceso, como tu timmer0 se desborda antes que el 1, no dejes que tu variable se incremente, ya que siempre se vuelve a 0 antes que de que el timer1 la incremente
"Nada es imposible, no si puedes imaginarlo"

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Pruebas de timer con CCS ::
« Respuesta #4 en: 25 de Julio de 2012, 07:12:38 »
Hola
bueno dado que ese no funciona voy por partes

configura el timer 0 a 8 bit para que a cada interrumcion
cunata de 00 a FF y cuando pasa de FF a 00 hace interrrupcion
aumente una variable y se muestre el incremento en un buclue while.
para los led uso:
#USE FAST_IO

main.h

Código: C++
  1. #include <18F2550.h>
  2. #device adc=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  6. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES BORV20                   //Brownout reset at 2.0V
  10. #FUSES NOPUT                    //No Power Up Timer
  11. #FUSES NOCPD                    //No EE protection
  12. #FUSES STVREN                   //Stack full/underflow will cause reset
  13. #FUSES NODEBUG                  //No Debug mode for ICD
  14. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  15. #FUSES NOWRT                    //Program memory not write protected
  16. #FUSES NOWRTD                   //Data EEPROM not write protected
  17. #FUSES IESO                     //Internal External Switch Over mode enabled
  18. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  19. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  20. #FUSES NOWRTC                   //configuration not registers write protected
  21. #FUSES NOWRTB                   //Boot block not write protected
  22. #FUSES NOEBTR                   //Memory not protected from table reads
  23. #FUSES NOEBTRB                  //Boot block not protected from table reads
  24. #FUSES NOCPB                    //No Boot Block code protection
  25. #FUSES MCLR                     //Master Clear pin enabled
  26. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  27. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  28. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  29. #FUSES CPUDIV4                  //System Clock by 4
  30. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  31. #FUSES VREGEN                   //USB voltage regulator enabled
  32.  
  33. #use delay(clock=20000000)
  34. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  35. #use fast_io(B)

main.c
Código: C++
  1. ....
  2.  
  3. int8 tm0=0;
  4.  
  5. #INT_TIMER0
  6. void prueba_timer0(void){
  7.    output_high(PIN_B6);
  8.    tm0=tm0+1;
  9. }
  10.  
  11.  
  12. void main()
  13. {
  14.  
  15.    setup_adc_ports(NO_ANALOGS);
  16.    setup_adc(adc_off);
  17.    setup_spi(SPI_SS_DISABLED);
  18.    setup_wdt(WDT_OFF);
  19.    setup_timer_0(RTCC_INTERNAL|RTCC_8_bit);
  20.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  21.    //setup_timer_1(T1_DISABLED);
  22.    setup_timer_2(T2_DISABLED,0,1);
  23.    setup_comparator(NC_NC_NC_NC);
  24.    setup_vref(FALSE);
  25. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  26.  
  27.    // TODO: USER CODE!!
  28.    //set_timer0(0); //retardo de led
  29.    //set_timer1(0); //retardo inc proceso
  30.    enable_interrupts(int_timer0);
  31.    enable_interrupts(global);
  32.    While(true){
  33.    
  34.    printf("\n\r tm0: %u"tm0);
  35.  
  36.  
  37.    }//fin while
  38.    
  39.  
  40. }


Con lo sencillo que es esto, no funciona

¿Cual puede ser el error?
con proteus veo como desborda el timer pero
nunca incrementa la variable tambien intente poner el prinf dentro de la interrupcion
y nada al final lo deje dentro del bucle.
si cnt es variable global, y entra en la interupcion
¿Por que no enciende el led ?
¿Porque no incrementa la variable?


sigo con esto..

bueno olvide esto:
  enable_interrupts(int_timer0);
  enable_interrupts(global);
pero sigue sin encender el led.. veo que tendre que hacerlo por variable

sigo indagando..


« Última modificación: 25 de Julio de 2012, 11:06:01 por pajaro »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: :: Pruebas de timer con CCS ::
« Respuesta #5 en: 25 de Julio de 2012, 07:57:14 »
tu configuracion del adc esta mal, si no vas a usar ningun puerto analogico solo ponle, setup_adc_ports(no_analogs) y apagas el adc, setup_adc(adc_off).

podrias poner tu codigo completo, en esta parte no veo el error, tal vez sea el wdt o el mclr y tu micro se esta reseteando siempre, a que velocidad tienes tu cristal?, por ejemlo  con un cristal de 8MHz tu timer se desborda cada127us
"Nada es imposible, no si puedes imaginarlo"

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Pruebas de timer con CCS ::
« Respuesta #6 en: 25 de Julio de 2012, 11:03:27 »
Hola
modifique el fuente y agregue main.h
que es la cabecera..

sigo rulando..


Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: :: Pruebas de timer con CCS ::
« Respuesta #7 en: 25 de Julio de 2012, 14:00:50 »
Tienes activado el master clear, checa que en tu conexion tengas el pin correpondiente conectado a vdd para que el micro no se resetee.

tambien en tus fuses primero desactivas el wdt e inmediatamente despues lo activas, si lo vas a dejar activado necesitas estar reseteando el contador del wdt periodicamente

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale

"Nada es imposible, no si puedes imaginarlo"

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Pruebas de timer con CCS ::
« Respuesta #8 en: 25 de Julio de 2012, 19:24:33 »
Hola compañero

eso ultimo que me cometas no lo entendi,
si te refieres a que si tengo el MCLR conectado a vcc te dire que si que lo esta a vcc.

un saludo.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: :: Pruebas de timer con CCS ::
« Respuesta #9 en: 25 de Julio de 2012, 19:31:24 »
tambien en tus fuses primero desactivas el wdt e inmediatamente despues lo activas, si lo vas a dejar activado necesitas estar reseteando el contador del wdt periodicamente

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale


Son dos bit de configuración distintos, uno habilita/deshabilita el WDT, y los otros configuran el postcaler  ;-)


Después respecto al primer ejemplo, pajaro a que periodo se interrumpe el timer0 y a que periodo se interrumpe el timer1 ?

Porque usas fast_io(B)? .. Al utilizarlo no te falta algo al iniciar si quieres prender un led?

« Última modificación: 25 de Julio de 2012, 19:34:14 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado PCCM

  • PIC16
  • ***
  • Mensajes: 109
Re: :: Pruebas de timer con CCS ::
« Respuesta #10 en: 25 de Julio de 2012, 19:59:17 »
Solo borra o comenta  #use fast_io(B)
Si ves que se desborda en proteus(supongo que lo estaras viendo en modo debug), entonces está bien, seguro habrás conectado mal tu terminal virtual, recuerda que para el pic es TX y para el virtual terminal su correspondiente es RX.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Pruebas de timer con CCS ::
« Respuesta #11 en: 25 de Julio de 2012, 21:04:38 »
Hola a Tod@s

uso el fas_io porque lei en algun hilo que se gana velocidad al uso con los timer
ya que ganaba rapidez porque dismunia instruciones y que al usar output_high o output_low
ya lo entendia el compilador algo asi era, creo que me debe de faltar el set_tris_x();.. verdad..

En resumen se ganaba velocidad de ejecución solo por eso, eso decian ...yo aun no he
tenido oportunidad de verificar tal cosa.

Gracias por vuestros aportes.

voy a verificar mas cosas..

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: Pruebas de timer con CCS ::
« Respuesta #12 en: 25 de Julio de 2012, 22:12:30 »
  Sí, falta set_tris.... para configurar el puerto como salida. Aún así, es raro que no se incremente la variable tm0.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: :: Pruebas de timer con CCS ::
« Respuesta #13 en: 25 de Julio de 2012, 22:14:21 »
Si es correcto, esos ciclos de menos que comentas es porque la función no setea el pin como entrada o salida, y es el programador que tiene que hacerlo  :roll:  Después, sería bueno que calcularas los periodos de los timers, como para ver si es lo que esperabas.
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Pruebas de timer con CCS ::
« Respuesta #14 en: 26 de Julio de 2012, 06:46:05 »
Hola

En el caso 1:
el led se enciande para saber que entra en la Int
y eso si que funciona, lo malo es que no muestra
el printeo .
He pensado que puede que sea por que la interupcion a ser de 8 bit
ff----256--x0.2us hay interrupcion cada 52.2 us y esto
sature el programa y no permita el avance
lo voy a modificar para que dentro de la interupcion la deshabilite
y una vez printeado la vuelva a activar a ver si asi funciona.

- - - - - - - -
En el caso 2:

 el timer0 rebasa cada 256 pasos
si el cristal es de 20Mhz  cada tick es de 0.2 us

por lo tanto cada rebase lo hace cada 51.2 us

si incremento la variable en cada interrupcion
y en el while le pongo que haga algo con el
incremento de la interrupcion mediante una variable
no hace nada.
por el contrario en el debug de proteus se ve al timer coriendo
como loco.

esto es una locura..

« Última modificación: 26 de Julio de 2012, 06:59:23 por pajaro »


 

anything