0
\$\begingroup\$

I'm trying to communicate with a PIC32MX795F512H using UART but I get scrambled signs in my terminal.

I know it's a timing/clock issue but I have no idea where and how to fix it. I am not using an external crystal and nothing is connected to the PIC (except the necessary minimum (caps, wires and a resistor)).

The code:

#include <p32xxxx.h>
#include <plib.h>

#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_1

#define DESIRED_BAUDRATE    (9600)
#define SYSCLK          (80000000L)

#define CONFIG1 (ADC_MODULE_ON | ADC_FORMAT_INTG32 | ADC_CLK_AUTO |      ADC_AUTO_SAMPLING_ON)
#define CONFIG2 (ADC_VREF_AVDD_AVSS | ADC_OFFSET_CAL_DISABLE | ADC_SCAN_ON | ADC_SAMPLES_PER_INT_1 | ADC_ALT_BUF_OFF | ADC_ALT_INPUT_OFF)
#define CONFIG3 (ADC_CONV_CLK_INTERNAL_RC | ADC_SAMPLE_TIME_15)
#define CONFIGPORT (ENABLE_AN15_ANA)
#define CONFIGSCAN (SKIP_SCAN_AN0 | SKIP_SCAN_AN1 | SKIP_SCAN_AN2 | SKIP_SCAN_AN3 | SKIP_SCAN_AN4 | SKIP_SCAN_AN5 | SKIP_SCAN_AN6 | SKIP_SCAN_AN7 | SKIP_SCAN_AN8 | SKIP_SCAN_AN9 | SKIP_SCAN_AN10 | SKIP_SCAN_AN11 | SKIP_SCAN_AN12 |  SKIP_SCAN_AN13 |  SKIP_SCAN_AN14)

unsigned char data;
int pbClk;


void initializeADC(){
    CloseADC10();       // Generally, you should disable the ADC before setup.

    SetChanADC10( ADC_CH0_NEG_SAMPLEA_NVREF);
    OpenADC10( CONFIG1, CONFIG2, CONFIG3, CONFIGPORT, CONFIGSCAN);
                // Setup for the ADC10.
    EnableADC10();      // Enables the ADC10.
    while(!mAD1GetIntFlag() ) {}; // mAD1GetIntFlag() checks the interrupt flag for the AD10.
                      // Waits till a conversion is finished so that there's
                      // values in the ADC result registers.
}

void initializeLEDBar(){
    TRISDCLR = 0xFF;    // Sets pins RD0 to RD7 as digital outputs.
}

void initializeUART()
{
    // Optimize PIC32 performance and return peripheral bus frequency
    pbClk=SYSTEMConfig(SYSCLK, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);

    // Enable UART1 and set baud rate to DESIRED_BAUDRATE=9600
    OpenUART1(UART_EN, UART_RX_ENABLE | UART_TX_ENABLE, pbClk/16/DESIRED_BAUDRATE-1);

    while(BusyUART1()); // Wait until the UART module is free
    putsUART1("Turning the potentiometer will change characters on screen!");
} 


//     ==============================================================================================

int main(){
    initializeUART();   // Initialize the UART module
    initializeADC();    // Initialize the ADC10
    initializeLEDBar(); // Initialize pins RD0 - RD7 as digital outputs

    while(1){

        // Map the 10 bit analog value to a value between 33 and 126, and bit-mask it to 8-bits
        data = ((ReadADC10(0)/11) + 33) & 0xFF;
        LATD = data;                // Latch the data to the port D pins  

        while(BusyUART1());         // Wait until UART2 module is not busy
        putcUART1(data);            // Transmit 'data' through UART
        putcUART1('13');            // Transmit '13' (carriage return)
    }
    return 1;
}
\$\endgroup\$
5
  • \$\begingroup\$ Do you happen to have a scope or logic analyzer? Could help you see if the timing is actually what's going on. \$\endgroup\$ Commented Jan 3, 2013 at 16:46
  • 2
    \$\begingroup\$ Show us the scrambled text and the expected text. \$\endgroup\$
    – jippie
    Commented Jan 3, 2013 at 16:56
  • \$\begingroup\$ "I'm not using an external crystal...", but you may in fact need to use one... \$\endgroup\$
    – vicatcu
    Commented Jan 3, 2013 at 17:16
  • \$\begingroup\$ I'll add a screenshot tomorrow if it isn't resolved yet. I have a scope but not a logic analyzer so I can only see the block waves pass by. \$\endgroup\$
    – JoGe
    Commented Jan 3, 2013 at 21:18
  • \$\begingroup\$ Output in ASCII: tinypic.com/r/10zp9ow/6 and output in binary: tinypic.com/r/14dcy0x/6. Normally it should output "Turning the potentiometer will change characters on screen!" first and then values of the ADC. Neither show correctly. \$\endgroup\$
    – JoGe
    Commented Jan 4, 2013 at 9:42

1 Answer 1

3
\$\begingroup\$
putcUART1(data);            // Transmit 'data' through UART

The "data" will be put out in binary aka "scrambled signs". On the terminal you'll likely want hex or decimal chars: You need to convert the data first.

putcUART1('13');            // Transmit '13' (carriage return)

The code does not match the comment. BTW: This should generate a compiler warning about a multi-character constant. Correct this to:

putcUART1(13);

This will output a CR.

I recommend reading a book about the C programming language. Then you will understand much better what happened and why.

\$\endgroup\$
0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.