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    &#59;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 &#59;ponemos este GOTO al principio para poder poner                        &#59;el subprograma de las interrupciones a partir de                        &#59;la dirección 04h                          &#59;Comienza la interrupción:                        &#59;=========================           ORG     04H    &#59;El pic salta a esta dirección cuando se produce                        &#59;una interrupción         BCF     INTCON,2 &#59;bit que indica desbordamiento de TMR0, recuerda                        &#59;que hay que ponerlo a "0" por programa, este es                        &#59;el momento                          &#59;comenzamos guardando el contenido del acumulador                        &#59;y del STATUS para restaurarlos antes de salir de                        &#59;la interrupción (es recomendable hacer esto                        &#59;siempre que se usen interrupciones)           MOVWF   ACUM   &#59;Copia el acumulador al registro ACUM         MOVF    STATUS,W&#59;Guarda STATUS en el acumulador         BANCO0        &#59;Por si acaso, nunca se sabe en que parte de                        &#59;programa principal salta la interrupción         MOVWF   STAT   &#59;Copia el acumulador al registro STAT                          &#59;Para generar una onda cuadrada Invertimos el                         &#59;estado de RB0 cada vez que salta una interrupción                        &#59;=================================================           BTFSC   PORTB,0 &#59;si RB0 es "0" salta la siguiente instrucción         GOTO    ESUNO  &#59;vete a ESUNO         BSF     PORTB,0&#59;Pon a "1" RB0 (porque era "0")         GOTO    HECHO  &#59;ya está invertido RB0, vete a HECHO   ESUNO   BCF     PORTB,0&#59;Pon a "0" RA0 (Porque era "1")                          &#59;Ya se ha invertido el estado de RB0                        &#59;===================================                          &#59;ahora hay que restaurar los valores del STATUS y                        &#59;del acumulador antes de salir de la interrupción:   HECHO   MOVF    STAT,W &#59;Guarda el contenido de STAT en el acumulador         MOVWF   STATUS &#59;Restaura el STATUS         SWAPF   ACUM,F &#59;Da la vuelta al registro ACUM         SWAPF   ACUM,W &#59;Vuelve a dar la vuelta al registro ACUM y restaura                        &#59;el acumulador (Con la instruccion SWAPF para no                        &#59;alterar el STATUS, la instrucción MOVF altera el                        &#59;bit 2 del STATUS)         RETFIE        &#59;fin de la interrupción                          &#59;Fin de la interrupción                        &#59;======================     INICIO  BANCO1        &#59;Pasamos al banco 1         BCF     TRISB,0&#59;RB0 como salida         BCF     OPTIONR,3&#59;Asignamos el preescaler a TMR0         BCF     OPTIONR,0&#59;\         BCF     OPTIONR,1&#59; }Prescaler a 1/2         BCF     OPTIONR,2&#59;/         BCF     OPTIONR,5&#59;Entrada de TMR0 por ciclo de                        &#59;instrucción interna (se pone a contar)         BANCO0        &#59;Volvemos al banco 0                                &#59;Configuración de las interrupciones:                        &#59;====================================           BSF     INTCON,7&#59;Habilita las interrupciones globalmente         BSF     INTCON,5&#59;Habilita la interrupción por desbordamiento de TMR0                          &#59;====================================                        &#59;ya están configuradas las interrupciones, a                        &#59;partir de ahora cuando cuando se desborde TMR0                        &#59;saltará la interrupción (a la dirección 04h de                        &#59;programa)             NADA    GOTO    NADA   &#59;En este ejemplo no se hace nada en el programa                        &#59;principal, simplemente se espera a que salte la                        &#59;interrupción. La verdadera utilidad de las                        &#59;interrupciones es que se pueden hacer "cosas"                        &#59;mientras sin preocuparse de las interrupciones             END           &#59;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

[0] Índice de Mensajes

Ir a la versión completa