[Microchip]/PIC12F_PIC10F2011. 3. 3. 21:00

[PIC12F EVM] Soft UART 테스트

[PIC12F EVM] Soft UART 테스트


소형 MCU에서 UART를 이용하면 디버깅 하기에 편리한 점이 많다. PIC12F683 보드도 Soft UART를 이용하여 시리얼 제어 [LCD Module] 에 디버깅 정보를 표시하는 테스트를 해 보았다.

먼저 Serial.c 코드를 좀 수정하여 기존 코드와 호환 가능하도록 수정한다.
//  GPIO.0 as UART Rx, and 1 as Tx
#define SOFT_UART_INIT()     do{ \
         TRISIO = 0x39;\
         ANSEL = 0x00;\
         GPIO = 0;\
         Soft_UART_Init(&GPIO,0, 1, 9600, 0 );\
         }while(0)


#define U0_PutByte             Soft_UART_Write


void U0_Init(unsigned char baud)
{
        SOFT_UART_INIT();
}


PIC12F683 UART테스트 예제 코드
void main()
{
    unsigned char buf[6];

    SystemInit();

    //UART초기화
    U0_Init(BAUD_9600);

    Delay(1000);

    Led1Init();

    U0_PutByte(4);
    Delay(500);
   
             //0123456789abcdef
    U0_PutStr("PIC12 LCD Test");
    U0_PutStr("\r\n");
 
    while(1)
    {
                Led1Toggle();
   
                PutInt(0, count++, buf);
                U0_PutStr(buf);
                U0_PutStr("\n");

                Delay(300);
    }
}

Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC12F_PIC10F2011. 3. 1. 23:00

[PIC12F EVM] ADC테스트

[PIC12F673 EVM] ADC테스트



PIC12F 에는 10비트 ADC가 4채널 포함되어 있다.
아래는 PIC12F683의 ADC블록도 이다.



사용법은 간단하다.  ADCON0레지스터에 초기화 해주고 ADRES레지스터 값을 읽으면 된다.



PIC12F683 ADC 제어 코드
void ADC_Init(void)
{
    Cbi(ANSEL, BIT3);
    Sbi(TRISIO, BIT4);
   ADCON0 = 0x8D;
}

unsigned int ADC_Read(unsigned char Ch)
{
 if(Ch == 0)Cbi(ADCON0, BIT2|BIT3);
 else if(Ch == 1){Sbi(ADCON0, BIT3);Sbi(ADCON0, BIT2);}
 else if(Ch == 2){Sbi(ADCON0, BIT3);Cbi(ADCON0, BIT2);}
 else if(Ch == 3)Sbi(ADCON0, BIT2|BIT3);
 
 GODONE = 1;while(GODONE);  
  
 return (ADRESH<<8)|ADRESL; 
}


VR이 연결된 채널3의 ADC값을 LCD에 출력해서 확인하는 테스트를 해 보았다.
먼저 PIC12F683보드의 전원을 연결하고 VR을 연결한다.



LCD에 표기하기 위해  [LCD Module] 을 이용한다. 브레드보드에서 쉽게 확장하기 위해 만들었던 PCB를 이용하면 쉽게 연결가능하다.



PIC12F683 ADC테스트 예제 소스코드
void main(void)
{
 unsigned int cnt = 0;

 //시스템 초기화
 SystemInit();
 
 //LED초기화
 Led1Init();

 //ADC초기화
 ADC_Init();

 //LCD초기화
 InitShfitRegister();
 LcdInit();
 
 //               0123456789abcdef
 LcdDspStr(0, 0, "1:PIC12F683 EVM ");
 LcdDspStr(0, 1, "ADC:");

 while(1)
 {
  SendIntStr(5, 1, ADC_Read(3));
  Delay(50);
 }
}



테스트 동영상


Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC12F_PIC10F2011. 3. 1. 22:00

[PIC12F EVM] TIMER0 테스트

[PIC12F EVM] TIMER0 테스트

TIMER0의 기본 구조는 아래와 같이 입력 클럭을 4분주 하고 2클럭 마다 TMR0를 증가 시킨다.
만약  간단히 대략 1ms를 만들려 다음과 같이 계산할 수 있다.
8Mhz 입력 클럭일 경우 8분주 했을때 타이머 오버플로우 인터럽트 시간은 8Mhz/4/8  = 4us => 256클럭마다 한번씩 오버플로 발생하므로 1.024ms 이다.




TIMER0초기화 
OPTION레지스터



void InitTimer0(void)
{
 OPTION = 0;
 OPTION |= BIT1; //prescaler - 1/8

 T0CS = 0;  // Timer increments on instruction clock
 T0IE = 1;  // Enable interrupt on TMR0 overflow
 GIE = 1;   // Global interrupt enable
}


타이머 인터럽트 함수
인터럽트가 발생하면 interrupt preprocess로 정의 한 함수가 수행되고 이 함수 내에서 원하는 플래그를 체크하여 처리 하면 된다. 이런 구조는 AVR(Tinty13)과 비교하면 성능상 문제는 있을것 같다.
void interrupt timer1_isr(void)
{
 if(T0IF)
 {
  //1ms
  //Led1Toggle();
  gTimerTick1_ms++;
  T0IF = 0;   
 }
}



PIC12F683 Timer Interrupt 예제
타이머 인터럽트를 이용하여 1초 마다 LED점등하는 예제

void main(void)
{
 //시스템 초기화
 SystemInit();
 
 //LED초기화
 Led1Init();

 //Timer0 초기화
 InitTimer0();

 while(1)
 {
  //Led1Toggle();
  if(gTimerTick1_ms>1000)
  {
   gTimerTick1_ms = 0;
   //Led1Toggle();
  }
 }
}


 




Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC12F_PIC10F2011. 3. 1. 19:32

[PIC12F EVM] GPIO 제어시 주의사항

[PIC12F EVM] GPIO 제어시 주의사항

사용자 삽입 이미지

PIC12 시리즈중 PIC12F683의 각 포트는 ADC, GPIO, Comparator등의 여러 기능을 가지고 있으므로 사용하려면 각각 설정이 필요하다. 특히 GPIO로 사용하기 위해 ADC, Comparator 설정 레지스터로 Disable 해 주어야 한다.



GPIO로 사용하기 위해 ADC를 Disale하는 ADSEL레지스터를 Clear하고, 입출력 방향을 설정하는 TRISIO레지스터 설정해야 한다. (0- Output, 1-Input).
//-----------------------------------------------------------------------------
// On board LED
#define LED1_BIT     BIT0

#define Led1Init()     Cbi(ANSEL, LED1_BIT);Cbi(TRISIO, LED1_BIT);
#define Led1Off()     Sbi(GPIO, LED1_BIT)
#define Led1On()     Cbi(GPIO, LED1_BIT)
#define Led1Toggle()    Tbi(GPIO, LED1_BIT)
//---------------------------------------------------------------------------


Comparator 를 Disable하는 레지스터 CMCON0레지스터도의 CM0~CM2비트를 설정해 주어야 하는데 시스템 초기화시에 기본적으로 GPIO모드로 사용하도록 했다.
void SystemInit(void)
{
  CMCON0 = 0x07;  //Comparator Off, GPIO Enable
}
Posted by nexp
TAG PIC12F

댓글을 달아 주세요

[Microchip]/PIC12F_PIC10F2011. 3. 1. 19:10

[PIC12F EVM] 무료컴파일러 HI-TECH C, MPLAB을 이용한 개발환경 설정

[PIC12F EVM] 무료컴파일러 HI-TECH C, MPLAB을 이용한 개발환경 설정

PIC12F 시리즈는 MPLAB설치시 무료로 설치되는 HI-TECH PCC컴파일러를 이용하면 C언어로 프로그램 할 수 있다.

MPLAB Project Wizard를 이용하여 간단히 프로젝트 파일을 생성할 수 있다. PIC12F683 보드를 테스트 하는 예제를 작성 해보자.



컴파일러 옵션에서 HI-TECH C컴파일러를 설정한다.



적당한 프로젝트 명을 선택하고 저장하면 프로젝트 파일이 생성된다.



옵션으로 드라이버 파일의 경로를 설정할 수 있다.



PIC12 개발환경 설정완료
컴파일 잘 된다. 8핀의 소형 MCU이지만 요즘은 소프트웨어 발전이 좋아 C언어로 쉽게 개발 할수 있어 저렴하고 편리하게 프로젝트를 진행 할수 있는것 같다.
(요즘 PIC12F675 사용할 일이 있었는데 하드디스크가 고장나는 바람에 예전 정리해 둔것이 없어 다시 정리해 둔다. 자료 백업의 중요성을 다시한번 생각하며..)
Posted by nexp

댓글을 달아 주세요