wtorek, 2 kwietnia 2019

PIC32MM - Tutorial part 4 - Input/Output utrwalamy podstawy.

W tutorialu tym utrwalimy wiedzę jak skonfigurować pin jako wejście lub wyjścia oraz jak nimi posługować się w programie. Do ćwiczeń praktycznych wykorzystam trzy przyciski znajdujące się na płytce PIC32MM Curiosity oraz diodę RGB. Do konfiguracji peryferiów wykorzystam MCC. Naszym celem będzie zapalenie składowej diody RGB w momencie trzymania wcisniętego przycisku. Każdy z trzech przycisków będzie przyporządkowany do jednej składowej diody RGB. Będzie Prosto, Intuicyjnie, Ciekawie :) . PIC32 to najprostsze do szybkiej nauki mikrokontrolery 32-bitowe. Kiedyś spotkałem się z taką opinią malkontenta ekosystemu PIC na  anty-forum e...., że to mikrokontrolery dla "emerytów" bo są zbyt proste w posługiwaniu się :) .Malkontent nie przemyślał do końca swojej wypowiedzi bo wyszło inaczej niż była jego intencja :)

Uruchamiamy MPLABX-IDE  i tworzymy nowy projekt dla PIC32MM0256GPM064. Po utworzeniu projektu uruchamiamy MCC (ikonka odznaki policyjnej z napisem MCC). Konfigurujemy zegar jak na obrazku poniżej :



Zegar systemowy FRC 8 MHz do naszych rozważań aż nadto :) Pamiętajcie 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.
Zegar mamy ustawony czas przejść do konfiguracji pinów. Zanim to jednak zrobimy musimy ze schematu płytki odczytać do jakich pinów jest przyporządkowana dioda LED RGB i trzy przyciski S1,S2,S3. Schemat płytki znajdziemy tutaj : PIC32MM Curiosity Board - schemat
W programie i konfiguracji pinów posłużymy się nazwami ze schematu jak poniżej :

RC15_RGB_BLUE
RC3_RGB_GREEN
RD1_RGB_RED

RB9_S1
RC10_S2
RC4_S3

Przełączamy sobie widoki potrzebne do konfiguracji pinów. Od góry zakładka PIN MODULE od dołu zakładka PIN Manager Grid View efekt poniżej :


A teraz zabawa . którą każde dziecko lubi czyli klikanie i zamykanie kłódeczek.
Piny dotyczące diody RGB czyli RC15,RC3 i RD1 ustawiamy jako wyjście czyli zamykamy kłódeczki dla tych pinów w wierszu output. Efekt poniżej :


Teraz konfigurujemy piny przyporządkowane do przycisków na płytce  RB9, RC10 i RC4 jako wejścia , zamykamy kłódeczki w wierszu input. Efekt jak poniżej :



Ok kłodeczki mamy z głowy teraz nasz wzrok kierujemy na okienko PIN MODULE. Tutaj zmienimy sobie etykiety pinów zgodnie z nazwami na schemacie płytki:



Tak na marginesie ważna uwaga , gdyby w kolumnie Analog dla któregoś używanego przez nas pinu byłby kwadracik to musi on być "odptaszkowany" czyli pusty. Wtedy pin jest odłączony od sekcji analogowej i jest pinem cyfrowym. Dotyczy to wejścia jak i wyjścia . Zapamiętajcie sobie bo to jest bardzo ważane.

Piny używane przez nas jako wejścia podciągamy do +Vcc , robimy to ptaszkując kwadraciki w kolumnie WPU dla pinów RB9, RC10 i RC4 efekt poniżej :



Gdybyśmy tego podciągnięcia nie zrobili wejścia by "głupiały" bo stany na nich byłyby nieustalone.
Konfigurację sprzętową na tym kończymy. Klikamy zakładkę Generate w okienku Project Resources i tworzą nam się w naszym projekcie pliki wygenerowane przez MCC plus plik main.c . Po wyjściu z MCC bedziemy w widoku Services, należy kliknąć zakładkę Projects .Tak na marginesie MCC Microchipa jest najlepszym na rynku tego typu narzędziem i bardzo przyjaznym dla użytkownika. Nasz projekt będzie wyglądał jak poniżej :


Od tego momentu możemy pisać program. Teraz krótka retrospektywa w jaki sposób możemy operować na naszych pinach. Mamy do dyspozycji metodę prostą i bardzo prostą. Zacznijmy od metody bardzo prostej. W metodzie tej posługujemy się definicjami/makrami/funkcjami , które  znajdziemy w pliku pin_manager.h


Zauważmy , że definicje/makra/funkcje są skorelowane z nazwami/etykietami pinów jakie sobie stworzyliśmy w MCC. Jeśli chcemy np. ustawić pin RC15  ,któremu przypieliśmy w MCC etykietę RC15_RGB_BLUE w stan niski to mamy do wyboru :

RC15_RGB_BLUE_SetLow() 
lub
RC15_RGB_BLUE_SetValue(0)

W przypadku kiedy chcemy odczytać stan pinu , który mamy ustawiony jako wejście np. RB9_SW1 posłużymy się poniższym zapisem :

#include <stdbool.h>

bool value ;

value = RB9_S1_GetValue()

Kurna ludzie już prościej się nie da. Proszę sobie przejrzeć plik pin_manager.h i zobaczyć jakie to wszystko jest proste.

A teraz to samo co powyżej ale w wersji Profesional :) czyli zapisy bezpośrednio do rejestrów ale nadal bardzo prosto ,tu już nie posługujemy się etykietami z MCC  :

standard
PORTCbits.RC15 = 0; //set RC15 low
lub klasycznie
PORTC &= ~(1<<15); //set RC15 low
lub atomowo
PORTCCLR = (1 << 15) //set RC15 low

To samo co powyżej ale ustawiamy stan wysoki na pinie RC15

standard
PORTCbits.RC15 = 1; //set RC15 high
lub klasycznie
PORTC |= (1<<15); //set RC15 high
lub atomowo
PORTCSET = (1 << 15) //set RC15 high

#include <stdbool.h>
bool value ; 
value = PORTBbits.RB9 ; //read the value of the RB9
Jeszcze zobaczmy jak na rejestrach ustawiamy kierunek  pinów w każdym PIC-u:

TRISCbits.RC15 = 0 // set direction RC15 Output
TRISCbits.RC15 = 1 // set direction RC15  Input

I bardzo ważne odłączenie pinu od sekcji analogowej jeśli pin jest w takiej sekcji i jeśli chcemy go używać jako we/wy cyfrowe. Pin wymagający takiego zabiegu poznamy  po tym, że w tabelce w datasheet z funkcjami danego pinu będzie opis ANx. To na wypadek jak chcemy sami konfigurować piny bez użycia MCC.

ANSELB.ANSB0 = 0 //set RB0 pin to digital
ANSELB.ANSB0 = 1 //set RB0 pin to analog

Bardzo często początkujący z PIC-ami na tym aspekcie odłączenia pinu od sekcji analogowej się gubią.

Warto też wspomnieć , że w PIC-ach mamy rejestry zatrzaskowe LATx a to m.in jest jedna z tajemnic dużej odporności PIC-ów na zakłócenia w czym biją np. AVR na głowę.

Podsumowując operacje na pinach w PIC-ach są tak proste , że aż nie przyzwoicie proste . ARM-y mogą pomarzyć o takiej prostocie działania na rejestrach. Jeśli ktoś na ARM-ie nie używa HAL to zawsze kończy się tym, że musi sam sobie upraszczać dostęp do operacji na pinach. Microchip pokazuje od samego początku klasę w przemyślanym i prostym dostępie do rejestrów w PIC-ach.

No dobrze koniec ględzenia weźmy się do roboty czyli napiszmy wreszcie program w którym użyjemy pinów ustawionych jako wyjścia i wejścia. Cały nasz program będzie wyglądał jak poniżej. Używamy konwencji "Profesional" tak aby nasze mózgi nie zwiotczały :)


Jaki jest efekt działania programu ?
W pętli głównej sprawdzane są trzy warunki. Jeśli wciśniemy przycisk S1 lub S2 lub S3 na skorelowanym pinie pojawi się stan niski (bo tak wynika ze schematu podłączenia przycisków płytki PIC32MM Curiosity). Zostanie wtedy załączona dioda LED(RGB) przyporządkowana przez nas do jednego z pinów. Dioda będzie się świecić dopóki trzymamy wciśnięty przycisk. Program wcale nie jest ambitny ale skuteczny :)

W linkach poniżej znajduje się projekt , który powiesił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_Part4.git

Brak komentarzy:

Prześlij komentarz