Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[PIC32] [MPLAB] [C] inicjalizacja mikrokontrolera - start systemu

Mirko51 12 Paź 2011 18:05 3393 21
  • #1 12 Paź 2011 18:05
    Mirko51
    Poziom 15  

    Witam

    rozpoczynam przygodę z PIC32. Napotkałem na problem z inicjalizacją systemu (zegar, pll, wdt, etc.). Może ktoś mi wyjaśnić jaka jest idea sekcji PRAGMA? Dlaczego tak?
    Czy trzeba osobno konfigurować drzewo zegarowe dla poszczególnych peryferiów, np. GPIO?
    Jakie rejestry są przez to konfigurowane i na jakim etapie pracy CPU - fuse bity, specjalny kod generowany przez kompilator?
    Gdzie mogę znaleźć help mówiący o tym - gdzie opisano to?
    Jakie są zakresy poszczególnych pól, np. WDTPS. Gdzie znajdę plik nagłówkowy i dyrektywy preprocesora dla tej czynności? Szukałem i nic nie znalazłem ;(
    Jest to może w jakiejś książce przystępnie opisane?

    Popełniłem kilka projektów pod Cortex (Stellaris, STM32), tam to się robiło inaczej, inna filozofia temu przyświecała - wywołanie funkcji z parametrami, osobne funkcje do konfiguracji drzewa zegarowego dla peryferiów (np. dla portu B GPIO).

    Code:

    // *****************************************************************************
    // Section: Configuration bits
    // *****************************************************************************
    // Configuration Bits
    #pragma config FNOSC    = PRIPLL        // Oscillator Selection
    #pragma config FPLLIDIV = DIV_2         // PLL Input Divider (PIC32 Starter Kit: use divide by 2 only)
    #pragma config FPLLMUL  = MUL_20        // PLL Multiplier
    #pragma config FPLLODIV = DIV_1         // PLL Output Divider
    #pragma config FPBDIV   = DIV_1         // Peripheral Clock divisor
    #pragma config FWDTEN   = ON            // Watchdog Timer
    #pragma config WDTPS    = PS2048        // Watchdog Timer Postscale
    #pragma config FCKSM    = CSDCMD        // Clock Switching & Fail Safe Clock Monitor
    #pragma config OSCIOFNC = OFF           // CLKO Enable
    #pragma config POSCMOD  = HS            // Primary Oscillator
    #pragma config IESO     = OFF           // Internal/External Switch-over
    #pragma config FSOSCEN  = OFF           // Secondary Oscillator Enable
    #pragma config CP       = OFF           // Code Protect
    #pragma config BWP      = OFF           // Boot Flash Write Protect
    #pragma config PWP      = OFF           // Program Flash Write Protect
    #pragma config ICESEL   = ICS_PGx2      // ICE/ICD Comm Channel Select
    #pragma config DEBUG    = OFF           // Debugger Disabled for Starter Kit


    Troszkę ciężko się przestawić na te PIC32, biblioteka peryferyjna i dokumentacja troszkę kłopotu sprawia.
    Dziękuję za pomoc i wyczerpujące odpowiedzi.

    0 21
  • CControls
  • #2 12 Paź 2011 22:23
    94075
    Użytkownik usunął konto  
  • #3 13 Paź 2011 10:36
    Mirko51
    Poziom 15  

    albertb, to nie tak, że nie szukałem i że nie potrafię przeszukać strony producenta a tym bardziej internetu.

    Manual do biblioteki peryferyjnej (Microchip-PIC32MX-Peripheral-Library.chm) jest tragiczny i nie aktualizowany od 2008. Starsza wersja tego dokumentu (32bitPeripheralLibraryGuide.pdf) zawiera więcej informacji, ale jest nieaktualna.

    Szukałem plików nagłówkowych, źródełek, czegokolwiek, co tłumaczyłoby inicjalizację procesora przez PRAGMA. Np. tutaj:

    pic32mx\include\peripheral\
    pic32-libs\peripheral\

    Szukałem w guide do kompilatora i manualu produktu, uwierz mi nie ma tam tego, czego szukam. Jeśli jest twoim zdaniem inaczej to mnie popraw.

    Mój procesor to PIC32MX575F512H.

    0
  • CControls
  • Pomocny post
    #4 13 Paź 2011 11:46
    dondu
    Moderator Mikrokontrolery Projektowanie

    Nie musisz korzystać z PRAGMA, do definiowania bitów konfiguracyjnych. Możesz je konfigurować w MPLAB menu Configure > Configuration bits.
    Tylko musisz wyczyścić checkbox Configuration Bits set in code

    A swoją drogą, także ciężko mi było się przestawić z AVR na PIC :)

    0
  • #5 13 Paź 2011 12:02
    Mirko51
    Poziom 15  

    @dondu: wiem o takiej możliwości. Jednak wciąż nie znajduję dokumentacji producenta mówiącej o PRAGMA i o dozwolonych wartościach. Może wam się wydawać, że się czepiam, ale jestem dociekliwy i chcę wiedzieć.

    0
  • #6 13 Paź 2011 12:06
    dondu
    Moderator Mikrokontrolery Projektowanie

    Mirko51 napisał:
    Jednak wciąż nie znajduję dokumentacji producenta mówiącej o PRAGMA i o dozwolonych wartościach. Może wam się wydawać, że się czepiam, ale jestem dociekliwy i chcę wiedzieć.

    Nie, absolutnie nie uważam, że się "czepiasz". Także mi to przeszkadzało, a w szczególności to, że nie ma jednolitości nazw w PRAGMA i opcjach menu.

    Ja niestety korzystam z HI-TECH C więc u mnie wygląda to jeszcze inaczej:


    Kod: c
    Zaloguj się, aby zobaczyć kod



    A poszczególne definicje bitów, wyciągam z pliku nagłówkowego danego mikrokontrolera.

    0
  • Pomocny post
    #7 13 Paź 2011 17:48
    Jado_one
    Poziom 22  

    Witam,

    Jesli korzystasz z MPLABX, to opis wszystkich pragma config jest w...helpie :-)
    Help>c32 toolchain>C32 configuration settings....

    Tez to niedawno przerabiałem :-)))

    Sporo informacji mozna wyciagnać z forum Microchipa - tylko kwestia zadania odp. pytania.

    Jak dla mnie to wlasnie PIC32 jest przyjazniejszy dla uzytkownika niz np. STM32 (własnie rownoczesnie siędze na dwóch dev. boards na tych prockach, więc mogę sobie porównywać), no, ale to kwestia przyzwyczajen - ja zawsze na PIC'ach siedziałem.

    Konfiguracja peryferiów (niektórych) poprzez FuseBity jest moim zdaniem przyjemniejsza i bezpiecznejsza niz np. w AVR - bo jest w PIC'ach zintegrowana z programem zrodlowym. No i o ileż mniej zabawy niż z konfigurowaniem przez procedury, rejestry, itp.....

    Ciekawostka, że PIC32 migający LED'em jest szybszy (przy tej samej wartosci licznika petli (10 000 000) od STM32....i o ile szybkosc migania w PIC32 zmienia sie np. wraz z optymalizacja O0 na O1 (O2 i O3 są wylaczone dla uzytkowników niekomercyjnych), to na STM32 nie widzę żadnej róznicy w szybkości mimo zmiany z O0 na 03 lub Os - natomiast wielkośc kodu zmienia się.


    --

    Pozdrawiam

    Jado.

    0
  • #8 13 Paź 2011 22:24
    94075
    Użytkownik usunął konto  
  • #9 14 Paź 2011 10:43
    Mirko51
    Poziom 15  

    nie mam zamiaru się z tobą kłócić, ale albertb, nie wymądrzaj się i nie wyciągaj daleko idących wniosków. Zamiast tego, jak znasz odpowiedź na pytania to z łaski swojej je podaj. Nic bardziej skomplikowanego - proszę o pomoc, znasz odpowiedź - piszesz. A nie filozofujesz i prawisz wykłady. Nie po to zadaję pytanie, by pouczano mnie jak dzieciaka. Jak jesteś taki wszechwiedzący, to podziel się wiedzą, a korona ci pewnie z głowy nie spadnie.

    0
  • #10 14 Paź 2011 11:11
    94075
    Użytkownik usunął konto  
  • #11 14 Paź 2011 11:35
    Mirko51
    Poziom 15  

    @Jado_one: dzięki! znalazłem w MPLAB w help => topics => PIC32MX Config Settings.
    A w jaki sposób ta konfiguracja jest zapisywana w CPU? Na jakim etapie i gdzie się docelowo mieści? Pewnie Albertb się ucieszysz, jak napiszę, że tego też nie mogę tego znaleźć;)

    0
  • #12 14 Paź 2011 11:45
    94075
    Użytkownik usunął konto  
  • #13 14 Paź 2011 12:26
    Mirko51
    Poziom 15  

    Albert, widzę, że zaczynasz mówić ludzkim głosem;) Dzięki, ten rozdział to czego szukam.
    Przecież pisałem na samym początku, że raczkuję w PIC32. Zapytałem, bo już szukałem, racja, może nie szukałem zbyt dokładnie. Nie znalazłem więc pytam, tych co przerabiali ten temat, są specami w tej dziedzinie lub wiedzą, gdzie tego szukać.
    Nie gniewaj się Albert, po prostu szukam odpowiedzi na nurtujące mnie pytania.

    0
  • #14 14 Paź 2011 12:34
    94075
    Użytkownik usunął konto  
  • Pomocny post
    #15 14 Paź 2011 13:02
    Jado_one
    Poziom 22  

    Mirko51 napisał:
    @Jado_one: dzięki! znalazłem w MPLAB w help => topics => PIC32MX Config Settings.
    A w jaki sposób ta konfiguracja jest zapisywana w CPU? Na jakim etapie i gdzie się docelowo mieści? Pewnie Albertb się ucieszysz, jak napiszę, że tego też nie mogę tego znaleźć;)


    Zawartość bajtów zawierających w/w ustawienia jest zapisywana przez programator do odp. adresów w pamieci Flash procesora (dokladne adresy w manualu - jak kolega Albert pisał), jednoczesnie z programem jaki zapisujemy do procka. Tak , więc programisty tak naprawde już nic nie interesuje w momencie, kiedy zdefiniuje zawartość tych bitów - nie musi się bawić w oddzielne wypalanie fusebitów jak to w AVR'kach bywało.

    Dla osób programujących (flashujacych) pod linuxem za pomocą programiku 'pk2cmd' (dla PicKit2) podam taką ciekawostkę: żeby uniknąć błedu zapisu w/w fusebitów do procka, nalezy zdefiniować wszystkie 19 ustawien.
    Większośc bowiem przykładów jakie znajdujemy w sieci ustawia tylko kilka parametrów - tych kluczowych z punktu widzenia procka, pozostałę zostawiajac jako "default".... Niestety pod linuxem , ten default nie działa i trzeba zdefinować wszystko.

    --

    Pozdrawiam

    Jado

    0
  • #16 14 Paź 2011 13:06
    Mirko51
    Poziom 15  

    Jado_one, a jak wygląda sprawa programowania flash CPU przez importowanie pliku HEX (MPLAB lub oprogramowanie PicKit3 Programmer)? Miałem taki problem, że po imporcie i wgraniu program ruszał, ale jakby działał 2x wolniej. Czy trzeba fusebity oddzielnym plikiem wczytywać czy znajdują się one w pliku binarnym?

    0
  • #17 14 Paź 2011 13:26
    dondu
    Moderator Mikrokontrolery Projektowanie

    Coś kombinujesz niepotrzebnie. MPLAB załatwia wszystko za Ciebie jeżeli masz niezaznaczony checkbox o którym pisałem wcześniej i ostawione fusbity w opcjach.
    W przeciwnym wypadku, definicja w programie, a PICKIT3 wszystko zaprogramuje już prawidłowo.
    Nie bardzo rozumie Twoje dociekania w tej sprawie, bo nie mam z takim zestawem (MPLAB + PICKIT3) żadnych problemów.

    0
  • #18 14 Paź 2011 13:47
    Jado_one
    Poziom 22  

    Mirko51 napisał:
    Jado_one, a jak wygląda sprawa programowania flash CPU przez importowanie pliku HEX (MPLAB lub oprogramowanie PicKit3 Programmer)? Miałem taki problem, że po imporcie i wgraniu program ruszał, ale jakby działał 2x wolniej. Czy trzeba fusebity oddzielnym plikiem wczytywać czy znajdują się one w pliku binarnym?


    Fusebity sa w tym samym pliku *.hex co reszta programu do wgrania do procka - o tym pisałem wyżej.

    Ja osobiscie nie uzywam MPLAB'a (a wlasciwie MPLABX) - moj stary AthlonXP2000 sie na javie zarzyna, wiec wyciagnalem sobie wszystko co trzeba do MakeFile'a+GCC+ulubiony edytor+pk2cmd (pod linuxem) .

    Co do szybkosci działania: trzeba jeszcze ustawic: "Configure cache, wait states and peripheral bus clock" - może to jest przyczyną wolnego działania (o ile dobrze zrozumiałem powyzsza wypowiedz)

    0
  • #19 10 Lis 2011 21:06
    kojak1819
    Poziom 8  

    Witam
    Mam problemy z ustawieniem wewnętrznego oscylatora w PIC-u 32. Przed mainem umieszczam taki kod:
    #pragma config FNOSC = FRCPLL//włącam szybki wewnętrzny kwarc z pętlą pll
    #pragma config FPLLIDIV = DIV_2,FPLLMUL = MUL_20, FPLLODIV = DIV_1, FPBDIV = DIV_1 , FWDTEN = OFF
    #pragma ICESEL=ICS_PGx1, DEBUG=ON//włączam debugowanie
    #pragma config POSCMOD=OFF,FSOSCEN=OFF //wyłączam zewnętrzne źródła taktowania

    Po takim ustawieniu mikro kontrolera Fmax na pinie jest równa 90kHz gdy oprócz tego umieszczę w mainie:
    SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
    częstotliwość rośnie do 660kHz.

    Co robię źle?

    0
  • #20 22 Lis 2011 00:11
    Marico
    Poziom 19  

    [quote="Jado_one"]

    Mirko51 napisał:
    @Jado_one: dzięki! znalazłem w MPLAB w help => topics => PIC32MX Config Settings.


    Dla osób programujących (flashujacych) pod linuxem za pomocą programiku 'pk2cmd' (dla PicKit2) podam taką ciekawostkę: żeby uniknąć błedu zapisu w/w fusebitów do procka, nalezy zdefiniować wszystkie 19 ustawien.
    Większośc bowiem przykładów jakie znajdujemy w sieci ustawia tylko kilka parametrów - tych kluczowych z punktu widzenia procka, pozostałę zostawiajac jako "default".... Niestety pod linuxem , ten default nie działa i trzeba zdefinować wszystko.

    --

    Pozdrawiam

    Jado


    Skad wzioles te rewelacje, ze trzeba ustawiac wszyskie 19?
    moje pragmy:
    #pragma config FNOSC = FRCPLL

    #pragma config FPLLODIV = DIV_1, FPLLMUL = MUL_15, FPLLIDIV = DIV_2, FWDTEN = OFF, FCKSM = CSECME, FPBDIV = DIV_1
    #pragma config OSCIOFNC = OFF, POSCMOD = HS, FSOSCEN = OFF

    i wszystko dziala jak nalezy (linux,pickit2 i gcc 3.4.4)

    Dodano po 3 [minuty]:

    kojak1819 napisał:
    Witam
    Mam problemy z ustawieniem wewnętrznego oscylatora w PIC-u 32. Przed mainem umieszczam taki kod:
    #pragma config FNOSC = FRCPLL//włącam szybki wewnętrzny kwarc z pętlą pll
    #pragma config FPLLIDIV = DIV_2,FPLLMUL = MUL_20, FPLLODIV = DIV_1, FPBDIV = DIV_1 , FWDTEN = OFF
    #pragma ICESEL=ICS_PGx1, DEBUG=ON//włączam debugowanie
    #pragma config POSCMOD=OFF,FSOSCEN=OFF //wyłączam zewnętrzne źródła taktowania

    Po takim ustawieniu mikro kontrolera Fmax na pinie jest równa 90kHz gdy oprócz tego umieszczę w mainie:
    SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
    częstotliwość rośnie do 660kHz.

    Co robię źle?


    DLaczego uwazasz, ze cos robisz zle?
    Uzywaj
    SYSTEMConfigPerformance(tu_czestotliwosc_zegara);
    zamiast SYSTEMConfig(...)

    0
  • #21 22 Lis 2011 09:05
    Jado_one
    Poziom 22  

    Marico napisał:

    Skad wzioles te rewelacje, ze trzeba ustawiac wszyskie 19?

    Ano stąd: http://www.microchip.com/forums/m356792.aspx

    A dokładnie to: "2) The "configuration memory error" when programming can be avoided by using #pragma config in code to set all configuration words (even if setting them to the same as the default values). Alternately, one of the compiler source files can be changed to force all config words to be written."

    Jeżeli u Ciebie działa, to się ciesz - być może to kwestia konkretnej kofiguracji tools'ow. U mnie nie działało, (tzn. programator programował kod, ale wypisywał błąd zapisu bajtów konfiguracyjnych), więc musiałem poszukać rozwiązania problemu.

    0
  • #22 22 Lis 2011 10:37
    kojak1819
    Poziom 8  

    Dziękuję panowie za pomoc. Problem już rozwiązałem. Okazało się że kondensatory między Vcc a Vdd były za daleko procesora.

    0