czwartek, 9 maja 2019

PIC32MM - Tutorial part 6 - Prosty przepis na przerwania

W PIC32MM prawie na każdym pinie możemy wyczarować funkcjonalność przerwania. Nie musimy być ograniczeni ilością przerwań  w postaci INT0, INT1 i INT2 i koniec ale zamieniamy to wyliczanie na RA0...RAx, RB0...RBx, RC0...RCx, RD0..RDx. Fajne ? no bardzo fajne. W tutorialu pokażę jak za pomocą MCC w przyjazny sposób skonfigurujemy takie przerwanie na dowolnym pinie i zobaczymy jak MCC wygeneruje nam gotowy kod do użycia od razu. Po prostu bajka. Nie znajdziecie w żadnym ekosystemie 32-bitowym tak dobrego narzędzia jak MCC .


Na wstępie przypomnę artykuł w którym pokazywałem jak manualnie skonfigurować przerwanie na wybranym pinie czyli innymi słowy przypadek w którym nie posługujemy się MCC Input Change Notification (ICN) w PIC32MM
Obecnie zajmiemy się przypadkiem "automatycznym" czyli wykorzystamy MCC do konfiguracji przerwania na wybranym pinie. Ostatnio sam byłem pod wrażeniem prostoty i efektu działania MCC w tym zakresie a potrzebowałem na szybko ustawić przerwanie na pinie współpracującym z  pewnym modułem.

No dobrze przejdźmy do konkretów. Najpierw założenie co chcemy uzyskać. Chcę aby pin RB9 reagował na zmianę sygnału z 1 na 0 czyli na opadające zbocze. Kiedy pojawi się taka zmiana sygnału niech np. zapali nam się dioda LED na pinie RD3 (tam na płytce PIC32MM Curiosity mamy LED), przy wykryciu kolejnej zmiany sygnału diodę zgasimy i tak w kółko. Obsługa diody LED będzie realizowana w przerwaniu , które wywoła się przy każdej zmianie stanu z 1 na 0 na pinie RB9. Naszym jedynym wysiłkiem w kodzie będzie tylko umieszczenie obsługi LED w funkcji przerwania. Cały kod , łącznie z funkcją przerwania wygeneruje nam MCC. Tu jeszcze wspomnę, że do pinu RB9 podpięty jest przycisk S1, który umożliwi nam w wygodny sposób symulowanie zmiany stanu z 1 na 0.

Przechodzimy do części praktycznej.

Uruchamiamy MPLABX-IDE  i tworzymy nowy projekt dla PIC32MM0256GPM064 nazwę sobie wymyślcie sami u mnie jest ona pic32mm_tutorial_part6 . Po utworzeniu projektu uruchamiamy MCC (ikonka odznaki policyjnej z napisem MCC). Konfigurujemy zegar jak na obrazku poniżej  :


Zegar systemowy FRC 8 MHz . Pamiętać aby z automatu ustawiać opcję Clock Output Configuration na OSCO pin operates as normal I/O. Opcja ta umożliwia normalne działanie pinu RA3.
Kolejnym krokiem będzie skonfigurowanie pinów RB9 jako cyfrowe wejście podciągniete do +3.3V i RD3 jako cyfrowe wyjście do sterowania diodą LED.
W tym celu uaktywniamy widok graficzny zakładką Pin Manager : Grid View i dla RB9 zapinamy kłódeczkę w wierszu input a dla RD3 zapinamy kłódeczkę w wierszu output. Efekt operacji poniżej :


Uaktywniamy widok Pin Module i dla RB9 "ptaszkujemy" WPU co spowoduje podciągnięcie wejścia RB9 do +3.3V. Efekt poniżej :


W kolejnym kroku zajmiemy się konfiguracją pinu RB9, aby reagował wywołaniem przerwania na zmianę stanu z 1 na 0 .
Najpierw musimy się zorientować w jaki sposób dokonać ustawień aby uzyskać reakcję  z 1 na 0 na naszym pinie. Tutaj posłużymy się tabelką z datasheet :

Z tabelki tej wynika , że musimy dokonać trzech ustawień na rejestrach :

  •  W rejestrze CNCONx ustawić bit CNSTYLE na 1
  •  W rejestrze CNEN1x ustawić  jakiś bit  na 1
  •  W rejestrze CNEN0x ustawić  jakiś bit  na 0
gdzie x to literka portu na którym znajduje się rozważany pin. A "jakiś bit" to zapewne opis skorelowany z rozważanym pinem. Na razie zakładam , że nie zaglądamy do rejestru w datasheet bo chcemy w ciemno posłużyć się MCC

W okienku Pin Module przełączamy się  na zakładkę Registers gdzie mamy możliwość ustawień poszczególnych bitów w rejestrach dotyczących pinów. Pierwszą grupą ustawień na jakie się natkniemy będą przerwania Interrupt Enables, musimy tutaj zaznaczyć część dotyczącą portu B mając na uwadze , że nasz pin RB9 należy do tego portu:


Przewijamy dalej w dół spis rejestrów aż natrafiamy na rejestr CNCONB a w nim dwa bity opisane CNSTYLE i ON. Wiemy z rozważań wyżej , że CNSTYLE powinien być ustawiony na 1 co oznacza opcję enable. Musimy tutaj również ustawić bit ON na enable. Efekt poniżej :


Przewijamy dalej w dół rejestry i natrafiamy na rejestr CNEN0B, z rozważań wyżej wiemy , że bit ten musimy ustawić na 0 , z opisu bitów od razu nam się rozjaśnia co to znaczy "jakiś bit" bo najbardziej pasujący dla nas to CNIE0B9 (dla pinu RB9).Ponieważ 0 reprezentuje disbale, więc nic tutaj nie zmieniamy.


Lecimy dalej w dół i zatrzymujemy się na CNEN1B. Wiemy , że tutaj musimy ustawić "jakiś bit" na 1. Z opisu bitów w rejestrze najbardziej nam pasuje CNIE1B9 (dla pinu RB9). Ustawiamy na tym bicie enable.


I to już wszystko odnośnie ustawienia rejestrów w module Pin Module

Ostatnią czynnością powinno być ustawienie Priorytetu i Subpriorytetu dla przerwania. Robimy to w okienku Interrupt Module. Ja zostawiam ustawienia takie jakie są  :




Piękne jest to , że to już wszystkie ustawienia a oczarowanie przyjdzie wtedy jak zobaczymy wygenerowane pliki. Klikamy zatem Generate w lewym górnym okienku Project Resources. Zamykamy MCC kilkając raz w ikonkę MCC.
Przełączmy się na widok Projects.
Otwieramy wygenerowany plik pin_manager.h i wyszukujemy definicji makra do toglowania na pinie RD3 (tam mamy nasz LED na płytce) , znajdujemy ją szybciorem :


Makro nazywa się IO_RB9_Toggle().  IO_RB9 jest etykietą zdefiniowaną w MCC w module Pin Module. Możemy ją tam dowolnie zmienić w/g własnego uznania. Ja powiem  szczerze nie korzystam z tych funkcji do sterowania pinami oferowanymi przez MCC tylko operuję bezpośrednio na rejestrach co jest w PIC-ach równie banalnie proste. Nie mniej dla zaczynających przygodę z PIC-ami takie bezstresowe i komfortowe podejście jakie daje MCC jest wygodne.

Wiemy zatem jak toglować pinem RD3 na którym mamy diodę LED , teraz poszukajmy funkcji przerwania reagującego na zmianę stanu z 1 na 0 na pinie RB9. Znajdujemy ją w pliku pin_manager.c na samym końcu:



Zauważmy, że mamy kompletną funkcję obsługi przerwania łącznie z zerowaniem odpowiednich flag. Pełny luksus w pakiecie i to za darmo :). Microchip nawet oznaczył miejsce gdzie wstawić kod użytkownika . My tam wstawimy tylko nasze makro toglujące na pinie RD3. Co w efekcie da nam zmianę stanu na pinie RD3 za każdym wywołaniem przerwania. Gadajcie co chcecie ale nie ma na rynku lepszego narzędzia niż MCC i lepiej generowanego kodu. Wstawmy zatem do funkcji obsługi przerwania makro do toglowania pinem RD3 :


W zasadzie to już wszystko w temacie. Teraz wystarczy tylko sprawdzić czy to działa. Ale jak zwykle zapomniałem przestawić w MCC piny programatora :)
Chodzi o to ,że standardowo w MCC wybrane są dla programatora piny  PGC1/PGD1 a płytka PIC32MM Curiosity potrzebuje do szczęścia PGC2/PGD2. Korygujemy to zatem. W tym celu uruchamiamy MCC klikając plik MyConfig.mc3, który znajdziemy w katalogu Important Files w naszym projekcie lub jedno kliknięcie w ikonkę MCC.
Po uruchomieniu MCC zastana sytuacja wygląda jak poniżej :




Skupiamy wzrok na sekcji ICD. Naszym celem jest przepięcie kłódeczek RB0 i RB1 przyporządkowanych do PGC1/PGD1 na RA0 i RA1 , które są przyporządkowane do PGC2/PGD2. Robimy to w wierszu ICD. Efekt po zmianie powinien wyglądać jak poniżej :


Od tej chwili programator będzie rozmawiał z MCU po pinach RA0 i RA1.
Klikamy Generate aby zmiany zostały dodane do plików naszego projektu.
Wyskoczy nam okienko w którym jest pokazana zmiana bieżąca i stare ustawienie w pliku projektu. Musimy tutaj przenieść ustawienia z lewego okienka do prawego, robimy to klikając wyeksponowaną niebieską strzałeczkę (przed kliknięciem w strzałeczkę) :



Po kliknięciu w strzałeczkę :


Zamykamy MCC jednym kliknięciem w ikonkę MCC , zamykamy okienko Merge [MCC] , potwierdzamy komunikat, który nam wyskoczy. Przełączamy się na widok Projects.

Kompilujemy nasz program (młoteczek) i wgrywamy na płytkę (strzałeczka w dół) . Naciskając klawisz S1 spowodujemy zapalenie i na przemian gaszenie diody LED. Może nam się nałożyć efekt drgania styków ale to jest dla nas w tym momencie nieistotne. Chcieliśmy zobaczyć czy przerwanie reaguje a tak jest.

Zauważmy, że praktycznie nie napisaliśmy ani jednej linijki kodu a uzyskaliśmy szybki dostęp do przerwania i mogliśmy go w wygodny sposób użyć.

W linkach poniżej znajduje się projekt , który wgrałem na GitHub. Sciągamy go do MPLABX-IDE za pomocą Team --> Remote --> Clone lub w konsoli Linuxa :

git clone https://github.com/PICmajster/PIC32MM_Tutorial_Part6.git


Pozdrawiam
picmajster.blog@gmail.com


Linki :

PIC32MM Curiosity Board - schemat
PIC323MM0256GPM064 - datasheet 

pic32mm_tutorial_part6 na GitHub

6 komentarzy:

  1. wrzuciłem na forum temat CLC , sprawdzałem clc1 i 2 i nadal sygnał nie może się przebić na wyjście . Przykład zawarłem na github a link do tematu https://www.microchip.com/forums/m1085634.aspx

    OdpowiedzUsuń
  2. Nie grzebałem jeszcze w CLC. Zobacz czy przykład z tego dokumentu zadziała :
    http://ww1.microchip.com/downloads/en/DeviceDoc/60001363a.pdf
    Ja bym próbował manualnie to konfigurować bez MCC, może wtedy natrafi się na przyczynę.

    OdpowiedzUsuń
  3. MCC jest dobry na początek ,ale potem i tak należy zmieniać ręcznie rejestry za pomocą makr bo szkoda czasu. Poza tym Microchip przetestowałby swoje produkty i wydał coś w postaci podręcznika aby klienci nie marnowali czasu na "zrywanie podłogi"

    OdpowiedzUsuń
  4. Witek prawda jest taka, że problemy "maluczkich" czyli np. nas hobbystów/detalistów , guzik interesują producentów pokroju Microchip czy STM. Microchip tego nawet nie ukrywa a STM udaje , że wspiera "ulicę" bo tak na prawdę gówno wspiera. Duży klient ma support na zawołanie, więc często nawet nie dociera do problemów i błędów materii z jakimi boryka się "ulica"czyli my. Taki to czł-OW-ie-C-zY los

    OdpowiedzUsuń
  5. Jest nowa wersja dla pic32mm w wersji D, wystarczy spojrzeć na fragment z CLC i porównać z wersją c że nie miało to szans działać ! http://ww1.microchip.com/downloads/en/DeviceDoc/PIC32MM0256GPM064-Family-Data-Sheet-DS60001387D.pdf

    OdpowiedzUsuń
  6. Witek spoko ja już się znieczuliłem na błędy w dokumentacji. Nawet mój mózg już pracuje w takim trybie, że jak czytam dokumentację techniczną to pierwsza myśl jaka się pojawia przy dowolnym zagadnieniu to czy przypadkiem nie robią mnie w ....uja. Nawet próbowałem zgłaszać do Microchipa takie błędy w dokumentacji ale większego odzewu nie było , więc dałem sobie spokój. Trzeba przyjąć apriori , że błędy są i zawsze będą a że coś tam poprawili to miło. Dziękuję za informację.

    OdpowiedzUsuń