; NETis kood muutub, vastavalt hetke olukorrale. Korrutamine, jagamine testitud - OK ; Jagamisele vaja veel lisada jäägi väärtuse järgi ümmardamine. ; DEVICE: termomeeter, dünaamiline kuva plaanis keelata ja täpsus 0,1 kraadile viia ; Temperatuuri kuvamine toimub nelja 7 segmendilise LED indikaatoriga, ; vasakult esimene on sõltuvalt temperatuurist kas tühi, ; või näitab negatiivse temperatuuri näidu korral "-" märki ; või kuvab üle 100 kraadiste temperatuuride korral "1" -te (plaanis) ; koma on plaanis ühte kohta fikseerida, mis võimaldab vabastada ühe I/O pinni ; Parempoolsele indikaatorile on planis kuvada 1/10 kraadid mis on leitud ; anduri poolt registreeritud 1/16 kraadide ümmardamisel. ; Autor: picmaniac (picmaniac@rambler.ru) Versioon: 0.2b KUUPÄEV: 15. veebruar 2007 freeware ; Kommentaarid riistvara: versioon PIC16F628A sobivad PIC16F628 andur DS18S20 ; Märkused programm: asutatud keskkond MPASM v5.33 ; Tõlge Rus --> Est : Google kaasabil Tarmo Kõlli LIST P=16F628A #include ; Add the standard header file, MPLAB __CONFIG _CP_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC & _BODEN_OFF & _LVP_OFF & _MCLRE_ON ; radix hex ; --- Konstandid --- ; --- Makrod --- jnz MACRO metka1 ; tingimusega hüpe, btfss STATUS,Z ; kui ei ole 0 goto metka1 endm jz MACRO metka2 ; tingimisi hüpata, btfsc STATUS,Z ; kui 0 goto metka2 endm jnc MACRO metka3 ; tingimisi hüpata, btfss STATUS,C ; kui ei ole üleandmine goto metka3 endm jc MACRO metka4 ; tingimisi hüpata, btfsc STATUS,C ; kui üleandmine goto metka4 endm mov MACRO DEST1,SOURCE1 ; liigutamine registrist-registrisse movf SOURCE1,W movwf DEST1 endm mvi MACRO DEST2,CONST2 ; ülekande konstantide puhul movlw CONST2 movwf DEST2 endm ;************************************************ ; Double Precision Multiplication ; ; n_2 : n_1 * n_4 : n_3 -> q_4:q_3:q_2:q_1 ; ; Standard shift and add. ; Execution time: 215 to 295 clock cycles. ; Code space: 22 locations ; ; Cleaned up and corrected version from Microchip Ap note by BF. ; Note: Ap note has errors! Additional mods by Scott Dattalo. ; ;********************************************************* mpy16b16: macro local m1, m2 clrf q_4 clrf q_3 clrf q_2 clrf q_1 bsf q_2, 7 m1: rrf n_2, f rrf n_1, f skpc goto m2 movf n_3, w addwf q_3, f movf n_4, w skpnc incfsz n_4, w addwf q_4, f m2: rrf q_4, f rrf q_3, f rrf q_2, f rrf q_1, f skpc goto m1 endm ; --- --- REGISTRITE KIRJELDUS W_copy EQU 020h ; Nendes registrites ST_copy EQU 021h ; salvestatud kontekstis FSR_copy EQU 022h ADDRESS EQU 023h ; ladustamiseks lahtri aadress, millega täpsustatakse staatuse LED SELECTOR EQU 024h ; koodi valiku lähedased (st heakskiidu süüdatakse) TH EQU 025h ; Temperatuur - kõrge byte TL EQU 026h ; Temperatuur - madal byte COUREM EQU 02Fh ; Counter remain CRCPIC EQU 027h ; kontrollsumma, mis arvutatakse mikrokontroller TRY EQU 028h ; 1-Wire lugemise katsed COUNTER EQU 029h ; Counter (kasutatakse andmete edastamiseks 1-Wire) FIGX000 EQU 02Ah ; Cell ladustamistingimused FIG000X EQU 02Bh ; discharges FIG00X0 EQU 02Ch ; binary-decimal digits FIG0X00 EQU 02Dh ; kuvatakse indikaator OUTA EQU 02Eh ; ladustamiseks latch port states TEMP1 EQU 03Ch ; Cells for temporary TEMP2 EQU 03Dh ; Storage FLAGS EQU 03Fh ; Kasutaja lipud q_1 EQU 030h ; korrutamise tulemus 4 baiti q_2 EQU 031h q_3 EQU 032h q_4 EQU 033h n_1 EQU 034h ; esimene korrutatav 2 baiti n_2 EQU 035h n_3 EQU 036h ; teine korrutatav 2 baiti n_4 EQU 037h AARGB0 EQU 040h ; Jägatav arv 3 baiti AARGB1 EQU 041h AARGB2 EQU 042h BARGB0 EQU 043h ; Jägaja 2 baiti BARGB1 EQU 044h LOOPCOUNT EQU 045h REMB0 EQU 046h REMB1 EQU 047h ; --- START --- ORG 0 ; reset vektor Reset bcf STATUS,RP0 ; pöörduda panga 0 bcf STATUS,RP1 goto Begin ; minna ümber ja hook rutiin ;------------------------------------------------- ------------------------------------------------- ; Katkestada käitleja --- --- ;------------------------------------------------- ------------------------------------------------- ORG 4 ; Vector Katkestada Interrupt movwf W_copy ; Save kontekstis mov ST_copy,STATUS mov FSR_copy, FSR movlw B'00010000' ; "mask päästa state bit 4 andwf OUTA,F ; nullime bittid, et juhtida LEDe (PORTA) movf OUTA,W ; süütame movwf PORTA ; indikaator movf SELECTOR,W ; Valmistatakse süttimise praegune iorwf OUTA,F ; taseme näitaja movf ADDRESS,W ; aadress raku nõutud andmed antud samm movwf FSR ; rekordi FSR (kaudne tegelemine) movf INDF,W ; Andmete ülekandmisel cellis kindlaksmääratud aadressil W movwf PORTB ; ja väljaandmise kaudu PORTB segmenteeritud näitaja movf OUTA,W ; süttib praeguse movwf PORTA ; taseme näitaja bcf STATUS,C rrf SELECTOR,F ; Lisaks hargnevate, arv samme ja võrdsustada tee (a, b) btfss STATUS,C ; näitaja oli viimane selle tsükli vahele üleandmine (1) goto Int_label ; arv pole veel lõplik, üleminek (2a) / NOP (1b) movlw FIGX000 ; uuesti siseneb lahtri aadress (1b) movwf ADDRESS ; lahtri aadress - hakkas järgmiseks tsükliks (1b) movlw B'00001000' ; taas valmis (1b) movwf SELECTOR ; sõlmimise esialgne joonis (1b) goto End_int ; (2b) tee b: 1b +1 B +1 B +1 b +1 B +2 b = 7 sammu Int_label incf ADDRESS,F ; Järgmisel katkestada toob järgmisel bait (1) nop nop goto End_int ; (2) teele: 2a 1 1 1 2 = 7 sammu End_int bcf INTCON, T0IF ; Reset lipu katkestada taotluse taimer TMR0 mov FSR, FSR_copy mov STATUS, ST_copy ; taastab kontekstis swapf W_copy,F ; Seal on petta hoida Z natuke OLEK swapf W_copy,W ; (movf see võib muutuda, ja swapf - ei) retfie ; callback käitleja millega natuke GIE ;------------------------------------------------- ------------------------------------------------- ; --- --- SUB ;------------------------------------------------- ------------------------------------------------- ; Sub-dekodeerimine 7-segment. Indikaator DC7 clrwdt clrf PCLATH addwf PCL,F ; arvutustabel konverteerimine retlw B'00100100' ; 0 retlw B'11100111' ; 1 retlw B'01001100' ; 2 retlw B'01000101' ; 3 retlw B'10000111' ; 4 retlw B'00010101' ; 5 retlw B'00010100' ; 6 retlw B'01100111' ; 7 retlw B'00000100' ; 8 retlw B'00000101' ; 9 retlw B'00010101' ; punkt ; End dekodeerimine rutiinit 7-segment. Indikaator ;------------------------------------------------- ------------------------------------------------- ; Sub paus (kasutatud lahtrini TEMP1) Pause clrwdt movwf TEMP1 ; pausi kestuse antud arv W (ligikaudu ms) movf TEMP1,F ; test 0 btfsc STATUS,Z ; Kui kestust ei ole võrdne 0, siis Z = 0 ja jätta tagasi return ; Kui kestus on 0, siis kohe tagasi clrw ; Clear W P_label addlw 01h ; Inner Loop W jnz P_label decfsz TEMP1,F ; Outer Loop TEMP1 goto P_label ; clrwdt return ; end alamprogrammi pauside ; ---------------------jagamine----------------------- ;Inputs: ; Dividend - AARGB0:AARGB1:AARGB2 (0 - most significant!) ; Divisor - BARGB0:BARGB1 ;Temporary: ; Counter - LOOPCOUNT ; Remainder- REMB0:REMB1 ;Output: ; Quotient - AARGB0:AARGB1:AARGB2 ; ; Size: 27 ; Max timing: 4+24*(6+6+4+3+5)-1+3+2=584 cycles (with return) ; Min timing: 4+24*(6+6+5+5)-1+3+2=536 cycles (with return) ; ;25-Sep-2000 Original version ;20-Oct-2001 Made the loop one instruction shorter, comments ; review. FXD2416U: CLRF REMB0 CLRF REMB1 MOVLW .24 MOVWF LOOPCOUNT LOOPU2416 RLF AARGB2, W ;shift dividend left to move next bit to remainder RLF AARGB1, F ; RLF AARGB0, F ; RLF REMB1, F ;shift carry (next dividend bit) into remainder RLF REMB0, F RLF AARGB2, F ;finish shifting the dividend and save carry in AARGB2.0, ;since remainder can be 17 bit long in some cases ;(e.g. 0x800000/0xFFFF). This bit will also serve ;as the next result bit. MOVF BARGB1, W ;substract divisor from 16-bit remainder SUBWF REMB1, F ; MOVF BARGB0, W ; BTFSS STATUS, C ; INCFSZ BARGB0, W ; SUBWF REMB0, F ; ;here we also need to take into account the 17th bit of remainder, which ;is in AARGB2.0. If we don't have a borrow after subtracting from lower ;16 bits of remainder, then there is no borrow regardless of 17th bit ;value. But, if we have the borrow, then that will depend on 17th bit ;value. If it is 1, then no final borrow will occur. If it is 0, borrow ;will occur. These values match the borrow flag polarity. SKPNC ;if no borrow after 16 bit subtraction BSF AARGB2, 0 ;then there is no borrow in result. Overwrite ;AARGB2.0 with 1 to indicate no ;borrow. ;if borrow did occur, AARGB2.0 already ;holds the final borrow value (0-borrow, ;1-no borrow) BTFSC AARGB2, 0 ;if no borrow after 17-bit subtraction GOTO UOK46LL ;skip remainder restoration. ADDWF REMB0, F ;restore higher byte of remainder. (w ;contains the value subtracted from it ;previously) MOVF BARGB1, W ;restore lower byte of remainder ADDWF REMB1, F ; UOK46LL DECFSZ LOOPCOUNT, f ;decrement counter GOTO LOOPU2416 ;and repeat the loop if not zero. ; siin oleks ümardamiseks vaja leida jagamise jääk ja kui see ületab 0,5 -t ; siis liita tulemusele 1 RETURN ;------------------------------------------------- ------------------------------------------------- ; Sub ühendus test DS18x20 (kasutatud lahtrini TEMP1) TestDS movlw 038h ; btfss PORTA,4 ; termomeeter ootama ? goto Test4_label ; nr aktiivne - go, go bcf OUTA,4 ; Reset 1-Wire movf OUTA,W movwf PORTA ; reset impulsi (vähemalt 480 mikrosekundit) movlw 050h Test1_label addlw 01h btfss STATUS,Z ; (sel paus tekib 3 korda goto Test1_label ; katkestada TMR0) bsf OUTA,4 movf OUTA,W movwf PORTA ; Reset 1-Wire on tehtud movlw D'239' Test2_label addlw 01h ; Ootame vastust DS18x20 (paus ~ 70 ms) btfss STATUS,Z goto Test2_label clrf TEMP1 movlw D'252' Test3_label btfss PORTA,4 ; Seal on vastus (0)? incf TEMP1,F ; Jah - juurdekasvu TEMP1 addlw 01h ; btfss STATUS,Z goto Test3_label goto Testend_label ; Test4_label addlw 01h ; Paus viimist teed jnz Test4_label movlw 0 Testend_label movlw 075h addlw 01h ; ootamine lõpuks vastus DS18x20 jnz Testend_label+1 movlw 04h ; DS18x20 Kui vastus on õige, siis TEMP1 = 4 xorwf TEMP1,W btfsc STATUS,Z ; TEMP1 = 4 ? movlw 0FFh ; Jah - märk olemasolu (W = 0FFh) Stop_label return ; end alamprogrammi test ;------------------------------------------------- ------------------------------------------------- ; Sub I / O buss 1-Wire (vastuvõtmise küsida W = 0FFh). Kasutatud TEMP1 RW_1Wire movwf TEMP1 ; Esialgsed andmed W movlw 08h ; 8 bitti movwf COUNTER RWLoop bcf INTCON, GIE ; keelata kõik katkestused bcf OUTA,4 ; 0 -> 1-Wire mov PORTA, OUTA btfsc TEMP1,0 bsf OUTA,4 ; Sea kui LSB TEMP1 = 1 mov PORTA, OUTA rrf TEMP1,F ; valmistada järgmine bit movlw 0FDh ; Paus ~ 12 ms RW_1label addlw 01h jnz RW_1label bcf TEMP1,7 ; vastuvõtt samal TEMP1 btfsc PORTA,4 bsf TEMP1,7 movlw D'220' ; aega release line järgija RW_2label addlw 01h jnz RW_2label bsf OUTA,4 ; vabastades siin mov PORTA, OUTA bsf INTCON, GIE ; Luba katkestused decfsz COUNTER,F ; 8 bitti on töödeldeldud? goto RWLoop ; veel - mine movf TEMP1,W ; vastuvõetud bytes arvesse W return ; End sub I / O 1-Wire buss ;------------------------------------------------- ------------------------------------------------- ; Sub Pack CRC. Parameeter W. Kasutatud lahtrini TEMP1, TEMP2 NewCRC clrwdt movwf TEMP2 ; Save W movlw 08h movwf COUNTER ; 8 -> Counter movf TEMP2,W ; Restore väärtus W CRC_label xorwf CRCPIC,W ; Isklyuch.ILI CRCPIC ja W, tulemuseks W movwf TEMP1 ; Kopeeri TEMP1 rrf TEMP1,W ; TEMP1 nihe paremale 1, tulemuseks W, kõige vähem tähtis bitt C movf CRCPIC,W ; CRCPIC -> W (bit ei ole muutunud) btfsc STATUS,0 xorlw 018h ; Kui C = 0, siis see juhendamine ei tee movwf TEMP1 ; tulemuseks TEMP1 rrf TEMP1,W ; taas vahetustega tulemuseks W movwf CRCPIC ; Save tulemuseks CRCPIC bcf STATUS,0 ; 0 --> C rrf TEMP2,F ; TEMP2 vahetustega õigus 1. movf TEMP2,W ; ja koopia sellest tulenev väärtus W clrwdt decfsz COUNTER,F goto CRC_label return ; alamprogrammi update CRC lõpp ;__________________________________________________________________________________________________ ; ; --- Käivitame PÕHIPROGRAMMI --- ;__________________________________________________________________________________________________ Begin movlw 7 movwf CMCON ; Keela Comparators movf PORTA,F ; joondub movf PORTB,F ; Lukusta pordid clrf INTCON mvi OUTA, B'00010000' ; Kustutame kõik movwf PORTA mvi PORTB, B'11111111' ; LEDs clrwdt clrf TMR0 bsf STATUS, RP0 ; kaebuse 1. pangale juurdepääsu TRIS ja OPTION_REG clrf TRISA ; määrab pin port kui "OOOOOOOO" (I-in, O-out) clrf TRISB ; määrab pin port B "OOOOOOOO" mvi OPTION_REG, B'00000111' ; ühendust esmalt läbida jagaja TMR0 = 256. OSC clrwdt mvi OPTION_REG, B'00001101' ; lülitamine prescaler 32 WDT, TMR0 - taimer bcf STATUS, RP0 ; pöörduda panga 0 mvi ADDRESS, FIGX000 ; kirjutab AADRESS aadress raku esialgse näitaja mvi SELECTOR,B'00001000' ; Ettevalmistus sõlmimise esialgne arvud mvi FIGX000, B'11111111' ; Kuvab : " _OFF " mvi FIG0X00, B'00100100' mvi FIG00X0, B'00011110' mvi FIG000X, B'00011110' bsf INTCON, T0IE ; katkestab ainult TMR0 bsf INTCON, GIE ; Global Katkestada lubamine ;------------------------------------------------ Online_label clrwdt ; töötamine termomeeter DS18x20 clrf TMR0 call TestDS ; reset ja kontrollib termomeetrit xorlw 0FFh jnz Begin ; viga - minge programmi käivitumist movlw 0CCh ; Team "Skip ROM" call RW_1Wire movlw 044h ; käsk "Convert T" call RW_1Wire movlw 0FFh ; ümberkujundamisprotsess call Pause movlw 0FFh call Pause movlw 0FFh call Pause mvi TRY,08h ; 8. katset lugeda Newtry_label clrwdt ; alustada andmete lugemisel DS18x20 clrf TMR0 call TestDS ; reset ja kontrollib termomeeterit xorlw 0FFh jnz Begin ; viga - minge programmi algusesse movlw 0CCh ; Team "Skip ROM" call RW_1Wire movlw 0BEh ; Command "Read Scratchpad" call RW_1Wire clrf CRCPIC movlw 0FFh ; Temperatuurianduri lugemine call RW_1Wire movwf TL ; Temperatuur LSB bait call NewCRC movlw 0FFh call RW_1Wire movwf TH ; Temperatuur MSB bait call NewCRC ; (Kas positiivne või negatiivne) movlw 0FFh ; TH bait (ei kasutata) call RW_1Wire call NewCRC movlw 0FFh ; TL bait (ei kasutata) call RW_1Wire call NewCRC movlw 0FFh ; Reserved call RW_1Wire call NewCRC movlw 0FFh ; Reserved call RW_1Wire call NewCRC movlw 0FFh ; Count_remain bait call RW_1Wire movwf COUREM call NewCRC movlw 0FFh ; Count_per_c bait call RW_1Wire call NewCRC movlw 0FFh ; Kontrollsumma call RW_1Wire xorwf CRCPIC,W ; kontrollime CRC jz OKCRC_label ; korras - üleminek decfsz TRY,F goto Newtry_label ; erineb - järgmine katse goto Begin ; katsed on ammendatud OKCRC_label clrwdt ; need read on DS18S20 jaoks välja kommenteeritud ; rrf TH,F ; rrf TL,F ; rrf TH,F ; rrf TL,F ; rrf TH,F ; rrf TL,F ; 64 | 32 | 16 | 8 | | 4 | 2 | 1 | 0,5 ; Siin toimub kümnendike arvutamine, valem on selline: ; Extended Temperature = (((8 * TempLSB) + 12 - Count_remain)*25)/40 ; siia peab tegema märgi kindlakstegemise. ; baidist TH viimane bitt mov n_1,TL ; korrutamine clrf n_2 ; puhastame pesa n_2 mvi n_3,003h ; korrutamine, praegu 3 pärast 8 clrf n_4 ; n_2 : n_1 * n_4 : n_3 -> q_4:q_3:q_2:q_1 mpy16b16 ; korrutamise makro ; liitmine --------------POOLELI !!!!!!!!!!!!!!!!!!!!!!!!! ; bcf CARRY ; tühjendame lippu ; movlw 00bh ; liidame 12 ; addwf q_1,F ; liidame ; btfsc CARRY ; kas läks üle? ; incf q_2,F ; kui läks siis +1 ; nop ; siit võib üle hüppata ; liitmine läbi --------------------------------------- ; ---------------------jagamine----------------------- ;Inputs: ; Dividend - AARGB0:AARGB1:AARGB2 (0 - most significant!) ; Divisor - BARGB0:BARGB1 ;Temporary: ; Counter - LOOPCOUNT ; Remainder- REMB0:REMB1 ;Output: ; Quotient - AARGB0:AARGB1:AARGB2 mov AARGB2,q_1 ; jagatav mov AARGB1,q_2 mov AARGB0,q_3 mvi BARGB1,003h ; jagaja praegu 3 , pärast 40 clrf BARGB0 ; puhastame pesa call FXD2416U ; VAJA - ümardamiseks leida jagamise jääk !!!! ; ----------jagamine läbi ---------------- ; mov TL,q_1 ; suuname temperatuuri tagasi mov TL,AARGB2 ; suuname temperatuuri tagasi ; -------------------------- movlw 0FFh movwf FIGX000 ; süütame kõik arvud movwf FIG0X00 movwf FIG00X0 movwf FIG000X ;------------------------------------------------ btfss TH,0 ; temperatuur on negatiivne? goto T100_label ; Ei - mine valikutesse "Üle / Alla 100 mvi FIGX000, B'11011111' ; Jah - kuvatakse "-" kõrgemas järgus comf TL,F ; transformatsioon õigeks incf TL,F ; negatiivse temperatuuri näidu kuvamiseks goto Tshow_label ; Transition ;------------------------------------------------ T100_label bcf STATUS,C rrf TL,W ; W = <0> | 64 | 32 | 16 | | 8 | 4 | 2 | 1 addlw D'156' jnc Tshow_label ; Kui temperatuur on alla 100 kraadi - üleminek movlw D'200' ; subwf TL,F ; T ei ole väiksem kui 100 kraadi - lahuta sada mvi FIG0X00, B'11100111' ; kuva "1" teisel indikatoril. ;------------------------------------------------ Tshow_label bcf STATUS,C rrf TL,W ;W = <0> | 64 | 32 | 16 | | 8 | 4 | 2 | 1 movwf TEMP2 Divide bcf INTCON, GIE clrf FIG00X0 movf TEMP2,W ; Divide TEMP2 10 - kümmend numbrite saamiseks movwf TEMP1 ; Kirjutab dividend TEMR1 TL poolest W bsf STATUS,C ; luua märk üleandmine Div_label movf TEMP1,W movwf FIG000X ; täitub ametiaeg TEMP W tasakaal incf FIG00X0,F ; , iiga läbimine muudab registrit 1 võrra movlw D'10' ;10 -> W siseneb alagrupi W subwf TEMP1,F ; (TEMP1 - W) -> TEMP1 ja lahutama selle dividend jc Div_label ; Kui TEMR1 ei ole veel muutunud <0, siis lahutada uuesti, jne decf FIG00X0,F movlw B'11100111' xorwf FIG0X00,W ; on sajalised ? jnz High_label ; Ei - mine movf FIG00X0,W ; Jah - kuva kümnendikud call DC7 movwf FIG00X0 movf FIG000X,W call DC7 movwf FIG000X goto Finish_label ;------------------------------------------------ High_label movf FIG00X0,W ; Kuva kümmnendikud call DC7 movwf FIG0X00 movf FIG000X,W call DC7 movwf FIG00X0 bcf FIG00X0,2 ; Kuva punkt mvi FIG000X, B'00100100' ; on LSB vaikimisi "0" movlw B'00010101' btfsc TL,0 movwf FIG000X ; Kui seatud bitt "0,5 C" - "5" Finish_label bsf INTCON, GIE goto Online_label end