dúvida com algoritmo

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

dúvida com algoritmo

Mensagempor ze » 29 Ago 2007 13:46

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!
:D

OBRIGADO!!!!!!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor RobL » 29 Ago 2007 17:23

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.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor marcelo » 29 Ago 2007 22:05

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.
marcelo
Bit
 
Mensagens: 42
Registrado em: 11 Out 2006 14:50
Localização: São Paulo

Mensagempor dreher » 30 Ago 2007 10:35

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.
dreher
Byte
 
Mensagens: 489
Registrado em: 12 Out 2006 11:10
Localização: Blumenau - SC

Mensagempor fabim » 30 Ago 2007 12:09

viu só.
E quando eu fiz propaganda dos compiladores mikroe, alguns amigos ficaram cabreiros em sair do CCS.

Abraços

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ze » 30 Ago 2007 15:35

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!!!!!!!!!!!
Editado pela última vez por ze em 31 Ago 2007 11:54, em um total de 1 vez.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor marcelo » 30 Ago 2007 20:44

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.
marcelo
Bit
 
Mensagens: 42
Registrado em: 11 Out 2006 14:50
Localização: São Paulo

Mensagempor zielpunkt » 31 Ago 2007 09:16

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.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor marcelo » 31 Ago 2007 11:05

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.
marcelo
Bit
 
Mensagens: 42
Registrado em: 11 Out 2006 14:50
Localização: São Paulo

Mensagempor zielpunkt » 31 Ago 2007 11:23

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.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor ze » 31 Ago 2007 11:33

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!!!!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor ze » 31 Ago 2007 11:35

putz zielpunkt! respondemos quase simultaneamente e quase a mesma coisa
:D :D :D :D
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor marcelo » 31 Ago 2007 13:28

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.
marcelo
Bit
 
Mensagens: 42
Registrado em: 11 Out 2006 14:50
Localização: São Paulo


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x