Autor Tema: Retardo de 23 microsegundos usando TMR1  (Leído 4657 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado ErnestAl

  • PIC10
  • *
  • Mensajes: 37
Retardo de 23 microsegundos usando TMR1
« en: 04 de Junio de 2007, 20:35:00 »
Muy buenas, repasando los ciclos de instruccion y los temporizadores me ha surgido una duda. ¿Es posible realizar un retardo de 23micro segundos usando el TMR1?. Yo he realizado lo siguiente

 Retardo=4* T_OSC*TMR1*Preescaler
Retardo = 23µs
TOSC = 1/(4*10^6 )
Preescaler = 1       
VALOR TMR1 = 23


CODIGO GENERACION DE RETARDO
                                   list  P=16f877

                                                #include <p16f877.inc>
         temp     equ   0x20
      
         org      0x00
         nop
         nop
inicio                      bsf    STATUS,RP0
         bcf      STATUS,RP1
         movlw   b'10000000'
         movwf   OPTION_REG
         bcf      STATUS,RP0
         bcf      STATUS,RP1
         movlw   b'00000000'  ;Selecciono Prescaler '1' y TMr1 temporizador
         movwf   T1CON
         
bucle
         movlw       b'00010111' ;Valor de 23 en Binario
                                                movwf       temp
                                                call   retardo
         goto   bucle

retardo
         bcf      PIR1,TMR1IF
         clrf   TMR1L
         clrf   TMR1H
         bsf      T1CON,TMR1ON
espera                      btfss   PIR1,TMR1IF
         goto   espera
         bcf      T1CON,TMR1ON
                                                decfsz       temp,f
                                                goto          retardo
                                                return
                                       
      
END

¿Como lo veis? ¿Se puede calcular asi un retardo de 23 microsegundos?


Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Retardo de 23 microsegundos usando TMR1
« Respuesta #1 en: 04 de Junio de 2007, 21:25:49 »
tu ecuación creo que algo mal (pregunto yo: es la misma ecuacion de TIMER0, 1 y 2, y en TMr2 hay postescaler) ya que no es el valor de TMR1 el qeu va en la ecuación sino:

Retardo=4* T_OSC*(256-TMR1)*Preescaler, en caso de timer1  a 8 bits, si fuera a 16bits: 65536-TMR1; entonces ahi para 8bits tu TMR1 debe comenzar en 232, si fuera 16bits debe comenzar en 65512

asi se calcula el valor (o bueno en el tmr0 es asi), solo qeu no entendi mucho tu codigo, ya que de bucle no saldra, y se quedará ahí y el TMR1 esta inactivo por tu definicion:
         movlw   b'00000000'  ;Selecciono Prescaler '1' y TMr1 temporizador
         movwf   T1CON
ya que el bit 0 de ese registro en la activación del TMR1.

ahora parece que quieres usar interrupcion por desborde del TMR1 para contar tus 23us, y pues creo que tienes algunos errores en eso, ya que debes definir el org del vector de interrupcion que en este caso seria org 0x04; tb no hay necesidad de que toques el OPTION_REG creo ya qeu no usas el tmr0, solo en este caso te sirve para los pullups del portB; bueno yo lo haria asi:

         org 0x00
         goto inicio
         org 0x04
         goto interrupt

interrupt
.... aca lo que se hace cuando ocurra los 23us, ya que genera una interrupcion

         movlw     0xff
         movwf     tmr1h,f
         movlw     0xe8
         movwf     tmr1l,f       ; se carga el valor 65512 al TMR1, el valor desde el cual comenzará la cuenta
         bcf      PIR1,TMR1IF
         retfie

inicio
         bsf      STATUS,RP0
         bcf      STATUS,RP1
         bsf      PIE1,TMR1IE
         bcf      STATUS,RP0
         movlw   b'00000001'  ;Selecciono Prescaler '1' y TMr1 temporizador
         movwf   T1CON
         bsf INTCON,GIE ; habilitacion global de interrupociones
         movlw     0xff
         movwf     tmr1h,f
         movlw     0xe8
         movwf     tmr1l,f       ; se carga el valor 65512 al TMR1
...          otras configuraciones, como para 8 o 16bits por ejemplo, que no me la se, jeje
...

bucle
....
         goto bucle
end


viendolo mejor, creo que la configuracion a 8 o 16 bits no existe ya que si quieres 8 bits siempre llenas el registro TMR1H con 0xff y trabajas solo con el TMR1L; depende del valor que uses... umm interesante, jeje :-/
 :lol:
« Última modificación: 04 de Junio de 2007, 21:54:58 por Cryn »
.

Desconectado ErnestAl

  • PIC10
  • *
  • Mensajes: 37
Re: Retardo de 23 microsegundos usando TMR1
« Respuesta #2 en: 05 de Junio de 2007, 09:44:17 »
entonces, estaria bien asi:
Retardo=4* T_OSC*(65536-TMR1)*Preescaler
Retardo = 23µs
TOSC = 1/(4*10^6 )
Preescaler = 1
VALOR TMR1 = 65513 ---->1111111111101001


CODIGO GENERACION DE RETARDO
                                   list  P=16f877

                                                #include <p16f877.inc>
         temp     equ   0x20

         org      0x00
         nop
         nop
inicio                      bsf    STATUS,RP0
         bcf      STATUS,RP1
         movlw   b'10000000'
         movwf   OPTION_REG
         bcf      STATUS,RP0
         bcf      STATUS,RP1
         movlw   b'00000000'  ;Selecciono Prescaler '1' y TMr1 temporizador
         movwf   T1CON

bucle
         movlw       b'00010111' ;Valor de 23 en Binario
                                                movwf       temp
                                                call   retardo
         goto   bucle

retardo
         bcf      PIR1,TMR1IF        ;Deshabilito la interrupcion de TMR1
         movlw    0xFF; Cargo el valor de 65513 que he calculado
         movwf    TRM1H
         movlw    0XE9
         movwf    TMR1L
         bsf      T1CON,TMR1ON   ;Activo TMR1
espera   btfss   PIR1,TMR1IF
         goto   espera
         bcf      T1CON,TMR1ON  ;Desactivo TMR1
         return

END

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Retardo de 23 microsegundos usando TMR1
« Respuesta #3 en: 05 de Junio de 2007, 16:36:35 »
en realidas 2^16=65536, pero el micro no ucenta desde uno sino desde cero, por tanto ese numero maximo es 65535, lo mismo en el caso del TMR0 que es de 8 bits: 2^8=256, y el micro solo cuenta hasta 255, con el cero son los 256

ahora como te mencione anteriormente tu codigo nose si estrá bien, seria muy bueno que uses la interrupción, pero bueno si te funciona esta bien.

un saludo adios
.

Desconectado ErnestAl

  • PIC10
  • *
  • Mensajes: 37
Re: Retardo de 23 microsegundos usando TMR1
« Respuesta #4 en: 05 de Junio de 2007, 16:52:43 »
Muchismas gracias Cryn, he repasado todo el codigo del programa y el retardo que genero es de 36micros, 23 del bucle y el resto de la configuracion....sigo investigando

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Retardo de 23 microsegundos usando TMR1
« Respuesta #5 en: 05 de Junio de 2007, 17:25:32 »
usando la interrupcion te aseguro que lograras los 23 us qeu buscas
.

Desconectado ErnestAl

  • PIC10
  • *
  • Mensajes: 37
Re: Retardo de 23 microsegundos usando TMR1
« Respuesta #6 en: 06 de Junio de 2007, 03:09:00 »
Encuanto vuelva del trabajo me pongo con ello, esta noche pondre mis avances

 Muchas gracias nuevamente CRYN

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Retardo de 23 microsegundos usando TMR1
« Respuesta #7 en: 06 de Junio de 2007, 11:06:36 »
no es necesario estar apagando el modulo TMR1
Código: ASM
  1. retardo
  2.          bcf      PIR1,TMR1IF        ;Deshabilito la interrupcion de TMR1
  3.          movlw    0xFF; Cargo el valor de 65513 que he calculado
  4.          movwf    TRM1H
  5.          movlw    0XE9
  6.          movwf    TMR1L
  7.          bsf      T1CON,TMR1ON   ;Activo TMR1
  8. espera   btfss   PIR1,TMR1IF
  9.          goto   espera
  10.          bcf      T1CON,TMR1ON  ;Desactivo TMR1
  11.          return

podrias hacerlo asi:
Código: ASM
  1. retardo
  2.          movlw    0xFF; Cargo el valor de 65513 que he calculado
  3.          movwf    TRM1H
  4.          movlw    0XE9
  5.          movwf    TMR1L
  6. espera
  7.          btfss       PIR1,TMR1IF
  8.          goto       $-1
  9.          bcf         PIR1,TMRIF
  10.          return
donde previamente ya habrias activado este modulo bsf      T1CON,TMR1ON   ;Activo TMR1

una pregunta mas.... y porque tienes que ser con el TMR1, no podria ser decrementando registros?
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado ErnestAl

  • PIC10
  • *
  • Mensajes: 37
Re: Retardo de 23 microsegundos usando TMR1
« Respuesta #8 en: 06 de Junio de 2007, 16:35:39 »
lo he probado con el TMR1 pq haciendo los calculos mas o menos m salia.... ¿decrementando registros? tambien esta la opcion de configurar el pic y luego un numero de 'nop' el cual me alcance hasta los 23micros, ¿Valdria?

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Retardo de 23 microsegundos usando TMR1
« Respuesta #9 en: 06 de Junio de 2007, 17:51:01 »
te pongo un ejemplo de lo que te decia:
http://www.box.net/shared/zx79vmjgh2

a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado ErnestAl

  • PIC10
  • *
  • Mensajes: 37
Re: Retardo de 23 microsegundos usando TMR1
« Respuesta #10 en: 10 de Junio de 2007, 19:55:47 »
muchisimas gracias microcadaver
 Usando registros tal y como tu dices he conseguido realizar un programa que desde que llamo a la funcion retardo hasta que salgo de ella, transcurren dichos 23micros
          list  P=16f877
         #include <p16f877.inc>
         temp     equ   0x20

         org      0x00
         nop
         
inicio                      bsf    STATUS,RP0
         bcf      STATUS,RP1
         movlw   b'10000000'
         movwf   OPTION_REG
         bcf      STATUS,RP0
         bcf      STATUS,RP1
bucle
         call   retardo
         goto   bucle
 
retardo
 
 MOVLW   D'6'
 MOVWF  temp   
 DECFSZ   temp,f
 GOTO   $-1
 RETURN         

END

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Retardo de 23 microsegundos usando TMR1
« Respuesta #11 en: 12 de Julio de 2007, 16:49:51 »
automatizando los calculos con el PicMultiCalc



no olvides verificar los tiempos en el simulador.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek


 

anything