Programación Específica > Microcontroladores

 Uso Del Tmr1 En El 16f876

(1/2) > >>

Kain589:
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 ---list p = 16f876;#include <p16f876.inc>;temporiza y parpadea portb,0CONTADOR  EQU  20HTRANSICION  EQU 21H ORG 00H  GOTO INICIO  ORG  04H  BCF    PIR1,0;Borro bandera  DECFSZ  CONTADOR  GOTO   CONTINUA;Va a retornar de la int,  BSF    TRANSICION,0  GOTO  VERSALVERSAL  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;DESACTIVACONTINUA    RETFIEACTIVAR  BSF    PORTB,0;activa  RETFIE  INICIO  BCF    STATUS,6  BSF    STATUS,5;banco 1  CLRF  TRISB;B  SALIDA  MOVLW  01H;HABILITA TMR1E  MOVWF  PIE1  MOVLW  0C0H;  MOVWF  INTCON;HABILITA GIE Y PERIFERICOS  BCF    STATUS,5;BANCO 0  CLRF  PORTB  BSF    PORTB,1;COMPROBAR SI FUNCIONA EL MICROTIEMPO  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 ACTIVANADA  GOTO  NADA  GOTO  TIEMPO    END 
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:
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:
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:
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 ©:
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 :)

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa