Programowanie mikrokontrolerów to dziś bardzo złożony proces. Dawniej mikrokontrolery programowane były jedynie językami niskiego poziomu. Architektura samego kontrolera również nie była zbyt skomplikowana a moce obliczeniowe nie powalały. To sprawiało że czynności przez nie wykonywane były dość proste a wachlarz możliwości ograniczony. Dziś aby efektywnie programować mikroprocesory potrzeba sporej wiedzy z kilku dziedzin.
Programowanie mikroprocesorów
Pierwszym etapem programowania jest oczywiście dobór odpowiedniego mikroprocesora, który chcemy oprogramować. Pomimo tego, że producenci zalewają rynek coraz szerszą gamą takich układów to często wybór ten nie jest taki prosty. Wynika to z wielu czynników. Po pierwsze musimy wiedzieć jakie funkcjonalności będzie musiał pełnić „mózg” naszego układu. Jest to bardzo ważne, gdyż procesory posiadają wiele sprzętowo wbudowanych modułów takich jak przetworniki analogowo cyfrowe, timery do odliczania czasu, szyny dedykowane do różnego rodzaju transmisji (SPI, I2C, UART, CAN, 1Wire) itd.. To sprawia, że konkretne nóżki procesora będą już zajęte do tego typu zadań i ograniczy nam to liczbę nóżek, które możemy użyć jako wykonawcze. Poza tym, bardzo często jest tak, że w różnych typach procesorów jedne sprzętowo wbudowane moduły są, a innych nie ma lub jest ich za mało, a czasem nawet potrafi się zdarzyć tak że dwie funkcjonalności, które chcieliśmy użyć w danym typie procesora obsługiwane są na tej samej nóżce i, pomimo że procesor świetnie by nam pasował, to jednak musimy z niego zrezygnować. Dodatkowo wybierając procesor musimy jeszcze wziąć pod uwagę ile posiada pamięci, z jaką częstotliwością może pracować oraz z jakim to się wiąże poborem prądu.
Gdy już uda nam się wybrać mikroprocesor, który nam pasuje, należy stworzyć schemat blokowy działania programu. Stworzyć listę zadań oraz przewidzieć wszystkie możliwe zachowania urządzenia którym będzie sterował. Tutaj bardzo ważny jest wybór priorytetów, to znaczy uwzględnienie, które układy peryferyjne mają pierwszeństwo w komunikacji z procesorem. Dzięki temu bardzo często układ może np. chronić urządzenie, które obsługuje. Ustalenie priorytetów różnym funkcjom sprawia, że w sytuacji zagrożenia procesor „odłoży na chwilę na bok” czynności, które wykonywał do tej pory, zareaguje na ważniejszy bodziec, po czym wróci do nich, gdy sytuacja ustatkuje się.
Mając już schemat ideowy programu możemy przystąpić do pisania kodu. Tutaj oczywiście jest już wielkie pole do popisu, gdyż możemy to robić na wiele sposobów. Można pisać zarówno językami niskiego, a także wysokiego poziomu albo nawet łączyć obie metody. Pozwala to optymalizować kod programu, co, w obliczu często mocno ograniczonej pamięci, jest dość istotne.
Po napisaniu kodu należy go oczywiście przetestować. Dziś platformy programistyczne wiodących producentów pozwalają na debugowanie kodu programu. Oznacza to, że możemy śledzić pracę procesora wykonującego nasz program krok po kroku. Sprawdzać ile zajmuje mu czasu wykonanie poszczególnych części programu oraz obserwować stany wszystkich rejestrów i wyprowadzeń procesora. Jest to bardzo użyteczne narzędzie, jednak nastraja pewnych trudności, gdy chcemy symulować pracę z innymi układami peryferyjnymi. Innym sposobem na przetestowanie układu jest podglądanie jego pracy oscyloskopem lub analizatorem stanów logicznych. Szczególnie to drugie narzędzie jest bardzo przydatne przy wszelkiego rodzaju transmisjach danych, gdyż dekoduje on od razu sygnał i wyświetla nam jaka wartość została wysłana lub odebrana.
Ostatnim etapem jest oczywiście wykonanie testowego urządzenia, gdyż nawet po najdokładniejszym sprawdzeniu i przetestowaniu „na sucho”, dopiero po złożeniu układu będziemy pewni ,że wszystko działa poprawnie. A to dlatego, że, pomimo najlepiej zaprogramowanego mikrokontrolera, mogą pojawić się ograniczenia bądź problemy natury stricte elektronicznej.