บทช่วยสอน PIC - ตั้งแต่การลงทะเบียนไปจนถึงการขัดจังหวะ

ลองใช้เครื่องมือของเราเพื่อกำจัดปัญหา





ก่อนที่จะเข้าสู่รายละเอียดนาทีของการเขียนโปรแกรม PIC สิ่งสำคัญอันดับแรกคือต้องเรียนรู้วิธีการเขียนโปรแกรมที่ดีสองสามวิธี

การทำความเข้าใจรีจิสเตอร์

เริ่มต้นด้วยสมมติว่าคุณพิมพ์ a (อัฒภาค) ที่จุดใดก็ได้ของโปรแกรมสิ่งที่อยู่หลังอัฒภาคนี้จะถูกคอมไพเลอร์เพิกเฉยจนกว่าจะถึงตำแหน่งที่แคร่ตลับหมึกกลับเข้าที่



คุณลักษณะข้างต้นช่วยให้เราสามารถเพิ่มความคิดเห็นหรือข้อสังเกตเพื่อที่จะไม่กลายเป็นส่วนหนึ่งของโปรแกรม แต่ยังช่วยให้เราระบุโปรแกรมได้ด้วยความช่วยเหลือจากความคิดเห็นที่อยู่ข้างๆ การแสดงความคิดเห็นเป็นแนวทางปฏิบัติที่แนะนำขณะเขียนโปรแกรม IC ใด ๆ

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



ข้างต้นจะต้องทำในรูปแบบของชื่อจริงเพื่อให้จดจำได้ทันทีเช่น COUNT สิ่งสำคัญคือต้องทราบว่าที่นี่ใช้ตัวพิมพ์ใหญ่ทั้งหมดเพื่อทำให้แตกต่างกันและยังระบุว่าเป็นค่าคงที่


อย่างที่เราเห็นด้านบนทำในรูปแบบของกล่องที่ทำจากอัฒภาคซึ่งทำให้มันดูสะอาดขึ้น นอกจากนี้ลองจัดทำเอกสารโปรแกรมบนกระดาษด้วยเช่นกันการปฏิบัตินี้จะช่วยให้เข้าใจสิ่งต่าง ๆ ในขั้นตอนที่ชาญฉลาด

2. รีจิสเตอร์

การลงทะเบียนภายใน PIC เป็นพื้นที่ที่ยอมรับรายละเอียดที่เป็นลายลักษณ์อักษรและอนุญาตให้อ่านได้ คุณอาจเปรียบเทียบกับแผ่นกระดาษที่คุณสามารถแสดงภาพเนื้อหาและเพิ่มโดยการเขียนทับลงไป

รูปด้านล่างแสดงแผนผังไฟล์รีจิสเตอร์ทั่วไปที่ฝังอยู่ภายใน PIC16F84 รูปแบบไม่ใช่สิ่งที่กำหนดไว้ใน PIC จริง ๆ เพียงเพื่อระบุว่าบิตจะถูกจัดเรียงอย่างไรภายในชิปและทำความเข้าใจกับคำสั่งบางส่วนที่เกี่ยวข้อง

คุณจะเห็นได้ว่าโดยพื้นฐานแล้วแบ่งออกเป็น Bank 0 และ Bank 1 Bank 1 มีหน้าที่ควบคุมการทำงานจริงของ PIC เช่นโทรหา PIC ซึ่งบิตที่พอร์ต A ถูกกำหนดให้เป็นอินพุตและเป็นเอาต์พุต

ธนาคาร 2 มีไว้สำหรับจัดการข้อมูล

เรามาทำความเข้าใจสิ่งนี้ผ่านตัวอย่างต่อไปนี้:

สมมติว่าเราต้องการกำหนดหนึ่งบิตที่ PortA สูง สำหรับสิ่งนี้ก่อนอื่นเราต้องไปที่ Bank 1 เพื่อตั้งค่าบิตหรือพินที่ระบุที่พอร์ต A ในรูปแบบของเอาต์พุต หลังจากนี้เราจะกลับไปที่ Bank 0 และส่งลอจิก 1 (บิต 1) ไปยังพินนั้น

การลงทะเบียนทั่วไปที่เราต้องการใช้ใน Bank 1 ได้แก่ STATUS, TRISA และ TRISB

STATUS ช่วยให้เรากลับไปที่ Bank 0 ได้โดย TRISA อนุญาตให้เราเลือกพินที่พอร์ต A เป็นเอาต์พุตและอาจเป็นอินพุตขณะที่ TRISB อำนวยความสะดวกในการเลือกระหว่างขาออกและขาอินพุตที่พอร์ต B การลงทะเบียน SELECT ใน BANK 0 อนุญาตให้ผู้ใช้ เพื่อพลิกไปที่ธนาคาร 1.

ขอสรุปแนวคิดทั้งหมดพร้อมคำอธิบายต่อไปนี้:

สถานะ:

ในการเปลี่ยนจาก Bank 0 เป็น Bank 1 เราสั่งการลงทะเบียน STATUS สิ่งนี้ดำเนินการโดยการตั้งค่าบิต # 5 ของการลงทะเบียนสถานะเป็น 1 เพื่อที่จะกลับไปที่ธนาคาร 0 เรากำหนดบิต 5 ของการลงทะเบียนสถานะเป็น 0 การลงทะเบียนสถานะอยู่ในตำแหน่งที่อยู่ที่ 03h ที่นี่ h หมายถึงททท. อาจอยู่ในเลขฐานสิบหก

TRISA และ TRISB:

เหล่านี้ตั้งอยู่ตามที่อยู่ 85h และ 86h ตามลำดับ สำหรับการเขียนโปรแกรมพินเป็นเอาต์พุตหรืออินพุตเราเพียงแค่ส่งค่าศูนย์หรือหนึ่งไปยังบิตเฉพาะในรีจิสเตอร์ ตอนนี้อาจทำได้สองวิธีผ่านไบนารีหรือ Hex ในกรณีที่ไม่สามารถแปลงพารามิเตอร์ได้เขาหรือเธออาจใช้เครื่องคำนวณทางวิทยาศาสตร์เพื่อใช้ค่า

ตอนนี้เรามี 5 พินที่พอร์ต A ซึ่งตรงกับ 5 พิน หากเราตั้งใจจะแก้ไขพินตัวใดตัวหนึ่งเป็นอินพุตเราจะส่ง“ 1” ไปยังบิตนั้น ๆ

ในกรณีที่เราต้องการกำหนดพินตัวใดตัวหนึ่งเป็นเอาต์พุตเราจะตั้งค่าพินเฉพาะเป็น“ 0” บิตช่วยลดความแม่นยำที่สอดคล้องกับบิตหรือบิตที่แม่นยำยิ่งขึ้น 0 คือ RA0 บิต 1 จะเป็น RA1 บิต 2 = RA2 และอื่น ๆ มาทำความเข้าใจด้วยวิธีนี้:

สมมติว่าคุณต้องการแก้ไข RA0, RA3 และ RA4 เป็นเอาต์พุตในขณะที่ RA1 / RA2 เป็น i / ps คุณสามารถทำได้โดยการส่ง 00110 (06h) ตรวจสอบว่าบิต 0 อยู่ทางขวาตามที่ระบุไว้ที่นี่:

พอร์ต A พิน RA4 RA3 RA2 RA1 RA0

เลขบิต 4 3 2 1 0

ไบนารี 0 0 1 1 0

เช่นเดียวกับ TRISB

PORTA และ PORTB

เพื่อที่จะให้หนึ่งในพินเอาต์พุตสูงเราเพียงแค่เสนอ“ 1” เพื่อเค้นบิตตามลำดับในการลงทะเบียน PORTA หรือ PORTB ของเรา อาจมีการปฏิบัติตามขั้นตอนที่เหมือนกันสำหรับการลงทะเบียน TRISA และ TRISB ก่อนที่เราจะเร่งความเร็วในการเข้ารหัสตัวอย่างแรกของเราเรามาทำความเข้าใจกับคูเป้ของทะเบียนเพิ่มเติม ได้แก่ : w และ f

W และ F

ทะเบียน W เป็นทะเบียนธรรมดาที่ช่วยให้คุณสามารถกำหนดค่าที่คุณเลือกได้ ทันทีที่คุณกำหนดขนาดให้กับ W คุณสามารถดำเนินการต่อโดยเพิ่มค่านี้ไปยังค่าอื่นหรือเพียงแค่ย้าย ด้วยการกำหนดค่าอื่นรายละเอียดจะถูกเขียนทับบน W.

การลงทะเบียน F จะส่งต่อเรื่องที่เป็นลายลักษณ์อักษรไปยังทะเบียน เราต้องการให้การลงทะเบียน F นี้กำหนดค่าบนทะเบียนอาจอยู่เหนือการลงทะเบียน STATUS หรือ TRISA เนื่องจากไม่อนุญาตให้เราใส่ค่าลงไปโดยตรง โปรแกรมตัวอย่าง

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

เริ่มต้นด้วยการแก้ไขพอร์ต A ตามที่กล่าวไว้ข้างต้น

สำหรับสิ่งนี้เราจำเป็นต้องเปลี่ยนจาก Bank 0 เป็น Bank1 ซึ่งทำได้โดยการตั้งค่าการลงทะเบียน STATUS ที่อยู่ที่ 03h บิต 5 เป็น 1

BSF 03 ชม. 5

BSF หมายถึงชุดบิต F เรากำลังใช้ตัวเลขสองตัวหลังจากคำสั่งนี้ - 03h ซึ่งเป็นที่อยู่ลงทะเบียนสถานะและหมายเลข 5 ซึ่งสอดคล้องกับหมายเลขบิต

ดังนั้นสิ่งที่เรากำลังพูดคือ“ ตั้งค่าบิต 5 ในที่อยู่ 03h ถึง 1”

ตอนนี้เราอยู่ในธนาคาร 1

MOVLW 00110b

เรากำลังใส่ค่าไบนารี 00110 (ตัวอักษร b หมายถึงตัวเลขเป็นเลขฐานสอง) ลงในรีจิสเตอร์วัตถุประสงค์ทั่วไปของเราแน่นอนว่าฉันสามารถทำได้ในเลขฐานสิบหกซึ่งในกรณีนี้คำสั่งของเราจะเป็น:

MOVLW 06 ชม

งานอย่างใดอย่างหนึ่ง MOVLW หมายถึง 'Move Literal Value Into W' ซึ่งในภาษาอังกฤษหมายถึงใส่ค่าที่ตามมาโดยตรงในทะเบียน W

ตอนนี้เราต้องใส่ค่านี้ลงในทะเบียน TRISA ของเราเพื่อตั้งค่าพอร์ต:

MOVWF 85 ชม

คำสั่งนี้ระบุว่า“ ย้ายเนื้อหาของ W ไปยังที่อยู่ลงทะเบียนที่ตามมา” ในกรณีนี้ที่อยู่หมายถึง TRISA

ทะเบียน TRISA ของเรา ณ จุดนี้มีรูป 00110 หรือนำเสนอในรูปแบบกราฟิก:

พอร์ต A พิน RA4 RA3 RA2 RA1 RA0

ไบนารี 0 0 1 1 0

อินพุต / เอาต์พุต O O I I O

ตอนนี้เรามีพินพอร์ต A แล้วเราต้องกลับไปที่ Bank 0 เพื่อปรับข้อมูลอย่างใดอย่างหนึ่ง

BCF 03 ชม. 5

คำสั่งนี้บรรลุผลย้อนกลับของ BSF หมายถึง“ Bit Clear F” คู่ของตัวเลขที่สอดคล้องกันคือที่อยู่ของรีจิสเตอร์นี่คือการลงทะเบียนสถานะเช่นเดียวกับตัวเลขบิตในอินสแตนซ์นี้บิตห้า สิ่งที่เราทำเสร็จแล้วในปัจจุบันคือบิตห้าที่กำหนดไว้ในไฟล์

STATUS ลงทะเบียนเป็น 0

เราได้ที่จุดนี้กลับมาใน Bank 0
ต่อไปนี้เป็นรหัสทั้งหมดในบล็อกเดียว:

BSF 03h, 5 ไปที่ธนาคาร 1
MOVLW 06h ใส่ 00110 เป็น W
MOVWF 85h ย้าย 00110 เข้าสู่ TRISA
BCF 03h, 5 กลับมาที่ Bank 0

ภายในคำแนะนำสุดท้ายเราได้ยืนยันวิธีการสร้างพินพอร์ต IO บน PIC เพื่อเป็นอินพุตหรือเอาต์พุต

ผ่านหลักสูตรนี้ให้ฉันช่วยคุณในการส่งข้อมูลไปยังพอร์ตต่างๆ

การส่งข้อมูลไปยังพอร์ต

ในบทช่วยสอนที่ตามมาเราจะดำเนินการให้เสร็จสมบูรณ์โดยการเปิดและปิดไฟ LED ซึ่งประกอบด้วยรายละเอียดโปรแกรมที่สมบูรณ์และแผนภาพวงจรที่ตรงไปตรงมาเพื่อให้คุณสามารถเห็น PIC ทำงานได้อย่างแม่นยำตามที่เราคาดหวังไว้

อย่าพยายามรวบรวมและตั้งโปรแกรม PIC ของคุณด้วยผลลัพธ์ด้านล่างเนื่องจากเป็นเพียงภาพประกอบเท่านั้น ในขั้นต้นเราจะสร้าง Port A bit 2 เป็นเอาต์พุต:

สิ่งนี้สามารถจดจำได้จากคำแนะนำก่อนหน้านี้ ความแตกต่างเพียงอย่างเดียวอาจเป็นได้เราได้แก้ไขพินทุกบิตบน A เป็นเอาต์พุตโดยส่ง 0h ไปยังรีจีสเตทรีจีสเตท ตอนนี้สิ่งที่เขาต้องทำคือเปิดไฟ LED

เราทำได้โดยการตั้งเวลาให้หมุดตัวใดตัวหนึ่ง (อันที่มีไฟ LED เชื่อมโยงอยู่) สูง หากต้องการให้แตกต่างออกไปเราจะใช้ '1' กับหมุด นี่เป็นวิธีการดำเนินการอย่างแท้จริง (สังเกตความคิดเห็นเพื่อคำชี้แจงสำหรับทุกบรรทัด):

ดังนั้นสิ่งที่เราทำได้ในตอนนี้คือเปิดไฟ LED แล้วปิดหนึ่งครั้ง สิ่งที่เราต้องการคือให้ LED เปิดปิดในภายหลังอย่างต่อเนื่อง

เราบรรลุเป้าหมายนี้โดยการได้รับโปรแกรมเพื่อกลับไปที่จุดเริ่มต้น เราทำสิ่งนี้ให้สำเร็จโดยการสร้างแท็กในตอนแรกตั้งแต่เริ่มต้นโปรแกรมของเราหลังจากนั้นก็แจ้งให้โปรแกรมดำเนินการต่อที่นั่น เราระบุแท็กค่อนข้างตรงไปตรงมา

เราป้อนคำศัพท์พูดว่า START พิมพ์รหัสถัดไป:

ดังที่ได้แสดงให้เห็นแล้วในตอนแรกเราได้กล่าวถึงนิพจน์ 'Start' ทันทีที่เริ่มต้นโปรแกรม

ต่อไปในตอนท้ายของโปรแกรมเราจะพูดถึง 'goto Start' อย่างชัดเจน คำสั่ง 'goto' ดำเนินการในสิ่งที่ประกาศ

โปรแกรมนี้จะเปิดและปิด LED อย่างสม่ำเสมอทุกครั้งที่เราเปิดวงจรโดยมีแนวโน้มที่จะปิดเมื่อเราถอดกระแสไฟฟ้าออก เราควรตรวจสอบโปรแกรมของเราอีกครั้ง:

แน่นอนเราได้ละเว้นความคิดเห็นอย่างไรก็ตามเรายังสามารถปฏิบัติตามคำแนะนำและตัวเลขได้

สิ่งนี้อาจทำให้งงเล็กน้อยในภายหลังในกรณีที่คุณลองแก้ไขปัญหาโปรแกรมและในขณะที่เขียนรหัสคุณจำที่อยู่ได้ทั้งหมด

แม้ว่าความคิดเห็นอาจถูกวางไว้ แต่ก็อาจดูรกไปบ้าง สิ่งนี้จะต้องมีการตั้งชื่อตัวเลขและอาจทำได้โดยคำสั่งเพิ่มเติม: คำสั่ง 'equ' คำสั่ง 'equ' แสดงให้เห็นว่าบางสิ่งอาจเท่ากับของอื่น

อาจไม่ใช่คำสั่งสำหรับ PIC แต่สำหรับแอสเซมเบลอร์ คำสั่งนี้ช่วยอำนวยความสะดวกในการกำหนดชื่อให้กับตำแหน่งที่อยู่รีจิสเตอร์หรือค่าคงที่ของเงื่อนไขการเขียนโปรแกรม

เราจะสร้างค่าคงที่สองสามค่าสำหรับโปรแกรมของเราและเป็นพยานว่ามันอ่านโปรแกรมได้ตรงไปตรงมามากแค่ไหน

ตั้งแต่ตอนนี้เราได้แก้ไขค่าคงที่แล้วเราอาจดำเนินการต่อโดยตั้งค่าลงในโปรแกรมของเรา ต้องกำหนดค่าคงที่ก่อนที่จะใช้

ดังนั้นอย่าลืมวางตำแหน่งไว้ที่จุดเริ่มต้นของโปรแกรมเสมอ เราจะเขียนโปรแกรมใหม่โดยไม่รวมความคิดเห็นอีกครั้งเพื่อเปรียบเทียบการติดฉลากก่อนหน้ากับโปรแกรมล่าสุด

อาจสังเกตได้ว่าค่าคงที่ช่วยให้เข้าใจโปรแกรมได้ง่ายขึ้นเล็กน้อยอย่างไรก็ตามเรายังคงไม่มีความคิดเห็นไม่ต้องกังวลเนื่องจากเรายังไม่เสร็จสิ้น

อาจมีข้อเสียเล็กน้อยของโปรแกรม LED กะพริบของเรา
ทุกคำสั่งต้องการ 1 ลำดับนาฬิกาจึงจะเสร็จสิ้น ในกรณีที่เราใช้คริสตัล 4MHz ทุกคำสั่งจะเรียก 1 / 4MHz หรือ 1uS เพื่อสิ้นสุด

เนื่องจากเราใช้คำสั่งเพียงห้าคำสั่ง LED จึงจะเปิดใช้งานแล้วปิดใน 5uS สิ่งนี้อาจเร็วเกินไปสำหรับผู้คนที่จะสังเกตเห็นนอกจากนี้ดูเหมือนว่า LED จะสว่างเต็มที่

สิ่งที่เราควรทำแทนคือสร้างการยับยั้งระหว่างการเปิดไฟ LED และการปิด LED ทฤษฎีของการยับยั้งคือเรานับถอยหลังจากปริมาณก่อนหน้านี้ดังนั้นเมื่อมันถึงศูนย์เราก็เลิกนับ

ค่าศูนย์หมายถึงข้อสรุปของความล่าช้าและเรายังคงดำเนินการตามกระบวนการตลอดทั้งโปรแกรม ดังนั้นสิ่งแรกที่เราต้องทำคือการกำหนดค่าคงที่เพื่อใช้เป็นตัวนับของเรา

ให้เราเรียกค่าคงที่ COUNT นี้ หลังจากนั้นเราจะต้องพิจารณาว่าจะเริ่มนับจำนวนที่มีความสำคัญเพียงใด แน่นอนว่าตัวเลขที่ใหญ่ที่สุดที่เราสามารถรวมได้คือ 255 หรือ FFh เป็นเลขฐานสิบหกตามที่ฉันพูดถึงในบทช่วยสอนก่อนหน้านี้คำสั่ง equ จะกำหนดนิพจน์ให้กับสถานการณ์การลงทะเบียน

นี่หมายความว่าไม่ว่าเราจะจัดสรร COUNT ของเราในปริมาณเท่าใดก็จะตรงกับรายการของทะเบียน ในกรณีที่เราพยายามกำหนดค่า FFh เราจะได้รับข้อผิดพลาดเมื่อเรารวบรวมโปรแกรม

เหตุผลที่เป็นที่ตั้ง FFh ดังนั้นเราจึงไม่สามารถเข้าถึงได้ ดังนั้นเราต้องกำหนดหมายเลขของแท้อย่างไร? แน่นอนว่าจะต้องมีการไตร่ตรองด้านข้างเล็กน้อย

ตัวอย่างเช่นหากเรากำหนดให้ COUNT ของเราเป็นที่อยู่ 08h สิ่งนี้จะเป็นการระบุปลายทางการลงทะเบียนวัตถุประสงค์พื้นฐาน โดยค่าเริ่มต้นพื้นที่ที่ไม่ถูกแตะต้องจะถูกตั้งค่าเป็น FFh ดังนั้นหาก COUNT นำไปสู่ ​​08h คุณจะพบค่า FFh ในขณะที่เราเปิดเครื่องครั้งแรก อย่างไรก็ตามฉันคือคุณเราจะแก้ไข COUNT ไปยังหมายเลขอื่นได้อย่างไรทั้งหมดที่เราใช้คือ 'ย้าย' การประเมินค่าไปยังปลายทางนี้ก่อน

ตามภาพประกอบสมมติว่าเราต้องการให้ COUNT มีค่า 85 ชั่วโมงเราไม่สามารถพูดถึง COUNT เท่ากับ 85 ชั่วโมงได้เนื่องจากนั่นคือตำแหน่งของการลงทะเบียน Tri-State สำหรับพอร์ต A สิ่งที่เราทำได้อย่างแม่นยำมีดังต่อไปนี้: movlw 85h ค่า 85h ในการลงทะเบียน W movwf 08h

ตอนนี้ย้ายไปที่ทะเบียน 08h ของเรา ต่อจากนั้นในกรณีที่เราแสดง COUNT เท่ากับ 08 ชม. COUNT จะตรงกับค่า 85 ชม. ละเอียดอ่อนใช่มั้ย! ดังนั้นในตอนแรกเรากำหนดค่าคงที่ของเรา: COUNT เท่ากับ 08h การติดตามเราจะต้องลด COUNT นี้ทีละหนึ่งจนกว่าจะกลายเป็นศูนย์

มันเกิดขึ้นเพียงว่ามีคำสั่งหนึ่งที่ออกแบบมาเพื่อให้เราบรรลุเป้าหมายนี้โดยใช้ 'goto' และแท็ก

คำสั่งที่เราจะนำไปใช้คือ: DECFSZ COUNT, 1 คำสั่งนี้ระบุว่า 'ลดการลงทะเบียน (ในที่นี้คือ COUNT) ด้วยตัวเลขที่ติดตามลูกน้ำ ถ้าเราไม่ได้ศูนย์จงกระโดดสองจุดไปข้างหน้า 'ให้พบว่ามันใช้งานได้จริงก่อนที่เราจะวางไว้ในหลักสูตรของเรา

สิ่งที่เราได้ดำเนินการเริ่มต้นคือสร้างค่าคงที่ COUNT เป็น 255 ส่วนที่ตามมาจะวางตำแหน่งแท็กเรียกว่า LABEL ใกล้กับคำสั่ง decfsz ของเรา

decfsz COUNT, 1 ลดค่า COUNT ทีละรายการและคงผลลัพธ์สุดท้ายไว้ตรง COUNT นอกจากนี้ยังตรวจสอบเพื่อตรวจสอบว่า COUNT มีค่าเป็น 0 หรือไม่

หากไม่เป็นเช่นนั้นในกรณีนี้จะทริกเกอร์โปรแกรมให้เปลี่ยนไปยังบรรทัดถัดไป ตอนนี้เรามีคำประกาศ 'goto' ซึ่งจะส่งเรากลับไปที่คำสั่ง decfsz ของเรา

ในกรณีที่ค่า COUNT มีค่าเท่ากันคำสั่ง decfsz จะส่งผลให้โปรแกรมของเราก้าวไปข้างหน้า 2 จุดและถูกส่งไปยังจุดที่เราอ้างว่า 'ดำเนินการที่นี่'

ดังนั้นเนื่องจากคุณสามารถสังเกตได้เราจึงนำโปรแกรมไปนั่งในจุดเดียวตามเวลาที่กำหนดไว้ล่วงหน้าก่อนดำเนินการต่อ สิ่งนี้อาจถูกตั้งชื่อว่าลูปล่าช้า

ทำความเข้าใจเกี่ยวกับ Delay Loops

ในกรณีที่เราต้องการการหน่วงเวลาที่มากขึ้นเราสามารถไล่ตามหนึ่งรอบต่อไป ลูปพิเศษขยายความล่าช้า ให้เราอย่างน้อยสองคนสมมติว่าเราต้องการสังเกตแฟลช LED .. เราจะวางลูปการหน่วงเวลาเหล่านี้ไว้ในโปรแกรมของเราและทำให้สำเร็จโดยการแสดงผลเป็นโปรแกรมของแท้โดยการแนะนำความคิดเห็น:

เป็นไปได้ที่จะรวบรวมโปรแกรมนี้หลังจากที่โปรแกรม PIC แน่นอนต้องแน่ใจว่าคุณได้ลองใช้วงจรเพื่อตรวจสอบว่ามันทำงานจริงหรือไม่ ต่อไปนี้เป็นแผนภาพวงจรที่คุณควรสร้างทันทีที่คุณตั้งโปรแกรม PIC


ทำได้ดีมากคุณสามารถสร้างโปรแกรม PIC แรกของคุณได้จริงรวมทั้งสร้างวงจรเพื่อเปิดและปิดไฟ LED จนถึงตอนนี้ในกรณีที่คุณมีหลักสูตรเหล่านี้คุณอาจได้เรียนรู้คำสั่งโดยรวมเจ็ดคำสั่งจาก 35 คำสั่ง แต่ไม่ต้องสงสัยเลยว่าจนถึงตอนนี้คุณอาจควบคุมพอร์ต I / O ได้!

คุณจะพยายามเปลี่ยนลูปการหน่วงเวลาเพื่อแสดงแฟลช LED ให้เร็วขึ้นหรือไม่สิ่งที่เป็นค่าต่ำสุดของ COUNT เพื่อให้เห็นแฟลช LED เป็นหลัก? หรือบางทีคุณอาจต้องการรวมลูปหน่วงเวลาที่ 3 หรือเสริมหลังอันแรกเพื่อลดความเสถียรของ LED ลง ค่าคงที่ไม่ซ้ำกันสำหรับแต่ละลูปการหน่วง

จากนั้นคุณสามารถใช้ลูปหน่วงเวลาเพื่อแสดงแฟลช LED ด้วยความเร็วที่กำหนดได้เช่นหลังจากนั้นหนึ่งวินาที ภายในคำแนะนำถัดไปให้เราดูว่าเราสามารถใช้สิ่งที่เรียกว่ารูทีนย่อยเพื่อรักษาโปรแกรมให้กะทัดรัดและเป็นพื้นฐานได้อย่างไรรูทีนย่อยเป็นส่วนหนึ่งของโค้ดหรือโปรแกรมที่อาจเรียกว่าและเวลาที่คุณต้องการ รูทีนย่อยใช้ในกรณีที่คุณทำฟังก์ชันที่เหมือนกันบ่อยๆ

Subroutines คืออะไร

ประโยชน์ของการใช้รูทีนย่อยคือการแก้ไขค่าหนึ่งครั้งภายในรูทีนย่อยจะง่ายกว่าแทนที่จะพูดสิบครั้งทั้งหมดผ่านโปรแกรมของคุณและมันมีส่วนช่วยลดระดับหน่วยความจำที่โปรแกรมของคุณใช้ภายใน PIC. เราจะตรวจสอบรูทีนย่อย:

เริ่มแรกเราจำเป็นต้องระบุรูทีนย่อยของเราและในสถานการณ์นี้เราได้เลือกรูทีน หลังจากนั้นให้พิมพ์รหัสที่เราต้องการดำเนินการตามปกติ นั่นคือเหตุผลว่าทำไมเราจึงเลือกการหน่วงเวลาในโปรแกรม LED ที่กระพริบของเรา สุดท้ายนี้เราสรุปรูทีนย่อยโดยการป้อนคำสั่ง RETURN

ในการเริ่มต้นรูทีนย่อยจากที่ใดก็ได้ในโปรแกรมของเราเราพิมพ์คำสั่ง CALL อย่างรวดเร็วจากนั้นจึงกำหนดรูทีนย่อย

เราจะพิจารณาเรื่องนี้ในเชิงลึกอีกเล็กน้อย เมื่อเรามาถึงส่วนของโปรแกรมของเราที่เรียกว่า CALL xxx ซึ่ง xxx เป็นชื่อของรูทีนย่อยของเราโปรแกรมจะกระโดดไปที่ใดก็ได้ที่ติดตั้งรูทีนย่อย xxx คำแนะนำภายในรูทีนย่อยถูกดำเนินการ

เมื่อใดก็ตามที่คำสั่ง RETURN สำเร็จโปรแกรมจะกระโดดกลับไปที่โปรแกรมหลักของเราไปยังคำสั่งที่ตามมาจากคำสั่ง CALL xxx ของเรา

เป็นไปได้ที่จะเรียกรูทีนย่อยที่คล้ายกันหลาย ๆ ครั้งตามที่คุณต้องการซึ่งจะอธิบายว่าเหตุใดการใช้รูทีนย่อยจึงลดระยะเวลาโดยทั่วไปของโปรแกรมของเรา

อย่างไรก็ตามมีปัจจัยหลายประการที่คุณควรทราบ ในขั้นต้นเช่นเดียวกับโปรแกรมหลักของเราค่าคงที่เฉพาะเจาะจงใด ๆ ต้องได้รับการยอมรับก่อนจึงจะใช้งานได้

สิ่งเหล่านี้อาจได้รับการยอมรับภายในรูทีนย่อยเองหรือโดยตรงที่จุดเริ่มต้นของโปรแกรมหลัก ฉันขอเสนอให้คุณรับทราบทุกอย่างเมื่อเริ่มต้นโปรแกรมหลักของคุณตั้งแต่นั้นมาคุณก็รับรู้ว่าสิ่งต่างๆอยู่ในตำแหน่งเดียวกัน ถัดไปควรตรวจสอบให้แน่ใจว่าโปรแกรมหลักข้ามรูทีนย่อย

สิ่งที่ฉันบอกเป็นนัย ๆ ก็คือคุณควรวางรูทีนย่อยไว้ที่ส่วนท้ายของโปรแกรมหลักของคุณโดยตรงยกเว้นถ้าคุณใช้การประกาศ 'Goto' เพื่อกระโดดออกจากตำแหน่งที่รูทีนย่อยอยู่โปรแกรมจะดำเนินการต่อและใช้รูทีนย่อยโดยไม่คำนึงว่าคุณจะ ต้องการหรืออย่างอื่น

PIC จะไม่แยกความแตกต่างระหว่างรูทีนย่อยและโปรแกรมหลัก เราจะตรวจสอบโปรแกรม led แบบกระพริบของเราอย่างไรก็ตามคราวนี้เราจะใช้ประโยชน์จากรูทีนย่อยสำหรับลูปหน่วงเวลา ตามหลักการแล้วคุณจะค้นพบว่าความซับซ้อนของโปรแกรมปรากฏขึ้นน้อยเพียงใดรวมถึงคุณอาจพบว่ารูทีนย่อยใช้งานได้จริงอย่างไร

ในที่สุดคุณสามารถสังเกตได้ว่าด้วยการใช้รูทีนย่อยสำหรับลูปการหน่วงเวลาของเราเราอาจลดขนาดของโปรแกรมลง

ทุกครั้งที่เราต้องการการหน่วงเวลาอาจเป็นไปได้ว่าเมื่อ LED เปิดหรือปิดโดยทั่วไปเราจะเรียกรูทีนย่อยการหน่วงเวลา ในตอนท้ายของรูทีนย่อยโปรแกรมจะนำกลับไปที่บรรทัดตามคำสั่ง 'Call' ของเรา ในภาพประกอบด้านบนเราพลิกไฟ LED

หลังจากนั้นเราติดต่อรูทีนย่อย จากนั้นโปรแกรมจะกลับมาเพื่อให้เราสามารถปิด LED ได้ เราเรียกรูทีนย่อยอีกครั้งในกรณีที่รูทีนย่อยอาจเสร็จสมบูรณ์โปรแกรมจะกลับมาและคำสั่งที่ตามมาที่รับรู้คือ 'goto Start' สำหรับใครที่อาจจะทึ่งโปรแกรมแรกของเรามีความยาว 120 ไบต์

ด้วยการใช้รูทีนย่อยเราสามารถลดขนาดโปรแกรมของเราลงเหลือ 103 ไบต์ สิ่งนี้ไม่อาจฟังดูยอดเยี่ยมขนาดนั้นอย่างไรก็ตามเมื่อพิจารณาถึงความจริงที่ว่าเรามีเพียง 1024 ไบต์โดยรวมใน PIC ซึ่งเป็นประโยชน์เพียงเล็กน้อย

ในคำแนะนำถัดไปให้เราตรวจสอบการอ่านจากพอร์ต

จนถึงตอนนี้เราได้ปรับแต่งพอร์ต A เพื่อให้เราสามารถเปิดและปิด LED ได้ ในตอนนี้เราจะดูว่าเราจะอ่านพิน I / O บนพอร์ตอย่างไร

การอ่านพอร์ตอินพุต / เอาต์พุต

นี่คือเพื่อให้แน่ใจว่าเราสามารถเชื่อมโยงวงจรภายนอกและมีอิทธิพลต่อเอาต์พุตเฉพาะใด ๆ ที่มีให้

หากคุณจำจากหลักสูตรก่อนหน้านี้ของเราหากคุณต้องการสร้างพอร์ต I / O เราจำเป็นต้องข้ามจาก Bank 0 ไปยัง Bank 1 เราจะทำให้สำเร็จในขั้นต้น:

ณ จุดนี้เราได้แก้ไขบิต 0 ของพอร์ต A เป็นอินพุต ตอนนี้เราต้องตรวจสอบว่าพินสูงหรือต่ำ เพื่อให้บรรลุเป้าหมายนี้เราสามารถใช้หนึ่งในสองคำแนะนำ:

BTFSC และ BTFSS

คำสั่ง BTFSC หมายถึง 'ทำการทดสอบบิตบนรีจิสเตอร์และบิตที่เรากำหนด

ในกรณีที่เป็น 0 ในกรณีนี้เราจะละเว้นคำสั่งที่ตามมา ' BTFSS บอกเป็นนัยว่า 'ทำการทดสอบเล็กน้อยในการลงทะเบียนและบิตที่เราสร้างขึ้น ในกรณีที่ตั้งค่าเป็น 1 เราจะข้ามคำสั่งที่ตามมา

สิ่งที่เราใช้นั้นพิจารณาจากวิธีที่เราต้องการให้โปรแกรมของเราตอบสนองอย่างแม่นยำในขณะที่เราศึกษาข้อมูลเข้า เพื่อเป็นภาพประกอบในกรณีที่เรารอให้อินพุตเป็น 1 เราอาจสามารถใช้คำสั่ง BTFSS ในลักษณะต่อไปนี้:

รหัสที่นี่:

BTFSS PortA, 0Goto เริ่มดำเนินการที่นี่:
:

โปรแกรมจะเปลี่ยนเป็น 'ดำเนินการต่อที่นี่' หากบิต 0 บน PortA ถูกกำหนดให้เป็น 1

ขณะนี้เราจะเขียนโปรแกรมที่สามารถแจ้ง LED ได้ในอัตราเดียวอย่างไรก็ตามหากสวิตช์ถูก จำกัด มันจะกะพริบ LED ช้าลงสองเท่า

เป็นไปได้ที่จะใช้โปรแกรมนี้ด้วยตัวคุณเอง แต่เราได้รวมรายชื่อไว้ด้วย

คุณสามารถลองเขียนโปรแกรมทั้งหมดเพื่อตรวจสอบว่าในกรณีที่คุณเข้าใจหลักการหรือไม่ เราจะใช้วงจรเทียบเท่าเหมือนเดิมโดยรวมสวิตช์ที่ต่อ RA0 ของ PIC และรางบวกของแหล่งจ่ายของเรา

สิ่งที่เราประสบความสำเร็จคือการเปิดไฟ LED ฉันตรวจสอบในภายหลังว่าสวิตช์ปิดอยู่หรือไม่

ในกรณีที่ถูก จำกัด ต่อไปฉันจะเชื่อมต่อกับรูทีนย่อยการหน่วงเวลาของเรา สิ่งนี้ทำให้เรามีความล่าช้าเทียบเท่ากับก่อนหน้านี้อย่างไรก็ตามเรากำลังติดต่อกับมันสองครั้ง

เช่นเดียวกันกับเมื่อใดก็ตามที่ไฟ LED ดับ ในกรณีที่สวิตช์ไม่ปิดเราจะมีการบันทึกช่วงเวลาเปิดและปิดก่อนหน้านี้

คุณได้ติดตามบทเรียนเหล่านี้ตั้งแต่เริ่มต้นหรือไม่คุณอาจพยายามเข้าใจว่าขณะนี้คุณได้ค้นพบ 10 จาก 35 คำแนะนำสำหรับ PIC 16F84! และทุกสิ่งเหล่านี้เกิดขึ้นได้จากการเปิดและปิด LED เท่านั้น

จนถึงตอนนี้เราได้ประกอบ PIC กะพริบ LED เปิดและปิด

ต่อจากนั้นเราสามารถใช้ PIC ของเราได้โดยการรวมสวิตช์ด้วยดังนั้นจึงเปลี่ยนความเร็วแฟลช

ใช้พื้นที่หน่วยความจำอย่างมีประสิทธิภาพ

ปัญหาเดียวคือโปรแกรมค่อนข้างยาวและค่อนข้างไม่มีประสิทธิภาพของพื้นที่หน่วยความจำ ดูเหมือนว่าจะโอเคในขณะที่ฉันรวมคำสั่งเป็นครั้งแรก แต่ควรมีวิธีที่ง่ายกว่าในการดำเนินการ ในทางบวกเราจะวิเคราะห์ว่าเราเปิดและปิดไฟ LED ได้อย่างไร

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

ตอนแรกเรายัด w register ด้วย 02h หลังจากนั้นก็โอนไปที่ทะเบียน PortA เพื่อเปิดไฟ LED หากต้องการปิดเราได้บรรจุด้วย 00h หลังจากนั้นจึงเลื่อนไปที่ทะเบียน PortA ของเรา

ในระหว่างกิจวัตรเหล่านี้เราถูกบังคับให้ติดต่อกับรูทีนย่อยเพื่อให้แน่ใจว่าเราสังเกตเห็นไฟ LED กระพริบได้

ดังนั้นเราจึงจำเป็นต้องถ่ายโอนข้อมูลสองชุดสองสามครั้ง (หนึ่งครั้งไปยัง w register จากนั้นไปที่ PORTA) รวมทั้งเรียกรูทีนย่อยสองครั้ง (หนึ่งครั้งสำหรับเปิดแล้วหนึ่งครั้งเพื่อปิด) ดังนั้นเราจะบรรลุสิ่งนี้ด้วยประสิทธิภาพที่เพิ่มขึ้นได้อย่างไร? ง่ายมาก.

เราใช้คำสั่งอื่นที่เรียกว่า XORF คำสั่ง XORF ใช้ฟังก์ชันพิเศษหรือในการลงทะเบียนที่เรากำหนดด้วยข้อมูลที่เราให้ไว้ ฉันเชื่อว่าฉันต้องชี้แจงให้ชัดเจนว่า Exclusive OR คืออะไรในโลกก่อนที่จะดำเนินการต่อ ในกรณีที่เรามีอินพุตสองอินพุตและหนึ่งเอาต์พุตอินพุตสามารถเป็น 1 ถ้าและตราบใดที่อินพุตทั้งสองต่างกัน แม้ว่าจะเหมือนกัน แต่ผลลัพธ์อาจเป็น 0 ต่อไปนี้เป็นตารางความจริงสำหรับบุคคลที่เลือกตรวจสอบสิ่งเหล่านี้:

ก F0 0 00 1 11 0 11 1 0

ณ จุดนี้เราจะตรวจสอบว่าเกิดอะไรขึ้นถ้าเราแสดงผล B เหมือนกับผลลัพธ์ก่อนหน้านี้ของเราและเพียงแค่เปลี่ยนค่าของ A:

A B F
0 0 0
0 0 0
1 0 1
1 1 0
1 0 1

ถ้าเรารักษาค่าของ A ให้เหมือนกับ 1 และเรา Exclusive หรือมันด้วยเอาต์พุตเอาต์พุตจะสลับ ในกรณีที่คุณไม่สามารถสังเกตเห็นสิ่งนี้จากตารางความจริงด้านล่างนี้สามารถเห็นได้โดยใช้ไบนารี:

0 เอาท์พุทปัจจุบัน
EX-OR พร้อม 1 1 เอาต์พุตใหม่
EX-OR พร้อม 1 0 เอาต์พุตใหม่

บางทีคุณอาจพบว่าโดยเอกสิทธิ์เฉพาะ ORing เอาต์พุตด้วย 1 ตอนนี้เราจะสลับเอาต์พุตจาก 0 เป็น 1 เป็น 0
ดังนั้นในการเปิดและปิด LED ของเราเราต้องการเพียงสองสามประโยค:

MOVLW 02 ชม
ประตู XORWF, 1

สิ่งที่เราจะทำได้อย่างแม่นยำคือการเพิ่ม w register กับ 02h เราอยู่ในกรณีนั้น Exclusive ORing หมายเลขนี้ไม่ว่าจะมีอะไรอยู่ใน PortA ของเราก็ตาม ในกรณีที่บิต 1 เป็น 1 มันจะเปลี่ยนเป็น 0 ในกรณีที่บิต 1 เป็น 0 มันจะเปลี่ยนเป็น 1 ลองตรวจสอบโค้ดนี้หนึ่งหรือสองครั้งเพื่อแสดงว่ามันทำงานไบนารีอย่างไร:

ประตู
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

เราไม่จำเป็นต้องโหลดค่าที่เหมือนกันลงใน w register ทุกครั้งดังนั้นจึงเป็นไปได้ที่จะทำครั้งเดียวในตอนเริ่มต้นและเพียงแค่ข้ามกลับไปที่คำสั่ง toggle นอกจากนี้เราไม่ควรแก้ไขค่าในทะเบียน PortA ของเรา เหตุผล? แน่นอนเนื่องจากในกรณีที่เปิดเครื่องเป็น 1 เราสามารถสลับได้อย่างง่ายดาย ฉันหรืออีกอย่างคือเป็น 0 เมื่อเปิดเครื่องตอนนี้เราจะสลับมันด้วยซ้ำ

ดังนั้นคุณต้องการเห็นรหัสที่สร้างขึ้นใหม่ของเรา อันแรกแสดงถึงรหัส LED ที่กะพริบของเราในขณะที่อันที่สองจะแสดงรหัสที่มีการเพิ่มสวิตช์:

ขอให้คุณพบว่าเพียงแค่ใช้คำสั่งง่ายๆเพียงคำสั่งเดียวตอนนี้เราได้ลดขนาดของโปรแกรมของเราลงแล้ว ความจริงก็คือเพื่อแสดงให้เห็นว่าเราสามารถลดโปรแกรมของเราได้มากเพียงใดเราได้แสดงให้เห็นทั้งสองโปรแกรมเพียงสิ่งที่ประกอบขึ้นและขนาดของโปรแกรมในตารางด้านล่าง:

โปรแกรมแก้ไขขนาด (ไบต์)
LED กระพริบของแท้ 120
เพิ่มรูทีนย่อย LED กะพริบ 103
ใช้ฟังก์ชัน XOR LED กะพริบ 91
LED พร้อมสวิตช์ Original 132
LED พร้อมฟังก์ชัน Switch XOR ใช้ 124.

ดังนั้นไม่ใช่แค่เราได้ค้นพบคำแนะนำใหม่ ๆ เพียงเล็กน้อย แต่เรายังลดขนาดของสคริปต์ของเราลงอีกด้วย!

ด้านล่างนี้เราจะวิเคราะห์วิธีที่คุณสามารถกระดิกแต่ละบิตดำเนินการทางคณิตศาสตร์ที่ตรงไปตรงมาและตารางข้อมูล

ผู้จัดการตรรกะ

ในบทช่วยสอนสุดท้ายฉันได้นำเสนอการดำเนินการพิเศษหรือ ฟังก์ชัน ExOR ถูกเข้าใจว่าเป็นตัวดำเนินการทางตรรกะ

ภายในบทช่วยสอนนี้ฉันจะอธิบายตัวดำเนินการเชิงตรรกะเพิ่มเติมที่ PIC ส่งเสริม จะไม่มีกรณีใด ๆ ในโปรแกรมจุดอย่างไรก็ตามเราจะเรียนรู้วิธีการง่ายๆในการใช้ตัวดำเนินการโดยการใช้โค้ดส่วนเล็ก ๆ

AND โดยทั่วไปแล้วฟังก์ชัน AND จะวิเคราะห์สองบิตและส่ง 1 ว่าเหมือนกันหรือไม่และ 0 ในกรณีที่มีลักษณะเฉพาะ ตัวอย่างเช่นหากเราพูดถึง 1 และ 1 ผลลัพธ์คือ 1 ในขณะที่ในกรณีที่เราประกาศ 1 และ 0 ผลลัพธ์จะเป็น 0

ไม่จำเป็นต้องพูดเราสามารถประเมินคำได้เช่นกันเช่นเดียวกับฟังก์ชัน AND ทั้งหมดที่ทำสำเร็จคือการทบทวนคำศัพท์ทั้งสองทีละนิด ตัวอย่างด้านล่างแสดงให้เห็นถึงคำ 8 บิตสองคำที่กลายเป็น AND พร้อมกับผลิตภัณฑ์:

11001011
และ 10110011
เท่ากับ 10000011

ฉันหวังว่าคุณจะเห็นด้วยผลลัพธ์จะเป็นเพียงแค่ 1 เมื่อใดก็ตามที่ 2 1 จับมือซึ่งกันและกันในคู่คำ เราสามารถใช้ฟังก์ชัน AND เพื่อตรวจสอบพอร์ตได้เช่น

ในกรณีที่เรากำลังตรวจสอบพิน I / O สองสามตัวที่เชื่อมโยงกับวงจรและเราควรจับตาดูสถานการณ์เฉพาะที่มีพินเพียงไม่กี่พินเท่านั้นในกรณีนี้เราสามารถอ่านได้ค่อนข้างมาก พอร์ตหลังจากนั้นและผลลัพธ์ที่มีเงื่อนไขที่เราตรวจสอบแล้วเหมือนกับอินสแตนซ์ด้านบน

PIC มีส่วนผสมสองอย่างสำหรับ AND
พวกเขาคือ ANDLW และ ANDWF ANDLW อนุญาตให้เราใช้ฟังก์ชัน AND พร้อมรายละเอียดของทะเบียน W และจำนวนเงินที่เรากำหนด

ไวยากรณ์คือ ANDLW ซึ่งตรงนั้นคือสิ่งที่เรากำลังจะไปและเนื้อหาของ W ด้วย

ผลลัพธ์ของฟังก์ชัน AND จะถูกจัดเก็บไว้ในทะเบียน W โดยตรง
ANDWF อนุญาตให้เราใช้ฟังก์ชัน AND บนรีจิสเตอร์ W และรีจิสเตอร์อื่นตัวอย่างเช่น PORT ไวยากรณ์คือ ANDWF ซึ่งเป็นทะเบียนที่เราสนใจเช่น PORTA และ d แสดง PIC ที่คุณควรวางตำแหน่งของผลลัพธ์ ถ้า d = 0 ผลลัพธ์จะถูกใส่ไว้ในรีจิสเตอร์ W และจาก d = 1 ผลลัพธ์สุดท้ายจะถูกบันทึกในรีจิสเตอร์ที่เรากำหนด โค้ดสองส่วนด้านล่างแสดงตัวอย่างที่ดีของแต่ละฟังก์ชัน AND

ขั้นต้นคือการตรวจสอบสถานะของ PORTA ซึ่งเราต้องตรวจสอบว่าอินพุตเป็น 1100 หรือไม่เราสามารถวางผลลัพธ์กลับไปที่รีจิสเตอร์ W

movlw 1100
ANDWF 05h, 0 ภาพประกอบที่สองสามารถตรวจสอบเนื้อหาของทะเบียน W ได้แล้ว:
ANDLW 1100

หรือ

ตอนนี้เราได้ค้นพบฟังก์ชัน OR หนึ่งฟังก์ชันเพื่อให้ XOR แม่นยำ สิ่งนี้จะพัฒนาเป็น 1 ถ้าสองบิตไม่เหมือนกัน แต่แตกต่างกัน คุณสามารถค้นหาฟังก์ชัน OR อื่นที่เรียกว่า IOR ซึ่งเป็นฟังก์ชันรวมหรือ ฟังก์ชันนี้จะสร้าง 1 ในกรณีที่บิตใดบิตหนึ่งเป็น 1 แต่นอกจากนี้หากแต่ละบิตเป็น 1 ด้านล่างนี้คือตารางความจริงที่ชัดเจนเพื่อแสดงสิ่งนี้:

A B O / P
0 0 0
0 1 1
1 0 1
1 1 1

ตัวดำเนินการทางคณิตศาสตร์คืออะไร

เพิ่ม

ฟังก์ชันนี้บรรลุสิ่งที่มักเรียกร้อง มันก่อให้เกิดสองร่าง! ในกรณีที่ผลของการเพิ่มตัวเลขทั้งสองเกิน 8 บิตในกรณีนี้อาจมีการตั้งค่าสถานะ CARRY แฟล็ก CARRY ตั้งอยู่ที่ที่อยู่ 03h bit 0

เมื่อกำหนดบิตนี้ตัวเลขทั้งสองจะเกิน 8 บิต เมื่อเป็น 0 ในกรณีนี้ผลลัพธ์จะอยู่ภายใน 8 บิต ก่อนหน้านี้ PIC นำเสนอ ADD สองรูปแบบให้เราโดยเฉพาะ ADDLW และ ADDWF อย่างที่คุณอาจเดาได้ว่านี่ค่อนข้างเหมือนกับฟังก์ชันข้างต้น ADDLW นำเสนอเนื้อหาของการลงทะเบียน W ตามที่เรากำหนด ไวยากรณ์คือ: ADDLW ADDWF เพิ่มเนื้อหาของทะเบียน W และทะเบียนอื่น ๆ ที่เรากำหนด

ไวยากรณ์คือ: ADDWF, d อยู่ที่ไหน

ย่อย

ณ จุดนี้ฉันเดาว่าคุณไม่สามารถคาดเดาได้ว่าฟังก์ชันนี้มีหน้าที่อะไร! แน่นอนคุณสงสัยมันฟังก์ชั่นนี้
ลบหนึ่งบิตออกจากอีกบิตหนึ่ง อีกครั้ง PIC ให้เรา 2 รสนิยม: SUBLW และ SUBWF ไวยากรณ์มีความคล้ายคลึงกับฟังก์ชัน ADD อย่างชัดเจนนอกเหนือจากที่คุณพิมพ์ SUB แทน ADD!

การเพิ่มขึ้นในกรณีที่เราต้องการรวม 1 เป็นตัวเลขใน PIC เราสามารถใช้ประโยชน์จากฟังก์ชัน ADD และใช้หมายเลขหนึ่งได้ ~ ความยากในเรื่องนี้คือเราต้องวางรูปลงในทะเบียน W ก่อนจากนั้นใช้การควบคุม ADDLW 1 เพื่อเพิ่มค่า ในกรณีที่เราต้องการรวม 1 เข้ากับการลงทะเบียนอาจแย่กว่านั้น อันดับแรกเราต้องใส่หมายเลข 1 ลงในทะเบียน W หลังจากนั้นใช้ ADDWF, 1 ตัวอย่างเช่นหากต้องการรวม 1 เข้ากับตำแหน่ง 0C กล่าวว่าเราจำเป็นต้องมีส่วนของสคริปต์ต่อไปนี้:

movlw 01
addwf 0c, 1

มีวิธีการที่ง่ายกว่าในการดำเนินการนี้ เราสามารถใช้คำสั่ง INCF ไวยากรณ์คือ: INCF, d ที่ไหนคือรีจิสเตอร์หรือสถานที่ที่เราเกี่ยวข้องและ d แสดง PIC ที่คุณควรวางตำแหน่งผลลัพธ์ ในกรณีที่ d = 0 ผลลัพธ์จะอยู่ในทะเบียน W และในกรณีที่ d = 1 ผลลัพธ์จะถูกกำหนดไว้ในทะเบียนที่เรากำหนด

การใช้คำสั่งของแต่ละบุคคลนี้ทำให้เราสามารถเข้ารหัสได้ถึงห้าสิบเปอร์เซ็นต์ ในกรณีที่เราต้องการให้ผลลัพธ์คืนค่าลงในรีจิสเตอร์ W ในกรณีนั้นโดยใช้อินสแตนซ์ด้านบนเราอาจต้องรวมคำสั่งเพิ่มเติมเพื่อเปลี่ยนรายการของ 0C กลับไปที่รีจิสเตอร์ W หลังจากนั้นให้รีจิสเตอร์ 0C กลับไปเป็นไม่ ไม่ว่ามันจะเป็นอะไร

มีคำสั่งที่เพิ่มขึ้น มันคือ INCFSZ คำสั่งนี้อาจเพิ่มรีจิสเตอร์ที่เรากำหนดอย่างไรก็ตามถ้าเรารีจิสเตอร์เท่ากับ 0 หลังการเพิ่ม (ซึ่งจะเกิดขึ้นในขณะที่เรารวม 1 ถึง 127) หลังจากนั้น PIC อาจจะส่งผ่านคำสั่งที่ตามมา ส่วนของโค้ดด้านล่างแสดงถึงสิ่งนี้:

วน incfsz 0C
ไปที่ Loop
:
:
ส่วนที่เหลือของโปรแกรม

ในส่วนของโค้ดด้านบน 0C จะเพิ่มขึ้นทีละ 1 ต่อไปเราเป็นเจ้าของคำสั่งที่แจ้งให้ PIC กลับไปที่แท็กของเราชื่อ Loop และเพิ่ม 0C ทีละ 1 อีกครั้ง สิ่งนี้จะดำเนินต่อไปจนถึง 0C เท่ากับ 127 ในกรณีนี้เมื่อเราเพิ่ม 0C ทีละ 1 0C จะจับคู่กับ 0 คำสั่ง INCFSZ ของเราสามารถแจ้งให้ PIC ละเว้นคำสั่งที่ตามมาได้เป็นอย่างดีซึ่งในกรณีนี้คือการประกาศ goto ดังนั้น PIC จะดำเนินการต่อไปพร้อมกับส่วนที่เหลือของโปรแกรม

การลดลง

ตอนนี้เราได้พูดถึงฟังก์ชันลดลงในการฝึกก่อนหน้านี้แล้วดังนั้นฉันจะไม่แก้ไขอีกต่อไป

เสริม

คำสั่งสุดท้ายในการสนทนานี้จะย้อนกลับทุกๆบิตในรีจิสเตอร์ที่เรากำหนด ไวยากรณ์คือ: COMF, d ซึ่ง

ทำความเข้าใจเกี่ยวกับการทำงานของบิต

สิ่งนี้สามารถนำไปใช้เพื่อสลับพินของพอร์ตจากเอาต์พุตเป็นอินพุตและอื่น ๆ ได้อย่างรวดเร็ว ฟังก์ชันบิตช่วยให้เราสามารถสร้างบิตเดียวภายในนิพจน์ได้ พวกเขาอนุญาตให้เราดำเนินการตั้งค่าและกำจัดบิตเดียวในรีจิสเตอร์หรือตัวเลขที่เรากำหนด

ในตอนท้ายของหลักสูตรนี้เราจะเปิดเผยโปรแกรมที่ออกแบบมาเพื่อสร้างชุดของไฟเรียงลำดับที่ดำเนินไปข้างหน้าจากนั้นย้อนกลับ เราสังเกตว่าสิ่งนี้ทำได้สำเร็จก่อนหน้านี้เมื่อเราตรวจสอบฟังก์ชัน OR เอกสิทธิ์เฉพาะบุคคลโดยที่เราทำเฉพาะพอร์ตด้วยนิพจน์ ขณะนี้เรามี uptil สังเกตเห็นฟังก์ชั่นบิตเล็กน้อยเมื่อเราสร้างพอร์ตบน PIC และ

ขอย้ำการใช้ประโยชน์ที่นี่

BCF

คำสั่งนี้จะลบข้อมูลเล็กน้อยที่เรากำหนดไว้ในทะเบียนที่เรากำหนด ไวยากรณ์
คือ:
BCF,

ก่อนหน้านี้เราใช้วิธีนี้เพื่อเปลี่ยนจากหน้าที่ 1 เป็นหน้า 0 โดยการลบบิตในการลงทะเบียนสถานะ เราสามารถใช้มันเพื่อแก้ไขบิตเป็น 0 ในรีจิสเตอร์ / ที่ตั้งอื่นได้เช่นเดียวกัน ตัวอย่างเช่นในกรณีที่เราต้องการตั้งค่าบิตที่ 3 ใน 11001101 ที่บันทึกในส่วน 0C เป็น 0 เราอาจทำได้
แทรก:

BCF 0C, 03

BSF

คำสั่งนี้จะแก้ไขบิตที่เรากำหนดให้เป็น 1 ในการลงทะเบียนใด ๆ ที่เราระบุ เราใช้สิ่งนี้ก่อนหน้านี้เพื่อดำเนินการต่อจากหน้า 0 ไปยังหน้า 1 ไวยากรณ์คือ: BSF และใช้ในวิธีเดียวกับ BCF ด้านบน

BTFSC ถึงตอนนี้เราสามารถตั้งค่าหรือล้างข้อมูลเล็กน้อยในการลงทะเบียน อย่างไรก็ตามลองนึกดูว่าเราจำเป็นต้องตรวจสอบโดยทั่วไปว่าบิตเป็น 1 หรือ 0 ในรีจิสเตอร์หรือไม่?

แน่นอนว่าเป็นไปได้ที่จะใช้ BTFSC มันระบุการลงทะเบียนทดสอบบิต F และข้ามหากชัดเจน คำสั่งนี้จะวิเคราะห์บิตที่เรากำหนดในรีจิสเตอร์ ในกรณีที่บิตเป็น 0 คำสั่งจะแจ้งให้ PIC ทราบโดยส่งผ่านคำสั่งที่ตามมา

เราอาจใช้คำสั่งนี้ในกรณีที่ต้องการตรวจสอบแฟล็กตัวอย่างเช่นแฟล็กพกพา สิ่งนี้ช่วยให้เราต้องอ่านการลงทะเบียนสถานะและค้นหาแต่ละบิตเพื่อเรียนรู้ว่าแฟล็กใดได้รับการแก้ไข 29 ตัวอย่างเช่นในกรณีที่เราต้องการตรวจสอบว่าแฟล็ก Carry ถูกตั้งค่าเป็น 1 หรือไม่หลังจากที่เราเพิ่ม 2 ตัวเลขแล้วเราสามารถพิมพ์ดังต่อไปนี้:

BTFSC 03 ชม. 0
ดำเนินการต่อที่นี่หากตั้งค่าเป็น 1
หรือที่นี่ถ้าตั้งค่าเป็น 0

ในกรณีที่สถานะของบิตเป็น 1 ในกรณีนี้คำสั่งที่ตามมาจาก BTFSC จะเสร็จสมบูรณ์ ในกรณีที่ตั้งค่าเป็น 0 ในกรณีนั้นจะข้ามคำสั่งที่ตามมา ส่วนต่อไปนี้ของการจัดแสดงโค้ดที่อาจใช้:

วน:
:
:
BTFSC 03,0
ไปที่ Loop

ในโค้ดด้านบน PIC จะออกจากลูปในกรณีที่บิต 0 ของการลงทะเบียนสถานะ (หรือแฟล็ก Carry) ถูกกำหนดเป็น 0 มิฉะนั้นคำสั่ง goto จะดำเนินการ

BTFSS

คำสั่งนี้ระบุ Bit Test Register F และ Skip If Set สิ่งนี้สามารถเทียบเคียงได้กับคำสั่ง BTFSC นอกเหนือจากนั้น PIC จะละเว้นคำสั่งที่ตามมาหากบิตที่เราประเมินถูกตั้งค่าเป็น 1 แทนที่จะเป็น 0

CLRF

คำสั่งนี้จะแก้ไขรายละเอียดทั้งหมดของรีจิสเตอร์เป็น 0 ไวยากรณ์คือ:

CLRF
ก่อนหน้านี้เราใช้สิ่งนี้เพื่อตั้งค่าเอาต์พุตของพอร์ตเป็น 0 โดยใช้ CLRF 85h นอกจากนี้เรายังใช้มันเพื่อแก้ไขพอร์ตเพื่อรวมพินทั้งหมดเข้ากับเอาต์พุตโดยใช้ CLRF
05 ชม.

CLRW

สิ่งนี้อาจคล้ายกับคำสั่ง CLRF ยกเว้นการล้างทะเบียน W ไวยากรณ์ค่อนข้างเรียบง่าย:

CLRW

RLF และ RRF

คำแนะนำเหล่านี้จะขนส่งบิตในการลงทะเบียนช่องเดียวไปทางซ้าย (RLF) หรือทางขวา (RRF) ในรีจิสเตอร์ ตัวอย่างเช่นถ้าเราต้องการ 00000001 และเราใช้ RLF ในกรณีนั้นเราอาจมี 00000010 ณ จุดนี้จะเกิดอะไรขึ้นในกรณีที่มี 10,000000 และใช้คำสั่ง RLF แน่นอนว่า 1 จะอยู่ในตำแหน่งที่ถือธง ในกรณีที่เราใช้คำสั่ง RLF อีกครั้งค่า 1 จะปรากฏขึ้นอีกครั้งเมื่อเริ่มต้น อย่างไรก็ตามสิ่งนี้เกิดขึ้นในทางตรงกันข้ามสำหรับคำสั่ง RRF กรณีในจุดด้านล่างแสดงสิ่งนี้สำหรับคำสั่ง RLF ซึ่งเราสามารถดูรีจิสเตอร์ 8 บิตรวมถึงแฟล็กพกพา:

C 87654321
0 00000001
RLF 0 00000010
RLF 0 00000100
RLF 0 00001000
RLF 0 00010000
RLF 0 00100000
RLF 0 01000000
RLF 0 10000000
RLF 1 00000000
RLF 0 00000001

ตัวอย่างโปรแกรม

ตอนนี้เราจะเห็นโค้ดตัวอย่างที่สามารถรวบรวมและขับเคลื่อนได้ มันจะสร้างแสงลำดับเริ่มต้นที่ PortA bit 0 ไปที่ PortB bit 8 และ
แล้วกลับมา
ต่อไฟ LED เข้ากับหมุดพอร์ตแต่ละอัน เราจะมีบิตบางส่วน
ขั้นตอนที่ระบุไว้ในบทช่วยสอนนี้

TIME EQU 9FH ตัวแปรสำหรับลูปการหน่วงเวลา
PORTB EQU 06H ที่อยู่พอร์ต B
TRISB EQU 86H Port B ที่อยู่ Tristate
PORTA EQU 05H ที่อยู่พอร์ต A
TRISA EQU 85H Port A ที่อยู่ Tristate
STATUS EQU 03H Page เลือกลงทะเบียน
COUNT1 EQU 0CH การลงทะเบียนลูป
COUNT2 EQU 0DH ลงทะเบียนลูป

BSF STATUS, 5 ไปที่หน้า 1
MOVLW 00H และตั้งค่า
MOVWF TRISB ทั้งพอร์ต A และ B
MOVLW 00H เพื่อเอาท์พุท
MOVWF TRISA แล้วกลับไปที่
BCF STATUS, 5 หน้า 0.
MOVLW 00H ล้างพอร์ต A.
ประตู MOVWF

เริ่มโปรแกรมหลัก

RUNMOVLW
01H ตั้งค่าบิตแรก MOVWF
PORTB บนพอร์ต B.CALL
DELAY รอสักครู่โทร
ดีเลย์
เลื่อนบิตบนพอร์ต B ไปทางซ้ายแล้วหยุดชั่วคราว RLF
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1 สิ่งนี้จะย้ายบิตไปที่แฟล็กพกพา
ตอนนี้ย้ายไปที่พอร์ต A แล้วเลื่อนบิตไปทางซ้าย RLF
PORTA, 1 สิ่งนี้จะย้ายบิตจากแฟล็กศูนย์ไปยัง PortACALL
DELAYCALL DELAYRLF
ประตู 1CALL
DELAYCALL
DELAYRLF
ประตู 1CALL
DELAYCALL
DELAYRLF
ประตู 1CALL
DELAYCALL
ดีเลย์
ย้ายบิตกลับไปที่ Port ARRF
ประตู 1CALL
DELAYCALL
DELAYRRF
ประตู 1CALL
DELAYCALL
DELAYRRF
ประตู 1CALL
DELAYCALL
DELAYRRF
PORTA, 1 สิ่งนี้จะย้ายบิตไปที่แฟล็กศูนย์ตอนนี้ย้ายบิต
กลับไปที่พอร์ต BRRF
PORTB, 1CALL
DELAYCALL
DELAYRRF
PORTB, 1CALL
DELAYCALL
DELAYRRF
PORTB, 1CALL
DELAYCALL
DELAYRRF
PORTB, 1CALL
DELAYCALL DELAYRRF
PORTB, 1CALL
DELAYCALL
DELAYRRF
PORTB, 1CALL
DELAYCALL
DELAYRRF
PORTB, 1CALL
DELAYCALL
DELAY ตอนนี้เรากลับมาที่จุดเริ่มต้นแล้ว GOTO
RUN ไปอีกครั้ง

มีตัวเลือกที่ยอดเยี่ยมในชุดการฝึกที่อนุญาตให้คุณใช้ประโยชน์จากตารางข้อมูล

ตารางข้อมูลเป็นเพียงรายการคำพูดข้อมูลซึ่งทั้งหมดจะถูกพิจารณาโดยพิจารณาจากข้อควรพิจารณาบางประการ
ตัวอย่างเช่นคุณสามารถมีวงจรที่ใช้ PIC ซึ่งจะนับจำนวนอินสแตนซ์ที่ขาอินพุตจะสูงใน 1 วินาที หลังจากนั้นคุณสามารถแสดงหมายเลขบนจอแสดงผล 7 ส่วน

ทันทีที่เวลาเปิดตัว PIC จะเริ่มนับจำนวนครั้งที่พินสูงขึ้น หลังจากผ่านไป 1 วินาทีมันจะเข้าชมตารางและดูข้อมูลก็จะต้องแสดงตัวเลขบนจอแสดงผลที่เป็นสัญลักษณ์ของสถานการณ์ที่พินสูงขึ้น สิ่งนี้อาจเป็นประโยชน์เนื่องจากเราไม่ได้กำหนดว่าตัวเลขจะเป็นอย่างไรจนกว่า PIC จะเสร็จสิ้นการประมาณการ

ด้วยการใช้ตารางเราสามารถอนุญาตให้ PIC กำหนดรูปที่จะแสดงได้ ณ จุดนี้ก่อนที่ฉันจะแสดงให้คุณเห็นว่าตารางข้อมูลทำงานอย่างไรฉันอาจต้องบอกคุณว่า PIC รักษาเส้นทางของตำแหน่งที่อยู่ในโปรแกรมขณะที่โปรแกรมกำลังทำงานอยู่

อำนวยความสะดวกสำหรับผู้ที่เคยเขียนโปรแกรมบางอย่างในภาษาเบสิก มิฉะนั้นอย่ากังวลคุณอาจต้องการเรียนรู้เกี่ยวกับทฤษฎีต่อไป การมองเห็นมีโปรแกรมพื้นฐานที่คล้ายกับโปรแกรมที่แสดงด้านล่าง:

10 ปี K = 0
11 K = K + 1
12 ถ้า K> 10 แล้ว GOTO 20 ELSE GOTO 11
20 พิมพ์เค
21 จบ

โปรแกรมเริ่มต้นที่บรรทัด 10 ทันทีที่กำหนด K เป็น 0 มันจะเลื่อนไปยังบรรทัดที่ 11 ต่อไปหลังจากที่เรารวม 1 ถึง K แล้วเราก็ไปที่บรรทัดที่ 12

ณ จุดนี้เราอาจสงสัยว่า K สูงกว่า 10 หรือไม่ในกรณีนี้ให้ไปที่บรรทัด 20 หรือไม่เช่นนั้นเราก็กลับไปที่บรรทัดที่ 11

บรรทัดที่ 20 จัดทำเอกสาร K และบรรทัดที่ 21 สรุปโปรแกรม BASIC ใช้สถิติบรรทัดเพื่อช่วยโปรแกรมเมอร์ในการบันทึกว่าปัญหาอยู่ที่ใดเนื่องจากป้ายกำกับไม่ได้รับอนุญาต PIC ใช้ป้ายกำกับเพื่อหลบหนีระหว่างจุดหมายปลายทาง - หรือทำได้จริง?

เราใช้ป้ายกำกับเพื่อให้แน่ใจว่าเราทราบถึงจุดที่มีปัญหาและเพื่อให้แน่ใจว่าเราสามารถแจ้ง PIC ด้วยวิธีง่ายๆในการค้นหา

สิ่งที่เกิดขึ้นอย่างแม่นยำคือ PIC ใช้ประโยชน์จากตัวนับภายในที่เรียกว่า Program Counter เส้นทาง Program Counter (ย่อมาจาก PC) ของปลายทางหน่วยความจำที่คำสั่งปัจจุบันอยู่

เมื่อใดก็ตามที่เราแจ้งให้ PIC ไปที่ฉลากที่เลือกมันจะเข้าใจจุดแห่งความทรงจำดังนั้นจึงเพิ่มพีซีจนกว่าจะเห็นปลายทางหน่วยความจำนั้น นี่เป็นวิธีเดียวกับที่เราตรวจสอบโปรแกรมพื้นฐานข้างต้น ด้านล่างนี้เป็นส่วนของรหัสที่มีช่องว่างหน่วยความจำหรือรายการของพีซีข้างทุกคำสั่ง:

PC Instruction0000 movlw 03
0001 movwf 0C
0002 วนรอบ decfsc 0C
0003 goto ลูป
0004 จบ

ในการสาธิตข้างต้นเราได้แก้ไขพีซีเป็น 0000 ในสิ่งนี้เรามีคำสั่ง movlw 03 เมื่อ PIC นำข้อมูลนี้ไปใช้งานจะเพิ่มพีซีตามลำดับที่จะสแกนคำสั่งที่ตามมา ณ จุดนี้มุมมอง PIC movwf 0C พีซีเพิ่มขึ้นอีกครั้ง

ตอนนี้ PIC ศึกษา decfsc 0C ในกรณีที่รายละเอียดของ 0C ไม่ใช่ 0 ในกรณีนั้นพีซีจะเพิ่มขึ้นทีละ 1 เช่นเดียวกับคำสั่งต่อไปนี้ goto Loop แจ้งให้พีซีกลับไปที่ตำแหน่ง 0003 ซึ่งมี Loop ดังกล่าว ในกรณีที่รายละเอียดของ 0C เป็น 0 พีซีควรเพิ่มขึ้นทีละ 2 ให้ละเว้นคำสั่งที่ตามมา

การทำความเข้าใจตารางข้อมูล

ซึ่งจะวางพีซีไว้ที่ตำแหน่ง 0004 ซึ่งโปรแกรมจะเสร็จสิ้น ปลายทางได้รับการแก้ไขโดยผู้ประกอบและโดยทั่วไปแล้วเราไม่ควรกังวลว่าพีซีกำลังทำอะไรอยู่ จนกระทั่งเราพบว่าจำเป็นต้องควบคุมมันให้อยู่ภายใต้การควบคุมเช่นเดียวกับในขณะที่เราทำเมื่อใช้ตารางข้อมูล วิธีที่สะดวกที่สุดในการอธิบายวิธีการทำงานของตารางข้อมูลคือการเริ่มต้นด้วยภาพประกอบ

พีซีเท่ากับ 02
movlw 03
โต๊ะโทร
:
ตาราง addwf PC
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
กลับ

คำแนะนำเริ่มต้นคือการจัดสรรพีซีเลเบลพร้อมที่อยู่ของ Program Counter (02h) เราจะอยู่ในไม่ช้าหลังจากใส่ค่า 03h ลงในทะเบียน w หลังจากนั้นเราก็สื่อสารกับโต๊ะ บรรทัดที่สำคัญที่สุดในตารางรูทีนย่อยจะเพิ่มรายละเอียดของทะเบียน W (03h) ไปยังตัวนับโปรแกรม

สิ่งนี้จะทริกเกอร์ตัวนับโปรแกรมให้เพิ่มขึ้นด้วย 3 หรือทำให้เป็นวิธีอื่นกระตุ้นตัวนับโปรแกรมให้ดำเนินการลง 3 บรรทัด ในขณะที่ตัวนับมาถึง 3 บรรทัด PIC จะรับรู้คำสั่ง retlw คำสั่งนี้ส่งค่าตามหลังไปยังรีจิสเตอร์ W หลังจากนั้นกลับมาจากรูทีนย่อย โดยทั่วไปแล้ว RETLW หมายถึง Return, Literal to W.

ดูฉันวางลูกน้ำไว้หลังคำว่า Return เนื่องจากเราอยู่ในรูทีนย่อยเราจึงต้องการคำสั่ง Return เพื่อให้พื้นผิวของมัน ดังนั้น RET ในคำแนะนำ หลังจากคำสั่ง RETLW เป็นตัวเลขและนี่คือสิ่งที่ใส่ลงในทะเบียน W

ในตัวอย่างนี้เป็นรูปที่ 3 เราสามารถกำหนดปริมาณใด ๆ ให้กับรีจิสเตอร์ W ได้ตราบใดที่รูปนี้รวมกับตัวนับโปรแกรมในรูทีนย่อยตารางเราจะค้นพบคำสั่ง retlw ในภาพประกอบด้านบนนี้บอกเป็นนัยว่าเราสามารถครอบครองหมายเลขใดก็ได้ตั้งแต่ 1 ถึง 7 ในกรณีที่เราดำเนินการผ่านรูทีนย่อยเราอาจสามารถดำเนินการในส่วนเพิ่มเติมของโปรแกรมได้ ด้วยเหตุนี้จึงเป็นการย้ายที่ชาญฉลาดในการวางตารางข้อมูลตรงส่วนท้ายของโปรแกรม PIC ดังนั้นหากเราทำเกินขนาดในกรณีนี้เราจะไปถึงบทสรุปของโปรแกรมอย่างไรก็ตาม

หัวข้อของการขัดจังหวะอาจจะยาวที่สุดและยากที่สุดที่จะผ่านไป

คุณไม่พบวิธีการที่ไม่ซับซ้อนในการลงรายละเอียดการขัดจังหวะ แต่ด้วยความโชคดีเล็กน้อยในตอนท้ายของส่วนนี้คุณอาจสามารถใช้การขัดจังหวะในโปรแกรมของคุณเองได้
เราได้แยกส่วนออกเป็น 2 ขั้นตอน นั่นคือการเปิดใช้งานการแยกหัวข้อออกเป็นส่วน ๆ และเพื่อให้คุณมีความเข้าใจง่ายขึ้น

การขัดจังหวะคืออะไร? ตามคำที่ระบุไว้การขัดจังหวะเป็นเทคนิคหรือสัญญาณที่ป้องกันไมโครโปรเซสเซอร์ / ไมโครคอนโทรลเลอร์จากสิ่งใดก็ตามที่มีประสิทธิภาพซึ่งสิ่งที่แตกต่างกันอาจเกิดขึ้นได้

ขออนุญาตให้ภาพประกอบประจำวัน คิดว่าคุณกำลังผ่อนคลายในบ้านของคุณเองกำลังสนทนากับคนอื่น ทันใดนั้นโทรศัพท์ก็ดังขึ้น

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

ในขณะที่การสนทนาทางโทรศัพท์สิ้นสุดลงแล้วให้คุณกลับไปที่กิจวัตรหลักในการแชท ภาพประกอบนี้เป็นวิธีการที่โปรเซสเซอร์ขัดจังหวะในการดำเนินการ

โปรแกรมหลักกำลังทำงานโดยทำหน้าที่บางอย่างในวงจรอย่างไรก็ตามเมื่อเกิดการขัดจังหวะโปรแกรมหลักจะหยุดในขณะที่ดำเนินการตามขั้นตอนอื่น รูทีนสิ้นสุดลงโปรเซสเซอร์จะย้ายกลับไปที่รูทีนหลักเหมือนเดิม

การทำความเข้าใจการขัดจังหวะ

PIC มีแหล่งที่มาของการขัดจังหวะ 4 แห่ง พวกเขาสามารถแบ่งออกเป็นสองกลุ่ม สองแหล่งที่มาของการขัดจังหวะซึ่งสามารถนำไปใช้ภายนอกกับ PIC ได้ในขณะที่อีกสองแหล่งเป็นกระบวนการภายใน ให้ฉันชี้แจงภายนอกสองประเภทที่นี่ อีกสองรายการจะอธิบายไว้ในบทช่วยสอนที่แตกต่างกันเมื่อเรามาถึงตัวจับเวลาและจัดเก็บข้อมูล

หากคุณตรวจสอบพินออกของ PIC คุณจะสังเกตเห็นว่าพิน 6 เป็น RB0 / INT ณ จุดนี้ RB0 เป็นพอร์ต B บิต 0 อย่างชัดเจน INT แสดงว่าสามารถกำหนดค่าเป็นพินอินเทอร์รัปต์ภายนอกได้เช่นกัน นอกจากนี้พอร์ต B พิน 4 ถึง 7 (พิน 10 ถึง 13) อาจถูกใช้เพื่อขัดจังหวะ ก่อนที่เราจะสามารถใช้ INT หรือพินพอร์ต B อื่นได้เราต้องทำงานสองอย่างให้สำเร็จ ก่อนอื่นเราต้องแจ้ง PIC ว่าเราจะใช้การขัดจังหวะ

ต่อไปเราจะต้องกำหนดพินพอร์ต B ที่เราจะใช้เป็นอินเทอร์รัปต์แทนที่จะเป็นพิน I / O ภายใน PIC คุณจะพบการลงทะเบียนที่เรียกว่า INTCON และอยู่ที่ 0Bh ในการลงทะเบียนนี้คุณจะพบ 8 บิตที่อาจเปิดใช้งานหรือปิดใช้งาน บิต 7 ของ INTCON เรียกว่า GIE นี่คือ Global Interrngupt Enable การแก้ไขสิ่งนี้เป็น 1 เป็นการแจ้ง PIC ว่าเราจะใช้การขัดจังหวะ

บิต 4 ของ INTCON เรียกว่า INTE, INTerrupt Enable การใส่บิตนี้เป็น 1 บ่งบอกถึง PIC ว่า RB0 จะเป็นพินอินเทอร์รัพต์ การกำหนดค่าบิต 3 เรียกว่า RBIE จะแจ้งให้ PIc ทราบว่าเรากำลังจะใช้พอร์ต B บิต 4 ถึง 7 ณ จุดนี้ PIC เข้าใจว่าเมื่อพินนี้สูงหรือต่ำได้ต้องหยุดสิ่งที่มันทำงานและดำเนินการขัดจังหวะ กิจวัตร. ณ จุดนี้เราต้องแจ้งให้ PIC ทราบว่าการขัดจังหวะนั้นน่าจะอยู่ที่ขอบจากน้อยไปหามาก (0V ถึง + 5V) หรือการเปลี่ยนแปลงของสัญญาณขอบลดลง (+ 5V ถึง 0V)

พูดง่ายๆว่าเราต้องการให้ PIC ขัดจังหวะทุกครั้งที่สัญญาณเคลื่อนที่จากต่ำไปสูงหรือจากสูงไปต่ำ โดยการกระทำผิดสามารถกำหนดให้อยู่บนขอบที่เพิ่มขึ้น

ขอบ 'ทริกเกอร์' ถูกกำหนดไว้ในการลงทะเบียนเพิ่มเติมที่เรียกว่าการลงทะเบียน OPTION ตามที่อยู่ 81 ชม. บิตที่เรากระตือรือร้นคือบิต 6 ซึ่งมักเรียกกันว่า INTEDG

การตั้งค่านี้เป็น 1 จะทำให้ PIC รบกวนขอบการติดตั้ง (สถานะเริ่มต้น) และการตั้งค่าเป็น 0 จะช่วยกระตุ้นให้ PIC รบกวนบนขอบเลื่อน หากคุณต้องการให้ PIC เปิดใช้งานบนขอบที่เพิ่มขึ้นคุณก็ไม่ต้องทำอะไรกับเรื่องนี้

ณ จุดนี้น่าเศร้าที่การลงทะเบียนตัวเลือกอยู่ในธนาคาร 1 ซึ่งหมายความว่าเราชอบที่จะแก้ไขจากธนาคาร 0 เป็นธนาคาร 1 ตั้งค่าบิตในทะเบียนตัวเลือกหลังจากนั้นกลับไปที่ธนาคาร 0 กุญแจสำคัญคือการทำทุกบิตให้สำเร็จ ของ Bank 1 ลงทะเบียนในการประท้วงครั้งเดียวเช่นการสร้างหมุดพอร์ตหลังจากนั้นจะกลับไปที่ Bank 0 หากคุณทำเสร็จแล้ว

ดีดังนั้นเราจึงได้แจ้งให้ PIC ทราบว่าพินใดที่น่าจะเป็นตัวขัดจังหวะและขอบที่จะทริกเกอร์เกิดอะไรขึ้นในโปรแกรมและ PIC ทุกครั้งที่มีการขัดจังหวะเกิดขึ้น มีสองสิ่งเกิดขึ้น ก่อนอื่นมีการกำหนดเวลา 'ตั้งค่าสถานะ'

สิ่งนี้จะแจ้งให้โปรเซสเซอร์ภายในของ PIC ทราบว่ามีการขัดจังหวะเกิดขึ้น ถัดไปตัวนับโปรแกรม (ซึ่งฉันได้พูดถึงในบทช่วยสอนก่อนหน้านี้) เคล็ดลับไปยังที่อยู่เฉพาะภายใน PIC มาดูสิ่งเหล่านี้ทีละรายการอย่างรวดเร็ว Interrupt Flag ในการลงทะเบียน INTCON ของเราบิต 1 คือแฟล็กขัดจังหวะที่เรียกว่า INTF ณ จุดนี้เมื่อใดก็ตามที่มีการขัดจังหวะเกิดขึ้นแฟล็กนี้จะถูกกำหนดเป็น 1

เมื่อไม่มีการขัดจังหวะการตั้งค่าสถานะจะถูกวางไว้ที่ 0 เช่นเดียวกับความสำเร็จทั้งหมด ณ จุดนี้คุณอาจกำลังไตร่ตรองว่า ‘ประเด็นคืออะไร’ แน่นอนแม้ว่าแฟล็กนี้จะถูกกำหนดให้เป็น 1 แต่ PIC ก็ไม่สามารถทำได้และจะไม่ตอบสนองต่อการขัดจังหวะอีก ดังนั้นขอแสดงความเห็นว่าเราทำให้เกิดการขัดจังหวะ ค่าสถานะจะคงที่เป็น 1 และ PIC อาจเข้าสู่กิจวัตรของเราในการทำงานขัดจังหวะ

เมื่อค่าสถานะนี้ไม่ได้รับการแก้ไขเป็น 1 และ PIC ได้รับอนุญาตให้ตอบรับการขัดจังหวะต่อไปจากนั้นการกะพริบพินอย่างต่อเนื่องจะทำให้ PIC กลับไปที่จุดเริ่มต้นของขั้นตอนการขัดจังหวะของเราและไม่ทำให้เสร็จสิ้น กลับไปที่ภาพประกอบของฉันเกี่ยวกับโทรศัพท์มันคล้ายกับการยกโทรศัพท์ขึ้นและทันทีที่ดำเนินการพูดคุยกันโทรศัพท์ก็เริ่มดังขึ้นอีกครั้งเนื่องจากมีบุคคลอื่นต้องการพูดคุยกับคุณ

ขอแนะนำให้ดำเนินการสนทนาให้เสร็จสิ้นจากนั้นคว้าโทรศัพท์อีกครั้งเพื่อพูดคุยกับบุคคลที่ตามมา คุณสามารถพบปัญหาเล็กน้อยเกี่ยวกับแฟล็กนี้ แม้ว่า PIC จะตั้งค่าสถานะนี้เป็น 1 อย่างรวดเร็ว แต่ก็ไม่ได้ตั้งค่าเป็น 0 อีก! กิจกรรมนั้นจะต้องดำเนินการโดยโปรแกรมเมอร์นั่นคือคุณ สิ่งนี้สามารถทำได้อย่างง่ายดายเนื่องจากฉันมีความคิดบางอย่างและจำเป็นต้องทำให้สำเร็จหลังจาก PIC ดำเนินกิจวัตรการขัดจังหวะแล้ว

ตำแหน่งหน่วยความจำเมื่อใดก็ตามที่คุณเปิด PIC ในตอนแรกหรือในกรณีที่มีการรีเซ็ตตัวนับโปรแกรมจะแนะนำที่อยู่ที่ 0000h ซึ่งอาจเกิดขึ้นได้ทันทีเมื่อเริ่มต้นหน่วยความจำโปรแกรม แต่ในกรณีที่มีการขัดจังหวะตัวนับโปรแกรมจะระบุที่อยู่ 0004h

ดังนั้นในขณะที่เรากำลังเขียนโปรแกรมของเราที่จะมีการขัดจังหวะขั้นแรกเราต้องแจ้งให้ PIC กระโดดข้ามที่อยู่ 0004h และรักษาขั้นตอนการขัดจังหวะซึ่งเริ่มต้นที่ที่อยู่ 0004h โดยแยกจากส่วนที่เหลือของโปรแกรม

ซึ่งสามารถดำเนินการได้โดยไม่ยุ่งยาก เริ่มต้นโปรแกรมของเราด้วยคำสั่งที่เรียกว่า ORG คำสั่งนี้บ่งชี้ Origin หรือ start เรายึดติดกับที่อยู่ เนื่องจาก PIC เริ่มต้นที่ที่อยู่ 0000h เราจึงพิมพ์ ORG 0000h หลังจากนั้นเราต้องข้ามที่อยู่ 0004h เราทำสิ่งนี้ให้สำเร็จได้โดยใส่คำสั่ง GOTO พร้อมกับป้ายกำกับที่แนะนำโปรแกรมหลัก

หลังจากนั้นเราก็ปฏิบัติตามคำสั่ง GOTO นี้ด้วย ORG อีกหนึ่งรายการขณะนี้มีที่อยู่ 0004h หลังจากคำสั่งนี้เราจะแทรกรูทีนอินเตอร์รัปต์ ณ จุดนี้เราอาจสามารถพิมพ์รูทีนการขัดจังหวะของเราตรงตามคำสั่ง ORG ที่สองหรือเราสามารถวางตำแหน่งคำสั่ง GOTO ซึ่งชี้ไปที่รูทีนการขัดจังหวะ

มันเกี่ยวข้องกับตัวเลือกในส่วนของคุณอย่างแท้จริง ในการแจ้ง PIC ข้อเสนอนั้นมาถึงตอนจบของรูทีนการขัดจังหวะเราต้องวางตำแหน่งคำสั่ง RTFIE ไว้ที่จุดสิ้นสุดของรูทีน คำสั่งนี้หมายถึงการส่งคืนจากรูทีนการขัดจังหวะ ในขณะที่ PIC แจ้งสิ่งนี้ตัวนับโปรแกรมจะระบุตำแหน่งสุดท้ายที่ PIC อยู่ก่อนที่จะเกิดการขัดจังหวะ เราได้กำหนดส่วนย่อของโค้ดไว้ด้านล่างเพื่อแสดงด้านบน:

มีสองสิ่งที่คุณควรได้รับแจ้งเมื่อใช้อินเทอร์รัปต์ การเริ่มต้นมีแนวโน้มที่จะเป็นไปได้ว่าหากคุณอาจใช้การลงทะเบียนที่เหมือนกันในโปรแกรมหลักของคุณและขั้นตอนการขัดจังหวะโปรดทราบว่ารายละเอียดของการลงทะเบียนมักจะเปลี่ยนแปลงเมื่อเกิดการขัดจังหวะ

ตัวอย่างเช่นให้ใช้ w register เพื่อส่งต่อข้อมูลไปยังโปรแกรมหลักของ Port A ดังนั้นคุณสามารถใช้ w register เพิ่มเติมใน interrupt routine เพื่อเปลี่ยนข้อมูลจากปลายทางหนึ่งไปยังอีกปลายทางได้

ในกรณีที่คุณไม่ระมัดระวังการลงทะเบียน w จะรวมค่าสุดท้ายที่ได้รับในขณะที่อยู่ในขั้นตอนการขัดจังหวะดังนั้นเมื่อคุณกลับจากการขัดจังหวะข้อมูลนี้จะถูกส่งไปยังพอร์ต A แทนที่จะเป็นค่าที่คุณมีอยู่ก่อนหน้านี้ การขัดจังหวะเกิดขึ้น

วิธีการรอบนี้คือการบันทึกรายละเอียดของ w register ไว้สักครู่ก่อนที่คุณจะใช้มันอีกครั้งในขั้นตอนการขัดจังหวะ ประการที่สองคือความจริงที่คุณสามารถพบความล่าช้าระหว่างเวลาที่การขัดจังหวะหนึ่งเกิดขึ้นและเวลาที่เกิดขึ้นในภายหลัง ในขณะที่คุณเข้าใจ PIC มีนาฬิกาภายนอกซึ่งอาจเป็นคริสตัลหรืออาจเป็นคำสั่งผสมตัวต้านทาน - ตัวเก็บประจุ

ไม่ว่านาฬิกานี้จะมีความถี่เท่าใด PIC จะหารด้วย 4 หลังจากนั้นจะใช้ค่านี้ตามเวลาภายใน ตัวอย่างเช่นในกรณีที่คุณมีคริสตัล 4MHz ที่เชื่อมโยงกับ PIC ของคุณในกรณีนั้น PIC จะดำเนินการตามคำแนะนำที่ 1MHz เวลาภายในนี้เรียกว่าวงจรการเรียนการสอน ณ จุดนี้แผ่นข้อมูลอ้างว่าคุณต้องเปิดใช้งานคำสั่ง 3 ถึง 4 รอบระหว่างการขัดจังหวะ

ของฉันจะเปิดใช้งาน 4 รอบ สาเหตุที่อยู่เบื้องหลังความล่าช้าคือ PIC ต้องใช้เวลาในการกระโดดไปยังที่อยู่ขัดจังหวะการตั้งค่าสถานะและกลับมาจากขั้นตอนการขัดจังหวะ ดังนั้นโปรดคำนึงถึงสิ่งนี้หากคุณทำงานกับวงจรสำรองเพื่อกระตุ้นการขัดจังหวะสำหรับ PIC

ณ จุดนี้ประเด็นคือถ้าคุณใช้บิต 4 ถึง 7 ของพอร์ต B เป็นอินเทอร์รัปต์ คุณไม่สามารถเลือกพินเฉพาะบนพอร์ต B เพื่อทำหน้าที่ขัดจังหวะได้

ดังนั้นในกรณีที่คุณอนุญาตพินเหล่านี้อาจเป็นไปได้ทั้งหมด ตัวอย่างเช่นคุณไม่สามารถมีเพียงบิต 4 และ 5 บิต 6 และ 7 จะได้รับการเสริมพลังในเวลาเดียวกัน จุดประสงค์ของการรับสี่บิตเพื่อแสดงการขัดจังหวะคืออะไร? แน่นอนคุณอาจมีวงจรที่เชื่อมต่อกับ PIC ในกรณีที่ใครก็ตามในสี่บรรทัดสูงขึ้นในกรณีนี้อาจเป็นปัญหาที่คุณต้องการให้ PIC มีอิทธิพลในทันที

ภาพประกอบหนึ่งในนี้อาจเป็นสัญญาณเตือนความปลอดภัยภายในบ้านซึ่งเซ็นเซอร์สี่ตัวเชื่อมโยงกับหมุดพอร์ต B 4 ถึง 7 เซ็นเซอร์เฉพาะใด ๆ สามารถแจ้งให้ PIC กระตุ้นการเตือนและกิจวัตรการส่งสัญญาณเตือนภัยเป็นกิจวัตรการขัดจังหวะ สิ่งนี้สำรองการตรวจสอบพอร์ตอย่างต่อเนื่องและอนุญาตให้ PIC ดำเนินการต่อในเรื่องต่างๆ ในบทช่วยสอนถัดไปเราจะเขียนโปรแกรมเพื่อจัดการการขัดจังหวะ

เราจัดการกับพื้นฐานมากมายในบทช่วยสอนสุดท้ายดังนั้นฉันจึงรู้สึกว่าถึงเวลาแล้วที่เราจะแต่งโปรแกรมแรกของเรา

โปรแกรมที่เราจะเขียนจะนับจำนวนครั้งที่เราเปิดสวิตช์แล้วแสดงจำนวน

โปรแกรมจะนับตั้งแต่ 0 ถึง 9 ซึ่งสามารถดูได้บน LED 4 ดวงในรูปแบบไบนารีพร้อมกับอินพุตหรืออินเทอร์รัปต์จะอยู่ที่ RB0

สิ่งสำคัญอันดับหนึ่งที่เราต้องดำเนินการคือแจ้ง PIC เพื่อข้ามไปยังที่อยู่ที่ Program Counter ชี้ไปเมื่อใดก็ตามที่มีการขัดจังหวะ

คุณจะสังเกตได้ว่าเราใช้วิธีการแสดงเลขฐานสิบหกที่ไม่เหมือนใคร ก่อนที่ฉันจะเกิดขึ้นให้ใช้ F9h ซึ่ง h ระบุเลขฐานสิบหก เราสามารถเขียนสิ่งนี้เป็น 0xF9 ซึ่งเป็นโครงสร้างที่เราจะใช้ต่อจากนี้ไป

ตอนนี้เราต้องบอก PIC ว่าเราจะใช้อินเทอร์รัปต์และเราใช้ RB0 พิน 6 เป็นพินอินเทอร์รัปต์:

bsf INTCON, 7GIE - เปิดใช้งานการขัดจังหวะส่วนกลาง (1 = เปิดใช้งาน)
bsf INTCON, 4INTE - RB0 interrupt enable (1 = enable)
ฉันจะล้างค่าสถานะขัดจังหวะในกรณีที่ (ฉันไม่เคยไว้ใจอะไรเลย!)
bcf INTCON, 1INTF - ล้างแฟล็กบิตในกรณี

ปัจจุบันเราต้องสร้าง 2 พอร์ตของเรา โปรดทราบว่าในขณะนี้เรากำลังใช้ RB0 เป็นพินอินเทอร์รัปต์จึงจำเป็นต้องกำหนดเป็นอินพุต:

เราจะใช้ตัวแปรที่เรียกว่า COUNT เพื่อเก็บจำนวนสวิตช์นับ เราสามารถเพิ่มค่าในพอร์ต A ได้ แต่คุณจะเห็นว่าเหตุใดฉันจึงใช้ตัวแปรเมื่อเราเขียนรูทีนอินเตอร์รัปต์

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

อย่างไรก็ตามเราต้องการแสดงจำนวนครั้งที่สวิตช์ปิดจาก 0 ถึง 9 ด้านบนฉันระบุว่าเราอาจเพิ่มค่าในพอร์ต A ได้ทุกครั้งที่มีการขัดจังหวะ อย่างไรก็ตามพอร์ต A มี 5 บิตในกรณีที่เราเพิ่มพอร์ตเราจะมีจำนวนสูงสุดที่ 31 มีคำอธิบายสองสามข้อว่าทำไมฉันจึงเลือกที่จะไม่เลื่อนถึง 31

ในขั้นต้นเราจะใช้หน้าจอ 7 ส่วนซึ่งมากที่สุดสามารถไปจาก 0 ถึง 15 (0 ถึง F ในเลขฐานสิบหก) ต่อไปฉันต้องการแสดงคำสั่งทางคณิตศาสตร์บางส่วนที่คุณพบในบทเรียนที่ผ่านมา

ดังนั้นเราจะดำเนินการขัดจังหวะกิจวัตรต่อไป ตอนนี้สิ่งแรกที่เราต้องทำให้สำเร็จคือเก็บรายละเอียดของทะเบียน w ของเราไว้สั้น ๆ เนื่องจากเราได้ใช้สิ่งนี้เพื่อเปลี่ยนเนื้อหาของ COUNT เป็น PORTA ในกรณีที่เราไม่บันทึกไว้ในกรณีนี้เราอาจส่งตัวเลขที่แตกต่างกันโดยสิ้นเชิงเนื่องจากการคำนวณทางคณิตศาสตร์ของเรา ดังนั้นเรามาทำสิ่งนั้นให้สำเร็จก่อน:

ณ จุดนี้เราเข้าใจว่าค่าของ COUNT คือ 9 หรือมากกว่า สิ่งที่เราต้องทำให้สำเร็จตอนนี้คือถ้า COUNT มากกว่า 9 ให้วางกลับเป็น 0 หรือกลับไปที่โปรแกรมหลักเพื่อให้แน่ใจว่าเราสามารถส่งไปยังพอร์ต A ได้คำสั่ง BTFSS เนื่องจากคุณเข้าใจในภายหลัง
คำแนะนำในกรณีที่กำหนดค่าสถานะพกพาเช่น COUNT = 10:

สิ่งเดียวที่ต้องทำตอนนี้คือป้อนรวมและกำหนดค่าให้กับค่าคงที่ของเราซึ่งเราสามารถดำเนินการได้ทันทีเมื่อเริ่มโปรแกรมของเรา

ทุกครั้งที่คุณเปิดสวิตช์ไฟ LED จะนับเป็นไบนารีจาก 0000 ถึง 1010 จากนั้นกลับไปที่ 0000

รูปต่อไปนี้แสดงแผนภาพวงจรที่เข้ากันได้กับรหัสอธิบายข้างต้น สิ่งที่น่าสนใจคือคุณจะพบว่ามีการรวมตัวเก็บประจุเวลาไว้ในการออกแบบ นี่เป็นอุบายเล็ก ๆ น้อย ๆ ที่ดีที่คุณจะได้รับอิสระในการหลีกเลี่ยงการรวมตัวเก็บประจุในกรณีที่คุณไม่ได้อยู่กับคุณในช่วงเวลานั้น

ที่นี่ความจุเข้ามามีบทบาทผ่านความจุหลงทางผ่านพินออสซิลเลเตอร์และกราวด์
แน่นอนว่ามันอาจไม่ใช่วิธีที่ชาญฉลาดมากในการหลีกเลี่ยงตัวเก็บประจุในทางปฏิบัติเนื่องจากค่าจรจัดอาจแตกต่างกันไปตามเงื่อนไขที่กำหนด

อีกส่วนหนึ่งที่สามารถเห็นได้ในวงจรคือเครือข่ายประนามข้ามสวิตช์ วิธีนี้จะป้องกันสัญญาณรบกวนขณะเปลี่ยนกลไกและป้องกันไม่ให้ PIC สับสนหากการสลับเป็นการสลับครั้งเดียวหรือหลายครั้ง




คู่ของ: วงจรตั้งเวลามอเตอร์แบบสองทิศทางที่ตั้งโปรแกรมได้ ถัดไป: วงจร Buck-Boost ทำงานอย่างไร