проект за развойна платка с процесор 18F46K20 за обучение за начинаещи и напреднали в програмирането на PIC 18F фамилията процесори на microchip. ако има някакви предложения какво да се промени на платката, пишете на емайла или на телефоните

за контакти, предложения и питания >>> 0887284901 <> This email address is being protected from spambots. You need JavaScript enabled to view it.

добър сайт за електроника - www.extremeelectronics.co.in

много софтуер, библиотеки за сваляне, схеми и допълнителни модули за програмирането на процесори, уиндоус и други системи. някои от библиотеките за пик процесорите са за друг компилатор, но не е проблем да бъдат настроени за XC8 и MPLAB IDE.

сайтът съдържа реално работещи примери със схеми и проекти на платките, както и показни видео клипове от работата на готовите примери. статиите, примерите и другите полезни материали са разделени в категории, като всеки които му трябва информация може да намери полезни уроци и примерен софтуер във линковете за сваляне към всеки урок. можете да оставите коментар към дадена статия или да се свържете директно със програмиста, които е и собственик на сайта. УСПЕХ :)

както ви бях обещал, ето и сорс кода за примера с инкреметирането на променлива при натискане на бутон от предния пример. другите файлове във проекта са същите. тук е само main.c файла със кода за подаване на командата от бутона и промяната на стойността на номера на програмата. разгледайте внимателно кода, като отбележите че за да промените ефекта със следващия ще трябва да задържите бутона докато свърши текущия ефект. това е така защото по време на изпълнение на текущия ефект не се прави проверка дали е натиснат бутона.

за това докато не свърши даден ефект във текущата подпрограма IF основната програма MAIN не прави проверка дали е натиснат бутона.

ако във вашите програми се налага да се променят подпрограмите дори и по време на изпълнение на текущата подпрограма, ще се наложи да използвате хардуерно прекъсване на бутона, или така наречените ПРЕКЪСВАНЕ ПРИ ПРОМЯНА НА СЪСТОЯНИЕТО / INTERRUPT OF CHANGE - IOC/. тази хардуерна функция я имат повечето нови процесори на почти всички пинове, като това е важно за приложения при бързи управления на механики, възли и многопоточни линии от машинни възли.

как се работи със хардуерните прекъдвания ще разгледаме във следващите уроци за програмирането на процесорите.



--------------  main.c   --------------------------
#include <xc.h>
#include "main.h"
#include "fuse.h"
#include "initcpu.h"

unsigned char program = 1; //number of start efect

void main(void) // start main function
{    init_cpu(); // hardware initialization
                // of cpu modules
    
 while(1) // start loop when 1=1 is always true
 {    if(button1 == 1) // chek button if is pressed
     { __delay_ms(200); // wait for prove button
      program = program + 1;} // increment program value
    
    if(program > 5) // check value for max edge
    {program = 1;} // if is max set to start count
    
    if(program == 1) // if value is 1 play efect 1
    {
        led8 = 1;__delay_ms(200);
        led8 = 0;__delay_ms(200);
        led9 = 1;__delay_ms(200);
        led9 = 0;__delay_ms(200);
        led10 = 1;__delay_ms(200);
        led10 = 0;__delay_ms(200);
        led11 = 1;__delay_ms(200);
        led11 = 0;__delay_ms(200);
        led12 = 1;__delay_ms(200);
        led12 = 0;__delay_ms(200);
        led13 = 1;__delay_ms(200);
        led13 = 0;__delay_ms(200);
        led14 = 1;__delay_ms(200);
        led14 = 0;__delay_ms(200);
        led15 = 1;__delay_ms(200);
        led15 = 0;__delay_ms(200);
    }
        
    if(program == 2) // if value is 2 play efect 2
    {
        led8 = 1;led9 = 1;led10 = 1;led11 = 1;
        led12 = 1;led13 = 1;led14 = 1;led15 = 1;
        __delay_ms(200);
        led8 = 0;led9 = 0;led10 = 0;led11 = 0;
        led12 = 0;led13 = 0;led14 = 0;led15 = 0;
        __delay_ms(200);
    }

    if(program == 3) // if value is 3 play efect 3
    {
        led8 = 1;__delay_ms(200);
        led9 = 1;__delay_ms(200);
        led10 = 1;__delay_ms(200);
        led11 = 1;__delay_ms(200);
        led12 = 1;__delay_ms(200);
        led13 = 1;__delay_ms(200);
        led14 = 1;__delay_ms(200);
        led15 = 1;__delay_ms(200);
        led8 = 0;__delay_ms(200);
        led9 = 0;__delay_ms(200);
        led10 = 0;__delay_ms(200);
        led11 = 0;__delay_ms(200);
        led12 = 0;__delay_ms(200);
        led13 = 0;__delay_ms(200);
        led14 = 0;__delay_ms(200);
        led15 = 0;__delay_ms(200);
    }
        
        if(program == 4)
    {
        led8 = 1;__delay_ms(200);
        led15 = 1;__delay_ms(200);
        led9 = 1;__delay_ms(200);
        led14 = 1;__delay_ms(200);
        led10 = 1;__delay_ms(200);
        led13 = 1;__delay_ms(200);
        led11 = 1;__delay_ms(200);
        led12 = 1;__delay_ms(200);
        led8 = 0;__delay_ms(200);
        led15 = 0;__delay_ms(200);
        led9 = 0;__delay_ms(200);
        led14 = 0;__delay_ms(200);
        led10 = 0;__delay_ms(200);
        led13 = 0;__delay_ms(200);
        led11 = 0;__delay_ms(200);
        led12 = 0;__delay_ms(200);
    }
    
    if(program == 5)
    {
        led15 = 1;__delay_ms(200);
        led14 = 1;__delay_ms(200);
        led13 = 1;__delay_ms(200);
        led12 = 1;__delay_ms(200);
        led11 = 1;__delay_ms(200);
        led10 = 1;__delay_ms(200);
        led9 = 1;__delay_ms(200);
        led8 = 1;__delay_ms(200);
        led15 = 0;__delay_ms(200);
        led14 = 0;__delay_ms(200);
        led13 = 0;__delay_ms(200);
        led12 = 0;__delay_ms(200);
        led11 = 0;__delay_ms(200);
        led10 = 0;__delay_ms(200);
        led9 = 0;__delay_ms(200);
        led8 = 0;__delay_ms(200);
    }    
        
    } // end while
    return;
} //end main


 

работа с бутони - урок 3 - ИНКРЕМЕНТИРАНЕ - ще ви покажа как да изпълнявате няколко на брой програми с подаване на команда от един бутон. за целта съм направил нов схема и платка, по-късно ще покажа и софтуера, който доста се различава от предходния урок. четете внимателно печелите обезателно :)

  

продължаваме с урока за бутоните. ще ви покажа, стандарта схема и софтуер за активиране на команди подавани от бутон свързан директно към процесор. описанието на командите в коментарите на всяка команда ще ви дадат повече яснота за това какво се случва по време на изпълнение на програмата. кодът можете да си компилирате стандартно със мплаб и хц8 2.0 като внимателно копирате кода на всички файлове във вашият проект файл по файл. ако има някакви затруднения при пробата на софтуера можете да пишете на емайла. симулацията във протеус работи, ще покажем в няколко кадъра какво се случва.

обяснение накратко как работи софтуера и кои са важните моменти. след като стартира програмата единият от светодиодите започва да мига периодично, докато другият е изгасен очаквайки натискането на бутона. когато бутона се натисне и малко се задържи ЗА ДА Е ДОКАЗАНО ЧЕ Е НАСТИСНАТ УМИШЛЕНО, а не случайно, първият светодиод изгасва като светва вторият и стои светнал в продължение на 5 секунди. след като тези 5 секунди изтекат, светодиода изгасва, програмата изчаква малко време като пауза преди да се върне към главната програма и да изпълни следващата команда след IF{} подпрограмата.

времената за доказване на натиснатия бутон и времето за изчакване след като завърши изпълнението на подпрограмата на бутона са важни защото при управлението на механични части със различни двигатели и соленоиди, релета и други, механиката и трябва време да заеме определена позиция спрямо другите детайли в механичният възел. за това времето за изчакване механиката да се успокои е много важно при управление на всякакви ПЛК / програмируеми логически контролери/ различни механичи възли и системи.

по сложните свързвания на бутони към процесорите ще обясним във следващите уроци.

    


       

съдържание на програмните файлове във сорс кода на примера за управлението на бутоните:

>>> fuse.h <<<

#pragma config FOSC   = INTOSC
#pragma config WDTE   = OFF
#pragma config PWRTE  = OFF
#pragma config MCLRE  = OFF
#pragma config CP     = OFF
#pragma config CPD    = OFF
#pragma config BOREN  = OFF
#pragma config IESO   = OFF
#pragma config FCMEN  = OFF
#pragma config WRT    = OFF
#pragma config PLLEN  = OFF
#pragma config STVREN = OFF
#pragma config BORV   = LO
#pragma config LVP    = OFF


>>> main.h <<<
#define led1    PORTAbits.RA0 // pin 17 output
#define led2    PORTAbits.RA1 // pin 18 output
#define button1   PORTAbits.RA2 // pin 1 input1
#define led4    PORTAbits.RA3 // pin 2 input2
#define led5    PORTAbits.RA4 // pin 3 input3
#define notused  PORTAbits.RA5 // pin 4 /MCLR - input only
#define led6    PORTAbits.RA6 // pin 15 output
#define led7    PORTAbits.RA7 // pin 16 output

#define led8     PORTBbits.RB0 // pin 17
#define led9     PORTBbits.RB1 // pin 18
#define led10     PORTBbits.RB2 // pin 1
#define led11     PORTBbits.RB3 // pin 2
#define led12     PORTBbits.RB4 // pin 3
#define led13     PORTBbits.RB5 // pin 4
#define led15     PORTBbits.RB6 // pin 15
#define led16     PORTBbits.RB7 // pin 16

#define _XTAL_FREQ 4000000


>>> initcpu.c <<<
#include <xc.h>
//#include <pic16f1827.h>
#include "main.h"

void init_cpu(void)
{
OSCCON = 0x68; // 58 - 1Mhz // 68 - 4Mhz
            // 0x70 - 8Mhz // 0x78 - 16Mhz
ANSELA = 0x00;    
TRISA = 0b00100100;  //pin 4 RA5 - input only
                                // set pin 1 RA 2 for input too
PORTA=0x00;    

ANSELB = 0x00;
TRISB = 0x00;
PORTB = 0x00;
}



>>> initcpu.h <<<
#ifndef _INITCPU_
#define _INITCPU_

void init_cpu();
#endif

>>> main.c <<<

#include <xc.h>
#include "main.h"
#include "fuse.h"
#include "initcpu.h"

void main(void) // start main function
{    init_cpu(); // hardware initialization
                // of cpu modules
    
    while(1) // start loop when 1=1 is always true
    {
    led9 = 1; // PORTBbits.RB1 // pin 18 is ON
    __delay_ms(500); // wait half second
    led9 = 0; // PORTBbits.RB1 // pin 18 is OFF
    __delay_ms(500);
    
    if(button1 == 1) // check condition
                    //  for pressed button
    // if button is pressed start executing
    // commands bellow
    {    __delay_ms(200); // wait time to prove
                          // that button is still
                          // pressed
        led16 = 1;    //PORTBbits.RB7 // pin 16 is ON
        __delay_ms(5000); // wait 5 seconds
        led16 = 0; //PORTBbits.RB7 // pin 16 is OFF
        __delay_ms(200); // wait time seconds
                          // before return in main loop
    } // end if button
        
    // other commands goes here in loop if
        // is need to do something
    } // end while
    return;
} //end main