1 |
//********************************************************************** |
1 |
//********************************************************************** |
2 |
// LCT-METER/PULSER |
2 |
// LCT-METER/PULSER |
3 |
//********************************************************************** |
3 |
//********************************************************************** |
4 |
// (c) OK1XGL 2004 |
4 |
// (c) OK1XGL 2004 |
5 |
// verze 1.00 - uvodni verze 10.1.2004 |
5 |
// verze 1.00 - uvodni verze 10.1.2004 |
6 |
// verze 1.01 - pridano ukladani vlastni Cp/Lp do pameti EEPROM |
6 |
// verze 1.01 - pridano ukladani vlastni Cp/Lp do pameti EEPROM |
7 |
// - pridano ukladani stavu (mod, parametry modu ) do pameti EEROM |
7 |
// - pridano ukladani stavu (mod, parametry modu ) do pameti EEROM |
8 |
// |
8 |
// |
9 |
// |
9 |
// |
10 |
// Popis funkcnosti: |
10 |
// Popis funkcnosti: |
11 |
// ----------------- |
11 |
// ----------------- |
12 |
// Meri kapacitu, indukcnost, teplotu a jako doplnek obsahuje generator impulzu. |
12 |
// Meri kapacitu, indukcnost, teplotu a jako doplnek obsahuje generator impulzu. |
13 |
// Jednotlive druhy mereni se prepinaji stiskem tlacitka MODE. Stiskem tlacitka NUL lze |
13 |
// Jednotlive druhy mereni se prepinaji stiskem tlacitka MODE. Stiskem tlacitka NUL lze |
14 |
// vynulovat mereni (odecteni vlivu mericich privodu, u mereni teploty odecteni napr. pro mereni otepleni). |
14 |
// vynulovat mereni (odecteni vlivu mericich privodu, u mereni teploty odecteni napr. pro mereni otepleni). |
15 |
// |
15 |
// |
16 |
// Mereni L a C: |
16 |
// Mereni L a C: |
17 |
// ------------- |
17 |
// ------------- |
18 |
// Mereni se provadi merenim kmitoctu mericiho oscilatoru. Neznama Lx se pripojuje do serie s vnitrni L oscilatoru. |
18 |
// Mereni se provadi merenim kmitoctu mericiho oscilatoru. Neznama Lx se pripojuje do serie s vnitrni L oscilatoru. |
19 |
// Neznama Cx se pripojuje paralelne k vnitrni C oscilatoru. Vypocet nezname Cx/Lx se provadi pomoci nasledujicich vzorcu: |
19 |
// Neznama Cx se pripojuje paralelne k vnitrni C oscilatoru. Vypocet nezname Cx/Lx se provadi pomoci nasledujicich vzorcu: |
20 |
// Cx=((f1^2/f2^2)-1)*C Lx=((f1^2/F2^2)-1)*L |
20 |
// Cx=((f1^2/f2^2)-1)*C Lx=((f1^2/F2^2)-1)*L |
21 |
// Pripadne se od vysledku odecte hodnota Cv nebo Lv, ktera se ziska stisknutim NUL |
21 |
// Pripadne se od vysledku odecte hodnota Cv nebo Lv, ktera se ziska stisknutim NUL |
22 |
// f1 - kmitocet mericiho oscilatoru, ke kteremu neni pripojena zadna Lx nebo Cx, ziska se pri kalibraci |
22 |
// f1 - kmitocet mericiho oscilatoru, ke kteremu neni pripojena zadna Lx nebo Cx, ziska se pri kalibraci |
23 |
// f2 - kmitocet mericiho oscilatoru s pripojenou neznamou Lx nebo Cx |
23 |
// f2 - kmitocet mericiho oscilatoru s pripojenou neznamou Lx nebo Cx |
24 |
// C - kapacita vnitrniho C oscilatoru, ziska se pri kalibraci |
24 |
// C - kapacita vnitrniho C oscilatoru, ziska se pri kalibraci |
25 |
// L - indukcnost vnitrni L oscilatoru, ziska se kalibraci |
25 |
// L - indukcnost vnitrni L oscilatoru, ziska se kalibraci |
26 |
// |
26 |
// |
27 |
// Kalibrace: |
27 |
// Kalibrace: |
28 |
// ---------- |
28 |
// ---------- |
29 |
// Provadi se pri zapnuti pristroje a probiha takto: |
29 |
// Provadi se pri zapnuti pristroje a probiha takto: |
30 |
// Zmeri se kmitocet mericiho oscilatoru f1 ,ke kteremu neni pripojena zadna Lx nebo Cx. |
30 |
// Zmeri se kmitocet mericiho oscilatoru f1 ,ke kteremu neni pripojena zadna Lx nebo Cx. |
31 |
// Pripoji se kalibracni kondenzator Ck o zname hodnote, mel by byt co nejpresnejsi a nejstabilnejsi. |
31 |
// Pripoji se kalibracni kondenzator Ck o zname hodnote, mel by byt co nejpresnejsi a nejstabilnejsi. |
32 |
// Zmeri se kmitocet mericiho oscilatoru f2. |
32 |
// Zmeri se kmitocet mericiho oscilatoru f2. |
33 |
// Vypoctou se hodnoty L a C podle vzorcu: |
33 |
// Vypoctou se hodnoty L a C podle vzorcu: |
34 |
// C=(Ck*F2^2)/(F1^2-F2^2) L=(1/(4*PI^2*F1^2*C) |
34 |
// C=(Ck*F2^2)/(F1^2-F2^2) L=(1/(4*PI^2*F1^2*C) |
35 |
// Odpoji se kalibracni kondenzator Ck a pristroj je pripraven k mereni L a C |
35 |
// Odpoji se kalibracni kondenzator Ck a pristroj je pripraven k mereni L a C |
36 |
// |
36 |
// |
37 |
// |
37 |
// |
38 |
// Mereni teploty: |
38 |
// Mereni teploty: |
39 |
// --------------- |
39 |
// --------------- |
40 |
// Kladna merici svorka je pripojena primo na vstup procesoru. Pro mereni teploty se pouziva teplomer |
40 |
// Kladna merici svorka je pripojena primo na vstup procesoru. Pro mereni teploty se pouziva teplomer |
41 |
// fy Dallas DS18B20, se kterym se komunikajue po I2C sbernici. |
41 |
// fy Dallas DS18B20, se kterym se komunikajue po I2C sbernici. |
42 |
// |
42 |
// |
43 |
// |
43 |
// |
44 |
// Generovani pulzu: |
44 |
// Generovani pulzu: |
45 |
// ----------------- |
45 |
// ----------------- |
46 |
// Kladna merici svorka je pripojena primo na vstup procesoru. Jsou generovany kladne pulzy se zvolenou sirkou. |
46 |
// Kladna merici svorka je pripojena primo na vstup procesoru. Jsou generovany kladne pulzy se zvolenou sirkou. |
47 |
// Nulove pulzy maji stejnou sirku, tedy perioda je dvojnasobek sirky pulzu. |
47 |
// Nulove pulzy maji stejnou sirku, tedy perioda je dvojnasobek sirky pulzu. |
48 |
// |
48 |
// |
49 |
// |
49 |
// |
50 |
// |
50 |
// |
51 |
// Poznamky k implementaci: |
51 |
// Poznamky k implementaci: |
52 |
// ------------------------ |
52 |
// ------------------------ |
53 |
// |
53 |
// |
54 |
// 1) mereni L a C |
54 |
// 1) mereni L a C |
55 |
// ---------------- |
55 |
// ---------------- |
56 |
// Zakladem je mereni kmitoctu. Presnost mereni byla zvolena na 4Hz, tedy merici perioda bude 250ms. Pro citani impulzu je |
56 |
// Zakladem je mereni kmitoctu. Presnost mereni byla zvolena na 4Hz, tedy merici perioda bude 250ms. Pro citani impulzu je |
57 |
// pouzit 16 bitovy citac TMR1, ktery je rozsiren o dalsich 8 bitu promennou counter_H. Pretecenim TMR1 se v preruseni zvysi |
57 |
// pouzit 16 bitovy citac TMR1, ktery je rozsiren o dalsich 8 bitu promennou counter_H. Pretecenim TMR1 se v preruseni zvysi |
58 |
// hodnota counter_H o jednicku. Merici periodu odmeruje 8 bitovy citac TMR0, kteremu je predrazen preddelic :256. Cita |
58 |
// hodnota counter_H o jednicku. Merici periodu odmeruje 8 bitovy citac TMR0, kteremu je predrazen preddelic :256. Cita |
59 |
// takty procesoru. TMR0 pretece kazdych 50ms. Promenna sampler_H obsahuje pocet potrebnych 50ms jednotek pro dosazeni |
59 |
// takty procesoru. TMR0 pretece kazdych 50ms. Promenna sampler_H obsahuje pocet potrebnych 50ms jednotek pro dosazeni |
60 |
// pozadovaneho casu. Prommena sampler_H se dekrementuje v preruseni. Po uplynuti merici periody (250ms) se zastavi citani |
60 |
// pozadovaneho casu. Prommena sampler_H se dekrementuje v preruseni. Po uplynuti merici periody (250ms) se zastavi citani |
61 |
// TMR1, ktery spolu s hodnotou v counter_H bude obsahovat mereny kmitocet s presnosti 4Hz. |
61 |
// TMR1, ktery spolu s hodnotou v counter_H bude obsahovat mereny kmitocet s presnosti 4Hz. |
62 |
// Promenou freq_done se oznami ukonceni mereni kmitoctu. Hodnota v TMR1 a counter_H se prevede na realne cislo, ktere se |
62 |
// Promenou freq_done se oznami ukonceni mereni kmitoctu. Hodnota v TMR1 a counter_H se prevede na realne cislo, ktere se |
63 |
// dale pouzije pro vypocty. |
63 |
// dale pouzije pro vypocty. |
64 |
// |
64 |
// |
65 |
// 2) mereni teploty |
65 |
// 2) mereni teploty |
66 |
// ----------------- |
66 |
// ----------------- |
67 |
// Vyuziva se teplomeru fy Dallas DS18B20, ktery komunikuje po I2C sbernici. Pro tento mod se sepne rele, ktere pripoji |
67 |
// Vyuziva se teplomeru fy Dallas DS18B20, ktery komunikuje po I2C sbernici. Pro tento mod se sepne rele, ktere pripoji |
68 |
// kalibracni kondenzator Ck. Tim dojde k pripojeni svorek na vstup portu pro teplomer. Mereni teploty probiha tak, ze se |
68 |
// kalibracni kondenzator Ck. Tim dojde k pripojeni svorek na vstup portu pro teplomer. Mereni teploty probiha tak, ze se |
69 |
// vysle prikaz do teplomeru aby zmeril teplotu a po uplynuti potrebne doby konverze se z teplomeru precte zmerena teplota a |
69 |
// vysle prikaz do teplomeru aby zmeril teplotu a po uplynuti potrebne doby konverze se z teplomeru precte zmerena teplota a |
70 |
// zobrazi se. Pro odmereni doby konverze se vyuziva mereni frekvence, ktere trva 250ms. |
70 |
// zobrazi se. Pro odmereni doby konverze se vyuziva mereni frekvence, ktere trva 250ms. |
71 |
// |
71 |
// |
72 |
// 3) Generovani pulzu |
72 |
// 3) Generovani pulzu |
73 |
// ------------------- |
73 |
// ------------------- |
74 |
// Pro tento mod se sepne rele, ktere pripoji kalibracni kondenzator Ck. Tim dojde k pripojeni svorek na vystup portu |
74 |
// Pro tento mod se sepne rele, ktere pripoji kalibracni kondenzator Ck. Tim dojde k pripojeni svorek na vystup portu |
75 |
// pro pulser. Pro generovani pulzu je vyuzivana jednotka PWM1 pro pulzy do sirky 1ms a pro pulzy delsi pak jednotka CCP1. |
75 |
// pro pulser. Pro generovani pulzu je vyuzivana jednotka PWM1 pro pulzy do sirky 1ms a pro pulzy delsi pak jednotka CCP1. |
76 |
// Generovani pulzu PWM1 jednotkou je zcela autonomni, jednotce se nastavi perioda (dvojnasobek sirky pulzu) a sirka pulzu |
76 |
// Generovani pulzu PWM1 jednotkou je zcela autonomni, jednotce se nastavi perioda (dvojnasobek sirky pulzu) a sirka pulzu |
77 |
// a generovani probiha mez zasahu programu. Jednotka CCP1 generuje periodicke preruseni po dobe urcene sirkou pulzu. |
77 |
// a generovani probiha mez zasahu programu. Jednotka CCP1 generuje periodicke preruseni po dobe urcene sirkou pulzu. |
78 |
// Vlastni impulz je generovan v preruseni, kde se periodicky strida nastaveni portu do log.1 a do log.0 |
78 |
// Vlastni impulz je generovan v preruseni, kde se periodicky strida nastaveni portu do log.1 a do log.0 |
79 |
// |
79 |
// |
80 |
// 4) Cteni tlacitek |
80 |
// 4) Cteni tlacitek |
81 |
// ----------------- |
81 |
// ----------------- |
82 |
// Pro cteni tlacitek je vyuzivano preruseni od zmeny na portu B. Pri zmene stavu nektereho z tlacitek toto preruseni |
82 |
// Pro cteni tlacitek je vyuzivano preruseni od zmeny na portu B. Pri zmene stavu nektereho z tlacitek toto preruseni |
83 |
// nastavi promenou freq_done. Na miste v programu, kde se testuje tato promenna se precte stav tlacitek a podle |
83 |
// nastavi promenou freq_done. Na miste v programu, kde se testuje tato promenna se precte stav tlacitek a podle |
84 |
// jejich stavu se dal pokracuje. |
84 |
// jejich stavu se dal pokracuje. |
85 |
// |
85 |
// |
86 |
// 5) Zakladni smycky programu |
86 |
// 5) Zakladni smycky programu |
87 |
// --------------------------- |
87 |
// --------------------------- |
88 |
// Hlavni smycka programu je koncipovana jako stavovy automat, kdy jednotlive stavy predstavuji jednotlive mody mereni. |
88 |
// Hlavni smycka programu je koncipovana jako stavovy automat, kdy jednotlive stavy predstavuji jednotlive mody mereni. |
89 |
// V jednotlivych stavech se volaji hlavni funkce jednotlivych modu mereni. Tyto funkce jsou koncipovany jako stavove |
89 |
// V jednotlivych stavech se volaji hlavni funkce jednotlivych modu mereni. Tyto funkce jsou koncipovany jako stavove |
90 |
// automaty, ktere provedou podle potreby uvodni akci a dale sleduji stav promenne freq_done. Na zaklade tohoto stavu |
90 |
// automaty, ktere provedou podle potreby uvodni akci a dale sleduji stav promenne freq_done. Na zaklade tohoto stavu |
91 |
// pokracuji dale nebo prechazeji do stavu jineho. freq_done ma tyto stavy: |
91 |
// pokracuji dale nebo prechazeji do stavu jineho. freq_done ma tyto stavy: |
92 |
// F_PEACE -klidovy stav |
92 |
// F_PEACE -klidovy stav |
93 |
// F_DONE- mereni kmitoctu dokonceno |
93 |
// F_DONE- mereni kmitoctu dokonceno |
94 |
// F_KEY- mereni kmitoctu preruseno stiskem nejakeho tlacitka. |
94 |
// F_KEY- mereni kmitoctu preruseno stiskem nejakeho tlacitka. |
95 |
// Stav F_DONE je vyuzivan v modu mereni Lx a Cx a dale v modu mereni teploty se vyuziva k odmerovani casu. |
95 |
// Stav F_DONE je vyuzivan v modu mereni Lx a Cx a dale v modu mereni teploty se vyuziva k odmerovani casu. |
96 |
// Pri stavu F_KEY se precte stav tlacitek a pri stisku tlacitka MODE se opousti hlavni funkce aktivniho modu mereni a |
96 |
// Pri stavu F_KEY se precte stav tlacitek a pri stisku tlacitka MODE se opousti hlavni funkce aktivniho modu mereni a |
97 |
// prechazi se zpet se do hlavni smycky programu. V hlavni smycce programu se nasledne prejde do nasledujiciho modu mereni. |
97 |
// prechazi se zpet se do hlavni smycky programu. V hlavni smycce programu se nasledne prejde do nasledujiciho modu mereni. |
98 |
// Pri stisku tlacitka NUL se provede pozadavana akce, a zustava se v danem modu mereni. |
98 |
// Pri stisku tlacitka NUL se provede pozadavana akce, a zustava se v danem modu mereni. |
99 |
|
99 |
|
100 |
|
100 |
|
101 |
|
101 |
|
102 |
#include <16f876.h> |
102 |
#include <16f876.h> |
103 |
#include <16F877_reg.h> |
103 |
#include <16F877_reg.h> |
104 |
#include "lc.h" |
104 |
#include "lc.h" |
105 |
#include <lcd.c> |
105 |
#include <lcd.c> |
106 |
#include <tm.c> |
106 |
#include <tm.c> |
107 |
#include <math.h> |
107 |
#include <math.h> |
108 |
|
108 |
|
109 |
//#define FREQ // jen mereni frekvence mericiho oscilatoru, urceno pro jeho kalibraci |
109 |
//#define FREQ // jen mereni frekvence mericiho oscilatoru, urceno pro jeho kalibraci |
110 |
// pripojime citac na vystup mericiho oscilatoru a musi ukazovat totez co je na displeji, pokud tomu tak neni, |
110 |
// pripojime citac na vystup mericiho oscilatoru a musi ukazovat totez co je na displeji, pokud tomu tak neni, |
111 |
// napravu provedeme zmenou konstanty CORIG v lc.h pripadne zmenou kondenzatoru u oscilatoru procesoru |
111 |
// napravu provedeme zmenou konstanty CORIG v lc.h pripadne zmenou kondenzatoru u oscilatoru procesoru |
112 |
|
112 |
|
113 |
/*****************************************************/ |
113 |
/*****************************************************/ |
114 |
/************* PRERUSOVACI RUTINY ********************/ |
114 |
/************* PRERUSOVACI RUTINY ********************/ |
115 |
/*****************************************************/ |
115 |
/*****************************************************/ |
116 |
|
116 |
|
117 |
#USE FAST_IO(A) |
117 |
#USE FAST_IO(A) |
118 |
#USE FAST_IO(B) |
118 |
#USE FAST_IO(B) |
119 |
#USE FAST_IO(C) |
119 |
#USE FAST_IO(C) |
120 |
|
120 |
|
121 |
// prerusovaci rutina spolecna pro vsechny preruseni, napsana v assembleru, protoze cecko to dela neefektivne |
121 |
// prerusovaci rutina spolecna pro vsechny preruseni, napsana v assembleru, protoze cecko to dela neefektivne |
122 |
#int_GLOBAL |
122 |
#int_GLOBAL |
123 |
void int_handler() |
123 |
void int_handler() |
124 |
{ |
124 |
{ |
125 |
// uloz W, STATUS a PCLATH |
125 |
// uloz W, STATUS a PCLATH |
126 |
#asm |
126 |
#asm |
127 |
movwf W_TMP |
127 |
movwf W_TMP |
128 |
swapf STATUS,W |
128 |
swapf STATUS,W |
129 |
clrf STATUS |
129 |
clrf STATUS |
130 |
movwf F_TMP |
130 |
movwf F_TMP |
131 |
movf PCLATH,W |
131 |
movf PCLATH,W |
132 |
movwf PCLATH_TMP |
132 |
movwf PCLATH_TMP |
133 |
clrf PCLATH |
133 |
clrf PCLATH |
134 |
|
134 |
|
135 |
btfss PIR1,_TMR1IF |
135 |
btfss PIR1,_TMR1IF |
136 |
goto NO_T1_L |
136 |
goto NO_T1_L |
137 |
// preruseni od timeru1 |
137 |
// preruseni od timeru1 |
138 |
incf counter_h,F // +1 na nejvyssim radu citace impulzu |
138 |
incf counter_h,F // +1 na nejvyssim radu citace impulzu |
139 |
bcf PIR1,_TMR1IF // nuluj priznak preruseni |
139 |
bcf PIR1,_TMR1IF // nuluj priznak preruseni |
140 |
// pokracujeme hned testem preruseni od timeru0 (odmeruje periodu mereni) |
140 |
// pokracujeme hned testem preruseni od timeru0 (odmeruje periodu mereni) |
141 |
NO_T1_L: |
141 |
NO_T1_L: |
142 |
btfss INTCON,_T0IF |
142 |
btfss INTCON,_T0IF |
143 |
goto NO_T0_L // na dalsi druhy preruseni |
143 |
goto NO_T0_L // na dalsi druhy preruseni |
144 |
// preruseni od timeru 0 |
144 |
// preruseni od timeru 0 |
145 |
bcf INTCON,_T0IF // nuluj priznak preruseni |
145 |
bcf INTCON,_T0IF // nuluj priznak preruseni |
146 |
movlw CORIG // pridane spozdeni, aby byl odmereny cas timerem 0 presne |
146 |
movlw CORIG // pridane spozdeni, aby byl odmereny cas timerem 0 presne |
147 |
movwf INT_TMP |
147 |
movwf INT_TMP |
148 |
LOOP: |
148 |
LOOP: |
149 |
decfsz INT_TMP,F |
149 |
decfsz INT_TMP,F |
150 |
goto LOOP |
150 |
goto LOOP |
151 |
nop |
151 |
nop |
152 |
movlw TIME_1S_L // znovu natahni timer0 |
152 |
movlw TIME_1S_L // znovu natahni timer0 |
153 |
movwf TMR0 |
153 |
movwf TMR0 |
154 |
decf sampler_H,F // -1 na citaci opakovani zakladni periody timeru0 |
154 |
decf sampler_H,F // -1 na citaci opakovani zakladni periody timeru0 |
155 |
btfss STATUS,_Z // perioda mereni vyprsela? |
155 |
btfss STATUS,_Z // perioda mereni vyprsela? |
156 |
goto END_INT_L // koncime,abychom nezdrzovali dalsimi zdroji preruseni na nich jiz casove nezalezi |
156 |
goto END_INT_L // koncime,abychom nezdrzovali dalsimi zdroji preruseni na nich jiz casove nezalezi |
157 |
nop |
157 |
nop |
158 |
nop |
158 |
nop |
159 |
nop |
159 |
nop |
160 |
nop |
160 |
nop |
161 |
bcf T1CON,_TMR1ON // zastav citani impulzu |
161 |
bcf T1CON,_TMR1ON // zastav citani impulzu |
162 |
movlw F_DONE |
162 |
movlw F_DONE |
163 |
movwf freq_done // priznak ukonceni citani - mereni OK |
163 |
movwf freq_done // priznak ukonceni citani - mereni OK |
164 |
bcf INTCON,_T0IE // zakaz preruseni od timeru0 |
164 |
bcf INTCON,_T0IE // zakaz preruseni od timeru0 |
165 |
goto END_INT_L // koncime,abychom nezdrzovali dalsimi zdroji preruseni na nich jiz casove nezalezi |
165 |
goto END_INT_L // koncime,abychom nezdrzovali dalsimi zdroji preruseni na nich jiz casove nezalezi |
166 |
|
166 |
|
167 |
NO_T0_L: |
167 |
NO_T0_L: |
168 |
btfss INTCON,_RBIF |
168 |
btfss INTCON,_RBIF |
169 |
goto NO_RB_L |
169 |
goto NO_RB_L |
170 |
// preruseni od tlacitek na brane B |
170 |
// preruseni od tlacitek na brane B |
171 |
movf PORTB,W |
171 |
movf PORTB,W |
172 |
movlw F_KEY |
172 |
movlw F_KEY |
173 |
movwf freq_done // nastav priznak , ze mereni frekvence nedopadlo dobre (stisknuto nektere z tlacitek) |
173 |
movwf freq_done // nastav priznak , ze mereni frekvence nedopadlo dobre (stisknuto nektere z tlacitek) |
174 |
bcf INTCON,_RBIF |
174 |
bcf INTCON,_RBIF |
175 |
goto END_INT_L |
175 |
goto END_INT_L |
176 |
|
176 |
|
177 |
NO_RB_L: |
177 |
NO_RB_L: |
178 |
btfss PIR1,_CCP1IF |
178 |
btfss PIR1,_CCP1IF |
179 |
goto END_INT_L |
179 |
goto END_INT_L |
180 |
// preruseni od komparacni jednotky, pouziva se pouze v rezimu pulser pro generovani pulzu od 1ms vyse |
180 |
// preruseni od komparacni jednotky, pouziva se pouze v rezimu pulser pro generovani pulzu od 1ms vyse |
181 |
// nasledujici konstrukce zajistuje pro 1 i 0 nastaveni pinu ve stejny okamzik, doba do bodu B je tez stejna |
181 |
// nasledujici konstrukce zajistuje pro 1 i 0 nastaveni pinu ve stejny okamzik, doba do bodu B je tez stejna |
182 |
btfss INT_TMP,0 |
182 |
btfss INT_TMP,0 |
183 |
goto A |
183 |
goto A |
184 |
btfsc INT_TMP,0 |
184 |
btfsc INT_TMP,0 |
185 |
bcf PORTC,2 |
185 |
bcf PORTC,2 |
186 |
goto B |
186 |
goto B |
187 |
A: |
187 |
A: |
188 |
bsf PORTC,2 |
188 |
bsf PORTC,2 |
189 |
goto B |
189 |
goto B |
190 |
B: |
190 |
B: |
191 |
comf INT_TMP,F // priste budeme nastavovat opacnou hodnotu |
191 |
comf INT_TMP,F // priste budeme nastavovat opacnou hodnotu |
192 |
bcf PIR1,_CCP1IF // nuluj priznak preruseni od CCP1 jednotky |
192 |
bcf PIR1,_CCP1IF // nuluj priznak preruseni od CCP1 jednotky |
193 |
|
193 |
|
194 |
END_INT_L: |
194 |
END_INT_L: |
195 |
// obnov W, STATUS a PCLATH |
195 |
// obnov W, STATUS a PCLATH |
196 |
movf PCLATH_TMP,W |
196 |
movf PCLATH_TMP,W |
197 |
movwf PCLATH |
197 |
movwf PCLATH |
198 |
swapf F_TMP,W |
198 |
swapf F_TMP,W |
199 |
movwf STATUS |
199 |
movwf STATUS |
200 |
swapf W_TMP,F |
200 |
swapf W_TMP,F |
201 |
swapf W_TMP,W |
201 |
swapf W_TMP,W |
202 |
#endasm |
202 |
#endasm |
203 |
} // int_handler |
203 |
} // int_handler |
204 |
|
204 |
|
205 |
|
205 |
|
206 |
|
206 |
|
207 |
|
207 |
|
208 |
|
208 |
|
209 |
|
209 |
|
210 |
/**************************************************/ |
210 |
/**************************************************/ |
211 |
/*********** FUNKCE MERENI KMITOCTU ***************/ |
211 |
/*********** FUNKCE MERENI KMITOCTU ***************/ |
212 |
/**************************************************/ |
212 |
/**************************************************/ |
213 |
// zahajeni mereni frekvence |
213 |
// zahajeni mereni frekvence |
214 |
// |
214 |
// |
215 |
void start_freq() |
215 |
void start_freq() |
216 |
{ |
216 |
{ |
217 |
#asm |
217 |
#asm |
218 |
bcf T1CON,_TMR1ON // zastav citac TMR1 |
218 |
bcf T1CON,_TMR1ON // zastav citac TMR1 |
219 |
clrf TMR1L // nuluj citac TMR1, ktery cita vstupni implulzy |
219 |
clrf TMR1L // nuluj citac TMR1, ktery cita vstupni implulzy |
220 |
clrf TMR1H |
220 |
clrf TMR1H |
221 |
clrf counter_H |
221 |
clrf counter_H |
222 |
movlw F_PEACE |
222 |
movlw F_PEACE |
223 |
movwf freq_done // nuluj priznak dokonceni mereni frekvence |
223 |
movwf freq_done // nuluj priznak dokonceni mereni frekvence |
224 |
bsf T1CON,_TMR1ON // spust citac TMR1 |
224 |
bsf T1CON,_TMR1ON // spust citac TMR1 |
225 |
movlw TIME_1S_L // natahni casovac TMR0, ktery meri periodu mereni |
225 |
movlw TIME_1S_L // natahni casovac TMR0, ktery meri periodu mereni |
226 |
movwf TMR0 |
226 |
movwf TMR0 |
227 |
movlw TIME_1S_H |
227 |
movlw TIME_1S_H |
228 |
movwf sampler_H |
228 |
movwf sampler_H |
229 |
bcf INTCON,_T0IF // nuluj priznak preruseni od timeru0 |
229 |
bcf INTCON,_T0IF // nuluj priznak preruseni od timeru0 |
230 |
bsf INTCON,_T0IE // povol preruseni od timeru0 |
230 |
bsf INTCON,_T0IE // povol preruseni od timeru0 |
231 |
#endasm |
231 |
#endasm |
232 |
} // start_freq |
232 |
} // start_freq |
233 |
|
233 |
|
234 |
|
234 |
|
235 |
// zmereni frekvence a jeji umocneni |
235 |
// zmereni frekvence a jeji umocneni |
236 |
// |
236 |
// |
237 |
float mfreq_sqr() |
237 |
float mfreq_sqr() |
238 |
{ |
238 |
{ |
239 |
float f; |
239 |
float f; |
240 |
|
240 |
|
241 |
start_freq(); // odstartuj mereni frekvence |
241 |
start_freq(); // odstartuj mereni frekvence |
242 |
while(freq_done==F_PEACE); // cekej na dokonceni zmereni frekvence |
242 |
while(freq_done==F_PEACE); // cekej na dokonceni zmereni frekvence |
243 |
f=F_CORRECT*(float)make32(counter_H,get_timer1()); // preved zmerenou frekvennci na float |
243 |
f=F_CORRECT*(float)make32(counter_H,get_timer1()); // preved zmerenou frekvennci na float |
244 |
#ifdef FREQ |
244 |
#ifdef FREQ |
245 |
return(f); // pro mereni frekvence vracej frekvenci |
245 |
return(f); // pro mereni frekvence vracej frekvenci |
246 |
#else |
246 |
#else |
247 |
return(f*f); // vrat kvadrat |
247 |
return(f*f); // vrat kvadrat |
248 |
#endif |
248 |
#endif |
249 |
} // mfreq_sqr |
249 |
} // mfreq_sqr |
250 |
|
250 |
|
251 |
|
251 |
|
252 |
|
252 |
|
253 |
|
253 |
|
254 |
|
254 |
|
255 |
/*******************************************************************/ |
255 |
/*******************************************************************/ |
256 |
/*********** FUNKCE PRO PREPINANI TYPU MERENI (rele) ***************/ |
256 |
/*********** FUNKCE PRO PREPINANI TYPU MERENI (rele) ***************/ |
257 |
/*******************************************************************/ |
257 |
/*******************************************************************/ |
258 |
// prepne rele na mod mereni C |
258 |
// prepne rele na mod mereni C |
259 |
// |
259 |
// |
260 |
rele_measure_C() |
260 |
rele_measure_C() |
261 |
{ |
261 |
{ |
262 |
output_high(RE1_B); |
262 |
output_high(RE1_B); |
263 |
output_high(RE2_B); |
263 |
output_high(RE2_B); |
264 |
delay_ms(RELE_PULSE); |
264 |
delay_ms(RELE_PULSE); |
265 |
output_low(RE1_B); |
265 |
output_low(RE1_B); |
266 |
output_low(RE2_B); |
266 |
output_low(RE2_B); |
267 |
} // rele_measure_C |
267 |
} // rele_measure_C |
268 |
|
268 |
|
269 |
|
269 |
|
270 |
// prepne rele na mod mereni L |
270 |
// prepne rele na mod mereni L |
271 |
// |
271 |
// |
272 |
rele_measure_L() |
272 |
rele_measure_L() |
273 |
{ |
273 |
{ |
274 |
output_high(RE1_A); |
274 |
output_high(RE1_A); |
275 |
output_high(RE2_B); |
275 |
output_high(RE2_B); |
276 |
delay_ms(RELE_PULSE); |
276 |
delay_ms(RELE_PULSE); |
277 |
output_low(RE1_A); |
277 |
output_low(RE1_A); |
278 |
output_low(RE2_B); |
278 |
output_low(RE2_B); |
279 |
} // rele_measure_L |
279 |
} // rele_measure_L |
280 |
|
280 |
|
281 |
|
281 |
|
282 |
// prepne rele na kalibraci a tez na mody mereni teploty a pulser |
282 |
// prepne rele na kalibraci a tez na mody mereni teploty a pulser |
283 |
// |
283 |
// |
284 |
rele_calib() |
284 |
rele_calib() |
285 |
{ |
285 |
{ |
286 |
output_high(RE1_B); |
286 |
output_high(RE1_B); |
287 |
output_high(RE2_A); |
287 |
output_high(RE2_A); |
288 |
delay_ms(RELE_PULSE); |
288 |
delay_ms(RELE_PULSE); |
289 |
output_low(RE1_B); |
289 |
output_low(RE1_B); |
290 |
output_low(RE2_A); |
290 |
output_low(RE2_A); |
291 |
} // rele_calib |
291 |
} // rele_calib |
292 |
|
292 |
|
293 |
|
293 |
|
294 |
|
294 |
|
295 |
|
295 |
|
296 |
|
296 |
|
297 |
/*******************************************************************/ |
297 |
/*******************************************************************/ |
298 |
/*********** POMOCNE FUNKCE JEDNOTLIVYCH MODU MERENI ***************/ |
298 |
/*********** POMOCNE FUNKCE JEDNOTLIVYCH MODU MERENI ***************/ |
299 |
/*******************************************************************/ |
299 |
/*******************************************************************/ |
300 |
// vraci cislo radu (0=1E0, 1=1E3 2=1E6 atd.) a upravi parametr aby byl do 999.999 |
300 |
// vraci cislo radu (0=1E0, 1=1E3 2=1E6 atd.) a upravi parametr aby byl do 999.999 |
301 |
// |
301 |
// |
302 |
int8 range(float &Xv) |
302 |
int8 range(float &Xv) |
303 |
{ |
303 |
{ |
304 |
int8 ret_val; |
304 |
int8 ret_val; |
305 |
|
305 |
|
306 |
ret_val=0; |
306 |
ret_val=0; |
307 |
while(fabs(Xv)>1E3) |
307 |
while(fabs(Xv)>1E3) |
308 |
{ |
308 |
{ |
309 |
Xv=Xv*1E-3; |
309 |
Xv=Xv*1E-3; |
310 |
ret_val++; |
310 |
ret_val++; |
311 |
} |
311 |
} |
312 |
return(ret_val); |
312 |
return(ret_val); |
313 |
} // range |
313 |
} // range |
314 |
|
314 |
|
315 |
|
315 |
|
316 |
// vraci pocet celych cislic realneho argumentu |
316 |
// vraci pocet celych cislic realneho argumentu |
317 |
// |
317 |
// |
318 |
int8 num_int_digit(float X) |
318 |
int8 num_int_digit(float X) |
319 |
{ |
319 |
{ |
320 |
int8 ret_val; |
320 |
int8 ret_val; |
321 |
|
321 |
|
322 |
ret_val=1; |
322 |
ret_val=1; |
323 |
while(fabs(X)>1E1) |
323 |
while(fabs(X)>1E1) |
324 |
{ |
324 |
{ |
325 |
X=X*1E-1; |
325 |
X=X*1E-1; |
326 |
ret_val++; |
326 |
ret_val++; |
327 |
} |
327 |
} |
328 |
return(ret_val); |
328 |
return(ret_val); |
329 |
} // num_int_digit |
329 |
} // num_int_digit |
330 |
|
330 |
|
331 |
|
331 |
|
332 |
// smaze 1.radek LCD displeje |
332 |
// smaze 1.radek LCD displeje |
333 |
// |
333 |
// |
334 |
clr_1Line() |
334 |
clr_1Line() |
335 |
{ |
335 |
{ |
336 |
int8 i; |
336 |
int8 i; |
337 |
lcd_gotoxy(1,1); |
337 |
lcd_gotoxy(1,1); |
338 |
for(i=0;i<16;i++) lcd_putc(' '); |
338 |
for(i=0;i<16;i++) lcd_putc(' '); |
339 |
lcd_gotoxy(1,1); |
339 |
lcd_gotoxy(1,1); |
340 |
} |
340 |
} |
341 |
|
341 |
|
342 |
|
342 |
|
343 |
//cekani na uvolneni tlacitek |
343 |
//cekani na uvolneni tlacitek |
344 |
// |
344 |
// |
345 |
wait_release_keys() |
345 |
wait_release_keys() |
346 |
{ |
346 |
{ |
347 |
while(!input(NUL_KEY) || !input(MODE_KEY)) delay_ms(20); // cekej na uvolneni tlacitka |
347 |
while(!input(NUL_KEY) || !input(MODE_KEY)) delay_ms(20); // cekej na uvolneni tlacitka |
348 |
freq_done=F_PEACE; |
348 |
freq_done=F_PEACE; |
349 |
} // wait_release_keys |
349 |
} // wait_release_keys |
350 |
|
350 |
|
351 |
|
351 |
|
352 |
// kalibrace |
352 |
// kalibrace |
353 |
// |
353 |
// |
354 |
void calibration(float &f1_sqr, float &C, float &L) |
354 |
void calibration(float &f1_sqr, float &C, float &L) |
355 |
{ |
355 |
{ |
356 |
float f2_sqr; |
356 |
float f2_sqr; |
357 |
|
357 |
|
358 |
lcd_putc("\f"); |
358 |
lcd_putc("\f"); |
359 |
printf(lcd_putc,CALIB_MSG); |
359 |
printf(lcd_putc,CALIB_MSG); |
360 |
rele_measure_C(); // rele do stavu odpojeni kalibracniho kondenzatoru a oscilator musi bezet |
360 |
rele_measure_C(); // rele do stavu odpojeni kalibracniho kondenzatoru a oscilator musi bezet |
361 |
delay_ms(FREQ_CALM_TIME); // pockej na ustaleni oscilatoru |
361 |
delay_ms(FREQ_CALM_TIME); // pockej na ustaleni oscilatoru |
362 |
// mereni f2 |
362 |
// mereni f2 |
363 |
rele_calib(); // pripni kalibracni kondenzator |
363 |
rele_calib(); // pripni kalibracni kondenzator |
364 |
delay_ms(FREQ_CALM_TIME); // pockej na ustaleni oscilatoru |
364 |
delay_ms(FREQ_CALM_TIME); // pockej na ustaleni oscilatoru |
365 |
f2_sqr=mfreq_sqr(); // zmer kvadrat f2 |
365 |
f2_sqr=mfreq_sqr(); // zmer kvadrat f2 |
366 |
// vypocet C a L |
366 |
// vypocet C a L |
367 |
C=(C_CALIB*f2_sqr)/(f1_sqr-f2_sqr); // C1 v pF |
367 |
C=(C_CALIB*f2_sqr)/(f1_sqr-f2_sqr); // C1 v pF |
368 |
L=1e9/(39.4784176*f1_sqr*C*1e-12); // L1 v nH |
368 |
L=1e9/(39.4784176*f1_sqr*C*1e-12); // L1 v nH |
369 |
/* |
369 |
/* |
370 |
// zobraz zmerene kalibracni hodnoty |
370 |
// zobraz zmerene kalibracni hodnoty |
371 |
lcd_putc("\f"); |
371 |
lcd_putc("\f"); |
372 |
printf(lcd_putc,"C=%3.2f pF",C); |
372 |
printf(lcd_putc,"C=%3.2f pF",C); |
373 |
lcd_gotoxy(1,2); |
373 |
lcd_gotoxy(1,2); |
374 |
printf(lcd_putc,"L=%3.2f nH",L); |
374 |
printf(lcd_putc,"L=%3.2f nH",L); |
375 |
while(input(NUL_KEY)); // cekej na stisk klavesy |
375 |
while(input(NUL_KEY)); // cekej na stisk klavesy |
376 |
lcd_putc("\f"); |
376 |
lcd_putc("\f"); |
377 |
*/ |
377 |
*/ |
378 |
} // calibration |
378 |
} // calibration |
379 |
|
379 |
|
380 |
|
380 |
|
381 |
|
381 |
|
382 |
|
382 |
|
383 |
|
383 |
|
384 |
/******************************************************************/ |
384 |
/******************************************************************/ |
385 |
/*********** HLAVNI FUNKCE JEDNOTLIVYCH TYPU MERENI ***************/ |
385 |
/*********** HLAVNI FUNKCE JEDNOTLIVYCH TYPU MERENI ***************/ |
386 |
/******************************************************************/ |
386 |
/******************************************************************/ |
387 |
// mereni L |
387 |
// mereni L |
388 |
// |
388 |
// |
389 |
#inline |
389 |
#inline |
390 |
void measure_L(float &f1_sqr,float &C,float &L) |
390 |
void measure_L(float &f1_sqr,float &C,float &L) |
391 |
{ |
391 |
{ |
392 |
|
392 |
|
393 |
float f2_sqr; // kvadrat kmitoctu mericiho oscilatoru s pripojenou Lx |
393 |
float f2_sqr; // kvadrat kmitoctu mericiho oscilatoru s pripojenou Lx |
394 |
float X; // zmerena hodnota Lx |
394 |
float X; // zmerena hodnota Lx |
395 |
float Xp; // vlastni Lp (odecita se od vysledku) |
395 |
float Xp; // vlastni Lp (odecita se od vysledku) |
396 |
float Xv; // vysledna hodnota Lx |
396 |
float Xv; // vysledna hodnota Lx |
397 |
int8 prefix; // index do poli urcijici pismenko radu |
397 |
int8 prefix; // index do poli urcijici pismenko radu |
398 |
int8 Xp_p; // pointer na promennou Xp |
398 |
int8 Xp_p; // pointer na promennou Xp |
399 |
int8 ee_adr; // adresovy citac pameti EEROM |
399 |
int8 ee_adr; // adresovy citac pameti EEROM |
400 |
|
400 |
|
401 |
|
401 |
|
402 |
// vyzvedni vlastni indukcnost |
402 |
// vyzvedni vlastni indukcnost |
403 |
ee_adr=LP_ADR_LOW; |
403 |
ee_adr=LP_ADR_LOW; |
404 |
for(Xp_p=&Xp;Xp_p<&Xp+4;Xp_p++) *Xp_p=read_eeprom(ee_adr++); |
404 |
for(Xp_p=&Xp;Xp_p<&Xp+4;Xp_p++) *Xp_p=read_eeprom(ee_adr++); |
405 |
for(;;) |
405 |
for(;;) |
406 |
{ |
406 |
{ |
407 |
f2_sqr=mfreq_sqr(); // zmer kvadrat F2 |
407 |
f2_sqr=mfreq_sqr(); // zmer kvadrat F2 |
408 |
if(freq_done!=F_DONE) // zmerena frekvence neni platna (stisknuto nektere z tlacitek) |
408 |
if(freq_done!=F_DONE) // zmerena frekvence neni platna (stisknuto nektere z tlacitek) |
409 |
{ |
409 |
{ |
410 |
if(!input(MODE_KEY)) break; // stisknuto tlacitko mode, koncime |
410 |
if(!input(MODE_KEY)) break; // stisknuto tlacitko mode, koncime |
411 |
if(!input(NUL_KEY)) |
411 |
if(!input(NUL_KEY)) |
412 |
{ |
412 |
{ |
413 |
// stisknuto tlacitko NULL, poznamenej si vlastni L |
413 |
// stisknuto tlacitko NULL, poznamenej si vlastni L |
414 |
Xp=X; |
414 |
Xp=X; |
415 |
// uloz vlastni indukcnost |
415 |
// uloz vlastni indukcnost |
416 |
ee_adr=LP_ADR_LOW; |
416 |
ee_adr=LP_ADR_LOW; |
417 |
for(Xp_p=&Xp;Xp_p<&Xp+4;Xp_p++) write_eeprom(ee_adr++,*Xp_p); |
417 |
for(Xp_p=&Xp;Xp_p<&Xp+4;Xp_p++) write_eeprom(ee_adr++,*Xp_p); |
418 |
clr_1Line(); |
418 |
clr_1Line(); |
419 |
lcd_gotoxy(9,1); |
419 |
lcd_gotoxy(9,1); |
420 |
printf(lcd_putc,"0 nH"); |
420 |
printf(lcd_putc,"0 nH"); |
421 |
wait_release_keys(); // cekej na uvolneni tlacitka |
421 |
wait_release_keys(); // cekej na uvolneni tlacitka |
422 |
} |
422 |
} |
423 |
} else |
423 |
} else |
424 |
{ |
424 |
{ |
425 |
if(f2_sqr<1E2) // bezi oscilator? (kmitocet pod 10Hz povazujeme za nebezici oscilator) |
425 |
if(f2_sqr<1E2) // bezi oscilator? (kmitocet pod 10Hz povazujeme za nebezici oscilator) |
426 |
{ |
426 |
{ |
427 |
// oscilator NEBEZI |
427 |
// oscilator NEBEZI |
428 |
clr_1Line(); |
428 |
clr_1Line(); |
429 |
printf(lcd_putc,CONNECT_LX_MSG); |
429 |
printf(lcd_putc,CONNECT_LX_MSG); |
430 |
} else |
430 |
} else |
431 |
{ |
431 |
{ |
432 |
// oscilator BEZI |
432 |
// oscilator BEZI |
433 |
X=(f1_sqr/f2_sqr-1)*L; // vypocti hodnotu Lx |
433 |
X=(f1_sqr/f2_sqr-1)*L; // vypocti hodnotu Lx |
434 |
Xv=X-Xp; // odecti vlastni L |
434 |
Xv=X-Xp; // odecti vlastni L |
435 |
// zobraz hodnotu Lx |
435 |
// zobraz hodnotu Lx |
436 |
clr_1Line(); |
436 |
clr_1Line(); |
437 |
prefix=range(Xv); // uprav rozsah a zjisti cislo radu |
437 |
prefix=range(Xv); // uprav rozsah a zjisti cislo radu |
438 |
lcd_gotoxy(6-num_int_digit(Xv),1); // umisti hodnotu tak, aby radova carka zustavala na stejnem miste |
438 |
lcd_gotoxy(6-num_int_digit(Xv),1); // umisti hodnotu tak, aby radova carka zustavala na stejnem miste |
439 |
if(Xv>=0F) lcd_putc(' '); // kladne cislo nema minus, vloz mezeru |
439 |
if(Xv>=0F) lcd_putc(' '); // kladne cislo nema minus, vloz mezeru |
440 |
if(prefix==0) printf(lcd_putc," %3.0f",Xv); // u nH zobrazuj jen cela cisla |
440 |
if(prefix==0) printf(lcd_putc," %3.0f",Xv); // u nH zobrazuj jen cela cisla |
441 |
else printf(lcd_putc,"%6.3f",Xv); // u ostatnich na 3 desetinna mista |
441 |
else printf(lcd_putc,"%6.3f",Xv); // u ostatnich na 3 desetinna mista |
442 |
// zobraz jednotky |
442 |
// zobraz jednotky |
443 |
lcd_gotoxy(12,1); |
443 |
lcd_gotoxy(12,1); |
444 |
lcd_putc(L_PREFIX[prefix]); |
444 |
lcd_putc(L_PREFIX[prefix]); |
445 |
lcd_putc('H'); |
445 |
lcd_putc('H'); |
446 |
} |
446 |
} |
447 |
} |
447 |
} |
448 |
} // od hlavni smycky (for(;;)) |
448 |
} // od hlavni smycky (for(;;)) |
449 |
} // measure_L |
449 |
} // measure_L |
450 |
|
450 |
|
451 |
|
451 |
|
452 |
// mereni C |
452 |
// mereni C |
453 |
// |
453 |
// |
454 |
#inline |
454 |
#inline |
455 |
void measure_C(float &f1_sqr,float &C,float &L) |
455 |
void measure_C(float &f1_sqr,float &C,float &L) |
456 |
{ |
456 |
{ |
457 |
|
457 |
|
458 |
float f2_sqr; // kvadrat kmitoctu mericiho oscilatoru s pripojenou Cx |
458 |
float f2_sqr; // kvadrat kmitoctu mericiho oscilatoru s pripojenou Cx |
459 |
float X; // zmerena hodnota Cx |
459 |
float X; // zmerena hodnota Cx |
460 |
float Xp; // vlastni Cp (odecita se od vysledku) |
460 |
float Xp; // vlastni Cp (odecita se od vysledku) |
461 |
float Xv; // vysledna hodnota Cx |
461 |
float Xv; // vysledna hodnota Cx |
462 |
int8 prefix; // index do poli s pismenky radu |
462 |
int8 prefix; // index do poli s pismenky radu |
463 |
// int8 pom; |
463 |
// int8 pom; |
464 |
int8 Xp_p; // pointer do promenne Xp |
464 |
int8 Xp_p; // pointer do promenne Xp |
465 |
int8 ee_adr; |
465 |
int8 ee_adr; |
466 |
|
466 |
|
467 |
// vyzvedni vlastni kapacitu |
467 |
// vyzvedni vlastni kapacitu |
468 |
ee_adr=CP_ADR_LOW; |
468 |
ee_adr=CP_ADR_LOW; |
469 |
for(Xp_p=&Xp;Xp_p<&Xp+4;Xp_p++) *Xp_p=read_eeprom(ee_adr++); |
469 |
for(Xp_p=&Xp;Xp_p<&Xp+4;Xp_p++) *Xp_p=read_eeprom(ee_adr++); |
470 |
for(;;) |
470 |
for(;;) |
471 |
{ |
471 |
{ |
472 |
f2_sqr=mfreq_sqr(); // zmer F2 |
472 |
f2_sqr=mfreq_sqr(); // zmer F2 |
473 |
if(freq_done!=F_DONE) // zmerena frekvence neni platna (stisknuto nektere z tlacitek) |
473 |
if(freq_done!=F_DONE) // zmerena frekvence neni platna (stisknuto nektere z tlacitek) |
474 |
{ |
474 |
{ |
475 |
if(!input(MODE_KEY)) break; // stisknuto tlacitko mode, koncime |
475 |
if(!input(MODE_KEY)) break; // stisknuto tlacitko mode, koncime |
476 |
if(!input(NUL_KEY)) |
476 |
if(!input(NUL_KEY)) |
477 |
{ |
477 |
{ |
478 |
// stisknuto tlacitko NULL, poznamenej si vlastni Cp |
478 |
// stisknuto tlacitko NULL, poznamenej si vlastni Cp |
479 |
Xp=X; |
479 |
Xp=X; |
480 |
// uloz vlastni kapacitu |
480 |
// uloz vlastni kapacitu |
481 |
ee_adr=CP_ADR_LOW; |
481 |
ee_adr=CP_ADR_LOW; |
482 |
for(Xp_p=&Xp;Xp_p<&Xp+4;Xp_p++) write_eeprom(ee_adr++,*Xp_p); |
482 |
for(Xp_p=&Xp;Xp_p<&Xp+4;Xp_p++) write_eeprom(ee_adr++,*Xp_p); |
483 |
clr_1Line(); |
483 |
clr_1Line(); |
484 |
lcd_gotoxy(6,1); |
484 |
lcd_gotoxy(6,1); |
485 |
printf(lcd_putc,"0.00 pF"); |
485 |
printf(lcd_putc,"0.00 pF"); |
486 |
wait_release_keys(); // cekej na uvolneni tlacitka |
486 |
wait_release_keys(); // cekej na uvolneni tlacitka |
487 |
} |
487 |
} |
488 |
} else |
488 |
} else |
489 |
{ |
489 |
{ |
490 |
if(f2_sqr<1E2) // bezi oscilator? (kmitocet pod 10Hz povazujeme za nebezici oscilator) |
490 |
if(f2_sqr<1E2) // bezi oscilator? (kmitocet pod 10Hz povazujeme za nebezici oscilator) |
491 |
{ |
491 |
{ |
492 |
// oscilator NEBEZI |
492 |
// oscilator NEBEZI |
493 |
clr_1Line(); |
493 |
clr_1Line(); |
494 |
printf(lcd_putc,Error_Cx_MSG); |
494 |
printf(lcd_putc,Error_Cx_MSG); |
495 |
} else |
495 |
} else |
496 |
{ |
496 |
{ |
497 |
// oscilator BEZI |
497 |
// oscilator BEZI |
498 |
X=(f1_sqr/f2_sqr-1)*C; // vypocti hodnotu Cx nebo Lx |
498 |
X=(f1_sqr/f2_sqr-1)*C; // vypocti hodnotu Cx nebo Lx |
499 |
Xv=X-Xp; // odecti vlastni Cp |
499 |
Xv=X-Xp; // odecti vlastni Cp |
500 |
// zobraz hodnotu Cx |
500 |
// zobraz hodnotu Cx |
501 |
clr_1Line(); |
501 |
clr_1Line(); |
502 |
prefix=range(Xv); // uprav rozsah a zjisti cislo radu |
502 |
prefix=range(Xv); // uprav rozsah a zjisti cislo radu |
503 |
lcd_gotoxy(6-num_int_digit(Xv),1); // umisti hodnotu tak, aby radova carka zustavala na stejnem miste |
503 |
lcd_gotoxy(6-num_int_digit(Xv),1); // umisti hodnotu tak, aby radova carka zustavala na stejnem miste |
504 |
if(Xv>=0F) lcd_putc(' '); // kladne cislo nema minus, vloz mezeru |
504 |
if(Xv>=0F) lcd_putc(' '); // kladne cislo nema minus, vloz mezeru |
505 |
if(prefix==0) printf(lcd_putc,"%5.2f",Xv); // u pF zobrazuj na 2 mista |
505 |
if(prefix==0) printf(lcd_putc,"%5.2f",Xv); // u pF zobrazuj na 2 mista |
506 |
else printf(lcd_putc,"%6.3f",Xv); // u ostatnich na 3 mista |
506 |
else printf(lcd_putc,"%6.3f",Xv); // u ostatnich na 3 mista |
507 |
// zobraz jednotky |
507 |
// zobraz jednotky |
508 |
lcd_gotoxy(12,1); |
508 |
lcd_gotoxy(12,1); |
509 |
lcd_putc(C_PREFIX[prefix]); |
509 |
lcd_putc(C_PREFIX[prefix]); |
510 |
lcd_putc('F'); |
510 |
lcd_putc('F'); |
511 |
} |
511 |
} |
512 |
} |
512 |
} |
513 |
} // od hlavni smycky (for(;;)) |
513 |
} // od hlavni smycky (for(;;)) |
514 |
} // measure_C |
514 |
} // measure_C |
515 |
|
515 |
|
516 |
|
516 |
|
517 |
// mereni teploty |
517 |
// mereni teploty |
518 |
// |
518 |
// |
519 |
#separate |
519 |
#separate |
520 |
void measure_T() |
520 |
void measure_T() |
521 |
{ |
521 |
{ |
522 |
int8 record[10]; // bafr pro ulozeni zaznamu z teplomeru |
522 |
int8 record[10]; // bafr pro ulozeni zaznamu z teplomeru |
523 |
int8 i; |
523 |
int8 i; |
524 |
int8 stat; // stavovy automat mereni teploty |
524 |
int8 stat; // stavovy automat mereni teploty |
525 |
int8 wait; // pro odmereni casu prevodu teplomeru |
525 |
int8 wait; // pro odmereni casu prevodu teplomeru |
526 |
int1 delta; // oznamuje, ze merime rozdil teplot |
526 |
int1 delta; // oznamuje, ze merime rozdil teplot |
527 |
float temp; // zmerena teplota |
527 |
float temp; // zmerena teplota |
528 |
float temp_p; // odecitana hodnota teploty pri mereni rozdilu teplot |
528 |
float temp_p; // odecitana hodnota teploty pri mereni rozdilu teplot |
529 |
float temp_v; // vysledna teplota |
529 |
float temp_v; // vysledna teplota |
530 |
|
530 |
|
531 |
stat=T_MEASURE; // zahajime mereni teploty |
531 |
stat=T_MEASURE; // zahajime mereni teploty |
532 |
delta=0; // nemerime teplotni rozdil |
532 |
delta=0; // nemerime teplotni rozdil |
533 |
temp_p=0; // nic od zmerene teploty neodecitame |
533 |
temp_p=0; // nic od zmerene teploty neodecitame |
534 |
|
534 |
|
535 |
for(;;) |
535 |
for(;;) |
536 |
{ |
536 |
{ |
537 |
if(freq_done==F_KEY) // stisknuto nejake tlacitko |
537 |
if(freq_done==F_KEY) // stisknuto nejake tlacitko |
538 |
{ |
538 |
{ |
539 |
if(!input(MODE_KEY)) // stisknuto tlacitko mode, koncime |
539 |
if(!input(MODE_KEY)) // stisknuto tlacitko mode, koncime |
540 |
{ |
540 |
{ |
541 |
#USE STANDARD_IO(A) |
541 |
#USE STANDARD_IO(A) |
542 |
#USE STANDARD_IO(B) |
542 |
#USE STANDARD_IO(B) |
543 |
#USE STANDARD_IO(C) |
543 |
#USE STANDARD_IO(C) |
544 |
output_float(TM_PIN); // TM jako vstup, muze zustat jako vystup pri preruseni mereni |
544 |
output_float(TM_PIN); // TM jako vstup, muze zustat jako vystup pri preruseni mereni |
545 |
#USE FAST_IO(A) |
545 |
#USE FAST_IO(A) |
546 |
#USE FAST_IO(B) |
546 |
#USE FAST_IO(B) |
547 |
#USE FAST_IO(C) |
547 |
#USE FAST_IO(C) |
548 |
break; |
548 |
break; |
549 |
} |
549 |
} |
550 |
if(!input(NUL_KEY)) // stisknuto tlacitko NULL, budeme merit rozdil teplot, zapamatuj si aktualni teplotu |
550 |
if(!input(NUL_KEY)) // stisknuto tlacitko NULL, budeme merit rozdil teplot, zapamatuj si aktualni teplotu |
551 |
{ |
551 |
{ |
552 |
temp_p=temp; // zapamatuj si aktualni hodnotu teploty |
552 |
temp_p=temp; // zapamatuj si aktualni hodnotu teploty |
553 |
delta=1; // oznam, ze merime rozdil teplot |
553 |
delta=1; // oznam, ze merime rozdil teplot |
554 |
stat=T_MEASURE; |
554 |
stat=T_MEASURE; |
555 |
clr_1line(); |
555 |
clr_1line(); |
556 |
lcd_gotoxy(6,1); |
556 |
lcd_gotoxy(6,1); |
557 |
printf(lcd_putc,"0.0 \20\21C"); // \20 je znak delta \21 je znak stupen |
557 |
printf(lcd_putc,"0.0 \20\21C"); // \20 je znak delta \21 je znak stupen |
558 |
wait_release_keys(); // cekej na uvolneni tlacitka |
558 |
wait_release_keys(); // cekej na uvolneni tlacitka |
559 |
} |
559 |
} |
560 |
} |
560 |
} |
561 |
// STAVOVY AUTOMAT MERENI TEPLOTY |
561 |
// STAVOVY AUTOMAT MERENI TEPLOTY |
562 |
switch(stat) |
562 |
switch(stat) |
563 |
{ |
563 |
{ |
564 |
case T_WAIT: |
564 |
case T_WAIT: |
565 |
if(--wait==0) stat=T_DISPLAY; // cekej az teplomer zmeri frekvenci |
565 |
if(--wait==0) stat=T_DISPLAY; // cekej az teplomer zmeri frekvenci |
566 |
break; |
566 |
break; |
567 |
case T_DISPLAY: |
567 |
case T_DISPLAY: |
568 |
if(!TM_present()) |
568 |
if(!TM_present()) |
569 |
{ |
569 |
{ |
570 |
// teplomer NENI pritomen |
570 |
// teplomer NENI pritomen |
571 |
clr_1line(); |
571 |
clr_1line(); |
572 |
printf(lcd_putc,CONNECT_TEMP_MSG); |
572 |
printf(lcd_putc,CONNECT_TEMP_MSG); |
573 |
temp_p=0; // nuluj pripadnou teplotu pro odecteni |
573 |
temp_p=0; // nuluj pripadnou teplotu pro odecteni |
574 |
delta=0; // zrus pripadne mereni rozdilu teplot |
574 |
delta=0; // zrus pripadne mereni rozdilu teplot |
575 |
} else |
575 |
} else |
576 |
{ |
576 |
{ |
577 |
// teplomer JE pritomen |
577 |
// teplomer JE pritomen |
578 |
TM_write_byte(0xCC); // prikaz preskoc na dalsi sadu prikazu |
578 |
TM_write_byte(0xCC); // prikaz preskoc na dalsi sadu prikazu |
579 |
TM_write_byte(0xBE); // prikaz precti zmerenou teplotu |
579 |
TM_write_byte(0xBE); // prikaz precti zmerenou teplotu |
580 |
for(i=0;i<9;i++) record[i]=TM_read_byte(); // precti zaznam do buferu |
580 |
for(i=0;i<9;i++) record[i]=TM_read_byte(); // precti zaznam do buferu |
581 |
if(TM_check_CRC(record,9)) // kontrola CRC |
581 |
if(TM_check_CRC(record,9)) // kontrola CRC |
582 |
{ |
582 |
{ |
583 |
// vypocet teploty viz datasheet |
583 |
// vypocet teploty viz datasheet |
584 |
record[0]=record[0]>>1; // zahod rad 2^-1, |
584 |
record[0]=record[0]>>1; // zahod rad 2^-1, |
585 |
if(bit_test(record[1],0)) bit_set(record[0],7); // je-li cislo zaporne, je treba nejvyssi bit nastavit na 1 |
585 |
if(bit_test(record[1],0)) bit_set(record[0],7); // je-li cislo zaporne, je treba nejvyssi bit nastavit na 1 |
586 |
temp=(float)make16(record[1],record[0]); // prechod na realna cisla |
586 |
temp=(float)make16(record[1],record[0]); // prechod na realna cisla |
587 |
temp=temp-0.25+((0x10-(float)record[6])/0x10); // zvetseni presnosti na 12 bitu |
587 |
temp=temp-0.25+((0x10-(float)record[6])/0x10); // zvetseni presnosti na 12 bitu |
588 |
temp_v=temp-temp_p; |
588 |
temp_v=temp-temp_p; |
589 |
clr_1line(); |
589 |
clr_1line(); |
590 |
lcd_gotoxy(6-num_int_digit(temp_v),1); // umisti udaj tak, aby radova carka byla porad na stejnem miste |
590 |
lcd_gotoxy(6-num_int_digit(temp_v),1); // umisti udaj tak, aby radova carka byla porad na stejnem miste |
591 |
if(temp_v>=0F) lcd_putc(' '); // pri kladne hodnote zobraz misto minus mezeru |
591 |
if(temp_v>=0F) lcd_putc(' '); // pri kladne hodnote zobraz misto minus mezeru |
592 |
printf(lcd_putc,"%4.1f ",temp_v); |
592 |
printf(lcd_putc,"%4.1f ",temp_v); |
593 |
if(delta) lcd_putc('\20'); // pri mereni rozdilu teplot zobraz znak delta |
593 |
if(delta) lcd_putc('\20'); // pri mereni rozdilu teplot zobraz znak delta |
594 |
lcd_putc('\21'); // znak stupne |
594 |
lcd_putc('\21'); // znak stupne |
595 |
lcd_putc('C'); |
595 |
lcd_putc('C'); |
596 |
} |
596 |
} |
597 |
} |
597 |
} |
598 |
stat=T_MEASURE; // prejdi do stavu vyvolani mereni teploty |
598 |
stat=T_MEASURE; // prejdi do stavu vyvolani mereni teploty |
599 |
case T_MEASURE: |
599 |
case T_MEASURE: |
600 |
if(!TM_present()) |
600 |
if(!TM_present()) |
601 |
{ |
601 |
{ |
602 |
// teplomer NENI pritomen |
602 |
// teplomer NENI pritomen |
603 |
clr_1line(); |
603 |
clr_1line(); |
604 |
printf(lcd_putc,CONNECT_TEMP_MSG); |
604 |
printf(lcd_putc,CONNECT_TEMP_MSG); |
605 |
temp_p=0; // nuluj pripadnou teplotu pro odecteni |
605 |
temp_p=0; // nuluj pripadnou teplotu pro odecteni |
606 |
delta=0; // zrus pripadne mereni rozdilu teplot |
606 |
delta=0; // zrus pripadne mereni rozdilu teplot |
607 |
} else |
607 |
} else |
608 |
{ |
608 |
{ |
609 |
// teplomer JE pritomen |
609 |
// teplomer JE pritomen |
610 |
TM_write_byte(0xCC); // prikaz preskoc na dalsi sadu prikazu |
610 |
TM_write_byte(0xCC); // prikaz preskoc na dalsi sadu prikazu |
611 |
TM_write_byte(0x44); // prikaz zmer teplotu |
611 |
TM_write_byte(0x44); // prikaz zmer teplotu |
612 |
#USE STANDARD_IO(A) |
612 |
#USE STANDARD_IO(A) |
613 |
#USE STANDARD_IO(B) |
613 |
#USE STANDARD_IO(B) |
614 |
#USE STANDARD_IO(C) |
614 |
#USE STANDARD_IO(C) |
615 |
output_high(TM_PIN); // vystup do 1, zajistuje napajeni behem mereni teploty |
615 |
output_high(TM_PIN); // vystup do 1, zajistuje napajeni behem mereni teploty |
616 |
#USE FAST_IO(A) |
616 |
#USE FAST_IO(A) |
617 |
#USE FAST_IO(B) |
617 |
#USE FAST_IO(B) |
618 |
#USE FAST_IO(C) |
618 |
#USE FAST_IO(C) |
619 |
wait=CONV_WAIT; |
619 |
wait=CONV_WAIT; |
620 |
stat=T_WAIT; // prejdi do stavu cekani na dokonceni mereni (konverze) |
620 |
stat=T_WAIT; // prejdi do stavu cekani na dokonceni mereni (konverze) |
621 |
} |
621 |
} |
622 |
break; |
622 |
break; |
623 |
} // od switch |
623 |
} // od switch |
624 |
mfreq_sqr(); // zastupuje zde spozdeni 250ms, ktere lze prerusit stiskem tlacitka |
624 |
mfreq_sqr(); // zastupuje zde spozdeni 250ms, ktere lze prerusit stiskem tlacitka |
625 |
} // od for(;;) |
625 |
} // od for(;;) |
626 |
} // measure_T |
626 |
} // measure_T |
627 |
|
627 |
|
628 |
|
628 |
|
629 |
// generovani pulzu |
629 |
// generovani pulzu |
630 |
// |
630 |
// |
631 |
#separate |
631 |
#separate |
632 |
void pulser() |
632 |
void pulser() |
633 |
{ |
633 |
{ |
634 |
int8 pulse; |
634 |
int8 pulse; |
635 |
|
635 |
|
636 |
#USE STANDARD_IO(A) |
636 |
#USE STANDARD_IO(A) |
637 |
#USE STANDARD_IO(B) |
637 |
#USE STANDARD_IO(B) |
638 |
#USE STANDARD_IO(C) |
638 |
#USE STANDARD_IO(C) |
639 |
output_high(PULSER_PIN); // pin pulseru naorientuj jako vystup |
639 |
output_high(PULSER_PIN); // pin pulseru naorientuj jako vystup |
640 |
#USE FAST_IO(A) |
640 |
#USE FAST_IO(A) |
641 |
#USE FAST_IO(B) |
641 |
#USE FAST_IO(B) |
642 |
#USE FAST_IO(C) |
642 |
#USE FAST_IO(C) |
643 |
|
643 |
|
644 |
INT_TMP=0; // pouzije se jako zrcadlo vystupniho pinu generatoru pulzu (vystup do 0) |
644 |
INT_TMP=0; // pouzije se jako zrcadlo vystupniho pinu generatoru pulzu (vystup do 0) |
645 |
setup_timer_0(RTCC_EXT_L_TO_H); // zastav TMR0, vadil by nam v preruseni, (preruseni od nej zastavuje TMR1) |
645 |
setup_timer_0(RTCC_EXT_L_TO_H); // zastav TMR0, vadil by nam v preruseni, (preruseni od nej zastavuje TMR1) |
646 |
pulse=read_eeprom(WIDTH_ADR); // vyzvedni naposledy pouzitou sirku impulzu |
646 |
pulse=read_eeprom(WIDTH_ADR); // vyzvedni naposledy pouzitou sirku impulzu |
647 |
|
647 |
|
648 |
for(;;) |
648 |
for(;;) |
649 |
{ |
649 |
{ |
650 |
clr_1line(); |
650 |
clr_1line(); |
651 |
switch(pulse) |
651 |
switch(pulse) |
652 |
{ |
652 |
{ |
653 |
case P_10US: |
653 |
case P_10US: |
654 |
printf(lcd_putc,PULSE_10us_MSG); |
654 |
printf(lcd_putc,PULSE_10us_MSG); |
655 |
setup_timer_2(T2_DIV_BY_1,20-1,1); // perioda 20us |
655 |
setup_timer_2(T2_DIV_BY_1,20-1,1); // perioda 20us |
656 |
setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky |
656 |
setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky |
657 |
CCP_1 = 20/2; // strida 1:1 |
657 |
CCP_1 = 20/2; // strida 1:1 |
658 |
break; |
658 |
break; |
659 |
case P_20US: |
659 |
case P_20US: |
660 |
printf(lcd_putc,PULSE_20us_MSG); |
660 |
printf(lcd_putc,PULSE_20us_MSG); |
661 |
setup_timer_2(T2_DIV_BY_1,40-1,1); // perioda 40us |
661 |
setup_timer_2(T2_DIV_BY_1,40-1,1); // perioda 40us |
662 |
setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky |
662 |
setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky |
663 |
CCP_1 = 40/2; // strida 1:1 |
663 |
CCP_1 = 40/2; // strida 1:1 |
664 |
break; |
664 |
break; |
665 |
case P_50US: |
665 |
case P_50US: |
666 |
printf(lcd_putc,PULSE_50us_MSG); |
666 |
printf(lcd_putc,PULSE_50us_MSG); |
667 |
setup_timer_2(T2_DIV_BY_1,100-1,1); // perioda 100us |
667 |
setup_timer_2(T2_DIV_BY_1,100-1,1); // perioda 100us |
668 |
setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky |
668 |
setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky |
669 |
CCP_1 = 100/2; // strida 1:1 |
669 |
CCP_1 = 100/2; // strida 1:1 |
670 |
break; |
670 |
break; |
671 |
case P_100US: |
671 |
case P_100US: |
672 |
printf(lcd_putc,PULSE_100us_MSG); |
672 |
printf(lcd_putc,PULSE_100us_MSG); |
673 |
setup_timer_2(T2_DIV_BY_1,200-1,1); // perioda 200us |
673 |
setup_timer_2(T2_DIV_BY_1,200-1,1); // perioda 200us |
674 |
setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky |
674 |
setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky |
675 |
CCP_1 = 200/2; // strida 1:1 |
675 |
CCP_1 = 200/2; // strida 1:1 |
676 |
break; |
676 |
break; |
677 |
case P_200US: |
677 |
case P_200US: |
678 |
printf(lcd_putc,PULSE_200us_MSG); |
678 |
printf(lcd_putc,PULSE_200us_MSG); |
679 |
setup_timer_2(T2_DIV_BY_4,100-1,1); // perioda 400us |
679 |
setup_timer_2(T2_DIV_BY_4,100-1,1); // perioda 400us |
680 |
setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky |
680 |
setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky |
681 |
CCP_1 = 100/2; // strida 1:1 |
681 |
CCP_1 = 100/2; // strida 1:1 |
682 |
break; |
682 |
break; |
683 |
case P_500US: |
683 |
case P_500US: |
684 |
printf(lcd_putc,PULSE_500us_MSG); |
684 |
printf(lcd_putc,PULSE_500us_MSG); |
685 |
setup_timer_2(T2_DIV_BY_4,250-1,1); // perioda 1000us |
685 |
setup_timer_2(T2_DIV_BY_4,250-1,1); // perioda 1000us |
686 |
setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky |
686 |
setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky |
687 |
CCP_1 = 250/2; // strida 1:1 |
687 |
CCP_1 = 250/2; // strida 1:1 |
688 |
break; |
688 |
break; |
689 |
case P_1MS: |
689 |
case P_1MS: |
690 |
setup_timer_2(T2_DISABLED,0,1); |
690 |
setup_timer_2(T2_DISABLED,0,1); |
691 |
printf(lcd_putc,PULSE_1ms_MSG); |
691 |
printf(lcd_putc,PULSE_1ms_MSG); |
692 |
setup_ccp1(CCP_COMPARE_RESET_TIMER); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
692 |
setup_ccp1(CCP_COMPARE_RESET_TIMER); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
693 |
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); |
693 |
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); |
694 |
CCP_1 =1000; // pulz 1ms - perioda 2ms |
694 |
CCP_1 =1000; // pulz 1ms - perioda 2ms |
695 |
enable_interrupts(INT_CCP1); // povol preruseni od CCP1 jednotky |
695 |
enable_interrupts(INT_CCP1); // povol preruseni od CCP1 jednotky |
696 |
break; |
696 |
break; |
697 |
case P_2MS: |
697 |
case P_2MS: |
698 |
printf(lcd_putc,PULSE_2ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
698 |
printf(lcd_putc,PULSE_2ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
699 |
CCP_1 =2000; // pulz 2ms - perioda 4ms |
699 |
CCP_1 =2000; // pulz 2ms - perioda 4ms |
700 |
break; |
700 |
break; |
701 |
case P_5MS: |
701 |
case P_5MS: |
702 |
printf(lcd_putc,PULSE_5ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
702 |
printf(lcd_putc,PULSE_5ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
703 |
CCP_1 =5000; // pulz 5ms - perioda 10ms |
703 |
CCP_1 =5000; // pulz 5ms - perioda 10ms |
704 |
break; |
704 |
break; |
705 |
case P_10MS: |
705 |
case P_10MS: |
706 |
printf(lcd_putc,PULSE_10ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
706 |
printf(lcd_putc,PULSE_10ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
707 |
CCP_1 =10000; // pulz 10ms - perioda 20ms |
707 |
CCP_1 =10000; // pulz 10ms - perioda 20ms |
708 |
break; |
708 |
break; |
709 |
case P_20MS: |
709 |
case P_20MS: |
710 |
printf(lcd_putc,PULSE_20ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
710 |
printf(lcd_putc,PULSE_20ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
711 |
CCP_1 =20000; // pulz 20ms - perioda 40ms |
711 |
CCP_1 =20000; // pulz 20ms - perioda 40ms |
712 |
break; |
712 |
break; |
713 |
case P_50MS: |
713 |
case P_50MS: |
714 |
printf(lcd_putc,PULSE_50ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
714 |
printf(lcd_putc,PULSE_50ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
715 |
CCP_1 =50000; // pulz 50ms - perioda 100ms |
715 |
CCP_1 =50000; // pulz 50ms - perioda 100ms |
716 |
break; |
716 |
break; |
717 |
case P_500MS: |
717 |
case P_500MS: |
718 |
printf(lcd_putc,PULSE_500ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
718 |
printf(lcd_putc,PULSE_500ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni) |
719 |
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); |
719 |
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); |
720 |
CCP_1 =62500 ; // pulz 500ms - perioda 1000ms |
720 |
CCP_1 =62500 ; // pulz 500ms - perioda 1000ms |
721 |
break; |
721 |
break; |
722 |
case P_5US: |
722 |
case P_5US: |
723 |
printf(lcd_putc,PULSE_5us_MSG); |
723 |
printf(lcd_putc,PULSE_5us_MSG); |
724 |
disable_interrupts(INT_CCP1); // zakaz preruseni od CCP1, pro kratke casy ji nepouzivme, pouzivame PWM jednotku |
724 |
disable_interrupts(INT_CCP1); // zakaz preruseni od CCP1, pro kratke casy ji nepouzivme, pouzivame PWM jednotku |
725 |
setup_timer_2(T2_DIV_BY_1,10-1,1); // perioda 10us |
725 |
setup_timer_2(T2_DIV_BY_1,10-1,1); // perioda 10us |
726 |
setup_ccp1(CCP_PWM); // pouzivame PWM jednotku |
726 |
setup_ccp1(CCP_PWM); // pouzivame PWM jednotku |
727 |
CCP_1 = 10/2; // strida 1:1 |
727 |
CCP_1 = 10/2; // strida 1:1 |
728 |
break; |
728 |
break; |
729 |
} // od switch |
729 |
} // od switch |
730 |
while(freq_done!=F_KEY); // cekame na stisk nejakeho tlacitka |
730 |
while(freq_done!=F_KEY); // cekame na stisk nejakeho tlacitka |
731 |
if(!input(MODE_KEY)) // stisknuto tlacitko MODE, koncime |
731 |
if(!input(MODE_KEY)) // stisknuto tlacitko MODE, koncime |
732 |
{ |
732 |
{ |
733 |
// uved preruseni a nastaveni timeru1 do puvodniho stavu a konci mod |
733 |
// uved preruseni a nastaveni timeru1 do puvodniho stavu a konci mod |
734 |
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // pro mereni periody vzorkovani (500ms) |
734 |
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // pro mereni periody vzorkovani (500ms) |
735 |
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1); // pro citani vzorku// |
735 |
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1); // pro citani vzorku// |
736 |
bit_clear(*T1CON,_TMR1ON); // zastav citani impulzu |
736 |
bit_clear(*T1CON,_TMR1ON); // zastav citani impulzu |
737 |
disable_interrupts(INT_CCP1); // cakaz preruseni od CCP1 ednotky |
737 |
disable_interrupts(INT_CCP1); // cakaz preruseni od CCP1 ednotky |
738 |
#USE STANDARD_IO(A) |
738 |
#USE STANDARD_IO(A) |
739 |
#USE STANDARD_IO(B) |
739 |
#USE STANDARD_IO(B) |
740 |
#USE STANDARD_IO(C) |
740 |
#USE STANDARD_IO(C) |
741 |
output_float(PULSER_PIN); // vystup pulseru jako vystup |
741 |
output_float(PULSER_PIN); // vystup pulseru jako vystup |
742 |
#USE FAST_IO(A) |
742 |
#USE FAST_IO(A) |
743 |
#USE FAST_IO(B) |
743 |
#USE FAST_IO(B) |
744 |
#USE FAST_IO(C) |
744 |
#USE FAST_IO(C) |
745 |
break; // koncime |
745 |
break; // koncime |
746 |
} |
746 |
} |
747 |
if(!input(NUL_KEY)) // stisknuto tlacitko WIDTH |
747 |
if(!input(NUL_KEY)) // stisknuto tlacitko WIDTH |
748 |
{ |
748 |
{ |
749 |
if(pulse==P_5US) pulse=P_10US; // po dosazeni stavu P_5US se posloupnost opakuje |
749 |
if(pulse==P_5US) pulse=P_10US; // po dosazeni stavu P_5US se posloupnost opakuje |
750 |
else pulse++; |
750 |
else pulse++; |
751 |
write_eeprom(WIDTH_ADR,pulse); // uloz novou sirku impulzu |
751 |
write_eeprom(WIDTH_ADR,pulse); // uloz novou sirku impulzu |
752 |
wait_release_keys(); // cekej na uvolneni tlacitek po nastaveni sirky pulzu |
752 |
wait_release_keys(); // cekej na uvolneni tlacitek po nastaveni sirky pulzu |
753 |
} |
753 |
} |
754 |
} |
754 |
} |
755 |
} // pulser |
755 |
} // pulser |
756 |
|
756 |
|
757 |
|
757 |
|
758 |
|
758 |
|
759 |
|
759 |
|
760 |
|
760 |
|
761 |
/*************************************************/ |
761 |
/*************************************************/ |
762 |
/******** HLAVNI FUNKCE PROGRAMU ****************/ |
762 |
/******** HLAVNI FUNKCE PROGRAMU ****************/ |
763 |
/*************************************************/ |
763 |
/*************************************************/ |
764 |
|
764 |
|
765 |
void main() |
765 |
void main() |
766 |
{ |
766 |
{ |
767 |
float f1_sqr; // kvadrat kmitoctu mericiho scilatoru bez pripojene Lx nebo Cx |
767 |
float f1_sqr; // kvadrat kmitoctu mericiho scilatoru bez pripojene Lx nebo Cx |
768 |
float C; // hodnota kondenzatoru v mericim oscilatoru v pF (ziska se kalibraci) |
768 |
float C; // hodnota kondenzatoru v mericim oscilatoru v pF (ziska se kalibraci) |
769 |
float L; // hodnota indukcnosti v mericim oscilatoru v nH (ziska se kalibraci) |
769 |
float L; // hodnota indukcnosti v mericim oscilatoru v nH (ziska se kalibraci) |
770 |
int8 MODE; // promenna stavoveho automatu hlavni smycky (mod mereni) |
770 |
int8 MODE; // promenna stavoveho automatu hlavni smycky (mod mereni) |
771 |
int1 _calib; // priznak, ze jiz doslo ke kalibraci |
771 |
int1 _calib; // priznak, ze jiz doslo ke kalibraci |
772 |
|
772 |
|
773 |
|
773 |
|
774 |
// nastaveni citacu |
774 |
// nastaveni citacu |
775 |
port_b_pullups(TRUE); // zapnu puulupy na brane B (pro tlacitka) |
775 |
port_b_pullups(TRUE); // zapnu puulupy na brane B (pro tlacitka) |
776 |
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // pro mereni periody vzorkovani (500ms) |
776 |
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // pro mereni periody vzorkovani (500ms) |
777 |
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1); // pro citani impulzu z mericiho oscilatoru |
777 |
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1); // pro citani impulzu z mericiho oscilatoru |
778 |
bit_clear(*T1CON,_TMR1ON); // zastav citani impulzu |
778 |
bit_clear(*T1CON,_TMR1ON); // zastav citani impulzu |
779 |
|
779 |
|
780 |
//nastaveni vstupu a vystupu |
780 |
//nastaveni vstupu a vystupu |
781 |
#USE STANDARD_IO(A) |
781 |
#USE STANDARD_IO(A) |
782 |
#USE STANDARD_IO(B) |
782 |
#USE STANDARD_IO(B) |
783 |
#USE STANDARD_IO(C) |
783 |
#USE STANDARD_IO(C) |
784 |
output_low(RE1_A); // signaly relatek jako vystupy a do 0 |
784 |
output_low(RE1_A); // signaly relatek jako vystupy a do 0 |
785 |
output_low(RE1_B); |
785 |
output_low(RE1_B); |
786 |
output_low(RE2_A); |
786 |
output_low(RE2_A); |
787 |
output_low(RE2_B); |
787 |
output_low(RE2_B); |
788 |
output_float(PULSER_PIN); // signal pro pulser jako vstup |
788 |
output_float(PULSER_PIN); // signal pro pulser jako vstup |
789 |
output_float(TM_PIN); // vstup pro TM jako vstup |
789 |
output_float(TM_PIN); // vstup pro TM jako vstup |
790 |
output_float(TM_PULLUP); // zapni pullup pro TM |
790 |
output_float(TM_PULLUP); // zapni pullup pro TM |
791 |
output_low(PIN_C1); // nepouzit,dej do 0 |
791 |
output_low(PIN_C1); // nepouzit,dej do 0 |
792 |
output_low(PIN_C3); // nepouzit,dej do 0 |
792 |
output_low(PIN_C3); // nepouzit,dej do 0 |
793 |
#USE FAST_IO(A) |
793 |
#USE FAST_IO(A) |
794 |
#USE FAST_IO(B) |
794 |
#USE FAST_IO(B) |
795 |
#USE FAST_IO(C) |
795 |
#USE FAST_IO(C) |
796 |
|
796 |
|
797 |
lcd_init(); |
797 |
lcd_init(); |
798 |
lcd_define_char(0,LCD_CHAR_DELTA); // nadefinovani znaku delta |
798 |
lcd_define_char(0,LCD_CHAR_DELTA); // nadefinovani znaku delta |
799 |
lcd_define_char(1,LCD_CHAR_DEC); // nadefinovani znaku stupen |
799 |
lcd_define_char(1,LCD_CHAR_DEC); // nadefinovani znaku stupen |
800 |
rele_measure_C(); // rele do stavu odpojeni kalibracniho kondenzatoru a oscilator musi bezet |
800 |
rele_measure_C(); // rele do stavu odpojeni kalibracniho kondenzatoru a oscilator musi bezet |
801 |
input_b(); |
801 |
input_b(); |
802 |
enable_interrupts(INT_TIMER1); // povol preruseni od citace impulzu mericiho oscilatoru |
802 |
enable_interrupts(INT_TIMER1); // povol preruseni od citace impulzu mericiho oscilatoru |
803 |
enable_interrupts(INT_RB); // povol preruseni od tlacitek |
803 |
enable_interrupts(INT_RB); // povol preruseni od tlacitek |
804 |
enable_interrupts(GLOBAL); |
804 |
enable_interrupts(GLOBAL); |
805 |
|
805 |
|
806 |
|
806 |
|
807 |
#ifdef FREQ |
807 |
#ifdef FREQ |
808 |
// pro kalibraci mereni kmitoctu |
808 |
// pro kalibraci mereni kmitoctu |
809 |
for(;;) { |
809 |
for(;;) { |
810 |
f1_sqr=mfreq_sqr(); |
810 |
f1_sqr=mfreq_sqr(); |
811 |
lcd_putc("\f"); |
811 |
lcd_putc("\f"); |
812 |
printf(lcd_putc,"F=%6.2f KHz",f1_sqr*1E-3); |
812 |
printf(lcd_putc,"F=%6.2f KHz",f1_sqr*1E-3); |
813 |
delay_ms(500); |
813 |
delay_ms(500); |
814 |
} |
814 |
} |
815 |
#endif |
815 |
#endif |
816 |
|
816 |
|
817 |
// UVOD |
817 |
// UVOD |
818 |
lcd_putc("\f"); |
818 |
lcd_putc("\f"); |
819 |
printf(lcd_putc,VERSION_MSG); |
819 |
printf(lcd_putc,VERSION_MSG); |
820 |
lcd_gotoxy(1,2); |
820 |
lcd_gotoxy(1,2); |
821 |
printf(lcd_putc,COPYRIGHT_MSG); |
821 |
printf(lcd_putc,COPYRIGHT_MSG); |
822 |
delay_ms(FREQ_CALM_TIME); // pockej na ustaleni oscilatoru |
822 |
delay_ms(FREQ_CALM_TIME); // pockej na ustaleni oscilatoru |
823 |
f1_sqr=mfreq_sqr(); // zmer f1 |
823 |
f1_sqr=mfreq_sqr(); // zmer f1 |
824 |
_calib=0; // kalibrace neni provedena |
824 |
_calib=0; // kalibrace neni provedena |
825 |
freq_done=F_PEACE; |
825 |
freq_done=F_PEACE; |
826 |
mode=read_eeprom(MODE_ADR); // vyzvedni naposledy pouzity mod |
826 |
mode=read_eeprom(MODE_ADR); // vyzvedni naposledy pouzity mod |
827 |
|
827 |
|
828 |
// VLASTNI MERICI SMYCKA |
828 |
// VLASTNI MERICI SMYCKA |
829 |
for(;;) |
829 |
for(;;) |
830 |
{ |
830 |
{ |
831 |
switch(mode) |
831 |
switch(mode) |
832 |
{ |
832 |
{ |
833 |
case MODE_C: // mereni Cx |
833 |
case MODE_C: // mereni Cx |
834 |
if(!_calib) |
834 |
if(!_calib) |
835 |
{ |
835 |
{ |
836 |
calibration(f1_sqr,C,L); // proved kalibraci (vypocti L a C) |
836 |
calibration(f1_sqr,C,L); // proved kalibraci (vypocti L a C) |
837 |
_calib=1; // poznamenej si, ze se kalibrace uz provedla |
837 |
_calib=1; // poznamenej si, ze se kalibrace uz provedla |
838 |
} |
838 |
} |
839 |
rele_measure_C(); |
839 |
rele_measure_C(); |
840 |
lcd_gotoxy(1,2); |
840 |
lcd_gotoxy(1,2); |
841 |
printf(lcd_putc,MODE_CX_NULL_MSG); |
841 |
printf(lcd_putc,MODE_CX_NULL_MSG); |
842 |
measure_C(f1_sqr,C,L); |
842 |
measure_C(f1_sqr,C,L); |
843 |
// prechazime na mereni L |
843 |
// prechazime na mereni L |
844 |
mode=MODE_L; |
844 |
mode=MODE_L; |
845 |
break; |
845 |
break; |
846 |
case MODE_L: // mereni Lx |
846 |
case MODE_L: // mereni Lx |
847 |
if(!_calib) |
847 |
if(!_calib) |
848 |
{ |
848 |
{ |
849 |
calibration(f1_sqr,C,L); // proved kalibraci (vypocti L a C) |
849 |
calibration(f1_sqr,C,L); // proved kalibraci (vypocti L a C) |
850 |
_calib=1; // poznamenej si, ze se kalibrace uz provedla |
850 |
_calib=1; // poznamenej si, ze se kalibrace uz provedla |
851 |
} |
851 |
} |
852 |
rele_measure_L(); |
852 |
rele_measure_L(); |
853 |
lcd_gotoxy(1,2); |
853 |
lcd_gotoxy(1,2); |
854 |
printf(lcd_putc,MODE_LX_NULL_MSG); |
854 |
printf(lcd_putc,MODE_LX_NULL_MSG); |
855 |
measure_L(f1_sqr,C,L); |
855 |
measure_L(f1_sqr,C,L); |
856 |
// prechazime na mereni T |
856 |
// prechazime na mereni T |
857 |
mode=MODE_T; |
857 |
mode=MODE_T; |
858 |
break; |
858 |
break; |
859 |
case MODE_T: // merei teploty |
859 |
case MODE_T: // merei teploty |
860 |
rele_calib(); |
860 |
rele_calib(); |
861 |
lcd_gotoxy(1,2); |
861 |
lcd_gotoxy(1,2); |
862 |
printf(lcd_putc,MODE_TMP_NULL_MSG); |
862 |
printf(lcd_putc,MODE_TMP_NULL_MSG); |
863 |
bit_clear(*T1CON,_TMR1ON); // zastav TMR1, vadil by |
863 |
bit_clear(*T1CON,_TMR1ON); // zastav TMR1, vadil by |
864 |
measure_T(); |
864 |
measure_T(); |
865 |
// prechazime na generovani pulzu |
865 |
// prechazime na generovani pulzu |
866 |
mode=MODE_P; |
866 |
mode=MODE_P; |
867 |
break; |
867 |
break; |
868 |
case MODE_P: // generovani pulzu |
868 |
case MODE_P: // generovani pulzu |
869 |
rele_calib(); |
869 |
rele_calib(); |
870 |
lcd_gotoxy(1,2); |
870 |
lcd_gotoxy(1,2); |
871 |
printf(lcd_putc,MODE_PLZ_WIDTH_MSG); |
871 |
printf(lcd_putc,MODE_PLZ_WIDTH_MSG); |
872 |
pulser(); |
872 |
pulser(); |
873 |
// prechazime na mereni C |
873 |
// prechazime na mereni C |
874 |
mode=MODE_C; |
874 |
mode=MODE_C; |
875 |
break; |
875 |
break; |
876 |
} // od switch |
876 |
} // od switch |
877 |
write_eeprom(MODE_ADR,mode); // uloz ktery mod je nyni aktivni |
877 |
write_eeprom(MODE_ADR,mode); // uloz ktery mod je nyni aktivni |
878 |
wait_release_keys(); // cekej na uvolneni tlacitek |
878 |
wait_release_keys(); // cekej na uvolneni tlacitek |
879 |
delay_ms(10); |
879 |
delay_ms(10); |
880 |
} // for(;;) |
880 |
} // for(;;) |
881 |
} // main |
881 |
} // main |
882 |
|
882 |
|
883 |
// End of File |
883 |
// End of File |