Friday, November 14, 2008

วงจรจับเวลา 99 วินาที ใช้ Microcontroller

โดยส่วนตัวชอบนาฬิกาที่จับเวลาได้เป็นหลักอยู่แล้ว นาฬิกาที่สะสมส่วนมากจะเป็นนาฬิกาแบบนี้ พอดีเขียน Blog ที่วิชาการ.คอมเกี่ยวกับวิธีทำนาฬิกา ซึ่งได้ยกวงจรจับเวลา 99 วินาทีนี้เป็นตัวอย่างในการทำความเข้าใจ ซึ่ง จุดเด่นของวงจรนี้คือ ไม่มีปุ่มกดจับเวลา หรือว่า หยุดจับเวลา และก็ไม่มีปุ่ม Reset อิ อิ :)
วงจรเป็นดังรูปข้างล่างนี้
99 Second Timer Counter Chronograph

ส่วนโปรแกรมที่เป็นภาษาซี เขียนด้วย MikroC ก็เป็นดังข้างล่างนี้ครับ
//PIC16F627A
//4MHz Internal OSC
// Two Digit Counter
// 13/11/2008
// Punkky@gmail.com
#define Digit1 PORTA.F0
#define Digit2 PORTA.F1

unsigned short tick;
unsigned short x1;
unsigned short x2;
void interrupt () //Interrupt จะถูกเรียกทุกครั้งที่ Timer1 เกิดการ Overflow นั่นคือจะถูกเรียกทุกวินาทีนั่นเอง

        PIR1.TMR1IF = 0;        // clears TMR1IF
        TMR1H = 0x80//ตั้งค่าเริ่มต้นของ Timer1 เป็น 0x8000 โดยตั้งเฉพาะสองบิตแรก
        tick = 1; //tick เป็น 1 ทุก 1 วินาที
}

void main(){ 
  CMCON = 0x07;   //Digital I/O for PORTA
  TRISA = 0x00;
  PORTA = 0x00;
  TRISB = 0x00;
  PORTB = 0x00
  T1CON = 0x0F
         
  // Prescaler 1:1   external clock 
  PIE1.TMR1IE = 1;  // enable interupt to start the clock 
  INTCON = 0xC0;   // Set GIE, PEIE 
  TMR1L = 0x00
  TMR1H = 0x80
  PCON.OSCF = 1//Internal Clock 4MHz 
  x1 = 0; //หลักสิบของวินาที 
  x2 = 0//หลักหน่วยของวินาที
  tick = 0;

  while(1){
    if(tick){ //เมื่อเวลาผ่านไป 1 วินาที ค่า tick จะเป็น 1
       tick = 0;
       x2++; //เพิ่มหลักหน่วยของวินาทีขึ้น 1
       if(x2>9){ //ถ้าหลักหน่วยมากกว่า เก้า ก็ให้เซ็ตเป็น ศูนย์ และนับหลักสิบขึ้น 1
          x2 =0;
          x1++;
          if(x1>9){ //ถ้าหลักสิบมากกว่า เก้า ก็ให้เซ็ตเป็น ศูนย์ เพื่อกลับไปนับจาก 00 ใหม่
             x1 = 0;
          }
          PORTB = x1; //นำค่าของหลักสิบไปแสดงผล
          Digit1 = 1; //สั่งให้ CD4543 นำข้อมูลจาก PORTB ไปแสดงบน 7-Segment
          Digit1 = 0; //สั่งให้ CD4543 คงค่าของตัวเลขไว้ โดยไม่ต้องสนใจค่าของ PORTB อีก
       }
       PORTB = x2; //นำค่าของหลักหน่วยไปแสดงผล
       Digit2 = 1; //สั่งให้ CD4543 นำข้อมูลจาก PORTB ไปแสดงบน 7-Segment
       Digit2 = 0; //สั่งให้ CD4543 คงค่าของตัวเลขไว้ โดยไม่ต้องสนใจค่าของ PORTB อีก
   }
  }
}


จำลองการทำงานด้วย Proteus ได้ตามภาพข้างล่าง
Simulation of 99 second counter timer

No comments: