reset via soft

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

reset via soft

Mensagempor rebelk » 08 Nov 2007 11:51

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?
rebelk
Byte
 
Mensagens: 301
Registrado em: 15 Nov 2006 20:16

Mensagempor avcasella » 08 Nov 2007 12:30

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".
avcasella
Bit
 
Mensagens: 46
Registrado em: 30 Out 2007 15:55
Localização: Blumenau-SC

Mensagempor brasilma » 08 Nov 2007 12:51

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.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor Ander_sil » 09 Nov 2007 08:45

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.
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor Ander_sil » 09 Nov 2007 08:52

Confirmando tenho certeza que funciona acabei de testar aqui em um exemplo que uso com WDT.

falow.
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor brasilma » 09 Nov 2007 09:25

Funciona sim Anderson, esta é uma das opções para um reset elétrico, quando se tem o recurso do WD.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor avcasella » 09 Nov 2007 09:53

É realmente gostei também desta solução.
É alem de interessante muito criativa.
avcasella
Bit
 
Mensagens: 46
Registrado em: 30 Out 2007 15:55
Localização: Blumenau-SC

Mensagempor rebelk » 12 Nov 2007 15:59

estou ultilizando o at89c55wd , vou testar , valeu galera pelas dicas!!!!!!!!!!!!!!!!!
rebelk
Byte
 
Mensagens: 301
Registrado em: 15 Nov 2006 20:16

Mensagempor rebelk » 18 Nov 2007 19:56

Anderson C. Silva envia para mim a parte do wd !
rebelk
Byte
 
Mensagens: 301
Registrado em: 15 Nov 2006 20:16

Mensagempor Ander_sil » 19 Nov 2007 11:03

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é+
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor Ander_sil » 19 Nov 2007 11:07

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...
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP


Voltar para 8051

Quem está online

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

x