Brak produktów
Pamiętacie ZX Spectrum? Przenieśmy się na chwilę do roku 1982. Po sukcesie komputerów ZX80 i ZX81, produkowanych przez Sinclair Research Ltd. na rynek z wielką pompą weszły komputery ZX Spectrum. Były na tyle tanie, że przeciętny człowiek mógł sobie pozwolić na własny komputer. Przede wszystkim - generowały obraz kolorowy (dlatego "spectrum") i odtwarzały atrakcyjne, jak na tamte czasy, efekty dźwiękowe. Bogata oferta oprogramowania zabawowego sprawiła, że komputerek ZX Spectrum szturmem zdobył polskie strzechy. Mało tego, ZX Spectrum był stosowany również w zakładach pracy jako narzędzie obliczeniowe czy nawet sterownik maszyn produkcyjnych! To właśnie Spectrumienka generowała efekty dźwiękowe do Seksmisji i grafikę do programu Sonda.
Zajrzyjmy, co w środku siedzi:
ZX Spectrum nie miał pamięci stałej ani monitora! W roli dysku twardego występował magnetofon ze zwykłą kasetą audio, a monitorem był zwyczajny telewizor. To dzięki temu rozwiązaniu komputer był tani. Programy kopiowało się z jednego magnetofonu na drugi. Istniała też namiastka internetu - niektóre stacje radiowe prowadziły audycje, podczas których nadawały programy do nagrania na magnetofonie. Niektórzy potrafili także przesyłać programy przez telefon.
30 lat później, tanie i popularne mikrokontrolery AVR, również 8-bitowe, mają zdecydowanie większą wydajność obliczeniową, więcej pamięci stałej i RAM-u (zewnętrznego). Dlaczego by zatem nie stworzyć czegoś na kształt ZX Spectrum? Od pewnego czasu chodzi mi po głowie własna konsola do gier. Przeglądając internet, można znaleźć podobne cuda
Czas określić wreszcie, co jest celem do osiągnięcia. Cel jest zabawowo-edukacyjny, a więc hulaj dusza, piekła nie ma! Planuję stworzyć tryb graficzny na wzór AVRTV, ale kolorowy, tak jak w DOS-ie albo ZX Spectrum. Dźwięk nie musi być HiFi - głośniczek sterowany przez PWM wystarczy, ale może kiedyś to rozwinę. Obsługa kart SD, interfejsów UART, I2C, SPI, USC, będzie oczywiście w planach.
No i najważniejsze, każdy komputer musi uruchamiać programy. I tu się pojawia problem. O ile AVR pozwala na dołączenie zewnętrznej pamięci RAM, to nie ma żadnego sposobu, by uruchomić program z pamięci zewnętrznej. Cóż zatem począć? Planuję dwa rozwiązania tego problemu. Po pierwsze, procesor AVR ma możliwość zaprogramowania siebie samego, bez programatora. Można zaprogramować procesor programem przesłanym przez UART, można także zaprogramować plikiem odczytanym z karty SD. Druga opcja pochodzi prosto z ZX Spectrum - zastosować interpreter. Większość programów na ZX Spectrum nie była pisana w assemblerze na Z80, ale w języku BASIC. Programu w BASIC-u nawet nie trzeba było kompilować! System operacyjny był wyposażony w interpreter, który odczytywał program linia po linii i w czasie rzeczywistym przekształcał go na instrukcje maszynowe. Tak się składa, że rok temu napisałem coś, co idealnie pasuje do tego zadania... i obecnie spisuje się bardzo dobrze. Generalnie, interpreter stanowi własny język programowania. Opiszę go dokładniej w późniejszym czasie.
Krótka specyfikacja
Schemat jest roboczy i zmieni się jeszcze 100 razy.
Po włączeniu zasilania, pojawia się === AVR Spectrum ===, numer wersji i źródło sygnału resetu. Znak > oznacza gotowość na przyjęcie polecenia. Poleceniem jest ciąg znaków ASCII zakończony znakiem 13 czyli enterem.
Głównym celem interpretera ma być coś w rodzaju wiersza poleceń, znanego z DOSa - przeglądanie plików, otwieranie, programowanie procesora wybranym programem i uruchomienie. Jeszcze nie ma takiej funkcjonalności. Póki co, interpreter wywołuje z góry określone funkcje. Najciekawszą możliwością jest jest zmiana źródła znaków do interpretacji z klawiatury, na pamięć EEPROM. Tym sposobem AVR może wykonać program z zewnętrznej pamięci, tak jak ZX Spectrum z magnetofonu, po skopiowaniu programu do RAM-u.
Interpreter działa w notacji prefiksowej, zwanej też notacją polską, czyli najpierw jest polecenie, a potem jego argumenty. Największą zaletą tego rozwiązania jest jego prostota - nie potrzeba nawiasów, a kolejność wykonywania zawsze jest jednoznaczna. Ponadto, interpreter odczytuje znaki zawsze od lewej do prawej, nigdy nie musi się cofać i nie potrzeba dodatkowego stosu, jak w przypadku notacji postfiksowej.
Na przykład, zapis w notacji tradycyjnej 2/(4+5) w notacji prefiksowej wygląda tak: / 2 + 4 5
Choć początkowo taki zapis może wydawać się niezrozumiały, to w praktyce jest bardzo zaskakująco prosty. Jego autorem jest Ignacy Łukasiewicz - wybitny polski logik.
I teraz najważniejsze - argumentami poleceń mogą być kolejne polecenia. Można je łączyć w sposób bardzo dowolny.
Obecnie nie ma jeszcze poleceń goto, for, while, chociaż mam już polecenie if. Kwestia czasu ;) Zaletą interpretera jest to, że można zapisać w pamięci EEPROM prosty program, zupełnie bez użycia normalnego komputera i programatora.
W wersji roboczej wykorzystuję terminal na komputerze zamiast widocznego niżej wyświetlacza. Poniżej są zdjęcia pierwszego prototypu - klawiatura PS/2 już jest, a zamiast telewizora póki co jest LCD4x40. Dla przykładu widać polecenie time, które odczytuje czas z DS1307.
Projekt się rozwinął od ostatniego czasu. Działa już telewizor!!! Działają instrukcje warunkowe, pętle, zmienne, wykonywanie programu z zewnętrznego RAMu, ładowanie i zapisywanie w wewnętrznym EEPROMie. Poniższe zdjęcia pokazuję AVR Spectrum w akcji.
Tak obecnie wygląda AVR Spectrum. Plątanina kabli :) Po włączaniu zasilania, na ekranie pokazuje się nazwa projektu, data kompilacji, źródło sygnały reset oraz ilość dostępnej pamięci. Znak > oznacza gotowość na przyjęcie polecenia z klawiatury.
Dla przykładu polecenie time. Znak : pojawia się po naciśnięciu ENTER i oznacza początek interpretacji. Dalej jest oczywiście wyświetlany wynik polecenia.
Polecenie scan służy do wyszukiwania programów w pamięci. 'e to pamięć EEPROM, 'r to RAM. Apostrof służy do wskazania interpreterowi, że następny znak to stała, a nie kolejne polecenie. W pamięci EEPROM obecnie mam dwa programy. Pierwszy nazywa się "gwiazdki", zaczyna się pod adresem 0, kończy na adresie 228 i zajmuje oczywiście 228 bajtów.
Ładowanie programów do pamięci RAM. Polecenie load przyjmuje trzy argumenty:
Argument pierwszy określa, skąd ma być brany program.
Drugi argument to adres pamięci źródłowej. W przykładzie program "kalkulator" został załadowany z pamięci EEPROM z adresu 300.
Trzeci argument, o którym zapomniałem przed zrobieniem zdjęcia, to adres RAM pod który program ma być załadowany. Brak argumentu oznacza 0. W poniższym przykładzie, oba programy zostały załadowane na adres 0 :)
Poniżej widzimy treść programu "gwiazdki". Omówię polecenia, jakie w nim występują.
Tak to działa:
A tak działa kalkulator:
Wrzucam wizualizację płytki o wymiarach 14x20cm. Jest na niej 20 układów scalonych, 178 elementów, 634 połączeń, 844 pola lutownicze, a razem z przelotkami 931 pól! Schemat tego projektu mieści się na kartce A2 i rysowałem go dwa tygodnie, przerabiając 4 wersje. Płytka powstawała przez miesiąc, ciągle jeszcze poprawiam drobne rzeczy, ale w 99% projekt jest już gotowy. Kiedy będę ostatecznie pewny, że wszystko będzie działać, to wezmę się za wykonanie płytki. Jest to zdecydowanie największa i najbardziej skomplikowana płytka, którą wykonam.
Czy porywam się z motyką na słońce? Dwa i pół roku temu, kiedy byłem jeszcze żółtodziobem i nie wiedziałem nawet jak działa tranzystor, robiłem kalkulator programowalny i udało się. Tamten projekt zajął mi cztery miesiące. Bardzo mile wspominam ten czas :) Doświadczenie zdobyte przy tych przedsięwzięciach jest bezcenne!
A teraz do rzeczy - pierwszy obrazek to płytka w wersji bardzo wczesnej, jeszcze bez ścieżek.
Poniżej widać wersję 0.3, która obecnie przechodzi do wersji 0.4. Widoczny na rysunkach wyświetlacz LCD będzie zamontowany pod kątem 45 stopni, aby wygodnie się na niego patrzyło. Aż prosi się, żeby zamiast niego wstawić jakąś małą matrycę LCD, ale niestety nie mam takiej. Jeżeli ktoś by tanio sprzedał mały telewizorek LCD z wejściem kompozytowym, to proszę o kontakt.
Wykonałem płytkę, zlutowałem, włączyłem i działa! Mimo to projekt cały czas jest jeszcze w fazie rozwojowej - nie działa jeszcze obsługa karty SD, a lista znanych błędów w programie jest długa na cały ekran. Lista nieznanych błędów pewnie ma dwa ekrany :) Tak czy inaczej, jest już bliżej niż dalej!
Prezentowany tutaj komputer był moją pracą inżynierską. Wersja finalna posiada dodatkowe sterowniki pozwalające kontrolować silniki XY plotera rysującego. Interpreter uzyskał możliwość odczytywania plików HPGL, a to prosty format rysunków CAD, które generują wszystkie programy projektowe. Jest to projekt, który zaliczam do kategorii tych "romantycznych". Nie jest to rzecz o znaczeniu praktycznym, sama w sobie. Jednak przy budowie tego komputera powstała cała masa narzędzi, kodów programów, a zdobyte doświadczenie jest bezcenne!