8051_vonneumann

G

Gi

Guest
Chào,

I có thể biết được những gì-von Neumann bộ nhớ lúc 0xE000?

Có nghĩa là gì trong mã kèm theo?Làm thế nào tôi có thể áp dụng mã?Hiện nay tôi có một hội đồng mà là c52 giao diện bên ngoài SRAM 62.256.

Xin tư vấn.

Cảm ơn bạn.
Xin lỗi, nhưng bạn cần phải đăng nhập để xem tập tin đính kèm này

 
Tất cả phụ thuộc vào cách SRAM bên ngoài là ánh xạ, những gì nó chiếm vùng địa chỉ ..

Nếu bạn có PSEN và RD kết nối với một cửa khẩu và sau đó kết nối với RD / pin của SRAM bạn có thể, bằng cách sử dụng khái niệm von Neumann, nơi một khối duy nhất của bộ nhớ có thể được ánh xạ để hoạt động như cả dữ liệu và bộ nhớ chương trình (Điều này được gọi là là kiến trúc Von Neumann), tải lên và sau đó thực thi mã từ SRAM cũng như giữ dữ liệu trong nó ..
Bằng việc áp dụng các kiến trúc Von Neumann, mã có thể được ghi vào bộ nhớ là byte dữ liệu (MOVX), và sau đó thực hiện như hướng dẫn chương trình ..

Ví dụ, nếu SRAM của bạn có vị trí E000h bạn có thể làm điều này:
LJMP E000h
Và sẽ tiếp tục thực thi mã từ SRAM ..

Rgds,
IanP

BTW couldn t chi .. tập tin đính kèm của bạn

 
Chào,

Cám ơn trả lời của bạn.Xin lỗi, chỉ là. Zip file đính kèm.Now to i thay đổi nó. Rar file.Đính kèm là mã hóa được sử dụng các trình biên dịch Keil.Xin thử tải xuống một lần nữa .. Nếu vẫn không thể đọc được tập tin đính kèm xin vui lòng cho tôi biết một lần nữa ..

Ya, bạn có nghi thức.Bạn đang giải thích tương tự như tập tin đính kèm của tôi.Nhưng làm thế nào tôi có thể áp dụng phương pháp này?Có, c52 tôi / PSEN và / RD được kết nối vào và cửa khẩu và sản lượng đến 62.256 SRAM.Làm thế nào tôi có thể làm một số thực tế về điều đó?I có thể biết tình hình trong đó chúng ta có thể sử dụng phương pháp này?Xin quý vị danh sách ra vài ví dụ ..Mã mẫu nói là cho debuger để mô phỏng cấu hình phần cứng!Có nghĩa là gì?

Cảm ơn bạn.

 
Trong những ngày olden khi vi điều khiển didn t có Flash, các mã được lưu trữ trong OTP hoặc EPROMS đắt, nên có sẵn RAM để lưu trữ mã trong và thực thi nó từ đó .. trong khi thử nghiệm là rất thực tế

MICROS ngày nay không chỉ có khá nhiều chương trình và dữ liệu ký ức nhưng có thể được tái lập trình (trong hệ thống hoặc trong một lập trình) cho nhiều lần, do đó, khái niệm về mô phỏng mã mục tiêu trong một giả lập (8051 SRAM) đã không rất nhiều lợi thế ..

Tuy nhiên, vẫn còn, bạn có thể làm điều đó, đặc biệt nếu bạn sử dụng chương trình gỡ lỗi phần mềm Monitor như này:
http://www.keil.com/c51/mon51.asp
Dường như bạn có thể sử dụng nó trong hệ thống của bạn vì nó là ..

Bạn sẽ có thể giao tiếp với 8.051 bằng cách sử dụng phím HyperTerminal và chọn từ máy PC s bàn phím, bao gồm các tập tin tải lên HEX từ máy tính để SRAM thông qua cổng nối tiếp và C52 ..

Rgds,
IanP

 
Chào,

Tôi đang trở về chủ đề này.

Hiện nay tôi đã thành công tải dữ liệu hex đến 64KB SRAM và chạy chương trình.Bây giờ tôi muốn lưu dữ liệu trên eeprom MÃ bên ngoài bất cứ khi nào điện ON sẽ tự động tải về các dữ liệu vào SRAM và bắt đầu chạy chương trình mà không cần cài manualy / EA để GND.

Tôi hiểu như thế nào không làm việc kiến trúc Von Neumann.Một khối duy nhất của bộ nhớ có thể được ánh xạ để hoạt động như cả dữ liệu và bộ nhớ chương trình.

Vì vậy, tôi muốn chạy UC của tôi nhớ bên ngoài như là kiến trúc Von Neumann nhưng làm thế nào bản đồ SRAM bên ngoài?

Hiện nay, tôi có một chương trình sẽ ghi vào bộ nhớ bên ngoài.Kích thước ánh xạ
Off-chip nhớ Mã số: bắt đầu = 0x0000, size = 0x4FFF
Off-chip Xdata bộ nhớ: bắt đầu = 0x5000, size = 0xAFFF

Vì vậy, kích thước MÃ của tôi sẽ được là 0x5000, và kích thước Xdata là AFFF.

Làm thế nào tôi có thể làm cho việc sử dụng phương pháp này 8.051 von Neumann bộ nhớ để truy cập vào bộ nhớ ngoài của tôi?

Mã số:

void main (void)

(

load_vonNeumann_memory (); / / Load VN bộ nhớ((void (code *) (void)) 0x0000) (); / / Gọi hàm trong bộ nhớ VNtrong khi (1) / / Loop Forever

(

)

)
 
Chào,
Mà không cần sử dụng một chuyển đổi, bạn có thể kéo lên EA-to VCC, và sử dụng đèn flash nội bộ của 8k cùng với một bộ nhớ mã bên ngoài.Bộ nhớ mã bên ngoài có thể được đặt trong không gian địa chỉ 00 đến 32k, nhưng 8k không gian ban đầu sẽ không có sẵn.8k ban đầu của bạn bao gồm cả chương trình nạp khởi động có thể được giữ trong bộ nhớ flash và chương trình sẽ tự động tiếp tục với bộ nhớ mã bên ngoài sau khi 8k địa chỉ.Ngoài ra, bạn chỉ có bộ nạp khởi động lưu trong bộ nhớ trong và sử dụng địa chỉ 24k trên của bộ nhớ bên ngoài cho chương trình và bạn thực hiện một bước nhảy tới 8k địa chỉ bên ngoài để đến chương trình bên ngoài của bạn từ chương trình nạp khởi động.

Bạn có thể sử dụng không gian địa chỉ 32k cho dữ liệu trên RAM và bạn muốn thêm RAM, sử dụng một chút cảng và chọn một không gian 64k cho RAM ngoài.

Kính trọng,
Laktronics

 
Chào,

Cám ơn trả lời của bạn.

Trích:

Bộ nhớ mã bên ngoài có thể được đặt trong không gian địa chỉ 00 đến 32k, nhưng 8k không gian ban đầu sẽ không có sẵn.
 
Chào,
Có thực sự là nói không có quy tắc cứng và nhanh chóng về việc phân công của bộ nhớ không gian, đề nghị của tôi đã được lưu giữ trong tâm trí sẵn có của chip bộ nhớ và địa chỉ giải mã thuận lợi để các khu vực địa chỉ của mã bên ngoài và dữ liệu không trùng nhau, kể từ khi bạn đang sử dụng tín hiệu WR cho bootloading trong khu vực mã.

Có, bạn không phải lo lắng về các chương trình chuyển đến khu vực bên ngoài nếu bạn pullup EA-kể từ khi thực thi mã số tự động vẫn tiếp tục với mã bên ngoài sau khi địa chỉ 8k nội bộ.Chỉ điểm là 8k không gian ban đầu của các chip nhớ bên ngoài mã sẽ được lãng phí, trừ khi bạn có địa chỉ cụ thể giải mã cho không gian ở trên 8k.Và nếu bạn làm điều đó, mà không gian 8k có thể cũng được sử dụng cho một RAM dữ liệu 8k ra bất kỳ xung đột với bộ nhớ.Bạn cũng có thể giữ một phần của mã ứng dụng của bạn ngay sau khi chương trình nạp khởi động trong bộ nhớ trong và khóa nó để bảo vệ hiệu quả ứng dụng toàn bộ của bạn.Đây là một lợi thế lớn của 8.051 kiến trúc.

Ngắt vectơ sẽ vẫn theo các đặc điểm kỹ thuật chip và bạn phải làm một ljmp với dịch vụ thường lệ địa chỉ nơi nó được lưu trữ.

Kính trọng,
Laktronics

 
Chào,

Kể từ bộ nạp khởi động chỉ là một kích thước mã nhỏ trong bộ nhớ flash.Nào chúng ta vẫn cần phải sử dụng chức năng này:
Mã số:

((void (code *) (void)) 0x2000) (); / / Gọi hàm trong bộ nhớ VN
 
Chào,
Tôi không đề cập đến mã của bạn cả.Tất cả những gì tôi có nghĩa là từ các khu vực bộ nạp khởi động sau khi hoàn thành chức năng tải, bạn phải thoát khỏi quá trình tải bằng cách nhảy vào địa chỉ bắt đầu của chương trình ứng dụng.Chương trình này có thể bắt đầu ngay sau khi nạp khởi động và liên tục sẽ bắt đầu chạy vào khu vực địa chỉ bên ngoài sau khi thống nhất 8k ranh giới.Không cần đặt bất kỳ nhảy thêm cho mục đích này.Ngoài ra nếu bạn đang sử dụng bộ nhớ EEPROM cho mã bên ngoài, có thể bạn có thể thực thi trực tiếp từ nó mà không cần sao chép vào khu vực bộ nhớ RAM.Bạn cần phải kiểm tra, cho tốc độ CPU được sử dụng, chiều rộng của PSEN tín hiệu rất ít cao hơn chiều rộng xung cần đọc của EEPROM này.Để được cụ thể, dữ liệu từ bộ nhớ mã nên sẵn sàng trong hai chu kỳ CPU Dao động từ thời OE các-tín hiệu đi xuống.Để có một hoạt động 12MHz, đây là khoảng 160nsec.

Ngoài ra, quá trình sử dụng bộ nhớ bên ngoài không có trong bất cứ cách nào ảnh hưởng đến các địa điểm vector ngắt và như thường lệ, bạn phải đảm bảo rằng tất cả các ngắt subroutines bắt đầu tại địa chỉ vector của họ, như bình thường với một lệnh nhảy.

Việc sử dụng RAM ngoài 8k trong vùng bóng tối địa chỉ của bộ nhớ là có thể nếu bạn có thể đảm bảo rằng địa chỉ mã bộ nhớ bên ngoài được giải mã bên ngoài không gian này tại 8k và ở trên.

Mọi idiosyncrasies của ngôn ngữ C cụ thể đã được hanled do bạn chỉ.

Kính trọng,
Laktronics

Lưu ý: Bạn không cần phải gửi điểm thêm cho mỗi thư trả lời

 
Chào,

Tôi tự hỏi tại sao tôi vẫn không thể giao tiếp với bộ nhớ bên ngoài.Khi tôi thiết lập bản đồ địa chỉ và chạy nó như là / EA để GND chế độ.Tôi nhận thấy một cái gì đó mà là vectơ Interrupt và địa chỉ LJMP phải là như nhau và phải bắt đầu tại hai địa chỉ 0x0000 hay 0x8000 chỉ sau đó sẽ làm việc.I có thể biết, là nó có thể có để bắt đầu tại địa chỉ 0x2000 hoặc 0xA000?<img src="http://images.elektroda.net/50_1225696895_thumb.jpg" border="0" alt="8051_vonneumann" title="8051_vonneumann"/> Tại thời điểm này tôi đã không thêm eeprom trong bộ nhớ flash được nêu ra.

Tôi đã cài các vector Interrupt và LJMP tại địa chỉ 0x8000.Nó làm việc trên / EA = 0V chế độ nhưng khi kiểm tra von-Neumann kiến trúc / EA = 5V.Mặt khác bộ nhớ flash sau khi tôi đặt một bộ tải khởi động chức năng nhảy.Sau khi hoàn thành chức năng nạp và thoát khỏi chức năng tải trực tiếp sẽ nhảy đến 0x8000
The Keil hiển thị cửa sổ Disassembly
Mã số:

C: 0x8000 00 NOP
 
Chào,

Khi EA-rút là thấp, không có câu hỏi về giao tiếp với bộ nhớ Mã bên ngoài, bạn sẽ luôn luôn được trong bộ nhớ mã bên ngoài, và trong trường hợp này, ext.bộ nhớ nên được đặt, bắt đầu tại địa chỉ 0000h.Chương trình của bạn sẽ không sử dụng mã số trong bộ nhớ inetrnal.Mặt khác, khi EA-rút là cao, cho địa chỉ 8k đầu tiên, không có PSEN được tạo ra và mã số từ bộ nhớ sẽ được thực thi.Trong trường hợp này trước khi thực hiện việc đạt 8K địa chỉ, tại bất kỳ điểm nào bạn có thể nhảy đến địa chỉ bộ nhớ bên ngoài lúc hoặc sau khi 8k.

Tôi hy vọng bạn sẽ nhận thức được rằng ngày nay có rất nhiều biến thể sẵn có từ 8.051 công ty như Atmel / Philips vv, trong đó có 64k byte bộ nhớ mã nội bộ và hỗ trợ bởi chương trình nạp khởi động BUILTIN và phần mềm PC miễn phí để tải chương trình ứng dụng của bạn vào flash.Đối với ứng dụng của bạn thì bạn cần phải giao tiếp với các chip như vậy chỉ cần lượng RAM bên ngoài.Vì vậy, nếu bạn không phải rất cụ thể để thực hiện các mạch sử dụng các chip mã bộ nhớ rời rạc như bạn đang làm bây giờ, tôi sẽ đề nghị bạn để có một cái nhìn tại tùy chọn sử dụng chip hiện đại trong ứng dụng của bạn và dành nhiều nỗ lực trong việc ứng dụng của bạn chương trình hoàn chỉnh hơn.Chỉ cần một đề nghị xem xét của bạn.

Kính trọng,
Laktronics

 
Chào,

Tôi đã cố gắng rất nhiều và làm nhiều thử nghiệm.
Dưới đây cho thấy là cài đặt mà tôi thử nghiệm.
Nội bộ mã - LJMP 8003H, ngoài mã - vector Interrupt & dòng STARTUP.A51-125 = 0x8000
Nội bộ mã - LJMP 8003H, ngoài mã - vector Interrupt & dòng STARTUP.A51-125 = 0x8003
Nội bộ mã - LJMP 8000H, ngoài mã - vector Interrupt & dòng STARTUP.A51-125 = 0x8000

Mã số:

void runprog (void)

(

# pragma asm

ljmp 8000H

# pragma endasm

)
 
Chào,
Tôi không khá hiểu cách bạn được kiểm tra mã của bạn và kết luận nó không hoạt động.Code có gì bạn nạp vào 0x2000?Hãy cho chúng tôi xem xét trường hợp của EA-kéo lên VCC, trong trường hợp này mã chính của bạn nên được lắp ráp tại 0x0000 trong bộ nhớ flash của C52, nơi mà các hệ thống điều khiển đi sau Đặt lại.

Cũng có một độ lệch nhỏ từ những gì đang được thảo luận, bạn chưa sử dụng một chip MAX232 để inetrface giao diện của mạch nối tiếp của bạn với máy PC nhìn từ schematic, bạn mà là essentail.

Kính trọng,
Laktronics

 
Chào,

Cảm thấy rất sory cần bạn dành đôi vào tôi.

<img src="http://www.edaboard.com/images/smiles/icon_sad.gif" alt="Buồn" border="0" />Trích:

Tôi không khá hiểu cách bạn được kiểm tra mã của bạn và kết luận nó không hoạt động.
 
Chào,
Nếu bạn giao tiếp với máy tính là làm việc OK, thay vì nhảy và thực thi mã từ 0x2000, có thể là sau khi tải mã, bạn có thể đọc mã lúc 2000 và gửi đến máy PC như ASCII và kiểm tra xem có byte được như mong đợi tại 0x2000.Điều này sẽ xác minh nếu một phần tải của bạn đang làm việc OK.
Bạn thậm chí có thể thử sử dụng chương trình đầu tiên của bạn đơn giản, trực tiếp của việc viết tay có mã số ljmp 0xE000 đổi 0x2000 trong trường hợp này.

Hy vọng bạn có RAMS gắn kết cho địa chỉ ở 0x2000.Nếu SW2 được kết nối với đầu ra biến tần A15, IC U5 ahould được tại chỗ.

Kính trọng,
Laktronics

 
Chào,

Trích:

có thể là sau khi tải mã, bạn có thể đọc mã lúc 2000 và gửi đến máy PC như ASCII và kiểm tra xem có byte được như mong đợi tại 0x2000.
Điều này sẽ xác minh nếu một phần tải của bạn đang làm việc OK.
 
Chào,
Nếu bạn đang sử dụng ngắt cổng nối tiếp, hoặc bất cứ ngắt khác trong khi thực thi mã tại 0x2000 cộng với địa chỉ, mã sẽ không hoạt động khi EA-thấp, trừ khi các địa chỉ dưới của bộ nhớ bên ngoài có chứa các ngắt thường trình dịch vụ tại các địa chỉ vector tương ứng của họ .Vì vậy, trên bay thay đổi của EA-tình trạng có thể thất bại trong trường hợp này.
Tôi không hiểu tại sao chuyển sang mã bên ngoài được đặt tại 0x2000/0xE000 không làm việc.

Kính trọng,
Laktronics

 
Chào,

Có, tôi đang sử dụng ngắt nối tiếp trên cả hai bên.Có điều này là nguyên nhân gốc?Nếu có, những gì tôi có thể làm gì?

Cảm ơn bạn.

 
Chào,
Bạn có thể sử dụng chỉ EA-rút để VCC và giữ gián đoạn dịch vụ của bạn thường lệ vì nó đang ở trong bộ nhớ flash của bộ điều khiển, OR

Sử dụng một ljmp để 0x2000 địa chỉ tại các địa chỉ vector tại flash cũng như tại các địa chỉ tương ứng trong bộ nhớ RAM bên ngoài và giữ thói quen dịch vụ tại các quy định 2000 địa chỉ, vì vậy mà những thói quen không phân biệt được thi hành của bang EA-.

Kính trọng,
Laktronics

 

Welcome to EDABoard.com

Sponsor

Back
Top