{HEADER END}
{COMPARE START}

MLAB

Porovnej cestu:  Revize
S umístěním:  Revize

Toto porovnání ukazuje změny pro převedení /Designs (Revize 919) na /Designs (Revize 922)

Reverzní porovnání

LCTmetr01A/DOC/LCT.pdf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream


LCTmetr01A/DOC/LCT.pdf

Změněné vlastnosti:

Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: LCTmetr01A/SW/lc.h
===================================================================
--- LCTmetr01A/SW/lc.h (revision 0)
+++ LCTmetr01A/SW/lc.h (revision 922)
@@ -0,0 +1,132 @@
+//**********************************************************************
+// LCT-METER/PULSER - HLAVICKOVY SOUBOR
+//**********************************************************************
+// (c) OK1XGL 2004
+// verze 1.00 - uvodni verze 10.1.2004
+// verze 1.01 - pridano ukladani vlastni Cp/Lp do pameti EEPROM
+// - pridano ukladani stavu (mod, parametry modu ) do pameti EEROM
+//
+
+#use delay (clock=4000000,restart_wdt)
+#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP
+
+// LCD display
+#define LCD_RS PIN_A0 /* rizeni registru LCD displeje */
+#define LCD_E PIN_A1 /* enable LCD displeje */
+#define LCD_DATA_LSB PIN_A2 /* pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou) */
+#define LCD_CHAR_DELTA "\x80\x80\x80\x04\x0A\x11\x1F\x80" /* symbol delta */
+#define LCD_CHAR_DEC "\x0E\x0A\x0E\x80\x80\x80\x80\x80" /* symbol stupen */
+
+// rele pro prepinani modu mereni
+#define RE1_A PIN_C4
+#define RE1_B PIN_C7
+#define RE2_A PIN_C5
+#define RE2_B PIN_C6
+#define RELE_PULSE 10 /* delka prepinaciho pulzu pro rele v ms jednotkach */
+
+// tlacitka (libovolne na brane B)
+#define NUL_KEY PIN_B7 /* pro nulovani pocatecni C nebo L NEBO T, pri generovani pulzu prepina sirku pulzu */
+#define MODE_KEY PIN_B6 /* pro prepinani modu mereni */
+
+// pulser (nelze zmenit, vystup PWM a CPP1 jednotky je jen zde)
+#define PULSER_PIN PIN_C2 /* vystup pulseru */
+
+// teplomer (POZOR NA VSTUPY SE SHMIDTOVYM OBVODEM, NELZE POUZIT!!!!!)
+#define TM_PIN PIN_B0 /* pin, na kterem je teplomer pripojen */
+#bit TM_PIN_BIT = PORTB.0 /* totez, ale definovan jako bit */
+#define TM_PULLUP PIN_B1 /* pullup pro teplomer */
+
+// konstanty pro mereni frekvence
+#define TIME_1S_L 0xff-194 /* urcuje dobu, za kterou vyprsi timer0 (zde 50ms),meri interval doby mereni frekvence */
+#define TIME_1S_H 5 /* rozsiruje timer0, aby bylo mozne odmerit delsi casy zde 250ms */
+#define CORIG 21 /* pro korekci intervalu doby mereni frekvence aby byla presne (vliv doby preruseni a nepresnost oscilatoru) */
+#define FREQ_CALM_TIME 2000 /* cas pro ustaleni frekvence oscialtoru v ms jednotkach */
+#define C_CALIB 996 /* hodnota kalibracniho kondenzatoru v pF */
+#define F_CORRECT 4 /* korekce zmereneho kmitoctu, aby byl v Hz a ne v napr. v 4Hz jednotkach jako zde */
+
+// adresy parametru v pameti EEROM
+#define CP_ADR_LOW 0 /* pro ulozeni vlastni kapacity 4 bajty*/
+#define LP_ADR_LOW 4 /* pro ulozeni vlastni indukcnosti 4 bajty*/
+#define MODE_ADR 8 /* uchovani modu zarizeni viz promenna mode */
+#define WIDTH_ADR 9 /* uchovani sirky pulzu v modu pulser viz promenna pulse_width */
+
+// konstanty pro mereni teploty
+#define CONV_WAIT 4 /* cas cekani az teplomer zmeri teplotu v jednotkach doby citani impulzu pri mereni frekvence */
+
+// konstanty pro promennou mode ve funkci main()
+#define MODE_L 0 /* mereni indukcnosti */
+#define MODE_C 1 /* mereni kapacity */
+#define MODE_T 2 /* mereni teploty */
+#define MODE_P 3 /* generator pulzu */
+
+// konstanty pro promennou pulse_width ve funkci pulser()
+#define P_10US 0
+#define P_20US 1
+#define P_50US 2
+#define P_100US 3
+#define P_200US 4
+#define P_500US 5
+#define P_1MS 6
+#define P_2MS 7
+#define P_5MS 8
+#define P_10MS 9
+#define P_20MS 10
+#define P_50MS 11
+#define P_500MS 12
+#define P_5US 13
+
+// konstanty pro promennou status ve funkci measure_T()
+#define T_WAIT 0 /* odmer 1000 ms */
+#define T_MEASURE 1 /* posli prikaz ke zmereni teploty */
+#define T_DISPLAY 2 /* precti zmerenou teplotu a zobraz ji */
+
+// konstanty pro promennou freq_done
+#define F_PEACE 0 /* klidovy stav tuto hodnotu nemenit !!!! */
+#define F_DONE 1 /* mereni frekvence dokonceno */
+#define F_KEY 2 /* stisknuto tlacitko, mereni frekvence preruseno */
+
+// texty zobrazovane na 1.radku LCD displeje
+#define VERSION_MSG " Version 1.01"
+#define COPYRIGHT_MSG "(c) OK1XGL 2004"
+#define CALIB_MSG " Calibration"
+#define CONNECT_LX_MSG " Connect Lx !!!"
+#define ERROR_CX_MSG " Error Cx !!!"
+#define CONNECT_TEMP_MSG " Connect temp"
+#define PULSE_5us_MSG " 5us (100KHz)"
+#define PULSE_10us_MSG " 10us (50KHz)"
+#define PULSE_20us_MSG " 20us (25KHz)"
+#define PULSE_50us_MSG " 50us (10KHz)"
+#define PULSE_100us_MSG " 100us (5KHz)"
+#define PULSE_200us_MSG " 200us (2.5KHz)"
+#define PULSE_500us_MSG " 500us (1KHz)"
+#define PULSE_1ms_MSG " 1ms (500Hz)"
+#define PULSE_2ms_MSG " 2ms (250Hz)"
+#define PULSE_5ms_MSG " 5ms (100Hz)"
+#define PULSE_10ms_MSG " 10ms (50Hz)"
+#define PULSE_20ms_MSG " 20ms (25Hz)"
+#define PULSE_50ms_MSG " 50ms (10Hz)"
+#define PULSE_500ms_MSG " 500ms (1Hz)"
+
+// texty zobrazovane na 2. radku LCD displeje
+#define MODE_CX_NULL_MSG "MODE Cx NULL"
+#define MODE_LX_NULL_MSG "MODE Lx NULL"
+#define MODE_TMP_NULL_MSG "MODE +TMP NULL"
+#define MODE_PLZ_WIDTH_MSG "MODE +PLZ WIDTH"
+
+// konstantni pole pro prefix radu
+int8 const C_PREFIX[4] = {'p','n','u','m'};
+char const L_PREFIX[4] = {'n','u','m',' '};
+
+// uvodni nastaveni parametru v pameti eeprom
+#rom 0x2100={0,0,0,0,0,0,0,0,MODE_C,P_5US}
+
+// globalni promenne
+int8 freq_done; // stav procesu mereni frekvence
+int8 W_TMP; // pro ulozeni W v prerusovaci rutine
+int8 F_TMP; // pro ulozeni F v prerusovaci rutine
+int8 PCLATH_TMP; // pro ulozeni PCLATH v prerusovaci rutine
+int8 INT_TMP; // pomocna promenna pro preruseni
+int8 sampler_H; // rozsireni timeru0 ,ktery meri dobu citani impulzu mericiho oscilatoru v tmr0 jednotkach
+int8 counter_H; // rozsireni timeru1, ktery slouzi pro citani impulzu mericiho oscilatoru
+
+// End of File


LCTmetr01A/SW/lc.h

Změněné vlastnosti:

Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: LCTmetr01A/SW/lib/lcd.c
===================================================================
--- LCTmetr01A/SW/lib/lcd.c (revision 0)
+++ LCTmetr01A/SW/lib/lcd.c (revision 922)
@@ -0,0 +1,300 @@
+// LCD modul pro ovladani dvouradkoveho LCD modulu se standardnim Hitachi radicem
+// (c)miho 2002
+//
+// Historie:
+//
+// 0.00 Uvodni verze se snadnou definici portu LCD displeje
+// 0.01 Oprava portu (zapomenute stare identifikatory)
+// 0.02 Doplnena moznost pripojeni datoveho portu LCD na libovolne porty
+//
+//
+// Funkce:
+//
+// lcd_init() inicializuje LCD displej a porty, nutno volat jako prvni
+//
+// lcd_putc(c) zapis snaku do lcd displeje, zpracovava nasledujici ridici znaky
+// \f = \x0C - nova stranka - smazani displeje
+// \n = \x0A - odradkovani (prechod na druhou radku)
+// \b = \x08 - backspace - posunuti kurzoru o 1 pozici zpet
+// \r = \x0D - goto home to position 1,1
+// \0 .. \7 - definovatelne znaky v pozicich 0 az 7 v CGRAM
+// \20 .. \27 - alternativne zapsane znaky (oktalove) v pozicich 0 az 7 CGRAM
+// Pozor na to, ze funkce printf konci tisk pokud narazi na \0 (konec retezce)
+//
+// lcd_gotoxy(x,y) presune kurzor na uvedenou adresu
+// nekontroluje parametry
+//
+// lcd_cursor_on zapne kurzor
+// lcd_cursor_off vypne kurzor
+//
+// lcd_define_char(Index, Def) Makro, ktere definuje znaky od pozice Index obsahem definicniho
+// retezce Def. Kazdych 8 znaku retezce Def definuje dalsi znak v CGRAM.
+// Kapacita CGRAM je celkem 8 znaku s indexem 0 az 7.
+// Na konci se provede lcd_gotoxy(1,1).
+// Na konci teto knihovny je priklad pouziti definovanych znaku
+//
+//
+// Definice portu: // Datovy port displeje pripojeny na 4 bity za sebou na jeden port
+//
+// #define LCD_RS PIN_B2 // rizeni registru LCD displeje
+// #define LCD_E PIN_B1 // enable LCD displeje
+// #define LCD_DATA_LSB PIN_C2 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
+//
+//
+// Alternativni definice: // Datovy port displeje pripojeny na libovolne 4 bitove porty (vede na kod delsi asi o 25 slov)
+//
+// #define LCD_RS PIN_B2 // rizeni registru LCD displeje
+// #define LCD_E PIN_B1 // enable LCD displeje
+// #define LCD_D0 PIN_C2 // D0 - datove bity pripojene na libovolne porty
+// #define LCD_D1 PIN_C3 // D1
+// #define LCD_D2 PIN_C4 // D2
+// #define LCD_D3 PIN_C5 // D3
+
+
+
+
+// Privatni sekce, cist jen v pripade, ze neco nefunguje
+
+
+
+
+#ifdef LCD_DATA_LSB
+// Generovane defince portu pro ucely teto knihovny aby kod generoval spravne IO operace a soucasne
+// bylo mozne jednoduse deklarovat pripojene piny LCD displeje pri pouziti teto knihovny. Problem spociva
+// v tom, ze se musi spravne ridit smery portu a soucasne datovy port zabira jen 4 bity ze zadaneho portu
+//
+#define LCD_SHIFT (LCD_DATA_LSB&7) // pocet bitu posuvu datoveho kanalu v datovem portu
+#define LCD_PORT (LCD_DATA_LSB>>3) // adresa LCD datoveho portu
+#define LCD_TRIS (LCD_PORT+0x80) // adresa prislusneho TRIS registru
+#define LCD_MASK (0xF< +//
+#if LCD_SHIFT>4 // kontrola mezi
+#error LCD data port LSB bit not in range 0..4
+#endif
+#endif
+
+
+// Definice konstant pro LCD display
+//
+#define LCD_CURSOR_ON_ 0x0E // kurzor jako blikajici radka pod znakem
+#define LCD_CURSOR_OFF_ 0x0C // zadny kurzor
+#define LCD_LINE_2 0x40 // adresa 1. znaku 2. radky
+
+
+// Definice rezimu LCD displeje
+//
+BYTE const LCD_INIT_STRING[4] =
+{
+ 0x28, // intrfejs 4 bity, 2 radky, font 5x7
+ LCD_CURSOR_OFF_, // display on, kurzor off,
+ 0x01, // clear displeje
+ 0x06 // inkrement pozice kurzoru (posun kurzoru doprava)
+};
+
+
+// Odesle nibble do displeje (posle data a klikne signalem e)
+//
+void lcd_send_nibble( BYTE n )
+{
+ #ifdef LCD_DATA_LSB
+ // data jsou za sebou na 4 bitech jednoho portu
+ *LCD_PORT = (*LCD_PORT & ~LCD_MASK) | ((n << LCD_SHIFT) & LCD_MASK); // nastav datove bity portu a ostatni zachovej
+ #else
+ // data jsou na libovolnych 4 bitech libovolnych portu
+ output_bit(LCD_D0,bit_test(n,0));
+ output_bit(LCD_D1,bit_test(n,1));
+ output_bit(LCD_D2,bit_test(n,2));
+ output_bit(LCD_D3,bit_test(n,3));
+ #endif
+ output_bit(LCD_E,1); // vzestupna hrana
+ delay_us(1); // pockej alespon 450ns od e nebo alespon 195ns od dat
+ output_bit(LCD_E,0); // sestupna hrana (minimalni perioda e je 1us)
+}
+
+
+// Odesle bajt do registru LCD
+//
+// Pokud je Adr=0 .. instrukcni registr
+// Pokud je Adr=1 .. datovy registr
+//
+void lcd_send_byte( BOOLEAN Adr, BYTE n )
+{
+ output_bit(LCD_RS,Adr); // vyber registr
+ swap(n);
+ lcd_send_nibble(n); // posli horni pulku bajtu
+ swap(n);
+ lcd_send_nibble(n); // posli spodni pulku bajtu
+ delay_us(40); // minimalni doba na provedeni prikazu
+}
+
+
+// Provede inicializaci LCD displeje, smaze obsah a nastavi mod displeje
+//
+// Tato procedura se musi volat pred pouzitim ostatnich lcd_ procedur
+//
+void lcd_init()
+{
+
+ int i; // pocitadlo cyklu
+
+ delay_ms(20); // spozdeni pro provedeni startu displeje po zapnuti napajeni
+
+#ifdef LCD_DATA_LSB
+ // data jsou na 4 bitech za sebou, nastav smer pro vsechny dalsi prenosy
+ *LCD_TRIS = *LCD_TRIS & ~LCD_MASK; // nuluj odpovidajici bity tris registru datoveho portu LCD
+#endif
+
+ output_bit(LCD_RS,0); // nastav jako vystup a nastav klidovy stav
+ output_bit(LCD_E, 0); // nastav jako vystup a nastav klidovy stav
+
+ for (i=0; i<3; i++) // nastav lcd do rezimu 8 bitu sbernice
+ {
+ delay_ms(2); // muze byt rozdelany prenos dat (2x 4 bity) nebo pomaly povel
+ lcd_send_nibble(3); // rezim 8 bitu
+ }
+
+ delay_us(40); // cas na zpracovani
+ lcd_send_nibble(2); // nastav rezim 4 bitu (plati od nasledujiciho prenosu)
+ delay_us(40); // cas na zpracovani
+
+ for (i=0;i<3;i++) // proved inicializaci (nastaveni modu, smazani apod)
+ {
+ lcd_send_byte(0,LCD_INIT_STRING[i]);
+ delay_ms(2);
+ }
+}
+
+
+// Proved presun kurzoru
+//
+// Pozice 1.1 je domu
+//
+void lcd_gotoxy( BYTE x, BYTE y)
+{
+
+ BYTE Adr;
+
+ Adr=x-1;
+ if(y==2)
+ Adr+=LCD_LINE_2;
+
+ lcd_send_byte(0,0x80|Adr);
+}
+
+
+// Zapis znaku na displej, zpracovani ridicich znaku
+//
+void lcd_putc( char c)
+{
+
+ switch (c)
+ {
+ case '\f' : lcd_send_byte(0,1); // smaz displej
+ delay_ms(2);
+ break;
+ case '\n' : lcd_gotoxy(1,2); break; // presun se na 1. znak 2. radky
+ case '\r' : lcd_gotoxy(1,1); break; // presun home
+ case '\b' : lcd_send_byte(0,0x10); break; // posun kurzor o 1 zpet
+ default : if (c<0x20) c&=0x7; // preklopeni definovatelnych znaku na rozsah 0 az 0x1F
+ lcd_send_byte(1,c); break; // zapis znak
+ }
+}
+
+
+// Zapni kurzor
+//
+void lcd_cursor_on()
+{
+ lcd_send_byte(0,LCD_CURSOR_ON_);
+}
+
+
+// Vypni kurzor
+//
+void lcd_cursor_off()
+{
+ lcd_send_byte(0,LCD_CURSOR_OFF_);
+}
+
+
+// Definice vlastnich fontu
+//
+// Vlastnich definic muze byt jen 8 do pozic 0 az 7 pameti CGRAM radice lcd displeje
+// Pro snadne definovani jsou pripraveny nasledujici definice a na konci souboru je uveden
+// priklad pouziti definovanych znaku.
+
+
+// Pomocna procedura pro posilani ridicich dat do radice displeje
+//
+void lcd_putc2(int Data)
+{
+ lcd_send_byte(1,Data);
+}
+
+
+// Pomocne definice pro programovani obsahu CGRAM
+//
+#define lcd_define_start(Code) lcd_send_byte(0,0x40+(Code<<3)); delay_ms(2)
+#define lcd_define_def(String) printf(lcd_putc2,String);
+#define lcd_define_end() lcd_send_byte(0,3); delay_ms(2)
+
+
+// Vlastni vykonne makro pro definovani fontu do pozice Index CGRAM s definicnim retezcem Def
+//
+#define lcd_define_char(Index, Def) lcd_define_start(Index); lcd_define_def(Def); lcd_define_end();
+
+
+// Pripravene definice fontu vybranych znaku
+// V tabulce nesmi byt 00 (konec retezce v printf()), misto toho davame 80
+//
+#define LCD_CHAR_BAT100 "\x0E\x1F\x1F\x1F\x1F\x1F\x1F\x1F" /* symbol plne baterie */
+#define LCD_CHAR_BAT50 "\x0E\x1F\x11\x11\x13\x17\x1F\x1F" /* symbol polovicni baterie */
+#define LCD_CHAR_BAT0 "\x0E\x1F\x11\x11\x11\x11\x11\x1F" /* symbol vybite baterie */
+#define LCD_CHAR_UP "\x80\x04\x0E\x15\x04\x04\x04\x80" /* symbol sipka nahoru */
+#define LCD_CHAR_DOWN "\x80\x04\x04\x04\x15\x0E\x04\x80" /* symbol Sipka dolu */
+#define LCD_CHAR_LUA "\x04\x0E\x11\x11\x1F\x11\x11\x80" /* A s carkou */
+#define LCD_CHAR_LLA "\x01\x02\x0E\x01\x1F\x11\x0F\x80" /* a s carkou */
+#define LCD_CHAR_HUC "\x0A\x0E\x11\x10\x10\x11\x0E\x80" /* C s hackem */
+#define LCD_CHAR_HLC "\x0A\x04\x0E\x10\x10\x11\x0E\x80" /* c s hackem */
+#define LCD_CHAR_HUD "\x0A\x1C\x12\x11\x11\x12\x1C\x80" /* D s hackem */
+#define LCD_CHAR_HLD "\x05\x03\x0D\x13\x11\x11\x0F\x80" /* d s hackem */
+#define LCD_CHAR_LUE "\x04\x1F\x10\x10\x1E\x10\x1F\x80" /* E s carkou */
+#define LCD_CHAR_LLE "\x01\x02\x0E\x11\x1F\x10\x0E\x80" /* e s carkou */
+#define LCD_CHAR_HUE "\x0A\x1F\x10\x1E\x10\x10\x1F\x80" /* E s hackem */
+#define LCD_CHAR_HLE "\x0A\x04\x0E\x11\x1F\x10\x0E\x80" /* e s hackem */
+#define LCD_CHAR_LUI "\x04\x0E\x04\x04\x04\x04\x0E\x80" /* I s carkou */
+#define LCD_CHAR_LLI "\x02\x04\x80\x0C\x04\x04\x0E\x80" /* i s carkou */
+#define LCD_CHAR_HUN "\x0A\x15\x11\x19\x15\x13\x11\x80" /* N s hackem */
+#define LCD_CHAR_HLN "\x0A\x04\x16\x19\x11\x11\x11\x80" /* n s hackem */
+#define LCD_CHAR_LUO "\x04\x0E\x11\x11\x11\x11\x0E\x80" /* O s carkou */
+#define LCD_CHAR_LLO "\x02\x04\x0E\x11\x11\x11\x0E\x80" /* o s carkou */
+#define LCD_CHAR_HUR "\x0A\x1E\x11\x1E\x14\x12\x11\x80" /* R s hackem */
+#define LCD_CHAR_HLR "\x0A\x04\x16\x19\x10\x10\x10\x80" /* r s hackem */
+#define LCD_CHAR_HUS "\x0A\x0F\x10\x0E\x01\x01\x1E\x80" /* S s hackem */
+#define LCD_CHAR_HLS "\x0A\x04\x0E\x10\x0E\x01\x1E\x80" /* s s hackem */
+#define LCD_CHAR_HUT "\x0A\x1F\x04\x04\x04\x04\x04\x80" /* T s hackem */
+#define LCD_CHAR_HLT "\x0A\x0C\x1C\x08\x08\x09\x06\x80" /* t s hackem */
+#define LCD_CHAR_LUU "\x02\x15\x11\x11\x11\x11\x0E\x80" /* U s carkou */
+#define LCD_CHAR_LLU "\x02\x04\x11\x11\x11\x13\x0D\x80" /* u s carkou */
+#define LCD_CHAR_CUU "\x06\x17\x11\x11\x11\x11\x0E\x80" /* U s krouzkem */
+#define LCD_CHAR_CLU "\x06\x06\x11\x11\x11\x11\x0E\x80" /* u s krouzkem */
+#define LCD_CHAR_LUY "\x02\x15\x11\x0A\x04\x04\x04\x80" /* Y s carkou */
+#define LCD_CHAR_LLY "\x02\x04\x11\x11\x0F\x01\x0E\x80" /* y s carkou */
+#define LCD_CHAR_HUZ "\x0A\x1F\x01\x02\x04\x08\x1F\x80" /* Z s hackem */
+#define LCD_CHAR_HLZ "\x0A\x04\x1F\x02\x04\x08\x1F\x80" /* z s hackem */
+
+
+// Priklad pouziti definovanych znaku
+//
+//
+//void lcd_sample()
+//{
+// lcd_define_char(0,LCD_CHAR_BAT50); // Priklad definice znaku baterie do pozice 0
+// lcd_define_char(2,LCD_CHAR_HLE LCD_CHAR_LUI); // Priklad definice znaku e s hackem a I s carkou od pozice 2
+// // vsimnete si, ze neni carka mezi retezci s definici (oba retezce definuji
+// // jediny definicni retezec)
+// printf(lcd_putc,"\fZnaky:\20\22\23"); // priklad vypisu znaku z pozice 0, 2 a 3
+// delay_ms(1000);
+// lcd_define_char(0,LCD_CHAR_BAT0); // Predefinovani tvaru znaku v pozici 0
+// delay_ms(1000);
+//}


LCTmetr01A/SW/lib/lcd.c

Změněné vlastnosti:

Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: LCTmetr01A/SW/lib/16f877_reg.h
===================================================================
--- LCTmetr01A/SW/lib/16f877_reg.h (revision 0)
+++ LCTmetr01A/SW/lib/16f877_reg.h (revision 922)
@@ -0,0 +1,288 @@
+////////////////////////////////////////////////////////////////////////////
+// ////
+// DEFINICE REGISTRU PROCESORU PIC16F877 ////
+// ////
+////////////////////////////////////////////////////////////////////////////
+// ////
+// PEFI S.ICZ a.s 2002 ////
+// ////
+// Verze 1.0 ////
+// ////
+////////////////////////////////////////////////////////////////////////////
+
+
+
+// registry v bance 0
+#define INDF 0x00
+#define TMR0 0x01
+#define PCL 0x02
+#define STATUS 0x03
+#define FSR 0x04
+#define PORTA 0x05
+#define PORTB 0x06
+#define PORTC 0x07
+#define PORTD 0x08
+#define PORTE 0x09
+#define PCLATH 0x0A
+#define INTCON 0x0B
+#define PIR1 0x0C
+#define PIR2 0x0D
+#define TMR1L 0x0E
+#define TMR1H 0x0F
+#define T1CON 0x10
+#define TMR2 0x11
+#define T2CON 0x12
+#define SSPBUF 0x13
+#define SSPCON 0x14
+#define CCPR1L 0x15
+#define CCPR1H 0x16
+#define CCP1CON 0x17
+#define RCSTA 0x18
+#define TXREG 0x19
+#define RCREG 0x1A
+#define CCPR2L 0x1B
+#define CCPR2H 0x1C
+#define CCP2CON 0x1D
+#define ADRESH 0x1E
+#define ADCON0 0x1F
+
+// registry v bance 1
+#define OPTION 0x81
+#define TRISA 0x85
+#define TRISB 0x86
+#define TRISC 0x87
+#define TRISD 0x88
+#define TRISE 0x89
+#define PIE1 0x8C
+#define PIE2 0x8D
+#define PCON 0x8E
+#define SSPCON2 0x91
+#define PR2 0x92
+#define SSPADD 0x93
+#define SSPSTAT 0x94
+#define TXSTA 0x98
+#define SPBRG 0x99
+#define ADRESL 0x9E
+#define ADCON1 0x9F
+
+// registry v bance 2
+#define EEDATA 0x10C
+#define EEADR 0x10D
+#define EEDATH 0x10E
+#define EEADRH 0x10F
+
+// registry v bance 3
+#define EECON1 0x18C
+#define EECON2 0x18D
+
+// bity v registru STATUS
+#define _IRP 7
+#define _RP1 6
+#define _RP0 5
+#define _NOT_TO 4
+#define _NOT_PD 3
+#define _Z 2
+#define _DC 1
+#define _C 0
+
+// bity v registru INTCON
+#define _GIE 7
+#define _PEIE 6
+#define _T0IE 5
+#define _INTE 4
+#define _RBIE 3
+#define _T0IF 2
+#define _INTF 1
+#define _RBIF 0
+
+// bity v registru PIR1
+#define _PSPIF 7
+#define _ADIF 6
+#define _RCIF 5
+#define _TXIF 4
+#define _SSPIF 3
+#define _CCP1IF 2
+#define _TMR2IF 1
+#define _TMR1IF 0
+
+// bity v registru PIR2
+#define _EEIF 4
+#define _BCLIF 3
+#define _CCP2IF 0
+
+// bity v registru T1CON
+#define _T1CKPS1 5
+#define _T1CKPS0 4
+#define _T1OSCEN 3
+#define _NOT_T1SYNC 2
+#define _T1SYNC 2
+#define _TMR1CS 1
+#define _TMR1ON 0
+
+// bity v registru T2CON
+#define _TOUTPS3 6
+#define _TOUTPS2 5
+#define _TOUTPS1 4
+#define _TOUTPS0 3
+#define _TMR2ON 2
+#define _T2CKPS1 1
+#define _T2CKPS0 0
+
+// bity v registru SSPCON
+#define _WCOL 7
+#define _SSPOV 6
+#define _SSPEN 5
+#define _CKP 4
+#define _SSPM3 3
+#define _SSPM2 2
+#define _SSPM1 1
+#define _SSPM0 0
+
+// bity v registru CCP1CON
+#define _CCP1X 5
+#define _CCP1Y 4
+#define _CCP1M3 3
+#define _CCP1M2 2
+#define _CCP1M1 1
+#define _CCP1M0 0
+
+// bity v registru RCSTA
+#define _SPEN 7
+#define _RX9 6
+#define _SREN 5
+#define _CREN 4
+#define _ADDEN 3
+#define _FERR 2
+#define _OERR 1
+#define _RX9D 0
+
+// bity registru CCP2CON
+#define _CCP2X 5
+#define _CCP2Y 4
+#define _CCP2M3 3
+#define _CCP2M2 2
+#define _CCP2M1 1
+#define _CCP2M0 0
+
+// bity v registru ADCON0
+#define _ADCS1 7
+#define _ADCS0 6
+#define _CHS2 5
+#define _CHS1 4
+#define _CHS0 3
+#define _GO 2
+#define _NOT_DONE 2
+#define _GO_DONE 2
+#define _ADON 0
+
+// bity v registru OPTION
+#define _NOT_RBPU 7
+#define _INTEDG 6
+#define _T0CS 5
+#define _T0SE 4
+#define _PSA 3
+#define _PS2 2
+#define _PS1 1
+#define _PS0 0
+
+// bity v registru TRISE
+#define _IBF 7
+#define _OBF 6
+#define _IBOV 5
+#define _PSPMODE 4
+#define _TRISE2 2
+#define _TRISE1 1
+#define _TRISE0 0
+
+// bity v registru PIE1
+#define _PSPIE 7
+#define _ADIE 6
+#define _RCIE 5
+#define _TXIE 4
+#define _SSPIE 3
+#define _CCP1IE 2
+#define _TMR2IE 1
+#define _TMR1IE 0
+
+// bity v registru PIE2
+#define _EEIE 4
+#define _BCLIE 3
+#define _CCP2IE 0
+
+// bity v registru PCON
+#define _NOT_POR 1
+#define _NOT_BOR 0
+
+// bity v registu
+#define _GCEN 7
+#define _ACKSTAT 6
+#define _ACKDT 5
+#define _ACKEN 4
+#define _RCEN 3
+#define _PEN 2
+#define _RSEN 1
+#define _SEN 0
+
+//bity v registru SSPSTAT
+#define _SMP 7
+#define _CKE 6
+#define _D 5
+#define _I2C_DATA 5
+#define _NOT_A 5
+#define _NOT_ADDRESS 5
+#define _D_A 5
+#define _DATA_ADDRESS 5
+#define _P 4
+#define _I2C_STOP 4
+#define _S 3
+#define _I2C_START 3
+#define _R 2
+#define _I2C_READ 2
+#define _NOT_W 2
+#define _NOT_WRITE 2
+#define _R_W 2
+#define _READ_WRITE 2
+#define _UA 1
+#define _BF 0
+
+// bity v registru TXSTA
+#define CSRC 7
+#define TX9 6
+#define TXEN 5
+#define SYNC 4
+#define BRGH 2
+#define TRMT 2
+#define TX9D 0
+
+// bity v registru ADCON1
+#define _ADFM 7
+#define _PCFG3 3
+#define _PCFG2 2
+#define _PCFG1 2
+#define _PCFG0 0
+
+// bity v registru EECON1
+#define _EEPGD 7
+#define _WRERR 3
+#define _WREN 2
+#define _WR 1
+#define _RD 0
+
+// masky pro nastaveni orientace I/O pinu
+#define PIN0_IN 0x01
+#define PIN1_IN 0x02
+#define PIN2_IN 0x04
+#define PIN3_IN 0x08
+#define PIN4_IN 0x10
+#define PIN5_IN 0x20
+#define PIN6_IN 0x40
+#define PIN7_IN 0x80
+
+#define PIN0_OUT ~0x01
+#define PIN1_OUT ~0x02
+#define PIN2_OUT ~0x04
+#define PIN3_OUT ~0x08
+#define PIN4_OUT ~0x10
+#define PIN5_OUT ~0x20
+#define PIN6_OUT ~0x40
+#define PIN7_OUT ~0x80


LCTmetr01A/SW/lib/16f877_reg.h

Změněné vlastnosti:

Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: LCTmetr01A/SW/lib/TM.C
===================================================================
--- LCTmetr01A/SW/lib/TM.C (revision 0)
+++ LCTmetr01A/SW/lib/TM.C (revision 922)
@@ -0,0 +1,189 @@
+////////////////////////////////////////////////////////////////////////////
+//
+// KNIHOVNA PRO PRACI S TOUCH MEMORY FY DALLAS
+//
+////////////////////////////////////////////////////////////////////////////
+//
+// PEFI S.ICZ a.s. 2002, 2003
+//
+// Verze 1.0
+// 1.1 - pridana podpora vypinani pullupu
+// pres pin TOUCH_PULLUP_PIN
+// 1.2 - vyrazena podpora pullupu, do obecne knihovny nepatri
+// - funkce checkCRC se stala soucasti fce read_sn
+// - upraveny nazvy funkci, zpetna kompatibilita neni potreba
+// 1.3 - pridana samostatna funkce pro kontrolu CRC
+//
+///////////////////////////////////////////////////////////////////////////
+//
+// funkce:
+// int8 TM_present()
+// - vraci TRUE, pokud je TM pritomna
+//
+// int8 TM_read_byte()
+// - precte bajt z TM
+//
+// int8 TM_write_byte(int8 data)
+// - zapise bajt do TM a vraci TRUE, pokud se to povedlo
+//
+// int8 TM_read_sn(int8 *sn)
+// - precte seriove cislo z TM pomoci prikazu 0x33
+// - vraci TRUE, pokud je SN platne (spravne CRC)
+//
+// definice a prepinace
+// #define TM_PIN /* pin, na kterem je touch memory pripojena */
+// #bit TM_PIN_BIT /* totez, ale definovan jako bit */
+//
+//
+// defaultni definice
+#ifndef TM_PIN
+#define TM_PIN PIN_B0
+#bit TM_PIN_BIT = PORTB.0
+#endif
+
+
+
+
+
+/****************************************************************************************************/
+// Privatni sekce, cist jen v pripade, ze neco nefunguje
+/****************************************************************************************************/
+// precte bajt z touch memory
+//
+int8 TM_read_byte() {
+ int8 i,data;
+
+ for(i=0;i<8;++i) {
+ output_low(TM_PIN);
+ delay_us(14);
+ output_float(TM_PIN);
+ delay_us(5);
+ shift_right(&data,1,input(TM_PIN));
+ delay_us(100);
+ }
+ return(data);
+}
+
+
+// zapise bajt do touch memory
+//
+int8 TM_write_byte(int8 data) {
+ int8 i;
+
+ for(i=0;i<8;++i) {
+ output_low(TM_PIN);
+ delay_us(10);
+ if(shift_right(&data,1,0)) {
+ output_float(TM_PIN);
+ delay_us(1); // k vuli nabehu jednicky pres pullup
+ if(!TM_PIN_BIT) return(0);
+ } else {
+ output_low(TM_PIN);
+ if(TM_PIN_BIT) return(0); // k vuli nabehu nuly
+ }
+ delay_us(50);
+ output_float(TM_PIN);
+// delay_us(50);
+ }
+ return(TRUE);
+}
+
+
+// testuje pritomnost touch memory, pri pritomnosti vraci TRUE
+//
+int8 TM_present() {
+ int1 present;
+
+ output_low(TM_PIN);
+ delay_us(500);
+ output_float(TM_PIN);
+ if(!input(TM_PIN))
+ return(FALSE);
+ delay_us(65);
+ present=!input(TM_PIN);
+ delay_us(240);
+ if(present)
+ return(TRUE);
+ else
+ return(FALSE);
+}
+
+// zkontroluje CRC zaznamu, vraci TRUE, pokud je zanam spravny
+//
+int8 TM_check_CRC(unsigned int8 *sn, unsigned int8 num)
+{
+#ifdef CRC_TAB
+// tabulka pro vypocet CRC
+ const int8 TouchCRC[256]= {
+ 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
+ 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
+ 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
+ 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
+ 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
+ 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
+ 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
+ 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
+ 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
+ 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
+ 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
+ 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
+ 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
+ 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
+ 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
+ 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
+#else
+ int8 j,k,l; // promenne potrebne pro algoritmicky vypocet CRC
+#endif
+ int8 CRC; // prubezne CRC
+ int8 i;
+
+
+#ifdef CRC_TAB
+ // vypocet CRC tabulkou
+ CRC=0;
+ for(i=0;i + if(CRC!=*(sn+7)) return(0);
+ else return(1);
+#else
+ // vypocet CRC algoritmicky
+ CRC=0;
+ for(i=0 ;i + k=*(sn+i);
+ #asm
+ movlw 8
+ movwf j // citac bitu
+loop:
+ movf k,W // presun bajt do W
+ xorwf CRC,W // prixoruj CRC a uloz do w
+ movwf l
+ rrf l,F // naxorovany bit do CY
+ movf CRC,W
+ btfsc 3.0 // preskoc, je-li CY nulove
+ xorlw 0x18
+ movwf CRC
+ rrf CRC,F // rotuj CRC
+ rrf k // na dalsi bit
+ decfsz j,F
+ goto loop
+ #endasm
+ }
+ if(CRC!=0) return(0);
+ else return(1);
+#endif
+}
+
+
+// precte seriove cislo z touch memory, vraci TRUE je-li platne (spravne CRC)
+//
+int8 TM_read_sn(unsigned int8 *sn)
+{
+ int8 i;
+ // precteni SN z touch memory
+ TM_write_byte(0x33);
+ for(i=0;i<8;i++) *(SN+i)=TM_read_byte(); // precti SN do buferu
+
+ if(*sn==0) return(0); // family kod je nulovy a to je chyba, timto nahrazujeme precteni samych nul, coz ma platne CRC, ale neexistuje
+ return(TM_check_CRC(SN,8));
+}
+// End of FIle
+


LCTmetr01A/SW/lib/TM.C

Změněné vlastnosti:

Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: LCTmetr01A/SW/bin/PRG.BAT
===================================================================
--- LCTmetr01A/SW/bin/PRG.BAT (revision 0)
+++ LCTmetr01A/SW/bin/PRG.BAT (revision 922)
@@ -0,0 +1,6 @@
+call picpgr stop lpt2
+call picpgr erase pic16f876 lpt2
+call picpgr program lc.hex hex pic16f876 lpt2
+call picpgr run lpt2
+pause
+call picpgr stop lpt2
\ No newline at end of file


LCTmetr01A/SW/bin/PRG.BAT

Změněné vlastnosti:

Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: LCTmetr01A/SW/bin/lc.HEX
===================================================================
--- LCTmetr01A/SW/bin/lc.HEX (revision 0)
+++ LCTmetr01A/SW/bin/lc.HEX (revision 922)
@@ -0,0 +1,639 @@
+:1000000010308A0000280000A100030E8301A20026
+:100010000A08A3008A010C1C0F28A60A0C100B1D4D
+:1000200025280B111530A400A40B142800003D3026
+:100030008100A503031D3628000000000000000019
+:1000400010100130A0008B1236280B1C2C2806083B
+:100050000230A0000B1036280C1D3628241C332833
+:100060002418071134280715A4090C1123088A0045
+:10007000220E8300A10E210E09000A108A100A1117
+:10008000820770346E3475346D340A108A100A1188
+:1000900082076E3475346D3420340A108A100A11C8
+:1000A000820728340C34013406340A108A100A11ED
+:1000B00082070C3400340A108A100A118207203497
+:1000C0002034433461346C346934623472346134C2
+:1000D000743469346F346E3400340A108A100A1193
+:1000E00082073034203420346E34483400340A100F
+:1000F0008A100A118207203443346F346E346E3410
+:1001000065346334743420344C347834203400340F
+:100110000A108A100A11820730342E3430343034F9
+:10012000203420347034463400340A108A100A1106
+:100130008207203420344534723472346F34723480
+:10014000203443347834203400340A108A100A11E1
+:10015000820730342E343034203410341134433498
+:1001600000340A108A100A118207203420344334E4
+:100170006F346E346E3465346334743420347434C4
+:1001800065346D34703400340A108A100A11820705
+:1001900020342034313430347534733420342834EE
+:1001A000353430344B3448347A34293400340A102E
+:1001B0008A100A11820720342034323430347534E6
+:1001C000733420342834323435344B3448347A3460
+:1001D000293400340A108A100A118207203420348E
+:1001E0003534303475347334203428343134303479
+:1001F0004B3448347A34293400340A148A100A11F2
+:100200008207203420343134303430347534733440
+:100210002034283435344B3448347A34293400348B
+:100220000A148A100A1182072034323430343034F0
+:10023000753473342034283432342E3435344B340E
+:1002400048347A34293400340A148A100A11820797
+:100250002034203435343034303475347334203421
+:10026000283431344B3448347A34293400340A1475
+:100270008A100A1182072034203431346D347334EB
+:1002800020342034283435343034303448347A340F
+:10029000293400340A148A100A11820720342034C9
+:1002A00032346D34733420342034283432343534CD
+:1002B000303448347A34293400340A148A100A114C
+:1002C00082072034203435346D34733420342034A4
+:1002D000283431343034303448347A3429340034DA
+:1002E0000A148A100A118207203420343134303441
+:1002F0006D34733420342034283435343034483469
+:100300007A34293400340A148A100A1182072034FE
+:100310002034323430346D34733420342034283473
+:100320003234353448347A34293400340A148A108B
+:100330000A11820720342034353430346D3473345C
+:100340002034203428343134303448347A34293459
+:1003500000340A148A100A118207203420343534FC
+:10036000303430346D347334203420342834313414
+:1003700048347A34293400340A148A100A11820766
+:1003800020342034353475347334203428343134F7
+:10039000303430344B3448347A34293400340A143D
+:1003A0008A100A11820704340A3411341F3480344D
+:1003B00000340A148A100A11820720345634653436
+:1003C0007234733469346F346E34203431342E34E3
+:1003D0003034313400340A148A100A118207283468
+:1003E0006334293420344F344B3431345834473457
+:1003F0004C342034323430343034343400340A1045
+:100400008A140A1182074D344F344434453443343E
+:1004100078344E3455344C344C3400340A108A1439
+:100420000A1182074D344F34443445344C34783407
+:100430004E3455344C344C3400340A108A140A11AA
+:1004400082074D344F3444344534203420342B3427
+:1004500054344D345034203420344E3455344C34DC
+:100460004C3400340A108A140A1182074D344F3478
+:1004700044344534203420342B3450344C345A34F2
+:1004800020345734493444345434483400346C30C4
+:100490008400000803195D2A0130F800BF30F7001E
+:1004A0006400F70B502AF80B4E2A4A30F700F70B7E
+:1004B000572A00006400800B4C2A00340508C33919
+:1004C000F300720DF700F70DFC30F70577083C39A3
+:1004D000730485008514831685100000831285102F
+:1004E0008316851083120034F008031D792A051045
+:1004F0007A2A051483160510F10E7108F200831292
+:100500005E22F10E7108F2005E220D30F700F70B4B
+:10051000872A00341430EC004722C3308316850547
+:10052000831205108316051083128510831685101B
+:100530008312B6013608023C031CA62A0230EC00E6
+:1005400047220330F2005E22B60A9A2A0D30F700E5
+:10055000F70BA82A0230F2005E220D30F700F70BED
+:10056000AF2AB6013608023C031CC22A36084D20C9
+:10057000B700F0013708F10074220230EC00472286
+:10058000B60AB22A8A110A1640280130F00038084B
+:10059000F10074220034871707170A30EC00472255
+:1005A00087130713003401306C02EE006D08023C23
+:1005B000031DDC2A4030EE076E088038EF00F001A2
+:1005C0006F08F100742200346B08F7000C307702DA
+:1005D0000319F72A0A3077020319FF2A0D30770230
+:1005E0000319052B0830770203190A2B0F2BF00192
+:1005F0000130F10074220230EC0047221B2B013045
+:10060000EC000230ED00D3221B2B0130EC00ED009A
+:10061000D3221B2BF0011030F10074221B2B6B082E
+:100620001F3C031C152B0730EB050130F0006B0855
+:10063000F10074221B2B0034B630F700FA01F901E7
+:10064000F8015A085B045C045D04031D292BF701C3
+:10065000362B0310F81B352BDA0DDB0DDC0DDD0D11
+:10066000FA0DF90DF80DF70B292BF8138A110A1260
+:10067000DD2B5D080319AA2BE50061080319AA2BDD
+:10068000E507031C442B4B2B7F30E502031CAA2BF0
+:100690000319AA2B4F2B8130E5070318AA2B6508F5
+:1006A000F700F801F901FA015E08E900E9175F08AF
+:1006B000E8006008E7001830E500E601671C782BC9
+:1006C0006408FA07031C6A2BF90A031D6A2BF80A4F
+:1006D0000319E6176308F907031C712BF80A0319BD
+:1006E000E6176208DF00DF175F08F8070318E61750
+:1006F000E60DF80CF90CFA0CE90CE80CE70C031009
+:10070000E50B5D2B0130F7070318AA2BF81B8F2B85
+:10071000E90DFA0DF90DF80DF7030319AA2BE91FDE
+:10072000A02BFA0A031DA02BF90A031DA02BF80A1F
+:10073000031DA02BF80CF90CFA0CF70A0319AA2BCD
+:100740005E08E6006208E606E61FA82BF817AE2B47
+:10075000F813AE2BF701F801F901FA01000000349B
+:1007600010108E018F01A6010030A00010143D3042
+:1007700081000530A5000B118B16A008031DC12BAD
+:10078000BD2B0F08FA000E08F7000F087A02031DB0
+:10079000C12B7708D9007A08DA00FA012608F90097
+:1007A0005908F7005A08F8007A08DD007908DC00DB
+:1007B0007808DB007708DA001C2BE001DF01DE019E
+:1007C0008130DD007A08E4007908E3007808E2006F
+:1007D0007708E10039237A08D8007908D70078082B
+:1007E000D6007708D5005808E0005708DF00560803
+:1007F000DE005508DD005808E4005708E3005608FD
+:10080000E2005508E10039230034871787160A30C3
+:10081000EC00472287138712003480300318DE066D
+:10082000E3015A08E2005E08E20659080319FA2CAF
+:10083000E100F7005D080319032DE1020319A02C64
+:100840000318232C5F2C5E08E700E7175F08E6001B
+:100850006008E500E4010310E70CE60CE50CE40C8D
+:10086000E10B2A2CE21F372C6314172D6310611043
+:1008700063165C3084002D2D6312E21B492C611C31
+:10088000542CE70CE60CE50CE40CF70A0319122DC6
+:10089000542CE71B572C0310E40DE50DE60DE70D76
+:1008A000F7030319122D492C6317BF2C63135A0841
+:1008B000E200DA1F5D2CE7170B2DE7130B2D5D0807
+:1008C000E100F7005908E1025A08E700E7175B0862
+:1008D000E6005C08E500E4010310E70CE60CE50C1B
+:1008E000E40CE10B6B2CE21F782CE314172DE310C2
+:1008F0006110E316603084002D2DE312E21B8A2C78
+:10090000611C952CE70CE60CE50CE40CF70A0319C6
+:10091000122D952CE71B982C0310E40DE50DE60D28
+:10092000E70DF7030319122D8A2CE317BF2CE313ED
+:100930005E08E200DE1F9E2CE7170B2DE7130B2D40
+:100940005E08E700E7175F08E6006008E500E21FC1
+:10095000AD2CE7136315172D6311E40161105C30B2
+:1009600084002D2DE21BD52C5A08E200611CBF2CFF
+:10097000E70CE60CE50CE40CF70A0319122DE41F52
+:10098000D02CE50A031DD02CE60A031DD02CE70A63
+:10099000031DD02CE70CE60CE50CF70A0319122D09
+:1009A000631B562CE31B972CF42C8030E706E71FC3
+:1009B000DD2C172D5E08E200EA2C5A08E200E70859
+:1009C000031DEA2CE608031DEA2CE508031DEA2CAA
+:1009D000F7010B2DE71BF42C0310E40DE50DE60DDC
+:1009E000E70DF70BEA2C122DE21FF82CE7170B2D61
+:1009F000E7130B2D5D08F7005E08E7005F08E600CF
+:100A00006008E5000B2D5908F7005A08E7005B085D
+:100A1000E6005C08E5006708F8006608F90065086C
+:100A2000FA004C2DF701F801F901FA014C2DE4010F
+:100A3000E509E609E709E409E40A031D262DE50AAC
+:100A4000031D262DE60A031D262DE70A6318362C02
+:100A5000E318772C6319AC2CDA2C0008E507031C8B
+:100A6000372DE60A031D372DE70A031961148403A5
+:100A70000008E607031C3F2DE70A031961148403ED
+:100A80000008801B442D803AE70703186114631A9D
+:100A90003C2CE31A7D2CB22C0000003458080319BA
+:100AA000142EE4005C080319142EE4020318592DD7
+:100AB0005E2D7F30E4070318142E642D8130E4028C
+:100AC000031C142E0319142E6408F700F801F90111
+:100AD000FA01E3015908E200E2175A08E1005B0855
+:100AE000E0001930E4005F08E0020318872D0130B0
+:100AF000E1020318872DE2020318872DE302031891
+:100B0000872DE30AE20AE10A5F08E007B92D5E08D3
+:100B1000E1020318A22D0130E2020318A22DE30224
+:100B20000318A22DE30AE20A5E08E1075F08E00766
+:100B3000031CB92DE10A031DB92DE20A031DB92DCD
+:100B4000E30AB92D5D088038E2020318B82D0130A0
+:100B5000E3020318B82DE30A5D088038E2075E0857
+:100B6000E107031C962DE20A031D962DE30A962D3C
+:100B70007A14E40BBC2DC72D0310E00DE10DE20D3E
+:100B8000E30D0310FA0DF90DF80DE50D732D651C3D
+:100B9000CF2D0310F80CF90CFA0CE50CD22DF7034D
+:100BA0000319142EE51BFB2D0310E00DE10DE20DE2
+:100BB000E30D5F08E0020318E72D0130E10203189E
+:100BC000E72DE2020318E72DE302031C0A2E5E085C
+:100BD000E1020318F22D0130E2020318F22DE302C4
+:100BE000031C0A2E5D088038E2020318FB2D013039
+:100BF000E302031C0A2EFA0A031D0A2EF90A031D3A
+:100C00000A2EF80A031D0A2EF70A0319142EF80CEF
+:100C1000F90CFA0C5908E4005D08E406E41F122EF2
+:100C2000F817182EF813182EF701F801F901FA0138
+:100C3000000000340130EC00ED00D322D50155084E
+:100C40000F3C031C282E2030EB00E422D50A1F2E77
+:100C50000130EC00ED00D3220034861F312E061B3C
+:100C6000352E1430EC0047222D2EA00100345F08F1
+:100C7000E6006308E606E61F422E03110310DF1BA1
+:100C80000314752E5F08E6006208E7005E08E702BD
+:100C90000319502EE61F752E0308013A8300752EA6
+:100CA0006308E7005F08E70203195C2EE61F752E54
+:100CB0000308013A8300752E6408E7006008E70224
+:100CC0000319682EE61F752E0308013A8300752E5E
+:100CD0006508E7006108E7020319742EE61F752E08
+:100CE0000308013A8300752E031000340130D90047
+:100CF0005508F7005608F8005708F9005808FA0098
+:100D0000F8137708DA007808DB007908DC007A0845
+:100D1000DD00E101E0012030DF008230DE005D080F
+:100D2000E5005C08E4005B08E3005A08E2003726AF
+:100D3000031CB52E5808E0005708DF005608DE00F7
+:100D40005508DD00CD30E400CC30E3004C30E2004B
+:100D50007B30E10039237A08D8007908D700780879
+:100D6000D6007708D500D90A782E5908F800003443
+:100D7000071607170A30EC004722071207138A11DB
+:100D80000A16DE2C8316061083120610A630F70012
+:100D9000F70BC82E000083160614061483120618DB
+:100DA000D42E0030F800EF2E1530F700F70BD62EBA
+:100DB0000000831606148312061CE02E5010E12E4C
+:100DC00050144F30F700F70BE32E00000000501CCA
+:100DD000ED2E0130F800EF2EEF2E0030F800003439
+:100DE000D1015108073C031C1E2F831606108312E5
+:100DF00006100330F700F70BFB2E0310D00C031C7A
+:100E00000B2F831606140000831206180A2F0030D9
+:100E1000F800202F142F8316061083120610061CCC
+:100E2000142F0030F800202F1030F700F70B162F8A
+:100E30000000831606148312D10AF12E0130F80047
+:100E400000348E30F7005508F8005408F900FA0114
+:100E5000F808031D352F7908F800F9010830F7026A
+:100E6000F808031D352FF7013D2F0310F81B3C2F09
+:0E0E7000F90DF80DF703352FF81300000034CC
+:101000000408DF00E001D71F0A282D30EB008A1109
+:10101000E4228A15D71756080319AE287F305602E6
+:10102000031C6928D600E5010430E6000310D90D41
+:10103000D80DD70DE00DE60B162804305602031824
+:10104000292803305602031DA3280A306002031C1E
+:10105000A3280330D602E50A50210310D90DD80D7C
+:10106000D70DE00D39210230E6000310E00CD70C5B
+:10107000D80CD90CE60B352850210430E6000310BB
+:10108000E10CE20CE30CE40CE60B3F283921502183
+:101090006308E4006208E3006108E200E10139212D
+:1010A00050216208E4006108E300E101E201392116
+:1010B000E0191D28D608031D6228D90AD80AD70AC4
+:1010C000E00AA3280310D90DD80DD70DE00DD603E3
+:1010D0001D28D609D60A7F30D607E5010430E60080
+:1010E0000310D90DD80DD70DE00DE60B7028043094
+:1010F000D60705305602031CB02850210310D90D25
+:10110000D80DD70DE00D0310D90DD80DD70DE00D7A
+:1011100039210310D90DD80DD70DE00DE50A0330A4
+:10112000E6000310E00CD70CD80CD90CE60B912884
+:101130000330D602601E79280310E00CD70CD80CBF
+:10114000D90CD6037928D609D60A0330D607650804
+:10115000DB006508DD005F0ADD07DD285F0AE500CA
+:101160003030EB008A11E4228A15DF080319372991
+:101170002E30EB008A11E4228A156508DE00DE03BA
+:101180005F085E02031CC6285F08DE00DE08031944
+:10119000D0283030EB008A11E4228A15DE0BC928F2
+:1011A0006508E6005F0AE60203185929D6035F0ABC
+:1011B000DD006508DD025D08DB006008DA00560826
+:1011C0000319E728DC000310DA0CDC0BE3285D08C8
+:1011D0000319372930305A07EB008A11E4228A15A7
+:1011E0005B08031DFB28DF08031937292E30EB00AD
+:1011F0008A11E4228A15DB03DD0303193729560817
+:1012000003190729DC000310DA0DDC0B03295A0847
+:10121000E0026008E1005708E2005808E3005908BE
+:10122000E4000310D90DD80DD70DE00D0310D90D32
+:10123000D80DD70DE00D6408D907031C2429D80F59
+:101240002429D70F2429E00A6308D807031C2B2977
+:10125000D70F2B29E00A6208D7070318E00A6108B4
+:10126000E0070310D90DD80DD70DE00DDD280000E3
+:1012700059296408D907031C4229D80F4229D70FDE
+:101280004229E00A6308D807031C4929D70F4929D6
+:10129000E00A6208D7070318E00A6108E007003493
+:1012A0006008E1005708E2005808E3005908E4002C
+:1012B0000034000000340130C1004310CB01CA01EA
+:1012C000C901C8012008023C031D9429061B6C2992
+:1012D00083160614402B8312861B94294708CB00E3
+:1012E0004608CA004508C9004408C8004314013034
+:1012F000C1008A111A268A150630EC000130ED0073
+:101300008A11D3228A15D00150088A11A5208A1586
+:10131000D00AEB008A11E4228A1507305002031D1F
+:1013200084298A112D268A154108FD3E03183B2B7E
+:10133000033E442BC20B9E290230C1003B2B8A1175
+:10134000C2268A15F808031DBC298A111A268A1597
+:10135000D00150088A11B1208A15D00AEB008A11F9
+:10136000E4228A150E305002031DA929CB01CA01BF
+:10137000C901C80143100A2BCC30D0008A11F026D5
+:101380008A15BE30D0008A11F0268A15C0014008A7
+:10139000083C031CFA2936304007D000D101D101A6
+:1013A0005108073C031CF22983160610831206100D
+:1013B0000430F700F70BDA2900008316061400004A
+:1013C0000000000000000000061483120618EA293D
+:1013D0000310EB290314D20C2130F700F70BEE2990
+:1013E000D10AD0295208F8005008840078088000FB
+:1013F000C00AC7293630D0000930D100D501D60146
+:10140000510856020318192A56085007840000088C
+:10141000D3000830D20053085506D400D40C550828
+:101420000318183AD500D50CD30CD20B0B2AD60AC8
+:10143000002AD5080319202A0030F800222A222A7F
+:101440000130F800F80803190A2B0310B60C371CFA
+:101450002A2AB6173708FA003608D4003708D5000C
+:101460008A1121278A157A08C7007908C6007808EA
+:10147000C5007708C40003144708DC004608DB00F9
+:101480004508DA004408D900E001DF01DE017D30C3
+:10149000DD008A110D248A157708D0007808D10064
+:1014A0007908D2007A08D300D5013C08D4008A110B
+:1014B00021278A150314DC01DB01DA018330D9000E
+:1014C0007A08E0007908DF007808DE007708DD00A0
+:1014D0008A110D248A157708D4007808D500790878
+:1014E000D6007A08D700DB005608DA005508D90084
+:1014F0005408D800DF01DE01DD018330DC008A11F1
+:101500004E258A1503105308DC005208DB005108F1
+:10151000DA005008D9007A08E0007908DF0078087E
+:10152000DE007708DD008A110D248A157A08C700CD
+:101530007908C6007808C5007708C4000314470876
+:10154000DC004608DB004508DA004408D9004B08F7
+:10155000E0004A08DF004908DE004808DD008A1183
+:101560000D248A157A08CF007908CE007808CD00BE
+:101570007708CC008A111A268A154F08D8004E0821
+:10158000D7004D08D6004C08D5008A1176268A155A
+:101590007808063CD000EC000130ED008A11D3221F
+:1015A0008A15E101E001DF01DE014F08E5004E0888
+:1015B000E4004D08E3004C08E2008A1137268A1542
+:1015C0000318E42A031DE92A2030EB008A11E422E3
+:1015D0008A15013084004F08D9004E08D8004D0804
+:1015E000D7004C08D60000202030EB008A11E422FE
+:1015F0008A15431C002B1030EB008A11E4228A1557
+:101600001130EB008A11E4228A154330EB008A1175
+:10161000E4228A150130C1008A11C2268A15F80811
+:10162000031D292B8A111A268A15D00150088A1108
+:10163000B1208A15D00AEB008A11E4228A150E30F7
+:101640005002031D162BCB01CA01C901C80143106A
+:101650003A2BCC30D0008A11F0268A154430D000C5
+:101660008A11F0268A158316061083120614043098
+:10167000C200C1013B2B8A11B0238A15622983164F
+:1016800083128A110A160B2F0A148A140A11820770
+:101690009A290C2B9F29271127088316870083126C
+:1016A0000715A40183160108C039203881000930CC
+:1016B000831203178D008F0183168C130C14831271
+:1016C0000C080313B6008A111A268A153608F23E52
+:1016D0000318CF2C0E3E182DB70137088A11C420ED
+:1016E0008A15B70AEB008A11E4228A150E303702F8
+:1016F000031D6D2B0030F800043892001330831660
+:101700009200831207110C30970096010A30950061
+:10171000CF2CB70137088A11D7208A15B70AEB00FA
+:101720008A11E4228A150E303702031D8A2B0030FD
+:10173000F8000438920027308316920083120711B4
+:101740000C309700960114309500CF2CB701370864
+:101750008A11EA208A15B70AEB008A11E4228A1559
+:101760000E303702031DA72B0030F800043892001A
+:10177000633083169200831207110C309700960194
+:1017800032309500CF2CB70137088A11FD208A1519
+:10179000B70AEB008A11E4228A150E303702031DC6
+:1017A000C42B0030F80004389200C7308316920032
+:1017B000831207110C309700960164309500CF2CEE
+:1017C000B70137088A1110218A15B70AEB008A1170
+:1017D000E4228A150F303702031DE12B0030F80098
+:1017E00005389200633083169200831207110C3083
+:1017F0009700960132309500CF2CB70137088A1137
+:1018000024218A15B70AEB008A11E4228A150E30CA
+:101810003702031DFE2B0030F80005389200F93026
+:1018200083169200831207110C30970096017D30C9
+:101830009500CF2C0030F800920000308316920003
+:101840008312B70137088A1137218A15B70AEB00CE
+:101850008A11E4228A150E303702031D222C0B3028
+:1018600097008530900003309600E830950083168D
+:101870000C158312CF2CB70137088A114A218A151B
+:10188000B70AEB008A11E4228A150E303702031DD5
+:101890003C2C07309600D0309500CF2CB70137088C
+:1018A0008A115D218A15B70AEB008A11E4228A1594
+:1018B0000E303702031D4F2C1330960088309500F0
+:1018C000CF2CB70137088A1170218A15B70AEB00AF
+:1018D0008A11E4228A150E303702031D622C27304C
+:1018E000960010309500CF2CB70137088A1183215C
+:1018F0008A15B70AEB008A11E4228A150E303702E6
+:10190000031D752C4E30960020309500CF2CB7016A
+:1019100037088A1196218A15B70AEB008A11E4224A
+:101920008A150E303702031D882CC33096005030C4
+:101930009500CF2CB70137088A11A9218A15B70A5B
+:10194000EB008A11E4228A150E303702031D9B2C0E
+:10195000B5309000F430960024309500CF2CB701BC
+:1019600037088A11BC218A15B70AEB008A11E422D4
+:101970008A150E303702031DB02C83160C1100306F
+:10198000F800043883129200093083169200831203
+:1019900007110C309700960105309500CF2C2008D8
+:1019A000023C0319D42CCF2C061BE82C831601080B
+:1019B000C0390738810087308312900010108316D9
+:1019C0000C1183122715270883168700142D831204
+:1019D000861B122D36080D3C031DF02CB601F12C90
+:1019E000B60A093003178D008F0103133608031759
+:1019F0008C0083168C130C15831203130B08F7004D
+:101A00008B138316031755308D00AA308D008C146C
+:101A10008C18082D0C117708831203138B048A117C
+:101A20002D268A15632B831683128A110A162B2FF3
+:101A30000A148A100A1582076C2B892BA62BC32B3C
+:101A4000E02BFD2B1A2C3B2C4E2C612C742C872C5C
+:041A50009A2CAF2CF1
+:1020000084011F308305073083169F00FF30831241
+:10201000A700831681130108C03907388100873073
+:10202000831290001010271227088316870083124E
+:102030000712A71327088316870083128713A71296
+:102040002708831687008312871227132708831611
+:1020500087008312071327152708831687000614A5
+:1020600086148312A710270883168700831287100F
+:10207000A711270883168700831287110A128A2A5C
+:102080000A16F0014030F1000A1274220A160230DA
+:10209000EC000A1247220A160330B6008030B8005E
+:1020A0000A12C5220A16B60B4E28B70137080A12C3
+:1020B000CF210A16B70AB8000A12C5220A1605303F
+:1020C0003702031D5628F0010330F1000A12742272
+:1020D0000A160230EC000A1247220A16F0014830B4
+:1020E000F1000A1274220A160230EC000A1247228A
+:1020F0000A160E30B8000A12C5220A160A30B800B5
+:102100000A12C5220A160E30B8000A12C5220A1693
+:102110000530B6008030B8000A12C5220A16B60B88
+:102120008A28F0010330F1000A1274220A160230E4
+:10213000EC000A1247220A160A12CB220A1683164C
+:102140000C1483128B15C0308B04B60136080A12AA
+:1021500055200A1600380319B328B60AEB000A12F4
+:10216000E4220A16A628B60136080A12D9210A1650
+:10217000B60AEB000A12E4220A160D303602031DDD
+:10218000B4280130EC000230ED000A12D3220A1606
+:10219000B60136080A12EB210A16B60AEB000A123B
+:1021A000E4220A160F303602031DC9280830B60093
+:1021B000FA30EC000A1247220A16B60BD8280A1287
+:1021C000B0230A167A08AB007908AA007808A9009B
+:1021D0007708A8003510A001083003178D008F0183
+:1021E00083168C130C1483120C080313B4003408E8
+:1021F000FC3E0318302F043E582F3518E929BA0148
+:102200003A080A1255200A16003803190D29BA0A8D
+:10221000EB000A12E4220A160029BA013A080A124F
+:102220005B200A16BA0AEB000A12E4220A160D30E5
+:102230003A02031D0E290A12CB220A160830BA00F0
+:10224000FA30EC000A1247220A16BA0B20290A12A9
+:1022500005240A160830BA00FA30EC000A124722A8
+:102260000A16BA0B2C290A12B0230A167A08B900EA
+:102270007908B8007808B7007708B600E001DF01F8
+:102280007930DE008830DD003908E4003808E300EA
+:102290003708E2003608E1000A1239230A167708E7
+:1022A000BA007808BB007908BC007A08BD000314A6
+:1022B0002B08DC002A08DB002908DA002808D900EE
+:1022C0003908E0003808DF003708DE003608DD0096
+:1022D0000A120D240A163D08DB003C08DA003B0810
+:1022E000D9003A08D8007A08DF007908DE007808BB
+:1022F000DD007708DC000A124E250A167A08AF00C6
+:102300007908AE007808AD007708AC00E630E00050
+:10231000E930DF001D30DE008430DD002B08E400F2
+:102320002A08E3002908E2002808E1000A123923FC
+:102330000A167708BA007808BB007908BC007A084A
+:10234000BD00E0007908DF007808DE007708DD00D6
+:102350002F08E4002E08E3002D08E2002C08E1001D
+:102360000A1239230A167708BE007808BF007908D8
+:10237000C0007A08C100E0007908DF007808DE00BC
+:102380007708DD00CC30E400BC30E3000C30E20024
+:102390005730E1000A1239230A162830DB006B306F
+:1023A000DA006E30D9009C30D8007A08DF00790856
+:1023B000DE007808DD007708DC000A124E250A16D8
+:1023C0007A08B3007908B2007808B1007708B00045
+:1023D00035140A12CB220A160130EC000230ED004F
+:1023E0000A12D3220A16B60136080A12FF210A166B
+:1023F000B60AEB000A12E4220A1604303602031D64
+:10240000F4290330B7002030EB000A12E4220A1648
+:10241000B70B032A4330EB000A12E4220A16783085
+:10242000EB000A12E4220A160330B8002030EB0059
+:102430000A12E4220A16B80B162A0630B900390827
+:102440000A12FF210A16B90AEB000A12E4220A1640
+:102450000A303902031D1F2AC8013E30C700470851
+:10246000413C031C442A470884004808C80ACA00A3
+:1024700003178D008F0183168C130C1483120C0824
+:1024800080000313C70A2F2A0A12B0230A167A08FB
+:10249000B9007908B8007808B7007708B600200BB3
+:1024A000522AA92A061B552AEE2B861BA82A3D086C
+:1024B000C1003C08C0003B08BF003A08BE00C8018C
+:1024C0003E30C7004708413C031C8D2A4808C80A13
+:1024D000C900470884000008CA00490803178D0096
+:1024E0008F0103134A0803178C0083168C130C15F5
+:1024F000831203130B08F7008B1383160317553051
+:102500008D00AA308D008C148C18842A0C11770849
+:10251000831203138B04C70A622A0A121A260A16A8
+:102520000630EC000130ED000A12D3220A16C90170
+:1025300049080A1288200A16C90AEB000A12E42286
+:102540000A1608304902031D982A0A122D260A1677
+:10255000ED2B3908E1003808E0003708DF003608C5
+:10256000DE00E501E4014830E3008530E2000A12B4
+:1025700037260A16031CD72A0A121A260A16C90178
+:1025800049080A1295200A16C90AEB000A12E42229
+:102590000A160B304902031DC02A0330CA0021303D
+:1025A000EB000A12E4220A16CA0BCF2AED2B2B08E5
+:1025B000DB002A08DA002908D9002808D8003908E1
+:1025C000DF003808DE003708DD003608DC000A12BC
+:1025D0004E250A167708C9007808CA007908CB008A
+:1025E0007A08CC0003147A08DC007908DB0078084C
+:1025F000DA007708D900E001DF01DE017F30DD007D
+:102600000A120D240A167708CD007808CE00790842
+:10261000CF007A08D000E0007908DF007808DE00FB
+:102620007708DD002F08E4002E08E3002D08E20003
+:102630002C08E1000A1239230A167A08BD0079082D
+:10264000BC007808BB007708BA0003143D08DC0022
+:102650003C08DB003B08DA003A08D9004108E000FA
+:102660004008DF003F08DE003E08DD000A120D24AE
+:102670000A167A08C5007908C4007808C3007708EC
+:10268000C2000A121A260A16D5014208F7004308AA
+:10269000F8004408F9004508FA00F8134208D6008B
+:1026A0007808D7004408D8004508D900E101E001C6
+:1026B0007A30DF008830DE004508E5004408E40099
+:1026C0007808E3004208E2000A1237260A16031CC3
+:1026D000862B4508E0004408DF004308DE0042087E
+:1026E000DD006F30E4001230E3000330E2007530AB
+:1026F000E1000A1239230A167A08C5007908C400D5
+:102700007808C3007708C200D50A452B5508F800A1
+:102710007808C6004508D8004408D7004308D6000A
+:102720004208D5000A1276260A167808063CC90027
+:10273000EC000130ED000A12D3220A16E101E0019B
+:10274000DF01DE014508E5004408E4004308E3003A
+:102750004208E2000A1237260A160318B12B031D9D
+:10276000B62B2030EB000A12E4220A16C608031D1D
+:10277000C92B023084004508D9004408D80043081A
+:10278000D7004208D6000A128A1500200A168A11BC
+:10279000D82B033084004508D9004408D8004308EA
+:1027A000D7004208D6000A128A1500200A168A119C
+:1027B0000C30EC000130ED000A12D3220A16460854
+:1027C0000A123D200A16C900EB000A12E4220A167A
+:1027D0004630EB000A12E4220A16442AB401302FD4
+:1027E0003518DC2CBA013A080A1255200A160038AE
+:1027F0000319002CBA0AEB000A12E4220A16F32B82
+:10280000BA013A080A125B200A16BA0AEB000A1249
+:10281000E4220A160D303A02031D012C0A12CB22C3
+:102820000A160830BA00FA30EC000A1247220A16DB
+:10283000BA0B132C0A1205240A160830BA00FA3013
+:10284000EC000A1247220A16BA0B1F2C0A12B023F8
+:102850000A167A08B9007908B8007808B70077082E
+:10286000B600E001DF017930DE008830DD00390894
+:10287000E4003808E3003708E2003608E1000A12F5
+:1028800039230A167708BA007808BB007908BC001B
+:102890007A08BD0003142B08DC002A08DB00290895
+:1028A000DA002808D9003908E0003808DF003708C6
+:1028B000DE003608DD000A120D240A163D08DB0092
+:1028C0003C08DA003B08D9003A08D8007A08DF0053
+:1028D0007908DE007808DD007708DC000A124E2552
+:1028E0000A167A08AF007908AE007808AD007708BC
+:1028F000AC00E630E000E930DF001D30DE0084305F
+:10290000DD002B08E4002A08E3002908E20028087B
+:10291000E1000A1239230A167708BA007808BB00CA
+:102920007908BC007A08BD00E0007908DF0078086B
+:10293000DE007708DD002F08E4002E08E3002D08F4
+:10294000E2002C08E1000A1239230A167708BE00BB
+:102950007808BF007908C0007A08C100E000790853
+:10296000DF007808DE007708DD00CC30E400BC3002
+:10297000E3000C30E2005730E1000A1239230A1656
+:102980002830DB006B30DA006E30D9009C30D80084
+:102990007A08DF007908DE007808DD007708DC00BF
+:1029A0000A124E250A167A08B3007908B200780890
+:1029B000B1007708B00035140A12B82E0A1601309B
+:1029C000EC000230ED000A12D3220A16B6013608D6
+:1029D0000A120E220A16B60AEB000A12E4220A169E
+:1029E00004303602031DE72C0330B7002030EB0023
+:1029F0000A12E4220A16B70BF62C4C30EB000A122E
+:102A0000E4220A167830EB000A12E4220A16033098
+:102A1000B8002030EB000A12E4220A16B80B092D88
+:102A20000630B90039080A120E220A16B90AEB005C
+:102A30000A12E4220A160A303902031D122D04304C
+:102A4000C8003E30C7004708413C031C382D4708EA
+:102A500084004808C80ACA0003178D008F01831636
+:102A60008C130C1483120C0880000313C70A232D47
+:102A70000A12B0230A167A08B9007908B800780853
+:102A8000B7007708B600200B462D9E2D061B492D5A
+:102A9000EC2E861B9D2D3D08C1003C08C0003B0864
+:102AA000BF003A08BE000430C8003E30C7004708E7
+:102AB000413C031C822D4808C80AC900470884000D
+:102AC0000008CA00490803178D008F0103134A0844
+:102AD00003178C0083168C130C15831203130B0839
+:102AE000F7008B138316031755308D00AA308D0025
+:102AF0008C148C18792D0C117708831203138B0416
+:102B0000C70A572D0A121A260A160930EC0001309E
+:102B1000ED000A12D3220A16C90149080A126D20D3
+:102B20000A16C90AEB000A12E4220A160530490205
+:102B3000031D8D2D0A122D260A16EB2E3908E100F1
+:102B40003808E0003708DF003608DE00E501E40160
+:102B50004830E3008530E2000A1237260A16031CCB
+:102B6000CC2D0A121A260A16C90149080A12772022
+:102B70000A16C90AEB000A12E4220A160C304902AE
+:102B8000031DB52D0330CA002130EB000A12E422E8
+:102B90000A16CA0BC42DEB2E2B08DB002A08DA001C
+:102BA0002908D9002808D8003908DF003808DE00D5
+:102BB0003708DD003608DC000A124E250A167708B1
+:102BC000C9007808CA007908CB007A08CC00031441
+:102BD0007A08DC007908DB007808DA007708D90089
+:102BE000E001DF01DE017F30DD000A120D240A164C
+:102BF0007708CD007808CE007908CF007A08D00099
+:102C0000E0007908DF007808DE007708DD0033088F
+:102C1000E4003208E3003108E2003008E1000A1263
+:102C200039230A167A08BD007908BC007808BB0071
+:102C30007708BA0003143D08DC003C08DB003B08C1
+:102C4000DA003A08D9004108E0004008DF003F08F8
+:102C5000DE003E08DD000A120D240A167A08C500BF
+:102C60007908C4007808C3007708C2000A121A263F
+:102C70000A16D5014208F7004308F8004408F90095
+:102C80004508FA00F8134208D6007808D70044082F
+:102C9000D8004508D900E101E0017A30DF00883032
+:102CA000DE004508E5004408E4007808E300420837
+:102CB000E2000A1237260A16031C7B2E4508E000A4
+:102CC0004408DF004308DE004208DD006F30E40006
+:102CD0001230E3000330E2007530E1000A123923BC
+:102CE0000A167A08C5007908C4007808C300770876
+:102CF000C200D50A3A2E5508F8007808C6004508E3
+:102D0000D8004408D7004308D6004208D5000A126C
+:102D100076260A167808063CC900EC000130ED0062
+:102D20000A12D3220A16E101E001DF01DE014508A3
+:102D3000E5004408E4004308E3004208E2000A1208
+:102D400037260A160318A62E031DAB2E2030EB00E3
+:102D50000A12E4220A16C608031DC72E0330C90052
+:102D60002030EB000A12E4220A16C90BB02E003004
+:102D700084004508D9004408D8004308D700420819
+:102D8000D6000A128A1500200A168A11D62E0330A0
+:102D900084004508D9004408D8004308D7004208F9
+:102DA000D6000A128A1500200A168A110C30EC008F
+:102DB0000130ED000A12D3220A1646080A124520F5
+:102DC0000A16C900EB000A12E4220A164830EB008A
+:102DD0000A12E4220A16382D0230B400302F0A12EB
+:102DE00005240A160130EC000230ED000A12D3224D
+:102DF0000A16B60136080A121D220A16B60AEB0098
+:102E00000A12E4220A1610303602031DFA2E1010A0
+:102E10000A128A155B290A168A110330B400302F72
+:102E20000A1205240A160130EC000230ED000A12E5
+:102E3000D3220A16B60136080A1232220A16B60A38
+:102E4000EB000A12E4220A1610303602031D1B2F73
+:102E50000A128A154B2B0A168A110130B400302F42
+:102E6000083003178D008F010313340803178C00FB
+:102E700083168C130C15831203130B08F7008B13A6
+:102E80008316031755308D00AA308D008C148C18D2
+:102E9000472F0C117708831203138B040A122D2677
+:102EA0000A160A30EC000A1247220A16F7286300B5
+:102EB0000A148A140A158207F02BFD28EF2E102F12
+:1042000000000000000000000000000000000000AE
+:0442100001000D009C
+:02400E00393F38
+:00000001FF
+;PIC16F876


LCTmetr01A/SW/bin/lc.HEX

Změněné vlastnosti:

Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: LCTmetr01A/SW/lc.PJT
===================================================================
--- LCTmetr01A/SW/lc.PJT (revision 0)
+++ LCTmetr01A/SW/lc.PJT (revision 922)
@@ -0,0 +1,138 @@
+[PROJECT]
+Target=lc.HEX
+Development_Mode=2
+Processor=0x876F
+ToolSuite=CCS
+
+[Directories]
+Include=C:\PROGRAM FILES\PICC\DEVICES\;C:\LIBRARY\CCS;C:\Program Files\PICC\Drivers;
+Library=
+LinkerScript=
+
+[Target Data]
+FileList=lc.c;
+BuildTool=C-COMPILER
+OptionString=+FM;
+AdditionalOptionString=
+BuildRequired=0
+
+[lc.c]
+Type=4
+Path=
+FileList=16F876.H;16F877_R.H;LC.H;LCD.C;
+BuildTool=
+OptionString=
+AdditionalOptionString=
+
+[Fuses]
+Frequency=4000000.000000
+ClockSource=1
+Mode=0
+WDTEnable=0
+WDTBreak=0
+WDTPrescale=710
+StackBreak=0
+Freeze=1
+EmulatorMemory=1
+ShortWrites=0
+PwrSetting=0
+OSC_Settings=1
+ProgBankRegEnable=0
+BankRegStartAddress=0
+BankRegEndAddress=0
+DisableIoPins=0
+12CXXX_MCLR_ENABLE=0
+CPP2_ENABLE=0
+LPSC_ENABLE=0
+MCLRPU_ENABLE=0
+
+[Trace-Config]
+GetAddress=1
+AddressWidth=5.000000
+GetOpcode=1
+OpcodeWidth=5.000000
+GetLabel=1
+LabelWidth=8.000000
+GetInstruction=1
+InstructionWidth=10.000000
+InstructionRaw=1
+GetSrcAddr=1
+SrcAddrWidth=4.000000
+SrcAddrRaw=1
+GetSrcValue=1
+SrcValueWidth=4.000000
+GetDstAddr=1
+DstAddrWidth=4.000000
+DstAddrRaw=1
+GetDstValue=1
+DstValueWidth=4.000000
+GetExtInputs=1
+ExtInputsWidth=9.000000
+ExtInputsHexFmt=0
+GetTimeStamp=1
+TimeStampWidth=11.000000
+TimeStampDiplay=0
+TraceLines=100
+TraceFull=0
+CodeCoverageReset=1
+
+[16F876.H]
+Type=5
+Path=
+FileList=
+BuildTool=
+OptionString=
+AdditionalOptionString=
+
+[16F877_R.H]
+Type=5
+Path=
+FileList=
+BuildTool=
+OptionString=
+AdditionalOptionString=
+
+[LCD.H]
+Type=5
+Path=
+FileList=
+BuildTool=
+OptionString=
+AdditionalOptionString=
+
+[LCD.C]
+Type=5
+Path=C:\LIBRARY\CCS\
+FileList=
+BuildTool=
+OptionString=
+AdditionalOptionString=
+
+[LC.H]
+Type=5
+Path=
+FileList=
+BuildTool=
+OptionString=
+AdditionalOptionString=
+
+[KBD.C]
+Type=5
+Path=C:\LIBRARY\CCS\
+FileList=
+BuildTool=
+OptionString=
+AdditionalOptionString=
+
+[mru-list]
+1=d:\pefi\projekty\lcmetr\lc.h
+2=c:\library\ccs\lcd.c
+3=d:\pefi\projekty\lcmetr\lcd.h
+4=lc.c
+
+[Windows]
+2=0000 d:\pefi\projekty\lcmetr\lc.c 25 65 589 488 9 0
+1=0020 681 10 1081 572 9 0
+0=0010 66 135 546 707 2 4 16
+Stopwatch=454 404 722 563 9 0
+


LCTmetr01A/SW/lc.PJT

Změněné vlastnosti:

Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: LCTmetr01A/SW/lc.c
===================================================================
--- LCTmetr01A/SW/lc.c (revision 0)
+++ LCTmetr01A/SW/lc.c (revision 922)
@@ -0,0 +1,883 @@
+//**********************************************************************
+// LCT-METER/PULSER
+//**********************************************************************
+// (c) OK1XGL 2004
+// verze 1.00 - uvodni verze 10.1.2004
+// verze 1.01 - pridano ukladani vlastni Cp/Lp do pameti EEPROM
+// - pridano ukladani stavu (mod, parametry modu ) do pameti EEROM
+//
+//
+// Popis funkcnosti:
+// -----------------
+// Meri kapacitu, indukcnost, teplotu a jako doplnek obsahuje generator impulzu.
+// Jednotlive druhy mereni se prepinaji stiskem tlacitka MODE. Stiskem tlacitka NUL lze
+// vynulovat mereni (odecteni vlivu mericich privodu, u mereni teploty odecteni napr. pro mereni otepleni).
+//
+// Mereni L a C:
+// -------------
+// Mereni se provadi merenim kmitoctu mericiho oscilatoru. Neznama Lx se pripojuje do serie s vnitrni L oscilatoru.
+// Neznama Cx se pripojuje paralelne k vnitrni C oscilatoru. Vypocet nezname Cx/Lx se provadi pomoci nasledujicich vzorcu:
+// Cx=((f1^2/f2^2)-1)*C Lx=((f1^2/F2^2)-1)*L
+// Pripadne se od vysledku odecte hodnota Cv nebo Lv, ktera se ziska stisknutim NUL
+// f1 - kmitocet mericiho oscilatoru, ke kteremu neni pripojena zadna Lx nebo Cx, ziska se pri kalibraci
+// f2 - kmitocet mericiho oscilatoru s pripojenou neznamou Lx nebo Cx
+// C - kapacita vnitrniho C oscilatoru, ziska se pri kalibraci
+// L - indukcnost vnitrni L oscilatoru, ziska se kalibraci
+//
+// Kalibrace:
+// ----------
+// Provadi se pri zapnuti pristroje a probiha takto:
+// Zmeri se kmitocet mericiho oscilatoru f1 ,ke kteremu neni pripojena zadna Lx nebo Cx.
+// Pripoji se kalibracni kondenzator Ck o zname hodnote, mel by byt co nejpresnejsi a nejstabilnejsi.
+// Zmeri se kmitocet mericiho oscilatoru f2.
+// Vypoctou se hodnoty L a C podle vzorcu:
+// C=(Ck*F2^2)/(F1^2-F2^2) L=(1/(4*PI^2*F1^2*C)
+// Odpoji se kalibracni kondenzator Ck a pristroj je pripraven k mereni L a C
+//
+//
+// Mereni teploty:
+// ---------------
+// Kladna merici svorka je pripojena primo na vstup procesoru. Pro mereni teploty se pouziva teplomer
+// fy Dallas DS18B20, se kterym se komunikajue po I2C sbernici.
+//
+//
+// Generovani pulzu:
+// -----------------
+// Kladna merici svorka je pripojena primo na vstup procesoru. Jsou generovany kladne pulzy se zvolenou sirkou.
+// Nulove pulzy maji stejnou sirku, tedy perioda je dvojnasobek sirky pulzu.
+//
+//
+//
+// Poznamky k implementaci:
+// ------------------------
+//
+// 1) mereni L a C
+// ----------------
+// Zakladem je mereni kmitoctu. Presnost mereni byla zvolena na 4Hz, tedy merici perioda bude 250ms. Pro citani impulzu je
+// pouzit 16 bitovy citac TMR1, ktery je rozsiren o dalsich 8 bitu promennou counter_H. Pretecenim TMR1 se v preruseni zvysi
+// hodnota counter_H o jednicku. Merici periodu odmeruje 8 bitovy citac TMR0, kteremu je predrazen preddelic :256. Cita
+// takty procesoru. TMR0 pretece kazdych 50ms. Promenna sampler_H obsahuje pocet potrebnych 50ms jednotek pro dosazeni
+// pozadovaneho casu. Prommena sampler_H se dekrementuje v preruseni. Po uplynuti merici periody (250ms) se zastavi citani
+// TMR1, ktery spolu s hodnotou v counter_H bude obsahovat mereny kmitocet s presnosti 4Hz.
+// Promenou freq_done se oznami ukonceni mereni kmitoctu. Hodnota v TMR1 a counter_H se prevede na realne cislo, ktere se
+// dale pouzije pro vypocty.
+//
+// 2) mereni teploty
+// -----------------
+// Vyuziva se teplomeru fy Dallas DS18B20, ktery komunikuje po I2C sbernici. Pro tento mod se sepne rele, ktere pripoji
+// kalibracni kondenzator Ck. Tim dojde k pripojeni svorek na vstup portu pro teplomer. Mereni teploty probiha tak, ze se
+// vysle prikaz do teplomeru aby zmeril teplotu a po uplynuti potrebne doby konverze se z teplomeru precte zmerena teplota a
+// zobrazi se. Pro odmereni doby konverze se vyuziva mereni frekvence, ktere trva 250ms.
+//
+// 3) Generovani pulzu
+// -------------------
+// Pro tento mod se sepne rele, ktere pripoji kalibracni kondenzator Ck. Tim dojde k pripojeni svorek na vystup portu
+// pro pulser. Pro generovani pulzu je vyuzivana jednotka PWM1 pro pulzy do sirky 1ms a pro pulzy delsi pak jednotka CCP1.
+// Generovani pulzu PWM1 jednotkou je zcela autonomni, jednotce se nastavi perioda (dvojnasobek sirky pulzu) a sirka pulzu
+// a generovani probiha mez zasahu programu. Jednotka CCP1 generuje periodicke preruseni po dobe urcene sirkou pulzu.
+// Vlastni impulz je generovan v preruseni, kde se periodicky strida nastaveni portu do log.1 a do log.0
+//
+// 4) Cteni tlacitek
+// -----------------
+// Pro cteni tlacitek je vyuzivano preruseni od zmeny na portu B. Pri zmene stavu nektereho z tlacitek toto preruseni
+// nastavi promenou freq_done. Na miste v programu, kde se testuje tato promenna se precte stav tlacitek a podle
+// jejich stavu se dal pokracuje.
+//
+// 5) Zakladni smycky programu
+// ---------------------------
+// Hlavni smycka programu je koncipovana jako stavovy automat, kdy jednotlive stavy predstavuji jednotlive mody mereni.
+// V jednotlivych stavech se volaji hlavni funkce jednotlivych modu mereni. Tyto funkce jsou koncipovany jako stavove
+// automaty, ktere provedou podle potreby uvodni akci a dale sleduji stav promenne freq_done. Na zaklade tohoto stavu
+// pokracuji dale nebo prechazeji do stavu jineho. freq_done ma tyto stavy:
+// F_PEACE -klidovy stav
+// F_DONE- mereni kmitoctu dokonceno
+// F_KEY- mereni kmitoctu preruseno stiskem nejakeho tlacitka.
+// Stav F_DONE je vyuzivan v modu mereni Lx a Cx a dale v modu mereni teploty se vyuziva k odmerovani casu.
+// Pri stavu F_KEY se precte stav tlacitek a pri stisku tlacitka MODE se opousti hlavni funkce aktivniho modu mereni a
+// prechazi se zpet se do hlavni smycky programu. V hlavni smycce programu se nasledne prejde do nasledujiciho modu mereni.
+// Pri stisku tlacitka NUL se provede pozadavana akce, a zustava se v danem modu mereni.
+
+
+
+#include <16f876.h>
+#include <16F877_reg.h>
+#include "lc.h"
+#include
+#include
+#include
+
+//#define FREQ // jen mereni frekvence mericiho oscilatoru, urceno pro jeho kalibraci
+ // pripojime citac na vystup mericiho oscilatoru a musi ukazovat totez co je na displeji, pokud tomu tak neni,
+ // napravu provedeme zmenou konstanty CORIG v lc.h pripadne zmenou kondenzatoru u oscilatoru procesoru
+
+/*****************************************************/
+/************* PRERUSOVACI RUTINY ********************/
+/*****************************************************/
+
+#USE FAST_IO(A)
+#USE FAST_IO(B)
+#USE FAST_IO(C)
+
+// prerusovaci rutina spolecna pro vsechny preruseni, napsana v assembleru, protoze cecko to dela neefektivne
+#int_GLOBAL
+void int_handler()
+{
+ // uloz W, STATUS a PCLATH
+ #asm
+ movwf W_TMP
+ swapf STATUS,W
+ clrf STATUS
+ movwf F_TMP
+ movf PCLATH,W
+ movwf PCLATH_TMP
+ clrf PCLATH
+
+ btfss PIR1,_TMR1IF
+ goto NO_T1_L
+ // preruseni od timeru1
+ incf counter_h,F // +1 na nejvyssim radu citace impulzu
+ bcf PIR1,_TMR1IF // nuluj priznak preruseni
+ // pokracujeme hned testem preruseni od timeru0 (odmeruje periodu mereni)
+NO_T1_L:
+ btfss INTCON,_T0IF
+ goto NO_T0_L // na dalsi druhy preruseni
+ // preruseni od timeru 0
+ bcf INTCON,_T0IF // nuluj priznak preruseni
+ movlw CORIG // pridane spozdeni, aby byl odmereny cas timerem 0 presne
+ movwf INT_TMP
+LOOP:
+ decfsz INT_TMP,F
+ goto LOOP
+ nop
+ movlw TIME_1S_L // znovu natahni timer0
+ movwf TMR0
+ decf sampler_H,F // -1 na citaci opakovani zakladni periody timeru0
+ btfss STATUS,_Z // perioda mereni vyprsela?
+ goto END_INT_L // koncime,abychom nezdrzovali dalsimi zdroji preruseni na nich jiz casove nezalezi
+ nop
+ nop
+ nop
+ nop
+ bcf T1CON,_TMR1ON // zastav citani impulzu
+ movlw F_DONE
+ movwf freq_done // priznak ukonceni citani - mereni OK
+ bcf INTCON,_T0IE // zakaz preruseni od timeru0
+ goto END_INT_L // koncime,abychom nezdrzovali dalsimi zdroji preruseni na nich jiz casove nezalezi
+
+NO_T0_L:
+ btfss INTCON,_RBIF
+ goto NO_RB_L
+ // preruseni od tlacitek na brane B
+ movf PORTB,W
+ movlw F_KEY
+ movwf freq_done // nastav priznak , ze mereni frekvence nedopadlo dobre (stisknuto nektere z tlacitek)
+ bcf INTCON,_RBIF
+ goto END_INT_L
+
+NO_RB_L:
+ btfss PIR1,_CCP1IF
+ goto END_INT_L
+ // preruseni od komparacni jednotky, pouziva se pouze v rezimu pulser pro generovani pulzu od 1ms vyse
+ // nasledujici konstrukce zajistuje pro 1 i 0 nastaveni pinu ve stejny okamzik, doba do bodu B je tez stejna
+ btfss INT_TMP,0
+ goto A
+ btfsc INT_TMP,0
+ bcf PORTC,2
+ goto B
+A:
+ bsf PORTC,2
+ goto B
+B:
+ comf INT_TMP,F // priste budeme nastavovat opacnou hodnotu
+ bcf PIR1,_CCP1IF // nuluj priznak preruseni od CCP1 jednotky
+
+END_INT_L:
+ // obnov W, STATUS a PCLATH
+ movf PCLATH_TMP,W
+ movwf PCLATH
+ swapf F_TMP,W
+ movwf STATUS
+ swapf W_TMP,F
+ swapf W_TMP,W
+ #endasm
+} // int_handler
+
+
+
+
+
+
+/**************************************************/
+/*********** FUNKCE MERENI KMITOCTU ***************/
+/**************************************************/
+// zahajeni mereni frekvence
+//
+void start_freq()
+{
+ #asm
+ bcf T1CON,_TMR1ON // zastav citac TMR1
+ clrf TMR1L // nuluj citac TMR1, ktery cita vstupni implulzy
+ clrf TMR1H
+ clrf counter_H
+ movlw F_PEACE
+ movwf freq_done // nuluj priznak dokonceni mereni frekvence
+ bsf T1CON,_TMR1ON // spust citac TMR1
+ movlw TIME_1S_L // natahni casovac TMR0, ktery meri periodu mereni
+ movwf TMR0
+ movlw TIME_1S_H
+ movwf sampler_H
+ bcf INTCON,_T0IF // nuluj priznak preruseni od timeru0
+ bsf INTCON,_T0IE // povol preruseni od timeru0
+ #endasm
+} // start_freq
+
+
+// zmereni frekvence a jeji umocneni
+//
+float mfreq_sqr()
+{
+ float f;
+
+ start_freq(); // odstartuj mereni frekvence
+ while(freq_done==F_PEACE); // cekej na dokonceni zmereni frekvence
+ f=F_CORRECT*(float)make32(counter_H,get_timer1()); // preved zmerenou frekvennci na float
+#ifdef FREQ
+ return(f); // pro mereni frekvence vracej frekvenci
+#else
+ return(f*f); // vrat kvadrat
+#endif
+} // mfreq_sqr
+
+
+
+
+
+/*******************************************************************/
+/*********** FUNKCE PRO PREPINANI TYPU MERENI (rele) ***************/
+/*******************************************************************/
+// prepne rele na mod mereni C
+//
+rele_measure_C()
+{
+ output_high(RE1_B);
+ output_high(RE2_B);
+ delay_ms(RELE_PULSE);
+ output_low(RE1_B);
+ output_low(RE2_B);
+} // rele_measure_C
+
+
+// prepne rele na mod mereni L
+//
+rele_measure_L()
+{
+ output_high(RE1_A);
+ output_high(RE2_B);
+ delay_ms(RELE_PULSE);
+ output_low(RE1_A);
+ output_low(RE2_B);
+} // rele_measure_L
+
+
+// prepne rele na kalibraci a tez na mody mereni teploty a pulser
+//
+rele_calib()
+{
+ output_high(RE1_B);
+ output_high(RE2_A);
+ delay_ms(RELE_PULSE);
+ output_low(RE1_B);
+ output_low(RE2_A);
+} // rele_calib
+
+
+
+
+
+/*******************************************************************/
+/*********** POMOCNE FUNKCE JEDNOTLIVYCH MODU MERENI ***************/
+/*******************************************************************/
+// vraci cislo radu (0=1E0, 1=1E3 2=1E6 atd.) a upravi parametr aby byl do 999.999
+//
+int8 range(float &Xv)
+{
+ int8 ret_val;
+
+ ret_val=0;
+ while(fabs(Xv)>1E3)
+ {
+ Xv=Xv*1E-3;
+ ret_val++;
+ }
+ return(ret_val);
+} // range
+
+
+// vraci pocet celych cislic realneho argumentu
+//
+int8 num_int_digit(float X)
+{
+ int8 ret_val;
+
+ ret_val=1;
+ while(fabs(X)>1E1)
+ {
+ X=X*1E-1;
+ ret_val++;
+ }
+ return(ret_val);
+} // num_int_digit
+
+
+// smaze 1.radek LCD displeje
+//
+clr_1Line()
+{
+ int8 i;
+ lcd_gotoxy(1,1);
+ for(i=0;i<16;i++) lcd_putc(' ');
+ lcd_gotoxy(1,1);
+}
+
+
+//cekani na uvolneni tlacitek
+//
+wait_release_keys()
+{
+ while(!input(NUL_KEY) || !input(MODE_KEY)) delay_ms(20); // cekej na uvolneni tlacitka
+ freq_done=F_PEACE;
+} // wait_release_keys
+
+
+// kalibrace
+//
+void calibration(float &f1_sqr, float &C, float &L)
+{
+ float f2_sqr;
+
+ lcd_putc("\f");
+ printf(lcd_putc,CALIB_MSG);
+ rele_measure_C(); // rele do stavu odpojeni kalibracniho kondenzatoru a oscilator musi bezet
+ delay_ms(FREQ_CALM_TIME); // pockej na ustaleni oscilatoru
+ // mereni f2
+ rele_calib(); // pripni kalibracni kondenzator
+ delay_ms(FREQ_CALM_TIME); // pockej na ustaleni oscilatoru
+ f2_sqr=mfreq_sqr(); // zmer kvadrat f2
+ // vypocet C a L
+ C=(C_CALIB*f2_sqr)/(f1_sqr-f2_sqr); // C1 v pF
+ L=1e9/(39.4784176*f1_sqr*C*1e-12); // L1 v nH
+/*
+ // zobraz zmerene kalibracni hodnoty
+ lcd_putc("\f");
+ printf(lcd_putc,"C=%3.2f pF",C);
+ lcd_gotoxy(1,2);
+ printf(lcd_putc,"L=%3.2f nH",L);
+ while(input(NUL_KEY)); // cekej na stisk klavesy
+ lcd_putc("\f");
+*/
+} // calibration
+
+
+
+
+
+/******************************************************************/
+/*********** HLAVNI FUNKCE JEDNOTLIVYCH TYPU MERENI ***************/
+/******************************************************************/
+// mereni L
+//
+#inline
+void measure_L(float &f1_sqr,float &C,float &L)
+{
+
+ float f2_sqr; // kvadrat kmitoctu mericiho oscilatoru s pripojenou Lx
+ float X; // zmerena hodnota Lx
+ float Xp; // vlastni Lp (odecita se od vysledku)
+ float Xv; // vysledna hodnota Lx
+ int8 prefix; // index do poli urcijici pismenko radu
+ int8 Xp_p; // pointer na promennou Xp
+ int8 ee_adr; // adresovy citac pameti EEROM
+
+
+ // vyzvedni vlastni indukcnost
+ ee_adr=LP_ADR_LOW;
+ for(Xp_p=&Xp;Xp_p<&Xp+4;Xp_p++) *Xp_p=read_eeprom(ee_adr++);
+ for(;;)
+ {
+ f2_sqr=mfreq_sqr(); // zmer kvadrat F2
+ if(freq_done!=F_DONE) // zmerena frekvence neni platna (stisknuto nektere z tlacitek)
+ {
+ if(!input(MODE_KEY)) break; // stisknuto tlacitko mode, koncime
+ if(!input(NUL_KEY))
+ {
+ // stisknuto tlacitko NULL, poznamenej si vlastni L
+ Xp=X;
+ // uloz vlastni indukcnost
+ ee_adr=LP_ADR_LOW;
+ for(Xp_p=&Xp;Xp_p<&Xp+4;Xp_p++) write_eeprom(ee_adr++,*Xp_p);
+ clr_1Line();
+ lcd_gotoxy(9,1);
+ printf(lcd_putc,"0 nH");
+ wait_release_keys(); // cekej na uvolneni tlacitka
+ }
+ } else
+ {
+ if(f2_sqr<1E2) // bezi oscilator? (kmitocet pod 10Hz povazujeme za nebezici oscilator)
+ {
+ // oscilator NEBEZI
+ clr_1Line();
+ printf(lcd_putc,CONNECT_LX_MSG);
+ } else
+ {
+ // oscilator BEZI
+ X=(f1_sqr/f2_sqr-1)*L; // vypocti hodnotu Lx
+ Xv=X-Xp; // odecti vlastni L
+ // zobraz hodnotu Lx
+ clr_1Line();
+ prefix=range(Xv); // uprav rozsah a zjisti cislo radu
+ lcd_gotoxy(6-num_int_digit(Xv),1); // umisti hodnotu tak, aby radova carka zustavala na stejnem miste
+ if(Xv>=0F) lcd_putc(' '); // kladne cislo nema minus, vloz mezeru
+ if(prefix==0) printf(lcd_putc," %3.0f",Xv); // u nH zobrazuj jen cela cisla
+ else printf(lcd_putc,"%6.3f",Xv); // u ostatnich na 3 desetinna mista
+ // zobraz jednotky
+ lcd_gotoxy(12,1);
+ lcd_putc(L_PREFIX[prefix]);
+ lcd_putc('H');
+ }
+ }
+ } // od hlavni smycky (for(;;))
+} // measure_L
+
+
+// mereni C
+//
+#inline
+void measure_C(float &f1_sqr,float &C,float &L)
+{
+
+ float f2_sqr; // kvadrat kmitoctu mericiho oscilatoru s pripojenou Cx
+ float X; // zmerena hodnota Cx
+ float Xp; // vlastni Cp (odecita se od vysledku)
+ float Xv; // vysledna hodnota Cx
+ int8 prefix; // index do poli s pismenky radu
+// int8 pom;
+ int8 Xp_p; // pointer do promenne Xp
+ int8 ee_adr;
+
+ // vyzvedni vlastni kapacitu
+ ee_adr=CP_ADR_LOW;
+ for(Xp_p=&Xp;Xp_p<&Xp+4;Xp_p++) *Xp_p=read_eeprom(ee_adr++);
+ for(;;)
+ {
+ f2_sqr=mfreq_sqr(); // zmer F2
+ if(freq_done!=F_DONE) // zmerena frekvence neni platna (stisknuto nektere z tlacitek)
+ {
+ if(!input(MODE_KEY)) break; // stisknuto tlacitko mode, koncime
+ if(!input(NUL_KEY))
+ {
+ // stisknuto tlacitko NULL, poznamenej si vlastni Cp
+ Xp=X;
+ // uloz vlastni kapacitu
+ ee_adr=CP_ADR_LOW;
+ for(Xp_p=&Xp;Xp_p<&Xp+4;Xp_p++) write_eeprom(ee_adr++,*Xp_p);
+ clr_1Line();
+ lcd_gotoxy(6,1);
+ printf(lcd_putc,"0.00 pF");
+ wait_release_keys(); // cekej na uvolneni tlacitka
+ }
+ } else
+ {
+ if(f2_sqr<1E2) // bezi oscilator? (kmitocet pod 10Hz povazujeme za nebezici oscilator)
+ {
+ // oscilator NEBEZI
+ clr_1Line();
+ printf(lcd_putc,Error_Cx_MSG);
+ } else
+ {
+ // oscilator BEZI
+ X=(f1_sqr/f2_sqr-1)*C; // vypocti hodnotu Cx nebo Lx
+ Xv=X-Xp; // odecti vlastni Cp
+ // zobraz hodnotu Cx
+ clr_1Line();
+ prefix=range(Xv); // uprav rozsah a zjisti cislo radu
+ lcd_gotoxy(6-num_int_digit(Xv),1); // umisti hodnotu tak, aby radova carka zustavala na stejnem miste
+ if(Xv>=0F) lcd_putc(' '); // kladne cislo nema minus, vloz mezeru
+ if(prefix==0) printf(lcd_putc,"%5.2f",Xv); // u pF zobrazuj na 2 mista
+ else printf(lcd_putc,"%6.3f",Xv); // u ostatnich na 3 mista
+ // zobraz jednotky
+ lcd_gotoxy(12,1);
+ lcd_putc(C_PREFIX[prefix]);
+ lcd_putc('F');
+ }
+ }
+ } // od hlavni smycky (for(;;))
+} // measure_C
+
+
+// mereni teploty
+//
+#separate
+void measure_T()
+{
+ int8 record[10]; // bafr pro ulozeni zaznamu z teplomeru
+ int8 i;
+ int8 stat; // stavovy automat mereni teploty
+ int8 wait; // pro odmereni casu prevodu teplomeru
+ int1 delta; // oznamuje, ze merime rozdil teplot
+ float temp; // zmerena teplota
+ float temp_p; // odecitana hodnota teploty pri mereni rozdilu teplot
+ float temp_v; // vysledna teplota
+
+ stat=T_MEASURE; // zahajime mereni teploty
+ delta=0; // nemerime teplotni rozdil
+ temp_p=0; // nic od zmerene teploty neodecitame
+
+ for(;;)
+ {
+ if(freq_done==F_KEY) // stisknuto nejake tlacitko
+ {
+ if(!input(MODE_KEY)) // stisknuto tlacitko mode, koncime
+ {
+ #USE STANDARD_IO(A)
+ #USE STANDARD_IO(B)
+ #USE STANDARD_IO(C)
+ output_float(TM_PIN); // TM jako vstup, muze zustat jako vystup pri preruseni mereni
+ #USE FAST_IO(A)
+ #USE FAST_IO(B)
+ #USE FAST_IO(C)
+ break;
+ }
+ if(!input(NUL_KEY)) // stisknuto tlacitko NULL, budeme merit rozdil teplot, zapamatuj si aktualni teplotu
+ {
+ temp_p=temp; // zapamatuj si aktualni hodnotu teploty
+ delta=1; // oznam, ze merime rozdil teplot
+ stat=T_MEASURE;
+ clr_1line();
+ lcd_gotoxy(6,1);
+ printf(lcd_putc,"0.0 \20\21C"); // \20 je znak delta \21 je znak stupen
+ wait_release_keys(); // cekej na uvolneni tlacitka
+ }
+ }
+ // STAVOVY AUTOMAT MERENI TEPLOTY
+ switch(stat)
+ {
+ case T_WAIT:
+ if(--wait==0) stat=T_DISPLAY; // cekej az teplomer zmeri frekvenci
+ break;
+ case T_DISPLAY:
+ if(!TM_present())
+ {
+ // teplomer NENI pritomen
+ clr_1line();
+ printf(lcd_putc,CONNECT_TEMP_MSG);
+ temp_p=0; // nuluj pripadnou teplotu pro odecteni
+ delta=0; // zrus pripadne mereni rozdilu teplot
+ } else
+ {
+ // teplomer JE pritomen
+ TM_write_byte(0xCC); // prikaz preskoc na dalsi sadu prikazu
+ TM_write_byte(0xBE); // prikaz precti zmerenou teplotu
+ for(i=0;i<9;i++) record[i]=TM_read_byte(); // precti zaznam do buferu
+ if(TM_check_CRC(record,9)) // kontrola CRC
+ {
+ // vypocet teploty viz datasheet
+ record[0]=record[0]>>1; // zahod rad 2^-1,
+ if(bit_test(record[1],0)) bit_set(record[0],7); // je-li cislo zaporne, je treba nejvyssi bit nastavit na 1
+ temp=(float)make16(record[1],record[0]); // prechod na realna cisla
+ temp=temp-0.25+((0x10-(float)record[6])/0x10); // zvetseni presnosti na 12 bitu
+ temp_v=temp-temp_p;
+ clr_1line();
+ lcd_gotoxy(6-num_int_digit(temp_v),1); // umisti udaj tak, aby radova carka byla porad na stejnem miste
+ if(temp_v>=0F) lcd_putc(' '); // pri kladne hodnote zobraz misto minus mezeru
+ printf(lcd_putc,"%4.1f ",temp_v);
+ if(delta) lcd_putc('\20'); // pri mereni rozdilu teplot zobraz znak delta
+ lcd_putc('\21'); // znak stupne
+ lcd_putc('C');
+ }
+ }
+ stat=T_MEASURE; // prejdi do stavu vyvolani mereni teploty
+ case T_MEASURE:
+ if(!TM_present())
+ {
+ // teplomer NENI pritomen
+ clr_1line();
+ printf(lcd_putc,CONNECT_TEMP_MSG);
+ temp_p=0; // nuluj pripadnou teplotu pro odecteni
+ delta=0; // zrus pripadne mereni rozdilu teplot
+ } else
+ {
+ // teplomer JE pritomen
+ TM_write_byte(0xCC); // prikaz preskoc na dalsi sadu prikazu
+ TM_write_byte(0x44); // prikaz zmer teplotu
+ #USE STANDARD_IO(A)
+ #USE STANDARD_IO(B)
+ #USE STANDARD_IO(C)
+ output_high(TM_PIN); // vystup do 1, zajistuje napajeni behem mereni teploty
+ #USE FAST_IO(A)
+ #USE FAST_IO(B)
+ #USE FAST_IO(C)
+ wait=CONV_WAIT;
+ stat=T_WAIT; // prejdi do stavu cekani na dokonceni mereni (konverze)
+ }
+ break;
+ } // od switch
+ mfreq_sqr(); // zastupuje zde spozdeni 250ms, ktere lze prerusit stiskem tlacitka
+ } // od for(;;)
+} // measure_T
+
+
+// generovani pulzu
+//
+#separate
+void pulser()
+{
+ int8 pulse;
+
+ #USE STANDARD_IO(A)
+ #USE STANDARD_IO(B)
+ #USE STANDARD_IO(C)
+ output_high(PULSER_PIN); // pin pulseru naorientuj jako vystup
+ #USE FAST_IO(A)
+ #USE FAST_IO(B)
+ #USE FAST_IO(C)
+
+ INT_TMP=0; // pouzije se jako zrcadlo vystupniho pinu generatoru pulzu (vystup do 0)
+ setup_timer_0(RTCC_EXT_L_TO_H); // zastav TMR0, vadil by nam v preruseni, (preruseni od nej zastavuje TMR1)
+ pulse=read_eeprom(WIDTH_ADR); // vyzvedni naposledy pouzitou sirku impulzu
+
+for(;;)
+{
+ clr_1line();
+ switch(pulse)
+ {
+ case P_10US:
+ printf(lcd_putc,PULSE_10us_MSG);
+ setup_timer_2(T2_DIV_BY_1,20-1,1); // perioda 20us
+ setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky
+ CCP_1 = 20/2; // strida 1:1
+ break;
+ case P_20US:
+ printf(lcd_putc,PULSE_20us_MSG);
+ setup_timer_2(T2_DIV_BY_1,40-1,1); // perioda 40us
+ setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky
+ CCP_1 = 40/2; // strida 1:1
+ break;
+ case P_50US:
+ printf(lcd_putc,PULSE_50us_MSG);
+ setup_timer_2(T2_DIV_BY_1,100-1,1); // perioda 100us
+ setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky
+ CCP_1 = 100/2; // strida 1:1
+ break;
+ case P_100US:
+ printf(lcd_putc,PULSE_100us_MSG);
+ setup_timer_2(T2_DIV_BY_1,200-1,1); // perioda 200us
+ setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky
+ CCP_1 = 200/2; // strida 1:1
+ break;
+ case P_200US:
+ printf(lcd_putc,PULSE_200us_MSG);
+ setup_timer_2(T2_DIV_BY_4,100-1,1); // perioda 400us
+ setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky
+ CCP_1 = 100/2; // strida 1:1
+ break;
+ case P_500US:
+ printf(lcd_putc,PULSE_500us_MSG);
+ setup_timer_2(T2_DIV_BY_4,250-1,1); // perioda 1000us
+ setup_ccp1(CCP_PWM); // generujeme pomoci PWM jednotky
+ CCP_1 = 250/2; // strida 1:1
+ break;
+ case P_1MS:
+ setup_timer_2(T2_DISABLED,0,1);
+ printf(lcd_putc,PULSE_1ms_MSG);
+ setup_ccp1(CCP_COMPARE_RESET_TIMER); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni)
+ setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
+ CCP_1 =1000; // pulz 1ms - perioda 2ms
+ enable_interrupts(INT_CCP1); // povol preruseni od CCP1 jednotky
+ break;
+ case P_2MS:
+ printf(lcd_putc,PULSE_2ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni)
+ CCP_1 =2000; // pulz 2ms - perioda 4ms
+ break;
+ case P_5MS:
+ printf(lcd_putc,PULSE_5ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni)
+ CCP_1 =5000; // pulz 5ms - perioda 10ms
+ break;
+ case P_10MS:
+ printf(lcd_putc,PULSE_10ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni)
+ CCP_1 =10000; // pulz 10ms - perioda 20ms
+ break;
+ case P_20MS:
+ printf(lcd_putc,PULSE_20ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni)
+ CCP_1 =20000; // pulz 20ms - perioda 40ms
+ break;
+ case P_50MS:
+ printf(lcd_putc,PULSE_50ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni)
+ CCP_1 =50000; // pulz 50ms - perioda 100ms
+ break;
+ case P_500MS:
+ printf(lcd_putc,PULSE_500ms_MSG); // generujeme pomoci CPP1 jednotky ( portem se hejbe v preruseni)
+ setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
+ CCP_1 =62500 ; // pulz 500ms - perioda 1000ms
+ break;
+ case P_5US:
+ printf(lcd_putc,PULSE_5us_MSG);
+ disable_interrupts(INT_CCP1); // zakaz preruseni od CCP1, pro kratke casy ji nepouzivme, pouzivame PWM jednotku
+ setup_timer_2(T2_DIV_BY_1,10-1,1); // perioda 10us
+ setup_ccp1(CCP_PWM); // pouzivame PWM jednotku
+ CCP_1 = 10/2; // strida 1:1
+ break;
+ } // od switch
+ while(freq_done!=F_KEY); // cekame na stisk nejakeho tlacitka
+ if(!input(MODE_KEY)) // stisknuto tlacitko MODE, koncime
+ {
+ // uved preruseni a nastaveni timeru1 do puvodniho stavu a konci mod
+ setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // pro mereni periody vzorkovani (500ms)
+ setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1); // pro citani vzorku//
+ bit_clear(*T1CON,_TMR1ON); // zastav citani impulzu
+ disable_interrupts(INT_CCP1); // cakaz preruseni od CCP1 ednotky
+ #USE STANDARD_IO(A)
+ #USE STANDARD_IO(B)
+ #USE STANDARD_IO(C)
+ output_float(PULSER_PIN); // vystup pulseru jako vystup
+ #USE FAST_IO(A)
+ #USE FAST_IO(B)
+ #USE FAST_IO(C)
+ break; // koncime
+ }
+ if(!input(NUL_KEY)) // stisknuto tlacitko WIDTH
+ {
+ if(pulse==P_5US) pulse=P_10US; // po dosazeni stavu P_5US se posloupnost opakuje
+ else pulse++;
+ write_eeprom(WIDTH_ADR,pulse); // uloz novou sirku impulzu
+ wait_release_keys(); // cekej na uvolneni tlacitek po nastaveni sirky pulzu
+ }
+}
+} // pulser
+
+
+
+
+
+/*************************************************/
+/******** HLAVNI FUNKCE PROGRAMU ****************/
+/*************************************************/
+
+void main()
+{
+ float f1_sqr; // kvadrat kmitoctu mericiho scilatoru bez pripojene Lx nebo Cx
+ float C; // hodnota kondenzatoru v mericim oscilatoru v pF (ziska se kalibraci)
+ float L; // hodnota indukcnosti v mericim oscilatoru v nH (ziska se kalibraci)
+ int8 MODE; // promenna stavoveho automatu hlavni smycky (mod mereni)
+ int1 _calib; // priznak, ze jiz doslo ke kalibraci
+
+
+ // nastaveni citacu
+ port_b_pullups(TRUE); // zapnu puulupy na brane B (pro tlacitka)
+ setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // pro mereni periody vzorkovani (500ms)
+ setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1); // pro citani impulzu z mericiho oscilatoru
+ bit_clear(*T1CON,_TMR1ON); // zastav citani impulzu
+
+ //nastaveni vstupu a vystupu
+#USE STANDARD_IO(A)
+#USE STANDARD_IO(B)
+#USE STANDARD_IO(C)
+ output_low(RE1_A); // signaly relatek jako vystupy a do 0
+ output_low(RE1_B);
+ output_low(RE2_A);
+ output_low(RE2_B);
+ output_float(PULSER_PIN); // signal pro pulser jako vstup
+ output_float(TM_PIN); // vstup pro TM jako vstup
+ output_float(TM_PULLUP); // zapni pullup pro TM
+ output_low(PIN_C1); // nepouzit,dej do 0
+ output_low(PIN_C3); // nepouzit,dej do 0
+#USE FAST_IO(A)
+#USE FAST_IO(B)
+#USE FAST_IO(C)
+
+ lcd_init();
+ lcd_define_char(0,LCD_CHAR_DELTA); // nadefinovani znaku delta
+ lcd_define_char(1,LCD_CHAR_DEC); // nadefinovani znaku stupen
+ rele_measure_C(); // rele do stavu odpojeni kalibracniho kondenzatoru a oscilator musi bezet
+ input_b();
+ enable_interrupts(INT_TIMER1); // povol preruseni od citace impulzu mericiho oscilatoru
+ enable_interrupts(INT_RB); // povol preruseni od tlacitek
+ enable_interrupts(GLOBAL);
+
+
+#ifdef FREQ
+ // pro kalibraci mereni kmitoctu
+ for(;;) {
+ f1_sqr=mfreq_sqr();
+ lcd_putc("\f");
+ printf(lcd_putc,"F=%6.2f KHz",f1_sqr*1E-3);
+ delay_ms(500);
+ }
+#endif
+
+ // UVOD
+ lcd_putc("\f");
+ printf(lcd_putc,VERSION_MSG);
+ lcd_gotoxy(1,2);
+ printf(lcd_putc,COPYRIGHT_MSG);
+ delay_ms(FREQ_CALM_TIME); // pockej na ustaleni oscilatoru
+ f1_sqr=mfreq_sqr(); // zmer f1
+ _calib=0; // kalibrace neni provedena
+ freq_done=F_PEACE;
+ mode=read_eeprom(MODE_ADR); // vyzvedni naposledy pouzity mod
+
+ // VLASTNI MERICI SMYCKA
+ for(;;)
+ {
+ switch(mode)
+ {
+ case MODE_C: // mereni Cx
+ if(!_calib)
+ {
+ calibration(f1_sqr,C,L); // proved kalibraci (vypocti L a C)
+ _calib=1; // poznamenej si, ze se kalibrace uz provedla
+ }
+ rele_measure_C();
+ lcd_gotoxy(1,2);
+ printf(lcd_putc,MODE_CX_NULL_MSG);
+ measure_C(f1_sqr,C,L);
+ // prechazime na mereni L
+ mode=MODE_L;
+ break;
+ case MODE_L: // mereni Lx
+ if(!_calib)
+ {
+ calibration(f1_sqr,C,L); // proved kalibraci (vypocti L a C)
+ _calib=1; // poznamenej si, ze se kalibrace uz provedla
+ }
+ rele_measure_L();
+ lcd_gotoxy(1,2);
+ printf(lcd_putc,MODE_LX_NULL_MSG);
+ measure_L(f1_sqr,C,L);
+ // prechazime na mereni T
+ mode=MODE_T;
+ break;
+ case MODE_T: // merei teploty
+ rele_calib();
+ lcd_gotoxy(1,2);
+ printf(lcd_putc,MODE_TMP_NULL_MSG);
+ bit_clear(*T1CON,_TMR1ON); // zastav TMR1, vadil by
+ measure_T();
+ // prechazime na generovani pulzu
+ mode=MODE_P;
+ break;
+ case MODE_P: // generovani pulzu
+ rele_calib();
+ lcd_gotoxy(1,2);
+ printf(lcd_putc,MODE_PLZ_WIDTH_MSG);
+ pulser();
+ // prechazime na mereni C
+ mode=MODE_C;
+ break;
+ } // od switch
+ write_eeprom(MODE_ADR,mode); // uloz ktery mod je nyni aktivni
+ wait_release_keys(); // cekej na uvolneni tlacitek
+ delay_ms(10);
+ } // for(;;)
+} // main
+
+// End of File


LCTmetr01A/SW/lc.c

Změněné vlastnosti:

Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property


{COMPARE END}
{FOOTER START}

Poháněno WebSVN v2.1 alpha 1