#include <p33FJ128GP802.h> _FOSC(OSCIOFNC_ON & FCKSM_CSDCMD & POSCMD_NONE); //Oscillator Configuration (clock switching: disabled; // failsafe clock monitor: disabled; OSC2 pin function: digital IO; // primary oscillator mode: disabled) _FOSCSEL(FNOSC_FRCPLL); //Oscillator Selection PLL //_FOSCSEL(FNOSC_FRC); //Oscillator Selection no PLL _FWDT(FWDTEN_OFF); //Turn off WatchDog Timer _FGS(GCP_OFF); //Turn off code protect _FPOR(FPWRT_PWR1); //Turn off power up timer void InitUART1() { // This is an EXAMPLE, so brutal typing goes into explaining all bit sets // The HPC16 board has a DB9 connector wired to UART2, so we will // be configuring this port only // configure U2MODE U1MODEbits.UARTEN = 0; // Bit15 TX, RX DISABLED, ENABLE at end of func //U2MODEbits.notimplemented; // Bit14 U1MODEbits.USIDL = 0; // Bit13 Continue in Idle U1MODEbits.IREN = 0; // Bit12 No IR translation U1MODEbits.RTSMD = 0; // Bit11 Simplex Mode //U2MODEbits.notimplemented; // Bit10 U1MODEbits.UEN = 0; // Bits8,9 TX,RX enabled, CTS,RTS not U1MODEbits.WAKE = 0; // Bit7 No Wake up (since we don't sleep here) U1MODEbits.LPBACK = 0; // Bit6 No Loop Back U1MODEbits.ABAUD = 0; // Bit5 No Autobaud (would require sending '55') U1MODEbits.URXINV = 0; // Bit4 IdleState = 1 (for dsPIC) U1MODEbits.BRGH = 0; // Bit3 16 clocks per bit period U1MODEbits.PDSEL = 0; // Bits1,2 8bit, No Parity U1MODEbits.STSEL = 0; // Bit0 One Stop Bit // Load a value into Baud Rate Generator. Example is for 9600. // See section 19.3.1 of datasheet. // U1BRG = (Fcy / (16 * BaudRate)) - 1 // U1BRG = (36850000 / (16 * 9600)) - 1 // U1BRG = 238.908854 //Round to 239 U1BRG = 239; // Load all values in for U1STA SFR U1STAbits.UTXISEL1 = 0; //Bit15 Int when Char is transferred (1/2 config!) U1STAbits.UTXINV = 0; //Bit14 N/A, IRDA config U1STAbits.UTXISEL0 = 0; //Bit13 Other half of Bit15 //U2STAbits.notimplemented = 0; //Bit12 U1STAbits.UTXBRK = 0; //Bit11 Disabled U1STAbits.UTXEN = 0; //Bit10 TX pins controlled by periph U1STAbits.UTXBF = 0; //Bit9 *Read Only Bit* U1STAbits.TRMT = 0; //Bit8 *Read Only bit* U1STAbits.URXISEL = 0; //Bits6,7 Int. on character recieved U1STAbits.ADDEN = 0; //Bit5 Address Detect Disabled U1STAbits.RIDLE = 0; //Bit4 *Read Only Bit* U1STAbits.PERR = 0; //Bit3 *Read Only Bit* U1STAbits.FERR = 0; //Bit2 *Read Only Bit* U1STAbits.OERR = 0; //Bit1 *Read Only Bit* U1STAbits.URXDA = 0; //Bit0 *Read Only Bit* U1MODEbits.UARTEN = 1; // And turn the peripheral on U1STAbits.UTXEN = 1; // I think I have the thing working now. } int main() { ADPCFG = 0xFFFF; //make ADC pins all digital //PLL setup: CLKDIVbits.PLLPRE = 0; // N1=2: PLL VCO Output Divider Select bits; 0 -> /2 (default) PLLFBDbits.PLLDIV = 42 - 2; // M=40: PLL Feedback Divisor bits; 42 - 2 = 40 -> 40 x multiplier // (divisor is 2 more than the value) CLKDIVbits.PLLPOST = 0; // N2=2: PLL Phase Detector Input Divider bits; 0 -> /2 //40 x: 73.700000 MHz = 36.850000 MIPS //42 x: 77.385 MHz = 38.6925 MIPS //43 x: 79.2275 MHz = 39.61375 MIPS while(OSCCONbits.LOCK != 1); // Wait for PLL to lock RCONbits.SWDTEN = 0; // Disable Watch Dog Timer TRISA = 0b00000000; TRISB = 0b00000000; asm volatile ("mov #OSCCONL, w1 \n" "mov #0x46, w2 \n" "mov #0x57, w3 \n" "mov.b w2, [w1] \n" "mov.b w3, [w1] \n" "bclr OSCCON, #6"); RPINR18bits.U1RXR = 7; RPOR3bits.RP6R = 0b00011; asm volatile ("mov #OSCCONL, w1 \n" "mov #0x46, w2 \n" "mov #0x57, w3 \n" "mov.b w2, [w1] \n" "mov.b w3, [w1] \n" "bset OSCCON, #6"); InitUART1(); while(1) { U1TXREG = 'H'; } return 0; }
Thursday, August 13, 2009
UART Example for DSPIC33 (DSPIC33FJ128GP802)
Subscribe to:
Post Comments (Atom)
Dude! you totally saved my day!!!
ReplyDeleteKeep up the good work!!! TY A LOT!!!
I´ve been trying this all day, with no results, until i found your page :D
PS: sorry about my english
could you explain what this program do, please, I´m a beginner in pic33
ReplyDeletethanks
Thanks for the code, helped a lot,
ReplyDeletei think there is a small bug though, U1BRG = 239; should be U1BRG = 23.9 or rounded U1BRG = 24.
Best
Hallo, thanks really much for your code! it was helpful to me.
ReplyDeleteOnly one thing, using it with a dsPIC33FJ64MC802, found out that :
PLLFBDbits.PLLDIV = 42 - 2; // M=40: PLL Feedback Divisor bits; 42 - 2 = 40 -> 40 x multiplier
// (divisor is 2 more than the value)
wasn't correct.
correct value is 38, that is 40 (the multiplier we want) -2 (not + 2).
Than your code is to put the character 'H' into the register. can you suggest the best and more simple way to write sequently more characters?
Thanks, D.
thank you your code really help me.....
ReplyDeleteIt just work good, thank you for your kind post. I am working whit dspic33 series and fits fine for my project.
ReplyDeleteI just have a doubt is why I can not use other ports to make the Uart work on them? I have tried configuring others and no way to make them transmit or receive....
but your information help me a lot.
Thanks