Софтуерът за ядрото е разработен с компилатор и софтуерен дебъгер mikroC PRO for PIC, предлагащ и редица фабрични библиотеки за работа.
Главната програма [Приложение 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] и биват използвани от съответстващите библиотеки.
Събирането на климатичните елементи става комплексно от два външни микроконтролера, цифров температурен сензор DS18B20 и аналогова величина от фотоволтаичния модул.
Времеинтервала на измерванията бива задаван програмно при процеса на програмиране и е строго фиксинан със стойност от 10 минути. За следенето на времето се грижи външна специализирана интегрална схема - часовник в реално време комуникираща с микроконтролера по I2C. Прочитането на стойността от нея става на интервал по-малък от една секунда, като е реализирана функция TimeStampCMP(), която следи за разликата във времето от предишното направено измерване и текущото време.
При достигане на време равно на 10 минути се пристъпва към четене на данните от SLAVE микроконтролерите, фотоволтаичния и цифровия температурен сензор. След прочитането съответните RAM променливи биват обновени и данните от тях биват добавени в *.CSV файла в CF картата. При завършване на операциите на четене и запис се преминава към обичайния цикъл за обслужване на запитванията от мрежата и прочитане на часа в реално време. На Фиг. 2.4 е показан обобщен алгоритъм на работа на ядрото.
Основата на подпрограмите използвани за изграждането на уеб сървъра разгледани по-подробно в част 2.3 Ethernet модул са безплатна добавка към студентската дистрибуция на компилатора. За минимизиране на потенциалната възможност от бавен отговор или пропускане на пакети, подпрограмата за обслужване на запитванията (SPI_Ethernet_do_Packet) от мрежата се извиква възможно най-често. Това е подпрограма управляваща MAC модула на SPI Ethernet контролера. Тя обработва следващия получен пакет от RAM буфера на Ethernet контролера. При наличие на такъв, ако запитването е TCP то подпрограмата препраща заявката към друга подпрограма SPI_Ethernet_UserTCP, за по-нататъчна обработка.
Цялата програма заема приблизително 65% от флаш паметта на микроконтролера и 85% от RAM паметта Фиг.2.5. С подходящи оптимизации бихме могли да намалим заеманата ROM памет с още около 20-30%.