Thông báo

Collapse
No announcement yet.

Sử dụng struct trong lập trình avr

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Sử dụng struct trong lập trình avr

    Xin hỏi các cao thủ. Em đang lập trình điều khiển động cơ DC. Em viết kiểu dữ liệu cho động cơ như sau:
    struct Motor
    {
    unsigned char speed;
    bit direction;
    bit active;
    } LeftMotor;

    Nếu em muốn gắn giá trị của LeftMotor.direction vào một chân nào đó ví như "PORTD.4" chằng hạn vậy thì làm thế nào để khi em thay đổi giá trị của LeftMotor.direction trong bài lập trình của em thì giá trị của PORTD.4 tự động thay đổi ?

  • #2
    Ví dụ muốn khai báo PD4 là direction thì có thể dùng
    #define PORTD.4 direction

    Còn dùng struct thì chưa nghĩ ra.
    AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
    Xem thêm tại Online Store ---> Click here
    Mob: 0982.083.106

    Comment


    • #3
      #define PORTD.4 LeftMotor.direction

      Sông dài, Thuyền lớn, Biển rộng bao la.
      Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

      Comment


      • #4
        Nguyên văn bởi dinhquang Xem bài viết
        Xin hỏi các cao thủ. Em đang lập trình điều khiển động cơ DC. Em viết kiểu dữ liệu cho động cơ như sau:
        struct Motor
        {
        unsigned char speed;
        bit direction;
        bit active;
        } LeftMotor;

        Nếu em muốn gắn giá trị của LeftMotor.direction vào một chân nào đó ví như "PORTD.4" chằng hạn vậy thì làm thế nào để khi em thay đổi giá trị của LeftMotor.direction trong bài lập trình của em thì giá trị của PORTD.4 tự động thay đổi ?
        struct Motor
        {
        unsigned char speed:4;
        unsigned char direction:1;
        unsigned char active:1;
        } LeftMotor @ Địa chỉ PORTD;
        Như vậy khi nào thay đổi speed là thay đổi PORTD.0...3, direction là PORTD.4, active là PORTD.5
        Last edited by hightech_uc; 19-12-2008, 13:28.
        |

        Comment


        • #5
          cảm ơn các bác. nhưng nếu như em muốn dành cả byte để chứa biến speed( ví dụ như thanh ghi OCRA1L chẳng hạn) còn các biến direction và active là các biến bit thế thì cách của bác hitech_us không dùng được rồi. còn cách của bác VNarmy và bác quoc_thaibk thì nếu mỗi lần em khai báo thêm một biết kiểu motor em lại phải khai báo #define cho từng biến một. thế thì bất tiện quá

          Comment


          • #6
            Nguyên văn bởi dinhquang Xem bài viết
            cảm ơn các bác. nhưng nếu như em muốn dành cả byte để chứa biến speed( ví dụ như thanh ghi OCRA1L chẳng hạn) còn các biến direction và active là các biến bit thế thì cách của bác hitech_us không dùng được rồi. còn cách của bác VNarmy và bác quoc_thaibk thì nếu mỗi lần em khai báo thêm một biết kiểu motor em lại phải khai báo #define cho từng biến một. thế thì bất tiện quá
            Sài union.Ví dụ:
            Union{
            Unsigned char BYTE;
            Struct{
            Unsigned char NAME_VAR1:1; //1 là 1 bit
            unsigned char NAME_VAR2:2;//2 là 2 bit
            ...
            }BIT;
            }NAME_PORT;
            vậy là có thể vừa sài dc BYTE vừa sài dc BIT.
            The goal of power electronics is control the flow of energy from an electrical source to an electrical load with high efficiency, high availability, high reliability, light weight and low cost.

            Comment


            • #7
              Ngay trong code của bạn cũng phải khởi tạo sự liên kết lúc đầu
              bạn đang lập trình trên C chứ không phải lập trình hướng đối tượng mà yêu cầu có sự initialization.

              Bản thân người lập trình cấu trúc quản lý khá nhiều so với viết chươgn trình trên các nền như .NET hay VStudio.

              Sông dài, Thuyền lớn, Biển rộng bao la.
              Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

              Comment


              • #8
                Nguyên văn bởi chestnut Xem bài viết
                Sài union.Ví dụ:
                Union{
                Unsigned char BYTE;
                Struct{
                Unsigned char NAME_VAR1:1; //1 là 1 bit
                unsigned char NAME_VAR2:2;//2 là 2 bit
                ...
                }BIT;
                }NAME_PORT;
                vậy là có thể vừa sài dc BYTE vừa sài dc BIT.
                Em đang nghiên cứu cách này. Em chưa hiểu lắm. Theo em biết thì union là cho các biến share cùng một địa chỉ ô nhớ vậy thì khi em khai báo nhiều biến liệu có xảy ra tranh chấp không nhỉ.

                Comment


                • #9
                  Nguyên văn bởi dinhquang Xem bài viết
                  Em đang nghiên cứu cách này. Em chưa hiểu lắm. Theo em biết thì union là cho các biến share cùng một địa chỉ ô nhớ vậy thì khi em khai báo nhiều biến liệu có xảy ra tranh chấp không nhỉ.
                  Tại sao lại xảy ra tranh chấp?Tranh chấp cái gì?Bạn có hiểu vấn đề không vậy?
                  The goal of power electronics is control the flow of energy from an electrical source to an electrical load with high efficiency, high availability, high reliability, light weight and low cost.

                  Comment


                  • #10
                    Em nhầm. Nhưng mà dùng union thì cái trường bít của mình nhất thiết phải là các bit 0,1... theo thứ tự của cái port mình gán. Nhưng nếu em muốn gán các bít này vào các chân bất kì thì không được.

                    Cho em hỏi thêm là khi mình muốn truyền các giá trị kiểu bít cho các hàm thì làm thế nào nhỉ. Em viết chương trình trong codevision mà nó báo lỗi là biết kiểu bit không hỗ trợ...

                    Comment

                    Về tác giả

                    Collapse

                    dinhquang Tìm hiểu thêm về dinhquang

                    Bài viết mới nhất

                    Collapse

                    Đang tải...
                    X