Dla zainteresowanych grzebaniem w PICach cz. 3

Nasze polecane książki, kursy, strony internetowe, fora itp. pomocne przy przyswajaniu wiedzy związanej z PIC i pisaniem programów dla nich.
Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1117
Rejestracja: czwartek 03 wrz 2015, 22:02

Dla zainteresowanych grzebaniem w PICach cz. 3

Postautor: Antystatyczny » niedziela 11 paź 2015, 14:09

Ostatnio stworzyliśmy pusty projekt, a dzisiaj napiszemy typowego "led blinka". W moim module siedzi PIC18F46K80 z podłączoną diodą LED do pinu RA0. Użyty kwarc - 4MHz

W drzewie projektu klikamy prawym klawiszem myszy na "source files" i wybieramy opcję NEW. Następnie wybieramy opcję "main.c..." Jeśli opcji nie ma jeszcze na liście, należy wybrać "other" i stamtąd, czyli z pełnej listy, wybrać main.c lub C source file. Otworzy się okno, w którym wpiszemy nazwę naszego pliku. Nie podajemy rozszerzenia pliku, zostanie ono dodane automatycznie. W naszym przypadku będzie to .c

Ok, nasz nowy plik nazywa się main.c i jest widoczny w drzewie projektu w folderze "source files". Od razu dodam do niego kod wraz z komentarzami:

Kod: Zaznacz cały

/*
 * File:   main.c
 * Author: Anty
 *
 * Created on 11 październik 2015, 13:25
 */

// xc.h dodajemy do każdego pliku, w którym odwołujemy się do rejestrów procesora.
#include <xc.h>
#include <stdint.h>
#include <stdbool.h>           
#include "config.h"          //ustawienia bitów konfiguracyjnych

#define _XTAL_FREQ 4000000UL //makro określające prędkość oscylatora - można je umieścić
                            //w ustawieniach projektu, by wszystkie pliki miały do niego
                            //swobodny dostęp. Bez tego makra nie będzie pracować
                            //__delay_ms()

int main(void)
{
    TRISA &= ~_TRISA_TRISA0_MASK;                       // RA0 jako wyjście
   
    while(true)
    {
        for(uint8_t i = 0; i < 100; i++) __delay_ms(10);// opóźnienie 1 sekunda
        LATA ^= _LATA_LA0_MASK;                         // zmień stan RA0 na przeciwny
    }
}


Jak widać kod jest banalnie prosty i chyba nie wymaga dodatkowych komentarzy. Makra typu ~_TRISA_TRISA0_MASK czy _LATA_LA0_MASK znajdują się w pliku nagłówkowym pic18f46k80.h. Dostęp do pliku można w bardzo prosty sposób uzyskać poprzez kliknięcie prawym przyciskiem myszy w interesujące nas makro. Wybieramy "Navigate", a następnie "Go to declaration/definitione". Gorąco zachęcam do zapoznania się z zawartością tego pliku (lub innego, odpowiedniego dla używanego przez nas układu". Znajdują się tam wszystkie makra i typedefy bitów i rejestrów układu. Uprzedzam, że plik jest dość spory ;)

W kodzie widać, że includuję tajemniczy plik o nazwie config.h W sumie nie ma w nim niczego tajnego, a jedynie ustawienia bitów konfigurujących nasz układ. Tak, w picach dodajemy te ustawienia do kodu programu, przez co nie musimy się bawić w ustawianie układu osobnym programem. Po prostu kompilujemy soft, a potem wgrywamy do układu... i ma działać ;)

Oto zawartość pliku config.h:

Kod: Zaznacz cały

/*
 * File:   config.h
 * Author: Anty
 *
 * Created on 11 październik 2015, 13:14
 */

#ifndef CONFIG_H
#define   CONFIG_H

#include <xc.h>

#ifdef   __cplusplus
extern "C" {
#endif

// CONFIG1L
#pragma config RETEN = OFF      // VREG Sleep Enable bit (Ultra low-power regulator is Disabled (Controlled by REGSLP bit))
#pragma config INTOSCSEL = HIGH // LF-INTOSC Low-power Enable bit (LF-INTOSC in High-power mode during Sleep)
#pragma config SOSCSEL = HIGH   // SOSC Power Selection and mode Configuration bits (High Power SOSC circuit selected)
#pragma config XINST = OFF      // Extended Instruction Set (Disabled)

// CONFIG1H
#pragma config FOSC = HS1       // Oscillator (HS oscillator (Medium power, 4 MHz - 16 MHz))
#pragma config PLLCFG = OFF      // PLL x4 Enable bit (Disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor (Disabled)
#pragma config IESO = OFF       // Internal External Oscillator Switch Over Mode (Disabled)

// CONFIG2L
#pragma config PWRTEN = OFF     // Power Up Timer (Disabled)
#pragma config BOREN = SBORDIS  // Brown Out Detect (Enabled in hardware, SBOREN disabled)
#pragma config BORV = 0         // Brown-out Reset Voltage bits (3.0V)
#pragma config BORPWR = ZPBORMV // BORMV Power level (ZPBORMV instead of BORMV is selected)

// CONFIG2H
#pragma config WDTEN = OFF      // Watchdog Timer (WDT disabled in hardware; SWDTEN bit disabled)
#pragma config WDTPS = 1048576  // Watchdog Postscaler (1:1048576)

// CONFIG3H
#pragma config CANMX = PORTB    // ECAN Mux bit (ECAN TX and RX pins are located on RB2 and RB3, respectively)
#pragma config MSSPMSK = MSK7   // MSSP address masking (7 Bit address masking mode)
#pragma config MCLRE = ON       // Master Clear Enable (MCLR Enabled, RE3 Disabled)

// CONFIG4L
#pragma config STVREN = ON      // Stack Overflow Reset (Enabled)
#pragma config BBSIZ = BB2K     // Boot Block Size (2K word Boot Block size)

// CONFIG5L
#pragma config CP0 = OFF        // Code Protect 00800-03FFF (Disabled)
#pragma config CP1 = OFF        // Code Protect 04000-07FFF (Disabled)
#pragma config CP2 = OFF        // Code Protect 08000-0BFFF (Disabled)
#pragma config CP3 = OFF        // Code Protect 0C000-0FFFF (Disabled)

// CONFIG5H
#pragma config CPB = OFF        // Code Protect Boot (Disabled)
#pragma config CPD = OFF        // Data EE Read Protect (Disabled)

// CONFIG6L
#pragma config WRT0 = OFF       // Table Write Protect 00800-03FFF (Disabled)
#pragma config WRT1 = OFF       // Table Write Protect 04000-07FFF (Disabled)
#pragma config WRT2 = OFF       // Table Write Protect 08000-0BFFF (Disabled)
#pragma config WRT3 = OFF       // Table Write Protect 0C000-0FFFF (Disabled)

// CONFIG6H
#pragma config WRTC = OFF       // Config. Write Protect (Disabled)
#pragma config WRTB = OFF       // Table Write Protect Boot (Disabled)
#pragma config WRTD = OFF       // Data EE Write Protect (Disabled)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protect 00800-03FFF (Disabled)
#pragma config EBTR1 = OFF      // Table Read Protect 04000-07FFF (Disabled)
#pragma config EBTR2 = OFF      // Table Read Protect 08000-0BFFF (Disabled)
#pragma config EBTR3 = OFF      // Table Read Protect 0C000-0FFFF (Disabled)

// CONFIG7H
#pragma config EBTRB = OFF      // Table Read Protect Boot (Disabled)



#ifdef   __cplusplus
}
#endif

#endif   /* CONFIG_H */




Trochę tego jest, ale większość opcji ma status "disabled", gdyż w naszym migaczu diodowym nie jest do niczego potrzebna. W bitach ustawiamy przede wszystkim opcje taktowania układu wraz z ustawieniami pętli PLL, domyślny stan watchdoga, czy opcje zabezpieczenia regionów pamięci flash przed odczytem. Widać również możliwość wyboru pinów, na których będą dostępne zakończenia RX i TX magistrali ECAN. Dokładny opis bitów konfiguracyjnych dostępny jest w helpie MPLab X, w oknie do edycji tychże bitów, oraz w datasheet układu.

Okno edycji bitów konfiguracyjnych jest łątwo dostępne: Z górnej belki MPLab X wybieramy RUN, a następnie SET CONFIGURATION BITS. Otwiera się okno, w którym mamy dostępne opcje bitów oraz ich opisy. Po ustawieniu wszystkiego wedle naszego widzimisię klikamy na "Generate Source Code to Output". Do osobnego okna o nazwie Output zostanie wrzucony kod z naszymi ustawieniami, który kopiujemy i wklejamy do naszego programu... i po bólu :)

Nie martwcie się, jeśli popełnicie błąd w configu. W takiej sytuacji wystarczy poprawić ustawienie i wgrać na nowo soft do procka.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Wróć do „Źródła wiedzy na temat PIC”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość