Autor Tema: Contador de tiempo durante el proceso del programa!!!  (Leído 3916 veces)

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

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
Contador de tiempo durante el proceso del programa!!!
« en: 26 de Noviembre de 2003, 18:14:00 »
a ver, si a alguien se le ocurre como solucionar mi duda...

Como puedo?? controlar la lectura de un pin del pic
durante un tiempo determinado, y mientras tanto seguir corriendo el programa???

mi idea, es estar leyendo el estado de varios pins del pic, constantemente, mientras que un contador de tiempo no esté activo.

inicio:

if timer_var = 0 then
   pin1_dat = portb.1
   pin2_dat = portb.2
   pin3_dat = portb.3
else
   timer_var = Timer_var - 1
endif

if porta.1 = 1 then timer_var = 1000

\" mas codigo
\" mas codigo
\" mas codigo
\" mas codigo
\" mas codigo
\" mas codigo

goto inicio

basicamente, la idea es esta.... Pero con un programilla un poco mas complicado...

en este programa pongo la variable timer_var a 1000
con esto conseguimos que no chequee los pines del portb durante 1000 ciclos del bucle

la idea, es que retarde la lectura de estos puertos durante N segundos o minutos... (no es necesario que sea preciso al 100%) y que mientras tanto, los demas porcesos del programa, sigan corriendo....

Muchas gracias de antemano.

Desconectado karlosguay

  • PIC10
  • *
  • Mensajes: 41
RE: Contador de tiempo durante el proceso del programa!!!
« Respuesta #1 en: 27 de Noviembre de 2003, 05:03:00 »
Creo que esto es lo que quieres:

    WHILE pulsado<>3
        if xx=0 then
            gosub Rutina1
        endif
        xx=xx+1
        if xx>1500 then xx=0
       gosub Rutina2
    wend

Rutina1 solo se ejecutará 1 de cada 1500 bucles y Rutina2 todas las veces.

Por cierto, hace un frio que pela

Salud

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Contador de tiempo durante el proceso del programa!!!
« Respuesta #2 en: 27 de Noviembre de 2003, 09:42:00 »
Muchas gracias por responder

Mas o menos por hay va la idea, pero el tema está en como controlo el tiempo que tarda en terminar un ciclo, para calcular el tiempo en segundos, mas o menos aproximado...

Voy a tener el tres variables en las que almacenaré los segundos que quiero que esté el checkeo de los pines del puerto inactivo.
cada uno de los pines se tiene que chekear con distintos tiempos...

pongo un ejemplo, pero en vez de leer los estados de los pines,
 los encendemos o apagamos.

pongamos que tenemos


tvar1 = 100
tvar2 = 500
tvar3 = 30

high portb.1
high portb.2
high portb.3

inicio:

if tvar1 > 0 then
 tvar = tvar - 1
 low portb.1
else
 high portb.1
endif

if tvar2 > 0 then
 tvar = tvar - 1
 low portb.2
else
 high portb.2
endif

if tvar2 > 0 then
 tvar = tvar - 1
 low portb.3
else
 high portb.3
endif

goto inicio

mas o menos puede ser esto....
no lo he pensado demasiado, pero creo que funciona...

lo que me hace falta, es podes calcular a que valor poner las  variables, para aprosimarme a un valor en segundos o minutos....

--
Atentamente
Abago

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Contador de tiempo durante el proceso del programa!!!
« Respuesta #3 en: 28 de Noviembre de 2003, 08:07:00 »
Para calcular el tiempo me parece que lo unico que podes hacer es llevarlo a la practica yo haria prender un led, ejecutar la rutina con un tvar=35000 y apagar el led para indicarte que termino, entonces contas el tiempo y sacas la proporcion. A ver si asi se entiende

tvar=35000
HIGH LED
if tvar1 > 0 then
    tvar = tvar - 1
    low portb.1
else
    high portb.1
endif
LOW LED

CREO QUE VA NO?????????

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: Contador de tiempo durante el proceso del programa!!!
« Respuesta #4 en: 29 de Noviembre de 2003, 06:06:00 »
uNA BUENA TECNICA PARA MEDIR TIEMPOS ES UTILIZAR EL TIMER 0 (O ALGUNO DE LOS OTROS). CON EL TIMER PUEDES CONTROLAR EL PROCESO   ATENDIENDO A OTRAS TAREAS COMO TU QUIERES.

PARA HACER ESTO CONFIGURAS EL TIMER Y LE CARGAS UN VALOR, SI LO QUE TU QUIERES CONTAR EXCEDE DEL VALOR DEL TIMER, USAS VARIABLES INTERMEDIAS POR CADA DESBORDAMIENTO DEL TIMER HASTA LLEGAR A UN VALOR DESEADO. eSTO PUEDES HACERLO CHEQUEANDO EL FLAG DEL TIMER O ACTIVANDO LA INTERRUPCION DEL TIMER, LO QUE MEJOR TE VENGA. dE ESTE MODO TU NO TIENES QUE CONTAR EL TIEMPO, LO CUENTA EL HARDWARE DEL MICRO Y TU CHEQUEAS SI HAS LLEGADO A ESE TIEMPO.

oTRAS SOLUCIONES TAMBIEN SON VALIDAS PERO TIENES GRANDES INEXACTITUDES EN LAS CUENTAS Y DEPENDES DE LOS PROCESOS QUE SE EJECUTEN EN ESOS MOMENTOS.

sALUDOS
RICKY

Desconectado pocher

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Contador de tiempo durante el proceso del programa!!!
« Respuesta #5 en: 30 de Noviembre de 2003, 23:55:00 »
Coincido con RGL, usando interrupción del TMR0 tu programa puede estar haciendo otras cosas y al mismo tiempo el TMR0 va contando el tiempo a partir del momento en que tú lo inicializas.

Con una (o más) variable vas llevando la cuenta de las interrupciones y cuando lleguen a un valor deseado se acabó la temporización.

Un saludo

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Contador de tiempo durante el proceso del programa!!!
« Respuesta #6 en: 01 de Diciembre de 2003, 07:21:00 »
Buenas buenas, una preguntita, como se hace para guardar el valor del timer en una variable (en PBP) y como se puede hacer para saber si el timer a desbordado, se que hay un bit de un registro que me lo dice, pero tengo que andar leyendo ese bit todo el tiempo, o cuando se desvorda se frena el timer y ese bit quedaseteado. El tema de las variables me da un poco de veerguenza pero la verdad es que siempre tengo algun problema, no son como las del Pascal

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Contador de tiempo durante el proceso del programa!!!
« Respuesta #7 en: 01 de Diciembre de 2003, 17:27:00 »
aqui tienes el ejemplo de un reloj en pbp

http://www.melabs.com/resources/samples/x1/pbp/clockx.bas

cuando la interrupción del timer se activa, el flag INTCON 0.2 creo que se pone a 1...

bueno, creo que con el ejemplo, aprenderás lo mismo que he aprendido yo hasta el momento.

Espero que te sea de utilidad....

Ah, y muchas gracias a todos los demas....
Porque la orientación de las anteriores respuestas, me han ayudado a buscar este ejemplo....

GRACIAS A TODOS....

--
Atentamente
Abago


Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Contador de tiempo durante el proceso del programa!!!
« Respuesta #8 en: 02 de Diciembre de 2003, 09:40:00 »
Hola Abago, aca estoy leyendo el ejemplo que encontraste y lo que creo que hace es incrementar un variable (ticks=ticks+1) cada vez que se produce una interrupcion por el desbordamiento del timer , corregime si no es cierto. Ahora lo que yo quiero saber es si se puede guardar el valor actual del timer (en alguna variable) como por ejemplo cuando ocurre una interrupcion en el RB0/INT.
Y como se hace .
Bueno espero tu respuesta....O la de otro no
Saludos

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Contador de tiempo durante el proceso del programa!!!
« Respuesta #9 en: 03 de Diciembre de 2003, 21:02:00 »
A que te refieres con el valor actual del timer????
la verdad, es que aun pareciendo que entiendo algo, estoy un poco perdidillo con el tema....
A base de leer y leer, voy sacando mis ideas adelante...
te dejo por aqui parte de código que ha compartido nuestro amigo luis frino, en el que se orienta en la mezcla de PBP y ensamblador, a ver si te puede ayudar en algo...

si no es asi, comenta que es lo que quieres hacer, a ver si se nos ocurre algo entre todos.

***********************


El codigo no esta completo pero da buenas pistas
de como leer dispositivos Dallas de la linea DS
despues con tiempo voy a postear otros metodos
de hacer llaves codificadas mas sencillas
NOTA estos codigos son para niveles avanzados
y es bueno como ejemplo para aquellos que no saben mezclar codigo basic con assembler



"*****************************************************************************************
" Alarma para Motos controlada por IButton por Luis Frino

"---Asignación de pines 16F84-----------------------------------

"PIN Nº: NOMBRE: USO/CONECCION:
"01 RA2 salida al buzzer
"02 RA3 salida al relay y sirena
"03 RA4/T0CKI nada
"04 -MCLR RESET DEL MICRO
"05 Vss GND
"06 RB0/Int Conección con el I"Button ( RX )
"07 RB1 Conección con el I"Button ( TX )
"08 RB2 Jumper de programación
"09 RB3 nada
"10 RB4 nada
"11 RB5 nada
"12 RB6 nada
"13 RB7 nada
"14 Vdd +5Vdc
"15 OSC2/CLKOUT XTAL 4Mhz.
"16 OSC1/CLKIN XTAL 4Mhz.
"17 RA0 entrada para el sensor de mercurio
"18 RA1 Pulsador de asalto

"-----------------------------------------------------------------

"---Definiciones--------------------------------------------------
"DEFINE OSC 16
DEFINE NO_CLRWDT 1

sen_merc var porta.0 "entrada sensor de mercurio
pul_asal var porta.1 "entrada pulsador de asalto
buzzer var porta.2 "salida sonido de activacion
relay var porta.3 "salida relay, sirena y stop de motor
x var word "variable (word) para hacer loops
asd var byte "Variable de uso general
temp var byte "Variable temporal de ectura
llave var byte(6) "Los 48 bit del codigo del i´button leido
llaves var byte "cantidad de llaves programadas
delayasm var byte
cambio var bit "Variable para activar y desactivar
sibutton var bit "Variable de i"button detectado
bitleido var bit
paso var bit
rxibutton var portb.0
txibutton var portb.1 "Pata de conección con el i"button
programa var portb.2 "Pata de Programación
trisa = %11110011 "configuracion puerto a: RA0 y RA1 = entradas,
"RA2 y RA3 = salidas ( el resto no importa )
trisb = %11111101 "configuro todo el puerto b como entrada



" Leer numero de serie del i"buton
"----------------------------------------------------------------------
delay480:
asm
movlw 0x9e
movwf _delayasm
dly480
decfsz _delayasm,f
goto dly480
nop
nop
return
endasm
return

delay15:
asm
movlw 0x03
movwf _delayasm
dly15
decfsz _delayasm,f
goto dly15
nop
nop
return
endasm
return


delay60:
asm
movlw 0x12
movwf _delayasm
dly60
decfsz _delayasm,f
goto dly60
nop
nop
return
endasm
return

delay6:
asm
nop
nop
nop
nop
endasm
return
leeributton:
high txibutton
gosub delay480
low txibutton
gosub delay60
if rxibutton = 1 then
cambio = 0
sibutton = 0
else
gosub delay480
bitleido = 1
gosub enviar1bit
bitleido = 1
gosub enviar1bit
bitleido = 0
gosub enviar1bit
bitleido = 0
gosub enviar1bit
bitleido = 1
gosub enviar1bit
bitleido = 1
gosub enviar1bit
bitleido = 0
gosub enviar1bit
bitleido = 0
gosub enviar1bit
pauseus 100
for asd = 1 to 8
gosub leer1bit
next asd
for asd = 1 to 6
gosub leer1bit
temp.0 = bitleido
gosub leer1bit
temp.1 = bitleido
gosub leer1bit
temp.2 = bitleido
gosub leer1bit
temp.3 = bitleido
gosub leer1bit
temp.4 = bitleido
gosub leer1bit
temp.5 = bitleido
gosub leer1bit
temp.6 = bitleido
gosub leer1bit
temp.7 = bitleido
llave(asd) = temp
next asd
sibutton = 1
endif
return

enviar1bit:
high txibutton
gosub delay15
if bitleido = 0 then
gosub delay60
else
low txibutton
endif
gosub delay6
low txibutton
return

leer1bit:
high txibutton
low txibutton
gosub delay15
if rxibutton = 1 then
bitleido = 1
else
bitleido = 0
endif
gosub delay60
return
--------------------------------------------------------------------------------
 Luis Frino
Mar del Plata
Argentina

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Contador de tiempo durante el proceso del programa!!!
« Respuesta #10 en: 03 de Diciembre de 2003, 21:57:00 »
HOla
Del ejemplo que me pasaste puedo in creementar una var cada vez que el timer desborda y asi puedo calcular el tiempo, pero en incrementos de lo que tarde en desbordar el timer. Es decir (a modo de ejemplo axagero los valores) si el timer tardara 1 dia en desbordarse yo podria calcular el tiempo en incrementos de 1 dia no. Bueno ahora lo  que yo quiero hacer es tener el tiempo con una precicion de una hora. Y para este ejemplo seria cuando el timer se encuentra en 10,6 (255/24). A eso  me refiero con ``el valor actual del timer´´ que quedaria mas claro si la preguta hubiera sido ¿como puedo obtener el valor del timer en cualquier instante?
Asi voy a quedar si sigo con esto
Saludos