стартов файл на програмата - main.c

всяка програма започва със стартовия файл main.c и функцията main(). в интернета и книгите има много информация за това как да програмирате на С/С++ както за уиндоус, така и за пик процесорите. един малък пример, работещ на 16F1827/47 за светодиоди примерно може да си направите. схема не сме дали защото можете сами да се опитате да я съставите според кода който виждате. малка подсказка - разположението на пиновете можете да вземете от конфигурационния файл main.h, за да видите на кой пин какво има свързано. както и от пдф файла също можете да намерите информация за конфигурацията на процесора, важно е да прочетете файла със фюзовете fuse.h, където е описан начина на системната конфигурация на процесора и по това да се ориентирате за свързването на пиновете към другите електронни елементи. файла initcpu.c ще ви даде инфо как са настроени пиновете на портовете всеки със неговия си регистър. ако има въпроси : This email address is being protected from spambots. You need JavaScript enabled to view it.

#include <xc.h>
//#include <pic16F1827.h> //#include <pic16F1847.h>
#include "fuse.h"
#include "initcpu.h"
#include "main.h"

void main(void)
{   init_cpu();

led1 = 0; led2 = 0; led3 = 0; led4 = 0; led5 = 0;
led6 = 0; led7 = 0; led8 = 0; led9 = 0; led10 = 0;
led11 = 0; led12 = 0; led13 = 0; led14 = 0; led15 = 0;

// commands before while() will run for just once

while(1)
  {
// commands in while() loop will run for ever, until have a power :)

led1 = 1; __delay_ms(200); led1 = 0; __delay_ms(200); // change value of __delay_ms() will fast or slow
led2 = 1; __delay_ms(200); led2 = 0; __delay_ms(200); // leds ON/OFF timing for any of them can be set
led3 = 1; __delay_ms(200); led3 = 0; __delay_ms(200); // separatly

// next command are here to end of while() and end of main()

} // end while
    return;
}// end while


 

конфигурация на периферията - main.h

#define led1   PORTAbits.RA0 // pin 17 Green1 - set pin with name for use in source code
#define led2   PORTAbits.RA1 // pin 18 Red1
#define led3   PORTAbits.RA2 // pin 1 Blue1
#define led4   PORTAbits.RA3 // pin 2 Green2
#define led5   PORTAbits.RA4 // pin 3 Red2
#define button  PORTAbits.RA5 // pin 4 only input pin - /MCLR pin
#define led6   PORTAbits.RA6 // pin 15 Bed2
#define led7   PORTAbits.RA7 // pin 16 Green3

#define led8   PORTBbits.RB0 // pin 6 Red3
#define led9   PORTBbits.RB1 // pin 7 Blue3
#define led10  PORTBbits.RB2 // pin 8 Green4
#define led11  PORTBbits.RB3 // pin 9 Red4
#define led12  PORTBbits.RB4 // pin 10 Blue4
#define led13  PORTBbits.RB5 // pin 11 Green5
#define led14  PORTBbits.RB6 // pin 12 Red5
#define led15  PORTBbits.RB7 // pin 13 Blue5

#define _XTAL_FREQ 8000000 // set clock frequency for correct using of __delay_ms(value);


 

обърнете внимание на разликата между файловете initcpu.h и initcpu.c !!!!!!

кодът на файла който сме показали подолу е оригинален и работещ за процесорите 16F1827 и 16F1847. обяснение за всеки един от въведените регистри можете да получите като намерите името на съответния регистър във пдф файла. имайте предвид, че името на всеки регистър със дадена стойност написан като код във този файл, ще включи или изключи дадена функция на процесора за последваща работа на даден пин или вътрешен ресурс за употреба. файлът initcpu.c е програмен код със системно конфигуриране на функциите на всеки един блок на процесора направен и програмиран да работи от завода производител.

знакът със две наклонени черти във програмния език С/С++ се приема от компилатора като коментар // това е коментар във кода, или се нарича просто бележка на програмиста за да знае какво се случва на този ред. коментара започва веднага след знака // и завършва там където натиснете бутона ЕНТЕР /ENTER/ или казано накратко, на края на програмния ред.

#include <xc.h>
// #include <pic16F1827.h> // #include <pic16F1847.h> - // този ред е коментар във програмата
#include "initcpu.h"

void init_cpu()
{
OSCCON = 0b01111010; // 8 Mhz

ANSELA = 0b00000000;
LATA = 0b00000000;
TRISA = 0b00100000; // RA5 only input - pin /MCLR !!!

ANSELB = 0b00000000;
LATB = 0b00000000;
TRISB = 0b00000000;

}


 

инициализация на PIC процесор - initcpu.h

файла трябва да съдържа само този код, нищо повече

#ifndef _INITCPU_
#define _INITCPU_

void init_cpu();
#endif

конфигурационен файл fuse.h /фюзове/ на проекта. в тази директория ще намерите всички помощни файлове за всички процесори със подорбно описание на фюзовете на всеки един процесор. внимателно изберете и отворете със и-нет браузър файла и прочетете как да напишете фюзовете за вашият процесор. всички фюзове имат по няколко възможни стойности, като внимателно  прочетете пдф файла на процесора кой фюз за каква функция отговаря. ще дадем примерен фюз файл за 16F1827 като се има предвид схемното решение на примера, както и каква задача има да извърши процесора

 




 

следва съдържание на пълен фюз файл за процесор PIC 16F1827/47 със кратко описание на всяка функция. може да потърсите във пдф файла на процесора като внимателно прочитате инфото за всяка функция която е описана тук.

//FOSC =    Oscillator Selection - избор на генератор на тактова честота - външен, вътрешен, варианти
#pragma config FOSC = INTOSC

//WDTE =    Watchdog Timer Enable - разрешаване на стражевия таймер
#pragma config WDTE = OFF

//PWRTE =    Power-up Timer Enable
#pragma config PWRTE = ON

//MCLRE =    MCLR Pin Function Select - ВНИМАНИЕ !!! за този пин и неговите функции ще има специален урок !!! за сега винаги настройвайте да бъде изключен !!!! избор за пин за ресет на процесора
#pragma config MCLRE = OFF

//CP =    Flash Program Memory Code Protection - защита на софтуера от евентуално сваляне директно от процесора през програматора.
#pragma config CP = ON

//CPD =    Data Memory Code Protection - защита на данните във вътрешния еепром от сваляне през програматора
#pragma config CPD = ON

//BOREN =    Brown-out Reset Enable
#pragma config BOREN = OFF

//CLKOUTEN =    Clock Out Enable - изход на тактовия генератор към даден пин на процесора
#pragma config CLKOUTEN = OFF

//IESO =    Internal/External Switchover
#pragma config IESO = OFF

//FCMEN =    Fail-Safe Clock Monitor Enable
#pragma config FCMEN = OFF

//WRT =    Flash Memory Self-Write Protection
#pragma config WRT = OFF

//PLLEN =    PLL Enable - избор на умножител на тактовата честота от вътрешния или външния генератор
#pragma config PLLEN = OFF

//STVREN =    Stack Overflow/Underflow Reset Enable
#pragma config STVREN = OFF

//BORV =    Brown-out Reset Voltage Selection
#pragma config BORV = HI

//LVP =    Low-Voltage Programming Enable
#pragma config LVP = OFF