piątek, 13 stycznia 2017

PIC24HJ128GP502 - rozpoznanie bojem (ustawienie zegara)




Przeciwnik : PIC24HJ128GP502 obudowa 28 nóżkowa DIP wąska .
Czemu ten model ?? ano ma na pokładzie dosyć bogate peryferia m.in CAN , DMA, zegar RTC i to mnie zachęciło

Dokładna specyfikacja :
http://www.microchip.com/wwwproducts/en/PIC24HJ128GP502

Żródło zakupu : ebay.com ok 6.8 USD za szt.

Wybrane uzbrojenie przeciwnika :
- architektura 16 bitowa (1 cykl na jedną instrukcję)
- CPU Speed (MIPS) 40
- pamięć programu 128 kB
- RAM 8 kB
- Peryferia : 2xUART, 2xSPI, 1xI2C, CAN, RTC (zegar czasu rzeczywistego), IrDA (encoding and decoding hardware),LIN
- DMA 8 kanałów
- 5 x Timer 16 bitowy
- 2 x Timer 32 bitowy
- 1 x Timer dla RTC

inne nie wymienione opcje.

Zasoby wojsk własnych :
- MPLAB-X IDE + MPLAB Code Configurator + kompilator XC16 pobrane ze strony producenta i zainstalowane na Linux Mint ver 17.3 Wszytko w wersji bezpłatnej, Trzeba jednak zauważyć, że kompilator w wersji bezpłatnej nie optymalizuje w pełni kodu wynikowego czego efektem jest mniej optymalny kod zajmujący więcej pamięci. Jest to jakaś wada ale mając na uwadze , że pamięci mamy sporo nie dostrzeżemy tego mankamentu w boju.
- programator PICKIT3

Pierwsze starcie :

- zdobycie i rozpoznanie planów przeciwnika w tym zapoznanie się z datasheet, dodatkowymi materiałami udostępnionymi na stronie producenta microchip.com .

Wnioski z rozpoznania : o ile datasheet w wykonaniu Atmela jest lekko strawny i przyjemny w odbiorze z wyczerpującą ilością informacji o tyle w przypadku PIC-a na pierwszy rzut oka delikatna niestrawność. PIC jednak dostarcza wyczerpujące informacje w dodatkowych materiałach i to już sprawia , że czujemy się lepiej.

- ustawienie zegara : peryferia i zegar konfigurujemy podobnie jak w ARM-ach ale w przypadku PIC zdecydowanie sympatyczniej i prościej to się dzieje , aczkolwiek w gąszczu dostępnych trybów można się na początku pogubić i jak widzę ludzie w sieci mają problem z tym zagadnieniem . Producent udostępnia wtyczkę do MPLAB-X IDE w postaci MPLAB Code Configurator, ustawiamy tutaj dowolne peryferia za pomocą klikania i pisma obrazkowego. Zdecydowanie ułatwia to początki nauki specyfiki PIC-ów ,ponieważ wtyczka wypluwa gotowe kody konfiguracyjne i stąd możemy szybko zapoznać się np. z ustawieniem dowolnego Timera w dowolnej konfiguracji i specyfiką dyrektyw.

Wszystko fajnie i nawet pięknie ale niestety wtyczka MPLAB Code Configurator była trochę wredna i nie obsugiwała mojego wypasionego mikrokontrolera. Spis obsługiwanych mikrokontrolerów przez wtyczkę jest na stronie producenta microchip.com/mcc.
W tym momencie trochę się obraziłem na microchipa ale co począć przecież nie wyrzucę z tego powodu procka do śmieci ,będzie trudniej ale pójście na łatwiznę podobno czasami nie popłaca.

Zegar skonfigurowałem na ok.40 MHz przy użyciu oscylatora wewnętrznego 7.37 MHz i PLL. Co ciekawe rdzeń procesora jest taktowany dwa razy szybciej czyli ok.80 MHz.
Najobszerniejsze i wyczerpujące informacje dotyczące ustawienia i trybów zegara uzyskałem z materiałów dodatkowych dostępnych na stronie microchipa : http://ww1.microchip.com/downloads/en/d ... 70308b.pdf
Na początku użyłem przykładowych kodów zawartych w w/w materiałach ale kompilator był uprzejmy mnie poinformować , że niektóre fragmenty kodu są już w przestarzałej konwencji i należy to zmienić więc zmieniłem .
(Uwaga w kodach od Microchipa jest błąd w zamianie N1 z N2)
Poniżej kod konfiguracyjny dla ustawienia zegara .


 
1  #include "xc.h" // wykrywa rodzaj procka i includuje odpowiedni plik nagłówkowy 
2  //plik nagłówkowy "p24HJ128GP502.h" znajduje się w katalogu kompilatora XC16 
3  #include <stdio.h>
4  #include <stdlib.h>
5  /*
6   * to co możemy ustawić za pomocą '#pragma' jest dostępne w pliku 
7   * xc16/docs/config_index.html
8   */
9   #pragma config JTAGEN = OFF
10  // Watchdog timer enable/disable by user software
11  #pragma config FWDTEN = OFF 
12  
13 //********************Start Ustawień Zegara************************
14 /* 
15  * Fcy - zegar instrukcji , Fosc - zegar rdzenia (jest zawsze dwa razy wiekszy 
16  * od zegara instrukcji)) Ustawiamy zegar instrukcji na 40 MHz z wewnętrznego 
17  * oscylatora Fin=7.37 MHz w/g wzoru Fcy=Fosc/2 gdzie Fosc=Fin x (M/(N1+N2))
18  * gdzie M=43, N2=2, N1=2 ustawiane w rejestrach PLLFBD/PLLPOST/PLLPRE
19  */
20 //Select Internal FRC (Fast RC Oscillator)
21 #pragma config FNOSC = FRC // FOSCSEL-->FNOSC=0b000 (Fast RC Oscillator (FRC))
22 //Enable Clock Switching and Configure
23 #pragma config FCKSM = CSECMD //FOSC-->FCKSM=0b01 - włącz zegar 
24 #pragma config OSCIOFNC = OFF //FOSC-->OSCIOFNC=1 - Fcy będzie na pinie OSCO
25  
26 int main(void) { 
27 
28 //Config PLL prescaler, PLL postscaler, PLL divisor
29      PLLFBD = 41 ;  //M=43 (0 bit to 2 stąd 41 = 43 patrz w rejestrze), tutaj 3.685 x 43 = 158.455MHz
30      CLKDIVbits.PLLPRE=0 ;   //N1=2 , tutaj 7.37 MHz / 2 = 3.685 MHz
31      CLKDIVbits.PLLPOST=0 ;  //N2=2 , tutaj 158.455 MHz / 2 = 79.2275 MHz (Fosc)
32  /* 
33   * UWAGA przerwania muszą być wyłączone podczas wywoływania poniższych 
34   * dwóch funkcji __builtin_write_...brak definicji w pliku nagłówkowym
35   * to wewnętrzne funkcje kompilatora patrz help M-LAB IDE
36   * i datasheet str 140(11.6.3.1 Control Register Lock)
37   */
38  //Initiate Clock Switch to Internal FRC with PLL (OSCCON-->NOSC = 0b001)
39      __builtin_write_OSCCONH(0x01); //tutaj argumentem jest wartość z NOSC
40  //Start clock switching
41      __builtin_write_OSCCONL(0x01);
42      
43  //Wait for Clock switch to occur
44      while(OSCCONbits.COSC !=0b001);
45      
46      //Wait for PLL to lock
47      while(OSCCONbits.LOCK !=1) {};
48  //**************************Koniec ustawień zegara***********************
49   /*
50    * wyłączamy ADC , wszystkie piny chcemy mieć cyfrowe
51    * pojedyńczo piny analogowe wyłączamy w rejestrze AD1PCFGL 
52    * Po resecie procka piny oznaczone ANx są w trybie analogowych wejść.
53    */
54      PMD1bits.AD1MD=1 ; //wyłączamy ADC
55      /* 
56       * ustawiamy wszystkie piny analogowe (oznacznone ANx) jako cyfrowe
57       * do zmiany mamy piny AN0-AN5 i AN9-AN12 co daje hex na 16 bitach = 0x1E3F
58       */
59      AD1PCFGL = 0x1E3F ;
60      while(1)
61      {
62  //Główna Pętla Programu
63      }
64          
65      return 0;   
66  }

Reasumując wejście w świat PIC-a było zaskakująco łatwe i przyjemne, zarówno od strony softu jak i sprzętu oraz dostępnych informacji, kuszą tutaj bogate peryferia w szczególności w wersjach 16 i 32 bitowych a dla hobbystów miłe , że to wszystko w przyjaznych obudowach DIP. Dotychczas nie wychylałem się z podwórka AVR-ów ale po pierwszym ataku na PIC24 widzę, że warto .

Źródło informacji :
http://microchip.wikidot.com/16bit:osc#top-of-page 
http://ww1.microchip.com/downloads/en/devicedoc/70308b.pdf

Brak komentarzy:

Prześlij komentarz