Cách MCU điều khiển màn hình LCD và những cân nhắc về thiết kế
Phân loại và ứng dụng của máy vi tính chip đơn
Theo loại bộ nhớ của nó, MCU có thể được chia thành hai loại không có ROM trên chip và có ROM trên chip. Đối với các chip không có ROM trên chip, chúng phải được kết nối với EPROM bên ngoài (thường là 8031); Các chip có ROM trên chip được chia thành EPROM trên chip (thường là 87C51), ROM mặt nạ trên chip (thường là 87C51) Chip là 8051), loại Flash trên chip (chip điển hình là 89C51) và các loại khác.
Theo mục đích, nó có thể được chia thành mục đích chung và mục đích đặc biệt; theo chiều rộng của bus dữ liệu và độ dài của byte dữ liệu có thể được xử lý cùng một lúc, nó có thể được chia thành các MCU 8, 16 và 32 bit.
Hiện tại, thị trường ứng dụng MCU trong nước được sử dụng rộng rãi nhất trong lĩnh vực điện tử tiêu dùng, tiếp theo là lĩnh vực công nghiệp và thị trường điện tử ô tô. Điện tử tiêu dùng bao gồm thiết bị gia dụng, tivi, máy chơi game, hệ thống âm thanh và video, cùng nhiều thiết bị khác. Các lĩnh vực công nghiệp bao gồm nhà thông minh, tự động hóa, ứng dụng y tế, sản xuất và phân phối năng lượng mới. Lĩnh vực ô tô bao gồm hệ thống truyền động ô tô và hệ thống kiểm soát an toàn, v.v.
Công ty TNHH Công nghệ Hongjia Thâm Quyến chuyên về R&D, sản xuất và bán màn hình LCD và màn hình cảm ứng 1,14 inch-10,1 inch, có thể tùy chỉnh và cung cấp các màn hình MCU hỗ trợ, bao gồm giao diện SPI, giao diện MCU, giao diện RGB, Giao diện MIPI, v.v. Có nhiều kích cỡ và kiểu dáng, Màn hình cảm ứng điện trở phù hợp và màn hình cảm ứng điện dung cũng có thể được cung cấp.
Chức năng cơ bản của máy vi tính chip đơn
Đối với hầu hết các MCU, các chức năng sau là phổ biến và cơ bản nhất. Đối với các MCU khác nhau, mô tả có thể khác nhau, nhưng về cơ bản chúng giống nhau về bản chất:
1. TImer (bộ hẹn giờ): Mặc dù có nhiều loại TImer nhưng chúng có thể được phân thành hai loại: một là TImer với khoảng thời gian cố định, tức là thời gian được hệ thống đặt và chương trình người dùng không thể kiểm soát được. Chỉ một số khoảng thời gian cố định được cung cấp để chương trình người dùng lựa chọn, chẳng hạn như 32Hz, 16Hz, 8Hz, v.v. Loại TImer này phổ biến hơn trong MCU 4 bit, vì vậy nó có thể được sử dụng để thực hiện các chức năng liên quan như đồng hồ và thời gian .
Loại còn lại là Programmable Hẹn giờ (bộ đếm thời gian có thể lập trình). Đúng như tên gọi, thời gian định giờ của loại Hẹn giờ này có thể được điều khiển bởi chương trình của người dùng. Các phương pháp điều khiển bao gồm: lựa chọn nguồn xung nhịp, lựa chọn phân chia tần số (Prescale) và cài đặt số đúc sẵn, v.v. Một số MCU có cả ba cùng một lúc, trong khi những MCU khác có thể có một hoặc hai trong số đó. Loại ứng dụng Hẹn giờ này rất linh hoạt và cách sử dụng thực tế cũng luôn thay đổi. Một trong những ứng dụng phổ biến nhất là sử dụng nó để nhận ra đầu raPWM.
Vì nguồn đồng hồ có thể được lựa chọn tự do nên các Bộ hẹn giờ như vậy thường được kết hợp với Bộ đếm sự kiện.
2. Cổng IO: Bất kỳ MCU nào cũng có một số cổng IO nhất định. Nếu không có cổng IO, MCU sẽ mất kênh liên lạc với thế giới bên ngoài. Theo cấu hình của cổng IO, nó có thể được chia thành các loại sau:
Cổng đầu vào thuần túy hoặc đầu ra thuần túy: Loại cổng IO này được xác định bởi thiết kế phần cứng MCU. Nó chỉ có thể là đầu vào hoặc đầu ra và không thể được thiết lập bằng phần mềm theo thời gian thực.
Đọc ghi trực tiếp cổng IO: Ví dụ cổng IO của MCS-51 thuộc loại cổng IO này. Khi thực hiện lệnh đọc cổng IO, nó là cổng đầu vào; khi thực hiện lệnh ghi cổng IO, nó sẽ tự động trở thành cổng đầu ra.
Lập trình chương trình để đặt hướng đầu vào và đầu ra: đầu vào hoặc đầu ra của loại cổng IO này được chương trình đặt theo nhu cầu thực tế, ứng dụng tương đối linh hoạt và có thể thực hiện được một số ứng dụng cấp bus, chẳng hạn như I2C xe buýt, màn hình LCD khác nhau, xe buýt điều khiển trình điều khiển LED, v.v.
Khi sử dụng cổng IO cần lưu ý điểm quan trọng: đối với cổng đầu vào phải có tín hiệu mức rõ ràng để đảm bảo không bị nổi (có thể đạt được bằng cách thêm pull-up hoặc pull- điện trở xuống); đối với cổng đầu ra, đầu ra của nó ở cấp trạng thái phải xem xét kết nối bên ngoài của nó và phải đảm bảo rằng không có nguồn hiện tại hoặc bồn rửa ở trạng thái Chờ hoặc trạng thái tĩnh.
3. Ngắt ngoài: Ngắt ngoài cũng là một chức năng cơ bản của hầu hết các MCU. Nó thường được sử dụng để kích hoạt tín hiệu theo thời gian thực, lấy mẫu dữ liệu và phát hiện trạng thái. Có một số loại ngắt: kích hoạt cạnh tăng, kích hoạt cạnh giảm và kích hoạt mức. Các ngắt bên ngoài thường được thực hiện thông qua các cổng đầu vào. Nếu là cổng IO, chức năng ngắt sẽ chỉ được bật khi được đặt thành đầu vào; nếu là cổng đầu ra, chức năng ngắt bên ngoài sẽ tự động tắt (có một số ngoại lệ trong dòng ATiny của ATMEL, cổng đầu ra cũng có thể kích hoạt chức năng ngắt). Ứng dụng của ngắt ngoài như sau:
Phát hiện tín hiệu kích hoạt bên ngoài: một tín hiệu dựa trên các yêu cầu thời gian thực, chẳng hạn như điều khiển bộ chỉnh lưu điều khiển bằng silicon, phát hiện tín hiệu nổ, v.v., và thứ hai là nhu cầu tiết kiệm điện.
Đo tần số tín hiệu: Để đảm bảo tín hiệu không bị bỏ sót, ngắt bên ngoài là lựa chọn lý tưởng.
Giải mã dữ liệu: Trong lĩnh vực ứng dụng điều khiển từ xa, để giảm chi phí thiết kế, người ta thường phải sử dụng phần mềm để giải mã các dữ liệu được mã hóa khác nhau, chẳng hạn như giải mã mã hóa Manchester và mã hóa RGB.
Phát hiện phím và đánh thức hệ thống: Đối với MCU chuyển sang trạng thái Ngủ, nó thường cần được đánh thức thông qua một ngắt bên ngoài. Hình thức cơ bản nhất là một chiếc chìa khóa và sự thay đổi cấp độ được tạo ra bởi hành động của chiếc chìa khóa.
4. Giao diện truyền thông: Giao diện truyền thông do MCU cung cấp thường bao gồm giao diện SPI, giao diện UART, I2C, v.v., được mô tả như sau:
Giao diện SPI: Loại giao diện này là phương thức giao tiếp cơ bản nhất được cung cấp bởi hầu hết các MCU. Việc truyền dữ liệu của nó được điều khiển bởi một đồng hồ đồng bộ. Các tín hiệu bao gồm: SDI (đầu vào dữ liệu nối tiếp), SDO (đầu ra dữ liệu nối tiếp), SCLK (đồng hồ nối tiếp) và tín hiệu Sẵn sàng; trong một số trường hợp, có thể không có tín hiệu Sẵn sàng; Loại giao diện này có thể hoạt động ở chế độ Master hoặc chế độ Slave, câu nói phổ biến là xem ai cung cấp tín hiệu đồng hồ, bên cung cấp đồng hồ là Master, còn bên đối diện thì đó là Slaver.
UART (Truyền nhận không đồng bộ toàn cầu): Đây là giao diện truyền không đồng bộ cơ bản nhất. Các đường tín hiệu của nó chỉ có Rx và Tx. Định dạng dữ liệu cơ bản là: Bit bắt đầu + Bit dữ liệu (7 bit/8 bit) + Bit chẵn lẻ (Chẵn, lẻ hoặc Không) + Bit dừng (1 ~ 2Bit). Thời gian dành cho một bit dữ liệu được gọi là Tốc độ truyền (tốc độ truyền).
Đối với hầu hết các MCU, độ dài của bit dữ liệu, phương pháp kiểm tra dữ liệu (kiểm tra lẻ, kiểm tra chẵn hoặc không kiểm tra), độ dài của bit dừng (Stop Bit) và Tốc độ truyền có thể được thiết lập linh hoạt thông qua lập trình. Chắc chắn. Cách được sử dụng phổ biến nhất của loại giao diện này là giao tiếp với cổng nối tiếp của PC.
Giao diện I2C: I2C là giao thức truyền dữ liệu do Philips phát triển, cũng được thực hiện bởi hai tín hiệu: SDAT (đầu vào và đầu ra dữ liệu nối tiếp) và SCLK (đồng hồ nối tiếp). Ưu điểm lớn nhất của nó là có thể kết nối nhiều thiết bị với bus này, có thể xác định và truy cập thông qua địa chỉ; Một trong những lợi ích lớn nhất của bus I2C là rất thuận tiện khi sử dụng phần mềm để nhận biết nó thông qua cổng IO và tốc độ truyền dữ liệu của nó được điều khiển hoàn toàn bởi SCLK. Để điều khiển, nó có thể nhanh hoặc chậm, không giống như giao diện UART , có yêu cầu nghiêm ngặt về tốc độ.
5. Watchdog (watchdog clock): Watchdog cũng là cấu hình cơ bản của hầu hết các MCU (một số MCU 4-bit có thể không có chức năng này), và hầu hết các Watchdog của MCU chỉ có thể cho phép các chương trình reset chúng chứ không thể reset chúng. Nó được đóng (một số được đặt khi chương trình được ghi vào, chẳng hạn như MCU dòng Microchip PIC) và một số MCU xác định xem có mở nó theo cách cụ thể hay không, chẳng hạn như dòng KS57 của Samsung, miễn là chương trình truy cập vào thanh ghi Watchdog , được bật tự động và không thể tắt lại được. Nói chung, thời gian đặt lại của cơ quan giám sát có thể được đặt theo chương trình. Ứng dụng cơ bản nhất của Watchdog là cung cấp khả năng tự phục hồi cho MCU khi gặp sự cố do lỗi không mong muốn.
Lập trình vi điều khiển
Có sự khác biệt lớn giữa việc lập trình chương trình MCU và lập trình chương trình PC. Mặc dù các công cụ phát triển MCU dựa trên C ngày càng trở nên phổ biến nhưng đối với một mã chương trình hiệu quả và một nhà thiết kế thích sử dụng hợp ngữ, hợp ngữ vẫn là ngôn ngữ lập trình ngắn gọn và hiệu quả nhất.
Đối với lập trình MCU, khung cơ bản của nó có thể nói là gần giống nhau, thường được chia thành ba phần: phần khởi tạo (đây là điểm khác biệt lớn nhất giữa lập trình MCU và lập trình PC), phần thân vòng lặp chương trình chính và chương trình xử lý ngắt, tương ứng là được giải thích như sau:
1. Khởi tạo: Đối với việc thiết kế tất cả các chương trình MCU, khởi tạo là bước cơ bản và quan trọng nhất, thường bao gồm các bước sau:
Che dấu tất cả các ngắt và khởi tạo con trỏ ngăn xếp: Phần khởi tạo nói chung không muốn bất kỳ ngắt nào xảy ra.
Xóa vùng RAM của hệ thống và hiển thị Bộ nhớ: Mặc dù đôi khi nó có thể không hoàn toàn cần thiết, nhưng từ góc độ độ tin cậy và tính nhất quán, đặc biệt là để ngăn ngừa các lỗi vô tình, nên phát triển thói quen lập trình tốt.
Khởi tạo cổng IO: Theo yêu cầu ứng dụng của dự án, đặt chế độ đầu vào và đầu ra của cổng IO liên quan. Đối với cổng đầu vào, bạn cần đặt lực cản kéo lên hoặc kéo xuống của nó; đối với cổng đầu ra, bạn phải đặt mức đầu ra ban đầu, để tránh những lỗi không đáng có.
Cài đặt ngắt: Đối với tất cả các nguồn ngắt cần sử dụng trong dự án, chúng phải được bật và phải đặt điều kiện kích hoạt cho các ngắt, còn đối với các ngắt dự phòng không được sử dụng thì phải tắt chúng.
Khởi tạo các mô-đun chức năng khác: Đối với tất cả các mô-đun chức năng ngoại vi của MCU cần được sử dụng, phải thực hiện các cài đặt tương ứng theo yêu cầu ứng dụng của dự án, chẳng hạn như giao tiếp UART, Tốc độ Baud, độ dài dữ liệu, phương pháp xác minh và Dừng Bit cần được đặt Độ dài, v.v. và đối với Bộ hẹn giờ lập trình viên, bạn phải đặt nguồn xung nhịp, phân chia tần số và Tải lại dữ liệu, v.v.
Khởi tạo tham số: Sau khi hoàn tất quá trình khởi tạo phần cứng và tài nguyên MCU, bước tiếp theo là khởi tạo một số biến và dữ liệu được sử dụng trong chương trình. Việc khởi tạo phần này cần được thiết kế theo dự án cụ thể và bố cục tổng thể của chương trình. Đối với một số ứng dụng sử dụng EEPROM để lưu dữ liệu đúc sẵn của dự án, nên sao chép dữ liệu liên quan vào RAM của MCU trong quá trình khởi tạo để cải thiện tốc độ truy cập của chương trình vào dữ liệu và giảm mức tiêu thụ điện năng của hệ thống (về nguyên tắc , việc truy cập vào EEPROM bên ngoài sẽ làm tăng mức tiêu thụ điện năng của nguồn điện).
2. Phần thân vòng lặp của chương trình chính: Hầu hết các MCU chạy liên tục trong thời gian dài nên phần thân chương trình chính về cơ bản được thiết kế theo kiểu tuần hoàn. Đối với các ứng dụng có nhiều chế độ làm việc, có thể có nhiều thân vòng lặp A được chuyển đổi lẫn nhau thông qua cờ trạng thái. Đối với nội dung chương trình chính, các module sau thường được sắp xếp:
Chương trình tính toán: Chương trình tính toán nhìn chung tốn nhiều thời gian nên kiên quyết phản đối mọi thao tác xử lý ngắt, đặc biệt là các phép toán nhân và chia.
Xử lý các chương trình có yêu cầu thời gian thực thấp hoặc không có yêu cầu về thời gian thực;
Chương trình truyền hiển thị: chủ yếu dành cho các ứng dụng có Trình điều khiển LED và LCD bên ngoài.
3. Chương trình xử lý ngắt: Chương trình ngắt chủ yếu được sử dụng để xử lý các tác vụ và sự kiện có yêu cầu thời gian thực cao, chẳng hạn như phát hiện tín hiệu đột ngột bên ngoài, phát hiện và xử lý phím, đếm thời gian, quét màn hình LED, v.v.
Nói chung, chương trình ngắt nên giữ mã ngắn gọn và ngắn gọn nhất có thể. Đối với các hàm không cần xử lý trong thời gian thực, bạn có thể đặt cờ kích hoạt trong ngắt và sau đó chương trình chính sẽ thực thi giao dịch cụ thể—điều này rất quan trọng. Đặc biệt đối với các MCU công suất thấp, tốc độ thấp, cần đảm bảo đáp ứng kịp thời mọi sự gián đoạn.
4. Đối với việc sắp xếp các bộ phận nhiệm vụ khác nhau, các MCU khác nhau có cách xử lý khác nhau:
Ví dụ: đối với các ứng dụng MCU (Fosc=32768Hz) tốc độ thấp, công suất thấp, vì các dự án đó đều là thiết bị cầm tay và sử dụng màn hình LCD thông thường, nên phản hồi với các nút và màn hình đòi hỏi hiệu suất thời gian thực cao, do đó, thường bị gián đoạn theo thời gian. được sử dụng để xử lý các thao tác của nút và hiển thị dữ liệu; và đối với các MCU tốc độ cao, chẳng hạn như ứng dụng Fosc>1 MHz, vì MCU có đủ thời gian để thực thi phần thân vòng lặp chương trình chính tại thời điểm này nên nó chỉ có thể bị gián đoạn trong phần tương ứng Đặt các cờ kích hoạt khác nhau vào và đặt tất cả các nhiệm vụ trong phần thân chương trình chính để thực thi.
5. Trong thiết kế lập trình của MCU, một điểm nữa cần đặc biệt chú ý đó là:
Để ngăn chặn việc truy cập hoặc cài đặt đồng thời cùng một biến hoặc dữ liệu trong phần ngắt và phần thân chương trình chính. Một phương pháp phòng ngừa hiệu quả là sắp xếp việc xử lý dữ liệu đó trong một mô-đun và xác định xem có thực hiện hoạt động liên quan đến dữ liệu hay không bằng cách đánh giá cờ kích hoạt; trong khi ở các nội dung chương trình khác (chủ yếu là các ngắt), dữ liệu cần được xử lý Nơi xử lý chỉ đặt cờ được kích hoạt. - Điều này đảm bảo rằng việc thực thi dữ liệu có thể dự đoán được và duy nhất.
Kỹ năng phát triển vi điều khiển
1. Cách hạn chế lỗi trong chương trình
Để biết cách giảm lỗi chương trình, trước tiên bạn nên xem xét các tham số quản lý vượt quá phạm vi sau đây cần được xem xét trong quá trình vận hành hệ thống.
Thông số vật lý: Các thông số này chủ yếu là các thông số đầu vào của hệ thống, bao gồm các thông số kích thích, các thông số vận hành trong quá trình thu thập và xử lý và các thông số kết quả khi kết thúc quá trình xử lý.
Tham số tài nguyên: Các tham số này chủ yếu là tài nguyên của mạch, thiết bị và đơn vị chức năng trong hệ thống, chẳng hạn như dung lượng bộ nhớ, độ dài bộ lưu trữ và độ sâu xếp chồng.
Tham số ứng dụng: Các tham số ứng dụng này thường biểu thị các điều kiện ứng dụng của một số máy vi tính đơn chip và các đơn vị chức năng. Tham số quy trình: Đề cập đến các tham số thay đổi một cách có trật tự trong quá trình vận hành hệ thống.
2. Cách nâng cao hiệu quả mã lập trình ngôn ngữ C
Xu hướng tất yếu trong việc phát triển và ứng dụng máy vi tính đơn chip là sử dụng ngôn ngữ C để thiết kế chương trình máy vi tính đơn chip. Nếu muốn đạt hiệu quả cao nhất khi lập trình bằng C thì tốt nhất bạn nên làm quen với trình biên dịch C mà mình đang sử dụng. Đầu tiên hãy kiểm tra số dòng lệnh trong hợp ngữ tương ứng với từng ngôn ngữ C được biên dịch để bạn có thể biết rõ tính hiệu quả. Khi lập trình sau này, hãy sử dụng câu lệnh có hiệu quả biên dịch cao nhất. Mỗi trình biên dịch C sẽ có những khác biệt nhất định nên hiệu quả biên dịch cũng sẽ khác nhau. Độ dài mã và thời gian thực thi của trình biên dịch C hệ thống nhúng xuất sắc chỉ dài hơn 5-20% so với cùng cấp chức năng được viết bằng hợp ngữ.
Đối với những dự án phức tạp, thời gian phát triển eo hẹp thì có thể sử dụng ngôn ngữ C nhưng điều kiện tiên quyết là bạn đã rất quen thuộc với ngôn ngữ C và trình biên dịch C của hệ thống MCU và đặc biệt chú ý đến các kiểu dữ liệu, thuật toán mà hệ thống biên dịch C. có thể hỗ trợ. Mặc dù ngôn ngữ C là ngôn ngữ cấp cao phổ biến nhất nhưng hệ thống biên dịch ngôn ngữ C của các nhà sản xuất MCU khác nhau lại khác nhau, đặc biệt là trong hoạt động của một số mô-đun chức năng đặc biệt. Vì vậy nếu không hiểu rõ các tính năng này sẽ gặp rất nhiều vấn đề trong quá trình debug dẫn đến hiệu quả thực thi thấp hơn so với hợp ngữ.
3. Cách giải quyết vấn đề chống nhiễu của máy vi tính đơn chip Cách chống nhiễu hiệu quả nhất là loại bỏ nguồn nhiễu và cắt đứt đường nhiễu, nhưng thường rất khó thực hiện nên chỉ phụ thuộc vào khả năng chống nhiễu của máy vi tính đơn chip có đủ mạnh hay không. Bên cạnh việc nâng cao khả năng chống nhiễu của hệ thống phần cứng, việc chống nhiễu phần mềm còn nổi bật bởi thiết kế linh hoạt,