Skocz do zawartości

[Bascom] wczytywanie programu z karty SD do ramu bądź bezpośredni odczyt z SD


zuba1

Pomocna odpowiedź

Witam. Ostatnio zbudowałem małe(3,5x5x1,5cm) urządzenie przenośne-tak z nudów na feriach 🙂 . głównym celem było stworzenie mu GUI ,odtwarzanie dźwięków, plików TXT, komunikacja z kartą SD oraz sterowanie urządzeniami przez podczerwień rs232 oraz moduł radiowy na 433MHz za pomocą akcelerometru. Taki sobie mały kombajn 🙂 . Jako wyświetlacza użyłem LCD z 6100 a procesorem jest atmega 32 z zewnętrznym kwarcem 16MHZ. Opisu było by na tyle a teraz problem. Z napisaniem programu nie było kłopotu, ale trochę krwi mi to napsuło. Obecnie wraz z grafikami zajmuje jakieś 96% pamięci wewnętrznej. Zacząłem się zastanawiać jak rozwiązać ten problem, bo to co napisałem to zaledwie namiastka tego co chcę w to cudo wcisnąć. Pierwszy pomysł to ładowanie grafiki z karty SD zamiast z pamięci ale jeśli tak to najlepiej ładować wszystko czyli cały system. Pomyślałem wtedy żeby ładować to do pamięci ram. Na karcie znajdował by się plik w formacie hex i bit po bicie bym ładował do ramu. a potem przechodził na tryb pracy odczytu z ramu tak jak ma to miejsce w pamięci eeprom. Niestety pamięć ram jest mała dlatego trzeba by się podłączyć zewnętrzną pamięcią na jakiejś magistrali. Oczywiście w pamięci procesora znajdował by się kod odpowiedzialny za rozruch i komunikację z kartą a także sterowniki do wyświetlacza. Kolejny pomysł to bezpośredni odczyt programu z dysku danych czyli karty SD. Niestety nie lądując danych do ramu a prowadząc odczyt z SD zajmowało by mu to wieki. Macie jakieś pomysły jak rozwiązać ten problem?? Potrzebuję zyskać dodatkowe miejsce na dane bez wymiany procesora na nowszy. Jedyna realna opcja to ten zewnętrzny ram. Co wy na to??

Link do komentarza
Share on other sites

Zrobiłeś dużo fajnych rzeczy i chwała Ci za to ale pominąłeś jedną ważną informację: procesory AVR nie mogą wykonywać programu z pamięci zewnętrznych. Nie mogą, koniec i kropka. Możesz dołączyć RAM "na piechotę" do małych AVR-ków lub wykorzystując dedykowany interfejs do pamięci zewnętrznej (ATmega128 i większe) ale to zawsze będzie pamięć danych. Architektura typu Harvard ma z definicji rozdzielone przestrzenie adresowe programu/danych a tu projektanci uznali od razu na wstępie, że nie będzie opcji rozszerzania pamięci programu inaczej jak tylko przez zmianę procesora. Przykro mi.

Rozwiązaniem byłoby coś na kształt wirtualnej maszyny Java - koncepcji znanej od dziesięcioleci. W pamięci programu trzymasz, być może bardzo rozbudowany system interpretera tworzący środowisko do pracy docelowego programu. Program w postaci prekompilowanego kodu pośredniego (lub nawet tekstu w ASCII - to tylko kwestia optymalizacji czasu wykonania) znajduje się wtedy gdziekolwiek, np. w pamięci danych RAM i stamtąd jest czytany, dekodowany i "wykonywany" poprzez wywołania odpowiednich funkcji. Jeśli jesteś w stanie przewidzieć jakich funkcji będziesz potrzebował w przyszłości, możesz ich zbiór umieścić w pamięci programu, dopisać interpreter jakiegoś wymyślonego lub istniejącego języka i zacząć zabawę z RAMem i ładowaniem tam "programu" np. z SD.

Jeśi pamiętasz małe komputery programowane w BASIC to właśnie o czymś takim myślę.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Ok. Rozumiem. Zastanawiam się jeszcze nad tym aby program ładować na kartę a potem do obsługi właśnie tak jak napisałeś tylko że działanie będzie liche. To że są architektury harvard to wiem ale nie wiedziałem że nie mogą wykonywać z poza programu.jeśli nawet tak zrobię to nie będę mógł robić swoich ulubionych wodotrysków na wyświetlaczu i całe GUI pójdzie w błoto. przyjrzę się jeszcze jak wyglądało to w starych basicowych komputerach dziękuję za odpowiedź. Pozdrawiam.

Link do komentarza
Share on other sites

Niezupełnie. Jeżeli zrobisz system wieloprocesorowy, i do M32 dopniesz np. ATMEGe168 i zrobisz na niej akcelerator grafiki, do będziesz przesyłał do niej tylko dane graficzne, oraz rozkazy przetwarzania grafiki.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Z tymże tu pojawia się problem ponieważ ciężko zmieścić na płytce 3,5cm x 5cm dwa procesory (w następnej wersji master który obecnie jest atmegą32 zostanie zamieniony na jakiś większy model XMEGA ponieważ zaczyna mi brakować IO ),akcelerometr,kartę SD,dodatkową pamięć ram (bo będę następną wersję w takową wyposażał),moduł radiowy,kwarc z kondziami ,drobnica w postaci cewek i stabilizatorów i przede wszystkim złącza.

Link do komentarza
Share on other sites

Jeżeli planujesz XMegę, część problemów niejako rozwiązuje ci się sama, ponieważ do dyspozycji będziesz miał kanał DMA, którym możesz sprzętowo przesyłać pakiety danych, w tym np. ekrany do wyświetlacza, ale będzie to wymagało napisania nowych bibliotek graficznych zoptymalizowanych pod tym kątem. Akceleratorem dla wyświetlacza mógłby być nawet ATTiny85 lub 84 jeżeli masz mało miejsca na PCB, pierwszy jest w obudowie 8 pinowej, drugi 14, w SMD zajmą mało miejsca.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

"..ale nie wiedziałem że nie mogą wykonywać z poza programu"

Nie, nie. Kanoniczna architektura Harvard to rozdzielone przestrzenie adresowe pamięci programu i danych ale wcale nie jest powiedziane, gdzie te pamięci muszą być. Zobacz, w procesorach 8048 i 8051 też był taki rozdział a Intel umożliwił dołączanie do procesora zewnętrznych pamięci programu i danych. Inne sygnały uaktywniały jedną pamięć (i to mógł być ROM/EPROM/FLASH jak i RAM) gdy był pobierany kod instrukcji a drugą (i to także mógł być dowolny typ) gdy były potrzebne dane. To ATMEL tak sobie wymyślił w AVR i wcale mu się nie dziwię. Zrobienie interfejsu do pamięci zewnętrznej to mnóstwo zmarnowanych nóżek a poza tym nie te czasy (w sensie czasu dostępu 🙂 ). Aby procesor mógł pracować z zegarem 16MHz musielibyśmy podłączać pamięci stałe o czasach rzędu 50ns (lub mniej w przypadku szyn multipleksowanych jak to jest w zwyczaju mikrokontrolerów) a to nie jest już ani prosta ani tania sprawa. Zakłócenia, EMC, dużo prądu i wymagania na PCB zniechęciłyby do tego produktu każdego. To właśnie brak możliwości podłączania zewnętrznej pamięci programu umożliwił skonstruowanie takich fajnych procesorków.

Gdybyś swój program prekompilował gdzieś na PC do postaci jak najbardziej "zjadliwej" dla interpretera w AVR to to wcale nie musiałoby być dużo wolniejsze niż natywny kod pracujący z FLASH. Zauważ, że sprowadziłoby to się do kontrolowania jakiegoś wirtualnego licznika instrukcji, prostego dekodowania kodu (jedna instrukcja skoku wyliczanego), pobrania argumentów (i tak trzeba załadować argumenty przed wywołaniem funkcji) oraz wywołania docelowej funkcji. Przy nietrywialnych funkcjach liczyłbym narzut kilkuprocentowy a przy obsłudze grafiki o której myślisz, jeszcze mniejszy. Na pewno są już takie rzeczy zrobione nawet na AVR ale nie jestem specjalistą od oprogramowania więc przykładu nie podam. Może Koledzy bardziej w tej działce biegli coś tu wskażą.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

A macie jakieś pomysły w kwestii ładowania danych z karty SD do flasha żeby zrobić coś w stylu bootloader?? Oraz jak takową pamięć czyścić z danych w niej zapisanych z karty. Swoją drogą to poniekąd marnotrawstwo mieć podłączony dysk z danymi i nie móc z niego odtworzyć nic więcej niż muzykę lub tekst. ps.Czy wie ktoś jak ładować obrazki z karty do lcd 6100 z pliku BMP bądź BGF ???

[ Dodano: 03-03-2013, 20:21 ]

Mam jeszcze małą dygresję na ten temat .W ofercie atmela jest układ AT32UC3L064 którego nazwa wskazuje że posiada rdzeń L0 i posiada wszystko czego szukałem czyli wysokie taktowanie i duze pamięci wewnętrzne. Czy takowego 32 bitowca da się zaprogramować w bascomie i czy w ogóle może on spełniać tą samą rolę co zwyczajny avr?? I jaki trzeba do niego programator bo coś tak czuję że tu ISP nie występuje.

Link do komentarza
Share on other sites

Nie BASCOM go nie obsługuje, jedynie AVR32 Studio od Atmela. Jest to zasadniczo 32 bitowy rdzeń AVR, ale różni się trochę od zwykłych AVRów.

Dobrze przejrzyj ofertę XMeg, bo potrafią obsługiwać zewnętrzne pamięci danych.

Ale ogólnie i tak ograniczy cie BASCOM i jego niedoskonałości, chyba że nauczysz się stosować w nim asembler.

Co do plików BMP, to dosyć prosty format, BGF jest skompresowany i to chyba format BASCOMa, ale jak już bawić się w dekompresję danych to lepiej opanować GIFy i algorytm LZW.

Jeżeli zależy ci na możliwości odpalania programu z RAM, to musiałbyś skierować swoje kroki w procesory 8051 z udoskonalonym rdzeniem, to obsłużysz z BASCOM 51. Ale to przestarzałe dziś procesory na których ja się uczyłem programować, a 80552 który by ci najbardziej pasował, jest niestety drogi i trudny do zdobycia, a Atmel nie robi jego odpowiednika 🙁 Ostatecznie 89S55 od ATmela.

Link do komentarza
Share on other sites

Od dłuższego czasu męczę się z tymi obrazkami w BMP. Puki co odtwarzam z pamięci wewnętrznej te BGF które pożerają mi pamięć. Gdybym mógł chociaż część tych obrazków przenieść na kartę pamięci (głównie ikony) to rozwiało by moje kłopoty.PS.Istnieją jakieś panele dotykowe rezystancyjne na 1,5 cala tak aby można było nałożyć na LCD od 6100?? Bo znajduję zamie od 2,2 cala.

Link do komentarza
Share on other sites

Ok.może coś z tego wyjdzie a tak poza tym to dało by się zrobić bootloadera z karty SD do pamięci tzn mam bootloadera w bascomie napisanego pod rs232 ale czy taki kod na pobieranie danych na RS to czy jest to hex czy coś innego??

Link do komentarza
Share on other sites

Pewnie się da, ale musiałbyś dobrze programować w Asemblerze, bo w obszarze Bootloadera, FLASH musiałbyś zmieścić procedury obsługi karty SD/MMC i sam program flashujący.

Ogólnie to skomplikowane zadanie.

Link do komentarza
Share on other sites

Kolego zuba1 nadużywasz od dłuższego czasu tego forum, zrobiłeś sobie elektroniczną ściągę i przy każdym temacie coś ściemniasz, że to do robota itp. Udowodnij nie tylko mi, że rzeczywiście zrobiłeś coś do robota. Jeśli niczego nie pokażesz zostaniesz przeze mnie stosownie nagrodzony bo od dłuższego czasu wszystkie twoje posty i tematy dotyczyły tego urządzenia, które według mnie nijak się ma do tematyki forum.

Link do komentarza
Share on other sites

Ok.Rozumiem że może to brzmieć dziwnie ale chcę przepisać androida na tą ściągę a następnie pokazać projekt na forum wraz z podłączonym minisumo na uarcie. Na razie nijako to wygląda bo non stop coś się wysypuje ale jestem dobrej myśli ze się uda. Tematu na razie nie publikuje tu bo myślę nad publikacją w gazecie.Jeśli kogoś uraziłem lub zdenerwowałem pytając się wciąż na forum o te same rzeczy to było to spowodowane tym że w sieci jest naprawdę mało informacji na ten temat. Tematyka tego działu to mikro kontrolery i programowanie wiec pytam się właśnie odnośnie tej tematyki. Związek z robotyką ma to z kolei wielki ponieważ takie urządzenie jest doskonała platforma to tego typu pojazdów tak samo jak zestawy discovery czy też Arduino. Idąc tym tokiem rozumowania kolegi. Gdybym się pytał o wczytywanie kodu z karty SD do pamięci procesora umieszczonego na płytce Arduino to kolega nie miał by nic przeciwko.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.