Strona 1 z 1

Porty w PIC16F i PIC18F

: niedziela 25 paź 2015, 12:00
autor: Antystatyczny
Witam,

Dzisiaj opiszę operacje na portach w układach z rodziny 16F oraz 18F bez remapowania funkcji alternatywnych.


W układach z rodziny PIC16F występują dwa rejestry kontrolujące pracę portów. Są to rejestry TRISx oraz PORTx (w miejsce iksów nalezy wstawić literkę symbolizujacą port). Rejestr TRISx służy do ustalenia kierunku pracy poszczególnych pinów portu, natomiast PORTx służy do ustalenia stanu na pinach portu podczas zapisu do niego, jak również do odczytu stanu pinów portu podczas odczytu zawartości tego rejestru.

Domyślnie w rejestrze TRISx znajdują się same jedynki, co oznacza, że wszystkie dostępne piny są skonfigurowane jako wejścia. Wpisanie zer do odpowiednich bitów tego rejestru przełącza korespondujący z bitem pin w tryb wyjściowy. Przykład:

Kod: Zaznacz cały

TRISA = 0x00;//wszystkie piny portu A są wyjściami
TRISA = 0xFF;//wszystkie piny portu A są wejściami
TRISA = 0x0F;//piny RA0, RA1, RA2 i RA3 są wejsciami, a RA4, RA5, RA6 i RA7 są wyjściami

Należy zwrócić przy tym uwagę na fakt, że w najuboższych układach z serii 16F może nie być możliwy odczyt rejestru TRISx i wtedy trzeba z góry ustalić, które z pinów będą wejściami, a które wyjściami. Przykładem takiego układu może być PIC16F505.

Rejestry PORTx służą zarówno do ustalenia stanów na pinach portu, jak i do odczytu stanów na pinach portu. Tutaj również należy zwrócić uwagę na fakt, że modyfikując ustawienie portu poprzez operację RMW (read-modify-write) dokonujemy odczytu faktycznych stanów panujących na pinach portu i jesli port będzie sterował peryferiami znacznie obciążającymi wyjścia sterowanego przez nas portu, może się okazać, że na pinach nie ustaliły się jeszcze odpowiednie poziomy, które zadaliśmy kilka us wcześniej... i odczytamy głupoty. Taka sytuacja może sie zdarzyć, gdy będziemy chcieli "machać pinem" z zawrotnymi częstotliwościami. W układach z serii 18F mamy do dyspozycji rejestr LATx, który usuwa tę niedogodność.

W przypadku rodziny 18F mamy do dyspozycji 3 rejestry:

TRISx - rejestr kierunku
PORTX - rejstr do odczytu faktycznych stanów na pinach portu
LATx - rejestr ustalający stany na pinach, gdy pracują jako wyjścia (zatrzask)

W przypadku 18F, togglując pin wyjściowy, nie jesteśmy już zmuszeni do ciągłego odczytu stanu z rejestru PORTx. Wystarczy odczytać rejestr LATx, zmodyfikować jego zawartość, a potem zapisać z powrotem do LATx. Wszelkie ewentualne stany nieustalone na pinach układu nie bedą nam przeskadzały, bo odczytujemy dane z zatrzasku, a nie bezpośrednio z pinów.

Zawartość rejestrów PORTx oraz LATx są nieustalone lub niezmienione, zależnie od źródła resetu układu, trzeba więc pamietać, by ustalić sobie od razu odpowiednią ich zawartość. To chyba na tyle...


Pozdrawiam! ;)

Re: Porty w PIC16F i PIC18F

: niedziela 11 lut 2018, 15:11
autor: Marcin
Antystatyczny pisze:W przypadku rodziny 18F mamy do dyspozycji 3 rejestry:

TRISx - rejestr kierunku
PORTX - rejstr do odczytu faktycznych stanów na pinach portu
LATx - rejestr ustalający stany na pinach, gdy pracują jako wyjścia (zatrzask)


Od siebie dodam że powyższe dotyczy się również nowszych mikrokontrolerów z serii PIC16F.

U mnie na biurku w płytce stykowej od jakiegoś czasu siedzi mikrokontroler PIC16F18326. Konfiguracja portu I/O zawarta jest w rejestrach:

• PORTx registers (reads the levels on the pins of the device)
• LATx registers (output latch)
• TRISx registers (data direction)
• ANSELx registers (analog select)
• WPUx registers (weak pull-up)
• INLVLx (input level control)
• SLRCONx registers (slew rate)
• ODCONx registers (open-drain)