No changes between revisions
/Designs/LCTmetr01A/DOC/LCT.pdf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:executable
+*
\ No newline at end of property
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/LCTmetr01A/SW/bin/PRG.BAT
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
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/Designs/LCTmetr01A/SW/bin/lc.HEX
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
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/Designs/LCTmetr01A/SW/lc.PJT
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
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/Designs/LCTmetr01A/SW/lc.c
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 <lcd.c>
#include <tm.c>
#include <math.h>
 
//#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
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/Designs/LCTmetr01A/SW/lc.h
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
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/Designs/LCTmetr01A/SW/lib/16f877_reg.h
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
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/Designs/LCTmetr01A/SW/lib/TM.C
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<num;i++) CRC=TouchCRC[CRC ^ *(sn+i)];
if(CRC!=*(sn+7)) return(0);
else return(1);
#else
// vypocet CRC algoritmicky
CRC=0;
for(i=0 ;i<num;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
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/Designs/LCTmetr01A/SW/lib/lcd.c
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<<LCD_SHIFT) // maska platnych bitu
//
#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);
//}
Property changes:
Added: svn:executable
+*
\ No newline at end of property