Autor Tema: 16F88 - TMR0 - problemas  (Leído 6708 veces)

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

Desconectado TheBlooD

  • PIC12
  • **
  • Mensajes: 66
16F88 - TMR0 - problemas
« en: 09 de Diciembre de 2010, 09:38:57 »
Hola a todos,

Estoy intentando crear un dispositivo que cuente minutos y segundos, cuando comienze un minuto debe activar un rele durante los primeros 20 segundos del minuto, continuar hasta llegar a un nuevo minuto y volver a comenzar.
A su vez el dispositivo parpadea en cada segundo transcurrido.

Los problemas que encuentro es que no termina de funcionar correctamente, hay momentos que comienza a funcionar bien pero luego deja de hacerlo y no guarda los tiempos de espera, en otras ocasiones directamente no funciona bien, se desajustan los tiempos y en lugar de estar 20 segundos esta mas o menos, y en lugar de hacerlo cada minuto lo hace segun le parece.


Utilizo el oscilador interno a 8MHz, el TMR0 con un prescaler de 1:128 y con una carga de 131, de este modo salta cada 8ms exactos

¿Que puede estar ocurriendo?


Código: [Seleccionar]

OSCCON = %01111101  '8 MHz Oscilador Interno

AllDigital

TRISB.4 = 0
TRISB.5 = 0

Dim mseg As Word
Dim segundos As Byte
Dim seg_wait As Word
Dim minutos As Byte
Dim horas As Byte
Dim prog_e As Bit


OPTION_REG.T0CS = 0  'selecciona reloj interno
OPTION_REG.PSA = 0  'asigna el prescales al timer0
OPTION_REG.PS0 = 0  'bits de la seleccion del factor de division,prescaler 128
OPTION_REG.PS1 = 1  'bits de la seleccion del factor de division,prescaler 128
OPTION_REG.PS2 = 1  'bits de la seleccion del factor de division,prescaler 128

INTCON.GIE = 1  'habilita todas las interrupciones globales
INTCON.TMR0IF = 0  'borra el flag de desbordamiento del timer0
TMR0 = 131  'cargo el registro del tmr0 para que desborde cada 1mS
INTCON.TMR0IE = 1  'habilita las interrupciones del timer0


mseg = 0
segundos = 0
seg_wait = 0
minutos = 0
horas = 0

loop:

'SE CALCULAN LOS SEGUNDOS
If mseg = 1000 Then

Toggle PORTB.4

segundos = segundos + 1
seg_wait = seg_wait + 1

mseg = 0

Endif

'SE CALCULAN LOS MINUTOS
If segundos = 60 Then

minutos = minutos + 1
segundos = 0

Endif

'SE CALCULAN LAS HORAS
If minutos = 60 Then

horas = horas + 1
minutos = 0

Endif

'SE COMPRUEBA SI HA LLEGADO AL LIMITE
If minutos = 1 Then

mseg = 0
segundos = 0
seg_wait = 0
minutos = 0
horas = 0

PORTB.5 = 1
prog_e = 1

Endif

'COMPRUEBA SI HA PASADO EL TIEMPO EN ACTIVO
If prog_e = 1 Then

If seg_wait = 20 Then

PORTB.5 = 0
prog_e = 0
seg_wait = 0

Endif

Endif

Goto loop


End                                               

On Interrupt

mseg = mseg + 8

TMR0 = 131
INTCON.TMR0IF = 0

Resume



Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: 16F88 - TMR0 - problemas
« Respuesta #1 en: 09 de Diciembre de 2010, 09:52:42 »
No he comprobado el programa, pero supongo que la palabra de configuración de bit o fuses esta correcta.
De todas formas te la dejo aquí:
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffd
Saludos desde Granada, España.

Desconectado TheBlooD

  • PIC12
  • **
  • Mensajes: 66
Re: 16F88 - TMR0 - problemas
« Respuesta #2 en: 09 de Diciembre de 2010, 10:55:54 »
Con PSI configuro los fuses directamente desde el panel "Configuration Bits" y se supone que realiza todo lo necesario. Provaré a incluir en el código lo que has indicado a ver si funciona correctamente.

Gracias

Desconectado TheBlooD

  • PIC12
  • **
  • Mensajes: 66
Re: 16F88 - TMR0 - problemas
« Respuesta #3 en: 09 de Diciembre de 2010, 15:58:05 »
Pues nada, sigue fallando igual de mal...

No entiendo que pasa porque los parpadeos del led en cada segundo se realizan correctamente.

Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: 16F88 - TMR0 - problemas
« Respuesta #4 en: 09 de Diciembre de 2010, 19:51:59 »
Si no añades "save system" en la rutina de interrupciones los valores de los cálculos intermedios de las variables de más de 1Byte de longitud se pueden corromper.
On Interrupt
Save System
   mseg = mseg + 8

   TMR0 = 131
   INTCON.TMR0IF = 0
   
Resume 

Si después de esto sigue sin funcionar a ver si encuentro un rato libre y te miro el código con más detalle.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: 16F88 - TMR0 - problemas
« Respuesta #5 en: 10 de Diciembre de 2010, 09:47:56 »
He podido de dicarle un poco de tiempo y he localizado algunos problemas, hay If que no se cumplen.

Código: Visual Basic
  1. Define CONF_WORD = 0x2f50
  2. Define CONF_WORD_2 = 0x3ffd
  3. Define CLOCK_FREQUENCY = 8
  4. '*******************
  5. OSCCON = %01111101  '8 MHz Oscilador Interno
  6. AllDigital
  7. TRISB.4 = 0
  8. TRISB.5 = 0
  9. '*********************
  10. Dim mseg As Word
  11. Dim segundos As Byte
  12. Dim seg_wait As Word
  13. Dim minutos As Byte
  14. Dim horas As Byte
  15. Dim prog_e As Bit
  16. '*********************
  17. OPTION_REG.T0CS = 0  'selecciona reloj interno
  18. OPTION_REG.PSA = 0  'asigna el prescales al timer0
  19. OPTION_REG.PS0 = 0  'bits de la seleccion del factor de division,prescaler 128
  20. OPTION_REG.PS1 = 1  'bits de la seleccion del factor de division,prescaler 128
  21. OPTION_REG.PS2 = 1  'bits de la seleccion del factor de division,prescaler 128
  22. INTCON.GIE = 1  'habilita todas las interrupciones globales
  23. INTCON.TMR0IF = 0  'borra el flag de desbordamiento del timer0
  24. TMR0 = 131  'cargo el registro del tmr0 para que desborde cada 1mS
  25. INTCON.TMR0IE = 1  'habilita las interrupciones del timer0
  26. '********************
  27. mseg = 0
  28. segundos = 0
  29. seg_wait = 0
  30. minutos = 0
  31. horas = 0
  32. loop:
  33.         'SE CALCULAN LOS SEGUNDOS
  34.         If mseg >= 10 Then
  35.                 Toggle PORTB.4
  36.                 segundos = segundos + 1
  37.                 seg_wait = seg_wait + 1
  38.                 mseg = 0
  39.         Endif
  40.         'SE CALCULAN LOS MINUTOS
  41.         If segundos >= 15 Then
  42.                 minutos = minutos + 1
  43.                 segundos = 0
  44.         Endif
  45.         'SE CALCULAN LAS HORAS
  46.         If minutos >= 15 Then
  47.                 horas = horas + 1
  48.                 minutos = 0
  49.         Endif
  50.         'SE COMPRUEBA SI HA LLEGADO AL LIMITE
  51.         If minutos >= 5 Then
  52.                 mseg = 0
  53.                 segundos = 0
  54.                 seg_wait = 0
  55.                 minutos = 0
  56.                 horas = 0
  57.                 PORTB.5 = 1
  58.                 prog_e = 1
  59.         Endif
  60.         'COMPRUEBA SI HA PASADO EL TIEMPO EN ACTIVO
  61.         If prog_e = 1 Then
  62.                 If seg_wait >= 20 Then
  63.                         PORTB.5 = 0
  64.                         prog_e = 0
  65.                         seg_wait = 0
  66.                 Endif
  67.         Endif
  68. Goto loop
  69. End                                              
  70. On Interrupt
  71. Save System
  72.         mseg = mseg + 8
  73.         TMR0 = 131
  74.         INTCON.TMR0IF = 0
  75. Resume
Saludos desde Granada, España.

Desconectado TheBlooD

  • PIC12
  • **
  • Mensajes: 66
Re: 16F88 - TMR0 - problemas
« Respuesta #6 en: 10 de Diciembre de 2010, 11:15:22 »
Pues no hay forma.

Supongo que has cambiado los valores para simularlo de una forma mas rapida, pero cambiando yo de nuevo los mseg=1000 y los minutos a 60 segundos sigue sin funcionar.
Con Save System cuando deberia estar activo comienza a parpadear muy rapido, además de no guardar el minuto, lo hace a los 30 seg o menos...
Si se lo quito lo sigue haciendo mal, pero la luz se mantiene activa sin parpadear pero por muy poco tiempo y tambien varia el tiempo.

Algo tan simple y me esta trayendo por la calle de la amargura.

Te agradezco mucho tu interés, ya no se ni que hacerle...

Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: 16F88 - TMR0 - problemas
« Respuesta #7 en: 11 de Diciembre de 2010, 00:29:04 »
Este si:

Código: Visual Basic
  1. 'Probado en la Pic EBasic ******************
  2. Define CONF_WORD = 0x2f50
  3. Define CONF_WORD_2 = 0x3ffd
  4. Define CLOCK_FREQUENCY = 8
  5. '*******
  6. Symbol ledverde = RB0
  7. Symbol ledamarillo = RA7
  8. Const ledon = 0
  9. Const ledoff = 1
  10. '*******
  11. Dim mseg As Word
  12. Dim segundos As Byte
  13. Dim seg_wait As Word
  14. Dim minutos As Byte
  15. Dim horas As Byte
  16. Dim prog_e As Bit
  17. '********
  18. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  19. CMCON = 0x07  'comparador a off
  20. AllDigital
  21. TRISA = 0xff
  22. TRISB = 0xff
  23. TRISB.0 = 0  'Led verde, false
  24. TRISA.7 = 0  'Led amarillo, false
  25. '*******
  26. OPTION_REG.T0CS = 0  'selecciona reloj interno
  27. OPTION_REG.PSA = 0  'asigna el prescales al timer0
  28. OPTION_REG.PS0 = 0  'bits de la seleccion del factor de division,prescaler 128
  29. OPTION_REG.PS1 = 1  'bits de la seleccion del factor de division,prescaler 128
  30. OPTION_REG.PS2 = 1  'bits de la seleccion del factor de division,prescaler 128
  31. '*********
  32. INTCON.TMR0IF = 0  'borra el flag de desbordamiento del timer0
  33. TMR0 = 0xf0  'cargo el registro del tmr0 para que desborde cada 1mS
  34. INTCON.TMR0IE = 1  'habilita las interrupciones del timer0
  35. INTCON.PEIE = 1  'Habilitacion de interrupciones de perifericos
  36. Enable  'INTCON.GIE habilita todas las interrupciones globales
  37. '*******
  38. mseg = 0
  39. segundos = 0
  40. seg_wait = 0
  41. minutos = 0
  42. horas = 0
  43. prog_e = 0
  44. ledverde = ledoff
  45. ledamarillo = ledoff
  46. '********
  47. loop:
  48.         'SE CALCULAN LOS SEGUNDOS
  49.         If mseg >= 1000 Then
  50.                 Toggle ledverde  'portb.4
  51.                 segundos = segundos + 1
  52.                 seg_wait = seg_wait + 1
  53.                 mseg = 0
  54.         Endif
  55.         'SE CALCULAN LOS MINUTOS
  56.         If segundos >= 60 Then
  57.                 minutos = minutos + 1
  58.                 segundos = 0
  59.         Endif
  60.         'SE CALCULAN LAS HORAS
  61.         If minutos >= 60 Then
  62.                 horas = horas + 1
  63.                 minutos = 0
  64.         Endif
  65.         'SE COMPRUEBA SI HA LLEGADO AL LIMITE
  66.         If minutos = 1 And prog_e = 0 Then
  67.                 mseg = 0
  68.                 segundos = 0
  69.                 seg_wait = 0
  70.                 minutos = 0
  71.                 horas = 0
  72.                 ledamarillo = ledon  'portb.5 = 1
  73.                 prog_e = 1
  74.         Endif
  75.         'COMPRUEBA SI HA PASADO EL TIEMPO EN ACTIVO
  76.         If prog_e = 1 Then
  77.                 If seg_wait >= 20 Then
  78.                         ledamarillo = ledoff  'portb.5 = 0
  79.                         prog_e = 0
  80.                         seg_wait = 0
  81.                         'segundos = 0 '/* Si no se pone a cero este tiempo se acumula
  82.                         'minutos = 0 ' y da la sensación de que se acortan los tiempos en 20seg.
  83.                         'horas = 0 '*/
  84.                 Endif
  85.         Endif
  86. Goto loop
  87. End                                              
  88. On Interrupt
  89. Save System
  90.         mseg = mseg + 1
  91.         TMR0 = 0xf0
  92.         INTCON.TMR0IF = 0
  93. Resume
« Última modificación: 11 de Diciembre de 2010, 00:33:44 por dogflu66 »
Saludos desde Granada, España.

Desconectado TheBlooD

  • PIC12
  • **
  • Mensajes: 66
Re: 16F88 - TMR0 - problemas
« Respuesta #8 en: 11 de Diciembre de 2010, 12:37:52 »
Segun he leido lo has provado en una placa entrenadora, pero a mi sigue sin funcionarme, sigue haciendo parpadeos ininterrunpidamente del led amarillo.

Pongo aqui el diagrama que tengo montado en una protoboard, a ver que puede pasar.




He cambiado los puertos RA1 y RA0 por los correspondientes en el código que has posteado.
Tambien he cambiado el PIC por otro nuevo pensando que podria estar dañado, pero funciona igual de mal.

Saludos
« Última modificación: 11 de Diciembre de 2010, 12:40:54 por TheBlooD »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: 16F88 - TMR0 - problemas
« Respuesta #9 en: 11 de Diciembre de 2010, 13:20:43 »
¿Exactamente así lo tienes construido?, ¿sin desparasitarios?
Así y tal lo tienes solo es un circuito para simular. Hasta que no hagas las correcciones necesarias no podrás estar seguro de donde te viene el problema, y aunque llegara a funcionar no seria fiable.
Saludos desde Granada, España.

Desconectado TheBlooD

  • PIC12
  • **
  • Mensajes: 66
Re: 16F88 - TMR0 - problemas
« Respuesta #10 en: 11 de Diciembre de 2010, 13:47:08 »
Exactamente asi lo tengo montado en la protoboard, salvo por la diferencia del circuito de alimentacion que no lo tengo puesto que estoy realizando las pruebas con una fuente ATX modificada.
La entrada al circuito iria (una vez acabado) mediante una bateria de 12V.

Aunque este no es el foro adecuado ya aprovecho este hilo... ¿que le haria falta a este circuito? El primero que intento montar y se me acumulan los problemas.

Saludos

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: 16F88 - TMR0 - problemas
« Respuesta #11 en: 11 de Diciembre de 2010, 13:58:48 »
Pues no tiene nada que ver con Basic pero..No crees que usar un RELE para esa tarea no es lo adecuado?...Digo por la cantidad de conmutaciones que debe hacer y pues cada minuto ON..OFF y repite y repite toda la vida, no creo sea lo adecuado, se desgastarían los contactos muy rápido, seria recomendable uno de estado solido.

SALUDOS!

Desconectado TheBlooD

  • PIC12
  • **
  • Mensajes: 66
Re: 16F88 - TMR0 - problemas
« Respuesta #12 en: 11 de Diciembre de 2010, 14:05:14 »
te explico, el usar esos tiempos es para poder comprobar que funciona bien, luego se cambiarian a 2 min cada 24 o 48 horas... con lo cual no tendria ese desgaste que comentas.

Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: 16F88 - TMR0 - problemas
« Respuesta #13 en: 11 de Diciembre de 2010, 14:32:23 »
Ok, aqui te dejo lo minimo que añadiria a ese circuito:

Saludos desde Granada, España.

Desconectado TheBlooD

  • PIC12
  • **
  • Mensajes: 66
Re: 16F88 - TMR0 - problemas
« Respuesta #14 en: 11 de Diciembre de 2010, 14:55:44 »
No sabes cuanto te agradezco tu ayuda. Ahora mismo me pondré manos a la obra a ver que tal sale esto...


 

anything