วันอาทิตย์ที่ 3 ตุลาคม พ.ศ. 2553

Lab6: การใช้งาน Module CCP(Capture วัดความถี่)


#include<18F4431.h>
#define  CLOCK_SP    20000000 // ความเร็วสัญญาณนาฬิกา
#fuses HS                     //   โหมดการทำงานแบบ High Speed
#fuses NOLVP,NOWDT           // No Low Voltage Program, No Watchdog timer
#fuses NOPROTECT              // Code no protection
#use delay (clock=CLOCK_SP)   // ใช้งานฟังก์ชัน delay_ms() & delay_us()
#use rs232(baud=9600,xmit= PIN_C6,rcv= PIN_C7 ) // ใช้งาน module RS232

float time1,time2;                      //ประกาศตัวแปร time1,time2 เป็น floating point number
BOOLEAN hook_cpp1, HookRise;     //ประกาศตัวแปร hook_cpp1, HookRise เป็น Boolean

#int_ccp1
void capture_isr()
{
   if(HookRise)
   {
    time1 = get_timer1();
    HookRise = FALSE;
   }
   else
   {
    time2 = get_timer1();
    HookRise = TRUE;
    hook_cpp1 = FALSE;                  
   }
}
// ฟังก์ชัน interrupt CCP1 เพื่อจับเวลาขอบขาขึ้นของสัญญาณ โดยเก็บเวลาที่ตัวแปร time1,time2

float T;                         //ประกาศตัวแปร T เป็น floating point number
void main(void){

while(true){

      HookRise=TRUE;
      hook_cpp1=TRUE;
      setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);      // กำหนดค่า timer1
      setup_ccp1(CCP_CAPTURE_RE);           //กำหนดค่า CCP1(Capture ขอบขาขึ้น)
      enable_interrupts(INT_CCP1);              // Enable interrupt CCP1
      enable_interrupts(GLOBAL);                // ตั้งค่า interrupt รวม
      set_timer1(0);                                 //ตั้งค่า timer1 เป็น 0
     
      while(hook_cpp1);             //ตรวจสอบสัญญาณ เข้ามาหรือไม่
      setup_ccp1(CCP_OFF);                //ปิดการใช้งาน CCP1
      disable_interrupts (GLOBAL);        //ปิดการใช้งาน interrupt รวม
      
      T = (time2-time1)*0.0000002*8;            // Period time=cycle*(4/fosc)*PR
      printf("Frequency:%f Hz\r\n",1/T);   //แสดงค่าผ่าน RS232
    }
   }

Lab5: การใช้งาน Power PWM(18F2431,18F2331,18F4331,18F4431)


#include<18F4431.h>
#define  CLOCK_SP    20000000 // ความเร็วสัญญาณนาฬิกา
#fuses HS                     //   โหมดการทำงานแบบ High Speed
#fuses NOLVP,NOWDT           // No Low Voltage Program, No Watchdog timer
#fuses NOPROTECT              // Code no protection
#use delay (clock=CLOCK_SP)   // ใช้งานฟังก์ชัน delay_ms() & delay_us()

void main(){
   int16 period;

   period =511;            
   //ความถี่ของสัญญาณ = Fosc (ความถี่ของ Crystal)/ (4 * (period+1) * postscale)         setup_power_pwm_pins(PWM_COMPLEMENTARY,PWM_OFF,PWM_OFF,PWM_OFF);                     //กำหนดค่า Power PWM pin B0,B1 ในโหมด Complementary
setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,period,0,1,0);
            //กำหนดโหมดการทำงาน (ดูรายละเอียดเพิ่มเติม)
   while(true){
     
      set_power_pwm0_duty(500 * ((period>>8)+1));   //ตั้งค่า PWM 19.45kHz duty cycle 50% pin B0,B1 invert  กัน                                                                                                        
   }
}

Lab4: การใช้งาน Module CCP(PWM)


#include<16F877A.h>
#define  CLOCK_SP    20000000 // ความเร็วสัญญาณนาฬิกา
#fuses HS                     //   โหมดการทำงานแบบ High Speed
#fuses NOLVP,NOWDT           // No Low Voltage Program, No Watchdog timer
#fuses NOPROTECT              // Code no protection
#use delay (clock=CLOCK_SP)   // ใช้งานฟังก์ชัน delay_ms() & delay_us()

void main(void){
    int16 duty = 500;                              //ประกาศตัวแปร duty เป็นแบบ integer 16 bits
    enable_interrupts(GLOBAL);           //เปิดการทำงาน interrupt รวม
    enable_interrupts(INT_CCP1);         //เปิดการทำงาน interrupt CCP1
    setup_ccp1(CCP_PWM);                //กำหนดค่า CCP1 ทำงานโหมด PWM
    setup_timer_2(T2_DIV_BY_16, 255, 1);  //กำหนดการใช้งาน Timer2
    set_timer2(0);                                   //ตั้งค่า Timer2 เป็น 0
  
while(true){

   set_pwm1_duty(duty);                       //ตั้งค่า PWM ความถี่ 1.22kHz(รายละเอียดใน Timer2) duty cycle ประมาณ 50% (0 – 1023 or 0 – 100%)
  
}
}

Lab3: การใช้งาน Module Analog to Digital


#include<16F877A.h>
#device ADC=10           //ตั้งการใช้งาน module ADC 10 bits
#define  CLOCK_SP    20000000 // ความเร็วสัญญาณนาฬิกา
#fuses HS                     //   โหมดการทำงานแบบ High Speed
#fuses NOLVP,NOWDT           // No Low Voltage Program, No Watchdog timer
#fuses NOPROTECT              // Code no protection
#use delay (clock=CLOCK_SP)   // ใช้งานฟังก์ชัน delay_ms() & delay_us()
#use rs232(baud=9600,xmit= PIN_C6,rcv= PIN_C7 ) // ใช้งาน module RS232

void main(void){                      
int16 A;                                    //ประกาศตัวแปร A เป็น integer 16 bits
float Volts;                                //ประกาศตัวแปร Volts เป็น floating point number

SETUP_ADC(ADC_CLOCK_INTERNAL); //กำหนดสัญญาณนาฬิกาในการแปลงA/D
SETUP_ADC_PORTS(ALL_ANALOG);                   //กำหนด port การใช้งาน A/D

while(true){     

 set_adc_channel(1);                             //กำหนดช่องการแปลง A/D
 A = read_adc();                                  //เก็บค่าการแปลงไว้ตัวแปร A (0-1023)
 Volts = ((float)A * 5)/1023;                 //แปลงค่าจำนวนบิต เป็น โวลต์

printf("%lu  %.3f\r\n",A,Volts);  //แสดงค่าผ่าน RS232 (จำนวนบิต  โวลต์)

}
}

Lab2: ไฟวิ่ง


#include<16F877A.h>
#define  CLOCK_SP    20000000 // ความเร็วสัญญาณนาฬิกา
#fuses HS                     //   โหมดการทำงานแบบ High Speed
#fuses NOLVP,NOWDT           // No Low Voltage Program, No Watchdog timer
#fuses NOPROTECT              // Code no protection
#use delay (clock=CLOCK_SP)   // ใช้งานฟังก์ชัน delay_ms() & delay_us()

void main(void){
while(true){
output_d(1);                  // output port D = 00000001
delay_ms(300);              // delay 300 ms.
output_d(2);                  // output port D = 00000010
delay_ms(300);
output_d(4);                  // output port D = 00000100
delay_ms(300);
output_d(8);                  // output port D = 00001000
delay_ms(300);
}
}

Lab1: การใช้งาน RS232 และชนิดของข้อมูล


#include<18F4431.h>
#define  CLOCK_SP    20000000 // ความเร็วสัญญาณนาฬิกา
#fuses HS                     //   โหมดการทำงานแบบ High Speed
#fuses NOLVP,NOWDT           // No Low Voltage Program, No Watchdog timer
#fuses NOPROTECT              // Code no protection
#use delay (clock=CLOCK_SP)   // ใช้งานฟังก์ชัน delay_ms() & delay_us()
#use rs232(baud=9600,xmit= PIN_C6,rcv= PIN_C7 ) // ใช้งาน module RS232

void main(){

int A = 100;                  //ประกาศตัวแปร A เป็น integer 8 bits
int16 B = 1000;            //ประกาศตัวแปร B เป็น integer 16 bits
char C = 'C';                //ประกาศตัวแปร C เป็น character
float D =0.514; //ประกาศตัวแปร D เป็น floating point number 32 bits

while(true){
printf("%u  %lu  %c  %.3f\r\n",A,B,C,D);          //แสดงค่าผ่าน RS232
}
}