TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado 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?
-
Deberias usar timers.
Saludos !
-
El famoso TRM0 ??
¿Muy complicado?
-
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 !
-
16F877 ese es el pic que utilizo!!
Busque ejemplos pero no entiendo como funciona TRM0.
Alguien que me explique medio rapidon se lo agradeceria
-
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
-
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:
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??
-
aca encontre un lingo ejemplo y basico del TMR0
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
-
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.
-
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.
-
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.
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
-
Tal vez esto te pueda servir
http://www.todopic.com.ar/foros/index.php?topic=30920.0
Saludos.
-
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?
-
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.
-
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
-
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.
-
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.
-
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
-
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:
-
Gracias por todo y para
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..