Programación Específica > Microcontroladores
Base De Tiempo E Interrupciones Con Tmr1
(1/1)
pic-man:
Buenas, tengo que hacer unos proyectos donde utilice el TMR1 para crear una base de tiempo de 1ms, utilizo el pic16f628a con el reloj interno de 4MHz, pero no tengo idea de como se hace eso, quisiera que alguien me echara una mano para hacer eso, puede ser con o sin interrupciones
Se que aquí no se hacen tareas pero eso no es una tarea, simplemente es parte de 2 proyectos que me dejaron, ya estuve leyendo el datasheet pero es que no entiendo como hacer eso, espero que alguien me pueda guiar, muchas gracias!
iova:
Hola amigo por casualidad no estas buscando hacer algo con X10 no??porque usa una ventana de tiempo de 1mS luego del cruce de cero para transmitir.....yo estoy en eso ahora..hice Rx pero estoy encarando Tx. Fijate si esto te sirve:
calculo de temporizaciones se usa la siguiente formula:
Temporizacion[ms] = 4 . Tclock . valor de cuenta del TMR0 . prescaler
Como ves, la temporizacion buscada es un multiplo del ciclo de instruccion.
En la formula:
4 . Tclock = 1 ciclo de instruccion. Tclock = 1/fclock; donde, fclock, es la frecuencia del oscilador que estas usando.
valor de cuenta del TMR0: es el valor que pretendes que cuente el TMR0 para lograr la temprizacion buscada. Recuerda que el timer funcionando como contador sincronico, cuenta de 0 a 255 y desborda produciendo overflow. Pero, si le cargo un valor al inicio, puedo hacer que cuente a partir de alli hasta 255.
prescaler: es el divisor programable con que cuenta el PIC. Esta ubicado en el registro OPTION. Ejemplo, si escribes en los tres primeros bits de dicho registro 000, logras dividir la frecuencia por 2. Si escribes 001, la divides por 4...., asi hasta 111, donde divides por 256
Por lo tanto, para lograr una temporizacion determinada, por ej. 1ms trabajando a fclock= 4MHz, haces lo siguiente:
1/4MHz= 250ns, y por lo tanto, 4 . 250ns= 1 us de ciclo de instruccion.
Te queda entonces 1ms = 1us . X
Luego, determinas el valor de X. En este caso, X=1000. Es el multiplo del ciclo de instruccion que buscas.
Lo que debes hacer ahora es el "ajuste fino" y el "ajuste grueso" para lograr de la forma mas exacta el multiplo de ciclo de intruccion calculado recien. Esto la haces ajustando el prescaler (ajuste grueso) y el valor de cuenta del TMR0 (ajuste fino).
En este caso, puedes hacer valor de cuenta= 125 y prescaler=8. (8.125=1000).
Es decir, debes escribir 010 en los bits PS2-PS1-PS0 de OPTION. Esto equivale a prescaler=8.
Luego cargar al inicio en el TMR0, el valor 131 (256 - 125), para que cuente a partir de alli hasta su desborde.
Para determinar el overflow del TMR0, testeas el bit T0IF (bandera de desborde de TMR0) del registro INTCON.
Avisa si sirvio, saludos
Iova
iova:
un ejemplo para q queda mas claro es:
Espera250uSeg
MOVLW D'0255'
MOVWF TMR0
W0 ; (256-255) * 256 * 1uSeg = 256 uSeg
CLRWDT ; Si T0IF esta en clear que siga
BTFSS INTCON, T0IF ; con el lazo hasta que se ponga en 1
GOTO W0 ; recien ahi el TMR0 habra llegado a FF
BCF T0IF ; la bandera T0IF debe ponerse en cero
RETLW 0 ; sino queda en 1 permanente y produce loop
si hace falta 1mSeg entonces se carga TMR0 con D'0252'
(256-252) * 256 * 1uSeg = 1 mSeg
se entendio??? saludos.
Mollense:
Todo esto es del 16f84 pero te puede servir. Espero que sí.
Detectas interrupcion: TOIF (Flag de interrupción por desbordamiento de TMR0)
Habilitas Interrupcion: TOIE (Habilita la interrupción por desbordamiento de TMR0)
--- Código: Text ---Timer - Contador TMR0 El registro TMR0 puede contar ciclos de instrucción interna o pulsos de entrada por RA4 según el valor del bit 5 del registro OPTION (TOCS). Si este bit está a "1" TMR0 cuenta pulsos por RA4 y se le llama Contador; si el bit está a "0" cuenta ciclos de instrucción interna y se le llama Timer. Cada ciclo de instrucción dura 4 veces el ciclo del reloj del pic (para un reloj de 4MHz ==> Ciclo reloj=0,25 µSeg ==> Ciclo instrucción = 4 X 0,25 = 1µSeg) Cuando lo usamos como contador (Por RA4) podemos determinar si el incremento se hará por flanco ascendente o descendente con el bit 4 del registro OPTION (TOSE) Podemos leer o escribir el registro TMR0 en cualquier momento. Cuando escribamos en él deja de contar durante dos ciclos, cuando lo leamos no pasa nada. Podemos asignar el prescaler al TMR0, si hacemos esto podemos elegir el factor en el que se verá dividido el conteo mediante los bits del 0 al 2 del registro OPTION según la tabla del factor de división. Por ejemplo, si elegimos un factor de división de 1/2 tienen que entrar 2 pulsos para que TMR0 se incremente en uno, si está a 1/4 tienen que entrar 4... etc. También podemos utilizar la interrupción que se produce cuando se desborda el TMR0, es decir, cuando pasa de FFh a 00h. (se configura desde el registro INTCON) El siguiente ejemplo usa la interrupción por desbordamiento de TMR0 para obtener una onda cuadrada a la salida RB0: ;******************************************* ;* EJEMPLO 4: USO DEL TMR0 * ;******************************************* ;* Este programa crea una señal cuadrada a * ;* la salida RB0, para ello utiliza el TMR0* ;* y la interrupción por desbordamiento del* ;* mismo. Se le asignará el prescaler con * ;* un factor de división de 1/2. De esta * ;* forma las interrupciones saltarán a * ;* intervalos fijos de tiempo. Invirtiendo * ;* el estado de RB0 durante las * ;* interrupciones se conseguirá una onda * ;* cuadrada perfecta * ;******************************************* OPTIONR EQU 01H ;Registro para configuración del TMR0 STATUS EQU 03H TRISB EQU 06H PORTB EQU 06H INTCON EQU 0BH ACUM EQU 0CH STAT EQU 0DH F EQU 1 w EQU 0 #DEFINE BANCO0 BCF STATUS,5 #DEFINE BANCO1 BSF STATUS,5 ORG 00H GOTO INICIO ;ponemos este GOTO al principio para poder poner ;el subprograma de las interrupciones a partir de ;la dirección 04h ;Comienza la interrupción: ;========================= ORG 04H ;El pic salta a esta dirección cuando se produce ;una interrupción BCF INTCON,2 ;bit que indica desbordamiento de TMR0, recuerda ;que hay que ponerlo a "0" por programa, este es ;el momento ;comenzamos guardando el contenido del acumulador ;y del STATUS para restaurarlos antes de salir de ;la interrupción (es recomendable hacer esto ;siempre que se usen interrupciones) MOVWF ACUM ;Copia el acumulador al registro ACUM MOVF STATUS,W;Guarda STATUS en el acumulador BANCO0 ;Por si acaso, nunca se sabe en que parte de ;programa principal salta la interrupción MOVWF STAT ;Copia el acumulador al registro STAT ;Para generar una onda cuadrada Invertimos el ;estado de RB0 cada vez que salta una interrupción ;================================================= BTFSC PORTB,0 ;si RB0 es "0" salta la siguiente instrucción GOTO ESUNO ;vete a ESUNO BSF PORTB,0;Pon a "1" RB0 (porque era "0") GOTO HECHO ;ya está invertido RB0, vete a HECHO ESUNO BCF PORTB,0;Pon a "0" RA0 (Porque era "1") ;Ya se ha invertido el estado de RB0 ;=================================== ;ahora hay que restaurar los valores del STATUS y ;del acumulador antes de salir de la interrupción: HECHO MOVF STAT,W ;Guarda el contenido de STAT en el acumulador MOVWF STATUS ;Restaura el STATUS SWAPF ACUM,F ;Da la vuelta al registro ACUM SWAPF ACUM,W ;Vuelve a dar la vuelta al registro ACUM y restaura ;el acumulador (Con la instruccion SWAPF para no ;alterar el STATUS, la instrucción MOVF altera el ;bit 2 del STATUS) RETFIE ;fin de la interrupción ;Fin de la interrupción ;====================== INICIO BANCO1 ;Pasamos al banco 1 BCF TRISB,0;RB0 como salida BCF OPTIONR,3;Asignamos el preescaler a TMR0 BCF OPTIONR,0;\ BCF OPTIONR,1; }Prescaler a 1/2 BCF OPTIONR,2;/ BCF OPTIONR,5;Entrada de TMR0 por ciclo de ;instrucción interna (se pone a contar) BANCO0 ;Volvemos al banco 0 ;Configuración de las interrupciones: ;==================================== BSF INTCON,7;Habilita las interrupciones globalmente BSF INTCON,5;Habilita la interrupción por desbordamiento de TMR0 ;==================================== ;ya están configuradas las interrupciones, a ;partir de ahora cuando cuando se desborde TMR0 ;saltará la interrupción (a la dirección 04h de ;programa) NADA GOTO NADA ;En este ejemplo no se hace nada en el programa ;principal, simplemente se espera a que salte la ;interrupción. La verdadera utilidad de las ;interrupciones es que se pueden hacer "cosas" ;mientras sin preocuparse de las interrupciones END ;FIN DE PROGRAMA
Saludos
pic-man:
Muchas gracias a los dos, creo que ya le agarré un poco el rollo a los timers del pic, muchas gracias por su ayuda.
Navegación
Ir a la versión completa