Stary procesor 8-bitowy może wykonywać część zadań kontrolera lotu, ale nie jest samodzielnym flight controllerem. O powodzeniu projektu decydują przede wszystkim peryferia: precyzyjny timer, interfejs IMU, generator wyjść, watchdog, pamięć i układ doprowadzający poziomy napięć. Najbardziej użyteczny rezultat daje świadome ograniczenie zakresu: stabilizacja prędkości kątowej, prosty mikser, rejestracja telemetrii oraz wyzwalanie migawki aparatu, najpierw w HIL, a dopiero później na nieuzbrojonym demonstratorze.

Co znaczy „kontroler na starej elektronice”#

Pod tą nazwą kryją się trzy różne projekty. Pierwszy wykorzystuje zachowany komputer — C64, Atari albo maszynę z Z80 — jako naziemny komputer HIL. Dane IMU są symulowane, a wyjścia trafiają do emulatora ESC. Jest to najbezpieczniejszy wariant i najlepszy sposób zbadania budżetu cykli, jitteru oraz arytmetyki stałoprzecinkowej.

Drugi wariant odzyskuje CPU i układy peryferyjne, ale buduje dla nich nową płytę: 6502 z VIA, Z80 z CTC/PIO/SIO albo MCS-51 z zewnętrzną pamięcią programu. Nie trzeba wtedy wozić całej płyty komputera, układu wideo i starego zasilacza. Projektant kontroluje mapę pamięci, reset, zegar i stan wyjść.

Trzeci wariant wykorzystuje retro CPU jako komputer nadrzędny, a mały współczesny mikrokontroler jako deterministyczny koncentrator I/O. MCU pobiera próbki z IMU, opatruje je timestampem i generuje impulsy wyjściowe; CPU 8-bitowy oblicza regulator, logikę stanu lub sekwencję eksperymentu. Nie jest to „oszustwo”: granica między procesorem aplikacyjnym a koprocesorem I/O występuje również w nowoczesnych autopilotach.

Minimalna architektura#

             +-------------------------+
IMU --SPI--->| mostek sensora / FIFO   |--- bufor próbki + timestamp ---+
             +-------------------------+                                |
                                                                        v
RC lub generator setpointu ---> [ CPU 8-bit ] ---> [ mikser ] ---> bufor wyjść
                                      |                         +--> emulator ESC
                                      |                         +--> generator PWM
                                      +--> UART/SIO ---> log     +--> opto: migawka
                                      |
watchdog <------------------------ heartbeat

CPU nie powinien bit-bangować wszystkiego jednocześnie. Gdy ta sama pętla programowa odczytuje sensor, generuje cztery impulsy PWM, nadaje UART i liczy regulator, opóźnienie jednej gałęzi zmienia czas pozostałych. Timer albo zewnętrzny generator wyjść oddziela czas obliczeń od czasu sygnału.

Które rodziny mają sens#

Rodzina Typowy punkt wyjścia Przydatne peryferia Główne ograniczenie Sensowna rola
MCS-51 / 8051 8051, 8031, 8751, AT89S52 timery, UART, porty GPIO mało RAM, wolne mnożenie, różne cykle rdzeni minimalna pętla rate, koncentrator I/O
MOS 6502/6510/8502 goły 6502, C64/C128, płyta 1541 6522 VIA lub 6526 CIA brak natywnego SPI/ADC, mały stos HIL, regulator Q8, sekwencer eksperymentu
Atari 6502C/SALLY Atari 400/800/XL/XE POKEY, 6520 PIA DMA ANTIC wprowadza jitter HIL albo płyta bez toru wideo
Z80 płyta SBC lub odzyskany CPU Z80 CTC, PIO, SIO, opcjonalnie DMA zewnętrzne peryferia i większa liczba układów najbardziej kompletna architektura retro
AVR 8-bit ATmega328P i podobne timery, ADC, SPI, I²C, UART ograniczona pamięć i wydajność prosty, współczesny punkt odniesienia

Porównywanie samych częstotliwości zegara jest mylące. Klasyczny 8051 potrzebuje wielu taktów na cykl maszynowy, 6502 wykonuje wiele prostych instrukcji w małej liczbie cykli, a Z80 ma bogatszy zestaw instrukcji i osobną przestrzeń I/O. Liczy się zmierzony najgorszy czas całej iteracji, nie wartość MHz z obudowy.

Co musi znaleźć się poza CPU#

Zegar próbki#

Pętla musi zostać wywołana przez timer o znanym okresie. Przerwanie powinno tylko zwiększyć licznik czasu, przełączyć bufor i ustawić flagę pracy. Odczyt sensora i regulator w długiej ISR utrudniają określenie maksymalnego opóźnienia i blokują pilniejsze zdarzenia.

Każda próbka potrzebuje czasu pozyskania. Czas odebrania ostatniego bajtu przez CPU nie jest tym samym co chwila pomiaru MEMS. Jeżeli mostek sensora zbiera dane wcześniej, przesyłany rekord powinien zawierać licznik próbki oraz timestamp mostka.

Interfejs IMU#

Historyczne komputery nie mają SPI w dzisiejszym znaczeniu. Możliwe są trzy podejścia:

  1. programowe SPI na PIO/VIA — dobre przy niskiej częstotliwości i do pierwszych testów;
  2. rejestr przesuwny albo specjalizowany kontroler szeregowy — odciąża CPU, ale wymaga własnej logiki;
  3. współczesny mostek MCU — pobiera burst z IMU, sprawdza status, skaluje dane i wystawia stabilny rejestr lub ramkę szeregową.

Mostek nie powinien ukrywać błędów. Do próbki warto dołączyć bity data_ready, overrun, crc_ok, numer sekwencyjny i wiek danych. CPU może wtedy bezpiecznie wyzerować wyjścia, zamiast regulować na starej wartości.

Wyjścia i watchdog#

Cztery kanały napędu nie mogą zależeć od tego, czy główna pętla zdąży wykonać kolejną instrukcję. W laboratorium rolę odbiornika pełni emulator ESC. W sprzęcie generator impulsów powinien mieć bufor wartości i niezależny timeout: po braku odświeżenia przechodzi do zera.

Watchdog musi kontrolować nie tylko to, czy CPU „żyje”, lecz czy ukończył całą poprawną iterację. Heartbeat wystawiony na początku pętli nie wykryje zawieszenia podczas odczytu sensora. Należy go odświeżać po sprawdzeniu próbki, obliczeniu regulatora i zatwierdzeniu wyjść.

Arytmetyka stałoprzecinkowa#

Na 8-bitowym CPU mnożenie zmiennoprzecinkowe może zająć nieproporcjonalnie dużo czasu. W laboratoriach portalu sygnały są kodowane jako liczby całkowite:

  • prędkość kątowa: dziesiąte części stopnia na sekundę;
  • współczynnik regulatora: Q8, czyli wartość rzeczywista pomnożona przez 256;
  • wyjście: 0…255;
  • suma pośrednia: co najmniej 16 bitów, a iloczyn 32 bity.
error = demand_tenth_dps - rate_tenth_dps
correction = (error * kp_q8) / 256
motor = saturate(collective_q8 + signs * correction, 0, 255)

Najpierw należy wyznaczyć maksymalne wartości każdego składnika. Iloczyn dwóch int16_t powinien zostać jawnie rozszerzony do int32_t, zanim nastąpi mnożenie. Saturacja jest częścią algorytmu, nie kosmetyką: zawinięcie 260 do 4 odwraca sens komendy.

Minimalny zakres funkcjonalny#

Pierwszy etap nie powinien od razu estymować pełnej orientacji. Wystarczy:

  • okresowy odczyt trzech osi żyroskopu;
  • sprawdzenie wieku i kompletności próbki;
  • regulator proporcjonalny prędkości kątowej;
  • mikser quad-X lub dwa wyjścia stanowiska jednoosiowego;
  • nasycenie i stan bezpieczny;
  • telemetria czasu pętli oraz wyjść;
  • kontrolowany impuls migawki aparatu.

Akcelerometr, filtr komplementarny i całka regulatora dochodzą dopiero po zmierzeniu bazowego jitteru. W przeciwnym razie strojenie kompensuje błędy czasu i nasycenia zamiast dynamiki obiektu.

Migawka aparatu jak w selfie sticku#

Przewodowy selfie stick jest elektrycznie przyciskiem zestawu słuchawkowego. Telefon rozpoznaje zmianę na torze mikrofonowym, a aplikacja aparatu może przypisać przycisk głośności do wykonania zdjęcia. Bezprzewodowy wariant zwykle przedstawia się jako urządzenie HID i wysyła zdarzenie klawisza; oficjalny przykład ST dla STM32WB używa BLE HID oraz kodu volume down.

Firmware flight controllera nie powinien znać rezystancji konkretnego telefonu. Udostępnia zdarzenie logiczne shutter_active, a adapter sprzętowy realizuje jeden z wariantów:

Aparat Adapter Co robi firmware
aparat z gniazdem remote transoptor lub PhotoMOS zwierający styki impuls 80–200 ms
telefon + przewodowy selfie stick transoptor równolegle do istniejącego przycisku naśladuje fizyczne naciśnięcie
telefon + osobny moduł BLE moduł BLE HID sterowany UART/GPIO wysyła komendę „zrób zdjęcie”
kamera sterowana USB/API osobny komputer payloadu FC wysyła zdarzenie z timestampem

Żądanie jest wykrywane na zboczu. Trzymanie bitu przez sekundę nie może tworzyć serii zdjęć, dlatego po impulsie działa blokada ponownego wyzwolenia. Po resecie, utracie świeżej próbki albo wyłączeniu trybu laboratoryjnego obwód ma pozostać otwarty. W przypadku fotografii pomiarowej do logu należy zapisać zarówno czas żądania, jak i czas potwierdzenia aparatu; sam impuls nie dowodzi, że ekspozycja rzeczywiście powstała.

Budżet czasu zamiast wiary#

Załóżmy pętlę 100 Hz, czyli 10 ms. Budżet może wyglądać tak:

Zadanie Budżet Warunek zaliczenia
odebranie próbki 2,0 ms kompletny rekord, bez oczekiwania bez limitu
skalowanie i filtr 1,5 ms brak przepełnienia
regulator i mikser 2,0 ms zmierzony WCET z zapasem
zapis bufora wyjść 0,5 ms atomowa zamiana bufora
telemetria 1,0 ms nigdy nie blokuje pętli
rezerwa 3,0 ms obejmuje jitter i przerwania

Średni czas 4 ms nie wystarcza, jeżeli raz na kilkaset iteracji transmisja blokuje się na 14 ms. Log powinien przechowywać minimum, maksimum, liczbę przekroczeń deadline i wiek próbki. Na komputerach z generatorem obrazu trzeba mierzyć także okresy, w których DMA wideo odbiera CPU dostęp do magistrali.

Ścieżka uruchamiania#

  1. Testy hostowe. Regulator dostaje sztuczne próbki; sprawdzane są znaki miksera, saturacja, stara próbka i migawka.
  2. HIL bez elektroniki retro. Skrypt generuje próbki i modeluje odpowiedź ESC. Powstaje referencyjny log.
  3. CPU retro jako uczestnik HIL. Komputer odbiera ramki przez UART/SIO/user port, liczy wynik i odsyła cztery wartości.
  4. Analizator logiczny. Mierzone są tick, początek/koniec pętli, wymiana bufora oraz impuls migawki.
  5. Zewnętrzny generator wyjść. CPU zapisuje komendy, ale wyjścia nadal trafiają do emulatora.
  6. Stanowisko jednoosiowe. Mały silnik bez śmigła lub bezpieczny aktuator, ograniczenie prądu i mechaniczny wyłącznik.
  7. Nieuzbrojony demonstrator. Dopiero po zamknięciu testów fault injection, watchdogów i zasilania.

Wstrzyknięcia błędów powinny obejmować utratę bajtu, powtórzenie numeru próbki, skok timestampu, maksymalną wartość sensora, reset w trakcie impulsu migawki i zawieszenie CPU. Oczekiwanym wynikiem każdego niejednoznacznego stanu jest zero napędu i otwarty obwód migawki.

Laboratoria kodu#

W katalogu git/ znajdują się równoległe demonstratory:

  • fc-lab-mcs51 — klasyczny MCS-51 i port SDCC;
  • fc-lab-commodore-atari — 6502/6510/8502/SALLY oraz VIA/CIA/PIA/POKEY;
  • fc-lab-z80 — Z80 z CTC, PIO i SIO;
  • fc-lab-stm32 — współczesna referencja STM32;
  • fc-lab-teensy — szybka platforma i.MX RT1062.

Każdy ma ten sam cel testowy, emulator ESC, scenariusz HIL, przykładowy log i moduł migawki. Różnice w kodzie pokazują koszt arytmetyki, peryferiów i portowania, zamiast ukrywać go w jednej abstrakcji.

Kwalifikacja części z odzysku#

Oznaczenie „6502”, „Z80” lub „8051” nie wystarcza do zaprojektowania płytki. Najpierw zapisuje się pełny nadruk, producenta, suffix, obudowę i kod daty. Późniejsze wersje zgodne programowo mogą mieć inną technologię wejść, dopuszczalne napięcie, pobór prądu, zachowanie nieużywanych pinów albo maksymalny zegar. Datasheet musi odpowiadać dokładnie rozpoznanej części.

Każdy układ otrzymuje kartę testu:

Pole Przykład wyniku Znaczenie
identyfikacja Z84C00xx, CMOS progi i pobór różnią się od NMOS
obudowa/piny DIP-40, dwa piny utlenione potrzebne czyszczenie i ponowny test
pobór spoczynkowy wartość przy podanym zegarze porównanie z datasheetem
reset poprawny przy szybkim zboczu, błąd przy wolnym wymagany supervisor
pamięć pełny March test bez błędów pojedynczy wzór nie wystarcza
porty/timery test wszystkich używanych kanałów niewykorzystane kanały nie są kwalifikowane
temperatura liczba resetów i dryf zegara wynik dotyczy zakresu testu
identyfikator BOM własny numer egzemplarza ślad od awarii do części

Test pamięci powinien wykrywać zwarcia między liniami adresowymi i bitami danych, a nie tylko zapisać 0x55. Stosuje się kilka wzorów, marsz po adresach i osobny test przy granicach dekodowanych bloków. EPROM z oknem kwarcowym trzeba chronić przed światłem i zweryfikować każdy bajt po wielogodzinnym wygrzewaniu.

Odzyskany oscylator lub rezonator ocenia się częstotliwościomierzem w docelowym układzie. Zegar poprawny na stole może zmieniać się z temperaturą albo mieć zbyt wolne zbocza po dołączeniu długiej ścieżki. W systemie czasu rzeczywistego dryf zegara wpływa jednocześnie na regulator, UART i pomiar wieku próbki.

Elementy mocy, stare elektrolity i złącza mają inną kategorię ryzyka niż cyfrowy CPU. Koszt nowego supervisora, regulatora i kondensatorów jest mały wobec czasu diagnozowania losowych brownoutów. Retro charakter projektu nie wymaga, aby każdy element był historyczny.

Podział odpowiedzialności w systemie dwuprocesorowym#

Jeżeli używany jest współczesny safety MCU, interfejs między procesorami musi być węższy niż cały autopilot. Dobrym kontraktem jest ramka:

seq, retro_time, setpoint_or_output[4], shutter_edge,
health_bits, computation_time, crc

Safety MCU nie przyjmuje ostatniej wartości bezterminowo. Sprawdza numer sekwencji, CRC, zakres, czas i częstotliwość. Po przekroczeniu limitu ustawia zera. Retro CPU nie może samodzielnie podnieść sprzętowego OUTPUT_ENABLE; może tylko proponować wartości.

W drugą stronę MCU przekazuje próbki IMU wraz z czasem pozyskania, nie czasem wysłania. Kolejka ma stałą maksymalną długość. Jeżeli CPU jest wolniejszy, mostek odrzuca stare próbki i jawnie ustawia OVERRUN, zamiast dostarczać coraz bardziej opóźnione dane.

Podział funkcji może być stopniowany:

Poziom Retro CPU Safety MCU
A prezentacja HIL i log pełna symulacja
B regulator P i mikser sensor I/O, timestamp, timeout wyjść
C filtr i regulator tylko pozyskanie oraz safety envelope
D logika eksperymentu pełna stabilizacja i failsafe

Poziom D jest często najbardziej praktyczny w prawdziwym nośniku: stara elektronika pozostaje funkcjonalną częścią systemu, lecz nie kontroluje bezpośrednio szybkiej stabilizacji. Można wtedy bezpiecznie badać jej timing, komunikację i odporność na reset.

Kryteria odbioru demonstratora#

Projekt powinien mieć liczby, po których można powiedzieć „zaliczony” albo „niezaliczony”. Przykładowy zestaw dla pętli 100 Hz:

  • 99,999% iteracji kończy się poniżej 7 ms, a żadna nie przekracza 10 ms w teście 24 h;
  • stara próbka jest wykrywana przed kolejną aktualizacją wyjść;
  • watchdog zewnętrzny zeruje bufor w określonym czasie po zatrzymaniu CPU;
  • każda utracona ramka zwiększa licznik, bez błędnej resynchronizacji;
  • reset w dowolnym stanie migawki daje otwarty obwód;
  • pojedyncze żądanie tworzy dokładnie jeden impuls w dopuszczalnym zakresie czasu;
  • test skrajnych wartości nie powoduje przepełnienia ani zawinięcia;
  • log zachowuje numer sekwencji umożliwiający policzenie wszystkich braków.

Wartości progów dobiera się do stanowiska. Ważniejsza od konkretnego procentu jest zasada: żadnego kryterium nie zastępuje obserwacja, że układ „działał przez chwilę”.

Kiedy retro CPU jest złym wyborem#

Nie należy wybierać go tylko dlatego, że „da się”. Brak dokumentacji konkretnego układu z odzysku, programowalnej pamięci, stabilnego oscylatora albo dostępnego kompilatora może pochłonąć więcej czasu niż projekt regulatora. Stary laminat i podstawki utleniają się, a duża liczba układów zwiększa masę oraz liczbę punktów awarii.

Retro elektronika ma największą wartość jako narzędzie edukacyjne, laboratorium deterministyczności i ćwiczenie w projektowaniu systemu z jawnym budżetem. W latającym prototypie sensowny bywa układ dwuprocesorowy: współczesny safety MCU utrzymuje twarde deadline i wyjścia, a CPU historyczny wykonuje ograniczoną, obserwowalną funkcję.

Powiązane tematy#

Przypisy#

  1. Western Design Center, W65C02S — 8-bit Microprocessor, datasheet, 2022.
  2. Western Design Center, W65C22S Versatile Interface Adapter, datasheet.
  3. Zilog, Z80 CPU User Manual.
  4. Zilog, Z80 CPU Peripherals User Manual.
  5. Commodore, Commodore 64 Programmer’s Reference Guide, historyczna dokumentacja producenta.
  6. STMicroelectronics, STM32WB BLE HID Selfie, przykład BLE HID wysyłający klawisz głośności.
  7. Android Developers, KeyEvent API reference, model zdarzeń przycisków i kod KEYCODE_CAMERA.

Źródła z centralnego rejestru

  1. Microchip AT89S52 — MCS‑51 compatible MCU [datasheet producenta]
  2. Western Design Center: W65C02S 8-bit Microprocessor [datasheet producenta]
  3. Western Design Center: W65C22S Versatile Interface Adapter [datasheet producenta; timery, porty, shift register i przerwania]
  4. Zilog: Z80 CPU User Manual [oficjalna dokumentacja CPU]
  5. Zilog: Z80 CPU Peripherals User Manual [oficjalna dokumentacja CTC, PIO, SIO i DMA]
  6. Commodore 64 Programmer’s Reference Guide [historyczna dokumentacja producenta; 6510, CIA, pamięć i I/O]
  7. Atari 400/800 PAL Field Service Manual [historyczna dokumentacja sprzętowa producenta; POKEY i PIA]
  8. STMicroelectronics: STM32WB BLE HID Selfie [oficjalny przykład BLE HID używający klawisza głośności do wyzwalania zdjęcia]
  9. Android Developers: KeyEvent API reference [oficjalna dokumentacja zdarzeń przycisków, w tym KEYCODE_CAMERA]