Wait mode

Software e Hardware para uC da Qualcomm, NXP, FreeScale e Motorola

Moderadores: 51, guest2003

Wait mode

Mensagempor jow » 09 Jan 2009 10:27

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!!!
---------------------------
"O Homem começa a morrer quando desiste de aprender"
jow
Bit
 
Mensagens: 18
Registrado em: 20 Out 2006 09:31

Mensagempor mastk » 09 Jan 2009 11:29

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.
Avatar do usuário
mastk
Dword
 
Mensagens: 4407
Registrado em: 14 Out 2006 20:43

Mensagempor msamsoniuk » 09 Jan 2009 12:12

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);
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor jow » 09 Jan 2009 12:42

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
---------------------------
"O Homem começa a morrer quando desiste de aprender"
jow
Bit
 
Mensagens: 18
Registrado em: 20 Out 2006 09:31

Mensagempor msamsoniuk » 09 Jan 2009 13:05

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.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor jow » 09 Jan 2009 13:15

perfeito. agora entendi tudo que precisava. vou simular um exemplo aqui e ver se consigo o que quero e por quanto tempo.

Obrigado!
---------------------------
"O Homem começa a morrer quando desiste de aprender"
jow
Bit
 
Mensagens: 18
Registrado em: 20 Out 2006 09:31

Mensagempor jow » 13 Jan 2009 08:23

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!
---------------------------
"O Homem começa a morrer quando desiste de aprender"
jow
Bit
 
Mensagens: 18
Registrado em: 20 Out 2006 09:31

Mensagempor mastk » 13 Jan 2009 19:57

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?
Avatar do usuário
mastk
Dword
 
Mensagens: 4407
Registrado em: 14 Out 2006 20:43

Mensagempor msamsoniuk » 13 Jan 2009 20:12

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 :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor jow » 28 Jan 2009 10:50

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...
---------------------------
"O Homem começa a morrer quando desiste de aprender"
jow
Bit
 
Mensagens: 18
Registrado em: 20 Out 2006 09:31

Mensagempor leoabubauru » 28 Jan 2009 17:31

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!
Tento, tento e tento...
Me arrebento!
Também bato!
Ô negocim bunitim essa tal eletrônica de barco!
leoabubauru
Byte
 
Mensagens: 227
Registrado em: 21 Nov 2006 19:08
Localização: São Paulo

Mensagempor jow » 12 Fev 2009 09:41

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.
---------------------------
"O Homem começa a morrer quando desiste de aprender"
jow
Bit
 
Mensagens: 18
Registrado em: 20 Out 2006 09:31

Mensagempor leoabubauru » 12 Fev 2009 20:06

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
Tento, tento e tento...
Me arrebento!
Também bato!
Ô negocim bunitim essa tal eletrônica de barco!
leoabubauru
Byte
 
Mensagens: 227
Registrado em: 21 Nov 2006 19:08
Localização: São Paulo

Mensagempor jow » 19 Fev 2009 08:23

é 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.
---------------------------
"O Homem começa a morrer quando desiste de aprender"
jow
Bit
 
Mensagens: 18
Registrado em: 20 Out 2006 09:31

Mensagempor leoabubauru » 19 Fev 2009 13:32

Blz, Jow!

Assim que possível post aqui os resultados...

Abraços


Laercio
Tento, tento e tento...
Me arrebento!
Também bato!
Ô negocim bunitim essa tal eletrônica de barco!
leoabubauru
Byte
 
Mensagens: 227
Registrado em: 21 Nov 2006 19:08
Localização: São Paulo


Voltar para NXP (ex-FreeScale (ex-Motorola))

Quem está online

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

x