Thông báo

Collapse
No announcement yet.

Nhờ giúp đỡ : 89C51 và RAM

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

  • Nhờ giúp đỡ : 89C51 và RAM

    Tôi đang dùng Keil để viết cho 89C51, nhưng cần khai báo biến có dung lượng lớn hơn 128 bytes, như thế có phải bắt buộc dùng RAM ngoài không ? Có cách nào không cần phải dùng RAM ngoài không ? Nhờ các bác chỉ giúp.

    Xin cảm ơn !

  • #2
    Nguyên văn bởi ANE
    Tôi đang dùng Keil để viết cho 89C51, nhưng cần khai báo biến có dung lượng lớn hơn 128 bytes, như thế có phải bắt buộc dùng RAM ngoài không ? Có cách nào không cần phải dùng RAM ngoài không ? Nhờ các bác chỉ giúp.

    Xin cảm ơn !
    Bạn có thể dùng chip có RAM lớn hơn , như 89C52 chẳng hạn (256 byte RAM ). Còn nếu bộ nhớ RAM cần dùng quá lớn thì đành phải dùng RAM ngoài thôi !

    Comment


    • #3
      Cảm ơn bác !

      Tôi dùng Keil để viết chương trình, cần khai báo một biến lớn khoảng 4Kb(dùng để lưu giữ bộ font trong chương trình quang báo).Tôi có tìm hiểu một số sơ đồ mạch về ROM, RAM nhưng không hiểu. Làm sao khai báo một biến trong chương trình mà nó lại tự nằm ở RAM ngoài ? Bác có sample nào không ?

      Comment


      • #4
        Lại gặp dân làm quang báo...

        Nguyên văn bởi ANE
        Tôi dùng Keil để viết chương trình, cần khai báo một biến lớn khoảng 4Kb(dùng để lưu giữ bộ font trong chương trình quang báo).Tôi có tìm hiểu một số sơ đồ mạch về ROM, RAM nhưng không hiểu. Làm sao khai báo một biến trong chương trình mà nó lại tự nằm ở RAM ngoài ? Bác có sample nào không ?
        Chào ANE, làm quang báo thì phải dùng bộ nhớ ngoài mới đủ dung lượng cho buffer và character code. Ghép nối phần cứng thì là kỹ năng cơ bản rồi nhé, còn phần mềm với Keil, biến trong RAM ngoài hãy khai báo nó với từ khóa "xdata" sau từ khóa định kiểu.
        Ví dụ:
        [code:1]unsigned char xdata array[100];[/code:1]
        Quy Nhơn trời đẹp không bác?

        Comment


        • #5
          Cảm ơn bác đã chỉ dẫn !

          Quy Nhơn mùa này đẹp lắm bác ạ. Biển xanh ngắt, còn gió Nam thì mạnh phải biết. Khi nào rảnh mời bác vào QN chơi

          Vẫn còn một thắc mắc nữa, nhờ bác chỉ luôn.
          Khi giao tiếp VXL với ROM, RAM hay 8255..., tớ thấy phải có thao tác chọn chip để làm việc, giả sử chúng ta dùng 74LS138. Như vậy muốn thao tác với RAM phải chọn RAM thông qua 74LS138, nghĩa là trong chương trình mình phải làm việc này. Như bác nói, việc khai báo xdata sẽ tự đặt biến vào RAM, như vậy làm sao nó hiểu mà tự đặt vào đó được ? Kết nối VXL với RAM gồm có bus dữ liệu và bus địa chỉ và thông qua 74LS138. Nếu nó tự đặt biến vào RAM thì mạch có phải bắt buộc theo một cách kết nối nào đó không ?

          Comment


          • #6
            Ghép nối với bộ nhớ ngoài

            Giao tiếp với bộ nhớ ngoài có nhiều cách, miễn sao tạo được giản đồ thời gian (timing diagram) đúng yêu cầu của bộ nhớ cần ghép nối. Bác có thể "làm bằng tay" các xung trong giản đồ đó bằng các lệnh setb, clr; chỉ cần làm đúng thứ tự và đảm bảo yêu cầu về thời gian (độ rộng xung, khoảng thời gian giữa các xung). Tuy nhiên nên sử dụng bus mở rộng của 8051. Khi ghép nối với theo cách này, bác sẽ dùng hai cổng p0p2 (tất nhiên không sử dụng làm I/O được nữa), tín hiệu ALE (#PSEN nếu là ghép nối với bộ nhớ chương trình ngoài) cùng một mạch giải mã. 74138 bác đề cập đến chính là thuộc phần mạch giải mã. Sau đó việc tạo các tín hiệu theo timing diagram sẽ là việc của phần cứng phụ trách bus trên chip, bác không cần phải thực hiện các lệnh setb hay clr để làm các việc này nữa. Tất cả những gì phải làm là viết ra một câu lệnh truy nhập bộ nhớ ngoài (là lệnh MOVX trong asm). Khi CPU thực hiện lệnh này sẽ đảm bảo giao tiếp với bộ nhớ ngoài theo đúng timing diagram.
            Hãy ghép nối với bộ nhớ ngoài sử dụng bus mở rộng của 8051 và hãy xây dựng mạch giải mã phù hợp với dải địa chỉ mà bác dành cho biến nhớ ngoài. Đó là những gì bác cần phải làm.

            Comment


            • #7
              Như vậy có nghĩa là tớ làm cái mạch y như trong cuốn Vi điều khiển của Tống Văn On là có thể khai báo RAM ngoài được ?

              Comment


              • #8
                Tại hạ chưa từng cầm cẩm nang đó trên tay nên cũng không biết trả lời thế nào, chỉ biết là ghép nối với bộ nhớ ngoài theo kiểu bus (có các đường dữ liệu và địa chỉ ghép với P0 và P2 ấy).

                Comment


                • #9
                  Tớ sẽ cố gắng thử và cho bác biết kết quả. Vì chưa từng học điện tử bao giờ nên tớ không biết được các quy trình, các giới hạn, các nguyên tắc... của điện tử. Giờ làm thì cứ gặp cái gì bí là search, là đọc, là hỏi. Mong là không phiền bác.

                  Hôm rồi tớ thấy một cái mạch, họ dùng con NE555 và một biến trở để điều khiển tốc độ nhanh chậm của vi xử lí(giống như ta dùng thạch anh 12, 24 nhưng thấy trong mạch vẫn có thạch anh). Mà lạ là sao ngõ ra của NE555 lại nối vào chân read của 89C2051. Tớ lại lục sách mà không hiểu sao cả. Bác có kinh qua thì chỉ tớ với. Chắc phải trả nợ bác bằng tin học vậy

                  Comment


                  • #10
                    Bác post thử cái mạch lên xem cái, chỉ miêu tả thôi thì tù mù lắm. Còn vụ tin học thì cho bác nợ nhé, sau này sẽ đòi

                    Comment


                    • #11
                      Nguyên văn bởi ANE
                      Như vậy có nghĩa là tớ làm cái mạch y như trong cuốn Vi điều khiển của Tống Văn On là có thể khai báo RAM ngoài được ?
                      Nếu bạn dùng KeilC để lập trình sử dụng RAM ngoài,bạn có thể sử dụng các cách sau :
                      *Cách 1 :Vào Target, chọn Memory Model là Large , khi đó mọi biến bạn khai báo đều được lưu trữ trong RAM ngoài.Cách này đơn giản nhưng có nhược điểm là không quản lý được biến, compiler sẽ tự định địa chỉ cho biến của bạn.
                      *Cách 2 :Chọn Memory Model là small. Khi đó , biến nào khai báo ở dạng xdata thì sẽ hiểu là RAM ngoài.
                      VD : unsigned char xdata Dulieu[10];
                      cách này thường được sử dụng rộng rãi, tuy nhiên RAM của bạn phải bắt đầu từ địa chỉ 0x0000.
                      *Cách 3 : Nếu vùng địa chỉ của RAM không bắt đầu từ 0x0000 , chẳng hạn bạn sử dụng mạch giải mã để đặt địa chỉ cho RAM bắt đầu từ 0x8000 , khi đó ta có thể sử dụng thư viện "absacc.h" ,ví dụ khai báo như sau :

                      #include "absacc.h"
                      ....
                      #define baseaddr 0x8000

                      void InitRAM()
                      {
                      unsigned char i;
                      for(i=0;i<10;i++)
                      XBYTE[baseaddr+i]=i; // Ghi vào RAM ngoài 10 giá trị , bắt đầu từ
                      // 0x8000
                      }

                      lúc lấy giá trị ra, bạn có thể gọi : x=XBYTE[address];

                      -Với các khai báo như trên, compiler sẽ hiểu là sử dụng RAM ngoài, và như blackmoon đã nói,việc trao đổi thông tin với RAM ngoài sẽ được VĐK thực hiện bằng lệnh movx, các xung ALE,RD,WR sẽ họat động theo nhịp clock để trao đổi với RAM.

                      Comment


                      • #12
                        Để tớ chụp rồi tớ post lên. Đó là cái mạch điều khiển đèn neon đấy, dùng AT89C2051 để điều khiển(chỉ có 8 đèn = 1 port) và BTA16 làm công suất. Nó cho phép điều khiển nháy nhanh hay chậm thông qua một biến trở. Tớ thấy nó dùng con NE555, chân ra của con này nối vào chân 11 của AT89C2051.

                        Theo bác thì có cách nào điều khiển nhanh chậm thông qua biến trở ? Dùng biến đổi AD ?

                        Comment


                        • #13
                          Theo bác thì có cách nào điều khiển nhanh chậm thông qua biến trở ? Dùng biến đổi AD ?
                          Kiểu gì thì cũng phải biết được sự thay đổi của biến trở. Trong mạch của bác không thấy nói đến ADC, chỉ thấy nói đến 555, có thể là họ cho biến trở vào mạch dao động 555 và xử lý xung đầu ra mạch dao động. Cụ thể thế nào thì để bác post cái schematic lên đã nhé.

                          Comment


                          • #14
                            Neu ban lam quang bao ma khong can doi noi dung tu ban phim thi co the luu trong ROM noi cua 8951.
                            unsigned char code data[]={1,4,7}
                            Su dung bien dât giong nhu mang
                            Vd: data[0] la 1

                            Comment


                            • #15
                              Neu ban lam quang bao ma khong can doi noi dung tu ban phim thi co the luu trong ROM noi cua 8951.
                              unsigned char code data[]={1,4,7}
                              Su dung bien data giong nhu mang
                              Vd: data[0] la 1

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X