Pamięć kodu w AT89C51

To forum jest dla wszystkich pasjonatów wiecznie młodych mikrokontrolerów '51. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Awatar użytkownika
GrzesiekG
Użytkownik
Posty: 160
Rejestracja: 11 sie 2006, 8:06
Lokalizacja: Annopol
Kontakt:

Pamięć kodu w AT89C51

Post autor: GrzesiekG » 12 wrz 2010, 11:23

Witam!
Mam pytanie: Czy w procesorze AT89C51 po podaniu na /EA = VCC i bez programowania lock bitów będę mógł odczytywać program z zewnątrz po przekroczeniu adresu końca wewn. ROM?
2) Czy stk500 może zaprogramować mi ten procesor?
PZDR
GrzesiekG

kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Post autor: kaliska5 » 12 wrz 2010, 11:59

Jeśli podasz na EA +5V to program będzie wykonywany z wewnętrznej pamięci.Wtedy piny odpowiedzialne za obsługę zewnętrznej pamięci działają jako porty IO.Stk500 to cały zestaw ewaluacyjny i nie widzę tam obsługi At89c51.Kup lepiej wersje At89S51 ma ona tryb programowania ISP

Awatar użytkownika
GrzesiekG
Użytkownik
Posty: 160
Rejestracja: 11 sie 2006, 8:06
Lokalizacja: Annopol
Kontakt:

Post autor: GrzesiekG » 12 wrz 2010, 13:39

jasne, chodzi mi o to czy uC zapętli się po 0fffh na 0000h czy też przejdzie na 1000 i dalej z zewnętrznej pamięci?

kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Post autor: kaliska5 » 12 wrz 2010, 14:08

Po ustawieniu procesora na zewnętrzną pamięć adres początkowy to 00H i końcowy FFFFH.
Po zapętleniu wraca do 00h
External Access Enable. EA must be strapped to GND in order to enable the device to fetch
code from external program memory locations starting at 0000H up to FFFFH. Note, however,
that if lock bit 1 is programmed, EA will be internally latched on reset.

Awatar użytkownika
kayron
Użytkownik
Posty: 2090
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 12 wrz 2010, 14:33

Hm.. He.. jeżeli dobrze pamiętam jeszcze jak działa 51' to jeżeli procesor dojdzie do końca wewnętrznej pamięci programu i nie ma tam instrukcji skoku w inny obszar pamięci, to po wykonaniu tej instrukcji, lub jeżeli instrukcja wymaga dodatkowych argumentów, będzie ja próbował porać z zewnętrznej pamięci ROM, jeżeli ta oczywiście jest, bo inaczej zaliczy zonka.
Co do drugiego pytania to jeżeli chcesz programować przez SPI, to masz do wyboru 2 procesory 89S52 (8KB Flash) lub 89S53 (12KB Flash)

Awatar użytkownika
GrzesiekG
Użytkownik
Posty: 160
Rejestracja: 11 sie 2006, 8:06
Lokalizacja: Annopol
Kontakt:

Post autor: GrzesiekG » 12 wrz 2010, 17:42

Powiem o co chodzi... Chcę poeksperymentować z moim AVT-2250, zrobić programator na ww. procesor i przenieść MONITOR do wewnętrznej pamięci + kilka moich procedur. Mam SRAM od Dallasa z bateryjką na podtrzymanie (nieśmiertelne sampe :mrgreen:) i brak kasownika EEPROM. Poza tym, przymierzam się do własnego systemu '51 i bardzo bym sobie uprościł architekturę, gdybym mógł właśnie BIOS zawrzeć w wewn. pamięci a moje programy (ładowane przez UART lub z HDD) w pamięci >8000h.

Awatar użytkownika
kayron
Użytkownik
Posty: 2090
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 12 wrz 2010, 19:10

He.. :smile: Akurat AVT-2250 jest bardzo fajną platformą wyjściową do zrobienia laptopka na 51' Co prawda trzeba by go doposażyć w to i owo, przede wszystkim zaprojektować mu nową płytkę klawiatury i wyświetlaczy, aby wyposażyć go przynajmniej w znakowy LCD 4x16, lub graficzny 128x64 z sterownikiem KS. Możliwości jest ogólnie sporo, pytanie co chcemy uzyskać ?

Awatar użytkownika
GrzesiekG
Użytkownik
Posty: 160
Rejestracja: 11 sie 2006, 8:06
Lokalizacja: Annopol
Kontakt:

Post autor: GrzesiekG » 12 wrz 2010, 19:22

Tak to prawda, ta platforma jest jedną z najlepszych jakie miałem okazję w ręku trzymać. Myślę, że opcja ręcznego wpisywania programu bez plątania się z kablami, hexami itp. niektórych skłoniła (np. mnie) do sięgnięcia po nią. Osobiście chcę sprząc C51, 16C450/2 i 82C55 oraz 512kB RAM oraz IDE ATA do stworzenia czegoś w stylu 2250b :razz:
Myślałem również nad komunikacją z człowiekiem...
Wpadłem na pomysł (a pomógł mi zestaw do kursu C, AVT-3505) aby sprząc, LCD, keyboard hex, 8 uSW, I2C, PSX i SPI jako uniwersalny terminal dostępu (przez uart). Miałby swój protokół itp, itd.

Mój bios ma mieć wsparcie dla stronnicowania i czegoś na kształt plików .exe (odewanie od sztywnego adresowania w stronę wpasowania w wolną przestrzeń pamięci).
Odpowiednie mechanizmy w toku projektu....

Właśnie zagłębiam się w ASM i muszę przyznać że wykluło się już kilka sensownych bibliotek (lcd4b, leddriv, keyb, i2c, psx...).

Mam dużo czasu, nie muszę się spieszyć.
Zobaczymy co z tego wyniknie...

PZDR i dziękuję za pomoc
GrzesiekG

PS. Również przewiduję ręczne wprowadzanie kodu

Awatar użytkownika
Ertew
Użytkownik
Posty: 1418
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 12 wrz 2010, 20:41

GrzesiekG pisze:Tak to prawda, ta platforma jest jedną z najlepszych jakie miałem okazję w ręku trzymać.
A widziałeś może Atari Portfolio?
Tam był procek 8088, ekran graficzny i DOS (film).
Chyba dążysz do czegoś podobnego.

Awatar użytkownika
GrzesiekG
Użytkownik
Posty: 160
Rejestracja: 11 sie 2006, 8:06
Lokalizacja: Annopol
Kontakt:

Post autor: GrzesiekG » 13 wrz 2010, 10:51

Bardzo ciekawe urządzenie!
Przewiduję expand port (kompatybinly z AVT-2250 oczywiście) a cuda w stylu karty video/audio na cpld czy fpga to kwestia pomysłu i kaski.

Tak, można powiedzieć, że coś w stylu tej atarynki, chociaż 80c51 nie ma segmentacji co mi trochę przeszkadza (wtedy znika problem uruchamiania programów w różnych obszarach pamięci - ustawiam pc = 0000 i cs = ds = ss = es = cośtam i jmp!). Mam w sampelkach od nxp XA - G37 (na rdzeniu C51) co ma wsparcie dla segmentów i RTOS (sprzętowe int) ale nie potrafię na razie go skutecznie oprogramować - może kiedyś :)

Znowu Z80 ma genialne wsparcie dla DMA, instrukcji szybkiego kopiowania bloków danych i swojego daisy-chain, ale nie ma segmentów.

Tak patrząc obiektywnie to w obliczu Z80, x86, to C51 (która to rodzina z założenia miała być "mikrokotrolerowa") wypada najbladziej: brak /DREQ, /WAIT, segmentów i instrukcji do transportu danych (jeden DPTR lub @Ri może czasami przyprawić o zawroty głowy przy pętli przepisującej :wink: ).

Tutaj myślałem bardziej w kierunku komputerka tak, ale czegoś w stylu stacji rozwojowej, testowej.

PZDR
GrzesiekG

Awatar użytkownika
kayron
Użytkownik
Posty: 2090
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 13 wrz 2010, 19:06

A jest 51' która potrafi obsługiwać 256KB pamięci, a dodatkowo ma na pokładzie układ OSD TV, to SAA5665HL (30zł).
Segmentacja to w sumie w 51' nie jest wielki problem, przecież jest dodatkowy port, ale należy pamiętać że jak robi się to programowo to system operacyjny musi mieć specyficzną budowę, tak aby się nie pogubił przy przełączaniu segmentów, szczególnie jak program jest wykonywany z RAM.
Co do DMA to w sumie na 51. nie wyjdzie bo nigdy nie była pod tym kątem robiona, natomiast można go udawać programowo stosując sprytnie przerwania. Nie wiem po co ci IDE ATA w czasach kart SD/MMC.
Reasumując najlepiej było by ci zbudować mostek północny na PLD.

Awatar użytkownika
GrzesiekG
Użytkownik
Posty: 160
Rejestracja: 11 sie 2006, 8:06
Lokalizacja: Annopol
Kontakt:

Post autor: GrzesiekG » 13 wrz 2010, 19:37

Dobry pomysł z tym mostkiem, jednak pojawia się problem ograniczenia zasobów np. zaprojektowany przeze mnie kiedyś układ stronnicowania pamięci do Z80 (kuchnia, niezły swoją drogą - przypominał tryb chroniony z x86, hehe) nie mieścił się chyba cały w przeciętnym PLD a na FPGA w takim projekcje nie chcę się porywać.

Co do segmentacji, chodziło mi o mechanizm sprzętowy w XA - G37, gdyż faktycznie wpadłem na ten trop z portem, konkretnie P1 (i widzę, że dorze :mrgreen:). Co do problemu przełączania to wyszczególniłem segment RAMu nie do zestronnicowania - RAM1 ("twardo" przez BIOS przełączane jedno z 2 16-to kB ramek układu 62256) w przestrzeni 4000h-7FFFh oraz 8 ramek po 32kB (RAM2)w przestrzeni 8000h-FFFFh zmienianych przez procedurę umieszczoną w RAM1.

Co do DMA to myślałem nad tym:

"osaczyć" magistralę adr/data przez byfory ('541, '245), które wespół z sygnałem zegarowym byłyby wysterowane przez właśnie jakiś układ kontroli.

Awatar użytkownika
Ertew
Użytkownik
Posty: 1418
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 13 wrz 2010, 21:21

Może przestrzeń adresową podzielić tak:
16KB na program,
16KB na dane tego programu,
16KB na BIOS + OS
8KB na dostęp do zasobów sprzętowych (płytka) i 8KB na zasoby zewnętrzne.

,,Mostek północny'' (PGA/PLD, cokolwiek by to nie było) może adresować sporo RAMu, a pamięć ta jest przez niego dzielona na kawałki po 16KB.
W zależności jakie wytyczne dostał od systemu operacyjnego (który program ma teraz działać), odpowiednie fragmenty RAMu podtyka procesorowi, gdy ten odwołuje się w określone obszary pamięci (mostek analizuje tylko starszy bajt adresowy '51).
Do tego jeszcze możliwość wyboru przez program, z jakiej porcji danych chce korzystać, oraz jakieś algorytmy zabezpieczeń (blokada zapisu).

W tym czasie ,,mostek południowy'' mógł by żonglować kilkoma kośćmi RAMu między prockiem a peryferiami, robić za kontroler I/O i DMA.
IDE/ATA/ATAPI to dobry standard, ale jak wspomina kayron, trochę przestarzały. W nowoczesnym (i przenośnym) urządzeniu powinna być pamięć półprzewodnikowa. Może karta SD/CF lub Flash ROM?

Jak znajdziesz energooszczędny FPGA, to rozważ implementacje całości (razem z prockiem i RAMem) w jego wnętrzu.

Awatar użytkownika
GrzesiekG
Użytkownik
Posty: 160
Rejestracja: 11 sie 2006, 8:06
Lokalizacja: Annopol
Kontakt:

Post autor: GrzesiekG » 13 wrz 2010, 21:50

koledzy, ja to pomyślałem tak:
Na razie najprościej:
0000h-3FFFh - IO (przez MOVX) oraz BIOS wewn. uC
4000h-7FFFh - dwie na przemian uruchamiane strony po 16kB z kostki 62256 - RAM 1 na procedury, sprzetowe, warstwy kontroli aplikacji i algorytmy uruchamiające aplikacje w...
8000h-FFFFh - RAM 2 - 8 stron po 32kB z wykorzystaniem mojego pomysłu na niezależność kodu od adresu...
Stronami steruje się przez port P1
Na ww. Dekoder adresowy składa się 4 bramki OR oraz 2 branki NAND w roli negatorów (drugie dwie potrzebne do iloczynu /rd i /psen) to daje w sumie 6 układów na jednostkę centralną.
Na razie planuję wykonać model z tym stronnicowaniem pamięci z buforem adresów stron prz pomocy 74xxx i sprzęgnę to z... AVT-2250 :)

Za ew. błędy przepraszam - piszę na szybko z komorki.

Czekam oczywiście na dalsze wasze sugestie - może odnośnie samego mechanizmu kontroli dostępu do pamięci.

PZDR
GrzesiekG

Awatar użytkownika
kayron
Użytkownik
Posty: 2090
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 14 wrz 2010, 16:37

Przeanalizuj sobie działanie C64 tam na 64 KB przestrzeni posadzono praktycznie 80KB, a jest dopałka która dodaje jeszcze 60KB RAM. Knif polega na tym że pamięć dynamicznie się wydziela, w zależności od stanów dodatkowego portu CPU (C64 ma właściwie CPU o właściwościach mikrokomputera jedno układowego bo oprócz szyny danych ma dodatkowy port), a REU lub gEO RAm pozwala praktycznie dowolnie rozszerzyć pamięć do 16MB widzianą w blokach po 8 lub 16 KB, w zależności od sygnałów sterujących.
Jak by co mam całkiem dobrą dokumentację C64 i tego jak to zrobiono.
Ostatecznie to MMU do 51 wkomponować. Kupiłem jakieś pół roku temu, ale można to do CPLD wszczepić, bo ma prostą konstrukcję.
Załączniki
612MMU.jpg

ODPOWIEDZ