PIC16 i PIC18 nie są jedną spójną generacją. Nazwa obejmuje układy od historycznych, bankowanych kontrolerów z bardzo małą pamięcią po współczesne PIC18 z dziesiątkami kilobajtów Flash, kilkoma portami szeregowymi, konfigurowalnym mapowaniem pinów i sprzętowymi blokami wykonującymi część logiki bez udziału CPU. Dlatego pytanie „czy PIC nadaje się do kontrolera lotu?” ma sens dopiero po podaniu pełnego numeru części.
Dobrze dobrany PIC18 może obsłużyć prosty regulator fixed-wing, odczyt IMU, wejście RC, kilka serw, watchdog, telemetrię i migawkę. PIC16 z odzysku częściej sprawdzi się jako moduł wykonawczy, rejestrator albo ograniczony kontroler jednego zadania. W obu przypadkach największą zaletą jest In-Circuit Serial Programming: przy zachowanych padach ICSP układ można często uruchomić bez zdejmowania z płyty dawcy.
Najpierw rozpoznaj generację#
| Oznaczenie | Typowa pamięć programu | Ocena znaleziska |
|---|---|---|
PIC16C... |
OTP lub historyczny EPROM | używany egzemplarz zwykle nie jest ponownie programowalny |
PIC16F... starszy mid-range |
Flash, bankowany RAM, 14-bitowe słowo instrukcji | użyteczny, ale zasoby i ergonomia zależą od modelu |
PIC16F1... Enhanced Mid-Range |
Flash, ulepszony rdzeń, często PPS i bogate peryferia | bardzo dobry cel odzysku dla prostych modułów |
PIC18F... |
Flash, 8-bitowa ścieżka danych, bogatszy stos i adresowanie | najlepszy wybór z klasycznych 8-bitowych PIC |
PIC18LF... |
Flash, wariant o niższym zakresie napięcia | dobry do sensorów 3,3 V po sprawdzeniu dokładnego zakresu |
Historyczny PIC16C76 jest oficjalnie opisany jako OTP. Litera C jest więc sygnałem ostrzegawczym, ale nie zastępuje datasheetu. Układ w wersji okienkowej EPROM może być kasowany UV, natomiast wariant OTP zamknięty w plastiku zachowuje program dawcy.
W rodzinie Flash końcówka oznaczenia nadal ma znaczenie. Przykładowo PIC18F26K22 ma 28 pinów, do 64 KB pamięci programu, 3896 bajtów RAM, EEPROM, dwa moduły MSSP mogące pracować jako SPI/I²C oraz kilka timerów. Warianty 40/44-pinowe tej samej linii mają więcej kanałów i wyprowadzeń. Nie wolno przenosić pinoutu między nimi.
Które modele warto zatrzymać#
PIC18F26K22 i rodzina K22#
To dobry punkt odniesienia dla klasycznego PIC18. Przy taktowaniu do 64 MHz wykonuje do 16 milionów instrukcji na sekundę, ma sprzętowy mnożnik 8 × 8, priorytety przerwań, watchdog, brown-out reset, kilka timerów i sprzętowe interfejsy szeregowe. Dla prostego regulatora istotne są dwa niezależne MSSP: jeden może czytać IMU przez SPI, drugi obsługiwać dodatkowy sensor I²C.
Ograniczeniem pozostaje niecałe 4 KB RAM-u. Nie jest to miejsce na duży EKF, rozbudowany stos komunikacyjny i długie bufory logu jednocześnie. Jest natomiast wystarczające dla filtru komplementarnego, regulatorów stałoprzecinkowych i krótkiej telemetrii.
PIC16F18855/75#
Enhanced Mid-Range PIC16F18855 jest interesujący nie dlatego, że pokonuje PIC18 surową wydajnością, lecz przez nowocześniejsze peryferia. Peripheral Pin Select pozwala mapować wybrane funkcje na dostępne piny, a Configurable Logic Cells mogą wykonać prostą logikę niezależnie od głównej pętli. Są też NCO, PWM, capture/compare, ADC, komparatory, watchdog i brown-out.
W odzyskanej płycie PPS może uratować projekt, gdy fizycznie dostępne piny nie pokrywają się z domyślnym interfejsem. Trzeba jednak odczytać zasady blokowania PPS i erratę konkretnej rewizji.
Starsze PIC16F877A, PIC16F767 i podobne#
Są dobrze udokumentowane, często występują w obudowach łatwych do lutowania i pracują przy 5 V. Ich wadą są mały RAM, bankowanie rejestrów i starsza architektura przerwań. Nadają się do laboratorium, generatora sygnałów, wejścia RC albo prostego fixed-wing, ale przeniesienie nowoczesnego stosu FC zwykle kosztuje więcej niż napisanie małego firmware od początku.
Gdzie szukać PIC-ów#
PIC16 i PIC18 występują w panelach AGD, sterownikach temperatury, ładowarkach, zasilaczach, regulatorach silników, alarmach, prostych urządzeniach medycznych i automatyce budynkowej. Na płycie często towarzyszą im:
- pięcio- lub sześciopolowe złącze ICSP;
- rezonator kwarcowy albo ceramiczny;
- zewnętrzny EEPROM 24Cxx;
- driver ULN2003/ULN2803;
- transceiver RS-485 lub LIN;
- wzmacniacz operacyjny toru prądu i napięcia;
- stabilizator 5 V.
Jeżeli MCU sterował falownikiem lub przekaźnikami sieciowymi, nie oznacza to, że jego masa jest bezpiecznie oddzielona od sieci. Pady ICSP należy śledzić na odłączonej płycie i zasilać tylko po potwierdzeniu izolacji.
ICSP: pięć sygnałów, które trzeba odnaleźć#
Typowe programowanie PIC korzysta z:
VPP/MCLR — wejście napięcia programującego i reset
VDD — napięcie odniesienia/zasilanie celu
VSS — masa
PGD/ICSPDAT — dane
PGC/ICSPCLK — zegar
Niektóre urządzenia i tryby dodają PGM albo używają alternatywnej pary ICSP. Dokładny schemat bierze się z programming specification danego modelu oraz instrukcji programatora.
Na płycie dawcy MCLR bywa połączony z kondensatorem, rezystorem pull-up i układem nadzorującym. Zbyt duża pojemność utrudnia wygenerowanie sekwencji VPP. PGC i PGD mogą sterować wyświetlaczem lub klawiaturą; obciążenie zewnętrzne może uniemożliwiać transmisję. Dlatego projekt produkcyjny często stosuje rezystory szeregowe albo zwory oddzielające aplikację od programatora.
PICkit 5 nie powinien być traktowany jak dowolny zasilacz. Trzeba jawnie ustalić, czy cel jest zasilany z programatora, czy z własnej szyny. Dwa źródła połączone bez kontroli mogą zasilać się wzajemnie.
Blokada kodu i decyzja o kasowaniu#
Code protection uniemożliwia zewnętrzny odczyt programu, ale w wielu PIC Flash pełne kasowanie pozwala później zapisać własny kod. Ochrona programu i EEPROM-u może być osobna. Próba odczytu zwracająca zera nie dowodzi uszkodzenia mikrokontrolera.
Przed kasowaniem warto zapisać:
- device ID i revision ID;
- konfigurację widoczną dla programatora;
- wynik blank check;
- status bitów ochrony;
- zdjęcia płytki i opis jej działania;
- decyzję, że oryginalny firmware nie będzie potrzebny.
Chip erase jest operacją nieodwracalną. Jeśli zachowanie urządzenia-dawcy ma wartość badawczą, lepiej pracować na drugim egzemplarzu.
Napięcie 5 V kontra sensory 3,3 V#
Wiele starszych PIC działa przy 5 V, natomiast współczesne IMU nie tolerują 5 V na wejściach. To nie jest problem rozwiązywany samą konfiguracją firmware.
Dla SPI można zastosować:
- zasilanie MCU w zakresie 3,3 V, jeśli dokładny wariant to dopuszcza przy wymaganym zegarze;
- bufor kierunkowy o odpowiednim napięciu dla SCK/MOSI/CS i osobny tor MISO;
- rezystorowy dzielnik tylko dla wolnych, jednokierunkowych linii, po sprawdzeniu pojemności i zboczy;
- sensor/moduł z własnym level shifterem, jeżeli jest on rzeczywiście zgodny z trybem SPI.
Dla I²C poziom wysoki ustalają rezystory podciągające. Dwukierunkowy translator oparty na MOSFET-ach bywa odpowiedni, lecz jego pojemność ogranicza prędkość. Należy zmierzyć czas narastania na docelowej wiązce.
Proponowana architektura PIC18#
BMI088 / ICM-42688-P
|
SPI
v
PIC18F26K22
+-----------------------------+
| Timer tick 1 kHz |
| filtr komplementarny |
| PID roll/pitch |
| capture wejść RC |
| CCP/ECCP wyjścia serw |
| ADC: bateria, prąd |
| UART: HIL i telemetria |
| WDT + BOR |
+------+-------------+--------+
| |
serwa PhotoMOS migawki
W stałopłacie pętla prędkości kątowej może pracować 500–1000 Hz, estymacja kąta 250–500 Hz, wyjścia klasycznych serw 50–333 Hz zależnie od modelu, a telemetria 10–50 Hz. Częstotliwości są wymaganiami do zmierzenia, nie gwarancją wynikającą z nazwy MCU.
Budżet czasu#
Przy 16 MIPS jedna iteracja 1 kHz ma teoretycznie 16 000 cykli instrukcyjnych. Budżet trzeba podzielić:
| Zadanie | Przykładowy limit |
|---|---|
| przerwanie tick i znaczniki czasu | 300 cykli |
| transfer SPI próbki IMU | zależny od SCK, prowadzony sprzętowo |
| skalowanie i filtracja | 2500 cykli |
| dwa regulatory | 2500 cykli |
| miksowanie i ograniczenia | 1000 cykli |
| obsługa wyjść | 700 cykli |
| zadania rozproszone | 3000 cykli |
| margines na najgorszy przypadek | co najmniej 30% |
Pomiar wykonuje się pinem profilującym ustawianym na wejściu i zerowanym na wyjściu z zadania. Oscyloskop pokazuje zarówno czas średni, jak i najdłuższy. Licznik przepełnień deadline powinien być dostępny w telemetrii.
Arytmetyka stałoprzecinkowa#
Sprzętowy mnożnik 8 × 8 w PIC18 pomaga, ale liczby float mogą nadal generować duży koszt. Dla małego regulatora można użyć formatu Q15:
typedef int16_t q15_t;
static int16_t sat16(int32_t x)
{
if (x > 32767) return 32767;
if (x < -32768) return -32768;
return (int16_t)x;
}
static q15_t q15_mul(q15_t a, q15_t b)
{
return sat16(((int32_t)a * (int32_t)b) >> 15);
}
Każda zmienna musi mieć zapisaną jednostkę i zakres. Prędkość kątowa, kąt, współczynnik filtru oraz wyjście regulatora nie mogą przypadkowo używać tej samej skali tylko dlatego, że wszystkie mają typ int16_t.
SPI do IMU#
Odczyt zaczyna się od rejestru identyfikacyjnego sensora. Kolejne etapy to:
- reset sensora i odczekanie czasu z datasheetu;
- konfiguracja zakresu żyroskopu i akcelerometru;
- ustawienie filtru oraz ODR;
- odczyt burst pełnej próbki;
- sprawdzenie statusu data-ready;
- timestamp w chwili przerwania, nie po przetworzeniu;
- licznik brakujących i powtórzonych próbek;
- reakcja na błędny identyfikator po restarcie magistrali.
Bit-banging SPI może uruchomić demonstrator, ale w pętli lotu marnuje deterministyczny czas CPU. Sprzętowy MSSP jest lepszym wyborem. Jeśli układ ma dwa MSSP, drugi można przeznaczyć na barometr lub pamięć.
Generowanie wyjść#
Najbezpieczniej, gdy timer sprzętowy kończy impuls niezależnie od opóźnienia głównej pętli. Klasyczne serwo interpretuje szerokość impulsu, zwykle w pobliżu 1–2 ms, ale rzeczywisty zakres i częstotliwość trzeba wziąć z dokumentacji konkretnego serwa.
Jeżeli liczba kanałów CCP jest za mała, jeden timer może prowadzić uporządkowaną kolejkę zboczy:
t=0 wszystkie kanały HIGH
t=pulse1 servo1 LOW
t=pulse2 servo2 LOW
t=pulse3 servo3 LOW
t=pulse4 servo4 LOW
t=frame nowa ramka
Wartości szerokości kopiuje się do bufora cienia na granicy ramki. Dzięki temu zmiana komendy w połowie sekwencji nie tworzy skróconego impulsu.
Wejście RC#
Osobne kanały PWM można mierzyć capture, a sygnał sumaryczny PPM pojedynczym wejściem przerwania i timerem swobodnie biegnącym. Protokół cyfrowy wymaga UART-u oraz odwrócenia poziomu dla niektórych standardów. Failsafe nie może polegać tylko na tym, że ostatnia poprawna wartość pozostaje w RAM-ie.
Każda ramka dostaje timestamp. Po przekroczeniu limitu wieku odbiornik przechodzi do stanu RC_LOST, a wyjścia przyjmują zaprojektowane wartości. Powrót wymaga kilku kolejnych poprawnych ramek, aby pojedynczy przypadkowy pakiet nie uzbroił sterowania.
Watchdog, brown-out i stany pinów#
Configuration Words określają m.in. źródło zegara, watchdog, brown-out, funkcję MCLR i ochronę pamięci. Są częścią produktu, nie ustawieniem pomocniczym IDE. Wersję tych bitów zapisuje się razem z kodem.
Po resecie piny są wejściami lub funkcjami analogowymi zależnie od modelu. Zewnętrzne rezystory muszą wymusić bezpieczny stan serw, driverów i migawki zanim firmware skonfiguruje porty. Watchdog jest odświeżany w jednym miejscu dopiero po potwierdzeniu, że wszystkie krytyczne zadania wykonały się w bieżącym oknie.
Wyzwalanie migawki#
Wyjście aparatu nie powinno być bezpośrednio łączone z nieznanym elektrycznie złączem remote. Najbardziej uniwersalny jest PhotoMOS lub transoptor dobrany do wymaganej rezystancji w stanie włączenia. PIC steruje LED elementu izolującego przez rezystor.
Maszyna stanów:
IDLE -> warunek zdjęcia -> PULSE_120_MS -> LOCKOUT -> IDLE
Timer kończy impuls niezależnie od głównej pętli. Warunek zdjęcia powinien być kwalifikowany czasowo, a licznik wykonanych zdjęć zapisywany w EEPROM z ograniczeniem częstotliwości zapisu.
Pamięć i logowanie#
Wbudowany EEPROM nadaje się do konfiguracji, liczników startów i kalibracji, ale nie do logowania każdej próbki IMU. Limit cykli zapisu wymaga wear leveling albo rzadszych checkpointów. Strumień diagnostyczny lepiej wysyłać UART-em do zewnętrznego rejestratora.
Przy małym RAM-ie nie należy budować wielkich kolejek. Rekord telemetryczny może mieć stałe 16–32 bajty, numer sekwencji i CRC. Jeśli nadajnik nie nadąża, stary rekord jest odrzucany, zamiast opóźniać pętlę sterowania.
Narzędzia#
Aktualną ścieżką producenta jest MPLAB X lub MPLAB for VS Code, kompilator XC8 i programator/debugger PICkit. XC8 obsługuje 8-bitowe PIC i AVR. W projekcie odzyskowym trzeba zapisać wersję device packu, ponieważ to ona wnosi definicje konkretnego mikrokontrolera.
Minimalny proces budowania powinien generować:
- plik ELF z symbolami;
- HEX do programatora;
- mapę pamięci;
- raport zajętości Flash i RAM;
- listing dla krytycznych funkcji;
- plik z Configuration Words;
- hash narzędzi i wynik testów hostowych.
Nie należy zakładać, że kod skompilowany dla podobnego PIC16F działa na innym modelu. Rejestry, banki, PPS i bity konfiguracyjne różnią się między liniami.
Test kwalifikacyjny odzyskanego PIC#
Po blink i verify należy wykonać:
- test całej RAM wzorcami, z wyłączeniem używanego stosu;
- CRC Flash po zimnym i ciepłym restarcie;
- pomiar częstotliwości wewnętrznego oscylatora przez clock-out lub timer;
- UART przez co najmniej milion bajtów;
- SPI przy docelowym SCK z kontrolowanym slave;
- wszystkie kanały ADC dla kilku napięć referencyjnych;
- każdy kanał capture/compare;
- watchdog przy zakleszczeniu głównej pętli;
- sweep napięcia dla BOR;
- reset podczas aktywnego wyjścia i obserwację glitchy.
Egzemplarz, który przechodzi test pokojowy, nadal może mieć ograniczoną rolę. Do laboratorium HIL wystarczy znacznie mniej dowodów niż do modelu latającego.
PIC16 czy PIC18#
| Kryterium | PIC16 Enhanced Mid-Range | PIC18 |
|---|---|---|
| prostota małych zadań | bardzo dobra | dobra |
| przestrzeń programu i RAM | zależna od modelu, często mniejsza | zwykle większa |
| stos i obsługa C | ulepszona w PIC16F1, nadal ograniczona | wygodniejsza |
| mnożenie | zależne od modelu | sprzętowe 8 × 8 w typowych PIC18 |
| przerwania | zwykle prostszy model | poziomy priorytetów w wielu modelach |
| moduł wykonawczy | świetny | świetny |
| samodzielny prosty FC | możliwy po starannym doborze | preferowany |
Jeżeli na tej samej płycie są PIC16F i PIC18F o znanym pinoucie, PIC18 jest zwykle lepszym kandydatem na główny regulator. PIC16 może przejąć wejścia, monitoring zasilania albo migawkę. Rozdzielenie funkcji nie może jednak tworzyć niekontrolowanej zależności: interfejs między MCU potrzebuje timeoutu, CRC i jawnych stanów awarii.
Granica rozsądku#
PIC18F26K22 jest wystarczający do edukacyjnego fixed-wing i wielu modułów pokładowych, ale nie jest zamiennikiem współczesnego autopilota z EKF, kartą SD, USB, CAN i redundancją sensorów. Celem eksperymentu jest sprawdzenie deterministycznego regulatora na małym zasobie, a nie ukrycie ograniczeń platformy.
Starszy PIC16 z 368 bajtami RAM może stabilnie mierzyć impuls, generować PWM i reagować na prosty sensor. Próba dołożenia rozbudowanego protokołu, logera oraz filtrów może doprowadzić do niejawnego przepełnienia stosu. Mapa pamięci i test najgorszego przypadku są częścią projektu.
Laboratorium fc-lab-pic16-pic18#
Katalog git/fc-lab-pic16-pic18 zawiera hostowo testowany rdzeń całkowitoliczbowy, testy jednostkowe, runner HIL, scenariusz CSV i automatyczny weryfikator. Dwa oddzielne szkielety portów dotyczą PIC18F26K22 i PIC16F18855, ponieważ ich peryferia oraz konfiguracja nie są wymienne.
make check nie wymaga MPLAB. Rzeczywisty port XC8 musi uzupełnić Configuration Words, ICSP, MSSP, CCP/ECCP lub PPS, timeouty i profilowanie. Wymagania znajdują się w target/PORTING.md.
Powiązane tematy#
- Selekcja i odzysk mikrokontrolerów
- Renesas RL78 jako kontroler lotu
- STM8 jako kontroler lotu
- Flight controller na 8051
- IMU w dronie
- PID w kontrolerze lotu
- Watchdog w kontrolerze lotu
- Serwa dla UAV
Przypisy#
- Microchip, PIC16(L)F18855/75 Data Sheet, DS40001802F — Enhanced Mid-Range, PPS, pamięć, peryferia i zabezpieczenia kodu.
- Microchip, PIC18F26K22 product documentation — parametry pamięci, taktowania, timerów, MSSP, ICSP, watchdog i BOR.
- Microchip, PIC16C76 — status historycznego układu OTP i jego peryferia.
- Microchip, MPLAB PICkit 5 In-Circuit Debugger User’s Guide — połączenie programatora, napięcie celu i debugowanie.
- Microchip, MPLAB XC8 Compiler — aktualny kompilator dla 8-bitowych PIC oraz obsługiwane narzędzia.
Źródła z centralnego rejestru
- Microchip PIC16(L)F18855/75 Data Sheet [datasheet producenta; Enhanced Mid-Range PIC16, pamięć, peryferia, PPS i zabezpieczenia Flash]
- Microchip PIC18F26K22 product documentation [oficjalna dokumentacja MCU; rdzeń PIC18, 64 KB Flash, ICSP, timery, PWM, SPI i I²C]
- Microchip PIC16C76 [oficjalna dokumentacja historycznego mikrokontrolera OTP; przykład układu nieprzydatnego do ponownego programowania]
- Microchip MPLAB PICkit 5 In-Circuit Debugger User’s Guide [instrukcja producenta; połączenia ICSP, zasilanie celu, programowanie i debugowanie]
- Microchip MPLAB XC8 Compiler [oficjalna dokumentacja kompilatora dla 8-bitowych PIC i AVR]
- STMicroelectronics AN2639: Soldering recommendations and package information [nota aplikacyjna producenta; profile cieplne, wilgoć, MSL i ryzyko uszkodzenia obudów podczas lutowania]
- STMicroelectronics: STM32WB BLE HID Selfie [oficjalny przykład BLE HID używający klawisza głośności do wyzwalania zdjęcia]