Thông báo

Collapse
No announcement yet.

Hỏi về ngắt trong C

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

  • Hỏi về ngắt trong C

    int main(){
    switch(k)
    case
    k=1 :
    <ctcon1()>;break;
    k=2
    <ctcon2()>;break;
    }
    Giả sử mình đã viết ct con rồi, nếu trong ngắt mình cho k=1 thì hàm main sẽ thực hiện ctcon1(). Vậy nếu bây giờ trong ngắt mình cho k=2 thì ctcon2() có thực hiện ngay ko hay phải đợi xong ctcon1() thực hiện xong rồi mới thực hiện? Giả sử trong chương trình con mình dùng for, while với số lần lặp lớn?? Bây giờ mình muốn k=2 thì ctcon2() thực hiện ngay thì làm sao?

  • #2
    Nguyên văn bởi clevercoi Xem bài viết
    int main(){
    switch(k)
    case
    k=1 :
    <ctcon1()>;break;
    k=2
    <ctcon2()>;break;
    }
    Giả sử mình đã viết ct con rồi, nếu trong ngắt mình cho k=1 thì hàm main sẽ thực hiện ctcon1(). Vậy nếu bây giờ trong ngắt mình cho k=2 thì ctcon2() có thực hiện ngay ko hay phải đợi xong ctcon1() thực hiện xong rồi mới thực hiện? Giả sử trong chương trình con mình dùng for, while với số lần lặp lớn?? Bây giờ mình muốn k=2 thì ctcon2() thực hiện ngay thì làm sao?
    trong ngắt bao giờ thực hiện xong chương trình con 1 xong nó mới nhảy xuống thực hiện k=2 và thực hiện chương trình con 2.Nhưng chương trình của bạn lại dùng hàm switch vậy nó sẽ thực hiện chương trình con 1 hoặc 2 tùy vào giá trị của k.Khi thực hiện xong thì gặp lệnh break nên thoát ra ngoài chứ không xuống thực hiện chương trình viết dưới break,
    Last edited by startechmec; 14-08-2013, 13:09.
    Dang Van Hieu
    Cell: 0986506154
    web:
    Công Ty TNHH SXTMDV VÀ KỸ THUẬT SAO VIỆT
    60 Đỗ Thừa Luông,P. Tân Quý, Q.Tân Phú,TPHCM

    Comment


    • #3
      Nguyên văn bởi clevercoi Xem bài viết
      int main(){
      switch(k)
      case
      k=1 :
      <ctcon1()>;break;
      k=2
      <ctcon2()>;break;
      }
      Giả sử mình đã viết ct con rồi, nếu trong ngắt mình cho k=1 thì hàm main sẽ thực hiện ctcon1(). Vậy nếu bây giờ trong ngắt mình cho k=2 thì ctcon2() có thực hiện ngay ko hay phải đợi xong ctcon1() thực hiện xong rồi mới thực hiện? Giả sử trong chương trình con mình dùng for, while với số lần lặp lớn?? Bây giờ mình muốn k=2 thì ctcon2() thực hiện ngay thì làm sao?
      trong ngắt bao giờ thực hiện xong chương trình con 1 xong nó mới nhảy xuống thực hiện k=2 và thực hiện chương trình con 2.Nhưng chương trình của bạn lại dùng hàm switch vậy nó sẽ thực hiện chương trình con 1 hoặc 2 tùy vào giá trị của k.Khi thực hiện xong thì gặp lệnh break nên thoát ra ngoài chứ không xuống thực hiện chương trình viết dưới break,
      Dang Van Hieu
      Cell: 0986506154
      web:
      Công Ty TNHH SXTMDV VÀ KỸ THUẬT SAO VIỆT
      60 Đỗ Thừa Luông,P. Tân Quý, Q.Tân Phú,TPHCM

      Comment


      • #4
        muốn ngắt ngay mà không cần đợi hết chương trình đang chạy dở thì có thể dùng goto.

        Comment


        • #5
          Cảm ơn các bạn. Mình nhầm chút khi dùng switch...case;break. Dùng if mới được
          int main(){
          if(k=1)
          <ctcon1()>
          if(k=2)
          <ctcon2()>;
          .
          .
          if(k=n)
          <ctcon...n()>;
          }
          Để mình thử goto cái đã

          Comment


          • #6
            Theo mình nếu bạn viết như trên thì if sẽ chạy tất cả các chương trình con mà bạn đưa ra theo thứ tự top down. vì ở if bạn chỉ thực hiện lệnh gán chứ không phải so sánh. mà kết quả của gán thì thường trả về là true=(1) nên if lúc nào cũng đúng. có thể bạn nhầm if(k=1) với if(k==1) chăng? Và nếu bạn viết cú pháp không bị sai thì if với switch cho kết quả giống nhau. Tóm lại là bạn nên học cho chắc phần cơ bản của lập trình thì hơn.
            Code:
            switch (k)
            {
            	case 1:
            		ctc1();
            	break;
            	
            	case 2:
            		ctc2();
            	break;
            	
            	default:// Có thể có có thể không
            		ct_default();
            }
            
            if(k==1)
            {
            	ctc1();
            }
            else if(k==2)
            {
            	ctc2();
            }
            else//Tương đương với default ở trên
            {
            	ct_default();
            }
            Nếu bạn viết đúng theo cấu trúc như mình nói thì khi trong ngắt bạn cho k=1 thì ctc1 sẽ được kích hoạt sau đó kết thúc mà không chuyển sang chuơng trình con 2 trường hợp k=2 cũng tuơng tự. nếu truong chuơng trình con mà thực hiện nhiều xử lý quá dẫn đến ngắt lại xảy ra ngay trong quá trình chuơng trình con đang chạy thì bạn nên cấm ngắt ngay khi chuơng trình con được thực thi để tránh tình trạng như mình nói.
            Nhưng dù sao thì hàm main của bạn nếu cứ để như thế thì chắc chả có gì xảy ra, bạn phải để đoạn if hoặc switch kia vào 1 vòng lặp mãi mãi thì mới bắt được ngắt
            Code:
            while(1)
            {
                if()
                hoặc
                switch()
            }

            Comment


            • #7
              Gấp gáp quá nên có thiếu sót.
              int main(){
              if(k==1)
              <ctcon1()>
              if(k==2)
              <ctcon2()>;
              .
              .
              if(k==n)
              <ctcon...n()>;
              }
              //các chương trình con
              void ctcon1()
              {
              chopled1;
              delay(1000);
              chopled2;
              delay(1000);
              }
              void ctcon2()
              {
              choptat4led;
              delay(2000);
              .
              .
              void ctconn(){
              chopled4;
              delay(1000);
              chopled3;
              delay(1000)
              chopled2;
              delay(1000);
              chopled1;
              delay(1000);
              }
              Nếu mình ngắt k =1 thì nhảy vào chương trình con thực hiện. Nhưng ý mình muốn hỏi là khi chương trình con 1() chưa thực hiện xong(tại vì còn delay) mà mình ngắt để chuyển sang ctcon2() hoặc ctcon(n-1),ctcon(n) ngay lập tức thì mình dùng goto đc ko hay làm như thế nào?
              Mình mới nghĩ ra thuật toán thôi chứ chưa viết code cụ thể

              Comment


              • #8
                trong hàm ngắt thì k=2; vào đấy ..!!!
                khỏi cần goto cũng được

                Comment


                • #9
                  Nguyên văn bởi tan0710 Xem bài viết
                  trong hàm ngắt thì k=2; vào đấy ..!!!
                  khỏi cần goto cũng được
                  Ko được, ko nhảy sang chương trình khác khi đang còn trong điều kiện lặp!

                  Comment


                  • #10
                    Nguyên văn bởi clevercoi Xem bài viết
                    Ko được, ko nhảy sang chương trình khác khi đang còn trong điều kiện lặp!
                    trong khi chương trình con 1 đang chạy thì vẫn enable ngắt thì khi có ngắt nó phải ưu tiên thực hiện. ở đây là thay đổi biến K
                    nên biến K phải khai báo là biến toàn cục chứ k được khai báo là biến cục bộ.

                    Comment


                    • #11
                      Nguyên văn bởi clevercoi Xem bài viết
                      Gấp gáp quá nên có thiếu sót.
                      int main(){
                      if(k==1)
                      <ctcon1()>
                      if(k==2)
                      <ctcon2()>;
                      .
                      .
                      if(k==n)
                      <ctcon...n()>;
                      }
                      //các chương trình con
                      void ctcon1()
                      {
                      chopled1;
                      delay(1000);
                      chopled2;
                      delay(1000);
                      }
                      void ctcon2()
                      {
                      choptat4led;
                      delay(2000);
                      .
                      .
                      void ctconn(){
                      chopled4;
                      delay(1000);
                      chopled3;
                      delay(1000)
                      chopled2;
                      delay(1000);
                      chopled1;
                      delay(1000);
                      }
                      Nếu mình ngắt k =1 thì nhảy vào chương trình con thực hiện. Nhưng ý mình muốn hỏi là khi chương trình con 1() chưa thực hiện xong(tại vì còn delay) mà mình ngắt để chuyển sang ctcon2() hoặc ctcon(n-1),ctcon(n) ngay lập tức thì mình dùng goto đc ko hay làm như thế nào?
                      Mình mới nghĩ ra thuật toán thôi chứ chưa viết code cụ thể
                      khi ở trong vòng lặp ( delay cũng là sử dụng vòng lặp đi lặp lại nhiều lần ) ... muốn nhảy sang chương trình khác ( chẳng hạn ngắt để nhảy sang chương trình 2 ) thì phải thoát khỏi vòng lặp chương trình 1 . Nếu không thoát mà ngắt liên tục nó sẽ quanh quẩn , nhảy đi , nhảy lại ... rồi thành đệ qui ... gây treo MCU.

                      --- để thoát khỏi vong lặp thì bạn kiểm tra điều kiện của nó ...

                      lấy ví dụ
                      if(k==1)
                      {
                      ct1();
                      Delay_ms(1000);
                      }
                      if(k==2)
                      {
                      ct2();
                      Delay_ms(1000);
                      }

                      Nếu để thông thường thế này khi K==1 ; nó sẽ trễ hết 1000 ... kể cả khi có ngắt k=2 rồi... nếu đang làm dang dở nó sẽ lại quay lại chỗ đó Ct1();

                      thay vì viết Delay_ms(1000)
                      ta có thể viết
                      for(i=1000;i>0;i--)
                      {
                      Delay_ms(1);
                      if(k==2) /// hoặc if(k !=1) khác 1
                      {i=0; }
                      }

                      thay vì phải làm hết cả 1000 ... nó sẽ kiểm tra mỗi 1ms ( 1) ... khi nhận thấy k không phải là 1 ... nó sẽ đưa ra lệnh để thoát khỏi vòng lặp đó. và làm tới các chương trình khác với giá trị k tương ứng !
                      Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                      Comment


                      • #12
                        tham khảo thử xem:
                        void interrupt1()
                        {
                        _interrupt = TRUE;
                        k = 1;
                        }


                        void interrupt2()
                        {
                        _interrupt = TRUE;
                        k = 2;
                        }


                        void main()
                        {
                        while(1)
                        {
                        if(k==1)
                        {
                        ct1();
                        Delay_ms(1000);
                        }

                        if(k==2)
                        {
                        ct2();
                        Delay_ms(1000);
                        }
                        }
                        }


                        void delay(xyz)
                        {
                        while(--xyz)
                        {

                        if(_interrupt)
                        {
                        _interrupt = FALSE;
                        return;
                        }
                        }
                        }

                        Comment


                        • #13
                          Chào các bác, mình cũng mới tập tành với vi điều khiển. Khi viết về lệnh "switch/ case" cũng có gặp tình trạng tương tự như bác "clevercoi".
                          Tức là mình làm một chương trình gọi lệnh từ nút nhấn (switch/case), khi vào case được dẫn đến chương trình con, khi đó chương trình con thực hiện lặp tương đối lâu.Để nhấn nút cho sang chương trình con khác, ta phải giữ nút cho đến khi chương trình con chạy dứt quy trình.
                          Mình cũng đã thử thay hàm "delay" của mình thành một hàm "for" như bác "queduong" chỉ nhưng vẫn không thấy có tác dụng, mình cũng đã thử không dùng đến trường hợp "i=0", mà thay vào đó mình cho hẳn "Break;", "goto case;" nhưng vẫn phải đợi chương trình con chạy hết quy trình.
                          Rất mong các bác nào có kinh nghiệm chỉ giáo giúp, hoặc có thể cho mình một giải thuật khác thay thế .
                          " Mình cần xử lý một chương trình PWM (xuất ra 3 chân), dử liệu đưa vào từ 2 port, port 1 nhận vào đủ 8bit (từ 0-7) để thực hiện 8 chương trình con PWM khác nhau, Port 2 nhập vào 4bit (từ 0-3 của remote) cũng để thực hiện đồng thời 8 ctc như trên.
                          Trong thời gian chờ trả lời, mình cũng rất cám ơn các bác đã quá mục sang topic của mình.TKS...

                          Comment


                          • #14
                            Nguyên văn bởi vanngaspkt
                            Bạn đang hiểu sai giữa ngắt và chuơng trình con,
                            Thứ nhất :ngắt là 1 ct độc lập với ct chính..khi có ngắt xảy ra thì nó sẽ dừng ct chính lại và chạy vào ngắt làm việc..sau khi thực hiện ngắt xong thì nó lại quay về đúng vị trí lúc nó đi(^^).vậy nên nếu ct chinh đang thực hiện ct con1 mà ngắt sảy ra thì nó sẽ dừng lại tại vị trí nào đó trong ct con1 .. rồi vào ngắt cho k=2..Khii thoát ngắt nó lại trở về cái vị trí lúc trước khi ngắt nghĩa là đang thực hiện ct con 1...nó sẽ chạy hết ct con1 sau đó nó mới chạy ct con 2 ...^^ chúc vui vẻ ^^
                            Chào bác Nga, vậy bác có thể giúp mình thay đổi dòng lệnh như thế nào để có thể cho chương trình con đang chạy dừng ngay (không đợi chạy hết) và chuyển sang chương trình kế tiếp. Mình có thể sử dụng cú pháp khác switch case hay không? Mình có 8 chương trình con, được chọn từ 8 nút của port2 hoặc từ 4 nút của port3 (remote), port 0 dùng để hiển thị trên led 7seg stt của chương trình, port 1 được dùng xuất ra ctc (). TKs bac nhé!!

                            Comment


                            • #15
                              tiện thể gặp các cao thủ, có bác nào viết cả MSP430 của Ti không cho em hỏi
                              em muốn điều chế độ rộng xung của tín hiệu vào rồi đưa ra một đầu ra thì code viết kiểu gì ạ
                              _delay_cycles() thì không thu được xung hẹp hơn mà lại là xung rộng hơn một khoảng delay
                              Mạnh Hùng - ĐT: 0983313518
                              Sửa lỗi, Chuyển nguồn đồ Nội địa Nhật 100V sang chạy 220V

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X