• Domingo 22 de Diciembre de 2024, 08:17

Autor Tema:  Uso Del Tmr1 En El 16f876  (Leído 3124 veces)

Kain589

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Uso Del Tmr1 En El 16f876
« en: Jueves 5 de Enero de 2006, 22:23 »
0
A ver si me pueden ayudar, el problema es que no consigo hacerlo funcional, creo que el fallo puede estar en el bucle infinito de temporizacion que quiero crear, y que variara las salidas por la interrupcion
Código: Text
  1. list p = 16f876;
  2. #include <p16f876.inc>
  3. ;temporiza y parpadea portb,0
  4. CONTADOR  EQU  20H
  5. TRANSICION  EQU 21H
  6.  
  7. ORG 00H
  8.   GOTO INICIO
  9.   ORG  04H
  10.   BCF    PIR1,0;Borro bandera
  11.   DECFSZ  CONTADOR
  12.   GOTO   CONTINUA;Va a retornar de la int,
  13.   BSF    TRANSICION,0
  14.   GOTO  VERSAL
  15. VERSAL
  16.   MOVLW  0C8H;realiza 200 temporizaciones antes de variar salida
  17.   MOVWF  CONTADOR
  18.   BTFSS  PORTB,0;Analiza la salida
  19.   GOTO   ACTIVAR;Va a activar salida
  20.   BCF    PORTB,0;DESACTIVA
  21. CONTINUA  
  22.   RETFIE
  23. ACTIVAR
  24.   BSF    PORTB,0;activa
  25.   RETFIE
  26.  
  27. INICIO
  28.   BCF    STATUS,6
  29.   BSF    STATUS,5;banco 1
  30.   CLRF  TRISB;B  SALIDA
  31.   MOVLW  01H;HABILITA TMR1E
  32.   MOVWF  PIE1
  33.   MOVLW  0C0H;
  34.   MOVWF  INTCON;HABILITA GIE Y PERIFERICOS
  35.   BCF    STATUS,5;BANCO 0
  36.   CLRF  PORTB
  37.   BSF    PORTB,1;COMPROBAR SI FUNCIONA EL MICRO
  38. TIEMPO
  39.   BCF    T1CON,0;desactivo el temp
  40.   MOVLW  0DCH
  41.   MOVWF  TMR1L;CARGA TIMER1BAJO
  42.   MOVLW  0BH
  43.   MOVWF  TMR1H;CARGA TIMER1ALTO
  44.   MOVLW  31H
  45.   MOVWF  T1CON;PRESCALER 8 Y ACTIVA
  46. NADA
  47.   GOTO  NADA
  48.   GOTO  TIEMPO
  49.  
  50.   END
  51.  

Cuando entro en el bucle NADA el PC apuntará a la siguiente instruccion, asi que al retornar de la interrupcion ira a goto tiempo, a lo mejor esto que he dado por supuesto esta mal. No se que pùede estar mal, a ver si me pueden sugerir como hacerlo andar, gracias

Huguen_aus_Tirol

  • Miembro MUY activo
  • ***
  • Mensajes: 318
    • Ver Perfil
    • http://www.erhard-automation.co.cc
Re: Uso Del Tmr1 En El 16f876
« Respuesta #1 en: Jueves 5 de Enero de 2006, 23:13 »
0
Hola!
Bueno, vamos por partes, dijo Jack el destripador...
En primer lugar, sería bueno que al entrar a la interrupción guardes lo que esté en W y en el registro STATUS. Ya se que de NADA saltas a NADA, pero, y antes de eso? Al salir de la interrupción restableces los valores de W y STATUS (en el DS del 16F876 encontrarás el truquito de hacerlo simplemente)
En segundo lugar, al entrar a la interrupción chequea que realmente sea el bit del timer 1 el que genera la interrupción. Ya sé, son costumbres, pero las buenas costumbres no vienen mal :)
Tercero, deberías recargar el timer 1 (TMR1H y TMR1L) no solo al inicio del programa, sino cada vez que se genere una interrupción del timer 1
Cuarto, cuando estés en la dirección NADA, estarás siempre en NADA (perdón, el micro ;) ) Nunca más, salvo un reset, volverá a la dirección TIEMPO.

Prueba y nos cuentas!

Saludos :hola:

Kain589

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Uso Del Tmr1 En El 16f876
« Respuesta #2 en: Jueves 5 de Enero de 2006, 23:49 »
0
Gracias por tu ayuda, lo de no salvar w y status en la interrupcion es porque es solo una prueba, status no se modifica y w aunque se modifica se escribe antes de usar su valor, sé que en un programa de "verdad" es necesario pero aqui solo queria comprobar su funcionamiento, y lo de no verificar la bandera no lo hacia por lo mismo.
He probado a recargar TMR1L/R, asi como T1CON, antes de retornar de la interrupcion, pero sigue sin funcionar.
Lo de "goto tiempo", crei que lo haria pues tras ejecutar el "goto nada" el puntero estaria apuntando (valga la redundancia)a la siguiente "goto tiempo", y al retornar de la interrupcion la ejecutaria

Huguen_aus_Tirol

  • Miembro MUY activo
  • ***
  • Mensajes: 318
    • Ver Perfil
    • http://www.erhard-automation.co.cc
Re: Uso Del Tmr1 En El 16f876
« Respuesta #3 en: Viernes 6 de Enero de 2006, 09:51 »
0
Hola! Estuve viendo en detalle el programa, y debería hacer parpadear al led; al menos la configuración de los registros y demás está bien...
Creo que deberías revisar el hard, y también como configuras los bits de configuración al programar le micro.

Saludos

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Uso Del Tmr1 En El 16f876
« Respuesta #4 en: Sábado 7 de Enero de 2006, 13:20 »
0
Holas, el programa nunca llegara a la etiqueta TIEMPO porque cuando se produce una interrupción el pic deja automáticamente lo que esta haciendo, va directo a la dirección 04h de programa y ejecuta lo que encuentra a partir de ahí hasta encontrarse con la instrucción "RETFIE" que le hara abandonar la interrupción y volver al lugar donde se encontraba antes de producirse dicha interrupción, osea, a "NADA"... talves para que funcione deberias hacer una llamada a TIEMPO antes de la instruccion RETFIE.. Saludos :)
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

Kain589

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Uso Del Tmr1 En El 16f876
« Respuesta #5 en: Sábado 7 de Enero de 2006, 15:07 »
0
Lo he intentado recargando y activando el timer antes de retornar de la interrupcion y tampoco me funciona, es decir antes de retornar, desactivo el timer cargo los valores de timer1h/l y vuelvo a activarlo

Citar
 
  ;ISR
  ORG  04H
  BCF    PIR1,0;Borro bandera
  DECFSZ  CONTADOR
  GOTO   RETORNA;Va a retornar de la int,
  BSF    TRANSICION,0
  GOTO  VERSAL
VERSAL
  MOVLW  0C8H;realiza 200 temporizaciones antes de variar salida
  MOVWF  CONTADOR
  BTFSS  PORTB,0;Analiza la salida
  GOTO   ACTIVAR;Va a activar salida
  BCF    PORTB,0;DESACTIVA
  GOTO RETORNA
ACTIVAR
  BSF    PORTB,0;activa
RETORNA
 BCF    T1CON,0;desactivo el temp
  MOVLW  0DCH
  MOVWF  TMR1L;CARGA TIMER1BAJO
  MOVLW  0BH
  MOVWF  TMR1H;CARGA TIMER1ALTO
  MOVLW  31H
  MOVWF  T1CON;PRESCALER 8 Y ACTIVA
 RETFIE

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Uso Del Tmr1 En El 16f876
« Respuesta #6 en: Sábado 7 de Enero de 2006, 15:28 »
0
Bueno, tendrias que empezar a rebizar paso por paso.. por ejemplo.. modifica el programa para que despues del bucle infinito, se genere la interrupcion y vaya a la direccion 04h .. hasta ahi ya lo tienes.. pero en vez de hacer lo que hace tu programa, osea:

Código: Text
  1. ORG  04H
  2.   BCF    PIR1,0;Borro bandera
  3.   DECFSZ  CONTADOR
  4.   GOTO   CONTINUA;Va a retornar de la int,
  5.   BSF    TRANSICION,0
  6.   GOTO  VERSAL
  7. VERSAL
  8.   MOVLW  0C8H;realiza 200 temporizaciones antes de variar salida
  9.   MOVWF  CONTADOR
  10.   BTFSS  PORTB,0;Analiza la salida
  11.   GOTO   ACTIVAR;Va a activar salida
  12.   BCF    PORTB,0;DESACTIVA
  13. CONTINUA  
  14.   RETFIE
  15. ACTIVAR
  16.   BSF    PORTB,0;activa
  17.   RETFIE
  18.  
  19.  

Has que el programa solo encienda un led en el puerto B, solo que lo encienda.. y ahi lo terminas..

Código: Text
  1.  
  2. ORG  04H
  3.   BCF    PIR1,0;Borro bandera
  4.   BSF    PORTB,0;activa
  5.   RETFIE
  6.  
  7.  

es solo una prueba para ver si el programa salta o no a la direccion 04h .. si esto funciona el problema esta en lo que haces a partir de la interrupcion.. prueba y me cuentas para continuar con el analisis. Saludos :)
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

Kain589

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Uso Del Tmr1 En El 16f876
« Respuesta #7 en: Domingo 8 de Enero de 2006, 13:12 »
0
Gracias por vuiestra ayuda, ya lo he conseguido hacer funcionar resulta que tenia varios fallos. La temporizacion era de 100 segundos, en lugar de 10 como yo pretendia, ya que la interrupcion se generaba cada 500 milisegundos y no cada 50; y ademas me faltaba inicializar el contador, asi cada vez que lo encendia tomaba un valor cualquiera, asi que despues de configurar el temporizador hay que cargar el valor correspondiente al contador.
Ahora voy a por el modulo Pwm :lightsabre: ,que ya lo he intentado una vez pero no me ha salido

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Uso Del Tmr1 En El 16f876
« Respuesta #8 en: Lunes 9 de Enero de 2006, 23:36 »
0
Me alegra la noticia :) .. de los errores se aprende :smartass: .. comienza con el PWM y vengan esas dudas nomas :D .. Saludos! :hola:
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»