Thông báo

Collapse
No announcement yet.

Hai câu lệnh này khác gì nhau ah???

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

  • Hai câu lệnh này khác gì nhau ah???

    Chào 4rum!
    Em đang làm về giao tiếp SPI giữa các AVR bàng code C vs codevision.Em đang vướng dòng lệnh mà chưa rõ sao không truyền đứoc từ Maste-->Slave.
    4rum cho em hỏi 2 câu lệnh này khác gì nhau không ah:
    1) while(!SPIF);
    2) while ((SPSR & (1<<SPIF))==0);
    Theo em nghĩlaf cả 2 câu lệnh này là đều chờ cờ báo SPIF=1, báo quá trình truyền kết thúc. Nhưng lạ quá,chỉ câu lệnh 2 mới truyền được,còn câu 1 sửa kại là While(SPIF);//cho bit SPIF==0 thì lại được.
    Không hiểu nguyên nhân....
    Xin các bạn chỉ giúp.
    Cảm ơn!
    Gian Khó Cuộc Đời Nuôi Ta Lớn!
    Giang Hồ Đẫm Máu Dạy Ta Khôn!

    (@_@)______________(@_@)

  • #2
    vi khi do SPIF của em là là '0' nen while(SPIF) khônng hoat động.
    Tư vấn thiết kế hệ thống điện-điện tử theo yêu cầu.
    Tel: 0903 702 417. Email: web:

    Comment


    • #3
      while(!SPIF) // trong khi SPIF khác 1 thì thực hiện nên cho bằng 0 nó thực hiện đúng thôi
      while(SPIE) // trong khi SPIF bằng 1 thì thực hiện
      Đối với Tôi Đam mê là yếu tố không thể thiếu để quyết định sự Thành Công ...!
      Gmail: -Mobile: 0989.194.472

      Comment


      • #4
        1) while(!SPIF);
        hoặc 2) while ((SPSR & (1<<SPIF))==0);
        Last edited by toan88_tnt; 28-10-2011, 11:41. Lý do: lỗi font
        Gian Khó Cuộc Đời Nuôi Ta Lớn!
        Giang Hồ Đẫm Máu Dạy Ta Khôn!

        (@_@)______________(@_@)

        Comment


        • #5
          1) while(!SPIF);
          hoặc 2) while ((SPSR & (1<<SPIF))==0);
          Last edited by toan88_tnt; 28-10-2011, 11:41. Lý do: lỗi font
          Gian Khó Cuộc Đời Nuôi Ta Lớn!
          Giang Hồ Đẫm Máu Dạy Ta Khôn!

          (@_@)______________(@_@)

          Comment


          • #6
            vấn đề???

            thank mng đã reply,.
            đây là đoạn code chuơng trình con truyền SPI từ master:
            void tran(int ss(i),unsigned int data)// truyen data tới slave thứ i qua SPI
            {
            select(PORTB,ss(i)); //chon slave, chân ss trên slave i =0;
            SPDR=data; //ghi data cần truyền
            1) while(!SPIF);
            hoặc 2) while ((SPSR & (1<<SPIF))==0);
            //cả 2 câu lệnh này (1 và 2) đều nghĩa là chờ bit SPIF set=1 thì thực hiện lệnh dưới???
            Nselect(PORTB,ss(i)); //bỏ chọn slave, chân ss trên slave thứ i =1
            }


            vấn đề em là nếu dùng lệnh 1 thì ko đc, lệnh 2 thì ok,mà e hiểu 2 lệnh này ý nghĩa như nhau? phải ko?
            Thank4rum!
            Gian Khó Cuộc Đời Nuôi Ta Lớn!
            Giang Hồ Đẫm Máu Dạy Ta Khôn!

            (@_@)______________(@_@)

            Comment


            • #7
              lệnh 1 thì là vậy, lệnh 2 thì nó so sánh kết quả của phép & : nếu bit thứ "SPIF" ( 0x01 trái SPIF lần) của thanh ghi SPSR cũng = 1 thì nó cho ra kết quả =1, còn lại cho ra kết quả 0, khác hẳn nhau chứ ( Mọi ng xem đúng không nhỉ?
              Last edited by thiennv0109; 28-10-2011, 21:52.
              Đối với Tôi Đam mê là yếu tố không thể thiếu để quyết định sự Thành Công ...!
              Gmail: -Mobile: 0989.194.472

              Comment


              • #8
                Gian Khó Cuộc Đời Nuôi Ta Lớn!
                Giang Hồ Đẫm Máu Dạy Ta Khôn!

                (@_@)______________(@_@)

                Comment


                • #9
                  bit SPIF chi co thể =0 hoặc 1. Bit này bằng không khi Master truyền xong.
                  Nếu: SPIF=1,thì 1<<SPIF =1000 000 //vì #define SPIF=7;--->SPSR&SPIF=1000 000 khác 0-->>chuơng trình nthoat khỏi câu lệnh while ((SPSR & (1<<SPIF))==0); để đến lệnh phía sau.
                  Nếu: SPIF=0--->>SPSR&SPIF=0-->chương trình lặp tại chỗ,không thực hiện được lệnh dưới.
                  -->Vậy câu lệnh while((SPSR&(1<<SPIF)==0); nghĩa là khi bit SPIF=1 thì thực hiện lệnh phía sau.
                  Còn câu lệnh while(!SPIF); nghĩa là khi SPIF=0-->!SPIF=1; lặp tại chỗ. Còn khi SPIF=1-->!SPIF=0-->thoát vòn lặp while-->thực hiện lệnh sau.
                  Vậy không phải hai lệnh này ý nghĩa như nhau sao?t suy luân thế ntn?
                  Xin chỉ giúp!
                  Gian Khó Cuộc Đời Nuôi Ta Lớn!
                  Giang Hồ Đẫm Máu Dạy Ta Khôn!

                  (@_@)______________(@_@)

                  Comment


                  • #10
                    Đã định nghĩa #define SPIF=7; thì trong câu lệnh này giá trị SPIF có thay đổi nữa ko while(!SPIF);
                    Người ta hay viết while(SPIF == 1); hoặc while(SPIF == 0); chứ ko viết while(!SPIF);

                    Comment


                    • #11
                      while ((SPSR & (1<<SPIF))==0);
                      Câu lệnh này bạn xem trong tài liệu nào thế ( bit SPIF là bit 7 trong thanh ghi SPSR, nếu chỉ kiểm tra bit này chưa set thì chỉ cần " while(!SPIF) ( nếu SPIF khác 1) hoặc while(SPIF==0) là ok.
                      Còn cái câu lệnh trên: bạn bảo bit SPIF định nghĩa "#define SPIF 7" thì nó là byte rồi bạn, số 7 chỉ mang ý nghĩa tượng trưng cho bit thứ 7, và khi đó bạn không thể dùng được lệnh while(!SPIF) hay while(SPIF==0) - lúc nào 7 cũng khác 1 và 7 không bao giờ =0 rồi còn kiểm tra được gì nhỉ
                      - phân tích phép toán trên:
                      + 1<<SPIF <=> 0b00000001<<7 => kết quả phép toán dịch trái này cho giá trị byte = 0b10000000.
                      + SPSR & (1<<SPIF) <=> 0bxyyyyyyy & 0b10000000 => kết quả phép toán này cho giá trị =0 khi bit x mang giá trị 0 và đảm bảo các bit y cũng bằng 0

                      T cũng có một ví dụ này:

                      void SpiMem(unsigned char DataSpi)
                      {
                      unsigned char i;
                      for(i=0x80;i!=0;i>>=1)
                      {
                      PORTB.5=DataSpi&i;
                      CLK=0;
                      CLK=1;
                      };
                      }


                      Các bạn thử xem điều kiện để PORTB.5=0 và PORTB.5=1 là gì nhỉ ? ( vui học một tí ^^)
                      Last edited by thiennv0109; 28-10-2011, 22:43.
                      Đối với Tôi Đam mê là yếu tố không thể thiếu để quyết định sự Thành Công ...!
                      Gmail: -Mobile: 0989.194.472

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X