Strona 1 z 1

Dla zainteresowanych grzebaniem w PICach cz. 3

: niedziela 11 paź 2015, 14:09
autor: Antystatyczny
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.