Najważniejsze rejestry służące do konfiguracji portów wejścia/wyjścia w mikrokontrolerach PIC to: TRISx - ustawia port jako wejście lub wyjście
PORTx - odczyt/zapis faktycznej wartości portu
LATx - rejestr zatrzaskowy portu (zapis ostatniej wartości portu lub odczyt zapisanej wartości)
ODCx - ustawia piny wyjściowe jako zwykłe piny lub z otwartym drenem
AD1PCFGLx - umożliwia ustawienie niektórych pinów wejścia jako analogowe lub cyfrowe (piny oznaczone ANx domyślnie są analogowe) . Piny do których trzeba zastosować ustawienia tego rejestru oznaczone są jako ANx
Konfiguracja portów jako wejścia lub wyjścia :Każdy port (port to zbiór pojedynczych pinów), posiada swój rejestr
TRISx, który odpowiada za ustawienie czy określone piny są wejściem czy wyjściem. Jeżeli do bitu powiązanego z określonym pinem jest zapisane "1" pin jest wejściem, natomiast jeżeli zapiszemy "0", port staje się wyjściem.
Port
TRISx może być również oczywiście odczytany, dostaniemy wtedy ostatnio zapisaną tam wartość.
Po włączeniu zasilania, wszystkie piny są skonfigurowane jako wejścia.
Zapis/odczyt wartości portu :Jeśli chodzi o zapis i odczyt portów wejścia/wyjścia mamy do dyspozycji dwa rejestry
PORTx oraz
LATx. Odczytując rejestr
PORTx, odczytujemy bezpośrednio wartość logiczną panującą na pinach portu, zapisując do tego rejestru zmieniamy bezpośrednio wartości pinów portu.
Zapis do rejestru
PORTx powoduje również zapis do odpowiadającego mu rejestru
LATx.
Rejestr
LATx, można odczytywać jakby był to zwykły rejestr, w którym jest duplikat ostatnio zapisanej wartości do portu, zapis do LATx powoduje zmianę stanów na pinach portu, tak samo jak zapis do rejestru
PORTx, ale odczyt z tego rejestru jest odporny na zakłócenia na liniach portu, bo nie jest fizycznie podczas tej operacji czytany port, tylko jego rejestr, to znaczy, że nie możemy odczytać napięcia panującego faktycznie na pinie, jedynie wartość jaką ostatnio zapisaliśmy.
Podsumowując: Kierunek portu/pinu ustawiamy w rejestrze
TRISx Zapis do portu możemy dokonywać przez zapis do
PORTx lub
LATx Odczyt wartości z końcówek portu dokonujemy przez odczyt
PORTx Odczyt ostatnio zapisanej wartości do portu, dokonujemy przez odczyt rejestru
LATx Jeśli chcemy uzyskać podwyższoną odporność na zakłócenia zapis i odczyt realizujmy za pomocą rejestru
LATx .
Konfiguracja portów jako cyfrowe lub analogowe :Wszystkie porty które mogą być wejściami analogowymi domyślnie nimi są, ponieważ rejestr
AD1PCFGLx, który odpowiada za to ustawienie domyślnie ma zapisaną wartość 0x0000. Jeżeli chcemy używać portów analogowych z cyfrowymi peryferiami, takimi jak Timery czy UART, musimy ustawić je jako cyfrowe przez ustawienie określonych bitów rejestru
AD1PCFGLx, dodatkowo kiedy porty są ustawione jako analogowe wejścia, próba odczytania ich wartości przez rejestr
PORTx skończy się pobraniem samych zer, tak jakby na pinach panował logiczny stan 0.
W przypadku mikrokontrolera
PIC24HJ128GP502 piny analogowe przyporządkowane są do
AN0-AN5 i
AN9-AN12. Po uruchomieniu procka piny te są ustawione jako analogowe wejścia. Aby to zmienić należy wpisać wartość hex 0x1E3F (operujemy na 16 bitach) do rejestru i wtedy mamy wszystkie piny jako cyfrowe.
Do rejestrów możemy zapisywać całe wartości portów, lub odwoływać się do indywidualnych pinów. Do dyspozycji mamy wygodne makra i struktury zdefiniowane w pliku nagłówkowym naszego mikrokontrolera . Plik znajduje się w katalogu kompilatora XC16. W przypadku Linuxa jest dostępny pod ścieżką :
/opt/microchip/xc16/v1.30/support/PIC24H/hPoniżej fragment pliku z makrami i strukturami do sterowania wyjściami i wejściami. dla mikrokontrolera
PIC24HJ128GP502:
Dyrektywy dla portów : zainkludować plik
p24HJ128GP502.h z
xc16/v1.30/support/PIC24H/h
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Z powyższych makr wynika , że w mikrokontrolerze
PIC24HJ128GP502 mamy do dyspozycji 5 x I /O (RA0 – RA4) na porcie A i 16 x I/O (RB0-RB15) na porcie B.
Poniżej układ bitów w rejestrach sterujących I/O.

Jeśli chcemy korzystać z wyjść jako cyfrowe to musimy wyłaczyć ADC w rejestrze AD1PCFGL na tych wyjściach gdzie są (nie wszystkie), patrz oznaczenia na nóżkach ANx
Przykłady :Ustawiamy kierunek czyli wejście lub wyjście za pomocą rejestru TRISx :język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to samo za pomocą zdefiniowanych struktur :język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ustawiamy stan na wyjściach za pomocą rejestru PORTx :język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to samo za pomocą zdefiniowanych struktur :język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ustawiamy stan na wyjściach za pomocą rejestru LATx :Wartość jaką wpiszemy w rejestr zatrzaskowy LATx jest przepisywana automatycznie do rejestru PORTx.język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
za pomocą zdefiniowanych struktur :język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Odczyt wartości za pomocą rejestru PORTx :język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Odczyt wartości za pomocą rejestru LATx :język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Reasumując dostęp do rejestrów I/O i operowanie na nich w PIC jest stosunkowo sympatyczne.
Przyczynia się do tego ładne opisanie rejestrów dyrektywami i strukturami.
Prezentowana w artykule specyfika rejestrów jest typowa dla PIC.
Mam nadzieję, że przybliżyłem w przystępny sposób zagadnienie portów I/O w mikrokontrolerach PIC.
Ponieważ sam PIC-ami od niedawna się zainteresowałem a przygoda ta trwa od ok 1 miesiąca

.Pozwoliłem sobie stworzyć skromnego amatorskiego bloga :
strefapic.blogspot.com w którym będę dokumentował w miarę na bieżąco odkrywany przeze mnie świat PIC-a.
Życzę miłego dnia Szanownym Kolegom .