Mục lục:

Attiny85 Lập trình đồng thời hoặc Bí ngô với Mắt nhiều màu: 7 bước
Attiny85 Lập trình đồng thời hoặc Bí ngô với Mắt nhiều màu: 7 bước

Video: Attiny85 Lập trình đồng thời hoặc Bí ngô với Mắt nhiều màu: 7 bước

Video: Attiny85 Lập trình đồng thời hoặc Bí ngô với Mắt nhiều màu: 7 bước
Video: [Lập Trình Nuvoton] Bài 8: Watchdog timer 2024, Tháng mười một
Anonim

Theo jumbleviewJumbleview.info

Tiếng hét
Tiếng hét
Tiếng hét
Tiếng hét
Thay thế pin NiCd bằng nguồn điện bên ngoài
Thay thế pin NiCd bằng nguồn điện bên ngoài
Thay thế pin NiCd bằng nguồn điện bên ngoài
Thay thế pin NiCd bằng nguồn điện bên ngoài
Tay cầm máy ảnh kỹ thuật số
Tay cầm máy ảnh kỹ thuật số
Tay cầm máy ảnh kỹ thuật số
Tay cầm máy ảnh kỹ thuật số

Giới thiệu: Tôi làm kỹ sư phần mềm tại một trong những công ty ở Bay Area (California). Bất cứ khi nào tôi có thời gian, tôi thích lập trình bộ điều khiển vi mô, chế tạo đồ chơi cơ khí và thực hiện một số dự án cải thiện nhà cửa. Thêm về jumbleview »

Dự án này chỉ ra cách điều khiển hai đèn LED cực dương phổ biến 10mm ba màu (mắt nhiều màu của Pumpkin Halloween Glitter) bằng chip Attiny85. Mục tiêu của dự án là giới thiệu cho người đọc nghệ thuật lập trình đồng thời và cách sử dụng thư viện protothreads của Adam Dunkels. Dự án này giả định rằng người đọc biết về bộ điều khiển AVR 8-bit, có thể viết một số chương trình C và có một số kinh nghiệm với Atmel studio.

Mã dự án được xuất bản trên GitHub:

Quân nhu

Trước khi lập trình người ta vẫn cần xây dựng mạch. Đây là các thành phần:

  • Bộ điều khiển Attiny85 (bất kỳ nhà cung cấp điện tử nào).
  • Hai đèn LED 10mm ba màu với cực dương chung. Đèn LED Adafruit
  • Điện trở 100 Ohm, 120 Ohm, 150 Ohm 0,125 hoặc 0,250 Wt (bất kỳ nhà cung cấp điện tử nào).
  • Tiêu đề Sáu Pin cho giao diện AVR ISP. Có thể được tạo từ tiêu đề Adafruit này
  • Một số bảng bánh mì hoặc bảng mẫu in. Tôi đã sử dụng cái này
  • Giao diện AVR ISP MKII và Atmel Studio 6.1 (Phiên bản sau cũng hoạt động tốt).

Bước 1: Cắt

Cắt xén
Cắt xén

Thiết kế sử dụng năm chân chip:

  • Hai chân dùng để điều khiển cực dương: mỗi cực dương LED gắn vào chân chuyên dụng.
  • Ba chân gắn (thông qua điện trở) vào cực âm của đèn LED (cực âm cùng màu của mỗi đèn LED được gắn vào cùng một chân)

Một người sẽ hỏi: tại sao không sử dụng tất cả sáu chân vào / ra của chip để các cực dương của LED sẽ được kết nối trực tiếp với +5 v và mỗi cực âm sẽ có chân chuyên dụng của nó? Điều đó sẽ làm cho việc lập trình trở nên đơn giản. Than ôi, có một vấn đề: chân PB5 (RESET) là một chân yếu có khả năng cung cấp dòng điện chỉ ~ 2 mA, trong khi cần phải có ~ 20 mA.

Tất nhiên người ta có thể xây dựng bộ khuếch đại bóng bán dẫn cho chân yếu này nhưng bản thân tôi bất cứ khi nào có thể thích giải quyết vấn đề mã.

Bước 2: Sơ đồ thời gian

Sơ đồ thời gian
Sơ đồ thời gian

Sơ đồ thời gian giúp chúng ta hiểu những gì chúng ta cần lập trình.

Hai hàng trên cùng trên sơ đồ cho thấy sự thay đổi điện áp trên các cực dương của đèn LED. Điện áp trên các chân kết nối với cực dương của LED dao động với tần số ~ 250 Hz. Dao động điện áp này đối với đèn LED bên trái ngược lại với dao động của đèn LED bên phải. Khi điện áp trên cực dương cao, đèn LED tương ứng có thể sáng. Khi nó ở mức thấp, đèn LED tương ứng sẽ tối. Điều đó có nghĩa là mỗi đèn LED có thể sáng trong khoảng thời gian 2 mili giây và tối trong khoảng thời gian 2 mili giây khác. Do mắt người có một số quán tính nên người quan sát không nhận thấy nhấp nháy 250 Hz. Ba hàng dưới cùng trên sơ đồ cho thấy sự thay đổi điện áp trên các chân kết nối với cực âm của đèn LED. Chúng ta hãy xem trên cột sơ đồ đầu tiên. Nó hiển thị trường hợp khi đèn LED bên trái có màu đỏ và đèn LED bên phải có màu xanh lục. Ở đây cực âm ĐỎ luôn ở mức thấp trong khi cực dương bên trái ở mức cao, cực âm XANH ở mức thấp trong khi cực dương bên phải ở mức cao và cực âm XANH luôn ở mức thấp. Các cột khác trên sơ đồ cho thấy sự kết hợp của điện áp cực âm và cực dương cho nhiều màu sắc khác nhau.

Như chúng ta có thể thấy, có sự phụ thuộc lẫn nhau vào trạng thái chân. Nếu không có một số khuôn khổ, nó sẽ không dễ dàng để giải quyết. Và đó là nơi mà thư viện protothread có ích.

Bước 3: Lập trình. Macro và định nghĩa

Lập trình. Macro và định nghĩa
Lập trình. Macro và định nghĩa

Ví dụ trong các bước lập trình đại diện cho phiên bản đơn giản hóa một chút. Chương trình được rút ngắn và một số định nghĩa tượng trưng được thay thế bằng các hằng số rõ ràng.

Chúng ta hãy bắt đầu lại từ đầu. Chương trình bao gồm các tệp đi kèm với Atmel Studio cũng như tiêu đề thư viện protothread. Tiếp theo có hai macro để thao tác các mức chân và một số định nghĩa để đặt tên hợp lý cho tín hiệu chân. Cho đến nay không có gì đặc biệt.

Bước 4: Lập trình. Vòng lặp chính

Lập trình. Vòng lặp chính
Lập trình. Vòng lặp chính

Sau đó, chúng ta hãy nhìn vào phần cuối để xem thủ tục chính chứa những gì.

Hàm main sau khi thực hiện một số khởi tạo vẫn ở trong vòng lặp mãi mãi. Trong vòng lặp đó, nó thực hiện các bước tiếp theo:

  • Gọi quy trình protothread cho đèn LED bên trái. Nó thay đổi một số điện áp chân.
  • Chậm trễ hai mili giây. Không có sự thay đổi về điện áp chân.
  • Gọi protothread cho đèn LED phù hợp. Nó thay đổi một số điện áp pin.
  • Làm trễ 2 MS. Không có sự thay đổi trong điện áp chân.

Bước 5: Lập trình. Chức năng phụ

Lập trình. Chức năng phụ
Lập trình. Chức năng phụ

Trước khi bắt đầu thảo luận về protothreads, chúng ta cần xem xét một số hàm trợ giúp. Đầu tiên, có các chức năng để thiết lập màu cụ thể. Họ thẳng thắn. Có rất nhiều chức năng như số lượng màu được hỗ trợ (bảy) và một chức năng nữa để đặt đèn LED tối (NoColor).

Và có một hàm nữa sẽ được gọi trực tiếp bởi quy trình protothread. Tên của nó là DoAndCountdown ().

Về mặt kỹ thuật, việc sử dụng một chức năng như vậy là không bắt buộc nhưng tôi thấy nó rất tiện lợi. Nó có ba đối số:

  • Con trỏ đến màu LED cài đặt chức năng (như RedColor hoặc GreenColor hoặc v.v.)
  • Giá trị ban đầu của bộ đếm ngược: số lần hàm này phải được gọi ở giai đoạn protothread cụ thể.
  • Con trỏ để đảo ngược bộ đếm. Giả sử rằng khi có sự thay đổi về màu sắc thì bộ đếm ngược là 0, vì vậy lúc đầu mã lặp sẽ gán cho giá trị ban đầu của bộ đếm đó. Sau mỗi lần lặp lại bộ đếm giảm dần.

Hàm DoAndCountdown () trả về giá trị của bộ đếm ngược.

Bước 6: Lập trình. Quy trình Protothread

Lập trình. Quy trình Protothread
Lập trình. Quy trình Protothread

Và đây là cốt lõi của khuôn khổ: quy trình protothread. Vì đơn giản, ví dụ chỉ giới hạn trong ba bước: để thay đổi màu sắc thành ĐỎ, XANH LÁ, và XANH LÁ.

Hàm được gọi với hai đối số:

  • Con trỏ tới cấu trúc protothread. Cấu trúc đó được khởi tạo bởi main trước khi vòng lặp chính bắt đầu.
  • Con trỏ để đảo ngược bộ đếm. Nó được đặt thành 0 bởi main trước khi vòng lặp chính bắt đầu.

Chức năng đặt điện áp để làm cho đèn LED bên trái hoạt động và sau đó bắt đầu phân đoạn protothread. Phân đoạn này nằm giữa macro PT_BEGIN và PT_END. Bên trong có một số mã mà trong trường hợp của chúng tôi chỉ lặp lại các macro PT_WAIT_UNTIL. Macro này thực hiện tiếp theo:

  • Lời gọi hàm DoAndCountdown. Điều đó đặt điện áp trên catốt LED để phát ra màu cụ thể.
  • Kết quả trả về được so sánh với 0. Nếu điều kiện là 'sai', hàm protothread ngay lập tức trả về và mang lại quyền điều khiển cho vòng lặp chính.
  • Khi protothread được gọi vào lần tiếp theo, nó lại thực thi mã trước PT_BEGIN, sau đó nhảy trực tiếp vào bên trong các macro PT_WAIT_UNTIL mà từ đó nó đã trả về lần trước.
  • Các hành động như vậy lặp lại cho đến khi kết quả của DoAndCountdown là 0. Trong trường hợp đó không có trả về, chương trình vẫn ở trong protothread và thực hiện dòng tiếp theo của mã. Trong trường hợp của chúng tôi, đó là PT_WAIT_UNTIL tiếp theo nhưng nói chung nó có thể là bất kỳ mã C nào.
  • Tại lần thực thi đầu tiên của bộ đếm ngược PT_WAIT_UNTIL thứ hai là 0, vì vậy thủ tục DoAndCountdown () đặt nó thành giá trị ban đầu. Macro thứ hai một lần nữa sẽ được thực hiện 250 lần cho đến khi bộ đếm đảo ngược về 0.
  • Trạng thái của pt cấu trúc được đặt lại ngay sau khi quyền kiểm soát đạt đến macro PT_END. Khi hàm protothread được gọi vào lần tiếp theo phân đoạn protothread bắt đầu thực thi dòng mã ngay sau PT_BEGIN.

Có quy trình xử lý protothread tương tự đối với đèn LED bên phải. Trong ví dụ của chúng tôi, nó chỉ thực thi thứ tự các màu khác nhau, nhưng nếu chúng tôi có thể làm điều đó hoàn toàn khác: không có sự kết hợp chặt chẽ giữa quy trình LED bên trái và bên phải.

Bước 7: Nội bộ

Nội bộ
Nội bộ

Toàn bộ chương trình ít hơn 200 dòng mã (với chú thích và dòng trống) và chiếm ít hơn 20% bộ nhớ mã Attiny85. Nếu cần, có thể sử dụng ở đây nhiều quy trình protothread hơn và gán logic phức tạp hơn nhiều cho chúng.

Thư viện Protothreads là hình thức đơn giản nhất của lập trình đồng thời trên máy tính. Lập trình đồng thời là một cách tiếp cận cho phép chia chương trình thành các phần hợp lý: đôi khi chúng được gọi là coroutines, đôi khi là luồng, đôi khi là nhiệm vụ. Nguyên tắc là mỗi tác vụ như vậy có thể chia sẻ cùng một sức mạnh bộ xử lý trong khi vẫn giữ mã tuyến tính hơn hoặc ít hơn và độc lập với các phần khác. Các nhiệm vụ theo quan điểm logic có thể được thực hiện đồng thời.

Đối với hệ thống nâng cao, các điều khiển của các tác vụ như vậy được thực hiện bởi nhân hệ điều hành hoặc bởi thời gian chạy ngôn ngữ được nhúng vào tệp thực thi bằng trình biên dịch. Nhưng trong trường hợp ứng dụng protothreads, lập trình viên điều khiển nó theo cách thủ công bằng cách sử dụng thư viện macro protothreads trong các quy trình tác vụ và gọi các quy trình đó (thường là ngoài vòng lặp chính).

Bạn có thể muốn biết protothread thực sự hoạt động như thế nào? Điều kỳ diệu ẩn ở đâu? Protothreads dựa vào tính năng đặc biệt của ngôn ngữ C: thực tế là câu lệnh C switch có thể được nhúng vào if hoặc một số khối khác (như while hoặc for). Thông tin chi tiết bạn có thể tìm thấy trên trang web Adam Dunkels

Các thiết bị điện tử bên trong của dự án này rất đơn giản. Ảnh trên cung cấp cho bạn một số manh mối. Tôi chắc chắn bạn có thể làm tốt hơn.

Đề xuất: