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

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

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

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

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


  

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

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

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

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


     

     
 

задача за програмисти на езика С/С++

задача за програмисти на езика С/С++ . препоръчвам ви да използвате компилатора на PELES C  

http://pellesc.de/index.php?page=download&lang=en

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

условие : в даденият чертеж  на вписаната окръжност в квадрат /и на вписан квадрат във окръжност/ да се намерят следните параметри:
1. диаметърът на кръгът
2. лицето на кръгът
3. лицето на квадрата
4. разликата между двете лица в пресечната и непресечната площ на сечението между двете фигури
5. лицето само на единият от модулите от сечението между двете фигури
6. диагоналът на квадрата
7. обиколката на квадрат
8. обиколката на окръжноста

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

АЦП тестова платка със захранване и разширение

това беше за този урок. ако има въпроси, на емайла или телефона :) успех :)

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


 



 


това беше за този урок. ако има въпроси, на емайла или телефона :) успех :)

АЦП програмен код - листинг по файлове


ще дадем и пълният програмен код от примера. в предния урок има линк от където можете да си го изтеглите, но все пак ще дадем кофа и като текст тука за по прегледно съдържание. готовият компилиран *.hex файл можете да си изтеглите от рар архива от този линк
http://karadev.net/basto/adc_leson/adc_leson.rar

отново ще покажем схемата според която е написан софтуера и неговата функционалност




 
 

файл >>> main.c съдържание

#include <xc.h> // this is global for all *****.c files
#include "initcpu.h" //header file this must be second in order !!!
#include "main.h"    // header file    
#include "fuse.h"  // include like a code file
                    //must be last in order !!!
#include "adc_trimer.h"                    

void main(void) // entry point function call just one !!!
{
    init_cpu(); // initialize cpu hardware blocks
                // using before main just once
                // code is in initcpu.c file
    
    while(1)    // loop using condition
                //until is 1 = FOREVER
    {
        if(jumper==1) // make a chek for value
        {trimer();}    // if is 1 call function
        else            // orde
        {trimer2();}    // if is 0 call other function
        
        // THIS CODE HERE IS FOR START TESTING OF PROJECT
        // YOU CAN YOU TOO FOR FUN OR FOR WHAT YOU WANT :)
        // BLINK LEDS FOR DISCO PARTY :)
        /*led_1 = 1; __delay_ms(200); led_1 = 0; __delay_ms(200);
        led_2 = 1; __delay_ms(200); led_2 = 0; __delay_ms(200);
        led_3 = 1; __delay_ms(200); led_3 = 0; __delay_ms(200);
        led_4 = 1; __delay_ms(200); led_4 = 0; __delay_ms(200);
        led_5 = 1; __delay_ms(200); led_5 = 0; __delay_ms(200);
        led_6 = 1; __delay_ms(200); led_6 = 0; __delay_ms(200);
        led_7 = 1; __delay_ms(200); led_7 = 0; __delay_ms(200);
        led_8 = 1; __delay_ms(200); led_8 = 0; __delay_ms(200);
        // end efect 1
        
        led_1 = 1; __delay_ms(200); led_2 = 1; __delay_ms(200);
        led_3 = 1; __delay_ms(200); led_4 = 1; __delay_ms(200);
        led_5 = 1; __delay_ms(200); led_6 = 1; __delay_ms(200);
        led_7 = 1; __delay_ms(200); led_8 = 1; __delay_ms(200);
        
        led_1 = 0; __delay_ms(200); led_2 = 0; __delay_ms(200);
        led_3 = 0; __delay_ms(200); led_4 = 0; __delay_ms(200);
        led_5 = 0; __delay_ms(200); led_6 = 0; __delay_ms(200);
        led_7 = 0; __delay_ms(200); led_8 = 0; __delay_ms(200);
        // end efect 2
        
        led_8 = 1; __delay_ms(200); led_8 = 0; __delay_ms(200);
        led_7 = 1; __delay_ms(200); led_7 = 0; __delay_ms(200);
        led_6 = 1; __delay_ms(200); led_6 = 0; __delay_ms(200);
        led_5 = 1; __delay_ms(200); led_5 = 0; __delay_ms(200);
        led_4 = 1; __delay_ms(200); led_4 = 0; __delay_ms(200);
        led_3 = 1; __delay_ms(200); led_3 = 0; __delay_ms(200);
        led_2 = 1; __delay_ms(200); led_2 = 0; __delay_ms(200);
        led_1 = 1; __delay_ms(200); led_1 = 0; __delay_ms(200);
        // end efect 3
        
        led_8 = 1; __delay_ms(200); led_7 = 1; __delay_ms(200);
        led_6 = 1; __delay_ms(200); led_5 = 1; __delay_ms(200);
        led_4 = 1; __delay_ms(200); led_3 = 1; __delay_ms(200);
        led_2 = 1; __delay_ms(200); led_1 = 1; __delay_ms(200);
        
        led_8 = 0; __delay_ms(200); led_7 = 0; __delay_ms(200);
        led_6 = 0; __delay_ms(200); led_5 = 0; __delay_ms(200);
        led_4 = 0; __delay_ms(200); led_3 = 0; __delay_ms(200);
        led_2 = 0; __delay_ms(200); led_1 = 0; __delay_ms(200);
        // end efect 2
        */
        
    }//end while DON LOSE THE BRACKET :)
    
} //end main DON LOSE THIS BRACKET TOO :)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - -- - - - - - - - - - -

файл >>> initcpu.c съдържание

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

void init_cpu(void)
{                // set cloc of one of this and check in main.h
                // this value for corect timing _XTAL_FREQ 4000000
OSCCON = 0x6A; // 4F - 1Mhz // 6A - 4Mhz // 0x38 - 8Mhz // 0x1E - 16Mhz

ADON = 1; // ADC block is ON
ANSELA = 0b00000001;  // set RA0 for analog pin others digitals
TRISA = 0b00000011;    // set RA0 and RA1 for inpits
LATA = 0b00000000;
PORTA = 0x00;    

ANSELB = 0b00000000;    // set all pins for digital
TRISB = 0b00000000;    // set all pins for outputs
LATB = 0b00000000;
PORTB = 0x00;

}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - -- - - - - - - - - - -

файл >>> adc_trimer.c съдържание

#include <xc.h>
#include "main.h"
#include "adc_trimer.h"

volatile char trimer1;
// volatile not using from other functions

void trimer(void)
{    trimer1 = 0;    // set variable to zero = 0
    ADFM = 0;         // left arenged result in ADRESH:ADRESL
    CHS4=0;CHS3=0;CHS2=0;CHS1=0;CHS0=0; // select ADC channel
    __delay_ms(10); // IMPORTANT THIS IS AQUISITION TIME !!!!
    GO = 1;            // start mesuring temp ADC value
    trimer1 = ADRESH;
    // save in ADRESH and using only ADRESH value to variable
    
    if(trimer1 == 0)    // make checkout of variable
    { led_1 = 0; led_2 = 0; led_3 = 0; led_4 = 0;
      led_5 = 0; led_6 = 0; led_7 = 0; led_8 = 0;}
    else
        if(trimer1 > 1 && trimer1 <= 31) // if value is between 1 AND 31
    { led_1 = 1; led_2 = 0; led_3 = 0; led_4 = 0; // set led_1 to light 1
      led_5 = 0; led_6 = 0; led_7 = 0; led_8 = 0;}// others stay dark 0
    else
        if(trimer1 > 32 && trimer1 <= 63)
    { led_1 = 0; led_2 = 1; led_3 = 0; led_4 = 0;
      led_5 = 0; led_6 = 0; led_7 = 0; led_8 = 0;}
    else
        if(trimer1 >= 64 && trimer1 <= 95)
    { led_1 = 0; led_2 = 0; led_3 = 1; led_4 = 0;
      led_5 = 0; led_6 = 0; led_7 = 0; led_8 = 0;}
    else
        if(trimer1 >= 96 && trimer1 <= 127)
    { led_1 = 0; led_2 = 0; led_3 = 0; led_4 = 1;
      led_5 = 0; led_6 = 0; led_7 = 0; led_8 = 0;}
    else
        if(trimer1 >= 128 && trimer1 <= 159)
    { led_1 = 0; led_2 = 0; led_3 = 0; led_4 = 0;
      led_5 = 1; led_6 = 0; led_7 = 0; led_8 = 0;}
    else
        if(trimer1 >= 160 && trimer1 <= 191)
    { led_1 = 0; led_2 = 0; led_3 = 0; led_4 = 0;
      led_5 = 0; led_6 = 1; led_7 = 0; led_8 = 0;}
    else
        if(trimer1 >= 192 && trimer1 <= 223)
    { led_1 = 0; led_2 = 0; led_3 = 0; led_4 = 0;
      led_5 = 0; led_6 = 0; led_7 = 1; led_8 = 0;}
    else
        if(trimer1 >= 224 && trimer1 <= 255)
    { led_1 = 0; led_2 = 0; led_3 = 0; led_4 = 0;
      led_5 = 0; led_6 = 0; led_7 = 0; led_8 = 1;}
    
}

void trimer2(void)    // same function but lights are different
{    trimer1 = 0;    // IMPORTANT !!! clear value before USE IT !!!!
    ADFM = 0; // left arenged result in ADRESH:ADRESL
    CHS4=0;CHS3=0;CHS2=0;CHS1=0;CHS0=0;
    __delay_ms(10);
    GO = 1;
    trimer1 = ADRESH; // using only result in ADRESH
    
    if(trimer1 == 0)
    { led_1 = 0; led_2 = 0; led_3 = 0; led_4 = 0;
      led_5 = 0; led_6 = 0; led_7 = 0; led_8 = 0;}
      
    else
        if(trimer1 > 1 && trimer1 <= 31)
    { led_1 = 1; led_2 = 0; led_3 = 0; led_4 = 0;
      led_5 = 0; led_6 = 0; led_7 = 0; led_8 = 0;}
      
    else
        if(trimer1 > 32 && trimer1 <= 63)
    { led_1 = 1; led_2 = 1; led_3 = 0; led_4 = 0;
      led_5 = 0; led_6 = 0; led_7 = 0; led_8 = 0;}
      
    else
        if(trimer1 >= 64 && trimer1 <= 95)
    { led_1 = 1; led_2 = 1; led_3 = 1; led_4 = 0;
      led_5 = 0; led_6 = 0; led_7 = 0; led_8 = 0;}
      
    else
        if(trimer1 >= 96 && trimer1 <= 127)
    { led_1 = 1; led_2 = 1; led_3 = 1; led_4 = 1;
      led_5 = 0; led_6 = 0; led_7 = 0; led_8 = 0;}
      
    else
        if(trimer1 >= 128 && trimer1 <= 159)
    { led_1 = 1; led_2 = 1; led_3 = 1; led_4 = 1;
      led_5 = 1; led_6 = 0; led_7 = 0; led_8 = 0;}
      
    else
        if(trimer1 >= 160 && trimer1 <= 191)
    { led_1 = 1; led_2 = 1; led_3 = 1; led_4 = 1;
      led_5 = 1; led_6 = 1; led_7 = 0; led_8 = 0;}
      
    else
        if(trimer1 >= 192 && trimer1 <= 223)
    { led_1 = 1; led_2 = 1; led_3 = 1; led_4 = 1;
      led_5 = 1; led_6 = 1; led_7 = 1; led_8 = 0;}
      
    else
        if(trimer1 >= 224 && trimer1 <= 255)
    { led_1 = 1; led_2 = 1; led_3 = 1; led_4 = 1;
      led_5 = 1; led_6 = 1; led_7 = 1; led_8 = 1;}
    
    // this code here is from another program
    // check the code and search in inet for see what
    // a command are use here
    // while(GO)continue;
    // TIME DELAY OFF - 1min-10min
    // trimer1 = (trimer1 >> 5); // bit moving rigth with 5
                    // from 8 bits after moving they are only 3 = 111
    // decimal 7 max = 1800 sec = 3 minute
    // delayOFF = trimer1 + 1; // 7 + 1 = 8 // if + 1 = 1800 sec max
    // delayOFF = delayOFF * 600; // 8 * 600 = 4800 = 10 minuti
    
    /* ADFM = 0;
    CHS4=0;CHS3=0;CHS2=0;CHS1=0;CHS0=1;
    __delay_ms(20);
    GO = 1;
    while(GO)continue;
    trimer2 = ADRESH; // TIME DELAY ON - 3s-10s
    trimer2 = (trimer2 >> 4); // bit moving rigth with 4
                    // from 8 after moving they are only 4 = 1111
    delayON = trimer2; */
}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - -- - - - - - - - - - -

файл >>> adc_trimer.h съдържание

#ifndef _TRIMER_
#define _TRIMER_

extern volatile char trimer1 ;
void trimer(void);
void trimer2(void);
void init_cpu(void);

#endif

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - -- - - - - - - - - - -

файл >>> fuse.h съдържание

// system file configuration
// for setup hardware
//modules >> read pdf !!!

#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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - -- - - - - - - - - - -

файл >>> initcpu.h съдържание

#ifndef _INITCPU_
#define _INITCPU_

void init_cpu(void);
#endif

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - -- - - - - - - - - - -

файл >>> main.h съдържание

#ifndef _MAIN_
#define _MAIN_

#define trimer10k    PORTAbits.RA0 // pin 17 input
#define jumper  PORTAbits.RA1 // pin 18 input
#define notused3  PORTAbits.RA2 // pin 1
#define notused4  PORTAbits.RA3 // pin 2
#define notused5  PORTAbits.RA4 // pin 3
#define notused6  PORTAbits.RA5 // pin 4 RA5 - input4 only
#define notused7  PORTAbits.RA6 // pin 15
#define notused8  PORTAbits.RA7 // pin 16

#define led_1 PORTBbits.RB0 // pin 6
#define led_2 PORTBbits.RB1 // pin 7
#define led_3 PORTBbits.RB2 // pin 8
#define led_4 PORTBbits.RB3 // pin 9
#define led_5 PORTBbits.RB4 // pin 10
#define led_6 PORTBbits.RB5 // pin 11
#define led_7 PORTBbits.RB6 // pin 12
#define led_8 PORTBbits.RB7 // pin 13

#define _XTAL_FREQ 4000000 // this value must set
            // corect depend from OSCCON for corect timing
            // for __delay_ms(500) function
#endif

код за АЦП преобразувателя с пример :) чисто нов код

код за АЦП преобразувателя с пример :) чисто нов код с два примерни ефекта за следене на АДЦ стойностите на потенциометъра. обърнете внимание на стрелката на потенциометъра при преместване как се сменят светванията на светодиоидите. в кода съм написал пояснения как се пресмята и как се прави проверката за да може коректно да светват светодиодите всеки във своята граница от измереното напрежение на АЦП входа.

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

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

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

ЧЕТЕТЕ, МИСЛЕТЕ, ПИШЕТЕ, ПРОВАЙТЕ, ИМАТЕ ИНТЕРНЕТ, ИМАТЕ ПРИМЕРИ ИМАТЕ КАКВО ЛИ НЕ КАТО ИНФОРМАЦИЯ. ЕДНО ВРЕМЕ НЯМАШЕ СТАЦИОНАРНИ ТЕЛЕФОНИ С КОПЧЕТА, КАМО ЛИ ИНТЕРНЕТ !!!
КАК СМЕ СА ОПРАВЯЛИ НЕ ПИТАЙ
ТЕ ;)

линк към директорията :) http://karadev.net/basto/adc_leson/

линк директно към рар файла със сорс кода http://karadev.net/basto/adc_leson/adc_leson.rar

резултат от симулацията може да видите на показаните анимирани графики и на двата ефекта. но във сорс кода и вашите опити за съставяне на нови приложения на АЦП портовете ще се научите да управлявате този важен модул на процесорите :)





https://www.programiram.com/home

   

уроци, задачи, информация и много други :)
линк >> натисни тук <<<

   

1001 задачи в програмирането
линк >>
натисни тук <<<

   
НАУЧИ МЕ много добър сайт
линк >>
натисни тук <<<
   

Много добра книга с примери за програмирането на езика С от автора Стенли Липман.

Може да си я разпечатате като учебник.

Има примери към всяка функция, цикъл и задача.
линк към фйла >>>
www.karadev.net/uroci/pdf_basic/CPP-Primer-BG.pdf