ENCYCLOPEDIA VỀ ĐIỆN TỬ TRUYỀN THANH VÀ KỸ THUẬT ĐIỆN Lập trình mô-đun hệ thống điều khiển trên MCS48. Bách khoa toàn thư về điện tử vô tuyến và kỹ thuật điện Bách khoa toàn thư về điện tử vô tuyến và kỹ thuật điện / Bộ vi điều khiển Được biết, cùng một bộ vi điều khiển có thể điều khiển cả thiết bị công nghệ phức tạp và máy xay cà phê gia dụng hay đồng hồ điện tử. Việc thích ứng với một đối tượng cụ thể được thực hiện bằng cách thay đổi chương trình vi điều khiển, phần cứng hầu như không bị ảnh hưởng. Bài báo đề xuất được dành cho các kỹ thuật lập trình cho các bộ vi điều khiển dòng MCS48, được sử dụng rộng rãi trong các hệ thống điều khiển cho các mục đích khác nhau. Các quy định chính của nó cũng có giá trị đối với các thiết bị hiện đại hơn. Việc phát triển và hiện đại hóa các chương trình điều khiển sẽ thuận lợi hơn rất nhiều nếu chúng được xây dựng theo nguyên tắc mô-đun. Trong trường hợp này, sau khi có được một số kinh nghiệm và quan trọng nhất là thư viện các mô-đun đã sửa lỗi của riêng chúng tôi, việc lập trình một hệ thống điều khiển mới (CS) bắt nguồn từ việc thay thế một số mô-đun của một chương trình đã tồn tại và đã sửa lỗi, đồng thời có thể bổ sung cho nó các đoạn có tính đến các chi tiết cụ thể của một hệ thống cụ thể. Nguyên tắc này được đưa vào cấu trúc của nhiều ngôn ngữ cấp cao (PASCAL, C++) và lập trình viên buộc phải tuân theo nó theo đúng nghĩa đen. Thật không may, ASSEMBLERS (bao gồm cả MSS48), trong khi cho phép lập trình viên tự do lựa chọn phương tiện và phương pháp giải quyết vấn đề hơn, theo quy định, hoàn toàn không giám sát việc tuân thủ kỷ luật lập trình. Điều này thường dẫn đến việc tạo ra các chương trình khó hiểu đến mức ngay cả tác giả của chúng cũng không thể hiểu được những gì đã được thực hiện sau một thời gian, chưa kể đến việc sử dụng các đoạn đã sửa lỗi trong các chương trình khác. Tuân thủ có ý thức các khái niệm mô-đun phổ biến tạo điều kiện thuận lợi và tăng tốc đáng kể việc lập trình vi điều khiển. Một ví dụ về chương trình mô-đun điển hình cho CS được đưa ra trong bảng. Cú pháp của nó tương ứng với LẮP RÁP dạng bảng TASM cho bộ vi xử lý 8048. Như bạn có thể thấy, ở phần đầu của văn bản chương trình, các chỉ thị EQU đặt tên cho các hằng số và gán các giá trị. Việc sử dụng các hằng số được đặt tên luôn được ưu tiên hơn so với việc chỉ định trực tiếp các giá trị số trong các hướng dẫn bộ xử lý thực thi. Ví dụ: thời gian trễ được thực hiện bởi một trong các chương trình con được thảo luận bên dưới được xác định bằng ba số. Chúng được cho bởi các hằng số N1, N2 và N3. Nếu bạn cần thay đổi tốc độ cửa trập, chỉ cần chỉ định các giá trị mới trong toán tử EQU là đủ. Nếu không, người ta sẽ phải xem toàn bộ chương trình để biết các hướng dẫn có toán hạng bằng các số này, quyết định xem mỗi hướng dẫn có đề cập đến độ trễ thời gian hay không và chỉ ra các giá trị mới trong các trường hợp cần thiết. Rõ ràng, công việc như vậy đòi hỏi rất nhiều thời gian và thường không phải là không có sai sót. Nó đặc biệt phức tạp bởi thực tế là một số lệnh có thể không sử dụng toàn bộ số, nhưng, ví dụ, byte cao hoặc byte thấp của nó. ASSEMBER đã ở giai đoạn dịch chương trình có thể tính toán một số hằng số dựa trên giá trị của các hằng số khác. Khả năng này được minh họa bằng cách tính các byte cao (N3N) và thấp (N3L) của số NXNUMX. Tiếp theo, chương trình cấp phát bộ nhớ cho các biến. Chúng làm điều này với cùng các chỉ thị EQU, nhưng không giống như các mô tả về hằng số, chúng không chỉ định giá trị số của các biến mà là địa chỉ của các ô nhớ mà chúng chiếm giữ. Nếu NGƯỜI LẮP RÁP cho phép, không nên bỏ qua khả năng sử dụng macro. Mỗi trong số chúng là một hướng dẫn mới thực hiện một thao tác không được cung cấp trực tiếp bởi hệ thống hướng dẫn của bộ xử lý. Khi mô tả lệnh macro, lập trình viên đặt tên cho nó (tất nhiên, tên này không trùng với tên của bất kỳ lệnh "thực") nào và chỉ định các hành động cần thiết dưới dạng Chuỗi lệnh máy. Mỗi khi nó gặp một lệnh macro trong một chương trình, ASEMBLER sẽ thay thế lệnh đó bằng trình tự đã chỉ định. Trong ví dụ này, hai macro được sử dụng. Một trong số chúng chuyển nội dung của bộ tích lũy sang ô nhớ dữ liệu được chỉ định bởi tham số macro và cái còn lại - ngược lại. Sau khi bật nguồn (hoặc tín hiệu đặt lại được đưa ra), bộ vi điều khiển bắt đầu thực hiện chương trình từ địa chỉ 3. Địa chỉ này thường được sử dụng để viết lệnh nhảy vô điều kiện đến điểm bắt đầu chương trình thực tế (trong trường hợp này là nhãn START). Điều này là cần thiết vì các ngắt phần cứng luôn chuyển điều khiển đến các địa chỉ cố định 7 và XNUMX (đối với các loại vi điều khiển khác thì địa chỉ có thể khác nhưng chúng vẫn nằm ở đầu bộ nhớ chương trình). Các lệnh chuyển đổi vô điều kiện sang các quy trình dịch vụ của các ngắt tương ứng được đặt tại các địa chỉ này sẽ bị "bỏ qua" bởi chương trình chính. Bước tiếp theo là cài đặt chế độ hoạt động của bộ điều khiển (ví dụ: chọn ngân hàng bộ nhớ và thanh ghi), khởi tạo biến và thiết bị bên ngoài. Một sai lầm điển hình của các lập trình viên mới làm quen là cho rằng ngay sau khi bắt đầu chương trình, các biến đã có một số giá trị xác định. Quan niệm sai lầm này được củng cố bởi thực tế là một số ngôn ngữ cấp cao (chẳng hạn như BASIC) tự động đặt tất cả các biến thành giá trị ban đầu bằng 1. Trong các chương trình bằng hợp ngữ (và nhiều ngôn ngữ khác), bản thân người lập trình phải lưu ý rằng trước lần đọc đầu tiên giá trị của một biến, một thứ gì đó đã được ghi vào ô nhớ được cấp phát cho nó. Phong cách lập trình tốt yêu cầu các giá trị ban đầu được gán cho các biến ngay từ đầu chương trình. Trong trường hợp này, điều này được thực hiện bởi chương trình con XNUMXINIT. Phần khởi tạo thiết bị bên ngoài thường trông giống như một lệnh gọi thay thế cho các chương trình con, mỗi lệnh đặt lại một trong số chúng (bộ chuyển đổi tương tự sang số, đèn báo LED, bàn phím, v.v.) và có thể dễ dàng thay thế khi hoàn thiện và cải tiến hệ thống. Thông thường, những thói quen tương tự này sẽ kiểm tra tình trạng của thiết bị. Tiếp theo, hầu hết các chương trình điều khiển đi vào một vòng lặp chính lặp lại vô tận, việc thực thi vòng lặp này chỉ bị tạm dừng để xử lý các ngắt. Chu trình bao gồm các chương trình con để thăm dò bàn phím và các cảm biến khác, kiểm tra các cờ được đặt bởi các chương trình con xử lý ngắt (ví dụ: cờ khi hết khoảng thời gian xác định hoặc kết thúc bộ chuyển đổi tương tự sang số), xử lý thông tin đến theo thuật toán điều khiển đã chỉ định, xuất các hoạt động điều khiển cho bộ truyền động, xuất thông tin về trạng thái của quy trình công nghệ sang màn hình tinh thể lỏng hoặc các chỉ báo khác. Lối thoát khỏi vòng lặp chính thường chỉ được cung cấp trong các tình huống khẩn cấp, ví dụ: nếu để loại bỏ hậu quả của sự cố, cần phải lặp lại việc khởi tạo tất cả các biến và thiết bị bên ngoài, cũng như khi xử lý các ngắt. Như vậy, một chương trình được xây dựng trên cơ sở modul là một tập các chương trình con. Ví dụ, nếu một bàn phím khác được sử dụng trong hệ thống điều khiển mới, nó sẽ đủ để thay thế chương trình con BUTT. Để việc thay thế trở nên đơn giản và không gây đau đớn, cần phát triển và luôn tuân thủ các quy tắc nhất định. Các chương trình con, nếu có thể, nên lưu nội dung của tất cả các thanh ghi bộ điều khiển, nhận dữ liệu ban đầu và đưa ra kết quả trong cùng các thanh ghi và ô nhớ, sử dụng cùng một mã hóa ký tự, v.v. Cần phải chống lại mong muốn đơn giản hóa chương trình bằng cách tránh xa các quy tắc nghiêm ngặt và sử dụng các kỹ thuật phi tiêu chuẩn. Thoạt nhìn, có vẻ như sự phức tạp không chính đáng sẽ được đền đáp hoàn toàn bằng cách tạo điều kiện thuận lợi cho việc gỡ lỗi và làm lại toàn bộ chương trình. Hãy xem xét một số tính năng của chương trình con. Tôi NCREM và DESREM thực hiện yêu cầu trong nhiều trường hợp, hoạt động tăng hoặc giảm theo một giá trị nhất định của số nhị phân 16 bit (byte cao và byte thấp của nó tương ứng trong các thanh ghi R6 và R5). Các hằng xác định số lượng gia tăng được mô tả ở phần đầu của chương trình. Vì bất kỳ bộ vi điều khiển nào hoạt động nhanh hơn nhiều so với thiết bị công nghệ, điều rất quan trọng là có thể sắp xếp thời gian trễ trong chương trình. Trong trường hợp này, bộ đếm/bộ đếm thời gian bên trong của bộ xử lý được sử dụng. Nó có dung lượng hạn chế và tràn trong mili giây. Mỗi lần tràn sẽ tạo ra một yêu cầu ngắt. Quy trình dịch vụ ngắt hẹn giờ (TIME) đếm chúng và khi đạt đến số đã chỉ định, đặt cờ hết thời gian chờ FLT thành một. Tất cả các chương trình con có công việc phụ thuộc vào thời gian, vẫn còn phải phân tích trạng thái của cờ này. Vì vậy, có thể nhận ra tốc độ màn trập vài giây và thậm chí vài phút. Để bắt đầu đếm một khoảng thời gian mới, cần nhập các giá trị ban đầu vào các ô làm việc của chương trình con TIME và bật bộ hẹn giờ. Chương trình con SET2M, ví dụ, đặt thời gian trễ là 2 phút. Việc tính toán các giá trị ban đầu có một số điểm tinh tế. Được biết, trong các bộ vi điều khiển thuộc dòng MSS48, các xung đến đầu vào của bộ đếm/bộ đếm thời gian bên trong ở tần số thấp hơn 480 lần so với tần số của bộ tạo dao động thạch anh. Ví dụ: với tần số bộ cộng hưởng thạch anh là 7 MHz, số được ghi vào bộ đếm thay đổi sau mỗi 480/7000000 = 0,00006857 s = 68,57 µs. Vì vậy, bộ đếm sẽ tràn (và tạo yêu cầu ngắt) trong 68,57 -(256-N1) µs, trong đó N1 là số ban đầu được ghi vào bộ đếm. Nếu mỗi lần bạn bắt đầu đếm mới từ số này, thì N0,1 = 2 0,1/[7000000 (1480-N256)] tràn sẽ xảy ra trong 1 giây (độ trễ thời gian tối thiểu). Rõ ràng, có thể đạt được độ trễ thời gian giống nhau với N1 và N2 khác nhau, nhưng vì những con số này không thể là phân số, nên nó sẽ được thực hiện với một số lỗi. Nhiệm vụ là chọn một cặp giá trị sao cho sai số là nhỏ nhất. Trong trường hợp đang xem xét, tùy chọn tốt nhất là N1 = 13, N2 = 6. Có được độ trễ thời gian 2 phút bằng cách lặp lại quy trình được mô tả N3 = 1200 lần. Thường cần phải sử dụng các thủ tục khác nhau để xử lý các ngắt phần cứng giống nhau trong các chế độ hoạt động khác nhau của chương trình. Một cách để làm điều này được minh họa bởi chương trình con INTER. Nó phân tích mã loại ngắt được nhập bởi chương trình chính trong ô INTT và tùy thuộc vào giá trị của nó, gọi một trong các thường trình phục vụ ngắt ISR1 hoặc ISR2. Lưu ý rằng cả hai đều kết thúc bằng RET chứ không phải RETR. Thật dễ dàng để tăng số lượng tùy chọn xử lý và thậm chí làm cho nó sao cho đối với một giá trị nhất định của mã, một số chương trình con khác nhau sẽ được gọi lần lượt. Không cần thiết phải viết tất cả các chương trình con cần thiết trong tệp văn bản của chương trình chính. Các mô-đun được gỡ lỗi và sử dụng nhiều lần trong các chương trình khác nhau có thể được đặt trong các tệp riêng biệt và được kết nối với chương trình chính bằng các lệnh INCLUDE. Mỗi tệp bao gồm có thể chứa một hoặc nhiều thường trình. Nhược điểm của phương pháp này là không nên lặp lại tên của các biến, hằng và nhãn trong tất cả các mô-đun đã sử dụng. Thật không may, do khiếm khuyết này, phương pháp dịch các mô-đun riêng biệt với sự hợp nhất tiếp theo của chúng ở cấp mã đối tượng, thật không may, không được TASM ASSEMBLY hỗ trợ. Tác giả: D. Ryzhov, Vladimir Xem các bài viết khác razdela Bộ vi điều khiển. Đọc và viết hữu ích bình luận về bài viết này. Tin tức khoa học công nghệ, điện tử mới nhất: Máy tỉa hoa trong vườn
02.05.2024 Kính hiển vi hồng ngoại tiên tiến
02.05.2024 Bẫy không khí cho côn trùng
01.05.2024
Tin tức thú vị khác: ▪ GIS hữu ích cho các chính trị gia ▪ Máy ảnh kỹ thuật số lớn nhất thế giới đang được xây dựng ▪ Cần phải đơn giản hóa việc sử dụng điện thoại di động ▪ Intel Core i7-3970X Extreme Edition ▪ Áp kế với điện thoại thông minh Nguồn cấp tin tức khoa học và công nghệ, điện tử mới
Tài liệu thú vị của Thư viện kỹ thuật miễn phí: ▪ phần công trường Công trình điện. Lựa chọn bài viết ▪ bài viết Người đàn ông với một khẩu súng. biểu thức phổ biến ▪ bài viết Tên của bức tượng trong Piccadilly Circus ở London là gì? đáp án chi tiết ▪ Điều kỹ sư trưởng xây dựng. Mô tả công việc
Để lại bình luận của bạn về bài viết này: Tất cả các ngôn ngữ của trang này Trang chủ | Thư viện | bài viết | Sơ đồ trang web | Đánh giá trang web www.diagram.com.ua |