Odczytywanie dużych tablic

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
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Odczytywanie dużych tablic

Post autor: mr_x » 12 gru 2010, 19:18

Mam pewną tablicę, która zawiera więcej niż 255 elementów. Z tego powodu mam dylemat, jak najlepiej zabrać się do niej, by bez problemu pobierać elementy spoza pierwszych 256 bajtów. Chodzi mi o coś w rodzaju

Kod: Zaznacz cały

	mov     A, #<nr elementu>
	mov     DPTR, #tablica		;załaduj adres tablicy
	movc    A, @A+DPTR			;pobierz element tablicy
	
	...
	
tablica:
	DB	<tutaj tablica z wieloma elementami>
Proszę nie sugerować dzielenia jej na kilka mniejszych tablic, wolałbym tego uniknąć.

keruseykaryu

Post autor: keruseykaryu » 12 gru 2010, 19:51

W takim razie w A=0 a DPTR zmieniaj.

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 12 gru 2010, 19:53

Też tak myślałem, ewentualnie, gdy dojdzie do przepełnienia A, dodam do DPTR 255 i w ten sposób odczytam dalszą część. Nic lepszego nie wymyśliłem.

keruseykaryu

Post autor: keruseykaryu » 12 gru 2010, 19:57

mr_x pisze:dodam do DPTR 255
To za mało.

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 12 gru 2010, 20:00

Jednak zrobię jak mówiłeś, tak będzie najszybciej i najprościej.

[ Dodano: 2010-12-12, 20:50 ]
Udało się opracować program ;) Podzielę się nim, może komuś się przyda

Kod: Zaznacz cały

	;parametry wejściowe
	mov     A, #<mniej znaczący bajt numeru elementu>
	mov     B, #<bardziej znaczący bajt numeru elementu>

	mov     DPTR, #tablica	;adres tablicy
	add     A, DPL	;dodaj offset mniej znaczącego bajtu elementu
	mov     DPL, A	;i zapisz go w młodszym bajcie rejestru DPTR
	mov     A, B	;teraz czas na bardziej znaczący bajt
	addc    A, DPH	;dodaj offset bardziej znaczącego bajtu elementu (uwzględniając ewentualne przepełnienie podczas liczenia mniej znaczącego bajtu)
	mov     DPH, A	;i zapisz go w starszym bajcie rejestru DPTR

	movx    A, @DPTR	;a teraz po prostu pobierz element z tablicy

	...

tablica:
    DB    <tutaj tablica z wieloma elementami>
Co prawda tym razem należy podać numer elementu jako liczba 16-bitowa, ale w moim przypadku to nie jest problemem.

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

Post autor: kayron » 12 gru 2010, 21:08

Szkoda że nie podałeś jaka wielka jest ta tablica, bo jak od 512 do 2048 elementów, to można używać stronicowania.

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 12 gru 2010, 21:37

Dokładnie 475 bajtów.

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

Post autor: kayron » 12 gru 2010, 21:50

No to proste liczysz w zmiennej 8 bitowej, kiedy przekroczy ci 255 to ustawi ci się znacznik przeniesienia C, wtedy zerujesz sobie go i zmienną 8 bitową, ustawiasz na 1 linię A8, i masz dostępną 2 stronę. Oczywiście to dla dostępu liniowego lub kopiowania tablicy.

keruseykaryu

Post autor: keruseykaryu » 13 gru 2010, 6:31

kayron pisze:wtedy zerujesz sobie go i zmienną 8 bitową, ustawiasz na 1 linię A8
Tylko wtedy trzeba ustawić tablicę dokładnie pod adresem podzielnym przez 256.

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

Post autor: kayron » 13 gru 2010, 9:25

A to jakiś problem ? Jak ma 475 elementów to na pewno ma podpięte przynajmniej 2KB RAMu, no chyba że wytrzasnął jeszcze kości 1KB, ale to też nie problem.
Największym problemem w takich sytuacjach jest najczęściej myślenie, a nie ograniczenia w sprzęcie, czy jego konfiguracji.
Najczęstszym błędem w myśleniu jest to że dane w pamięci muszą być rozlokowane dokładnie liniowo. To nie prawda, zresztą w praktyce rzadko się tak zdarza.

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 13 gru 2010, 11:24

Mam kostkę 32kB, obecnie to nie problem, ale zamierzam w przyszłości wykorzystać większą, a może nawet całą jej część. Buduję własny układ na wzór mikrokomputera, gdzie będzie normalna klawiatura od PC, jest wyświetlacz z telefonu komórkowego. Mam też stare dyski twarde i być może też je wykorzystam. I właśnie najprawdopodobniej to tablice zajmą najwięcej pamięci (wiem, że to RAM, ale obecnie ładuję do niej program z PC i uruchamiam, bo każdorazowe programowanie *PROM byłoby na tym etapie bez sensu).

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

Post autor: kayron » 13 gru 2010, 15:36

To powinieneś sobie przeanalizować takie komputery jak C64 czy ZX 81.

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 13 gru 2010, 15:55

Mam C64, ale chcę coś zrobić swojego, na moim pomyśle ;) To ma służyć do zabawy, ale niewykluczone, że wyjdzie coś z tego ciekawego. Dobrze, że jeszcze nie wyrzuciłem starych kontrolerów Multi I/O na ISA.

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

Post autor: kayron » 13 gru 2010, 17:10

Ciekwy projekt, ja bym ci polecał jako CPU AT89S8253, 12KB FLASh w sam raz na BIOS, 2KB EEPROM, idealnie na generator znaków. 24MHz, programowany przez SPI tak jak AVRy. Do tego podpięć 128KB RAM i masz system cacy.
No chyba że dorwiesz takie cudo z USB na pokładzie.
http://www.atmel.com/dyn/resources/prod ... oc4337.pdf

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 13 gru 2010, 20:14

USB kusi, ale wolałbym układ w tradycyjnej obudowie. Myślałem zastąpić obecny w moim urządzeniu układ 80C31 kostką 89S8252 (ale niewykluczone, że zaproponowany przez Ciebie będzie lepszy). Najbardziej ze względu na łatwość programowania, EEPROM i (do końca nie wiem ile) szybsze taktowanie.
Do tego podpięć 128KB RAM i masz system cacy.
Do magistrali 16-bitowej?

ODPOWIEDZ