Procesory 6502, 6510, 8502 i 6502C/SALLY nie mają nowoczesnego SPI, DMA sensora ani sprzętowej jednostki zmiennoprzecinkowej, lecz zapewniają przewidywalny model wykonania, przerwania i 64-kilobajtową przestrzeń adresową. Z odpowiednim timerem, układem wejścia/wyjścia oraz zewnętrznym watchdogiem można na nich zbudować regulator laboratoryjny, komputer HIL albo ograniczony kontroler nieuzbrojonego demonstratora. Najważniejszą decyzją jest wybór między użyciem całego komputera a odzyskaniem jego CPU i peryferiów.
Pięć różnych punktów startowych#
Hasło „flight controller na Commodore lub Atari” jest zbyt szerokie. W praktyce istnieje pięć istotnie różnych konfiguracji.
| Wariant | CPU | Peryferia istotne dla laboratorium | Charakterystyka |
|---|---|---|---|
| Commodore 64 | MOS 6510, około 1 MHz zależnie od wersji regionalnej | dwa 6526 CIA, user port | łatwy HIL, ale wideo i system operacyjny wprowadzają zakłócenia |
| Commodore 128 | MOS 8502, tryb do około 2 MHz | CIA i rozszerzona mapa maszyny | większy budżet, nadal złożona płyta komputera |
| Commodore 1541 | MOS 6502, około 1 MHz | dwa 6522 VIA | interesująca samodzielna płyta bez układu wideo |
| Atari 400/800/XL/XE | 6502/6502C/SALLY, około 1,77–1,79 MHz | POKEY, 6520 PIA | dobre timery i serial, lecz ANTIC kradnie cykle magistrali |
| nowa płyta retro | W65C02S | W65C22S, RAM, Flash/EEPROM, supervisor | najczystszy wariant do pomiaru architektury 6502 |
Częstotliwości historycznych komputerów zależą od standardu obrazu i rewizji. W artykule są rzędem wielkości, nie parametrem do wpisania bez sprawdzenia schematu oraz oscylatora konkretnej sztuki.
Dlaczego cały komputer jest dobry w HIL#
C64 albo Atari ustawione na stole ma klawiaturę, pamięć, zasilacz, interfejs użytkownika i gotowy mechanizm ładowania programu. Może odebrać symulowaną próbkę IMU przez user port lub interfejs szeregowy, policzyć regulator i odesłać cztery komendy do komputera modelującego dynamikę. Ekran pokazuje liczbę przekroczeń deadline, maksymalny czas pętli i stan maszyny bezpieczeństwa.
Ten wariant pozwala odpowiedzieć na ważne pytania przed projektowaniem PCB:
- ile cykli zajmuje skalowanie sześciu osi;
- czy mnożenie 16×16 bitów mieści się w okresie;
- ile kosztuje wysłanie logu;
- jaki jitter wprowadza system wideo i obsługa ROM;
- czy przerwanie timera ma stałą latencję;
- jak zachowuje się kod po utracie jednego bajtu ramki.
Pełna płyta komputera jest natomiast ciężka, pobiera niepotrzebną energię, ma stare złącza i układy o nieznanym stanie. Dlatego wynik HIL nie jest automatycznym dowodem gotowości do lotu.
Wariant W65C02S + W65C22S#
Współczesny W65C02S zachowuje 8-bitową magistralę danych i 16-bitową magistralę adresową, więc bez bankowania adresuje 65 536 bajtów. Wersja WDC jest rdzeniem statycznym: zegar można zatrzymać z zachowaniem stanu, a wejścia IRQB, NMIB, RESB i RDY pozwalają zbudować klasyczny system czasu rzeczywistego. Nie znaczy to, że układ automatycznie rozwiązuje reset, brownout lub watchdog — te funkcje nadal wymagają supervisor IC i poprawnego zasilania.
W65C22S VIA daje dwa 8-bitowe porty, dwa 16-bitowe timery, rejestr przesuwny, linie handshake i logikę przerwań. Timer 1 może tworzyć tick pętli, timer 2 mierzyć czas zewnętrznego zdarzenia, a CA/CB sygnalizować gotową próbkę z mostka IMU. Port równoległy może wymieniać atomowo cały bajt z rejestrem wyjściowym.
Przykładowa mapa, którą trzeba traktować jako decyzję projektową, nie standard:
| Adres | Element | Funkcja |
|---|---|---|
$0000–$00FF |
zero page | szybkie zmienne regulatora i wskaźniki |
$0100–$01FF |
stos | wyłącznie krótkie ISR i płytkie wywołania |
$0200–$3FFF |
RAM | bufory sensorów, stan, telemetria |
$6000–$600F |
VIA | timer, handshake, wyjścia laboratoryjne |
$7000–$70FF |
mostek IMU | dwa bufory próbek i rejestr statusu |
$8000–$FFFF |
ROM/Flash | kod oraz wektory NMI/RESET/IRQ |
Dekoder adresu powinien doprowadzić do jednoznacznego chip-select. „Pływający” wybór urządzenia może powodować równoczesne sterowanie magistralą przez dwa układy. Sygnał resetu musi najpierw utrzymać bufory wyjściowe w stanie wyłączonym, dopiero później zwolnić CPU.
Commodore 64 i 128: CIA oraz user port#
W C64 6510 jest pochodną 6502 z dodatkowym portem I/O używanym przez mapowanie pamięci. Do laboratorium ważniejsze są układy 6526 CIA. Każdy zawiera dwa timery, porty I/O, rejestr szeregowy i logikę przerwań. User port wyprowadza część linii CIA, dlatego nadaje się do połączenia z buforem HIL.
Nie należy łączyć user portu bezpośrednio z sensorem 3,3 V ani telefonem. Historyczna logika pracuje w innej domenie napięcia, może mieć większe prądy i nie zapewnia ochrony ESD współczesnego złącza. Warstwa pośrednia powinna zawierać bufor kierunkowy, translację poziomów i ograniczenie prądu. Dla migawki najlepsza jest izolacja galwaniczna.
CIA może generować okresowy IRQ, ale program uruchomiony pod KERNAL-em dzieli maszynę z systemem. W pierwszym HIL można zachować systemowe przerwanie i tylko znacznikować własny tick. Do pomiaru najgorszego czasu trzeba jednak kontrolować wszystkie źródła IRQ, wyłączyć niepotrzebny raster i unikać procedur ROM, które mają nieznany z perspektywy pętli czas.
C128 w trybie 2 MHz zwiększa budżet obliczeń, lecz przełączanie trybów i współistnienie z logiką wideo wymaga dokumentacji konkretnego trybu. Najuczciwszy benchmark wykonuje identyczny wektor testowy na 1 i 2 MHz, zapisując minimum, maksimum oraz histogram czasu iteracji.
Commodore 1541: nietypowa płyta SBC#
Napęd 1541 zawiera własny 6502, RAM, ROM i dwa układy 6522 VIA. Z punktu widzenia eksperymentu jest bliższy komputerowi jednopłytkowemu niż peryferium dyskowemu. Jeden VIA obsługiwał komunikację z komputerem, drugi mechanikę napędu; po odłączeniu mechaniki dostępne są timery oraz porty.
Są jednak trzy pułapki. Po pierwsze, mapy adresów i elektryka różnią się między rewizjami. Po drugie, oryginalny ROM nie jest szkieletem kontrolera lotu — potrzebny jest własny obraz i bezpieczna droga jego ładowania. Po trzecie, stara sekcja zasilania może być gorszym elementem stanowiska niż sam CPU. Przed użyciem mierzy się tętnienia, temperaturę stabilizatorów oraz zachowanie resetu przy wolnym narastaniu napięcia.
Wartość 1541 polega na dostępności zestawu 6502+VIA bez toru wideo. Nie należy niszczyć sprawnego, kolekcjonerskiego urządzenia, jeśli tę samą funkcję można zbudować na W65C02SXB albo płytce prototypowej.
Atari: SALLY, POKEY, PIA i ANTIC#
Atari 8-bit wykorzystuje 6502 lub wariant 6502C/SALLY. POKEY dostarcza m.in. timery, komunikację szeregową, obsługę klawiatury i wejść analogowych, natomiast 6520 PIA zapewnia dwa porty równoległe. Zestaw wygląda atrakcyjnie dla HIL, ale architektura obrazu jest istotna: ANTIC wykonuje DMA i okresowo odbiera CPU cykle magistrali.
Średnia częstotliwość regulatora może pozostać poprawna, a mimo to odstępy między iteracjami będą się zmieniać zależnie od display listy. Dlatego test powinien porównać:
- normalny ekran tekstowy;
- pustą/minimalną display listę;
- wyłączone lub ograniczone DMA ANTIC;
- wersje PAL i NTSC, jeśli sprzęt jest dostępny.
Do logu trafia rzeczywisty odstęp dt, nie tylko numer iteracji. Jeżeli regulator używa stałego dt, jitter powinien być mały i ograniczony. Jeżeli używa mierzonego dt, trzeba dodatkowo sprawdzić koszt dzielenia oraz zakres liczbowy.
Mostek IMU dla retro CPU#
Programowe SPI na VIA lub PIA jest możliwe, lecz każdy bit kosztuje kilka zapisów, odczytów i instrukcji gałęzi. Burst 14 bajtów może pochłonąć znaczącą część okresu 5–10 ms. Rozwiązaniem jest mostek, który prezentuje próbkę jako mały bank rejestrów:
offset znaczenie
$00 numer sekwencyjny
$01 status: READY / OVERRUN / SENSOR_ERROR
$02-03 gyro X, little endian
$04-05 gyro Y
$06-07 gyro Z
$08-09 accel X
$0A-0B accel Y
$0C-0D accel Z
$0E-11 timestamp mikrosekundowy
$12 CRC-8 lub suma kontrolna ramki
Podwójny bufor zapobiega odczytaniu połowy starej i połowy nowej próbki. Mostek wypełnia bufor nieaktywny, zapisuje CRC, a na końcu atomowo zmienia numer aktywnego banku. CPU najpierw czyta numer, potem dane i ponownie numer; różnica oznacza, że odczyt trzeba odrzucić.
Nie należy skalować wszystkiego do float w mostku tylko po to, aby potem wrócić do integer. Najprościej przekazywać surowe int16_t oraz osobno współczynnik skali ustalony przy inicjalizacji.
Organizacja pętli 100 Hz#
Pętla 100 Hz jest realistycznym punktem początkowym dla HIL i powolnego stanowiska. Nie jest deklaracją, że wystarczy dla każdego multirotora. Przykładowy harmonogram:
IRQ timera: licznik czasu++, tick_pending=1, powrót
pętla główna:
jeśli tick_pending == 0: obsłuż telemetrię w małych porcjach
atomowo wyzeruj tick_pending
wystaw znacznik START na pinie analizatora
odczytaj bank IMU i zweryfikuj numer + CRC
policz wiek próbki
jeśli błąd lub wiek > limit: zapisz zera do bufora wyjść
inaczej: filtr -> regulator rate -> mikser -> saturacja
obsłuż maszynę impulsu migawki
atomowo przełącz bufor wyjść
odśwież watchdog
skasuj znacznik START
Telemetria nie może wykonać blokującego putchar dla całego wiersza CSV. Pętla zapisuje krótki rekord binarny do bufora kołowego, a kod tła wysyła po kilka bajtów, gdy nadajnik jest gotowy. Przepełnienie bufora zwiększa licznik log_drop; nie opóźnia sterowania.
Regulator i mikser w Q8#
Najprostsza reprezentacja z laboratoriów portalu koduje wyjście w zakresie 0–255. Błąd prędkości kątowej jest w dziesiątych częściach stopnia na sekundę, a Kp w Q8. Iloczyn musi zostać obliczony jako 32-bitowy, nawet jeśli wynik po przesunięciu mieści się w 16 bitach.
W 6502 mnożenie 16×8 nie jest pojedynczą instrukcją. Można użyć przesunięć i dodawań albo tablic dla ograniczonego zakresu. Należy porównać trzy warianty na tych samych danych: uniwersalną procedurę, specjalizowaną stałą Kp oraz tablicę. Wygrywa rozwiązanie o przewidywalnym najgorszym czasie i akceptowalnym błędzie, nie to z najlepszym średnim benchmarkiem.
Mikser quad-X to cztery kombinacje znaków roll/pitch/yaw. Test jednostkowy powinien wykazać, że dodatni roll zwiększa właściwą parę i zmniejsza przeciwną oraz że każde wyjście nasyca się przed konwersją do bajtu.
Migawka aparatu#
W fc-lab-commodore-atari wyjście migawki jest takim samym stanem logicznym jak na STM32: impuls 120 ms, wykrywanie zbocza i 500 ms blokady. Różnica dotyczy wyłącznie portu. C64 może sterować linią user portu przez CIA, Atari linią PIA, a własna płyta linią VIA. W każdym przypadku linia zasila LED transoptora przez dobrany rezystor, a fototranzystor zwiera wejście remote.
Przewodowy selfie stick można wykorzystać jako gotowy adapter: identyfikuje się styki przycisku omomierzem i dołącza wyjście transoptora równolegle do przycisku. Pozwala to zachować właściwą drabinkę rezystorową oraz wtyk TRRS bez zgadywania wartości. Telefon musi mieć uruchomioną aplikację, która interpretuje dany przycisk jako migawkę.
W logu warto przechowywać:
shutter_request_time, shutter_pulse_start, shutter_pulse_end,
sample_sequence, attitude_snapshot, camera_ack_optional
Opcjonalne potwierdzenie może pochodzić ze styku busy/flash albo komputera payloadu. Bez niego system zna tylko czas naciśnięcia, nie czas ekspozycji.
Odzysk układu a użycie całej płyty#
Wylutowanie 40-pinowego CPU nie zawsze jest najlepszą drogą. Sprawna płyta daje znane połączenia zegara, resetu i pamięci, a nieumiejętne grzanie może przegrzać układ lub zerwać metalizację otworu. Najpierw wykonuje się test w oryginalnym urządzeniu: monitor pamięci, timery, porty i kilkugodzinne obciążenie.
Jeżeli CPU ma trafić do nowej płyty, karta części powinna zawierać:
- pełne oznaczenie i zdjęcie przed demontażem;
- źródłową płytę oraz jej rewizję;
- metodę i temperaturę demontażu;
- wynik oględzin pinów i testu ciągłości;
- pobór prądu przy kilku częstotliwościach;
- test każdej linii adresowej i danych;
- wynik IRQ, NMI, RESET i RDY;
- numer egzemplarza użyty w BOM-ie stanowiska.
W65C02S nie jest elektrycznie identyczny z każdym historycznym NMOS 6502 mimo zgodności rodziny. Przed zamianą trzeba porównać pinout, zegary wyjściowe, wejście RDY, poziomy i wymagania peryferiów. Współczesny CMOS może pracować szybciej, ale stary VIA lub pamięć pozostaje ograniczeniem całego systemu.
W przypadku C64 i Atari należy także ocenić wartość kolekcjonerską. Do HIL nie potrzeba ingerować w płytę: buforowany interfejs cartridge/user port/SIO jest odwracalny. Sprawny egzemplarz warto zachować, a eksperyment latający oprzeć na nowej płytce lub uszkodzonym dawcy z udokumentowanym zakresem naprawy.
Mapa błędów charakterystycznych dla 6502#
Mały stos strony $0100 oznacza, że głębokie wywołania, duża liczba przerwań i automatyczne zmienne kompilatora trzeba obserwować w pliku mapy. Przepełnienie stosu może uszkodzić dane bez natychmiastowego resetu. Test ustawia strażniki na granicach i po długim HIL sprawdza najniższy użyty adres.
Zero page jest szybka, dlatego kompilator i ręczny asembler chętnie lokują tam wskaźniki. Konflikt między modułami daje błędy zależne od kolejności linkowania. Plik mapy pamięci powinien być artefaktem CI, a test ROM-u weryfikować oczekiwane adresy kluczowych zmiennych.
Tryb dziesiętny rejestru statusu musi mieć określoną politykę. Kod regulatora pracuje binarnie; ISR odziedziczają flagę procesora. Procedura startowa czyści decimal mode, a test przerwania sprawdza obliczenia również po sztucznym ustawieniu flagi. Podobnie każde wywołanie ROM-u w komputerze może mieć założenia inne niż samodzielny firmware.
Wreszcie operacja read-modify-write na rejestrze I/O może mieć skutki uboczne. Bezpieczniej utrzymywać kopię cienia portu w RAM, modyfikować ją i wykonywać pojedynczy zapis. Migawka nie może przypadkowo zmienić pozostałych linii user portu przez niekontrolowane AND/ORA na żywym rejestrze.
Testy, które mają wykrywać błędy#
| Test | Wstrzyknięcie | Oczekiwany wynik |
|---|---|---|
| start | reset w losowym miejscu cyklu | wszystkie wyjścia otwarte/zero |
| stara próbka | zatrzymanie numeru sekwencji | zero napędu, migawka otwarta |
| częściowa ramka | zmiana banku w trakcie odczytu | odrzucenie próbki |
| deadline | celowe wydłużenie mnożenia | licznik overrun, następnie safe state |
| nasycenie | skrajny setpoint | 0 lub 255, bez zawinięcia |
| migawka held-high | żądanie aktywne przez 1 s | dokładnie jeden impuls |
| brownout | wolny spadek zasilania | supervisor wyłącza bufory przed błędnym CPU |
| ANTIC DMA | ciężka display list | zmierzony histogram jitteru, brak ukrytej utraty ticków |
Testy hostowe w repozytorium sprawdzają logikę, ale nie timing instrukcji 6502. Ten mierzy się na emulatorze cyklowym i na prawdziwym sprzęcie, przełączając pin na początku i końcu pętli. Analizator logiczny pokazuje także, czy impuls migawki zachowuje długość podczas intensywnej telemetrii.
Co zawiera laboratorium#
Katalog git/fc-lab-commodore-atari ma przenośny rdzeń C, testy hostowe, emulator pierwszego rzędu ESC, wejściowy CSV HIL, przykładowy log i port asemblerowy z wariantami TARGET_C64, TARGET_ATARI8 oraz TARGET_VIA. Port nie jest automatycznie linkowany, ponieważ adres VIA na nowej płycie jest decyzją konstruktora, a mapy C1541 zależą od rewizji.
make test sprawdza bezpieczny start, kierunek miksera, impuls migawki i reakcję na przeterminowaną próbkę. make hil tworzy w build/esc-response.csv odpowiedź czterech napędów na komendy. Jest to punkt odniesienia przed uruchomieniem cc65 i sprzętu.
Ocena praktyczna#
Najlepszą platformą do rzeczywistego eksperymentu 6502 jest nowa płyta W65C02S+W65C22S albo sprawna płyta 1541 używana bez mechaniki. C64 i Atari są znakomite jako wizualne stanowiska HIL, bo ujawniają wpływ współdzielonych zasobów i starych systemów. Umieszczanie kompletnego komputera w małym UAV jest zwykle nieuzasadnione masą, poborem energii i niezawodnością.
Wartością projektu jest jawność: każdy timer, bajt stosu, iloczyn i deadline jest widoczny. Ta dyscyplina przenosi się wprost na nowoczesny flight controller, gdzie większa moc obliczeniowa może jedynie lepiej ukryć błąd architektury.
Powiązane tematy#
- Kontroler lotu na elektronice 8-bitowej
- Flight controller na Z80
- Flight controller na 8051
- Harmonogram czasu rzeczywistego FC
- PID w kontrolerze lotu
- IMU w dronie
Przypisy#
- Western Design Center, W65C02S — 8-bit Microprocessor, opis magistrali, wektorów, resetu i timingów.
- Western Design Center, W65C22S Versatile Interface Adapter, mapa rejestrów, timery T1/T2, shift register i przerwania.
- Commodore, Commodore 64 Programmer’s Reference Guide, dokumentacja 6510, CIA, mapy pamięci i I/O.
- Atari, Atari 400/800 PAL Field Service Manual, dokumentacja sprzętowa POKEY i PIA.
- Portal Drony,
commodore.md, robocza analiza wariantów 6502/6510/8502/SALLY i wymagań peryferyjnych.
Źródła z centralnego rejestru
- Western Design Center: W65C02S 8-bit Microprocessor [datasheet producenta]
- Western Design Center: W65C22S Versatile Interface Adapter [datasheet producenta; timery, porty, shift register i przerwania]
- Commodore 64 Programmer’s Reference Guide [historyczna dokumentacja producenta; 6510, CIA, pamięć i I/O]
- Atari 400/800 PAL Field Service Manual [historyczna dokumentacja sprzętowa producenta; POKEY i PIA]
- STMicroelectronics: STM32WB BLE HID Selfie [oficjalny przykład BLE HID używający klawisza głośności do wyzwalania zdjęcia]