Página 1 de 1
Wait mode

Enviado:
09 Jan 2009 10:27
por jow
ola pessoal....alguem já trabalhou bem com este modo?...Bom, estou trabalhando com o HC908AP16 e no datasheet do mesmo algumas duvidas que tenho nao estao bem claras....se puderem me ajudar:
- se a CPU pára de rodar, meu programa, dentro do main(), pára também e fica só aguardando sair via interrupcao?
- caso continue rodando, posso continuar a utilizar os AD`s e os timer's para controlar quando sair do modo WAIT e ainda alguns portais para acionamentos?
valeu!!!

Enviado:
09 Jan 2009 11:29
por mastk
ja mas faz um tempo.
Sim a CPU para, seu codigo para se ser execultado.
Sim, a periferia continua ativa, AD sampleando e Timers rodando, podendo acordar a CPU, se nao me faltam as drogas.

Enviado:
09 Jan 2009 12:12
por msamsoniuk
de forma simplificada, eu uso o wait da seguinte forma:
- Código: Selecionar todos
#define isr_wait() _asm wait _endasm
#define wdt_clean() COPCTL = 1
...
main()
{
wdt_clean();
rtc_enable();
isr_enable();
..
for(;;)
{
wdt_clean();
app_run()
isr_wait();
}
}
no caso, limpo o watchdog no inicio de main, configuro um periferico que gere interrupcao periodica, habilito as interrupcoes e entro num loop, que por sua vez limpa o watchdog, roda uma interacao da aplicacao e entao fica em wait. qdo a proxima interrupcao ocorrer, o mcu acorda e o loop corre novamente. na configuracao de mcu e clock que eu tenho, uso geralmente o modulo TBM com 305Hz e o watchdog estora a contagem em uma cadencia de 76Hz.
nao sei se existe vantagem real no consumo usando wait, pq todo o resto continua ativado e funcionando... entao eu costumo ignorar o wait e fazer um pouco diferente:
- Código: Selecionar todos
#define isr_wait() _asm wait _endasm
#define wdt_clean() COPCTL = 1
...
unsigned idle;
main()
{
wdt_clean();
rtc_enable();
isr_enable();
..
for(idle=0;;idle++)
{
wdt_clean();
app_run()
}
}
que eh basicamente contar quantas vezes o for roda para mensurar a performance. a cada, digamos, 1/10 segundo eu copio o valor de idle para last_idle e zero a variavel idle (na interrupcao do TBM) e ela entao comeca a incrementar. quando o sistema esta realmente em idle, essa contagem vai atingir um valor maximo, quando o sistema esta em carga, essa contagem vai comecar a diminuir, de modo que quando se usa 100% do tempo do sistema, a variavel simplesmente nao sai do zero, assim na aplicacao eu posso imprimir algo como:
printf("cpu idle: %d%%\n", 100-100*last_idle/max_idle);

Enviado:
09 Jan 2009 12:42
por jow
saeb o q é Marcelo, eu vi no manual que em modo RUN, no max o uC consome 20mA e em WAIT 1.8mA....e sem o LVI isso já cai pra 150uA, o que já começaria a ficar bom pra mim, porque segundo a conta que fiz, se o uC ficasse em RUN quando acabasse a energia e fosse sustentado por uma bateria, isso resultaria em uns minutos de "vida". Daí usando um modo Low Power eu aumentaria consideravelmente este tempo.
Entao, queria que quando entrasse nessa condicao, continuasse a rodar o timer e gravar em E2prom, pra eu saber quanto tempo ficou sem energia, entende?
Assim, vou fazer o seguinte....pegar o exemplo que deu e simular por aqui pra ver se consigo ficar incrementando uma variavel quando este estiver em WAIT, dentro da rotina de interrupcao do timer...dai comento os resultados....
Mas ainda não entendi se mesmo com a CPU parada, eu consigo rodar um código que estará "dentro" da rotina de interrupcao do timer...caso sim, o problema está resolvido. Daí posso acordar a CPU dentro desta rotina mesmo....e falando nisso, como acordar a CPU sem ser com a interrupcao do timer e nem a do AD?
valeu pela ajuda ai por enquanto

Enviado:
09 Jan 2009 13:05
por msamsoniuk
bom, no caso de bateria jah eh uma economia interessante!
enfim, o modo wait como o nome jah diz eh um modo em que o core espera por algo, no caso um evento externo. quando uma interrupcao ocorre, o core sai do modo wait e comeca a processar a rotina de interrupcao, assim quando a rotina retorna, o loop principal do main continua rodando ateh encontrar o proximo wait.
entao, ele sai de wait se uma interrupcao ocorrer, porem alem da interrupcao nao tem outra forma.

Enviado:
09 Jan 2009 13:15
por jow
perfeito. agora entendi tudo que precisava. vou simular um exemplo aqui e ver se consigo o que quero e por quanto tempo.
Obrigado!

Enviado:
13 Jan 2009 08:23
por jow
bom pessoal, conclui por aqui os testes....aqui vao alguns resultados que talvez tenham alguma utilidade pra alguns....
em modo WAIT, rodando apenas o timer do uC e o modulo LVI, consegui um tempo de aprox. 12 min a partir da alimentacao por uma bateria ate q atingisse a tensao Vtripf1(2,45V) que determinou seu reset pelo modulo LVI.
Outra coisa pra ganhar tempo, eh diminuir o fbus para aumentar o tempo de estouro do timer e o consumo do uC tambem cai.
eh isso ai!

Enviado:
13 Jan 2009 19:57
por mastk
desligando mais modulos, aumenta-se a duracao da bateria, nos HCS, desligando completamente o CI, podendo retornar apenas a um reset o consumo vai para a casa dos micro amperes, mas 12 min eh pouco para alimentacao de bateria, chegou a medir o consumo geral do circuito?

Enviado:
13 Jan 2009 20:12
por msamsoniuk
vc mediu quantos mA o seu mcu esta consumindo ? as vezes eh algum circuito associado, por exemplo, nas minhas placas o led de power eh o cara que mais consome


Enviado:
28 Jan 2009 10:50
por jow
em relacao aos perifericos, nao posso desligar mais nada porque o retorno nao seria por interrupcao externa, o qeu abriria o modo STOP e ai sem seriam uA de consumo....
outra coisa...deixei sempre um amperimetro ligado, entao estou seguro do seu consumo....mas eh o seguinte, fiz uma coisa melhor por uma lado e pior por outro....coloquei um diodo pra isolar a alimentaçao do uC do restante do circuito, assim tenho certeza que só ele ta consumindo, porem tem o Vgama que "rouba" uns 0,6 - 0,7 volts....mas tá blz por ora...

Enviado:
28 Jan 2009 17:31
por leoabubauru
Você precisa que seja o WAIT? Não poderia ser STOP? O Wait é gastão mesmo. O modo STOP é melhor no quesito consumo. Verifique os periféricos que ele desliga e veja se pra você serve...
Por exemplo: Você pode programar o timer para acordar a cada 100ms.
- Põe o micro pra dormir dentro de um loop;
- Acorda após 100ms;
- Checa os IOs para ver se precisa continurar acordado (inclusive analógica;
- Se sim, sai do loop. Senão, mantém dentro do loop e dorme de novo.
Com um bom algoritmo é possível fazer miséria... E 100ms geralmente é suficiente para um sistema de tempo real, sem falar que você pode incrementar sua variável de tempo sem energia.
Espero ter contribuido!

Enviado:
12 Fev 2009 09:41
por jow
leoabubauru escreveu:Você precisa que seja o WAIT? Não poderia ser STOP? O Wait é gastão mesmo. O modo STOP é melhor no quesito consumo. Verifique os periféricos que ele desliga e veja se pra você serve...
entao....o modo STOP desliga o timer, e assim nao posso ter um controle do tempo; por isso infelizmente nao posso usar o modo STOP, o que seria uma grande vantagem em termos de consumo.

Enviado:
12 Fev 2009 20:06
por leoabubauru
Não é bem assim, jow!
Veja o que diz a revisão 4 de Jan/2007 do datasheet na página 154:
10.6.2 Stop Mode
The timebase module may remain active after execution of the STOP instruction if the oscillator has been enabled to operate during stop mode through the stop mode oscillator enable bit (STOP_ICLKDIS, STOP_RCLKEN, or STOP_XCLKEN) for the selected oscillator in the CONFIG2 register. The timebase module can be used in this mode to generate a periodic walk-up from stop mode.
If the oscillator has not been enabled to operate in stop mode, the timebase module will not be active during stop mode. In stop mode the timebase register is not accessible by the CPU.
If the timebase functions are not required during stop mode, reduce the power consumption by stopping the timebase before enabling the STOP instruction.
Resumindo: É possível deixar um timer "acordado" para acordar o micro de tempos em tempos.
Espero ter ajudado!!!
Laercio

Enviado:
19 Fev 2009 08:23
por jow
é jovem , voce tem razão.....de uma olhada em que eu estava me baseando abaixo:
9.6.2 Stop Mode
The TIM is inactive after the execution of a STOP instruction. The STOP instruction does not affect
register conditions or the state of the TIM counter. TIM operation resumes when the MCU exits stop mode
after an external interrupt.
na verdade nao me atentei ao fato de que o TBM poderia gerar a interrupcao pra acordar o CPU. Assim, este fato requer uma revisao em meu projeto...heheheh...vou implementar e dai posto os resultados, mas tenho certeza de que com essa nova opcao terei muito tempo pra monitorar a falha em modo STOP com um consumo muito pequeno, algo como 5 vezes ou mais o tempo que tinha em modo Wait. Agora, se desligar o LVI ai sim fica bom umas 100x melhor.
valeu amigo, abraços.

Enviado:
19 Fev 2009 13:32
por leoabubauru
Blz, Jow!
Assim que possível post aqui os resultados...
Abraços
Laercio