Reset por Software no LPC2148

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Reset por Software no LPC2148

Mensagempor jeanfernandes » 23 Abr 2009 11:01

Alguem ?
Num achei nada que me convença....
alguma ideia de rotina ae pra fazer isso ?

Grato.
:lol:
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Re: Reset por Software no LPC2148

Mensagempor Rodrigo_P_A » 23 Abr 2009 11:25

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
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor proex » 23 Abr 2009 12:15

O Timer nao esta mais com ele. O Renie passou a mão nele (no Timer) e não devolveu mais.


.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor polesapart » 23 Abr 2009 12:29

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.
Warning: time of day goes back (-163479us), taking countermeasures. :)
Avatar do usuário
polesapart
Byte
 
Mensagens: 477
Registrado em: 19 Nov 2007 12:56
Localização: Curitiba

Mensagempor polesapart » 23 Abr 2009 12:38

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 :)
Warning: time of day goes back (-163479us), taking countermeasures. :)
Avatar do usuário
polesapart
Byte
 
Mensagens: 477
Registrado em: 19 Nov 2007 12:56
Localização: Curitiba

Mensagempor Rodrigo_P_A » 23 Abr 2009 12:58

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
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor proex » 23 Abr 2009 13:21

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.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor polesapart » 23 Abr 2009 13:46

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)...
Warning: time of day goes back (-163479us), taking countermeasures. :)
Avatar do usuário
polesapart
Byte
 
Mensagens: 477
Registrado em: 19 Nov 2007 12:56
Localização: Curitiba

Mensagempor styg » 23 Abr 2009 20:52

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
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor polesapart » 23 Abr 2009 22:22

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 :)
Warning: time of day goes back (-163479us), taking countermeasures. :)
Avatar do usuário
polesapart
Byte
 
Mensagens: 477
Registrado em: 19 Nov 2007 12:56
Localização: Curitiba

Mensagempor Rodrigo_P_A » 24 Abr 2009 08:37

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.
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor jeanfernandes » 01 Mai 2009 11:56

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.
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor Maia » 01 Mai 2009 17:05

Parabéns pela decisão e força de vontade. Só falta agora a gente conseguir convencer o Renie tb.
Abraços,
Maia
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro


Voltar para ARM

Quem está online

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

cron

x