продължаваме с урока за бутоните. ще ви покажа, стандарта схема и софтуер за активиране на команди подавани от бутон свързан директно към процесор. описанието на командите в коментарите на всяка команда ще ви дадат повече яснота за това какво се случва по време на изпълнение на програмата. кодът можете да си компилирате стандартно със мплаб и хц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