Структура на главната програма

Софтуерът за ядрото е разработен с компилатор и софтуерен дебъгер mikroC PRO for PIC, предлагащ и редица фабрични библиотеки за работа.

Главната програма [Приложение 1] се състои от три главни групи подпрограми:

  1. Подпрограми за инициализация на променливи и модули

    Те се извършват веднъж, при включване на микроконтролера. Задават се стойности на всички регистри за входове/изходи, АЦП. По-долу е показана извадка от първоначалната инициализация на регистрите:

    ADCON1 = 0x0B;     // включи АЦП AN3
    CMCON  = 0x07;     // изключи компараторите
    TRISA3_bit = 1;    // направи A3 като вход за АЦП
    TRISA0_bit = 0;    // направи А0 като цифров изход
    TRISA4_bit = 0;    // направи А4 като цифров изход
    TRISA5_bit = 0;    // направи А5 като цифров изход
    TRISD = 0;         // направи PORTD като цифров изход
    TRISC = 1;         // направи PORTC като цифров изход
    RCSTA = 1;         // изключи мултиплексирането на PORTC с EUSART модула
    

    След извършване на инициализацията на регистрите, всички променливи се нулират включително и масивите с ANSI C командата напр.

    memset(1,100,manch);
    

    Непосредствено след нулиране на променливите се извършват първоначални установявания на хардуерните модули на микроконтролера, както и външно включената периферия:

    Man_Receive_Init(); // инициализация на софтуерната комуникация с код
    		    // на манчестър
    Delay_ms(150);      // изчакай да се укроти системата
    
    SPI1_Init();      // инициализация на SPI модула
    SPI_Rd_Ptr = SPI1_Read; // чети от SPI и копирай в пойнтера за четене
    SPI_Ethernet_Init(myMacAddr, myIpAddr, Spi_Ethernet_FULLDUPLEX) ; 
    // запиши в регистрите на ENC28J60 MAC, IP и раб р-м пълен дуплекс
    SPI_Ethernet_confNetwork(ipMask, gwIpAddr, dnsIpAddr) ; 
    // конфигурирай мрежови настройки
    
    UART1_Init(9600); // инициализация на UART модула със скорост 9600bps
    Delay_ms(100);    // почакай за да се стабилизира UART модула
    
    if (!Cf_Fat_Init()) {              // инициализирай FAT библиотеката
    Delay_ms(2000);                    // почакай малко
    Cf_Fat_QuickFormat("WeatherData"); // когато е иниц. формат. картата
    Delay_ms(2000);                    // почакай пак, добре е за здравето
    }
    
    Init_Main_RTC();                   // инициализирай I2C модула с RTC
    RA4_bit=1;			   // затвори електронна врата 74HCT125A 
    RA5_bit=1;			   // затвори електронна врата 74HCT125B
    

    Връзките на външните хардуерни модули (I2C Часовник, CF карта, етернет контролер, slave контролери) с мироконтролера са указани глобално в началото на кода [Приложение 1] и биват използвани от съответстващите библиотеки.

  2. Подпрограми за събиране и запис на климатичните параметри

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

    Времеинтервала на измерванията бива задаван програмно при процеса на програмиране и е строго фиксинан със стойност от 10 минути. За следенето на времето се грижи външна специализирана интегрална схема - часовник в реално време комуникираща с микроконтролера по I2C. Прочитането на стойността от нея става на интервал по-малък от една секунда, като е реализирана функция TimeStampCMP(), която следи за разликата във времето от предишното направено измерване и текущото време.

    При достигане на време равно на 10 минути се пристъпва към четене на данните от SLAVE микроконтролерите, фотоволтаичния и цифровия температурен сензор. След прочитането съответните RAM променливи биват обновени и данните от тях биват добавени в *.CSV файла в CF картата. При завършване на операциите на четене и запис се преминава към обичайния цикъл за обслужване на запитванията от мрежата и прочитане на часа в реално време. На Фиг. 2.4 е показан обобщен алгоритъм на работа на ядрото.

    Figure: Обобщен алгоритъм на работа на ядрото
    \includegraphics[width=380pt]{figs/Fig15.pdf.ps}

  3. Подпрограми за обслужване на запитванията от мрежата

    Основата на подпрограмите използвани за изграждането на уеб сървъра разгледани по-подробно в част 2.3 Ethernet модул са безплатна добавка към студентската дистрибуция на компилатора. За минимизиране на потенциалната възможност от бавен отговор или пропускане на пакети, подпрограмата за обслужване на запитванията (SPI_Ethernet_do_Packet) от мрежата се извиква възможно най-често. Това е подпрограма управляваща MAC модула на SPI Ethernet контролера. Тя обработва следващия получен пакет от RAM буфера на Ethernet контролера. При наличие на такъв, ако запитването е TCP то подпрограмата препраща заявката към друга подпрограма SPI_Ethernet_UserTCP, за по-нататъчна обработка.

Цялата програма заема приблизително 65% от флаш паметта на микроконтролера и 85% от RAM паметта Фиг.2.5. С подходящи оптимизации бихме могли да намалим заеманата ROM памет с още около 20-30%.

Figure: Свободна и заета RAM и ROM памет
\includegraphics[width=250pt]{figs/Fig16.pdf.ps}



Deyan Levski 2013-06-22