Ir ao conteúdo
  • Cadastre-se
Luan Borges

PIC Como configurar UART PIC24FJ256GB106

Recommended Posts

Olá a todos. Então, resolvi uma coisa e fui passa pra outra, e isso mesmo, treta. É o seguinte, eu consigo enviar dados pela UART do PIC24FJ256GB106, mas não consigo enviar nada para ele, não vai, no proteus dar a seguinte mensagem: [PIC24 UART1] A leitura do RXREG quando o FIFO está vazio retorna o valor anterior. [U3]. o codigo que estou usando é esse ja que o da biblioteca do Mikroc nessa família 24f é a mesma coisa q nada:

 

 

 

void uart_setup(void)
{

    /*Enable UART interrupts*/
    IEC0bits.U1RXIE = 1; // interrupt on reception allowed
    IEC0bits.U1TXIE = 0; // no interrupt on transmition
    IEC4bits.U1ERIE = 1; // interrupts on errors allowed
    IPC2bits.U1RXIP = 5; // interrupt level of reception
    IPC16bits.U1ERIP = 6; // interrupt level on errors
    U1STAbits.URXISEL = 0; // interrupt when any character is received

    /* Initialize UART1 */
    U1BRG = 25;                     //Baud rate set to 9600
    U1MODEbits.STSEL = 0; // 1 stop bit
    U1MODEbits.PDSEL = 0; //8 bit data, no parity
    U1MODEbits.BRGH = 0; //Standard speed mode
    U1MODEbits.RXINV = 0; //UxRX idle state is '1'
    U1MODEbits.ABAUD = 0; //Auto-Baud disabled
    U1MODEbits.LPBACK = 0; //Loopback disabled
    U1MODEbits.WAKE = 1; //Wake up on start bit detect
    U1MODEbits.UEN = 0; //UTx and URx enabled
    U1MODEbits.IREN = 0; //IrDA disabled
    U1STAbits.ADDEN = 0; //Adress detec mode disabled
    SRXMPT_bit = 1;
    IC1CON1 = 0x1C00;
    //U1RX_Clear_Intr_Status_Bit; //clear RX interrupt falg
    U1MODEbits.UARTEN = 1; //UART enable
}

 

long t;

 

void main()
{

 

//---------------- PORT's ----------------//
  TRISB = 0xFF;
  PORTB = 0x0000;

  TRISC = 0x00;
  PORTC = 0x00;

  TRISD = 0x0000;
  PORTD = 0x0000;

  TRISE = 0x00;
  PORTE = 0x00;

  TRISF = 0xFFFF;
  PORTF = 0xFFFF;

  TRISG = 0x00;
  PORTG = 0x00;

 

 

       // BLUETOOTH

          uart_setup();

        RPOR5bits.RP11R=3; //TX
        RPOR5bits.RP10R=4; //RX
          Delay_ms(100);


       

          

  

while(1)
{

 

 

     t++;
     U1TXREG = t;
                                    // ta bagunçado e se sentindo porque é só pra fazer uns teste pra ver se ta indo ou não.
     tt = U1RXREG;

      switch(tt)
      {
        case '1': led = 1;break;
        case '2': led = 0;break;
        case '3': led1 = 1;break;
        case '4': led1 = 0;break;

      }//END Bluetooth_RD.

       led2 = 1;
       Delay_ms(100);
       led2 = 0;
       Delay_ms(100);


}

 

Alguém pode me ajudar a configurar a UART dele? A ideia principal é apenas receber dados, e trata eles em um Switch, Nem preciso que ele envie dados, só cloquei pra enviar por motivos de testes.

Muito obrigado pela atenção de todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Luan Borges disse:

IEC0bits.U1RXIE = 1; // interrupt on reception allowed

Cadê a rotina de interrupção? é nela que você deve passar do buffer para a variável global tt

algo como:

void interrupt serial1() //interrupt é palavra chave dependente de compilador.

{

tt = U1RXREG;

}

Pode manter a leitura no loop neste caso desabilite a interrupt pois o trem pode descarrilar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como você não quis criar a rotina de interrupção, monitore manualmente algum bit de recepção. Instintivamente faz de conta que é o bit "U1STAbits.URXISEL = 0; // interrupt when any character is received" algo como:

for(;;)
{
while(!U1STAbits.URXISEL); //consulte o d.s. pra ver qual bit vai pra 1 quando chega dado
tt = U1RXREG;
switch(tt)
      {
        case '1': led = 1;break;
        case '2': led = 0;break;
        case '3': led1 = 1;break;
        case '4': led1 = 0;break;

      }//END Bluetooth_RD.
U1STAbits.URXISEL = 0;
}

...

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que conseguir, a leitura ta um pouco bagunçada, mas pelo menos está lendo algo, o erro aparentemente era no PPS,

achei em um site amaricamo  algo relacionando e configurei os pinos como:  

       TRISD9_bit = 1;
       TRISD8_bit = 0;                                   
       RPINR18bits.U1RXR = 4;                                   
       RPOR1bits.RP2R = 3;

 deu um nó na minha cabeça porque tive que ir pra cima e para baixo no datasheet todo,

estou usando os exemplos da biblioteca do mikroc mesmo, nada do código que postei, apenas o da biblioteca.

 

Estou usando um LCD pra visualizar melhor o que o PIC esta lendo no buffer, agora o que eu não estou entendo é que quando eu coloco 1 no LCD parece 49, 2 aparece 50, 3 aparece 51, 4  aparece 52, continua com essa sequência  até o numero 8, o 9 ja não vai, sabe o que pode ser isso?       

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Isadora Ferraz .

 

Mas quanta complicação para usar recursos tão simples .....  acho que com essas novas familias a programação fica cada vez mais tediosa, estou com saudades dos velhos 16f877 ...  agora tem muito detalhe para se preocupar, e perde-se muito tempo para que um simples módulo interno funcione ...

 

Paulo

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pior Paulão. Pior são os LPC e ST. Mas pra quem não tá nem aí em entender nada do funcionamento do mc (arduíno, ccs e afins) e só quer moleza ... acho que vai ter dificuldade ainda maior..🤪... A propósito...

 

11 horas atrás, Luan Borges disse:

quando eu coloco 1 no LCD parece 49, 2 aparece 50

Amigo o lcd espera receber caracteres asc-ii. Perceba que 1 é justamente 49 em asc-ii.  você incorre justamente no problema acima. Está focado apenas na moleza do sw. Vai ter que dar uma olhadela no d.s. do display ou pegar algo pronto no google. Isso eu permito mas desde que compreendas o que faz a função e como/porque ela se interage com o hw ok?

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×