piątek, 27 lipca 2018

PIC32MM i rejestr ANSELx - błąd Microchipa

Jeśli w PIC32MM w obudowie 48pin zapragniemy sterować cyfrowo pinami RB13,RB14,RB15 lub RA6 to możemy zderzyć się z problemem konfiguracyjnym dla tych pinów. Analizując informację z datasheet dla PIC32MM dochodzimy do wniosku, że w rejestrze ANSELx te bity nie są obsługiwane. Jedna z błędnych informacji brzmi "The ANSB<13:11> and ANSB6 bits are not available on 48, 36 or 28-pin devices.. Niestety jest to błędna informacja w części dotyczącej ANSB<13:11> i bitu nr 13, która może przysporzyć zaczynającym przygodę z PIC32MM bólu głowy. Przyjrzyjmy się zatem istocie problemu i jak sobie z nim poradzić.

W każdym PIC32 przy starcie piny oznaczone jako ANx są podpięte do modułu analogowego i ustawione jako wejścia analogowe. Taki zabieg ma na celu oszczędzanie energii. Czyli przesłanka do takiego ustawienia jest jak najbardziej celowa. O takim stanie rzeczy dowiadujemy się z zapisu w datasheet PIC32MM na stronie 114.


W przypadku kiedy chcemy użyć pinu oznaczonego ANx jako cyfrowego I/O musimy odpiąć wewnętrznie pin od sekcji analogowej. Robimy to za pomocą wpisu w rejestr ANSELx. Jeśli jest to pin na porcie B to wpisu trzeba dokonać w rejestrze ANSELB etc. Wpisując np "0" na bicie 13 rejestru ANSELB odłączamy pin RB13 od sekcji analogowej.
Tu jeszcze małe wtrącenie , skąd mamy wiedzieć które piny są oznaczone jako ANx ?? i wymagają tym samym zabiegu odłączenia sekcji analogowej jeśli chcemy je używać jako cyfrowe I/O ?? Tutaj z pomocą przychodzi tabelka z datasheet dla MCU 48 pin na stronie 8.




Przy pinie w którym mamy w opisie ANx musimy  użyć wpisu w rejestr ANSELx aby pin był cyfrowy (ustawić odpowiedni bit na "0"), zauważmy , że nie przy każdym pinie jest taki opis czyli tam gdzie nie ma, to nie ma problemu i pin jest z definicji cyfrowy, nie musimy wtedy nic wpisywać w rejestr ANSELx.

No dobra gdzie zatem mamy tutaj błąd i o co wogóle mi chodzi ???

Pierwszą błędną informację otrzymujemy z Tabelki - TABLE 10-6 na stronie 121 datasheet PIC32MM. Zerknijmy na strukturę rejestru ANSELB w tabelce i notkę pod tabelką " 2: The ANSB<13:11> and ANSB6 bits are not available on 48, 36 or 28-pin devices.

Z tabelki (obrazu rejestru ANSELB) i fragmencie tej nieszczęsnej notki pod tabelką dowiadujemy się , że bity w ANSELB skorelowane z  RB13, RB14, RB15 w PIC32MM 48 pin nie są dostępne. Czyli domniemamy , że nie musimy tutaj dokonywać wpisu w ten rejestr w przypadku chęci ustawienia pinu jako cyfrowe I/O. Utwierdzamy się w tym przekonaniu patrząc na np. plik nagłówkowy pic32mm0256gpm048.h gdzie Microchip przygotował fajną strukturę do ustawiania rejestru ANSELB.


widzimy, że struktura odwołuje się do bitów RB0...RB4 za pomocą oznaczenia ANSB0...ANSB4. Hola hola Panie Microchip a gdzie piny RB13,RB14,RB15 ???. A czemu się czepnąłem tych pinów właśnie ?? ano dlatego, że w tabelce z opisanymi pinami dla PIC32MM w obudowie 48 pin (obrazek wyżej) te piny mają oznaczenia ANx. Skoro tak to podlegają operacji na rejestrze ANSELx i nie ma zmiłuj się.

Spójrzmy jeszcze jak błąd/niedopatrzenie z ANSELB wygląda w MCC ver 3.55.1 . Może tam będzie poprawnie ?? no niestety nie, błąd został powielony/utrwalony co widać na poniższych dwóch obrazkach :


w kolumnie Analog brakuje "kwadracików" dla pinów RB13,RB14 i RB15.


Jak zatem postąpić aby prawidłowo manualnie odłączyć piny RB13,RB14,RB15 od sekcji analogowej ??? Moim zdaniem najlepiej to zrobić za pomocą ATOMOWEGO zapisu , który konkretnie dla pinów RB13,RB14,RB15 będzie wyglądał tak :

ANSELBCLR = 0xE000 ; //bity nr 13,14,15 wyzeruj (ustaw 1) Atomowo , co w hexie na 32 bitach daje wartość 0xE000

Na koniec mały trik za pomocą , którego możemy się naocznie przekonać czy pin jest w trybie wejścia analogowego czy w trybie cyfrowym. rozważmy pin RB13 :


W pliku main.c damy definicje :
#define LED1_TOG PORTB ^= (1<<_PORTB_RB13_POSITION) /*zmienia stan bitu na przeciwny*/
TRISBbits.RB13 = 0; /*set pin RB13 out*/
 a w pętli głównej :

        delayMs(500);
        LED1_TOG;
        delayMs(500);


Do pinu RB13 podłączamy diodę LED anodą i szeregowo rezystor np 470 Ohm i drugi koniec rezystora do masy, jeśli po uruchomieniu kodu dioda się zapali i nie będzie migać to znaczy, że pin nie jest odłączony od sekcji analogowej. Jeśli dioda będzie migać to pin jest w trybie cyfrowym I/O.

Powiem szczerze, że problem z błędnymi informacjami/zamieszaniem/niedopatrzeniem  dotyczącymi ANSELx w szczególności z ANSELB (bity skorelowane z pinami RB13,RB14,RB15)  i ANSELA (bit skorelowany z pinem RA6) w PIC32MM w obudowie 48 pin może skutecznie zniechęcić osobę zaczynającą poznawanie tego fajnego MCU. Mam nadzieję , że Microchip to szybko skoryguje w dokumentacji i MCC.

MPLABX-IDE ver 4.15
MCC ver 3.55.1

Pozdrawiam
picmajster.blog@gmail.com

2 komentarze:

  1. Microchip wypuszcza pełno nowości , robi wiele "anszlusy" ale dokumentacja to często kopiuj-wklej ze wcześniejszych rozwiązań

    OdpowiedzUsuń
  2. Widocznie mają za mało ludzi aby to ogarnąć, ale support techniczny mają naprawdę dobry i przyjazny dla obywatela. Szczególnie polecam forum Microchipa, na którym "grasują" inżynierowie z Microchipa. Na zadany niedawno problem otrzymałem tam rozwiązanie po sic !! kilku minutach i to wszytko miło i kulturalnie :)

    Pozdrawiam
    PICmajster

    OdpowiedzUsuń