Autor Tema: [Solucionado] Timer 1 y SLEEP  (Leído 3527 veces)

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

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
[Solucionado] Timer 1 y SLEEP
« en: 12 de Marzo de 2015, 15:45:19 »
Hola a los amigos del foro:
Estoy trabajando en un proyecto y tengo una duda que me tiene detenido, he usado el buscador pero no he encontrado respuesta, a ver si alguien me ayuda.
Estoy usando el timer1 como contador para leer los pulsos de un cuarzo conectado externamente a un 16f628a por los pines rb6 y rb7, la idea es poder despertar el pic cada 1 segundo usando la interrupción del timer 1. El problema es que necesito poner el pic en modo SLEEP en determinadas situaciones y entonces viene la duda:
Normalmente, el timer 1 lo uso como contador sincrónico, esta manera es la que recomienda microchip cuando se necesitan hacer lecturas desde el timer1; pero este modo no funciona en modo SLEEP. Para poder usar el timer1 en modo SLEEP debo de habilitar el timer 1 en  modo contador asincrónico.
¿Alguien sabe alguna manera de usar el timer 1 en modo contador para que cuente normal mientras está despierto el pic, luego se ponga en modo Sleep, despierte cada 1 segundo y luego siga contando mientras está despierto?
Uso CCS para programar, cualquier sugerencia sería bien recibida.
« Última modificación: 18 de Marzo de 2015, 11:40:36 por rafaelrg06 »

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Re: Timer 1 y SLEEP
« Respuesta #1 en: 17 de Marzo de 2015, 16:58:29 »
En síntesis necesito saber si usando el modo contador asincrónico puedo leer el timer1 sin que se detenga (usando CCS) para poder, de esta forma ponerlo en modo sleep y seguir leyendo el timer1 una vez que esté despierto.
Cualquier ayuda sería bien recibida

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Timer 1 y SLEEP
« Respuesta #2 en: 17 de Marzo de 2015, 17:35:33 »
Realmente no habia entendido lo que habias puesto, pero todo se puede :3.

7.3 Timer1 Operation in Asynchronous Counter Mode

The timer will continue to run during SLEEP and can generate an interrupt on overflow which will wake-up the processor. However, special precautions in software are needed to read/write the timer (Section 7.3.2).

For writes, it is recommended that the user simply stop the timer and write the desired values.
Reading the 16-bit value requires some care. Example 7-1 is an example routine to read the 16-bit timer value. This is useful if the timer cannot be stopped.

Código: ASM
  1. ; All interrupts are disabled
  2. MOVF TMR1H, W ;Read high byte
  3. MOVWF TMPH ;
  4. MOVF TMR1L, W ;Read low byte
  5. MOVWF TMPL ;
  6. MOVF TMR1H, W ;Read high byte
  7. SUBWF TMPH, W ;Sub 1st read
  8. ; with 2nd read
  9. BTFSC STATUS,Z ;Is result = 0
  10. GOTO CONTINUE ;Good 16-bit read
  11. ;
  12. ; TMR1L may have rolled over between the read
  13. ; of the high and low bytes. Reading the high
  14. ; and low bytes now will read a good value.
  15. ;
  16. MOVF TMR1H, W ;Read high byte
  17. MOVWF TMPH ;
  18. MOVF TMR1L, W ;Read low byte
  19. MOVWF TMPL ;
  20. ; Re-enable the Interrupts (if required)
  21. CONTINUE

En fin si no te interesa mucho el ASM.
Copia la parte alta y luego la baja a dos variables de 8 bits, como puede haber habido un overflow (cuando copiaba la parte baja) entonces pregunta nuevamente por la parte alta, si es la misma que la primera ves que lo copio entonces sale. Si es distinto quiere decir que entro un pulso por TMR1, de esa forma vuelve a cargar los datos de nuevo en las variables sabiendo que ya cambio Y que el procesador es mas rapido que los pulsos.

El TMR1 como ves dice que continua corriendo en SLEEP, asi que te puede incluso despertar el TMR1, y para eso solo lees el flag, si no te desperto eso y fue otra cosa, entonces podes usar el codigo de arriba o pasarlo a C es lo mismo (ya que es bastante simple).
« Última modificación: 17 de Marzo de 2015, 17:38:35 por KILLERJC »

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
[Solucionado] Timer 1 y SLEEP
« Respuesta #3 en: 18 de Marzo de 2015, 11:36:36 »
Muchas gracias KILLERJC, lo he entendido todo.
Verdaderamente había visto este código en el datasheet, pero no lo entendí, ya que trato de usar el CCS para evitar a toda costa el ensamblador; pero tu explicación me ha esclarecido todo. Por supuesto que el timer1 lo voy a configurar en modo asincrónico y lo leeré tal y como me explicas (que dicho sea de paso es lo recomendado por microchip).
En cuanto al CCS y el assembler, me he dado cuenta que es hora de "ponerme al día" con el ensamblador, ya que además detecté un posible BUG en el CCS y en fin... el ensamblador y el datasheet son la única cosa fiable hasta ahora (aún cuando pienso seguir usando CCS).

Muchas gracias ((:-)) :-/
« Última modificación: 18 de Marzo de 2015, 11:39:29 por rafaelrg06 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: [Solucionado] Timer 1 y SLEEP
« Respuesta #4 en: 18 de Marzo de 2015, 17:25:29 »
Yo lo veo facil al ASM. lo que tenes que recordar es que trabajas con micros de 8 bits, asi que si tenes una variable de 16 bits en C significan que por dentro son 2 registros.
Al igual que muchas veces veo gente que prefiere tomar 15 muestras y dividir por 15, tomando muchos ciclos de reloj, cuando si lo haces por una potencia de 2 (ejemplo 16), es solo rotar el dato