Thông báo

Collapse
No announcement yet.

Thắc mắc cần giúp đỡ về vòng lặp while(1) trong avr

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

  • Thắc mắc cần giúp đỡ về vòng lặp while(1) trong avr

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    int main(void){
           DDRB=0xFF;                //PORTB la output PORT
           PORTB=0x00;
    
           TCCR0=(1<<CS01);// CS02=0, CS01=1, CS00=0: chon Prescaler = 8
           TCNT0=131;              //gan gia tri khoi tao cho T/C0
           TIMSK=(1<<TOIE0);//cho phep ngat khi co tran o T/C0
           sei();                       //set bit I cho phep ngat toan cuc
    
     #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    int main(void){
           DDRB=0xFF;                //PORTB la output PORT
           PORTB=0x00;
    
           TCCR0=(1<<CS01);// CS02=0, CS01=1, CS00=0: chon Prescaler = 8
           TCNT0=131;              //gan gia tri khoi tao cho T/C0
           TIMSK=(1<<TOIE0);//cho phep ngat khi co tran o T/C0
           sei();                       //set bit I cho phep ngat toan cuc
    
           while (1){           //vòng lặp vô tận 
                  //do nothing
           }
           return 0;
    }
    
    //trinh phuc vu ngat tran T/C0
    ISR (TIMER0_OVF_vect ){       
           PORTB ^=1;  //doi trang thai Bit PB0
           TCNT0=131; //gan gia tri khoi tao cho T/C0
    }
    }
    
    //trinh phuc vu ngat tran T/C0
    ISR (TIMER0_OVF_vect ){       
           PORTB ^=1;  //doi trang thai Bit PB0
           TCNT0=131; //gan gia tri khoi tao cho T/C0
    }
    Mình mới tìm hiểu AVR trong trang hocavr.com
    Bạn nào giải thích dùm mình ý nghĩa lệnh while(1) (do nothing) này có ý nghĩa được không ? Xin cảm ơn nhiều.
    Code:
          while (1){           //vòng lặp vô tận 
                  //do nothing
           }
           return 0;
    }
    |

  • #2
    " do nothing " là làm gì??? nó nói rõ thế còn hỏi.

    Comment


    • #3
      theo tôi học MSP430 thì cái lệnh while(1) là lệnh lặp vô hạn -> trong trường hợp đoạn code trên thì chương trình sẽ không làm gì trong khi chờ timer tràn. Khi có cờ tràn thì chuyển đến chuơg trình con phục vu ngắt. AVR chắc cũng giống như vậy

      Comment


      • #4
        while(1) {//do nothing}
        vòng lặp while(//dieu kien){//cau lenh}: khi điều kiện là "đúng" thì các lệnh trong vòng lặp while sẽ được thực hiện,sau khi thực hiện xong sẽ kiểm tra lại điều kiện,
        nếu đúng thực hiện tiếp, sai thì thoát khỏi vòng lặp.
        ở đây while(1){}, tức là luôn đúng, mà đúng thì thực hiện lệnh trong vòng lặp while, mà trong vòng lặp while không có lệnh nào, thì có nghĩa chẳng làm gì cả, cứ xoay vòng một chỗ.
        khi nào xẩy ra ngắt (ở đây là tràn timer 0) thì thực hiện trình phục vụ ngắt (ISr của timer 0) xong đấy lại quay về while(), lại xoay vòng tiếp, lại chờ ngắt tiếp.

        Comment


        • #5
          Nguyên văn bởi ktuan89 Xem bài viết
          Code:
          #include <avr/io.h>
          #include <avr/interrupt.h>
          #include <util/delay.h>
          
          int main(void){
                 DDRB=0xFF;                //PORTB la output PORT
                 PORTB=0x00;
          
                 TCCR0=(1<<CS01);// CS02=0, CS01=1, CS00=0: chon Prescaler = 8
                 TCNT0=131;              //gan gia tri khoi tao cho T/C0
                 TIMSK=(1<<TOIE0);//cho phep ngat khi co tran o T/C0
                 sei();                       //set bit I cho phep ngat toan cuc
          
           #include <avr/io.h>
          #include <avr/interrupt.h>
          #include <util/delay.h>
          
          int main(void){
                 DDRB=0xFF;                //PORTB la output PORT
                 PORTB=0x00;
          
                 TCCR0=(1<<CS01);// CS02=0, CS01=1, CS00=0: chon Prescaler = 8
                 TCNT0=131;              //gan gia tri khoi tao cho T/C0
                 TIMSK=(1<<TOIE0);//cho phep ngat khi co tran o T/C0
                 sei();                       //set bit I cho phep ngat toan cuc
          
                 while (1){           //vòng lặp vô tận 
                        //do nothing
                 }
                 return 0;
          }
          
          //trinh phuc vu ngat tran T/C0
          ISR (TIMER0_OVF_vect ){       
                 PORTB ^=1;  //doi trang thai Bit PB0
                 TCNT0=131; //gan gia tri khoi tao cho T/C0
          }
          }
          
          //trinh phuc vu ngat tran T/C0
          ISR (TIMER0_OVF_vect ){       
                 PORTB ^=1;  //doi trang thai Bit PB0
                 TCNT0=131; //gan gia tri khoi tao cho T/C0
          }
          Mình mới tìm hiểu AVR trong trang hocavr.com
          Bạn nào giải thích dùm mình ý nghĩa lệnh while(1) (do nothing) này có ý nghĩa được không ? Xin cảm ơn nhiều.
          Code:
                while (1){           //vòng lặp vô tận 
                        //do nothing
                 }
                 return 0;
          }
          Bình thường dòng code trong while(1) này thì chip sẽ chạy hết dòng lệnh rồi quay lại. Trường hợp này ko có dòng code nào thì chip chỉ chạy ngắt thôi.
          Sống là để chiến đấu

          Comment


          • #6
            Hiểu vong while(1) rồi nhưng mình thắc mắc không biết tại sao lại phải dùng vòng lặp vô tận, nếu không lặp vô tận thì sẻ như thế nào. Topic đã lâu. không biết còn ai gip không???????

            Comment


            • #7
              Vòng while(1) để nhắc con vi điều khiển là "cứ nghỉ ở đây, tý nữa có việc đấy" để con vi điều khiển nó biết "À giờ không có việc nhưng có thể có việc bất ngờ, thôi cứ nhẩy ở đây tý có việc rồi làm" chứ nếu không có while(1) để nhắc thì con vi điều khiển nó nghĩ " À hết cmn việc rồi, thôi về với vợ, kệ mệ chúng nó" và nó về thẳng. Đến lúc có việc thì con vi điều khiển nó ôm vợ ngủ rồi. Thế là hỏng việc

              Comment


              • #8
                Nguyên văn bởi duong_act Xem bài viết
                Vòng while(1) để nhắc con vi điều khiển là "cứ nghỉ ở đây, tý nữa có việc đấy" để con vi điều khiển nó biết "À giờ không có việc nhưng có thể có việc bất ngờ, thôi cứ nhẩy ở đây tý có việc rồi làm" chứ nếu không có while(1) để nhắc thì con vi điều khiển nó nghĩ " À hết cmn việc rồi, thôi về với vợ, kệ mệ chúng nó" và nó về thẳng. Đến lúc có việc thì con vi điều khiển nó ôm vợ ngủ rồi. Thế là hỏng việc
                anh trả lời hay và hài! dễ hiểu

                Comment

                Về tác giả

                Collapse

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

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

                Collapse

                Đang tải...
                X