Thông báo

Collapse
No announcement yet.

help me!!!!! khong hieu tai sao chuong trinh ngat cua em chay 2 lan roi moi thoat.

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

  • help me!!!!! khong hieu tai sao chuong trinh ngat cua em chay 2 lan roi moi thoat.

    #include<reg51.h>
    #include<stdio.h>


    sbit xylanh1 = P0^7;
    sbit xylanh2 = P0^6;
    sbit dc= P0^5;

    //khai bao ham delay
    void delay(unsigned int time)
    {
    while(time--)
    {
    unsigned char x=121; //cho tha.ch anh 12MHz
    while(x--);
    }
    }


    void INT_0(void) interrupt 0 // chuong trinh phuc vu ngat
    {

    dc=1; //dung dong co

    xylanh2=0; //ha tay kep
    delay(2500);

    xylanh1=0; //kep chi tiet
    delay(2500);

    xylanh2=1; // nang tay kep
    delay(2500);

    dc= 0; ///chay dong co


    }


    void main(void)
    {
    EA=1; // cho phep ngat toan cuc
    EX0=1; // cho phep ngat ngoai 0 (chan P3_2)
    IT0=1; //ngat kich phat suon


    dc=0; // dong co quay

    while(1);

    }

  • #2
    Xung điều khiển ở ngắt ngoài bạn đưa vào tần số bao nhiêu thế? Vì mình thấy thời gian để thực hiện hàm INT_0 là xấp xỉ (3 x 2500 x 121)us ~= 907500 us ~= 1s(907ms), Nếu tần số ngắt ngoài đưa vào lớn qua e là chuơng trình còn ko thoát nổi sẽ có lúc tràn ram cơ vì chuơng trình phục vụ ngắt chưa đựoc thực hiện xong đã đựoc gọi tiếp.
    Mà đoạn hàm delay mình nghĩ nên sửa lại chút
    Code:
    //khai bao ham delay
    void delay(unsigned int time)
    {
    	while(time--)
    	{
    		unsigned char x=121; //cho tha.ch anh 12MHz
    		while(x--);
    	}
    } 
    nên được thay bằng
    void delay(unsigned int time)
    {
    	unsigned char x;
    	while(time--)
    	{
    		x=121; //cho tha.ch anh 12MHz
    		while(x--);
    	}
    }
    Vì trong quá trình hàm delay thực hiện như bạn thừong delay(2500) thì biến x sẽ được tạo mới 2500 lần. Còn trường hợp ở bên dưới biến x sẽ chỉ đựoc tạo ra 1 lần trong suốt quá trình hàm delay đựoc gọi.

    Comment


    • #3
      mình sử dụng tín hiệu ngắt ngoài bằng con tắc hành trình.
      đã sửa lại hàm delay nhu ban roi ma ko duoc . Mình hoc cỏ khí nên phần lập trinh yếu lắm, mong bạn giúp đỏ.

      Comment


      • #4
        Chương trình không lặp vô hạng mà chỉ lặp lại 2 lần thui,hic!
        Mình sử dụng con C1815 vs điện trở 4.7k để kéo chân P3_2 xuống max vậy có ổn không bạn?

        Comment


        • #5
          Cho mấy trăm Video đi, chứ nói xuông không ăn thua.

          Comment


          • #6
            code dường như điều khiển động cơ gắp vật, giống kiểu làm cánh tay rô bôt, làm thế này chỉ đúng theo ý tưởng còn thực tế thì chắc chắn ko bao giờ đc
            Website chính thức đổi địa chỉ website thành
            Mời các bạn ghé thăm !!!

            Comment


            • #7
              Thôi được rồi. Bạn thử thay đổi code thế này xem sao.
              Code:
              #include<reg51.h>
              #include<stdio.h>
              
              
              sbit xylanh1 = P0^7;
              sbit xylanh2 = P0^6;
              sbit dc= P0^5;
              
              //khai bao ham delay
              void delay(unsigned int time)
              {
              	unsigned char x;
              	while(time--)
              	{
              		x=121; //cho tha.ch anh 12MHz
              		while(x--);
              	}
              } 
              
              
              void INT_0(void) interrupt 0 // chuong trinh phuc vu ngat
              {
              	EA=0; // Khong nhan ngat nua
              	
              	dc=1; //dung dong co
              	
              	xylanh2=0;	//ha tay kep
              	delay(2500);
              	
              	xylanh1=0; //kep chi tiet 
              	delay(2500);
              	
              	xylanh2=1; // nang tay kep
              	delay(2500);
              	
              	dc= 0;	///chay dong co
              	
              	EA=1;// Tiep tuc chap nhan ngat
              }
              
              
              void main(void)
              {
              	EA=1; // cho phep ngat toan cuc
              	EX0=1; // cho phep ngat ngoai 0 (chan P3_2)
              	IT0=1; //ngat kich phat suon
              	
              	
              	dc=0; // dong co quay
              	
              	while(1);
              	
              }
              Code trên sẽ tránh hiện tượng khi chương trình phục vụ ngắt đang thực thi thì lại bị gọi tiếp vì thời gian thực thi quá lớn dẫn đến ngắt xảy ra ngay trong quá trình thực hiện trình phục vụ ngắt. Nếu "Chương trình phục vụ ngắt vẫn chạy 2 lần mới thoát" thì bạn nên tìm cách khác, hoặc xem lại Logic chương trình.

              Comment


              • #8
                minh vùa thư cách của bạn nhưng vân không dược.
                minh đọc vài ví dụ khác và viieets lại y nhu vày thì được, nhung minh khong không hiểu, bạn giải thich cho minh voi!

                #include<reg51.h>
                #include<stdio.h>
                // khai bao cac chan de quet led


                sbit led1 = P0^0;
                sbit led2 = P0^1;
                sbit led3 = P0^2;

                sbit servo = P3^1;

                // khai bao chan dieu khien ADC
                sbit doc = P3^6;
                sbit viet = P3^7;
                sbit ngat = P3^5;


                sbit xylanh1 = P0^7;
                sbit xylanh2 = P0^6;
                sbit dc= P0^5;

                //khai bao ham delay


                void delay(unsigned int time)
                {
                unsigned char x;
                while(time--)
                {
                x=121; //cho tha.ch anh 12MHz
                while(x--);
                }
                }

                // chuong trinh chinh
                void INT_0(void) interrupt 0 // chuong trinh phuc vu ngat
                {

                dc=1;

                xylanh2=0; //ha tay kep
                delay(2500);

                xylanh1=0; //kep chi tiet
                delay(2500);

                xylanh2=1; // nang tay kep
                delay(2500);

                xylanh1=1; // tha chi tiet



                }


                void main(void)
                {
                EA=1; // cho phep ngat toan cuc
                ES=1;
                ET0=1;

                EX0=1; // cho phep ngat ngoai 0 (chan P3_2)
                IT0=1; //ngat kich phat suon

                ET0=0;
                EA=0;

                dc=0; // dong co quay
                while(1);

                }

                Comment


                • #9
                  sao không làm được bạn? robocon toan lam nhu thế này thui.

                  Comment


                  • #10
                    cho xin mấy k video đi bạn, bạn nói xuông này khó quá
                    Nguyễn Huy Biên - 01649 802 694
                    gmail :

                    Comment


                    • #11
                      Nguyên văn bởi dinhnghia234 Xem bài viết
                      minh vùa thư cách của bạn nhưng vân không dược.
                      minh đọc vài ví dụ khác và viieets lại y nhu vày thì được, nhung minh khong không hiểu, bạn giải thich cho minh voi!

                      #include<reg51.h>
                      #include<stdio.h>
                      // khai bao cac chan de quet led


                      sbit led1 = P0^0;
                      sbit led2 = P0^1;
                      sbit led3 = P0^2;

                      sbit servo = P3^1;

                      // khai bao chan dieu khien ADC
                      sbit doc = P3^6;
                      sbit viet = P3^7;
                      sbit ngat = P3^5;


                      sbit xylanh1 = P0^7;
                      sbit xylanh2 = P0^6;
                      sbit dc= P0^5;

                      //khai bao ham delay


                      void delay(unsigned int time)
                      {
                      unsigned char x;
                      while(time--)
                      {
                      x=121; //cho tha.ch anh 12MHz
                      while(x--);
                      }
                      }

                      // chuong trinh chinh
                      void INT_0(void) interrupt 0 // chuong trinh phuc vu ngat
                      {

                      dc=1;

                      xylanh2=0; //ha tay kep
                      delay(2500);

                      xylanh1=0; //kep chi tiet
                      delay(2500);

                      xylanh2=1; // nang tay kep
                      delay(2500);

                      xylanh1=1; // tha chi tiet



                      }


                      void main(void)
                      {
                      EA=1; // cho phep ngat toan cuc
                      ES=1;
                      ET0=1;

                      EX0=1; // cho phep ngat ngoai 0 (chan P3_2)
                      IT0=1; //ngat kich phat suon

                      ET0=0;
                      EA=0;

                      dc=0; // dong co quay
                      while(1);

                      }
                      Cái này mà bạn bảo chạy đúng à? EA=0 thì nó disable interrupt rồi thì chạy bằng niềm tin à? Ở trên tôi chỉ disable interrupt trong quá trình thực thi hàm phục vụ ngắt, sau đó lại trả lại trạng thái cờ ngắt để chương trình phục vụ ngắt đựoc gọi trong lần tiếp theo ngắt xảy ra
                      . Nếu bạn sửa code thành như ở trên mà chạy đúng thì dám khẳng định phần cứng bạn làm sai, nó không nhận tín hiệu điều khiển từ VDK.

                      Comment


                      • #12
                        bạn nói đúng,hi!
                        minh sủa lại được rồi. Minh cho EA=0 ở cuối chương trinh ngắt vậy là nó chạy binh thường.
                        Cảm ơn bạn rất nhiều!

                        Comment

                        Về tác giả

                        Collapse

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

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

                        Collapse

                        Đang tải...
                        X