Thông báo

Collapse
No announcement yet.

Cổng nối tiếp UART, các ngắt ngoài của 8051

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

  • Cổng nối tiếp UART, các ngắt ngoài của 8051

    Hi all,

    Tại đây, các bạn có thể post các bài viết (hướng dẫn, câu hỏi, trả lời) liên quan đến:
    - cổng nối tiếp UART
    - các ngắt ngoài
    - các thanh ghi SFR liên quan


    Thân mến,
    blackmoon.
    Last edited by blackmoon; 16-08-2006, 11:04.

  • #2
    VDK nhận từ PC truyền xuống khoảng 15 loại thông số khác nhau (kiểu số nguyên). Trên PC thì phổ biến hay dùng là chuyển số nguyên thành kiểu String và send. Dưới VDK lai chỉ đọc được từng Byte. Nếu mối thông số truyền đi có thêm byte địa chỉ, byte bắt đầu khung dữ liệu... kèm vào, và truyền đi liên tiếp, như vầy sẽ có khoảng vài chục byte. Dưới VDK sẽ phải đọc liên tiếp các byte này, nếu như không muốn dữ liệu bị mất thì thường hay tạo một mảng buffer[n] để chứa các byte đọc được và sau đó xử lý. Nếu như vậy thì sẽ khá tốn bộ nhớ nếu dùng trong các hệ nhúng không sử dùng RAM ngoài. Còn phương pháp nào giải quyết hiệu quả để tối ưu hơn về bộ nhớ mà các thông số vẫn đảm bảo được phân biệt chính xác.
    ??
    CUNG CẤP PSOC, MẠCH NẠP
    CHUYỂN ĐỔI USB <-> RS485 AutoBaud
    RS232 <-> RS485 MultiBaud
    MẠCH NẠP USBPPI S7-200
    Mobile: 0906076116
    Email:

    Comment


    • #3
      Hi encoder,

      Việc xử lý dữ liệu truyền thông thường liên quan đến các vấn đề về mảng dữ liệu. Trong hầu hết các giao thức người ta đều gắn các trường khác bên cạnh trường dữ liệu thực. Bạn có thể tự tạo ra giao thức truyền thông cho riêng bài toán của mình, trong đó số lượng và dung lượng của các trường được tối ưu theo bài toán của chính bạn.
      Bạn không thể tránh khỏi việc sử dụng RAM làm buffer lưu thông tin trước khi bóc tách xử lý. Tuy nhiên thông tin cho một khung truyền không phải là lớn, nếu không dùng SRAM ngoài trong hệ nhúng của mình bạn hoàn toàn có thể chọn các loại MCU có tích hợp SRAM với dung lượng vài Kbyte bên trong. Một số dòng chip điển hình là PIC18F, AVR, PIC24, dsPIC ...

      Thân mến,
      blackmoon.

      Comment


      • #4
        Anh Blackmoon ơi , làm sao có thể cho ngắt ngoài của 8051 hoat động kiểu bắt cạnh lên của xung ? Em chỉ thấy nó bắt cạnh xuống hoặc bắt mức thôi chứ chưa biết làm cách nào để bắt cạnh lên cả ??

        Comment


        • #5
          Nguyên văn bởi PUMA Xem bài viết
          Anh Blackmoon ơi , làm sao có thể cho ngắt ngoài của 8051 hoat động kiểu bắt cạnh lên của xung ? Em chỉ thấy nó bắt cạnh xuống hoặc bắt mức thôi chứ chưa biết làm cách nào để bắt cạnh lên cả ??
          Thì bạn cho tín hiệu đó qua một mạch đảo tín hiệu nữa rồi đưa vào VDK là xong chứ gì!

          Comment


          • #6
            Nhưng nếu muốn bắt cả cạnh lên và xuống thì làm thế nào ?
            Ah,Hay là dùng cả 2 chân ngắt ngoài ,1 chân bắt cạnh lên dùng 1 cổng đảo, 1 chân bắt cạnh xuống được không nhỉ ?

            Comment


            • #7
              Hi PUMA,

              Ngắt ngoài của 8051 chỉ có thể ngắt theo sườn xuống hoặc mức thấp. Nếu muốn dùng cả ngắt sườn xuống và ngắt sườn lên thì bạn có thể làm đơn giản như cách bạn nghĩ ra. Đưa tín hiệu trực tiếp vào một chân ngắt, lấy đảo của tín hiệu đó đưa vào chân ngắt kia.

              Thân mến,
              blackmoon.

              Comment


              • #8
                Xin hỏi các anh chị về vấn đề ngắt của 8051:
                Khi em lập trình bằng ngôn ngữ C, sử dụng hai ngắt liên tiếp nhau trong bảng vector ngắt, nhưng một trong hai chương trình ngắt viết quá dài làm chèn lên vùng nhớ của chương trình ngắt tương ứng vector ngắt kế tiếp. Kết quả là ngắt đó bị mất. Vậy có cách nào dịch chuyển chương trình ngắt sang một vùng nhớ khác giống như lập trình bằng Assembly không?
                |

                Comment


                • #9
                  Nguyên văn bởi linhcdtdh2 Xem bài viết
                  Xin hỏi các anh chị về vấn đề ngắt của 8051:
                  Khi em lập trình bằng ngôn ngữ C, sử dụng hai ngắt liên tiếp nhau trong bảng vector ngắt, nhưng một trong hai chương trình ngắt viết quá dài làm chèn lên vùng nhớ của chương trình ngắt tương ứng vector ngắt kế tiếp. Kết quả là ngắt đó bị mất. Vậy có cách nào dịch chuyển chương trình ngắt sang một vùng nhớ khác giống như lập trình bằng Assembly không?
                  Không thể có chuyện ấy được, bạn có thể nói rõ bạn sử dụng hai ngắt nào không.
                  Vector ngắt của 8051 chỉ có độ dài 3 hoặc 8 byte, chẳng làm được cái gì ở đấy cả. Trong các chương trình xử lý ngắt thường chỉ để lệnh nhảy đến một chương trình xử lý ngắt nào đó, tui nghĩ mấy chương trình dịch ngôn ngữ C cho 8051 thừa hiểu điều này.

                  Comment


                  • #10
                    to linhcdt: Nếu bạn dùng C để thực hiện ngắt của 8051 thì yên tâm về mặt độ lớn của chương trình con phục vụ ngắt, tuy nhiên ko nên để chương trình ngắt quá dài khi bạn sử dụng nhiều hơn 1 ngắt, nếu có thì phải chú ý để tránh tình trạng xảy ra xung đột ngắt dẫn tới tràn Stack...Chú ý quyền ưu tiên cho các ngắt.
                    Để cụ thể hợn bạn cứ pót code lên, mọi người xem cho.
                    Ethernet-RS232, PIC Webserver, RFID Reader
                    CallerID, Cảnh báo BTS, ...
                    0988006696
                    linhnc308@gmail.com
                    http://linhnc308.blogspot.com

                    Comment


                    • #11
                      Chào các bác. Em cũng mới học VDK, khi đọc đến ngắt và làm thử một ví dụ về nó nhưng không hiểu sao mà nó không chạy. Các bác coi dùm em thế nào.
                      Bài của em là tạo xung trên chân vdk dùng ngắt.
                      ************************
                      Code:
                      #include<at89s52.h>
                      void time0 () interrupt 0
                       {
                         TR0 = 0;
                          P2_1 = 0;
                       }
                      void main()
                       {
                          TMOD = 0X02;
                          TH0 = 0XDC;
                           P2_1 = 1;
                          TR0 = 1;
                          IE = 0X82;
                      while(1)
                        {}
                       }
                      *************************
                      Khi cho nó chạy thì nó không bật cờ TF0. Các bác chỉ dùm cho em. Thanks
                      Last edited by VNarmy; 24-07-2007, 18:32.

                      Comment


                      • #12
                        Nguyên văn bởi electronic Xem bài viết
                        Chào các bác. Em cũng mới học VDK, khi đọc đến ngắt và làm thử một ví dụ về nó nhưng không hiểu sao mà nó không chạy. Các bác coi dùm em thế nào.
                        Bài của em là tạo xung trên chân vdk dùng ngắt.
                        ************************
                        #include<at89s52.h>
                        void time0 () interrupt 0
                        {
                        TR0 = 0;
                        P2_1 = 0;
                        }
                        void main()
                        {
                        TMOD = 0X02;
                        TH0 = 0XDC;
                        P2_1 = 1;
                        TR0 = 1;
                        IE = 0X82;
                        while(1)
                        {}
                        }
                        *************************
                        Khi cho nó chạy thì nó không bật cờ TF0. Các bác chỉ dùm cho em. Thanks
                        Vào ngắt bạn cho TR0 = 0 thì còn j` nữa mà chạy! hehehe! Bộ timer 0 làm việc ở chế độ 2, chế độ 8 bit auto reload phần cứng sẽ tự xóa cờ, bạn không cần phải làm gì cả!

                        Comment


                        • #13
                          Tui nhầm với chế độ khác, không để ý. Cám ơn bác đã góp ý.
                          Last edited by electronic; 14-11-2006, 17:31.

                          Comment


                          • #14
                            Nguyên văn bởi electronic Xem bài viết
                            Chào các bác. Em cũng mới học VDK, khi đọc đến ngắt và làm thử một ví dụ về nó nhưng không hiểu sao mà nó không chạy. Các bác coi dùm em thế nào.
                            Bài của em là tạo xung trên chân vdk dùng ngắt.
                            ************************
                            #include<at89s52.h>
                            void time0 () interrupt 0
                            {
                            TR0 = 0;
                            P2_1 = 0;
                            }
                            void main()
                            {
                            TMOD = 0X02;
                            TH0 = 0XDC;
                            P2_1 = 1;
                            TR0 = 1;
                            IE = 0X82;
                            while(1)
                            {}
                            }
                            *************************
                            Khi cho nó chạy thì nó không bật cờ TF0. Các bác chỉ dùm cho em. Thanks
                            Chương trình của bạn làm sao mà chạy được cơ chứ .

                            Thứ nhất,Vì ngắt Timer0 có vector ngắt ở địa chỉ 0x0B và trong Keil C nó định nghĩa thứ tự là 1 tức là phải khai báo hàm ngắt là void time0 () interrupt 1 chứ. Cái này bạn xem trong file regx51.h trong thư mục C51/INC/Atmel/ trong thư mục cài đặt nhé.
                            Code:
                            #define TF0_VECTOR	1  /* 0x0B Timer 0 */
                            Thứ hai, cái include đó k đúng, bạn thêm #include "regx52.h" vì con 89C52 được định nghĩa các địa chỉ giống với 89S52 mà.

                            Bạn sẽ không thấy bật cờ ngắt lên bởi vì ngay khi nhảy vào hàm ngắt thì cờ TF0 đã bị xóa rùi còn đâu. Nếu muốn xem cờ ngắt thì thử set IE0 = 0; thì sẽ thấy được cờ ngắt được bật khi có tràn ở Timer0.

                            Chương trình của bạn chỉ chạy 1 lần vào ngắt Timer0 rùi disable ngắt đó luôn, nếu nối Led vào chân P2_1 thì led nháy 1 phát rùi tắt luôn .

                            Bạn chú ý chương trình nên enable ngắt trước khi chạy Timer0, và nên xóa cờ ngắt trước để tạo thói quen tư duy và sẽ không gặp phải sai lầm nào cả.

                            Do vậy chương trình viết lại như sau:
                            Code:
                            #include <REGX51.H>
                            
                            void time0 () interrupt 1
                            {
                            	TR0 = 0;
                            	P2_1 = 0;
                            }
                            void main()
                            {
                            	TMOD = 0X02;
                            	TH0 = 0XDC;
                            	P2_1 = 1;
                            	IE = 0X82;
                            	TF0 = 0;
                            	TR0 = 1;
                            	while(1){
                            	};
                            		
                            }
                            Chúc bạn thành công.
                            Technical sale at WT Microelectronics S'pore
                            Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
                            Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

                            Comment


                            • #15
                              Nguyên văn bởi linhnc308 Xem bài viết
                              to linhcdt: Nếu bạn dùng C để thực hiện ngắt của 8051 thì yên tâm về mặt độ lớn của chương trình con phục vụ ngắt, tuy nhiên ko nên để chương trình ngắt quá dài khi bạn sử dụng nhiều hơn 1 ngắt, nếu có thì phải chú ý để tránh tình trạng xảy ra xung đột ngắt dẫn tới tràn Stack...Chú ý quyền ưu tiên cho các ngắt.
                              Để cụ thể hợn bạn cứ pót code lên, mọi người xem cho.
                              Vậy xem ra bác ko hiểu cơ chế ngắt của 8051 rồi. Việc tràn ngăn xếp ko phụ thuộc vào chương trình ngắt dài hay ngắn.
                              -------------------

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X