Villamosságtan | Felsőoktatás » Mikrokontrollerek alkalmazástechnikája

Alapadatok

Év, oldalszám:2008, 29 oldal

Nyelv:magyar

Letöltések száma:173

Feltöltve:2011. augusztus 28.

Méret:257 KB

Intézmény:
-

Megjegyzés:

Csatolmány:-

Letöltés PDF-ben:Kérlek jelentkezz be!



Értékelések

Nincs még értékelés. Legyél Te az első!


Tartalmi kivonat

Mikrokontrollerek Alkalmazástechnikája Házi Feladat Laza György Károly részére, Neptun kód: Feladat címe: Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel Feladat konzulense: Csordás Péter 1. - Feladat leírása, előzetes specifikáció: A feladat egy lakóépület napkollektor-köreinek vezérlése a hőmérsékleti viszonyok függvényében. A választott mikrovezérlő PIC16F877(A) vagy PIC16F887, a hőmérséklet érzékelését valószínűleg DS1820 szenzorokkal oldom meg (1-Wire illesztés). A mikrovezérlő feladata a déli és a nyugati kollektorkör hőmérsékletének folyamatos monitorozása, és a körök főrendszerbe kapcsolása (kimeneti port – FET – relé – elektromos vezérlésű szelep) a hőmérséklet függvényében (hiszterézissel). A mikrovezérlőhöz illesztett nyomógombok (3 db.) és 16*2-es LCD kijelző segítségével a hőmérsékleti küszöbök és a szelepek állapotai tetszőlegesen változtathatók

lesznek. A mikrovezérlő saját memóriájában tárolódnak a mért és a beavatkozási adatok, ami letölthető RS-232 porton keresztül egy PC-re. A firmware mikroPascal nyelven készül A rendszer a továbbiakban kiegészülhet RTC chippel is. Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 1. oldal 2. - Részletes specifikáció A mikrovezérlő 1-Wire interface-en keresztül kommunikál 4 db. DS18B20 digitális hőszenzorral, a kapott adatokat tárolja és feldolgozza, alapbeállításnál 10 fok C hőmérséklet-különbségnél kapcsol be a kimenet, és 3 fok C hiszterézissel van ellátva a feldolgozó függvény, így elkerülhető a relék túl gyors kapcsolgatása. A mikrovezérlő a RAM-jában tárolja az adatokból rendszeresen mintavételezett sokaságot, ami RS-232 porton keresztül letölthető (1-es gomb lenyomására RS-232

módba lép, $EA parancsra küldi a naplózási adatokat - 4800 baud). A szenzorok által mért hőmérsékletet 1 fok C pontossággal kijelzi az LCD kijelzőn. Megszakítások nélkül megoldott nyomógombkezelést alkalmaz a szoftver, a szoftver legelején a szenzorok ROM azonosítójának kiolvasásakor az 1-es, majd 2-es nyomógombbal jelezheti a felhasználó a következő szenzor behelyezését. A ROM tartalom kiolvasása után a mikrokontroller végtelen ciklusban dolgozik a hőmérésbeavatkozás-naplózás vonalon, ha nem változik meg közben a gombok állapota. Ha az 1es gomb logikai szintje megváltozik, RS-232 módba lép a szoftver (sajnos a konstrukció alapvető hibája, hogy a soros kommunikáció idejére a mérés-beavatkozás ciklus felfüggesztésre kerül). RS-232 módban a kapcsolat inicializálása után a PC-ről érkező parancsok alapján a szoftver kiküldi a naplózási adatokat vagy megváltoztatja a relék állapotát ($EA parancs = rEAd, vagyis napló

olvasása, $CD = CommanD, relék vezérlése). 2- es gomb lenyomására a rendszer visszatér a főciklusba. A 2- es nyomógomb hatására a differenciális hőmérsékletküszöb (az a hőmérséklet-különbség, aminél szükségszerű beavatkozni) inkrementálódik 1 fok C-kal, és az új értéket kiírja az LCD-kijelzőre, a 3-as gomb hatására pedig csökken a küszöbérték. Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 2. oldal 3. - Funkcionális blokkvázlat 1. ábra – a rendszer funkcionális blokkvázlata A rendszerben a hőmérsékletérzékelését és regisztrálását a bal oldali blokk végzi, feldolgozását a középső logikai egység, a beavatkozást és a kommunikációs feladatokat a jobboldali blokk látja el. Hőmérséklet érzékelő egység feladata: a fizikai mennyiségként jelenlevő hőmérsékletet

elektronikus jellé alakítja. Hőmérséklet regisztráló egység feladata: a hőmérséklet regisztrálását végzi digitális tárolóba. Logikai egység feladata: beavatkozási feltételek kezelése, kommunikációs vonalak és a rendszer működésének összekapcsolása. Interface-ek: a felhasználói interface a felhasználóval történő kommunikációt bonyolítja le, míg a soros kommunikáció egy PC-vel történhet. Beavatkozás: a logikai egység által szolgáltatott információ alapján elvégzi a szükséges beavatkozást. Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 3. oldal 4. - Hardver szoftver szétválasztás A hőmérséklet érzékelését triviálisan hardver végzi, mégpedig egy DS18B20 digitális hőmérséklet-érzékelő. A regisztrálást szoftveresen célszerű megoldani, mivel a mikrovezérlő belső RAM-jában

történik a tárolás. A logikai feltételek kezelését szintén egyszerűbb a szoftverre bízni. A beavatkozási egység a logikai kimenet által vezérelt hardveres illesztésnek feleltethető meg, ez a logikai szintig szoftveres, azon túl pedig hardveres megoldást igényel. A kommunikációs interface-ek is hardveres megoldásúak, viszont az LCD függvény, az UART, és a nyomógomb logikai állapotának lekérdezését szoftver valósítja meg. 5. - Hardver rendszerterv 2. ábra – hardver rendszerterv A központi feldolgozó hardver egység maga a PIC mikrovezérlő lesz, ennek a működéséhez szükséges harverelemek (pl. kvarc) is az egységhez tartoznak A szenzorok egyvezetékes kommunikációval csatlakoznak a mikrokontrollerhez, a kritikus adatok áramlása egyirányú, ahogy a rajzon is látható, azonban a valóságban mindkét irányban történik átvitel. A beavatkozási egység a logikai állapotú kimenetekhez a nagy áramot Mikrokontrollerek

alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 4. oldal igénylő szelepet illeszti kisjelű NPN tranzisztorral és relével. A soros interface a PIC szoftveres UART eljárását RS-232 vonalra illeszti egy MAX232-es szintillesztő IC-vel. A felhasználói felület nyomógombokból és egy 2*16-os (BC1602A) LCD-kijelzőből áll. 6. – Szoftver rendszerterv A szoftver inicializáló rutinnal indul, amely során a változók deklarálása (byte- és word-arrayben tárolt szenzorazonosítók, a hőmérsékleti adatokat tartalmazó munkaváltozó és naplózási változók, byte és word formájú inkrementált számlálók, string változó az LCD kimenethez), megszakítások teljes kikapcsolása, a portok beállítása és a kezdőértékek beállítása történik. Szintén az inicializáló rutin során a DS18B20 szenzorok 64 bites ROM azonosító

kódjának beolvasása folyik (tárolás a sensor[i] arrayben), a szenzorokat egyenként kell csatlakoztatni. A program főciklusa alatt inkrementálódik a „k” naplózási számláló, törli az LCD-kijelzőt, majd szenzoronként egy-egy ciklus indul (FOR ciklus), mialatt az azonosítók kiküldése (Match ROM parancs, majd azonosító), egy Convert T parancs kiküldése, hőmérséklet lekérdezése és kezelése történik, a konvertálás és a lekérdezés között az adatlap alapján 750 ms delay van. Ezt követi a 2000 programciklusonként aktiválódó naplózási rutin, amely a naplo[i] arrayben tárolja a hőmérsékleti adatokat a következőképpen: wordben tárol egy hőmérsékleti értéket, egy naplózási ciklus alatt a szenzorok az inicializáláskor történt behelyezésének sorrendjében egymás után négy értéket tárol. Ha a tároló túlcsordulna, a naplózást előlről kezdi Ezután történik a beavatkozás, amely során ha a szenzorpár (1-2 és 3-4)

közötti hőmérsékletkülönbség eléri a beállított értéket, a relét kapcsolja, illetve 3 fok C hiszterézisen keresztül lekapcsolja. Az 1-es gomb lenyomásakor belép a soron következő RS-232 ciklusba, amely a fentebb említett módon kommunikál a PC-vel. A 2-es és a 3-as gombok segítségével lehet a küszöbértéket állítani a főciklusban. Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 5. oldal 3. ábra – szoftver folyamatábra Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 6. oldal 7.– Felhasználói leírás Az eszköz feladata kétkörös napkollektoros rendszer vezérlése. Az eszköz tartalmaz egy központi egységet és négy külön csatlakoztatható szenzort. A készülék

beüzemeléséhez rögzítse a szenzorokat a napkollektorok kimenő és bemenő csövéhez úgy, hogy megfelelő hőátadás legyen a szenzor és a cső között. Az eszköz 9-12 V egyenfeszültséget igényel a működéshez, amit a készüléken jelölt polaritással kell csatlakoztatni. A tápfeszültség csatlakoztatása után az LCD kijelzőn a „Kerem a szenzort: 1” szöveg jelenik meg, ekkor csatlakoztassa az egyik bemenő csőhöz csatlakoztatott szenzort, majd nyomja meg egymás után az 1-es, majd a 2-es nyomógombot. Ha a kijelzőn nem jelenik meg a „Kerem a szenzort: 2” szöveg, ismételje meg a gombok lenyomását. Ezután húzza ki a szenzort, és csatlakoztassa a 2-es szenzort (azonos körhöz tartozó kimeneti csövön elhelyezett szenzor), majd ismét nyomja meg egymás után az 1es, majd a 2-es nyomógombot. A másik kollektorkör szenzoraival (3-as és 4-es szenzor) hasonlóképpen járjon el. Ezután a rendszer automatikusan működésbe lép Működés

során a kijelzőn a szenzorok által mért hőmérséklet látható a csatlakoztatás sorrendjében (1, 2, 3, 4). Az 1-es gomb hosszú lenyomására kommunikációs módba lép a rendszer, így terminál segítségével letöltheti a naplózott hőmérsékleti értékeket, illetve vezérelheti a kimeneti reléket. A terminálban használható parancsok: $EA parancsra a rendszer elküldi a naplózási adatokat, $CD parancsra pedig a kimenet állítása lehetséges $(kimenet állapota)(kimenet száma) alakban, pl. 2-es relé kikapcsolása (0 állapot): $02. Ne használja a kommunikációs üzemmódot a szükségesnél hosszabb ideig, mert a rendszer ezalatt felfüggeszti a hőmérséklet mérését és a kimenetek kezelését. Ha a rendszer meghibásodik, kommunikációs módban hagyva az eszközt tartós kézi vezérlésre is van mód. Normál üzemmódban a 2-es és a 3-as gomb segítségével állíthatja a küszöbhőmérsékletet (alapesetben 10 K). Mikrokontrollerek

alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 7. oldal 8.- Bemérési tapasztalatok A hardware részen nem tapasztaltam hibát, a tápfeszültség külső forrásból stabilizált és diódával fordított polaritás ellen védett 5 V-os tápáramkörön keresztül érkezett, a szenzorokat DIP-8 foglalatban helyeztem el. A szoftver két nagy hibát tartalmaz: az RS-232 módban a számítógépről érkező adatra nem válaszol, valamint a szenzorok hőmérsékletadatait nem olvassa be (értelmetlen konstans értéket olvas be). Az LCD kijelző, a nyomógombok, és a szenzorazonosítók kezelése jól működik, a relé kezelése is megoldott. A hardver egy kimenettel bővíthető (harmadik kör vezérlése), valamint tetszőleges mennyiségű szenzor csatlakoztatható a rendszerhez. Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly

Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 8. oldal Mellékletek . 4. ábra – PCB terv egyoldalas NYÁK-hoz, méretarány: 1:1 Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 9. oldal 5. ábra – kapcsolási rajz Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 10. oldal KERÁMIA KONDI C1 C2 Alkatrészlista 22pf 22pf ELKO C3 C4 C5 C6 10uF 10uF 10uF 10uF DIÓDA D1 D2 D3 1N4148 1N4148 1N4148 CSATLAKOZÓ J1 DB9 (female) POTENCIOMÉTER P1 10k TRANZISZTOR Q1 Q2 Q3 BC182 BC182 BC182 Ellenállás (0,25 W, tolerancia 10 %-ig) R1 R2 R3 R4 R5 R6 R7 R8 4k7 4k7 4k7 4k7 1k 1k 1k 1k RELÉ Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 –

Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 11. oldal RLY1, 2, 3 5 V-os relé, a kapcsolt oldal tulajdonságai a vezérelt eszközöktől függ KAPCSOLÓ SW1 SW2 SW3 Tasztatúra nyomógomb Tasztatúra nyomógomb Tasztatúra nyomógomb IC U1 U2 U3 U4 U5 U6 DS18B20 DS18B20 DS18B20 DS18B20 PIC16F877 MAX232 Dallas 1-Wire digitális hőszenzor Dallas 1-Wire digitális hőszenzor Dallas 1-Wire digitális hőszenzor Dallas 1-Wire digitális hőszenzor PIC16F877 mikrovezérlő (DIP-40) sorosport-illesztő (DIP-14) KVARC X1 20 MHz Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 12. oldal A program forráskódja //Napkollektor vezérlőrendszere //Firmware a PIC16F877 mikrovezérlőbe //Készítette: Laza György Károly (2008) //Mikrokontrollerek alkalmazástechnikája

HF //Fordító: mikroPascal 8.001 program SolarHeater16F877; uses DS1820; var i, j, l wait k read : byte; : boolean; : word; : byte; sensor sensread delta temp hofok naplo : array[35] of byte; //Szenzorok azonosítói : array[8] of byte; //Szenzorok adatai (T) : byte; //Kapcsolási küszöbök : array[5] of word; : array[5] of byte; : array[90] of byte; //Naplózás - naplo, mert a //log-tól falnak megy a fordító : string[5]; lcd begin INTCON := $00; ADCON1:=7; //Megszakítások kilőve //I/O konfig a megfelelő portra Lcd config(PORTB,7,6,5,4,PORTD,5,6,7); //LCD kijelző inicializálása delta:=10; //Küszöb megadása (kezdőérték) k:=1; l:=1; //Naplózási számlálók TRISA:=0xFF; PORTA:=0; TRISC.0:=0; TRISC.1:=0; TRISC.2:=0; PORTC:=0; //Nyomógombok portját bemenetre //Reléket kimenetre állítani //Kezdőérték a PORTC-re Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros

rendszerének vezérlése mikrovezérlővel 13. oldal For i:=1 to 4 do begin ByteToStr(i, lcd); //4 szenzor miatt 4 ciklus //(Inicializáló rutin) //Az LCD függvény csak stringet //tud kiírni Lcd Out(1,1, Kerem a szenzort:); Lcd Out(2,7, lcd); For j:=1 to 2 do begin repeat //Figyeljük a PORTÁst (^ ^) until TestBit(PORTA, j) = 0; //Nála van a nyomógomb repeat until TestBit(PORTA, j) = 1; //Azért van 2*, mert a Delay end; //parancs nagyon eszi a //wordöket, így viszont delay //nélkül is pergésmentes. Ow Reset(PORTA, 0); //A szenzorok azonosításához Ow Write(PORTA, 0, $33); //szükséges egyenként kiolvasni //az egyedi azonosítót. For j := 1 to 8 do //Az azonosítók beolvasása begin sensor[8 * i - 8 + j]:=Ow Read(PORTA, 0); end; end; While TRUE do begin k:=k+1; //Végtelen ciklus, főprogi //Naplózási számláló ink. Lcd Cmd(Lcd Clear); For i := 1 to 4 do begin //Hőmérséklet beolvasása Ow Reset(PORTA, 0); Ow Write(PORTA, 0, $55); //ROM parancs:

Match ROM For j:=1 to 8 do //Szenzor kiválasztása begin Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 14. oldal Ow Write(PORTA, 0, sensor[8 * i - 8 + j]); end; Ow Write(PORTA, 0, $44); //Convert T parancs Delay ms(750); Ow Reset(PORTA, 0); //Reset jel küldése Ow Write(PORTA, 0, $55); For j:=1 to 8 do //Szenzor kiválasztása begin Ow Write(PORTA, 0, sensor[8 * i - 8 + j]); end; Ow Write(PORTA, 0, $BE); sensread[i]:=Ow Read(PORTA, 0); temp[i]:=Ow Read(PORTA, 0); //Hőfok lekérdezése //2 Byte olvasása temp[i]:= temp[i] shl 8; //Hőmérséklet egy wordben temp[i]:= temp[i] + sensread[i]; If k=2000 then //2000 ciklusonként naplóz begin //Max. 22 ciklus fér el naplo[4 * l - 4 + i]:=temp[i]; if l=22 then l:=0; //Utána előlről kezdi l:=l+1; naplo[89]:=l; if i=4 then k:=1; end; DS18B20 TempToString(temp[i], lcd, ,); (* hofok[i]:=temp[i]; If

((hofok[i] and 0x8000) > 0) then begin lcd[0] := -; hofok[i] := (not temp[i]) + 1; end; hofok[i] := hofok[i] shr 4; If (hofok[i] div 100) then lcd[0] := hofok[i] div 100 + 48; lcd[1] :=(hofok[i] div 10) mod 10 + 48; lcd[2] := hofok[i] mod 10 + 48; *) Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 15. oldal Lcd Out(1,4 * i - 3, lcd); end; //Kiírni az LCD-re a //Hőmérsékletet If hofok[2]-hofok[1] > delta then PORTC.1:=1; //Relék kezelése If hofok[2]-hofok[1] < delta - 3 then PORTC.1:=0; //Hiszterézis If hofok[4]-hofok[3] > delta then PORTC.2:=1; //Ezt meg at kell nezni If hofok[4]-hofok[3] < delta - 3 then PORTC.2:=0; If PORTA.1=0 then //Interrupt nélkül is begin //megy, csak rá kell Lcd cmd(Lcd Clear); //ülni a kapcsolóra ^ ^ Lcd Out(1,4, RS 232 mod); //1-es gombra RS232 mód Lcd Out(2,5, Kilep: 2); while PORTA.2=1 do

begin Usart Init(4800); If Usart Data Ready() = 1 then begin read := Usart Read; If read=$EA then //rEAd log parancs begin For i:=1 to 89 do //Küldjük a log-ot begin Usart Write(naplo[i]); end; end else If read=$CD then //CommanD parancs If Usart Data Ready() = 1 then begin read:=Usart Read; //Relékapcsolgatás If read=$11 then PORTC.1:=1; If read=$12 then PORTC.2:=1; If read=$13 then PORTC.3:=1; If read=$01 then PORTC.1:=0; If read=$02 then PORTC.2:=0; If read=$03 then PORTC.3:=0; end; end; end; end; If PORTA.3=0 then //3-as gombra növeli a Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 16. oldal begin //kapcsolási küszöböt delta:=delta+1; Lcd cmd(Lcd Clear); Lcd Out(1,1, Kapcsolasi kuszob:); ByteToStr(delta, lcd); lcd Out(2,8,lcd); end; If PORTA.2=0 then //1-es gombra csökkenti a begin //kapcsolási küszöböt delta:=delta-1; Lcd cmd(Lcd

Clear); Lcd Out(1,1, Kapcsolasi kuszob:); ByteToStr(delta, lcd); lcd Out(2,8,lcd); end; Delay ms(1000); end; end. //Itt a vége, működj végre unit DS1820; // D. Rosseel // Original: 26-12-2008 // Latest update: 31-12-2008 { This unit provides the necessary basic routines to read the DS1820 digital temperature value} { interface function DS1820 StartTempConversion(var Port : byte; Bit : byte; Wait: boolean): boolean; // Starts the temperature conversion of a DS1820 connected to Port "Port"."Bit" // If "Wait" is true, the function waits for 750 ms, the maximum conversion time. // Returns true if success. function DS1820 ReadTemperature(var Port : byte; Bit : byte): integer; // Reads the temperature out of the DS1820 connected to Port "Port"."Bit" function DS1820 StartTempConversionROM(var Port : byte; Bit : byte; Wait: boolean; var RomCode: array[8] of byte): boolean; Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza

György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 17. oldal // Starts the temperature conversion of the DS1820 connected to Port "Port"."Bit", which has ROM code "RomCode" // If "Wait" is true, the function waits for 750 ms, the maximum conversion time. // Returns true if success. function DS1820 ReadTemperatureROM(var Port : byte; Bit : byte; var RomCode: array[8] of byte): integer; // Reads the temperature out of the DS1820 connected to Port "Port"."Bit", which has ROM code "RomCode" function DS1820 CheckCRC: byte; // Returns 0 if the result of the last call of "DS1820 ReadTemp" gives a correct CRC. procedure DS1820 ReadROM(var Port : byte; Bit : byte; var RomCode: array[8] of byte); // Returns the ROM code of the single DS1820 device connected to Port "Port"."Bit" in array "RomCode" // Caution: only one

DS1820 device should be connected to the one wire bus "Port"."Bit" function DS1820 CheckCRCRomCode(var RomCode: array[8] of byte): byte; // Returns 0 if the romcode in "RomCode" gives a correct CRC function DS1820 TempToString(Temp: integer; var S: string[5]; Sep: char); // Returns temperature "temp", read from an DS1820, as string in S // "Sep" is the decimal separation character procedure DS18B20 TempToString(Temp: integer; var S: string[5]; Sep: Char); // Returns temperature "temp", read from an DS18B20, as string in S // The resolution of the result is still 0.5 degree Celcius (1 digit after the decimal point). } // The resolution the DS18B20 is put in does not matter. // "Sep" is the decimal separation character uses StrngUtils; implementation var DS1820Buffer: array[9] of byte; function DS1820 StartTempConversion(var Port : byte; Bit : byte; Wait: boolean): boolean; begin Result := Ow Reset(Port , Bit ) =

0; // onewire reset signal Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 18. oldal Ow Write(Port , Bit , $CC); Ow Write(Port , Bit , $44); if Wait then Delay ms(750); end; // issue SKIP ROM command to DS1820 // issue CONVERT T command to DS1820 // Wait for conversion completed if asked for function DS1820 ReadTemperature(var Port : byte; Bit : byte): integer; var I: byte; begin Ow Reset(Port , Bit ); // onewire reset signal Ow Write(Port , Bit , $CC); // issue SKIP ROM command to DS1820 Ow Write(Port , Bit , $BE); // issue READ SCRATCHPAD command to DS1820 for I := 0 to 8 do DS1820Buffer[I] := Ow Read(Port , Bit ); // get DS1820 result (9 bytes) Result := DS1820Buffer[0] + ( DS1820Buffer[1] shl 8); end; function DS1820 StartTempConversionROM(var Port : byte; Bit : byte; Wait: boolean; var RomCode: array[8] of byte): boolean; var I: byte;

begin Result := Ow Reset(Port , Bit ) = 0; // onewire reset signal Ow Write(Port , Bit , $55); // issue MATCH ROM command to DS1820 for I := 0 to 7 do Ow Write(Port , Bit , RomCode[I]); // write Rom code Ow Write(Port , Bit , $44); // issue CONVERT T command to DS1820 if Wait then Delay ms(750); // Wait for conversion completed if asked for end; function DS1820 ReadTemperatureROM(var Port : byte; Bit : byte; var RomCode: array[8] of byte): integer; var I: byte; begin Ow Reset(Port , Bit ); // onewire reset signal Ow Write(Port , Bit , $55); // issue MATCH ROM command to DS1820 for I := 0 to 7 do Ow Write(Port , Bit , RomCode[I]); // write Rom code Ow Write(Port , Bit , $BE); // issue READ SCRATCHPAD command to DS1820 for I := 0 to 8 do DS1820Buffer[I] := Ow Read(Port , Bit ); // get DS1820 result (9 bytes) Result := DS1820Buffer[0] + ( DS1820Buffer[1] shl 8); end; Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter

Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 19. oldal procedure DS1820 ReadROM(var Port : byte; Bit : byte; var RomCode: array[8] of byte); var I: byte; begin Ow Reset(Port , Bit ); // onewire reset signal Ow Write(Port , Bit , $33); // read Rom for I := 0 to 7 do RomCode[I] := Ow Read(Port , Bit ); end; function DS1820 CheckCRC: byte; var I, J: byte; TmpBit: boolean; begin Result := 0; // temporary CRC for I := 0 to 8 do // for each byte begin for J := 0 to 7 do // for each bit begin TmpBit := ((Result.0 > 0) <> ( DS1820Buffer[I]J > 0)); // exclusive OR (see above) Result := Result shr 1; // Shift right the temporary CRC byte if TmpBit then Result := Result xor $8c; // If set, account for EXOR feedback end; end; end; above) function DS1820 CheckCRCRomCode(var RomCode: array[8] of byte): byte; var I, J: byte; TmpBit: boolean; begin Result := 0; // temporary CRC for I := 0 to 7 do // for each byte begin for J := 0 to 7 do // for each bit

begin TmpBit := ((Result.0 > 0) <> (RomCode[I]J > 0)); // exclusive OR (see feedback Result := Result shr 1; // Shift right the temporary CRC byte if TmpBit then Result := Result xor $8c; // If set, account for EXOR end; end; end; procedure DS1820 TempToString(Temp: integer; var S: string[5]; Sep: Char); Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 20. oldal var Frac: Char; Minus: boolean; I: byte; begin Minus := false; if Temp < 0 then begin Minus := true; // remember that it was negative Temp := -Temp; // negative value, make it positive end; Frac := 0; if Temp.0 then Frac := 5; Temp := Temp shr 1; // get integer part ByteToStr(Lo(Temp), S); TrimLeft(S); if Minus then strAppendPre(-,S); I := 0; while S[I] > 0 do Inc(I); S[I] := Sep; S[I+1] := Frac; S[I+2] := 0; end; procedure DS18B20 TempToString(Temp: integer; var S:

string[5]; Sep: Char); var Frac: Char; Minus: boolean; I: byte; begin Minus := false; if Temp < 0 then begin Minus := true; // remember that it was negative Temp := -Temp; // negative value, make it positive end; Frac := 0; if Temp.3 then Frac := 5; Temp := Temp shr 4; // get integer part ByteToStr(Lo(Temp), S); TrimLeft(S); Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 21. oldal if Minus then strAppendPre(-,S); I := 0; while S[I] > 0 do Inc(I); S[I] := Sep; S[I+1] := Frac; S[I+2] := 0; end; end. {unit} unit StrngUtils; // D. Rosseel // Original: 24-07-2008 // Latest update: 17-10-2008 { ------------------- Interface -----------------------procedure BcdByteToStr(Val: byte; var S: string[2]); // Converts a byte with a BCD value in it to its string representation procedure ByteToHexStr(Val: byte; var S: string[2]); // Converts a byte to its

hexadecimal string representation procedure WordToHexStr(Val: word; var S: string[4]); // Converts a word to its hexadecimal string representation procedure LongintToHexStr(Val: longint; var S: string[8]); // Converts a longint to its hexadecimal string representation procedure TrimLeft(var S: string[255]); // Removes spaces at the beginning of the string procedure TrimRight(var S: string[255]); // Removes spaces at the end of the string procedure Delete(var S: string[255]; Index, Cnt: byte); // Removes "Cnt" characters at position "Index" in strings S (Index begins at 0!) procedure Copy(var Src, Dst: string[255]; Index, Cnt: byte); // Copies "Cnt" characters from "Src" at position "Index" to "Dst" (Index begins at 0!) // Make sure "Dst" can hold at least "Cnt" characters (no check possible!) procedure Insert(var Src, Dst: string[255];Index: byte); // Inserts all characters from "Src" into

"Dst" at position "Index" (Index begins at 0!) // If necessary "Dst" is extended with spaces before the insert operation Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 22. oldal // Make sure "Dst" can hold at least "Length(Src)" + "Length(Dst)" characters (no check possible!) procedure Stuff(var Src, Dst: string[255]; Index: byte); // Replaces the current content of "Dst" at position Index with the content of "Src" // If necessary "Dst" is extended with spaces before the insert operation // Make sure "Dst" can hold at least "Index" + "Length(Src)" characters (no check possible!) procedure PadLeft(Var Str: string[255]; Len: byte); // Makes the length of "Str" "Len" characters by adding spaces at the beginning of

"Str" // Make sure "Src" can hold "Len" characters (no check possible!) // If the length of "Src" was already "Len" or more characters then "Src" is not changed. procedure PadRight(Var Str: string[255]; Len: byte); // Makes the length of "Str" "Len" characters by adding spaces at the end of "Str" // Make sure "Src" can hold "Len" characters (no check possible!) // If the length of "Src" was already "Len" or more characters then "Src" is not changed. } implementation procedure BcdByteToStr(Val: byte; var S: string[2]); begin S[0] := (Val shr 4) + Ord(0); S[1] := (Val and $0F) + Ord(0); S[2] := 0; end; procedure ByteToHexStr(Val: byte; var S: string[2]); var I, Tmp: Byte; begin for I := 0 to 1 do begin if I = 0 then Tmp := Val shr 4 else Tmp := Val and $0F; if Tmp <= 9 then Tmp := Tmp + Ord(0) else Tmp := Tmp + (Ord(A) - 10); S[I] := Tmp; end;

S[2] := 0; // end of string end; Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 23. oldal procedure WordToHexStr(Val: word; var S: string[4]); var Tmp, I: byte; begin for I := 0 to 3 do begin case I of 0: Tmp := Hi(Val) shr 4; 1: Tmp := Hi(Val) and $0F; 2: Tmp := Lo(Val) shr 4; 3: Tmp := Lo(Val) and $0F; end; if Tmp <= 9 then Tmp := Tmp + Ord(0) else Tmp := Tmp + (Ord(A) - 10); S[I] := Tmp; end; S[4] := 0; // end of string end; procedure LongintToHexStr(Val: longint; var S: string[8]); var Tmp, I: byte; begin for I := 0 to 7 do begin case I of 0: Tmp := Highest(Val) shr 4; 1: Tmp := Highest(Val) and $0F; 2: Tmp := higher(Val) shr 4; 3: Tmp := higher(Val) and $0F; 4: Tmp := Hi(Val) shr 4; 5: Tmp := Hi(Val) and $0F; 6: Tmp := Lo(Val) shr 4; 7: Tmp := Lo(Val) and $0F; end; if Tmp <= 9 then Tmp := Tmp + Ord(0) else Tmp := Tmp + (Ord(A) - 10); S[I]

:= Tmp; end; S[8] := 0; // end of string end; procedure TrimLeft(var S: string[255]); var Src, Dst, Eos : ^byte; begin Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 24. oldal Eos := @S; while Eos^ > 0 do Inc(Eos); // find the closing zero Src := @S; while (Src^ = ) do Inc(Src) ; // find the first non space, this is the beginning of the "trimmed" string Dst := @S; // the destination is the beginning of the current string if Src > Dst then begin // move operation while Src <= Eos do begin Dst^:= Src^; inc(Src); inc(Dst); end; end; end; procedure TrimRight(var S: string[255]); var Eos: byte; I: integer; begin Eos := 0; while S[Eos] > 0 do Inc(Eos); // find the closing zero if Eos > 0 then begin I := Eos - 1; while (I >= 0) and (S[I] = ) do dec(I); // find last non space character S[I + 1] := 0 // place closing zero after

it end; end; procedure Delete(var S: string[255]; Index, Cnt: byte); var PDst, PSrc: ^byte; Len: byte; begin Len := 0; while S[Len] > 0 do Inc(Len); // calculate the length of the string if Index >= Len then Exit; // do nothing, index out of range if (Index + Cnt) > Len then Cnt := Len - Index; // correct the "Cnt" if needed PDst := @S + Index; // points to the first character of the to be deleted chars PSrc := PDst + Cnt; // points to the first character after the to be deleted chars while (PSrc^ > 0) do // end of the string is not reached begin PDst^ := PSrc^; // move characters into the "deleted" zone Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 25. oldal Inc(PDst); Inc(PSrc); end; PDst^ := 0; end; // point to next destination // pont to next source // end of string procedure Copy(var Src, Dst: string[255];

Index, Cnt: byte); var PSrc, PDst : ^byte; Len, I: byte; begin Dst[0] := 0; // clear destination Len := 0; while Src[Len] > 0 do Inc(Len); // calculate the length of the "source" if Index >= Len then Exit; // do nothing, index out of range if (Index + Cnt) > Len then Cnt := Len - Index; // correct the "Cnt" if needed PDst := @Dst; // points to the first character in the destination PSrc := @Src + Index; // points to the first to be copied character in the source for I := 1 to Cnt do begin PDst^ := PSrc^; Inc(PDst); Inc(PSrc); end; PDst^ := 0; end; // copy "Cnt" characters // end of string; procedure Insert(var Src, Dst: string[255]; Index: byte); var PDst, PSrc: ^byte; Len, Cnt, I: byte; begin // -- Extend the string if needed -Len := 0; while Dst[Len] > 0 do Inc(Len); // calculate the length of the destination string while Index > Len do begin Dst[Len + 1] := 0; Dst[Len] := ; // destination string is too short, pad with spaces

Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 26. oldal Len := 0; while Dst[Len] > 0 do Inc(Len); // calculate the length of the string end; // -- Make Gap -Cnt := 0; while Src[Cnt] > 0 do Inc(Cnt); // calculate the length of the string into "Cnt" Len := 0; while Dst[Len] > 0 do Inc(Len); // calculate the length of the string in "Len" PSrc := @Dst + Len; // point to the closing "0" character PDst := PSrc + Cnt; // point to Cnt characters after the string for I := 1 to (Len - Index + 1) do // move characters backwards: make the gap begin PDst^ := PSrc^; Dec(PDst); Dec(PSrc); end; // -- Copy Src chars into the gap (or at the end) -PDst := @Dst + Index; // point to first gap position PSrc := @Src; // point to the first character of the source string Len := 0; while Src[Len] > 0 do Inc(Len); // calculate the

length of the string "Src" for I := 1 to Len do begin PDst^ := PSrc^; Inc(PDst); Inc(PSrc); end; // do the copy operation end; procedure Stuff(var Src, Dst: string[255]; Index: byte); var I, Len, Olen: byte; begin OLen := 0; while Dst[OLen] > 0 do Inc(OLen); // Original length of Dst // -- Extend the string if needed -Len := Olen; while Index > Len do // destination string is too short, pad with spaces begin Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 27. oldal Dst[Len + 1] := 0; Dst[Len] := ; Inc(Len); // length is up with one end; // -- Do the replacement -Len := 0; while Src[Len] > 0 do Inc(Len); for I := 0 to (Len - 1) do Dst[I + Index] := Src[I]; // -- Add trailing zero if needed -Len := 0; while Src[Len] > 0 do Inc(Len); if (Index + Len - 1) > Olen then Dst[Index + Len] := 0; end; procedure PadLeft(Var Str:

string[255]; Len: byte); var Ln, I, Dif: byte; PSrc, PDst: ^Byte; begin Ln := 0; While Str[Ln] > 0 do Inc(Ln); // Ln is the length of the string now if Ln >= Len then exit; Dif := Len - Ln; // Move the characters backwards PSrc := @Str + Ln; // point to the closing "0" character PDst := @Str + Len; // point to Dif characters after the string for I := 0 to (Len) do // move (Len + 1) characters backwards: make the gap begin PDst^ := PSrc^; Dec(PDst); Dec(PSrc); end; // Insert spaces at the beginning For I := 0 to (Dif - 1) do Str[I] := ; end; procedure PadRight(Var Str: string[255]; Len: byte); var Ln: byte; begin Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 28. oldal Ln := 0; While Str[Ln] > 0 do Inc(Ln); // Ln is the length of the string now if Ln >= Len then Exit; While (Ln < Len) do begin Str[Ln] := ; // add spaces at

the end of "Strn" Inc(Ln); end; Str[Ln] := 0; // add the closing zero end; end. Mikrokontrollerek alkalmazástechnikája HF 2008/2009/2 – Laza György Károly Konzulens: Csordás Péter Lakóépület napkollektoros rendszerének vezérlése mikrovezérlővel 29. oldal