Title Image

Blog Logo

State Machine in Embedded (2)

 🌱 State Machine in Embedded (2)

    Post trước mình đã giới thiệu với các bạn về State Machine và một ví dụ cần sử dụng State Machine trong hệ thống nhúng. Ở Post này mình sẽ tiếp tục giải thích về State Machine cũng như ví dụ về cách triển khai nó trong chương trình nhúng. 

    👉 State Machine

    Các bạn nên đọc lại Post trước để nắm được cơ bản về State Machine và bài toán mà mình sẽ triển khai trong bài viết này.

     State Machine in Embedded (1)

    Trở lại với sơ đồ khối ở Post trước mình đã giới thiệu, một sơ đồ mà chúng ta có 3 ô tròn biểu thị cho 3 trạng thái chính của chương trình:

     Trạng thái nhập mật khẩu, 
    ⓶ Trạng thái xe chạy sau khi nhập mật khẩu đúng, 
    ⓷ Trạng thái đổi mật khẩu. 

Examples

    Các mũi tên nối giữa các trạng thái chính là những điều kiện để chuyển trạng thái, cũng như các sự kiện có trong chương trình: 

  • Khi đang ở trạng thái nhập Pass, nếu nhập pass đúng, chương trình sẽ chuyển sang trạng thái 2 là Xe chạy.
    Nếu nhập pass sai thì chương trình vẫn sẽ ở lại trạng thái 1. Nhập Pass. 
    Còn nếu bấm nút đổi Pass, chương trình sẽ chuyển sang trạng thái đổi Pass.
  • Khi ở trạng thái 2. Xe chạy, chương trình không thể làm những việc khác như nhập pass hay đổi pass nữa. Lúc này, chỉ khi chương trình bị Reset (tức là Xe tắt máy) thì nó mới trở về trạng thái ban đầu đó là 1. Nhập Pass.
  • Khi ở trạng thái đổi Pass, nếu đổi pass thành công hoặc reset, chương trình sẽ quay trở về trạng thái 1. Nhập Pass.
    OK, đó chính là những gì cơ bản nhất về State Machine, và nếu chương trình có nhiều trạng thái hơn cũng như nhiều điều kiện chuyển đổi hơn, chúng ta cũng sẽ triển khai vẽ sơ đồ khối như trên. Việc thiết kế này rất có lợi cho việc triển khai bằng chương trình code như ví dụ sau đây!

    👉 Triển khai State Machine

    Sau khi đã có thiết kế sơ đối khối như phần trên, chúng ta cần tìm cách triển khai chúng bằng chương trình code. Các triển khai phổ biến nhất mà mình muốn giới thiệu với các bạn đó là sử dụng một biến trạng thái + Câu lệnh rẽ nhánh Switch-Case để kiểm tra biến trạng thái đó. 

    Lí do là vòng lặp while(1) sẽ lặp đi lặp lại chương trình, và sẽ liên tục kiểm tra biến trạng thái của chương trình. Tại một thời điểm, biến trạng thái chỉ có một giá trị, vì vậy, chương trình sẽ chỉ sử dụng code của một trạng thái mà bỏ qua phần code của những trạng thái khác, đúng như những yêu cầu ban đầu của bài toán. 

    Vậy hãy thử triển khai bài toán theo luồng sau: 

  1. Define các trạng thái của chương trình như dưới đây, trạng thái ban đầu của chương trình sẽ là PASSWORD_CHECKING.

    define status

  2. Sử dụng câu lệnh rẽ nhánh Switch-Case để triển khai các trạng thái của chương trình, mình tóm tắt ở dưới đây, tuân theo sơ đồ khối ở trên. 

    Implement

  3. Trong trường hợp này, việc chuyển đổi sang trạng thái CHANGE_PASSWORD từ trạng thái PASSWORD_CHECKING là cần thực hiện ngay lập tức, vậy nên mình dùng thêm một ngắt ngoài để xử lý trường hợp này.
    *** Lưu ý là khi RUN MODE chúng ta không thể chuyển qua trạng thái CHANGE_PASSWORD.

    CHANGE_PASSWORD
    OK, vậy là xong, trong quá trình viết code chúng ta có thể sửa đổi tiếp để phù hợp hơn với yêu cầu bài toán. Bài toán này các bạn  có thể tham khảo code chi tiết tại đây, mình triển khai code trên vi điều khiển ATmega16 sử dụng phần mềm Code Vision AVR, phần mềm mô phỏng Proteus.

    Chi tiết các bạn DOWNLOAD CODE TẠI ĐÂY!

    Video mô phỏng kết quả Project trên:


>>>= Follow ngay =<<<

💚 Kênh Youtube Lập trình - Điện tử 💚

Để nhận được những bài học miễn phí mới nhất nhé 😊

    Chúc các bạn học tập tốt 😊


Xem Bài State Machine (1)

Đăng nhận xét

0 Nhận xét