Hướng dẫn PIC- Từ thanh ghi đến ngắt

Hãy Thử Công Cụ CủA Chúng Tôi Để LoạI Bỏ Các VấN Đề





Trước khi đi vào chi tiết từng phút của lập trình PIC, điều quan trọng đầu tiên là phải học một vài phương pháp lập trình tốt.

Hiểu đăng ký

Để bắt đầu, giả sử bạn nhập (dấu chấm phẩy) tại bất kỳ thời điểm nào của chương trình, tất cả những gì đứng sau dấu chấm phẩy này sẽ bị trình biên dịch bỏ qua, cho đến khi tất nhiên dòng chữ trở lại vị trí.



Tính năng trên cho phép chúng tôi thêm các nhận xét hoặc nhận xét để chúng không trở thành một phần của chương trình, tạo điều kiện cho chúng tôi xác định chương trình với sự trợ giúp của các nhận xét bên cạnh nó. Đưa nhận xét là một thực hành được khuyến khích trong khi lập trình bất kỳ vi mạch nào.

Điều quan trọng tiếp theo trong khóa học là gán tên cho các hằng số khác nhau (bạn sẽ học chúng một cách tỉ mỉ sau). Điều này làm cho việc hiểu những gì được viết tới hoặc liên quan đến các giá trị liên quan trở nên đơn giản hơn thay vì nhầm lẫn với các con số được bao gồm.



Ở trên phải được thực hiện dưới dạng tên thực tế để nhận dạng ngay lập tức, ví dụ: COUNT, điều quan trọng cần lưu ý là ở đây tất cả các chữ cái viết hoa đều được sử dụng để tạo sự khác biệt và cũng cho biết rằng đó là một giá trị không đổi.


Như chúng ta có thể thấy, ở trên được thực hiện dưới dạng một hộp làm bằng dấu chấm phẩy, điều này chỉ làm cho nó trông sạch sẽ hơn. Ngoài ra, hãy thử ghi lại chương trình trên giấy, thực hành này sẽ giúp hiểu mọi thứ một cách khôn ngoan.

2. Thanh ghi.

Thanh ghi trong PIC là một khu vực chấp nhận các chi tiết bằng văn bản cũng như cho phép đọc từ đó. Bạn có thể so sánh nó với một tờ giấy, nơi bạn có thể hình dung nội dung và thêm vào bằng cách viết lên nó.

Hình dưới đây mô tả một bản đồ tệp thanh ghi điển hình được nhúng trong PIC16F84. Định dạng không phải là thứ thực sự được đặt bên trong PIC, nó chỉ đơn giản là để chỉ ra cách các bit có thể được sắp xếp bên trong chip và để hiểu một số lệnh liên quan.

Bạn có thể thấy rằng về cơ bản nó được chia thành Ngân hàng 0 và Ngân hàng 1. Ngân hàng 1 chịu trách nhiệm kiểm soát hoạt động thực tế của PIC, ví dụ: nó thông báo cho PIC biết các bit tại Cổng A được chỉ định làm đầu vào và các bit nào là đầu ra.

Ngân hàng 2 chỉ để thao tác thông tin.

Hãy hiểu điều này qua ví dụ sau:

Giả sử chúng ta muốn gán một bit ở mức cao của PortA. Đối với điều này, trước tiên chúng ta cần phải chuyển đến Ngân hàng 1 để thiết lập bit hoặc chân được chỉ định tại Cổng A dưới dạng đầu ra. Sau đó, chúng tôi quay trở lại Ngân hàng 0 và cung cấp mức logic 1 (bit 1) đến chân cụ thể đó.

Các sổ đăng ký phổ biến nhất mà chúng tôi muốn sử dụng trong Ngân hàng 1 là STATUS, TRISA và TRISB.

STATUS giúp chúng ta quay lại Ngân hàng 0, TRISA cho phép chúng ta chọn chân nào ở Cổng A là đầu ra và có thể là đầu vào, trong khi TRISB tạo điều kiện để chọn giữa chân đầu ra và chân đầu vào tại Cổng B. Thanh ghi SELECT trong BANK 0 cho phép người dùng để chuyển sang Ngân hàng 1.

Hãy tóm tắt toàn bộ khái niệm với mô tả sau:

TRẠNG THÁI:

Để chuyển từ Ngân hàng 0 sang Ngân hàng 1, chúng ta lệnh thanh ghi TRẠNG THÁI. Điều này được thực hiện bằng cách đặt bit # 5 của thanh ghi STATUS thành 1. Để quay trở lại Ngân hàng 0, chúng tôi gán bit 5 của thanh ghi STATUS thành 0. Thanh ghi STATUS được định vị tại địa chỉ 03h, ở đây h biểu thị số có thể ở dạng Hệ thập lục phân.

TRISA và TRISB:

Chúng nằm ở địa chỉ 85h và 86h tương ứng. Để lập trình một chân như một đầu ra hoặc một đầu vào, chúng tôi chỉ cung cấp một số không hoặc một cho một bit cụ thể trong thanh ghi. Bây giờ điều này có thể được thực hiện theo hai cách, thông qua nhị phân hoặc Hex. Trong trường hợp không thể chuyển đổi tham số, họ có thể sử dụng máy tính khoa học để thực hiện các giá trị.

Bây giờ chúng ta có 5 chân tại Cổng A, tương ứng với 5 chân. Nếu chúng tôi định sửa một trong các chân làm đầu vào, chúng tôi phân phối '1' cho bit cụ thể.

Trong trường hợp chúng tôi muốn chỉ định một trong các chân làm đầu ra, chúng tôi sẽ đặt chân cụ thể thành “0”. Các bit được hỗ trợ xuống chính xác tương ứng với các bit, hoặc chính xác hơn bit 0 là RA0, bit 1 sẽ là RA1, bit 2 = RA2, v.v. Hãy hiểu nó theo cách này:

Giả sử bạn muốn sửa RA0, RA3 và RA4 dưới dạng đầu ra, trong khi RA1 / RA2 là i / ps, bạn sẽ thực hiện việc này bằng cách gửi 00110 (06h). Kiểm tra xem bit 0 có hướng về bên phải như được chỉ ra ở đây:

Cổng A Chân RA4 RA3 RA2 RA1 RA0

Số bit 4 3 2 1 0

Nhị phân 0 0 1 1 0

Tương tự đối với TRISB.

PORTA và PORTB

Để xác định mức cao của một trong các chân đầu ra, chúng tôi chỉ cung cấp bit tương ứng từ “1” đến thứ ba trong thanh ghi PORTA hoặc PORTB của chúng tôi. Đối với các thanh ghi TRISA và TRISB cũng có thể tuân theo một quy trình giống hệt nhau. Trước khi chúng ta đẩy nhanh quá trình mã hóa ví dụ đầu tiên của mình, chúng ta hãy hiểu một bản coupe gồm nhiều thanh ghi hơn, viz: w và f.

W và F

Thanh ghi W là một thanh ghi thông thường cho phép bạn gán bất kỳ giá trị nào mà bạn chọn. Ngay sau khi bạn gán cường độ cho W, bạn có thể tiếp tục bằng cách thêm giá trị này vào giá trị khác hoặc chỉ cần di chuyển nó. Với một giá trị khác được chỉ định, các chi tiết chỉ cần được ghi đè lên W.

Thanh ghi F chuyển tiếp văn bản của nó tới một thanh ghi. Chúng tôi sẽ yêu cầu thanh ghi F này chỉ định một giá trị trên một thanh ghi, có thể trên TRẠNG THÁI hoặc thanh ghi TRISA, vì những thanh ghi này sẽ không cho phép chúng tôi đặt các giá trị trực tiếp lên chúng. Một chương trình mẫu

Hãy kiểm tra đoạn mã ví dụ sau đây sẽ cho chúng ta thấy cách triển khai hướng dẫn trên và cũng sẽ chứng kiến ​​một số hướng dẫn trong khóa học.

Hãy bắt đầu bằng cách sửa cổng A như đã thảo luận ở trên.

Đối với điều này, chúng ta cần phải chuyển từ Ngân hàng 0 sang Ngân hàng1, điều này được thực hiện bằng cách thiết lập thanh ghi TRẠNG THÁI nằm tại địa chỉ 03h, bit 5 thành 1.

BSF 03h, 5

Bộ bit nghĩa là BSF F. Chúng tôi đang sử dụng hai số sau lệnh này - 03h, là địa chỉ thanh ghi TRẠNG THÁI, và số 5 tương ứng với số bit.

Vì vậy, những gì chúng tôi đang nói là 'Đặt bit 5 ở địa chỉ 03h thành 1'.

Bây giờ chúng tôi đang ở Ngân hàng 1.

MOVLW 00110b

Chúng tôi đang đặt giá trị nhị phân 00110 (chữ b có nghĩa là số ở dạng nhị phân) vào thanh ghi mục đích chung của chúng tôi W. Tất nhiên tôi có thể đã thực hiện điều này trong hex, trong trường hợp đó, hướng dẫn của chúng tôi sẽ là:

MOVLW 06 giờ

Một trong hai hoạt động. MOVLW có nghĩa là 'Move Literal Value Into W', trong tiếng Anh có nghĩa là đưa giá trị theo sau trực tiếp vào thanh ghi W.

Bây giờ chúng ta cần đưa giá trị này vào sổ đăng ký TRISA của mình để thiết lập cổng:

MOVWF 85 giờ

Hướng dẫn này cho biết “Chuyển Nội dung của W vào Địa chỉ Đăng ký Tiếp theo”, trong trường hợp này, địa chỉ đề cập đến TRISA.

Sổ đăng ký TRISA của chúng tôi tại thời điểm này mang hình 00110, hoặc được trình bày bằng đồ thị:

Cổng A Chân RA4 RA3 RA2 RA1 RA0

Nhị phân 0 0 1 1 0

Đầu vào / đầu ra O O I I O

Vì vậy, bây giờ chúng ta có các chân Cổng A của mình, chúng ta phải quay lại Ngân hàng 0 để điều chỉnh một trong các thông tin.

BCF 03 giờ, 5

Hướng dẫn này thực hiện ngược lại BSF. Nó ngụ ý 'Bit Clear F'. Một cặp số tương ứng là địa chỉ của thanh ghi, ở đây là thanh ghi TRẠNG THÁI, cũng như hình bit, trong ví dụ này là bit năm. Chính xác những gì chúng tôi đã hoàn thành hiện tại là, đã xác định bit năm trên

STATUS đăng ký thành 0

Tại thời điểm này, chúng tôi đã trả về Ngân hàng 0.
Sau đây là mã tất cả trong một khối:

BSF 03h, 5 Đến Ngân hàng 1
MOVLW 06h Đặt 00110 vào W
MOVWF 85h Di chuyển 00110 lên TRISA
BCF 03h, 5 Quay lại Ngân hàng 0

Trong phần hướng dẫn cuối cùng, chúng tôi đã xác nhận cho bạn cách thiết lập các chân cổng IO trên PIC để có thể là đầu vào hoặc đầu ra.

Thông qua khóa học này, Hãy để tôi hỗ trợ bạn gửi dữ liệu đến các cổng.

Gửi dữ liệu đến các cổng

Trong hướng dẫn tiếp theo, chúng ta sẽ hoàn thành bằng cách bật và tắt đèn LED bao gồm một chương trình chi tiết hoàn chỉnh và một sơ đồ mạch đơn giản để bạn có thể thấy PIC hoạt động chính xác những gì chúng ta dự đoán.

Đừng cố gắng kết hợp và lập trình PIC của bạn với các kết quả bên dưới, vì chúng chỉ là hình minh họa. Ban đầu, chúng tôi sẽ thiết lập Cổng A bit 2 làm đầu ra:

Điều này có thể được nhận ra từ hướng dẫn trước. Sự khác biệt duy nhất có thể là Chúng tôi đã cố định mọi bit của các chân trên A làm đầu ra, bằng cách cung cấp 0h cho thanh ghi ba trạng thái. Vì vậy, những gì bây giờ anh ta phải làm là bật đèn LED.

Chúng tôi thực hiện điều này bằng cách lên lịch cho một trong các chân (chân có đèn LED được liên kết với nó) ở mức cao. Nói cách khác, chúng tôi áp dụng dấu '1' cho chốt. Đây chính xác là cách nó được thực hiện (hãy quan sát các nhận xét để làm rõ từng dòng):

Do đó, những gì bây giờ chúng tôi đã hoàn thành là bật đèn LED rồi tắt một lần. Điều chúng tôi mong muốn là đèn LED sau đó bật liên tục.

Chúng tôi đạt được điều này bằng cách đưa chương trình trở lại ban đầu. Chúng tôi thực hiện điều này bằng cách thiết lập ban đầu một thẻ khi bắt đầu chương trình của mình, sau đó thông báo cho chương trình tiếp tục trở lại đó. Chúng tôi chỉ định một thẻ khá đơn giản.

Chúng tôi nhập một cụm từ, nói BẮT ĐẦU, nhập mã tiếp theo:

Như đã được chứng minh, ban đầu chúng tôi đã đề cập đến cụm từ ‘Bắt đầu’ ngay khi bắt đầu chương trình.

Tiếp theo, ở phần cuối của chương trình, chúng tôi đã đề cập rõ ràng 'goto Start'. Lệnh ‘goto’ chỉ thực hiện những gì nó khai báo.

Chương trình này sẽ luôn bật và tắt đèn LED bất cứ khi nào chúng ta bật nguồn mạch, có xu hướng TẮT khi chúng ta ngắt điện. Có thể chúng ta nên kiểm tra lại chương trình của mình:

Chắc chắn là chúng tôi đã bỏ qua các nhận xét, tuy nhiên chúng tôi vẫn có thể quan sát các hướng dẫn và các con số.

Điều này có thể hơi khó hiểu sau này trong trường hợp bạn thử khắc phục sự cố chương trình và trong khi viết mã, bạn đã ghi nhớ các địa chỉ.

Mặc dù các bình luận có thể được đặt nhưng nó có thể trở nên lộn xộn một chút. Điều này sẽ yêu cầu đặt tên cho các con số và có thể được thực hiện bằng một lệnh bổ sung: 'equ' Lệnh 'equ' gợi ý rằng một số thứ có thể bằng với thứ khác.

Nó có thể không phải là một chỉ dẫn cho PIC, thay vì cho trình hợp dịch. Lệnh này tạo điều kiện thuận lợi cho việc gán tên cho một vị trí địa chỉ thanh ghi hoặc một hằng số cho một thuật ngữ lập trình.

Chúng tôi sẽ thiết lập một vài hằng số cho chương trình của mình và cũng chứng kiến ​​mức độ đơn giản của nó khi đọc chương trình.

Vì bây giờ chúng tôi đã cố định các giá trị không đổi mà chúng tôi có thể tiến hành bằng cách thiết lập chúng vào chương trình của chúng tôi. Các giá trị không đổi cần được chỉ định trước khi sử dụng chúng.

do đó hãy đảm bảo luôn đặt chúng ở đầu chương trình. Chúng tôi sẽ viết lại chương trình loại trừ các nhận xét một lần nữa, để so sánh nhãn trước đó với nhãn mới nhất.

Có thể bạn có thể nhận thấy rằng các hằng số đang cho phép hiểu chương trình dễ dàng hơn một chút, tuy nhiên chúng tôi vẫn không có nhận xét, tuy nhiên, đừng lo lắng, vì chúng tôi vẫn chưa hoàn thành.

Có thể có một nhược điểm nhỏ của chương trình đèn LED nhấp nháy của chúng tôi.
Mỗi lệnh cần 1 chuỗi xung nhịp để kết thúc. Trong trường hợp chúng tôi đang sử dụng tinh thể 4MHz, thì mọi lệnh gọi 1 / 4MHz hoặc 1uS để kết thúc.

Vì chúng tôi chỉ sử dụng năm hướng dẫn, đèn LED sẽ kích hoạt sau đó tắt trong 5uS. Điều này có thể quá nhanh để mọi người nhận thấy, ngoài ra, có vẻ như đèn LED đã bật hoàn toàn.

Thay vào đó, những gì chúng ta nên thực hiện là tạo ra sự ức chế giữa việc bật đèn LED và tắt đèn LED. Lý thuyết về sự ức chế là chúng ta đếm ngược từ một đại lượng trước đó, vì vậy khi nó về 0, chúng ta bỏ đếm.

Giá trị 0 cho biết kết thúc của sự chậm trễ và chúng tôi tiếp tục thực hiện quy trình của mình trong suốt chương trình. Do đó, việc đầu tiên chúng ta phải làm là xác định một hằng số để sử dụng làm bộ đếm của mình.

Hãy để chúng tôi gọi là hằng số COUNT. Sau đó, chúng ta phải xác định một số quan trọng để bắt đầu đếm. Chắc chắn, con số lớn nhất mà chúng ta có thể bao gồm là 255, hoặc FFh trong hex., Như tôi đã nói trong hướng dẫn trước đó, lệnh equ gán một biểu thức cho một tình huống đăng ký.

Điều này ngụ ý rằng bất kể số lượng chúng tôi phân bổ COUNT của mình, nó sẽ khớp với các mục của một sổ đăng ký. Trong trường hợp chúng ta cố gắng chỉ định giá trị FFh, chúng ta sẽ gặp lỗi khi chúng ta biên dịch chương trình.

Lý do là FFh vị trí, do đó chúng tôi không thể truy cập vào nó. Do đó, chúng ta phải chỉ định một số chính chủ như thế nào? Chắc chắn, nó sẽ đòi hỏi một chút cân nhắc về mặt bên.

Ví dụ: nếu có lẽ chúng tôi chỉ định COUNT của chúng tôi cho địa chỉ 08h, điều này sẽ chỉ ra một điểm đến của thanh ghi mục tiêu cơ bản. Theo mặc định, các vùng chưa được chạm được đặt thành FFh. Do đó, nếu COUNT dẫn đến 08h, bạn sẽ gặp phải giá trị FFh trong khi chúng tôi bật nguồn lần đầu tiên. Tuy nhiên, tôi là bạn, làm cách nào chúng ta có thể sửa COUNT thành một số khác ?, tất cả những gì chúng ta áp dụng là 'di chuyển' định giá đến đích này trước.

Như một minh họa, giả sử chúng ta muốn COUNT sở hữu giá trị 85h, chúng ta không thể đề cập đến COUNT bằng 85h vì đó là vị trí của thanh ghi Tri-State cho Port A. Chính xác những gì chúng ta đạt được là như sau: movlw 85hĐặt đầu tiên giá trị 85h trong thanh ghi W movwf 08h

Bây giờ hãy chuyển nó vào sổ đăng ký 08h của chúng tôi. Sau đó, trong trường hợp chúng tôi biểu thị COUNT bằng 08h, COUNT sẽ khớp với giá trị 85h. Tinh tế phải không! Do đó, ban đầu chúng ta xác định hằng số của mình: COUNT bằng 08h Sau đó, chúng ta phải giảm COUNT này đi một cho đến khi nó trở thành 0.

Đơn giản là có một chỉ dẫn được thiết kế để thực hiện điều này cho chúng tôi, bằng cách sử dụng ‘goto’ và một thẻ.

Hướng dẫn chúng tôi sẽ áp dụng là: DECFSZ COUNT, 1 Hướng dẫn này cho biết ‘Giảm thanh ghi (ở đây là COUNT) theo số theo dõi dấu phẩy. Nếu chúng ta đạt được số 0, hãy vượt lên trước hai điểm. ”Hãy tìm nó hoạt động trước, trước khi chúng ta đặt nó vào khóa học của mình.

Những gì chúng tôi đã thực hiện ban đầu là thiết lập hằng số COUNT thành 255. Đoạn tiếp theo đặt một thẻ, được gọi là LABEL gần với lệnh decfsz của chúng tôi.

Decfsz COUNT, 1 làm giảm giá trị của COUNT đi một và giữ nguyên kết quả cuối cùng thành COUNT. Hơn nữa, nó xác minh để kiểm tra xem COUNT có sở hữu giá trị 0 hay không.

Nếu không, trong trường hợp đó, nó sẽ kích hoạt chương trình chuyển sang dòng tiếp theo. Bây giờ chúng ta có một khai báo ‘goto’ đưa chúng ta trở lại hướng dẫn decfsz của chúng ta.

Trong trường hợp giá trị của COUNT hoạt động bằng nhau, thì lệnh decfsz dẫn đến chương trình của chúng tôi tăng vọt 2 bậc trước và được gửi đến nơi Chúng tôi đã tuyên bố 'Tiếp tục ở đây'.

Do đó, vì bạn có thể quan sát được, chúng tôi đã đưa chương trình ngồi lại một chỗ để làm duyên trước khi tiến hành. Điều này có thể được đặt tên là một vòng lặp trễ.

Hiểu các vòng lặp trễ

Trong trường hợp chúng tôi yêu cầu một độ trễ đáng kể hơn, chúng tôi có thể theo đuổi một vòng lặp tiếp theo. Vòng lặp càng nhiều, độ trễ càng kéo dài. Hãy để chúng tôi ít nhất hai, giả sử chúng tôi muốn quan sát đèn flash LED .. Chúng tôi sẽ đặt các vòng lặp trễ này vào chương trình của mình và hoàn thành bằng cách hiển thị nó thành một chương trình chính hãng bằng cách giới thiệu các nhận xét:

Có thể biên dịch chương trình này sau chương trình PIC. Rõ ràng, hãy chắc chắn rằng bạn thử mạch ra ngoài để kiểm tra xem nó có thực sự hoạt động hay không. Sau đây là một sơ đồ mạch mà bạn nên xây dựng ngay sau khi bạn đã lập trình PIC.


Làm tốt lắm, bạn có thể đã thực sự soạn chương trình PIC đầu tiên của mình, cũng như xây dựng một mạch để bật và tắt đèn LED. Cho đến bây giờ, trong trường hợp bạn đã theo học các khóa học này, bạn có thể đã học được tổng thể bảy hướng dẫn trong tổng số 35 hướng dẫn, nhưng chắc chắn cho đến nay bạn có thể đang kiểm soát các cổng I / O!

Bạn có cố gắng thay đổi các vòng lặp trễ để hiển thị đèn flash LED nhanh hơn không - giá trị nhỏ nhất của COUNT xuất hiện để nhìn thấy đèn flash LED về cơ bản là bao nhiêu? Hoặc có thể, bạn sẽ muốn bao gồm vòng lặp trễ thứ 3 hoặc bổ sung sau vòng lặp đầu tiên để ổn định đèn LED. một hằng số duy nhất cho mỗi vòng lặp trễ.

Sau đó, bạn có thể thực sự điều khiển các vòng lặp trễ của mình để hiển thị đèn flash LED ở một tốc độ cụ thể, chẳng hạn như sau một giây. Trong phần hướng dẫn tiếp theo, chúng ta hãy xem cách chúng ta có thể sử dụng thứ được gọi là chương trình con để duy trì chương trình nhỏ gọn và cơ bản Một chương trình con là một phần không thể thiếu của mã hoặc chương trình, có thể được gọi là và khi bạn có thể cần đến nó. Các chương trình con được sử dụng trong trường hợp bạn thường xuyên hoàn thành chức năng giống hệt nhau.

Chương trình con là gì

Lợi ích của việc sử dụng chương trình con là việc sửa đổi giá trị một lần bên trong chương trình con sẽ đơn giản hơn thay vì, ví dụ, mười lần tất cả thông qua chương trình của bạn, cũng như nó góp phần đáng kể để giảm mức bộ nhớ mà chương trình của bạn sử dụng bên trong PIC. Chúng tôi sẽ kiểm tra một chương trình con:

Ban đầu, chúng tôi cần cung cấp chỉ định cho chương trình con của mình và trong tình huống này, chúng tôi đã chọn ROUTINE. Sau đó, chúng tôi nhập mã mà chúng tôi muốn thực hiện như bình thường. Đó là lý do tại sao, Chúng tôi đã chọn độ trễ trong chương trình đèn led nhấp nháy của chúng tôi. Cuối cùng, chúng ta kết thúc chương trình con bằng cách khóa lệnh RETURN.

Để bắt đầu chương trình con từ bất kỳ đâu trong chương trình của chúng ta, chúng ta gõ nhanh lệnh CALL và sau đó là ký hiệu chương trình con.

Chúng ta sẽ xem xét vấn đề này sâu hơn một chút. Khi chúng ta đến phần của chương trình GỌI xxx, trong đó xxx là tên của chương trình con của chúng ta, chương trình sẽ chuyển đến bất kỳ nơi nào mà chương trình con xxx được cài đặt. Các hướng dẫn bên trong chương trình con được thực hiện.

Bất cứ khi nào lệnh RETURN được hoàn thành, chương trình sẽ quay trở lại chương trình chính của chúng ta với lệnh tiếp theo lệnh CALL xxx của chúng ta.

Có thể gọi chương trình con tương tự nhiều lần nếu bạn muốn, điều này giải thích tại sao việc sử dụng chương trình con làm giảm thời lượng chung của chương trình của chúng tôi.

Tuy nhiên, có một vài yếu tố bạn nên biết. Ban đầu, như với chương trình chính của chúng tôi, bất kỳ hằng số cụ thể nào cũng cần được xác nhận trước khi bạn có thể sử dụng chúng.

Chúng có thể được thừa nhận trong chính chương trình con, hoặc trực tiếp ở phần đầu của chương trình chính. Tôi đề xuất với bạn rằng bạn thừa nhận mọi thứ khi bắt đầu chương trình chính của bạn, kể từ đó bạn nhận ra rằng mọi thứ đang ở một vị trí giống hệt nhau. Tiếp theo, người ta phải đảm bảo rằng chương trình chính bỏ qua chương trình con.

Điều tôi ngụ ý với điều này là nếu bạn đặt chương trình con trực tiếp vào cuối chương trình chính của bạn, ngoại trừ nếu bạn sử dụng khai báo 'Goto' để nhảy khỏi vị trí của chương trình con, chương trình sẽ tiếp tục và thực hiện chương trình con bất kể bạn có yêu cầu nó hoặc cách khác.

PIC sẽ không phân biệt giữa chương trình con và chương trình chính. Chúng tôi sẽ kiểm tra chương trình đèn led nhấp nháy của chúng tôi, tuy nhiên lần này chúng tôi sẽ sử dụng một chương trình con cho vòng lặp trễ. Lý tưởng nhất là bạn sẽ khám phá ra rằng chương trình xuất hiện ít phức tạp hơn bao nhiêu, cũng như bạn có thể tìm thấy cách chương trình con áp dụng trên thực tế.

Cuối cùng, bạn có thể quan sát thấy rằng bằng cách sử dụng một chương trình con cho vòng lặp trễ của chúng tôi, chúng tôi có thể đã giảm kích thước của chương trình.

Mỗi khi chúng ta muốn có độ trễ, có thể là khi đèn LED bật hoặc tắt, về cơ bản chúng ta gọi là chương trình con độ trễ. Khi kết thúc chương trình con, chương trình dẫn trở lại dòng theo lệnh ‘Gọi’ của chúng ta. Trong hình minh họa ở trên, chúng tôi bật đèn LED.

Chúng tôi sau đó liên hệ với chương trình con. Sau đó, chương trình sẽ quay trở lại để chúng ta có thể tắt đèn LED. Chúng tôi gọi chương trình con một lần nữa, đề phòng trong trường hợp chương trình con có thể đã hoàn thành, chương trình sẽ quay trở lại và lệnh tiếp theo mà nó nhận ra là ‘goto Start’. Đối với bất kỳ ai có thể bị hấp dẫn, chương trình đầu tiên của chúng tôi dài 120 byte.

Thông qua việc sử dụng chương trình con, chúng tôi có thể giảm kích thước chương trình của mình xuống 103 byte. Điều này nghe có vẻ không tuyệt vời như vậy, tuy nhiên xét trên thực tế là chúng ta chỉ có 1024 byte tổng thể bên trong PIC, mọi số tiền nhỏ đều có lợi.

Trong phần hướng dẫn tiếp theo, chúng ta hãy kiểm tra việc đọc từ các cổng.

Cho đến nay, chúng tôi đã soạn thảo cho Cổng A để chúng tôi có thể bật và tắt đèn LED. Tại thời điểm này, chúng ta sẽ thấy cách chúng ta sẽ đọc các chân I / O trên các cổng.

Đọc cổng đầu vào / đầu ra

Điều này chính xác là để đảm bảo rằng chúng ta có thể liên kết một mạch bên ngoài và ảnh hưởng đến bất kỳ đầu ra cụ thể nào mà nó cung cấp.

Nếu bạn học thuộc các khóa học trước đây của chúng tôi, nếu bạn muốn thiết lập các cổng I / O, chúng tôi cần chuyển từ Ngân hàng 0 sang Ngân hàng 1. Chúng tôi sẽ thực hiện điều đó ban đầu:

Tại thời điểm này, chúng tôi đã cố định bit 0 của Cổng A thành đầu vào. bây giờ chúng ta phải kiểm tra xem pin là cao hay thấp. Để thực hiện điều này, người ta có thể chỉ sử dụng một trong hai hướng dẫn:

BTFSC và BTFSS.

Lệnh BTFSC biểu thị ‘Thực hiện kiểm tra bit trên thanh ghi cũng như bit mà chúng tôi chỉ định.

Trong trường hợp đó là 0, trong trường hợp đó chúng tôi bỏ qua lệnh tiếp theo '. BTFSS ngụ ý ‘Thực hiện kiểm tra bit trong thanh ghi và bit mà chúng tôi thiết lập. Trong trường hợp nó được đặt thành 1, thì chúng tôi bỏ qua hướng dẫn tiếp theo.

Cái nào chúng tôi sử dụng, được xác định chính xác bởi cách chúng tôi muốn chương trình của mình phản hồi trong khi chúng tôi nghiên cứu đầu vào. Như một minh họa, trong trường hợp chúng ta chỉ đang chờ đầu vào là 1, thì chúng ta có thể sử dụng lệnh BTFSS theo cách sau:

Mã ở đây:

BTFSS PortA, 0Goto start Tiếp tục ở đây:
:

Chương trình sẽ chỉ chuyển sang 'Tiếp tục ở đây' với điều kiện là bit 0 trên PortA được lên lịch là 1.

Chúng tôi hiện sẽ viết một chương trình có thể nhắc một đèn LED ở một tốc độ, tuy nhiên nếu một công tắc bị hạn chế, nó sẽ nhấp nháy đèn LED chậm hơn hai lần.

Có lẽ bạn có thể tự mình thực hiện chương trình này, vẫn là Chúng tôi đã kết hợp danh sách bằng cách nào đó.

Bạn có thể thử và tác giả toàn bộ chương trình, để kiểm tra xem trong trường hợp bạn đã hiểu các nguyên tắc chưa. Chúng tôi sẽ sử dụng mạch tương đương như trước đây, với việc bao gồm một công tắc RA0 gắn liền của PIC và đường ray dương của nguồn cung cấp của chúng tôi.

Những gì chúng tôi đã hoàn thành ở đây là bật đèn LED. Sau đó, tôi xác định xem công tắc có đóng không.

Trong trường hợp nó bị hạn chế, tiếp theo tôi kết nối với chương trình con trì hoãn của chúng tôi. Điều này cung cấp cho chúng tôi độ trễ tương đương như trước đây, tuy nhiên tại thời điểm này chúng tôi liên hệ với nó hai lần.

Điều tương tự cũng áp dụng cho bất cứ khi nào đèn LED tắt. Trong trường hợp công tắc không đóng, thì chúng tôi đã ghi lại khoảng thời gian bật và tắt trước đó của chúng tôi.

Bạn đã theo dõi những bài học này ngay từ đầu chưa, bạn có thể muốn hiểu rằng hiện tại bạn đã khám phá ra mười trong số 35 hướng dẫn cho PIC 16F84! Và mọi thứ trong số này xảy ra chỉ được học bằng cách bật và tắt đèn LED.

Cho đến nay, chúng tôi đã soạn thảo PIC nhấp nháy đèn LED bật và tắt.

Sau đó, chúng tôi có khả năng với PIC của mình bằng cách bao gồm một công tắc, do đó thay đổi tốc độ flash.

Sử dụng không gian bộ nhớ một cách hiệu quả

Vấn đề duy nhất là, chương trình khá dài và không hiệu quả về dung lượng bộ nhớ. Nó có vẻ ổn khi tôi đưa các lệnh vào lần đầu tiên, tuy nhiên phải có một cách dễ dàng hơn để thực hiện nó. Tích cực là có, chúng tôi sẽ phân tích cách chúng tôi thực sự bật và tắt đèn LED.

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

Lúc đầu, chúng tôi nhồi thanh ghi w của mình với 02h, sau đó chuyển nó sang thanh ghi PortA của chúng tôi để bật đèn LED. Để tắt nó, chúng tôi đóng gói w với 00h sau đó chuyển nó vào thanh ghi PortA của chúng tôi.

Giữa tất cả các quy trình này, chúng tôi buộc phải liên hệ với một quy trình con để đảm bảo rằng chúng tôi có thể quan sát đèn LED nhấp nháy.

Do đó, chúng tôi cần phải chuyển hai tập hợp thông tin một vài lần (một lần vào thanh ghi w sau đó đến PORTA) cũng như gọi một chương trình con hai lần (một lần để bật rồi một lần tắt). Vì vậy, làm thế nào chúng ta có thể đạt được điều này với hiệu quả cao hơn? Rất đơn giản.

Chúng tôi sử dụng một hướng dẫn khác được gọi là XORF. Hướng dẫn XORF hoạt động một chức năng HOẶC Độc quyền trên sổ đăng ký mà chúng tôi quy định với thông tin chúng tôi cung cấp. Tôi tin rằng tôi phải làm rõ điều gì trên thế giới OR Exclusive OR là gì trước khi chúng ta tiếp tục. Trong trường hợp chúng ta có hai đầu vào và một đầu ra, đầu vào chỉ có thể là 1 nếu và miễn là hai đầu vào khác nhau. Trong khi chúng giống nhau, thì kết quả đầu ra có thể sẽ là 0. Sau đây là bảng sự thật, dành cho những cá nhân chọn kiểm tra những điều này:

A B F0 0 00 1 11 0 11 1 0

Tại thời điểm này, chúng tôi sẽ kiểm tra điều gì xảy ra nếu chúng tôi hiển thị B giống như kết quả trước đó của chúng tôi và chỉ cần thay đổi giá trị của A:

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

Nếu chúng ta duy trì giá trị của A bằng 1 và chúng ta Độc quyền HOẶC nó với đầu ra, thì đầu ra sẽ chuyển đổi. Trong trường hợp bạn không thể nhận thấy điều này từ bảng sự thật, bên dưới có thể chứng kiến ​​nó bằng cách sử dụng nhị phân:

0 Đầu ra hiện tại
EX-HOẶC với 1 1 đầu ra mới
EX-HOẶC với 1 0 đầu ra mới

Có thể bạn có thể thấy rằng bằng cách HOẶC độc quyền đầu ra bằng 1, bây giờ chúng ta sẽ chuyển đầu ra từ 0 thành 1 thành 0.
Do đó, để bật và tắt đèn LED của chúng tôi, chúng tôi chỉ yêu cầu một vài câu:

MOVLW 02 giờ
CỬA XORWF, 1

Chính xác những gì chúng tôi sẽ hoàn thành là thêm đăng ký w của chúng tôi với 02h. Chúng tôi đang ở trong trường hợp đó là Độc quyền HOẶC số này không có vấn đề gì trên PortA của chúng tôi. Trong trường hợp bit 1 là 1, nó sẽ thay đổi thành 0. Trong trường hợp bit 1 là 0, nó sẽ thay đổi thành 1. Hãy cùng kiểm tra mã này một hoặc hai lần, để hiển thị cách nó chạy nhị phân:

CỬA
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

Chúng tôi thực sự không phải tải giá trị giống hệt nhau vào thanh ghi w của mình mọi lúc, do đó, có thể thực hiện điều này một lần ngay từ đầu và chỉ cần quay lại lệnh chuyển đổi của chúng tôi. Ngoài ra, chúng tôi không nên sửa một giá trị trên thanh ghi PortA của mình. Nguyên nhân? Chắc chắn, vì trong trường hợp bật nguồn, nó là 1 nên chúng ta có thể dễ dàng chuyển đổi nó. Tôi, cách khác là số 0 khi bật nguồn, thậm chí bây giờ chúng tôi sẽ bật tắt nó.

Do đó, bạn sẽ muốn xem mã mới được hình thành của chúng tôi. Cái đầu tiên đại diện cho mã LED nhấp nháy của chúng tôi, trong khi cái thứ hai hiển thị mã có bổ sung công tắc:

Ước gì bạn có thể thấy rằng chỉ đơn giản bằng cách sử dụng một hướng dẫn đơn giản, chúng tôi đã cắt giảm quy mô chương trình của mình. Sự thật là, để hiển thị mức độ chúng tôi có thể giảm bớt các chương trình của mình, Chúng tôi đã chứng minh hai chương trình, chỉ những gì được cấu thành và kích thước của chúng trong bảng dưới đây:

Kích thước thay đổi chương trình (Byte)
Đèn LED nhấp nháy Original 120
Đã thêm chương trình con LED nhấp nháy 103
Chức năng XOR LED nhấp nháy được sử dụng 91
LED có công tắc ban đầu 132
Sử dụng đèn LED có chức năng XOR của công tắc 124.

Do đó, chúng tôi không chỉ khám phá ra một vài hướng dẫn mới lạ, mà còn chắc chắn chúng tôi đã giảm kích thước tập lệnh của mình!

Dưới đây, chúng tôi sẽ phân tích cách bạn có thể sử dụng các bit riêng lẻ, thực hiện một số phép tính đơn giản nhất định, cũng như các bảng dữ liệu.

Người quản lý lôgic

Trong hướng dẫn cuối cùng, tôi đã trình bày hoạt động HOẶC độc quyền. Hàm ExOR được hiểu là một toán tử logic.

Trong phần hướng dẫn này, tôi sẽ làm sáng tỏ các toán tử logic bổ sung mà PIC quảng bá. Sẽ không có bất kỳ loại trường hợp nào trong các chương trình điểm, tuy nhiên, Chúng ta sẽ tìm hiểu các phương pháp dễ dàng để sử dụng các toán tử bằng cách áp dụng các vùng mã nhỏ.

Hàm AND về cơ bản phân tích hai bit và cung cấp giá trị 1 cho dù chúng giống nhau và giá trị 0 trong trường hợp chúng khác biệt. Ví dụ: nếu chúng ta đề cập 1 VÀ 1, kết quả là 1, trong khi trong trường hợp chúng ta tuyên bố 1 VÀ 0, kết quả sẽ là 0.

Không cần phải nói, chúng tôi cũng có thể đánh giá các từ, cũng như tất cả các thành quả của hàm AND là xem xét từng thuật ngữ từng chút một. Ví dụ dưới đây minh họa hai từ 8 bit trở thành ANDed cùng với sản phẩm:

11001011
VÀ 10110011
Bằng 10000011

Tôi hy vọng bạn đồng ý, kết quả sẽ chỉ đơn giản là có 1 bất cứ khi nào 2 1 trong tay với nhau trong một cặp từ. Ví dụ, chúng tôi có thể sử dụng hàm AND để xác minh các cổng.

Trong trường hợp chúng tôi đang kiểm tra một vài chân I / O được liên kết với một mạch và chúng tôi nên theo dõi một tình huống cụ thể trong đó chỉ một số chân cao, trong trường hợp đó chúng tôi có thể đọc được khá nhiều cổng, sau đó VÀ kết quả với điều kiện mà chúng tôi đã kiểm tra, giống với ví dụ ở trên.

PIC cung cấp cho chúng tôi hai thành phần cho AND.
Chúng là ANDLW và ANDWF. ANDLW cho phép chúng tôi thực hiện chức năng AND với các chi tiết của sổ đăng ký W và số tiền mà chúng tôi quy định.

Cú pháp là: ANDLW trong đó chính xác là những gì chúng ta sẽ đến VÀ nội dung của W với.

Hệ quả của hàm AND sẽ được lưu trữ trực tiếp vào thanh ghi W.
ANDWF cho phép chúng tôi thực hiện chức năng AND trên thanh ghi W và một thanh ghi khác, ví dụ như PORT. Cú pháp là: ANDWF, d là sổ đăng ký mà chúng tôi rất quan tâm, ví dụ: PORTA và d hiển thị PIC nơi bạn định vị kết quả. Nếu d = 0, kết quả được đưa vào thanh ghi W, và của d = 1, kết quả cuối cùng được lưu trong thanh ghi mà chúng tôi đã quy định. Hai phần mã bên dưới hiển thị một ví dụ điển hình về mỗi hàm AND.

Đầu tiên là kiểm tra trạng thái của PORTA, trong đó chúng ta cần kiểm tra xem các đầu vào có phải là 1100 hay không. Chúng ta có thể đặt lại kết quả vào thanh ghi W

movlw 1100
ANDWF 05h, 0 Hình minh họa thứ hai bây giờ có thể xác minh nội dung của thanh ghi W:
ANDLW 1100

HOẶC LÀ

Hiện tại chúng tôi đã phát hiện ra một hàm OR, chính xác là XOR. Điều này phát triển thành 1 nếu hai bit không giống nhau, nhưng khác nhau. Bạn có thể tìm thấy một hàm OR khác được gọi là IOR, hàm OR bao gồm. Hàm này sẽ tạo ra 1 trong trường hợp một trong hai bit là 1, nhưng bổ sung nếu mỗi bit là 1. Dưới đây là bảng chân lý rõ ràng để minh họa điều này:

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

Toán tử số học là gì

THÊM VÀO

Chức năng này hoàn thành những gì nó thường yêu cầu. Nó đóng góp hai con số! Trong trường hợp kết quả của việc thêm hai số liệu vượt quá 8 bit, trong trường hợp đó, cờ CARRY có thể sẽ được thiết lập. Cờ CARRY nằm ở địa chỉ 03h bit 0.

Khi bit này được lên lịch, thì hai số liệu đã vượt qua 8 bit. Khi nó là 0, trong trường hợp đó, hệ quả nằm trong 8 bit. Như trước đây, PIC cung cấp cho chúng ta hai kiểu ADD, cụ thể là ADDLW và ADDWF. Như bạn có thể đã giả định, điều này khá giống với hàm trên. ADDLW cung cấp nội dung của sổ đăng ký W mà chúng tôi quy định. Cú pháp là: ADDLW ADDWF thêm nội dung của thanh ghi W và một số thanh ghi khác mà chúng tôi chỉ định.

Cú pháp là: ADDWF, d là nơi

SUB

Tại thời điểm này, tôi đoán bạn không thể đoán được chức năng này hoạt động như thế nào! Thật vậy, bạn đã nghi ngờ điều đó, chức năng này
trừ bit này với bit khác. Một lần nữa PIC cung cấp cho chúng ta 2 vị: SUBLW và SUBWF. Cú pháp chính xác tương tự như đối với hàm ADD, ngoại trừ việc bạn gõ SUB thay cho ADD!

Tăng dần Trong trường hợp chúng ta muốn bao gồm từ 1 đến một số trong PIC, chúng ta hoàn toàn có thể sử dụng hàm ADD và sử dụng số một. ~ Khó khăn với việc này là trước tiên chúng ta phải đặt hình vào thanh ghi W, sau đó sử dụng điều khiển ADDLW 1 để tăng nó lên. Trong trường hợp chúng tôi muốn bao gồm 1 vào một sổ đăng ký, nó vẫn có thể tồi tệ hơn. Đầu tiên chúng ta phải đặt số 1 vào thanh ghi W, sau đó sử dụng ADDWF, 1. Vì vậy, ví dụ, để bao gồm 1 vào vị trí 0C, giả sử, chúng ta sẽ cần có phần sau của tập lệnh:

movlw 01
addwf 0c, 1

Có một phương pháp dễ dàng hơn để tiến hành điều này. Chúng ta có thể thực hiện lệnh INCF. Cú pháp là: INCF, d nơi, là sổ đăng ký, hoặc địa điểm, mà chúng tôi quan tâm, và d hiển thị PIC nơi bạn nên định vị kết quả. Trong trường hợp d = 0, kết quả nằm trong thanh ghi W, và trong trường hợp d = 1, hệ quả được đặt trong thanh ghi mà chúng tôi đã quy định.

Bằng cách sử dụng hướng dẫn riêng lẻ này, chúng tôi có thể thực sự có 50 phần trăm mã hóa. Trong trường hợp chúng tôi muốn kết quả được khôi phục vào thanh ghi W, trong trường hợp đó sử dụng ví dụ trên, chúng tôi có thể phải bao gồm một lệnh bổ sung để chuyển các mục của 0C trở lại thanh ghi W, sau đó đặt thanh ghi 0C trở lại không vấn đề đó là gì.

Có tồn tại lệnh tăng. Đó là INCFSZ. Lệnh này có thể tăng thanh ghi mà chúng ta quy định, tuy nhiên nếu chúng ta đăng ký bằng 0 sau khi tăng (điều đó sẽ xảy ra khi chúng ta bao gồm 1 đến 127) thì PIC có thể sẽ chuyển lệnh tiếp theo. Phần mã bên dưới phản ánh điều này:

Vòng lặp incfsz 0C
Goto Loop
:
:
Phần còn lại của chương trình.

Trong phần mã trên, 0C sẽ được tăng thêm 1. Tiếp theo, chúng tôi sở hữu một lệnh thông báo cho PIC quay lại thẻ của chúng tôi có tên Vòng lặp và tăng 0C một lần nữa. Điều này tiếp tục cho đến khi 0C bằng 127. Trong trường hợp này, khi chúng ta tăng 0C lên 1, 0C bây giờ sẽ khớp với 0. Lệnh INCFSZ của chúng ta rất có thể thông báo cho PIC để bỏ qua lệnh tiếp theo, trong trường hợp này là khai báo goto, do đó PIC sẽ tiếp tục với phần còn lại của chương trình.

Giảm dần

Bây giờ chúng ta đã thảo luận về chức năng giảm dần trong khóa đào tạo trước đó, vì vậy tôi sẽ không sửa đổi nó nữa.

Bổ sung

Hướng dẫn cuối cùng trong cuộc thảo luận này sẽ đảo ngược từng bit trong thanh ghi mà chúng tôi quy định. Cú pháp là: COMF, d trong đó

Hiểu hoạt động của bit

Điều này có thể được sử dụng, chẳng hạn, để nhanh chóng hoán đổi các chân của một cổng từ đầu ra sang đầu vào, v.v. Các hàm bit cho phép chúng ta định hình một bit duy nhất trong một biểu thức. Chúng cho phép chúng tôi tiếp tục, thiết lập và loại bỏ các bit đơn lẻ trong sổ đăng ký hoặc số mà chúng tôi quy định.

Vào cuối khóa học này, chúng tôi sẽ tiết lộ một chương trình được thiết kế để tạo ra một tập hợp các đèn chiếu sáng theo trình tự tiến về phía trước, sau đó là chiều ngược lại. Chúng tôi đã quan sát thấy điều này đã hoàn thành trước đó khi chúng tôi kiểm tra hàm OR độc quyền, trong đó chúng tôi đã OR riêng các cổng với một biểu thức. Bây giờ chúng tôi đã nhận thấy một vài hàm bit khi chúng tôi thiết lập các cổng trên PIC, và

Hãy để tôi nhắc lại việc sử dụng chúng ở đây.

BCF

Hướng dẫn này sẽ xóa một chút mà chúng tôi quy định trong sổ đăng ký mà chúng tôi chỉ định. Cú pháp
Là:
BCF,

Chúng tôi đã sử dụng điều này trước đó để thay đổi từ trang 1 sang trang 0 bằng cách loại bỏ một chút trong thanh ghi STATUS. Chúng tôi cũng có thể sử dụng nó để sửa một chút thành 0 trong bất kỳ vị trí / đăng ký nào khác nhau. Ví dụ: trong trường hợp chúng tôi muốn đặt bit thứ 3 trong 11001101 được lưu trong phần 0C thành 0, chúng tôi có thể
chèn:

BCF 0C, 03

BSF

Hướng dẫn này sẽ sửa chữa bất kỳ bit nào chúng tôi quy định cho 1 trong bất kỳ thanh ghi nào mà chúng tôi chỉ ra. Chúng tôi đã sử dụng điều này trước đó để tiếp tục từ Trang 0 đến Trang 1. Cú pháp là: BSF ,, và được sử dụng theo cùng một phương pháp như BCF ở trên.

BTFSCUp đến bây giờ chúng tôi có thể thiết lập hoặc xóa một chút trong một thanh ghi. Tuy nhiên hãy tưởng tượng nếu chúng ta cần kiểm tra cơ bản xem một bit là 1 hay 0 trong thanh ghi?

Chắc chắn, có thể sử dụng BTFSC. Nó cho biết Đăng ký kiểm tra bit F và Bỏ qua nếu nó rõ ràng. Hướng dẫn này sẽ phân tích bit mà chúng tôi chỉ định trong thanh ghi. Trong trường hợp bit là 0, lệnh sẽ thông báo cho PIC bằng cách chuyển lệnh tiếp theo.

Chúng tôi có thể sử dụng hướng dẫn này trong trường hợp chúng tôi muốn kiểm tra một cờ, ví dụ như cờ mang. Điều này giúp chúng ta không cần phải đọc thanh ghi TRẠNG THÁI và tìm kiếm các bit riêng lẻ để biết cờ nào được sửa. 29 Ví dụ, trong trường hợp chúng tôi muốn kiểm tra xem cờ Carry có được đặt thành 1 hay không sau khi chúng tôi đã thêm 2 số liệu, thì chúng tôi có thể nhập như sau:

BTFSC 03 giờ, 0
tiếp tục ở đây nếu được đặt thành 1
hoặc ở đây nếu được đặt thành 0

Trong trường hợp trạng thái của bit là 1, trong trường hợp đó, lệnh tiếp theo BTFSC sẽ được hoàn thành. Trong trường hợp nó được đặt thành 0, trong trường hợp đó, lệnh tiếp theo sẽ bị bỏ qua. Phần sau của mã trưng bày trong đó nó có thể được sử dụng:

Vòng :
:
:
BTFSC 03,0
Goto Loop

Trong đoạn mã trên, PIC sẽ đơn giản thoát ra khỏi vòng lặp trong trường hợp bit 0 của thanh ghi STATUS (hoặc cờ Carry) được xác định bằng 0. Hoặc nếu không, lệnh goto sẽ được thực hiện.

BTFSS

Hướng dẫn này nêu rõ Đăng ký Kiểm tra Bit F, Và Bỏ qua Nếu Đặt. Điều này có thể được so sánh với lệnh BTFSC, ngoài việc PIC sẽ bỏ qua lệnh tiếp theo nếu bit chúng ta đang đánh giá được đặt thành 1, thay vì 0.

CLRF

Hướng dẫn này sẽ sửa toàn bộ chi tiết của một thanh ghi thành 0. Cú pháp là:

CLRF
Chúng tôi đã sử dụng điều này trước đó để đặt đầu ra của Cổng thành 0, bằng cách áp dụng CLRF 85h. Hơn nữa, chúng tôi đã sử dụng nó để sửa các Cổng để bao gồm tất cả các chân để xuất bằng cách sử dụng CLRF
05 giờ.

CLRW

Điều này có thể giống với lệnh CLRF, ngoại trừ việc xóa thanh ghi W. Cú pháp khá đơn giản:

CLRW

RLF và RRF

Các hướng này sẽ vận chuyển một bit trong thanh ghi một rãnh sang trái (RLF) hoặc phải (RRF) trong thanh ghi. Ví dụ, nếu chúng ta cần 00000001 và chúng ta sử dụng RLF, trong trường hợp đó, chúng ta có thể sở hữu 00000010. Tại thời điểm này, điều gì xảy ra trong trường hợp có 10000000 và áp dụng lệnh RLF? Chắc chắn, số 1 sẽ được định vị trong cờ mang. Trong trường hợp chúng tôi áp dụng lệnh RLF một lần nữa, lệnh 1 sẽ xuất hiện trở lại khi bắt đầu. Tuy nhiên, điều tương tự xảy ra đối với lệnh RRF. Trường hợp ở điểm dưới đây cho thấy điều này đối với lệnh RLF, trong đó Chúng ta có thể thấy 8 bit của một thanh ghi, cũng như cờ mang:

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

Chương trình mẫu

Bây giờ chúng ta sẽ thấy một mã ví dụ mà người ta có thể biên dịch và lái xe. Nó sẽ tạo ra một ánh sáng trình tự bắt đầu tại PortA bit 0, đi tới PortB bit 8 và
sau đó quay trở lại.
Mắc các đèn LED vào từng chân của Cổng. Chúng tôi sẽ có một số bit
các thủ tục được chỉ ra trong hướng dẫn này.

Biến TIME EQU 9FH cho vòng lặp trễ.
PORTB EQU 06H Địa chỉ cổng B.
TRISB EQU 86H Địa chỉ cổng B Tristate.
Địa chỉ cổng A của PORTA EQU 05H.
TRISA EQU 85H Cổng A Địa chỉ Tristate.
STATUS EQU 03H Trang chọn đăng ký.
COUNT1 EQU 0CH Thanh ghi vòng lặp.
COUNT2 EQU 0DH Thanh ghi vòng lặp.

BSF STATUS, 5 Chuyển đến trang 1
MOVLW 00H và thiết lập
MOVWF TRISB cả Cổng A và B
MOVLW 00H để xuất,
MOVWF TRISA sau đó quay lại
TRẠNG THÁI BCF, 5 trang 0.
MOVLW 00H Xóa cổng A.
CỬA MOVWF

Bắt đầu chương trình chính

RUNMOVLW
01H Đặt bitMOVWF đầu tiên
PORTB trên Cổng B.CALL
TRÌ HOÃN Chờ một lúc GỌI
SỰ CHẬM TRỄ
Di chuyển bit trên Cổng B sang trái, sau đó tạm dừng.RLF
PORTB, 1CALL
TRÌ HOÃN
DELAYRLF
PORTB, 1CALL
TRÌ HOÃN
DELAYRLF
PORTB, 1CALL
TRÌ HOÃN
DELAYRLF
PORTB, 1CALL
TRÌ HOÃN
DELAYRLF
PORTB, 1CALL
TRÌ HOÃN
DELAYRLF
PORTB, 1CALL
TRÌ HOÃN
DELAYRLF
PORTB, 1CALL
TRÌ HOÃN
DELAYRLF
PORTB, 1 Điều này di chuyển bit vào cờ mang
Bây giờ chuyển sang Cổng A và di chuyển bit sang trái.RLF
PORTA, 1 Điều này sẽ di chuyển bit từ cờ 0 vào PortACALL
DELAYCALL DELAYRLF
DOOR, 1CALL
TRÌ HOÃN
DELAYRLF
DOOR, 1CALL
TRÌ HOÃN
DELAYRLF
DOOR, 1CALL
TRÌ HOÃN
SỰ CHẬM TRỄ
Di chuyển bit trở lại trên Cổng ARRF
DOOR, 1CALL
TRÌ HOÃN
DELAYRRF
DOOR, 1CALL
TRÌ HOÃN
DELAYRRF
DOOR, 1CALL
TRÌ HOÃN
DELAYRRF
PORTA, 1 Điều này sẽ di chuyển bit vào cờ số 0 Bây giờ hãy di chuyển bit
quay lại cổng BRRF
PORTB, 1CALL
TRÌ HOÃN
DELAYRRF
PORTB, 1CALL
TRÌ HOÃN
DELAYRRF
PORTB, 1CALL
TRÌ HOÃN
DELAYRRF
PORTB, 1CALL
DELAYCALL DELAYRRF
PORTB, 1CALL
TRÌ HOÃN
DELAYRRF
PORTB, 1CALL
TRÌ HOÃN
DELAYRRF
PORTB, 1CALL
TRÌ HOÃN
TRÌ HOÃN Bây giờ chúng ta đã trở lại nơi chúng ta bắt đầu, GOTO
RUN hãy bắt đầu lại.

Có một tùy chọn tuyệt vời trong tập huấn luyện cho phép bạn sử dụng bảng dữ liệu.

Bảng dữ liệu chỉ là một danh sách các trích dẫn dữ liệu, trong đó tất cả được xem xét dựa trên một vài cân nhắc.
Ví dụ, bạn có thể có một mạch sử dụng PIC để đếm số lượng trường hợp một chân đầu vào trở nên cao trong 1 giây. Sau đó, bạn có thể hiển thị số trên màn hình 7 đoạn.

Ngay sau khi thời gian được đưa ra, PIC bắt đầu đếm số lần pin tăng cao. Sau 1 giây, nó truy cập bảng và nhìn lên dữ liệu, nó phải hiển thị số trên màn hình tượng trưng cho lượng tình huống mà pin đạt được cao. Điều này có thể có lợi, vì chúng tôi không xác định con số này có thể là bao nhiêu cho đến khi PIC hoàn thành ước tính của mình.

Bằng cách sử dụng một bảng, chúng tôi có thể cho phép PIC xác định hình vẽ nào. Tại thời điểm này, trước khi tôi tiếp tục cho bạn thấy bảng dữ liệu hoạt động như thế nào, tôi có thể phải cho bạn biết rằng PIC duy trì đường dẫn của vị trí trong chương trình khi chương trình đang hoạt động.

Nó tạo điều kiện cho những người đã thực hiện một số lập trình trong BASIC. Nếu không, đừng lo lắng, bạn có thể muốn tiếp tục tìm hiểu về lý thuyết. Hình dung có một chương trình CƠ BẢN tương tự như chương trình được trình bày bên dưới:

10 NĂM K = 0
11 K = K + 1
12 NẾU K> 10 THÌ GOTO 20 ELSE GOTO 11
20 IN K
21 HẾT

Chương trình bắt đầu ở dòng 10. Ngay sau khi K được lên lịch là 0, nó tiếp theo chuyển sang dòng 11. Sau khi chúng ta đã gộp 1 vào K, chúng ta sau đó tiếp tục đến dòng 12.

Tại thời điểm này, chúng ta có thể tò mò liệu K có cao hơn 10. Trong trường hợp đó, tiếp theo chúng ta chuyển đến dòng 20, hoặc nếu không chúng ta quay trở lại dòng 11.

Dòng 20 ghi lại K và dòng 21 kết thúc chương trình. BASIC sử dụng thống kê dòng để hỗ trợ lập trình viên lưu giữ hồ sơ về vị trí các vấn đề xảy ra, vì các nhãn không được phép. PIC sử dụng các nhãn để thoát giữa các điểm đến - hay nó thực sự có thể?

Chúng tôi sử dụng các nhãn để đảm bảo rằng chúng tôi biết các vấn đề đang ở đâu, cũng như để đảm bảo rằng chúng tôi có thể thông báo cho PIC một cách đơn giản về nơi cần tìm kiếm.

Chính xác những gì xảy ra là PIC tận dụng một bộ đếm dòng bên trong được gọi là Bộ đếm Chương trình. Bộ đếm chương trình (viết tắt là PC) theo dõi đích bộ nhớ của lệnh hiện tại.

Bất cứ khi nào chúng ta thông báo cho PIC truy cập một nhãn đã chọn, nó sẽ hiểu vị trí bộ nhớ và do đó tăng cường PC cho đến khi nó nhìn thấy đích bộ nhớ đó. Đây chính xác là phương pháp giống như chúng ta kiểm tra chương trình CƠ BẢN ở trên. Dưới đây là một đoạn mã, với các không gian bộ nhớ hoặc các mục của PC, bên cạnh mỗi lệnh:

Hướng dẫn PC0000 movlw 03
0001 movwf 0C
0002 Loop decfsc 0C
0003 goto Loop
0004 kết thúc

Trong phần minh họa ở trên, Chúng tôi đã sửa PC thành 0000. Trên đó, chúng tôi có lệnh movlw 03. Khi PIC đã triển khai dữ liệu này, nó sẽ tăng PC để lệnh tiếp theo được quét. Tại thời điểm này, PIC xem movwf 0C. PC được tăng lên một lần nữa.

Bây giờ PIC nghiên cứu decfsc 0C. Trong trường hợp các chi tiết của 0C không phải là 0, trong trường hợp đó PC được tăng thêm 1, cũng như lệnh sau, goto Loop, thông báo cho PC quay lại vị trí 0003, có Vòng lặp đã nói. Trong trường hợp chi tiết của 0C là 0, thì PC nên tăng lên 2, chỉ cần bỏ qua lệnh tiếp theo.

Hiểu bảng dữ liệu

Thao tác này sẽ đặt PC ở vị trí 0004, trong đó chương trình kết thúc. Các điểm đến được cố định bởi trình lắp ráp và chúng tôi thường không nên quan tâm đến những gì PC đang đạt được. Cho đến khi, chúng tôi thấy cần phải kiểm soát nó giống như khi chúng tôi sử dụng các bảng dữ liệu. Cách thuận tiện nhất để mô tả cách hoạt động của bảng dữ liệu là bắt đầu bằng một hình minh họa.

PC bằng 02
movlw 03
bàn gọi
:
bảng addwf PC
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
trở về

Hướng dẫn ban đầu là cấp phát PC nhãn với địa chỉ của Bộ đếm chương trình (02h). Chúng tôi sẽ sớm đưa giá trị của 03h vào sổ đăng ký w. Chúng tôi sau đó giao tiếp với bàn. Dòng đầu tiên trong bảng chương trình con bổ sung chi tiết của thanh ghi W (03h) cho bộ đếm chương trình.

Điều này kích hoạt bộ đếm chương trình tăng lên 3, hoặc nói một cách khác, kích thích bộ đếm chương trình tiếp tục xuống 3 dòng. Trong khi bộ đếm đến 3 dòng, PIC nhận ra lệnh retlw. Lệnh này sẽ gửi giá trị theo sau nó vào thanh ghi W, sau đó sẽ quay trở lại từ chương trình con. RETLW về cơ bản có nghĩa là Return, Literal thành W.

Xem Tôi đã đặt dấu phẩy sau từ Return. Vì chúng ta đang ở trong một chương trình con, chúng ta yêu cầu một lệnh Return trên bề mặt của nó. Do đó RET trong lệnh. Sau lệnh RETLW là một số, và đây chính xác là những gì được đưa vào thanh ghi W.

Trong trường hợp này, đó là hình 3. Chúng ta có thể chỉ định bất kỳ số lượng nào cho thanh ghi W, miễn là hình này được kết hợp với Bộ đếm chương trình trong chương trình con của bảng, chúng ta sẽ khám phá ra một lệnh retlw. Trong hình minh họa trên, điều này ngụ ý rằng chúng ta có thể sở hữu bất kỳ số nào từ 1 đến 7. Trong trường hợp chúng ta tiếp tục chương trình con, chúng ta có thể hoàn thành việc thực hiện một phần bổ sung của chương trình. Vì lý do này, việc đặt bảng dữ liệu chính xác vào cuối chương trình PIC là một động thái thông minh, do đó, nếu chúng ta chạy quá tốc độ trong trường hợp đó, chúng ta sẽ đi đến phần kết của chương trình.

Chủ đề về sự gián đoạn có thể sẽ là chủ đề dài nhất và khó khăn nhất cho đến nay.

Bạn không thể tìm thấy bất kỳ phương pháp phức tạp nào để trình bày chi tiết các ngắt, tuy nhiên, với một chút may mắn ở cuối phần này, bạn có thể áp dụng ngắt vào chương trình của riêng mình.
Chúng tôi đã tách phần này thành 2 giai đoạn. Điều đó có nghĩa là cho phép tách chủ đề thành các phần, cũng để cung cấp cho bạn một sơ đồ hữu ích để dễ hiểu.

Chính xác thì ngắt là gì? Chắc chắn, như thuật ngữ chỉ ra, ngắt là một kỹ thuật hoặc một tín hiệu ngăn bộ vi xử lý / vi điều khiển khỏi bất cứ điều gì nó đang thực hiện mà điều gì đó khác có thể xảy ra.

Cho phép tôi cung cấp cho bạn một minh họa hàng ngày. Hãy nghĩ rằng bạn đang thư giãn trong nhà riêng của mình, trò chuyện với một người khác. Đột nhiên, điện thoại vang lên.

Bạn ngừng nói và lấy điện thoại để nói chuyện với người gọi. Khi bạn đã tương tác qua điện thoại, bạn quyết định quay lại trò chuyện với cá nhân trước khi điện thoại đổ chuông. Có thể coi thói quen chính trong khi bạn trò chuyện với ai đó, tiếng chuông điện thoại sẽ làm gián đoạn cuộc trò chuyện của bạn, và việc phá vỡ thói quen là phương pháp nói chuyện qua điện thoại.

Khi cuộc thảo luận qua điện thoại kết thúc, bạn quay lại thói quen trò chuyện chính của mình. Hình minh họa này chính xác là cách một bộ xử lý ngắt thực hiện hành động.

Chương trình chính đang hoạt động, thực hiện một số chức năng nhất định trong một mạch, tuy nhiên khi xảy ra gián đoạn, chương trình chính sẽ tạm dừng trong khi một quy trình khác được thực hiện. quy trình kết thúc, bộ xử lý sẽ quay lại quy trình chính như trước.

Hiểu ngắt

PIC sở hữu 4 nguồn ngắt. Họ có thể được chia thành một vài nhóm. Hai là nguồn ngắt có thể được sử dụng bên ngoài cho PIC, trong khi hai nguồn khác là các quá trình bên trong. Hãy để tôi làm rõ hai loại bên ngoài ở đây. Hai phần còn lại sẽ được mô tả trong các hướng dẫn khác nhau khi chúng ta đến bộ đếm thời gian và lưu trữ dữ liệu.

Nếu bạn kiểm tra chân ra của PIC, bạn sẽ nhận thấy rằng chân 6 đó là RB0 / INT. Tại thời điểm này, RB0 rõ ràng là cổng B bit 0. INT biểu thị rằng nó cũng có thể được cấu hình như một chân ngắt bên ngoài. Ngoài ra, các chân 4 đến 7 của Cổng B (chân 10 đến 13) cũng có thể được sử dụng cho các ngắt. Trước khi có thể sử dụng INT hoặc các chân Cổng B khác, chúng ta phải hoàn thành hai nhiệm vụ. Trước tiên, chúng tôi phải thông báo cho PIC rằng chúng tôi sẽ sử dụng các ngắt.

Tiếp theo, chúng ta phải chỉ định chân cổng B mà chúng ta sẽ sử dụng làm ngắt thay vì là chân I / O. Bên trong PIC, bạn có thể tìm thấy một thanh ghi được gọi là INTCON, và ở địa chỉ 0Bh. Trong thanh ghi này, bạn sẽ khám phá ra 8 bit có thể được bật hoặc tắt. Bit 7 của INTCON được gọi là GIE. Đây là Kích hoạt Interrngupt Toàn cầu. Việc sửa lỗi này thành 1 thông báo cho PIC rằng chúng tôi sẽ sử dụng một ngắt.

Bit 4 của INTCON được gọi là INTE, INTerrupt Enable. Đặt bit này lên 1 sẽ truyền tới PIC rằng RB0 sẽ là chân ngắt. Cấu hình bit 3, được gọi là RBIE, thông báo cho PIc rằng chúng ta sẽ sử dụng cổng B bit 4 đến 7. Tại thời điểm này, PIC hiểu khi nào chân này có thể cao hoặc thấp, phải dừng những gì nó đang thực hiện và tiến hành ngắt công viêc hằng ngày. Tại thời điểm này, chúng ta phải thông báo cho PIC biết liệu có khả năng ngắt sẽ ở cạnh tăng dần (0V thành + 5V) hoặc chuyển đổi cạnh giảm (+ 5V thành 0V) của tín hiệu hay không.

Nói một cách đơn giản, chúng ta có muốn PIC ngắt mỗi khi tín hiệu di chuyển từ thấp lên cao hoặc từ cao xuống thấp. Bằng cách phạm pháp, điều này có thể được thiết lập để được đặt trên cạnh tăng.

Cạnh ‘kích hoạt’ được lên lịch trong một thanh ghi bổ sung được gọi là thanh ghi TÙY CHỌN, tại địa chỉ 81h. Bit mà chúng tôi rất quan tâm là bit 6, thường được gọi là INTEDG.

Đặt giá trị này thành 1 sẽ kích hoạt PIC phá vỡ trên cạnh lắp (trạng thái mặc định) và đặt nó thành 0 sẽ kích thích PIC ngắt trên cạnh trượt. Nếu bạn muốn PIC kích hoạt ở mức tăng, thì bạn chắc chắn không phải làm bất cứ điều gì với phần này.

Tại thời điểm này, thật đáng buồn, thanh ghi Quyền chọn nằm trong Ngân hàng 1, có nghĩa là chúng tôi muốn sửa đổi từ ngân hàng 0 thành ngân hàng 1, đặt bit trong thanh ghi Tùy chọn, sau đó quay trở lại ngân hàng 0. Chìa khóa ở đây là hoàn thành từng bit của Ngân hàng 1 đăng ký trong một lần tấn công, ví dụ như thiết lập các chân cổng, sau đó quay trở lại Ngân hàng 0 nếu bạn đã hoàn tất.

Tốt thôi, do đó chúng tôi đã thông báo cho PIC chân nào có thể sẽ là chân ngắt, và vị trí cạnh để kích hoạt, điều gì sẽ xảy ra trong chương trình và PIC bất kỳ lúc nào ngắt xảy ra? Một vài thứ diễn ra. Đầu tiên, một 'cờ' được lên lịch.

Điều này thông báo cho bộ xử lý nội bộ của PIC rằng một ngắt đã xảy ra. Tiếp theo, bộ đếm chương trình (mà tôi đã nói trong phần hướng dẫn trước) đưa ra các mẹo đến một địa chỉ cụ thể trong PIC. Hãy nhanh chóng kiểm tra tất cả những điều này một cách nhanh chóng. Cờ ngắt Trong thanh ghi INTCON của chúng tôi, bit 1 là cờ ngắt, được gọi là INTF. Tại thời điểm này, bất cứ khi nào phát sinh bất kỳ ngắt nào, cờ này có thể sẽ được cố định thành 1.

Khi không có gián đoạn, cờ được đặt thành 0. Cũng như đó chỉ là về tất cả các thành tích. Tại thời điểm này, bạn có thể đang cân nhắc “vấn đề là gì?” Chắc chắn, mặc dù cờ này được lên lịch 1, PIC không thể và sẽ không phản ứng với một ngắt khác. Do đó, hãy bày tỏ rằng chúng tôi mang đến sự gián đoạn. Cờ có thể sẽ được cố định thành 1, và PIC có thể đi vào quy trình của chúng tôi để xử lý ngắt.

Khi cờ này không được cố định thành 1 và PIC được phép tiếp tục trả lời ngắt, thì việc liên tục phát xung chốt có thể giữ cho PIC trở lại đầu quy trình ngắt của chúng tôi và không có nghĩa là hoàn thành nó. Quay trở lại hình minh họa của tôi về điện thoại, nó tương tự như việc nhấc điện thoại lên và ngay sau khi tiếp tục thảo luận, nó bắt đầu đổ chuông trở lại vì một người khác muốn nói chuyện với bạn.

Bạn nên hoàn thành một cuộc đối thoại, sau đó lấy điện thoại lại để nói chuyện với người tiếp theo. Bạn có thể tìm thấy một vấn đề nhỏ với lá cờ này. Mặc dù PIC nhanh chóng đặt cờ này thành 1, nhưng nó không đặt lại cờ 0! Hoạt động đó phải được thực hiện bởi lập trình viên - tức là bạn. Điều này có thể hoàn thành một cách dễ dàng, vì tôi đoán chắc chắn và cần phải đạt được sau khi PIC đã thực hiện quy trình ngắt.

Vị trí bộ nhớ Bất cứ khi nào bạn khởi động PIC lần đầu, hoặc trong trường hợp có đặt lại, Bộ đếm chương trình sẽ đưa ra lời khuyên về địa chỉ 0000h, có thể được nhập ngay từ đầu của bộ nhớ chương trình. Tuy nhiên, trong trường hợp có sự gián đoạn, Bộ đếm chương trình sẽ chỉ ra địa chỉ 0004h.

Do đó, trong khi chúng ta đang soạn chương trình sẽ có ngắt, trước tiên chúng ta phải thông báo cho PIC để chuyển qua địa chỉ 0004h và duy trì thói quen ngắt bắt đầu từ địa chỉ 0004h một cách riêng biệt với phần còn lại của chương trình.

Điều này có thể không phức tạp để thực hiện. Ban đầu, chúng tôi bắt đầu chương trình của mình bằng một lệnh được gọi là ORG. Lệnh này cho biết Nguồn gốc hoặc bắt đầu. Chúng tôi gắn bó với nó bằng một địa chỉ. Vì PIC bắt đầu ở địa chỉ 0000h, chúng tôi nhập ORG 0000h. Sau đó, chúng ta phải vượt qua địa chỉ 0004h. Chúng tôi thực hiện điều này bằng cách đặt một hướng dẫn GOTO, kèm theo nhãn hướng dẫn cho chương trình chính của chúng tôi.

Sau đó, chúng tôi tuân thủ lệnh GOTO này với một ORG nữa, thời điểm này với địa chỉ 0004h. Sau lệnh này, chúng ta sẽ chèn thói quen ngắt của mình. Tại thời điểm này, chúng ta có thể có thể gõ vào quy trình ngắt của mình ngay sau lệnh ORG thứ hai hoặc chúng tôi có thể định vị một câu lệnh GOTO trỏ đến quy trình ngắt.

Nó thực sự liên quan đến quyền chọn từ phía bạn. Để thông báo cho PIC mà nó cung cấp đã đến khi kết thúc quy trình ngắt, chúng ta phải đặt lệnh RTFIE ở cuối quy trình. Lệnh này biểu thị sự trở lại từ quy trình ngắt. Trong khi PIC thông báo điều này, Bộ đếm chương trình chỉ ra vị trí cuối cùng mà PIC đã ở trước khi xảy ra ngắt. Chúng tôi đã thiết lập bên dưới một phần mã ngắn gọn để hiển thị ở trên:

Có một số nội dung bạn nên biết khi sử dụng ngắt. Ban đầu có xu hướng là nếu bạn có thể đang sử dụng thanh ghi giống hệt nhau trong chương trình chính của mình và quy trình ngắt, hãy nhớ rằng các chi tiết của thanh ghi rất có thể sẽ thay đổi khi ngắt diễn ra.

Ví dụ: hãy sử dụng thanh ghi w để chuyển tiếp dữ liệu đến chương trình chính Cổng A, do đó bạn có thể sử dụng thêm thanh ghi w trong quy trình ngắt để chuyển dữ liệu từ đích này sang đích khác.

Trong trường hợp bạn không thận trọng, thanh ghi w sẽ bao gồm giá trị cuối cùng mà nó nhận được khi nó đang ở trong quy trình ngắt, vì vậy khi bạn quay lại từ ngắt, thông tin này sẽ được chuyển đến Cổng A thay vì giá trị bạn sở hữu trước đó sự gián đoạn xảy ra.

Phương tiện xung quanh việc này là lưu ngay các chi tiết của thanh ghi w trước khi bạn sử dụng nó một lần nữa trong quy trình ngắt. Thứ hai là thực tế bạn có thể tìm thấy độ trễ giữa thời điểm một ngắt diễn ra và khi gián đoạn tiếp theo có thể phát sinh. Theo bạn hiểu, PIC sở hữu một đồng hồ bên ngoài, có thể là một tinh thể hoặc nó có thể là một tổ hợp điện trở-tụ điện.

Bất kể tần số của đồng hồ này là bao nhiêu, PIC chia nó cho 4, sau đó sử dụng tần số này cho thời gian bên trong của nó. Ví dụ trong trường hợp bạn có một tinh thể 4MHz được liên kết với PIC của bạn, trong trường hợp đó PIC sẽ thực hiện các lệnh ở 1MHz. Thời gian nội thất này được gọi là Chu kỳ hướng dẫn. Tại thời điểm này, bảng dữ liệu tuyên bố (chắc chắn là trong bản in nhỏ) rằng bạn cần kích hoạt 3 đến 4 vòng hướng dẫn giữa các lần ngắt.

Của tôi sẽ được kích hoạt 4 vòng. Lý do đằng sau sự chậm trễ là PIC yêu cầu thời gian để nhảy đến địa chỉ ngắt, cờ, và quay trở lại khỏi quy trình ngắt. Do đó, hãy ghi nhớ điều này nếu bạn làm việc với mạch thay thế để kích hoạt ngắt cho PIC.

Tại thời điểm này, một thực tế là nếu bạn sử dụng các bit 4 đến 7 của Cổng B làm ngắt. Bạn không thể chọn các chân cụ thể trên Cổng B để hoạt động như một ngắt.

Do đó, trong trường hợp bạn cho phép các chân này, chúng có thể có được tất cả. Do đó, chẳng hạn, bạn không thể chỉ có bit 4 và 5 - bit 6 và 7 có thể sẽ được cấp quyền cùng một lúc. Mục đích chính xác của việc lấy bốn bit để biểu diễn một ngắt là gì? Chắc chắn, bạn có thể có một mạch được nối với PIC, trong trường hợp có bất kỳ ai trong số bốn dòng tăng cao, trong trường hợp đó, đây có thể là vấn đề mà bạn yêu cầu PIC phải tác động ngay lập tức.

Một minh họa cho điều này có thể là một cảnh báo an ninh gia đình, trong đó bốn cảm biến được liên kết với các chân của Cổng B từ 4 đến 7. Bất kỳ cảm biến cụ thể nào cũng có thể nhắc PIC kích hoạt cảnh báo và quy trình phát tín hiệu cảnh báo là quy trình ngắt. Điều này giúp kiểm tra các cảng liên tục và cho phép PIC tiếp tục các vấn đề khác nhau. Trong phần hướng dẫn tiếp theo, chúng ta sẽ soạn một chương trình để quản lý ngắt.

Chúng tôi đã giải quyết rất nhiều điều cơ bản trong hướng dẫn cuối cùng, do đó tôi cảm thấy đã đến lúc chúng tôi soạn chương trình đầu tiên của mình.

Chương trình chúng tôi sẽ viết sẽ đếm số lần chúng tôi bật công tắc và sau đó hiển thị số lượng.

Chương trình sẽ đếm từ 0 đến 9, có thể xem được trên 4 đèn LED ở dạng nhị phân, cùng với đầu vào hoặc ngắt có thể sẽ ở trên RB0.

Điều đầu tiên chúng ta phải tiến hành là thông báo cho PIC biết để tìm địa chỉ mà Bộ đếm chương trình trỏ đến bất cứ khi nào xảy ra ngắt.

Bạn sẽ thấy rằng Chúng tôi đang sử dụng một phương pháp duy nhất để hiển thị các số thập lục phân. Trước khi tôi xảy ra, áp dụng F9h trong đó h chỉ ra hệ thập lục phân. Chúng ta có thể viết cái này là 0xF9, đây là cấu trúc mà chúng ta sẽ sử dụng từ bây giờ.

Bây giờ chúng ta cần nói với PIC rằng chúng ta sẽ sử dụng ngắt và chúng ta đang sử dụng chân RB0 6 làm chân ngắt:

bsf INTCON, 7GIE - Kích hoạt ngắt toàn cục (1 = enable)
bsf INTCON, 4INTE - cho phép ngắt RB0 (1 = kích hoạt)
Tôi sẽ xóa cờ ngắt chỉ trong trường hợp (tôi không bao giờ tin tưởng bất cứ điều gì!)
bcf INTCON, 1INTF - Xóa bit cờ chỉ trong trường hợp

Hiện tại chúng tôi phải thiết lập 2 cảng của mình. Hãy nhớ rằng vì chúng tôi hiện đang sử dụng RB0 làm chân ngắt, nên điều này cần được thiết lập như một đầu vào:

Chúng tôi sẽ sử dụng một biến có tên là COUNT để lưu trữ số lượng chuyển đổi. Chúng tôi chỉ có thể tăng giá trị trên Cổng A một cách đơn giản, nhưng bạn sẽ thấy lý do tại sao tôi sử dụng một biến khi chúng tôi viết quy trình ngắt.

Do đó, chương trình chính của chúng tôi được soạn thảo, và tại thời điểm này, chúng tôi phải thông báo cho PIC cách tiến hành bất cứ khi nào xảy ra gián đoạn. Trong ví dụ này, ngắt của chúng ta có thể sẽ là công tắc. Chỉ những gì chúng tôi muốn PIC là một trong COUNT có thể điều chỉnh mỗi khi công tắc bị giới hạn.

Tuy nhiên, chúng tôi chỉ muốn hiển thị bao nhiêu lần công tắc tắt từ 0 đến 9. Ở trên, tôi đã nói rằng chúng tôi có thể chỉ cần tăng giá trị trên Cổng A mỗi khi có ngắt. Tuy nhiên, cổng A có 5 bit, trong trường hợp chúng tôi chỉ tăng cổng, chúng tôi sẽ sở hữu số lượng cao nhất là 31. Có một số giải thích tại sao tôi chọn không tăng lên 31.

Ban đầu, chúng tôi sẽ sử dụng màn hình 7 đoạn, tối đa chỉ có thể đi từ 0 đến 15 (0 đến F trong hệ lục phân). Tiếp theo, tôi cũng muốn chỉ cho bạn một vài lệnh số học mà bạn đã gặp trong vài bài học trước.

Do đó, chúng tôi sẽ tiếp tục với thói quen ngắt quãng của mình. Hiện tại, việc đầu tiên chúng ta phải thực hiện là lưu trữ ngắn gọn các chi tiết của sổ đăng ký w của chúng ta, vì chúng ta đã áp dụng điều này để chuyển nội dung của COUNT thành PORTA. Trong trường hợp chúng tôi không lưu nó, trong trường hợp đó, chúng tôi có thể cung cấp một số hoàn toàn khác do số học của chúng tôi. Do đó, hãy thực hiện điều đó trước:

Tại thời điểm này, chúng tôi hiểu nếu giá trị của COUNT là 9 trở lên. Những gì chúng ta cần hoàn thành bây giờ là nếu COUNT lớn hơn 9, hãy đặt nó trở lại 0, hoặc nếu không, hãy quay lại chương trình chính để đảm bảo rằng chúng ta có thể chuyển nó đến Cổng A.
hướng dẫn trong trường hợp cờ mang được lập lịch, tức là COUNT = 10:

Điều duy nhất còn lại phải làm bây giờ là nhập chung cũng như xác định giá trị cho các hằng số của chúng tôi, mà chúng tôi có thể thực hiện ngay khi bắt đầu chương trình của mình.

Mỗi lần bạn bật công tắc, các đèn LED sẽ đếm theo hệ nhị phân từ 0000 đến 1010 rồi quay lại 0000.

Hình sau cho thấy sơ đồ mạch tương thích với đoạn mã được giải thích ở trên. Điều thú vị là bạn sẽ thấy rằng tụ điện định thời đã được đưa vào thiết kế. Đây là một mưu đồ nhỏ hay mà qua đó bạn có thể tự do tránh việc bao gồm tụ điện trong trường hợp bạn không có bất kỳ thứ gì bên mình trong thời gian đó.

Ở đây điện dung phát huy tác dụng thông qua điện dung đi lạc qua chân bộ dao động và mặt đất.
Tất nhiên, nó có vẻ không phải là một cách rất thông minh để tránh tụ điện trên thực tế vì giá trị lạc có thể thay đổi theo các điều kiện nhất định khác nhau.

Một phần khác có thể được chứng kiến ​​trong mạch là mạng tố cáo trên công tắc. Điều này ngăn cản sự can thiệp trong khi chuyển đổi cơ học và ngăn PIC không bị nhầm lẫn nếu chuyển đổi là một chuyển đổi đơn lẻ hoặc nhiều chuyển đổi.




Trước: Mạch hẹn giờ động cơ hai chiều có thể lập trình Tiếp theo: Cách hoạt động của mạch Buck-Boost