Do odpalenia PIC-a potrzebujemy zainstalowanego MPLAB-X IDE + kompilator XC16 oraz programatora PICkit3 (ja programator zakupiłem na allegro za 100 zł z przesyłką w firmie LISPOL). Minimalne wymagane podłączenie w oparciu o datasheet mikrokontrolera PIC24HJ128GP502. Dioda LED podłączona anodą do pinu nr 3 czyli do wyjścia RA1. Wyjście to oznaczone jest również jako AN1 czyli defaultowo przy starcie mikrokontrolera jest wejściem analogowym i musimy ten stan rzeczy zmienić przed zamruganiem w rejestrze AD1PCFGL.
Ostatecznie możemy podsumować co należy zrobić w programie aby zamrugać diodą :
1. Zainkludować stosowne pliki
2. Skonfiigurować mikrokontroler do pracy w tym :
a. wyłączyć JTAGEN (programujemy PICkit3)
b. wyłączyć Watchdog aby procek nam się nie resetował.
c. ustawić i odpalić zegar.
c. wyłączyć ADC (jeśli nie korzystamy to dezaktywujemy aby mniej energii pobierał mikrokontroler)
d. wyłączamy piny analogowe i ustawiamy je jako cyfrowe.
e. ustawiamy pin na którym mamy podłączoną anodę diody LED jako wyjście.
3. Zmieniamy w pętli stan na wyjściu cyfrowym RA1 i opóźniamy delay-em zmianę stanu.
Zamiast brzydkiego delay można by było skorzystać z Timera i stan diody LED zmieniać w przerwaniu timera ale to temat na oddzielny wpis.
Zamruganie udało się przeprowadzić bez kompletnie żadnych problemów aż sam się zdziwiłem , że tak łatwo poszło.
Programator PICkit3 nie sprawiał, żadnych problemów sterownik został automatycznie zainstalowany nie trzeba było żadnych zewnętrznych plików. Sam proces programowania przebiega bardzo czytelnie , aktualny stan programatora i co dokładnie robi w danej chwili jest opisane w komunikatach .
Pozdrawiam
picmajster.blog@gmail.com
Linki :
Datasheet PIC24HJ128GP502 : http://ww1.microchip.com/downloads/en/DeviceDoc/70293G.pdf
1 #include "xc.h" // wykrywa rodzaj procka i includuje odpowiedni plik 2 //nagłówkowy "p24HJ128GP502.h" 3 #include <stdio.h> 4 #include <stdlib.h> 5 #define FCY 40000000UL /* podajemy wartość ustawionego zegara (40 MHz), ważne 6 aby przed includowaniem <libpic30.h>, potrzebne to jest to wyliczania delay-i*/ 7 #include <libpic30.h> // biblioteka dająca dostęp do delay-i. 8 9 /* 10 * to co możemy ustawić za pomocą '#pragma' jest dostępne w pliku 11 * xc16/docs/config_index.html 12 */ 13 #pragma config JTAGEN = OFF 14 // Watchdog timer enable/disable by user software 15 #pragma config FWDTEN = OFF 16 17 //********************Start Ustawień Zegara************************ 18 /* 19 * Fcy - zegar instrukcji , Fosc - zegar rdzenia (jest zawsze dwa razy wiekszy 20 * od zegara instrukcji)) Ustawiamy zegar instrukcji na 40 Mhz z wewnętrznego 21 * oscylatora 7.37 MHz w/g wzoru Fcy=Fosc/2 gdzie Fosc=Fin x (M/(N1+N2)) 22 * gdzie M=43, N1=2, N2=2 ustawiane w rejestrach PLLFBD/PLLPOST/PLLPRE 23 */ 24 //Select Internal FRC (Fast RC Oscillator) 25 #pragma config FNOSC = FRC // FOSCSEL-->FNOSC=0b000 (Fast RC Oscillator (FRC)) 26 //Enable Clock Switching and Configure 27 #pragma config FCKSM = CSECMD //FOSC-->FCKSM=0b01 28 #pragma config OSCIOFNC = OFF //FOSC-->OSCIOFNC=1 29 30 int main(void) { 31 32 //Config PLL prescaler, PLL postscaler, PLL divisor 33 PLLFBD = 41 ; //M=43 (0 bit to 2 stąd 41 = 43 patrz w rejestrze) 34 CLKDIVbits.PLLPOST=0 ; //N1=2 , 35 CLKDIVbits.PLLPRE=0 ; //N2=2 36 /* 37 * UWAGA przerwania muszą być wyłączone podczas wywoływania poniższych 38 * dwóch funkcji __builtin_write_...brak definicji w pliku nagłówkowym 39 * to wewnętrzne funkcje kompilatora patrz help M-LAB IDE 40 * i datasheet str 140(11.6.3.1 Control Register Lock) 41 */ 42 //Initiate Clock Switch to Internal FRC with PLL (OSCCON-->NOSC = 0b001) 43 __builtin_write_OSCCONH(0x01); //tutaj argumentem jest wartość z NOSC 44 //Start clock switching 45 __builtin_write_OSCCONL(0x01); 46 47 //Wait for Clock switch to occur 48 while(OSCCONbits.COSC !=0b001); 49 50 //Wait for PLL to lock 51 while(OSCCONbits.LOCK !=1) {}; 52 //**************************Koniec ustawień zegara*********************** 53 /* 54 * wyłączamy ADC , wszystkie piny chcemy mieć cyfrowe 55 * pojedyńczo piny analogowe wyłączamy w rejestrze AD1PCFGL 56 * Po resecie procka piny oznaczone ANx są w trybie analogowych wejść. 57 */ 58 PMD1bits.AD1MD=1 ; //wyłączamy ADC 59 /* 60 * ustawiamy wszystkie piny analogowe (oznacznone ANx) jako cyfrowe 61 * do zmiany mamy piny AN0-AN5 i AN9-AN12 co daje hex na 16 bitach = 0x1E3F 62 */ 63 AD1PCFGL = 0x1E3F ; 64 65 TRISAbits.TRISA1 = 0 ; // RA1 jako wyjście 66 67 while(1) 68 { 69 PORTAbits.RA1 = 1 ; //wyjście RA1 stan wysoki 70 __delay_ms(1000) ; 71 PORTAbits.RA1 = 0 ; //wyjście RA1 stan niski 72 __delay_ms(1000) ; 73 74 //Główna Pętla Programu 75 } 76 77 return 0; 78 }
Brak komentarzy:
Prześlij komentarz