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

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

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

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





изчислете аритметичния израз в програма

изчислете аритметичния израз в програма = (3522+52353)*23 - (2336*501 + 23432 - 6743)*3
тука ще дадем един пример в два варианта на решение как да напишете програма за пресмятане на аритметичен израз. има доста спорове по това как е правилно да се запише в програмата. за това ще дадем два примера за да е ясно кои са правилни в различните компилатори и кои не работят. кодът е пробван във редактора на CODE::BLOCKS с избран компилатор на BORLAND по време на инсталация.
http://www.codeblocks.org/ и работи и в двата варианта. примерната задача е взета от начален курс на софтуни за стартиращи програмисти в С++ програмен език, като за мен представлява интерес да обсъдим вариантите на програмиране на задачата.




#include <iostream> //this is a comment // class for input<> output streams
using namespace std; // object from iostream class
int main()                        // entry point main function
{
    cout << "Hello world!\n" ; // print text with new line \n <- this is for new line
    cout << "Hello SOFTUNI\n" ;  // print text with new line \n <- this is for new line
    cout << "hi from varna\n" ;  // print text with new line \n <- this is for new line
    cout << "old scholl ;)\n" ;   // print text with new line \n <- this is for new line

    // all values are size type int

    int a = 3522;            // variable in type int = range from -32768 to +32768
    long b = 52353;     // variable in type long = range from
                                                    //−2,147,483,647  to +2,147,483,647

    int c = 23;
    int d = 2336;
    int e = 501;
    int f = 23432;
    int g = 6743;
    int h = 3;

    long result = 0;
    long result2 = 0;

    result2 = (3522+52353)*23 - (2336*501 + 23432 - 6743)*3;
                            // calculate first variant of arithmetical expression
                                     // console output result2 = -2275950

    result = ((a+b)*c) - (((d*e)+(f-g))*h);
                                        // calculate second variant of arithmetical expression
                                              // console output resultl = -2275950
    cout << result2 << "\n";    //print result2
    cout << result << "\n";        //print result
   
cout << "press ENTER key for end";

    getchar();

    return 0;
}

можете да ползвате и компилатора на PELES C/С++ който също е доста добър и предполагам че няма да имате проблеми, ако срещнете такива с пелес С винаги може да си инсталирате CODE::BLOCKS. идвата врианта са работещи, но според мен и някои мои колеги добри програмисти, скобите трябва да се слагат задължително за да не си получават разминавания при компилиране в различните развойни следи.

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

тука ще дам един линк на английски за видовете типове данни в езика С/С++ за да видите в какви граници могат да се записват стойности в променливите константите и другите видове информация в езика С/С++  >>>  https://en.wikipedia.org/wiki/C_data_types

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

приятна работа :) и да изпробвате кода със различни стойности като не забравите да смените стойностите и в аритметичния израз и във променливите за да се получи един и същ резултат. АКО НЕ ПОЛУЧИТЕ ЕДНАКЪВ РЕЗУЛТАТ ЗНАЧИ НЕЩО НЕ Е НАРЕД :)

АЦП - аналогов към цифров преобразувател - урок 4

ето преработената диаграма от пдф файла че малко е объркана ама написах някои работи да стане по ясна :)


има още информация за писане но това после :) като прочетете и научите инфото досега :)

https://www.programiram.com/home

   

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

   

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

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

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

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

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