วิธีการใช้ Configurable Logic Cell (CLC) ใน PIC mcu ใน CCS PIC-C


Configurable Logic Cell (CLC) เป็น gate พื้นฐาน (AND, OR, ฯลฯ) ที่ PIC รุ่นใหม่ๆ เช่น 16F1705 จะมีมาให้ใช้งาน โดยมีจุดเด่นที่สามารถเชื่อมโยง output จากโมดูลต่างๆ ภายใน PIC มาเป็น input ของ logic gate ได้โดยไม่มีการลากสายภายนอกใดๆ

กรณีศึกษาจากการ modulate สัญญาณเพื่อส่งข้อมูลผ่านแสงอินฟราเรด

หากต้องการส่งข้อมูลผ่านสัญญาณอินฟราเรดดังแสดงในภาพวงจรข้างต้น ซึ่งมี IR LED ต่ออยู่กับ PIC ฝั่งส่ง (ซ้าย) และมี IR Receiver ความถี่ 38 kHz ต่ออยู่กับ PIC ฝั่งรับ (ขวา) สิ่งที่มักต้องทำสำหรับฝั่งส่งคือการ modulate ข้อมูลเข้ากับสัญญาณพาหะ ซึ่งในตัวอย่างนี้จะใช้สัญญาณข้อมูลจากโมดูลอนุกรม (serial port) ที่ความเร็ว 4800 บิตต่อวินาทีและสัญญาณพาหะเป็น square wave 38 KHz ซึ่งสร้างขึ้นโดยใช้โมดูล PWM ภาพต่อไปนี้แสดงกระบวนการ modulate สัญญาณจาก serial port เข้ากับสัญญาณพาหะ

จากภาพจะเห็นได้ว่าสัญญาณที่ Modulate แล้วเกิดจากการเอาสัญญาณข้อมูลมา AND กับสัญญาณพาหะ แม้กระบวนการนี้จะทำได้ง่ายโดยใช้อุปกรณ์ภายนอก แต่โมดูล CLC ช่วยให้กระบวนการดังกล่าวเกิดขึ้นภายในโมโครคอนโทรล์เลอร์เอง โดยทำงานอย่างอิสระไม่ไปรบกวนการทำงานของ CPU แต่อย่างใด เป็นการช่วยลดขนาดและจำนวนอุปกรณ์ในวงจรได้

ภาพต่อไปนี้แสดงถึงการตั้งค่าโมดูล CLC สำหรับงานข้างต้น โดยใช้ CLC1 บน PIC16F1705

การตั้งค่า

การทำงานของโมดูล CLC จะแบ่งเป็น 3 ส่วนสำคัญคือ

1. Input Selection การเลือกอินพุต

CLC โมดูลจากเลือกอินพุตได้สูงสุด 4 ตัว โดยสามารถนำอินพุตเข้ามาจากสัญญาณภายนอกผ่านขา IO หรือต่อเข้ากับ output ของโมดูลอื่นๆ ในตัว PIC เอง โดยรายการอินพุตที่ใช้ได้นั้นต้องศึกษาจาก datasheet ของ PIC รุ่นที่ใช้

ในกรณีศึกษานี้อินพุตตัวแรกเลือกต่อมาจาก output ของโมดูล PWM3 ซึ่งได้ตั้งค่าไว้ให้สร้างสัญญาณพาหะ 38 kHz ออกมา (วิธีตั้งค่า PWM ดูได้ในตัวอย่างโปรแกรมท้ายบทความ)

ส่วนอินพุตที่สองต่อมาจากขาส่งข้อมูล (Tx) ของโมดูล UART

คำสั่งภาษา C ที่ใช้คือ

 clc1_setup_input(1, CLC_INPUT_PWM3);
 clc1_setup_input(2, CLC_INPUT_U1TX);

2. Gate Configuration

ส่วนนี้มีไว้ใช้ปรับสัญญาณในขั้นต้นเพื่อให้เหมาะสมกับงาน เช่น ทำการกลับขั้ว หรือ or ค่าอินพุตต่างๆ  โดยในตัวอย่างนี้มีการตั้งค่าดังนี้ (ดูภาพข้างบนประกอบ)

  • gate แรกจะเพียงส่งผ่านสัญญาณ PWM3 (อินพุต 1) ออกไปเท่านั้นโดยไม่ต่ออินพุตอื่นเลย
  • gate ที่สองจะทำการกลับขั้วสัญญาณจากโมดูล serial เพราะสัญญาณนี้โดยทั่วไปจะเป็นแบบ “ปกติสูง” แต่รูปแบบที่เราต้องการคือแบบ “ปกติต่ำ”
  • gate ที่สามและสี่ไม่ใช้ ดังนั้นอินพุตทั้ง 4 เส้นของ gate 3 และ 4 จะเป็น 0 ผลที่ออกมาจากการ Or จะเป็น 0 ด้วย แต่จริงๆ ค่านี้ควรเป็น 1 เพื่อจะได้นำไปเข้า AND ในขั้นที่ 3 ต่อไปได้ จึงตั้งค่า output ให้กลับขั้วผลลัพธ์เสีย

คำสั่งภาษา C ที่ใช้คือ

 clc1_setup_gate(1, CLC_GATE_NON_INVERTED_INPUT_1);
 clc1_setup_gate(2, CLC_GATE_INVERTED_INPUT_2);
 clc1_setup_gate(3, CLC_GATE_OUTPUT_INVERTED);
 clc1_setup_gate(4, CLC_GATE_OUTPUT_INVERTED);

3. Logic Operation

ส่วนนี้จะเป็นส่วนที่กระทำการกับค่าที่ได้จาก gate ทั้ง 4 ซึ่งเลือกได้หลายรูปแบบ แต่ในตัวอย่างนี้เราใช้ AND ซึ่งกำหนดค่าโดยใช้คำสั่งต่อไปนี้

setup_clc1(CLC_ENABLED | CLC_MODE_AND);

ค่าทั้งหมดที่มีให้ใช้ตาม header ไฟล์ของ PIC รุ่นนี้ได้แก่

CLC_MODE_AND_OR 
CLC_MODE_OR_XOR 
CLC_MODE_AND 
CLC_MODE_SR_LATCH 
CLC_MODE_1_INPUT_D_FLIP_FLOP 
CLC_MODE_2_INPUT_D_FLIP_FLOP
CLC_MODE_JK_FLIP_FLOP 
CLC_MODE_1_INPUT_TRANSPARENT_LATCH

การตั้งค่าทั้งสามขึ้นตอนนี้สามารถทดลองทำผ่าน MPLAB Code Configurator ได้  ซึ่งเป็น add-on ของโปรแกรม MPLAB ซึ่งเป็นโปรแกรมฟรี โดยโปรแกรมจะมีภาพแสดงขึ้นตอนการต่อและการทำงานอย่างชัดเจน ซึ่งสามารถศึกษาเพื่อสร้างความเข้าใจในตัวหลักการของ CLC แล้วจึงมาเทียบกับคำสั่งที่มีให้ใช้ใน PIC-C ได้

การเลือก Output

เมื่อสัญญาณผ่านการกระทำการแล้วก็สามารถต่อสัญญาณผลลัพท์นี้ออกมาทาง Remappable PIN I/O ใดๆ ก็ได้ ผ่านทางการประกาศดังนี้

#pin_select CLC1OUT=PIN_C0

ตัวอย่างนี้จะต่อ output เข้ากับขา C0

โปรแกรมที่สมบูรณ์สำหรับตัวอย่างนี้ซึ่งรวมทั้งส่วนของการสร้างสัญญาณ PWM เป็นดังนี้ เมื่อนำไปใช้กับวงจรฝั่งส่ง สิ่งที่ได้คือ PIC จะ modulate สัญญาณจากโมดูล serial ซึ่งพิมพ์คำว่า “I’m 16F1705” เข้ากับสัญญาณพาหะแล้วส่งออกไปทางหลอด IR ส่วนวงจรฝั่งรับที่ต่อกับตัวรับ IR ไว้นั้นก็สามารถเอาสัญญาณต่อเข้าขารับข้อมูล (Rx) ของโมดูล UART เพื่ออ่านข้อความที่ส่งมาได้ เพราะตัวรับ IR รุ่นนี้ (TSOP4838) จะ demodulate เอาสัญญาภาหะทิ้งไปเหลือต่อสัญญาร serial อย่างไรก็ดีต้องกำหนดให้โมดูล UART ทำงานกับสัญญาณที่กลับขั้ว (ปกติต่ำ) ด้วย

#include <16F1705.h>
#device adc=10

#FUSES INTRC_IO
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOMCLR //Master Clear pin disabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //No brownout reset
#FUSES BORV25
#FUSES LVP //Low Voltage Programing
#FUSES PUT //Power Up Timer
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits

#use delay(clock=32 MHz)
#use rs232(baud=2400,xmit=PIN_C4,rcv=PIN_C5)
#use pwm(PWM3, frequency=30khz, duty=50, PWM_ON)
#pin_select CLC1OUT=PIN_C0

void main() {
 
 // Configure the CLC1 module
 setup_clc1(CLC_ENABLED | CLC_MODE_AND);
 
 clc1_setup_input(1, CLC_INPUT_PWM3);   // use PWM3 as input 1
 clc1_setup_input(2, CLC_INPUT_U1TX);   // use UART Tx as input 2
 
 clc1_setup_gate(1, CLC_GATE_NON_INVERTED_INPUT_1); 
 clc1_setup_gate(2, CLC_GATE_INVERTED_INPUT_2);
 clc1_setup_gate(3, CLC_GATE_OUTPUT_INVERTED);
 clc1_setup_gate(4, CLC_GATE_OUTPUT_INVERTED);
 
 while (1) {
 output_toggle(PIN_A5);
 printf("I'm 16F1705\r\n");
 delay_ms(1000);
 }
}

 

 

 

Leave a comment

Your email address will not be published. Required fields are marked *