Página 1 de 1

reset via soft

MensagemEnviado: 08 Nov 2007 11:51
por rebelk
estou em um programa que em um determinado momento preciso fazer um reset via soft , no pic é reset_cpu();
no 8051 como posso fazer isso ? estou programando em C no keil?

MensagemEnviado: 08 Nov 2007 12:30
por avcasella
Sendo bem direto você escreve este código onde quer o reset:

((void (code*)(void)) 0x0000) ();

dá pra colocar isso dentro de uma função com o nome reset, tem outras maneiras mais elegantes, que funcionam tão bem quanto.
O que é feito aqui?
Chamada a uma função para o endereço 0x0000.
se você mudar o 0x0000 pode saltar para qualquer endereço de programa
Tenha em mente que isso é como um salto, então em alguns casos você deve desabilitar as interrupções antes deste código, para que não ocorra uma interrupção antes da "inicialização".

MensagemEnviado: 08 Nov 2007 12:51
por brasilma
Olá Reb,

Importante saber exatamente o que deseja com este reset, que possui resultados diferentes (elétrica e logicamente falando) de um salto para o endereço 0000H.

Também é preciso saber onde vai usar este recurso, da forma que o colega indicou, não funciona, por exemplo, dentro de uma rotina de interrupção.

Abraços,
MArcos.

MensagemEnviado: 09 Nov 2007 08:45
por Ander_sil
Qual modelo de 8051 esta usando, se for um com WDT pode habilitar o WDT em seu software, e fazer uma função "ResetaCPU()" que fica em loop sem resetar o WDT, assim vai acorrer um overflow do WDT e resetar a CPU.
Eu ainda não tentei fazer isso mas tenho quase certeza que funciona.

folow.

MensagemEnviado: 09 Nov 2007 08:52
por Ander_sil
Confirmando tenho certeza que funciona acabei de testar aqui em um exemplo que uso com WDT.

falow.

MensagemEnviado: 09 Nov 2007 09:25
por brasilma
Funciona sim Anderson, esta é uma das opções para um reset elétrico, quando se tem o recurso do WD.

MensagemEnviado: 09 Nov 2007 09:53
por avcasella
É realmente gostei também desta solução.
É alem de interessante muito criativa.

MensagemEnviado: 12 Nov 2007 15:59
por rebelk
estou ultilizando o at89c55wd , vou testar , valeu galera pelas dicas!!!!!!!!!!!!!!!!!

MensagemEnviado: 18 Nov 2007 19:56
por rebelk
Anderson C. Silva envia para mim a parte do wd !

MensagemEnviado: 19 Nov 2007 11:03
por Ander_sil
Olá Rebelk, as funções do WDT são estas:

Código: Selecionar todos
/**********************************************************
   FUNCAO: WatchdogReset()
   PARAMETROS: NENHUM
   RETORNO: NENHUM
   DESCRICAO: Resetar o Watchdog do 8051
**********************************************************/
void WatchdogReset( void )
{
   WDTPRG |= 0x07;
   WDTRST  = 0x1E;
   WDTRST  = 0xE1;
}
/***********************************************************
   FUNCAO: InitWatchdog()
   PARAMETROS: NENHUM
   RETORNO: NENHUM
   DESCRICAO: Inicializa o Watchdog, chama a função WatchdogReset()
***********************************************************/
void InitWatchdog( void )
{
    WatchdogReset();
}
/***********************************************************
   FUNCAO: ResetaCPU()
   PARAMETROS: NENHUM
   RETORNO: NENHUM
   DESCRICAO: Reseta a CPU
***********************************************************/
void ResetaCPU( void )
{
  stop_timer0();
  while(1);
}


Na função ResetaCPU() eu desligo o timer0, já que eu tinha o programado para interrupçao e resetar o WDT.
No meu exemplo eu usei o modo IDLE, por isso eu resetava o WDT com a interrupção do timer0, no modelo de 8051 que voçe esta usando existe um bit no sfr AUX se não me engano que habilita o reset do WDT no modo IDLE.

Ai no programa eu faço assim:
Código: Selecionar todos
void main(void)
{       
      InitWatchdog(); 
      EA = 1;
     while(1)
    {
         if(INT0 == 1)
         {
               ResetaCPU();
         }
         WatchdogReset();
    }
}


até+

MensagemEnviado: 19 Nov 2007 11:07
por Ander_sil
Ah eu criei os registradores do WDT por software.
Usei o AT89S52.
Código: Selecionar todos
/**********************************************************
  Cria os registradores do Watchdog
**********************************************************/
sfr  WDTRST  =   0xA6;         
sfr  WDTPRG  =   0xA7;


falow...