Thông báo

Collapse
No announcement yet.

HƯỚNG DẪN LẬP TRÌNH KEIL C CHO 8051-[Chỉ dành post bài hướng dẫn]

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

  • HƯỚNG DẪN LẬP TRÌNH KEIL C CHO 8051-[Chỉ dành post bài hướng dẫn]

    Mình đang tập tọe VDK 8051 sử dụng trình dịch keil C. Các bước thao tác với Keil như thế nào mình không biết cụ thể.
    Đầu tiên vào File -->new --> sau đó lập trình nhưng khi cho dịch chạy thử thì nó cứ chạy CT nguồn ee gì đó. xin hãy chỉ giúp.

  • #2
    bạn phải dịch ra file .hex trước thì mới có thể Debug được.

    Bạn nên tạo ra một project.Vào Project -> New project . Nó sẽ hướng dẫn cụ thể bạn làm thế nào. Chọn con vi điều khiển để làm việc ví dụ AT89C51 của Atmel.

    Sau đó bạn vào file-> new bạn lưu tên file. Chú ý là phải có phần mở rộng ví dụ file C thì đuôi là .c rồi save vào. Viết chương trình trong file đó.

    Khi đó chưa chạy được, chưa dịch được vì nó không trong Project của bạn. Bạn phải kích chuột phải vào tên Project ở cửa sổ bên trái chọn Add file to project( đại loại thế không nhớ rõ).

    Tiếp đến bạn dịch ra file .hex bằng cách lựa chọn trong Option ỏ tab Output là to Hex file.

    Sau đó bạn dịch ra file .hex. Rồi debug.

    Chỉ đơn giản có thế thôi.

    Để mai tôi viết một bài hướng dẫn cơ bản cho các bạn mới học về vấn đề này.
    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


    • #3
      Đầu tiên vào PROJECT --> new project ( gõ tên project vào , chọn VDK loại nào ? click vào cái dòng có ATMEL ( tìm đến con 89 mà bạn cần ).

      2) click file --> NEW gõ một vài câu lệnh , save nó là ( tên đề tài . c ) chú ý phải có .c

      Sau đó mở cửa sổ project ra , kích chuột vô option --kích liên tiếp đến khi nó hiện ra hết , kích chuột phải rồi add cái source tên đề tài.c vào , thế là bắt đầu dịch, chạy thoải mái.

      --- Nói thì lằng ngoằng , ai có cái nút capture print thì chụp ảnh lên hướng dẫn cho. Cái máy của tôi hỏng phím nên không đưa ảnh lên được . HIC
      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


      • #4
        Các bước làm việc với Keil C

        Các bước thực hiện.
        Bạn xem hình minh họa cho dễ dùng




























        Last edited by ngohaibac; 07-06-2006, 20:01.
        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


        • #5


















          Last edited by ngohaibac; 07-06-2006, 23:56.
          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


          • #6
            Chào ban N_H_B! mình đã thực hiện các bước bạn hướng dẫn và copy cả bài của bạn vào chạy thử nữa nhưng khi dịch nó cứ báo lỗi. Mình đã kiểm tra lại quá trình thực hiện và cú pháp khi lập trình thậm chí còn cài lại nữa (KeilC v 7.08) bản cracked. Lỗi cụ thể như sau:

            Build target 'Target 1'
            Compiling leddon.C...
            ***WARNING C318 IN LINK 1 OF LEDDON.C: CAN'T OPEN FILE 'REGX51.H'
            leddon.C(14):error C202 : 'P1_0' : undefined identifier
            leddon.C(15):error C202 : 'P1_0' : undefined identifier
            Target not create

            Chỉ giúp nhé.

            Comment


            • #7
              Chính vì không mở được file REGX51,H nên sinh ra các lỗi đi kèm sau đó, là P1_0 chưa khai báo.
              Theo tôi bạn nễn xem lại file .H ở trên ! Hoặc thay vào đó là gõ thêm câu lệnh sau:

              sbit P1_0= P1^0;

              Comment


              • #8
                không phải điều đó.

                Các header file này thực ra mình cũng chẳng cần dùng khác. Thực chất bạn chỉ cần header file "reg51.h" là được. Còn các header file regx51.h thực ra là định nghĩa các port sẵn rồi mình đỡ phải định nghĩ thôi mà.

                Bạn cứ mở file đó ra mà xem nha. Còn chương trình của tôi chỉ nháy led ở Port P1.0 thôi. Bạn dùng P1 thì làm cả 8 chân của Port 1 rồi.

                Việc định nghĩa cho Port P1.0 như sau:

                Code:
                sbit P1_0= P1^0;
                Bạn có thể xem chi tiết về cách lập trình, cú pháp, cách thức tại

                http://luckytoki.com/haibac/download...0%20Primer.pdf

                Có lẽ tôi phải viết Toturial về vấn đề này thôi. Các cao thủ biết dùng rồi, biết viết code rồi mà chẳng hướng dẫn cho người mới biết gì cả.

                Vậy thì để tôi ra tay vậy.

                Chúc bạn thành công.
                Last edited by ngohaibac; 04-01-2006, 10:36.
                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


                • #9
                  Nếu bạn chú ý một tí thì sẽ thấy, đa số :
                  "Con người thường không thích nhận sự giúp đở của người khác,
                  Nhưng lại rất thích giúp đở mọi người!"
                  Và do đó mới có một NgốHaiBac chẳng hạn. Ông này thích tự tìm tòi, tìm đã rồi thích giúp người khác, cái đáng bàn bạc là làm sao để cái TUTORIAL ấy giúp ích được cho nhiều anh em nhất.
                  Người khá thì giúp cho người mới nhập môn
                  Người giỏi thì giúp cho người khá
                  Còn Người kha khá thì giúp cho người chưa biết gì!
                  Cho nên tài liệu dù dỡ đến đâu cũng có người đọc, và sẽ không bao giời cho là đủ- theo kiến giải của Phi là vậy đó!

                  Comment


                  • #10
                    Nguyên văn bởi kien_tran
                    Chào ban N_H_B! mình đã thực hiện các bước bạn hướng dẫn và copy cả bài của bạn vào chạy thử nữa nhưng khi dịch nó cứ báo lỗi. Mình đã kiểm tra lại quá trình thực hiện và cú pháp khi lập trình thậm chí còn cài lại nữa (KeilC v 7.08) bản cracked. Lỗi cụ thể như sau:

                    Build target 'Target 1'
                    Compiling leddon.C...
                    ***WARNING C318 IN LINK 1 OF LEDDON.C: CAN'T OPEN FILE 'REGX51.H'
                    leddon.C(14):error C202 : 'P1_0' : undefined identifier
                    leddon.C(15):error C202 : 'P1_0' : undefined identifier
                    Target not create

                    Chỉ giúp nhé.
                    Mấy bác cứ nói ở đâu : Em chẳng biết gì về mấy cái con 89 này cả .. hé hé
                    Viết thế này làm sao nó chạy ???

                    #include <REGX51.H> thì nó báo thế này là đúng CAN'T OPEN FILE 'REGX51.H'

                    --- Cứ mở cái keil ra , hoặc viết #include <reg51.h>
                    Hoặc viết #include <REG51X.H > ( lưu ý là chữ X sau số 51 ) vì trong thư mục inc ( include) của keil chỉ có REG51X.H thôi .

                    - Tôi nghi ngờ cách include của bạn , hoặc tốt hơn bạn kích chuột phải trong cửa sổ soạn thảo tìm dòng insert #include <REG51X.H> vào đầu chương trình của bạn.
                    ( Đây chỉ bị sai tên include thôi mà )
                    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


                    • #11
                      Cấu trúc chương trình C cho 8051

                      Chào anh Quế Dương, chào các bạn.

                      Tên em là Ngô Hải Bắc( chứ không phải là NgốHaiBac như anh MicroDuyphi nói). Chẳng dám qua mặt các cao thủ em chỉ muốn giới thiệu cho các bạn chưa biết về lập trình C cho vi điều khiển 8051 bằng phần mềm Keil C thôi. Nếu có gì chưa đúng mong các anh thông cảm, chỉ bảo cho.

                      Để có thể hiểu được những vấn đề tôi viết thì yêu cầu bạn phải có kiến thức căn bản về C như hàm con, sử dụng con trỏ, các kiểu dữ liệu(int, float, double,char, unsigned char,..)

                      Tôi xin đi vào bài thứ nhất. Nói về cấu trúc cho chương trình C:

                      1/Phần đầu tiên là liệt kê các header file mà các bạn dùng bằng từ khóa
                      Code:
                      #include"tên header file"
                      hoặc
                      Code:
                      #include< tên header file>
                      Khi bạn viết theo cách thứ nhất thì trình biên dịch sẽ tìm kiếm file .h hoặc .c này trong thư mục hiện tại chứa dự án của bạn, nếu không có thì sẽ tìm kiếm trong thư mục Inc trong thư mục cài đặt KeilC.

                      Viết theo cách thứ hai thì trình biên dịch sẽ tìm luôn trong thư mục /INC luôn.

                      Để có thể sử dụng đúng các file .h cho các vi điều khiển của mình thì bạn nên mở thư mục /inc trong thư mục này có các thư mục con như tên của hãng sản xuất. Ví dụ như của Atmel thì bạn tìm trong thư mục /Atmel thì sẽ thấy được file reg51.h ,.. Bạn mở từng file nên mà khám phá sẽ có nhiều điều hay đấy.

                      2/Định nghĩa các macro cho chương trình sáng sủa. Việc định nghĩa này được dùng bằng từ khóa #define

                      Ví dụ: bạn định nghĩa led1 là P1_0 tức là led1 được nối với chân 0 của Port 1.

                      Code:
                      #define led1 P1_0
                      3/ Các hàm ngắt như ngắt timer0, timer1, ngắt nối tiếp, ngắt ngoài. Tôi sẽ nói chi tiết cái này sau. Còn bây giờ tôi chỉ giới thiệu sơ sơ thôi.

                      Ví dụ bạn dùng ngắt nối tiếp là ngắt 4 trong bảng vector ngắt thì hàm sẽ có dạng như sau:

                      Code:
                      void inter_4(void) interrupt 4 using 2{
                      // làm gì thì làm ở đây
                      }
                      Cú pháp các ngắt khác cũng tương tự chỉ thay số 4 bằng số thứ tự của ngắt trong bảng vector ngắt.

                      4/ Các hàm con như Delay, khởi tạo,.. như:
                      Code:
                      void delay( unsigned char time){
                      
                      //code viết ở đây
                      }
                      5/ Chương trình chính:

                      Code:
                      void main(void){
                      // viết mã ở đây
                      
                      }
                      đối tượng của chương trình là vi điều khiển nên hàm main không có giá trị trả về và không có tham số đưa vào. Và thực chất cũng chẳng cần biến toàn cục vì ta chỉ cần viết 1 file thôi. nên tôi không đưa biến toàn cục vào đây.

                      Kết luận, chương trình của chúng ta sẽ có dạng như sau:

                      Code:
                      // liệt kê header file
                      #inlucde"tên header file"
                      ....................
                      // các marco
                      #define led1 P1_0
                      ...........
                      
                      // các hàm ngắt
                      void inter_1 interrupt 1 using 3{
                      
                      }
                      ..........
                      
                      // các hàm bình thường
                      
                      void delay( unsigned char time){
                      ///
                      }
                      ..............
                      
                      // chương trình chính
                      void main(void){
                      
                      
                      }
                      Trên đây tôi đã phân tích cấu trúc của chương trình viết cho 8051 rồi. Chi tiết từng vấn đề tôi sẽ đưa sau.

                      Mai viết tiếp.
                      Last edited by ngohaibac; 08-01-2006, 10:52.
                      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


                      • #12
                        lâu lắm không làm việc với mấy em 89 , hình như cái khai báo :
                        #include <AT89X51.H> mới đúng .
                        Tốt nhất cứ mở cái thư mục inc ra .
                        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


                        • #13
                          Giới thiệu các Include, đặc biết đơn giản nhất cho AT89C51

                          Chào các bạn.

                          Có lẽ người dùng Keil C lần đầu tiên gặp trở ngại khi dùng #include đó là không biết liệt kê các header file nào cần thiết cho ứng dụng của mình.

                          Để có thể biết được header file nào dùng cho vi điều khiển của mình thì các bạn mở thư mục cài Keil C ra, tìm đến thư mục C51/INC bạn sẽ thấy một loạt các thư mục của các hãng như Atmel,Dalas,.. Tôi xin lấy ví dụ một file regx51.h trong thư mục /Atmel. Bạn mở file đó lên sẽ thấy đầu đề của nó như sau:

                          /
                          Code:
                          *--------------------------------------------------------------------------
                          AT89X51.H
                          
                          Header file for the low voltage Flash Atmel AT89C51 and AT89LV51.
                          Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
                          All rights reserved.
                          --------------------------------------------------------------------------*/
                          Chứng tỏ file này dùng cho con AT89C51 và AT89LV51 rồi. Khi đó bạn sẽ thêm header file này vào chương trình của mình.

                          Còn làm thế nào để mình làm việc với các thành ghi, các port như trong ASM bây giờ. Câu trả lời ở trong file này:

                          Code:
                          #ifndef __AT89X51_H__
                          #define __AT89X51_H__
                          
                          /*------------------------------------------------
                          Byte Registers  ; Định nghĩa các thành ghi ở các địa chỉ trong RAM
                          ------------------------------------------------*/
                          sfr P0      = 0x80;
                          sfr SP      = 0x81;
                          sfr DPL     = 0x82;
                          sfr DPH     = 0x83;
                          sfr PCON    = 0x87;
                          sfr TCON    = 0x88;
                          sfr TMOD    = 0x89;
                          sfr TL0     = 0x8A;
                          sfr TL1     = 0x8B;
                          sfr TH0     = 0x8C;
                          sfr TH1     = 0x8D;
                          sfr P1      = 0x90;
                          sfr SCON    = 0x98;
                          sfr SBUF    = 0x99;
                          sfr P2      = 0xA0;
                          sfr IE      = 0xA8;
                          sfr P3      = 0xB0;
                          sfr IP      = 0xB8;
                          sfr PSW     = 0xD0;
                          sfr ACC     = 0xE0;
                          sfr B       = 0xF0;
                          
                          /*------------------------------------------------
                          P0 Bit Registers  ; Định nghĩa các cổng của Port 0 vì port này là thanh ghi 8 bít định được địa chỉ trực tiếp
                          ------------------------------------------------*/
                          sbit P0_0 = 0x80;
                          sbit P0_1 = 0x81;
                          sbit P0_2 = 0x82;
                          sbit P0_3 = 0x83;
                          sbit P0_4 = 0x84;
                          sbit P0_5 = 0x85;
                          sbit P0_6 = 0x86;
                          sbit P0_7 = 0x87;
                          
                          /*------------------------------------------------
                          PCON Bit Values
                          ------------------------------------------------*/
                          #define IDL_    0x01
                          
                          #define STOP_   0x02
                          #define PD_     0x02    /* Alternate definition */
                          
                          #define GF0_    0x04
                          #define GF1_    0x08
                          
                          #define SMOD_   0x80
                          
                          /*------------------------------------------------
                          TCON Bit Registers
                          ------------------------------------------------*/
                          sbit IT0  = 0x88;
                          sbit IE0  = 0x89;
                          sbit IT1  = 0x8A;
                          sbit IE1  = 0x8B;
                          sbit TR0  = 0x8C;
                          sbit TF0  = 0x8D;
                          sbit TR1  = 0x8E;
                          sbit TF1  = 0x8F;
                          
                          /*------------------------------------------------
                          TMOD Bit Values
                          ------------------------------------------------*/
                          #define T0_M0_   0x01
                          #define T0_M1_   0x02
                          #define T0_CT_   0x04
                          #define T0_GATE_ 0x08
                          #define T1_M0_   0x10
                          #define T1_M1_   0x20
                          #define T1_CT_   0x40
                          #define T1_GATE_ 0x80
                          
                          #define T1_MASK_ 0xF0
                          #define T0_MASK_ 0x0F
                          
                          /*------------------------------------------------
                          P1 Bit Registers
                          ------------------------------------------------*/
                          sbit P1_0 = 0x90;
                          sbit P1_1 = 0x91;
                          sbit P1_2 = 0x92;
                          sbit P1_3 = 0x93;
                          sbit P1_4 = 0x94;
                          sbit P1_5 = 0x95;
                          sbit P1_6 = 0x96;
                          sbit P1_7 = 0x97;
                          
                          /*------------------------------------------------
                          SCON Bit Registers
                          ------------------------------------------------*/
                          sbit RI   = 0x98;
                          sbit TI   = 0x99;
                          sbit RB8  = 0x9A;
                          sbit TB8  = 0x9B;
                          sbit REN  = 0x9C;
                          sbit SM2  = 0x9D;
                          sbit SM1  = 0x9E;
                          sbit SM0  = 0x9F;
                          
                          /*------------------------------------------------
                          P2 Bit Registers
                          ------------------------------------------------*/
                          sbit P2_0 = 0xA0;
                          sbit P2_1 = 0xA1;
                          sbit P2_2 = 0xA2;
                          sbit P2_3 = 0xA3;
                          sbit P2_4 = 0xA4;
                          sbit P2_5 = 0xA5;
                          sbit P2_6 = 0xA6;
                          sbit P2_7 = 0xA7;
                          
                          /*------------------------------------------------
                          IE Bit Registers
                          ------------------------------------------------*/
                          sbit EX0  = 0xA8;       /* 1=Enable External interrupt 0 */
                          sbit ET0  = 0xA9;       /* 1=Enable Timer 0 interrupt */
                          sbit EX1  = 0xAA;       /* 1=Enable External interrupt 1 */
                          sbit ET1  = 0xAB;       /* 1=Enable Timer 1 interrupt */
                          sbit ES   = 0xAC;       /* 1=Enable Serial port interrupt */
                          sbit ET2  = 0xAD;       /* 1=Enable Timer 2 interrupt */
                          
                          sbit EA   = 0xAF;       /* 0=Disable all interrupts */
                          
                          /*------------------------------------------------
                          P3 Bit Registers (Mnemonics & Ports)
                          ------------------------------------------------*/
                          sbit P3_0 = 0xB0;
                          sbit P3_1 = 0xB1;
                          sbit P3_2 = 0xB2;
                          sbit P3_3 = 0xB3;
                          sbit P3_4 = 0xB4;
                          sbit P3_5 = 0xB5;
                          sbit P3_6 = 0xB6;
                          sbit P3_7 = 0xB7;
                          
                          sbit RXD  = 0xB0;       /* Serial data input */
                          sbit TXD  = 0xB1;       /* Serial data output */
                          sbit INT0 = 0xB2;       /* External interrupt 0 */
                          sbit INT1 = 0xB3;       /* External interrupt 1 */
                          sbit T0   = 0xB4;       /* Timer 0 external input */
                          sbit T1   = 0xB5;       /* Timer 1 external input */
                          sbit WR   = 0xB6;       /* External data memory write strobe */
                          sbit RD   = 0xB7;       /* External data memory read strobe */
                          
                          /*------------------------------------------------
                          IP Bit Registers
                          ------------------------------------------------*/
                          sbit PX0  = 0xB8;
                          sbit PT0  = 0xB9;
                          sbit PX1  = 0xBA;
                          sbit PT1  = 0xBB;
                          sbit PS   = 0xBC;
                          sbit PT2  = 0xBD;
                          
                          /*------------------------------------------------
                          PSW Bit Registers
                          ------------------------------------------------*/
                          sbit P    = 0xD0;
                          sbit FL   = 0xD1;
                          sbit OV   = 0xD2;
                          sbit RS0  = 0xD3;
                          sbit RS1  = 0xD4;
                          sbit F0   = 0xD5;
                          sbit AC   = 0xD6;
                          sbit CY   = 0xD7;
                          
                          /*------------------------------------------------
                          Interrupt Vectors:
                          Interrupt Address = (Number * 8) + 3
                          ------------------------------------------------*/
                          #define IE0_VECTOR	0  /* 0x03 External Interrupt 0 */
                          #define TF0_VECTOR	1  /* 0x0B Timer 0 */
                          #define IE1_VECTOR	2  /* 0x13 External Interrupt 1 */
                          #define TF1_VECTOR	3  /* 0x1B Timer 1 */
                          #define SIO_VECTOR	4  /* 0x23 Serial port */
                          
                          #endif
                          Các bạn nhìn trên thấy là các thanh ghi, các port quả là giống như với ASM phải không. Do vậy việc lập trình các bạn sẽ làm việc trực tiếp với các các địa chỉ của Ram mà được định nghĩa ở trên
                          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


                          • #14
                            Giới thiệu các hàm ngắt.

                            Chào các bạn, hôm nay tôi xin giới thiệu cho các bạn một hàm nữa là các hàm ngắt.

                            Trong 8051 có 5 nguyên nhân sinh ra ngắt: ngắt ngoài 0, timer0, ngắt ngoài 1, timer1, ngắt nối tiếp.

                            Các bạn lại mở file regx51.h ra ở phần cuối của file như sau:

                            Code:
                            /*------------------------------------------------
                            Interrupt Vectors:
                            Interrupt Address = (Number * 8) + 3
                            ------------------------------------------------*/
                            #define IE0_VECTOR	0  /* 0x03 External Interrupt 0 */
                            #define TF0_VECTOR	1  /* 0x0B Timer 0 */
                            #define IE1_VECTOR	2  /* 0x13 External Interrupt 1 */
                            #define TF1_VECTOR	3  /* 0x1B Timer 1 */
                            #define SIO_VECTOR	4  /* 0x23 Serial port */
                            Địa chỉ của ngắt trong bảng vector ngắt = 8 * số thứ tự ngắt + 3,

                            số thứ tự ngắt = 0,1,2,3,4 như kí hiệu trong file đó. Như vậy địa chỉ trong RAM từ 0x03 đến 0x30 là dành cho bảng vector ngắt.

                            Cú pháp của hàm thực hiện ngắt như sau, hàm này không có tham số, không có kiểu trả về nên là dạng
                            Code:
                            void tềnham(void)
                            Cú pháp chính như sau:

                            Code:
                            void inter0(void) interrupt 0 using 1{
                            
                            }  // ngắt ngoài 0, dùng bank 1
                            Tương tự với các ngắt khác. Bạn thay số 0 bằng số thứ tự các ngắt tương ứng các ngắt tương ứng.

                            Code:
                            void inter1(void) interrupt 1 using 1{
                            }
                            
                            void inter2(void) interrupt 2 using 1{
                            }
                            Tiếp tục với 2 ngắt còn lại

                            Các bạn lưu ý là để vdk nhảy đến bảng vector ngắt thì bạn phải enable ngắt đó.

                            Ví dụ: bạn muốn ngắt nối tiếp thì phải cho như sau:
                            Các bạn xem lạ thanh ghi IE ở trong file regx51.h, thanh ghi này định được địa chỉ bit

                            Code:
                            EA = 1;// cho phép dùng ngắt
                            ES = 1;// dùng ngắt nối tiếp
                            Mai tôi sẽ viết tiếp. Bọn FPT chưa mắc ADSL cho nên viết bài hơi chậm, mong thông cảm, đợi vài ngày nữa khi mắc rồi mình sẽ viết bài liên tục về chủ đề này. Cung phu hơn nữa.

                            Chúc các bạn thành công
                            Last edited by ngohaibac; 09-01-2006, 09:32.
                            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 thaithutrang
                              Em nhớ ko nhâm thì vào ngắt nó mới tự động xóa? bạn xem kỹ hộ mình.
                              * Quy trình thì như NgohaiBac nói rất đúng, sử dụng ngắt nào thì Enable ngắt đó trước khi vào sử dụng! "thaithutrang" có lẻ nhớ nhầm cờ ngắt, chỉ khi vào trình phục ngắt, sau khi thực thi thì cờ ngắt được tự động xóa rồi thoát!
                              Còn việc vào 1 hàm ngắt, ngắt đó sẽ bị "cấm- Disenable" là do người lạp trình đã xóa bằng phần mềm, chẳng hạn ta cho bit "EA=0"(cấm ngắt toàn cục), hoặc IE0=0, khi đó trước khi thoát cần hồi phục lại nó!

                              * Trong phần khai báo ngắt, NgohaiBac chưa nói về cái "USING"
                              Trích từ đoạn code trên:
                              /-------------------------------------/
                              void inter0(void) interrupt 0 using 1
                              {
                              .
                              .
                              .
                              }
                              /-------------------------------------/
                              Đoạn khai báo trên khai báo Hàm ngắt ngoài 0, sử dụng Bank 1 là do ta chọn "UISNG 1"
                              Nếu bạn chọn "UISNG 0" có nghĩa là bạn chọn bank0, và đoanl code trên được viết lại như sau:
                              /-------------------------------------/
                              void inter0(void) interrupt 0 using 0
                              {
                              .
                              .
                              .
                              }
                              /-------------------------------------/

                              ;====================
                              Như vậy có 2 điểm cần lưu ý:
                              ;====================
                              1- Ta có thể chọn 4bank thanh ghi khi vào ngắt thông qua việc chọn UISNG0, hay 1 hay 2 hay 3
                              2- Mặc định chương khi khởi động Bank thanh ghi được chọn sẽ là Bank 0

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X