Thông báo

Collapse
No announcement yet.

Bộ nhớ chương trình, bộ nhớ dữ liệu, ngăn xếp, cơ chế ngắt và SFR của 8051

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

  • Bộ nhớ chương trình, bộ nhớ dữ liệu, ngăn xếp, cơ chế ngắt và SFR 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:
    - bộ nhớ chương trình
    - bộ nhớ dữ liệu
    - ngăn xếp
    - cơ chế ngắt
    - các thanh ghi chức năng đặt biệt SRF


    Thân mến,
    blackmoon.

  • #2
    Về Ram

    Tuy đã biết tới vdk (8051) cả 2 năm nhưng chủ yếu là mò mẫm tự tìm hiểu nên đôi khi gặp những khó khăn mà thực ra lại rất đơn giản. Phải chăng ta đã chưa hiểu hết được những điều cơ bản trong vi xử lí vi điều khiển? Và ta có phải thường xuyên coi lại những điều này? Những mục như vầy mở ra là rất hay nhưng hình như có quá ít bạn theo dõi và trao đổi thì phải. Dạo trước mình có nêu ra 1 thắc mắc nhỏ về ngắt trong mục 8051 những cái tui chưa biết và nhờ trao đổi với mọi người mà mình đã giải quyết tốt yêu cầu đề ra. Hôm nay xin được tiếp tục một thắc mắc loại nho nhỏ nữa, và cũng mong mọi người trao đổi.

    Về bộ nhớ RAM trong vdk8051, sách nói rằng ta có 128 byte ram, vậy ta nên hiểu 128 byte ram này là những ram nào? trong sơ đồ RAM thì thấy có 256 ô nhớ từ 00h đến ffh. Theo các bạn có phải là 128 byte đầu tiên của RAM không? khi viết chương trình giới hạn số biến của ta là 128 biền hay là lớn hơn hay là nhỏ hơn nhi?
    !e

    Comment


    • #3
      Hi zemen,

      Bộ nhớ RAM trong của 8051 và các chip biến thể của nó chỉ có 128 byte, đánh địa chỉ từ 00 đến 7F (hexa). Chỉ có các chip là biến thể của 8052 mới có dung lượng RAM trong gấp đôi (đánh địa chỉ từ 00 đến FF).
      Cấu trúc của 128 byte RAM trong (duy nhất đối với 8051 và nửa đầu tiên với 8052) bao gồm vùng các bank thanh ghi Ri (4 bank x 8 đều có tên R0..R7), vùng các byte RAM có thể đánh địa chỉ từng bit (16 byte nằm từ 20 đến 2F), còn lại là các byte RAM thông thường (không thể đánh địa chỉ đến từng bit, nằm từ 30h trở đi).
      Số biến tối đa là bao nhiêu còn tùy thuộc vào kiểu biến (dạng byte, bit hay word...) và tùy thuộc xem ngoài RAM onchip, hệ vi xử lý của bạn có ghép nối mở rộng thêm RAM ngoài hay không.

      Thân mến,
      blackmoon.

      Comment


      • #4
        Như vậy là với 8051, IRAM có 128 byte (bao gồm cả 4x8 thanh ghi R). Nhưng khái niệm IRAM của họ AVR, khác thì phải, vd mega8515 có 512 byte IRAM nhưng không bao gồm 32 thanh ghi R. Nếu trong chương trình có dùng ngắt thì sẽ phải để một số ô nhớ dùng cho stack point, do đó có phải là sô biến sẽ giới hạn < 128 không đây?
        Một cái nữa mình muốn hỏi là ,8052 có 256 byte IRAM, vậy mà khi khai báo 1 mảng có 128 phần tử trong Keil C, trình biên dịch lại o hiểu và báo là đầy RAM, vậy là sao?
        !e

        Comment


        • #5
          Nguyên văn bởi blackmoon Xem bài viết
          Hi zemen,

          Bộ nhớ RAM trong của 8051 và các chip biến thể của nó chỉ có 128 byte, đánh địa chỉ từ 00 đến 7F (hexa). Chỉ có các chip là biến thể của 8052 mới có dung lượng RAM trong gấp đôi (đánh địa chỉ từ 00 đến FF).
          Cấu trúc của 128 byte RAM trong (duy nhất đối với 8051 và nửa đầu tiên với 8052) bao gồm vùng các bank thanh ghi Ri (4 bank x 8 đều có tên R0..R7), vùng các byte RAM có thể đánh địa chỉ từng bit (16 byte nằm từ 20 đến 2F), còn lại là các byte RAM thông thường (không thể đánh địa chỉ đến từng bit, nằm từ 30h trở đi).
          Số biến tối đa là bao nhiêu còn tùy thuộc vào kiểu biến (dạng byte, bit hay word...) và tùy thuộc xem ngoài RAM onchip, hệ vi xử lý của bạn có ghép nối mở rộng thêm RAM ngoài hay không.

          Thân mến,
          blackmoon.

          tui thấy các thanh ghi chức năng đặc biệt đc định địa chỉ từ 80h->FFh.
          mà ở họ 8051 Ram dc định địa chỉ từ 00h->70h và các biến thể 8052 mới đc định địa chỉ từ 00h->FFh
          Vậy ở họ 8051 ko có các thanh ghi này sao?(chắc chắn là ko rùi )
          pác nào biết giải thích dùm với.

          Comment


          • #6
            Nguyên văn bởi BKV Xem bài viết
            tui thấy các thanh ghi chức năng đặc biệt đc định địa chỉ từ 80h->FFh.
            mà ở họ 8051 Ram dc định địa chỉ từ 00h->70h và các biến thể 8052 mới đc định địa chỉ từ 00h->FFh
            Vậy ở họ 8051 ko có các thanh ghi này sao?(chắc chắn là ko rùi )
            pác nào biết giải thích dùm với.
            Họ 8051 và tất cả các biến thể của nó đều có các SFR nằm ở địa chỉ 80H - FFH. Để truy cập vùng địa chỉ này ta phải dùng phương pháp định địa chỉ trực tiếp.
            với các biến thể của 8051 có 256 byte RAM thì sẽ phân bố từ 00H - FFH. Tuy nhiên chỉ có vùng 00H - 7FH là có thể được truy xuất bằng 2 phuơng pháp là định địa chỉ trực tiếp và gián tiếp. 128 Byte cao 80H - FFH (không phải SFR)chỉ có thể truy xuất bằng phương pháp định địa chỉ gián tiếp. Khi truy xuất bằng phương pháp định địa chỉ trực tiếp trong trường hợp này thì bạn sẽ tác động lên SFR.
            Thông thường với vùng RAM từ 80H - FFH người ta sẽ dùng làm STACK.
            Hy vọng có thể giúp bạn rõ hơn về vấn đề này.
            Chúc thành công
            Tìm tiên giữa suối mơ
            Rêu xanh, đá trắng bụi lu mờ

            Comment


            • #7
              Bộ nhớ của 8051 có thể chia thành mấy vùng thế này:
              1. Bộ nhớ Rom
              2. Bộ nhớ RAM trong
              3. Bộ nhớ RAM ngoài
              4. Vùng các thanh ghi chức năng đặc biệt
              Tôi có thể nói qua về từng vùng nhớ như sau:
              1. Bộ nhớ Rom, được đánh địa chỉ từ 0-0ffffh, bao gồm 64Kb. Rom không phân biệt bộ nhớ trong và nhớ ngoài. Thường, 8051 được tổ hợp sẵn một lượng Rom trong vi điều khiển gọi làm Rom on-chip, lượng này biến đổi tuỳ theo từng con, ví dụ, với AT89C51 là 4Kb, AT89C52 là 8Kb,AT89C53 là 12Kb. Lượng Rom này chiếm vùng địa chỉ thấp của 8051, tức là từ địa chỉ từ 0 trở đi. Người sử dụng có thể dùng lượng Rom này để lưu chương trình hoặc hoàn toàn dùng ROM ngoài hoặc sử dụng phần thấp là ROM trong, phần địa chỉ cao là ROM ngoài. Điều này được xác lập cho vi điều khiển biết bằng một chân của 8051 được nối đất hay nối lên dương nguồn.
              2. Bộ nhớ Ram trong, đối với 8051 là 128byte, đối với 8052 là 256 byte. Địa chỉ được đánh từ 0, nghĩa là vơí 8051 là 0-127, đối với 8052 là 0-255. Ram trong được chia thành các vùng sau:
              - vùng các bank thanh ghi, bao gồm 4 bank, lần lượt là bank 0, bank 1, 2, và bank 3, chiếm địa chỉ từ 0-1Fh. Mỗi băng có 8 thanh ghi đều đánh tên từ R0-R7. Mặc định, 8051 sử dụng bank0. Có thể thay đổi giữa các bank bằng cách thay đổi trạng thái 2 bit RS0 và RS1(register selector) trong thanh ghi trạng thái chương trình.
              -Vùng tiếp theo có địa chỉ từ 20-2fH bao gồm 16 byte là vùng định địa chỉ mức bit. Vùng này đặc biệt hơn các vùng khác là có thể truy nhập tới từng bit của nó. Để truy nhập vùng này có thể truy nhập theo 2 cách, theo vị trí của bit trong byte hoặc theo địa chỉ bit. Ví dụ bit để đặt bit số 0 của byte có địa chỉ 20H lên mức 1 có thể truy nhập với tên là setb 20H.0 hoặc setb 0.
              -Vùng thứ 3 là vùng RAM mục đích chung có địa chỉ từ 30H trở lên. Vùng này không có gì đặc biệt, nó cho phép truy nhập theo byte.
              Để truy nhập RAM có 3 chế độ định địa chỉ cơ bản đó là chế độ định địa chỉ thanh ghi đối với 4 bank thanh ghi, chế độ định địa chỉ trực tiếp đối với vùng địa chỉ từ 0-127 và cuối cùng là chế độ định địa chỉ gián tiếp.
              3. Bộ nhớ RAM ngoài: 8051 có thể quản lý tối đa 64Kbyte RAM ngoài, địa chỉ từ 0-0ffffH. Vùng Ram này có chế độ truy nhập duy nhất là gián tiếp và lệnh là MOVX. Chỉ có 2 lệnh đó là đọc RAM: MOVX A,@dptr và ghi RAM là MOVX @dptr,A. Một số IC mới đây tổ hợp vào bên trong một lượng RAM nhất định như AT89S8252 có 2Kbyte, nó chiếm vùng địa chỉ thấp của RAM.
              4. Vùng các thanh ghi chức năng đặc biệt SFR (special Function Register) có địa chỉ từ 80H-0ffh. Vùng này có chế độ truy nhập duy nhất là định địa chỉ trực tiếp. Do đó, phải lưu ý tránh nhầm lẫn với vùng 128 byte cao của RAM trong. Đối với 128 byte cao của RAM trong chỉ có chế độ duy nhất là gián tiếp. Ví dụ thanh ghi R0 có giá trị bằng 90H. Thì lệnh mov a,@R0 là đọc nội dung của ô nhớ 90H trong Ram trong, còn lệnh mov a,90H là đọc nội dung thanh ghi có địa chỉ 90H trong SFR.
              Last edited by qanhep; 22-11-2006, 15:47.

              Comment


              • #8
                Ngăn xếp là một khái niệm quan trọng và có thể dẫn đến những lỗi rất khó hiểu nếu như ta không hiểu và sử dụng nó hợp lý.
                Về ngăn xếp: Ngăn xếp thực chất là một vùng nhớ trong RAM trong hoạt động theo nguyên tắc "vào trước ra sau" và được quản lý bởi con trỏ ngăn xếp.
                Bình thường, khi cấp nguồn con trỏ ngăn xếp SP (stack poiter) bằng 07H, nghĩa là nó sử dụng địa chỉ của bank thanh ghi 1 trong RAM là địa chỉ đầu tiên của ngăn xếp. Mỗi khi có lệnh gọi chương trình con, hoặc lệnh RET, RETI, các lệnh PUSH, POP giá trị của con trỏ ngăn xếp tự động tăng hoặc giảm để luôn chỉ đến đỉnh ngăn xếp.
                Người sử dụng có thể xác lập lại địa chỉ của ngăn xếp bằng cách di chuyển trực tiếp một giá trị vào con trỏ SP. Ví dụ, muốn ngăn xếp bắt đầu từ địa chỉ 120 trở lên thì dùng lệnh MOV SP, #120.
                Ngăn xếp thường được sử dụng để cất giữ địa chỉ trở về và các thanh ghi quan trọng khi thực hiện chương trình con.

                Comment


                • #9
                  8051 dành một vùng 128 byte từ địa chỉ 80H-0FFH cho các thanh ghi chức năng đặc biệt SFRs. Tuy nhiên, thực tế chỉ một số trong số vùng địa chỉ này được sử dụng. Một điều lưu ý là những địa chỉ còn lại không được phép ghi đọc lên nó. Những địa chỉ này có thể được sử dụng trong một số vi điều khiển sau này.
                  Trong số các thanh ghi của 8051 có một số thanh ghi cho phép định địa chỉ mức bit. Đó là các thanh ghi có địa chỉ cuối là 0 và 8 ví dụ 80H, 88H. Các bit này chiềm vùng địa chỉ bit từ 80H đến 0ffH.
                  Các thanh ghi còn lại cho phép truy nhập ở mức byte.
                  Lưu ý là vùng SFRs chỉ cho phép truy nhập sử dụng chế độ định địa chỉ trực tiếp.

                  Comment


                  • #10
                    Nguyên văn bởi qanhep Xem bài viết
                    Ví dụ thanh ghi R0 có giá trị bằng 90H. Thì lệnh mov a,@R0 là đọc nội dung của ô nhớ 90H trong Ram trong, còn lệnh mov a,90H là đọc nội dung thanh ghi có địa chỉ 90H trong SFR.
                    hai lệnh này tác động đến hai đối tượng khác nhau ư ???? r u sure ??
                    thanh ghi có địa chỉ 90h khác với ô nhớ có địa chỉ 90h ư???

                    Comment


                    • #11
                      Nguyên văn bởi sinhluc Xem bài viết
                      hai lệnh này tác động đến hai đối tượng khác nhau ư ???? r u sure ??
                      thanh ghi có địa chỉ 90h khác với ô nhớ có địa chỉ 90h ư???
                      Tất nhiên rồi!
                      8052 có vùng địa chỉ 128byte RAM từ 80H-0ffH và vùng SFRs cũng trùng với địa chỉ đó. Để phân biệt trong việc truy nhập đến 2 vùng này nó quy định chế độ định địa chỉ:
                      -128byte RAM từ 80H-0FFH truy nhập bằng chế độ định địa chỉ gián tiếp sử dụng thanh ghi R0 hoặc R1 của bank thanh ghi hiện hành
                      -Vùng SFRs cũng có địa chỉ 80H-0ffH được truy nhập sử dụng chế độ định địa chỉ trực tiếp. 90H thực chất là địa chỉ của thanh ghi P1, ví dụ lệnh mov P1,#55H cũng tương đương với lệnh mov 90H,#55H, còn lệnh:
                      mov R0,#90H
                      mov @R0,#55H
                      thì khác hoàn toàn, nó ghi vào RAM trong.

                      Comment


                      • #12
                        Thứ tự ngắt ???

                        xin các bác cho hỏi: thứ tự các ngắt sảy ra như thế nào trong trường hợp có nhiều ngắt cùng mức ưu tiên xảy ra đồng thời, rồi trường hợp có nhiểu ngắt cùng nguyên nhân xảy ra trong khi đang thực hiện một ngắt khác thì các yêu cầu có được lưu lại (ví dụ khi đang thực hiện ngắt định thời mà liên tục sảy ra 5 ngắt ngoài 0 - thì nó có thực hiện đủ 5 lần ko nhỉ , là thế nào ) ???

                        Comment


                        • #13
                          8051 có 6 nguồn ngắt tương ứng với 5 vector ngắt, cụ thể là:
                          1. ngắt ngoài INT0 - tương ứng với chân P3.2
                          2. Ngắt timer0
                          3. Ngắt ngoài INT1 - tương ứng với chân P3.3
                          4. Ngắt timer1
                          5. Ngắt nối tiếp (có 2 nguồn ngắt: ngắt truyền và ngắt nhận)
                          Để biết khi các ngắt xảy ra, các ngắt xảy ra đồng thời, một cái trước một cái sau thì chương trình phục vụ thế nào có thể căn cứ vào các yếu tố sau đây:
                          1. Thanh ghi ưu tiên ngắt IP(interrupts priority). Thanh ghi này là thanh ghi 8 bit cho phép truy nhập ở mức byte, trong đó sử dụng 5 bit tương ứng với năm ngắt tôi đã kể trên. Cụ thể các bit là IP.0 <=>PX0, đây là bit ưu tiên ngắt ngoài INT0. Nếu bit này bằng 1, ưu tiên ngắt ngoài ở mức cao, nếu bit này bằng 0, ưu tiên ngắt ngoài ở mức thấp. Tương tự, các bạn có thể tìm hiểu thêm với các bit còn lại là PT0, PX1, PT1 và PS.
                          Các bạn sẽ hỏi, vậy nếu hai bit PX0 và PT0 chẳng hạn cùng ở mức 1 thì ngắt nào sẽ được phục vụ trước, ngắt nào được phục vụ sau. Vậy thì bạn lại phải căn cứ tiếp vào thứ tự ưu tiên ngắt mặc định trong trường hợp không thể phân biệt được ngắt nào có mức ưu tiên cao hơn dựa vào các bit thanh ghi IP.
                          2. Thứ tự ưu tiên ngắt mặc định, tôi liệt kê theo thứ tự cao nhất đến thấp nhất: 1. ngắt INT0 -> 2. ngắt Timer0 -> 3. ngắt INT1 -> 4. Ngắt Timer1 -> 5.ngắt cổng nối tiếp.
                          Và đây cũng chính là thứ tự của các địa chỉ vector ngắt trong ROM của các chương trình phục vụ ngắt. INT0 có địa chỉ ngắt là 03H, các ngắt khác theo thứ tự ưu tiên có địa chỉ lần lượt cộng thêm 8 byte. Ví dụ, timer0 có địa chỉ là 11D hay 0BH.
                          Khi 2 hay nhiều ngắt xảy ra đồng thời, hoặc một ngắt đang được phục vụ mà một ngắt khác xảy ra thì cứ theo thứ tự ưu tiên mà chương trình phục vụ ngắt cao nhất tại thời điểm đó được phục vụ.
                          Khi một ngắt có mức ưu tiên cao hơn đã được phục vụ xong, nếu các ngắt còn lại vẫn còn có yêu cầu thì tiếp tục được phục vụ. Ví dụ với ngắt timer0 mà cờ ngắt chưa được xóa thì vẫn được phục vụ.

                          Comment


                          • #14
                            [QUOTE=qanhep;35933]5. Ngắt nối tiếp (có 2 nguồn ngắt: ngắt truyền và ngắt nhận)
                            vậy muốn có ngắt cổng nối tiếp khi có dữ liệu nhận còn khi truyền thì ko ngắt làm thế này có được ko?hay đã ngắt nối tiếp thì cả hai?
                            MOV IE,#10010000
                            MOV SCON,#52H
                            và trong chương trình ngắt chỉ cần
                            CLR RI
                            MOV A,SBUF?

                            Comment


                            • #15
                              Khi cho phép ngắt nối tiếp, thì cứ một trong hai cờ ngắt RI hoặc TI được đặt bằng 1 thì chương trình sẽ nhảy đến đỉa chỉ 23H trong Rom để thực hiện chương trình phục vụ ngắt. Khi chỉ muốn phục vụ ngắt nhận thì chương trình trình phục vụ ngắt tiến hành kiểm tra cờ ngắt nhận hoặc ngắt truyền. Nếu cờ ngắt nhận RI=1 thì thực hiện chương trình phục vụ ngắt,còn nếu ngược lại thì bỏ qua ( có thể sử dụng lệnh JNB RI,thoat_ngat). Trong cả 2 trường hợp đều phải xóa bằng phần mềm cờ TI và RI trong chương trình phục vụ ngắt.

                              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