Página 1 de 1
dúvida com algoritmo

Enviado:
29 Ago 2007 13:46
por ze
boa tarde
estou com uma dificuldade +- simples que meu tico e teco não conseguem solucionar
preciso saber se estou no intervalo programado (hora:minuto) de 24 horas.
o projeto é com pic18f
algo como:
if (hora>=hora_programada_inicial && minuto>=minuto_programado_inicial && hora<=hora_programada_final && minuto<=minuto_programado_final) ...
o problema está se meu intervalo for entre 23:59 e 00:01 (p.ex.) a condição acima nunca é válida.
as variáveis hora e minuto eu pego de um rtc. mesmo convertendo para 1440 minutos diários (uma variável só) estou com dificuldades.
por favor não me chame de burro. mas pode pensar se quiser!
OBRIGADO!!!!!!

Enviado:
29 Ago 2007 17:23
por RobL
Não é imediato. Falta uma referência a mais.
Sua base estoura a cada 24 horas. Uma das saidas é colocar um registro para dias. Desta forma ao passar o horas haverá o estouro da base mas, por exemplo um segundo após 0horas será maior que 23 horas.
Uma outra forma é não colocar um registro para dias, mas um flags sinalizando os trechos que cruzarem 24 horas e alterar o algorítimo em função desse flag.

Enviado:
29 Ago 2007 22:05
por marcelo
Tive a mesma dificuldade, mas resolvi assim:
if((hourProg==hour)&&(minuteProg==minute))
{
Executa a sua função
}
Mesmo que acontecer o que voce disse do relogio estar em 23:59 ( variaveis hour e minute) e a hora programada estar em 00:01 (HourProg e minuteProg) vai ser verdadeiro após 2 minutos, pois o relogio é crescente.
Espero ter ajudado.
[]'s,
Marcelo.

Enviado:
30 Ago 2007 10:35
por dreher
Qual compilador voce está usando? no MikroC ele tem uma biblioteca de tempo, que voce preenche uma estrutura de tempo(dia,mes,ano,hora,minuto) e ele te retorna a quantidade de minutos desde 1/01/1970(data no formato UNIx, se bem me lembro) e ele tem ja na biblioteca uma função de comparação de data. Nos outros compiladores C eu não sei se eles tem essa função.

Enviado:
30 Ago 2007 12:09
por fabim
viu só.
E quando eu fiz propaganda dos compiladores mikroe, alguns amigos ficaram cabreiros em sair do CCS.
Abraços
Fabim

Enviado:
30 Ago 2007 15:35
por ze
Obrigado a todos!!!
a seguinte lógica deu certo (até agora):
tempos em minutos (1440/dia)
ti=tempo inicial
tf=tempo final
t=tempo
if ((t>=ti)&&(t<=tf)) || ((tf<ti)&&((t>=ti)||(t<=tf)))) func1();
----------------------- --------------------------------
...........| ....................................... |
...........| ....................................... |
...........| ....................................... |-ou se tiver passando por meia noite (tf<ti)
...........|
...........|
...........|- se for depois da meia noite
marcelo, a sua idéia é boa mas se o equipamento desligar (falta de luz) durante o if((hourProg==hour)&&(minuteProg==minute)) não vai executar função.
Gostei MESMO do mikroe. apesar de ele gerar arquivo um pouco maior do que o hitech.
+ 1 vez
OBRIGADO!!!!!!!!!!!

Enviado:
30 Ago 2007 20:44
por marcelo
Não entendi Lellis.
Eu estou usando esta rotina com um RTC e uma EEPROM para 3 timers programaveis com hora/minuto para ligar e hora/minuto para desligar.
O equipamento precisa de uma bateria, para que o RTC não perca os dados. e os valores dos timers estão na e2prom. então mesmo com a queda de energia, não perco os dados programados. a vantagem desta forma que te apresentei que a mesma informação que armazeno, utilizo para a comparação para acionamento dos reles, e não preciso fazer conversão.
Mas que bacana que conseguiu resolver seu problema. qualquer coisa estamos aí.
[]`s
Marcelo.

Enviado:
31 Ago 2007 09:16
por zielpunkt
Só explicando:
O que o lellis está tentando é re-sincronizar o seu sistema, quando retornar de uma ausencia de energia na parte de processamento. Como o processador está desligado, ele não sabe "onde está" quando retorna, porque para executar a função comparando hora/minuto/etc, ele deveria estar presente no momento da ocorrencia de igualdade, pois o RTC não parou de funcionar (claro!). O problema é, então, o sistema saber, quando for energizado, se encontra-se "dentro da faixa" de tempo para, por exemplo, ligar ou desligar algo.
Abço.

Enviado:
31 Ago 2007 11:05
por marcelo
zielpunkt,
Isto é feito na inicialização, claro.
Ao inicializar, eu recupero os dados da E2PROM. senão não teria valia nenhuma deixar o RTC funcionando. Se estiver na condição de igualdade, automaticamente passa a valer a condição.
[]'s,
Marcelo.

Enviado:
31 Ago 2007 11:23
por zielpunkt
Tá...o programa fica na e2prom, óbvio. Mas o caso é outro. E se a condição de igualdade já estiver passado? Por ex.: Estava programado para ligar algo às 10:35 e o sistema só energizou, após retornar de uma falha de alimentação, às 10:37. Então, o sistema não tem autonomia (bateria) para o mcu (só pro RTC) e, como estava em off, não executou ainda o programado, e já não há mais a igualdade. Como você fica sabendo o estado que o sistema deveria assumir nesse retorno?
Abço.

Enviado:
31 Ago 2007 11:33
por ze
oi marcelo. grato pelas explicações!
mas simule: se a luz cai em minuteprog-1 e volta em minuteprog+1 não {executa a minha (ou sua) função} (considerando minutoprog como constante). certo?
a não ser que seu sistema (incluindo uContr) seja alimentado por bateria e seta um flag ao passar pelo momento programado. quando a luz voltar o flag avisa. Acertei?
abraços!!!!

Enviado:
31 Ago 2007 11:35
por ze

Enviado:
31 Ago 2007 13:28
por marcelo
Isto mesmo, Zielpunkt. ele possui uma flag para este caso. eu armazeno a flag de ligado também na E2PROM para recuperar a situação.
[]'s,
Marcelo.