Página 1 de 1

LPC1768 e módulo RTI

MensagemEnviado: 25 Out 2010 11:35
por Nightcrawler
Pessoal,

Estou iniciando os estudos da familia CM3 da NXP. Comprei um kit (http://www.poweravr.com/bbs/viewthread.php?tid=831&extra=) e estou testando os periféricos e desenvolvendo as lib.
Fiz a UART funcionar via INT. Tenho o costume de encerar uma comunicação por timeout, geralmente usando um timer. Então, lendo o manual do usuário, vi poderia usar o módulo RIT para gerar interrupções periódicas. Assim, poderia deixar os timers para outras funções. Configurei tudo tudo, carreguei o programa e....nada. O programa trava. Mexi no código para tentar descobrir a fonte do problema e notei que se eu alterar qualquer registrador do módulo RIT, o programa trava.
Alguém tem experiência com isso? Pode me dar uma ajuda?

Configuração da UART2
Código: Selecionar todos
   LPC_PINCON->PINSEL0 |= (1 << 20);             /* Pin P0.10 used as TXD2 */
   LPC_PINCON->PINSEL0 |= (1 << 22);             /* Pin P0.11 used as RXD2 */
   
   LPC_SC->PCONP = LPC_SC->PCONP|(1<<24);         /* habilita o modulo UART */
   
   LPC_UART2->LCR  = 0x83;            /* libera acesso aos registradores */
   dummy = (FPCLK/16) / UART2_BPS;    /* ajusta o baud rate */
   LPC_UART2->DLM = dummy / 256;
   LPC_UART2->DLL = dummy % 256;
   LPC_UART2->LCR = 0x03;             /* trava acesso aos registradores. Frame de dados de 8 bits */
   LPC_UART2->FCR = 0x06;

   dummy = LPC_UART2->IIR; // Read IrqID - Required to Get Interrupts Started
   dummy = LPC_UART2->RBR; //clear receive register
   dummy = LPC_UART2->LSR; //clear line status register
   LPC_UART2->IER = 7;  // Habilita a interrupção do RX2

   /* preemption = 1, sub-priority = 1 */
   NVIC_SetPriority(UART2_IRQn, ((0x01<<3)|0x01));
   NVIC_EnableIRQ(UART2_IRQn); /* Enable Interrupt for UART2 channel */


Configuração do RIT
Código: Selecionar todos
   /* Int a cada 5ms*/
   LPC_RIT->RICOMPVAL = 125000;

   /* Ajusta o timer para zerar o contador quando atingir o valor de RICOMPVAL*/
   LPC_RIT->RICTRL = 0x0E;
   LPC_RIT->RICOUNTER = 0;
   NVIC_SetPriority(RIT_IRQn, ((0x01<<3)|0x01));
   NVIC_EnableIRQ(RIT_IRQn); // Ativa a interrupção


MensagemEnviado: 25 Out 2010 12:06
por proex
Tú tá vivo é?
Resolveu sair da escuridão?

Qual o Baud rate que vc esta usando?

.

MensagemEnviado: 25 Out 2010 14:01
por Nightcrawler
proex escreveu:Tú tá vivo é?
Resolveu sair da escuridão?

Qual o Baud rate que vc esta usando?

.


Olá Proex,

Sim, continuo aqui pelo forum, só menos ativo.
Estou usando 9600bps.
No código acima faltou: #define UART2_BPS 9600
Já usou esse módulo RIT?

MensagemEnviado: 25 Out 2010 17:25
por proex
Eu já usei muito o LPC1768 mas não conheço esse MOdulo RTI.

Que raios de modulo RTI é esse que nem a NXP conhece? :lol:

.

MensagemEnviado: 25 Out 2010 18:39
por Nightcrawler
Proex,

Foi erro de digitação. O correto é RIT: Repetitive Interrupt Timer (RIT). :oops: :oops:

MensagemEnviado: 25 Out 2010 18:40
por austrax
Nightcrawler, use esse código como parametro de estudo para aplicações simples com a UART, como por exemplo um interpretador de comandos. O que ele faz basicamente é armazenar em um array todos os caracteres que chegam, aguardando a chegada do "0x0D" para setar um flag e ativar a maquina de estados que interpretará os dados. O baudrate configurado é de 115200 para um PCLK de 100MHz

Código: Selecionar todos
//---Var. globais---//

volatile unsigned char uart0[10];
volatile unsigned char f_Uart;


//---Int. da UART0---//

void UART0_IRQHandler(void){
   static unsigned char i;
   if((LPC_UART0->IIR & 0x0E) == 0x04){
      uart0[i++] = (char) LPC_UART0->RBR;
      if(uart0[i-1] == 0x0D) {
         uart0[i-1] = '\0';         
         i = 0;
         f_Uart = 1;      
      }
   }
}



//---Config. da UART0 (no main)---//

LPC_PINCON->PINSEL0 |= (1 << 4);             
LPC_PINCON->PINSEL0 |= (1 << 6); 
                      
LPC_SC->PCONP       |= (1 << 3);

LPC_UART0->LCR    = 0x83;                         
LPC_UART0->DLL    = 0x1F;                             
LPC_UART0->FDR    = 0xC9;                         
LPC_UART0->DLM    = 0x00;                         
LPC_UART0->LCR    = 0x03;                         
LPC_UART0->IER    = 0x01;   
                                    
NVIC_EnableIRQ(UART0_IRQn);



//--Exemplo de uso--//

while(!f_Uart);
if(!strncmp(uart0,"COMANDO",strlen(uart0)))
{

//Faz algo aqui
}



Abraços

MensagemEnviado: 25 Out 2010 18:50
por Nightcrawler
austrax,

A rotina da UART funciona bem. O problema é quando altero um registrador do modulo RIT. Ai o programa salta para um loop infinito.

Código: Selecionar todos
; Dummy Exception Handlers (infinite loops which can be modified)               

NMI_Handler     PROC
                EXPORT  NMI_Handler               [WEAK]
                B       .
                ENDP
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler         [WEAK]
  -->         B       .
                ENDP

MensagemEnviado: 25 Out 2010 19:23
por mastk
Interrupcao nao implementada?

MensagemEnviado: 25 Out 2010 20:05
por Nightcrawler
Eu também pensei nisso. Mas nem cheguei a ativar o timer. Basta configurar o prescaler e pronto....

MensagemEnviado: 25 Out 2010 20:08
por Rodrigo_P_A
Nightcrawler escreveu:Eu também pensei nisso. Mas nem cheguei a ativar o timer. Basta configurar o prescaler e pronto....


você ligou a alimentação do módulo que você vai usar?

pois se não ligou e tentar escrever alguma coisa nele, o uC vai gerar um HardFaultHandler

MensagemEnviado: 25 Out 2010 20:36
por Nightcrawler
Rodrigo_P_A escreveu:você ligou a alimentação do módulo que você vai usar?

pois se não ligou e tentar escrever alguma coisa nele, o uC vai gerar um HardFaultHandler


Grande Rodrigo,

Era isso mesmo. Foi só habilitar a alimentação que o sistema funcionou.
Vlw mesmo.. :D :D