AVR Spectrum

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:

  • 8-bitowy procesor Z80 - 3,5MHz, ok. 1 MIPS
  • RAM - 16kB w wersji taniej, 48kB w wersji populanej
  • ROM - 16kB
  • Grafika 16 kolorowa, tryb znakowy 32x24, graficzny 256x192

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.

Istniejące rozwiązania

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

  • Uzebox - polecam!!! Przy pomocy ATmega644 autor projektu stworzył konsolę z rozdzielczością ekranu 240x224 i 256 kolorach. Poszukajcie filmów na youtube, naprawdę jest to godne uwagi.
  • Lazarus 64 - jeszcze bardziej zaawansowany system. Jestem pełen podziwu dla autora
  • AVRTV - a to nasza polska technologia. AVRTV to terminal, który przyjmuje znaki przez RS232 i wyświetla je na telewizorze. Jest 25 wierszy i 40 kolumn, czyli 1000 znaków. Niestety czarno-białe, ale jakość, szczerze przyznam, jest prawie jak HD :)

Założenia projektowe

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 

  • Procesor główny - ATmega128, 128kB ROM, 4kB RAM, 16MIPS
  • Grafika - ATmega162 i telewizor
  • RAM - 64kB zewnętrznej pamięci RAM na dwóch kościach 62256, głównie jako bufor obrazu
  • Klawiatura - zwykła od komputera, ze złączem PS/2
  • Dwie agistrale UART - do wyboru można je przełączyć na RS232, USB przez FT232RL, bezpośrednio lub jeszcze inaczej
  • Magistrala I2C i dedykowane scalaki - pamięć szeregowa EEPROM AT24C oraz Real Time Clock DS1307
  • Karta SD
  • Termometr LM35
  • ...zobaczymy, co jeszcze wymyślę :)

Schemat jest roboczy i zmieni się jeszcze 100 razy. 

Interpreter

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. 

Zdjęcia

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. 

7 maja 2011

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. 

  • 'e - wewnętrzny EEPROM
  • 'u - UART0
  • 'i - UART1

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

  • :gwiazdki - dwukropek to znacznik etykiety, pod którą można skoczyć poleceniem goto. Tutaj jest to nazwa programu.
  • echo 0 - wyłączenie wyświetlania wpisywanych poleceń, pokazują się tylko ich wyniki
  • cls - czyszczenie ekranu
  • input A Podaj A: - program wyświetla "Podaj A:" i czeka na podanie liczby, którą zapisuje do zmiennej A
  • nl - nowa linia
  • loop A X - uwaga! teraz będzie fajne! :) loop to pętla, która powtórzy się A razy. X to nazwa pętli i jednocześnie jej zmienna sterująca. Polecenie loop kopiuje wartość A do X oraz zapisuje w pamięci adres pierwszego następnego polecenia, żeby było wiadomo, od czego pętla się zaczyna. A tym przykładzie A występuje jako wartość początkowa. Można by też wpisać loop 10 X, aby pętla wykonała się 10 razy.
  • loop B Y - pętla w pętli też jest możliwa!
  • txt * - wyświetlenie tekstu, czyli gwiazdki
  • next Y - zmniejszenie zmiennej sterującej pętli Y. Jeżeli Y jest większe od zera to nastąpi skok pod adres, który zapisało polecenie loop B Y
  • pause - czekaj na dowolny klawisz
  • echo 1 - włączenie pokazywania wpisywanych poleceń
  • cls - czyszczenie gwiazdek

Tak to działa: 

A tak działa kalkulator: 

12 października 2011

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.

1 grudnia 2011

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! 

Zakończenie

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!