//긁어서 수정한건데 문젠 없겠지? 크크.
/************************************************************************************/
// dspic33FJ256GP710
// UART2 interrupt test.
// 아무래도 io포트설정중에서 입력으로 설정을 하고 기능 인에이블을 하면 기능을 쓸수있는 모양.
// 따로 io설정에서 기능설정은 없는듯 하다.
/************************************************************************************/
#include "p33Fxxxx.h"
_FOSCSEL(FNOSC_PRI);// 제1 오실레이터(XT, HS, EC)와 PLL 사용
_FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT);// OSC2 핀 클럭 출력, 제1 오실레이터 XT 크리스탈 모드
_FWDT(FWDTEN_OFF); // 왓치독 타이머 사용 중지
#define FCY 40000000 //동작 틀럭 주파수
#define BAUDRATE 9600 //UART2 Baudrate 9600bps
#define BRGVAL ((FCY/BAUDRATE)/16)-1
//function
void Initial_Clock(void);
void Initial_IO_Ports(void);
void Initial_UART2(void);
void __attribute__((__interrupt__)) _U2RXInterrupt(void);
void __attribute__((__interrupt__)) _U2TXInterrupt(void);
void UART2_Put_String(unsigned char *uart_string);
unsigned char UART2_Get_Char(void);
void delay_();
//value
const unsigned char Hello_UART2[] = {"Hello UART2 !!!"};
//UART2로 송신할 문자열 상수 선언부(프로그램 메모리 영역에 위치)
//램 영역에 저장한 경우 : unsigned char UART2_TX_Buf[10];
unsigned char *uart_string; //송신 문자열 포인터
int main(void)
{
//Initial_Clock(); //PLL 초기화
Initial_UART2(); //UART2 초기화
Initial_IO_Ports(); //포트 A 초기화
uart_string = Hello_UART2; //송신할 문자열 포인터 초기화
UART2_Put_String("_START_");
while(1)
{
UART2_Put_String("_START_");
delay_();
}
}
/**************************/
//initiation function
/**************************/
void Initial_IO_Ports(void)
{
/****************************************************************/
//TRISx: Data Direction register - 1 : input 0 : output
//PORTx: I/O Port register //data.
//LATx: I/O Latch register
//ODCx: Open-Drain Control register
/****************************************************************/
AD1PCFGH = 0xFFFF; //AN0~31 핀 모두 디지탈 포트 지정
AD1PCFGL = 0xFFFF;
//포트 A 초기화
TRISA = 0xFF80; //포트 A 입출력 방향 설정 : RA0~RA6 출력,RA7 입력 : 0b1111 1111 1000 0000
//포트 B 초기화
TRISB = 0xFF80;
//포트 C 초기화
TRISC = 0xFF80;
//포트 D 초기화
TRISD = 0xFFFF; //포트 D 입출력 방향 설정 : RD0~RD15 입력
//만약 다른 RD 핀들은 출력으로 놓고 싶다면, 0b0010 0000 1100 0000
//포트 E 초기화
TRISE = 0xFFFF;
//포트 F 초기화
TRISF = 0xFE94; // 11111110 1001 0100
//포트 G 초기화
TRISG = 0xFFFF;
//ODCB = 0;
}
void Initial_Clock(void)
{
//Fcy(인스트럭션 클럭) 클럭 계산 : 4.3.4절 동작 주파수 계산 참조
//Fcy = Fosc / 2 = [ Fxtal X M / (N1 x N2 ) ] / 2
//Fcy = [ 8MHz X 40 / ( 2 X 2 ) ] / 2 = 80MHz / 2 = 40MHz (40MIPS)
PLLFBD=38; // M=40
CLKDIVbits.PLLPOST=0; // N1=2
CLKDIVbits.PLLPRE=0; // N2=2
OSCTUN=0; // FRC 클럭 사용, 튜닝시 필요
RCONbits.SWDTEN=0; //왓치독 타이머 사용 중지
while(OSCCONbits.LOCK!=1); //PLL LOCK 까지 기다림
}
/**************************/
//serial(UART) function
/**************************/
void Initial_UART2(void)
{
U2MODEbits.STSEL = 0; // 1 스톱 비트
U2MODEbits.PDSEL = 0; // No 패리티, 8비트 데이터 전송
U2MODEbits.ABAUD = 0; // Autobaud 중지
U2BRG = BRGVAL; // 9600 Baudrate , BGR = 259
U2STAbits.UTXISEL1 = 1; //인터럽트 사용 중지
U2STAbits.UTXISEL0 = 1; //인터럽트 사용 중지
U2STAbits.URXISEL = 0; //1 문자 수신후, 인터럽트 발생
U2MODEbits.UARTEN = 1; //UART2 모듈 동작 시작 설정 enable uart.
U2STAbits.UTXEN = 1; //UART2 Tx 동작 설정
IFS1bits.U2TXIF = 0; //UART2 송신 인터럽트 플래그 클리어
IFS1bits.U2RXIF = 0; //UART2 수신 인터럽트 플래그 클리어
IEC1bits.U2TXIE = 0; //UART2 송신 인터럽트 중지
IEC1bits.U2RXIE = 0; //UART2 수신 인터럽트 중지
IEC4bits.U2EIE = 0; //UART2 에러 인터럽트 중지
}
void UART2_Put_String(unsigned char *uart_string)
{
while(*uart_string != 0 ) //문자열 마지막 널 문자인지 확인
{
U2TXREG = *uart_string++; //문자열 하나씩 출력 후, 포인터 1 증가
while(!U2STAbits.TRMT); //송신 쉬프트 버퍼가 비워졌는지, 즉 송신 완료가 되었는지 확인
}
}
unsigned char UART2_Get_Char(void)
{
while(!IFS1bits.U2RXIF); //UART2 한 문자 수신할 때 까지 기다림
//인터럽트 플래그가 세트 될 때, 수신 완료됨
IFS1bits.U2RXIF = 0;
return U2RXREG; //수신된 한 문자 리턴 함
}
/**************************/
//interrutp function
/**************************/
void __attribute__((__interrupt__)) _U2RXInterrupt(void)
{
IFS1bits.U2RXIF = 0; //UART2 수신 인터럽트 플래그 클리어
if(U2RXREG == ' ') //수신된 문자가 "SPACE" 키값과 일치하면,
{
IEC1bits.U2TXIE = 1; //UART2 송신 인터럽트 동작
}
}
void __attribute__((__interrupt__)) _U2TXInterrupt(void)
{
IFS1bits.U2TXIF = 0; //UART2 송신 인터럽트 플래그 클리어
U2TXREG = *uart_string++; //송신 문자열 포인터 1씩 증가,다음 문자 가르킴
if(*uart_string == 0 ) //문자열 끝까지 되었는지 확인,
{
PORTC ^= 1; //LED 점등 토글
uart_string = Hello_UART2; //송신 문자열 포인터 초기화
IEC1bits.U2TXIE = 0; //UART2 송신 인터럽트 중지, 다시 "SPACE" 키값이 수신되면,
//송신 인터럽트 동작 설정
}
}
void delay_()
{
int i;
for (i=0; i<3000; i++)
{
}
}
'삽질기초 > HW' 카테고리의 다른 글
모터 선정에 있어 토크 고려 방법 (1) | 2009.10.08 |
---|---|
dsPIC33FJ256GP710 (0) | 2009.09.25 |
연산증폭기. (0) | 2009.09.09 |
DSP281x_Gpio.c (0) | 2009.08.21 |
avr serial register - 2560 (0) | 2009.04.01 |