Programación Específica > Microcontroladores
Uso Del Tmr1 En El 16f876
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
[#] Página Siguiente
Ir a la versión completa