TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: kaki en 04 de Junio de 2010, 00:28:53

Título: Retardo que no me deje el PIC en inutil.
Publicado por: kaki 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?
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: RICHI777 en 04 de Junio de 2010, 00:57:31
Deberias usar timers.

Saludos !
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: kaki en 04 de Junio de 2010, 12:11:08
El famoso TRM0 ??
¿Muy complicado?
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: RICHI777 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 !
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: kaki 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
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: tinchosalamero 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
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: kaki 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??
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: kaki 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
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: kaki 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.
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: bigluis en 05 de Junio de 2010, 11:39:50
Hola kaki, aqui (http://www.todopic.com.ar/foros/index.php?topic=13756.msg233073#msg233073) he posteado un ejemplo de como utilizar el TMR0 para hacer una onda PWM.

 :-/ Espero que te sirva.
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: kaki 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
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: Leon Pic en 06 de Junio de 2010, 13:02:00
Tal vez esto te pueda servir

http://www.todopic.com.ar/foros/index.php?topic=30920.0

Saludos.
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: kaki 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?
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: Leon Pic 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.
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: Marioguillote 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
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: nico en 07 de Junio de 2010, 20:32:11
Kaki, si no comprendes como funciona el TMR0 seria barbaro que en ves de preguntar porque anda de "casualidad" lo que hiciste, busques dentro del foro o en internet, o en cualquier libro de pic, o en el propio datasheet, ¿que es el TMR0?, ¿como funciona?, ¿como configurarlo?, ¿como atender una interrupcion?, te aseguro que en menos de una tarde vas a comprender el funcionamiento y podras configurarlo a gusto y placer tuyo, sin esperar que alguien te diga porque "magicamente" funciona tu codigo.


Saludos.
Nico.
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: NORTEÑO en 09 de Junio de 2010, 06:12:34
HOLA:
Al poner el codigo:

FOR A = 1 TO 10000
DELAYMS 1

Instrucciones a las que estaré atento

NEXT A
 
Hay que estar atento al calculo preciso del tiempo que gastan las instrucciones en el bucle FOR---NEXT.
Si que  DELAYMS 1   *  10000    =  a 10 segundos , pero se sumara el tiempo de instruciones que estara ATENTO tambien
a cada ITERACCION.
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: Marioguillote en 09 de Junio de 2010, 09:34:20
Hay que estar atento al calculo preciso del tiempo que gastan las instrucciones en el bucle FOR---NEXT.
Si que  DELAYMS 1   *  10000    =  a 10 segundos , pero se sumara el tiempo de instruciones que estara ATENTO tambien
a cada ITERACCION.

Exacto.

El valor que puse fué a modo de ejemplo.
Si lo que necesitamos es un tiempo "rigurosamente exacto" es más sencillo usar ASM ya que además de contemplar el tiempo que se utiliza para las Instrucciones a las que estaré atento hay que estimar también las demoras (ciclos de trabajo) que consume el FOR - NEXT y eso varía de un tipo de BASIC a otro.

Resumen: Si buscamos 10 segundos exactos, BASIC es más complejo que ASM. Si tenemos en cuenta todas las "pérdidas de tiempo" funciona igual, pero ASM es más fácil para trabajar con precisión cuando necesitamos tiempos exactos.  ;-)

Saludos!
Mario
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: willynovi en 09 de Junio de 2010, 14:21:58
ademas que con ASM lo puedes simular con el MPLAB, me acuerdo esa ves que estuve unos varios minutos para que llegara la cuenta creo a 500mseg :mrgreen:
Título: Re: Retardo que no me deje el PIC en inutil.
Publicado por: kaki en 09 de Junio de 2010, 21:17:37
Gracias por todo y para

Citar
Insertar Cita
Kaki, si no comprendes como funciona el TMR0 seria barbaro que en ves de preguntar porque anda de "casualidad" lo que hiciste, busques dentro del foro o en internet, o en cualquier libro de pic, o en el propio datasheet, ¿que es el TMR0?, ¿como funciona?, ¿como configurarlo?, ¿como atender una interrupcion?, te aseguro que en menos de una tarde vas a comprender el funcionamiento y podras configurarlo a gusto y placer tuyo, sin esperar que alguien te diga porque "magicamente" funciona tu codigo.


Saludos.
Nico.



no fue de casualidad razone un ejemplo y me anduvo nada mas que me faltan aprender concepto que obie cuando estudie ese ejemplo... la casualidad fue una forma de decir..