работа с бутони - урок 4 - ИНКРЕМЕНТИРАНЕ - сорс код

както ви бях обещал, ето и сорс кода за примера с инкреметирането на променлива при натискане на бутон от предния пример. другите файлове във проекта са същите. тук е само 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 - ИНКРЕМЕНТИРАНЕ

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

  

мрежови кабели - НОВИЯТ СТАНДАРТ

мрежови кабели - НОВИЯТ СТАНДАРТ

НОВИТЕ ВАРИАНТИ ЗА НАПРАВА НА МРЕЖОВ КАБЕЛ МЕЖДУ КОМПЮТЪР И СУИЧ, новите варианти се различават само по смяната на местата на двата кабела син цвят и бяло-син цвят. всичко друго е същото както до сега. както е показано на графиките, когато намествате кабелите в RJ-45 клипса, чопа на клипса трябва да се отдолу. освен смяната на местата на синият и бяло-синият кабел всичко по монтажа и кримпването на кабелите е същото. и двата жака от двете страни на един и същ кабел за връзка между суич, рутер и/или компютър трябва да са със еднакво разположение на пиновете по един от двата показани на графиките МОВИ варианти.

при вариант А стартовата двойка на клипса е зелен, бял-зелен, а при вариант В стартовата двойка е оранж, бял-оранж.

всички други варианти на свързване между две лан стандартни устройства може би няма да работят. ако искате да ползвате лан кабела за връзка на ваши си комуникации във ваши устройства и мрежи, свободни сте да направите каквито искате варианти на връзка, само да не вкарате захранващо напрежение в комуникационните букси ЗАЩОТО ДИРЕКТНО ИЗГАРЯ !!!!

варианти за свързване има много, отговорност носите само вие в момента на монтажа на кабелите. успех

таблиците с описанието на разположението на кабелите е по старият вариант ОБЪРНЕТЕ ВНИМАНИЕ НА ГРАФИКИТЕ ПОСОЧЕНИ СЪС ЧЕРВЕНАТА СТРЕЛКА !!!!!

 

таблиците с описанието на разположението на кабелите е по старият вариант ОБЪРНЕТЕ ВНИМАНИЕ НА ГРАФИКИТЕ ПОСОЧЕНИ СЪС ЧЕРВЕНАТА СТРЕЛКА !!!!!

работа с бутони - урок 2

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

работа с бутони свързани към процесор

употреба на бутони за подаване на команди към процесорните системи

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

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

бутоните за подаване на команди към процесорите използват ниско напрежение, най-често +5V, също така с малък делител и стабилизиращ диод можете да подадете сигнал и със захранващото +12/+24V, ако се налага да изнесете клавиатурата отдалечено от основния контролер. как се прави това ще видим в следващите уроци.


  

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

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

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

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


     

     
 

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

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

добавил съм и два волтметъра допълнително, като единият е на захранващото напрежение на схемата, а вторият на изходящото общо напрежение на товара към транзистора. ВИНАГИ СЛЕДЕТЕ ТЕЗИ ДВЕ НАПРЕЖЕНИЯ за да сте сигурни че транзисторът се е отпушил на 100% процента, като загубата на напрежение не преминава 0,1 ВОЛТ от захранващото.

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

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

на първата графика виждаме нормалната работа на схемата, като изходящият волтметър показва отклонение 0.01 волт от входящото напрежение.




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





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





за други товари където работната графика в съотношение време/волтаж е по-плавна може да се усети по-добре промяната на стойността на съпротивлението за да се контролира работа на крайният товар.

този процес се нарича ДИМИРАНЕ. в предните уроци сме споменавали за това. както и на главният сайт има направен и програмиран процесорен контролер за ргб светодиодни ленти. в зависимост от мощността на крайните товари това може да бъде направено за всякакви машини и механизми.