• Domingo 22 de Diciembre de 2024, 13:42

Autor Tema:  Base De Tiempo E Interrupciones Con Tmr1  (Leído 2856 veces)

pic-man

  • Miembro activo
  • **
  • Mensajes: 54
    • Ver Perfil
    • http://micropic.wordpress.com
Base De Tiempo E Interrupciones Con Tmr1
« en: Domingo 19 de Noviembre de 2006, 19:22 »
0
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

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Base De Tiempo E Interrupciones Con Tmr1
« Respuesta #1 en: Jueves 23 de Noviembre de 2006, 14:36 »
0
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

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Base De Tiempo E Interrupciones Con Tmr1
« Respuesta #2 en: Viernes 1 de Diciembre de 2006, 01:22 »
0
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

  • Miembro de PLATA
  • *****
  • Mensajes: 1755
  • Nacionalidad: ar
    • Ver Perfil
    • http://solocodigo.com/
Re: Base De Tiempo E Interrupciones Con Tmr1
« Respuesta #3 en: Viernes 1 de Diciembre de 2006, 02:11 »
0
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
  1. Timer - Contador TMR0
  2.  
  3. 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.
  4.  
  5. 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)
  6.  
  7. 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)
  8.  
  9. 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.
  10.  
  11. 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.
  12.  
  13. 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)
  14.  
  15. El siguiente ejemplo usa la interrupción por desbordamiento de TMR0 para obtener una onda cuadrada a la salida RB0:
  16.  
  17. ;*******************************************
  18.  
  19. ;*         EJEMPLO 4: USO DEL TMR0         *
  20.  
  21. ;*******************************************
  22.  
  23. ;* Este programa crea una señal cuadrada a *
  24.  
  25. ;* la salida RB0, para ello utiliza el TMR0*
  26.  
  27. ;* y la interrupción por desbordamiento del*
  28.  
  29. ;* mismo. Se le asignará el prescaler con  *
  30.  
  31. ;* un factor de división de 1/2. De esta   *
  32.  
  33. ;* forma las interrupciones saltarán a     *
  34.  
  35. ;* intervalos fijos de tiempo. Invirtiendo *
  36.  
  37. ;* el estado de RB0 durante las            *
  38.  
  39. ;* interrupciones se conseguirá una onda   *
  40.  
  41. ;* cuadrada perfecta                       *
  42.  
  43. ;*******************************************
  44.  
  45.  
  46.  
  47.  
  48.  
  49. OPTIONR EQU     01H    &#59;Registro para configuración del TMR0
  50.  
  51. STATUS  EQU     03H
  52.  
  53. TRISB   EQU     06H
  54.  
  55. PORTB   EQU     06H
  56.  
  57. INTCON  EQU     0BH
  58.  
  59.  
  60.  
  61. ACUM    EQU     0CH
  62.  
  63. STAT    EQU     0DH
  64.  
  65.  
  66.  
  67. F       EQU     1
  68.  
  69. w       EQU     0
  70.  
  71.  
  72.  
  73. #DEFINE BANCO0  BCF     STATUS,5
  74.  
  75. #DEFINE BANCO1  BSF     STATUS,5
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.         ORG     00H
  84.  
  85.         GOTO    INICIO &#59;ponemos este GOTO al principio para poder poner
  86.  
  87.                        &#59;el subprograma de las interrupciones a partir de
  88.  
  89.                        &#59;la dirección 04h
  90.  
  91.  
  92.  
  93.                        &#59;Comienza la interrupción:
  94.  
  95.                        &#59;=========================
  96.  
  97.  
  98.  
  99.         ORG     04H    &#59;El pic salta a esta dirección cuando se produce
  100.  
  101.                        &#59;una interrupción
  102.  
  103.         BCF     INTCON,2 &#59;bit que indica desbordamiento de TMR0, recuerda
  104.  
  105.                        &#59;que hay que ponerlo a "0" por programa, este es
  106.  
  107.                        &#59;el momento
  108.  
  109.  
  110.  
  111.                        &#59;comenzamos guardando el contenido del acumulador
  112.  
  113.                        &#59;y del STATUS para restaurarlos antes de salir de
  114.  
  115.                        &#59;la interrupción (es recomendable hacer esto
  116.  
  117.                        &#59;siempre que se usen interrupciones)
  118.  
  119.  
  120.  
  121.         MOVWF   ACUM   &#59;Copia el acumulador al registro ACUM
  122.  
  123.         MOVF    STATUS,W&#59;Guarda STATUS en el acumulador
  124.  
  125.         BANCO0        &#59;Por si acaso, nunca se sabe en que parte de
  126.  
  127.                        &#59;programa principal salta la interrupción
  128.  
  129.         MOVWF   STAT   &#59;Copia el acumulador al registro STAT
  130.  
  131.  
  132.  
  133.                        &#59;Para generar una onda cuadrada Invertimos el
  134.  
  135.                         &#59;estado de RB0 cada vez que salta una interrupción
  136.  
  137.                        &#59;=================================================
  138.  
  139.  
  140.  
  141.         BTFSC   PORTB,0 &#59;si RB0 es "0" salta la siguiente instrucción
  142.  
  143.         GOTO    ESUNO  &#59;vete a ESUNO
  144.  
  145.         BSF     PORTB,0&#59;Pon a "1" RB0 (porque era "0")
  146.  
  147.         GOTO    HECHO  &#59;ya está invertido RB0, vete a HECHO
  148.  
  149.  
  150.  
  151. ESUNO   BCF     PORTB,0&#59;Pon a "0" RA0 (Porque era "1")
  152.  
  153.  
  154.  
  155.                        &#59;Ya se ha invertido el estado de RB0
  156.  
  157.                        &#59;===================================
  158.  
  159.  
  160.  
  161.                        &#59;ahora hay que restaurar los valores del STATUS y
  162.  
  163.                        &#59;del acumulador antes de salir de la interrupción:
  164.  
  165.  
  166.  
  167. HECHO   MOVF    STAT,W &#59;Guarda el contenido de STAT en el acumulador
  168.  
  169.         MOVWF   STATUS &#59;Restaura el STATUS
  170.  
  171.         SWAPF   ACUM,F &#59;Da la vuelta al registro ACUM
  172.  
  173.         SWAPF   ACUM,W &#59;Vuelve a dar la vuelta al registro ACUM y restaura
  174.  
  175.                        &#59;el acumulador (Con la instruccion SWAPF para no
  176.  
  177.                        &#59;alterar el STATUS, la instrucción MOVF altera el
  178.  
  179.                        &#59;bit 2 del STATUS)
  180.  
  181.         RETFIE        &#59;fin de la interrupción
  182.  
  183.  
  184.  
  185.                        &#59;Fin de la interrupción
  186.  
  187.                        &#59;======================
  188.  
  189.  
  190.  
  191.  
  192.  
  193. INICIO  BANCO1        &#59;Pasamos al banco 1
  194.  
  195.         BCF     TRISB,0&#59;RB0 como salida
  196.  
  197.         BCF     OPTIONR,3&#59;Asignamos el preescaler a TMR0
  198.  
  199.         BCF     OPTIONR,0&#59;\
  200.  
  201.         BCF     OPTIONR,1&#59; }Prescaler a 1/2
  202.  
  203.         BCF     OPTIONR,2&#59;/
  204.  
  205.         BCF     OPTIONR,5&#59;Entrada de TMR0 por ciclo de
  206.  
  207.                        &#59;instrucción interna (se pone a contar)
  208.  
  209.         BANCO0        &#59;Volvemos al banco 0
  210.  
  211.        
  212.  
  213.                        &#59;Configuración de las interrupciones:
  214.  
  215.                        &#59;====================================
  216.  
  217.  
  218.  
  219.         BSF     INTCON,7&#59;Habilita las interrupciones globalmente
  220.  
  221.         BSF     INTCON,5&#59;Habilita la interrupción por desbordamiento de TMR0
  222.  
  223.  
  224.  
  225.                        &#59;====================================
  226.  
  227.                        &#59;ya están configuradas las interrupciones, a
  228.  
  229.                        &#59;partir de ahora cuando cuando se desborde TMR0
  230.  
  231.                        &#59;saltará la interrupción (a la dirección 04h de
  232.  
  233.                        &#59;programa)
  234.  
  235.  
  236.  
  237.        
  238.  
  239.  
  240.  
  241. NADA    GOTO    NADA   &#59;En este ejemplo no se hace nada en el programa
  242.  
  243.                        &#59;principal, simplemente se espera a que salte la
  244.  
  245.                        &#59;interrupción. La verdadera utilidad de las
  246.  
  247.                        &#59;interrupciones es que se pueden hacer "cosas"
  248.  
  249.                        &#59;mientras sin preocuparse de las interrupciones
  250.  
  251.  
  252.  
  253.  
  254.  
  255.         END           &#59;FIN DE PROGRAMA
  256.  
  257.  

Saludos
"Los que renuncian son más numerosos que los que fracasan" H.F.
"No se cómo sería la III Guerra Mundial, pero la cuarta sería con piedras" A.E.
"Quién no fía no es de fiar..."


...no te quedes mirando.

pic-man

  • Miembro activo
  • **
  • Mensajes: 54
    • Ver Perfil
    • http://micropic.wordpress.com
Re: Base De Tiempo E Interrupciones Con Tmr1
« Respuesta #4 en: Sábado 2 de Diciembre de 2006, 05:29 »
0
Muchas gracias a los dos, creo que ya le agarré un poco el rollo a los timers del pic, muchas gracias por su ayuda.