Página 1 de 1

Reset por Software no LPC2148

MensagemEnviado: 23 Abr 2009 11:01
por jeanfernandes
Alguem ?
Num achei nada que me convença....
alguma ideia de rotina ae pra fazer isso ?

Grato.
:lol:

Re: Reset por Software no LPC2148

MensagemEnviado: 23 Abr 2009 11:25
por Rodrigo_P_A
jeanfernandes escreveu:Alguem ?
Num achei nada que me convença....
alguma ideia de rotina ae pra fazer isso ?

Grato.
:lol:


faça:

void (*Soft_Reset)(void);

no main, faça:

int main ( void ) {
Soft_Reset = (void (*)(void))(0x0000);

}


depois, em qualquer parte do programa basta chamar: Soft_Reset();

talvez dê para inicializar já com o ponteiro como 0x00, eu num testei, tente:

void (*Soft_Reset)(void)= (void (*)(void))(0x0000);

aí tavlez nem precise inicializar no main

mas do jeito que eu postei eu sei que funciona

depois devolve o timer do fabim

MensagemEnviado: 23 Abr 2009 12:15
por proex
O Timer nao esta mais com ele. O Renie passou a mão nele (no Timer) e não devolveu mais.


.

MensagemEnviado: 23 Abr 2009 12:29
por polesapart
Código: Selecionar todos
void reboot(void)
{
 // Caso o setor zero tenha sido remapeado pra ram, devolve pra flash.
  SCB_MEMMAP = 1;
 // Salta pro endereço zero.
  asm volatile("bx %0" : : "r" (0));
}



Uso isto com o gcc. Nunca falhou. Porém no projeto em particular eu não uso interrupções, senão provavelmente teria que reprogramar os periféricos ou pelo menos a VIC pra não gerar interrupções. Só desabilitar as interrupções provavelmente não daria muito certo, pois o startup code reabilita as interrupções depois que seta o ponteiro da pilha e algum periférico ativo poderia sacanear.

Desabilitar todas as interrupções na VIC provavelmente funcionaria bem, pois presume-se que quando o teu programa habilitar de novo, já tenha reprogramado os periféricos adequadamente.


Uma outra alternativa era re-chamar o bootloader do LPC, mas eu não sei se isto resolveria o problema das interrupções.

MensagemEnviado: 23 Abr 2009 12:38
por polesapart
Outra idéia: habilita o reset por watch dog timer pra estourar rapidao, e faz um loop infinito esperando ele estourar, isto seria o mais próximo de um reset por hardware, provocado por software :)

MensagemEnviado: 23 Abr 2009 12:58
por Rodrigo_P_A
polesapart escreveu:Outra idéia: habilita o reset por watch dog timer pra estourar rapidao, e faz um loop infinito esperando ele estourar, isto seria o mais próximo de um reset por hardware, provocado por software :)


Eu acho essa sua idéia mais confiável hehehe

Pois eu testei esse negócio de saltar para o endereço zero aqui , e agora percebi que às vezes dá pau.

melhor usar o WDT mesmo

MensagemEnviado: 23 Abr 2009 13:21
por proex
Putz, que complicado. No Pic eu fazia simplesmente assim:

BCF INT ; Desabilita todas as interrupçoes
Goto 0x0000 ; Pula para o inicio da memoria de programa

Funcionava que era uma blz.

MensagemEnviado: 23 Abr 2009 13:46
por polesapart
Rodrigo_P_A escreveu:
polesapart escreveu:Outra idéia: habilita o reset por watch dog timer pra estourar rapidao, e faz um loop infinito esperando ele estourar, isto seria o mais próximo de um reset por hardware, provocado por software :)


Eu acho essa sua idéia mais confiável hehehe

Pois eu testei esse negócio de saltar para o endereço zero aqui , e agora percebi que às vezes dá pau.

melhor usar o WDT mesmo


Comigo nunca deu problema a opção do salto ao endereço zero (depois que eu forcei o SCB_MAP=1 acima), mas eu vejo problemas garantidos se tiver periféricos com interrupções habilitadas, pois saltar para o endereço zero não provoca o reset dos periféricos, nem do controlador de interrupções.

Aí sobre o WDT me ocorreu o seguinte: Se precisar saber se o reset for por WDT (não intencional) ou pelo software reset?

Uma idéia talvez fosse alocar um espacinho na ram fora das áreas que são inicializadas pelo startup code, e colocar um valor específico lá quando fosse fazer o soft reset. Aí na inicialização do programa ele lê se houve estouro do wdt *e* se o valor naquela área corresponde exatamente a este pre-determinado. Se este último caso tbm for verdadeiro, foi soft reset, senão, foi wdt por outras razões. Como geralmente a pilha do sistema é alocada no topo da memória ram e vem descendo, o legal seria reservar este espaço acima da pilha, o que garantiria que na execução normal do programa esta área não seria tocada (salvo por escorregões com aritmética de ponteiros que todo programador C faz de vez em quando)...

MensagemEnviado: 23 Abr 2009 20:52
por styg
a melhor opção é essa do watchdog mesmo, pq ja li em algum lugar ou appnote que tem varios problemas em simular um reset simplesmente saltando pro inicio do código.

acho que tem a ver com a pilha, ou inicializaçao das variaveis, coisa assim.

só pra complementar: http://www.embeddedrelated.com/groups/l ... w/8792.php

MensagemEnviado: 23 Abr 2009 22:22
por polesapart
Os LPC22xx tem uma errata (EXTINT.1 se lembro bem) e o reset por software pode complicar as coisas mais ainda neste caso.

A opção "portável" e segura entre lpc21xx, 22xx e 23xx parece ser mesmo o reset por watchdog.

Ou por uma GPIO no reset físico quando desenhar a placa, mas isto é medonho :)

MensagemEnviado: 24 Abr 2009 08:37
por Rodrigo_P_A
polesapart escreveu:Os LPC22xx tem uma errata (EXTINT.1 se lembro bem) e o reset por software pode complicar as coisas mais ainda neste caso.

A opção "portável" e segura entre lpc21xx, 22xx e 23xx parece ser mesmo o reset por watchdog.

Ou por uma GPIO no reset físico quando desenhar a placa, mas isto é medonho :)


é, no 23xx Não funciona mesmo, dá data abort, às vezes reseta, às vezes Não.

por isso eu acho a opção com o WDT mais segura.

MensagemEnviado: 01 Mai 2009 11:56
por jeanfernandes
Prezados

Eu agradeço. Estou meio sumido das paradas, mas é crise de abstinência de nicotina. Estou vendo se consigo me animar sem drogas (remédios).
Quase 20 dias sem fumar deixa o cara meio louco...mas beleza..uma hora tinha que parar com essa m****....

Valews.

MensagemEnviado: 01 Mai 2009 17:05
por Maia
Parabéns pela decisão e força de vontade. Só falta agora a gente conseguir convencer o Renie tb.
Abraços,
Maia