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.