LPC1768 e módulo RTI

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

LPC1768 e módulo RTI

Mensagempor Nightcrawler » 25 Out 2010 11:35

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

Editado pela última vez por Nightcrawler em 25 Out 2010 18:37, em um total de 1 vez.
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Mensagempor proex » 25 Out 2010 12:06

Tú tá vivo é?
Resolveu sair da escuridão?

Qual o Baud rate que vc esta usando?

.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Nightcrawler » 25 Out 2010 14:01

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?
Editado pela última vez por Nightcrawler em 25 Out 2010 18:38, em um total de 1 vez.
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Mensagempor proex » 25 Out 2010 17:25

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:

.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Nightcrawler » 25 Out 2010 18:39

Proex,

Foi erro de digitação. O correto é RIT: Repetitive Interrupt Timer (RIT). :oops: :oops:
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Mensagempor austrax » 25 Out 2010 18:40

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
"Corte sua própria lenha. Assim, ela aquecerá você duas vezes." (Henry Ford)
Avatar do usuário
austrax
Byte
 
Mensagens: 139
Registrado em: 04 Mai 2007 20:10

Mensagempor Nightcrawler » 25 Out 2010 18:50

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
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Mensagempor mastk » 25 Out 2010 19:23

Interrupcao nao implementada?
Avatar do usuário
mastk
Dword
 
Mensagens: 4407
Registrado em: 14 Out 2006 20:43

Mensagempor Nightcrawler » 25 Out 2010 20:05

Eu também pensei nisso. Mas nem cheguei a ativar o timer. Basta configurar o prescaler e pronto....
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Mensagempor Rodrigo_P_A » 25 Out 2010 20:08

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
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor Nightcrawler » 25 Out 2010 20:36

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
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS


Voltar para ARM

Quem está online

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

cron

x