niedziela, 22 stycznia 2017

Pierwsze mruganie LED







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