Entrar    Registrar

Serial em dsPIC

Software e Hardware para DSP

Moderadores: joao, guest2003, 51

  • Autor
    Mensagem

Serial em dsPIC

Mensagempor Emilio Eduardo » 06 Dez 2011 11:43

Boa Tarde,

Eu estou aprendendo a mexer com dsPIC agora e gostaria de utilizar a serial para me comunicar com o dispositivo. Para aprender, adquiri uma placa full da FLEX Board e utilizo o MikroC.

Adicionei o esquema da placa em:

https://rapidshare.com/files/3777304799 ... squema.rar

Coloquei o seguinte código nela:

Código: Selecionar todos
#define FCY 39613750
#define BAUDRATE 57600
#define BRGVAL ((FCY/BAUDRATE)/4)-1

char serial;
char temp;

void USART1RXInt() iv IVT_ADDR_U1RXINTERRUPT{
     U1RXIF_bit = 0;
     temp = U1RXREG;
     if (serial==1) serial = 0;
     else serial = 1;
}

void USART1TXInt() iv IVT_ADDR_U1TXINTERRUPT{
     U1TXREG = 'A';
     U1TXIF_bit = 0;
}

void Timer1Int() iv IVT_ADDR_T1INTERRUPT{                                       //Interrupção Timer1
        T1IF_bit = 0;
        if(serial){
                   LATB = ~LATB;
                   LATC = ~LATC;
                   LATD = ~LATD;
                   LATF = ~LATF;
        }
        else{
               LATB = 0;                                                        //Reiniciando Entrada
               LATC = 0;
               LATD = 0;
               LATF = 0;
        }
}

void NovoOscilador(){
     //Configurando Oscilador
     //Fosc = (Fin*M)/(N1*N2)
     //Fcy = Fosc/2
     PLLFBD = 41;                                                               //M = PLLFBF + 2 = 43
     CLKDIVbits.PLLPOST = 0;                                                    //N1 = PLLPOST + 2 = 2
     CLKDIVbits.PLLPRE = 0;                                                     //N2 = PLLPRE + 2 = 2
     //Fosc = 79.2275Mhz Fcy = 39.61375Mhz
     //Sequência de configuração do OSCCON
     asm{
         MOV.b #0x01, W0
         MOV #0x0743,W1
         MOV.b #0x78,W2
         MOV.b #0x9A,W3
         MOV.b W2, [W1]
         MOV.b W3, [W1]
         MOV.b W0, [W1]

         MOV #0x0742,W1
         MOV.b #0x46,W2
         MOV.b #0x57,W3
         MOV.b W2, [W1]
         MOV.b W3, [W1]
         MOV.b W0, [W1]
     }

     while(OSCCONbits.COSC != 0b001);                                           //Esperando pelo novo oscilador
     while(OSCCONbits.LOCK != 1);                                               //Esperando o PLL ficar pronto
}

void IniciaUsart1(){
     //Configuração USART1
     //U1MODE
     U1MODEbits.UEN = 0;                                                        //TX, RX Ativados, CTS e RTS Desativados
     //U1MODEbits.USIDL = 0;                                                      //Continuar em IDLE
     //U1MODEbits.IREN = 0;                                                       //Não é IR
     U1MODEbits.RTSMD = 0;                                                      //Modo Simplex
     //U1MODEbits.WAKE = 0;                                                       //Não Acorda
     //U1MODEbits.LPBACK = 0;                                                     //Sem LoopBack
     U1MODEbits.ABAUD = 0;                                                      //Desativando Auto-Baud
     //U1MODEbits.URXINV = 0;                                                     //Estado-Padrão = 1
     U1MODEbits.BRGH = 1;                                                       //Modo de Alta Velocidade
     U1MODEbits.STSEL = 0;                                                      //Stop bits = 1
     U1MODEbits.PDSEL = 0;                                                      //Sem Paridade, 8 bits de dados
     
     U1BRG = BRGVAL;                                                            //Configurando Baud-Rate
     //U1STA
     //U1STAbits.UTXISEL1 = 0;                                                    //Interrupção a cada Char
     //U1STAbits.UTXISEL0 = 0;
     //U1STAbits.UTXINV = 0;                                                      //Estado-Padrão = 1
     //U1STAbits.UTXBRK = 0;
     U1STAbits.URXISEL = 0b00;                                                  //Interrupção a cada Caracter Recebido
     //U1STAbits.ADDEN = 0;                                                       //Endereços desativados
     
     U1RXIE_bit = 1;                                                            //Ativando Interrupção RX
     U1RXIF_bit = 0;                                                            //Limpando Interrupção RX

     IPC2bits.U1RXIP = 2;                                                       //Prioridade RX UART = 1
     U1MODEbits.UARTEN = 1;                                                     //Ativando UART
     //U1STAbits.UTXEN = 1;                                                       //Ativando Transmissão
}

void IniciaTimer1(){
     //Configuração Timer1
     IPC0bits.T1IP = 1;                                                         //Prioridade Timer1 = 1
     PR1 = 65500;
     T1IF_bit = 0;
     T1IE_bit = 1;                                                              //Ativando Interrupção
     T1CON = 0x8030;                                                            //Ligado com Prescaler de 256
}

void main() {
     NovoOscilador();

     //Configuração de Portas
     ADPCFG = 0xFFFF;                                                           //Tudo Digital
     TRISB = 0;                                                                 //Tudo Saída
     TRISC = 0;
     TRISD = 0;
     TRISF = 0;
 
     LATB = 0;                                                                  //Reiniciando Entrada
     LATC = 0;
     LATD = 0;
     LATF = 0;
     
     IniciaTimer1();
     IniciaUsart1();

     delay_ms(10);
     serial = 0;
  while(1) {
  }
}


O código funcionou, porém nem todas as vezes que eu envio um char a interrupção é disparada. Além disso, mesmo seguindo todas as instruções dos Reference Manual disponibilizados pela Microchip eu não consegui fazer uma transmissão no sentido dsPIC-PC.

Ou seja, no sentido dsPIC-PC a conexão está inaceitavelmente instavel e no outro sentido ela simplesmente não existe (quando todas as configurações são executadas)

Estou utilizando o FRC com multiplicador de 43 e divisores de 2, o que dá 79,225MHz.

Já tentei de tudo e não sei o que está acontecendo!

Atenciosamente,
Emilio Eduardo
Emilio Eduardo
Bit
 
Mensagens: 44
Registrado em: 13 Jan 2009 19:07

Mensagempor Maia » 06 Dez 2011 12:02

Olá,
Fcy geralmente = Fosc/4. Está certo que nesse dsPIC é Fosc/2? Clock interno RC é muito instável. O ideal é usar cristal.
Abç,
Maia
Avatar do usuário
Maia
Byte
 
Mensagens: 345
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor Emilio Eduardo » 07 Dez 2011 09:09

Bom Dia Maia,

Muito Obrigado pela ajuda, entretanto ela ainda não resolveu o meu problema.

Sim, o Fcy = Fosc/2 nos dsPIC em geral, está no reference manual, seção 7, página 23.

Em relação a utilizar o FRC, no reference manual, seção 17, página 16, ele cita no código a utilização do FRC com transmissão UART. Vou fazer uns testes aqui para determinar a imprecisão do FRC mas acredito que ela esteja dentro do aceitável, uma vez que no datasheet o erro máximo é de 2% para mais ou 2% para menos. Eu acredito que essa precisão seja suficiente para a UART, não?

O problema de utilizar o cristal da placa é que ele não possui valor escrito nele e não é o especificado pelo esquema da placa! Vou procurar mais informações sobre ele e ver se resolvo meu problema.

Atenciosamente,
Emilio Eduardo
Emilio Eduardo
Bit
 
Mensagens: 44
Registrado em: 13 Jan 2009 19:07

Mensagempor Emilio Eduardo » 07 Dez 2011 10:06

Bom Dia Novamente Maia!

Consegui resolver o meu problema, acredite, o esquema da placa está errado!

Para caso alguém pesquisar isso novamente:
O FRC com UART funciona (Testado com 57600bps)

Atenciosamente,
Emilio Eduardo
Emilio Eduardo
Bit
 
Mensagens: 44
Registrado em: 13 Jan 2009 19:07

Voltar para DSP

Quem está online

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

cron