Programowanie AT89Cxx51

Piotr Gałka pisze:

Pamięci programu sam program nie może modyfikować więc też nie tak. Jak musisz gasić/zapalać różne bity to będziesz musiał skakać w różne miejsca programu z odpowiednim dla danego bitu poleceniem. Jeszcze takiej potrzeby nie miałem ale do zrobienia.

Reply to
AlexY
Loading thread data ...

ły Zapytam z czystej ciekawości, bo dzisiaj oczywiście dużo prościej wykorzystać dowolny, potężny 32bitowy mikrokontroler z dużą ilością ramu i flasha...

Niemniej jak wyglądała współpraca układów w rodzaju AT89C51 albo AT89C52 z zewnętrzną pamięcią? W przypadku RAM-u jak rozumiem dwa porty robiły za multipleksowaną szynę adresową/danych, którą łączyło się z układem pamięci poprzez 74LS573. W ten sposób można było zyskać całkiem sporą ilość pamięci operacyjnej, ciągle przy dość małej pamięci stałej. Możliwe było jeszcze dorzucenie jakiegoś EPROM-a i zapisanie w nim hex-a z programem? Jeśli tak, to jak duże projekty w ten sposób tworzono?

Czy do takiej szyny można było podpiąć równocześnie jakiś wyświetlacz alfanumeryczny HD44780 albo nawet jakiś kontroler Ethernetu?

Reply to
Atlantis

Atlantis pisze: [..]

Szyna adresowa jest 16 bitowa, jak trzeba więcej to konieczne jest bankowanie pamięci.

Jeśli HD jest w przestrzeni adresowej to czemu nie, nie może blokować ani reagować na nie swoje adresy i musi wyrabiać się z timingami, albo trzeba mu zrobić bufor.

Reply to
AlexY

W dniu 2017-02-26 o 13:47, AlexY pisze:

Przypomnę jeszcze, że w zasadzie można szynę adresową określić jako

17-bitową. Była tam selekcja I/O i pamięci osobnymi liniami, ale szczegółów to już nie pamiętam. W sumie to była selekcja I/O i pamięci, ale selekcja pamięci programu też gdzieś tam się pętała, w sumie to już mnie pamiętam szczegółów.

Pozdrawiam

DD

Reply to
Dariusz Dorochowicz

Dariusz Dorochowicz pisze: [..]

To jest właśnie bankowanie pamięci, nie ma poleceń adresujących 17-bitowo.

Reply to
AlexY

W dniu 2017-02-26 o 16:26, AlexY pisze:

Bankowaniem raczej określa się rozszerzenie standardowej przestrzeni adresowej, a ja piszę że "w zasadzie" ;)

Pozdrawiam

DD

Reply to
Dariusz Dorochowicz

W dniu 2017-02-26 o 16:26, AlexY pisze:

Czyli rozumiem, że teoretycznie w tych mikrokontrolerach możliwe jest np. jednoczesne zastosowanie 64kB pamięci RAM i 64kB EPROM? Będą one widoczne jako dwie osobne przestrzenie adresowe? Możliwe było uruchamianie programu z zewnętrznego EPROM-a, czy też pamięci tego rodzaju był wykorzystywane do przechowywania dodatkowych zasobów, a kod należało upchnąć w tych kilku kB wewnętrznego flasha?

Reply to
Atlantis

Atlantis pisze:

Nie, przynajmniej jeśli dobrze zrozumiałem PDFa od 89c51/2.

"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."

Jeśli dobrze zrozumiałem można podpiąć pamięć programu albo danych, nie widzę mix'u, może jest jakiś kruczek.

Reply to
AlexY

W dniu 2017-02-26 o 20:43, AlexY pisze:

Pewnie że jest. EA to tylko wybór pamięci programu, a na PSEN procek wystawia czy chce dostępu do pamięci programu czy danych. Tyle, że niekoniecznie da się w ten sposób dostać do całej pamięci, bo zdaje się że na początku są mapowane rejestry.

Pozdrawiam

DD

Reply to
Dariusz Dorochowicz

W dniu 2017-02-26 o 20:50, Dariusz Dorochowicz pisze:

Pytam, bo wydaje mi się, że kiedyś widziałem schemat na którym do MCU jednocześnie podłączony był RAM i EPROM. Jeśli dobrze pamiętam, piny sterujące były podłączone przez jakąś bramkę. Na 90% jestem pewien, że to właśnie dotyczyło czegoś w stylu AT89C51/52, jednak mogę się mylić. Dlatego właśnie pytam. ;)

Innymi słowy:

1) Mogę korzystać albo z wewnętrznej pamięci programu, albo zewnętrznej

- w zależności od sposobu podłączenia pinu EA.

2) Zewnętrzna pamięć RAM ma wspólną przestrzeń adresową z wewnętrzną, a więc jej pewna ilość na początku (128 bajtów?) będzie niewykorzystana.

Dobrze to rozumiem?

I jeszcze jedno pytanie: jak w tej rodzinie wygląda kwestia korzystania ze stałych definiowanych w pamięci programu? Istnieje coś takiego, jak PROGMEM w AVR-ach, czy też jedynym wyjściem jest zwykłe tworzenie kopii tych stałych w pamięci RAM? Bo chyba nie jest tak dobrze, że wystarczy zdefiniować zmienną jako "const", jak we współczesnych mikrokontrolerach

32-bitowych?
Reply to
Atlantis

W dniu 26.02.2017 o 21:02, Atlantis pisze:

Źle. Wewnętrzna pamięć RAM i zewnętrzna to dwie oddzielne przestrzenie adresowe obsługiwane innymi rozkazami. Czasami bardziej wypaśne '51 miały cześć peryferiów zamapowane na zewnętrzny RAM i wtedy faktycznie cześć XRAMu była niedostępna.

A nie przyszło ci do głowy przeczytanie manuala do kompilatora?

formatting link

Reply to
Zbych

W dniu 2017-02-26 o 21:02, Atlantis pisze:

Spokojnie, to typowa konfiguracja. Wystarczy zapytać guglarkę. Schematów od zarąbania, wszystkie prawie takie same, no bo co tu można wymyślić? Ale po co pytasz o ten procek i takie tematy? Chcesz coś na nim zrobić czy tak z ciekawości? Bo wiesz, to straszna staroć przecież. Jeżeli masz urządzenie, to konfigurację już masz, a jeżeli nie, to nie ma sensu się bawić w odkrywanie. Okolice typowej konfiguracji będziesz miał na prostym atmelku w jednym scalaku i to więcej pamięci programu, za to mniej RAMu. Ale i z tym da się poradzić - chociażby na XMega128A1 masz możliwość dołączenia pamięci zewnętrznej, nie tylko statycznej. O mocniejszych układach nie wspominam.

Dokładnie tak. Nie pamiętam tylko czy można zmieniać stan tego pinu w trakcie pracy.

Nie pamiętam, ale Zbych już odpowiedział.

Pewnie trzeba zajrzeć do listy rozkazów i znaleźć informację czy jest instrukcja pobrania danej z pamięci programu - obawiam się że to było tak dawno...

Pozdrawiam

DD

Reply to
Dariusz Dorochowicz

W tej chwili nie planuję niczego budować na tym układzie. Pytam z czystej ciekawości, albo że tak powiem - z powodu zainteresowania historią. :) To znaczy nie wykluczam, że może kiedyś, z czystej ciekawości spróbuję sobie coś takiego uruchomić, na podobnej zasadzie, jak ludzie budujący własne retro komputery na Z80, jednak w tej chwili są to rozważania czysto teoretyczne. Gotową konfigurację już mam, ale jest prosty układ bez zewnętrznej pamięci. Próbuję w tej chwili napisać na niego własny kod przy pomocy sdcc i głównie dlatego temat mnie zainteresował. :)

Tak, wiem - to jasne. W 32bitowych MCU pamięć nie jest problemem. Jak już mówiłem - tu chodzi o ciekawość, a nie pragmatyczną potrzebę obejścia problemów z zasobami.

Reply to
Atlantis

Użytkownik "Atlantis" napisał w wiadomości grup dyskusyjnych:o8v9rj$l28$ snipped-for-privacy@news.icm.edu.pl...

8051 mial wyprowadzona magistrale (ktora wymagala pinow portow, wiec ograniczala mozliwosci) i mozliwosc podpiecia dodatkowych 64KB zewnetrznego RAM na oraz 64 zewnetrznej pamieci programu. Program mogl byc tylko w pamieci programu. Oprocz tego mozna sobie bylo zorganizowac dodatkowe bankowanie, i teoretycznie miec nieograniczona ilosc danych.

i to samo bylo w AT89C51 i C52. Tylko tam majac wygodny wewnetrzny flash razej nie uzywalo zewnetrznego programu.

Ale juz np taki 2051 Atmela majac mniej nozek tej magistrali nie przewidywal.

Ogolnie - szkoda czasu. Dostep do tych pamieci to byl koszmar, albo masz zastosowanie na maly 8-bit uC, albo uzyj lepszego procka.

Intel mial nastepce, z rozszerzona architektura ... ale tez szkoda czasu.

J.

Reply to
J.F.

Użytkownik "AlexY" napisał w wiadomości grup dyskusyjnych:o8vb11$3le$ snipped-for-privacy@dont-email.me... Atlantis pisze:

Tak. Jak 51 czytal rozkaz, to wystawial adres i aktywowal linie PSEN-. To samo bylo, jak odczytywal dane z pamieci programu rozkazem MOVC.

Jesli czytal dane z pamieci zewnetrznej (XRAM), to aktywowal linie RD- (P3.7). Przy zapisie aktywowal linie WR- (P3.6).

To sie tyczy programu. Moze pobierac z wewnetrznego flash, albo caly program z zewnetrznej pamieci.

Co do adresow - bodajze kompilator Keil mial wskazniki 3 bajtowe, gdzie najstarsze bity wskazywaly rodzaj pamieci. Ale to czysto softwarowo robota.

J.

Reply to
J.F.

Użytkownik "Atlantis" napisał w wiadomości grup dyskusyjnych:o8vc9i$k08$ snipped-for-privacy@news.icm.edu.pl... W dniu 2017-02-26 o 20:50, Dariusz Dorochowicz pisze:

Nie, to dwie osobne pamieci. Wiekszosc rozkazow operuje na wewnetrznej, a tylko movx na ze

Jesli chodzi o C ... to koszmar. uC moze pobrac dane z pamieci programu rozkazem movc ... ale skad ma wiedziec ktorego rozkazu uzyc ? Pamieci mamy 3, rozkazy 3 rozne. Jak sobie dobrze rodzielisz i zaprogramujesz, to swietnie, gorzej jak chcesz printf ("blad nr %d: %s", errnr, errmsg)

i skad ten biedny kompilator ma wiedziec, czego uzyc ? O Keilu pisalem, AVR ma akurat podobny problem.

J.

Reply to
J.F.

W dniu 2017-02-26 o 20:21, Atlantis pisze:

Pierwsze 51-ki nie miały wewnętrznej pamięci programu - czyli... P.G.

Reply to
Piotr Gałka

Użytkownik "Piotr Gałka" napisał w wiadomości grup dyskusyjnych:o90sld$lhb$ snipped-for-privacy@news.chmurka.net...

Czekaj Piotrze, bo o ile pamietam ...

-8051 miala 4 czy 8kB wewnetrznego programu "programowanego maska", czyli trzeba bylo u Intela zamowic z konkretna zawartoscia,

-byla wersja 8031 (a moze 8035?) , ktora wewnetrzego ROM wcale nie miala,

-byla tez wersja 8751, Eprom z okienkiem do kasowania ... ale chyba nigdy nie widzialem, a w katalogach jakies niebotyczne ceny

-w kraju czesto uzywano 8051 z jakis resztek produkcyjnych, z zewnetrznym epromem, po wylaczeniu wewnetrznego ROM, ewentualnie klonow na podobnej zasadzie. Dosc popularne byly klony siemensa, ktore mialy wiecej nozek, wiec nie ograniczaly funkcjonalnosci.

Podobnie bylo u Motoroli i innych - wersja Eprom to jakis meteor, niby byla, a malo kto widzial.

I dopiero Atmel wprowadzil jakas rewolucje cenowa, wczesniej Microchip w PIC, wczesniej byly rozne pomysly jak np ten Dallas z bateryjka.

J.

Reply to
J.F.

Wpiszę swoje 3 grosze - może Ci się przyda (nie ja pisałem program - mogę coś mieszać). W DSM-51 (projekt z 1993r) w momencie włączenia zasilania:

- 32k EPROM z programem był widoczny dwa razy (w obu połowach pamięci programu),

- 32k RAMu było chyba widoczne tylko w dolnej połowie pamięci danych (niektóre adresy górnej połowy były użyte do sterowania sprzętu). Pod kontrolą tego programu z EPROMu edytowało się ręcznie (wbudowany assembler - z menu wybierało się mnemonik, a potem z menu kolejne jego parametry - taki wymóg czasów, gdy w szkołach pracowania mikrokontrolerów nie miała komputerów) program, który był umieszczany W RAMie. Była też (dla posiadających PC) możliwość wgrania do RAMu programu przez RS232. Uruchomienie programu polegało na zastąpieniu w dolnej połowie pamięci programu EPROMu przez RAM i reset procesora. W ten sposób wektory przerwań też pochodziły z programu załadowanego do RAMu. W uruchamianym w RAMie programie można było korzystać z iluś tam procedur zawartych w EPROMie (widocznym teraz w górnej połowie pamięci programu). Urządzenie miało dwa resety. Reset programu użytkownika robił reset procesora z pozostawieniem RAMu w dolnej połowie pamięci programu, a pełny reset przywracał wszystko do stanu jak po włączeniu zasilania. Watchdog generował reset nie modyfikując przestrzeni adresowych - zadziałanie watchdoga w programie użytkownika resetowało program użytkownika, a nie cały system.

Poza przekazaniem pełnej władzy programowi w RAMie była też możliwość puszczania go krokowo. Rezydujący u góry program w EPROMie wkładał odpowiednio skoki do siebie do RAMu i wypuszczał od odpowiedniego miejsca (i stanu stosu) program w RAMie i łapał gdy doszedł do tego skoku. P.G.

Reply to
Piotr Gałka

W dniu 2017-02-27 o 11:29, J.F. pisze:

Lepiej to pamiętasz niż ja. Wydawało mi się, że 8051 było bez pamięci programu, bo była ona (z mojego punktu widzenia) bezużyteczna, ale faktycznie to chyba 8031.

W 88 wymyśliłem nazwę MicroMade i zmotywowani tym "Micro" już w Piccolo użyliśmy 8748 (wersja z EPROMem - cena 1 sztuki tyle ile moja miesięczna pensja asystenta na PG). Kilka lat późniaj w Picco-GAL używaliśmy 8751.

W tego typu urządzeniach, gdzie trzeba było mieś dużo linii we/wy podłączenie zewnętrznej pamięci programu zrobiło by z urządzenia wersję wybitnie nie pasujące do naszej nazwy. Zamiast jednego scalaka byłoby chyba ze 6 (trzeba by czymś zastąpić nogi zajęte przez podłączenie pamięci z programem).

O ile pamiętam to pierwsze wielokrotnie programowane procesory jakie używaliśmy to były jakieś ZILOG. Kilka lat później pojawiły się Atmele. P.G.

Reply to
Piotr Gałka

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.