[Microchip]/dsPIC33E2014. 4. 12. 18:30

dsPIC33E - 내부플래시를 EEPROM 처럼 사용하기

dsPIC33E - 내부플래시를 EEPROM 처럼 사용하기

dsPIC은 내부 EEPROM이 없지만 내부 플래시 메모리를 EEPROM처럼 사용할 수 있다.


dsPIC33 시리즈는 "Flash Operations.s" 를 링크하면되고, dsPIC33E 시리즈는 "Flash Operations 33E_24E.s" 파일이 필요하다.




dsPIC33E EEPROM 테스트 예제코드


DEE Emulation 16-bit v2.2.zip


#include "system.h"

#include "serial.h"

#include <DEE Emulation 16-bit.h>


int main(void)

{

//Init System

SystemInit();

//Init LED

Led1Init();

Led1On();

DebugInit(BAUD_115200);

DebugPrint("dsPIC33E EEPROM TEST\r\n");

  //내부 플래시 초기화

DataEEInit();


addr = 0;

//내부 플래시 저장

DataEEWrite(0xA0, addr);



//저장된 데이터 읽어옴

temp = DataEERead(addr);


DebugPrint("Flash[%d] = %x\r\n", addr, temp);

if(temp == 0xA0)

{

Led1On();

}

while(1)

{

}

}


Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33E2014. 4. 6. 22:00

dsPIC33E - PWM 테스트 (HIGH-SPEED PWM MODULE)

dsPIC33E - PWM 테스트 (HIGH-SPEED PWM MODULE)



dsPIC33EPXXXMC20X/50X 시리즈는 모터제어를 위해 3채널(6 PWM)의 HIGH-SPEED PWM MODULE 이 있다.

70Mhz에서 7.14 ns의 듀티폭을 제어할 수 있다.


dsPIC33E PWM 핀맵

26-PWM1L/T5CK/RB15

25-PWM1H/T3CK/RB14


24-PWM2L/CTPLS/RB13

23-PWM2H/RB12


22-PWM3L/RB11

21-PWM3H/RB10




dsPIC33E PWM 블록도




dsPIC33E PWM 초기화 코드

void InitMCPWM(void)

{

    PTCON = 0x0000;

    PTPER = 16000; //1000

    PHASE1 = 0;

    PDC1 = 16000;


    DTR1 = 0;

    ALTDTR1 = 0;


    PWMKEY = 0xABCD;

    PWMKEY = 0x4321;


    IOCON1 = 0xCC00;

    PWMCON1 = 0x0000;


    PWMKEY = 0xABCD;

    PWMKEY = 0x4321;


    FCLCON1 = 0x0003;

    PTCON2 = 0x0003; //clock prescaler

    PTCON = 0x8000;

}




dsPIC33EP PWM 테스트 동영상

dsPIC33EP32 의 PWM을 이용하여 가변저항의 전압값에 따라 3색 컬러 LED의 밝기를 출력하는 테스트




dsPIC33E - PWM 테스트 예제 코드

int main(void)

{

unsigned int gPwm1Value = MAX_PWM_VALUE;

float adc = 0.0;


//Init System

SystemInit();


DebugInit(BAUD_115200);

DebugPrint("PWM Test\r\n");


//Init LED

Led1Init();

Led1Off();


AdcInit();


InitMCPWM();


while(1)

{

gAdcData[0] = AdcRead(0);

adc = (float)gAdcData[0]*(float)(MAX_PWM_VALUE/MAX_ADC_VALUE);

SetPwm1(adc);

}

}





Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33E2014. 4. 6. 21:00

dsPIC33E - ADC 테스트

dsPIC33E - ADC 테스트

dsPIC 은 10/12bit SAR ADC로 변환 속도는 최대 1.1Msps 이다. dsPIC33E에서는 약간의 변화가 있었는데 레지스터 맵이 조금 변경되어 기존코드의 수정이 필요 하다.

dsPIC33E ADC블록도
가장 큰 변화는 ADC1BUF가 FIFO형태로 변경된것 같다.



dsPIC33E ADC초기화 코드
//------------------------------------------------------------------------------
// Function Routine
//ADC Initialize
void AdcInit(void)
{
//ADCON1 레지스터 설정
AD1CON1bits.SAMP = 0; //ADC 샘플/홀드 홀딩
AD1CON1bits.ASAM = 1; //ADC 변환 즉시 샘플링 시작 설정
AD1CON1bits.SIMSAM=0; //순서대로 멀티플 채널 샘플 설정
AD1CON1bits.SSRC = 7; //샘플 클럭 설정: 내부 카운터 샘플링 끝나고 변환시작
AD1CON1bits.FORM = 0; //데이터 출력 형식: Integer 
//(DOUT = 0000 dddd dddd dddd)
AD1CON1bits.AD12B =1; //AD변환 비트 값 설정: 12-bit, 1-channel ADC operation
AD1CON1bits.ADDMABM=0; //DMA 버퍼를 Scatter/Gather 모드로 쓰기 설정

//AD1CON2 레지스터
AD1CON2bits.CSCNA=0; //CH0+ 입력에 대한 스캔 입력 설정: Scan inputs
AD1CON2bits.VCFG = 0; //AD변환 기준 전압 설정: Vreg+ = Vdd, Vreg- = Vss

//AD1CON3 레지스터
AD1CON3bits.ADCS = 0x08;//0x3F; //ADC 변환 클럭 설정 : 최대치 설정 
//Tad=Tcy*(ADCS+1)=(1/40M)*64 = 1.6us (625KHz)
//10비트 ADC 변환 시간 Tc = 12*Tad = 19.2us (52KHz)
AD1CON3bits.SAMC=1; //Auto Sample Time = 31*Tad
AD1CON3bits.ADRC=0; //ADC Clock을 시스템 클럭 사용 설정

//AD1CON4 Register 레지스터
AD1CON4bits.DMABL=0; //아날로그 입력당 DMA 버퍼 영역 설정: 1 워드 설정
//AD1CHS 레지스터 : ADC1 입력 채널 1,2,3 선택
AD1CHS123=0; //여기에서는 CH1,CH2,CH3을 사용 안함, 디폴트 값 0

//AD1CHS0 레지스터 : 
AD1CHS0=0; //디폴트 값

//AD1CSSL 레지스터 : AN0 ~ AN15 아날로그 입력 핀 설정
AD1CSSL = 0;

//AD1PCFGL 레지스터
AD1CSSL = 0x0000;
AD1CSSLbits.CSS0=1;   
AD1CSSLbits.CSS1=1;  


//ADC1 인터럽트 설정
IFS0bits.AD1IF = 0; //ADC1 인터럽트 플래그 클리어
IEC0bits.AD1IE = 0; //ADC1 인터럽트 시작 설정

//ADC1 컨버터 동작 개시 설정
AD1CON1bits.ADON = 1; //ADC1 컨버터 동작 
}



dsPIC33E ADC Test 동영상
가변저항에 의해 변화되는 전압값을 그래프로 표시


Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33E2014. 4. 5. 21:30

dsPIC33E - UART 테스트

dsPIC33E - UART 테스트





dsPIC33E UART 블록도




dsPIC33E UART 초기화 코드

UART도 약간의 레지스터 변화가 있어 코드수정이 필요하다.


void U0_Init(unsigned char baud)

{

U0_TXINIT();

U0_RXINIT();


U0_SetBaud(baud);


U1MODEbits.STSEL = 0; // 1 스톱 비트

U1MODEbits.PDSEL = 0; // No 패리티, 8비트  데이터 전송

U1MODEbits.ABAUD = 0; // Autobaud 중지

U1MODEbits.BRGH = 1;


U1STAbits.UTXISEL1 = 1; //인터럽트 사용 중지

U1STAbits.UTXISEL0 = 1; //인터럽트 사용 중지

U1STAbits.URXISEL  = 0; //1 문자 수신후, 인터럽트 발생


U1MODEbits.UARTEN   = 1; //UART1 모듈 동작 시작 설정

U1STAbits.UTXEN     = 1; //UART1 Tx 동작 설정


IFS0bits.U1TXIF = 0; //UART1 송신 인터럽트 플래그 클리어

IFS0bits.U1RXIF = 0; //UART1 수신 인터럽트 플래그 클리어


IEC0bits.U1TXIE = 0; //UART1 송신 인터럽트 중지

IEC0bits.U1RXIE = 0; //UART1 수신 인터럽트 중지


IEC4bits.U1EIE = 0; //UART1 에러 인터럽트 중지

}




dsPIC33E UART 송수신 함수

#define u0_WaitForReceive() while(!IFS0bits.U1RXIF);(IFS0bits.U1RXIF = 0)

#define u0_RxData() (U1RXREG)


#define u0_TxData(Data) (U1TXREG = Data)

#define u0_WaitForSend() while(!U1STAbits.TRMT)


#define u0_IsReceiveData() (IFS0bits.U1RXIF)



unsigned char U0_GetByte(void)

{

u0_WaitForReceive();

return u0_RxData();

}


void U0_PutByte(unsigned char Data)

{

u0_TxData(Data);

u0_WaitForSend();

}




Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33E2014. 4. 5. 20:39

dsPIC33E 개발환경 설정


dsPIC33E 개발환경 설정



dsPIC33E 시리즈는 70MIP의 High Performance DSCs로 업그레이드 되면서 개발환경도 업데이트가 필요하다 

우선 IDE는 최소 MPLAB IDE v8.92이상되어야 하고

컴파일러도 MPLAB C Compiler for PIC24 and dsPIC DSCs v3.31 이상 되어야 한다.


http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2115



하드위어 적인 핀맵은 거의 (사실 약간의 주의가 필요하다.) 동일하기 때문에 소프트웨어도 약간 수정 하면 될것으로 예상 했는데...

아쉽게도 수정할 부분이 꽤 있는것 같다.

그래도 성능이 향상 되었다고 하니 테스트 해봐야 할것 같다.

Posted by nexp

댓글을 달아 주세요