dsPIC series are famous for embedded system development. However, it is difficult for me to use dsPIC30F4013 to blink LED and communicate with the PC through the UART (Universal Asynchronous Receiver/Transmitter) communication.
I share the sample code of LED Blinking and UART communication for dsPIC30F4013.
This code works with the internal clock.
It blinks LED at 1Hz intervals and transfers "S" through the UART communication.
Circuit
Photo (Breadboard Prototyping)
Wiring Table
dsPIC30F4013 | Peripheral Devices (LED or FT232) |
---|---|
Vdd | 3V3(FT232) |
Vss | GND(FT232) |
pin25(U1TX) | RXD(FT232) |
pin26(U1RX) | TXD(FT232) |
pin27 | Anode(LED) |
Source Code
// FOSC
#pragma config FOSFPR = FRC_PLL4 // Oscillator (Internal Fast RC (No change to Primary Osc Mode bits))
#pragma config FCKSMEN = CSW_FSCM_OFF // Clock Switching and Monitor (Sw Disabled, Mon Disabled)
// FWDT
#pragma config FWPSB = WDTPSB_16 // WDT Prescaler B (1:16)
#pragma config FWPSA = WDTPSA_512 // WDT Prescaler A (1:512)
#pragma config WDT = WDT_OFF // Watchdog Timer (Disabled)
// FBORPOR
#pragma config FPWRT = PWRT_64 // POR Timer Value (64ms)
#pragma config BODENV = BORV27 // Brown Out Voltage (2.7V)
#pragma config BOREN = PBOR_ON // PBOR Enable (Enabled)
#pragma config MCLRE = MCLR_DIS // Master Clear Enable (Enabled)
// FGS
#pragma config GWRP = GWRP_OFF // General Code Segment Write Protect (Disabled)
#pragma config GCP = CODE_PROT_OFF // General Segment Code Protection (Disabled)
// FICD
#pragma config ICS = ICS_PGD // Comm Channel Select (Use PGC/EMUC and PGD/EMUD)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
unsigned int counter = 0; // Initialize counter
int main() {
/* OSCCON oscillator setting register */
OSCCONbits.CF = 0; // Not detected clock failure
OSCCONbits.COSC = 0b111; // PLL oscillator which was defined FOSFPR
OSCCONbits.LOCK = 1; // PLL is in lock
OSCCONbits.LPOSCEN = 0; // Secondary oscillator is disabled
OSCCONbits.NOSC = 0b111; // New PLL oscillator which was defined
OSCCONbits.OSWEN = 0; // Switch is completed
OSCCONbits.POST = 0; // Postscaler does not alter clock
/* IO Setting */
TRISA = 0; // Digital out
TRISB = 0; // Digital out
TRISC = 0; // Digital out
TRISD = 0; // Digital out
TRISF = 0; // Digital out
TRISFbits.TRISF2 = 1; // RX pin setting
TRISFbits.TRISF3 = 0; // TX pin setting
TRISBbits.TRISB0 = 1; // Analog in
TRISBbits.TRISB1 = 1; // Analog in
TRISBbits.TRISB2 = 1; // Analog in
TRISBbits.TRISB3 = 1; // Analog in
TRISBbits.TRISB4 = 1; // Analog in
TRISBbits.TRISB5 = 1; // Analog in
TRISBbits.TRISB8 = 1; // Analog in
TRISBbits.TRISB9 = 1; // Analog in
TRISBbits.TRISB10 = 1; // Analog in
TRISBbits.TRISB11 = 1; // Analog in
TRISBbits.TRISB12 = 1; // Analog in
/*Timer Setting Register(ADC Sampling Time Management)*/
T1CONbits.TON = 0; //Timer OFF. タイマーOFF.
T1CONbits.TCS = 0; //Use internal Clock. 内部クロックを使用.
T1CONbits.TGATE = 0; //Gate time accumulate is off.ゲートタイム累積無効.
T1CONbits.TSIDL = 0; //Continue on IDLE mode. アイドルモードでタイマ継続.
T1CONbits.TSYNC = 0; //NONE. 無視(TCS = 0のとき)
T1CONbits.TCKPS = 0b11; //prescaler 256
/*Interrupt Setting*/
PR1 = 28; //700Hz
IPC0bits.T1IP = 5; //Interrupt priority is 5. 優先順位5, 高いほうが優先順位が高い.
IEC0bits.T1IE = 1; //Timer 1 interrupt is enable. タイマ1割り込みON.
IFS0bits.T1IF = 0; //Timer 1 Interrupt flag is off. タイマ1割り込みフラグ0。
T1CONbits.TON = 1; //Timer ON
/* UART Setting */
U1MODEbits.UARTEN = 1; //UART disabled
U1MODEbits.USIDL = 0; //Run UART on IDLE mode
U1MODEbits.ALTIO = 0; //Alternate pin is enabled
U1MODEbits.WAKE = 0; //Wakeup is disabled
U1MODEbits.LPBACK = 0; //Loopback mode is disabled
U1MODEbits.ABAUD = 1; //U1RX to Capture
U1MODEbits.PDSEL = 0; //No parity 8-bit
U1MODEbits.STSEL = 0; //1STOP bit
U1STAbits.UTXISEL = 1; //When buffer is empty
U1STAbits.UTXBRK = 0; //Transfer break is normal mode
U1STAbits.URXISEL = 0b00; //When accepting any character, interrupt is occured
U1STAbits.ADDEN = 0; //Address detector is disabled
U1STAbits.OERR = 0; //Not Overrun (First write only)
U1BRG = 49;
U1MODEbits.UARTEN = 1; //UART disabled
U1STAbits.UTXEN = 1; //UART TX is enabled.
PORTFbits.RF5 = 1; // Invert bit
while(1);
}
int flagLED = 0;
int counterLED = 0;
void __attribute__((interrupt, shadow, auto_psv)) _T1Interrupt(void) {
IFS0bits.T1IF = 0; // Flag is low
counterLED++;
if(counterLED >= 1000) {
printf("S\n");
if (flagLED == 0) flagLED = 1;
else flagLED = 0;
PORTFbits.RF5 = flagLED;
counterLED = 0;
}
}
Demo
This original article is the following that is written by me. This article was translated from Japanese to English.
Top comments (0)