[Microchip]/PIC16F2012. 8. 16. 01:08

[PIC16F150x EVM] PIC1509 초기화 및 클럭 설정

[PIC16F150x EVM] PIC1509 초기화 및 클럭 설정

 

PIC16F15xx 시리즈는 Enhanced Mid-range Core 로 저렴하면서 강력한 페리를 가진 MCU로 이전 PIC16시리즈와 클럭 시스템과 약간 다른 점이 있어 설정이 필요하다.

 

 

 

내부 클럭을 사용하면 31Khz에서 16Mhz로 설정 가능하고 기존 코드 호환을 위해 SystemInit()함수에 설정하였다.

void SystemInit(void)
{
 //grobal interrupt disable
 disable();   


 //Internal Oscillator Frequency Select bits
 /*
1111 = 16MHz
1110 = 8MHz
1101 = 4MHz
1100 = 2MHz
1011 = 1MHz
1010 = 500 kHz(1)
1001 = 250 kHz(1)
1000 = 125 kHz(1)
0111 = 500 kHz (default upon Reset)
0110 = 250 kHz
0101 = 125 kHz
0100 = 62.5 kHz
001x = 31.25 kHz
000x = 31kHz LF 
 */
 IRCF0 = 1;
 IRCF1 = 1;
 IRCF2 = 1;
 IRCF3 = 1;


  //SCS 1x = Internal oscillator block
 SCS0 = 1; 
 SCS1 = 1; 

}

 

 

 

클럭설을 16Mhz로 설정하고 정상적으로 클럭이 동작하는지 확인하기 위해 CLKOUT핀(RA4)으로 출력해 보았다.

CONFIG1 레지스터에 CLKOUT_ON을 설정하면 시스템 클럭의 1/4이 출력되는것을 확인 할 수 있다. 4Mhz출력 되는것이 확인된다.

RA4(CLKOUT)

 

CONFIG1

1 = CLKOUT function is disabled. I/O function on the CLKOUT pin
0 = CLKOUT function is enabled on the CLKOUT pin

 

 

__CONFIG(WDTE_OFF&MCLRE_ON&FOSC_INTOSC&CLKOUTEN_ON);

 

 

 

Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC16F2012. 6. 9. 01:31

[PIC16F73] SPI 테스트

[PIC16F73] SPI 테스트

 

- FOSC/4 (or TCY)
- FOSC/16 (or 4 • TCY)
- FOSC/64 (or 16 • TCY)
- (Timer2 output)/2 data rate of 5 Mbps(at FOSC = 20 MHz).

 

 

PIC16F723 SPI 블록도

 

 

 

 

 

 

PIC16F723 SPI 레지스터

 

 

 

 

 

PIC16F723 SPI초기화 함수

void SPI0_Init(void)
{
 //RC3 pin => SCK output
 //RC4 pin => SDI input
 //RC5 pin => SDO output
 SSPBUF = 0x00;  //SSPBUF Clear
 ADCON1 = 0x06;

 Cbi(TRISC, (BIT3|BIT5));
 Sbi(TRISC, (BIT4));

 SSPSTAT = 0;
 SSPEN = 1;    //spi enable
 SSPM2 = 0;    //master 

 SSPM1 = 0;SSPM0 = 0; // FOSC/4
 
 CKE = 1;        // data transmitted on rising edge
 CKP = 0;        // clock idle state low
}

 

 

PIC16F723 SPI Write Read함수 포팅

unsigned char SPI0_WriteReadByte(unsigned char Data)
{
 SSPBUF = Data;           // write to buffer for TX
 while ( !BF );          // wait until cycle complete
 return ( SSPBUF );      // return with byte read
}

 

Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC16F2012. 5. 14. 01:10

[PIC16F723] Timer0 인터럽트 테스트

 

[PIC16F723] Timer0 인터럽트 테스트

 

 

 

 

 

PIC16F723 타이머 구조

 

 

 

OPTION레지스터를 이용하여 Timer0관련 클럭 설정을 할 수 있다.

 

 

PIC16F723 타이머 초기화

void InitTimer0(void)
{

 // TMR0 Associate Registers Initial
 PS0 = 1        // Prescaler 1:4

 

 TMR0 = INTERVAL_1mS;  // Initial TMR0
 
 // Interrupt Associate Registers Initial
 T0IF = 0;     //Clear TMR0 Interrupt Flag
 T0IE = 1;     //Enable TMR0 Interrupt


 GIE = 1;     //Enable Global Interrupt

}

 

 

 

PIC16F723 타이머 인터럽트 핸들러(HTC)

//인터럽트 핸들러 

interrupt ServiceRoutine()
{
   // Timer0 Interrupt 발생하면

   if(T0IF)

  { 

    TMR0 = INTERVAL_1mS;  // Initial TMR0

    T0IF = 0;     // Clear Interrupt Flag

  }

 

 

 

 

Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC16F2012. 5. 14. 01:08

[PIC16F723-S EVM] ADC테스트 - TFT LCD에 그래프 표시

[PIC16F723-S EVM] ADC테스트 - TFT LCD에 그래프 표시

 

 

PIC16F723은 저렴한 MCU 임에도 8bit ADC가 13채널이 있다. 8bit라 약간 아쉬움이 있지만 VREF도 있고 속도도 빨라 여러가지로 사용가능할것 같다.

 

PIC16F723 ADC 블록도

 

 

 

 

 

PIC16F723 ADC 레지스터

 

PIC16F723 ADC  초기화 함수

//ADC Initialize
void AdcInit(void)
{
 // initial A/D channel 0,1
 Sbi(TRISA, BIT0);
 Sbi(ANSELA, BIT0);

 VCFG1 = 0; //Low Voltage refences = VSS
 VCFG0 = 0; //High Voltage refences = VDD

 GODONE = 0; //A/D Conversion Start and Check this bit, if done,ADGO => 0
 ADON = 1; //A/D Conversion Operating

 //Sampling rate
 ADCS1 = 1;
 ADCS0 = 1;
}

 

 

PIC16F723 ADC Read 함수

unsigned char AdcRead(unsigned char port)
{
 ADCON0 = (0x3C&(port<<2)) | BIT0;

 //AD Converter Start
 GODONE  = 1;

 //AD End Check  
 while(GODONE)continue;

 //Read AD Converting Value
 return ADRES;
}

 

 

 

PIC16F723 ADC테스트 동영상

PIC16F723 EVM 확장 보드 ADC0 에 연결된 가변저항의 전압값을 TFT LCD에 표시하는 예제 이다.

 

 

 

PIC16F723 ADC 테스트 소스코드

void main(void)
{
 unsigned char adc_value;

 SystemInit();
    Led1Init();

 

 U0_Init(BAUD_57600);
 DebugPrint("PIC16F723 EVM Test\r\n");

 

 IntAdc();

 

    while(1)
    {
        adc_value = AdcRead(0);
 
        DebugPrint("%d\r\n", adc_value );

        Delay(10);

    }
}

 

 

 

 

 

 

 

Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC16F2012. 5. 14. 01:01

[PIC16F723 EVM] UART 테스트

[PIC16F723 EVM] UART 테스트

 

 

 

 

PIC16F723 UART 블록도

 

 

 

 

 

PIC16F723 UART 보레이트 설정

 

 

 

PIC16F723 UART 초기화 함수

// Serial Prot0 Utility Fuction Routine
void U0_Init(unsigned char baud)
{
 U0_SetBaud(baud);
 
 TRISC6 = 0;     // TX Output
 TRISC7 = 1;     // RX Input
 
 TXSTA = 0b00000100;   // 8bit Transmission, Asynchronous Mode
        // High Speed,
 RCSTA = 0b10000000;   // Serial Port Enable, 8bit Reception
     `  
 TXEN = 1;     // TX Enable
 CREN = 1;     // RX Enable
}

 

 

 

PIC16F723 UART 송수신 함수

unsigned char U0_GetByte(void)
{
 while(!RCIF); // Wait for data in the UARTRx.

    return (RCREG);
}

 

void U0_PutByte(unsigned char Data)
{
 while(!TRMT);

 TXREG = Data;
}  

 

 

* 참고로 Hitech C 컴파일러는 무료버전을 사용하므로 printf는 지원이 안된다. 약간 다른 방법으로 구현 했는데.. 용량은 그렇게 많지 않는것 같다.

 

    Program space        used   3E9h (  1001) of  1000h words   ( 24.4%)
    Data space           used    37h (    55) of    C0h bytes   ( 28.6%)
    EEPROM space         None available
    Configuration bits   used     1h (     1) of     2h words   ( 50.0%)
    ID Location space    used     0h (     0) of     4h bytes   (  0.0%)

 

 

 

PICF723 UART 테스트 프로그램 소스

void main(void)
{
 unsigned char rx;
 unsigned int cnt = 0;
 SystemInit();
    Led1Init();
 
 U0_Init(BAUD_57600);
 DebugPrint("PIC16F723 EVM Test\r\n");

    while(1)
    {
  rx = U0_GetByte();

  switch(rx)
  {
   case '0':
    Led1Off();
    DebugPrint("LED Off = %d\r\n", cnt++);
    break;

   case '1':
    Led1On();
    U0_PutStr("LED On\r\n");
    break;
  }
    }
}

 

 

 

 

 

 

Posted by nexp

댓글을 달아 주세요