VIC ARM7 LPC23XX_24XX

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

VIC ARM7 LPC23XX_24XX

Mensagempor fabim » 01 Dez 2010 13:08

Pessoal, eu aprendi mexer com vic e fiq no CM3 que é muito mais simples que o CM3.

Estou quebrando o pau com uma interrupção aqui mais não estou conseguindo fazer funcionar, e nem conseguindo entender direito.

LOOK AT THIS:


U3FCR = 0x07;
// Habilita RX e TX FIFO's. Define interrupção a cada caracter recebido

U3IER = 0x00000007;
// Habilita interrupções TX e RX da UART3


VICVectPriority29 = 6;
// Habilita o Slot... 6 para determinar UART3


VICVectAddr29 = (unsigned long)&UART3_Isr;
// Endereço para execução dos serviços da interrupção da UART3

VICIntEnable |= 1<<29;
// Habilita a interrupção uart3

Se eu entendi bem.
O VicIntEnable, observando a tabela, o USART3 ocupa o bit de numero 29.
Logicamente, o VicVectAddr tambem será o de numero 29."ou não", e o VICVectPriority29, que faz mensão ao USART3, eu escrevo qual é a prioridade entre 0 e 14.

Esta certo isso mesmo?

Alguém pode dar uma mãozinha ?
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Re: VIC ARM7 LPC23XX_24XX

Mensagempor Rodrigo_P_A » 01 Dez 2010 15:29

fabim escreveu:Pessoal, eu aprendi mexer com vic e fiq no CM3 que é muito mais simples que o CM3.

Estou quebrando o pau com uma interrupção aqui mais não estou conseguindo fazer funcionar, e nem conseguindo entender direito.

LOOK AT THIS:


U3FCR = 0x07;
// Habilita RX e TX FIFO's. Define interrupção a cada caracter recebido

U3IER = 0x00000007;
// Habilita interrupções TX e RX da UART3


VICVectPriority29 = 6;
// Habilita o Slot... 6 para determinar UART3


VICVectAddr29 = (unsigned long)&UART3_Isr;
// Endereço para execução dos serviços da interrupção da UART3

VICIntEnable |= 1<<29;
// Habilita a interrupção uart3

Se eu entendi bem.
O VicIntEnable, observando a tabela, o USART3 ocupa o bit de numero 29.
Logicamente, o VicVectAddr tambem será o de numero 29."ou não", e o VICVectPriority29, que faz mensão ao USART3, eu escrevo qual é a prioridade entre 0 e 14.

Esta certo isso mesmo?

Alguém pode dar uma mãozinha ?


vc zerou o bit DLAB para habilitar a interrupção?

mais uma coisa, agora eu fiquei confuso, eu aponto o endereço da rotina assim:

VICVectAddr29 = (unsigned long)UART3_Isr;

sem usar o & que indica o endereço, e funciona aqui.

como eu não dormi esta noite, pode ser que eu esteja vendo coisas!
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor fabim » 01 Dez 2010 15:36

aqui ta completo.

PCONP |= 1<<25;
//liga clock para USART3
IODIR0 &= ~(1<<26);
//coloca
PINSEL1 |= (1<<21|1<<20|1<<19|1<<18);
// Define P0.26 e P0.25 = TXD3 e RXD3 respectivamente
PCLKSEL1 &= ~(3<<19);
// Define PCLK clock para UART0 = 72MHz
Clock_Div = 72000000/(16 * BaudRate);
// Define divisor p/ o BaudRate desejado (PCLK = 72MHz)
U3LCR = 0x83;
// Define 8 bits, sem paridade, 1 Stop bit, e habilita
// acesso aos divisores U0DLL e U0DLM (DLAB=1)
U3DLM = (Clock_Div / 256);
// Define valor do divisor p/ Baudrate desejado (MSB)
U3DLL = (Clock_Div % 256);
// Define valor do divisor p/ Baudrate desejado (LSB)
U3LCR &= 0x7F;
// Desabilita acesso aos divisores U0DLL e U0DLM (DLAB=0)
U3FCR = 0x07;
// Habilita RX e TX FIFO's. Define interrupção a cada
//caracter recebido
U3IER = 0x00000007;
// Habilita interrupções TX e RX da UART3
VICVectPriority29 = 0x20 | 6;
// Habilita o Slot... 6 para determinar UART3
VICVectAddr29 = (unsigned )&UART3_Isr;
// Endereço para execução dos serviços da interrupção da UART3
VICIntEnable |= 1<<29;
// Habilita a interrupção uart3


ta tudo certo ai ? Entendi direito sobre o VIC do arm7 ?
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Nightcrawler » 01 Dez 2010 20:37

Eu fiz um teste com o LPC2368, com o código abaixo. Funcionou 100%...

Código: Selecionar todos

// xxxx xx1x xxxx xxxx xxxx xxxx xxxx xxxx
     PCONP |= 0x02000000;   // Liga uart3, para configurar, bit 25
   
   // xxxx xxxx xxxx xxxx xxxx xxxx xxxx 1010
   PINSEL0 &= 0xFFFFFFF0;                           // Reset P0.0,P0.1 Pin Config
   PINSEL0 |= 0x00000002;                           // Select P0.0 = TxD(UART3)
   PINSEL0 |= 0x00000008;                           // Select P0.1 = RxD(UART3)

   // Baudrate Setup - UART 3, 19200 bps
   U3LCR = 0x80;  // Enable DLAB
   U3DLL = 23;    // UARTn baudrate = (pclk/16 x (256 x UnDLM + UnDLL)) x
   U3FDR = 167;   //                               
   U3LCR = 0x03;  // Disable DLAB, ativado para 8bits
   U3FCR = 0x07;  // Enable and reset TX and RX FIFO.

   VICVectAddr29 = (unsigned long)uart3_irq; // Interrupção setada para o vetor 3
   VICVectPriority29 = 0x25;   // Ativa Slot, prioridade média
   VICIntEnable |= 0x20000000;   // Enable UART3 Interrupt - bit 29

   dummy = U3IIR; // Read IrqID - Required to Get Interrupts Started
   dummy = U3RBR; //clear receive register
   dummy = U3LSR; //clear line status register
   U3IER = 7;  // Habilita a interrupção do RX3
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Mensagempor fabim » 02 Dez 2010 06:45

BLASFEMIA !!!!
Usando hex direto para setar valores !!!
Queimen a bruxa !!! Matem o nigth!!!

ta doido, acostumei tanto com Y|=1<<x e Y&= ~(1<<x), que eu vejo o hex ja fico meio abestado. hehehehe
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Nightcrawler » 02 Dez 2010 07:08

Isso é herança de outros compiladores :D
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Mensagempor fabim » 03 Dez 2010 07:51

Demonios 1000X demonios!!! Raios !!! 10000000X RAIOS!!!

Meo, olha que inferno.

Que diabos,

todos os dados recebidos chegam com erro.

Código: Selecionar todos
void Config_UART3(void)
{
   unsigned long Clock_Div=0;             
    // Prepara variável para cálculo do Baudrate
   init_vars();
   //inicializa variaveis para 0,
   PCONP        |= 1<<25;                  
   //liga clock para USART3
   IODIR0  |= (1<<25);
   IODIR0  &= ~(1<<26);                  
   PINSEL1 |= (1<<21|1<<20/*|1<<19|1<<18*/);                
   // Define P0.25 = TXD3 e P0.26 = RXD3 respectivamente
   PCLKSEL1 &= ~(1<<18); //bit 18 como zero
   PCLKSEL1 |= (1<<19);    //bit 19 como um
   // Define PCLK div = 0, clock para UART3 = 72MHz = CCLK
   Clock_Div   = (72000000/2)/(16 * BaudRate);
   // Define divisor p/ o BaudRate desejado (PCLK = 72MHz)
   U3LCR   = 0x83;                       
   // Define 8 bits, sem paridade, 1 Stop bit, e habilita
   // acesso aos divisores U0DLL e U0DLM (DLAB=1)
   U3DLM   = (Clock_Div / 256);            
   // Define valor do divisor p/ Baudrate desejado (MSB)
   U3DLL   = (Clock_Div % 256);           
   // Define valor do divisor p/ Baudrate desejado (LSB)
   U3LCR   &= 0x7F;                       
   // Desabilita acesso aos divisores U0DLL e U0DLM (DLAB=0)
   U3FCR   = 0x07;                       
   // Habilita RX e TX FIFO's. Define interrupção a cada
   //caracter recebido
   U3IER   = 0x07;                 
   // Habilita interrupções TX e RX da UART3
   VICVectPriority29 = 0x20 | 6;       
   // Habilita o Slot... 6 para determinar UART3
   VICVectAddr29 = (unsigned )&UART3_Isr;   
   // Endereço para execução dos serviços da interrupção da   UART3
   VICIntEnable |= 1<<29;               
   // Habilita a interrupção uart3
 
}


Código: Selecionar todos
void UART3_Isr(void) __irq
{
   U3LSRValue    = U3LSR;                       
   // Copia valor LINE STATUS REGISTER para buffer
   IIRValue    = U3IIR;                         
   // Copia valor INTERRUPT IDENTIFICATION REGISTER para buffer
   IIRValue    = IIRValue >> 1;                 
   // Posiciona os 3 bits indicadores de origem da INT = LSB's
   IIRValue    = IIRValue & 0x07;               
   // Máscara para separar os 3 bits indicadores de origem
   //IOPIN0 ^= 1<<25;
   if ( IIRValue == 0x01 )               
      // Se INT causada por transmissão de caracter
   {
      VICVectAddr = 0;
     return;                             
     // Cancela solicitação desta interrupção casca fora
   } else 
   if(U3LSRValue & (0x02|0x04|0x08|0x10|0x80))
   // Verifica erros no buffer de recepção
   {                                   
   ErrorBuffer = dado;                 
  // Move dado errado para Buffer temporário, cancelando
   trig = 0;
   //desabilita trigger de recepção para não pegar dado incorreto
   contador=0;
   //coloca ponteiro de recepção em zero novamente
   VICVectAddr = 0;   
   //cancela interrupção
   erro=1;
   //sinaliza erro para processos
   // Retorna sem processar o caracter recebido
   }

   if (U3LSRValue & 0x01)                   
   // Se buffer de recepção contém um caracter
   {
   
    dado = U3RBR;
    if(dado&0x80 || trig==1){                         
    //se byte recebido com bit7 = 1,então trigger
    trig = 1;
    //força trigger sempre a um con reentrancia
    recebido[contador++] = dado;
    //incrementa e salva bytes = 3
    if(contador==2){
    //se chegaram 3 bytes sem erros
    new=1;
    //avisa rotina principal que tem frame novo
    trig=0;
    //desliga trigger, out reentrancy
    contador =0;
    //faz contador a zero
    }
    }
     VICVectAddr = 0;                     
    // Cancela solicitação desta interrupção
      }
   //IOCLR0 = 1<<25;
   VICVectAddr = 0;
}
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?


Voltar para ARM

Quem está online

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

x