Thông báo

Collapse
No announcement yet.

Lại Bộ nhớ ngoài cho 89C51?????

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

  • Lại Bộ nhớ ngoài cho 89C51?????

    Yêu cầu thiết kế bộ nhớ Ram ngoài cho 89C51. Đã thiết kế và tiến hành chạy thử trên Proteus, chạy rất ngon. Chương trình viết bằng cả Keil C và hợp ngữ nhưng không hiểu tại sao khi rút chốt 74LS373 mạch vẫn chạy mặc dù nếu không có chốt thì không thể truyền địa chỉ cho RAM ngoài. Mong các đại gia ngâm cứu và giúp đỡ !


    _____ Chương trình C:
    #include <regx51.h>
    #include <absacc.h>
    void delay(unsigned char ms){
    unsigned char i,j;
    for(i=0;i<ms;i++)
    for(j=0;j<250;j++)
    {}
    }
    void viet(unsigned char d,unsigned int dc){
    XBYTE[dc]=d;
    }
    void doc(unsigned char dc){
    P1=XBYTE[dc];
    delay(1000);
    }

    void main()
    {
    unsigned char dc,n;
    dc=0x1000;
    while(1){
    for(n=0;n<256;n++) // Viết các số từ 0 đến 255
    {
    viet(n,dc);
    doc(dc);
    dc++;
    }
    }
    }


    ___ Chương trình hợp ngữ:

    ; thu lam!!!
    COUNT EQU 10000
    org 00h
    mov TMOD,#01h
    MOV R0,#09
    mov A,#00h
    mov DPTR,#1000h
    GHI:
    movx @DPTR,A
    movx A,@DPTR
    mov P1,A
    ACALL DELAY
    INC A
    INC DPTR
    DEC R0
    JNZ GHI
    DELAY:
    MOV R2,#100
    LAP1:
    MOV TH0,#HIGH COUNT
    MOV TL0,#LOW COUNT
    SETB TR0
    LAP2:
    JNB TF0, LAP2
    CLR TR0
    CLR TF0
    DJNZ R2, LAP1
    RET
    RET
    END

  • #2
    Mình cũng đã lắp mạch thật, kết quả thu được tương tự, tức là cho out ra P1, các Led hiển thị đúng kể cả khi không có chốt. Nhưng rõ ràng địa chỉ trên 1000h là đã thuộc Ram ngoài. Khi rút RAM thì mạch không chạy. Không hiểu tại sao ?

    Comment


    • #3
      vì n = dc, hai cái này trùng nhau nên vẫn đúng

      Comment


      • #4
        Bạn thử đổi chương trình như sau :
        Viết một loạt dử liệu tù 1 đến 255 vào các dịa chỉ từ 1000 đến 1254.
        Sau đó đọc các dử liệu ở địa chỉ 1000 đến 1254 xem có bị lỗi không.Chắc chắn giá trị đọc ra sẽ bị sai(chỉ 1 hoặc 2 địa chỉ được đọc đúng).Lỗi của bạn là viết và đọc liên tiếp nhau và ở 1 địa chỉ nên khi tháo con chốt ra giá trị đọc ra ở hai trường hợp đều đúng.Bạn không nên tháo con chốt vì không đúng kỹ thuật và không đúng thiết kế cho mạch sử dụng ram ngoài.Chúc thành công.

        Comment


        • #5
          Hãy làm thành 2 chương trình riêng biệt:
          -Ghi 1 loạt ví dụ 10 bye nhưng giá trị của Bye đầu tiên là: 10
          nghĩa là: tại ô 1000 chứa giá trị là 10
          --------------1001---------------11
          ------------------------------------
          --------------1009---------------19
          -Sau đó là đọc ra tuần tự.

          Rồi cứ tién hành rút chốt đi, chắc chắn việc truy xuất sẽ báo lỗi.

          Comment


          • #6
            Cảm ơn các huynh. Tui đã viết lại và chương trình giờ chạy rất ngon rồi. Chân thành cảm ơn!

            Comment


            • #7
              Chào các bác.
              Đã có Bác nào làm giao tiếp VDk với At28c64 sử dụng kiểu nối trực tiếp ( 24 chân, không dùng con chốt ) chưa? Tôi làm nhưng chỉ đọc được thôi. Làm đúng như datasheet mà cũng chẳng thể ghi được(mặc dù đã xóa trắng) , điên quá. Có trục trặc gì không nhỉ?
              /*
              Hardware configuration:
              P0 & P1 are used as address lines.
              P2 is used as data lines.
              P3_0 is used as Chip select. (CE)
              P3_1 is used as Write control (WE)
              P3_2 is used as Read control (OE)
              */
              code:

              unsigned char addr, temp=1;
              for( addr=0; addr<=15; addr++ )
              {
              //P2=0xff; /* OutPut */
              P0=addr; /* Low address */
              P1=0x00; /* Hight address */
              CE=0; /* Chip select */
              OE=1; /* Out put disable */
              WE=0; /* Initiate a write cycle & the address is latched */
              delay(10);
              P2=addr; /* Data out */
              WE=1; /* Data latch */
              delay(20); /* delay 10ms */
              OE=0;
              CE=1; /* Write completed */
              delay(100);
              }
              Last edited by newcomer; 04-01-2006, 11:44.

              Comment


              • #8
                Cảm ơn Bác MD nhưng em đã thử hết cách rồi. Bài viết cua Bác Blackmoon không giúp được bài này. Có Bác nào đã làm thực tế chưa giúp em phát.

                Comment


                • #9
                  Giao tiếp với 28C64 thì sách nào chẳng có. Bạn cứ vẽ mạch thực hiện là xong thôi có gì mà phải hỏi nhiều. Bạn nên nhớ rằng thực hiện ghép nối với 28C64 mà theo kiểu I/O trực tiếp thế này thì không ai làm như vậy cả! 8051 hỗ trợ phần cứng và lệnh MOVX rồi! Cách làm I/O kiểu trực tiếp không khả thi...và CHẲNG BAO GIỜ LÀM NHƯ VẬY! nó ngốn của bạn gần hết chân VDK rồi.

                  Mà sao không dùng kiểu I2C cho nó nhanh gọn tốn ít chân nhỉ?
                  Hi vọng bài viết giúp X được cho bạn.

                  Comment


                  • #10
                    He he, giang v...to d...to chuyển sang làm I2C đi, làm mạch đơn giản lắm, mà 24C64 có 12k/con thôi. Đảm bảo cắm phát chạy luôn.

                    Comment


                    • #11
                      Bạn vào datasheet xem giản đồ xung khi viết và đọc,chú ý thời gian giữa các xung.Dòng IC nầy có tốc độ truy cập nhanh,bạn dùng delay ms chậm quá,thử thay delay bằng vài dòng Nop(vài microsec) .Tăng hoặc giảm số nop nầy tùy thuộc vào thạch anh(dao động) cho đến khi viết được vào IC thôi .Chúc thành công.

                      Comment


                      • #12
                        Đã bỏ 8051 hỗ trợ lệnh MOVX rồi mà còn bảo tốn hết nhiều chân!
                        Nói vậy là không hợp lý rồi!
                        Anh em thử nghĩ lại đi:
                        -Có phải tốn nhiều chân nhưng thời gian truy xuất lại nhanh( song song)
                        -Ít tốn chân thì bù lại phải mất thời gian truyền data( do truyền nối tiếp)
                        Đó là lý do và thuận lợi khi được hỗ trợi lệnh MOVX

                        Comment


                        • #13
                          Em đang định làm dao tiếp rom ngoài với vdk 8051,em đọc mấy bài viết của các bác không thấy đề cập đến việc gửi data ra rom dùng chính vdk, không biết 8051 có hổ trợ vấn đề này không các bác nhỉ
                          Last edited by tuan11; 14-05-2006, 17:44.
                          |

                          Comment


                          • #14
                            cai nha ong nay hay nhi ROM la bo nho chi doc. The ma dinh dung 8051 de viet du lieu vao Rom the thi chang khac nao ROM cung nhu RAM ha? neu dung EEPROM thi con viet duoc hoac UVROM thi con duoc chu ROM thuong ghi co mot mot lan la toi khong co lan thu hai dau.muon ghi phai dung cai mach nap ROM thi moi ghi duoc. nap vao thi chi co doc ra thoi khong ghi duoc vao nua nen khong the co lenh nao gui du lieu vao ROM dau.

                            Comment


                            • #15
                              Nguyên văn bởi tuan11
                              Em đang định làm dao tiếp rom ngoài với vdk 8051,em đọc mấy bài viết của các bác không thấy đề cập đến việc gửi data ra rom dùng chính vdk, không biết 8051 có hổ trợ vấn đề này không các bác nhỉ
                              Tốt nhất nên xem sách đi đã, làm trúng chỗ nào vướng thì hỏi, thế nha!
                              Đown và đọc ở đây
                              http://dientuvietnam.net/forums/showthread.php?t=2197

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X