[Microchip]/PIC16F2012. 11. 15. 05:51

[PIC16F150x EVM]TIMER 인터럽트 테스트

[PIC16F150x EVM]TIMER 인터럽트 테스트


PIC16F1509 에는 3개의 타이머/카운터가 있다.

타이머 입력소스는 시스템클럭의 1/4 또는 T0CKI핀 으로 입력 받을 수 있다.




PIC16F1509 타이머 초기화 함수

void InitTimer0(void)

{

 // TMR0 Associate Registers Initial

 TMR0CS = 0; // Timer0 CLK Source설정 -> FOSC/4


 PSA = 0;                   //Prescaler 사용여부 설정(사용)

 PS0 = 0;         // Prescaler 1:4

 PS1 = 1;         // Prescaler 1:16

 PS1 = 0;         // Prescaler 1:256


 TMR0 = INTERVAL_1mS;  // Initial TMR0

 

 //타이머 인터럽트 레지스터 초기화

 T0IF = 0;     //Clear TMR0 Interrupt Flag

 T0IE = 1;     //Enable TMR0 Interrupt


 GIE = 1;     //Enable Global Interrupt

}





MCU_TimerCal 프로그램을 이용해  간단히 1ms에 대한 설정값을 구할 수 있다.



#define INTERVAL_1mS 0x82


volatile unsigned int gTimeTick1_1ms = 0;

//인터럽트 핸들러 

interrupt ServiceRoutine() 

{

   // Timer0 Interrupt 발생하면

   if(T0IF)

  { 

    TMR0 = INTERVAL_1mS;  // Initial TMR0

    T0IF = 0;     // Clear Interrupt Flag


gTimeTick1_1ms++;

//Led1Toggle();

  }

}








Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC16F2012. 8. 28. 06:39

[PIC16F1509] FVR 테스트 - 레퍼런스 입력 없이 정밀한 전압 측정하기

[PIC16F1509] FVR 테스트 - 레퍼런스 입력 없이 정밀한 전압 측정하기

PIC16F1509를 사용하다 한가지 문제점이 발생했다. ADC채널이 부족해서 Vref핀을 사용할 수 없는 상황인데 정확한 레퍼런스 측정이 필요한 상황이다.

데이터시트를 찾아보니 FVR이 있다. 이를 이용하면 가능하지 않을까...

 

 

PIC16F1508 에는 FVR(FIXED VOLTAGE REFERENCE) 이 있어 레퍼런스 전압을 측정할 수 있다.

FVR은 3가지 고정 전압으로 설정 가능하다.

4.096V

2.048V

1.024V

 

이 출력 전압은 ADC, CMP 등의 레퍼런스로 사용할 수 있다.

 

 

 

 

 

 

FVR출력을 ADC 로 설정하면 31번 채널에서 ADC값으로 읽을 수 있다.

//VFR 초기화 코드

 ADFVR0 = 1;
 ADFVR1 = 1;
 FVREN = 1;

 

 

 

예로  ADC값이 500, AVR 값이 882 일 경우

V = 500/882*4.096 = 2.321V

로 Vref없어도 비교적 정확히 전압값을 읽을 수 있다.

 

 

그런데 정밀한 Vref는 아니기 때문에 흔들리긴 한다.

디지털 값으로 10정도 인데 계산해 보면 22mV정도 흔들리는것 같다. 외부에 정밀 레퍼런스를 연결하는것이 가장 정확하겠지만.. 여건상 또는 비용문제로 FVR을 이용하면 간단히 해결하기에 좋은것 같다.

 

한가지 아쉬운점은 FVR을 VREF로 직접 입력하지 못하는것인데..

새로출시된 PIC16F18xx는 가능하다고 한다.

 

ADPREF<1:0>: A/D Positive Voltage Reference Configuration bits
00 = VREF+ is connected to VDD
01 = Reserved
10 = VREF+ is connected to external VREF+ pin(1)
11 = Reserved (PIC16F18XX : FVR)

 

 

 

 

 

Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC16F2012. 8. 18. 18:17

[PIC16F150x EVM] PIC16F1509 ADC, PWM 테스트

[PIC16F150x EVM] PIC16F1509 ADC, PWM 테스트

 

 

 

 

PIC16F1509는 4개의 10비트 PWM출력이 있다. 20Mhz에서 최대 208khz, 6.5bit 해상도로 출력 가능하다.

 

 

 

 

PIC16F1509 PWM초기화 코드

void Pwm1Init(void)
{
 Cbi(TRISC, BIT5);Cbi(ANSELC, BIT5);

 PWM1CON = 0x00; 
 T2CON = 0b00000111;
 
 PR2 = 255;

 PWM1DCH = PWM1DCL = 0x00; 
 
 T2CON = 0b00000100;  
 
 PWM1DCH = 0b00100000;


 PWM1EN = 1;

 PWM1OE = 1;

 PWM1OUT = 0

 PWM1POL = 0;

 }



void PWM1_SET(unsigned int Duty)

{

PWM1DCH = (Duty >> 2); PWM1DCL = (Duty << 6);

}

 

 

 

PIC16F157x PWM출력 핀맵

 

 

PIC16F1509 ADC, PWM테스트 예제 소스코드

ADC 4에 연결되어 있는 VR값에 따라 PWM을 가변하여 출력 하는 예제 코드 이다.

 

void main(void)
{
 unsigned int ad_value;
 unsigned int pwm = 0;

 SystemInit();
    Led1Init();
 Led1On();
 
 U0_Init(BAUD_57600);
 DebugPrint("PIC16F1509 EVM Test\r\n");
 
 AdcInit();
 Pwm1Init();
 
    while(1)
    {
 
  ad_value = AdcRead(4);
 
  pwm = ad_value;
  PWM1_SET(pwm);


  DebugPrint("PWM(ADC)=%d\r\n", pwm);;
  Delay(50);
    }
}

 

 

 

PIC16F1508 ADC, PWM테스트 동영상

ADC에 연결되 가변저항의 전압값에 따라 PWM을 출력하여 램프 밝기를 조절하는 테스트 동영상

 

 

 

Posted by nexp

댓글을 달아 주세요

[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. 8. 12. 21:15

[PIC16F150x EVM] 보드 제작

 [PIC16F150x EVM] 보드 제작

 

 

PIC16F15xx 시리즈는 새롭게 출시된 저가격, 저전력의 MCU이다. 시리얼 포트 있고 저렴하기 때문에 저렴한 솔루션으로 사용될 곳이 많을것 같은아 테스트 하기 위해 s-Type 형태로 제작 해 보았다.

저렴한 16bit MCU임에도 10bit ADC, PWM, UART, SPI, I2C가 있고 특이하게 DAC출력까지 있다.

 

 

기존 PIC18F14K50 PCB동일한 핀맵이므로 PCB를 그대로 사용해서 테스트 했다.

 

 

s-Type 형태로 제작 해서 기존 확장 보드를 그대로 이용 가능하다.

 

 

 

 

저렴한 가격

PIC16F1508은 실제로 저렴한 가격인데 쇼핑몰에서 1350에 구매 가능하다.(이번에 PIC16F1509 25개 구매 했다.)

 

 

 

 


PIC16F150x EVM 회로도

 

 

 

 


 

PIC16F1508/PIC1509 핀맵

 

 

 

 

 

 

 

Posted by nexp

댓글을 달아 주세요