Autor Tema: Retardo que no me deje el PIC en inutil.  (Leído 5548 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Retardo que no me deje el PIC en inutil.
« en: 04 de Junio de 2010, 00:28:53 »
Hola estoy buscando como puedo hacer un retado de 10 segundos pero sin que me deje el pic bloqueado como hace el delay_ms(10000)

 ¿que opinion me dan?

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #1 en: 04 de Junio de 2010, 00:57:31 »
Deberias usar timers.

Saludos !

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #2 en: 04 de Junio de 2010, 12:11:08 »
El famoso TRM0 ??
¿Muy complicado?

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #3 en: 04 de Junio de 2010, 12:15:42 »
Hola, lamentablemente para vos no conozco los PICs, pero lo que queres hacer se hace con Timers y es un concepto que abarca a cualquier micro. En el foro hay muchos expertos en PIC que sabran guiarte.

Saludos !

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #4 en: 04 de Junio de 2010, 13:51:59 »
16F877 ese es el pic que utilizo!!

Busque ejemplos pero no entiendo como funciona TRM0.

Alguien que me explique medio rapidon se lo agradeceria

Desconectado tinchosalamero

  • PIC12
  • **
  • Mensajes: 53
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #5 en: 04 de Junio de 2010, 14:31:22 »
kaki

a grandes razgos la cosa seria mas o menos asi,

El TIMER 0 es un registro dentro del micro que se incrementa independientemente de lo que vos hagas en el programa cada determinado tiempo, este tiempo esta dado por l avelocidad del Clock que estes usando y la configuracion de los registros del TIMER0 la hoja de datos te especifica los registros que son y te dice como configurarlos, cuando el timer se desborde, es decir pase de FFFF a 0000, es capaz de generar una interrupcion en el micro, esto es decir que el micro deja de hacer  lo que estaba haceindo y se pone a atender el evento que tiene que ejecutar cada determinado tiempo, una vez que lo completa vuelve a ejecutar el codigo que seguia al que habia ejecutado antes de la interrupcion.

de esta forma vos tenes un "proceso" corriendo por un lado y el timer incrementandose por el otro, lo que hace que tu micro no se quede esperando en un delay

para configurar que el timer se desborde cada determinado tiempo configura los preescalers del mismo. problablente no alcance a esperar 10 seg. por lo uqe se puede hacer es dentro del servicio de la interrupcion que se ejecute cada 1 seg por ejemplo incrementar una variable hasta llegar a 10

bueno, espero que mas o menos se entieda. igual busca en el foro, los ejemplos del compidalor, google, que hay ejemplos por todos lados

saludos

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #6 en: 04 de Junio de 2010, 14:48:59 »
ya entendi lo que es el Timer0 ahora al otro paso esperimatar y tratar de configurarlo.

leyendo un codigo supongo que esta es la configuracion:

Código: [Seleccionar]
OPTION_REG.T0CS = 0  'selecciona reloj interno
OPTION_REG.PSA = 0  'asigna el prescales al timer0
OPTION_REG.PS0 = 1  'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS1 = 1  'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS2 = 0  'bits de la seleccion del factor de division,prescaler 16
INTCON.T0IF = 0  'borra el flag de desbordamiento del timer0
TMR0 = 130  'cargo el registro del tmr0 para que desborde cada 1mS
Enable  'INTCON.GIE habilita las interrupciones globales
INTCON.T0IE = 1  'INTCON.tmr0ie = 1  'habilita las interrupciones del timer0

no caso una. no se como llama a ese TMR0 no se donde va la interrucion que tu dices.

lo que note que despues en el MAIN: llama varias veces a esto TMR0 = 130 es cuando empiesa a contar el timer??

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #7 en: 04 de Junio de 2010, 15:19:42 »
aca encontre un lingo ejemplo y basico del TMR0

Código: [Seleccionar]
      program cont2
      dim cont as byte [10]
      dim a    as byte
      dim b as byte

      sub procedure interrupt 'cada 3 veces que se ejecute esta interrupción se procede al incremento
       inc (b)
       if b = 3 then
          b= 0
             if PORTA = 0 then
                dec (a)
                 if a = -1 then
                   a = 9
                 end if
             else
               inc (a)
               if a = 10 then
                  a = 0
               end if
             end if
       end if
       INTCON = $20          ' Set T0IE, claer T0IF
      end sub

      sub procedure asgcont
       cont[0]=%00111111 ' el valor correspondiente al 0 para el display
       cont[1]=%00000110
       cont[2]=%01011011
       cont[3]=%01001111
       cont[4]=%01100110
       cont[5]=%01101101
       cont[6]=%01111100
       cont[7]=%00000111
       cont[8]=%01111111
       cont[9]=%01100111
      end sub

      main:
       OPTION_REG = $87       ' Assign prescaler to TMR0 escala 1:256
       TRISB  =   0
       PORTB  =   1
       TMR0   =   0
       INTCON = $A0           ' Enable TMRO interrupt
       a = 0
       asgcont
       
      P: PORTB = cont[a]
        goto  P
      end.

Alguien me explica el funcionamiento  se lo agradeceria.
Mientras tanto voy a probar si puede entender algo

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #8 en: 04 de Junio de 2010, 20:44:52 »
Tocando probando sin saber una mierda lo hice andar.. y la verdad un exito jeje a ver que opinan ustedes si esta bien o mal. y si me podian explicar un poco por que lo hice de casualidad y entiendo a media..

Primero hice esta SubProceso

sub procedure interrupt 'cada 3 veces que se ejecute esta interrupción se procede al incremento
     counter = counter + 1
     TMR0 = 96
     INTCON = $20
     if counter = 500 then
      pass = 0
      counter = 0
     end if
end sub

despues en el main abajo puse

         OPTION_REG = $87       ' Assign prescaler to TMR0 escala 1:256

y cuando quiero que empiese a correr el tiempo osea que se ejecute la rutina de arriba

         INTCON = $A0
uso este codigo

anda de 10 con el cronometro calcule 15 segundos mas o menos.

Ahora alguien me explica(lo q esta dentro del if en el sub proceso, eso es lo que hace cuando pasa el tiempo de hecho lo puse yo) cada linea de esas y como calculo el tiempo??

 despues de esto no molesto mas.
« Última modificación: 04 de Junio de 2010, 20:47:15 por kaki »

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #9 en: 05 de Junio de 2010, 11:39:50 »
Hola kaki, aqui he posteado un ejemplo de como utilizar el TMR0 para hacer una onda PWM.

 :-/ Espero que te sirva.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #10 en: 05 de Junio de 2010, 13:22:41 »
Gracias ya logre hacer andar el TMR0 el problema que tengo es que no entiendo bien lo que hice yo lo fui desmenusando de un ejemplo y me anduvo.
No se como calcularr los tiempos y demas.

Citar
Tocando probando sin saber una mierda lo hice andar.. y la verdad un exito jeje a ver que opinan ustedes si esta bien o mal. y si me podian explicar un poco por que lo hice de casualidad y entiendo a media..

Primero hice esta SubProceso

sub procedure interrupt 'cada 3 veces que se ejecute esta interrupción se procede al incremento
     counter = counter + 1
     TMR0 = 96
     INTCON = $20
     if counter = 500 then
      pass = 0
      counter = 0
     end if
end sub

despues en el main abajo puse

         OPTION_REG = $87       ' Assign prescaler to TMR0 escala 1:256

y cuando quiero que empiese a correr el tiempo osea que se ejecute la rutina de arriba

         INTCON = $A0
uso este codigo

anda de 10 con el cronometro calcule 15 segundos mas o menos.

Ahora alguien me explica(lo q esta dentro del if en el sub proceso, eso es lo que hace cuando pasa el tiempo de hecho lo puse yo) cada linea de esas y como calculo el tiempo??

 despues de esto no molesto mas.

SAludos y gracias por tu aporte lo voy a guardar el ejemplo

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #11 en: 06 de Junio de 2010, 13:02:00 »
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #12 en: 06 de Junio de 2010, 14:20:58 »
Interesante lo que me pasaste. de hecho es lo que ago yo. Muchas gracias

¿para que sirve el prescaler y cuantas formas hay de configurarlas?

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #13 en: 06 de Junio de 2010, 15:26:39 »
El prescaler sirve para dar los incrementos del registro del TMR0 provenientes de la fuente elegida del reloj.
No hay muchas opciones y los mismo aparecen en el datasheet. Cuanto más grande es el prescaler elegido, más tardará el TMR0 en desbordarse.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Marioguillote

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1926
    • Servisystem
Re: Retardo que no me deje el PIC en inutil.
« Respuesta #14 en: 06 de Junio de 2010, 18:47:15 »
Otra forma de hacer un retardo sin "dormir" al PIC durante ese tiempo es hacer un lazo FOR - NEXT

FOR A = 1 TO 10000
DELAYMS 1

Instrucciones a las que estaré atento

NEXT A


Armar un contador de 10000 veces 1 milisegundo es lo mismo que hacer un solo retardo de 10 segundos. La diferencia está en que estarás "despierto" durante esa espera.
De ese modo, durante el Delay puedes estar atento a cualquier botón de entrada pulsado u otro tipo de información externa que varíe el rumbo del programa.

Saludos!
Mario


 

anything