collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: PIC24FJ64GA002 UART não quer falar comigo  (Lida 11188 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.947
  • NERD!
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #15 em: 19 de Agosto de 2013, 11:13 »
Outra ideia:
De certeza que fica bloqueado em high? Confirma se não tens dados na saída da UART (RB3).
O código como está vai encher o buffer de saída logo no inicio, e depois bloqueia na função UART1PutChar :
Código: [Seleccione]
while(U1STAbits.UTXBF == 1);à espera que o buffer tenha vaga. Os pulsos na saída só vão acontecer uma vez cada carater enviado, o que dá um período de uns 260us (10bits/38400bps=260us), muito longo em relação ao tamanho do pulso.
Para teres pulsos com duty de 50%, muda o ciclo principal para:
Código: [Seleccione]
    while(1){
        PORTBbits.RB15 = 0;  //Toogle RB15
        UART1PutChar('U');   //LINHA ADICIONADA PARA DUTY CYCLE DE 50%
        PORTBbits.RB15 = 1;
        UART1PutChar('U');
    }

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #16 em: 19 de Agosto de 2013, 13:33 »
Sim, fica para sempre a High, o osciloscópio não mente, e não tenho nada no TX, nada de nada.
Avr fanboy

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #17 em: 19 de Agosto de 2013, 14:31 »
Não tens de definir os bits UEN1:UEN0 do registo U1MODE ? em princípio não é preciso, mas..
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #18 em: 20 de Agosto de 2013, 03:53 »
Posso declarar explicitamente como 00, porque o que quero é isto no UEN:
00 = UxTX and UxRX pins are enabled and used; UxCTS, UxRTS and BCLKx pins are controlled by
port latches

Amanhã já me vou debruçar mais um bocadinho, se continuar teimoso é STM32 for the win e esqueço de vez esta coisa..
Avr fanboy

Offline Samy74

  • Mini Robot
  • *
  • Mensagens: 54
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #19 em: 22 de Agosto de 2013, 00:22 »
Boas


Estive a ver o teu código e a configuração parece-me bem. Penso que o teu problema estará no putChar que  fica em ciclo infinito no while e nunca chega a escrever o carater na UART. A minha função de escrita na UART é esta, experimenta algo parecido só tens que mudar a condição do while.

Código: [Seleccione]
void printU1(char * str) {
    unsigned int i;

    i = 0;
    while (str[i] != '\0') {
        IFS0bits.U1TXIF = 0;
        U1TXREG = str[i];
        i++;
        while (IFS0bits.U1TXIF == 0);
    }
}

Experimenta, se não der assim eu arranjo-te a parte de inicialização e também e aí tem que dar :-)

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #20 em: 23 de Agosto de 2013, 02:38 »
Mas supostamente tens de fazer a verificação para saber se o buffer de transmissão está ou não cheio, assim arriscaste a ter um buffer over-run, ou não?
Podes postar a parte da inicialização se não te importares?
Avr fanboy

Offline Samy74

  • Mini Robot
  • *
  • Mensagens: 54
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #21 em: 23 de Agosto de 2013, 10:01 »
Na verdade não, cada vez que carregas um caracter no buffer, esperas que seja enviado. Essa flag indica precisamente isso. Eu uso exactamente o que está aí para enviar strings e funciona bem. De qualquer forma, o teu código devia funcionar também, há algo que está a escapar.

Código: [Seleccione]
//UART1 configuration

    // Assign U1RX To Pin RP1
    RPINR18bits.U1RXR = 1;
    // Assign U1TX To Pin RP0
    RPOR0bits.RP0R = 3;

    U1BRG = 100; //38400
    U1MODE = 0;
    U1STA = 0;
    U1MODEbits.UEN1 = 0; // no flow control
    U1MODEbits.UEN0 = 0;
    U1MODEbits.BRGH = 1;

    U1MODEbits.UARTEN = 1;
    U1STAbits.UTXEN = 1;

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #22 em: 01 de Setembro de 2013, 20:45 »
Pic arrumado, continua a não dar sinal de vida, se retirar o tal while não transmite nada lol, vou assumir que os 3 pic24 que aqui tenho por algum alinhamento cósmico estão estragados(apesar de nunca usados) e esquecer isto, demasiado tempo perdido meh..
Avr fanboy

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #23 em: 01 de Setembro de 2013, 20:56 »
Pic arrumado, continua a não dar sinal de vida, se retirar o tal while não transmite nada lol, vou assumir que os 3 pic24 que aqui tenho por algum alinhamento cósmico estão estragados(apesar de nunca usados) e esquecer isto, demasiado tempo perdido meh..

Camarada, viste o codigo q te mandei ?

Eh precoce desistir de um problema tao simples. Trabalhar na industria nao pertmite isso, especialmente qd obrigatoriamente tens q trablahar com micro X ou Y ou Z.


Offline Samy74

  • Mini Robot
  • *
  • Mensagens: 54
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #24 em: 01 de Setembro de 2013, 21:07 »
Pic arrumado, continua a não dar sinal de vida, se retirar o tal while não transmite nada lol, vou assumir que os 3 pic24 que aqui tenho por algum alinhamento cósmico estão estragados(apesar de nunca usados) e esquecer isto, demasiado tempo perdido meh..

Mandei-te o código exactamente como tenho a funcionar. Já viste a configuração do pinos? Penso que por defeito alguns pinos estão em modo analógico, poderá ser isso.

Offline Samy74

  • Mini Robot
  • *
  • Mensagens: 54
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #25 em: 01 de Setembro de 2013, 21:12 »
É deste registo que falo, experimenta.


Código: [Seleccione]
//PORTS configuration
    AD1PCFG = 0b1110111111001100;

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #26 em: 01 de Setembro de 2013, 22:12 »
Sim Asena, vi o código, tentei MUITAS coisas.
Eu sei que ambiente de trabalho posso ser obrigado a usar X ou Y, a questão é que já usei PIC32 e um PIC18F qualquer coisa e funcionaram perfeitamente bem, foi ler datasheet e usar, como estes não funcionam e já cá andam em casa á uns 2 anos, foi tudo para o lixo.
Nunca tive nenhum problema em saltar para outro micro, agora estes fazem-me perder tempo demais para meter uma simples uart a funcionar.
Avr fanboy

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #27 em: 01 de Setembro de 2013, 22:15 »
É deste registo que falo, experimenta.


Código: [Seleccione]
//PORTS configuration
    AD1PCFG = 0b1110111111001100;

Estava assim:
AD1PCFG = 0xFFFF;
Logo disso não devia ser o problema, até porque podia fazer toogle/high/low a qualquer pino no porto da uart e funcionava, logo estavam a funcionar em modo digital.
Avr fanboy

Offline Samy74

  • Mini Robot
  • *
  • Mensagens: 54
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #28 em: 01 de Setembro de 2013, 22:52 »
É estranho porque não tive qualquer problema em por a UART a rolar. Quando tiver um pouco de tempo mando-te um projecto a funcionar e é so programaro PIC, assim tem que funcionar.

Offline Samy74

  • Mini Robot
  • *
  • Mensagens: 54
Re: PIC24FJ64GA002 UART não quer falar comigo
« Responder #29 em: 02 de Setembro de 2013, 14:44 »
Aqui fica o prometido, os pinos TX e RX estão no mesmos da programação, assim pode-se usar o mesmo pente para programar e para debug. Copy paste e tem que funcionar

Código: [Seleccione]
/*************************************************
 * File:   main.c
 * Author: Samuel Matos
 *************************************************/

#include <p24FJ64GA002.h>

#define F_CPU 16000 // FOSC/2 (kHz)

#define T1_PRE 8
#define T1_INT 5 //ms
#define KT1 (unsigned int) (F_CPU/T1_PRE)*T1_INT

_CONFIG1(
        JTAGEN_OFF /*Jtag OFF*/
        & GCP_ON /*Code protect on*/
        & GWRP_OFF /*Write protect off*/
        & BKBUG_OFF /*Backgroud debug off*/
        & COE_OFF /*Chip on emulation off*/
        & ICS_PGx1 /*EMUC/EMUD share PGC1/PGD1*/
        & FWDTEN_OFF) /*Watchdog timer disabled*/
/*& WINDIS_OFF Windowed WDT disabled*/


_CONFIG2(IESO_OFF & FNOSC_FRCPLL & FCKSM_CSDCMD & OSCIOFNC_ON & IOL1WAY_OFF & I2C1SEL_SEC & POSCMOD_NONE)


typedef enum {
    bFALSE,
    bTRUE
} boolean;

void printU1(char * str);
void initPic(void);


boolean timeTick5ms;

int main(void) {

    unsigned char aux = 0;

    initPic();

    while (1) {

        if (timeTick5ms == bTRUE) {
            timeTick5ms = bFALSE;
            aux++;
        }



        if (aux == 200) {
            aux = 0;

            printU1("Teste\r\n");

        }
    }

}

void printU1(char * str) {
    unsigned char i;

    i = 0;
    while (str[i] != '\0') {
        IFS0bits.U1TXIF = 0;
        U1TXREG = str[i];
        i++;
        while (IFS0bits.U1TXIF == 0);
    }
}

void initPic(void) {

    // Clock

    CLKDIVbits.RCDIV = 0; // 8MHz

    //PORTS configuration
    AD1PCFG = 0b1110111111001100;

    TRISA = 0b00011;
    TRISB = 0b0001001100001111;

    //UART1 configuration

    // Assign U1RX To Pin RP1
    RPINR18bits.U1RXR = 1;
    // Assign U1TX To Pin RP0
    RPOR0bits.RP0R = 3;

    U1BRG = 100; //38400
    U1MODE = 0;
    U1STA = 0;
    U1MODEbits.UEN1 = 0; // no flow control
    U1MODEbits.UEN0 = 0;
    U1MODEbits.BRGH = 1;

    U1MODEbits.UARTEN = 1;
    U1STAbits.UTXEN = 1;


    //Timer1
    T1CONbits.TSIDL = 1;
    T1CONbits.TCKPS1 = 0;
    T1CONbits.TCKPS0 = 1; //Prescaler 1/8
    // T1CONbits.T32 = 0;
    T1CONbits.TCS = 0;
    T1CONbits.TON = 1;

    PR1 = KT1;



    // Interrupts
    IFS0bits.U1RXIF = 0; // UART1
    IEC0bits.U1RXIE = 1;

    IFS0bits.T1IF = 0;
    IEC0bits.T1IE = 1; // Timer 1 interrupt

}

void __attribute__((__interrupt__, auto_psv)) _T1Interrupt(void) {

    PR1 = KT1;
    IFS0bits.T1IF = 0;
    timeTick5ms = bTRUE;
}

void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void) {

    IFS0bits.U1RXIF = 0;

    if (U1STAbits.OERR == 1) {
        U1STAbits.OERR = 0;
    } else {
        U1TXREG = U1RXREG; //mirror
    }
}