por leoabubauru » 13 Jul 2007 00:24
Coloque uma função para verificar o motivo do reset usando os bits sinalizadores de reset e colocando o resultado num buzzer, por exemplo (Watch Dog: um bip, Brownout: 2 bips e assim por diante). Dá uma olhada no DS para verificar o uso correto deles. Com isso você será capaz de descobrir o motivo do reset e atacar direto na fonte. Faço isso em meus programas e ajuda bastante... A funão dever ser a primeira coisa a aparecer no soft.
Veja código exemplo:
#include <16F628A.h>
//#device ICD=TRUE // Diretiva para uso do depurador ICD2 br
#fuses INTRC_IO, WDT, NOMCLR, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
#use delay(clock=4000000,restart_wdt)
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, stream=PC, restart_wdt, parity=N, bits=8 )
//Definicoes
#byte PIR1 = 0x0C // Registrador de PERIPHERAL INTERRUPT REQUEST
#byte PIE1 = 0x8C // Registrador de PERIPHERAL INTERRUPT ENABLE
#byte PCON = 0x8E // Registrador de POWER CONTROL
//Bits de controle
#bit BOR = PCON.0
#bit POR = PCON.1
//Implementação de Subrotinas
void main ()
{
long TMR_DEBOUNCE;
int i,j,RESET;
// Salva a causa do RESET antes de limpar o WDT e setar
// os bits no registro de STATUS (ver no datasheet os bits /TO e /PD).
// Algumas funções do CCS resetam o WDT quando é gerado o código asm.
RESET = restart_cause();
delay_ms(10); // Evita inicialização errada do pino /MCLR (Warning 0033)
// Configurações do microcontrolador
setup_wdt(WDT_2304MS);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
enable_interrupts(GLOBAL); // setup interrupts
setup_comparator(NC_NC_NC_NC);
setup_uart(9600, PC);
// configura o I/O
set_tris_a(0b00110011);
set_tris_b(0b11001111);
// inicializa os ports
porta = 0x00; // limpa porta
portb = 0x00; // limpa portb
FLAGS = FLAGS2 = j = 0;
// Se inicilização OK, varre uma vez os LEDs em sequência e, depois, pisca os dois
// juntos. Se foi RESET, indica a falha com o LED VERMELHO e sinal sonoro.
switch (RESET)
{
case NORMAL_POWER_UP:
{
j=0;
// Pisca na sequência
OUT_LED_APROVADO = ON;
delay_ms(100);
OUT_LED_APROVADO = OFF;
OUT_LED_REPROVADO = ON;
delay_ms(100);
OUT_LED_REPROVADO = OFF;
// Pisca os dois juntos
delay_ms(200);
OUT_LED_APROVADO = ON;
OUT_LED_REPROVADO = ON;
delay_ms(100);
OUT_LED_APROVADO = OFF;
OUT_LED_REPROVADO = OFF;
delay_ms(100);
OUT_LED_APROVADO = ON;
OUT_LED_REPROVADO = ON;
delay_ms(100);
OUT_LED_APROVADO = OFF;
OUT_LED_REPROVADO = OFF;
delay_ms(100);
OUT_LED_APROVADO = ON;
OUT_LED_REPROVADO = ON;
delay_ms(100);
OUT_LED_APROVADO = OFF;
OUT_LED_REPROVADO = OFF;
}
break;
case WDT_TIMEOUT: j=1; break;
case BROWNOUT_RESTART: j=2; break;
}
for (i=0;i<j;++i)
{
OUT_LED_REPROVADO = ON;
OUT_BUZZER = ON;
delay_ms(50);
OUT_LED_REPROVADO = OFF;
OUT_BUZZER = OFF;
delay_ms(50);
}
BOR = POR = ON; // Reseta os flags do PCON REGISTER para detectar próximos RESETs
while(true)
{
restart_wdt();
.
.
.
}
} // main()
Tento, tento e tento...
Me arrebento!
Também bato!
Ô negocim bunitim essa tal eletrônica de barco!