Przeskocz do treści

Lekcja 3, programujemy linijke LED

Linijka LED, kolejny program

Dzisiaj zajmiemy się programem, którego celem będzie wyświetlanie linijki LED na wyjściach PORTA. Wiesz chyba co to jest linijka LED? Chodzi o to, że co pewien okres czasu zapala się kolejna dioda podłączona do wyjścia PORTA, a gaśnie poprzednia. Cykl powtarza się, aż do dojścia do ostatniej diody i rozpoczyna powrót dokładnie w ten sam sposób.

Wstępne założenia

Ze względów omówionych później do linijki nie wykorzystałem w swoim programie wyjścia PORT,4, dlatego moja linijka skład się jedynie z czterech diod o kolorze żółtym. Program jest napisany tak by 1 na wyjściu włączała diodę. Oznacza to, że dla uzyskania tego samego efektu dioda powinna być włączona z wyjścia portu do masy. Schemat znajdziesz na końcu artykułu. Oczywiście nic nie stoi na przeszkodzie, aby umieścić diody drugą stroną. To znaczy od plusa do wejścia portu. W takim przypadku diody zapalałyby się, kiedy na wyjściu byłoby zero logiczne, a rotacja 1 z opisywanego programu wyglądałaby tak, że poruszałaby się jak gdyby jedna zgaszona dioda zamiast jednej zapalonej jak w przypadku opisywanej linijki.

Zmiany

Oczywiście Ty jeżeli masz trochę chęci możesz zmienić podany program i podłączyć diody LED pod wyjście PORTB. Będziesz miał wtedy aż 8 diod do testów. Pamiętaj tylko, że linia programatora RB7 nie może być włączona podczas działania programu. Jeżeli pozostawisz ją włączoną nic się nie stanie programatorowi, ani procesorowi. Nie będzie po prostu się zapalać ostatnia dioda z linijki. Pisałem już o tym w jednej z poprzednich części.

Czytaj dalej…

Lekcja 2, tworzymy pętle opóźniające

Koncepcja programu

W pierwszym ćwiczeniu nauczyliśmy się obsługiwać porty wejścia i wyjścia mikrokontrolera. Znamy również kilka przydatnych instrukcji asemblera pod PIC16. Dzisiaj spróbujemy napisać program, którego celem będzie mruganie diodą podłączoną załóżmy do portu RA.3 (pin 2).

Standardowo jak to bywa w programowaniu możemy to wykonać na kilka zgoła różnych sposobów, które dadzą jednak ten sam efekt. Teoretycznie moglibyśmy po prostu dodać do poprzedniego programu taką komendę:

Program ;główny program

BSF PORTA,3 ;ustaw RA.3 (RA.3 = 1)

BCF PORTA,3 ;zeruj RA.3 (RA.3 = 0)

GOTO Program ;powrót do programu głównego

Częstotliwość pracy procesora

Jak myślisz co się stanie jeżeli skompilujemy taki plik i wyślemy do mikrokontrolera? Dioda będzie mrugać, ale z tak dużą prędkością, że my z naszym niedoskonałym okiem będziemy widzieć ciągłe świecenie. Wynika to oczywiście z tego, że mikrokontroler na wykonanie jednej operacji (np. BSF, czy BCF) potrzebuje bardzo mało czasu. W przypadku pic16f84, którego używamy czas ten wynosi jak podaje katalog 200ns. Dla ścisłości te 200ns to czas pojedynczej instrukcji wykonywanej przez mikroprocesor. Składa się na niego kilka stałych czynności. Dla przykładu polecenie BSF będzie wykonywane mniej więcej  tak:

– zaadresuje pamięć

– odczyta rozkaz BSF

– zwiększy licznik programu, o którym później, 0 jeden

– wykona rozkaz, w tym przypadku ustawi dany bit

Dla nas praktycznie nie ma to większego znaczenia. Dioda mruga nam z częstotliwością zależną od użytego kwarcu i nie satysfakcjonuje nas ten stan rzeczy. Musimy obniżyć częstotliwość mrugania, czyli przedłużyć czas wyłączenia diody i jej włączenia. Zrobimy to za pomocą programowego opóźnienia. W innych językach programowania mielibyśmy pewnie gotowe procedury odmierzające czas, ale niestety w asemblerze wszystko musimy robić samodzielnie.

Czytaj dalej…

Lekcja1, piszemy pierwszy program

Czas na programowanie

Ostatnio udało nam się uruchomić programator, przetestować jego działanie i w końcu zaprogramować PIC-a. Teraz nadszedł czas na poznanie tajników działania tego złożonego tworu jakim jest mikroprocesor. Zacznijmy jednak od opisu działania podstawowych komend asemblera użytych w poprzednim programie testowy.

Architektura RISC

Należy wspomnieć, że rodzina PIC-ów, którą jak mniemam postanowiłeś się zająć posiada jedynie 35 komend w języku asembler. Znakomicie ułatwia to rozpoczęcie programowania. Nie musimy uczyć się wielu komend, których zadaniem jest wykonanie pojedynczego działania mikroprocesora. Mamy za to 35 komend, które zostały uznane za najpraktyczniejsze. Część z nich powoduje wykonanie jednej operacji, a część jest złożeniem kilku. Tak małą ilość komend zawdzięczamy architekturze RISC w jakiej został wykonany mikroprocesor. Charakteryzuje się ona właśnie zniwelowaniem ilość komend. Zostało to osiągnięte poprzez połączenie kilku podstawowych komend w jedną.

Opis programu

Teorią dotyczącą działania mikroprocesora i subtelnościami PIC-ów zajmiemy się możliwie w najbliższym czasie. Przy nauce programowania w asemblerze i tak siłą rzeczy poznamy jego działanie, a czytanie suchej niezrozumiałej teorii na pewno dla nikogo nie jest przyjemnością.

Blok konfiguracji

Nazwałem tak część programu, która musi wystąpić przy każdym tworzonym projekcie. Składa się na nią:

– Zdeklarowanie używanego mikroprocesora. Realizuje tą funkcję komenda, która jest wysyłana tylko do kompilatora. Ma to na celu zapoznanie kompilator z procesorem, który programujemy. Dzięki temu wie on niejako jakie adresy mogą wystąpić w danym programie. Oznacza to tyle, że dzięki temu kompilator wyrzuci nam błąd, kiedy odwołamy się do rejestru, który nie istnieje w programowanym mikrokontrolerze.

Czytaj dalej…

Testowanie programatora

Pierwszy program

Zakładając, że mamy już uruchomiony i przetestowany programator wraz z kablem LPT, możemy przejść do najważniejszego i krytycznego punktu naszego zapoznania z mikroprocesorami. W celu przetestowania czy wszystkie komponenty dobrze ze sobą współpracują, co oznacza dla nas możliwość nauki programowania PIC-ów, wgramy do procesora prosty program testowy, którego zadaniem będzie włączenie diod LED podłączonych do wyjść mikrokontrolera.

Sprawa wygląda na prostą, ale nie możemy pominąć kilku ważnych kroków i po prostu skompilować byle jaki plik z rozszerzeniem .asm. Zanim jednak o tym musimy zapoznać się ze środowiskiem, w którym od dzisiaj będziemy tworzyć. Ja osobiście wybrałem sobie pakiet MPLAB microchipu ze względu na cenę (całkowicie darmowy), dobrą współpracę przy tworzeniu projektów w asemblerze i możliwość zintegrowania z kompilatorem C.

 MPLAB IDE, nasze środowisko programistyczne

Czym jest MPLAB? Jest to złożone środowisko, które umożliwi nam kompilację (zamianę) kodu napisanego w miarę logicznym dla człowieka asemblerze na kod zupełnie nie logiczny w hexie, który za to jest bardzo lubiany przez mikrokontrolery. Pakiet ten zapewnia również możliwość testowania programy, debuggowania błędów itp. Aktualnie używam go jedynie do kompilacji, dlatego reszty jego możliwości jeszcze nie poznawałem 😉 .

Czas rozpocząć procedurę testowania. W tym celu ściągamy MPLAB IDE ze strony producenta. Następnie instalujemy i uruchamiamy. Po otwarciu programu i krótkich oględzinach szukamy zakładki Project i klikamy Project wizard. Wybieramy programowany mikrokontroler. W naszym przypadku jest to PIC16F84. Kolejne okno służy do wyboru zdeklarowanego kompilatora. Automatycznie powinien być włączony kompilator asemblera z pakietu MPLAB, dlatego nie powinniśmy aktualnie nic tutaj zmieniać. Jeżeli jest wybrany inny kompilator z okienka rozwijanego wybieramy Microchip MPASM Toolsuite, a trochę niżej zaznaczamy MPASM Asembler. Dalsze procedury to miejsce zapisu naszego projektu i pliki, które chcemy do niego dołączyć. Dodanie plików nagłówkowych do projektu nie jest tutaj wymagane. Kompilator sam wybierze odpowiedni plik znajdujący się w jego folderze. Musimy tylko znać jego nazwę, żeby dodać go w programie (p16f84a.inc). Podsumowując Project => Project Wizard => Dalej => wybór mikrokontrolera => wybór kompilatora (automatycznie asembler) => miejsce zapisu => pliki dodatkowe => gotowe!

Czytaj dalej…

Uruchamianie programatora

Łączenie kabla

Po tym jak złożymy już cały programator, musimy zmierzyć się z kolejnym etapem jakim jest odpowiednie połączenie dwóch wtyczek. Potrzebne nam będą dwie wtyczki w obudowie i jedno złącze do montażu na płytce. Mamy tutaj pewną dowolność. Jako złącze do montażu na płytce możemy użyć wtyku męskiego lub żeńskiego, oczywiście wtyk, który będziemy wpinać w to złącze musi być analogicznie żeńskie lub męskie. Chodzi generalnie o to, żeby jakoś to wyglądało i zapewniło komunikacje z komputerem.

Numer pinu, który znajduję się na schemacie odpowiada danemu pinowi w porcie komputera. Do komputera możemy wpiąć jedynie wtyczkę męską. Na tym złączu męskim mamy wygraberowanie małe numerki pinów. Nasze zadanie polega na podłączeniu pinu nr.2 ze schematu z pinem nr.2 w tej właśnie wtyczce męskiej, nr.3 z nr.3 itd. Piszę o tym, ponieważ numeracja pinów pomiędzy złączem na płytce, a wtykiem do niej pasującym może być niezgodna. Nie przejmujemy się tym po prostu numer 3 ma być numer 3 w kończącej (tej podłączanej do komputera) wtyczce męskiej.Wszystkie piny we wtyczce, które mają być podłączone do masy mostkujemy i przesyłamy jednym przewodem. Akurat są to kolejne piny, więc sprawa jest zdecydowanie ułatwiona.

Jak już zarobimy wszystkie wtyczki możemy wstępnie miernikiem sprawdzić przejścia między odpowiednim pinem ostatniej wtyczki, a odpowiednimi padami na płytce. Jeżeli wszystko jest gotowe przechodzimy do etapu testowania.

Czytaj dalej…