RTC - LPC2138

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

RTC - LPC2138

Mensagempor lrfad2 » 17 Abr 2007 18:28

Pessoal,
Quando desligo a minha placa, a bateria mantêm 3,6V no pino Vbat. O problema é que o RTC não continua contando (Qdo ligo novamente a placa ela continua da hora que parou). Alguem sabe aonde posso estar errando?

void InitRTC (void)
{
int valor=0;
CCR = 0x02 | (CCR & 0xFFFFFFE0); // Desabilita RTC
// Mantem Clock Tick Counter (CTC) resetado
// CTC terá como base de clock o oscilador externo de 32Khz, conectado ao RTCx1 e RTCx2
AMR = 0xFF; // não compara os valores com o alarme
CIIR = 0x00; // RTC não gera interrupção
PREINT = ((PREINT & 0XFFFFE000) | ((PCLKFREQ/32768)&0x1FFF))-1; // é a parte inteira do prescaler
valor=(PCLKFREQ-((PREINT+1)*32768))& 0x7FFF;
PREFRAC = (PREFRAC&0XFFFF8000) | (valor); // é a parte fracional do prescaler
CCR = CCR & 0xFFFFFFFD; //Libera CTC
CCR = CCR | 0x00000001; //Liga RTC
}//void InitRTC (void)
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo

Re: RTC - LPC2138

Mensagempor Rodrigo_P_A » 18 Abr 2007 09:21

é o seguinte, num sei onde vc está errando, mas pra ser rápido, vou te passar o que eu uso e que está funcionando:

#define BIT(n) (1 << (n))
typedef struct {
unsigned char hora,minuto,segundo,dia,mes,dia_da_semana,ano;
unsigned int atualizar:1;
} tipoDATA_HORA;
tipoDATA_HORA DATA_HORA;

/*
Interrupção habilitada, a cada 1s, atualiza a variável do relógio
*/
void RTC_ISR( void )
{
if( ILR&BIT(0) ) { //Test for RTC counter interrupt
// gerado por incremento no timer
if ( DATA_HORA.atualizar ) {
RTC_atualizar( &DATA_HORA );
}
DATA_HORA.tempo_segundos++;
ILR=BIT(0); //Clear the interrupt register
}

// sai da interrupção
VICVectAddr = 0x00000000;
}

/*
void RTC_setar()
Seta as configurações que estão em DATA_HORA
*/
void RTC_setar( tipoDATA_HORA *d ){
tipoDATA_HORA ld;
ld=*d;
SEC=ld.segundo;
MIN=ld.minuto;
HOUR=ld.hora;
DOM=ld.dia;
MONTH=ld.mes;
YEAR=ld.ano;
}

/*
void RTC_atualiza()
Atualiza a variável DATA_HORA
*/
void RTC_atualizar( tipoDATA_HORA *d ){
tipoDATA_HORA ld;
ld=*d;
ld.segundo=SEC;
ld.minuto=MIN;
ld.hora=HOUR;
ld.dia=DOM;
ld.mes=MONTH;
ld.ano=YEAR;
*d=ld;
}

/*
Configuro o RTC
VIC0
VIC1
VIC2
VIC3
VIC4
VIC5 RTC
*/
void RTC_init(void){
DATA_HORA.atualizar=0x01;
CCR=BIT(0) | BIT(4); // habilitado, XT externo

// habilito a interrupção a cada segundo
CIIR=BIT(0); // a cada segundo gera uma interrupção
AMR=0x00; // alarme desativado
VICVectAddr5 = (unsigned long)RTC_ISR; /* Vetor de interrupção do RTC a cada 1 s */
VICVectCntl5 = BIT(5) | 13; /* Habilito a interrupçào, canal 13 ou seja, RTC */
VICIntEnable|=BIT(13); // Habilito RTC
}


chamar RTC_init() na rotina main

se vc fizer DATA_HORA.atualizar=1; ele vai atualizar a variável DATA_HORA automaticamente, a cada 1 segundo.

ou se vc preferir, vc chama RTC_atualizar( &DATA_HORA ); manualmente em alguma parte do teu soft.


estas rotinas estão funcionando perfeitamente.

até +
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor lrfad2 » 19 Abr 2007 17:28

Obrigado pela dica
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo


Voltar para ARM

Quem está online

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

x