Subversion Repositories svnkaklik

Compare Revisions

No changes between revisions

Ignore whitespace Rev 658 → Rev 659

/programy/C/PIC/mereni/inertial/main.c
0,0 → 1,89
#include "main.h"
 
#define REV "$Rev$"
 
unsigned int32 time; // pocitadlo preteceni casovace
 
#define BUFLEN 100
 
#int_RTCC
void RTCC_isr(void) // preruseni od pretekleho casovace
{
time++;
}
 
// Includes all USB code and interrupts, as well as the CDC API
#include <usb_cdc.h>
#include <math.h>
 
float quadraticerror(float average, float buf[], int16 size) // compute average quadratic error
{
int16 i;
float err=0;
 
for(i=0; i<size; i++) err += (buf[i]-average)*(buf[i]-average); // sum quadratic errors
err = sqrt((1/(float)size)*err);
return err;
}
 
void main()
{
 
float x[BUFLEN], y[BUFLEN], z[BUFLEN];
float xavg, yavg, zavg;
int i;
port_b_pullups(FALSE);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
setup_adc_ports(AN0_TO_AN2|VSS_VREF);
setup_adc(ADC_CLOCK_DIV_64);
 
usb_init(); // initialise USB module
 
while (TRUE)
{
while(!usb_cdc_connected());
time=0;
set_timer0(0);
printf(usb_cdc_putc,"time[s] X Xerr Y Yerr Z Zerr \n\r");
 
while(usb_cdc_connected()) // pockej nez se pripoji seriovy port PC
{
for(i=0; i <BUFLEN; i++)
{
set_adc_channel(0);
delay_us(10);
x[i]=read_adc();
xavg+=x[i];
set_adc_channel(1);
delay_us(10);
y[i]=read_adc();
yavg+=y[i];
 
set_adc_channel(2);
delay_us(10);
z[i]=read_adc();
zavg+=z[i];
}
xavg=xavg/BUFLEN;
yavg=yavg/BUFLEN;
zavg=zavg/BUFLEN;
 
// odesli namerene hodnoty
printf(usb_cdc_putc, "%7.3f %4.3f %4.3f %4.3f %4.3f %4.3f %4.3f \n\r",((time << 16) + get_timer0())/15625.0, xavg, quadraticerror(xavg,x,BUFLEN), yavg, quadraticerror(yavg,y,BUFLEN), zavg, quadraticerror(zavg,z,BUFLEN)); //konstanta k je kvuli prevodu do rozzumnych jednotek [s]
}
}
}
/programy/C/PIC/mereni/inertial/main.hex
0,0 → 1,614
:020000040000FA
:04000000B1EF0FF05D
:08000800056ED8CF06F0E0CF31
:1000100007F00001E9CF0DF0EACF08F0E1CF09F0D9
:10002000E2CF0AF0D9CF0BF0DACF0CF0F3CF14F017
:10003000F4CF15F0FACF16F000C00FF001C010F0A9
:1000400002C011F003C012F004C013F0F2AA2CEFAA
:1000500000F0F2B42FEF01F0A0AA32EF00F0A1BA45
:100060003AEF09F00FC000F010C001F011C002F02B
:1000700012C003F013C004F00DC0E9FF08C0EAFF8E
:10008000088E09C0E1FF0AC0E2FF0BC0D9FF0CC017
:10009000DAFF14C0F3FF15C0F4FF16C0FAFF0550D5
:1000A00007C0E0FF06C0D8FF1000F76ABA0FF66E6F
:1000B000000EF7220900F5501200000302FFFFFFB7
:1000C000FFFFFFFFFFFFFFFFFFFFF76ADA0FF66E8C
:1000D000000EF7220900F550120000FF02FFFFFF9B
:1000E000FFFFFFFFFFFFFFFFFFFFF76AFA0FF66E4C
:1000F000000EF7220900F5501200400008004000F1
:1001000000000000000000000000000000000000EF
:1001100000000000000000000000F76A2A0FF66EE1
:10012000010EF7220900F5501200400000004000C7
:1001300000000000000000000000000000000000BF
:1001400000000000000000000000F76A5A0FF66E81
:10015000010EF7220900F5501200090243000201C6
:100160000080320904000001020201000524001091
:1001700001042402020524060001052401000107F0
:100180000581030800FA09040100020A00000007C3
:100190000502024100010705820241000100F76AE1
:1001A000AE0FF66E010EF7220900F55012000200A4
:1001B000F76AC00FF66E010EF7220900F550120023
:1001C00012171B20FFFFFFFFF76AD80FF66E010E14
:1001D000F7220900F5501200120110010200004040
:1001E00061043300000101020001F76AFA0FF66EA4
:1001F000010EF7220900F550120004030904080358
:1002000043004300530018035300450052004900C7
:1002100041004C002000440045004D004F00F2CF4B
:100220000EF0F29EF76A380FF66E020EF722090002
:10023000F5500EBEF28E120074696D655B735D2021
:10024000205820205865727220205920205965724C
:100250007220205A20205A657272200A0D00010E69
:100260001926D8B01A2AD8B41B2AD8B41C2AF2945A
:1002700032EF00F06D92699468A402D06894FCD7C4
:1002800045EF09F0400E0401016F040E036F180ED4
:10029000026F880E006F046B040E076F580E066F16
:1002A0000001000C70A002D0EDDF7090689A4EEF54
:1002B00009F06A6A689254EF09F0070148514A034D
:1002C000F3CF01F0F4CF00F04B03F3500026495177
:1002D0004A03F3500020026E0001000C036A07017C
:1002E0000651700FE96E0F0E0320EA6EEF6A496B3C
:1002F00006C748F74B6B080E4A6F0001DEDF0701A7
:1003000001C0E9FF040E0224EA6EEF6A496B06C7DA
:1003100048F74B6B080E4A6F0001CFDF02C008F7A9
:1003200001C007F7040E07010727000E082307C7BF
:10033000E9FF040E0825EA6EEF6A0001000C010EC9
:100340000701056F05510F0807E305C706F7000110
:10035000C5DF0701052BF6D70001000C2E6A2D6AB8
:10036000250E2C6E800E2B6E2F6A306A080E316EB1
:10037000816B8091336A326A7C6B7D91000C07013E
:10038000196B195101080AE3036A1951290FE96E23
:10039000000E0320EA6EEF6A192BF3D70001DEDFAF
:1003A0001E6A010E1F6E1D6A000C689600D000D0F8
:1003B00000D0000C6A6A686A9F0E6B6E3D0E696E13
:1003C0006E6ABDDFDCDF160E706E68A602D0EDDF50
:1003D000FCD76D9857DF030E246E5AEF09F069843D
:1003E00068986D8260EF09F0689C66EF09F000C7BD
:1003F00025F0000CFF0E256E000C0601FE6B285246
:1004000042E0FE513F083FE32050000105E0020AB0
:1004100010E0010A1BE027D0036A2750F2CF00F753
:10042000F29E93DE070100BFF28EE8CFFFF60001D7
:100430001AD0036A2750F2CF00F7F29ED6DE0701EA
:1004400000BFF28EE8CFFFF600010DD0036A2750FF
:10045000F2CF00F7F29EB8DE070100BFF28EE8CFC0
:10046000FFF6000100D0272A28060601FE51FE2BC8
:10047000580F036AD8B0032AE96E040E0324EA6E0B
:10048000FFC6EFFFBCD7285204E1FE51400801E04F
:100490001D6AFEC600F70001AADF000C276A206A69
:1004A00004011B51010A000107E0030A0AE0010AE6
:1004B0000BE0220A22E042D0120E286E030E206EBC
:1004C0003FD0430E286E3CD0020E206E036A04011A
:1004D0001A51210FE96E000E0320EA6EEFCF27F0CC
:1004E000036A2750F2CFFDF6F29E00017EDE060180
:1004F000FDBFF28E286E000123D0036A04011A5159
:10050000F2CFFDF6F29E000153DE0601FDBFF28E32
:10051000276E273C01D00FD0036A2750F2CFFDF69B
:10052000F29E000112DE0601FDBFF28E286E000170
:1005300007D004D0060100015DDF0ED05BDF0CD0D8
:1005400004011F5305E128501E5D02E21EC428F07D
:10055000010E1D6E000151DF1EEF04F00601FD5378
:1005600006E1040E246E0001EADE0DD10601050E3F
:10057000246E040E0701006F980E0601FF6F010E36
:10058000FE6FFE510F08D8A0FED0FEC606F7000190
:10059000A5DE0701016B036A0601FE51F2CF05F7E4
:1005A000F29E000192DD070105BFF28EFF0871E0A7
:1005B000040E016FD8900601FE35036AF2CF05F7ED
:1005C000F29E0001AADD0900F5CF03F0070105BF87
:1005D000F28E026F03C003F7496BFEC648F74B6B00
:1005E000080E4A6F000169DE01C005F7010E070120
:1005F0000124016E000E0220036E01C0E9FF040E0B
:100600000324EA6E02C7EFFF496BFEC648F74B6B47
:10061000080E4A6F000151DE01C005F7020E070106
:100620000124016E000E0220036E01C0E9FF040EDA
:100630000324EA6E00C7ECFFED52FFC6EFFFD8902F
:100640000601FE35036AF2CF05F7F29E000165DD73
:100650000900F5CF03F0070105BFF28E0601FF2761
:10066000035007010023880E046F03B1048103B314
:100670000483496BFEC648F74B6B080E4A6F0001B6
:100680001CDE070101C0E9FF040E0224EA6E04C764
:10069000EFFF036A0601FE51F2CF05F7F29E00015B
:1006A00004DD070105BFF28EFF084EE00183496BB0
:1006B000FEC648F74B6B080E4A6F0001FEDD02C014
:1006C00006F701C005F7040E07010527000E0623F3
:1006D000020E0525016E000E0621036E01C0E9FF22
:1006E000040E0324EA6E00C7ECFFED52FFC6EFFFD5
:1006F000D8900601FE35036AF2CF05F7F29E00019D
:10070000F4DC0900F5CF03F0070105BFF28E060106
:10071000FF27035007010023496BFEC648F74B6BC8
:10072000080E4A6F0001C9DD02C006F701C005F7D7
:10073000040E07010527000E062305C7E9FF040E76
:100740000625EA6E400EEF6E0151060802E10E0E1C
:10075000016F036A0601FE51F2CF05F7F29E000118
:10076000A4DC070105BFF28E0108D8A40189036A41
:100770000601FE51700FE96E0F0E0320EA6E01C7ED
:10078000EFFFFE2BFED6000116EF04F00401195115
:1007900000010DE0010A15E0020A20E0060A2AE045
:1007A000030A31E00E0A30E0010A36E045D01FC0EE
:1007B00058F40401596B020E0701006F000117DEA7
:1007C0003DD004011A2D07D0010E1F160701006B42
:1007D00000010DDE02D000010DDE30D004011A2D23
:1007E00006D01F820701006B000101DE02D000016C
:1007F00001DE24D0020E1D6E1AC426F00701006B24
:100800000001F5DD1BD04AD61EC058F4010E0701C9
:10081000006F0001ECDD12D004011A5101080AE357
:100820001AC41EF01AC4FDF6000198D60701006B29
:100830000001DDDD000102D0DDDD00D0F3EF05F0C9
:100840001EC0FDF604011951000105E00A0A0CE082
:10085000010A31E045D00401586B596B020E0701C3
:10086000006F0001C4DD3ED00601FD5321E0010E02
:10087000FD5D036AF2CFFEF6F29E000190DC0601F8
:10088000FEBFF28E016E04011C5DD8A002D00601ED
:100890000FD0036A1C51290FE96E000E0320EA6E87
:1008A000EFCF58F4010E0701006F0001A0DD02D068
:1008B0000001A0DD17D00601FD530FE0036A04011B
:1008C0001C51290FE96E000E0320EA6E1AC4EFFFD7
:1008D0000701006B00018BDD02D000018BDD02D02F
:1008E00089DD00D0F3EF05F00601FE91FDBFFE812A
:1008F000FD9FFEA113D0036AFD51F2CFFFF6F29ED9
:10090000000155EC00F00601FFBFF28EFF0802E186
:10091000000E01D0010E016E13D012D0036AFD51FA
:10092000F2CFFFF6F29E000165EC00F00601FFBF7A
:10093000F28EFF0802E1000E01D0010E016E00D020
:10094000000154EF05F00601FE91FDBFFE81FD9F01
:10095000FEA11DD00701496BFDC648F74B6B080E81
:100960004A6F0001AADC02C000F701C0FFF6040EC6
:100970000601FF27000E07010023FFC6E9FF040E52
:1009800007010025EA6E880EEF6E11D006010701FF
:10099000496BFDC648F74B6B080E4A6F00018DDCB2
:1009A00001C0E9FF040E07010224EA6EEF6A0001AC
:1009B00063EF05F00601FE91FDBFFE81FD9FFEA1E4
:1009C0001DD00701496BFDC648F74B6B080E4A6FF7
:1009D000000173DC02C000F701C0FFF6040E06013F
:1009E000FF27000E07010023FFC6E9FF040E0701E1
:1009F0000025EA6E840EEF6E12D006010701496BE6
:100A0000FDC648F74B6B080E4A6F000156DC01C06B
:100A1000E9FF040E07010224EA6E840EEF6E000166
:100A20006BEF05F00601FE91FDBFFE81FD9FFEA16B
:100A30001BD00701496BFDC648F74B6B080E4A6F88
:100A400000013BDC02C001F701C000F7040E070102
:100A50000027000E012300C7E9FF040E0125EA6EFE
:100A6000EFCFFFF6060112D00701496BFDC648F72C
:100A70004B6B080E4A6F000120DC070101C0E9FF43
:100A8000040E0224EA6EEFCFFFF60601FFAF02D09C
:100A9000FFB502D0000E01D0010E016E000177EF0C
:100AA00005F01CC4FDF620D701522EE004011951B7
:100AB000010A000105E0020A0BE0030A11E022D05E
:100AC0001CC4FDF640D70701006B000190DC1CD070
:100AD0001CC4FDF66FD70701006B000188DC14D041
:100AE0000401586B596B1CC4FDF600019BD70152E1
:100AF00003E0010E0401586F020E0701006F0001B0
:100B000076DC02D077DC00D0F3EF05F0FE0E256E28
:100B1000000C04011C2D01D002D01C534EE11951D0
:100B200000010BE0010A0DE0210A1CE0010A1FE0B0
:100B3000030A30E0010A35E03DD0010E836FE6DFA5
:100B40003BD0040EEA6E580EE96EE26A340EE16E96
:100B5000080E016EE6CFEEFF012EFCD71EC400F793
:100B600046DC2AD0020E836F8081D0DF25D0040EB0
:100B7000EA6E580EE96EE26A2B0EE16E070E016E08
:100B8000E6CFEEFF012EFCD7070E0701006F000134
:100B90002EDC12D01AC481F00701006B000127DCA3
:100BA0000BD01AC433F01BC432F00701006B0001F4
:100BB0001EDC02D01FDC00D004010001F3EF05F0C1
:100BC0001D6A040118517F0B000107E0010A06E0CD
:100BD000030A05E0230A04E004D0D8D531D661D752
:100BE00098D708DC00D061EF08F00701496BFDC61B
:100BF00048F74B6B080E4A6F00015DEC01F00701EE
:100C000001C0E9FF040E0224EA6EEFCFFFF60601F1
:100C1000FE51020806E1FFAD02D0FE6B02D0010ECC
:100C2000FE6FFE5103081EE1840EFF6F0701496B42
:100C3000FDC648F74B6B080E4A6F00015DEC01F0F2
:100C400002C003F701C002F7040E07010227000EDD
:100C5000032302C7E9FF040E0325EA6E840EEF6E3C
:100C600009D00601FE2D03D0C80EFF6F02D0880EFA
:100C7000FF6F0701D8900601FD35036AF2CF02F736
:100C8000F29E00018DEC00F00900F5CF03F00701A2
:100C900002BFF28E006F03C001F7496BFDC648F733
:100CA0004B6B080E4A6F00015DEC01F001C002F7CA
:100CB000010E07010124016E000E0220036E01C027
:100CC000E9FF040E0324EA6E00C7EFFF01A103D081
:100CD0000601FF81070101A303D00601FF8307017D
:100CE000496BFDC648F74B6B080E4A6F00015DEC7F
:100CF00001F0070101C0E9FF040E0224EA6EFFC6FD
:100D0000EFFF0001000C036A07014751700FE96E05
:100D10000F0E0320EA6EEF521BE0496B47C748F7FE
:100D20004B6B080E4A6F00015DEC01F002C049F701
:100D300001C048F7040E07014827000E492348C7A1
:100D4000E9FF040E4925EA6EEFCF48F748AF02D01D
:100D5000000E01D0010E016E0001000C42C747F7E2
:100D6000D2DF0152D8B486D00701496B42C748F799
:100D70004B6B080E4A6F00015DEC01F002C048F7B2
:100D800001C047F7040E07014727000E4823010E54
:100D90004725016E000E4821036E01C0E9FF040ED5
:100DA0000324EA6E43C7EFFF4551020820E1496B77
:100DB00042C748F74B6B080E4A6F00015DEC01F02B
:100DC00002C048F701C047F7040E07014727000E8D
:100DD000482347C7E9FF040E4825EA6EEFCF46F7E0
:100DE00046AD02D0456B02D0010E456F1AD0455179
:100DF000040817E1496B42C748F74B6B080E4A6F6E
:100E000000015DEC01F0070101C0E9FF040E0224BE
:100E1000EA6EEFCF46F746AD03D0010E456F01D025
:100E2000456B452D03D0C80E466F02D0880E466F25
:100E300044B1468144B34683496B42C748F74B6B84
:100E4000080E4A6F00015DEC01F002C048F701C0D6
:100E500047F7040E07014727000E482347C7E9FF5D
:100E6000040E4825EA6E46C7EFFF010E016E05D05D
:100E700000D00001000E016E07010001000C83513B
:100E8000010A03E0030A15E028D0EA6A340EE96E8D
:100E9000040EE26E180EE16E080E016EE6CFEEFF54
:100EA000012EFCD70701006B0001F7EC01F0836B0A
:100EB00018D0EA6A2B0EE96E040EE26E180EE16E8F
:100EC000070E016EE6CFEEFF012EFCD7836B070104
:100ED000006B0001F7EC01F004D0836B42EC01F0F1
:100EE00000D0A6EF07F00701496BFEC648F74B6B31
:100EF000080E4A6F00015DEC01F002C000F701C06E
:100F0000FFF6010E06010124016E000E070102200A
:100F1000036E01C0E9FF040E0324EA6E036AEFCFFB
:100F200001F003C002F000019DEF07F07D817F6BAF
:100F3000020E0601FE6F0001D6D701C07EF0ADEFB4
:100F400007F00601FD5304E1000199D706D0060120
:100F5000FD51020803E10001E9D706010001000C80
:100F6000FEC66EFF0601FE5303E0040E246E02D09F
:100F7000020E246E0001C2EF07F01E6A1D6A26C031
:100F8000FEF6EED73BEF08F03AC747F7BCDE01525A
:100F90004AE00701496B3AC748F74B6B080E4A6FA6
:100FA00000015DEC01F002C043F701C042F7040EFE
:100FB00007014227000E4323020E4225016E000E58
:100FC0004321036E01C0E9FF040E0324EA6EECCF57
:100FD00003F0ED52EFCF40F703C041F741C7EAFFFE
:100FE00040C7E9FF3CC7E2FF3BC7E1FF3EC702F055
:100FF0003DC701F0015202E0022A02D0025206E08F
:10100000E6CFEEFF012EFCD7022EFAD73AC742F701
:101010003EC744F73DC743F73FC745F700019EDE93
:10102000015003D000D0000E016E000C020E07012B
:101030003A6F3C6B3C0E3B6F3E6B7CC03DF7020E43
:101040003F6F0001A1DF7CC082F07C6B000C7C5301
:1010500001E0ECDF42EF08F00601FD530EE11D2C2C
:1010600005D00001FDEC01F006D006011D5002087C
:1010700003E1000182D7060106D0FD51020803E119
:101080000001E5D706010001000C6C300601FB6F82
:10109000FB33FB331F0EFB176C524EE10401005172
:1010A0003C0B0601FC6F430E040100170001D5EC58
:1010B00001F00601FC51340822E10401046B000137
:1010C0007FD56D98253C07D00601FD6B030EFE6FA2
:1010D00000018BDD12D00601FD6B020EFE6F0001D8
:1010E00084DD2550FE0809E00701426B446B25C0F2
:1010F00043F7040E456F000131DE1CD00601FC51A0
:10110000040819E1FD6B00011CDF0601FD6B020EF6
:10111000FE6F00016ADD2550FE080CE0253C01D081
:1011200009D00701426B446B25C043F7010E456FA0
:10113000000114DE06019BD06C5004081DE1430E33
:10114000040104170001D5EC01F0FF0E256E060125
:10115000FD6B000181DF253C01D00AD00701426B05
:10116000446B25C043F7020E456F0001F7DD02D046
:1011700042EC01F07BD006016CB435D00701496B1D
:10118000FBC648F74B6B080E4A6F00015DEC01F09F
:1011900001C0FDF6060101C001F0040E0224036E39
:1011A00001C0FDF6FE6F0701496BFBC648F74B6BAC
:1011B000080E4A6F00015DEC01F001C0E9FF040E6A
:1011C00007010224EA6EEF50430B0601FEC6EAFF58
:1011D000FDC6E9FFEF6E0001D5EC01F0FBC6FDF6A0
:1011E000B0DE44D006010701496BFBC648F74B6BE4
:1011F000080E4A6F00015DEC01F002C0FEF601C06E
:10120000FDF6040E0601FD27000EFE23FDC601F0CB
:10121000040EFE25036EFDC6FDF6FE6F0701496B49
:10122000FBC648F74B6B080E4A6F00015DEC01F0FE
:1012300002C000F701C0FFF6040E0601FF27000EF2
:1012400007010023FFC6E9FF040E07010025EA6E2F
:10125000EF50430B0601FEC6EAFFFDC6E9FFEF6E45
:101260000001D5EC01F0FBC6FDF6F6DE060100013B
:101270006EEF09F0245201E13AD0685238E068A4D8
:1012800004D069A402D03AEF01F06DA201D02FD0B2
:1012900068AA04D069AA02D052EF01F068A204D073
:1012A00069A202D059EF01F068A004D069A002D071
:1012B000DAEF01F068A804D069A802D0EFEF01F0DE
:1012C00068AC04D069AC02D0F4EF01F00601FA6B0F
:1012D00068A606D069A604D00001D7D602D00601C0
:1012E00005D00601FA51FA2B0308F2E20001A19A97
:1012F00032EF00F06D6A696A080E6F6E9450300923
:101300000601946E246A186AF2BE188EF29E0001DD
:10131000BFEC01F018BEF28E8FEF09F0EBD7B5EFFE
:1013200009F0186AF2BE188EF29EBFEC01F018BEEA
:10133000F28E6D6A140E6F6E696A6D86010E246EF0
:10134000A5EF09F06DB601D0ECD7242C0BD06DBA07
:1013500009D0686A696AA08AC00EF212110E696E1D
:10136000020E246EB6EF09F0D9D7ECD7245002084C
:10137000FCE1F2EF0FF00601DD91F2BEDD81F29E9D
:1013800000017C513F0802E23F0E7C6F7C517C2BB8
:10139000036A3C0FE96E000E0320EA6EDCC6EFFF25
:1013A000F29E0601DDB1F28E186AF2BE188EF29E30
:1013B000020E0701476F0001A6DC18BEF28E015233
:1013C00007E0186AF2BE188EF29E30DE18BEF28E6A
:1013D00005EF0AF07C513F0815E2186AF2BE188E3C
:1013E000F29E020E0701476F00018DDC18BEF28EDF
:1013F000015207E0186AF2BE188EF29E17DE18BE80
:10140000F28EE8D7DBC6DCF6B6D7000C8E0E006E87
:10141000D9C601F0D8C602F0036A015209E102C040
:1014200001F0026A080E005E015202E1006A08D073
:10143000D89001BE04D0023601360006F9D7019ECD
:10144000000C800ED8A202D00601EF1B0601F46B3F
:10145000F56BEBC6F3F6EF51F31BEA51D8B4DFD0CE
:10146000F26F006EEE51D8B4E3D0F25FD8B483D0FF
:101470003EE3EFC6F8F6F88FF0C6F7F6F1C6F6F6DB
:10148000F56BD890F833F733F633F533F22FF8D7FE
:10149000F3AF03D0F481E0D0F491F291F489060E19
:1014A000EA6EED0EE96EEBD0F499F3BF0AD0F2A12B
:1014B00013D0F833F733F633F533002AD8B4C7D056
:1014C0000BD0F8BF0CD0D890F537F637F737F83790
:1014D0000006D8B4BCD0F5D7F48D6DD0F49DEBC622
:1014E000F3F6EBAF02D0F88FABD0F89FA9D0EEC6E1
:1014F000F2F6EEC600F0EA51F25FEBC6F8F6F88FAE
:10150000ECC6F7F6EDC6F6F6F56BD890F833F73380
:10151000F633F533F22FF8D7F3AF03D0F4839CD032
:10152000F493F291F48B060EEA6EF10EE96EA7D0F9
:10153000F49BF3BF0AD0F2A113D0F833F733F6339C
:10154000F533002AD8B483D00BD0F8BF0CD0D89094
:10155000F537F637F737F8370006D8B478D0F5D72F
:10156000F48F29D0F49FEFC6F3F6EFAF02D0F88FD7
:1015700067D0F89F65D0EFC6F8F6F88FF0C6F7F69B
:10158000F1C6F6F6F3AF04D0F89FF48565D0F49574
:10159000F56BF291060EEA6EED0EE96E70D0F3BFB8
:1015A0001CD0EBC6F3F6F2A106D0F833F733F633CE
:1015B000F533002A4CE0F5AF0BD0F62B09E1F72B01
:1015C00007E1F82B05E1F833F733F633002A3FE063
:1015D000F4BD84D7F4BFC6D71CD0800EF81BF8AF7B
:1015E00004D03AD0EFC6F3F60AD0EBC6F3F6F853C0
:1015F00006E1F75304E1F65302E1006A21D0F8BF97
:1016000008D0D890F537F637F737F837002EF7D7E8
:101610001ED0F3AF02D0F88F13D0F89F11D0EEC6D2
:1016200000F0EFC6F8F6F0C6F7F6F1C6F6F608D009
:10163000EAC600F0EBC6F8F6ECC6F7F6EDC6F6F62D
:10164000F8C601F0F7C602F0F6C603F034D0006A1F
:10165000016A026A036A2FD0F56BF61FF71FF81FA5
:10166000F51FF52B05E1F62B03E1F72B01E1F82B34
:10167000F4B112D7F4B354D7F4B589D7B3D7EF5038
:10168000F62705E3F72B03E1F82BD8B4F281ED52EE
:10169000EF50F72703E3F82BD8B4F281ED52EF5067
:1016A000EFBE01D0800AF827D8B0F281F4B9FCD699
:1016B000F4BB3ED774D70001000C0601EA51D8B440
:1016C000A5D0F66FEE51D8B4A1D0F65F05E37F0E3A
:1016D000F627D8B09BD006D0810EF65FD8A096D062
:1016E000D8B494D0F6C600F0016A026A036AF56BBA
:1016F000EBC6F4F6F48FECC6F3F6EDC6F2F6190E6F
:10170000F66FF151F25F0DE2010EF35F0AE2F45F52
:1017100008E2F55F06E2F52BF42BF32BF151F227EB
:1017200028D0F051F35F12E2010EF45F0FE2F55F93
:101730000DE2F52BF42BF051F327F151F22719E3C9
:10174000F32B17E1F42B15E1F52B13D0EF518009A2
:10175000F45F0EE2010EF55F0BE2F52BEF5180090D
:10176000F427F051F327E9E3F42BE7E1F52BE5D774
:101770000380F62F01D00BD0D890F237F337F4372F
:10178000F537D890033602360136F737BAD7F7A1C6
:1017900006D0D890013202320332F73302D000066D
:1017A00035E0F7BF1ED0D890F237F337F437F5376E
:1017B000F151F25F07E2010EF35F04E2F45F02E22F
:1017C000F55F1AE3F051F35F05E2010EF45F02E208
:1017D000F55F12E3EF518009F45F03E2010EF55F5C
:1017E0000BE3032A09E1022A07E1012A05E1002AA5
:1017F0000DE0013202320332EBC6F6F6EF51F61B72
:10180000F6AF02D0018E06D0019E04D0006A016AB4
:10181000026A036A0001000CB60E006E036A026AD7
:10182000016A0601C251C311C411C51102E1006A67
:101830000DD0D89001BE09D0C237C337C437C537E1
:10184000033602360136002EF4D7019E0001E9EF7F
:1018500011F00601E451D8B471D0006EE851D8B44B
:101860006DD0002604E3810E002668E204D07F0ECE
:10187000005E64E363E0E5C6ECF6E951EC1BE58F3E
:10188000E98FE751EB03F4CFEEF6E651EA03F4CF2C
:1018900003F0F3CFEDF6EB03F350EE27F450ED2316
:1018A000000E0322E751EA03F350EE27F450ED2334
:1018B000000E026A03220222E551EB03F350ED27EA
:1018C000F4500322000E0222E551EA03F3500326EE
:1018D000F4500222000E016A0122E751E903F3509D
:1018E000ED27F4500322000E02220122E651E90303
:1018F000F3500326F4500222000E0122E551E903C1
:10190000F3500226F4500122002A01BE05D0ED3723
:101910000336023601360006000EEDAF0AD0032A68
:1019200002220122015005E1025003E1035001E1CE
:10193000002AECBF018EECAF019E04D0006A016A60
:10194000026A036A0001000CEBC6F2F60601EF51D1
:10195000F21BF2AF05D0D894D890EBBFD8802FD02F
:10196000EBC6F2F6EEC6F3F6EA51F35F06E0F2AF2D
:1019700026D0D850010AD86E22D0EFC6F3F6EB512C
:10198000F35F06E0F2AF1BD0D850010AD86E17D033
:10199000F0C6F3F6EC51F35F06E0F2AF10D0D8508A
:1019A000010AD86E0CD0F1C6F3F6ED51F35F06E0F4
:1019B000F2AF05D0D850010AD86E01D0D8900001FE
:1019C000000CDFC6EDF6DEC6ECF6DDC6EBF6DCC6D7
:1019D000EAF60601F16BF06BEF6BEE6B0001B4DF22
:1019E00001E205E1006A016A026A036A78D0DFC693
:1019F000E3F6DEC6E2F6DDC6E1F6DCC6E0F6060E8C
:101A00000601E96FE00EE86FE8C6E9FFE9C6EAFF04
:101A1000EF50ED6BEC6F7F0EEC27000EED23D890AE
:101A2000ED31EC31E9C6EAFFE8C6E9FFEF6EE3C647
:101A3000E7F6E2C6E6F6E1C6E5F6E0C6E4F6DFC69E
:101A4000EDF6DEC6ECF6DDC6EBF6DCC6EAF6E3C67E
:101A5000F1F6E2C6F0F6E1C6EFF6E0C6EEF60001FA
:101A60002CDED892E3C6EDF6E2C6ECF6E1C6EBF664
:101A7000E0C6EAF603C0F1F602C0F0F601C0EFF6E8
:101A800000C0EEF6DEDC03C0E3F602C0E2F601C001
:101A9000E1F600C0E0F60601E8C6E9FFE9C6EAFFA4
:101AA000EF06E7C6EDF6E6C6ECF6E5C6EBF6E4C6ED
:101AB000EAF6E3C6F1F6E2C6F0F6E1C6EFF6E0C6F6
:101AC000EEF6000141DFD8B402D00601B0D7E4C67B
:101AD00000F0E5C601F0E6C602F0E7C603F065EFE8
:101AE0000EF00601D46BD56BD66BD76BD36BD26B74
:101AF000D351D15DD8A0A8D004E1D051D25DD8B0E7
:101B0000A3D0D235026ED335036E02360336FC0EF7
:101B100002160250CE25E96ECF510320EA6EEFCFB8
:101B2000D8F6ECCFD9F6ECCFDAF6ECCFDBF6EACF8D
:101B3000DDF6E9CFDCF6D882DBC6EDF6DAC6ECF6E8
:101B4000D9C6EBF6D8C6EAF6CDC6F1F6CCC6F0F6A5
:101B5000CBC6EFF6CAC6EEF6000173DCDDC6EAFFBF
:101B6000DCC6E9FF00C0D8F601C0D9F602C0DAF63B
:101B700003C0DBF60601D235026ED335036E0236A2
:101B80000336FC0E02160250CE25E96ECF5103201B
:101B9000EA6EEFCFDEF6ECCFDFF6ECCFE0F6ECCF7F
:101BA000E1F6EACFE3F6E9CFE2F6D882E1C6EDF658
:101BB000E0C6ECF6DFC6EBF6DEC6EAF6CDC6F1F619
:101BC000CCC6F0F6CBC6EFF6CAC6EEF6000139DC9D
:101BD000E3C6EAFFE2C6E9FFDBC6E7F6DAC6E6F6E9
:101BE000D9C6E5F6D8C6E4F603C0EBF602C0EAF6BD
:101BF00001C0E9F600C0E8F62CDEEACFD9F6E9CF5D
:101C0000D8F6D892D7C6EDF6D6C6ECF6D5C6EBF622
:101C1000D4C6EAF603C0F1F602C0F0F601C0EFF652
:101C200000C0EEF60EDCD9C6EAFFD8C6E9FF03C055
:101C3000D7F602C0D6F601C0D5F600C0D4F606012C
:101C4000D22BD8B4D32B54D7D1C6D9F6D0C6D8F618
:101C5000000106EC0AF00601ED6BEC6BEB6B7F0EFE
:101C6000EA6F03C0F1F602C0F0F601C0EFF600C063
:101C7000EEF6000122DD00C0D8F601C0D9F602C0A0
:101C8000DAF603C0DBF603C0E7F602C0E6F601C0F1
:101C9000E5F600C0E4F6D7C6EBF6D6C6EAF6D5C63A
:101CA000E9F6D4C6E8F6D5DD00C0D8F601C0D9F60D
:101CB00002C0DAF603C0DBF603C0DFF602C0DEF6D0
:101CC00001C0DDF600C0DCF67CD603C0D7F602C04A
:101CD000D6F601C0D5F600C0D4F6D4C600F0D5C6FD
:101CE00001F0D6C602F0D7C603F0000C0601DB51A6
:101CF000B608DB6F036ADCC6DFF6DC8FD890DC3316
:101D0000DD33DE330332023201320032DB2FF6D70D
:101D1000DFAF0BD0001E011E021E031E002AD8B426
:101D2000012AD8B4022AD8B4032A000103EF0FF025
:101D3000006A016A026A036A0601E36BE46BE56B01
:101D4000E66BE251E111E011DF112CE0200EE76FAC
:101D5000D890DB37DC37DD37DE37E337E437E5377C
:101D6000E637E251E65D08E1E151E55D05E1E0516C
:101D7000E45D02E1DF51E35D0FE3DF51E35FE0513A
:101D8000D8A0E03DE45FE151D8A0E13DE55FE2513C
:101D9000D8A0E23DE65FD880003601360236033631
:101DA000E72FD6D7060EEA6EE30EE96E0001000CAF
:101DB000E9500601D36FD251D56F1BE0D1C6E7F6CB
:101DC000D0C6E6F6CFC6E5F6CEC6E4F6EB6BEA6B18
:101DD000200EE96F820EE86F00013BDD03C0D1F6F3
:101DE00002C0D0F601C0CFF600C0CEF60601D52F56
:101DF000E5D7D1C6DEF6D0C6DDF6CFC6DCF6CEC658
:101E0000DBF6000173D703C0D1F602C0D0F601C0E3
:101E1000CFF600C0CEF60601D1AF0DD0D307D38BDD
:101E2000CE1FCF1FD01FD11FCE2BD8B4CF2BD8B4ED
:101E3000D02BD8B4D12B3B0EDA6F9A0ED96FCA0EC5
:101E4000D86FD76B0A0ED56FD251D8B4D32BD1C669
:101E5000DEF6D0C6DDF6CFC6DCF6CEC6DBF6DAC6D9
:101E6000E2F6D9C6E1F6D8C6E0F6D7C6DFF600013D
:101E70005FDF0150EFCFCEF6ECCFCFF6ECCFD0F650
:101E8000ECCFD1F6005213E10601D229D55DD8A4DA
:101E900002D000010CD0D3510DE00F0BD55D01E055
:101EA00044E2D3BF42D0D3BD05D0200E37D0200EA0
:101EB0000601D317D3AB0FD0D39BD251D8A4D307ED
:101EC0000050D36F2D0EDB6F0001EAEC09F0060124
:101ED000D351006ED36BD251D55D0DE10050D36F5D
:101EE0002E0EDB6F0001EAEC09F00601D351006E03
:101EF000200ED317000E300ED3AB10D0D39BD2518F
:101F0000D8A4D3070050D36F2D0EDB6F0001EAEC8D
:101F100009F00601D351006ED36B300E002600C0CD
:101F2000DBF60001EAEC09F00601DAC6DEF6D9C6F6
:101F3000DDF6D8C6DCF6D7C6DBF6E26BE16BE06B0C
:101F40000A0EDF6F0001F4DE03C0DAF602C0D9F634
:101F500001C0D8F600C0D7F60601D52F78D700010A
:101F6000000CF86AD09E088EEA6AE96AC150C00B7C
:101F70000F09C16E070EB46E216A040E226E0C0E9C
:101F8000236E246A286A7C6B836BF18EB098C69AA4
:101F9000949E93809392010EC66E000EC76ED190F0
:101FA000870ED56ECD6A000ECA6E000ECB6EB16A7A
:101FB000070EB46E9250926E130E006E002EFED776
:101FC00000D0B450A19CB56AF28AC00EF212C15082
:101FD000C00B1C09C16EC090C082C084C08EC2807C
:101FE000B4EF09F080A1FED71C6A1B6A1A6A196A4D
:101FF000D76AD66A0301B16BB15100010FEC01F051
:102000000301B12B006EE8CFDBF60001EAEC09F02A
:10201000250E0301B15DF0E1000180A1E0D20301D2
:10202000B06BB0516308D8A06BD1000E016EC250E6
:10203000C30B0110C26E130E006E002EFED700D02F
:10204000186AF2BE188EF29E0701496BB0C348F7BA
:102050004B6B040E4A6F00015DEC01F018BEF28E6E
:1020600002C003F00150840FE96E000E0220EA6EF8
:10207000C282C2B2FED7C4CFD9F6C3CFD8F6000110
:1020800006EC0AF000C0EFFF01C0ECFF02C0ECFF5D
:1020900003C0ECFF186AF2BE188EF29E0701496B6E
:1020A000B0C348F74B6B040E4A6F00015DEC01F0C2
:1020B00018BEF28E02C003F00150840FE96E000ECC
:1020C0000220EA6EEFCF00F0ECCF01F0ECCF02F08F
:1020D000ECCF03F0EACFB2F3E9CFB1F3D892A7C3C4
:1020E000EDF6A6C3ECF6A5C3EBF6A4C3EAF603C06F
:1020F000F1F602C0F0F601C0EFF600C0EEF621ECFA
:102100000AF0B2C3EAFFB1C3E9FF03C0A7F302C0FC
:10211000A6F301C0A5F300C0A4F3040E016EC250E3
:10212000C30B0110C26E130E006E002EFED700D03E
:10213000186AF2BE188EF29E0701496BB0C348F7C9
:102140004B6B040E4A6F00015DEC01F018BEF28E7D
:1021500002C003F00150140FE96E020E0220EA6E75
:10216000C282C2B2FED7C4CFD9F6C3CFD8F600011F
:1021700006EC0AF000C0EFFF01C0ECFF02C0ECFF6C
:1021800003C0ECFF186AF2BE188EF29E0701496B7D
:10219000B0C348F74B6B040E4A6F00015DEC01F0D1
:1021A00018BEF28E02C003F00150140FE96E020E49
:1021B0000220EA6EEFCF00F0ECCF01F0ECCF02F09E
:1021C000ECCF03F0EACFB2F3E9CFB1F3D892ABC3CF
:1021D000EDF6AAC3ECF6A9C3EBF6A8C3EAF603C072
:1021E000F1F602C0F0F601C0EFF600C0EEF621EC09
:1021F0000AF0B2C3EAFFB1C3E9FF03C0ABF302C008
:10220000AAF301C0A9F300C0A8F3080E016EC250E2
:10221000C30B0110C26E130E006E002EFED700D04D
:10222000186AF2BE188EF29E0701496BB0C348F7D8
:102230004B6B040E4A6F00015DEC01F018BEF28E8C
:1022400002C003F00150200FE96E050E0220EA6E75
:10225000C282C2B2FED7C4CFD9F6C3CFD8F600012E
:1022600006EC0AF000C0EFFF01C0ECFF02C0ECFF7B
:1022700003C0ECFF186AF2BE188EF29E0701496B8C
:10228000B0C348F74B6B040E4A6F00015DEC01F0E0
:1022900018BEF28E02C003F00150200FE96E050E49
:1022A0000220EA6EEFCF00F0ECCF01F0ECCF02F0AD
:1022B000ECCF03F0EACFB2F3E9CFB1F3D892AFC3DA
:1022C000EDF6AEC3ECF6ADC3EBF6ACC3EAF603C075
:1022D000F1F602C0F0F601C0EFF600C0EEF621EC18
:1022E0000AF0B2C3EAFFB1C3E9FF03C0AFF302C013
:1022F000AEF301C0ADF300C0ACF30301B02B91D637
:10230000A7C3EDF6A6C3ECF6A5C3EBF6A4C3EAF6A5
:102310000601F16BF06B480EEF6F850EEE6F00015A
:102320005DEC0BF003C0A7F302C0A6F301C0A5F358
:1023300000C0A4F3ABC3EDF6AAC3ECF6A9C3EBF659
:10234000A8C3EAF60601F16BF06B480EEF6F850E3D
:10235000EE6F00015DEC0BF003C0ABF302C0AAF31B
:1023600001C0A9F300C0A8F3AFC3EDF6AEC3ECF60D
:10237000ADC3EBF6ACC3EAF60601F16BF06B480EA9
:10238000EF6F850EEE6F00015DEC0BF003C0AFF355
:1023900002C0AEF301C0ADF300C0ACF31AC0B5F398
:1023A00019C0B4F30301B26BB36BD650D7CF03F0AF
:1023B000B227D750B323000EB423B523B5C3C5F657
:1023C000B4C3C4F6B3C3C3F6B2C3C2F600010CEF84
:1023D0000CF003C0EDF602C0ECF601C0EBF600C055
:1023E000EAF60601F16B240EF06F740EEF6F8C0E9F
:1023F000EE6F00015DEC0BF000C0B2F301C0B3F36F
:1024000002C0B4F303C0B5F3A7C3CDF6A6C3CCF6A0
:10241000A5C3CBF6A4C3CAF60601CF6B840ECE6F5C
:10242000D16B640ED06F000171EC0DF000C0B6F3FB
:1024300001C0B7F302C0B8F303C0B9F3ABC3CDF624
:10244000AAC3CCF6A9C3CBF6A8C3CAF6020E0601EE
:10245000CF6F140ECE6FD16B640ED06F000171EC94
:102460000DF000C0BAF301C0BBF302C0BCF303C05F
:10247000BDF3AFC3CDF6AEC3CCF6ADC3CBF6ACC3A4
:10248000CAF6050E0601CF6F200ECE6FD16B640E1B
:10249000D06F000171EC0DF000C0BEF301C0BFF3BE
:1024A00002C0C0F303C0C1F3060EE96EB5C3D1F696
:1024B000B4C3D0F6B3C3CFF6B2C3CEF6030E060153
:1024C000D26F000175DC200E0601DB6F0001EAEC23
:1024D00009F0030EE96EA7C3D1F6A6C3D0F6A5C3D3
:1024E000CFF6A4C3CEF60601D26F000161DC200E48
:1024F0000601DB6F0001EAEC09F0030EE96EB9C3D7
:10250000D1F6B8C3D0F6B7C3CFF6B6C3CEF6060140
:10251000D26F00014DDC200E0601DB6F0001EAECFA
:1025200009F0030EE96EABC3D1F6AAC3D0F6A9C376
:10253000CFF6A8C3CEF60601D26F000139DC200E1B
:102540000601DB6F0001EAEC09F0030EE96EBDC382
:10255000D1F6BCC3D0F6BBC3CFF6BAC3CEF60601E4
:10256000D26F000125DC200E0601DB6F0001EAECD2
:1025700009F0030EE96EAFC3D1F6AEC3D0F6ADC31A
:10258000CFF6ACC3CEF60601D26F000111DC200EEF
:102590000601DB6F0001EAEC09F0030EE96EC1C32E
:1025A000D1F6C0C3D0F6BFC3CFF6BEC3CEF6060188
:1025B000D26F0001D8EC0EF0200E0601DB6F000197
:1025C000EAEC09F00A0E0601DB6F0001EAEC09F003
:1025D0000D0E0601DB6F0001EAEC09F01ED502D5F5
:0225E0000300F6
:020000040030CA
:0E0000003CCE390E0087A1000FC00FE00F406C
:00000001FF
;PIC18F4550
;CRC=66E2 CREATED="15-V-10 23:52"
/programy/C/PIC/mereni/inertial/main.lst
0,0 → 1,11713
CCS PCH C Compiler, Version 4.090, 47914 15-V-10 23:52
 
Filename: D:\svnKaklik\programy\C\PIC_C\mereni\inertial\main.lst
 
ROM used: 9694 bytes (30%)
Largest free fragment is 23070
RAM used: 1650 (81%) at main() level
1869 (91%) worst case
Stack: 17 worst case (8 in main + 9 for interrupts)
 
*
0000: GOTO 1F62
*
0008: MOVWF 05
000A: MOVFF FD8,06
000E: MOVFF FE0,07
0012: MOVLB 0
0014: MOVFF FE9,0D
0018: MOVFF FEA,08
001C: MOVFF FE1,09
0020: MOVFF FE2,0A
0024: MOVFF FD9,0B
0028: MOVFF FDA,0C
002C: MOVFF FF3,14
0030: MOVFF FF4,15
0034: MOVFF FFA,16
0038: MOVFF 00,0F
003C: MOVFF 01,10
0040: MOVFF 02,11
0044: MOVFF 03,12
0048: MOVFF 04,13
004C: BTFSS FF2.5
004E: GOTO 0058
0052: BTFSC FF2.2
0054: GOTO 025E
0058: BTFSS FA0.5
005A: GOTO 0064
005E: BTFSC FA1.5
0060: GOTO 1274
0064: MOVFF 0F,00
0068: MOVFF 10,01
006C: MOVFF 11,02
0070: MOVFF 12,03
0074: MOVFF 13,04
0078: MOVFF 0D,FE9
007C: MOVFF 08,FEA
0080: BSF 08.7
0082: MOVFF 09,FE1
0086: MOVFF 0A,FE2
008A: MOVFF 0B,FD9
008E: MOVFF 0C,FDA
0092: MOVFF 14,FF3
0096: MOVFF 15,FF4
009A: MOVFF 16,FFA
009E: MOVF 05,W
00A0: MOVFF 07,FE0
00A4: MOVFF 06,FD8
00A8: RETFIE 0
.................... #include "main.h"
.................... #include <18F4550.h>
.................... //////// Standard Header file for the PIC18F4550 device ////////////////
.................... #device PIC18F4550
.................... #list
....................
.................... #device adc=10
....................
.................... #FUSES NOWDT //No Watch Dog Timer
.................... #FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
.................... #FUSES HSPLL //Crystal/Resonator with PLL enabled
.................... #FUSES NOPROTECT //Code not protected from reading
.................... #FUSES NOBROWNOUT //No brownout reset
.................... #FUSES BORV20 //Brownout reset at 2.0V
.................... #FUSES NOPUT //No Power Up Timer
.................... #FUSES NOCPD //No EE protection
.................... #FUSES STVREN //Stack full/underflow will cause reset
.................... #FUSES NODEBUG //No Debug mode for ICD
.................... #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
.................... #FUSES NOWRT //Program memory not write protected
.................... #FUSES NOWRTD //Data EEPROM not write protected
.................... #FUSES IESO //Internal External Switch Over mode enabled
.................... #FUSES FCMEN //Fail-safe clock monitor enabled
.................... #FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
.................... #FUSES NOWRTC //configuration not registers write protected
.................... #FUSES NOWRTB //Boot block not write protected
.................... #FUSES NOEBTR //Memory not protected from table reads
.................... #FUSES NOEBTRB //Boot block not protected from table reads
.................... #FUSES NOCPB //No Boot Block code protection
.................... #FUSES MCLR //Master Clear pin enabled
.................... #FUSES LPT1OSC //Timer1 configured for low-power operation
.................... #FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
.................... #FUSES PLL5 //Divide By 5(20MHz oscillator input)
.................... #FUSES CPUDIV4 //System Clock by 4
.................... #FUSES USBDIV //USB clock source comes from PLL divide by 2
.................... #FUSES VREGEN //USB voltage regulator enabled
.................... #FUSES ICPRT //ICPRT enabled
....................
.................... #use delay(clock=24000000)
....................
....................
....................
.................... #define REV "$Rev$"
....................
.................... unsigned int32 time; // pocitadlo preteceni casovace
....................
.................... #define BUFLEN 100
....................
.................... #int_RTCC
.................... void RTCC_isr(void) // preruseni od pretekleho casovace
.................... {
.................... time++;
*
025E: MOVLW 01
0260: ADDWF 19,F
0262: BTFSC FD8.0
0264: INCF 1A,F
0266: BTFSC FD8.2
0268: INCF 1B,F
026A: BTFSC FD8.2
026C: INCF 1C,F
.................... }
....................
.................... // Includes all USB code and interrupts, as well as the CDC API
.................... #include <usb_cdc.h>
.................... /////////////////////////////////////////////////////////////////////////
.................... //// ////
.................... //// usb_cdc.h ////
.................... //// ////
.................... //// Library for adding a virtual COM port on your PC over USB using ////
.................... //// the standard Communication Device Class (CDC) specification. ////
.................... //// Including this file in your code will add all USB code, ////
.................... //// interrupts, descriptors and handlers required. No other ////
.................... //// modifications need to be made. ////
.................... //// ////
.................... //// This library creates a virtual RS232 link between the PC and ////
.................... //// the PIC, therefore the library provided will be familiar to ////
.................... //// anyone with standard UART stream I/O: ////
.................... //// ////
.................... //// usb_cdc_kbhit() - Returns TRUE if there is one or more ////
.................... //// character received and waiting in the receive buffer. ////
.................... //// ////
.................... //// usb_cdc_getc() - Gets a character from the receive buffer. If ////
.................... //// there is no data in the receive buffer it will wait until ////
.................... //// there is data in the receive buffer. If you do not want ////
.................... //// to wait in an infinit loop, use usb_cdc_kbhit() first to ////
.................... //// check if there is data before calling usb_cdc_getc(). ////
.................... //// ////
.................... //// usb_cdc_putc(char c) - Puts a character into the transmit ////
.................... //// buffer. If the transmit buffer is full it will wait until ////
.................... //// the transmit buffer is not full before putting the char ////
.................... //// into the transmit buffer. The transmit buffer is read by ////
.................... //// the PC very quickly, and therefore the buffer should only ////
.................... //// be full for a few milli-seconds. If you are concerned ////
.................... //// and don't want to be stuck in a long or infinite loop, ////
.................... //// use usb_cdc_putready() to see if there is space in the ////
.................... //// transmit buffer before putting data into the transmit ////
.................... //// buffer. ////
.................... //// ////
.................... //// usb_cdc_putready() - Returns TRUE if there is room left in the ////
.................... //// transmit buffer for another character. ////
.................... //// ////
.................... //// usb_cdc_connected() - Returns TRUE if we received a ////
.................... //// Set_Line_Coding. On most serial terminal programs (such ////
.................... //// as Hyperterminal), they will send a Set_Line_Coding ////
.................... //// message when the program starts and it opens the virtual ////
.................... //// COM port. This is a simple way to determine if the PC ////
.................... //// is ready to display data on a serial terminal program, ////
.................... //// but is not garaunteed to work all the time or on other ////
.................... //// terminal programs. ////
.................... //// ////
.................... //// usb_cdc_putc_fast(char c) - Similar to usb_cdc_putc(), except ////
.................... //// if the transmit buffer is full it will skip the char. ////
.................... //// ////
.................... //// usb_cdc_line_coding - A structure used for Set_Line_Coding and ////
.................... //// Get_Line_Coding. Most of the time you can ignore this. ////
.................... //// ////
.................... //// usb_cdc_break - If the PC has sent a break command, this will ////
.................... //// hold the break time (in milli-seconds). If the PC sends ////
.................... //// a value of 0xFFFF the device is supposed to hold the ////
.................... //// break until it sends a value of 0 ////
.................... //// ////
.................... //// usb_cdc_carrier - Where Set_Control_Line_State value is stored. ////
.................... //// Of most relevance is the field dte_present, which is the ////
.................... //// DTR setting. ////
.................... //// ////
.................... //// The following functions are also provided, and are ports of the ////
.................... //// I/O functions in input.c. See input.c and the CCS manual for ////
.................... //// documentation: ////
.................... //// get_float_usb() - Read a float number from the user ////
.................... //// get_long_usb() - Read a long number from the user ////
.................... //// get_int_usb() - Read an integer number from the user ////
.................... //// get_string_usb(char *s, int max) - Read a string from the user. ////
.................... //// gethex_usb() - Read a byte, in HEX, from the user ////
.................... //// gethex1_usb() - Read a HEX character ////
.................... //// ////
.................... //// This driver will load all the rest of the USB code, and a set ////
.................... //// of descriptors that will properly describe a CDC device for a ////
.................... //// virtual COM port (usb_desc_cdc.h) ////
.................... //// ////
.................... //// An .INF file is provided (cdc_NTXP.inf) that will load the ////
.................... //// standard CDC drivers for a virtual COM port in Windows ////
.................... //// NT/2000/XP and above. ////
.................... //// ////
.................... /////////////////////////////////////////////////////////////////////////
.................... //// ////
.................... //// VERSION HISTORY ////
.................... //// ////
.................... //// March 5th, 2009: ////
.................... //// Cleanup for Wizard. ////
.................... //// PIC24 Initial release. ////
.................... //// ////
.................... //// Nov 26th, 2007: ////
.................... //// usb_cdc_put_buffer_free() should be more stable. ////
.................... //// Fixed a hang-up that would happen if you sent ////
.................... //// exactly 64 bytes. ////
.................... //// ////
.................... //// Nov 6th, 2007: ////
.................... //// Compatabible with latest pic18_usb.h, which ////
.................... //// reduces RAM footprint of USB driver. ////
.................... //// This driver now fits on 18F4450/2450 PICs. ////
.................... //// ////
.................... //// October 27th, 2005: Changed the way incoming packets are ////
.................... //// handled in that CDC driver will not flush ////
.................... //// endpoint until user has handled all data. This ////
.................... //// will prevent overflows as the USB will NAK ////
.................... //// incoming packets until it is ready to receive ////
.................... //// more. ////
.................... //// When using 18F4550 family, the RX buffer is ////
.................... //// mapped directly to the endpoint buffer - this ////
.................... //// saves a chunk of RAM. ////
.................... //// When using the 18F4550 family, you can increase ////
.................... //// the TX and RX size over 64 bytes. ////
.................... //// No longer send 0len packets in the TBE interrupt. ////
.................... //// Hopefully fixed bugs that caused random crashes ////
.................... //// if you tried sending more than 64 bytes. ////
.................... //// ////
.................... //// July 6th, 2005: Global interrupts disabled when writing to TX ////
.................... //// buffer. ////
.................... //// ////
.................... //// July 1st, 2005: Initial Release. ////
.................... //// ////
.................... /////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996,2005 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS ////
.................... //// C compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, ////
.................... //// reproduction or distribution is permitted without written ////
.................... //// permission. Derivative programs created using this software ////
.................... //// in object code form are not restricted in any way. ////
.................... /////////////////////////////////////////////////////////////////////////
....................
....................
.................... //api for the user:
.................... #define usb_cdc_kbhit() (usb_cdc_get_buffer_status.got)
.................... #define usb_cdc_putready() (usb_cdc_put_buffer_nextin<USB_CDC_DATA_IN_SIZE)
.................... #define usb_cdc_connected() (usb_cdc_got_set_line_coding)
026E: BCF FF2.2
0270: GOTO 0064
.................... void usb_cdc_putc_fast(char c);
.................... char usb_cdc_getc(void);
.................... void usb_cdc_putc(char c);
....................
.................... //input.c ported to use CDC:
.................... float get_float_usb();
.................... signed long get_long_usb();
.................... signed int get_int_usb();
.................... void get_string_usb(char* s, unsigned int max);
.................... BYTE gethex_usb();
.................... BYTE gethex1_usb();
....................
.................... //functions automatically called by USB handler code
.................... void usb_isr_tkn_cdc(void);
.................... void usb_cdc_init(void);
.................... void usb_isr_tok_out_cdc_control_dne(void);
.................... void usb_isr_tok_in_cdc_data_dne(void);
.................... void usb_isr_tok_out_cdc_data_dne(void);
....................
.................... void usb_cdc_flush_out_buffer(void);
....................
.................... /////////////////////////////////////////////////////////////////////////////
.................... //
.................... // Include the CCS USB Libraries. See the comments at the top of these
.................... // files for more information
.................... //
.................... /////////////////////////////////////////////////////////////////////////////
.................... #ifndef __USB_PIC_PERIF__
.................... #define __USB_PIC_PERIF__ 1
.................... #endif
....................
.................... #if __USB_PIC_PERIF__
.................... #if defined(__PCH__)
.................... #include <pic18_usb.h> //Microchip 18Fxx5x hardware layer for usb.c
.................... /////////////////////////////////////////////////////////////////////////
.................... //// pic18_usb.h ////
.................... //// ////
.................... //// Hardware layer for CCS's USB library. This hardware layer ////
.................... //// supports the USB peripheral on the PIC18 family chips. Current ////
.................... //// supported families are: ////
.................... //// PIC18F2455/2550/4455/4550 ////
.................... //// PIC18F2450/4450 ////
.................... //// PIC18F2458/2553/4458/4553 ////
.................... //// PIC18F13K50/14K50 ////
.................... //// PIC18F65J50/66J50/66J55/67J50/85J50/86J50/86J55/87J50 ////
.................... //// ////
.................... //// This file is part of CCS's PIC USB driver code. See USB.H ////
.................... //// for more documentation and a list of examples. ////
.................... //// ////
.................... //// See the section labeled EXTRA USER FUNCTIONS for functions ////
.................... //// that are specific to only this HW peripheral that you may ////
.................... //// find useful to use in your application. ////
.................... //// ////
.................... //// *********** NOTE ABOUT 18F2450/4450 LIMITATIONS ********** ////
.................... //// Due to the limited USB RAM of this family, a limitation of ////
.................... //// this driver is that there are only 3 endpoints (0, 1 and 2). ////
.................... //// The HW actually supports more endpoints, but to simplify ////
.................... //// driver development this driver will only support the first 3 ////
.................... //// so there is an easier memory block to work with. ////
.................... //// ////
.................... //// USB_MAX_EP0_PACKET_LENGTH will also be set to 8 regardless ////
.................... //// of USB speed, to save RAM. ////
.................... //// ////
.................... //// ************** NOTE ABOUT HW REQUIREMENTS **************** ////
.................... //// If you are not using internal pullups, you will need to put ////
.................... //// an internal pullup resistor on D+ or D+ depending on if you ////
.................... //// want to use slow speed or full speed. This code configures ////
.................... //// the device to use internal pullups, see usb_init() if you ////
.................... //// want to change that. ////
.................... //// ////
.................... //// You need approximately 470nF cap on Vusb, even if you are ////
.................... //// using the internal 3.3V USB regulator. ////
.................... //// ////
.................... //// To run at full speed, you must use the oscillator ////
.................... //// configuration (PLLx) to set the PLL divide to 4MHz. You can ////
.................... //// configure the MCU clock to any speed (up to 48MHz) but the ////
.................... //// PLL must run at 4Mhz to provide the USB peripheral with a ////
.................... //// 96MHz clock. See the datasheet for details. ////
.................... //// ////
.................... //// To run at slow speed you must configure your MCU to run at ////
.................... //// 24Mhz. See the datasheet for details. ////
.................... //// ////
.................... //// **************** NOTE ABOUT INTERRUPTS ****************** ////
.................... //// This driver uses INT_USB. It requires INT_USB to interrupt the ////
.................... //// PIC when an event has happened on the USB Bus. Therfore ////
.................... //// this code enables interrupts. A user modification can be made ////
.................... //// to poll the USB interrupt flag instead of relying on an ////
.................... //// interrupt. ////
.................... //// ////
.................... /////////////////////////////////////////////////////////////////////////
.................... //// ////
.................... //// Version History: ////
.................... //// ////
.................... //// March 5th, 2009: ////
.................... //// 18F14K50 family added. ////
.................... //// Cleanup for Wizard. ////
.................... //// PIC24 Initial release. ////
.................... //// ////
.................... //// Nov 3rd, 2008: ////
.................... //// * 4553 family added. ////
.................... //// ////
.................... //// Dec 18, 2007: ////
.................... //// * usb_kbhit() moved to device driver. ////
.................... //// * USB Token handler changed to workaround a flaw in the USB ////
.................... //// peripheral to prevent the USB peripheral from ////
.................... //// inadvertantly STALLing the endpoint. Happened most often ////
.................... //// in bulk demo applications, especially CDC. ////
.................... //// ////
.................... //// 11-6-07: Fixed a bug where usb_data_buffer[] was reserving ////
.................... //// too much RAM. ////
.................... //// USB_MAX_EP0_PACKET_LENGTH value can be overwritten. ////
.................... //// For the 18F4450/2450 family this should be 8 ////
.................... //// because of limited RAM. Reducing this value ////
.................... //// frees RAM for application. ////
.................... //// Based upon which endpoints have been configured for ////
.................... //// use, will free up unused USB data RAM for ////
.................... //// application dynamically. This should free up ////
.................... //// at least 128 bytes of RAM. ////
.................... //// CDC now fits on a 18F4450/2450 ////
.................... //// ////
.................... //// 09-19-07: Fixed problems with 18F4450 family. ////
.................... //// ////
.................... //// 07-17-07: Added 18F4450,2450 support ////
.................... //// ////
.................... //// 07-13-07: Added 87J50 family support ////
.................... //// ////
.................... //// 11-01-05: usb_detach(), usb_attach() and usb_init_cs() ////
.................... //// changed for the better. ////
.................... //// ////
.................... //// 10-28-05: Added usb_rx_packet_size() ////
.................... //// ////
.................... //// 07-13-05: usb_put_packet() changed for 16bit packet sizes ////
.................... //// usb_flush_in() changed for 16bit packet sizes ////
.................... //// usb_get_packet() changed for 16bit packet sizes ////
.................... //// usb_flush_out() changed for 16bit packet sizes ////
.................... //// usb_set_configured() changed for 16bit packet sizes ////
.................... //// ////
.................... //// 06-30-05: usb_tbe() added ////
.................... //// The way endpoint 0 DTS is set has been changed. ////
.................... //// ////
.................... //// 06-20-05: Initial Release ////
.................... //// ////
.................... //// 05-13-05: Beta Release (Full Speed works) ////
.................... //// ////
.................... //// 03-21-05: Initial Alpha Release ////
.................... //// ////
.................... /////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996,2005 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS ////
.................... //// C compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, ////
.................... //// reproduction or distribution is permitted without written ////
.................... //// permission. Derivative programs created using this software ////
.................... //// in object code form are not restricted in any way. ////
.................... /////////////////////////////////////////////////////////////////////////
....................
.................... #IFNDEF __PIC18_USB_H__
.................... #DEFINE __PIC18_USB_H__
....................
.................... #DEFINE __USB_HARDWARE__
....................
.................... //let the USB Stack know that we are using a PIC with internal USB peripheral
.................... #DEFINE __PIC__ 1
....................
.................... #ifndef USB_USE_FULL_SPEED
.................... #define USB_USE_FULL_SPEED TRUE
.................... #endif
....................
.................... #ifndef USB_MAX_EP0_PACKET_LENGTH
.................... #if ((getenv("DEVICE")=="PIC18F2450") || (getenv("DEVICE")=="PIC18F4450"))
.................... //due to limited ram, force max packet length to 8 for this chip
.................... #define USB_MAX_EP0_PACKET_LENGTH 8
.................... #else
.................... #if USB_USE_FULL_SPEED==FALSE
.................... //slow speed requires 8byte max packet size for endpoint 0
.................... #DEFINE USB_MAX_EP0_PACKET_LENGTH 8
.................... #else
.................... //for full speed you can still use 8bytes, but 64 will be faster
.................... #DEFINE USB_MAX_EP0_PACKET_LENGTH 64
.................... #endif
.................... #endif
.................... #endif
....................
.................... #if (!USB_USE_FULL_SPEED && (USB_MAX_EP0_PACKET_LENGTH!=8))
.................... #error Slow speed devices must use a max packet size of 8 for endpoint 0!
.................... #endif
....................
.................... #if USB_MAX_EP0_PACKET_LENGTH < 8
.................... #error Max Endpoint 0 length can't be less than 8!
.................... #endif
....................
.................... #if USB_MAX_EP0_PACKET_LENGTH > 64
.................... #error Max Endpoint 0 length can't be greater than 64!
.................... #endif
....................
.................... #include <usb_hw_layer.h>
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// usb_hw_layer.h ////
.................... //// ////
.................... //// HW Layer for the USB Stack. ////
.................... //// ////
.................... //// HW drivers for the USB stack must support this API. ////
.................... //// ////
.................... //// The HW driver must also have a token handler that will call ////
.................... //// usb_token_reset() when the device is init/reset, will call ////
.................... //// usb_isr_tok_setup_dne() when it receives a setup packet, ////
.................... //// will call usb_isr_tok_out_dne() when a new packet is received, ////
.................... //// and will call usb_isr_tok_in_dne() when a new packet is sent. ////
.................... //// See usb.h for documentation of these functions. ////
.................... //// ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// ////
.................... //// Version History: ////
.................... //// ////
.................... //// March 5th, 2009: ////
.................... //// Cleanup for Wizard. ////
.................... //// PIC24 Initial release. ////
.................... //// ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996,2009 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS ////
.................... //// C compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, ////
.................... //// reproduction or distribution is permitted without written ////
.................... //// permission. Derivative programs created using this software ////
.................... //// in object code form are not restricted in any way. ////
.................... ///////////////////////////////////////////////////////////////////////////
....................
.................... #ifndef __USB_HW_LAYER_H__
.................... #define __USB_HW_LAYER_H__
....................
.................... enum USB_DTS_BIT {USB_DTS_DATA1=1, USB_DTS_TOGGLE=2, USB_DTS_DATA0=0,
.................... USB_DTS_STALL=3, USB_DTS_USERX=4};
....................
....................
.................... // USER LEVEL FUNCTIONS:
....................
.................... /*****************************************************************************
.................... /* usb_init()
.................... /*
.................... /* Summary: See API section of USB.H for documentation.
.................... /*
.................... /*****************************************************************************/
.................... void usb_init(void);
....................
.................... /*****************************************************************************
.................... /* usb_init_cs()
.................... /*
.................... /* Summary: See API section of USB.H for documentation.
.................... /*
.................... /*****************************************************************************/
.................... void usb_init_cs(void);
....................
.................... /*****************************************************************************
.................... /* usb_task()
.................... /*
.................... /* Summary: See API section of USB.H for documentation.
.................... /*
.................... /*****************************************************************************/
.................... void usb_task(void);
....................
.................... /******************************************************************************
.................... /* usb_attach()
.................... /*
.................... /* Summary: Attach the D+/D- lines to the USB bus. Enable the USB peripheral.
.................... /*
.................... /* You should wait until UCON_SE0 is clear before enabling reset/idle interrupt.
.................... /*
.................... /* Shouldn't be called by user, let usb_task() handle this.
.................... /*
.................... /* NOTE: If you are writing a new HW driver, this routine should call
.................... /* usb_token_reset() to reset the CH9 stack.
.................... /*
.................... /*****************************************************************************/
.................... void usb_attach(void);
....................
.................... /******************************************************************************
.................... /* usb_detach()
.................... /*
.................... /* Summary: Remove the D+/D- lines from the USB bus. Basically, disable USB.
.................... /*
.................... /* Shouldn't be called by user, let usb_task() handle this.
.................... /*
.................... /* If the user does call this function while USB is connected, the USB
.................... /* peripheral will be disabled only momentarily because usb_task() will
.................... /* reconnect. But this is a great way to cause the PC/HOST to cause a USB
.................... /* reset of the device.
.................... /*
.................... /* NOTE: If you are writing a new HW driver, this routine should call
.................... /* usb_token_reset() to reset the CH9 stack.
.................... /*
.................... /*****************************************************************************/
.................... void usb_detach(void);
....................
.................... /******************************************************************************
.................... /* usb_put_packet()
.................... /*
.................... /* Input: endpoint - endpoint to send packet to (0..15).
.................... /* ptr - points to data to send.
.................... /* len - amount of data to send.
.................... /* toggle - whether to send data with a DATA0 pid, a DATA1 pid,
.................... /* or toggle from the last DATAx pid.
.................... /*
.................... /* Output: TRUE if data was sent correctly, FALSE if it was not. The only
.................... /* reason it will return FALSE is if because the TX buffer is still full
.................... /* from the last time it tried to send a packet.
.................... /*
.................... /* Summary: Sends one packet out the EP to the host. Notice that there is a
.................... /* difference between a packet and a message. If you wanted to send a
.................... /* 512 byte message on an endpoint that only supported 64 byte packets,
.................... /* this would be accomplished this by sending 8 64-byte packets,
.................... /* followed by a 0 length packet. If the last (or only packet) being
.................... /* sent is less than the max packet size defined in your descriptor
.................... /* then you do not need to send a 0 length packet to identify
.................... /* an end of message.
.................... /*
.................... /* usb_puts() (provided in usb.c) will send a multi-packet message
.................... /* correctly and know if a 0 lenght packet needs to be sent.
.................... /*
.................... /* The result will be invalid if the specified input has not been configured for
.................... /* use by the API with USB_EPx_TX_SIZE
.................... /*
.................... /*****************************************************************************/
.................... int1 usb_put_packet(int8 endpoint, int8 * ptr, unsigned int16 len, USB_DTS_BIT tgl);
....................
.................... /*******************************************************************************
.................... /* usb_get_packet(endpoint, *ptr, max)
.................... /*
.................... /* Input: endpoint - endpoint to get data from
.................... /* ptr - where to save data to local PIC RAM
.................... /* max - max amount of data to receive from buffer
.................... /*
.................... /* Output: the amount of data taken from the buffer and saved to ptr.
.................... /*
.................... /* NOTE - IF THERE IS NO PACKET TO GET YOU WILL GET INVALID RESULTS!
.................... /* VERIFY WITH USB_KBHIT() BEFORE YOU CALL USB_GET_PACKET()!
.................... /*
.................... /* Summary: Gets a packet of data from the USB endpoint buffer.
.................... /* Until this is called, if there is data in the receive buffer the
.................... /* PC/HOST will be prevented from sending more data. Upon completion
.................... /* of this call, the endpoint will be freed and the PC/HOST will be
.................... /* allowed to send a new packet. Only receives one packet, if you need
.................... /* to receive multiple packets or handle 0-length terminator packets,
.................... /* then use usb_gets().
.................... /*
.................... /* The result will be invalid if the specified input has not been configured for
.................... /* use by the API with USB_EPx_RX_SIZE
.................... /*
.................... /********************************************************************************/
.................... unsigned int16 usb_get_packet(int8 endpoint, int8 * ptr, unsigned int16 max);
....................
.................... /****************************************************************************
.................... /* usb_kbhit(endpoint)
.................... /*
.................... /* Input: endpoint - endpoint to check (0..15)
.................... /*
.................... /* Output: TRUE if there is new data in RX buffer, FALSE if there is not.
.................... /*
.................... /* Summary: Similar to kbhit(), sees if there is new data in the RX USB buffers.
.................... /* See API section of USB.H for more information.
.................... /*
.................... /* The result will be invalid if the specified input has not been configured for
.................... /* use by the API with USB_EPx_RX_SIZE
.................... /*
.................... /*****************************************************************************/
.................... int1 usb_kbhit(int8 en);
....................
.................... /******************************************************************************
.................... /* usb_tbe(endpoint)
.................... /*
.................... /* Input: endpoint - endpoint to check
.................... /* ptr - where to save data to local PIC RAM
.................... /* max - max amount of data to receive from buffer
.................... /*
.................... /* Output: returns TRUE if this endpoint's IN buffer (PIC-PC) is empty and ready
.................... /* returns FALSE if this endpoint's IN buffer is still processing the last
.................... /* transmit or if this endpoint is invalid.
.................... /*
.................... /* The result will be invalid if the specified input has not been configured for
.................... /* use by the API with USB_EPx_TX_SIZE
.................... /*
.................... /*****************************************************************************/
.................... int1 usb_tbe(int8 en);
....................
.................... //////////////// END USER LEVEL FUNCTIONS /////////////////////////////////////
....................
....................
.................... ///
.................... /// BEGIN STACK LEVEL FUNCTIONS: These functions are meant to be called by
.................... /// the USB stack, and are not meant to be called by the
.................... /// user/application.
.................... ///
....................
.................... /*****************************************************************************
.................... /* usb_stall_ep()
.................... /*
.................... /* Input: endpoint - endpoint to stall.
.................... /* top most bit indicates direction (set is IN, clear is OUT)
.................... /*
.................... /* Summary: Stalls specified endpoint. If endpoint is stalled it will
.................... /* send STALL packet if the host tries to access this endpoint's
.................... /* buffer.
.................... /*
.................... /* NOTE: WE ASSUME ENDPOINT IS VALID. USB.C SHOULD CHECK IF VALID BEFORE
.................... /* CALLING THIS ROUTINE.
.................... /*
.................... /*****************************************************************************/
.................... void usb_stall_ep(int8 endpoint);
....................
....................
.................... /*****************************************************************************
.................... /* usb_unstall_ep(endpoint, direction)
.................... /*
.................... /* Input: endpoint - endpoint to un-stall.
.................... /* top most bit indicates direction (set is IN, clear is OUT)
.................... /*
.................... /* Summary: Un-stalls endpoint.
.................... /*
.................... /* NOTE: WE ASSUME ENDPOINT IS VALID. USB.C SHOULD CHECK IF VALID BEFORE
.................... /* CALLING THIS ROUTINE.
.................... /*
.................... /*****************************************************************************/
.................... void usb_unstall_ep(int8 endpoint);
....................
.................... /*****************************************************************************
.................... /* usb_endpoint_stalled()
.................... /*
.................... /* Input: endpoint - endpoint to check
.................... /* top most bit indicates direction (set is IN, clear is OUT)
.................... /*
.................... /* Output: returns a TRUE if endpoint is stalled, FALSE if it is not.
.................... /*
.................... /* Summary: Looks to see if an endpoint is stalled, or not. Does not look to
.................... /* see if endpoint has been issued a STALL, just whether or not it is
.................... /* configured to STALL on the next packet. See Set_Feature and
.................... /* Clear_Feature Chapter 9 requests.
.................... /*
.................... /* NOTE: WE ASSUME ENDPOINT IS VALID. USB.C SHOULD CHECK IF VALID BEFORE
.................... /* CALLING THIS ROUTINE.
.................... /*
.................... /*****************************************************************************/
.................... int1 usb_endpoint_stalled(int8 endpoint);
....................
.................... /*****************************************************************************
.................... /* usb_set_address(address)
.................... /*
.................... /* Input: address - address the host specified that we use
.................... /*
.................... /* Summary: Configures the USB Peripheral for the specified device address.
.................... /* The host will now talk to use with the following address.
.................... /*
.................... /*****************************************************************************/
.................... void usb_set_address(int8 address);
....................
.................... /******************************************************************************
.................... /* usb_set_configured()
.................... /*
.................... /* Input: config - Configuration to use. 0 to uncofigure device.
.................... /*
.................... /* Summary: Configures or unconfigures device. If configuring device it will
.................... /* enable all the endpoints the user specified for this configuration.
.................... /* If un-configuring device it will disable all endpoints.
.................... /*
.................... /* NOTE: CCS only provides code to handle 1 configuration.
.................... /*
.................... /*****************************************************************************/
.................... void usb_set_configured(int8 config);
....................
.................... /******************************************************************************
.................... /* usb_disable_endpoints()
.................... /*
.................... /* Summary: Disables endpoints (all endpoints but 0)
.................... /*
.................... /*****************************************************************************/
.................... void usb_disable_endpoints(void);
....................
....................
.................... /*******************************************************************************
.................... /* usb_disable_endpoint()
.................... /*
.................... /* Input: Endpoint to disable (0..15)
.................... /*
.................... /* Summary: Disables specified endpoint
.................... /*
.................... /********************************************************************************/
.................... void usb_disable_endpoint(int8 en);
....................
.................... /**************************************************************
.................... /* usb_request_send_response(len)
.................... /* usb_request_get_data()
.................... /* usb_request_stall()
.................... /*
.................... /* Input: len - size of packet to send
.................... /*
.................... /* Summary: One of these 3 functions will be called by the USB stack after
.................... /* handling a SETUP packet.
.................... /*
.................... /* After we process a SETUP request, we have 1 of three responses:
.................... /* 1.) send a response IN packet
.................... /* 2.) wait for followup OUT packet(s) with data
.................... /* 3.) stall because we don't support that SETUP request
.................... /*
.................... /* If we are sending data, the array usb_ep0_tx_buffer[] will hold
.................... /* the response and the USB Request handler code will call
.................... /* usb_request_send_response() to let us know how big the packet is.
.................... /*
.................... /* If we are waiting for more data, usb_request_get_data() will
.................... /* be called by the USB request handler code to configure the EP0 OUT
.................... /* endpoint to be ready for more data
.................... /*
.................... /* If we don't support a request, usb_request_stall() will be called
.................... /* by the USB request handler code to stall the endpoint 0.
.................... /*
.................... /* The operation of these functions depends on how SETUP packets
.................... /* are handled in the hardware layer.
.................... /*
.................... /***************************************************************/
.................... void usb_request_send_response(unsigned int8 len);
.................... void usb_request_get_data(void);
.................... void usb_request_stall(void);
....................
....................
.................... #endif
....................
....................
.................... //////////////////////// EXTRA USER FUNCTIONS /////////////////////////////////
....................
.................... /**************************************************************
.................... /* usb_flush_in()
.................... /*
.................... /* Input: endpoint - which endpoint to mark for transfer
.................... /* len - length of data that is being tramsferred
.................... /* tgl - Data toggle synchronization for this packet
.................... /*
.................... /* Output: TRUE if success, FALSE if error (we don't control the endpoint)
.................... /*
.................... /* Summary: Marks the endpoint ready for transmission. You must
.................... /* have already loaded the endpoint buffer with data.
.................... /* (IN is PIC -> PC).
.................... /* This routine is useful if you want to setup an endpoint by
.................... /* writing to the buffer directly.
.................... /* This routine is not necessary if you use usb_put_packet().
.................... /***************************************************************/
.................... int1 usb_flush_in(int8 endpoint, int16 len, USB_DTS_BIT tgl);
....................
.................... /**************************************************************
.................... /* usb_flush_out()
.................... /*
.................... /* Input: endpoint - which endpoint to mark for release
.................... /* tgl - Data toggle synchronization to expect in the next packet
.................... /*
.................... /* Output: NONE
.................... /*
.................... /* Summary: Clears the previously received packet, and then marks this
.................... /* endpoint's receive buffer as ready for more data.
.................... /* (OUT is PC -> PIC). This routine is useful if you do not
.................... /* want to use usb_get_packet(), instead you want to handle with
.................... /* the endpoint buffer directly. Also see usb_rx_packet_size().
.................... /* This routine is not necessary if you use usb_get_packet().
.................... /***************************************************************/
.................... void usb_flush_out(int8 endpoint, USB_DTS_BIT tgl);
....................
.................... /**************************************************************
.................... /* usb_rx_packet_size()
.................... /*
.................... /* Input: endpoint - which endpoint to mark to check
.................... /*
.................... /* Output: Returns the number of bytes in the endpoint's receive buffer.
.................... /*
.................... /* Summary: Read the number of data stored in the receive buffer. When you
.................... /* have handled the data, use usb_flush_out() to clear the buffer. The
.................... /* result may be invalid if usb_kbhit() returns false for this endpoint.
.................... /* This routine is not necessary if you use usb_get_packet().
.................... /***************************************************************/
.................... int16 usb_rx_packet_size(int8 endpoint);
....................
.................... #ENDIF
....................
.................... #else
.................... #include <pic24_usb.h> //Microchip 18Fxx5x hardware layer for usb.c
.................... #endif
.................... #else
.................... #include <usbn960x.h>
.................... #endif
.................... #include <usb_desc_cdc.h> //USB Configuration and Device descriptors for this UBS device
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// usb_desc_cdc.h ////
.................... //// ////
.................... //// An example set of device / configuration descriptors for use with ////
.................... //// CCS's CDC Virtual COM Port driver (see usb_cdc.h) ////
.................... //// ////
.................... //// This file is part of CCS's PIC USB driver code. See USB.H ////
.................... //// for more documentation and a list of examples. ////
.................... //// ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// ////
.................... //// Version History: ////
.................... //// ////
.................... //// March 5th, 2009: ////
.................... //// Cleanup for Wizard. ////
.................... //// PIC24 Initial release. ////
.................... //// ////
.................... //// 10/28/05: ////
.................... //// Bulk endpoint sizes updated to allow more than 255 byte ////
.................... //// packets. ////
.................... //// Changed device to USB 1.10 ////
.................... //// ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996,2005 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS ////
.................... //// C compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, ////
.................... //// reproduction or distribution is permitted without written ////
.................... //// permission. Derivative programs created using this software ////
.................... //// in object code form are not restricted in any way. ////
.................... ///////////////////////////////////////////////////////////////////////////
....................
.................... #IFNDEF __USB_DESCRIPTORS__
.................... #DEFINE __USB_DESCRIPTORS__
....................
.................... ///////// config options, although it's best to leave alone for this demo /////
.................... #define USB_CONFIG_PID 0x0033
.................... #define USB_CONFIG_VID 0x0461
.................... #define USB_CONFIG_BUS_POWER 100 //100mA (range is 0..500)
.................... #define USB_CONFIG_VERSION 0x0100 //01.00 //range is 00.00 to 99.99
.................... //////// end config ///////////////////////////////////////////////////////////
....................
.................... #DEFINE USB_HID_DEVICE FALSE
.................... #DEFINE USB_CDC_DEVICE TRUE
....................
.................... #define USB_CDC_COMM_IN_ENDPOINT 1
.................... #define USB_CDC_COMM_IN_SIZE 8
.................... #define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT
.................... #define USB_EP1_TX_SIZE USB_CDC_COMM_IN_SIZE
....................
.................... //pic to pc endpoint config
.................... #define USB_CDC_DATA_IN_ENDPOINT 2
.................... #define USB_CDC_DATA_IN_SIZE 64
.................... #define USB_EP2_TX_ENABLE USB_ENABLE_BULK
.................... #define USB_EP2_TX_SIZE USB_CDC_DATA_IN_SIZE
....................
.................... //pc to pic endpoint config
.................... #define USB_CDC_DATA_OUT_ENDPOINT 2
.................... #define USB_CDC_DATA_OUT_SIZE 64
.................... #define USB_EP2_RX_ENABLE USB_ENABLE_BULK
.................... #define USB_EP2_RX_SIZE USB_CDC_DATA_OUT_SIZE
....................
.................... #include <usb.h>
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// usb.h ////
.................... //// ////
.................... //// Function protypes, defintions and globals used by CCS USB driver ////
.................... //// ////
.................... //// This file is part of CCS's USB driver code ////
.................... //// ////
.................... //// The following USB examples are provided by CCS: ////
.................... //// ex_usb_mouse.c - A HID Mouse. ////
.................... //// ex_usb_hid.c - A custom application using HID protocol. ////
.................... //// ex_usb_kbmouse.c - A HID Mouse/Keyboard combo using multiple ////
.................... //// interfaces. ////
.................... //// ex_usb_kbmouse2.c - A HID Mouse/Keyboard combo using multiple ////
.................... //// HID Reports. ////
.................... //// ex_usb_scope.c - A digital oscilloscope using a custom ////
.................... //// protocol requiring custom Windows drivers. ////
.................... //// ex_usb_serial.c - ////
.................... //// ex_usb_serial2.c - Two examples of using the CDC driver for ////
.................... //// a virtual COM port. ////
.................... //// ex_usb_bootloader.c - CDC/Virtual COM port bootloader. ////
.................... //// ex_usb_loadmouse.c - A conversion of ex_usb_mouse.c that is ////
.................... //// compatible with ex_usb_mouse.c. ////
.................... //// ////
.................... //// ********************** API ********************* ////
.................... //// ////
.................... //// These are the functions that are meant to be called by the user: ////
.................... //// ////
.................... //// usb_init() - Initializes the USB stack, the USB peripheral and ////
.................... //// attaches the unit to the usb bus. Enables ////
.................... //// interrupts. Will wait in an infinite loop until ////
.................... //// the device enumerates - if you are using ////
.................... //// connection sense or if the processor should run ////
.................... //// even if it's not connected to USB then use ////
.................... //// usb_init_cs() instead. ////
.................... //// ////
.................... //// usb_init_cs() - A smaller usb_init(), does not attach unit ////
.................... //// to usb bus or enable interrupts. Since this does ////
.................... //// not attach to the USB, you must periodically call ////
.................... //// usb_task(). See usb_task() for more information. ////
.................... //// ////
.................... //// usb_task() - If usb_init_cs() was used to initiate the USB ////
.................... //// peripheral, usb_task() should then be called periodically ////
.................... //// to check the connection sense pin. If the connection ////
.................... //// sense pin denotes USB is connected and the USB peripheral ////
.................... //// is not attached, this will attach the USB peripheral ////
.................... //// so the PC can start the enumeration process (and it ////
.................... //// will enable interrupts). If the connection sense pin ////
.................... //// denotes USB is not attached and the USB peripheral is ////
.................... //// running, this will reset the USB peripheral and wait ////
.................... //// for USB to reconnect (and usb_enumerated() will start ////
.................... //// returning FALSE). If connection sense (USB_CON_SENSE_PIN) ////
.................... //// is not defined the usb_task() assumes that USB is always ////
.................... //// connected. ////
.................... //// ////
.................... //// usb_attached() - Returns TRUE if the device is attached to a ////
.................... //// USB cable. A macro that looks at the defined ////
.................... //// connection sense pin. If this returns TRUE ////
.................... //// it does not mean the PC has connected to it, ////
.................... //// you need to use usb_enumerated() to check this. ////
.................... //// ////
.................... //// usb_enumerated() - Returns TRUE if device has been enumerated ////
.................... //// (configured) by host, FALSE if it has not. ////
.................... //// Do not try to use the USB peripheral for ////
.................... //// sending and receiving packets until you ////
.................... //// are enumerated. ////
.................... //// ////
.................... //// usb_wait_for_enumeration() - Sits in an infinte loop until device ////
.................... //// is enumerated. ////
.................... //// ////
.................... //// usb_tbe(endpoint) - Returns TRUE if the endpoint transmit buffer ////
.................... //// is free and ready to accept a new packet for transmission. ////
.................... //// ////
.................... //// usb_put_packet(endpoint, ptr, len, tgl) - Sends one packet to the ////
.................... //// host. If you need to send a message that ////
.................... //// spans more than one packet then use ////
.................... //// usb_puts(). Fore more detailed documentation ////
.................... //// see usb_hw_layer.h ////
.................... //// ////
.................... //// usb_puts(endpoint, ptr, len, timeout) - Sends a multiple packet ////
.................... //// message to the host. If you only need to send one packet, ////
.................... //// it is more effecient to use usb_put_packet(). This is ////
.................... //// documented in more detail above the prototype in USB.H. ////
.................... //// ////
.................... //// usb_kbhit(endpoint) - Returns true if OUT endpoint contains data ////
.................... //// from host. This will remain TRUE until ////
.................... //// usb_put_packet() or usb_flush_out() used. ////
.................... //// This function will return an invalid response ////
.................... //// if specified endpoint is not enabled for ////
.................... //// receiving data. ////
.................... //// ////
.................... //// len = usb_get_packet(endpoint, ptr, max) - Gets one packet that ////
.................... //// from the host/PC. usb_kbhit() must return TRUE before you ////
.................... //// call this routine or your data may not be valid. This ////
.................... //// only receives one packet, if you are trying to receive a ////
.................... //// multi-packet message use usb_gets(). For more detailed ////
.................... //// documentation see usb_hw_layer.h. ////
.................... //// ////
.................... //// len = usb_gets(endpoint, ptr, max, timeout) - Gets multiple ////
.................... //// packets from the host, you would use this instead ////
.................... //// of usb_get_packet() if you wanted to handle multi-packet ////
.................... //// messages. This is documented in more detail above the ////
.................... //// prototype in USB.H. ////
.................... //// ////
.................... //// ////
.................... //// ********* DEFINITIONS / CONFIGURATION ********** ////
.................... //// ////
.................... //// The following definitions are declared here, but can be ////
.................... //// overwritten in your code. Unless needed otherwise, leave ////
.................... //// to default value. If confused about a definition read the ////
.................... //// comments at each defintion ////
.................... //// ////
.................... //// USB_HID_IDLE (TRUE) - Set to TRUE if your device supports ////
.................... //// Set_Idle HID class request. Set to ////
.................... //// False if you do not (device will ////
.................... //// send a Wrong-state if computer ////
.................... //// sends a Set_Idle / Get_Idle command) ////
.................... //// NOTE: If you set to TRUE you must ////
.................... //// provide your own code. See ////
.................... //// usb_isr_tkn_setup_ClassInterface() in ////
.................... //// usb.c ////
.................... //// ////
.................... //// USB_HID_BOOT_PROTOCOL (FALSE) - Set to TRUE if your device supports ////
.................... //// Set_Protocl HID class request. Set to ////
.................... //// False if you do not (device will ////
.................... //// send a Wrong-state if computer ////
.................... //// sends a Set_Protocl / Get_Protocol ////
.................... //// command). ////
.................... //// NOTE: If you set to TRUE you must ////
.................... //// provide your own code in the ////
.................... //// application that properly send boot ////
.................... //// or HID packets. ////
.................... //// ////
.................... //// USB_MAX_EP0_PACKET_LENGTH (8) - Max Packet size for Endpoint 0. ////
.................... //// The hardware level driver (ex ////
.................... //// pic18_usb.h will define this value if ////
.................... //// not already overwritten). Increasing ////
.................... //// this size will speed up the ////
.................... //// enumeration process. ////
.................... //// ////
.................... //// USB_EPx_RX_ENABLE (USB_ENABLE_DISABLED) - Where x is the ////
.................... //// endpoint number. Change this define ////
.................... //// to specify what kind of transfer method ////
.................... //// this RX (PC to device) endpoint uses. ////
.................... //// Here is the list of valid transfer methods: ////
.................... //// USB_ENABLE_CONTROL ////
.................... //// USB_ENABLE_ISOCHRONOUS ////
.................... //// USB_ENABLE_BULK ////
.................... //// USB_ENABLE_INTERRUPT ////
.................... //// USB_ENABLE_DISABLED ////
.................... //// Don't forget that you must specify the ////
.................... //// transfer method properly in your endpoint ////
.................... //// descriptor, too. ////
.................... //// ////
.................... //// USB_EPx_RX_SIZE (0) - For some hardware it is important to know ////
.................... //// how much memory to reserve for receiving ////
.................... //// packets. ////
.................... //// ////
.................... //// *** NOTE *** You must have both USB_EPx_RX_ENABLE defined and ////
.................... //// USB_EPx_RX_SIZE defined (non 0) to enable a RX ////
.................... //// endpoint. ////
.................... //// *** NOTE *** Endpoint 0 is always enabled. ////
.................... //// ////
.................... //// USB_EPx_TX_ENABLE (USB_ENABLE_DISABLED) - Where x is the ////
.................... //// endpoint number. Change this define ////
.................... //// to specify what kind of transfer method ////
.................... //// this TX (device to PC) endpoint uses. ////
.................... //// Here is the list of valid transfer methods: ////
.................... //// USB_ENABLE_CONTROL ////
.................... //// USB_ENABLE_ISOCHRONOUS ////
.................... //// USB_ENABLE_BULK ////
.................... //// USB_ENABLE_INTERRUPT ////
.................... //// USB_ENABLE_DISABLED ////
.................... //// Don't forget that you must specify the ////
.................... //// transfer method properly in your endpoint ////
.................... //// descriptor, too. ////
.................... //// ////
.................... //// USB_EPx_TX_SIZE (0) - For some hardware it is important to know ////
.................... //// how much memory to reserve for transmitting ////
.................... //// packets. ////
.................... //// ////
.................... //// *** NOTE *** You must have both USB_EPx_TX_ENABLE defined and ////
.................... //// USB_EPx_TX_SIZE defined (non 0) to enable a TX ////
.................... //// endpoint. ////
.................... //// ////
.................... //// ////
.................... //// USB_HID_DEVICE (TRUE) - HID devices require extra code to handle ////
.................... //// HID requests. You can disable to save ////
.................... //// ROM space if you are not using a HID ////
.................... //// device. If you are not using a HID ////
.................... //// device you must provide your own O/S ////
.................... //// (Windows) driver. ////
.................... //// ////
.................... //// The other definitions should not be changed. ////
.................... //// ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// ////
.................... //// Version History: ////
.................... //// ////
.................... //// March 5th, 2009: ////
.................... //// Cleanup for Wizard. ////
.................... //// PIC24 Initial release. ////
.................... //// ////
.................... //// July 13th, 2005: ////
.................... //// usb_ep_tx_size[] and usb_ep_rx_size[] changed to 16bits ////
.................... //// ////
.................... //// June 20th, 2005: ////
.................... //// Initial 18fxx5x release ////
.................... //// ////
.................... //// May 13th, 2005: ////
.................... //// Beta release, only works with 18Fxx5x hardware layer. ////
.................... //// Now supports multiple interfaces (many defines in descriptors ////
.................... //// will have to be changed, see examples) ////
.................... //// ////
.................... //// Mar 21st, 2005: ////
.................... //// Initial Alpha Release with PIC18Fxx5x support. (ONLY TESTED ////
.................... //// WITH 18F4550) ////
.................... //// usb_gets() and usb_puts() changed (see usb.c) ////
.................... //// ////
.................... //// June 24th, 2004: ////
.................... //// Optimization and cleanup. ////
.................... //// The following definitions changed: ////
.................... //// USB_EPx_TX_ENABLE and USB_EPx_RX_ENABLE have changed. See usb.h ////
.................... //// USB_CONFIG_DESCRIPTORS[] removed ////
.................... //// USB_CONFIG_DESC_LEN changed to USB_DESC_CONFIG_LEN ////
.................... //// USB_INTERFACE_DESC_LEN changed to USB_DESC_INTERFACE_LEN ////
.................... //// USB_CLASS_DESC_LEN changed to USB_DESC_CLASS_LEN ////
.................... //// USB_ENDPOINT_DESC_LEN changed to USB_DESC_ENDPOINT_LEN ////
.................... //// USB_CONFIG_DESC_KEY changed to USB_DESC_CONFIG_TYPE ////
.................... //// USB_INTERFACE_DESC_KEY changed to USB_DESC_INTERFACE_TYPE ////
.................... //// USB_CLASS_DESC_KEY changed to USB_DESC_CLASS_TYPE ////
.................... //// USB_ENDPOINT_DESC_KEY changed to USB_DESC_ENDPOINT_TYPE ////
.................... //// USB_STRING_X[] arrays removed, see USB_STRING_DESC[] and ////
.................... //// USB_STRING_DESC_OFFSET[] ////
.................... //// dev_req, curr_config, status_device and getdesc_type global ////
.................... //// variables moved into struct USB_stack_status ////
.................... //// ////
.................... //// October 15th, 2003: Support for boot protocol added. ////
.................... //// Set USB_HID_BOOT_PROTOCOL to TRUE to support this. ////
.................... //// The array hid_protocol[] saves which protocol mode each ////
.................... //// interface is in. It is your applications job to send ////
.................... //// data that either fit the boot protocol or HID protocol. ////
.................... //// ////
.................... //// May 6th, 2003: Fixed a potential stack overflow using PCM ////
.................... //// ////
.................... //// October 29th, 2002: New definition added to USB_STATES ////
.................... //// ////
.................... //// August 2nd, 2002: Initial Public Release ////
.................... //// ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996,2009 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS ////
.................... //// C compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, ////
.................... //// reproduction or distribution is permitted without written ////
.................... //// permission. Derivative programs created using this software ////
.................... //// in object code form are not restricted in any way. ////
.................... ///////////////////////////////////////////////////////////////////////////
....................
.................... #IFNDEF __USB_PROTOTYPES__
.................... #DEFINE __USB_PROTOTYPES__
....................
.................... //// CONFIGURATION ////////////////////////////////////////////////////////////
....................
.................... #ifndef USB_CON_SENSE_PIN
.................... #define USB_CON_SENSE_PIN 0
.................... #endif
....................
.................... #IFNDEF USB_HID_BOOT_PROTOCOL
.................... #DEFINE USB_HID_BOOT_PROTOCOL FALSE
.................... #ENDIF
....................
.................... #IFNDEF USB_HID_IDLE
.................... #DEFINE USB_HID_IDLE FALSE
.................... #ENDIF
....................
.................... //should the compiler add the extra HID handler code? Defaults to yes.
.................... #IFNDEF USB_HID_DEVICE
.................... #DEFINE USB_HID_DEVICE TRUE
.................... #ENDIF
....................
.................... #IFNDEF USB_CDC_DEVICE
.................... #DEFINE USB_CDC_DEVICE FALSE
.................... #ENDIF
....................
.................... //set to false to opt for less RAM, true to opt for less ROM
.................... #ifndef USB_OPT_FOR_ROM
.................... #define USB_OPT_FOR_ROM TRUE
.................... #endif
....................
.................... #IFNDEF USB_MAX_EP0_PACKET_LENGTH
.................... #DEFINE USB_MAX_EP0_PACKET_LENGTH 8
.................... #ENDIF
....................
....................
.................... ////// USER-LEVEL API /////////////////////////////////////////////////////////
....................
.................... /**************************************************************
.................... /* usb_enumerated()
.................... /*
.................... /* Input: Global variable USB_Curr_Config
.................... /* Returns: Returns a 1 if device is configured / enumerated,
.................... /* Returns a 0 if device is un-configured / not enumerated.
.................... /*
.................... /* Summary: See API section of USB.H for more documentation.
.................... /***************************************************************/
.................... int1 usb_enumerated(void);
....................
.................... /**************************************************************
.................... /* usb_wait_for_enumeration()
.................... /*
.................... /* Input: Global variable USB_Curr_Config
.................... /*
.................... /* Summary: Waits in-definately until device is configured / enumerated.
.................... /* See API section of USB.H for more information.
.................... /***************************************************************/
.................... void usb_wait_for_enumeration(void);
....................
.................... /****************************************************************************
.................... /* usb_gets(endpoint, ptr, max, timeout)
.................... /*
.................... /* Input: endpoint - endpoint to get data from
.................... /* ptr - place / array to store data to
.................... /* max - max amount of data to get from USB and store into ptr
.................... /* timeout - time in milliseconds, for each packet, to wait before
.................... /* timeout. set to 0 for no timeout.
.................... /*
.................... /* Output: Amount of data returned. It may be less than max.
.................... /*
.................... /* Summary: Gets data from the host. Will get multiple-packet messages
.................... /* and finish when either it receives a 0-len packet or a packet
.................... /* of less size than maximum.
.................... /*
.................... /*****************************************************************************/
.................... unsigned int16 usb_gets(int8 endpoint, int8 * ptr, unsigned int16 max, unsigned int16 timeout);
....................
.................... /****************************************************************************
.................... /* usb_puts()
.................... /*
.................... /* Inputs: endpoint - endpoint to send data out
.................... /* ptr - points to array of data to send
.................... /* len - amount of data to send
.................... /* timeout - time in milli-seconds, for each packet, to wait before
.................... /* timeout. set to 0 for no timeout.
.................... /*
.................... /* Outputs: Returns TRUE if message sent succesfully, FALSE if it was not
.................... /* sent before timeout period expired.
.................... /*
.................... /* Summary: Used for sending multiple packets of data as one message. This
.................... /* function can still be used to send messages consiting of only one
.................... /* packet. See usb_put_packet() documentation for the rules about when
.................... /* multiple packet messages or 0-lenght packets are needed.
.................... /*
.................... /*****************************************************************************/
.................... int1 usb_puts(int8 endpoint, int8 * ptr, unsigned int16 len, unsigned int8 timeout);
....................
.................... /******************************************************************************
.................... /* usb_attached()
.................... /*
.................... /* Summary: Returns TRUE if the device is attached to a USB cable.
.................... /* See the API section of USB.H for more documentation.
.................... /*
.................... /*****************************************************************************/
.................... #if USB_CON_SENSE_PIN
.................... #define usb_attached() input(USB_CON_SENSE_PIN)
.................... #else
.................... #define usb_attached() TRUE
.................... #endif
....................
.................... ////// END USER-LEVEL API /////////////////////////////////////////////////////
....................
....................
.................... ////// STACK-LEVEL API USED BY HW DRIVERS ////////////////////////////////////
....................
.................... enum USB_STATES {GET_DESCRIPTOR=1,SET_ADDRESS=2,NONE=0};
....................
.................... enum USB_GETDESC_TYPES {USB_GETDESC_CONFIG_TYPE=0,USB_GETDESC_HIDREPORT_TYPE=1,USB_GETDESC_STRING_TYPE=2,USB_GETDESC_DEVICE_TYPE=3};
....................
.................... #if USB_OPT_FOR_ROM
.................... typedef struct {
.................... USB_STATES dev_req; //what did the last setup token set us up to do?. init at none
.................... int curr_config; //our current config. start at none/powered (NOT THAT THIS LIMITS US TO 3 CONFIGURATIONS)
.................... int status_device; //Holds our state for Set_Feature and Clear_Feature
.................... USB_GETDESC_TYPES getdesc_type; //which get_descriptor() we are handling
.................... } TYPE_USB_STACK_STATUS;
.................... #else
.................... typedef struct {
.................... USB_STATES dev_req:2; //what did the last setup token set us up to do?. init at none
.................... int Curr_config:2; //our current config. start at none/powered (NOT THAT THIS LIMITS US TO 3 CONFIGURATIONS)
.................... int status_device:2; //Holds our state for Set_Feature and Clear_Feature
.................... USB_GETDESC_TYPES getdesc_type:2; //which get_descriptor() we are handling
.................... } TYPE_USB_STACK_STATUS;
.................... #endif
....................
.................... extern TYPE_USB_STACK_STATUS USB_stack_status;
....................
.................... /**************************************************************
.................... /* usb_token_reset()
.................... /*
.................... /* Output: No output (but many global registers are modified)
.................... /*
.................... /* Summary: Resets the token handler to initial (unconfigured) state.
.................... /***************************************************************/
.................... void usb_token_reset(void);
....................
.................... /**************************************************************
.................... /* usb_isr_tok_setup_dne()
.................... /*
.................... /* Input: usb_ep0_rx_buffer[] contains the the setup packet.
.................... /*
.................... /* Output: None (many globals are changed)
.................... /*
.................... /* Summary: This function is that handles the setup token.
.................... /* We must handle all relevant requests, such as Set_Configuration,
.................... /* Get_Descriptor, etc.
.................... /*
.................... /* usb_ep0_rx_buffer[] contains setup data packet, which has the
.................... /* following records:
.................... /* -------------------------------------------------------------------------------------------
.................... /* usb_ep0_rx_buffer[ 0 ]=bmRequestType; Where the setup packet goes
.................... /* bit7 (0) host-to-device
.................... /* (1) device-to-host
.................... /* bit6-5 (00) usb standard request;
.................... /* (01) class request;
.................... /* (10) vendor request
.................... /* (11) reserved
.................... /* bit4-0 (0000) device
.................... /* (0001) interface
.................... /* (0010) endpoint
.................... /* (0011) other element
.................... /* (0100) to (1111) reserved
.................... /* usb_ep0_rx_buffer[ 1 ]=bRequest ; the request
.................... /* usb_ep0_rx_buffer[2,3]=wValue ; a value which corresponds to request
.................... /* usb_ep0_rx_buffer[4,5]=wIndex ; could correspond to interface or endpoint...
.................... /* usb_ep0_rx_buffer[6,7]=wLength ; number of bytes in next data packet;
.................... /* for host-to-device, this exactly how many bytes in data packet.
.................... /* for device-to-host, this is the maximum bytes that can fit one packet.
.................... /***************************************************************/
.................... void usb_isr_tok_setup_dne(void);
....................
.................... /**************************************************************
.................... /* usb_isr_tok_out_dne()
.................... /*
.................... /* Input: endpoint contains which endpoint we are receiving data (0..15)
.................... /*
.................... /* Summary: Processes out tokens (out is respective of the host, so actualy
.................... /* incoming to the pic), but not out setup tokens. Normally when
.................... /* data is received it is left in the buffer (user would use
.................... /* usb_kbhit() and usb_get_packet() to receive data), but certain
.................... /* libraries (like CDC) have to answer setup packets.
.................... /*
.................... /***************************************************************/
.................... void usb_isr_tok_out_dne(int8 endpoint);
....................
.................... /**************************************************************
.................... /* usb_isr_tok_in_dne(endpoint)
.................... /*
.................... /* Input: endpoint - which endpoint we are processing a setup token.
.................... /*
.................... /* Summary: This handles an IN packet (HOST <- PIC). For endpoint 0, this
.................... /* is usually to setup a response packet to a setup packet. Endpoints 1..15
.................... /* are generally ignored, and the user has to use usb_tbe() to determine if
.................... /* if the buffer is ready for a new transmit packet (there are special cases,
.................... /* like CDC which handles the CDC protocl).
.................... /*
.................... /***************************************************************/
.................... void usb_isr_tok_in_dne(int8 endpoint);
....................
.................... ////// END STACK-LEVEL API USED BY HW DRIVERS /////////////////////////////////
....................
....................
.................... //CCS only supports one configuration at this time
.................... #DEFINE USB_NUM_CONFIGURATIONS 1 //DO NOT CHANGE
....................
.................... //PID values for tokens (see page 48 of USB Complete ed.1)
.................... #define PID_IN 0x09 //device to host transactions
.................... #define PID_OUT 0x01 //host to device transactions
.................... #define PID_SETUP 0x0D //host to device setup transaction
.................... #define PID_ACK 0x02 //receiver accepts error-free data packet
.................... #define PID_DATA0 0x03 //data packet with even sync bit
.................... #define PID_SOF 0x05 //start of framer marker and frame number
.................... #define PID_NAK 0x0A //receiver can't accept data or sender cant send data or has no data to transmit
.................... #define PID_DATA1 0x0B //data packet with odd sync bit
.................... #define PID_PRE 0x0C //preamble issued by host. enables downstream traffic to low-speed device
.................... #define PID_STALL 0x0E //a control request isnt supported or the endpoint is halted
....................
.................... //Key which identifies descritpors
.................... #DEFINE USB_DESC_DEVICE_TYPE 0x01 //#DEFINE USB_DEVICE_DESC_KEY 0x01
.................... #DEFINE USB_DESC_CONFIG_TYPE 0x02 //#DEFINE USB_CONFIG_DESC_KEY 0x02
.................... #DEFINE USB_DESC_STRING_TYPE 0x03 //#DEFINE USB_STRING_DESC_KEY 0x03
.................... #DEFINE USB_DESC_INTERFACE_TYPE 0x04 //#DEFINE USB_INTERFACE_DESC_KEY 0x04
.................... #DEFINE USB_DESC_ENDPOINT_TYPE 0x05 //#DEFINE USB_ENDPOINT_DESC_KEY 0x05
.................... #DEFINE USB_DESC_CLASS_TYPE 0x21 //#DEFINE USB_CLASS_DESC_KEY 0x21
.................... #DEFINE USB_DESC_HIDREPORT_TYPE 0x22
....................
.................... //The length of each descriptor
.................... #DEFINE USB_DESC_DEVICE_LEN 18 //#DEFINE USB_DEVICE_DESC_LEN 18
.................... #DEFINE USB_DESC_CONFIG_LEN 9 //#DEFINE USB_CONFIG_DESC_LEN 9
.................... #DEFINE USB_DESC_INTERFACE_LEN 9 //#DEFINE USB_INTERFACE_DESC_LEN 9
.................... #DEFINE USB_DESC_CLASS_LEN 9 //#DEFINE USB_CLASS_DESC_LEN 9
.................... #DEFINE USB_DESC_ENDPOINT_LEN 7 //#DEFINE USB_ENDPOINT_DESC_LEN 7
....................
.................... //Standard USB Setup bRequest Codes
.................... #define USB_STANDARD_REQUEST_GET_STATUS 0x00
.................... #define USB_STANDARD_REQUEST_CLEAR_FEATURE 0x01
.................... #define USB_STANDARD_REQUEST_SET_FEATURE 0x03
.................... #define USB_STANDARD_REQUEST_SET_ADDRESS 0x05
.................... #define USB_STANDARD_REQUEST_GET_DESCRIPTOR 0x06
.................... #define USB_STANDARD_REQUEST_SET_DESCRIPTOR 0x07
.................... #define USB_STANDARD_REQUEST_GET_CONFIGURATION 0x08
.................... #define USB_STANDARD_REQUEST_SET_CONFIGURATION 0x09
.................... #define USB_STANDARD_REQUEST_GET_INTERFACE 0x0A
.................... #define USB_STANDARD_REQUEST_SET_INTERFACE 0x0B
.................... #define USB_STANDARD_REQUEST_SYNCH_FRAME 0x0C
....................
.................... //HID Class Setup bRequest Codes
.................... #define USB_HID_REQUEST_GET_REPORT 0x01
.................... #define USB_HID_REQUEST_GET_IDLE 0x02
.................... #define USB_HID_REQUEST_GET_PROTOCOL 0x03
.................... #define USB_HID_REQUEST_SET_REPORT 0x09
.................... #define USB_HID_REQUEST_SET_IDLE 0x0A
.................... #define USB_HID_REQUEST_SET_PROTOCOL 0x0B
....................
.................... //types of endpoints as defined in the descriptor
.................... #define USB_ENDPOINT_TYPE_CONTROL 0x00
.................... #define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
.................... #define USB_ENDPOINT_TYPE_BULK 0x02
.................... #define USB_ENDPOINT_TYPE_INTERRUPT 0x03
....................
.................... //types of endpoints used internally in this api
.................... #define USB_ENABLE_DISABLED -1
.................... #define USB_ENABLE_BULK USB_ENDPOINT_TYPE_BULK
.................... #define USB_ENABLE_ISOCHRONOUS USB_ENDPOINT_TYPE_ISOCHRONOUS
.................... #define USB_ENABLE_INTERRUPT USB_ENDPOINT_TYPE_INTERRUPT
.................... #define USB_ENABLE_CONTROL USB_ENDPOINT_TYPE_CONTROL
....................
....................
.................... //*** ENABLE RX ENDPOINTS AND BUFFERS
....................
.................... //--------- endpoint 0 defines ----------
.................... #define USB_EP0_TX_ENABLE USB_ENABLE_CONTROL
.................... #define USB_EP0_RX_ENABLE USB_ENABLE_CONTROL
.................... #define USB_EP0_RX_SIZE USB_MAX_EP0_PACKET_LENGTH //endpoint 0 is setup, and should always be the MAX_PACKET_LENGTH. Slow speed specifies 8
.................... #define USB_EP0_TX_SIZE USB_MAX_EP0_PACKET_LENGTH //endpoint 0 is setup, and should always be the MAX_PACKET_LENGTH. Slow speed specifies 8
....................
.................... //--------- endpoint 1 defines ----------
.................... #ifndef USB_EP1_TX_ENABLE
.................... #define USB_EP1_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP1_RX_ENABLE
.................... #define USB_EP1_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP1_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP1_RX_SIZE
.................... #undef USB_EP1_RX_SIZE
.................... #endif
.................... #define USB_EP1_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP1_RX_SIZE
.................... #error You enabled EP1 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP1_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP1_TX_SIZE
.................... #undef USB_EP1_TX_SIZE
.................... #endif
.................... #define USB_EP1_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP1_TX_SIZE
.................... #error You enabled EP1 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 2 defines ----------
.................... #ifndef USB_EP2_TX_ENABLE
.................... #define USB_EP2_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP2_RX_ENABLE
.................... #define USB_EP2_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP2_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP2_RX_SIZE
.................... #undef USB_EP2_RX_SIZE
.................... #endif
.................... #define USB_EP2_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP2_RX_SIZE
.................... #error You enabled EP2 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP2_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP2_TX_SIZE
.................... #undef USB_EP2_TX_SIZE
.................... #endif
.................... #define USB_EP2_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP2_TX_SIZE
.................... #error You enabled EP2 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 3 defines ----------
.................... #ifndef USB_EP3_TX_ENABLE
.................... #define USB_EP3_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP3_RX_ENABLE
.................... #define USB_EP3_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP3_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP3_RX_SIZE
.................... #undef USB_EP3_RX_SIZE
.................... #endif
.................... #define USB_EP3_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP3_RX_SIZE
.................... #error You enabled EP3 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP3_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP3_TX_SIZE
.................... #undef USB_EP3_TX_SIZE
.................... #endif
.................... #define USB_EP3_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP3_TX_SIZE
.................... #error You enabled EP3 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 4 defines ----------
.................... #ifndef USB_EP4_TX_ENABLE
.................... #define USB_EP4_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP4_RX_ENABLE
.................... #define USB_EP4_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP4_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP4_RX_SIZE
.................... #undef USB_EP4_RX_SIZE
.................... #endif
.................... #define USB_EP4_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP4_RX_SIZE
.................... #error You enabled EP4 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP4_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP4_TX_SIZE
.................... #undef USB_EP4_TX_SIZE
.................... #endif
.................... #define USB_EP4_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP4_TX_SIZE
.................... #error You enabled EP4 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 5 defines ----------
.................... #ifndef USB_EP5_TX_ENABLE
.................... #define USB_EP5_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP5_RX_ENABLE
.................... #define USB_EP5_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP5_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP5_RX_SIZE
.................... #undef USB_EP5_RX_SIZE
.................... #endif
.................... #define USB_EP5_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP5_RX_SIZE
.................... #error You enabled EP5 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP5_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP5_TX_SIZE
.................... #undef USB_EP5_TX_SIZE
.................... #endif
.................... #define USB_EP5_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP5_TX_SIZE
.................... #error You enabled EP5 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 6 defines ----------
.................... #ifndef USB_EP6_TX_ENABLE
.................... #define USB_EP6_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP6_RX_ENABLE
.................... #define USB_EP6_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP6_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP6_RX_SIZE
.................... #undef USB_EP6_RX_SIZE
.................... #endif
.................... #define USB_EP6_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP6_RX_SIZE
.................... #error You enabled EP6 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP6_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP6_TX_SIZE
.................... #undef USB_EP6_TX_SIZE
.................... #endif
.................... #define USB_EP6_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP6_TX_SIZE
.................... #error You enabled EP6 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 7 defines ----------
.................... #ifndef USB_EP7_TX_ENABLE
.................... #define USB_EP7_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP7_RX_ENABLE
.................... #define USB_EP7_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP7_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP7_RX_SIZE
.................... #undef USB_EP7_RX_SIZE
.................... #endif
.................... #define USB_EP7_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP7_RX_SIZE
.................... #error You enabled EP7 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP7_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP7_TX_SIZE
.................... #undef USB_EP7_TX_SIZE
.................... #endif
.................... #define USB_EP7_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP7_TX_SIZE
.................... #error You enabled EP7 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 8 defines ----------
.................... #ifndef USB_EP8_TX_ENABLE
.................... #define USB_EP8_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP8_RX_ENABLE
.................... #define USB_EP8_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP8_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP8_RX_SIZE
.................... #undef USB_EP8_RX_SIZE
.................... #endif
.................... #define USB_EP8_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP8_RX_SIZE
.................... #error You enabled EP8 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP8_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP8_TX_SIZE
.................... #undef USB_EP8_TX_SIZE
.................... #endif
.................... #define USB_EP8_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP8_TX_SIZE
.................... #error You enabled EP8 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 9 defines ----------
.................... #ifndef USB_EP9_TX_ENABLE
.................... #define USB_EP9_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP9_RX_ENABLE
.................... #define USB_EP9_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP9_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP9_RX_SIZE
.................... #undef USB_EP9_RX_SIZE
.................... #endif
.................... #define USB_EP9_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP9_RX_SIZE
.................... #error You enabled EP9 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP9_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP9_TX_SIZE
.................... #undef USB_EP9_TX_SIZE
.................... #endif
.................... #define USB_EP9_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP9_TX_SIZE
.................... #error You enabled EP9 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 10 defines ----------
.................... #ifndef USB_EP10_TX_ENABLE
.................... #define USB_EP10_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP10_RX_ENABLE
.................... #define USB_EP10_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP10_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP10_RX_SIZE
.................... #undef USB_EP10_RX_SIZE
.................... #endif
.................... #define USB_EP10_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP10_RX_SIZE
.................... #error You enabled EP10 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP10_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP10_TX_SIZE
.................... #undef USB_EP10_TX_SIZE
.................... #endif
.................... #define USB_EP10_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP10_TX_SIZE
.................... #error You enabled EP10 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 11 defines ----------
.................... #ifndef USB_EP11_TX_ENABLE
.................... #define USB_EP11_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP11_RX_ENABLE
.................... #define USB_EP11_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP11_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP11_RX_SIZE
.................... #undef USB_EP11_RX_SIZE
.................... #endif
.................... #define USB_EP11_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP11_RX_SIZE
.................... #error You enabled EP11 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP11_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP11_TX_SIZE
.................... #undef USB_EP11_TX_SIZE
.................... #endif
.................... #define USB_EP11_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP11_TX_SIZE
.................... #error You enabled EP11 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 12 defines ----------
.................... #ifndef USB_EP12_TX_ENABLE
.................... #define USB_EP12_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP12_RX_ENABLE
.................... #define USB_EP12_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP12_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP12_RX_SIZE
.................... #undef USB_EP12_RX_SIZE
.................... #endif
.................... #define USB_EP12_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP12_RX_SIZE
.................... #error You enabled EP12 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP12_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP12_TX_SIZE
.................... #undef USB_EP12_TX_SIZE
.................... #endif
.................... #define USB_EP12_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP12_TX_SIZE
.................... #error You enabled EP12 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 13 defines ----------
.................... #ifndef USB_EP13_TX_ENABLE
.................... #define USB_EP13_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP13_RX_ENABLE
.................... #define USB_EP13_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP13_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP13_RX_SIZE
.................... #undef USB_EP13_RX_SIZE
.................... #endif
.................... #define USB_EP13_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP13_RX_SIZE
.................... #error You enabled EP13 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP13_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP13_TX_SIZE
.................... #undef USB_EP13_TX_SIZE
.................... #endif
.................... #define USB_EP13_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP13_TX_SIZE
.................... #error You enabled EP13 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 14 defines ----------
.................... #ifndef USB_EP14_TX_ENABLE
.................... #define USB_EP14_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP14_RX_ENABLE
.................... #define USB_EP14_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP14_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP14_RX_SIZE
.................... #undef USB_EP14_RX_SIZE
.................... #endif
.................... #define USB_EP14_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP14_RX_SIZE
.................... #error You enabled EP14 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP14_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP14_TX_SIZE
.................... #undef USB_EP14_TX_SIZE
.................... #endif
.................... #define USB_EP14_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP14_TX_SIZE
.................... #error You enabled EP14 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 15 defines ----------
.................... #ifndef USB_EP15_TX_ENABLE
.................... #define USB_EP15_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP15_RX_ENABLE
.................... #define USB_EP15_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP15_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP15_RX_SIZE
.................... #undef USB_EP15_RX_SIZE
.................... #endif
.................... #define USB_EP15_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP15_RX_SIZE
.................... #error You enabled EP15 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP15_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP15_TX_SIZE
.................... #undef USB_EP15_TX_SIZE
.................... #endif
.................... #define USB_EP15_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP15_TX_SIZE
.................... #error You enabled EP15 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... const int8 usb_ep_tx_type[16]={
.................... USB_EP0_TX_ENABLE, USB_EP1_TX_ENABLE, USB_EP2_TX_ENABLE,
.................... USB_EP3_TX_ENABLE, USB_EP4_TX_ENABLE, USB_EP5_TX_ENABLE,
.................... USB_EP6_TX_ENABLE, USB_EP7_TX_ENABLE, USB_EP8_TX_ENABLE,
.................... USB_EP9_TX_ENABLE, USB_EP10_TX_ENABLE, USB_EP11_TX_ENABLE,
.................... USB_EP12_TX_ENABLE, USB_EP13_TX_ENABLE, USB_EP14_TX_ENABLE,
.................... USB_EP15_TX_ENABLE
.................... };
....................
.................... const int8 usb_ep_rx_type[16]={
.................... USB_EP0_RX_ENABLE, USB_EP1_RX_ENABLE, USB_EP2_RX_ENABLE,
.................... USB_EP3_RX_ENABLE, USB_EP4_RX_ENABLE, USB_EP5_RX_ENABLE,
.................... USB_EP6_RX_ENABLE, USB_EP7_RX_ENABLE, USB_EP8_RX_ENABLE,
.................... USB_EP9_RX_ENABLE, USB_EP10_RX_ENABLE, USB_EP11_RX_ENABLE,
.................... USB_EP12_RX_ENABLE, USB_EP13_RX_ENABLE, USB_EP14_RX_ENABLE,
.................... USB_EP15_RX_ENABLE
.................... };
....................
.................... const unsigned int16 usb_ep_tx_size[16]={
.................... USB_EP0_TX_SIZE, USB_EP1_TX_SIZE, USB_EP2_TX_SIZE,
.................... USB_EP3_TX_SIZE, USB_EP4_TX_SIZE, USB_EP5_TX_SIZE,
.................... USB_EP6_TX_SIZE, USB_EP7_TX_SIZE, USB_EP8_TX_SIZE,
.................... USB_EP9_TX_SIZE, USB_EP10_TX_SIZE, USB_EP11_TX_SIZE,
.................... USB_EP12_TX_SIZE, USB_EP13_TX_SIZE, USB_EP14_TX_SIZE,
.................... USB_EP15_TX_SIZE
.................... };
....................
.................... const unsigned int16 usb_ep_rx_size[16]={
.................... USB_EP0_RX_SIZE, USB_EP1_RX_SIZE, USB_EP2_RX_SIZE,
.................... USB_EP3_RX_SIZE, USB_EP4_RX_SIZE, USB_EP5_RX_SIZE,
.................... USB_EP6_RX_SIZE, USB_EP7_RX_SIZE, USB_EP8_RX_SIZE,
.................... USB_EP9_RX_SIZE, USB_EP10_RX_SIZE, USB_EP11_RX_SIZE,
.................... USB_EP12_RX_SIZE, USB_EP13_RX_SIZE, USB_EP14_RX_SIZE,
.................... USB_EP15_RX_SIZE
.................... };
....................
.................... #ENDIF
....................
....................
.................... //////////////////////////////////////////////////////////////////
.................... ///
.................... /// start config descriptor
.................... /// right now we only support one configuration descriptor.
.................... /// the config, interface, class, and endpoint goes into this array.
.................... ///
.................... //////////////////////////////////////////////////////////////////
....................
.................... #DEFINE USB_TOTAL_CONFIG_LEN 67 //config+interface+class+endpoint+endpoint (2 endpoints)
....................
.................... const char USB_CONFIG_DESC[] = {
.................... //IN ORDER TO COMPLY WITH WINDOWS HOSTS, THE ORDER OF THIS ARRAY MUST BE:
.................... // config(s)
.................... // interface(s)
.................... // class(es)
.................... // endpoint(s)
....................
.................... //config_descriptor for config index 1
.................... USB_DESC_CONFIG_LEN, //length of descriptor size ==0
.................... USB_DESC_CONFIG_TYPE, //constant CONFIGURATION (CONFIGURATION 0x02) ==1
.................... USB_TOTAL_CONFIG_LEN,0, //size of all data returned for this config ==2,3
.................... 2, //number of interfaces this device supports ==4
.................... 0x01, //identifier for this configuration. (IF we had more than one configurations) ==5
.................... 0x00, //index of string descriptor for this configuration ==6
.................... #if USB_CONFIG_BUS_POWER
.................... 0x80, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1 ==7
.................... #else
.................... 0xC0, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1 ==7
.................... #endif
.................... USB_CONFIG_BUS_POWER/2, //maximum bus power required (maximum milliamperes/2) (0x32 = 100mA) ==8
....................
....................
.................... //interface descriptor 0 (comm class interface)
.................... USB_DESC_INTERFACE_LEN, //length of descriptor =9
.................... USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04) =10
.................... 0x00, //number defining this interface (IF we had more than one interface) ==11
.................... 0x00, //alternate setting ==12
.................... 1, //number of endpoints ==13
.................... 0x02, //class code, 02 = Comm Interface Class ==14
.................... 0x02, //subclass code, 2 = Abstract ==15
.................... 0x01, //protocol code, 1 = v.25ter ==16
.................... 0x00, //index of string descriptor for interface ==17
....................
.................... //class descriptor [functional header]
.................... 5, //length of descriptor ==18
.................... 0x24, //dscriptor type (0x24 == ) ==19
.................... 0, //sub type (0=functional header) ==20
.................... 0x10,0x01, // ==21,22 //cdc version
....................
.................... //class descriptor [acm header]
.................... 4, //length of descriptor ==23
.................... 0x24, //dscriptor type (0x24 == ) ==24
.................... 2, //sub type (2=ACM) ==25
.................... 2, //capabilities ==26 //we support Set_Line_Coding, Set_Control_Line_State, Get_Line_Coding, and the notification Serial_State.
....................
.................... //class descriptor [union header]
.................... 5, //length of descriptor ==27
.................... 0x24, //dscriptor type (0x24 == ) ==28
.................... 6, //sub type (6=union) ==29
.................... 0, //master intf ==30 //The interface number of the Communication or Dat a Cl ass interface, designated as the masteror controlling interface for the union.
.................... 1, //save intf0 ==31 //Interface number of first slave or associated interface in the union. *
....................
.................... //class descriptor [call mgmt header]
.................... 5, //length of descriptor ==32
.................... 0x24, //dscriptor type (0x24 == ) ==33
.................... 1, //sub type (1=call mgmt) ==34
.................... 0, //capabilities ==35 //device does not handle call management itself
.................... 1, //data interface ==36 //interface number of data class interface
....................
.................... //endpoint descriptor
.................... USB_DESC_ENDPOINT_LEN, //length of descriptor ==37
.................... USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05) ==38
.................... USB_CDC_COMM_IN_ENDPOINT | 0x80, //endpoint number and direction
.................... 0x03, //transfer type supported (0x03 is interrupt) ==40
.................... USB_CDC_COMM_IN_SIZE,0x00, //maximum packet size supported ==41,42
.................... 250, //polling interval, in ms. (interrupt endpoint cant be smaller than 10 for slow speed devices) ==43
....................
.................... //interface descriptor 1 (data class interface)
.................... USB_DESC_INTERFACE_LEN, //length of descriptor =44
.................... USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04) =45
.................... 0x01, //number defining this interface (IF we had more than one interface) ==46
.................... 0x00, //alternate setting ==47
.................... 2, //number of endpoints ==48
.................... 0x0A, //class code, 0A = Data Interface Class ==49
.................... 0x00, //subclass code ==50
.................... 0x00, //protocol code ==51
.................... 0x00, //index of string descriptor for interface ==52
....................
.................... //endpoint descriptor
.................... USB_DESC_ENDPOINT_LEN, //length of descriptor ==53
.................... USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05) ==54
.................... USB_CDC_DATA_OUT_ENDPOINT, //endpoint number and direction (0x02 = EP2 OUT) ==55
.................... 0x02, //transfer type supported (0x02 is bulk) ==56
.................... (USB_CDC_DATA_OUT_SIZE+1) & 0xFF, ((USB_CDC_DATA_OUT_SIZE+1) >> 8) & 0xFF, //maximum packet size supported ==57, 58
.................... 1, //polling interval, in ms. ==59
....................
.................... //endpoint descriptor
.................... USB_DESC_ENDPOINT_LEN, //length of descriptor ==60
.................... USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05) ==61
.................... USB_CDC_DATA_IN_ENDPOINT | 0x80, //endpoint number and direction (0x82 = EP2 IN) ==62
.................... 0x02, //transfer type supported (0x02 is bulk) ==63
.................... (USB_CDC_DATA_IN_SIZE+1) & 0xFF, ((USB_CDC_DATA_IN_SIZE+1) >> 8) & 0xFF, //maximum packet size supported ==66, 67
.................... 1, //polling interval, in ms. ==68
.................... };
....................
.................... //****** BEGIN CONFIG DESCRIPTOR LOOKUP TABLES ********
.................... //since we can't make pointers to constants in certain pic16s, this is an offset table to find
.................... // a specific descriptor in the above table.
....................
.................... //the maximum number of interfaces seen on any config
.................... //for example, if config 1 has 1 interface and config 2 has 2 interfaces you must define this as 2
.................... #define USB_MAX_NUM_INTERFACES 2
....................
.................... //define how many interfaces there are per config. [0] is the first config, etc.
.................... const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={2};
....................
.................... //define where to find class descriptors
.................... //first dimension is the config number
.................... //second dimension specifies which interface
.................... //last dimension specifies which class in this interface to get, but most will only have 1 class per interface
.................... //if a class descriptor is not valid, set the value to 0xFFFF
.................... const int8 USB_CLASS_DESCRIPTORS[USB_NUM_CONFIGURATIONS][USB_MAX_NUM_INTERFACES][4]=
.................... {
.................... //config 1
.................... //interface 0
.................... //class 1-4
.................... 18,23,27,32,
.................... //interface 1
.................... //no classes for this interface
.................... 0xFF,0xFF,0xFF,0xFF
.................... };
....................
.................... #if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)
.................... #error USB_TOTAL_CONFIG_LEN not defined correctly
.................... #endif
....................
....................
.................... //////////////////////////////////////////////////////////////////
.................... ///
.................... /// start device descriptors
.................... ///
.................... //////////////////////////////////////////////////////////////////
....................
.................... const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
.................... //starts of with device configuration. only one possible
.................... USB_DESC_DEVICE_LEN, //the length of this report ==0
.................... 0x01, //the constant DEVICE (DEVICE 0x01) ==1
.................... 0x10,0x01, //usb version in bcd ==2,3
.................... 0x02, //class code. 0x02=Communication Device Class ==4
.................... 0x00, //subclass code ==5
.................... 0x00, //protocol code ==6
.................... USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==7
.................... USB_CONFIG_VID & 0xFF, ((USB_CONFIG_VID >> 8) & 0xFF), //vendor id ==9, 10
.................... USB_CONFIG_PID & 0xFF, ((USB_CONFIG_PID >> 8) & 0xFF), //product id, don't use 0xffff ==11, 12
.................... USB_CONFIG_VERSION & 0xFF, ((USB_CONFIG_VERSION >> 8) & 0xFF), //device release number ==13,14
.................... 0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below) ==14
.................... 0x02, //index of string descriptor of the product ==15
.................... 0x00, //index of string descriptor of serial number ==16
.................... USB_NUM_CONFIGURATIONS //number of possible configurations ==17
.................... };
....................
....................
.................... //////////////////////////////////////////////////////////////////
.................... ///
.................... /// start string descriptors
.................... /// String 0 is a special language string, and must be defined. People in U.S.A. can leave this alone.
.................... ///
.................... /// You must define the length else get_next_string_character() will not see the string
.................... /// Current code only supports 10 strings (0 thru 9)
.................... ///
.................... //////////////////////////////////////////////////////////////////
....................
.................... #if !defined(USB_STRINGS_OVERWRITTEN)
.................... //the offset of the starting location of each string. offset[0] is the start of string 0, offset[1] is the start of string 1, etc.
.................... char USB_STRING_DESC_OFFSET[]={0,4,12};
....................
.................... // Here is where the "CCS" Manufacturer string and "SERIAL DEMO" are stored.
.................... // Strings are saved as unicode.
.................... // These strings are mostly only displayed during the add hardware wizard.
.................... // Once the operating system drivers have been installed it will usually display
.................... // the name from the drivers .INF.
.................... char const USB_STRING_DESC[]={
.................... //string 0
.................... 4, //length of string index
.................... USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
.................... 0x09,0x04, //Microsoft Defined for US-English
.................... //string 1 - manufacturer
.................... 8, //length of string index
.................... USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
.................... 'C',0,
.................... 'C',0,
.................... 'S',0,
.................... //string 2 - product
.................... 24, //length of string index
.................... USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
.................... 'S',0,
.................... 'E',0,
.................... 'R',0,
.................... 'I',0,
.................... 'A',0,
.................... 'L',0,
.................... ' ',0,
.................... 'D',0,
.................... 'E',0,
.................... 'M',0,
.................... 'O',0
.................... };
.................... #endif //!defined(USB_STRINGS_OVERWRITTEN)
....................
.................... #ENDIF
....................
.................... #include <usb.c> //handles usb setup tokens and get descriptor reports
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// usb.c ////
.................... //// ////
.................... //// Standard USB request and token handler code. ////
.................... //// ////
.................... //// This file is part of CCS's PIC USB driver code. See USB.H ////
.................... //// for more documentation and a list of examples. ////
.................... //// ////
.................... //// The majority of this code is called and used by the interrupt ////
.................... //// generated by the hardware level, and therefore it is not meant ////
.................... //// to be called by the user. The functions that are meant to be ////
.................... //// called by the user (init, put packet, get packet, etc) are ////
.................... //// documented in USB.H. ////
.................... //// ////
.................... //// ************************* NOTE ************************** ////
.................... //// This code will not create a multiple configuration device. ////
.................... //// If you wish to create a multiple configuration device then you ////
.................... //// will have to modify these drivers. ////
.................... //// ////
.................... //// ************************* NOTE ************************** ////
.................... //// This code does not support Get_Idle or Set_Idle HID-specific ////
.................... //// requests. These requests are optional. If you want to support ////
.................... //// these requests you must provide the code yourself. See ////
.................... //// usb_isr_tkn_setup_ClassInterface() if you wish to add this ////
.................... //// support. ////
.................... //// ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// ////
.................... //// If you wish to provide your own USB peripheral hardware layer, it ////
.................... //// must must provide the API as described in usb_hw_layer.h. ////
.................... //// ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// ////
.................... //// Version History: ////
.................... //// ////
.................... //// March 5th, 2009: ////
.................... //// Cleanup for Wizard. ////
.................... //// PIC24 Initial release. ////
.................... //// ////
.................... //// Dec 14, 2007: ////
.................... //// usb_kbhit() moved to device driver. ////
.................... //// ////
.................... //// July 13th, 2005: ////
.................... //// usb_puts() packet_size and this_packet_len changed to 16bits. ////
.................... //// usb_gets() len, packet_size and this_packet_len to 16bits. ////
.................... //// ////
.................... //// June 20th, 2005: ////
.................... //// Initial 18fxx5x release. ////
.................... //// usb_kbhit() removed, usb_kbhit() now implemented in hardware ////
.................... //// layer. ////
.................... //// ////
.................... //// May 13th, 2005: ////
.................... //// Beta release, only works with 18Fxx5x hardware layer. ////
.................... //// Now supports multiple interfaces (many defines in descriptors ////
.................... //// will have to be changed, see examples) ////
.................... //// TODO: alot of indexing and length handling for descriptors is ////
.................... //// only 8bit, so make sure all descriptor tables are less than ////
.................... //// 256 bytes long. ////
.................... //// ////
.................... //// Apr 21st, 2005: ////
.................... //// Initial Alpha Release with PIC18Fxx5x support. (ONLY TESTED ////
.................... //// WITH 18F4550) ////
.................... //// usb_puts() doesn't need max packet size as a paremeter, uses ////
.................... //// usb_ep_tx_size[] defined in usb.h ////
.................... //// usb_puts() timeout parameter now in ms, not seconds. ////
.................... //// USB Stack no longer buffers incoming data. If there is data to ////
.................... //// get usb_kbhit(en) will return TRUE and the data will sit in ////
.................... //// the endpoint buffer until you usb_get_packet(), which will ////
.................... //// then free the endpoint buffer for more data. This affects ////
.................... //// routines such as usb_gets() and usb_kbhit(). ////
.................... //// usb_gets() no longer reads buffered data (see above note), ////
.................... //// now it reads multiple packets in the same way usb_puts() ////
.................... //// writes multiple packets ////
.................... //// usb_kbhit() is hardware specific, so has been moved to hardware ////
.................... //// layer. ////
.................... //// ////
.................... //// Nov 11th, 2004: ////
.................... //// No longer includes wrong descriptor header. ////
.................... //// ////
.................... //// June 24th, 2004: ////
.................... //// Optimization and cleanup. ////
.................... //// The following definitions changed: ////
.................... //// USB_EPx_TX_ENABLE and USB_EPx_RX_ENABLE have changed. See usb.h ////
.................... //// USB_CONFIG_DESCRIPTORS[] removed ////
.................... //// USB_CONFIG_DESC_LEN changed to USB_DESC_CONFIG_LEN ////
.................... //// USB_INTERFACE_DESC_LEN changed to USB_DESC_INTERFACE_LEN ////
.................... //// USB_CLASS_DESC_LEN changed to USB_DESC_CLASS_LEN ////
.................... //// USB_ENDPOINT_DESC_LEN changed to USB_DESC_ENDPOINT_LEN ////
.................... //// USB_CONFIG_DESC_KEY changed to USB_DESC_CONFIG_TYPE ////
.................... //// USB_INTERFACE_DESC_KEY changed to USB_DESC_INTERFACE_TYPE ////
.................... //// USB_CLASS_DESC_KEY changed to USB_DESC_CLASS_TYPE ////
.................... //// USB_ENDPOINT_DESC_KEY changed to USB_DESC_ENDPOINT_TYPE ////
.................... //// USB_STRING_X[] arrays removed, see USB_STRING_DESC[] and ////
.................... //// USB_STRING_DESC_OFFSET[] ////
.................... //// dev_req, curr_config, status_device and getdesc_type global ////
.................... //// variables moved into struct USB_stack_status ////
.................... //// ////
.................... //// December 5th, 2003: Fixed a potential bug where descriptors are ////
.................... //// evenly dividable by 8 (MAX_EP0_PACKET_SIZE) ////
.................... //// ////
.................... //// October 15th, 2003: Support for boot protocol added. ////
.................... //// Set USB_HID_BOOT_PROTOCOL to TRUE to support this. ////
.................... //// The array hid_protocol[] saves which protocol mode each ////
.................... //// interface is in. It is your applications job to send ////
.................... //// data that either fit the boot protocol or HID protocol. ////
.................... //// ////
.................... //// May 6th, 2003: Fixed a potential stack overflow using PCM ////
.................... //// ////
.................... //// October 28th, 2002: Problem with usb_puts and timeout fixed. ////
.................... //// ////
.................... //// October 28th, 2002: Typo fixed in get_next_string_character(), ////
.................... //// although it didn't cause any serious problems ////
.................... //// ////
.................... //// October 25th, 2002: Another change to usb_puts() was made to fix ////
.................... //// problems with multiple packet messages ////
.................... //// October 29th, 2002: Fixed a problem with multiple packet string ////
.................... //// descriptors that require a 0 len packet to ////
.................... //// end message. ////
.................... //// ////
.................... //// October 23rd, 2002: usb_puts() will bomb out of error quicker ////
.................... //// ////
.................... //// August 2nd, 2002: Initial Public Release ////
.................... //// ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996,2005 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS ////
.................... //// C compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, ////
.................... //// reproduction or distribution is permitted without written ////
.................... //// permission. Derivative programs created using this software ////
.................... //// in object code form are not restricted in any way. ////
.................... ///////////////////////////////////////////////////////////////////////////
....................
.................... #IFNDEF __USB_DRIVER__
.................... #DEFINE __USB_DRIVER__
....................
.................... #include <usb.h>
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// usb.h ////
.................... //// ////
.................... //// Function protypes, defintions and globals used by CCS USB driver ////
.................... //// ////
.................... //// This file is part of CCS's USB driver code ////
.................... //// ////
.................... //// The following USB examples are provided by CCS: ////
.................... //// ex_usb_mouse.c - A HID Mouse. ////
.................... //// ex_usb_hid.c - A custom application using HID protocol. ////
.................... //// ex_usb_kbmouse.c - A HID Mouse/Keyboard combo using multiple ////
.................... //// interfaces. ////
.................... //// ex_usb_kbmouse2.c - A HID Mouse/Keyboard combo using multiple ////
.................... //// HID Reports. ////
.................... //// ex_usb_scope.c - A digital oscilloscope using a custom ////
.................... //// protocol requiring custom Windows drivers. ////
.................... //// ex_usb_serial.c - ////
.................... //// ex_usb_serial2.c - Two examples of using the CDC driver for ////
.................... //// a virtual COM port. ////
.................... //// ex_usb_bootloader.c - CDC/Virtual COM port bootloader. ////
.................... //// ex_usb_loadmouse.c - A conversion of ex_usb_mouse.c that is ////
.................... //// compatible with ex_usb_mouse.c. ////
.................... //// ////
.................... //// ********************** API ********************* ////
.................... //// ////
.................... //// These are the functions that are meant to be called by the user: ////
.................... //// ////
.................... //// usb_init() - Initializes the USB stack, the USB peripheral and ////
.................... //// attaches the unit to the usb bus. Enables ////
.................... //// interrupts. Will wait in an infinite loop until ////
.................... //// the device enumerates - if you are using ////
.................... //// connection sense or if the processor should run ////
.................... //// even if it's not connected to USB then use ////
.................... //// usb_init_cs() instead. ////
.................... //// ////
.................... //// usb_init_cs() - A smaller usb_init(), does not attach unit ////
.................... //// to usb bus or enable interrupts. Since this does ////
.................... //// not attach to the USB, you must periodically call ////
.................... //// usb_task(). See usb_task() for more information. ////
.................... //// ////
.................... //// usb_task() - If usb_init_cs() was used to initiate the USB ////
.................... //// peripheral, usb_task() should then be called periodically ////
.................... //// to check the connection sense pin. If the connection ////
.................... //// sense pin denotes USB is connected and the USB peripheral ////
.................... //// is not attached, this will attach the USB peripheral ////
.................... //// so the PC can start the enumeration process (and it ////
.................... //// will enable interrupts). If the connection sense pin ////
.................... //// denotes USB is not attached and the USB peripheral is ////
.................... //// running, this will reset the USB peripheral and wait ////
.................... //// for USB to reconnect (and usb_enumerated() will start ////
.................... //// returning FALSE). If connection sense (USB_CON_SENSE_PIN) ////
.................... //// is not defined the usb_task() assumes that USB is always ////
.................... //// connected. ////
.................... //// ////
.................... //// usb_attached() - Returns TRUE if the device is attached to a ////
.................... //// USB cable. A macro that looks at the defined ////
.................... //// connection sense pin. If this returns TRUE ////
.................... //// it does not mean the PC has connected to it, ////
.................... //// you need to use usb_enumerated() to check this. ////
.................... //// ////
.................... //// usb_enumerated() - Returns TRUE if device has been enumerated ////
.................... //// (configured) by host, FALSE if it has not. ////
.................... //// Do not try to use the USB peripheral for ////
.................... //// sending and receiving packets until you ////
.................... //// are enumerated. ////
.................... //// ////
.................... //// usb_wait_for_enumeration() - Sits in an infinte loop until device ////
.................... //// is enumerated. ////
.................... //// ////
.................... //// usb_tbe(endpoint) - Returns TRUE if the endpoint transmit buffer ////
.................... //// is free and ready to accept a new packet for transmission. ////
.................... //// ////
.................... //// usb_put_packet(endpoint, ptr, len, tgl) - Sends one packet to the ////
.................... //// host. If you need to send a message that ////
.................... //// spans more than one packet then use ////
.................... //// usb_puts(). Fore more detailed documentation ////
.................... //// see usb_hw_layer.h ////
.................... //// ////
.................... //// usb_puts(endpoint, ptr, len, timeout) - Sends a multiple packet ////
.................... //// message to the host. If you only need to send one packet, ////
.................... //// it is more effecient to use usb_put_packet(). This is ////
.................... //// documented in more detail above the prototype in USB.H. ////
.................... //// ////
.................... //// usb_kbhit(endpoint) - Returns true if OUT endpoint contains data ////
.................... //// from host. This will remain TRUE until ////
.................... //// usb_put_packet() or usb_flush_out() used. ////
.................... //// This function will return an invalid response ////
.................... //// if specified endpoint is not enabled for ////
.................... //// receiving data. ////
.................... //// ////
.................... //// len = usb_get_packet(endpoint, ptr, max) - Gets one packet that ////
.................... //// from the host/PC. usb_kbhit() must return TRUE before you ////
.................... //// call this routine or your data may not be valid. This ////
.................... //// only receives one packet, if you are trying to receive a ////
.................... //// multi-packet message use usb_gets(). For more detailed ////
.................... //// documentation see usb_hw_layer.h. ////
.................... //// ////
.................... //// len = usb_gets(endpoint, ptr, max, timeout) - Gets multiple ////
.................... //// packets from the host, you would use this instead ////
.................... //// of usb_get_packet() if you wanted to handle multi-packet ////
.................... //// messages. This is documented in more detail above the ////
.................... //// prototype in USB.H. ////
.................... //// ////
.................... //// ////
.................... //// ********* DEFINITIONS / CONFIGURATION ********** ////
.................... //// ////
.................... //// The following definitions are declared here, but can be ////
.................... //// overwritten in your code. Unless needed otherwise, leave ////
.................... //// to default value. If confused about a definition read the ////
.................... //// comments at each defintion ////
.................... //// ////
.................... //// USB_HID_IDLE (TRUE) - Set to TRUE if your device supports ////
.................... //// Set_Idle HID class request. Set to ////
.................... //// False if you do not (device will ////
.................... //// send a Wrong-state if computer ////
.................... //// sends a Set_Idle / Get_Idle command) ////
.................... //// NOTE: If you set to TRUE you must ////
.................... //// provide your own code. See ////
.................... //// usb_isr_tkn_setup_ClassInterface() in ////
.................... //// usb.c ////
.................... //// ////
.................... //// USB_HID_BOOT_PROTOCOL (FALSE) - Set to TRUE if your device supports ////
.................... //// Set_Protocl HID class request. Set to ////
.................... //// False if you do not (device will ////
.................... //// send a Wrong-state if computer ////
.................... //// sends a Set_Protocl / Get_Protocol ////
.................... //// command). ////
.................... //// NOTE: If you set to TRUE you must ////
.................... //// provide your own code in the ////
.................... //// application that properly send boot ////
.................... //// or HID packets. ////
.................... //// ////
.................... //// USB_MAX_EP0_PACKET_LENGTH (8) - Max Packet size for Endpoint 0. ////
.................... //// The hardware level driver (ex ////
.................... //// pic18_usb.h will define this value if ////
.................... //// not already overwritten). Increasing ////
.................... //// this size will speed up the ////
.................... //// enumeration process. ////
.................... //// ////
.................... //// USB_EPx_RX_ENABLE (USB_ENABLE_DISABLED) - Where x is the ////
.................... //// endpoint number. Change this define ////
.................... //// to specify what kind of transfer method ////
.................... //// this RX (PC to device) endpoint uses. ////
.................... //// Here is the list of valid transfer methods: ////
.................... //// USB_ENABLE_CONTROL ////
.................... //// USB_ENABLE_ISOCHRONOUS ////
.................... //// USB_ENABLE_BULK ////
.................... //// USB_ENABLE_INTERRUPT ////
.................... //// USB_ENABLE_DISABLED ////
.................... //// Don't forget that you must specify the ////
.................... //// transfer method properly in your endpoint ////
.................... //// descriptor, too. ////
.................... //// ////
.................... //// USB_EPx_RX_SIZE (0) - For some hardware it is important to know ////
.................... //// how much memory to reserve for receiving ////
.................... //// packets. ////
.................... //// ////
.................... //// *** NOTE *** You must have both USB_EPx_RX_ENABLE defined and ////
.................... //// USB_EPx_RX_SIZE defined (non 0) to enable a RX ////
.................... //// endpoint. ////
.................... //// *** NOTE *** Endpoint 0 is always enabled. ////
.................... //// ////
.................... //// USB_EPx_TX_ENABLE (USB_ENABLE_DISABLED) - Where x is the ////
.................... //// endpoint number. Change this define ////
.................... //// to specify what kind of transfer method ////
.................... //// this TX (device to PC) endpoint uses. ////
.................... //// Here is the list of valid transfer methods: ////
.................... //// USB_ENABLE_CONTROL ////
.................... //// USB_ENABLE_ISOCHRONOUS ////
.................... //// USB_ENABLE_BULK ////
.................... //// USB_ENABLE_INTERRUPT ////
.................... //// USB_ENABLE_DISABLED ////
.................... //// Don't forget that you must specify the ////
.................... //// transfer method properly in your endpoint ////
.................... //// descriptor, too. ////
.................... //// ////
.................... //// USB_EPx_TX_SIZE (0) - For some hardware it is important to know ////
.................... //// how much memory to reserve for transmitting ////
.................... //// packets. ////
.................... //// ////
.................... //// *** NOTE *** You must have both USB_EPx_TX_ENABLE defined and ////
.................... //// USB_EPx_TX_SIZE defined (non 0) to enable a TX ////
.................... //// endpoint. ////
.................... //// ////
.................... //// ////
.................... //// USB_HID_DEVICE (TRUE) - HID devices require extra code to handle ////
.................... //// HID requests. You can disable to save ////
.................... //// ROM space if you are not using a HID ////
.................... //// device. If you are not using a HID ////
.................... //// device you must provide your own O/S ////
.................... //// (Windows) driver. ////
.................... //// ////
.................... //// The other definitions should not be changed. ////
.................... //// ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// ////
.................... //// Version History: ////
.................... //// ////
.................... //// March 5th, 2009: ////
.................... //// Cleanup for Wizard. ////
.................... //// PIC24 Initial release. ////
.................... //// ////
.................... //// July 13th, 2005: ////
.................... //// usb_ep_tx_size[] and usb_ep_rx_size[] changed to 16bits ////
.................... //// ////
.................... //// June 20th, 2005: ////
.................... //// Initial 18fxx5x release ////
.................... //// ////
.................... //// May 13th, 2005: ////
.................... //// Beta release, only works with 18Fxx5x hardware layer. ////
.................... //// Now supports multiple interfaces (many defines in descriptors ////
.................... //// will have to be changed, see examples) ////
.................... //// ////
.................... //// Mar 21st, 2005: ////
.................... //// Initial Alpha Release with PIC18Fxx5x support. (ONLY TESTED ////
.................... //// WITH 18F4550) ////
.................... //// usb_gets() and usb_puts() changed (see usb.c) ////
.................... //// ////
.................... //// June 24th, 2004: ////
.................... //// Optimization and cleanup. ////
.................... //// The following definitions changed: ////
.................... //// USB_EPx_TX_ENABLE and USB_EPx_RX_ENABLE have changed. See usb.h ////
.................... //// USB_CONFIG_DESCRIPTORS[] removed ////
.................... //// USB_CONFIG_DESC_LEN changed to USB_DESC_CONFIG_LEN ////
.................... //// USB_INTERFACE_DESC_LEN changed to USB_DESC_INTERFACE_LEN ////
.................... //// USB_CLASS_DESC_LEN changed to USB_DESC_CLASS_LEN ////
.................... //// USB_ENDPOINT_DESC_LEN changed to USB_DESC_ENDPOINT_LEN ////
.................... //// USB_CONFIG_DESC_KEY changed to USB_DESC_CONFIG_TYPE ////
.................... //// USB_INTERFACE_DESC_KEY changed to USB_DESC_INTERFACE_TYPE ////
.................... //// USB_CLASS_DESC_KEY changed to USB_DESC_CLASS_TYPE ////
.................... //// USB_ENDPOINT_DESC_KEY changed to USB_DESC_ENDPOINT_TYPE ////
.................... //// USB_STRING_X[] arrays removed, see USB_STRING_DESC[] and ////
.................... //// USB_STRING_DESC_OFFSET[] ////
.................... //// dev_req, curr_config, status_device and getdesc_type global ////
.................... //// variables moved into struct USB_stack_status ////
.................... //// ////
.................... //// October 15th, 2003: Support for boot protocol added. ////
.................... //// Set USB_HID_BOOT_PROTOCOL to TRUE to support this. ////
.................... //// The array hid_protocol[] saves which protocol mode each ////
.................... //// interface is in. It is your applications job to send ////
.................... //// data that either fit the boot protocol or HID protocol. ////
.................... //// ////
.................... //// May 6th, 2003: Fixed a potential stack overflow using PCM ////
.................... //// ////
.................... //// October 29th, 2002: New definition added to USB_STATES ////
.................... //// ////
.................... //// August 2nd, 2002: Initial Public Release ////
.................... //// ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996,2009 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS ////
.................... //// C compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, ////
.................... //// reproduction or distribution is permitted without written ////
.................... //// permission. Derivative programs created using this software ////
.................... //// in object code form are not restricted in any way. ////
.................... ///////////////////////////////////////////////////////////////////////////
....................
.................... #IFNDEF __USB_PROTOTYPES__
.................... #DEFINE __USB_PROTOTYPES__
....................
.................... //// CONFIGURATION ////////////////////////////////////////////////////////////
....................
.................... #ifndef USB_CON_SENSE_PIN
.................... #define USB_CON_SENSE_PIN 0
.................... #endif
....................
.................... #IFNDEF USB_HID_BOOT_PROTOCOL
.................... #DEFINE USB_HID_BOOT_PROTOCOL FALSE
.................... #ENDIF
....................
.................... #IFNDEF USB_HID_IDLE
.................... #DEFINE USB_HID_IDLE FALSE
.................... #ENDIF
....................
.................... //should the compiler add the extra HID handler code? Defaults to yes.
.................... #IFNDEF USB_HID_DEVICE
.................... #DEFINE USB_HID_DEVICE TRUE
.................... #ENDIF
....................
.................... #IFNDEF USB_CDC_DEVICE
.................... #DEFINE USB_CDC_DEVICE FALSE
.................... #ENDIF
....................
.................... //set to false to opt for less RAM, true to opt for less ROM
.................... #ifndef USB_OPT_FOR_ROM
.................... #define USB_OPT_FOR_ROM TRUE
.................... #endif
....................
.................... #IFNDEF USB_MAX_EP0_PACKET_LENGTH
.................... #DEFINE USB_MAX_EP0_PACKET_LENGTH 8
.................... #ENDIF
....................
....................
.................... ////// USER-LEVEL API /////////////////////////////////////////////////////////
....................
.................... /**************************************************************
.................... /* usb_enumerated()
.................... /*
.................... /* Input: Global variable USB_Curr_Config
.................... /* Returns: Returns a 1 if device is configured / enumerated,
.................... /* Returns a 0 if device is un-configured / not enumerated.
.................... /*
.................... /* Summary: See API section of USB.H for more documentation.
.................... /***************************************************************/
.................... int1 usb_enumerated(void);
....................
.................... /**************************************************************
.................... /* usb_wait_for_enumeration()
.................... /*
.................... /* Input: Global variable USB_Curr_Config
.................... /*
.................... /* Summary: Waits in-definately until device is configured / enumerated.
.................... /* See API section of USB.H for more information.
.................... /***************************************************************/
.................... void usb_wait_for_enumeration(void);
....................
.................... /****************************************************************************
.................... /* usb_gets(endpoint, ptr, max, timeout)
.................... /*
.................... /* Input: endpoint - endpoint to get data from
.................... /* ptr - place / array to store data to
.................... /* max - max amount of data to get from USB and store into ptr
.................... /* timeout - time in milliseconds, for each packet, to wait before
.................... /* timeout. set to 0 for no timeout.
.................... /*
.................... /* Output: Amount of data returned. It may be less than max.
.................... /*
.................... /* Summary: Gets data from the host. Will get multiple-packet messages
.................... /* and finish when either it receives a 0-len packet or a packet
.................... /* of less size than maximum.
.................... /*
.................... /*****************************************************************************/
.................... unsigned int16 usb_gets(int8 endpoint, int8 * ptr, unsigned int16 max, unsigned int16 timeout);
....................
.................... /****************************************************************************
.................... /* usb_puts()
.................... /*
.................... /* Inputs: endpoint - endpoint to send data out
.................... /* ptr - points to array of data to send
.................... /* len - amount of data to send
.................... /* timeout - time in milli-seconds, for each packet, to wait before
.................... /* timeout. set to 0 for no timeout.
.................... /*
.................... /* Outputs: Returns TRUE if message sent succesfully, FALSE if it was not
.................... /* sent before timeout period expired.
.................... /*
.................... /* Summary: Used for sending multiple packets of data as one message. This
.................... /* function can still be used to send messages consiting of only one
.................... /* packet. See usb_put_packet() documentation for the rules about when
.................... /* multiple packet messages or 0-lenght packets are needed.
.................... /*
.................... /*****************************************************************************/
.................... int1 usb_puts(int8 endpoint, int8 * ptr, unsigned int16 len, unsigned int8 timeout);
....................
.................... /******************************************************************************
.................... /* usb_attached()
.................... /*
.................... /* Summary: Returns TRUE if the device is attached to a USB cable.
.................... /* See the API section of USB.H for more documentation.
.................... /*
.................... /*****************************************************************************/
.................... #if USB_CON_SENSE_PIN
.................... #define usb_attached() input(USB_CON_SENSE_PIN)
.................... #else
.................... #define usb_attached() TRUE
.................... #endif
....................
.................... ////// END USER-LEVEL API /////////////////////////////////////////////////////
....................
....................
.................... ////// STACK-LEVEL API USED BY HW DRIVERS ////////////////////////////////////
....................
.................... enum USB_STATES {GET_DESCRIPTOR=1,SET_ADDRESS=2,NONE=0};
....................
.................... enum USB_GETDESC_TYPES {USB_GETDESC_CONFIG_TYPE=0,USB_GETDESC_HIDREPORT_TYPE=1,USB_GETDESC_STRING_TYPE=2,USB_GETDESC_DEVICE_TYPE=3};
....................
.................... #if USB_OPT_FOR_ROM
.................... typedef struct {
.................... USB_STATES dev_req; //what did the last setup token set us up to do?. init at none
.................... int curr_config; //our current config. start at none/powered (NOT THAT THIS LIMITS US TO 3 CONFIGURATIONS)
.................... int status_device; //Holds our state for Set_Feature and Clear_Feature
.................... USB_GETDESC_TYPES getdesc_type; //which get_descriptor() we are handling
.................... } TYPE_USB_STACK_STATUS;
.................... #else
.................... typedef struct {
.................... USB_STATES dev_req:2; //what did the last setup token set us up to do?. init at none
.................... int Curr_config:2; //our current config. start at none/powered (NOT THAT THIS LIMITS US TO 3 CONFIGURATIONS)
.................... int status_device:2; //Holds our state for Set_Feature and Clear_Feature
.................... USB_GETDESC_TYPES getdesc_type:2; //which get_descriptor() we are handling
.................... } TYPE_USB_STACK_STATUS;
.................... #endif
....................
.................... extern TYPE_USB_STACK_STATUS USB_stack_status;
....................
.................... /**************************************************************
.................... /* usb_token_reset()
.................... /*
.................... /* Output: No output (but many global registers are modified)
.................... /*
.................... /* Summary: Resets the token handler to initial (unconfigured) state.
.................... /***************************************************************/
.................... void usb_token_reset(void);
....................
.................... /**************************************************************
.................... /* usb_isr_tok_setup_dne()
.................... /*
.................... /* Input: usb_ep0_rx_buffer[] contains the the setup packet.
.................... /*
.................... /* Output: None (many globals are changed)
.................... /*
.................... /* Summary: This function is that handles the setup token.
.................... /* We must handle all relevant requests, such as Set_Configuration,
.................... /* Get_Descriptor, etc.
.................... /*
.................... /* usb_ep0_rx_buffer[] contains setup data packet, which has the
.................... /* following records:
.................... /* -------------------------------------------------------------------------------------------
.................... /* usb_ep0_rx_buffer[ 0 ]=bmRequestType; Where the setup packet goes
.................... /* bit7 (0) host-to-device
.................... /* (1) device-to-host
.................... /* bit6-5 (00) usb standard request;
.................... /* (01) class request;
.................... /* (10) vendor request
.................... /* (11) reserved
.................... /* bit4-0 (0000) device
.................... /* (0001) interface
.................... /* (0010) endpoint
.................... /* (0011) other element
.................... /* (0100) to (1111) reserved
.................... /* usb_ep0_rx_buffer[ 1 ]=bRequest ; the request
.................... /* usb_ep0_rx_buffer[2,3]=wValue ; a value which corresponds to request
.................... /* usb_ep0_rx_buffer[4,5]=wIndex ; could correspond to interface or endpoint...
.................... /* usb_ep0_rx_buffer[6,7]=wLength ; number of bytes in next data packet;
.................... /* for host-to-device, this exactly how many bytes in data packet.
.................... /* for device-to-host, this is the maximum bytes that can fit one packet.
.................... /***************************************************************/
.................... void usb_isr_tok_setup_dne(void);
....................
.................... /**************************************************************
.................... /* usb_isr_tok_out_dne()
.................... /*
.................... /* Input: endpoint contains which endpoint we are receiving data (0..15)
.................... /*
.................... /* Summary: Processes out tokens (out is respective of the host, so actualy
.................... /* incoming to the pic), but not out setup tokens. Normally when
.................... /* data is received it is left in the buffer (user would use
.................... /* usb_kbhit() and usb_get_packet() to receive data), but certain
.................... /* libraries (like CDC) have to answer setup packets.
.................... /*
.................... /***************************************************************/
.................... void usb_isr_tok_out_dne(int8 endpoint);
....................
.................... /**************************************************************
.................... /* usb_isr_tok_in_dne(endpoint)
.................... /*
.................... /* Input: endpoint - which endpoint we are processing a setup token.
.................... /*
.................... /* Summary: This handles an IN packet (HOST <- PIC). For endpoint 0, this
.................... /* is usually to setup a response packet to a setup packet. Endpoints 1..15
.................... /* are generally ignored, and the user has to use usb_tbe() to determine if
.................... /* if the buffer is ready for a new transmit packet (there are special cases,
.................... /* like CDC which handles the CDC protocl).
.................... /*
.................... /***************************************************************/
.................... void usb_isr_tok_in_dne(int8 endpoint);
....................
.................... ////// END STACK-LEVEL API USED BY HW DRIVERS /////////////////////////////////
....................
....................
.................... //CCS only supports one configuration at this time
.................... #DEFINE USB_NUM_CONFIGURATIONS 1 //DO NOT CHANGE
....................
.................... //PID values for tokens (see page 48 of USB Complete ed.1)
.................... #define PID_IN 0x09 //device to host transactions
.................... #define PID_OUT 0x01 //host to device transactions
.................... #define PID_SETUP 0x0D //host to device setup transaction
.................... #define PID_ACK 0x02 //receiver accepts error-free data packet
.................... #define PID_DATA0 0x03 //data packet with even sync bit
.................... #define PID_SOF 0x05 //start of framer marker and frame number
.................... #define PID_NAK 0x0A //receiver can't accept data or sender cant send data or has no data to transmit
.................... #define PID_DATA1 0x0B //data packet with odd sync bit
.................... #define PID_PRE 0x0C //preamble issued by host. enables downstream traffic to low-speed device
.................... #define PID_STALL 0x0E //a control request isnt supported or the endpoint is halted
....................
.................... //Key which identifies descritpors
.................... #DEFINE USB_DESC_DEVICE_TYPE 0x01 //#DEFINE USB_DEVICE_DESC_KEY 0x01
.................... #DEFINE USB_DESC_CONFIG_TYPE 0x02 //#DEFINE USB_CONFIG_DESC_KEY 0x02
.................... #DEFINE USB_DESC_STRING_TYPE 0x03 //#DEFINE USB_STRING_DESC_KEY 0x03
.................... #DEFINE USB_DESC_INTERFACE_TYPE 0x04 //#DEFINE USB_INTERFACE_DESC_KEY 0x04
.................... #DEFINE USB_DESC_ENDPOINT_TYPE 0x05 //#DEFINE USB_ENDPOINT_DESC_KEY 0x05
.................... #DEFINE USB_DESC_CLASS_TYPE 0x21 //#DEFINE USB_CLASS_DESC_KEY 0x21
.................... #DEFINE USB_DESC_HIDREPORT_TYPE 0x22
....................
.................... //The length of each descriptor
.................... #DEFINE USB_DESC_DEVICE_LEN 18 //#DEFINE USB_DEVICE_DESC_LEN 18
.................... #DEFINE USB_DESC_CONFIG_LEN 9 //#DEFINE USB_CONFIG_DESC_LEN 9
.................... #DEFINE USB_DESC_INTERFACE_LEN 9 //#DEFINE USB_INTERFACE_DESC_LEN 9
.................... #DEFINE USB_DESC_CLASS_LEN 9 //#DEFINE USB_CLASS_DESC_LEN 9
.................... #DEFINE USB_DESC_ENDPOINT_LEN 7 //#DEFINE USB_ENDPOINT_DESC_LEN 7
....................
.................... //Standard USB Setup bRequest Codes
.................... #define USB_STANDARD_REQUEST_GET_STATUS 0x00
.................... #define USB_STANDARD_REQUEST_CLEAR_FEATURE 0x01
.................... #define USB_STANDARD_REQUEST_SET_FEATURE 0x03
.................... #define USB_STANDARD_REQUEST_SET_ADDRESS 0x05
.................... #define USB_STANDARD_REQUEST_GET_DESCRIPTOR 0x06
.................... #define USB_STANDARD_REQUEST_SET_DESCRIPTOR 0x07
.................... #define USB_STANDARD_REQUEST_GET_CONFIGURATION 0x08
.................... #define USB_STANDARD_REQUEST_SET_CONFIGURATION 0x09
.................... #define USB_STANDARD_REQUEST_GET_INTERFACE 0x0A
.................... #define USB_STANDARD_REQUEST_SET_INTERFACE 0x0B
.................... #define USB_STANDARD_REQUEST_SYNCH_FRAME 0x0C
....................
.................... //HID Class Setup bRequest Codes
.................... #define USB_HID_REQUEST_GET_REPORT 0x01
.................... #define USB_HID_REQUEST_GET_IDLE 0x02
.................... #define USB_HID_REQUEST_GET_PROTOCOL 0x03
.................... #define USB_HID_REQUEST_SET_REPORT 0x09
.................... #define USB_HID_REQUEST_SET_IDLE 0x0A
.................... #define USB_HID_REQUEST_SET_PROTOCOL 0x0B
....................
.................... //types of endpoints as defined in the descriptor
.................... #define USB_ENDPOINT_TYPE_CONTROL 0x00
.................... #define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
.................... #define USB_ENDPOINT_TYPE_BULK 0x02
.................... #define USB_ENDPOINT_TYPE_INTERRUPT 0x03
....................
.................... //types of endpoints used internally in this api
.................... #define USB_ENABLE_DISABLED -1
.................... #define USB_ENABLE_BULK USB_ENDPOINT_TYPE_BULK
.................... #define USB_ENABLE_ISOCHRONOUS USB_ENDPOINT_TYPE_ISOCHRONOUS
.................... #define USB_ENABLE_INTERRUPT USB_ENDPOINT_TYPE_INTERRUPT
.................... #define USB_ENABLE_CONTROL USB_ENDPOINT_TYPE_CONTROL
....................
....................
.................... //*** ENABLE RX ENDPOINTS AND BUFFERS
....................
.................... //--------- endpoint 0 defines ----------
.................... #define USB_EP0_TX_ENABLE USB_ENABLE_CONTROL
.................... #define USB_EP0_RX_ENABLE USB_ENABLE_CONTROL
.................... #define USB_EP0_RX_SIZE USB_MAX_EP0_PACKET_LENGTH //endpoint 0 is setup, and should always be the MAX_PACKET_LENGTH. Slow speed specifies 8
.................... #define USB_EP0_TX_SIZE USB_MAX_EP0_PACKET_LENGTH //endpoint 0 is setup, and should always be the MAX_PACKET_LENGTH. Slow speed specifies 8
....................
.................... //--------- endpoint 1 defines ----------
.................... #ifndef USB_EP1_TX_ENABLE
.................... #define USB_EP1_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP1_RX_ENABLE
.................... #define USB_EP1_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP1_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP1_RX_SIZE
.................... #undef USB_EP1_RX_SIZE
.................... #endif
.................... #define USB_EP1_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP1_RX_SIZE
.................... #error You enabled EP1 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP1_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP1_TX_SIZE
.................... #undef USB_EP1_TX_SIZE
.................... #endif
.................... #define USB_EP1_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP1_TX_SIZE
.................... #error You enabled EP1 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 2 defines ----------
.................... #ifndef USB_EP2_TX_ENABLE
.................... #define USB_EP2_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP2_RX_ENABLE
.................... #define USB_EP2_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP2_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP2_RX_SIZE
.................... #undef USB_EP2_RX_SIZE
.................... #endif
.................... #define USB_EP2_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP2_RX_SIZE
.................... #error You enabled EP2 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP2_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP2_TX_SIZE
.................... #undef USB_EP2_TX_SIZE
.................... #endif
.................... #define USB_EP2_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP2_TX_SIZE
.................... #error You enabled EP2 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 3 defines ----------
.................... #ifndef USB_EP3_TX_ENABLE
.................... #define USB_EP3_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP3_RX_ENABLE
.................... #define USB_EP3_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP3_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP3_RX_SIZE
.................... #undef USB_EP3_RX_SIZE
.................... #endif
.................... #define USB_EP3_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP3_RX_SIZE
.................... #error You enabled EP3 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP3_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP3_TX_SIZE
.................... #undef USB_EP3_TX_SIZE
.................... #endif
.................... #define USB_EP3_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP3_TX_SIZE
.................... #error You enabled EP3 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 4 defines ----------
.................... #ifndef USB_EP4_TX_ENABLE
.................... #define USB_EP4_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP4_RX_ENABLE
.................... #define USB_EP4_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP4_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP4_RX_SIZE
.................... #undef USB_EP4_RX_SIZE
.................... #endif
.................... #define USB_EP4_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP4_RX_SIZE
.................... #error You enabled EP4 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP4_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP4_TX_SIZE
.................... #undef USB_EP4_TX_SIZE
.................... #endif
.................... #define USB_EP4_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP4_TX_SIZE
.................... #error You enabled EP4 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 5 defines ----------
.................... #ifndef USB_EP5_TX_ENABLE
.................... #define USB_EP5_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP5_RX_ENABLE
.................... #define USB_EP5_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP5_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP5_RX_SIZE
.................... #undef USB_EP5_RX_SIZE
.................... #endif
.................... #define USB_EP5_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP5_RX_SIZE
.................... #error You enabled EP5 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP5_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP5_TX_SIZE
.................... #undef USB_EP5_TX_SIZE
.................... #endif
.................... #define USB_EP5_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP5_TX_SIZE
.................... #error You enabled EP5 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 6 defines ----------
.................... #ifndef USB_EP6_TX_ENABLE
.................... #define USB_EP6_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP6_RX_ENABLE
.................... #define USB_EP6_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP6_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP6_RX_SIZE
.................... #undef USB_EP6_RX_SIZE
.................... #endif
.................... #define USB_EP6_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP6_RX_SIZE
.................... #error You enabled EP6 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP6_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP6_TX_SIZE
.................... #undef USB_EP6_TX_SIZE
.................... #endif
.................... #define USB_EP6_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP6_TX_SIZE
.................... #error You enabled EP6 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 7 defines ----------
.................... #ifndef USB_EP7_TX_ENABLE
.................... #define USB_EP7_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP7_RX_ENABLE
.................... #define USB_EP7_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP7_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP7_RX_SIZE
.................... #undef USB_EP7_RX_SIZE
.................... #endif
.................... #define USB_EP7_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP7_RX_SIZE
.................... #error You enabled EP7 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP7_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP7_TX_SIZE
.................... #undef USB_EP7_TX_SIZE
.................... #endif
.................... #define USB_EP7_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP7_TX_SIZE
.................... #error You enabled EP7 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 8 defines ----------
.................... #ifndef USB_EP8_TX_ENABLE
.................... #define USB_EP8_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP8_RX_ENABLE
.................... #define USB_EP8_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP8_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP8_RX_SIZE
.................... #undef USB_EP8_RX_SIZE
.................... #endif
.................... #define USB_EP8_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP8_RX_SIZE
.................... #error You enabled EP8 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP8_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP8_TX_SIZE
.................... #undef USB_EP8_TX_SIZE
.................... #endif
.................... #define USB_EP8_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP8_TX_SIZE
.................... #error You enabled EP8 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 9 defines ----------
.................... #ifndef USB_EP9_TX_ENABLE
.................... #define USB_EP9_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP9_RX_ENABLE
.................... #define USB_EP9_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP9_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP9_RX_SIZE
.................... #undef USB_EP9_RX_SIZE
.................... #endif
.................... #define USB_EP9_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP9_RX_SIZE
.................... #error You enabled EP9 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP9_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP9_TX_SIZE
.................... #undef USB_EP9_TX_SIZE
.................... #endif
.................... #define USB_EP9_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP9_TX_SIZE
.................... #error You enabled EP9 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 10 defines ----------
.................... #ifndef USB_EP10_TX_ENABLE
.................... #define USB_EP10_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP10_RX_ENABLE
.................... #define USB_EP10_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP10_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP10_RX_SIZE
.................... #undef USB_EP10_RX_SIZE
.................... #endif
.................... #define USB_EP10_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP10_RX_SIZE
.................... #error You enabled EP10 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP10_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP10_TX_SIZE
.................... #undef USB_EP10_TX_SIZE
.................... #endif
.................... #define USB_EP10_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP10_TX_SIZE
.................... #error You enabled EP10 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 11 defines ----------
.................... #ifndef USB_EP11_TX_ENABLE
.................... #define USB_EP11_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP11_RX_ENABLE
.................... #define USB_EP11_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP11_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP11_RX_SIZE
.................... #undef USB_EP11_RX_SIZE
.................... #endif
.................... #define USB_EP11_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP11_RX_SIZE
.................... #error You enabled EP11 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP11_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP11_TX_SIZE
.................... #undef USB_EP11_TX_SIZE
.................... #endif
.................... #define USB_EP11_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP11_TX_SIZE
.................... #error You enabled EP11 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 12 defines ----------
.................... #ifndef USB_EP12_TX_ENABLE
.................... #define USB_EP12_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP12_RX_ENABLE
.................... #define USB_EP12_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP12_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP12_RX_SIZE
.................... #undef USB_EP12_RX_SIZE
.................... #endif
.................... #define USB_EP12_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP12_RX_SIZE
.................... #error You enabled EP12 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP12_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP12_TX_SIZE
.................... #undef USB_EP12_TX_SIZE
.................... #endif
.................... #define USB_EP12_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP12_TX_SIZE
.................... #error You enabled EP12 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 13 defines ----------
.................... #ifndef USB_EP13_TX_ENABLE
.................... #define USB_EP13_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP13_RX_ENABLE
.................... #define USB_EP13_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP13_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP13_RX_SIZE
.................... #undef USB_EP13_RX_SIZE
.................... #endif
.................... #define USB_EP13_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP13_RX_SIZE
.................... #error You enabled EP13 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP13_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP13_TX_SIZE
.................... #undef USB_EP13_TX_SIZE
.................... #endif
.................... #define USB_EP13_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP13_TX_SIZE
.................... #error You enabled EP13 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 14 defines ----------
.................... #ifndef USB_EP14_TX_ENABLE
.................... #define USB_EP14_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP14_RX_ENABLE
.................... #define USB_EP14_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP14_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP14_RX_SIZE
.................... #undef USB_EP14_RX_SIZE
.................... #endif
.................... #define USB_EP14_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP14_RX_SIZE
.................... #error You enabled EP14 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP14_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP14_TX_SIZE
.................... #undef USB_EP14_TX_SIZE
.................... #endif
.................... #define USB_EP14_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP14_TX_SIZE
.................... #error You enabled EP14 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 15 defines ----------
.................... #ifndef USB_EP15_TX_ENABLE
.................... #define USB_EP15_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP15_RX_ENABLE
.................... #define USB_EP15_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP15_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP15_RX_SIZE
.................... #undef USB_EP15_RX_SIZE
.................... #endif
.................... #define USB_EP15_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP15_RX_SIZE
.................... #error You enabled EP15 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP15_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP15_TX_SIZE
.................... #undef USB_EP15_TX_SIZE
.................... #endif
.................... #define USB_EP15_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP15_TX_SIZE
.................... #error You enabled EP15 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... const int8 usb_ep_tx_type[16]={
.................... USB_EP0_TX_ENABLE, USB_EP1_TX_ENABLE, USB_EP2_TX_ENABLE,
.................... USB_EP3_TX_ENABLE, USB_EP4_TX_ENABLE, USB_EP5_TX_ENABLE,
.................... USB_EP6_TX_ENABLE, USB_EP7_TX_ENABLE, USB_EP8_TX_ENABLE,
.................... USB_EP9_TX_ENABLE, USB_EP10_TX_ENABLE, USB_EP11_TX_ENABLE,
.................... USB_EP12_TX_ENABLE, USB_EP13_TX_ENABLE, USB_EP14_TX_ENABLE,
.................... USB_EP15_TX_ENABLE
.................... };
....................
.................... const int8 usb_ep_rx_type[16]={
.................... USB_EP0_RX_ENABLE, USB_EP1_RX_ENABLE, USB_EP2_RX_ENABLE,
.................... USB_EP3_RX_ENABLE, USB_EP4_RX_ENABLE, USB_EP5_RX_ENABLE,
.................... USB_EP6_RX_ENABLE, USB_EP7_RX_ENABLE, USB_EP8_RX_ENABLE,
.................... USB_EP9_RX_ENABLE, USB_EP10_RX_ENABLE, USB_EP11_RX_ENABLE,
.................... USB_EP12_RX_ENABLE, USB_EP13_RX_ENABLE, USB_EP14_RX_ENABLE,
.................... USB_EP15_RX_ENABLE
.................... };
....................
.................... const unsigned int16 usb_ep_tx_size[16]={
.................... USB_EP0_TX_SIZE, USB_EP1_TX_SIZE, USB_EP2_TX_SIZE,
.................... USB_EP3_TX_SIZE, USB_EP4_TX_SIZE, USB_EP5_TX_SIZE,
.................... USB_EP6_TX_SIZE, USB_EP7_TX_SIZE, USB_EP8_TX_SIZE,
.................... USB_EP9_TX_SIZE, USB_EP10_TX_SIZE, USB_EP11_TX_SIZE,
.................... USB_EP12_TX_SIZE, USB_EP13_TX_SIZE, USB_EP14_TX_SIZE,
.................... USB_EP15_TX_SIZE
.................... };
....................
.................... const unsigned int16 usb_ep_rx_size[16]={
.................... USB_EP0_RX_SIZE, USB_EP1_RX_SIZE, USB_EP2_RX_SIZE,
.................... USB_EP3_RX_SIZE, USB_EP4_RX_SIZE, USB_EP5_RX_SIZE,
.................... USB_EP6_RX_SIZE, USB_EP7_RX_SIZE, USB_EP8_RX_SIZE,
.................... USB_EP9_RX_SIZE, USB_EP10_RX_SIZE, USB_EP11_RX_SIZE,
.................... USB_EP12_RX_SIZE, USB_EP13_RX_SIZE, USB_EP14_RX_SIZE,
.................... USB_EP15_RX_SIZE
.................... };
....................
.................... #ENDIF
....................
....................
.................... #if defined(__PIC16_USB_H__)
.................... #include <pic_usb.c>
.................... #endif
....................
.................... #if defined(__PIC18_USB_H__)
.................... #include <pic18_usb.c>
.................... /////////////////////////////////////////////////////////////////////////
.................... //// pic18_usb.c ////
.................... //// ////
.................... //// Hardware layer for CCS's USB library. See pic18_usb.h more ////
.................... //// documentation about the PIC18 hardware layer. ////
.................... //// ////
.................... //// This file is part of CCS's PIC USB driver code. See USB.H ////
.................... //// for more documentation and a list of examples. ////
.................... //// ////
.................... /////////////////////////////////////////////////////////////////////////
.................... //// ////
.................... //// Version History: ////
.................... //// ////
.................... //// March 5th, 2009: ////
.................... //// 18F14K50 family added. ////
.................... //// Cleanup for Wizard. ////
.................... //// PIC24 Initial release. ////
.................... //// ////
.................... //// Nov 3rd, 2008: ////
.................... //// * 4553 family added. ////
.................... //// ////
.................... //// Dec 18, 2007: ////
.................... //// * usb_kbhit() moved to device driver. ////
.................... //// * USB Token handler changed to workaround a flaw in the USB ////
.................... //// peripheral to prevent the USB peripheral from ////
.................... //// inadvertantly STALLing the endpoint. Happened most often ////
.................... //// in bulk demo applications, especially CDC. ////
.................... //// ////
.................... //// 11-6-07: Fixed a bug where usb_data_buffer[] was reserving ////
.................... //// too much RAM. ////
.................... //// USB_MAX_EP0_PACKET_LENGTH value can be overwritten. ////
.................... //// For the 18F4450/2450 family this should be 8 ////
.................... //// because of limited RAM. Reducing this value ////
.................... //// frees RAM for application. ////
.................... //// Based upon which endpoints have been configured for ////
.................... //// use, will free up unused USB data RAM for ////
.................... //// application dynamically. This should free up ////
.................... //// at least 128 bytes of RAM. ////
.................... //// CDC now fits on a 18F4450/2450 ////
.................... //// ////
.................... //// 09-19-07: Fixed problems with 18F4450 family. ////
.................... //// ////
.................... //// 07-17-07: Added 18F4450,2450 support ////
.................... //// ////
.................... //// 07-13-07: Added 87J50 family support ////
.................... //// ////
.................... //// 11-01-05: usb_detach(), usb_attach() and usb_init_cs() ////
.................... //// changed for the better. ////
.................... //// ////
.................... //// 10-28-05: Added usb_rx_packet_size() ////
.................... //// ////
.................... //// 07-13-05: usb_put_packet() changed for 16bit packet sizes ////
.................... //// usb_flush_in() changed for 16bit packet sizes ////
.................... //// usb_get_packet() changed for 16bit packet sizes ////
.................... //// usb_flush_out() changed for 16bit packet sizes ////
.................... //// usb_set_configured() changed for 16bit packet sizes ////
.................... //// ////
.................... //// 06-30-05: usb_tbe() added ////
.................... //// The way endpoint 0 DTS is set has been changed. ////
.................... //// ////
.................... //// 06-20-05: Initial Release ////
.................... //// ////
.................... //// 05-13-05: Beta Release (Full Speed works) ////
.................... //// ////
.................... //// 03-21-05: Initial Alpha Release ////
.................... //// ////
.................... /////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996,2009 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS ////
.................... //// C compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, ////
.................... //// reproduction or distribution is permitted without written ////
.................... //// permission. Derivative programs created using this software ////
.................... //// in object code form are not restricted in any way. ////
.................... /////////////////////////////////////////////////////////////////////////
....................
.................... #IFNDEF __PIC18_USB_C__
.................... #DEFINE __PIC18_USB_C__
....................
.................... #INCLUDE <usb.h>
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// usb.h ////
.................... //// ////
.................... //// Function protypes, defintions and globals used by CCS USB driver ////
.................... //// ////
.................... //// This file is part of CCS's USB driver code ////
.................... //// ////
.................... //// The following USB examples are provided by CCS: ////
.................... //// ex_usb_mouse.c - A HID Mouse. ////
.................... //// ex_usb_hid.c - A custom application using HID protocol. ////
.................... //// ex_usb_kbmouse.c - A HID Mouse/Keyboard combo using multiple ////
.................... //// interfaces. ////
.................... //// ex_usb_kbmouse2.c - A HID Mouse/Keyboard combo using multiple ////
.................... //// HID Reports. ////
.................... //// ex_usb_scope.c - A digital oscilloscope using a custom ////
.................... //// protocol requiring custom Windows drivers. ////
.................... //// ex_usb_serial.c - ////
.................... //// ex_usb_serial2.c - Two examples of using the CDC driver for ////
.................... //// a virtual COM port. ////
.................... //// ex_usb_bootloader.c - CDC/Virtual COM port bootloader. ////
.................... //// ex_usb_loadmouse.c - A conversion of ex_usb_mouse.c that is ////
.................... //// compatible with ex_usb_mouse.c. ////
.................... //// ////
.................... //// ********************** API ********************* ////
.................... //// ////
.................... //// These are the functions that are meant to be called by the user: ////
.................... //// ////
.................... //// usb_init() - Initializes the USB stack, the USB peripheral and ////
.................... //// attaches the unit to the usb bus. Enables ////
.................... //// interrupts. Will wait in an infinite loop until ////
.................... //// the device enumerates - if you are using ////
.................... //// connection sense or if the processor should run ////
.................... //// even if it's not connected to USB then use ////
.................... //// usb_init_cs() instead. ////
.................... //// ////
.................... //// usb_init_cs() - A smaller usb_init(), does not attach unit ////
.................... //// to usb bus or enable interrupts. Since this does ////
.................... //// not attach to the USB, you must periodically call ////
.................... //// usb_task(). See usb_task() for more information. ////
.................... //// ////
.................... //// usb_task() - If usb_init_cs() was used to initiate the USB ////
.................... //// peripheral, usb_task() should then be called periodically ////
.................... //// to check the connection sense pin. If the connection ////
.................... //// sense pin denotes USB is connected and the USB peripheral ////
.................... //// is not attached, this will attach the USB peripheral ////
.................... //// so the PC can start the enumeration process (and it ////
.................... //// will enable interrupts). If the connection sense pin ////
.................... //// denotes USB is not attached and the USB peripheral is ////
.................... //// running, this will reset the USB peripheral and wait ////
.................... //// for USB to reconnect (and usb_enumerated() will start ////
.................... //// returning FALSE). If connection sense (USB_CON_SENSE_PIN) ////
.................... //// is not defined the usb_task() assumes that USB is always ////
.................... //// connected. ////
.................... //// ////
.................... //// usb_attached() - Returns TRUE if the device is attached to a ////
.................... //// USB cable. A macro that looks at the defined ////
.................... //// connection sense pin. If this returns TRUE ////
.................... //// it does not mean the PC has connected to it, ////
.................... //// you need to use usb_enumerated() to check this. ////
.................... //// ////
.................... //// usb_enumerated() - Returns TRUE if device has been enumerated ////
.................... //// (configured) by host, FALSE if it has not. ////
.................... //// Do not try to use the USB peripheral for ////
.................... //// sending and receiving packets until you ////
.................... //// are enumerated. ////
.................... //// ////
.................... //// usb_wait_for_enumeration() - Sits in an infinte loop until device ////
.................... //// is enumerated. ////
.................... //// ////
.................... //// usb_tbe(endpoint) - Returns TRUE if the endpoint transmit buffer ////
.................... //// is free and ready to accept a new packet for transmission. ////
.................... //// ////
.................... //// usb_put_packet(endpoint, ptr, len, tgl) - Sends one packet to the ////
.................... //// host. If you need to send a message that ////
.................... //// spans more than one packet then use ////
.................... //// usb_puts(). Fore more detailed documentation ////
.................... //// see usb_hw_layer.h ////
.................... //// ////
.................... //// usb_puts(endpoint, ptr, len, timeout) - Sends a multiple packet ////
.................... //// message to the host. If you only need to send one packet, ////
.................... //// it is more effecient to use usb_put_packet(). This is ////
.................... //// documented in more detail above the prototype in USB.H. ////
.................... //// ////
.................... //// usb_kbhit(endpoint) - Returns true if OUT endpoint contains data ////
.................... //// from host. This will remain TRUE until ////
.................... //// usb_put_packet() or usb_flush_out() used. ////
.................... //// This function will return an invalid response ////
.................... //// if specified endpoint is not enabled for ////
.................... //// receiving data. ////
.................... //// ////
.................... //// len = usb_get_packet(endpoint, ptr, max) - Gets one packet that ////
.................... //// from the host/PC. usb_kbhit() must return TRUE before you ////
.................... //// call this routine or your data may not be valid. This ////
.................... //// only receives one packet, if you are trying to receive a ////
.................... //// multi-packet message use usb_gets(). For more detailed ////
.................... //// documentation see usb_hw_layer.h. ////
.................... //// ////
.................... //// len = usb_gets(endpoint, ptr, max, timeout) - Gets multiple ////
.................... //// packets from the host, you would use this instead ////
.................... //// of usb_get_packet() if you wanted to handle multi-packet ////
.................... //// messages. This is documented in more detail above the ////
.................... //// prototype in USB.H. ////
.................... //// ////
.................... //// ////
.................... //// ********* DEFINITIONS / CONFIGURATION ********** ////
.................... //// ////
.................... //// The following definitions are declared here, but can be ////
.................... //// overwritten in your code. Unless needed otherwise, leave ////
.................... //// to default value. If confused about a definition read the ////
.................... //// comments at each defintion ////
.................... //// ////
.................... //// USB_HID_IDLE (TRUE) - Set to TRUE if your device supports ////
.................... //// Set_Idle HID class request. Set to ////
.................... //// False if you do not (device will ////
.................... //// send a Wrong-state if computer ////
.................... //// sends a Set_Idle / Get_Idle command) ////
.................... //// NOTE: If you set to TRUE you must ////
.................... //// provide your own code. See ////
.................... //// usb_isr_tkn_setup_ClassInterface() in ////
.................... //// usb.c ////
.................... //// ////
.................... //// USB_HID_BOOT_PROTOCOL (FALSE) - Set to TRUE if your device supports ////
.................... //// Set_Protocl HID class request. Set to ////
.................... //// False if you do not (device will ////
.................... //// send a Wrong-state if computer ////
.................... //// sends a Set_Protocl / Get_Protocol ////
.................... //// command). ////
.................... //// NOTE: If you set to TRUE you must ////
.................... //// provide your own code in the ////
.................... //// application that properly send boot ////
.................... //// or HID packets. ////
.................... //// ////
.................... //// USB_MAX_EP0_PACKET_LENGTH (8) - Max Packet size for Endpoint 0. ////
.................... //// The hardware level driver (ex ////
.................... //// pic18_usb.h will define this value if ////
.................... //// not already overwritten). Increasing ////
.................... //// this size will speed up the ////
.................... //// enumeration process. ////
.................... //// ////
.................... //// USB_EPx_RX_ENABLE (USB_ENABLE_DISABLED) - Where x is the ////
.................... //// endpoint number. Change this define ////
.................... //// to specify what kind of transfer method ////
.................... //// this RX (PC to device) endpoint uses. ////
.................... //// Here is the list of valid transfer methods: ////
.................... //// USB_ENABLE_CONTROL ////
.................... //// USB_ENABLE_ISOCHRONOUS ////
.................... //// USB_ENABLE_BULK ////
.................... //// USB_ENABLE_INTERRUPT ////
.................... //// USB_ENABLE_DISABLED ////
.................... //// Don't forget that you must specify the ////
.................... //// transfer method properly in your endpoint ////
.................... //// descriptor, too. ////
.................... //// ////
.................... //// USB_EPx_RX_SIZE (0) - For some hardware it is important to know ////
.................... //// how much memory to reserve for receiving ////
.................... //// packets. ////
.................... //// ////
.................... //// *** NOTE *** You must have both USB_EPx_RX_ENABLE defined and ////
.................... //// USB_EPx_RX_SIZE defined (non 0) to enable a RX ////
.................... //// endpoint. ////
.................... //// *** NOTE *** Endpoint 0 is always enabled. ////
.................... //// ////
.................... //// USB_EPx_TX_ENABLE (USB_ENABLE_DISABLED) - Where x is the ////
.................... //// endpoint number. Change this define ////
.................... //// to specify what kind of transfer method ////
.................... //// this TX (device to PC) endpoint uses. ////
.................... //// Here is the list of valid transfer methods: ////
.................... //// USB_ENABLE_CONTROL ////
.................... //// USB_ENABLE_ISOCHRONOUS ////
.................... //// USB_ENABLE_BULK ////
.................... //// USB_ENABLE_INTERRUPT ////
.................... //// USB_ENABLE_DISABLED ////
.................... //// Don't forget that you must specify the ////
.................... //// transfer method properly in your endpoint ////
.................... //// descriptor, too. ////
.................... //// ////
.................... //// USB_EPx_TX_SIZE (0) - For some hardware it is important to know ////
.................... //// how much memory to reserve for transmitting ////
.................... //// packets. ////
.................... //// ////
.................... //// *** NOTE *** You must have both USB_EPx_TX_ENABLE defined and ////
.................... //// USB_EPx_TX_SIZE defined (non 0) to enable a TX ////
.................... //// endpoint. ////
.................... //// ////
.................... //// ////
.................... //// USB_HID_DEVICE (TRUE) - HID devices require extra code to handle ////
.................... //// HID requests. You can disable to save ////
.................... //// ROM space if you are not using a HID ////
.................... //// device. If you are not using a HID ////
.................... //// device you must provide your own O/S ////
.................... //// (Windows) driver. ////
.................... //// ////
.................... //// The other definitions should not be changed. ////
.................... //// ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// ////
.................... //// Version History: ////
.................... //// ////
.................... //// March 5th, 2009: ////
.................... //// Cleanup for Wizard. ////
.................... //// PIC24 Initial release. ////
.................... //// ////
.................... //// July 13th, 2005: ////
.................... //// usb_ep_tx_size[] and usb_ep_rx_size[] changed to 16bits ////
.................... //// ////
.................... //// June 20th, 2005: ////
.................... //// Initial 18fxx5x release ////
.................... //// ////
.................... //// May 13th, 2005: ////
.................... //// Beta release, only works with 18Fxx5x hardware layer. ////
.................... //// Now supports multiple interfaces (many defines in descriptors ////
.................... //// will have to be changed, see examples) ////
.................... //// ////
.................... //// Mar 21st, 2005: ////
.................... //// Initial Alpha Release with PIC18Fxx5x support. (ONLY TESTED ////
.................... //// WITH 18F4550) ////
.................... //// usb_gets() and usb_puts() changed (see usb.c) ////
.................... //// ////
.................... //// June 24th, 2004: ////
.................... //// Optimization and cleanup. ////
.................... //// The following definitions changed: ////
.................... //// USB_EPx_TX_ENABLE and USB_EPx_RX_ENABLE have changed. See usb.h ////
.................... //// USB_CONFIG_DESCRIPTORS[] removed ////
.................... //// USB_CONFIG_DESC_LEN changed to USB_DESC_CONFIG_LEN ////
.................... //// USB_INTERFACE_DESC_LEN changed to USB_DESC_INTERFACE_LEN ////
.................... //// USB_CLASS_DESC_LEN changed to USB_DESC_CLASS_LEN ////
.................... //// USB_ENDPOINT_DESC_LEN changed to USB_DESC_ENDPOINT_LEN ////
.................... //// USB_CONFIG_DESC_KEY changed to USB_DESC_CONFIG_TYPE ////
.................... //// USB_INTERFACE_DESC_KEY changed to USB_DESC_INTERFACE_TYPE ////
.................... //// USB_CLASS_DESC_KEY changed to USB_DESC_CLASS_TYPE ////
.................... //// USB_ENDPOINT_DESC_KEY changed to USB_DESC_ENDPOINT_TYPE ////
.................... //// USB_STRING_X[] arrays removed, see USB_STRING_DESC[] and ////
.................... //// USB_STRING_DESC_OFFSET[] ////
.................... //// dev_req, curr_config, status_device and getdesc_type global ////
.................... //// variables moved into struct USB_stack_status ////
.................... //// ////
.................... //// October 15th, 2003: Support for boot protocol added. ////
.................... //// Set USB_HID_BOOT_PROTOCOL to TRUE to support this. ////
.................... //// The array hid_protocol[] saves which protocol mode each ////
.................... //// interface is in. It is your applications job to send ////
.................... //// data that either fit the boot protocol or HID protocol. ////
.................... //// ////
.................... //// May 6th, 2003: Fixed a potential stack overflow using PCM ////
.................... //// ////
.................... //// October 29th, 2002: New definition added to USB_STATES ////
.................... //// ////
.................... //// August 2nd, 2002: Initial Public Release ////
.................... //// ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996,2009 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS ////
.................... //// C compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, ////
.................... //// reproduction or distribution is permitted without written ////
.................... //// permission. Derivative programs created using this software ////
.................... //// in object code form are not restricted in any way. ////
.................... ///////////////////////////////////////////////////////////////////////////
....................
.................... #IFNDEF __USB_PROTOTYPES__
.................... #DEFINE __USB_PROTOTYPES__
....................
.................... //// CONFIGURATION ////////////////////////////////////////////////////////////
....................
.................... #ifndef USB_CON_SENSE_PIN
.................... #define USB_CON_SENSE_PIN 0
.................... #endif
....................
.................... #IFNDEF USB_HID_BOOT_PROTOCOL
.................... #DEFINE USB_HID_BOOT_PROTOCOL FALSE
.................... #ENDIF
....................
.................... #IFNDEF USB_HID_IDLE
.................... #DEFINE USB_HID_IDLE FALSE
.................... #ENDIF
....................
.................... //should the compiler add the extra HID handler code? Defaults to yes.
.................... #IFNDEF USB_HID_DEVICE
.................... #DEFINE USB_HID_DEVICE TRUE
.................... #ENDIF
....................
.................... #IFNDEF USB_CDC_DEVICE
.................... #DEFINE USB_CDC_DEVICE FALSE
.................... #ENDIF
....................
.................... //set to false to opt for less RAM, true to opt for less ROM
.................... #ifndef USB_OPT_FOR_ROM
.................... #define USB_OPT_FOR_ROM TRUE
.................... #endif
....................
.................... #IFNDEF USB_MAX_EP0_PACKET_LENGTH
.................... #DEFINE USB_MAX_EP0_PACKET_LENGTH 8
.................... #ENDIF
....................
....................
.................... ////// USER-LEVEL API /////////////////////////////////////////////////////////
....................
.................... /**************************************************************
.................... /* usb_enumerated()
.................... /*
.................... /* Input: Global variable USB_Curr_Config
.................... /* Returns: Returns a 1 if device is configured / enumerated,
.................... /* Returns a 0 if device is un-configured / not enumerated.
.................... /*
.................... /* Summary: See API section of USB.H for more documentation.
.................... /***************************************************************/
.................... int1 usb_enumerated(void);
....................
.................... /**************************************************************
.................... /* usb_wait_for_enumeration()
.................... /*
.................... /* Input: Global variable USB_Curr_Config
.................... /*
.................... /* Summary: Waits in-definately until device is configured / enumerated.
.................... /* See API section of USB.H for more information.
.................... /***************************************************************/
.................... void usb_wait_for_enumeration(void);
....................
.................... /****************************************************************************
.................... /* usb_gets(endpoint, ptr, max, timeout)
.................... /*
.................... /* Input: endpoint - endpoint to get data from
.................... /* ptr - place / array to store data to
.................... /* max - max amount of data to get from USB and store into ptr
.................... /* timeout - time in milliseconds, for each packet, to wait before
.................... /* timeout. set to 0 for no timeout.
.................... /*
.................... /* Output: Amount of data returned. It may be less than max.
.................... /*
.................... /* Summary: Gets data from the host. Will get multiple-packet messages
.................... /* and finish when either it receives a 0-len packet or a packet
.................... /* of less size than maximum.
.................... /*
.................... /*****************************************************************************/
.................... unsigned int16 usb_gets(int8 endpoint, int8 * ptr, unsigned int16 max, unsigned int16 timeout);
....................
.................... /****************************************************************************
.................... /* usb_puts()
.................... /*
.................... /* Inputs: endpoint - endpoint to send data out
.................... /* ptr - points to array of data to send
.................... /* len - amount of data to send
.................... /* timeout - time in milli-seconds, for each packet, to wait before
.................... /* timeout. set to 0 for no timeout.
.................... /*
.................... /* Outputs: Returns TRUE if message sent succesfully, FALSE if it was not
.................... /* sent before timeout period expired.
.................... /*
.................... /* Summary: Used for sending multiple packets of data as one message. This
.................... /* function can still be used to send messages consiting of only one
.................... /* packet. See usb_put_packet() documentation for the rules about when
.................... /* multiple packet messages or 0-lenght packets are needed.
.................... /*
.................... /*****************************************************************************/
.................... int1 usb_puts(int8 endpoint, int8 * ptr, unsigned int16 len, unsigned int8 timeout);
....................
.................... /******************************************************************************
.................... /* usb_attached()
.................... /*
.................... /* Summary: Returns TRUE if the device is attached to a USB cable.
.................... /* See the API section of USB.H for more documentation.
.................... /*
.................... /*****************************************************************************/
.................... #if USB_CON_SENSE_PIN
.................... #define usb_attached() input(USB_CON_SENSE_PIN)
.................... #else
.................... #define usb_attached() TRUE
.................... #endif
....................
.................... ////// END USER-LEVEL API /////////////////////////////////////////////////////
....................
....................
.................... ////// STACK-LEVEL API USED BY HW DRIVERS ////////////////////////////////////
....................
.................... enum USB_STATES {GET_DESCRIPTOR=1,SET_ADDRESS=2,NONE=0};
....................
.................... enum USB_GETDESC_TYPES {USB_GETDESC_CONFIG_TYPE=0,USB_GETDESC_HIDREPORT_TYPE=1,USB_GETDESC_STRING_TYPE=2,USB_GETDESC_DEVICE_TYPE=3};
....................
.................... #if USB_OPT_FOR_ROM
.................... typedef struct {
.................... USB_STATES dev_req; //what did the last setup token set us up to do?. init at none
.................... int curr_config; //our current config. start at none/powered (NOT THAT THIS LIMITS US TO 3 CONFIGURATIONS)
.................... int status_device; //Holds our state for Set_Feature and Clear_Feature
.................... USB_GETDESC_TYPES getdesc_type; //which get_descriptor() we are handling
.................... } TYPE_USB_STACK_STATUS;
.................... #else
.................... typedef struct {
.................... USB_STATES dev_req:2; //what did the last setup token set us up to do?. init at none
.................... int Curr_config:2; //our current config. start at none/powered (NOT THAT THIS LIMITS US TO 3 CONFIGURATIONS)
.................... int status_device:2; //Holds our state for Set_Feature and Clear_Feature
.................... USB_GETDESC_TYPES getdesc_type:2; //which get_descriptor() we are handling
.................... } TYPE_USB_STACK_STATUS;
.................... #endif
....................
.................... extern TYPE_USB_STACK_STATUS USB_stack_status;
....................
.................... /**************************************************************
.................... /* usb_token_reset()
.................... /*
.................... /* Output: No output (but many global registers are modified)
.................... /*
.................... /* Summary: Resets the token handler to initial (unconfigured) state.
.................... /***************************************************************/
.................... void usb_token_reset(void);
....................
.................... /**************************************************************
.................... /* usb_isr_tok_setup_dne()
.................... /*
.................... /* Input: usb_ep0_rx_buffer[] contains the the setup packet.
.................... /*
.................... /* Output: None (many globals are changed)
.................... /*
.................... /* Summary: This function is that handles the setup token.
.................... /* We must handle all relevant requests, such as Set_Configuration,
.................... /* Get_Descriptor, etc.
.................... /*
.................... /* usb_ep0_rx_buffer[] contains setup data packet, which has the
.................... /* following records:
.................... /* -------------------------------------------------------------------------------------------
.................... /* usb_ep0_rx_buffer[ 0 ]=bmRequestType; Where the setup packet goes
.................... /* bit7 (0) host-to-device
.................... /* (1) device-to-host
.................... /* bit6-5 (00) usb standard request;
.................... /* (01) class request;
.................... /* (10) vendor request
.................... /* (11) reserved
.................... /* bit4-0 (0000) device
.................... /* (0001) interface
.................... /* (0010) endpoint
.................... /* (0011) other element
.................... /* (0100) to (1111) reserved
.................... /* usb_ep0_rx_buffer[ 1 ]=bRequest ; the request
.................... /* usb_ep0_rx_buffer[2,3]=wValue ; a value which corresponds to request
.................... /* usb_ep0_rx_buffer[4,5]=wIndex ; could correspond to interface or endpoint...
.................... /* usb_ep0_rx_buffer[6,7]=wLength ; number of bytes in next data packet;
.................... /* for host-to-device, this exactly how many bytes in data packet.
.................... /* for device-to-host, this is the maximum bytes that can fit one packet.
.................... /***************************************************************/
.................... void usb_isr_tok_setup_dne(void);
....................
.................... /**************************************************************
.................... /* usb_isr_tok_out_dne()
.................... /*
.................... /* Input: endpoint contains which endpoint we are receiving data (0..15)
.................... /*
.................... /* Summary: Processes out tokens (out is respective of the host, so actualy
.................... /* incoming to the pic), but not out setup tokens. Normally when
.................... /* data is received it is left in the buffer (user would use
.................... /* usb_kbhit() and usb_get_packet() to receive data), but certain
.................... /* libraries (like CDC) have to answer setup packets.
.................... /*
.................... /***************************************************************/
.................... void usb_isr_tok_out_dne(int8 endpoint);
....................
.................... /**************************************************************
.................... /* usb_isr_tok_in_dne(endpoint)
.................... /*
.................... /* Input: endpoint - which endpoint we are processing a setup token.
.................... /*
.................... /* Summary: This handles an IN packet (HOST <- PIC). For endpoint 0, this
.................... /* is usually to setup a response packet to a setup packet. Endpoints 1..15
.................... /* are generally ignored, and the user has to use usb_tbe() to determine if
.................... /* if the buffer is ready for a new transmit packet (there are special cases,
.................... /* like CDC which handles the CDC protocl).
.................... /*
.................... /***************************************************************/
.................... void usb_isr_tok_in_dne(int8 endpoint);
....................
.................... ////// END STACK-LEVEL API USED BY HW DRIVERS /////////////////////////////////
....................
....................
.................... //CCS only supports one configuration at this time
.................... #DEFINE USB_NUM_CONFIGURATIONS 1 //DO NOT CHANGE
....................
.................... //PID values for tokens (see page 48 of USB Complete ed.1)
.................... #define PID_IN 0x09 //device to host transactions
.................... #define PID_OUT 0x01 //host to device transactions
.................... #define PID_SETUP 0x0D //host to device setup transaction
.................... #define PID_ACK 0x02 //receiver accepts error-free data packet
.................... #define PID_DATA0 0x03 //data packet with even sync bit
.................... #define PID_SOF 0x05 //start of framer marker and frame number
.................... #define PID_NAK 0x0A //receiver can't accept data or sender cant send data or has no data to transmit
.................... #define PID_DATA1 0x0B //data packet with odd sync bit
.................... #define PID_PRE 0x0C //preamble issued by host. enables downstream traffic to low-speed device
.................... #define PID_STALL 0x0E //a control request isnt supported or the endpoint is halted
....................
.................... //Key which identifies descritpors
.................... #DEFINE USB_DESC_DEVICE_TYPE 0x01 //#DEFINE USB_DEVICE_DESC_KEY 0x01
.................... #DEFINE USB_DESC_CONFIG_TYPE 0x02 //#DEFINE USB_CONFIG_DESC_KEY 0x02
.................... #DEFINE USB_DESC_STRING_TYPE 0x03 //#DEFINE USB_STRING_DESC_KEY 0x03
.................... #DEFINE USB_DESC_INTERFACE_TYPE 0x04 //#DEFINE USB_INTERFACE_DESC_KEY 0x04
.................... #DEFINE USB_DESC_ENDPOINT_TYPE 0x05 //#DEFINE USB_ENDPOINT_DESC_KEY 0x05
.................... #DEFINE USB_DESC_CLASS_TYPE 0x21 //#DEFINE USB_CLASS_DESC_KEY 0x21
.................... #DEFINE USB_DESC_HIDREPORT_TYPE 0x22
....................
.................... //The length of each descriptor
.................... #DEFINE USB_DESC_DEVICE_LEN 18 //#DEFINE USB_DEVICE_DESC_LEN 18
.................... #DEFINE USB_DESC_CONFIG_LEN 9 //#DEFINE USB_CONFIG_DESC_LEN 9
.................... #DEFINE USB_DESC_INTERFACE_LEN 9 //#DEFINE USB_INTERFACE_DESC_LEN 9
.................... #DEFINE USB_DESC_CLASS_LEN 9 //#DEFINE USB_CLASS_DESC_LEN 9
.................... #DEFINE USB_DESC_ENDPOINT_LEN 7 //#DEFINE USB_ENDPOINT_DESC_LEN 7
....................
.................... //Standard USB Setup bRequest Codes
.................... #define USB_STANDARD_REQUEST_GET_STATUS 0x00
.................... #define USB_STANDARD_REQUEST_CLEAR_FEATURE 0x01
.................... #define USB_STANDARD_REQUEST_SET_FEATURE 0x03
.................... #define USB_STANDARD_REQUEST_SET_ADDRESS 0x05
.................... #define USB_STANDARD_REQUEST_GET_DESCRIPTOR 0x06
.................... #define USB_STANDARD_REQUEST_SET_DESCRIPTOR 0x07
.................... #define USB_STANDARD_REQUEST_GET_CONFIGURATION 0x08
.................... #define USB_STANDARD_REQUEST_SET_CONFIGURATION 0x09
.................... #define USB_STANDARD_REQUEST_GET_INTERFACE 0x0A
.................... #define USB_STANDARD_REQUEST_SET_INTERFACE 0x0B
.................... #define USB_STANDARD_REQUEST_SYNCH_FRAME 0x0C
....................
.................... //HID Class Setup bRequest Codes
.................... #define USB_HID_REQUEST_GET_REPORT 0x01
.................... #define USB_HID_REQUEST_GET_IDLE 0x02
.................... #define USB_HID_REQUEST_GET_PROTOCOL 0x03
.................... #define USB_HID_REQUEST_SET_REPORT 0x09
.................... #define USB_HID_REQUEST_SET_IDLE 0x0A
.................... #define USB_HID_REQUEST_SET_PROTOCOL 0x0B
....................
.................... //types of endpoints as defined in the descriptor
.................... #define USB_ENDPOINT_TYPE_CONTROL 0x00
.................... #define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
.................... #define USB_ENDPOINT_TYPE_BULK 0x02
.................... #define USB_ENDPOINT_TYPE_INTERRUPT 0x03
....................
.................... //types of endpoints used internally in this api
.................... #define USB_ENABLE_DISABLED -1
.................... #define USB_ENABLE_BULK USB_ENDPOINT_TYPE_BULK
.................... #define USB_ENABLE_ISOCHRONOUS USB_ENDPOINT_TYPE_ISOCHRONOUS
.................... #define USB_ENABLE_INTERRUPT USB_ENDPOINT_TYPE_INTERRUPT
.................... #define USB_ENABLE_CONTROL USB_ENDPOINT_TYPE_CONTROL
....................
....................
.................... //*** ENABLE RX ENDPOINTS AND BUFFERS
....................
.................... //--------- endpoint 0 defines ----------
.................... #define USB_EP0_TX_ENABLE USB_ENABLE_CONTROL
.................... #define USB_EP0_RX_ENABLE USB_ENABLE_CONTROL
.................... #define USB_EP0_RX_SIZE USB_MAX_EP0_PACKET_LENGTH //endpoint 0 is setup, and should always be the MAX_PACKET_LENGTH. Slow speed specifies 8
.................... #define USB_EP0_TX_SIZE USB_MAX_EP0_PACKET_LENGTH //endpoint 0 is setup, and should always be the MAX_PACKET_LENGTH. Slow speed specifies 8
....................
.................... //--------- endpoint 1 defines ----------
.................... #ifndef USB_EP1_TX_ENABLE
.................... #define USB_EP1_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP1_RX_ENABLE
.................... #define USB_EP1_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP1_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP1_RX_SIZE
.................... #undef USB_EP1_RX_SIZE
.................... #endif
.................... #define USB_EP1_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP1_RX_SIZE
.................... #error You enabled EP1 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP1_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP1_TX_SIZE
.................... #undef USB_EP1_TX_SIZE
.................... #endif
.................... #define USB_EP1_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP1_TX_SIZE
.................... #error You enabled EP1 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 2 defines ----------
.................... #ifndef USB_EP2_TX_ENABLE
.................... #define USB_EP2_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP2_RX_ENABLE
.................... #define USB_EP2_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP2_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP2_RX_SIZE
.................... #undef USB_EP2_RX_SIZE
.................... #endif
.................... #define USB_EP2_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP2_RX_SIZE
.................... #error You enabled EP2 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP2_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP2_TX_SIZE
.................... #undef USB_EP2_TX_SIZE
.................... #endif
.................... #define USB_EP2_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP2_TX_SIZE
.................... #error You enabled EP2 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 3 defines ----------
.................... #ifndef USB_EP3_TX_ENABLE
.................... #define USB_EP3_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP3_RX_ENABLE
.................... #define USB_EP3_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP3_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP3_RX_SIZE
.................... #undef USB_EP3_RX_SIZE
.................... #endif
.................... #define USB_EP3_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP3_RX_SIZE
.................... #error You enabled EP3 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP3_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP3_TX_SIZE
.................... #undef USB_EP3_TX_SIZE
.................... #endif
.................... #define USB_EP3_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP3_TX_SIZE
.................... #error You enabled EP3 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 4 defines ----------
.................... #ifndef USB_EP4_TX_ENABLE
.................... #define USB_EP4_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP4_RX_ENABLE
.................... #define USB_EP4_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP4_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP4_RX_SIZE
.................... #undef USB_EP4_RX_SIZE
.................... #endif
.................... #define USB_EP4_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP4_RX_SIZE
.................... #error You enabled EP4 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP4_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP4_TX_SIZE
.................... #undef USB_EP4_TX_SIZE
.................... #endif
.................... #define USB_EP4_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP4_TX_SIZE
.................... #error You enabled EP4 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 5 defines ----------
.................... #ifndef USB_EP5_TX_ENABLE
.................... #define USB_EP5_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP5_RX_ENABLE
.................... #define USB_EP5_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP5_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP5_RX_SIZE
.................... #undef USB_EP5_RX_SIZE
.................... #endif
.................... #define USB_EP5_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP5_RX_SIZE
.................... #error You enabled EP5 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP5_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP5_TX_SIZE
.................... #undef USB_EP5_TX_SIZE
.................... #endif
.................... #define USB_EP5_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP5_TX_SIZE
.................... #error You enabled EP5 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 6 defines ----------
.................... #ifndef USB_EP6_TX_ENABLE
.................... #define USB_EP6_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP6_RX_ENABLE
.................... #define USB_EP6_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP6_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP6_RX_SIZE
.................... #undef USB_EP6_RX_SIZE
.................... #endif
.................... #define USB_EP6_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP6_RX_SIZE
.................... #error You enabled EP6 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP6_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP6_TX_SIZE
.................... #undef USB_EP6_TX_SIZE
.................... #endif
.................... #define USB_EP6_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP6_TX_SIZE
.................... #error You enabled EP6 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 7 defines ----------
.................... #ifndef USB_EP7_TX_ENABLE
.................... #define USB_EP7_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP7_RX_ENABLE
.................... #define USB_EP7_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP7_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP7_RX_SIZE
.................... #undef USB_EP7_RX_SIZE
.................... #endif
.................... #define USB_EP7_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP7_RX_SIZE
.................... #error You enabled EP7 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP7_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP7_TX_SIZE
.................... #undef USB_EP7_TX_SIZE
.................... #endif
.................... #define USB_EP7_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP7_TX_SIZE
.................... #error You enabled EP7 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 8 defines ----------
.................... #ifndef USB_EP8_TX_ENABLE
.................... #define USB_EP8_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP8_RX_ENABLE
.................... #define USB_EP8_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP8_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP8_RX_SIZE
.................... #undef USB_EP8_RX_SIZE
.................... #endif
.................... #define USB_EP8_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP8_RX_SIZE
.................... #error You enabled EP8 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP8_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP8_TX_SIZE
.................... #undef USB_EP8_TX_SIZE
.................... #endif
.................... #define USB_EP8_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP8_TX_SIZE
.................... #error You enabled EP8 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 9 defines ----------
.................... #ifndef USB_EP9_TX_ENABLE
.................... #define USB_EP9_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP9_RX_ENABLE
.................... #define USB_EP9_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP9_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP9_RX_SIZE
.................... #undef USB_EP9_RX_SIZE
.................... #endif
.................... #define USB_EP9_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP9_RX_SIZE
.................... #error You enabled EP9 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP9_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP9_TX_SIZE
.................... #undef USB_EP9_TX_SIZE
.................... #endif
.................... #define USB_EP9_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP9_TX_SIZE
.................... #error You enabled EP9 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 10 defines ----------
.................... #ifndef USB_EP10_TX_ENABLE
.................... #define USB_EP10_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP10_RX_ENABLE
.................... #define USB_EP10_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP10_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP10_RX_SIZE
.................... #undef USB_EP10_RX_SIZE
.................... #endif
.................... #define USB_EP10_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP10_RX_SIZE
.................... #error You enabled EP10 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP10_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP10_TX_SIZE
.................... #undef USB_EP10_TX_SIZE
.................... #endif
.................... #define USB_EP10_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP10_TX_SIZE
.................... #error You enabled EP10 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 11 defines ----------
.................... #ifndef USB_EP11_TX_ENABLE
.................... #define USB_EP11_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP11_RX_ENABLE
.................... #define USB_EP11_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP11_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP11_RX_SIZE
.................... #undef USB_EP11_RX_SIZE
.................... #endif
.................... #define USB_EP11_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP11_RX_SIZE
.................... #error You enabled EP11 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP11_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP11_TX_SIZE
.................... #undef USB_EP11_TX_SIZE
.................... #endif
.................... #define USB_EP11_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP11_TX_SIZE
.................... #error You enabled EP11 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 12 defines ----------
.................... #ifndef USB_EP12_TX_ENABLE
.................... #define USB_EP12_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP12_RX_ENABLE
.................... #define USB_EP12_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP12_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP12_RX_SIZE
.................... #undef USB_EP12_RX_SIZE
.................... #endif
.................... #define USB_EP12_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP12_RX_SIZE
.................... #error You enabled EP12 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP12_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP12_TX_SIZE
.................... #undef USB_EP12_TX_SIZE
.................... #endif
.................... #define USB_EP12_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP12_TX_SIZE
.................... #error You enabled EP12 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 13 defines ----------
.................... #ifndef USB_EP13_TX_ENABLE
.................... #define USB_EP13_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP13_RX_ENABLE
.................... #define USB_EP13_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP13_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP13_RX_SIZE
.................... #undef USB_EP13_RX_SIZE
.................... #endif
.................... #define USB_EP13_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP13_RX_SIZE
.................... #error You enabled EP13 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP13_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP13_TX_SIZE
.................... #undef USB_EP13_TX_SIZE
.................... #endif
.................... #define USB_EP13_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP13_TX_SIZE
.................... #error You enabled EP13 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 14 defines ----------
.................... #ifndef USB_EP14_TX_ENABLE
.................... #define USB_EP14_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP14_RX_ENABLE
.................... #define USB_EP14_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP14_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP14_RX_SIZE
.................... #undef USB_EP14_RX_SIZE
.................... #endif
.................... #define USB_EP14_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP14_RX_SIZE
.................... #error You enabled EP14 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP14_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP14_TX_SIZE
.................... #undef USB_EP14_TX_SIZE
.................... #endif
.................... #define USB_EP14_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP14_TX_SIZE
.................... #error You enabled EP14 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
....................
.................... //--------- endpoint 15 defines ----------
.................... #ifndef USB_EP15_TX_ENABLE
.................... #define USB_EP15_TX_ENABLE USB_ENABLE_DISABLED
.................... #endif
.................... #ifndef USB_EP15_RX_ENABLE
.................... #define USB_EP15_RX_ENABLE USB_ENABLE_DISABLED
.................... #endif
....................
.................... #if USB_EP15_RX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP15_RX_SIZE
.................... #undef USB_EP15_RX_SIZE
.................... #endif
.................... #define USB_EP15_RX_SIZE 0
.................... #else
.................... #ifndef USB_EP15_RX_SIZE
.................... #error You enabled EP15 for RX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... #if USB_EP15_TX_ENABLE==USB_ENABLE_DISABLED
.................... #ifdef USB_EP15_TX_SIZE
.................... #undef USB_EP15_TX_SIZE
.................... #endif
.................... #define USB_EP15_TX_SIZE 0
.................... #else
.................... #ifndef USB_EP15_TX_SIZE
.................... #error You enabled EP15 for TX but didn't specify endpoint size
.................... #endif
.................... #endif
....................
.................... const int8 usb_ep_tx_type[16]={
.................... USB_EP0_TX_ENABLE, USB_EP1_TX_ENABLE, USB_EP2_TX_ENABLE,
.................... USB_EP3_TX_ENABLE, USB_EP4_TX_ENABLE, USB_EP5_TX_ENABLE,
.................... USB_EP6_TX_ENABLE, USB_EP7_TX_ENABLE, USB_EP8_TX_ENABLE,
.................... USB_EP9_TX_ENABLE, USB_EP10_TX_ENABLE, USB_EP11_TX_ENABLE,
.................... USB_EP12_TX_ENABLE, USB_EP13_TX_ENABLE, USB_EP14_TX_ENABLE,
.................... USB_EP15_TX_ENABLE
.................... };
....................
.................... const int8 usb_ep_rx_type[16]={
.................... USB_EP0_RX_ENABLE, USB_EP1_RX_ENABLE, USB_EP2_RX_ENABLE,
.................... USB_EP3_RX_ENABLE, USB_EP4_RX_ENABLE, USB_EP5_RX_ENABLE,
.................... USB_EP6_RX_ENABLE, USB_EP7_RX_ENABLE, USB_EP8_RX_ENABLE,
.................... USB_EP9_RX_ENABLE, USB_EP10_RX_ENABLE, USB_EP11_RX_ENABLE,
.................... USB_EP12_RX_ENABLE, USB_EP13_RX_ENABLE, USB_EP14_RX_ENABLE,
.................... USB_EP15_RX_ENABLE
.................... };
....................
.................... const unsigned int16 usb_ep_tx_size[16]={
.................... USB_EP0_TX_SIZE, USB_EP1_TX_SIZE, USB_EP2_TX_SIZE,
.................... USB_EP3_TX_SIZE, USB_EP4_TX_SIZE, USB_EP5_TX_SIZE,
.................... USB_EP6_TX_SIZE, USB_EP7_TX_SIZE, USB_EP8_TX_SIZE,
.................... USB_EP9_TX_SIZE, USB_EP10_TX_SIZE, USB_EP11_TX_SIZE,
.................... USB_EP12_TX_SIZE, USB_EP13_TX_SIZE, USB_EP14_TX_SIZE,
.................... USB_EP15_TX_SIZE
.................... };
....................
.................... const unsigned int16 usb_ep_rx_size[16]={
.................... USB_EP0_RX_SIZE, USB_EP1_RX_SIZE, USB_EP2_RX_SIZE,
.................... USB_EP3_RX_SIZE, USB_EP4_RX_SIZE, USB_EP5_RX_SIZE,
.................... USB_EP6_RX_SIZE, USB_EP7_RX_SIZE, USB_EP8_RX_SIZE,
.................... USB_EP9_RX_SIZE, USB_EP10_RX_SIZE, USB_EP11_RX_SIZE,
.................... USB_EP12_RX_SIZE, USB_EP13_RX_SIZE, USB_EP14_RX_SIZE,
.................... USB_EP15_RX_SIZE
.................... };
....................
.................... #ENDIF
....................
....................
.................... //if you are worried that the PIC is not receiving packets because a bug in the
.................... //DATA0/DATA1 synch code, you can set this to TRUE to ignore the DTS on
.................... //receiving.
.................... #ifndef USB_IGNORE_RX_DTS
.................... #define USB_IGNORE_RX_DTS FALSE
.................... #endif
....................
.................... #ifndef USB_IGNORE_TX_DTS
.................... #define USB_IGNORE_TX_DTS FALSE
.................... #endif
....................
.................... #if ((getenv("DEVICE")=="PIC18F87J50") || (getenv("DEVICE")=="PIC18F86J55") || \
.................... (getenv("DEVICE")=="PIC18F86J50") || (getenv("DEVICE")=="PIC18F85J50") || \
.................... (getenv("DEVICE")=="PIC18F67J50") || (getenv("DEVICE")=="PIC18F66J55") || \
.................... (getenv("DEVICE")=="PIC18F66J50") || (getenv("DEVICE")=="PIC18F65J50"))
.................... #define __USB_87J50__
.................... #define USB_TOTAL_RAM_SPACE ((int16)getenv("RAM")-0x400)
.................... #define USB_RAM_START 0x400
.................... #define USB_LAST_ALLOWED_ENDPOINT 16
.................... #elif ((getenv("DEVICE")=="PIC18F2450") || (getenv("DEVICE")=="PIC18F4450"))
.................... #define __USB_4450__
.................... #define USB_TOTAL_RAM_SPACE ((int16)0x100)
.................... #define USB_RAM_START 0x400
.................... #define USB_LAST_ALLOWED_ENDPOINT 3
.................... #elif ((getenv("DEVICE")=="PIC18F13K50") || (getenv("DEVICE")=="PIC18F14K50"))
.................... #define __USB_K50__
.................... #define USB_TOTAL_RAM_SPACE ((int16)0x200)
.................... #define USB_RAM_START 0x200
.................... #define USB_LAST_ALLOWED_ENDPOINT 8
.................... #elif ((getenv("DEVICE")=="PIC18F2455") || (getenv("DEVICE")=="PIC18F2550") || \
.................... (getenv("DEVICE")=="PIC18F4455") || (getenv("DEVICE")=="PIC18F4550") || \
.................... (getenv("DEVICE")=="PIC18F2458") || (getenv("DEVICE")=="PIC18F2553") || \
.................... (getenv("DEVICE")=="PIC18F4458") || (getenv("DEVICE")=="PIC18F4553") \
.................... )
.................... #define __USB_4550__
.................... #define USB_TOTAL_RAM_SPACE ((int16)0x400)
.................... #define USB_RAM_START 0x400
.................... #define USB_LAST_ALLOWED_ENDPOINT 16
.................... #else
.................... #error Unknown PIC device, USB not supported in this library.
.................... #endif
....................
.................... #if USB_EP15_TX_SIZE || USB_EP15_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 15
.................... #elif USB_EP14_TX_SIZE || USB_EP14_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 14
.................... #elif USB_EP13_TX_SIZE || USB_EP13_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 13
.................... #elif USB_EP12_TX_SIZE || USB_EP12_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 12
.................... #elif USB_EP11_TX_SIZE || USB_EP11_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 11
.................... #elif USB_EP10_TX_SIZE || USB_EP10_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 10
.................... #elif USB_EP9_TX_SIZE || USB_EP9_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 9
.................... #elif USB_EP8_TX_SIZE || USB_EP8_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 8
.................... #elif USB_EP7_TX_SIZE || USB_EP7_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 7
.................... #elif USB_EP6_TX_SIZE || USB_EP6_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 6
.................... #elif USB_EP5_TX_SIZE || USB_EP5_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 5
.................... #elif USB_EP4_TX_SIZE || USB_EP4_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 4
.................... #elif USB_EP3_TX_SIZE || USB_EP3_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 3
.................... #elif USB_EP2_TX_SIZE || USB_EP2_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 2
.................... #elif USB_EP1_TX_SIZE || USB_EP1_RX_SIZE
.................... #define USB_LAST_DEFINED_ENDPOINT 1
.................... #else
.................... #define USB_LAST_DEFINED_ENDPOINT 0
.................... #endif
....................
.................... #define USB_CONTROL_REGISTER_SIZE ((USB_LAST_DEFINED_ENDPOINT+1)*8)
....................
.................... #define USB_DATA_BUFFER_NEEDED (USB_EP0_TX_SIZE+USB_EP0_RX_SIZE+USB_EP1_TX_SIZE+\
.................... USB_EP1_RX_SIZE+USB_EP2_TX_SIZE+USB_EP2_RX_SIZE+\
.................... USB_EP3_TX_SIZE+USB_EP3_RX_SIZE+USB_EP4_TX_SIZE+\
.................... USB_EP4_RX_SIZE+USB_EP5_TX_SIZE+USB_EP5_RX_SIZE+\
.................... USB_EP6_TX_SIZE+USB_EP6_RX_SIZE+USB_EP7_TX_SIZE+\
.................... USB_EP7_RX_SIZE+USB_EP8_TX_SIZE+USB_EP8_RX_SIZE+\
.................... USB_EP9_TX_SIZE+USB_EP9_RX_SIZE+USB_EP10_TX_SIZE+\
.................... USB_EP10_RX_SIZE+USB_EP11_TX_SIZE+USB_EP11_RX_SIZE+\
.................... USB_EP12_TX_SIZE+USB_EP12_RX_SIZE+USB_EP13_TX_SIZE+\
.................... USB_EP13_RX_SIZE+USB_EP14_TX_SIZE+USB_EP14_RX_SIZE+\
.................... USB_EP15_TX_SIZE+USB_EP15_RX_SIZE)
....................
.................... #if ((USB_DATA_BUFFER_NEEDED+USB_CONTROL_REGISTER_SIZE) > USB_TOTAL_RAM_SPACE)
.................... #error You are trying to allocate more memory for endpoints than the PIC can handle
.................... #endif
....................
.................... #if (USB_LAST_DEFINED_ENDPOINT > USB_LAST_ALLOWED_ENDPOINT)
.................... #error You are trying ot use an invalid endpoint for this hardware!
.................... #endif
....................
.................... #define USB_DATA_BUFFER_LOCATION ((int16)USB_RAM_START+USB_CONTROL_REGISTER_SIZE)
....................
.................... typedef struct
.................... {
.................... int8 stat;
.................... int8 cnt;
.................... int16 addr;
.................... } STRUCT_BD;
....................
.................... struct
.................... {
.................... struct
.................... {
.................... STRUCT_BD out; //pc -> pic
.................... STRUCT_BD in; //pc <- pic
.................... } bd[USB_LAST_DEFINED_ENDPOINT+1];
.................... union
.................... {
.................... struct
.................... {
.................... int8 ep0_rx_buffer[USB_MAX_EP0_PACKET_LENGTH];
.................... int8 ep0_tx_buffer[USB_MAX_EP0_PACKET_LENGTH];
....................
.................... //these buffer definitions needed for CDC library
.................... #if USB_EP1_RX_SIZE
.................... int8 ep1_rx_buffer[USB_EP1_RX_SIZE];
.................... #endif
.................... #if USB_EP1_TX_SIZE
.................... int8 ep1_tx_buffer[USB_EP1_TX_SIZE];
.................... #endif
.................... #if USB_EP2_RX_SIZE
.................... int8 ep2_rx_buffer[USB_EP2_RX_SIZE];
.................... #endif
.................... #if USB_EP2_TX_SIZE
.................... int8 ep2_tx_buffer[USB_EP2_TX_SIZE];
.................... #endif
.................... };
.................... int8 general[USB_DATA_BUFFER_NEEDED];
.................... } buffer;
.................... } g_USBRAM;
.................... #locate g_USBRAM=USB_RAM_START
....................
.................... #define usb_ep0_rx_buffer g_USBRAM.buffer.ep0_rx_buffer
.................... #define usb_ep0_tx_buffer g_USBRAM.buffer.ep0_tx_buffer
....................
.................... //these buffer definitions needed for CDC library
.................... #define usb_ep1_rx_buffer g_USBRAM.buffer.ep1_rx_buffer
.................... #define usb_ep1_tx_buffer g_USBRAM.buffer.ep1_tx_buffer
.................... #define usb_ep2_rx_buffer g_USBRAM.buffer.ep2_rx_buffer
.................... #define usb_ep2_tx_buffer g_USBRAM.buffer.ep2_tx_buffer
....................
.................... #define debug_usb(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z)
.................... //#define debug_usb printf
.................... //#define debug_putc putc_tbe
.................... #define debug_display_ram(x,y)
.................... /*
.................... void debug_display_ram(int8 len, int8 *ptr) {
.................... int8 max=16;
.................... debug_usb(debug_putc,"%U - ",len);
.................... if (max>len) {max=len;}
.................... while(max--) {
.................... debug_usb(debug_putc,"%X",*ptr);
.................... len--;
.................... ptr++;
.................... }
.................... if (len) {debug_usb(debug_putc,"...");}
.................... }
.................... */
....................
.................... //if you enable this it will keep a counter of the 6 possible errors the
.................... //pic can detect. disabling this will save you ROM, RAM and execution time.
.................... #if !defined(USB_USE_ERROR_COUNTER)
.................... #define USB_USE_ERROR_COUNTER FALSE
.................... #endif
....................
.................... #define USB_PING_PONG_MODE_OFF 0 //no ping pong
.................... #define USB_PING_PONG_MODE_E0 1 //ping pong endpoint 0 only
.................... #define USB_PING_PONG_MODE_ON 2 //ping pong all endpoints
....................
.................... //NOTE - PING PONG MODE IS NOT SUPPORTED BY CCS!
.................... #if !defined(USB_PING_PONG_MODE)
.................... #define USB_PING_PONG_MODE USB_PING_PONG_MODE_OFF
.................... #endif
....................
.................... #if USB_USE_ERROR_COUNTER
.................... int ERROR_COUNTER[6];
.................... #endif
....................
.................... //---pic18fxx5x memory locations
.................... #if defined(__USB_4550__) || defined(__USB_4450__)
.................... #byte UFRML = 0xF66
.................... #byte UFRMH = 0xF67
.................... #byte UIR = 0xF68
.................... #byte UIE = 0xF69
.................... #byte UEIR = 0xF6A
.................... #byte UEIE = 0xF6B
.................... #byte USTAT = 0xF6C
.................... #byte UCON = 0xF6D
.................... #byte UADDR = 0xF6E
.................... #byte UCFG = 0xF6F
.................... #define UEP0_LOC 0xF70
.................... #elif defined(__USB_K50__)
.................... #byte UFRML = 0xF5D
.................... #byte UFRMH = 0xF5E
.................... #byte UIR = 0xF62
.................... #byte UIE = 0xF60
.................... #byte UEIR = 0xF5F
.................... #byte UEIE = 0xF5B
.................... #byte USTAT = 0xF63
.................... #byte UCON = 0xF64
.................... #byte UADDR = 0xF5C
.................... #byte UCFG = 0xF61
.................... #define UEP0_LOC 0xF53
.................... #else
.................... #byte UFRML = 0xF60
.................... #byte UFRMH = 0xF61
.................... #byte UIR = 0xF62
.................... #byte UIE = 0xF5C
.................... #byte UEIR = 0xF63
.................... #byte UEIE = 0xF5D
.................... #byte USTAT = 0xF64
.................... #byte UCON = 0xF65
.................... #byte UADDR = 0xF5E
.................... #byte UCFG = 0xF5F
.................... #define UEP0_LOC 0xF4C
.................... #endif
....................
.................... int8 g_UEP[16];
.................... #locate g_UEP=UEP0_LOC
.................... #define UEP(x) g_UEP[x]
....................
.................... #BIT UIR_SOF = UIR.6
.................... #BIT UIR_STALL = UIR.5
.................... #BIT UIR_IDLE = UIR.4
.................... #BIT UIR_TRN = UIR.3
.................... #BIT UIR_ACTV = UIR.2
.................... #BIT UIR_UERR = UIR.1
.................... #BIT UIR_URST = UIR.0
....................
.................... #BIT UIE_SOF = UIE.6
.................... #BIT UIE_STALL = UIE.5
.................... #BIT UIE_IDLE = UIE.4
.................... #BIT UIE_TRN = UIE.3
.................... #BIT UIE_ACTV = UIE.2
.................... #BIT UIE_UERR = UIE.1
.................... #BIT UIE_URST = UIE.0
....................
.................... #bit UCON_PBRST=UCON.6
.................... #bit UCON_SE0=UCON.5
.................... #bit UCON_PKTDIS=UCON.4
.................... #bit UCON_USBEN=UCON.3
.................... #bit UCON_RESUME=UCON.2
.................... #bit UCON_SUSPND=UCON.1
....................
.................... #if (USB_PING_PONG_MODE==USB_PING_PONG_MODE_OFF)
.................... #define EP_BDxST_O(x) g_USBRAM.bd[x].out.stat
.................... #define EP_BDxCNT_O(x) g_USBRAM.bd[x].out.cnt
.................... #define EP_BDxADR_O(x) g_USBRAM.bd[x].out.addr
.................... #define EP_BDxST_I(x) g_USBRAM.bd[x].in.stat
.................... #define EP_BDxCNT_I(x) g_USBRAM.bd[x].in.cnt
.................... #define EP_BDxADR_I(x) g_USBRAM.bd[x].in.addr
.................... #else
.................... #error Right now this driver only supports no ping pong
.................... #endif
....................
.................... //See UEPn (0xF70-0xF7F)
.................... #define ENDPT_DISABLED 0x00 //endpoint not used
.................... #define ENDPT_IN_ONLY 0x02 //endpoint supports IN transactions only
.................... #define ENDPT_OUT_ONLY 0x04 //endpoint supports OUT transactions only
.................... #define ENDPT_CONTROL 0x06 //Supports IN, OUT and CONTROL transactions - Only use with EP0
.................... #define ENDPT_NON_CONTROL 0x0E //Supports both IN and OUT transactions
....................
.................... //Define the states that the USB interface can be in
.................... enum {USB_STATE_DETACHED=0, USB_STATE_ATTACHED=1, USB_STATE_POWERED=2, USB_STATE_DEFAULT=3,
.................... USB_STATE_ADDRESS=4, USB_STATE_CONFIGURED=5} usb_state=0;
....................
.................... //--BDendST has their PIDs upshifed 2
.................... #define USB_PIC_PID_IN 0x24 //device to host transactions
.................... #define USB_PIC_PID_OUT 0x04 //host to device transactions
.................... #define USB_PIC_PID_SETUP 0x34 //host to device setup transaction
....................
.................... #define USTAT_IN_E0 4
.................... #define USTAT_OUT_SETUP_E0 0
....................
.................... #define __USB_UIF_RESET 0x01
.................... #define __USB_UIF_ERROR 0x02
.................... #define __USB_UIF_ACTIVE 0x04
.................... #define __USB_UIF_TOKEN 0x08
.................... #define __USB_UIF_IDLE 0x10
.................... #define __USB_UIF_STALL 0x20
.................... #define __USB_UIF_SOF 0x40
....................
.................... #if USB_USE_ERROR_COUNTER
.................... #define STANDARD_INTS __USB_UIF_STALL|__USB_UIF_IDLE|__USB_UIF_TOKEN|__USB_UIF_ACTIVE|__USB_UIF_ERROR|__USB_UIF_RESET
.................... #else
.................... #define STANDARD_INTS __USB_UIF_STALL|__USB_UIF_IDLE|__USB_UIF_TOKEN|__USB_UIF_ACTIVE|__USB_UIF_RESET
.................... #endif
....................
.................... #define __USB_UCFG_UTEYE 0x80
.................... #if defined(__USB_4550__)
.................... #define __USB_UCFG_UOEMON 0x40
.................... #endif
.................... #define __USB_UCFG_UPUEN 0x10
.................... #define __USB_UCFG_UTRDIS 0x08
.................... #define __USB_UCFG_FSEN 0x04
....................
.................... #if USB_USE_FULL_SPEED
.................... #define __UCFG_VAL_ENABLED__ (__USB_UCFG_UPUEN | __USB_UCFG_FSEN | USB_PING_PONG_MODE)
.................... #else
.................... #define __UCFG_VAL_ENABLED__ (__USB_UCFG_UPUEN | USB_PING_PONG_MODE);
.................... #endif
....................
.................... #define __UCFG_VAL_DISABLED__ 0x08
....................
.................... int8 __setup_0_tx_size;
....................
.................... //interrupt handler, specific to PIC18Fxx5x peripheral only
.................... void usb_handle_interrupt();
.................... void usb_isr_rst();
.................... void usb_isr_uerr();
.................... void usb_isr_sof(void);
.................... void usb_isr_activity();
.................... void usb_isr_uidle();
.................... void usb_isr_tok_dne();
.................... void usb_isr_stall(void);
.................... void usb_init_ep0_setup(void);
....................
.................... //// BEGIN User Functions:
....................
.................... // see usb_hw_layer.h for more documentation
.................... int1 usb_kbhit(int8 en)
.................... {
.................... return((UEP(en)!=ENDPT_DISABLED)&&(!bit_test(EP_BDxST_O(en),7)));
.................... }
....................
.................... // see usb_hw_layer.h for documentation
.................... int1 usb_tbe(int8 en)
.................... {
.................... return((UEP(en)!=ENDPT_DISABLED)&&(!bit_test(EP_BDxST_I(en),7)));
*
0D06: CLRF 03
0D08: MOVLB 7
0D0A: MOVF x47,W
0D0C: ADDLW 70
0D0E: MOVWF FE9
0D10: MOVLW 0F
0D12: ADDWFC 03,W
0D14: MOVWF FEA
0D16: MOVF FEF,F
0D18: BZ 0D50
0D1A: CLRF x49
0D1C: MOVFF 747,748
0D20: CLRF x4B
0D22: MOVLW 08
0D24: MOVWF x4A
0D26: MOVLB 0
0D28: CALL 02BA
0D2C: MOVFF 02,749
0D30: MOVFF 01,748
0D34: MOVLW 04
0D36: MOVLB 7
0D38: ADDWF x48,F
0D3A: MOVLW 00
0D3C: ADDWFC x49,F
0D3E: MOVFF 748,FE9
0D42: MOVLW 04
0D44: ADDWF x49,W
0D46: MOVWF FEA
0D48: MOVFF FEF,748
0D4C: BTFSS x48.7
0D4E: BRA 0D54
0D50: MOVLW 00
0D52: BRA 0D56
0D54: MOVLW 01
0D56: MOVWF 01
.................... }
0D58: MOVLB 0
0D5A: RETLW 00
....................
.................... // see usb_hw_layer.h for documentation
.................... void usb_detach(void)
.................... {
.................... UCON = 0; //disable USB hardware
*
12F4: CLRF F6D
.................... UIE = 0; //disable USB interrupts
12F6: CLRF F69
.................... UCFG = __UCFG_VAL_DISABLED__;
12F8: MOVLW 08
12FA: MOVWF F6F
....................
.................... // set D+/D- to inputs
.................... #if defined(__USB_87J50__)
.................... set_tris_f(get_tris_f() | 0x18);
.................... #elif defined(__USB_K50__)
.................... set_tris_a(get_tris_a() | 0x3);
.................... #else
.................... set_tris_c(get_tris_c() | 0x30);
12FC: MOVF F94,W
12FE: IORLW 30
1300: MOVLB 6
1302: MOVWF F94
.................... #endif
....................
.................... usb_state = USB_STATE_DETACHED;
1304: CLRF 24
1306: CLRF 18
1308: BTFSC FF2.7
130A: BSF 18.7
130C: BCF FF2.7
....................
.................... usb_token_reset(); //clear the chapter9 stack
130E: MOVLB 0
1310: CALL 037E
1314: BTFSC 18.7
1316: BSF FF2.7
.................... //__usb_kbhit_status=0;
.................... }
1318: GOTO 131E (RETURN)
....................
.................... // see usb_hw_layer.h for documentation
.................... void usb_attach(void)
.................... {
*
1322: CLRF 18
1324: BTFSC FF2.7
1326: BSF 18.7
1328: BCF FF2.7
.................... usb_token_reset();
132A: CALL 037E
132E: BTFSC 18.7
1330: BSF FF2.7
.................... UCON = 0;
1332: CLRF F6D
.................... UCFG = __UCFG_VAL_ENABLED__;
1334: MOVLW 14
1336: MOVWF F6F
.................... UIE = 0; // Mask all USB interrupts
1338: CLRF F69
.................... UCON_USBEN = 1; // Enable module & attach to bus
133A: BSF F6D.3
.................... usb_state = USB_STATE_ATTACHED; // Defined in usbmmap.c & .h
133C: MOVLW 01
133E: MOVWF 24
.................... }
1340: GOTO 134A (RETURN)
....................
.................... // see usb_hw_layer.h for documentation
.................... void usb_init_cs(void)
.................... {
.................... usb_detach();
*
131C: BRA 12F4
.................... }
131E: GOTO 136A (RETURN)
....................
.................... // see usb_hw_layer.h for documentation
.................... void usb_task(void)
.................... {
.................... if (usb_attached())
.................... {
.................... if (UCON_USBEN==0)
*
1344: BTFSC F6D.3
1346: BRA 134A
.................... {
.................... debug_usb(debug_putc, "\r\n\nUSB TASK: ATTACH");
.................... usb_attach();
1348: BRA 1322
.................... }
.................... }
.................... else
.................... {
.................... if (UCON_USBEN==1)
.................... {
.................... debug_usb(debug_putc, "\r\n\nUSB TASK: DE-ATTACH");
.................... usb_detach();
.................... }
.................... }
....................
.................... if ((usb_state == USB_STATE_ATTACHED)&&(!UCON_SE0))
134A: DECFSZ 24,W
134C: BRA 1364
134E: BTFSC F6D.5
1350: BRA 1364
.................... {
.................... UIR=0;
1352: CLRF F68
.................... UIE=0;
1354: CLRF F69
.................... enable_interrupts(INT_USB);
1356: BSF FA0.5
.................... enable_interrupts(GLOBAL);
1358: MOVLW C0
135A: IORWF FF2,F
.................... UIE=__USB_UIF_IDLE | __USB_UIF_RESET; //enable IDLE and RESET USB ISR
135C: MOVLW 11
135E: MOVWF F69
.................... usb_state=USB_STATE_POWERED;
1360: MOVLW 02
1362: MOVWF 24
.................... debug_usb(debug_putc, "\r\n\nUSB TASK: POWERED");
.................... }
.................... }
1364: GOTO 136C (RETURN)
....................
.................... // see usb_hw_layer.h for documentation
.................... void usb_init(void)
.................... {
.................... usb_init_cs();
1368: BRA 131C
....................
.................... do
.................... {
.................... usb_task();
136A: BRA 1344
.................... } while (usb_state != USB_STATE_POWERED);
136C: MOVF 24,W
136E: SUBLW 02
1370: BNZ 136A
.................... }
1372: GOTO 1FE4 (RETURN)
....................
....................
.................... // see pic18_usb.h for documentation
.................... int1 usb_flush_in(int8 endpoint, int16 len, USB_DTS_BIT tgl)
.................... {
.................... int8 i;
....................
.................... debug_usb(debug_putc,"\r\nPUT %X %U %LU",endpoint, tgl, len);
....................
.................... if (usb_tbe(endpoint))
*
0D5C: MOVFF 742,747
0D60: RCALL 0D06
0D62: MOVF 01,F
0D64: BTFSC FD8.2
0D66: BRA 0E74
.................... {
.................... EP_BDxCNT_I(endpoint)=len;
0D68: MOVLB 7
0D6A: CLRF x49
0D6C: MOVFF 742,748
0D70: CLRF x4B
0D72: MOVLW 08
0D74: MOVWF x4A
0D76: MOVLB 0
0D78: CALL 02BA
0D7C: MOVFF 02,748
0D80: MOVFF 01,747
0D84: MOVLW 04
0D86: MOVLB 7
0D88: ADDWF x47,F
0D8A: MOVLW 00
0D8C: ADDWFC x48,F
0D8E: MOVLW 01
0D90: ADDWF x47,W
0D92: MOVWF 01
0D94: MOVLW 00
0D96: ADDWFC x48,W
0D98: MOVWF 03
0D9A: MOVFF 01,FE9
0D9E: MOVLW 04
0DA0: ADDWF 03,W
0DA2: MOVWF FEA
0DA4: MOVFF 743,FEF
....................
.................... debug_display_ram(len, EP_BDxADR_I(endpoint));
....................
.................... #if USB_IGNORE_TX_DTS
.................... i=0x80;
.................... #else
.................... if (tgl == USB_DTS_TOGGLE)
0DA8: MOVF x45,W
0DAA: SUBLW 02
0DAC: BNZ 0DEE
.................... {
.................... i = EP_BDxST_I(endpoint);
0DAE: CLRF x49
0DB0: MOVFF 742,748
0DB4: CLRF x4B
0DB6: MOVLW 08
0DB8: MOVWF x4A
0DBA: MOVLB 0
0DBC: CALL 02BA
0DC0: MOVFF 02,748
0DC4: MOVFF 01,747
0DC8: MOVLW 04
0DCA: MOVLB 7
0DCC: ADDWF x47,F
0DCE: MOVLW 00
0DD0: ADDWFC x48,F
0DD2: MOVFF 747,FE9
0DD6: MOVLW 04
0DD8: ADDWF x48,W
0DDA: MOVWF FEA
0DDC: MOVFF FEF,746
.................... if (bit_test(i,6))
0DE0: BTFSS x46.6
0DE2: BRA 0DE8
.................... tgl = USB_DTS_DATA0; //was DATA1, goto DATA0
0DE4: CLRF x45
.................... else
0DE6: BRA 0DEC
.................... tgl = USB_DTS_DATA1; //was DATA0, goto DATA1
0DE8: MOVLW 01
0DEA: MOVWF x45
.................... }
.................... else if (tgl == USB_DTS_USERX)
0DEC: BRA 0E22
0DEE: MOVF x45,W
0DF0: SUBLW 04
0DF2: BNZ 0E22
.................... {
.................... i = EP_BDxST_O(endpoint);
0DF4: CLRF x49
0DF6: MOVFF 742,748
0DFA: CLRF x4B
0DFC: MOVLW 08
0DFE: MOVWF x4A
0E00: MOVLB 0
0E02: CALL 02BA
0E06: MOVLB 7
0E08: MOVFF 01,FE9
0E0C: MOVLW 04
0E0E: ADDWF 02,W
0E10: MOVWF FEA
0E12: MOVFF FEF,746
.................... if (bit_test(i,6))
0E16: BTFSS x46.6
0E18: BRA 0E20
.................... tgl = USB_DTS_DATA1;
0E1A: MOVLW 01
0E1C: MOVWF x45
.................... else
0E1E: BRA 0E22
.................... tgl = USB_DTS_DATA0;
0E20: CLRF x45
.................... }
.................... if (tgl == USB_DTS_DATA1)
0E22: DECFSZ x45,W
0E24: BRA 0E2C
.................... i=0xC8; //DATA1, UOWN
0E26: MOVLW C8
0E28: MOVWF x46
.................... else //if (tgl == USB_DTS_DATA0)
0E2A: BRA 0E30
.................... i=0x88; //DATA0, UOWN
0E2C: MOVLW 88
0E2E: MOVWF x46
.................... #endif
....................
.................... //set BC8 and BC9
.................... if (bit_test(len,8)) {bit_set(i,0);}
0E30: BTFSC x44.0
0E32: BSF x46.0
.................... if (bit_test(len,9)) {bit_set(i,1);}
0E34: BTFSC x44.1
0E36: BSF x46.1
....................
.................... debug_usb(debug_putc, " %X", i);
....................
.................... EP_BDxST_I(endpoint) = i;//save changes
0E38: CLRF x49
0E3A: MOVFF 742,748
0E3E: CLRF x4B
0E40: MOVLW 08
0E42: MOVWF x4A
0E44: MOVLB 0
0E46: CALL 02BA
0E4A: MOVFF 02,748
0E4E: MOVFF 01,747
0E52: MOVLW 04
0E54: MOVLB 7
0E56: ADDWF x47,F
0E58: MOVLW 00
0E5A: ADDWFC x48,F
0E5C: MOVFF 747,FE9
0E60: MOVLW 04
0E62: ADDWF x48,W
0E64: MOVWF FEA
0E66: MOVFF 746,FEF
....................
.................... //putc('!');
....................
.................... return(1);
0E6A: MOVLW 01
0E6C: MOVWF 01
0E6E: BRA 0E7A
.................... }
.................... else
0E70: BRA 0E72
0E72: MOVLB 0
.................... {
.................... //putc('_');
.................... debug_usb(debug_putc,"\r\nPUT ERR");
.................... }
.................... return(0);
0E74: MOVLW 00
0E76: MOVWF 01
0E78: MOVLB 7
.................... }
0E7A: MOVLB 0
0E7C: RETLW 00
....................
.................... // see usb_hw_layer.h for documentation
.................... int1 usb_put_packet(int8 endpoint, int8 * ptr, int16 len, USB_DTS_BIT tgl)
.................... {
.................... int8 * buff_add;
....................
.................... if (usb_tbe(endpoint))
*
0F88: MOVFF 73A,747
0F8C: RCALL 0D06
0F8E: MOVF 01,F
0F90: BZ 1026
.................... {
.................... buff_add = EP_BDxADR_I(endpoint);
0F92: MOVLB 7
0F94: CLRF x49
0F96: MOVFF 73A,748
0F9A: CLRF x4B
0F9C: MOVLW 08
0F9E: MOVWF x4A
0FA0: MOVLB 0
0FA2: CALL 02BA
0FA6: MOVFF 02,743
0FAA: MOVFF 01,742
0FAE: MOVLW 04
0FB0: MOVLB 7
0FB2: ADDWF x42,F
0FB4: MOVLW 00
0FB6: ADDWFC x43,F
0FB8: MOVLW 02
0FBA: ADDWF x42,W
0FBC: MOVWF 01
0FBE: MOVLW 00
0FC0: ADDWFC x43,W
0FC2: MOVWF 03
0FC4: MOVFF 01,FE9
0FC8: MOVLW 04
0FCA: ADDWF 03,W
0FCC: MOVWF FEA
0FCE: MOVFF FEC,03
0FD2: MOVF FED,F
0FD4: MOVFF FEF,740
0FD8: MOVFF 03,741
.................... memcpy(buff_add, ptr, len);
0FDC: MOVFF 741,FEA
0FE0: MOVFF 740,FE9
0FE4: MOVFF 73C,FE2
0FE8: MOVFF 73B,FE1
0FEC: MOVFF 73E,02
0FF0: MOVFF 73D,01
0FF4: MOVF 01,F
0FF6: BZ 0FFC
0FF8: INCF 02,F
0FFA: BRA 1000
0FFC: MOVF 02,F
0FFE: BZ 100C
1000: MOVFF FE6,FEE
1004: DECFSZ 01,F
1006: BRA 1000
1008: DECFSZ 02,F
100A: BRA 1000
....................
.................... return(usb_flush_in(endpoint, len, tgl));
100C: MOVFF 73A,742
1010: MOVFF 73E,744
1014: MOVFF 73D,743
1018: MOVFF 73F,745
101C: MOVLB 0
101E: RCALL 0D5C
1020: MOVF 01,W
1022: BRA 102A
.................... }
.................... else
1024: BRA 1026
.................... {
.................... //putc('-');
.................... //printf("%X", EP_BDxST_I(endpoint));
.................... debug_usb(debug_putc,"\r\nPUT ERR");
.................... }
....................
.................... return(0);
1026: MOVLW 00
1028: MOVWF 01
.................... }
102A: RETLW 00
....................
.................... // see pic18_usb.h for documentation
.................... void usb_flush_out(int8 endpoint, USB_DTS_BIT tgl)
.................... {
.................... int8 i;
.................... int16 len;
....................
.................... #if USB_IGNORE_RX_DTS
.................... if (tgl == USB_DTS_STALL)
.................... {
.................... debug_usb(debug_putc, '*');
.................... EP_BDxCNT_O(endpoint) = 0x84;
.................... EP_BDxST_I(endpoint) = 0x84;
.................... return;
.................... }
.................... else
.................... i=0x80;
.................... #else
.................... i = EP_BDxST_O(endpoint);
*
0BEA: MOVLB 7
0BEC: CLRF x49
0BEE: MOVFF 6FD,748
0BF2: CLRF x4B
0BF4: MOVLW 08
0BF6: MOVWF x4A
0BF8: MOVLB 0
0BFA: CALL 02BA
0BFE: MOVLB 7
0C00: MOVFF 01,FE9
0C04: MOVLW 04
0C06: ADDWF 02,W
0C08: MOVWF FEA
0C0A: MOVFF FEF,6FF
0C0E: MOVLB 6
.................... if (tgl == USB_DTS_TOGGLE)
0C10: MOVF xFE,W
0C12: SUBLW 02
0C14: BNZ 0C22
.................... {
.................... if (bit_test(i,6))
0C16: BTFSS xFF.6
0C18: BRA 0C1E
.................... tgl = USB_DTS_DATA0; //was DATA1, goto DATA0
0C1A: CLRF xFE
.................... else
0C1C: BRA 0C22
.................... tgl = USB_DTS_DATA1; //was DATA0, goto DATA1
0C1E: MOVLW 01
0C20: MOVWF xFE
.................... }
.................... if (tgl == USB_DTS_STALL)
0C22: MOVF xFE,W
0C24: SUBLW 03
0C26: BNZ 0C64
.................... {
.................... i = 0x84;
0C28: MOVLW 84
0C2A: MOVWF xFF
.................... EP_BDxST_I(endpoint) = 0x84; //stall both in and out endpoints
0C2C: MOVLB 7
0C2E: CLRF x49
0C30: MOVFF 6FD,748
0C34: CLRF x4B
0C36: MOVLW 08
0C38: MOVWF x4A
0C3A: MOVLB 0
0C3C: CALL 02BA
0C40: MOVFF 02,703
0C44: MOVFF 01,702
0C48: MOVLW 04
0C4A: MOVLB 7
0C4C: ADDWF x02,F
0C4E: MOVLW 00
0C50: ADDWFC x03,F
0C52: MOVFF 702,FE9
0C56: MOVLW 04
0C58: ADDWF x03,W
0C5A: MOVWF FEA
0C5C: MOVLW 84
0C5E: MOVWF FEF
.................... }
.................... else if (tgl == USB_DTS_DATA1)
0C60: BRA 0C74
0C62: MOVLB 6
0C64: DECFSZ xFE,W
0C66: BRA 0C6E
.................... i = 0xC8; //DATA1, UOWN
0C68: MOVLW C8
0C6A: MOVWF xFF
.................... else //if (tgl == USB_DTS_DATA0)
0C6C: BRA 0C72
.................... i = 0x88; //DATA0, UOWN
0C6E: MOVLW 88
0C70: MOVWF xFF
0C72: MOVLB 7
.................... #endif
....................
.................... //bit_clear(__usb_kbhit_status,endpoint);
....................
.................... len = usb_ep_rx_size[endpoint];
0C74: BCF FD8.0
0C76: MOVLB 6
0C78: RLCF xFD,W
0C7A: CLRF 03
0C7C: MOVFF FF2,702
0C80: BCF FF2.7
0C82: MOVLB 0
0C84: CALL 011A
0C88: TBLRD*+
0C8A: MOVFF FF5,03
0C8E: MOVLB 7
0C90: BTFSC x02.7
0C92: BSF FF2.7
0C94: MOVWF x00
0C96: MOVFF 03,701
.................... EP_BDxCNT_O(endpoint) = len;
0C9A: CLRF x49
0C9C: MOVFF 6FD,748
0CA0: CLRF x4B
0CA2: MOVLW 08
0CA4: MOVWF x4A
0CA6: MOVLB 0
0CA8: CALL 02BA
0CAC: MOVFF 01,702
0CB0: MOVLW 01
0CB2: MOVLB 7
0CB4: ADDWF 01,W
0CB6: MOVWF 01
0CB8: MOVLW 00
0CBA: ADDWFC 02,W
0CBC: MOVWF 03
0CBE: MOVFF 01,FE9
0CC2: MOVLW 04
0CC4: ADDWF 03,W
0CC6: MOVWF FEA
0CC8: MOVFF 700,FEF
.................... if (bit_test(len,8)) {bit_set(i,0);}
0CCC: BTFSS x01.0
0CCE: BRA 0CD6
0CD0: MOVLB 6
0CD2: BSF xFF.0
0CD4: MOVLB 7
.................... if (bit_test(len,9)) {bit_set(i,1);}
0CD6: BTFSS x01.1
0CD8: BRA 0CE0
0CDA: MOVLB 6
0CDC: BSF xFF.1
0CDE: MOVLB 7
....................
.................... EP_BDxST_O(endpoint) = i;
0CE0: CLRF x49
0CE2: MOVFF 6FD,748
0CE6: CLRF x4B
0CE8: MOVLW 08
0CEA: MOVWF x4A
0CEC: MOVLB 0
0CEE: CALL 02BA
0CF2: MOVLB 7
0CF4: MOVFF 01,FE9
0CF8: MOVLW 04
0CFA: ADDWF 02,W
0CFC: MOVWF FEA
0CFE: MOVFF 6FF,FEF
.................... }
0D02: MOVLB 0
0D04: RETLW 00
....................
.................... // see pic18_usb.h for documentation
.................... int16 usb_rx_packet_size(int8 endpoint)
.................... {
.................... return(EP_BDxCNT_O(endpoint));
*
0EE6: MOVLB 7
0EE8: CLRF x49
0EEA: MOVFF 6FE,748
0EEE: CLRF x4B
0EF0: MOVLW 08
0EF2: MOVWF x4A
0EF4: MOVLB 0
0EF6: CALL 02BA
0EFA: MOVFF 02,700
0EFE: MOVFF 01,6FF
0F02: MOVLW 01
0F04: MOVLB 6
0F06: ADDWF 01,W
0F08: MOVWF 01
0F0A: MOVLW 00
0F0C: MOVLB 7
0F0E: ADDWFC 02,W
0F10: MOVWF 03
0F12: MOVFF 01,FE9
0F16: MOVLW 04
0F18: ADDWF 03,W
0F1A: MOVWF FEA
0F1C: CLRF 03
0F1E: MOVFF FEF,01
0F22: MOVFF 03,02
.................... }
0F26: MOVLB 0
0F28: GOTO 0F3A (RETURN)
....................
.................... /// END User Functions
....................
....................
.................... /// BEGIN Hardware layer functions required by USB.
....................
.................... /*****************************************************************************
.................... /* usb_get_packet_buffer(endpoint, *ptr, max)
.................... /*
.................... /* Input: endpoint - endpoint to get data from
.................... /* ptr - where to save data to local PIC RAM
.................... /* max - max amount of data to receive from buffer
.................... /*
.................... /* Output: the amount of data taken from the buffer.
.................... /*
.................... /* Summary: Gets a packet of data from the USB buffer and puts into local PIC
.................... /* RAM.
.................... /* Does not mark the endpoint as ready for more data. Once you are
.................... /* done with data, call usb_flush_out() to mark the endpoint ready
.................... /* to receive more data.
.................... /*
.................... /*****************************************************************************/
.................... static int16 usb_get_packet_buffer(int8 endpoint, int8 *ptr, int16 max)
.................... {
.................... int8 * al;
.................... int8 st;
.................... int16 i;
....................
.................... al = EP_BDxADR_O(endpoint);
.................... i = EP_BDxCNT_O(endpoint);
.................... st = EP_BDxST_O(endpoint);
....................
.................... //read BC8 and BC9
.................... if (bit_test(st,0)) {bit_set(i,8);}
.................... if (bit_test(st,1)) {bit_set(i,9);}
....................
.................... if (i < max) {max = i;}
....................
.................... memcpy(ptr, al ,max);
....................
.................... return(max);
.................... }
....................
.................... // see usb_hw_layer.h for documentation
.................... unsigned int16 usb_get_packet(int8 endpoint, int8 * ptr, unsigned int16 max)
.................... {
.................... max = usb_get_packet_buffer(endpoint, ptr, max);
.................... usb_flush_out(endpoint, USB_DTS_TOGGLE);
....................
.................... return(max);
.................... }
....................
.................... // see usb_hw_layer.h for documentation
.................... void usb_stall_ep(int8 endpoint)
.................... {
.................... int1 direction;
....................
.................... direction = bit_test(endpoint,7);
*
09B4: MOVLB 6
09B6: BCF xFE.0
09B8: BTFSC xFD.7
09BA: BSF xFE.0
.................... endpoint &= 0x7F;
09BC: BCF xFD.7
....................
.................... if (direction)
09BE: BTFSS xFE.0
09C0: BRA 09FC
.................... {
.................... EP_BDxST_I(endpoint) = 0x84;
09C2: MOVLB 7
09C4: CLRF x49
09C6: MOVFF 6FD,748
09CA: CLRF x4B
09CC: MOVLW 08
09CE: MOVWF x4A
09D0: MOVLB 0
09D2: RCALL 02BA
09D4: MOVFF 02,700
09D8: MOVFF 01,6FF
09DC: MOVLW 04
09DE: MOVLB 6
09E0: ADDWF xFF,F
09E2: MOVLW 00
09E4: MOVLB 7
09E6: ADDWFC x00,F
09E8: MOVFF 6FF,FE9
09EC: MOVLW 04
09EE: MOVLB 7
09F0: ADDWF x00,W
09F2: MOVWF FEA
09F4: MOVLW 84
09F6: MOVWF FEF
.................... }
.................... else
09F8: BRA 0A1E
09FA: MOVLB 6
.................... {
.................... EP_BDxST_O(endpoint) = 0x84;
09FC: MOVLB 7
09FE: CLRF x49
0A00: MOVFF 6FD,748
0A04: CLRF x4B
0A06: MOVLW 08
0A08: MOVWF x4A
0A0A: MOVLB 0
0A0C: RCALL 02BA
0A0E: MOVFF 01,FE9
0A12: MOVLW 04
0A14: MOVLB 7
0A16: ADDWF 02,W
0A18: MOVWF FEA
0A1A: MOVLW 84
0A1C: MOVWF FEF
.................... }
.................... }
0A1E: MOVLB 0
0A20: GOTO 0AD6 (RETURN)
....................
.................... // see usb_hw_layer.h for documentation
.................... void usb_unstall_ep(int8 endpoint)
.................... {
.................... int1 direction;
....................
.................... direction = bit_test(endpoint,7);
*
0946: MOVLB 6
0948: BCF xFE.0
094A: BTFSC xFD.7
094C: BSF xFE.0
.................... endpoint &= 0x7F;
094E: BCF xFD.7
....................
.................... if (direction)
0950: BTFSS xFE.0
0952: BRA 098E
.................... {
.................... #if USB_IGNORE_RX_DTS
.................... EP_BDxST_I(endpoint) = 0x80;
.................... #else
.................... EP_BDxST_I(endpoint) = 0x88;
0954: MOVLB 7
0956: CLRF x49
0958: MOVFF 6FD,748
095C: CLRF x4B
095E: MOVLW 08
0960: MOVWF x4A
0962: MOVLB 0
0964: RCALL 02BA
0966: MOVFF 02,700
096A: MOVFF 01,6FF
096E: MOVLW 04
0970: MOVLB 6
0972: ADDWF xFF,F
0974: MOVLW 00
0976: MOVLB 7
0978: ADDWFC x00,F
097A: MOVFF 6FF,FE9
097E: MOVLW 04
0980: MOVLB 7
0982: ADDWF x00,W
0984: MOVWF FEA
0986: MOVLW 88
0988: MOVWF FEF
.................... #endif
.................... }
.................... else
098A: BRA 09AE
098C: MOVLB 6
.................... {
.................... EP_BDxST_O(endpoint) = 0x00;
098E: MOVLB 7
0990: CLRF x49
0992: MOVFF 6FD,748
0996: CLRF x4B
0998: MOVLW 08
099A: MOVWF x4A
099C: MOVLB 0
099E: RCALL 02BA
09A0: MOVFF 01,FE9
09A4: MOVLW 04
09A6: MOVLB 7
09A8: ADDWF 02,W
09AA: MOVWF FEA
09AC: CLRF FEF
.................... }
.................... }
09AE: MOVLB 0
09B0: GOTO 0AC6 (RETURN)
....................
.................... // see usb_hw_layer.h for documentation
.................... int1 usb_endpoint_stalled(int8 endpoint)
.................... {
.................... int1 direction;
.................... int8 st;
....................
.................... direction = bit_test(endpoint,7);
*
0A24: MOVLB 6
0A26: BCF xFE.0
0A28: BTFSC xFD.7
0A2A: BSF xFE.0
.................... endpoint &= 0x7F;
0A2C: BCF xFD.7
....................
.................... if (direction)
0A2E: BTFSS xFE.0
0A30: BRA 0A68
.................... {
.................... st=EP_BDxST_I(endpoint);
0A32: MOVLB 7
0A34: CLRF x49
0A36: MOVFF 6FD,748
0A3A: CLRF x4B
0A3C: MOVLW 08
0A3E: MOVWF x4A
0A40: MOVLB 0
0A42: RCALL 02BA
0A44: MOVFF 02,701
0A48: MOVFF 01,700
0A4C: MOVLW 04
0A4E: MOVLB 7
0A50: ADDWF x00,F
0A52: MOVLW 00
0A54: ADDWFC x01,F
0A56: MOVFF 700,FE9
0A5A: MOVLW 04
0A5C: ADDWF x01,W
0A5E: MOVWF FEA
0A60: MOVFF FEF,6FF
0A64: MOVLB 6
.................... }
.................... else
0A66: BRA 0A8C
.................... {
.................... st=EP_BDxST_O(endpoint);
0A68: MOVLB 7
0A6A: CLRF x49
0A6C: MOVFF 6FD,748
0A70: CLRF x4B
0A72: MOVLW 08
0A74: MOVWF x4A
0A76: MOVLB 0
0A78: RCALL 02BA
0A7A: MOVLB 7
0A7C: MOVFF 01,FE9
0A80: MOVLW 04
0A82: ADDWF 02,W
0A84: MOVWF FEA
0A86: MOVFF FEF,6FF
0A8A: MOVLB 6
.................... }
....................
.................... return(bit_test(st,7) && bit_test(st,2));
0A8C: BTFSS xFF.7
0A8E: BRA 0A94
0A90: BTFSC xFF.2
0A92: BRA 0A98
0A94: MOVLW 00
0A96: BRA 0A9A
0A98: MOVLW 01
0A9A: MOVWF 01
.................... }
0A9C: MOVLB 0
0A9E: GOTO 0AEE (RETURN)
....................
.................... // see usb_hw_layer.h for documentation
.................... void usb_set_address(int8 address)
.................... {
.................... UADDR = address;
*
0F60: MOVFF 6FE,F6E
....................
.................... if (address)
0F64: MOVLB 6
0F66: MOVF xFE,F
0F68: BZ 0F70
.................... {
.................... usb_state = USB_STATE_ADDRESS;
0F6A: MOVLW 04
0F6C: MOVWF 24
.................... }
.................... else
0F6E: BRA 0F74
.................... {
.................... usb_state = USB_STATE_POWERED;
0F70: MOVLW 02
0F72: MOVWF 24
.................... }
.................... }
0F74: MOVLB 0
0F76: GOTO 0F84 (RETURN)
....................
.................... // see usb_hw_layer.h for documentation
.................... void usb_set_configured(int8 config)
.................... {
.................... int8 en;
.................... int16 addy;
.................... int8 new_uep;
.................... int16 len;
.................... int8 i;
....................
.................... if (config == 0)
*
055C: MOVLB 6
055E: MOVF xFD,F
0560: BNZ 056E
.................... {
.................... // if config=0 then set addressed state
.................... usb_state = USB_STATE_ADDRESS;
0562: MOVLW 04
0564: MOVWF 24
.................... usb_disable_endpoints();
0566: MOVLB 0
0568: RCALL 033E
.................... }
.................... else
056A: BRA 0786
056C: MOVLB 6
.................... {
.................... // else set configed state
.................... usb_state = USB_STATE_CONFIGURED;
056E: MOVLW 05
0570: MOVWF 24
.................... addy = (int16)USB_DATA_BUFFER_LOCATION+(2*USB_MAX_EP0_PACKET_LENGTH);
0572: MOVLW 04
0574: MOVLB 7
0576: MOVWF x00
0578: MOVLW 98
057A: MOVLB 6
057C: MOVWF xFF
.................... for (en=1; en<16; en++)
057E: MOVLW 01
0580: MOVWF xFE
0582: MOVF xFE,W
0584: SUBLW 0F
0586: BTFSS FD8.0
0588: BRA 0786
.................... {
.................... // enable and config endpoints based upon user configuration
.................... usb_disable_endpoint(en);
058A: MOVFF 6FE,706
058E: MOVLB 0
0590: RCALL 02DC
.................... new_uep = 0;
0592: MOVLB 7
0594: CLRF x01
.................... if (usb_ep_rx_type[en] != USB_ENABLE_DISABLED)
0596: CLRF 03
0598: MOVLB 6
059A: MOVF xFE,W
059C: MOVFF FF2,705
05A0: BCF FF2.7
05A2: MOVLB 0
05A4: RCALL 00CA
05A6: MOVLB 7
05A8: BTFSC x05.7
05AA: BSF FF2.7
05AC: SUBLW FF
05AE: BZ 0692
.................... {
.................... new_uep = 0x04;
05B0: MOVLW 04
05B2: MOVWF x01
.................... len = usb_ep_rx_size[en];
05B4: BCF FD8.0
05B6: MOVLB 6
05B8: RLCF xFE,W
05BA: CLRF 03
05BC: MOVFF FF2,705
05C0: BCF FF2.7
05C2: MOVLB 0
05C4: RCALL 011A
05C6: TBLRD*+
05C8: MOVFF FF5,03
05CC: MOVLB 7
05CE: BTFSC x05.7
05D0: BSF FF2.7
05D2: MOVWF x02
05D4: MOVFF 03,703
.................... EP_BDxCNT_O(en) = len;
05D8: CLRF x49
05DA: MOVFF 6FE,748
05DE: CLRF x4B
05E0: MOVLW 08
05E2: MOVWF x4A
05E4: MOVLB 0
05E6: RCALL 02BA
05E8: MOVFF 01,705
05EC: MOVLW 01
05EE: MOVLB 7
05F0: ADDWF 01,W
05F2: MOVWF 01
05F4: MOVLW 00
05F6: ADDWFC 02,W
05F8: MOVWF 03
05FA: MOVFF 01,FE9
05FE: MOVLW 04
0600: ADDWF 03,W
0602: MOVWF FEA
0604: MOVFF 702,FEF
.................... EP_BDxADR_O(en) = addy;
0608: CLRF x49
060A: MOVFF 6FE,748
060E: CLRF x4B
0610: MOVLW 08
0612: MOVWF x4A
0614: MOVLB 0
0616: RCALL 02BA
0618: MOVFF 01,705
061C: MOVLW 02
061E: MOVLB 7
0620: ADDWF 01,W
0622: MOVWF 01
0624: MOVLW 00
0626: ADDWFC 02,W
0628: MOVWF 03
062A: MOVFF 01,FE9
062E: MOVLW 04
0630: ADDWF 03,W
0632: MOVWF FEA
0634: MOVFF 700,FEC
0638: MOVF FED,F
063A: MOVFF 6FF,FEF
.................... addy += usb_ep_rx_size[en];
063E: BCF FD8.0
0640: MOVLB 6
0642: RLCF xFE,W
0644: CLRF 03
0646: MOVFF FF2,705
064A: BCF FF2.7
064C: MOVLB 0
064E: RCALL 011A
0650: TBLRD*+
0652: MOVFF FF5,03
0656: MOVLB 7
0658: BTFSC x05.7
065A: BSF FF2.7
065C: MOVLB 6
065E: ADDWF xFF,F
0660: MOVF 03,W
0662: MOVLB 7
0664: ADDWFC x00,F
.................... #if USB_IGNORE_RX_DTS
.................... i = 0x80;
.................... #else
.................... i = 0x88;
0666: MOVLW 88
0668: MOVWF x04
.................... #endif
.................... if (bit_test(len,8)) {bit_set(i,0);}
066A: BTFSC x03.0
066C: BSF x04.0
.................... if (bit_test(len,9)) {bit_set(i,1);}
066E: BTFSC x03.1
0670: BSF x04.1
.................... EP_BDxST_O(en) = i;
0672: CLRF x49
0674: MOVFF 6FE,748
0678: CLRF x4B
067A: MOVLW 08
067C: MOVWF x4A
067E: MOVLB 0
0680: RCALL 02BA
0682: MOVLB 7
0684: MOVFF 01,FE9
0688: MOVLW 04
068A: ADDWF 02,W
068C: MOVWF FEA
068E: MOVFF 704,FEF
.................... }
.................... if (usb_ep_tx_type[en] != USB_ENABLE_DISABLED)
0692: CLRF 03
0694: MOVLB 6
0696: MOVF xFE,W
0698: MOVFF FF2,705
069C: BCF FF2.7
069E: MOVLB 0
06A0: RCALL 00AA
06A2: MOVLB 7
06A4: BTFSC x05.7
06A6: BSF FF2.7
06A8: SUBLW FF
06AA: BZ 0748
.................... {
.................... new_uep |= 0x02;
06AC: BSF x01.1
.................... EP_BDxADR_I(en) = addy;
06AE: CLRF x49
06B0: MOVFF 6FE,748
06B4: CLRF x4B
06B6: MOVLW 08
06B8: MOVWF x4A
06BA: MOVLB 0
06BC: RCALL 02BA
06BE: MOVFF 02,706
06C2: MOVFF 01,705
06C6: MOVLW 04
06C8: MOVLB 7
06CA: ADDWF x05,F
06CC: MOVLW 00
06CE: ADDWFC x06,F
06D0: MOVLW 02
06D2: ADDWF x05,W
06D4: MOVWF 01
06D6: MOVLW 00
06D8: ADDWFC x06,W
06DA: MOVWF 03
06DC: MOVFF 01,FE9
06E0: MOVLW 04
06E2: ADDWF 03,W
06E4: MOVWF FEA
06E6: MOVFF 700,FEC
06EA: MOVF FED,F
06EC: MOVFF 6FF,FEF
.................... addy += usb_ep_tx_size[en];
06F0: BCF FD8.0
06F2: MOVLB 6
06F4: RLCF xFE,W
06F6: CLRF 03
06F8: MOVFF FF2,705
06FC: BCF FF2.7
06FE: MOVLB 0
0700: RCALL 00EA
0702: TBLRD*+
0704: MOVFF FF5,03
0708: MOVLB 7
070A: BTFSC x05.7
070C: BSF FF2.7
070E: MOVLB 6
0710: ADDWF xFF,F
0712: MOVF 03,W
0714: MOVLB 7
0716: ADDWFC x00,F
.................... EP_BDxST_I(en) = 0x40;
0718: CLRF x49
071A: MOVFF 6FE,748
071E: CLRF x4B
0720: MOVLW 08
0722: MOVWF x4A
0724: MOVLB 0
0726: RCALL 02BA
0728: MOVFF 02,706
072C: MOVFF 01,705
0730: MOVLW 04
0732: MOVLB 7
0734: ADDWF x05,F
0736: MOVLW 00
0738: ADDWFC x06,F
073A: MOVFF 705,FE9
073E: MOVLW 04
0740: ADDWF x06,W
0742: MOVWF FEA
0744: MOVLW 40
0746: MOVWF FEF
.................... }
.................... if (new_uep == 0x06) {new_uep = 0x0E;}
0748: MOVF x01,W
074A: SUBLW 06
074C: BNZ 0752
074E: MOVLW 0E
0750: MOVWF x01
.................... if (usb_ep_tx_type[en] != USB_ENABLE_ISOCHRONOUS) {new_uep |= 0x10;}
0752: CLRF 03
0754: MOVLB 6
0756: MOVF xFE,W
0758: MOVFF FF2,705
075C: BCF FF2.7
075E: MOVLB 0
0760: RCALL 00AA
0762: MOVLB 7
0764: BTFSC x05.7
0766: BSF FF2.7
0768: SUBLW 01
076A: BTFSS FD8.2
076C: BSF x01.4
....................
.................... UEP(en) = new_uep;
076E: CLRF 03
0770: MOVLB 6
0772: MOVF xFE,W
0774: ADDLW 70
0776: MOVWF FE9
0778: MOVLW 0F
077A: ADDWFC 03,W
077C: MOVWF FEA
077E: MOVFF 701,FEF
.................... }
0782: INCF xFE,F
0784: BRA 0582
0786: MOVLB 0
.................... }
.................... }
0788: GOTO 082C (RETURN)
....................
.................... // see usb_hw_layer.h for documentation
.................... void usb_disable_endpoint(int8 en)
.................... {
.................... UEP(en) = ENDPT_DISABLED;
*
02DC: CLRF 03
02DE: MOVLB 7
02E0: MOVF x06,W
02E2: ADDLW 70
02E4: MOVWF FE9
02E6: MOVLW 0F
02E8: ADDWFC 03,W
02EA: MOVWF FEA
02EC: CLRF FEF
.................... EP_BDxST_O(en) = 0; //clear state, deque if necessary
02EE: CLRF x49
02F0: MOVFF 706,748
02F4: CLRF x4B
02F6: MOVLW 08
02F8: MOVWF x4A
02FA: MOVLB 0
02FC: RCALL 02BA
02FE: MOVLB 7
0300: MOVFF 01,FE9
0304: MOVLW 04
0306: ADDWF 02,W
0308: MOVWF FEA
030A: CLRF FEF
.................... EP_BDxST_I(en) = 0; //clear state, deque if necessary
030C: CLRF x49
030E: MOVFF 706,748
0312: CLRF x4B
0314: MOVLW 08
0316: MOVWF x4A
0318: MOVLB 0
031A: RCALL 02BA
031C: MOVFF 02,708
0320: MOVFF 01,707
0324: MOVLW 04
0326: MOVLB 7
0328: ADDWF x07,F
032A: MOVLW 00
032C: ADDWFC x08,F
032E: MOVFF 707,FE9
0332: MOVLW 04
0334: ADDWF x08,W
0336: MOVWF FEA
0338: CLRF FEF
.................... }
033A: MOVLB 0
033C: RETLW 00
....................
.................... // see usb_hw_layer.h for documentation
.................... void usb_disable_endpoints(void)
.................... {
.................... int8 i;
....................
.................... for (i=1; i<16; i++)
033E: MOVLW 01
0340: MOVLB 7
0342: MOVWF x05
0344: MOVF x05,W
0346: SUBLW 0F
0348: BNC 0358
.................... usb_disable_endpoint(i);
034A: MOVFF 705,706
034E: MOVLB 0
0350: RCALL 02DC
0352: MOVLB 7
0354: INCF x05,F
0356: BRA 0344
....................
.................... //__usb_kbhit_status=0;
.................... }
0358: MOVLB 0
035A: RETLW 00
....................
.................... /// END Hardware layer functions required by USB.C
....................
....................
.................... /// BEGIN USB Interrupt Service Routine
....................
.................... static void usb_clear_trn(void)
.................... {
.................... UIR_TRN = 0;
*
03AA: BCF F68.3
.................... delay_cycles(6);
03AC: BRA 03AE
03AE: BRA 03B0
03B0: BRA 03B2
.................... }
03B2: RETLW 00
....................
.................... /*****************************************************************************
.................... /* usb_handle_interrupt()
.................... /*
.................... /* Summary: Checks the interrupt, and acts upon event. Processing finished
.................... /* tokens is the majority of this code, and is handled by usb.c
.................... /*
.................... /* NOTE: If you wish to change to a polling method (and not an interrupt
.................... /* method), then you must call this function rapidly. If there is more
.................... /* than 10ms latency the PC may think the USB device is stalled and
.................... /* disable it.
.................... /* To switch to a polling method, remove the #int_usb line above this
.................... /* fuction. Also, goto usb_init() and remove the code that enables the
.................... /* USB interrupt.
.................... /******************************************************************************/
.................... #int_usb
.................... void usb_isr()
.................... {
.................... int8 TRNAttempts;
....................
.................... if (usb_state == USB_STATE_DETACHED) return; //should never happen, though
*
1274: MOVF 24,F
1276: BNZ 127A
1278: BRA 12EE
.................... if (UIR)
127A: MOVF F68,F
127C: BZ 12EE
.................... {
.................... debug_usb(debug_putc,"\r\n\n[%X] ",UIR);
....................
.................... //activity detected. (only enable after sleep)
.................... if (UIR_ACTV && UIE_ACTV) {usb_isr_activity();}
127E: BTFSS F68.2
1280: BRA 128A
1282: BTFSS F69.2
1284: BRA 128A
1286: GOTO 0274
....................
.................... if (UCON_SUSPND) return;
128A: BTFSS F6D.1
128C: BRA 1290
128E: BRA 12EE
....................
.................... if (UIR_STALL && UIE_STALL) {usb_isr_stall();} //a stall handshake was sent
1290: BTFSS F68.5
1292: BRA 129C
1294: BTFSS F69.5
1296: BRA 129C
1298: GOTO 02A4
....................
.................... if (UIR_UERR && UIE_UERR) {usb_isr_uerr();} //error has been detected
129C: BTFSS F68.1
129E: BRA 12A8
12A0: BTFSS F69.1
12A2: BRA 12A8
12A4: GOTO 02B2
....................
.................... if (UIR_URST && UIE_URST) {usb_isr_rst();} //usb reset has been detected
12A8: BTFSS F68.0
12AA: BRA 12B4
12AC: BTFSS F69.0
12AE: BRA 12B4
12B0: GOTO 03B4
....................
.................... if (UIR_IDLE && UIE_IDLE) {usb_isr_uidle();} //idle time, we can go to sleep
12B4: BTFSS F68.4
12B6: BRA 12C0
12B8: BTFSS F69.4
12BA: BRA 12C0
12BC: GOTO 03DE
....................
.................... if (UIR_SOF && UIE_SOF) {usb_isr_sof();}
12C0: BTFSS F68.6
12C2: BRA 12CC
12C4: BTFSS F69.6
12C6: BRA 12CC
12C8: GOTO 03E8
....................
.................... TRNAttempts = 0;
12CC: MOVLB 6
12CE: CLRF xFA
.................... do
.................... {
.................... if (UIR_TRN && UIE_TRN)
12D0: BTFSS F68.3
12D2: BRA 12E0
12D4: BTFSS F69.3
12D6: BRA 12E0
.................... {
.................... usb_isr_tok_dne();
12D8: MOVLB 0
12DA: BRA 108A
.................... }
.................... else
12DC: BRA 12E2
12DE: MOVLB 6
.................... break;
12E0: BRA 12EC
.................... } while (TRNAttempts++ < 4);
12E2: MOVLB 6
12E4: MOVF xFA,W
12E6: INCF xFA,F
12E8: SUBLW 03
12EA: BC 12D0
12EC: MOVLB 0
.................... }
.................... }
....................
.................... // SOF interrupt not handled. user must add this depending on application
12EE: BCF FA1.5
12F0: GOTO 0064
.................... void usb_isr_sof(void)
.................... {
.................... debug_usb(debug_putc, "\r\nSOF");
....................
.................... UIR_SOF = 0;
*
03E8: BCF F68.6
.................... }
03EA: GOTO 12CC (RETURN)
....................
.................... /*****************************************************************************
.................... /* usb_isr_rst()
.................... /*
.................... /* Summary: The host (computer) sent us a RESET command. Reset USB device
.................... /* and token handler code to initial state.
.................... /*
.................... /******************************************************************************/
.................... void usb_isr_rst(void)
.................... {
.................... debug_usb(debug_putc,"R");
....................
.................... UEIR = 0;
*
03B4: CLRF F6A
.................... UIR = 0;
03B6: CLRF F68
.................... UEIE = 0x9F;
03B8: MOVLW 9F
03BA: MOVWF F6B
.................... UIE = STANDARD_INTS & ~__USB_UIF_ACTIVE;
03BC: MOVLW 3D
03BE: MOVWF F69
....................
.................... UADDR = 0;
03C0: CLRF F6E
....................
.................... usb_disable_endpoints();
03C2: RCALL 033E
....................
.................... usb_token_reset();
03C4: RCALL 037E
....................
.................... UEP(0) = ENDPT_CONTROL | 0x10;
03C6: MOVLW 16
03C8: MOVWF F70
....................
.................... while (UIR_TRN)
.................... {
03CA: BTFSS F68.3
03CC: BRA 03D2
.................... usb_clear_trn();
03CE: RCALL 03AA
.................... }
03D0: BRA 03CA
....................
.................... UCON_PKTDIS = 0; //SIE token and packet processing enabled
03D2: BCF F6D.4
....................
.................... usb_init_ep0_setup();
03D4: RCALL 0284
....................
.................... usb_state = USB_STATE_DEFAULT; //put usb mcu into default state
03D6: MOVLW 03
03D8: MOVWF 24
.................... }
03DA: GOTO 12B4 (RETURN)
....................
.................... /*****************************************************************************
.................... /* usb_init_ep0_setup()
.................... /*
.................... /* Summary: Configure EP0 to receive setup packets
.................... /*
.................... /*****************************************************************************/
.................... void usb_init_ep0_setup(void)
.................... {
.................... EP_BDxCNT_O(0) = USB_MAX_EP0_PACKET_LENGTH;
*
0284: MOVLW 40
0286: MOVLB 4
0288: MOVWF x01
.................... EP_BDxADR_O(0) = USB_DATA_BUFFER_LOCATION;
028A: MOVLW 04
028C: MOVWF x03
028E: MOVLW 18
0290: MOVWF x02
.................... #if USB_IGNORE_RX_DTS
.................... EP_BDxST_O(0) = 0x80; //give control to SIE, data toggle synch off
.................... #else
.................... EP_BDxST_O(0) = 0x88; //give control to SIE, DATA0, data toggle synch on
0292: MOVLW 88
0294: MOVWF x00
.................... #endif
....................
.................... EP_BDxST_I(0) = 0;
0296: CLRF x04
.................... EP_BDxADR_I(0) = USB_DATA_BUFFER_LOCATION + (int16)USB_MAX_EP0_PACKET_LENGTH;
0298: MOVLW 04
029A: MOVWF x07
029C: MOVLW 58
029E: MOVWF x06
.................... }
02A0: MOVLB 0
02A2: RETLW 00
....................
.................... /*******************************************************************************
.................... /* usb_isr_uerr()
.................... /*
.................... /* Summary: The USB peripheral had an error. If user specified, error counter
.................... /* will incerement. If having problems check the status of these 8 bytes.
.................... /*
.................... /* NOTE: This code is not enabled by default.
.................... /********************************************************************************/
.................... void usb_isr_uerr(void)
.................... {
.................... #if USB_USE_ERROR_COUNTER
.................... int ints;
.................... #endif
....................
.................... debug_usb(debug_putc,"E %X ",UEIR);
....................
.................... #if USB_USE_ERROR_COUNTER
.................... ints=UEIR & UEIE; //mask off the flags with the ones that are enabled
....................
.................... if ( bit_test(ints,0) )
.................... {
.................... //increment pid_error counter
.................... debug_usb(debug_putc,"PID ");
.................... ERROR_COUNTER[0]++;
.................... }
....................
.................... if ( bit_test(ints,1) )
.................... {
.................... //increment crc5 error counter
.................... debug_usb(debug_putc,"CRC5 ");
.................... ERROR_COUNTER[1]++;
.................... }
....................
.................... if ( bit_test(ints,2) )
.................... {
.................... //increment crc16 error counter
.................... debug_usb(debug_putc,"CRC16 ");
.................... ERROR_COUNTER[2]++;
.................... }
....................
.................... if ( bit_test(ints,3) )
.................... {
.................... //increment dfn8 error counter
.................... debug_usb(debug_putc,"DFN8 ");
.................... ERROR_COUNTER[3]++;
.................... }
....................
.................... if ( bit_test(ints,4) )
.................... {
.................... //increment bto error counter
.................... debug_usb(debug_putc,"BTO ");
.................... ERROR_COUNTER[4]++;
.................... }
....................
.................... if ( bit_test(ints,7) )
.................... {
.................... //increment bts error counter
.................... debug_usb(debug_putc,"BTS ");
.................... ERROR_COUNTER[5]++;
.................... }
.................... #endif
....................
.................... UEIR = 0;
*
02B2: CLRF F6A
.................... UIR_UERR = 0;
02B4: BCF F68.1
.................... }
02B6: GOTO 12A8 (RETURN)
....................
.................... /*****************************************************************************
.................... /* usb_isr_uidle()
.................... /*
.................... /* Summary: USB peripheral detected IDLE. Put the USB peripheral to sleep.
.................... /*
.................... /*****************************************************************************/
.................... void usb_isr_uidle(void)
.................... {
.................... debug_usb(debug_putc, "I");
....................
.................... UIE_ACTV = 1; //enable activity interrupt flag. (we are now suspended until we get an activity interrupt. nice)
*
03DE: BSF F69.2
.................... UIR_IDLE = 0; //clear idle interrupt flag
03E0: BCF F68.4
.................... UCON_SUSPND = 1; //set suspend. we are now suspended
03E2: BSF F6D.1
.................... }
03E4: GOTO 12C0 (RETURN)
....................
....................
.................... /******************************************************************************
.................... /* usb_isr_activity()
.................... /*
.................... /* Summary: USB peripheral detected activity on the USB device. Wake-up the USB
.................... /* peripheral.
.................... /*
.................... /*****************************************************************************/
.................... void usb_isr_activity(void)
.................... {
.................... debug_usb(debug_putc, "A");
....................
.................... UCON_SUSPND = 0; //turn off low power suspending
*
0274: BCF F6D.1
.................... UIE_ACTV = 0; //clear activity interupt enabling
0276: BCF F69.2
....................
.................... while(UIR_ACTV)
.................... UIR_ACTV = 0;
0278: BTFSS F68.2
027A: BRA 0280
027C: BCF F68.2
027E: BRA 0278
.................... }
0280: GOTO 128A (RETURN)
....................
.................... /******************************************************************************
.................... /* usb_isr_stall()
.................... /*
.................... /* Summary: Stall handshake detected.
.................... /*
.................... /*****************************************************************************/
.................... void usb_isr_stall(void)
.................... {
.................... debug_usb(debug_putc, "S");
....................
....................
.................... if (bit_test(UEP(0),0))
*
02A4: BTFSS F70.0
02A6: BRA 02AC
.................... {
.................... usb_init_ep0_setup();
02A8: RCALL 0284
.................... bit_clear(UEP(0), 0);
02AA: BCF F70.0
.................... }
....................
.................... UIR_STALL = 0;
02AC: BCF F68.5
.................... }
02AE: GOTO 129C (RETURN)
....................
.................... // see usb_hw_layer.h for documentation
.................... void usb_request_send_response(unsigned int8 len) {__setup_0_tx_size = len;}
*
03EE: MOVFF 700,25
03F2: RETLW 00
.................... void usb_request_get_data(void) {__setup_0_tx_size = 0xFE;}
*
0B0C: MOVLW FE
0B0E: MOVWF 25
0B10: RETLW 00
.................... void usb_request_stall(void) {__setup_0_tx_size = 0xFF;}
*
03F4: MOVLW FF
03F6: MOVWF 25
03F8: RETLW 00
....................
.................... /*****************************************************************************
.................... /* usb_isr_tok_dne()
.................... /*
.................... /* Summary: A Token (IN/OUT/SETUP) has been received by the USB peripheral.
.................... /* If a setup token on EP0 was received, run the chapter 9 code and
.................... /* handle the request.
.................... /* If an IN token on EP0 was received, continue transmitting any
.................... /* unfinished requests that may take more than one packet to transmit
.................... /* (if necessary).
.................... /* If an OUT token on any other EP was received, mark that EP as ready
.................... /* for a usb_get_packet().
.................... /* Does not handle any IN or OUT tokens on EP0.
.................... /*
.................... /*****************************************************************************/
.................... void usb_isr_tok_dne(void)
.................... {
.................... int8 en;
....................
.................... en = USTAT>>3;
*
108A: RRCF F6C,W
108C: MOVLB 6
108E: MOVWF xFB
1090: RRCF xFB,F
1092: RRCF xFB,F
1094: MOVLW 1F
1096: ANDWF xFB,F
....................
.................... debug_usb(debug_putc, "T ");
.................... debug_usb(debug_putc, "%X ", USTAT);
....................
.................... if (USTAT == USTAT_OUT_SETUP_E0)
1098: MOVF F6C,F
109A: BNZ 1138
.................... {
.................... //new out or setup token in the buffer
.................... int8 pidKey;
....................
.................... debug_usb(debug_putc,"%X ", EP_BDxST_O(0));
....................
.................... pidKey = EP_BDxST_O(0) & 0x3C; //save PID
109C: MOVLB 4
109E: MOVF x00,W
10A0: ANDLW 3C
10A2: MOVLB 6
10A4: MOVWF xFC
....................
.................... EP_BDxST_O(0) &= 0x43; //clear pid, prevent bdstal/pid confusion
10A6: MOVLW 43
10A8: MOVLB 4
10AA: ANDWF x00,F
.................... usb_clear_trn();
10AC: MOVLB 0
10AE: CALL 03AA
....................
.................... if (pidKey == USB_PIC_PID_SETUP)
10B2: MOVLB 6
10B4: MOVF xFC,W
10B6: SUBLW 34
10B8: BNZ 10FE
.................... {
.................... EP_BDxST_I(0)=0; // return the in buffer to us (dequeue any pending requests)
10BA: MOVLB 4
10BC: CLRF x04
....................
.................... debug_usb(debug_putc,"(%U) ", EP_BDxCNT_O(0));
.................... debug_display_ram(EP_BDxCNT_O(0), usb_ep0_rx_buffer);
....................
.................... usb_isr_tok_setup_dne();
10BE: MOVLB 0
10C0: BRA 0BC0
....................
.................... UCON_PKTDIS=0; // UCON,PKT_DIS ; Assuming there is nothing to dequeue, clear the packet disable bit
10C2: BCF F6D.4
....................
.................... //if setup_0_tx_size==0xFF - stall ep0 (unhandled request) (see usb_request_stall())
.................... //if setup_0_tx_size==0xFE - get EP0OUT ready for a data packet, leave EP0IN alone (see usb_request_get_data())
.................... //else setup_0_tx_size=size of response, get EP0OUT ready for a setup packet, mark EPOIN ready for transmit (see usb_request_send_response())
.................... if (__setup_0_tx_size == 0xFF)
10C4: INCFSZ 25,W
10C6: BRA 10D6
.................... usb_flush_out(0, USB_DTS_STALL);
10C8: MOVLB 6
10CA: CLRF xFD
10CC: MOVLW 03
10CE: MOVWF xFE
10D0: MOVLB 0
10D2: RCALL 0BEA
.................... else
10D4: BRA 10FA
.................... {
.................... usb_flush_out(0, USB_DTS_TOGGLE);
10D6: MOVLB 6
10D8: CLRF xFD
10DA: MOVLW 02
10DC: MOVWF xFE
10DE: MOVLB 0
10E0: RCALL 0BEA
.................... if (__setup_0_tx_size != 0xFE)
10E2: MOVF 25,W
10E4: SUBLW FE
10E6: BZ 10FA
.................... usb_flush_in(0 ,__setup_0_tx_size, USB_DTS_USERX);
10E8: MOVLB 7
10EA: CLRF x42
10EC: CLRF x44
10EE: MOVFF 25,743
10F2: MOVLW 04
10F4: MOVWF x45
10F6: MOVLB 0
10F8: RCALL 0D5C
.................... }
.................... //why was this here?
.................... //UCON_PKTDIS=0; // UCON,PKT_DIS ; Assuming there is nothing to dequeue, clear the packet disable bit
.................... }
.................... else if (pidKey == USB_PIC_PID_OUT)
10FA: BRA 1134
10FC: MOVLB 6
10FE: MOVF xFC,W
1100: SUBLW 04
1102: BNZ 1136
.................... {
.................... usb_isr_tok_out_dne(0);
1104: CLRF xFD
1106: MOVLB 0
1108: RCALL 0F42
.................... usb_flush_out(0, USB_DTS_TOGGLE);
110A: MOVLB 6
110C: CLRF xFD
110E: MOVLW 02
1110: MOVWF xFE
1112: MOVLB 0
1114: RCALL 0BEA
.................... if ((__setup_0_tx_size!=0xFE) && (__setup_0_tx_size!=0xFF))
1116: MOVF 25,W
1118: SUBLW FE
111A: BZ 1134
111C: INCFSZ 25,W
111E: BRA 1122
1120: BRA 1134
.................... {
.................... usb_flush_in(0,__setup_0_tx_size,USB_DTS_DATA1); //send response (usually a 0len)
1122: MOVLB 7
1124: CLRF x42
1126: CLRF x44
1128: MOVFF 25,743
112C: MOVLW 01
112E: MOVWF x45
1130: MOVLB 0
1132: RCALL 0D5C
1134: MOVLB 6
.................... }
.................... }
.................... }
.................... else if (USTAT == USTAT_IN_E0)
1136: BRA 126E
1138: MOVF F6C,W
113A: SUBLW 04
113C: BNZ 1178
.................... {
.................... //pic -> host transfer completed
.................... EP_BDxST_I(0) = EP_BDxST_I(0) & 0x43; //clear up any BDSTAL confusion
113E: MOVLW 43
1140: MOVLB 4
1142: ANDWF x04,F
.................... usb_clear_trn();
1144: MOVLB 0
1146: CALL 03AA
.................... __setup_0_tx_size = 0xFF;
114A: MOVLW FF
114C: MOVWF 25
.................... usb_isr_tok_in_dne(0);
114E: MOVLB 6
1150: CLRF xFD
1152: MOVLB 0
1154: RCALL 1058
.................... if (__setup_0_tx_size!=0xFF)
1156: INCFSZ 25,W
1158: BRA 115C
115A: BRA 1170
.................... usb_flush_in(0, __setup_0_tx_size, USB_DTS_TOGGLE);
115C: MOVLB 7
115E: CLRF x42
1160: CLRF x44
1162: MOVFF 25,743
1166: MOVLW 02
1168: MOVWF x45
116A: MOVLB 0
116C: RCALL 0D5C
.................... else
116E: BRA 1174
.................... usb_init_ep0_setup();
1170: CALL 0284
.................... }
.................... else
1174: BRA 126C
1176: MOVLB 6
.................... {
.................... if (!bit_test(USTAT, 2))
1178: BTFSC F6C.2
117A: BRA 11E6
.................... {
.................... EP_BDxST_O(en) = EP_BDxST_O(en) & 0x43; //clear up any BDSTAL confusion
117C: MOVLB 7
117E: CLRF x49
1180: MOVFF 6FB,748
1184: CLRF x4B
1186: MOVLW 08
1188: MOVWF x4A
118A: MOVLB 0
118C: CALL 02BA
1190: MOVFF 01,6FD
1194: MOVLB 6
1196: MOVFF 01,01
119A: MOVLW 04
119C: ADDWF 02,W
119E: MOVWF 03
11A0: MOVFF 01,6FD
11A4: MOVWF xFE
11A6: MOVLB 7
11A8: CLRF x49
11AA: MOVFF 6FB,748
11AE: CLRF x4B
11B0: MOVLW 08
11B2: MOVWF x4A
11B4: MOVLB 0
11B6: CALL 02BA
11BA: MOVFF 01,FE9
11BE: MOVLW 04
11C0: MOVLB 7
11C2: ADDWF 02,W
11C4: MOVWF FEA
11C6: MOVF FEF,W
11C8: ANDLW 43
11CA: MOVLB 6
11CC: MOVFF 6FE,FEA
11D0: MOVFF 6FD,FE9
11D4: MOVWF FEF
.................... usb_clear_trn();
11D6: MOVLB 0
11D8: CALL 03AA
.................... usb_isr_tok_out_dne(en);
11DC: MOVFF 6FB,6FD
11E0: RCALL 0F42
.................... }
.................... else
11E2: BRA 126C
11E4: MOVLB 6
.................... {
.................... EP_BDxST_I(en) = EP_BDxST_I(en) & 0x43; //clear up any BDSTAL confusion
11E6: MOVLB 7
11E8: CLRF x49
11EA: MOVFF 6FB,748
11EE: CLRF x4B
11F0: MOVLW 08
11F2: MOVWF x4A
11F4: MOVLB 0
11F6: CALL 02BA
11FA: MOVFF 02,6FE
11FE: MOVFF 01,6FD
1202: MOVLW 04
1204: MOVLB 6
1206: ADDWF xFD,F
1208: MOVLW 00
120A: ADDWFC xFE,F
120C: MOVFF 6FD,01
1210: MOVLW 04
1212: ADDWF xFE,W
1214: MOVWF 03
1216: MOVFF 6FD,6FD
121A: MOVWF xFE
121C: MOVLB 7
121E: CLRF x49
1220: MOVFF 6FB,748
1224: CLRF x4B
1226: MOVLW 08
1228: MOVWF x4A
122A: MOVLB 0
122C: CALL 02BA
1230: MOVFF 02,700
1234: MOVFF 01,6FF
1238: MOVLW 04
123A: MOVLB 6
123C: ADDWF xFF,F
123E: MOVLW 00
1240: MOVLB 7
1242: ADDWFC x00,F
1244: MOVFF 6FF,FE9
1248: MOVLW 04
124A: MOVLB 7
124C: ADDWF x00,W
124E: MOVWF FEA
1250: MOVF FEF,W
1252: ANDLW 43
1254: MOVLB 6
1256: MOVFF 6FE,FEA
125A: MOVFF 6FD,FE9
125E: MOVWF FEF
.................... usb_clear_trn();
1260: MOVLB 0
1262: CALL 03AA
.................... usb_isr_tok_in_dne(en);
1266: MOVFF 6FB,6FD
126A: RCALL 1058
126C: MOVLB 6
.................... }
.................... }
.................... }
126E: MOVLB 0
1270: GOTO 12DC (RETURN)
....................
.................... /// END USB Interrupt Service Routine
....................
.................... #ENDIF
....................
.................... #endif
....................
.................... #if defined(__PIC24_USB_H__)
.................... #include <pic24_usb.c>
.................... #endif
....................
.................... #if defined(__USBN960X_H__)
.................... #include <usbn960x.c>
.................... #endif
....................
....................
.................... #IFNDEF __USB_HARDWARE__
.................... #ERROR You must include USB hardware driver.
.................... #ENDIF
....................
.................... #IFNDEF __USB_DESCRIPTORS__
.................... #ERROR You must include USB descriptors.
.................... #ENDIF
....................
.................... TYPE_USB_STACK_STATUS USB_stack_status;
....................
.................... int8 USB_address_pending; //save previous state because packets can take several isrs
.................... int8 usb_getdesc_ptr; unsigned int8 usb_getdesc_len=0; //for reading string and config descriptors
....................
.................... #IF USB_HID_BOOT_PROTOCOL
.................... int8 hid_protocol[USB_NUM_HID_INTERFACES];
.................... #ENDIF
....................
.................... void usb_put_0len_0(void);
.................... void usb_match_registers(int8 endpoint, int16 *status, int16 *buffer, int8 *size);
....................
.................... void usb_isr_tkn_setup_StandardEndpoint(void);
.................... void usb_isr_tkn_setup_StandardDevice(void);
.................... void usb_isr_tkn_setup_StandardInterface(void);
.................... #IF USB_HID_DEVICE
.................... void usb_isr_tkn_setup_ClassInterface(void);
.................... #ENDIF
.................... void usb_Get_Descriptor(void);
.................... void usb_copy_desc_seg_to_ep(void);
.................... void usb_finish_set_address(void);
....................
.................... int8 USB_Interface[USB_MAX_NUM_INTERFACES]; //config state for all of our interfaces, NUM_INTERFACES defined with descriptors
....................
.................... /// BEGIN User Functions
....................
.................... // see usb.h for documentation
.................... int1 usb_enumerated(void)
.................... {
.................... return(USB_stack_status.curr_config);
.................... }
....................
.................... // see usb.h for documentation
.................... void usb_wait_for_enumeration(void)
.................... {
.................... while (USB_stack_status.curr_config == 0) {restart_wdt();}
.................... }
....................
.................... // see USB.H for documentation
.................... int1 usb_puts(int8 endpoint, int8 * ptr, unsigned int16 len, unsigned int8 timeout) {
.................... unsigned int16 i=0;
.................... int1 res;
.................... unsigned int16 this_packet_len;
.................... unsigned int16 packet_size;
.................... unsigned int32 timeout_1us;
....................
.................... packet_size = usb_ep_tx_size[endpoint];
....................
.................... //printf("\r\nUSB PUTS %U LEN=%LU MAX_PACK=%LU\r\n", endpoint, len, packet_size);
....................
.................... //send data packets until timeout or no more packets to send
.................... while (i < len)
.................... {
.................... timeout_1us = (int32)timeout*1000;
.................... if ((len - i) > packet_size) {this_packet_len = packet_size;}
.................... else {this_packet_len = len-i;}
.................... //putc('*');
.................... do
.................... {
.................... res = usb_put_packet(endpoint, ptr + i, this_packet_len, USB_DTS_TOGGLE); //send 64 byte packets
.................... //putc('.');
.................... if (!res)
.................... {
.................... delay_us(1);
.................... //delay_ms(500);
.................... timeout_1us--;
.................... }
.................... } while (!res && timeout_1us);
.................... i += packet_size;
.................... }
....................
....................
.................... //send 0len packet if needed
.................... if (i==len) {
.................... timeout_1us=(int32)timeout*1000;
.................... do {
.................... res = usb_put_packet(endpoint,0,0,USB_DTS_TOGGLE); //indicate end of message
.................... if (!res) {
.................... delay_us(1);
.................... timeout_1us--;
.................... }
.................... } while (!res && timeout_1us);
.................... }
....................
.................... return(res);
.................... }
....................
.................... // see usb.h for documentation
.................... unsigned int16 usb_gets(int8 endpoint, int8 * ptr, unsigned int16 max, unsigned int16 timeout) {
.................... unsigned int16 ret=0;
.................... unsigned int16 to;
.................... unsigned int16 len;
.................... unsigned int16 packet_size;
.................... unsigned int16 this_packet_max;
....................
.................... packet_size=usb_ep_rx_size[endpoint];
....................
.................... do {
.................... if (packet_size < max) {this_packet_max=packet_size;} else {this_packet_max=max;}
.................... to=0;
.................... do {
.................... if (usb_kbhit(endpoint)) {
.................... len=usb_get_packet(endpoint,ptr,this_packet_max);
.................... ptr+=len;
.................... max-=len;
.................... ret+=len;
.................... break;
.................... }
.................... else {
.................... to++;
.................... delay_ms(1);
.................... }
.................... } while (to!=timeout);
.................... } while ((len == packet_size) && (to!=timeout) && max);
....................
.................... return(ret);
.................... }
....................
.................... /// END User Functions
....................
....................
.................... /// BEGIN USB Token, standard and HID request handler (part of ISR)
....................
.................... // see usb.h for documentation
.................... void usb_token_reset(void)
.................... {
.................... unsigned int i;
....................
.................... for (i=0;i<USB_MAX_NUM_INTERFACES;i++)
*
037E: MOVLB 7
0380: CLRF x19
0382: MOVF x19,W
0384: SUBLW 01
0386: BNC 039C
.................... USB_Interface[i] = 0; //reset each interface to default
0388: CLRF 03
038A: MOVF x19,W
038C: ADDLW 29
038E: MOVWF FE9
0390: MOVLW 00
0392: ADDWFC 03,W
0394: MOVWF FEA
0396: CLRF FEF
....................
.................... #IF USB_HID_BOOT_PROTOCOL
.................... for (i=0;i<USB_NUM_HID_INTERFACES; i++)
.................... hid_protocol[i] = 1;
.................... #endif
....................
.................... #if USB_CDC_DEVICE
0398: INCF x19,F
039A: BRA 0382
.................... usb_cdc_init();
039C: MOVLB 0
039E: RCALL 035C
.................... #endif
....................
.................... USB_stack_status.curr_config = 0; //unconfigured device
03A0: CLRF 1E
....................
.................... USB_stack_status.status_device = 1; //previous state. init at none
03A2: MOVLW 01
03A4: MOVWF 1F
.................... USB_stack_status.dev_req = NONE; //previous token request state. init at none
03A6: CLRF 1D
.................... }
03A8: RETLW 00
....................
.................... //send a 0len packet to endpoint 0 (optimization)
.................... //notice that this doesnt return the status
.................... #define usb_put_0len_0() usb_request_send_response(0)
....................
.................... /**************************************************************
.................... /* usb_endpoint_is_valid(endpoint)
.................... /*
.................... /* Input: endpoint - endpoint to check.
.................... /* bit 7 is direction (set is IN, clear is OUT)
.................... /*
.................... /* Output: TRUE if endpoint is valid, FALSE if not
.................... /*
.................... /* Summary: Checks the dynamic configuration to see if requested
.................... /* endpoint is a valid endpoint.
.................... /***************************************************************/
.................... int1 usb_endpoint_is_valid(int8 endpoint)
.................... {
.................... int1 direction;
.................... direction = bit_test(endpoint,7);
*
08E8: MOVLB 6
08EA: BCF xFE.0
08EC: BTFSC xFD.7
08EE: BSF xFE.0
.................... endpoint &= 0x7F;
08F0: BCF xFD.7
.................... if (direction) { //IN
08F2: BTFSS xFE.0
08F4: BRA 091C
.................... return(usb_ep_tx_type[endpoint] != USB_ENABLE_DISABLED);
08F6: CLRF 03
08F8: MOVF xFD,W
08FA: MOVFF FF2,6FF
08FE: BCF FF2.7
0900: MOVLB 0
0902: CALL 00AA
0906: MOVLB 6
0908: BTFSC xFF.7
090A: BSF FF2.7
090C: SUBLW FF
090E: BNZ 0914
0910: MOVLW 00
0912: BRA 0916
0914: MOVLW 01
0916: MOVWF 01
0918: BRA 0940
.................... }
.................... else { //OUT
091A: BRA 0940
.................... return(usb_ep_rx_type[endpoint] != USB_ENABLE_DISABLED);
091C: CLRF 03
091E: MOVF xFD,W
0920: MOVFF FF2,6FF
0924: BCF FF2.7
0926: MOVLB 0
0928: CALL 00CA
092C: MOVLB 6
092E: BTFSC xFF.7
0930: BSF FF2.7
0932: SUBLW FF
0934: BNZ 093A
0936: MOVLW 00
0938: BRA 093C
093A: MOVLW 01
093C: MOVWF 01
093E: BRA 0940
.................... }
.................... }
0940: MOVLB 0
0942: GOTO 0AA8 (RETURN)
....................
.................... // see usb.h for documentation
.................... void usb_isr_tok_in_dne(int8 endpoint) {
.................... if (endpoint==0) {
*
1058: MOVLB 6
105A: MOVF xFD,F
105C: BNZ 107A
.................... if (USB_stack_status.dev_req == GET_DESCRIPTOR) {usb_copy_desc_seg_to_ep();} //check this, we are missing report descriptor?
105E: DECFSZ 1D,W
1060: BRA 106C
1062: MOVLB 0
1064: CALL 03FA
.................... else if (USB_stack_status.dev_req == SET_ADDRESS) {usb_finish_set_address();}
1068: BRA 1076
106A: MOVLB 6
106C: MOVF 1D,W
106E: SUBLW 02
1070: BNZ 1078
1072: MOVLB 0
1074: BRA 0F7A
1076: MOVLB 6
.................... }
.................... #if USB_CDC_DEVICE
.................... else if (endpoint==USB_CDC_DATA_IN_ENDPOINT) { //see ex_usb_serial.c example and usb_cdc.h driver
1078: BRA 1086
107A: MOVF xFD,W
107C: SUBLW 02
107E: BNZ 1086
.................... usb_isr_tok_in_cdc_data_dne();
1080: MOVLB 0
1082: BRA 104E
1084: MOVLB 6
.................... }
.................... #endif
.................... }
1086: MOVLB 0
1088: RETLW 00
....................
.................... // see usb.h for documentation
.................... void usb_isr_tok_out_dne(int8 endpoint)
.................... {
.................... //TODO:
.................... if (endpoint==0) {
*
0F42: MOVLB 6
0F44: MOVF xFD,F
0F46: BNZ 0F50
.................... debug_usb(debug_putc,"TOUT 0 ");
.................... #if USB_CDC_DEVICE
.................... usb_isr_tok_out_cdc_control_dne();
0F48: MOVLB 0
0F4A: BRA 0E7E
.................... #else
.................... usb_init_ep0_setup();
.................... #endif
.................... }
.................... #if USB_CDC_DEVICE
.................... else if (endpoint==USB_CDC_DATA_OUT_ENDPOINT) { //see ex_usb_serial.c example and usb_cdc.h driver
0F4C: BRA 0F5A
0F4E: MOVLB 6
0F50: MOVF xFD,W
0F52: SUBLW 02
0F54: BNZ 0F5C
.................... usb_isr_tok_out_cdc_data_dne();
0F56: MOVLB 0
0F58: BRA 0F2C
0F5A: MOVLB 6
.................... }
.................... #endif
.................... //else {
.................... // bit_set(__usb_kbhit_status,endpoint);
.................... //}
.................... }
0F5C: MOVLB 0
0F5E: RETLW 00
....................
....................
.................... //---- process setup message stage -----------//
....................
.................... // see usb.h for documentation
.................... void usb_isr_tok_setup_dne(void)
.................... {
.................... USB_stack_status.dev_req=NONE; // clear the device request..
*
0BC0: CLRF 1D
....................
.................... switch(usb_ep0_rx_buffer[0] & 0x7F) {
0BC2: MOVLB 4
0BC4: MOVF x18,W
0BC6: ANDLW 7F
0BC8: MOVLB 0
0BCA: BZ 0BDA
0BCC: XORLW 01
0BCE: BZ 0BDC
0BD0: XORLW 03
0BD2: BZ 0BDE
0BD4: XORLW 23
0BD6: BZ 0BE0
0BD8: BRA 0BE2
....................
.................... case 0x00: //standard to device
.................... debug_usb(debug_putc," d");
.................... usb_isr_tkn_setup_StandardDevice();
0BDA: BRA 078C
.................... break;
....................
.................... case 0x01: //standard to interface
.................... debug_usb(debug_putc," i");
.................... usb_isr_tkn_setup_StandardInterface();
0BDC: BRA 0840
.................... break;
....................
.................... case 0x02: //standard to endpoint
.................... debug_usb(debug_putc," e");
.................... usb_isr_tkn_setup_StandardEndpoint();
0BDE: BRA 0AA2
.................... break;
....................
.................... #IF USB_HID_DEVICE
.................... case 0x21: //class specific request. the only class this driver supports is HID
.................... debug_usb(debug_putc," hid");
.................... usb_isr_tkn_setup_ClassInterface();
.................... break;
.................... #endif
....................
.................... #if USB_CDC_DEVICE
.................... case 0x21:
.................... debug_usb(debug_putc," cdc");
.................... usb_isr_tkn_cdc();
0BE0: BRA 0B12
.................... break;
.................... #endif
.................... //TODO: IF YOU WANT VENDOR SPECIFC REQUEST SUPPORT YOU MUST ADD IT HERE
....................
.................... default:
.................... usb_request_stall();
0BE2: RCALL 03F4
.................... break;
0BE4: BRA 0BE6
.................... }
.................... }
0BE6: GOTO 10C2 (RETURN)
....................
.................... /**************************************************************
.................... /* usb_isr_tkn_setup_StandardDevice()
.................... /*
.................... /* Input: usb_ep0_rx_buffer[1] == bRequest
.................... /*
.................... /* Summary: bmRequestType told us it was a Standard Device request.
.................... /* bRequest says which request. Only certain requests are valid,
.................... /* if a non-valid request was made then return with an Wrong-Statue (IDLE)
.................... /*
.................... /* Part of usb_isr_tok_setup_dne()
.................... /***************************************************************/
.................... void usb_isr_tkn_setup_StandardDevice(void) {
.................... switch(usb_ep0_rx_buffer[1]) {
*
078C: MOVLB 4
078E: MOVF x19,W
0790: MOVLB 0
0792: BZ 07AE
0794: XORLW 01
0796: BZ 07C2
0798: XORLW 02
079A: BZ 07DC
079C: XORLW 06
079E: BZ 07F4
07A0: XORLW 03
07A2: BZ 0806
07A4: XORLW 0E
07A6: BZ 0808
07A8: XORLW 01
07AA: BZ 0818
07AC: BRA 0838
....................
.................... case USB_STANDARD_REQUEST_GET_STATUS: //0
.................... debug_usb(debug_putc,"GS");
.................... usb_ep0_tx_buffer[0]=USB_stack_status.status_device;
07AE: MOVFF 1F,458
.................... usb_ep0_tx_buffer[1]=0;
07B2: MOVLB 4
07B4: CLRF x59
.................... usb_request_send_response(2);
07B6: MOVLW 02
07B8: MOVLB 7
07BA: MOVWF x00
07BC: MOVLB 0
07BE: RCALL 03EE
.................... break;
07C0: BRA 083C
....................
.................... case USB_STANDARD_REQUEST_CLEAR_FEATURE: //1
.................... if (usb_ep0_rx_buffer[2] == 1) {
07C2: MOVLB 4
07C4: DECFSZ x1A,W
07C6: BRA 07D6
.................... debug_usb(debug_putc,"CF");
.................... USB_stack_status.status_device &= 1;
07C8: MOVLW 01
07CA: ANDWF 1F,F
.................... usb_put_0len_0();
07CC: MOVLB 7
07CE: CLRF x00
07D0: MOVLB 0
07D2: RCALL 03EE
.................... }
.................... else
07D4: BRA 07DA
.................... usb_request_stall();
07D6: MOVLB 0
07D8: RCALL 03F4
.................... break;
07DA: BRA 083C
....................
.................... case USB_STANDARD_REQUEST_SET_FEATURE: //3
.................... if (usb_ep0_rx_buffer[2] == 1) {
07DC: MOVLB 4
07DE: DECFSZ x1A,W
07E0: BRA 07EE
.................... debug_usb(debug_putc,"SF");
.................... USB_stack_status.status_device |= 2;
07E2: BSF 1F.1
.................... usb_put_0len_0();
07E4: MOVLB 7
07E6: CLRF x00
07E8: MOVLB 0
07EA: RCALL 03EE
.................... }
.................... else
07EC: BRA 07F2
.................... usb_request_stall();
07EE: MOVLB 0
07F0: RCALL 03F4
.................... break;
07F2: BRA 083C
....................
.................... case USB_STANDARD_REQUEST_SET_ADDRESS: //5
.................... debug_usb(debug_putc,"SA");
.................... USB_stack_status.dev_req=SET_ADDRESS; //currently processing set_address request
07F4: MOVLW 02
07F6: MOVWF 1D
.................... USB_address_pending=usb_ep0_rx_buffer[2];
07F8: MOVFF 41A,26
.................... #ifdef __USBN__ //NATIONAL part handles this differently than pic16c7x5
.................... USB_stack_status.dev_req=NONE; //currently processing set_address request
.................... usb_set_address(USB_address_pending);
.................... USB_stack_status.curr_config=0; // make sure current configuration is 0
.................... #endif
.................... usb_put_0len_0();
07FC: MOVLB 7
07FE: CLRF x00
0800: MOVLB 0
0802: RCALL 03EE
.................... break;
0804: BRA 083C
....................
.................... case USB_STANDARD_REQUEST_GET_DESCRIPTOR: //6
.................... debug_usb(debug_putc,"GD");
.................... usb_Get_Descriptor();
0806: BRA 049C
.................... break;
....................
.................... case USB_STANDARD_REQUEST_GET_CONFIGURATION: //8
.................... debug_usb(debug_putc,"GC");
.................... usb_ep0_tx_buffer[0]=USB_stack_status.curr_config;
0808: MOVFF 1E,458
.................... usb_request_send_response(1);
080C: MOVLW 01
080E: MOVLB 7
0810: MOVWF x00
0812: MOVLB 0
0814: RCALL 03EE
.................... break;
0816: BRA 083C
....................
.................... case USB_STANDARD_REQUEST_SET_CONFIGURATION: //9
.................... if (usb_ep0_rx_buffer[2] <= USB_NUM_CONFIGURATIONS) {
0818: MOVLB 4
081A: MOVF x1A,W
081C: SUBLW 01
081E: BNC 0834
.................... USB_stack_status.curr_config=usb_ep0_rx_buffer[2];
0820: MOVFF 41A,1E
.................... usb_set_configured(usb_ep0_rx_buffer[2]);
0824: MOVFF 41A,6FD
0828: MOVLB 0
082A: BRA 055C
.................... debug_usb(debug_putc,"SC%U", USB_stack_status.curr_config);
.................... usb_put_0len_0();
082C: MOVLB 7
082E: CLRF x00
0830: MOVLB 0
0832: RCALL 03EE
.................... }
.................... break;
0834: MOVLB 0
0836: BRA 083C
....................
.................... default:
.................... usb_request_stall();
0838: RCALL 03F4
.................... break;
083A: BRA 083C
.................... }
.................... }
083C: GOTO 0BE6 (RETURN)
....................
.................... /**************************************************************
.................... /* usb_isr_tkn_setup_StandardInterface()
.................... /*
.................... /* Input: usb_ep0_rx_buffer[1] == bRequest
.................... /*
.................... /* Summary: bmRequestType told us it was a Standard Interface request.
.................... /* bRequest says which request. Only certain requests are valid,
.................... /* if a non-valid request was made then return with an Wrong-Statue (IDLE)
.................... /*
.................... /* Part of usb_isr_tok_setup_dne()
.................... /***************************************************************/
.................... void usb_isr_tkn_setup_StandardInterface(void) {
.................... int8 curr_config;
....................
.................... curr_config=USB_stack_status.curr_config;
0840: MOVFF 1E,6FD
....................
.................... switch (usb_ep0_rx_buffer[1]) {
0844: MOVLB 4
0846: MOVF x19,W
0848: MOVLB 0
084A: BZ 0856
084C: XORLW 0A
084E: BZ 0868
0850: XORLW 01
0852: BZ 08B6
0854: BRA 08E0
.................... case USB_STANDARD_REQUEST_GET_STATUS:
.................... debug_usb(debug_putc,"GS");
.................... usb_ep0_tx_buffer[0]=0;
0856: MOVLB 4
0858: CLRF x58
.................... usb_ep0_tx_buffer[1]=0;
085A: CLRF x59
.................... usb_request_send_response(2);
085C: MOVLW 02
085E: MOVLB 7
0860: MOVWF x00
0862: MOVLB 0
0864: RCALL 03EE
.................... break;
0866: BRA 08E4
....................
.................... case USB_STANDARD_REQUEST_GET_INTERFACE:
.................... if ( curr_config && (usb_ep0_rx_buffer[4] < USB_NUM_INTERFACES[curr_config-1]) ) { //book says only supports configed state
0868: MOVLB 6
086A: MOVF xFD,F
086C: BZ 08B0
086E: MOVLW 01
0870: SUBWF xFD,W
0872: CLRF 03
0874: MOVFF FF2,6FE
0878: BCF FF2.7
087A: MOVLB 0
087C: RCALL 019E
087E: MOVLB 6
0880: BTFSC xFE.7
0882: BSF FF2.7
0884: MOVWF 01
0886: MOVLB 4
0888: SUBWF x1C,W
088A: BTFSS FD8.0
088C: BRA 0892
088E: MOVLB 6
0890: BRA 08B0
.................... debug_usb(debug_putc,"GI");
.................... usb_ep0_tx_buffer[0]=USB_Interface[usb_ep0_rx_buffer[4]];//our new outgoing byte
0892: CLRF 03
0894: MOVF x1C,W
0896: ADDLW 29
0898: MOVWF FE9
089A: MOVLW 00
089C: ADDWFC 03,W
089E: MOVWF FEA
08A0: MOVFF FEF,458
.................... usb_request_send_response(1);; //send byte back
08A4: MOVLW 01
08A6: MOVLB 7
08A8: MOVWF x00
08AA: MOVLB 0
08AC: RCALL 03EE
.................... }
.................... else
08AE: BRA 08B4
.................... usb_request_stall();
08B0: MOVLB 0
08B2: RCALL 03F4
.................... break;
08B4: BRA 08E4
....................
.................... case USB_STANDARD_REQUEST_SET_INTERFACE:
.................... if (curr_config) { //if configured state
08B6: MOVLB 6
08B8: MOVF xFD,F
08BA: BZ 08DA
.................... debug_usb(debug_putc,"SI");
.................... USB_Interface[usb_ep0_rx_buffer[4]]=usb_ep0_rx_buffer[2];
08BC: CLRF 03
08BE: MOVLB 4
08C0: MOVF x1C,W
08C2: ADDLW 29
08C4: MOVWF FE9
08C6: MOVLW 00
08C8: ADDWFC 03,W
08CA: MOVWF FEA
08CC: MOVFF 41A,FEF
.................... usb_put_0len_0();
08D0: MOVLB 7
08D2: CLRF x00
08D4: MOVLB 0
08D6: RCALL 03EE
.................... }
.................... else
08D8: BRA 08DE
.................... usb_request_stall();
08DA: MOVLB 0
08DC: RCALL 03F4
.................... break;
08DE: BRA 08E4
....................
.................... #IF USB_HID_DEVICE
.................... case USB_STANDARD_REQUEST_GET_DESCRIPTOR:
.................... debug_usb(debug_putc,"GD");
.................... usb_Get_Descriptor();
.................... break;
.................... #endif
....................
.................... // case USB_STANDARD_REQUEST_CLEAR_FEATURE:
.................... // case USB_STANDARD_REQUEST_SET_FEATURE:
.................... // let default take care of these, goto wrongstate
.................... default:
.................... usb_request_stall();
08E0: RCALL 03F4
.................... break;
08E2: BRA 08E4
.................... }
.................... }
08E4: GOTO 0BE6 (RETURN)
....................
.................... /**************************************************************
.................... /* usb_isr_tkn_setup_StandardEndpoint()
.................... /*
.................... /* Input: usb_ep0_rx_buffer[1] == bRequest
.................... /*
.................... /* Summary: bmRequestType told us it was a Standard Endpoint request.
.................... /* bRequest says which request. Only certain requests are valid,
.................... /* if a non-valid request was made then return with an Wrong-Statue (IDLE)
.................... /*
.................... /* Part of usb_isr_tok_setup_dne()
.................... /***************************************************************/
.................... void usb_isr_tkn_setup_StandardEndpoint(void) {
.................... if (usb_endpoint_is_valid(usb_ep0_rx_buffer[4])) {
*
0AA2: MOVFF 41C,6FD
0AA6: BRA 08E8
0AA8: MOVF 01,F
0AAA: BZ 0B08
.................... switch(usb_ep0_rx_buffer[1]) {
0AAC: MOVLB 4
0AAE: MOVF x19,W
0AB0: XORLW 01
0AB2: MOVLB 0
0AB4: BZ 0AC0
0AB6: XORLW 02
0AB8: BZ 0AD0
0ABA: XORLW 03
0ABC: BZ 0AE0
0ABE: BRA 0B04
....................
.................... case USB_STANDARD_REQUEST_CLEAR_FEATURE:
.................... debug_usb(debug_putc,"CF");
.................... usb_unstall_ep(usb_ep0_rx_buffer[4]);
0AC0: MOVFF 41C,6FD
0AC4: BRA 0946
.................... usb_put_0len_0();
0AC6: MOVLB 7
0AC8: CLRF x00
0ACA: MOVLB 0
0ACC: RCALL 03EE
.................... break;
0ACE: BRA 0B08
....................
.................... case USB_STANDARD_REQUEST_SET_FEATURE:
.................... debug_usb(debug_putc,"SF");
.................... usb_stall_ep(usb_ep0_rx_buffer[4]);
0AD0: MOVFF 41C,6FD
0AD4: BRA 09B4
.................... usb_put_0len_0();
0AD6: MOVLB 7
0AD8: CLRF x00
0ADA: MOVLB 0
0ADC: RCALL 03EE
.................... break;
0ADE: BRA 0B08
....................
.................... case USB_STANDARD_REQUEST_GET_STATUS:
.................... debug_usb(debug_putc,"GS");
.................... usb_ep0_tx_buffer[0]=0;
0AE0: MOVLB 4
0AE2: CLRF x58
.................... usb_ep0_tx_buffer[1]=0;
0AE4: CLRF x59
.................... if (usb_endpoint_stalled(usb_ep0_rx_buffer[4])) {
0AE6: MOVFF 41C,6FD
0AEA: MOVLB 0
0AEC: BRA 0A24
0AEE: MOVF 01,F
0AF0: BZ 0AF8
.................... usb_ep0_tx_buffer[0]=1;
0AF2: MOVLW 01
0AF4: MOVLB 4
0AF6: MOVWF x58
.................... }
.................... usb_request_send_response(2);
0AF8: MOVLW 02
0AFA: MOVLB 7
0AFC: MOVWF x00
0AFE: MOVLB 0
0B00: RCALL 03EE
.................... break;
0B02: BRA 0B08
....................
.................... default:
.................... usb_request_stall();
0B04: RCALL 03F4
.................... break;
0B06: BRA 0B08
.................... }
.................... }
.................... }
0B08: GOTO 0BE6 (RETURN)
....................
.................... /**************************************************************
.................... /* usb_isr_tkn_setup_ClassInterface()
.................... /*
.................... /* Input: usb_ep0_rx_buffer[1] == bRequest
.................... /*
.................... /* Summary: bmRequestType told us it was a Class request. The only Class this drivers supports is HID.
.................... /* bRequest says which request. Only certain requests are valid,
.................... /* if a non-valid request was made then return with an Wrong-Statue (IDLE)
.................... /*
.................... /* Part of usb_isr_tok_setup_dne()
.................... /* Only compiled if HID_DEVICE is TRUE
.................... /***************************************************************/
.................... #IF USB_HID_DEVICE
.................... void usb_isr_tkn_setup_ClassInterface(void) {
.................... switch(usb_ep0_rx_buffer[1]) {
....................
.................... #IF USB_HID_BOOT_PROTOCOL
.................... case USB_HID_REQUEST_GET_PROTOCOL: //03
.................... debug_usb(debug_putc,"GP");
.................... usb_ep0_tx_buffer[0]=hid_protocol[usb_ep0_rx_buffer[4]];
.................... usb_request_send_response(1);
.................... break;
.................... #ENDIF
....................
.................... #IF USB_HID_BOOT_PROTOCOL
.................... case USB_HID_REQUEST_SET_PROTOCOL: //0b
.................... debug_usb(debug_putc,"SP");
.................... hid_protocol[usb_ep0_rx_buffer[4]]=usb_ep0_rx_buffer[2];
.................... usb_put_0len_0(); //send 0len packet69
.................... break;
.................... #ENDIF
....................
.................... #IF USB_HID_IDLE
.................... case USB_HID_REQUEST_SET_IDLE: //0a
.................... #error TODO: if you want to support SET_IDLE, add code here
.................... #ENDIF
....................
.................... #IF USB_HID_IDLE
.................... case USB_HID_REQUEST_GET_IDLE: //02
.................... #error TODO: if you want to support GET_IDLE, add code here
.................... #ENDIF
....................
.................... default:
.................... usb_request_stall();
.................... break;
.................... }
.................... }
.................... #ENDIF
....................
.................... /**************************************************************
.................... /* usb_Get_Descriptor()
.................... /*
.................... /* Input: usb_ep0_rx_buffer[3] == wValue, which descriptor we want
.................... /* usb_ep0_rx_buffer[6,7] == Max length the host will accept
.................... /*
.................... /* Summary: Checks to see if we want a standard descriptor (Interface, Endpoint, Config, Device, String, etc.),
.................... /* or a class specific (HID) descriptor. Since some pics (especially the PIC167x5) doesn't have
.................... /* pointers to constants we must simulate or own by setting up global registers that say
.................... /* which constant array to deal with, which position to start in this array, and the length.
.................... /* Once these globals are setup the first packet is sent. If a descriptor takes more than one packet
.................... /* the PC will send an IN request to endpoint 0, and this will be handled by usb_isr_tok_in_dne()
.................... /* which will send the rest of the data.
.................... /*
.................... /* Part of usb_isr_tok_setup_dne()
.................... /***************************************************************/
.................... void usb_Get_Descriptor() {
.................... usb_getdesc_ptr=0;
*
049C: CLRF 27
.................... USB_stack_status.getdesc_type=USB_GETDESC_CONFIG_TYPE;
049E: CLRF 20
....................
.................... switch(usb_ep0_rx_buffer[3]) {
04A0: MOVLB 4
04A2: MOVF x1B,W
04A4: XORLW 01
04A6: MOVLB 0
04A8: BZ 04B8
04AA: XORLW 03
04AC: BZ 04C2
04AE: XORLW 01
04B0: BZ 04C8
04B2: XORLW 22
04B4: BZ 04FA
04B6: BRA 053C
.................... case USB_DESC_DEVICE_TYPE: //1
.................... usb_getdesc_len=USB_DESC_DEVICE_LEN;
04B8: MOVLW 12
04BA: MOVWF 28
.................... USB_stack_status.getdesc_type=USB_GETDESC_DEVICE_TYPE;
04BC: MOVLW 03
04BE: MOVWF 20
.................... break;
04C0: BRA 0540
....................
.................... //windows hosts will send a FF max len and expect you to send all configs without asking for them individually.
.................... case USB_DESC_CONFIG_TYPE: //2
.................... usb_getdesc_len=USB_TOTAL_CONFIG_LEN;
04C2: MOVLW 43
04C4: MOVWF 28
.................... break;
04C6: BRA 0540
....................
.................... case USB_DESC_STRING_TYPE: //3
.................... USB_stack_status.getdesc_type=USB_GETDESC_STRING_TYPE;
04C8: MOVLW 02
04CA: MOVWF 20
.................... usb_getdesc_ptr=USB_STRING_DESC_OFFSET[usb_ep0_rx_buffer[2]];
04CC: CLRF 03
04CE: MOVLB 4
04D0: MOVF x1A,W
04D2: ADDLW 21
04D4: MOVWF FE9
04D6: MOVLW 00
04D8: ADDWFC 03,W
04DA: MOVWF FEA
04DC: MOVFF FEF,27
.................... usb_getdesc_len=USB_STRING_DESC[usb_getdesc_ptr];
04E0: CLRF 03
04E2: MOVF 27,W
04E4: MOVFF FF2,6FD
04E8: BCF FF2.7
04EA: MOVLB 0
04EC: RCALL 01EA
04EE: MOVLB 6
04F0: BTFSC xFD.7
04F2: BSF FF2.7
04F4: MOVWF 28
.................... break;
04F6: MOVLB 0
04F8: BRA 0540
....................
.................... #IF USB_HID_DEVICE || USB_CDC_DEVICE
.................... case USB_DESC_CLASS_TYPE: //0x21
.................... //TODO does this work for multiple interfaces or multiple languages?
.................... //usb_getdesc_ptr=USB_CLASS_DESCRIPTORS[0][usb_ep0_rx_buffer[4]][usb_ep0_rx_buffer[2]];
.................... usb_getdesc_ptr=USB_CLASS_DESCRIPTORS[0][0][usb_ep0_rx_buffer[2]];
04FA: CLRF 03
04FC: MOVLB 4
04FE: MOVF x1A,W
0500: MOVFF FF2,6FD
0504: BCF FF2.7
0506: MOVLB 0
0508: RCALL 01B0
050A: MOVLB 6
050C: BTFSC xFD.7
050E: BSF FF2.7
0510: MOVWF 27
.................... if (usb_getdesc_ptr!=0xFF) {
0512: INCFSZ 27,W
0514: BRA 0518
0516: BRA 0536
.................... usb_getdesc_len=USB_CONFIG_DESC[usb_getdesc_ptr];
0518: CLRF 03
051A: MOVF 27,W
051C: MOVFF FF2,6FD
0520: BCF FF2.7
0522: MOVLB 0
0524: RCALL 014A
0526: MOVLB 6
0528: BTFSC xFD.7
052A: BSF FF2.7
052C: MOVWF 28
.................... break;
052E: MOVLB 0
0530: BRA 0540
.................... }
.................... else {
0532: BRA 053C
0534: MOVLB 6
.................... usb_request_stall();
0536: MOVLB 0
0538: RCALL 03F4
.................... return;
053A: BRA 0558
.................... }
.................... #endif
....................
.................... #IF USB_HID_DEVICE
.................... case USB_DESC_HIDREPORT_TYPE: //0x22
.................... usb_getdesc_ptr=USB_CLASS_SPECIFIC_DESC_LOOKUP[0][usb_ep0_rx_buffer[4]];
.................... if (usb_getdesc_ptr !=0xFF) {
.................... USB_stack_status.getdesc_type=USB_GETDESC_HIDREPORT_TYPE;
.................... usb_getdesc_len=USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[0][usb_ep0_rx_buffer[4]];
.................... break;
.................... }
.................... else {
.................... usb_request_stall();
.................... return;
.................... }
.................... #endif
....................
.................... default:
.................... usb_request_stall();
053C: RCALL 03F4
.................... return;
053E: BRA 0558
.................... }
.................... if (usb_ep0_rx_buffer[7]==0) {
0540: MOVLB 4
0542: MOVF x1F,F
0544: BNZ 0550
.................... if (usb_getdesc_len > usb_ep0_rx_buffer[6])
0546: MOVF 28,W
0548: SUBWF x1E,W
054A: BC 0550
.................... usb_getdesc_len = usb_ep0_rx_buffer[6];
054C: MOVFF 41E,28
.................... }
.................... USB_stack_status.dev_req=GET_DESCRIPTOR;
0550: MOVLW 01
0552: MOVWF 1D
.................... usb_copy_desc_seg_to_ep();
0554: MOVLB 0
0556: RCALL 03FA
.................... }
0558: GOTO 083C (RETURN)
....................
.................... /**************************************************************
.................... /* usb_finish_set_address()
.................... /*
.................... /* Input: USB_address_pending holds the address we were asked to set to.
.................... /*
.................... /* Summary: Sets the address.
.................... /*
.................... /* This code should only be run on the PIC USB peripheral, and not the
.................... /* National peripheral.
.................... /*
.................... /* Part of usb_isr_tok_setup_dne()
.................... /***************************************************************/
.................... void usb_finish_set_address() {
.................... debug_usb(debug_putc," FSA ");
.................... USB_stack_status.curr_config=0; // make sure current configuration is 0
*
0F7A: CLRF 1E
....................
.................... #ifdef __PIC__
.................... USB_stack_status.dev_req=NONE; // no request pending
0F7C: CLRF 1D
.................... usb_set_address(USB_address_pending);
0F7E: MOVFF 26,6FE
0F82: BRA 0F60
.................... #endif
.................... }
0F84: GOTO 1076 (RETURN)
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... ///
.................... /// The following function retrieve data from constant arrays. This may
.................... /// look un-optimized, but remember that you can't create a pointer to
.................... /// a constant array.
.................... ///
.................... ///////////////////////////////////////////////////////////////////////////
.................... void usb_copy_desc_seg_to_ep(void) {
.................... unsigned int i=0;
*
03FA: MOVLB 6
03FC: CLRF xFE
.................... char c;
....................
.................... while ((usb_getdesc_len)&&(i<USB_MAX_EP0_PACKET_LENGTH))
.................... {
03FE: MOVF 28,F
0400: BZ 0486
0402: MOVF xFE,W
0404: SUBLW 3F
0406: BNC 0486
.................... switch(USB_stack_status.getdesc_type) {
0408: MOVF 20,W
040A: MOVLB 0
040C: BZ 0418
040E: XORLW 02
0410: BZ 0432
0412: XORLW 01
0414: BZ 044C
0416: BRA 0466
.................... case USB_GETDESC_CONFIG_TYPE:
.................... c=USB_CONFIG_DESC[usb_getdesc_ptr];
0418: CLRF 03
041A: MOVF 27,W
041C: MOVFF FF2,700
0420: BCF FF2.7
0422: RCALL 014A
0424: MOVLB 7
0426: BTFSC x00.7
0428: BSF FF2.7
042A: MOVFF FE8,6FF
.................... break;
042E: MOVLB 0
0430: BRA 0466
....................
.................... #IF USB_HID_DEVICE
.................... case USB_GETDESC_HIDREPORT_TYPE:
.................... c=USB_CLASS_SPECIFIC_DESC[usb_getdesc_ptr];
.................... break;
.................... #endif
....................
.................... case USB_GETDESC_STRING_TYPE:
.................... c=USB_STRING_DESC[usb_getdesc_ptr];
0432: CLRF 03
0434: MOVF 27,W
0436: MOVFF FF2,700
043A: BCF FF2.7
043C: RCALL 01EA
043E: MOVLB 7
0440: BTFSC x00.7
0442: BSF FF2.7
0444: MOVFF FE8,6FF
.................... break;
0448: MOVLB 0
044A: BRA 0466
....................
.................... case USB_GETDESC_DEVICE_TYPE:
.................... c=USB_DEVICE_DESC[usb_getdesc_ptr];
044C: CLRF 03
044E: MOVF 27,W
0450: MOVFF FF2,700
0454: BCF FF2.7
0456: RCALL 01C8
0458: MOVLB 7
045A: BTFSC x00.7
045C: BSF FF2.7
045E: MOVFF FE8,6FF
.................... break;
0462: MOVLB 0
0464: BRA 0466
.................... }
.................... usb_getdesc_ptr++;
0466: INCF 27,F
.................... usb_getdesc_len--;
0468: DECF 28,F
.................... usb_ep0_tx_buffer[i++]=c;
046A: MOVLB 6
046C: MOVF xFE,W
046E: INCF xFE,F
0470: ADDLW 58
0472: CLRF 03
0474: BTFSC FD8.0
0476: INCF 03,F
0478: MOVWF FE9
047A: MOVLW 04
047C: ADDWF 03,W
047E: MOVWF FEA
0480: MOVFF 6FF,FEF
.................... }
0484: BRA 03FE
....................
.................... if ((!usb_getdesc_len)&&(i!=USB_MAX_EP0_PACKET_LENGTH)) {
0486: MOVF 28,F
0488: BNZ 0492
048A: MOVF xFE,W
048C: SUBLW 40
048E: BZ 0492
.................... USB_stack_status.dev_req = NONE;
0490: CLRF 1D
.................... }
....................
.................... usb_request_send_response(i);
0492: MOVFF 6FE,700
0496: MOVLB 0
0498: RCALL 03EE
.................... }
049A: RETLW 00
....................
.................... #ENDIF
....................
....................
.................... struct {
.................... unsigned int32 dwDTERrate; //data terminal rate, in bits per second
.................... unsigned int8 bCharFormat; //num of stop bits (0=1, 1=1.5, 2=2)
.................... unsigned int8 bParityType; //parity (0=none, 1=odd, 2=even, 3=mark, 4=space)
.................... unsigned int8 bDataBits; //data bits (5,6,7,8 or 16)
.................... } __attribute__((__packed__)) usb_cdc_line_coding;
....................
.................... //length of time, in ms, of break signal as we received in a SendBreak message.
.................... //if ==0xFFFF, send break signal until we receive a 0x0000.
.................... unsigned int16 usb_cdc_break;
....................
.................... unsigned int8 usb_cdc_encapsulated_cmd[8];
....................
.................... unsigned int8 usb_cdc_put_buffer[USB_CDC_DATA_IN_SIZE];
.................... #define usb_cdc_put_buffer_free() usb_tbe(USB_CDC_DATA_IN_ENDPOINT)
.................... #if USB_CDC_DATA_IN_SIZE>=0x100
.................... unsigned int16 usb_cdc_put_buffer_nextin=0;
.................... // int16 usb_cdc_last_data_packet_size;
.................... #else
.................... unsigned int8 usb_cdc_put_buffer_nextin=0;
.................... // int8 usb_cdc_last_data_packet_size;
.................... #endif
....................
.................... struct {
.................... int1 got;
.................... #if USB_CDC_DATA_OUT_SIZE>=0x100
.................... unsigned int16 len;
.................... unsigned int16 index;
.................... #else
.................... unsigned int8 len;
.................... unsigned int8 index;
.................... #endif
.................... } usb_cdc_get_buffer_status;
....................
.................... #if defined(__PIC__)
.................... #define usb_cdc_get_buffer_status_buffer usb_ep2_rx_buffer
.................... #else
.................... unsigned int8 usb_cdc_get_buffer_status_buffer[USB_CDC_DATA_OUT_SIZE];
.................... #endif
....................
.................... int1 usb_cdc_got_set_line_coding;
....................
.................... struct {
.................... int1 dte_present; //1=DTE present, 0=DTE not present
.................... int1 active; //1=activate carrier, 0=deactivate carrier
.................... unsigned int reserved:6;
.................... } usb_cdc_carrier;
....................
.................... unsigned int8 g_LastCDCDataPacketSize;
....................
.................... enum {USB_CDC_OUT_NOTHING=0, USB_CDC_OUT_COMMAND=1, USB_CDC_OUT_LINECODING=2, USB_CDC_WAIT_0LEN=3} __usb_cdc_state=0;
....................
.................... #if defined(__PCH__)
.................... #byte INTCON=0xFF2
.................... #bit INT_GIE=INTCON.7
.................... #else
.................... #word SR=0x42
.................... #endif
....................
.................... //handle OUT token done interrupt on endpoint 0 [read encapsulated cmd and line coding data]
.................... void usb_isr_tok_out_cdc_control_dne(void) {
.................... debug_usb(debug_putc,"CDC %X ",__usb_cdc_state);
....................
.................... switch (__usb_cdc_state) {
*
0E7E: MOVF x83,W
0E80: XORLW 01
0E82: BZ 0E8A
0E84: XORLW 03
0E86: BZ 0EB2
0E88: BRA 0EDA
.................... //printf(putc_tbe,"@%X@\r\n", __usb_cdc_state);
.................... case USB_CDC_OUT_COMMAND:
.................... //usb_get_packet(0, usb_cdc_encapsulated_cmd, 8);
.................... memcpy(usb_cdc_encapsulated_cmd, usb_ep0_rx_buffer,8);
0E8A: CLRF FEA
0E8C: MOVLW 34
0E8E: MOVWF FE9
0E90: MOVLW 04
0E92: MOVWF FE2
0E94: MOVLW 18
0E96: MOVWF FE1
0E98: MOVLW 08
0E9A: MOVWF 01
0E9C: MOVFF FE6,FEE
0EA0: DECFSZ 01,F
0EA2: BRA 0E9C
.................... #if USB_MAX_EP0_PACKET_LENGTH==8
.................... __usb_cdc_state=USB_CDC_WAIT_0LEN;
.................... usb_request_get_data();
.................... #else
.................... usb_put_0len_0();
0EA4: MOVLB 7
0EA6: CLRF x00
0EA8: MOVLB 0
0EAA: CALL 03EE
.................... __usb_cdc_state=0;
0EAE: CLRF x83
.................... #endif
.................... break;
0EB0: BRA 0EE2
....................
.................... #if USB_MAX_EP0_PACKET_LENGTH==8
.................... case USB_CDC_WAIT_0LEN:
.................... usb_put_0len_0();
.................... __usb_cdc_state=0;
.................... break;
.................... #endif
....................
.................... case USB_CDC_OUT_LINECODING:
.................... //usb_get_packet(0, &usb_cdc_line_coding, 7);
.................... //printf(putc_tbe,"\r\n!GSLC FIN!\r\n");
.................... memcpy(&usb_cdc_line_coding, usb_ep0_rx_buffer,7);
0EB2: CLRF FEA
0EB4: MOVLW 2B
0EB6: MOVWF FE9
0EB8: MOVLW 04
0EBA: MOVWF FE2
0EBC: MOVLW 18
0EBE: MOVWF FE1
0EC0: MOVLW 07
0EC2: MOVWF 01
0EC4: MOVFF FE6,FEE
0EC8: DECFSZ 01,F
0ECA: BRA 0EC4
.................... __usb_cdc_state=0;
0ECC: CLRF x83
.................... usb_put_0len_0();
0ECE: MOVLB 7
0ED0: CLRF x00
0ED2: MOVLB 0
0ED4: CALL 03EE
.................... break;
0ED8: BRA 0EE2
....................
.................... default:
.................... __usb_cdc_state=0;
0EDA: CLRF x83
.................... usb_init_ep0_setup();
0EDC: CALL 0284
.................... break;
0EE0: BRA 0EE2
.................... }
.................... }
0EE2: GOTO 0F4C (RETURN)
....................
.................... //handle IN token on 0 (setup packet)
.................... void usb_isr_tkn_cdc(void) {
.................... //make sure the request goes to a CDC interface
.................... if ((usb_ep0_rx_buffer[4] == 1) || (usb_ep0_rx_buffer[4] == 0)) {
*
0B12: MOVLB 4
0B14: DECFSZ x1C,W
0B16: BRA 0B1A
0B18: BRA 0B1E
0B1A: MOVF x1C,F
0B1C: BNZ 0BBA
.................... //printf(putc_tbe,"!%X!\r\n", usb_ep0_rx_buffer[1]);
.................... switch(usb_ep0_rx_buffer[1]) {
0B1E: MOVF x19,W
0B20: MOVLB 0
0B22: BZ 0B3A
0B24: XORLW 01
0B26: BZ 0B42
0B28: XORLW 21
0B2A: BZ 0B64
0B2C: XORLW 01
0B2E: BZ 0B6E
0B30: XORLW 03
0B32: BZ 0B94
0B34: XORLW 01
0B36: BZ 0BA2
0B38: BRA 0BB4
.................... case 0x00: //send_encapsulated_command
.................... __usb_cdc_state=USB_CDC_OUT_COMMAND;
0B3A: MOVLW 01
0B3C: MOVWF x83
.................... usb_request_get_data();
0B3E: RCALL 0B0C
.................... break;
0B40: BRA 0BB8
....................
.................... case 0x01: //get_encapsulated_command
.................... memcpy(usb_ep0_tx_buffer, usb_cdc_encapsulated_cmd, 8);
0B42: MOVLW 04
0B44: MOVWF FEA
0B46: MOVLW 58
0B48: MOVWF FE9
0B4A: CLRF FE2
0B4C: MOVLW 34
0B4E: MOVWF FE1
0B50: MOVLW 08
0B52: MOVWF 01
0B54: MOVFF FE6,FEE
0B58: DECFSZ 01,F
0B5A: BRA 0B54
.................... usb_request_send_response(usb_ep0_rx_buffer[6]); //send wLength bytes
0B5C: MOVFF 41E,700
0B60: RCALL 03EE
.................... break;
0B62: BRA 0BB8
....................
.................... case 0x20: //set_line_coding
.................... debug_usb(debug_putc,"!GSLC!");
.................... __usb_cdc_state=USB_CDC_OUT_LINECODING;
0B64: MOVLW 02
0B66: MOVWF x83
.................... usb_cdc_got_set_line_coding=TRUE;
0B68: BSF x80.0
.................... usb_request_get_data();
0B6A: RCALL 0B0C
.................... break;
0B6C: BRA 0BB8
....................
.................... case 0x21: //get_line_coding
.................... memcpy(usb_ep0_tx_buffer, &usb_cdc_line_coding, sizeof(usb_cdc_line_coding));
0B6E: MOVLW 04
0B70: MOVWF FEA
0B72: MOVLW 58
0B74: MOVWF FE9
0B76: CLRF FE2
0B78: MOVLW 2B
0B7A: MOVWF FE1
0B7C: MOVLW 07
0B7E: MOVWF 01
0B80: MOVFF FE6,FEE
0B84: DECFSZ 01,F
0B86: BRA 0B80
.................... usb_request_send_response(sizeof(usb_cdc_line_coding)); //send wLength bytes
0B88: MOVLW 07
0B8A: MOVLB 7
0B8C: MOVWF x00
0B8E: MOVLB 0
0B90: RCALL 03EE
.................... break;
0B92: BRA 0BB8
....................
.................... case 0x22: //set_control_line_state
.................... usb_cdc_carrier=usb_ep0_rx_buffer[2];
0B94: MOVFF 41A,81
.................... usb_put_0len_0();
0B98: MOVLB 7
0B9A: CLRF x00
0B9C: MOVLB 0
0B9E: RCALL 03EE
.................... break;
0BA0: BRA 0BB8
....................
.................... case 0x23: //send_break
.................... usb_cdc_break=make16(usb_ep0_rx_buffer[2],usb_ep0_rx_buffer[3]);
0BA2: MOVFF 41A,33
0BA6: MOVFF 41B,32
.................... usb_put_0len_0();
0BAA: MOVLB 7
0BAC: CLRF x00
0BAE: MOVLB 0
0BB0: RCALL 03EE
.................... break;
0BB2: BRA 0BB8
....................
.................... default:
.................... usb_request_stall();
0BB4: RCALL 03F4
.................... break;
0BB6: BRA 0BB8
0BB8: MOVLB 4
.................... }
.................... }
.................... }
0BBA: MOVLB 0
0BBC: GOTO 0BE6 (RETURN)
....................
.................... //handle OUT token done interrupt on endpoint 3 [buffer incoming received chars]
.................... void usb_isr_tok_out_cdc_data_dne(void) {
.................... usb_cdc_get_buffer_status.got=TRUE;
*
0F2C: BSF x7D.0
.................... usb_cdc_get_buffer_status.index=0;
0F2E: CLRF x7F
.................... #if (defined(__PIC__) && __PIC__)
.................... usb_cdc_get_buffer_status.len=usb_rx_packet_size(USB_CDC_DATA_OUT_ENDPOINT);
0F30: MOVLW 02
0F32: MOVLB 6
0F34: MOVWF xFE
0F36: MOVLB 0
0F38: BRA 0EE6
0F3A: MOVFF 01,7E
.................... #else
.................... usb_cdc_get_buffer_status.len=usb_get_packet_buffer(
.................... USB_CDC_DATA_OUT_ENDPOINT,&usb_cdc_get_buffer_status_buffer[0],USB_CDC_DATA_OUT_SIZE);
.................... #endif
.................... }
0F3E: GOTO 0F5A (RETURN)
....................
.................... //handle IN token done interrupt on endpoint 2 [transmit buffered characters]
.................... void usb_isr_tok_in_cdc_data_dne(void)
.................... {
.................... //putc('!');
.................... if (usb_cdc_put_buffer_nextin /* || (g_LastCDCDataPacketSize == USB_CDC_DATA_IN_SIZE)*/ )
*
104E: MOVF x7C,F
1050: BZ 1054
.................... {
.................... //printf("FL3 %LU\r\n", (int16)usb_cdc_put_buffer_nextin);
.................... usb_cdc_flush_out_buffer();
1052: RCALL 102C
.................... }
.................... }
1054: GOTO 1084 (RETURN)
....................
.................... void usb_cdc_flush_out_buffer(void)
.................... {
.................... //printf(putc_tbe, "FL %U\r\n", usb_cdc_put_buffer_nextin);
.................... usb_put_packet(USB_CDC_DATA_IN_ENDPOINT,usb_cdc_put_buffer,usb_cdc_put_buffer_nextin,USB_DTS_TOGGLE);
*
102C: MOVLW 02
102E: MOVLB 7
1030: MOVWF x3A
1032: CLRF x3C
1034: MOVLW 3C
1036: MOVWF x3B
1038: CLRF x3E
103A: MOVFF 7C,73D
103E: MOVLW 02
1040: MOVWF x3F
1042: MOVLB 0
1044: RCALL 0F88
.................... g_LastCDCDataPacketSize = usb_cdc_put_buffer_nextin;
1046: MOVFF 7C,82
.................... usb_cdc_put_buffer_nextin=0;
104A: CLRF x7C
.................... }
104C: RETLW 00
....................
.................... void usb_cdc_init(void)
.................... {
.................... usb_cdc_line_coding.dwDTERrate = 9600;
*
035C: CLRF 2E
035E: CLRF 2D
0360: MOVLW 25
0362: MOVWF 2C
0364: MOVLW 80
0366: MOVWF 2B
.................... usb_cdc_line_coding.bCharFormat = 0;
0368: CLRF 2F
.................... usb_cdc_line_coding.bParityType = 0;
036A: CLRF 30
.................... usb_cdc_line_coding.bDataBits = 8;
036C: MOVLW 08
036E: MOVWF 31
.................... (int8)usb_cdc_carrier = 0;
0370: CLRF x81
.................... usb_cdc_got_set_line_coding = FALSE;
0372: BCF x80.0
.................... usb_cdc_break = 0;
0374: CLRF 33
0376: CLRF 32
.................... usb_cdc_put_buffer_nextin = 0;
0378: CLRF x7C
.................... usb_cdc_get_buffer_status.got = 0;
037A: BCF x7D.0
.................... }
037C: RETLW 00
....................
.................... ////////////////// END USB CONTROL HANDLING //////////////////////////////////
....................
.................... ////////////////// BEGIN USB<->RS232 CDC LIBRARY /////////////////////////////
....................
.................... void usb_cdc_get_discard(void)
.................... {
.................... usb_cdc_get_buffer_status.got = FALSE;
.................... usb_flush_out(USB_CDC_DATA_OUT_ENDPOINT, USB_DTS_TOGGLE);
.................... }
....................
.................... char usb_cdc_getc(void)
.................... {
.................... char c;
....................
.................... while (!usb_cdc_kbhit()) {}
....................
.................... c=usb_cdc_get_buffer_status_buffer[usb_cdc_get_buffer_status.index++];
....................
.................... if (usb_cdc_get_buffer_status.index >= usb_cdc_get_buffer_status.len)
.................... {
.................... usb_cdc_get_discard();
.................... }
....................
.................... return(c);
.................... }
....................
.................... void usb_cdc_putc_fast(char c)
.................... {
.................... #if defined(__PCH__)
.................... int1 old_gie;
....................
.................... //disable global interrupts
.................... old_gie = INT_GIE;
*
1376: MOVLB 6
1378: BCF xDD.0
137A: BTFSC FF2.7
137C: BSF xDD.0
.................... INT_GIE = 0;
137E: BCF FF2.7
.................... #else
.................... int16 oldSR;
....................
.................... oldSR = SR;
.................... SR |= 0xE0;
.................... #endif
....................
.................... if (usb_cdc_put_buffer_nextin >= USB_CDC_DATA_IN_SIZE) {
1380: MOVLB 0
1382: MOVF x7C,W
1384: SUBLW 3F
1386: BC 138C
.................... usb_cdc_put_buffer_nextin = USB_CDC_DATA_IN_SIZE-1; //we just overflowed the buffer!
1388: MOVLW 3F
138A: MOVWF x7C
.................... }
.................... usb_cdc_put_buffer[usb_cdc_put_buffer_nextin++] = c;
138C: MOVF x7C,W
138E: INCF x7C,F
1390: CLRF 03
1392: ADDLW 3C
1394: MOVWF FE9
1396: MOVLW 00
1398: ADDWFC 03,W
139A: MOVWF FEA
139C: MOVFF 6DC,FEF
....................
.................... //renable global interrupts
.................... #if defined(__PCH__)
.................... INT_GIE = old_gie;
13A0: BCF FF2.7
13A2: MOVLB 6
13A4: BTFSC xDD.0
13A6: BSF FF2.7
13A8: CLRF 18
13AA: BTFSC FF2.7
13AC: BSF 18.7
13AE: BCF FF2.7
.................... #else
.................... SR = oldSR;
.................... #endif
....................
.................... /*
.................... if (usb_tbe(USB_CDC_DATA_IN_ENDPOINT)) {
.................... if (usb_cdc_put_buffer_nextin)
.................... usb_cdc_flush_out_buffer();
.................... }
.................... */
.................... if (usb_cdc_put_buffer_free()) {
13B0: MOVLW 02
13B2: MOVLB 7
13B4: MOVWF x47
13B6: MOVLB 0
13B8: RCALL 0D06
13BA: BTFSC 18.7
13BC: BSF FF2.7
13BE: MOVF 01,F
13C0: BZ 13D0
13C2: CLRF 18
13C4: BTFSC FF2.7
13C6: BSF 18.7
13C8: BCF FF2.7
.................... //printf("FL2 %LU\r\n", (int16)usb_cdc_put_buffer_nextin);
.................... usb_cdc_flush_out_buffer();
13CA: RCALL 102C
13CC: BTFSC 18.7
13CE: BSF FF2.7
.................... }
.................... //putc('*');
.................... }
13D0: GOTO 140A (RETURN)
....................
.................... void usb_cdc_putc(char c)
.................... {
.................... while (!usb_cdc_putready())
.................... {
13D4: MOVF x7C,W
13D6: SUBLW 3F
13D8: BC 1404
13DA: CLRF 18
13DC: BTFSC FF2.7
13DE: BSF 18.7
13E0: BCF FF2.7
.................... if (usb_cdc_put_buffer_free())
13E2: MOVLW 02
13E4: MOVLB 7
13E6: MOVWF x47
13E8: MOVLB 0
13EA: RCALL 0D06
13EC: BTFSC 18.7
13EE: BSF FF2.7
13F0: MOVF 01,F
13F2: BZ 1402
13F4: CLRF 18
13F6: BTFSC FF2.7
13F8: BSF 18.7
13FA: BCF FF2.7
.................... {
.................... //printf("FL1 %LU\r\n", (int16)usb_cdc_put_buffer_nextin);
.................... usb_cdc_flush_out_buffer();
13FC: RCALL 102C
13FE: BTFSC 18.7
1400: BSF FF2.7
.................... }
.................... //delay_ms(500);
.................... //printf(putc_tbe,"TBE=%U CNT=%U LST=%U\r\n",usb_tbe(USB_CDC_DATA_IN_ENDPOINT), usb_cdc_put_buffer_nextin, usb_cdc_last_data_packet_size);
.................... }
1402: BRA 13D4
.................... //putc('.');
.................... //putc(c);
.................... usb_cdc_putc_fast(c);
1404: MOVFF 6DB,6DC
1408: BRA 1376
.................... }
140A: RETLW 00
....................
.................... #include <ctype.h>
.................... ////////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996,2003 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS C ////
.................... //// compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, reproduction ////
.................... //// or distribution is permitted without written permission. ////
.................... //// Derivative programs created using this software in object code ////
.................... //// form are not restricted in any way. ////
.................... ////////////////////////////////////////////////////////////////////////////
....................
.................... #ifndef _CTYPE
.................... #define _CTYPE
....................
.................... #define islower(x) isamong(x,"abcdefghijklmnopqrstuvwxyz")
.................... #define isupper(x) isamong(x,"ABCDEFGHIJKLMNOPQRSTUVWXYZ")
.................... #define isalnum(x) isamong(x,"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
.................... #define isalpha(x) isamong(x,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
.................... #define isdigit(x) isamong(x,"0123456789")
.................... #define isspace(x) ((x)==' ')
.................... #define isxdigit(x) isamong(x,"0123456789ABCDEFabcdef")
.................... #define iscntrl(x) ((x)<' ')
.................... #define isprint(x) ((x)>=' ')
.................... #define isgraph(x) ((x)>' ')
.................... #define ispunct(x) (((x)>' ')&&!isalnum(x))
....................
.................... #endif
....................
....................
....................
.................... BYTE gethex1_usb()
.................... {
.................... char digit;
....................
.................... digit = usb_cdc_getc();
....................
.................... usb_cdc_putc(digit);
....................
.................... if(digit<='9')
.................... return(digit-'0');
.................... else
.................... return((toupper(digit)-'A')+10);
.................... }
....................
.................... BYTE gethex_usb() {
.................... unsigned int8 lo,hi;
....................
.................... hi = gethex1_usb();
.................... lo = gethex1_usb();
.................... if(lo==0xdd)
.................... return(hi);
.................... else
.................... return( hi*16+lo );
.................... }
....................
.................... void get_string_usb(char* s, unsigned int max) {
.................... unsigned int len;
.................... char c;
....................
.................... --max;
.................... len=0;
.................... do {
.................... c=usb_cdc_getc();
.................... if(c==8) { // Backspace
.................... if(len>0) {
.................... len--;
.................... usb_cdc_putc(c);
.................... usb_cdc_putc(' ');
.................... usb_cdc_putc(c);
.................... }
.................... } else if ((c>=' ')&&(c<='~'))
.................... if(len<max) {
.................... s[len++]=c;
.................... usb_cdc_putc(c);
.................... }
.................... } while(c!=13);
.................... s[len]=0;
.................... }
....................
....................
.................... // stdlib.h is required for the ato_ conversions
.................... // in the following functions
.................... #ifdef _STDLIB
....................
.................... signed int get_int_usb() {
.................... char s[7];
.................... signed int i;
....................
.................... get_string_usb(s, 7);
....................
.................... i=atoi(s);
.................... return(i);
.................... }
....................
.................... signed long get_long_usb() {
.................... char s[13];
.................... signed long l;
....................
.................... get_string_usb(s, 13);
.................... l=atol(s);
.................... return(l);
.................... }
....................
.................... float get_float_usb() {
.................... char s[20];
.................... float f;
....................
.................... get_string_usb(s, 20);
.................... f = atof(s);
.................... return(f);
.................... }
....................
.................... #endif
....................
.................... #include <math.h>
.................... ////////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996,2008 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS C ////
.................... //// compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, reproduction ////
.................... //// or distribution is permitted without written permission. ////
.................... //// Derivative programs created using this software in object code ////
.................... //// form are not restricted in any way. ////
.................... ////////////////////////////////////////////////////////////////////////////
.................... //// ////
.................... //// History: ////
.................... //// * 9/20/2001 : Improvments are made to sin/cos code. ////
.................... //// The code now is small, much faster, ////
.................... //// and more accurate. ////
.................... //// * 2/21/2007 : Compiler handles & operator differently and does
.................... //// not return generic (int8 *) so type cast is done ////
.................... //// ////
.................... ////////////////////////////////////////////////////////////////////////////
....................
.................... #ifndef MATH_H
.................... #define MATH_H
....................
.................... #ifdef PI
.................... #undef PI
.................... #endif
.................... #define PI 3.1415926535897932
....................
....................
.................... #define SQRT2 1.4142135623730950
....................
.................... //float const ps[4] = {5.9304945, 21.125224, 8.9403076, 0.29730279};
.................... //float const qs[4] = {1.0000000, 15.035723, 17.764134, 2.4934718};
....................
.................... ///////////////////////////// Round Functions //////////////////////////////
....................
.................... float32 CEIL_FLOOR(float32 x, unsigned int8 n)
.................... {
.................... float32 y, res;
.................... unsigned int16 l;
.................... int1 s;
....................
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y <= 32768.0)
.................... res = (float32)(unsigned int16)y;
....................
.................... else if (y < 10000000.0)
.................... {
.................... l = (unsigned int16)(y/32768.0);
.................... y = 32768.0*(y/32768.0 - (float32)l);
.................... res = 32768.0*(float32)l;
.................... res += (float32)(unsigned int16)y;
.................... }
....................
.................... else
.................... res = y;
....................
.................... y = y - (float32)(unsigned int16)y;
....................
.................... if (s)
.................... res = -res;
....................
.................... if (y != 0)
.................... {
.................... if (s == 1 && n == 0)
.................... res -= 1.0;
....................
.................... if (s == 0 && n == 1)
.................... res += 1.0;
.................... }
.................... if (x == 0)
.................... res = 0;
....................
.................... return (res);
.................... }
....................
.................... // Overloaded Functions to take care for new Data types in PCD
.................... // Overloaded function CEIL_FLOOR() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 CEIL_FLOOR(float48 x, unsigned int8 n)
.................... {
.................... float48 y, res;
.................... unsigned int16 l;
.................... int1 s;
....................
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y <= 32768.0)
.................... res = (float48)(unsigned int16)y;
....................
.................... else if (y < 10000000.0)
.................... {
.................... l = (unsigned int16)(y/32768.0);
.................... y = 32768.0*(y/32768.0 - (float48)l);
.................... res = 32768.0*(float32)l;
.................... res += (float48)(unsigned int16)y;
.................... }
....................
.................... else
.................... res = y;
....................
.................... y = y - (float48)(unsigned int16)y;
....................
.................... if (s)
.................... res = -res;
....................
.................... if (y != 0)
.................... {
.................... if (s == 1 && n == 0)
.................... res -= 1.0;
....................
.................... if (s == 0 && n == 1)
.................... res += 1.0;
.................... }
.................... if (x == 0)
.................... res = 0;
....................
.................... return (res);
.................... }
....................
....................
.................... // Overloaded function CEIL_FLOOR() for data type - Float64
.................... float64 CEIL_FLOOR(float64 x, unsigned int8 n)
.................... {
.................... float64 y, res;
.................... unsigned int16 l;
.................... int1 s;
....................
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y <= 32768.0)
.................... res = (float64)(unsigned int16)y;
....................
.................... else if (y < 10000000.0)
.................... {
.................... l = (unsigned int16)(y/32768.0);
.................... y = 32768.0*(y/32768.0 - (float64)l);
.................... res = 32768.0*(float64)l;
.................... res += (float64)(unsigned int16)y;
.................... }
....................
.................... else
.................... res = y;
....................
.................... y = y - (float64)(unsigned int16)y;
....................
.................... if (s)
.................... res = -res;
....................
.................... if (y != 0)
.................... {
.................... if (s == 1 && n == 0)
.................... res -= 1.0;
....................
.................... if (s == 0 && n == 1)
.................... res += 1.0;
.................... }
.................... if (x == 0)
.................... res = 0;
....................
.................... return (res);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float floor(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : rounds down the number x.
.................... // Date : N/A
.................... //
.................... float32 floor(float32 x)
.................... {
.................... return CEIL_FLOOR(x, 0);
.................... }
.................... // Following 2 functions are overloaded functions of floor() for PCD
.................... // Overloaded function floor() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 floor(float48 x)
.................... {
.................... return CEIL_FLOOR(x, 0);
.................... }
....................
.................... // Overloaded function floor() for data type - Float64
.................... float64 floor(float64 x)
.................... {
.................... return CEIL_FLOOR(x, 0);
.................... }
.................... #endif
....................
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float ceil(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : rounds up the number x.
.................... // Date : N/A
.................... //
.................... float32 ceil(float32 x)
.................... {
.................... return CEIL_FLOOR(x, 1);
.................... }
.................... // Following 2 functions are overloaded functions of ceil() for PCD
.................... // Overloaded function ceil() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 ceil(float48 x)
.................... {
.................... return CEIL_FLOOR(x, 1);
.................... }
....................
.................... // Overloaded function ceil() for data type - Float64
.................... float64 ceil(float64 x)
.................... {
.................... return CEIL_FLOOR(x, 1);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float fabs(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : Computes the absolute value of floating point number x
.................... // Returns : returns the absolute value of x
.................... // Date : N/A
.................... //
.................... #define fabs abs
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float fmod(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : Computes the floating point remainder of x/y
.................... // Returns : returns the value of x= i*y, for some integer i such that, if y
.................... // is non zero, the result has the same isgn of x na dmagnitude less than the
.................... // magnitude of y. If y is zero then a domain error occurs.
.................... // Date : N/A
.................... //
....................
.................... float fmod(float32 x,float32 y)
.................... {
.................... float32 i;
.................... if (y!=0.0)
.................... {
.................... i=(x/y < 0.0)? ceil(x/y): floor(x/y);
.................... return(x-(i*y));
.................... }
.................... else
.................... {
.................... #ifdef _ERRNO
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... }
.................... }
.................... //Overloaded function for fmod() for PCD
.................... // Overloaded function fmod() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 fmod(float48 x,float48 y)
.................... {
.................... float48 i;
.................... if (y!=0.0)
.................... {
.................... i=(x/y < 0.0)? ceil(x/y): floor(x/y);
.................... return(x-(i*y));
.................... }
.................... else
.................... {
.................... #ifdef _ERRNO
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... }
.................... }
.................... // Overloaded function fmod() for data type - Float64
.................... float64 fmod(float64 x,float64 y)
.................... {
.................... float64 i;
.................... if (y!=0.0)
.................... {
.................... i=(x/y < 0.0)? ceil(x/y): floor(x/y);
.................... return(x-(i*y));
.................... }
.................... else
.................... {
.................... #ifdef _ERRNO
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... }
.................... }
.................... #endif
.................... //////////////////// Exponential and logarithmic functions ////////////////////
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float exp(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the value (e^x)
.................... // Date : N/A
.................... //
.................... #define LN2 0.6931471805599453
....................
.................... float const pe[6] = {0.000207455774, 0.00127100575, 0.00965065093,
.................... 0.0554965651, 0.240227138, 0.693147172};
....................
....................
.................... float32 exp(float32 x)
.................... {
.................... float32 y, res, r;
.................... #if defined(__PCD__)
.................... int8 data1;
.................... #endif
.................... signed int8 n;
.................... int1 s;
.................... #ifdef _ERRNO
.................... if(x > 88.722838)
.................... {
.................... errno=ERANGE;
.................... return(0);
.................... }
.................... #endif
.................... n = (signed int16)(x/LN2);
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... n = -n;
.................... y = -y;
.................... }
....................
.................... res = 0.0;
.................... #if !defined(__PCD__)
.................... *((unsigned int8 *)(&res)) = n + 0x7F;
.................... #endif
....................
.................... #if defined(__PCD__) // Takes care of IEEE format for PCD
.................... data1 = n+0x7F;
.................... if(bit_test(data1,0))
.................... bit_set(*(((unsigned int8 *)(&res)+2)),7);
.................... rotate_right(&data1,1);
.................... bit_clear(data1,7);
.................... *(((unsigned int8 *)(&res)+3)) = data1;
.................... #endif
....................
.................... y = y/LN2 - (float32)n;
....................
.................... r = pe[0]*y + pe[1];
.................... r = r*y + pe[2];
.................... r = r*y + pe[3];
.................... r = r*y + pe[4];
.................... r = r*y + pe[5];
....................
.................... res = res*(1.0 + y*r);
....................
.................... if (s)
.................... res = 1.0/res;
.................... return(res);
.................... }
....................
....................
.................... //Overloaded function for exp() for PCD
.................... // Overloaded function exp() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 exp(float48 x)
.................... {
.................... float48 y, res, r;
.................... int8 data1;
.................... signed int8 n;
.................... int1 s;
.................... #ifdef _ERRNO
.................... if(x > 88.722838)
.................... {
.................... errno=ERANGE;
.................... return(0);
.................... }
.................... #endif
.................... n = (signed int16)(x/LN2);
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... n = -n;
.................... y = -y;
.................... }
....................
.................... res = 0.0;
....................
.................... data1 = n+0x7F;
.................... if(bit_test(data1,0))
.................... bit_set(*(((unsigned int8 *)(&res)+4)),7);
.................... rotate_right(&data1,1);
.................... bit_clear(data1,7);
.................... *(((unsigned int8 *)(&res)+5)) = data1;
....................
.................... y = y/LN2 - (float48)n;
....................
.................... r = pe[0]*y + pe[1];
.................... r = r*y + pe[2];
.................... r = r*y + pe[3];
.................... r = r*y + pe[4];
.................... r = r*y + pe[5];
....................
.................... res = res*(1.0 + y*r);
....................
.................... if (s)
.................... res = 1.0/res;
.................... return(res);
.................... }
....................
.................... // Overloaded function exp() for data type - Float64
.................... float64 exp(float64 x)
.................... {
.................... float64 y, res, r;
.................... unsigned int16 data1, data2;
.................... unsigned int16 *p;
.................... signed int16 n;
.................... int1 s;
.................... #ifdef _ERRNO
.................... if(x > 709.7827128)
.................... {
.................... errno=ERANGE;
.................... return(0);
.................... }
.................... #endif
.................... n = (signed int16)(x/LN2);
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... n = -n;
.................... y = -y;
.................... }
....................
.................... res = 0.0;
....................
.................... #if !defined(__PCD__)
.................... *((unsigned int16 *)(&res)) = n + 0x7F;
.................... #endif
.................... p= (((unsigned int16 *)(&res))+3);
.................... data1 = *p;
.................... data2 = *p;
.................... data1 = n + 0x3FF;
.................... data1 = data1 <<4;
.................... if(bit_test(data2,15))
.................... bit_set(data1,15);
.................... data2 = data2 & 0x000F;
.................... data1 ^= data2;
....................
.................... *(((unsigned int16 *)(&res)+3)) = data1;
....................
....................
.................... y = y/LN2 - (float64)n;
....................
.................... r = pe[0]*y + pe[1];
.................... r = r*y + pe[2];
.................... r = r*y + pe[3];
.................... r = r*y + pe[4];
.................... r = r*y + pe[5];
....................
.................... res = res*(1.0 + y*r);
....................
.................... if (s)
.................... res = 1.0/res;
.................... return(res);
.................... }
....................
.................... #ENDIF
....................
....................
.................... /************************************************************/
....................
.................... float32 const pl[4] = {0.45145214, -9.0558803, 26.940971, -19.860189};
.................... float32 const ql[4] = {1.0000000, -8.1354259, 16.780517, -9.9300943};
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float log(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the the natural log of x
.................... // Date : N/A
.................... //
.................... float32 log(float32 x)
.................... {
.................... float32 y, res, r, y2;
.................... #if defined(__PCD__)
.................... unsigned int8 data1,data2;
.................... #endif
.................... signed int8 n;
.................... #ifdef _ERRNO
.................... if(x <0)
.................... {
.................... errno=EDOM;
.................... }
.................... if(x ==0)
.................... {
.................... errno=ERANGE;
.................... return(0);
.................... }
.................... #endif
.................... y = x;
....................
.................... if (y != 1.0)
.................... {
.................... #if !defined(__PCD__)
.................... *((unsigned int8 *)(&y)) = 0x7E;
.................... #endif
....................
.................... #if defined(__PCD__) // Takes care of IEEE format
.................... data2 = *(((unsigned int8 *)(&y))+3);
.................... *(((unsigned int8 *)(&y))+3) = 0x3F;
.................... data1 = *(((unsigned int8 *)(&y))+2);
.................... bit_clear(data1,7);
.................... *(((unsigned int8 *)(&y))+2) = data1;
.................... if(bit_test(data2,7))
.................... bit_set(*(((unsigned int8 *)(&y))+3),7);
.................... #endif
....................
.................... y = (y - 1.0)/(y + 1.0);
....................
.................... y2=y*y;
....................
.................... res = pl[0]*y2 + pl[1];
.................... res = res*y2 + pl[2];
.................... res = res*y2 + pl[3];
....................
.................... r = ql[0]*y2 + ql[1];
.................... r = r*y2 + ql[2];
.................... r = r*y2 + ql[3];
....................
.................... res = y*res/r;
.................... #if !defined(__PCD__)
.................... n = *((unsigned int8 *)(&x)) - 0x7E;
.................... #endif
.................... #if defined(__PCD__)
.................... data1 = *(((unsigned int8 *)(&x)+3));
.................... rotate_left(&data1,1);
.................... data2 = *(((unsigned int8 *)(&x)+2));
.................... if(bit_test (data2,7))
.................... bit_set(data1,0);
.................... n = data1 - 0x7E;
.................... #endif
....................
.................... if (n<0)
.................... r = -(float32)-n;
.................... else
.................... r = (float32)n;
....................
.................... res += r*LN2;
.................... }
....................
.................... else
.................... res = 0.0;
....................
.................... return(res);
.................... }
....................
.................... //Overloaded function for log() for PCD
.................... // Overloaded function log() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 log(float48 x)
.................... {
.................... float48 y, res, r, y2;
.................... unsigned int8 data1,data2;
.................... signed int8 n;
.................... #ifdef _ERRNO
.................... if(x <0)
.................... {
.................... errno=EDOM;
.................... }
.................... if(x ==0)
.................... {
.................... errno=ERANGE;
.................... return(0);
.................... }
.................... #endif
.................... y = x;
....................
.................... if (y != 1.0)
.................... {
....................
.................... #if !defined(__PCD__)
.................... *((unsigned int8 *)(&y)) = 0x7E;
.................... #endif
.................... data2 = *(((unsigned int8 *)(&y))+5);
.................... *(((unsigned int8 *)(&y))+5) = 0x3F;
.................... data1 = *(((unsigned int8 *)(&y))+4);
.................... bit_clear(data1,7);
.................... *(((unsigned int8 *)(&y))+4) = data1;
....................
.................... if(bit_test(data2,7))
.................... bit_set(*(((unsigned int8 *)(&y))+4),7);
.................... y = (y - 1.0)/(y + 1.0);
....................
.................... y2=y*y;
....................
.................... res = pl[0]*y2 + pl[1];
.................... res = res*y2 + pl[2];
.................... res = res*y2 + pl[3];
....................
.................... r = ql[0]*y2 + ql[1];
.................... r = r*y2 + ql[2];
.................... r = r*y2 + ql[3];
....................
.................... res = y*res/r;
....................
.................... data1 = *(((unsigned int8 *)(&x)+5));
.................... rotate_left(&data1,1);
.................... data2 = *(((unsigned int8 *)(&x)+4));
.................... if(bit_test (data2,7))
.................... bit_set(data1,0);
....................
.................... n = data1 - 0x7E;
....................
.................... if (n<0)
.................... r = -(float48)-n;
.................... else
.................... r = (float48)n;
....................
.................... res += r*LN2;
.................... }
....................
.................... else
.................... res = 0.0;
....................
.................... return(res);
.................... }
....................
.................... // Overloaded function log() for data type - Float48
.................... #if defined(__PCD__)
.................... float32 const pl_64[4] = {0.45145214, -9.0558803, 26.940971, -19.860189};
.................... float32 const ql_64[4] = {1.0000000, -8.1354259, 16.780517, -9.9300943};
.................... #endif
.................... float64 log(float64 x)
.................... {
.................... float64 y, res, r, y2;
.................... unsigned int16 data1,data2;
.................... unsigned int16 *p;
.................... signed int16 n;
.................... #ifdef _ERRNO
.................... if(x <0)
.................... {
.................... errno=EDOM;
.................... }
.................... if(x ==0)
.................... {
.................... errno=ERANGE;
.................... return(0);
.................... }
.................... #endif
.................... y = x;
....................
.................... if (y != 1.0)
.................... {
.................... #if !defined(__PCD__)
.................... *((unsigned int8 *)(&y)) = 0x7E;
.................... #endif
.................... p= (((unsigned int16 *)(&y))+3);
.................... data1 = *p;
.................... data2 = *p;
.................... data1 = 0x3FE;
.................... data1 = data1 <<4;
.................... if(bit_test (data2,15))
.................... bit_set(data1,15);
.................... data2 = data2 & 0x000F;
.................... data1 ^=data2;
....................
.................... *p = data1;
....................
.................... y = (y - 1.0)/(y + 1.0);
....................
.................... y2=y*y;
....................
.................... res = pl_64[0]*y2 + pl_64[1];
.................... res = res*y2 + pl_64[2];
.................... res = res*y2 + pl_64[3];
....................
.................... r = ql_64[0]*y2 + ql_64[1];
.................... r = r*y2 + ql_64[2];
.................... r = r*y2 + ql_64[3];
....................
.................... res = y*res/r;
....................
.................... p= (((unsigned int16 *)(&x))+3);
.................... data1 = *p;
.................... bit_clear(data1,15);
.................... data1 = data1 >>4;
.................... n = data1 - 0x3FE;
....................
....................
.................... if (n<0)
.................... r = -(float64)-n;
.................... else
.................... r = (float64)n;
....................
.................... res += r*LN2;
.................... }
....................
.................... else
.................... res = 0.0;
....................
.................... return(res);
.................... }
.................... #endif
....................
....................
.................... #define LN10 2.3025850929940456
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float log10(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the the log base 10 of x
.................... // Date : N/A
.................... //
.................... float32 log10(float32 x)
.................... {
.................... float32 r;
....................
.................... r = log(x);
.................... r = r/LN10;
.................... return(r);
.................... }
....................
.................... //Overloaded functions for log10() for PCD
.................... // Overloaded function log10() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 log10(float48 x)
.................... {
.................... float48 r;
....................
.................... r = log(x);
.................... r = r/LN10;
.................... return(r);
.................... }
....................
.................... // Overloaded function log10() for data type - Float64
.................... float64 log10(float64 x)
.................... {
.................... float64 r;
....................
.................... r = log(x);
.................... r = r/LN10;
.................... return(r);
.................... }
.................... #endif
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float modf(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description :breaks the argument value int integral and fractional parts,
.................... // ach of which have the same sign as the argument. It stores the integral part
.................... // as a float in the object pointed to by the iptr
.................... // Returns : returns the signed fractional part of value.
.................... // Date : N/A
.................... //
....................
.................... float32 modf(float32 value,float32 *iptr)
.................... {
.................... *iptr=(value < 0.0)? ceil(value): floor(value);
.................... return(value - *iptr);
.................... }
.................... //Overloaded functions for modf() for PCD
.................... // Overloaded function modf() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 modf(float48 value,float48 *iptr)
.................... {
.................... *iptr=(value < 0.0)? ceil(value): floor(value);
.................... return(value - *iptr);
.................... }
.................... // Overloaded function modf() for data type - Float64
.................... float64 modf(float64 value,float64 *iptr)
.................... {
.................... *iptr=(value < 0.0)? ceil(value): floor(value);
.................... return(value - *iptr);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float pwr(float x,float y)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the value (x^y)
.................... // Date : N/A
.................... //
.................... float32 pwr(float32 x,float32 y)
.................... {
.................... if(x>=0)
.................... return( exp(y*log(x)) );
.................... else
.................... return( -exp(y*log(-x)) );
.................... }
.................... //Overloaded functions for pwr() for PCD
.................... // Overloaded function pwr() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 pwr(float48 x,float48 y)
.................... {
.................... if(x>=0)
.................... return( exp(y*log(x)) );
.................... else
.................... return( -exp(y*log(-x)) );
.................... }
.................... // Overloaded function pwr() for data type - Float64
.................... float64 pwr(float64 x,float64 y)
.................... {
.................... if(x>=0)
.................... return( exp(y*log(x)) );
.................... else
.................... return( -exp(y*log(-x)) );
.................... }
.................... #endif
....................
.................... //////////////////// Power functions ////////////////////
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float pow(float x,float y)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the value (x^y)
.................... // Date : N/A
.................... //
.................... float32 pow(float32 x,float32 y)
.................... {
.................... if(x>=0)
.................... return( exp(y*log(x)) );
.................... else
.................... return( -exp(y*log(-x)) );
.................... }
.................... //Overloaded functions for pow() for PCD
.................... // Overloaded function for pow() data type - Float48
.................... #if defined(__PCD__)
.................... float48 pow(float48 x,float48 y)
.................... {
.................... if(x>=0)
.................... return( exp(y*log(x)) );
.................... else
.................... return( -exp(y*log(-x)) );
.................... }
....................
.................... // Overloaded function pow() for data type - Float64
.................... float64 pow(float64 x,float64 y)
.................... {
.................... if(x>=0)
.................... return( exp(y*log(x)) );
.................... else
.................... return( -exp(y*log(-x)) );
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float sqrt(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the square root of x
.................... // Date : N/A
.................... //
.................... float32 sqrt(float32 x)
.................... {
.................... float32 y, res;
.................... #if defined(__PCD__)
.................... unsigned int16 data1,data2;
.................... #endif
.................... BYTE *p;
....................
.................... #ifdef _ERRNO
.................... if(x < 0)
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
....................
.................... if( x<=0.0)
*
19C2: MOVFF 6DF,6ED
19C6: MOVFF 6DE,6EC
19CA: MOVFF 6DD,6EB
19CE: MOVFF 6DC,6EA
19D2: MOVLB 6
19D4: CLRF xF1
19D6: CLRF xF0
19D8: CLRF xEF
19DA: CLRF xEE
19DC: MOVLB 0
19DE: RCALL 1948
19E0: BC 19E4
19E2: BNZ 19EE
.................... return(0.0);
19E4: CLRF 00
19E6: CLRF 01
19E8: CLRF 02
19EA: CLRF 03
19EC: BRA 1ADE
....................
.................... y=x;
19EE: MOVFF 6DF,6E3
19F2: MOVFF 6DE,6E2
19F6: MOVFF 6DD,6E1
19FA: MOVFF 6DC,6E0
....................
.................... #if !defined(__PCD__)
.................... p=&y;
19FE: MOVLW 06
1A00: MOVLB 6
1A02: MOVWF xE9
1A04: MOVLW E0
1A06: MOVWF xE8
.................... (*p)=(BYTE)((((unsigned int16)(*p)) + 127) >> 1);
1A08: MOVFF 6E8,FE9
1A0C: MOVFF 6E9,FEA
1A10: MOVF FEF,W
1A12: CLRF xED
1A14: MOVWF xEC
1A16: MOVLW 7F
1A18: ADDWF xEC,F
1A1A: MOVLW 00
1A1C: ADDWFC xED,F
1A1E: BCF FD8.0
1A20: RRCF xED,W
1A22: RRCF xEC,W
1A24: MOVFF 6E9,FEA
1A28: MOVFF 6E8,FE9
1A2C: MOVWF FEF
.................... #endif
....................
.................... #if defined(__PCD__)
.................... p = (((unsigned int8 *)(&y))+3);
.................... data1 = *(((unsigned int8 *)(&y))+3);
.................... data2 = *(((unsigned int8 *)(&y))+2);
.................... rotate_left(&data1,1);
.................... if(bit_test(data2,7))
.................... bit_set(data1,0);
.................... data1 = ((data1+127) >>1);
.................... bit_clear(data2,7);
.................... if(bit_test(data1,0))
.................... bit_set(data2,7);
.................... data1 = data1 >>1;
.................... *(((unsigned int8 *)(&y))+3) = data1;
.................... *(((unsigned int8 *)(&y))+2) = data2;
....................
.................... #endif
....................
.................... do {
.................... res=y;
1A2E: MOVFF 6E3,6E7
1A32: MOVFF 6E2,6E6
1A36: MOVFF 6E1,6E5
1A3A: MOVFF 6E0,6E4
.................... y+=(x/y);
1A3E: MOVFF 6DF,6ED
1A42: MOVFF 6DE,6EC
1A46: MOVFF 6DD,6EB
1A4A: MOVFF 6DC,6EA
1A4E: MOVFF 6E3,6F1
1A52: MOVFF 6E2,6F0
1A56: MOVFF 6E1,6EF
1A5A: MOVFF 6E0,6EE
1A5E: MOVLB 0
1A60: RCALL 16BA
1A62: BCF FD8.1
1A64: MOVFF 6E3,6ED
1A68: MOVFF 6E2,6EC
1A6C: MOVFF 6E1,6EB
1A70: MOVFF 6E0,6EA
1A74: MOVFF 03,6F1
1A78: MOVFF 02,6F0
1A7C: MOVFF 01,6EF
1A80: MOVFF 00,6EE
1A84: RCALL 1442
1A86: MOVFF 03,6E3
1A8A: MOVFF 02,6E2
1A8E: MOVFF 01,6E1
1A92: MOVFF 00,6E0
....................
.................... #if !defined(__PCD__)
.................... (*p)--;
1A96: MOVLB 6
1A98: MOVFF 6E8,FE9
1A9C: MOVFF 6E9,FEA
1AA0: DECF FEF,F
.................... #endif
....................
.................... #if defined(__PCD__)
.................... data1 = *(((unsigned int8 *)(&y))+3);
.................... data2 = *(((unsigned int8 *)(&y))+2);
.................... rotate_left(&data1,1);
.................... if(bit_test(data2,7))
.................... bit_set(data1,0);
.................... data1--;
.................... bit_clear(data2,7);
.................... if(bit_test(data1,0))
.................... bit_set(data2,7);
.................... data1 = data1 >>1;
.................... *(((unsigned int8 *)(&y))+3) = data1;
.................... *(((unsigned int8 *)(&y))+2) = data2;
....................
.................... #endif
.................... } while(res != y);
1AA2: MOVFF 6E7,6ED
1AA6: MOVFF 6E6,6EC
1AAA: MOVFF 6E5,6EB
1AAE: MOVFF 6E4,6EA
1AB2: MOVFF 6E3,6F1
1AB6: MOVFF 6E2,6F0
1ABA: MOVFF 6E1,6EF
1ABE: MOVFF 6E0,6EE
1AC2: MOVLB 0
1AC4: RCALL 1948
1AC6: BTFSC FD8.2
1AC8: BRA 1ACE
1ACA: MOVLB 6
1ACC: BRA 1A2E
....................
.................... return(res);
1ACE: MOVFF 6E4,00
1AD2: MOVFF 6E5,01
1AD6: MOVFF 6E6,02
1ADA: MOVFF 6E7,03
.................... }
1ADE: GOTO 1CCA (RETURN)
.................... //Overloaded functions for sqrt() for PCD
.................... // Overloaded function sqrt() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 sqrt(float48 x)
.................... {
.................... float48 y, res;
.................... unsigned int16 data1,data2;
.................... BYTE *p;
....................
.................... #ifdef _ERRNO
.................... if(x < 0)
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
....................
.................... if( x<=0.0)
.................... return(0.0);
....................
.................... y=x;
....................
.................... #if !defined(__PCD__)
.................... p=&y;
.................... (*p)=(BYTE)((((unsigned int16)(*p)) + 127) >> 1);
.................... #endif
....................
.................... #if defined(__PCD__)
.................... p = (((unsigned int8 *)(&y))+5);
.................... data1 = *(((unsigned int8 *)(&y))+5);
.................... data2 = *(((unsigned int8 *)(&y))+4);
.................... rotate_left(&data1,1);
.................... if(bit_test(data2,7))
.................... bit_set(data1,0);
.................... data1 = ((data1+127) >>1);
.................... bit_clear(data2,7);
.................... if(bit_test(data1,0))
.................... bit_set(data2,7);
.................... data1 = data1 >>1;
.................... *(((unsigned int8 *)(&y))+5) = data1;
.................... *(((unsigned int8 *)(&y))+4) = data2;
....................
.................... #endif
....................
.................... do {
.................... res=y;
.................... y+=(x/y);
....................
.................... #if !defined(__PCD__)
.................... (*p)--;
.................... #endif
....................
.................... data1 = *(((unsigned int8 *)(&y))+5);
.................... data2 = *(((unsigned int8 *)(&y))+4);
.................... rotate_left(&data1,1);
.................... if(bit_test(data2,7))
.................... bit_set(data1,0);
.................... data1--;
.................... bit_clear(data2,7);
.................... if(bit_test(data1,0))
.................... bit_set(data2,7);
.................... data1 = data1 >>1;
.................... *(((unsigned int8 *)(&y))+5) = data1;
.................... *(((unsigned int8 *)(&y))+4) = data2;
....................
.................... } while(res != y);
....................
.................... return(res);
.................... }
....................
.................... // Overloaded function sqrt() for data type - Float64
.................... float64 sqrt(float64 x)
.................... {
.................... float64 y, res;
.................... unsigned int16 *p;
.................... unsigned int16 temp1,temp2;
....................
.................... #ifdef _ERRNO
.................... if(x < 0)
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
....................
.................... if( x<=0.0)
.................... return(0.0);
....................
.................... y=x;
.................... p= (((unsigned int16 *)(&y))+3);
.................... temp1 = *p;
.................... temp2 = *p;
.................... bit_clear(temp1,15);
.................... temp1 = (temp1>>4)+1023;
.................... temp1 = temp1 >> 1;
.................... temp1 = (temp1<<4) & 0xFFF0;
.................... if(bit_test(temp2,15))
.................... bit_set(temp1,15);
.................... temp2 = temp2 & 0x000F;
.................... temp1 ^= temp2;
....................
.................... (*p) = temp1;
....................
.................... do {
.................... res=y;
.................... y+=(x/y);
.................... temp1 = *p;
.................... temp2 = *p;
.................... bit_clear(temp1,15);
.................... temp1 = (temp1>>4);
.................... temp1--;
.................... temp1 = (temp1<<4) & 0xFFF0;
.................... if(bit_test(temp2,15))
.................... bit_set(temp1,15);
.................... temp2 = temp2 & 0x000F;
.................... temp1 ^= temp2;
.................... (*p) = temp1;
....................
.................... } while(res != y);
....................
.................... return(res);
.................... }
.................... #endif
....................
.................... ////////////////////////////// Trig Functions //////////////////////////////
.................... #ifdef PI_DIV_BY_TWO
.................... #undef PI_DIV_BY_TWO
.................... #endif
.................... #define PI_DIV_BY_TWO 1.5707963267948966
.................... #ifdef TWOBYPI
.................... #undef TWOBYPI
.................... #define TWOBYPI 0.6366197723675813
.................... #endif
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float cos(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the cosine value of the angle x, which is in radian
.................... // Date : 9/20/2001
.................... //
.................... float32 cos(float32 x)
.................... {
.................... float32 y, t, t2 = 1.0;
.................... unsigned int8 quad, i;
.................... float32 frac;
.................... float32 p[4] = {
.................... -0.499999993585,
.................... 0.041666636258,
.................... -0.0013888361399,
.................... 0.00002476016134
.................... };
....................
.................... if (x < 0) x = -x; // absolute value of input
....................
.................... quad = (unsigned int8)(x / PI_DIV_BY_TWO); // quadrant
.................... frac = (x / PI_DIV_BY_TWO) - quad; // fractional part of input
.................... quad = quad % 4; // quadrant (0 to 3)
....................
.................... if (quad == 0 || quad == 2)
.................... t = frac * PI_DIV_BY_TWO;
.................... else if (quad == 1)
.................... t = (1-frac) * PI_DIV_BY_TWO;
.................... else // should be 3
.................... t = (frac-1) * PI_DIV_BY_TWO;
....................
.................... y = 0.999999999781;
.................... t = t * t;
.................... for (i = 0; i <= 3; i++)
.................... {
.................... t2 = t2 * t;
.................... y = y + p[i] * t2;
.................... }
....................
.................... if (quad == 2 || quad == 1)
.................... y = -y; // correct sign
....................
.................... return (y);
.................... }
....................
....................
.................... //Overloaded functions for cos() for PCD
.................... // Overloaded function cos() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 cos(float48 x)
.................... {
.................... float48 y, t, t2 = 1.0;
.................... unsigned int8 quad, i;
.................... float48 frac;
.................... float48 p[4] = {
.................... -0.499999993585,
.................... 0.041666636258,
.................... -0.0013888361399,
.................... 0.00002476016134
.................... };
....................
.................... if (x < 0) x = -x; // absolute value of input
....................
.................... quad = (unsigned int8)(x / PI_DIV_BY_TWO); // quadrant
.................... frac = (x / PI_DIV_BY_TWO) - quad; // fractional part of input
.................... quad = quad % 4; // quadrant (0 to 3)
....................
.................... if (quad == 0 || quad == 2)
.................... t = frac * PI_DIV_BY_TWO;
.................... else if (quad == 1)
.................... t = (1-frac) * PI_DIV_BY_TWO;
.................... else // should be 3
.................... t = (frac-1) * PI_DIV_BY_TWO;
....................
.................... y = 0.999999999781;
.................... t = t * t;
.................... for (i = 0; i <= 3; i++)
.................... {
.................... t2 = t2 * t;
.................... y = y + p[i] * t2;
.................... }
....................
.................... if (quad == 2 || quad == 1)
.................... y = -y; // correct sign
....................
.................... return (y);
.................... }
....................
.................... // Overloaded function cos() for data type - Float48
.................... float64 cos(float64 x)
.................... {
.................... float64 y, t, t2 = 1.0;
.................... unsigned int8 quad, i;
.................... float64 frac;
.................... float64 p[4] = {
.................... -0.499999993585,
.................... 0.041666636258,
.................... -0.0013888361399,
.................... 0.00002476016134
.................... };
....................
.................... if (x < 0) x = -x; // absolute value of input
....................
.................... quad = (unsigned int8)(x / PI_DIV_BY_TWO); // quadrant
.................... frac = (x / PI_DIV_BY_TWO) - quad; // fractional part of input
.................... quad = quad % 4; // quadrant (0 to 3)
....................
.................... if (quad == 0 || quad == 2)
.................... t = frac * PI_DIV_BY_TWO;
.................... else if (quad == 1)
.................... t = (1-frac) * PI_DIV_BY_TWO;
.................... else // should be 3
.................... t = (frac-1) * PI_DIV_BY_TWO;
....................
.................... y = 0.999999999781;
.................... t = t * t;
.................... for (i = 0; i <= 3; i++)
.................... {
.................... t2 = t2 * t;
.................... y = y + p[i] * t2;
.................... }
....................
.................... if (quad == 2 || quad == 1)
.................... y = -y; // correct sign
....................
.................... return (y);
.................... }
....................
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float sin(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the sine value of the angle x, which is in radian
.................... // Date : 9/20/2001
.................... //
.................... float32 sin(float32 x)
.................... {
.................... return cos(x - PI_DIV_BY_TWO);
.................... }
....................
.................... //Overloaded functions for sin() for PCD
.................... // Overloaded function sin() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 sin(float48 x)
.................... {
.................... return cos(x - PI_DIV_BY_TWO);
.................... }
....................
.................... // Overloaded function sin() for data type - Float48
.................... float64 sin(float64 x)
.................... {
.................... return cos(x - PI_DIV_BY_TWO);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float tan(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the tangent value of the angle x, which is in radian
.................... // Date : 9/20/2001
.................... //
.................... float32 tan(float32 x)
.................... {
.................... float32 c, s;
....................
.................... c = cos(x);
.................... if (c == 0.0)
.................... return (1.0e+36);
....................
.................... s = sin(x);
.................... return(s/c);
.................... }
.................... //Overloaded functions for tan() for PCD
.................... // Overloaded function tan() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 tan(float48 x)
.................... {
.................... float48 c, s;
....................
.................... c = cos(x);
.................... if (c == 0.0)
.................... return (1.0e+36);
....................
.................... s = sin(x);
.................... return(s/c);
.................... }
....................
.................... // Overloaded function tan() for data type - Float48
.................... float64 tan(float64 x)
.................... {
.................... float64 c, s;
....................
.................... c = cos(x);
.................... if (c == 0.0)
.................... return (1.0e+36);
....................
.................... s = sin(x);
.................... return(s/c);
.................... }
.................... #endif
....................
.................... float32 const pas[3] = {0.49559947, -4.6145309, 5.6036290};
.................... float32 const qas[3] = {1.0000000, -5.5484666, 5.6036290};
....................
.................... float32 ASIN_COS(float32 x, unsigned int8 n)
.................... {
.................... float32 y, res, r, y2;
.................... int1 s;
.................... #ifdef _ERRNO
.................... if(x <-1 || x > 1)
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y > 0.5)
.................... {
.................... y = sqrt((1.0 - y)/2.0);
.................... n += 2;
.................... }
....................
.................... y2=y*y;
....................
.................... res = pas[0]*y2 + pas[1];
.................... res = res*y2 + pas[2];
....................
.................... r = qas[0]*y2 + qas[1];
.................... r = r*y2 + qas[2];
....................
.................... res = y*res/r;
....................
.................... if (n & 2) // |x| > 0.5
.................... res = PI_DIV_BY_TWO - 2.0*res;
.................... if (s)
.................... res = -res;
.................... if (n & 1) // take arccos
.................... res = PI_DIV_BY_TWO - res;
....................
.................... return(res);
.................... }
....................
.................... //Overloaded functions for ASIN_COS() for PCD
.................... // Overloaded function ASIN_COS() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 ASIN_COS(float48 x, unsigned int8 n)
.................... {
.................... float48 y, res, r, y2;
.................... int1 s;
.................... #ifdef _ERRNO
.................... if(x <-1 || x > 1)
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y > 0.5)
.................... {
.................... y = sqrt((1.0 - y)/2.0);
.................... n += 2;
.................... }
....................
.................... y2=y*y;
....................
.................... res = pas[0]*y2 + pas[1];
.................... res = res*y2 + pas[2];
....................
.................... r = qas[0]*y2 + qas[1];
.................... r = r*y2 + qas[2];
....................
.................... res = y*res/r;
....................
.................... if (n & 2) // |x| > 0.5
.................... res = PI_DIV_BY_TWO - 2.0*res;
.................... if (s)
.................... res = -res;
.................... if (n & 1) // take arccos
.................... res = PI_DIV_BY_TWO - res;
....................
.................... return(res);
.................... }
....................
.................... // Overloaded function ASIN_COS() for data type - Float64
.................... float64 ASIN_COS(float64 x, unsigned int8 n)
.................... {
.................... float64 y, res, r, y2;
.................... int1 s;
.................... #ifdef _ERRNO
.................... if(x <-1 || x > 1)
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y > 0.5)
.................... {
.................... y = sqrt((1.0 - y)/2.0);
.................... n += 2;
.................... }
....................
.................... y2=y*y;
....................
.................... res = pas[0]*y2 + pas[1];
.................... res = res*y2 + pas[2];
....................
.................... r = qas[0]*y2 + qas[1];
.................... r = r*y2 + qas[2];
....................
.................... res = y*res/r;
....................
.................... if (n & 2) // |x| > 0.5
.................... res = PI_DIV_BY_TWO - 2.0*res;
.................... if (s)
.................... res = -res;
.................... if (n & 1) // take arccos
.................... res = PI_DIV_BY_TWO - res;
....................
.................... return(res);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float asin(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the arcsine value of the value x.
.................... // Date : N/A
.................... //
.................... float32 asin(float32 x)
.................... {
.................... float32 r;
....................
.................... r = ASIN_COS(x, 0);
.................... return(r);
.................... }
.................... //Overloaded functions for asin() for PCD
.................... // Overloaded function asin() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 asin(float48 x)
.................... {
.................... float48 r;
....................
.................... r = ASIN_COS(x, 0);
.................... return(r);
.................... }
....................
.................... // Overloaded function asin() for data type - Float64
.................... float64 asin(float64 x)
.................... {
.................... float64 r;
....................
.................... r = ASIN_COS(x, 0);
.................... return(r);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float acos(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the arccosine value of the value x.
.................... // Date : N/A
.................... //
.................... float32 acos(float32 x)
.................... {
.................... float32 r;
....................
.................... r = ASIN_COS(x, 1);
.................... return(r);
.................... }
.................... //Overloaded functions for acos() for PCD
.................... // Overloaded function acos() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 acos(float48 x)
.................... {
.................... float48 r;
....................
.................... r = ASIN_COS(x, 1);
.................... return(r);
.................... }
....................
.................... // Overloaded function acos() for data type - Float64
.................... float64 acos(float64 x)
.................... {
.................... float64 r;
....................
.................... r = ASIN_COS(x, 1);
.................... return(r);
.................... }
.................... #endif
....................
.................... float32 const pat[4] = {0.17630401, 5.6710795, 22.376096, 19.818457};
.................... float32 const qat[4] = {1.0000000, 11.368190, 28.982246, 19.818457};
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float atan(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the arctangent value of the value x.
.................... // Date : N/A
.................... //
.................... float32 atan(float32 x)
.................... {
.................... float32 y, res, r;
.................... int1 s, flag;
....................
.................... s = 0;
.................... flag = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y > 1.0)
.................... {
.................... y = 1.0/y;
.................... flag = 1;
.................... }
....................
.................... res = pat[0]*y*y + pat[1];
.................... res = res*y*y + pat[2];
.................... res = res*y*y + pat[3];
....................
.................... r = qat[0]*y*y + qat[1];
.................... r = r*y*y + qat[2];
.................... r = r*y*y + qat[3];
....................
.................... res = y*res/r;
....................
....................
.................... if (flag) // for |x| > 1
.................... res = PI_DIV_BY_TWO - res;
.................... if (s)
.................... res = -res;
....................
.................... return(res);
.................... }
.................... //Overloaded functions for atan() for PCD
.................... // Overloaded function atan() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 atan(float48 x)
.................... {
.................... float48 y, res, r;
.................... int1 s, flag;
....................
.................... s = 0;
.................... flag = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y > 1.0)
.................... {
.................... y = 1.0/y;
.................... flag = 1;
.................... }
....................
.................... res = pat[0]*y*y + pat[1];
.................... res = res*y*y + pat[2];
.................... res = res*y*y + pat[3];
....................
.................... r = qat[0]*y*y + qat[1];
.................... r = r*y*y + qat[2];
.................... r = r*y*y + qat[3];
....................
.................... res = y*res/r;
....................
....................
.................... if (flag) // for |x| > 1
.................... res = PI_DIV_BY_TWO - res;
.................... if (s)
.................... res = -res;
....................
.................... return(res);
.................... }
....................
.................... // Overloaded function atan() for data type - Float64
.................... float64 atan(float64 x)
.................... {
.................... float64 y, res, r;
.................... int1 s, flag;
....................
.................... s = 0;
.................... flag = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y > 1.0)
.................... {
.................... y = 1.0/y;
.................... flag = 1;
.................... }
....................
.................... res = pat[0]*y*y + pat[1];
.................... res = res*y*y + pat[2];
.................... res = res*y*y + pat[3];
....................
.................... r = qat[0]*y*y + qat[1];
.................... r = r*y*y + qat[2];
.................... r = r*y*y + qat[3];
....................
.................... res = y*res/r;
....................
....................
.................... if (flag) // for |x| > 1
.................... res = PI_DIV_BY_TWO - res;
.................... if (s)
.................... res = -res;
....................
.................... return(res);
.................... }
.................... #endif
....................
.................... /////////////////////////////////////////////////////////////////////////////
.................... // float atan2(float y, float x)
.................... /////////////////////////////////////////////////////////////////////////////
.................... // Description :computes the principal value of arc tangent of y/x, using the
.................... // signs of both the arguments to determine the quadrant of the return value
.................... // Returns : returns the arc tangent of y/x.
.................... // Date : N/A
.................... //
....................
.................... float32 atan2(float32 y,float32 x)
.................... {
.................... float32 z;
.................... int1 sign;
.................... unsigned int8 quad;
.................... sign=0;
.................... quad=0; //quadrant
.................... quad=((y<=0.0)?((x<=0.0)?3:4):((x<0.0)?2:1));
.................... if(y<0.0)
.................... {
.................... sign=1;
.................... y=-y;
.................... }
.................... if(x<0.0)
.................... {
.................... x=-x;
.................... }
.................... if (x==0.0)
.................... {
.................... if(y==0.0)
.................... {
.................... #ifdef _ERRNO
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... }
.................... else
.................... {
.................... if(sign)
.................... {
.................... return (-(PI_DIV_BY_TWO));
.................... }
.................... else
.................... {
.................... return (PI_DIV_BY_TWO);
.................... }
.................... }
.................... }
.................... else
.................... {
.................... z=y/x;
.................... switch(quad)
.................... {
.................... case 1:
.................... {
.................... return atan(z);
.................... break;
.................... }
.................... case 2:
.................... {
.................... // return (atan(z)+PI_DIV_BY_TWO); //2L3122
.................... return (PI-atan(z));
.................... break;
.................... }
.................... case 3:
.................... {
.................... return (atan(z)-PI);
.................... break;
.................... }
.................... case 4:
.................... {
.................... return (-atan(z));
.................... break;
.................... }
.................... }
.................... }
.................... }
....................
.................... //Overloaded functions for atan2() for PCD
.................... // Overloaded function atan2() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 atan2(float48 y,float48 x)
.................... {
.................... float48 z;
.................... int1 sign;
.................... unsigned int8 quad;
.................... sign=0;
.................... quad=0; //quadrant
.................... quad=((y<=0.0)?((x<=0.0)?3:4):((x<0.0)?2:1));
.................... if(y<0.0)
.................... {
.................... sign=1;
.................... y=-y;
.................... }
.................... if(x<0.0)
.................... {
.................... x=-x;
.................... }
.................... if (x==0.0)
.................... {
.................... if(y==0.0)
.................... {
.................... #ifdef _ERRNO
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... }
.................... else
.................... {
.................... if(sign)
.................... {
.................... return (-(PI_DIV_BY_TWO));
.................... }
.................... else
.................... {
.................... return (PI_DIV_BY_TWO);
.................... }
.................... }
.................... }
.................... else
.................... {
.................... z=y/x;
.................... switch(quad)
.................... {
.................... case 1:
.................... {
.................... return atan(z);
.................... break;
.................... }
.................... case 2:
.................... {
.................... // return (atan(z)+PI_DIV_BY_TWO); //2L3122
.................... return (PI-atan(z));
.................... break;
.................... }
.................... case 3:
.................... {
.................... return (atan(z)-PI);
.................... break;
.................... }
.................... case 4:
.................... {
.................... return (-atan(z));
.................... break;
.................... }
.................... }
.................... }
.................... }
....................
.................... // Overloaded function atan2() for data type - Float64
.................... float64 atan2(float64 y,float64 x)
.................... {
.................... float64 z;
.................... int1 sign;
.................... unsigned int8 quad;
.................... sign=0;
.................... quad=0; //quadrant
.................... quad=((y<=0.0)?((x<=0.0)?3:4):((x<0.0)?2:1));
.................... if(y<0.0)
.................... {
.................... sign=1;
.................... y=-y;
.................... }
.................... if(x<0.0)
.................... {
.................... x=-x;
.................... }
.................... if (x==0.0)
.................... {
.................... if(y==0.0)
.................... {
.................... #ifdef _ERRNO
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... }
.................... else
.................... {
.................... if(sign)
.................... {
.................... return (-(PI_DIV_BY_TWO));
.................... }
.................... else
.................... {
.................... return (PI_DIV_BY_TWO);
.................... }
.................... }
.................... }
.................... else
.................... {
.................... z=y/x;
.................... switch(quad)
.................... {
.................... case 1:
.................... {
.................... return atan(z);
.................... break;
.................... }
.................... case 2:
.................... {
.................... // return (atan(z)+PI_DIV_BY_TWO); //2L3122
.................... return (PI-atan(z));
.................... break;
.................... }
.................... case 3:
.................... {
.................... return (atan(z)-PI);
.................... break;
.................... }
.................... case 4:
.................... {
.................... return (-atan(z));
.................... break;
.................... }
.................... }
.................... }
.................... }
.................... #endif
....................
.................... //////////////////// Hyperbolic functions ////////////////////
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float cosh(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : Computes the hyperbolic cosine value of x
.................... // Returns : returns the hyperbolic cosine value of x
.................... // Date : N/A
.................... //
....................
.................... float32 cosh(float32 x)
.................... {
.................... return ((exp(x)+exp(-x))/2);
.................... }
.................... //Overloaded functions for cosh() for PCD
.................... // Overloaded function cosh() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 cosh(float48 x)
.................... {
.................... return ((exp(x)+exp(-x))/2);
.................... }
....................
.................... // Overloaded function cosh() for data type - Float64
.................... float64 cosh(float64 x)
.................... {
.................... return ((exp(x)+exp(-x))/2);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float sinh(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : Computes the hyperbolic sine value of x
.................... // Returns : returns the hyperbolic sine value of x
.................... // Date : N/A
.................... //
....................
.................... float32 sinh(float32 x)
.................... {
....................
.................... return ((exp(x) - exp(-x))/2);
.................... }
.................... //Overloaded functions for sinh() for PCD
.................... // Overloaded function sinh() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 sinh(float48 x)
.................... {
....................
.................... return ((exp(x) - exp(-x))/2);
.................... }
....................
.................... // Overloaded function sinh() for data type - Float48
.................... float64 sinh(float64 x)
.................... {
....................
.................... return ((exp(x) - exp(-x))/2);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float tanh(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : Computes the hyperbolic tangent value of x
.................... // Returns : returns the hyperbolic tangent value of x
.................... // Date : N/A
.................... //
....................
.................... float32 tanh(float32 x)
.................... {
.................... return(sinh(x)/cosh(x));
.................... }
.................... //Overloaded functions for tanh() for PCD
.................... // Overloaded function tanh() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 tanh(float48 x)
.................... {
.................... return(sinh(x)/cosh(x));
.................... }
....................
.................... // Overloaded function tanh() for data type - Float64
.................... float64 tanh(float64 x)
.................... {
.................... return(sinh(x)/cosh(x));
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float frexp(float x, signed int *exp)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : breaks a floating point number into a normalized fraction and an integral
.................... // power of 2. It stores the integer in the signed int object pointed to by exp.
.................... // Returns : returns the value x, such that x is a double with magnitude in the interval
.................... // [1/2,1) or zero, and value equals x times 2 raised to the power *exp.If value is zero,
.................... // both parts of the result are zero.
.................... // Date : N/A
.................... //
....................
.................... #define LOG2 .30102999566398119521
.................... float32 frexp(float32 x, signed int8 *exp)
.................... {
.................... float32 res;
.................... int1 sign = 0;
.................... if(x == 0.0)
.................... {
.................... *exp=0;
.................... return (0.0);
.................... }
.................... if(x < 0.0)
.................... {
.................... x=-x;
.................... sign=1;
.................... }
.................... if (x > 1.0)
.................... {
.................... *exp=(ceil(log10(x)/LOG2));
.................... res=x/(pow(2, *exp));
.................... if (res == 1)
.................... {
.................... *exp=*exp+1;
.................... res=.5;
.................... }
.................... }
.................... else
.................... {
.................... if(x < 0.5)
.................... {
.................... *exp=-1;
.................... res=x*2;
.................... }
.................... else
.................... {
.................... *exp=0;
.................... res=x;
.................... }
.................... }
.................... if(sign)
.................... {
.................... res=-res;
.................... }
.................... return res;
.................... }
....................
.................... //Overloaded functions for frexp() for PCD
.................... // Overloaded function frexp() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 frexp(float48 x, signed int8 *exp)
.................... {
.................... float48 res;
.................... int1 sign = 0;
.................... if(x == 0.0)
.................... {
.................... *exp=0;
.................... return (0.0);
.................... }
.................... if(x < 0.0)
.................... {
.................... x=-x;
.................... sign=1;
.................... }
.................... if (x > 1.0)
.................... {
.................... *exp=(ceil(log10(x)/LOG2));
.................... res=x/(pow(2, *exp));
.................... if (res == 1)
.................... {
.................... *exp=*exp+1;
.................... res=.5;
.................... }
.................... }
.................... else
.................... {
.................... if(x < 0.5)
.................... {
.................... *exp=-1;
.................... res=x*2;
.................... }
.................... else
.................... {
.................... *exp=0;
.................... res=x;
.................... }
.................... }
.................... if(sign)
.................... {
.................... res=-res;
.................... }
.................... return res;
.................... }
....................
.................... // Overloaded function frexp() for data type - Float64
.................... float64 frexp(float64 x, signed int8 *exp)
.................... {
.................... float64 res;
.................... int1 sign = 0;
.................... if(x == 0.0)
.................... {
.................... *exp=0;
.................... return (0.0);
.................... }
.................... if(x < 0.0)
.................... {
.................... x=-x;
.................... sign=1;
.................... }
.................... if (x > 1.0)
.................... {
.................... *exp=(ceil(log10(x)/LOG2));
.................... res=x/(pow(2, *exp));
.................... if (res == 1)
.................... {
.................... *exp=*exp+1;
.................... res=.5;
.................... }
.................... }
.................... else
.................... {
.................... if(x < 0.5)
.................... {
.................... *exp=-1;
.................... res=x*2;
.................... }
.................... else
.................... {
.................... *exp=0;
.................... res=x;
.................... }
.................... }
.................... if(sign)
.................... {
.................... res=-res;
.................... }
.................... return res;
.................... }
.................... #endif
....................
.................... //////////////////////////////////////////////////////////////////////////////
.................... // float ldexp(float x, signed int *exp)
.................... //////////////////////////////////////////////////////////////////////////////
.................... // Description : multiplies a floating point number by an integral power of 2.
.................... // Returns : returns the value of x times 2 raised to the power exp.
.................... // Date : N/A
.................... //
....................
.................... float32 ldexp(float32 value, signed int8 exp)
.................... {
.................... return (value * pow(2,exp));
.................... }
.................... //Overloaded functions for ldexp() for PCD
.................... // Overloaded function ldexp() for data type - Float48
....................
.................... #if defined(__PCD__)
.................... float48 ldexp(float48 value, signed int8 exp)
.................... {
.................... return (value * pow(2,exp));
.................... }
.................... // Overloaded function ldexp() for data type - Float64
.................... float64 ldexp(float64 value, signed int8 exp)
.................... {
.................... return (value * pow(2,exp));
.................... }
.................... #endif
....................
.................... #endif
....................
....................
.................... float quadraticerror(float average, float buf[], int16 size) // compute average quadratic error
.................... {
.................... int16 i;
.................... float err=0;
1AE2: MOVLB 6
1AE4: CLRF xD4
1AE6: CLRF xD5
1AE8: CLRF xD6
1AEA: CLRF xD7
....................
.................... for(i=0; i<size; i++) err += (buf[i]-average)*(buf[i]-average); // sum quadratic errors
1AEC: CLRF xD3
1AEE: CLRF xD2
1AF0: MOVF xD3,W
1AF2: SUBWF xD1,W
1AF4: BTFSS FD8.0
1AF6: BRA 1C48
1AF8: BNZ 1B02
1AFA: MOVF xD0,W
1AFC: SUBWF xD2,W
1AFE: BTFSC FD8.0
1B00: BRA 1C48
1B02: RLCF xD2,W
1B04: MOVWF 02
1B06: RLCF xD3,W
1B08: MOVWF 03
1B0A: RLCF 02,F
1B0C: RLCF 03,F
1B0E: MOVLW FC
1B10: ANDWF 02,F
1B12: MOVF 02,W
1B14: ADDWF xCE,W
1B16: MOVWF FE9
1B18: MOVF xCF,W
1B1A: ADDWFC 03,W
1B1C: MOVWF FEA
1B1E: MOVFF FEF,6D8
1B22: MOVFF FEC,6D9
1B26: MOVFF FEC,6DA
1B2A: MOVFF FEC,6DB
1B2E: MOVFF FEA,6DD
1B32: MOVFF FE9,6DC
1B36: BSF FD8.1
1B38: MOVFF 6DB,6ED
1B3C: MOVFF 6DA,6EC
1B40: MOVFF 6D9,6EB
1B44: MOVFF 6D8,6EA
1B48: MOVFF 6CD,6F1
1B4C: MOVFF 6CC,6F0
1B50: MOVFF 6CB,6EF
1B54: MOVFF 6CA,6EE
1B58: MOVLB 0
1B5A: RCALL 1442
1B5C: MOVFF 6DD,FEA
1B60: MOVFF 6DC,FE9
1B64: MOVFF 00,6D8
1B68: MOVFF 01,6D9
1B6C: MOVFF 02,6DA
1B70: MOVFF 03,6DB
1B74: MOVLB 6
1B76: RLCF xD2,W
1B78: MOVWF 02
1B7A: RLCF xD3,W
1B7C: MOVWF 03
1B7E: RLCF 02,F
1B80: RLCF 03,F
1B82: MOVLW FC
1B84: ANDWF 02,F
1B86: MOVF 02,W
1B88: ADDWF xCE,W
1B8A: MOVWF FE9
1B8C: MOVF xCF,W
1B8E: ADDWFC 03,W
1B90: MOVWF FEA
1B92: MOVFF FEF,6DE
1B96: MOVFF FEC,6DF
1B9A: MOVFF FEC,6E0
1B9E: MOVFF FEC,6E1
1BA2: MOVFF FEA,6E3
1BA6: MOVFF FE9,6E2
1BAA: BSF FD8.1
1BAC: MOVFF 6E1,6ED
1BB0: MOVFF 6E0,6EC
1BB4: MOVFF 6DF,6EB
1BB8: MOVFF 6DE,6EA
1BBC: MOVFF 6CD,6F1
1BC0: MOVFF 6CC,6F0
1BC4: MOVFF 6CB,6EF
1BC8: MOVFF 6CA,6EE
1BCC: MOVLB 0
1BCE: RCALL 1442
1BD0: MOVFF 6E3,FEA
1BD4: MOVFF 6E2,FE9
1BD8: MOVFF 6DB,6E7
1BDC: MOVFF 6DA,6E6
1BE0: MOVFF 6D9,6E5
1BE4: MOVFF 6D8,6E4
1BE8: MOVFF 03,6EB
1BEC: MOVFF 02,6EA
1BF0: MOVFF 01,6E9
1BF4: MOVFF 00,6E8
1BF8: RCALL 1852
1BFA: MOVFF FEA,6D9
1BFE: MOVFF FE9,6D8
1C02: BCF FD8.1
1C04: MOVFF 6D7,6ED
1C08: MOVFF 6D6,6EC
1C0C: MOVFF 6D5,6EB
1C10: MOVFF 6D4,6EA
1C14: MOVFF 03,6F1
1C18: MOVFF 02,6F0
1C1C: MOVFF 01,6EF
1C20: MOVFF 00,6EE
1C24: RCALL 1442
1C26: MOVFF 6D9,FEA
1C2A: MOVFF 6D8,FE9
1C2E: MOVFF 03,6D7
1C32: MOVFF 02,6D6
1C36: MOVFF 01,6D5
1C3A: MOVFF 00,6D4
1C3E: MOVLB 6
1C40: INCF xD2,F
1C42: BTFSC FD8.2
1C44: INCF xD3,F
1C46: BRA 1AF0
.................... err = sqrt((1/(float)size)*err);
1C48: MOVFF 6D1,6D9
1C4C: MOVFF 6D0,6D8
1C50: MOVLB 0
1C52: CALL 140C
1C56: MOVLB 6
1C58: CLRF xED
1C5A: CLRF xEC
1C5C: CLRF xEB
1C5E: MOVLW 7F
1C60: MOVWF xEA
1C62: MOVFF 03,6F1
1C66: MOVFF 02,6F0
1C6A: MOVFF 01,6EF
1C6E: MOVFF 00,6EE
1C72: MOVLB 0
1C74: RCALL 16BA
1C76: MOVFF 00,6D8
1C7A: MOVFF 01,6D9
1C7E: MOVFF 02,6DA
1C82: MOVFF 03,6DB
1C86: MOVFF 03,6E7
1C8A: MOVFF 02,6E6
1C8E: MOVFF 01,6E5
1C92: MOVFF 00,6E4
1C96: MOVFF 6D7,6EB
1C9A: MOVFF 6D6,6EA
1C9E: MOVFF 6D5,6E9
1CA2: MOVFF 6D4,6E8
1CA6: RCALL 1852
1CA8: MOVFF 00,6D8
1CAC: MOVFF 01,6D9
1CB0: MOVFF 02,6DA
1CB4: MOVFF 03,6DB
1CB8: MOVFF 03,6DF
1CBC: MOVFF 02,6DE
1CC0: MOVFF 01,6DD
1CC4: MOVFF 00,6DC
1CC8: BRA 19C2
1CCA: MOVFF 03,6D7
1CCE: MOVFF 02,6D6
1CD2: MOVFF 01,6D5
1CD6: MOVFF 00,6D4
.................... return err;
1CDA: MOVFF 6D4,00
1CDE: MOVFF 6D5,01
1CE2: MOVFF 6D6,02
1CE6: MOVFF 6D7,03
.................... }
1CEA: RETLW 00
....................
.................... void main()
.................... {
*
1F62: CLRF FF8
1F64: BCF FD0.7
1F66: BSF 08.7
1F68: CLRF FEA
1F6A: CLRF FE9
1F6C: MOVF FC1,W
1F6E: ANDLW C0
1F70: IORLW 0F
1F72: MOVWF FC1
1F74: MOVLW 07
1F76: MOVWF FB4
1F78: CLRF 21
1F7A: MOVLW 04
1F7C: MOVWF 22
1F7E: MOVLW 0C
1F80: MOVWF 23
1F82: CLRF 24
1F84: CLRF 28
1F86: CLRF x7C
1F88: CLRF x83
....................
.................... float x[BUFLEN], y[BUFLEN], z[BUFLEN];
.................... float xavg, yavg, zavg;
.................... int i;
.................... port_b_pullups(FALSE);
1F8A: BSF FF1.7
.................... setup_psp(PSP_DISABLED);
1F8C: BCF FB0.4
.................... setup_spi(SPI_SS_DISABLED);
1F8E: BCF FC6.5
1F90: BCF F94.7
1F92: BSF F93.0
1F94: BCF F93.1
1F96: MOVLW 01
1F98: MOVWF FC6
1F9A: MOVLW 00
1F9C: MOVWF FC7
.................... setup_wdt(WDT_OFF);
1F9E: BCF FD1.0
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
1FA0: MOVLW 87
1FA2: MOVWF FD5
.................... setup_timer_1(T1_DISABLED);
1FA4: CLRF FCD
.................... setup_timer_2(T2_DISABLED,0,1);
1FA6: MOVLW 00
1FA8: MOVWF FCA
1FAA: MOVLW 00
1FAC: MOVWF FCB
.................... setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
1FAE: CLRF FB1
.................... setup_comparator(NC_NC_NC_NC);
1FB0: MOVLW 07
1FB2: MOVWF FB4
1FB4: MOVF F92,W
1FB6: MOVWF F92
1FB8: MOVLW 13
1FBA: MOVWF 00
1FBC: DECFSZ 00,F
1FBE: BRA 1FBC
1FC0: BRA 1FC2
1FC2: MOVF FB4,W
1FC4: BCF FA1.6
.................... setup_vref(FALSE);
1FC6: CLRF FB5
.................... enable_interrupts(INT_TIMER0);
1FC8: BSF FF2.5
.................... enable_interrupts(GLOBAL);
1FCA: MOVLW C0
1FCC: IORWF FF2,F
....................
.................... setup_adc_ports(AN0_TO_AN2|VSS_VREF);
1FCE: MOVF FC1,W
1FD0: ANDLW C0
1FD2: IORLW 1C
1FD4: MOVWF FC1
.................... setup_adc(ADC_CLOCK_DIV_64);
1FD6: BCF FC0.0
1FD8: BSF FC0.1
1FDA: BSF FC0.2
1FDC: BSF FC0.7
1FDE: BSF FC2.0
....................
.................... usb_init(); // initialise USB module
1FE0: GOTO 1368
....................
.................... while (TRUE)
.................... {
....................
.................... while(!usb_cdc_connected());
1FE4: BTFSS x80.0
1FE6: BRA 1FE4
.................... time=0;
1FE8: CLRF 1C
1FEA: CLRF 1B
1FEC: CLRF 1A
1FEE: CLRF 19
.................... set_timer0(0);
1FF0: CLRF FD7
1FF2: CLRF FD6
.................... printf(usb_cdc_putc,"time[s] X Xerr Y Yerr Z Zerr \n\r");
1FF4: MOVLB 3
1FF6: CLRF xB1
1FF8: MOVF xB1,W
1FFA: MOVLB 0
1FFC: CALL 021E
2000: MOVLB 3
2002: INCF xB1,F
2004: MOVWF 00
2006: MOVFF FE8,6DB
200A: MOVLB 0
200C: CALL 13D4
2010: MOVLW 25
2012: MOVLB 3
2014: SUBWF xB1,W
2016: BNZ 1FF8
....................
.................... while(usb_cdc_connected()) // pockej nez se pripoji seriovy port PC
.................... {
2018: MOVLB 0
201A: BTFSS x80.0
201C: BRA 25DE
.................... for(i=0; i <BUFLEN; i++)
201E: MOVLB 3
2020: CLRF xB0
2022: MOVF xB0,W
2024: SUBLW 63
2026: BTFSS FD8.0
2028: BRA 2300
.................... {
.................... set_adc_channel(0);
202A: MOVLW 00
202C: MOVWF 01
202E: MOVF FC2,W
2030: ANDLW C3
2032: IORWF 01,W
2034: MOVWF FC2
.................... delay_us(10);
2036: MOVLW 13
2038: MOVWF 00
203A: DECFSZ 00,F
203C: BRA 203A
203E: BRA 2040
2040: CLRF 18
2042: BTFSC FF2.7
2044: BSF 18.7
2046: BCF FF2.7
.................... x[i]=read_adc();
2048: MOVLB 7
204A: CLRF x49
204C: MOVFF 3B0,748
2050: CLRF x4B
2052: MOVLW 04
2054: MOVWF x4A
2056: MOVLB 0
2058: CALL 02BA
205C: BTFSC 18.7
205E: BSF FF2.7
2060: MOVFF 02,03
2064: MOVF 01,W
2066: ADDLW 84
2068: MOVWF FE9
206A: MOVLW 00
206C: ADDWFC 02,W
206E: MOVWF FEA
2070: BSF FC2.1
2072: BTFSC FC2.1
2074: BRA 2072
2076: MOVFF FC4,6D9
207A: MOVFF FC3,6D8
207E: MOVLB 0
2080: CALL 140C
2084: MOVFF 00,FEF
2088: MOVFF 01,FEC
208C: MOVFF 02,FEC
2090: MOVFF 03,FEC
2094: CLRF 18
2096: BTFSC FF2.7
2098: BSF 18.7
209A: BCF FF2.7
.................... xavg+=x[i];
209C: MOVLB 7
209E: CLRF x49
20A0: MOVFF 3B0,748
20A4: CLRF x4B
20A6: MOVLW 04
20A8: MOVWF x4A
20AA: MOVLB 0
20AC: CALL 02BA
20B0: BTFSC 18.7
20B2: BSF FF2.7
20B4: MOVFF 02,03
20B8: MOVF 01,W
20BA: ADDLW 84
20BC: MOVWF FE9
20BE: MOVLW 00
20C0: ADDWFC 02,W
20C2: MOVWF FEA
20C4: MOVFF FEF,00
20C8: MOVFF FEC,01
20CC: MOVFF FEC,02
20D0: MOVFF FEC,03
20D4: MOVFF FEA,3B2
20D8: MOVFF FE9,3B1
20DC: BCF FD8.1
20DE: MOVFF 3A7,6ED
20E2: MOVFF 3A6,6EC
20E6: MOVFF 3A5,6EB
20EA: MOVFF 3A4,6EA
20EE: MOVFF 03,6F1
20F2: MOVFF 02,6F0
20F6: MOVFF 01,6EF
20FA: MOVFF 00,6EE
20FE: CALL 1442
2102: MOVFF 3B2,FEA
2106: MOVFF 3B1,FE9
210A: MOVFF 03,3A7
210E: MOVFF 02,3A6
2112: MOVFF 01,3A5
2116: MOVFF 00,3A4
....................
.................... set_adc_channel(1);
211A: MOVLW 04
211C: MOVWF 01
211E: MOVF FC2,W
2120: ANDLW C3
2122: IORWF 01,W
2124: MOVWF FC2
.................... delay_us(10);
2126: MOVLW 13
2128: MOVWF 00
212A: DECFSZ 00,F
212C: BRA 212A
212E: BRA 2130
2130: CLRF 18
2132: BTFSC FF2.7
2134: BSF 18.7
2136: BCF FF2.7
.................... y[i]=read_adc();
2138: MOVLB 7
213A: CLRF x49
213C: MOVFF 3B0,748
2140: CLRF x4B
2142: MOVLW 04
2144: MOVWF x4A
2146: MOVLB 0
2148: CALL 02BA
214C: BTFSC 18.7
214E: BSF FF2.7
2150: MOVFF 02,03
2154: MOVF 01,W
2156: ADDLW 14
2158: MOVWF FE9
215A: MOVLW 02
215C: ADDWFC 02,W
215E: MOVWF FEA
2160: BSF FC2.1
2162: BTFSC FC2.1
2164: BRA 2162
2166: MOVFF FC4,6D9
216A: MOVFF FC3,6D8
216E: MOVLB 0
2170: CALL 140C
2174: MOVFF 00,FEF
2178: MOVFF 01,FEC
217C: MOVFF 02,FEC
2180: MOVFF 03,FEC
2184: CLRF 18
2186: BTFSC FF2.7
2188: BSF 18.7
218A: BCF FF2.7
.................... yavg+=y[i];
218C: MOVLB 7
218E: CLRF x49
2190: MOVFF 3B0,748
2194: CLRF x4B
2196: MOVLW 04
2198: MOVWF x4A
219A: MOVLB 0
219C: CALL 02BA
21A0: BTFSC 18.7
21A2: BSF FF2.7
21A4: MOVFF 02,03
21A8: MOVF 01,W
21AA: ADDLW 14
21AC: MOVWF FE9
21AE: MOVLW 02
21B0: ADDWFC 02,W
21B2: MOVWF FEA
21B4: MOVFF FEF,00
21B8: MOVFF FEC,01
21BC: MOVFF FEC,02
21C0: MOVFF FEC,03
21C4: MOVFF FEA,3B2
21C8: MOVFF FE9,3B1
21CC: BCF FD8.1
21CE: MOVFF 3AB,6ED
21D2: MOVFF 3AA,6EC
21D6: MOVFF 3A9,6EB
21DA: MOVFF 3A8,6EA
21DE: MOVFF 03,6F1
21E2: MOVFF 02,6F0
21E6: MOVFF 01,6EF
21EA: MOVFF 00,6EE
21EE: CALL 1442
21F2: MOVFF 3B2,FEA
21F6: MOVFF 3B1,FE9
21FA: MOVFF 03,3AB
21FE: MOVFF 02,3AA
2202: MOVFF 01,3A9
2206: MOVFF 00,3A8
....................
.................... set_adc_channel(2);
220A: MOVLW 08
220C: MOVWF 01
220E: MOVF FC2,W
2210: ANDLW C3
2212: IORWF 01,W
2214: MOVWF FC2
.................... delay_us(10);
2216: MOVLW 13
2218: MOVWF 00
221A: DECFSZ 00,F
221C: BRA 221A
221E: BRA 2220
2220: CLRF 18
2222: BTFSC FF2.7
2224: BSF 18.7
2226: BCF FF2.7
.................... z[i]=read_adc();
2228: MOVLB 7
222A: CLRF x49
222C: MOVFF 3B0,748
2230: CLRF x4B
2232: MOVLW 04
2234: MOVWF x4A
2236: MOVLB 0
2238: CALL 02BA
223C: BTFSC 18.7
223E: BSF FF2.7
2240: MOVFF 02,03
2244: MOVF 01,W
2246: ADDLW 20
2248: MOVWF FE9
224A: MOVLW 05
224C: ADDWFC 02,W
224E: MOVWF FEA
2250: BSF FC2.1
2252: BTFSC FC2.1
2254: BRA 2252
2256: MOVFF FC4,6D9
225A: MOVFF FC3,6D8
225E: MOVLB 0
2260: CALL 140C
2264: MOVFF 00,FEF
2268: MOVFF 01,FEC
226C: MOVFF 02,FEC
2270: MOVFF 03,FEC
2274: CLRF 18
2276: BTFSC FF2.7
2278: BSF 18.7
227A: BCF FF2.7
.................... zavg+=z[i];
227C: MOVLB 7
227E: CLRF x49
2280: MOVFF 3B0,748
2284: CLRF x4B
2286: MOVLW 04
2288: MOVWF x4A
228A: MOVLB 0
228C: CALL 02BA
2290: BTFSC 18.7
2292: BSF FF2.7
2294: MOVFF 02,03
2298: MOVF 01,W
229A: ADDLW 20
229C: MOVWF FE9
229E: MOVLW 05
22A0: ADDWFC 02,W
22A2: MOVWF FEA
22A4: MOVFF FEF,00
22A8: MOVFF FEC,01
22AC: MOVFF FEC,02
22B0: MOVFF FEC,03
22B4: MOVFF FEA,3B2
22B8: MOVFF FE9,3B1
22BC: BCF FD8.1
22BE: MOVFF 3AF,6ED
22C2: MOVFF 3AE,6EC
22C6: MOVFF 3AD,6EB
22CA: MOVFF 3AC,6EA
22CE: MOVFF 03,6F1
22D2: MOVFF 02,6F0
22D6: MOVFF 01,6EF
22DA: MOVFF 00,6EE
22DE: CALL 1442
22E2: MOVFF 3B2,FEA
22E6: MOVFF 3B1,FE9
22EA: MOVFF 03,3AF
22EE: MOVFF 02,3AE
22F2: MOVFF 01,3AD
22F6: MOVFF 00,3AC
.................... }
22FA: MOVLB 3
22FC: INCF xB0,F
22FE: BRA 2022
....................
.................... xavg=xavg/BUFLEN;
2300: MOVFF 3A7,6ED
2304: MOVFF 3A6,6EC
2308: MOVFF 3A5,6EB
230C: MOVFF 3A4,6EA
2310: MOVLB 6
2312: CLRF xF1
2314: CLRF xF0
2316: MOVLW 48
2318: MOVWF xEF
231A: MOVLW 85
231C: MOVWF xEE
231E: MOVLB 0
2320: CALL 16BA
2324: MOVFF 03,3A7
2328: MOVFF 02,3A6
232C: MOVFF 01,3A5
2330: MOVFF 00,3A4
.................... yavg=yavg/BUFLEN;
2334: MOVFF 3AB,6ED
2338: MOVFF 3AA,6EC
233C: MOVFF 3A9,6EB
2340: MOVFF 3A8,6EA
2344: MOVLB 6
2346: CLRF xF1
2348: CLRF xF0
234A: MOVLW 48
234C: MOVWF xEF
234E: MOVLW 85
2350: MOVWF xEE
2352: MOVLB 0
2354: CALL 16BA
2358: MOVFF 03,3AB
235C: MOVFF 02,3AA
2360: MOVFF 01,3A9
2364: MOVFF 00,3A8
.................... zavg=zavg/BUFLEN;
2368: MOVFF 3AF,6ED
236C: MOVFF 3AE,6EC
2370: MOVFF 3AD,6EB
2374: MOVFF 3AC,6EA
2378: MOVLB 6
237A: CLRF xF1
237C: CLRF xF0
237E: MOVLW 48
2380: MOVWF xEF
2382: MOVLW 85
2384: MOVWF xEE
2386: MOVLB 0
2388: CALL 16BA
238C: MOVFF 03,3AF
2390: MOVFF 02,3AE
2394: MOVFF 01,3AD
2398: MOVFF 00,3AC
....................
.................... // odesli namerene hodnoty
.................... printf(usb_cdc_putc, "%7.3f %4.3f %4.3f %4.3f %4.3f %4.3f %4.3f \n\r",((time << 16) + get_timer0())/15625.0, xavg, quadraticerror(xavg,x,BUFLEN), yavg, quadraticerror(yavg,y,BUFLEN), zavg, quadraticerror(zavg,z,BUFLEN)); //konstanta k je kvuli prevodu do rozzumnych jednotek [s]
239C: MOVFF 1A,3B5
23A0: MOVFF 19,3B4
23A4: MOVLB 3
23A6: CLRF xB2
23A8: CLRF xB3
23AA: MOVF FD6,W
23AC: MOVFF FD7,03
23B0: ADDWF xB2,F
23B2: MOVF FD7,W
23B4: ADDWFC xB3,F
23B6: MOVLW 00
23B8: ADDWFC xB4,F
23BA: ADDWFC xB5,F
23BC: MOVFF 3B5,6C5
23C0: MOVFF 3B4,6C4
23C4: MOVFF 3B3,6C3
23C8: MOVFF 3B2,6C2
23CC: MOVLB 0
23CE: GOTO 1818
23D2: MOVFF 03,6ED
23D6: MOVFF 02,6EC
23DA: MOVFF 01,6EB
23DE: MOVFF 00,6EA
23E2: MOVLB 6
23E4: CLRF xF1
23E6: MOVLW 24
23E8: MOVWF xF0
23EA: MOVLW 74
23EC: MOVWF xEF
23EE: MOVLW 8C
23F0: MOVWF xEE
23F2: MOVLB 0
23F4: CALL 16BA
23F8: MOVFF 00,3B2
23FC: MOVFF 01,3B3
2400: MOVFF 02,3B4
2404: MOVFF 03,3B5
2408: MOVFF 3A7,6CD
240C: MOVFF 3A6,6CC
2410: MOVFF 3A5,6CB
2414: MOVFF 3A4,6CA
2418: MOVLB 6
241A: CLRF xCF
241C: MOVLW 84
241E: MOVWF xCE
2420: CLRF xD1
2422: MOVLW 64
2424: MOVWF xD0
2426: MOVLB 0
2428: CALL 1AE2
242C: MOVFF 00,3B6
2430: MOVFF 01,3B7
2434: MOVFF 02,3B8
2438: MOVFF 03,3B9
243C: MOVFF 3AB,6CD
2440: MOVFF 3AA,6CC
2444: MOVFF 3A9,6CB
2448: MOVFF 3A8,6CA
244C: MOVLW 02
244E: MOVLB 6
2450: MOVWF xCF
2452: MOVLW 14
2454: MOVWF xCE
2456: CLRF xD1
2458: MOVLW 64
245A: MOVWF xD0
245C: MOVLB 0
245E: CALL 1AE2
2462: MOVFF 00,3BA
2466: MOVFF 01,3BB
246A: MOVFF 02,3BC
246E: MOVFF 03,3BD
2472: MOVFF 3AF,6CD
2476: MOVFF 3AE,6CC
247A: MOVFF 3AD,6CB
247E: MOVFF 3AC,6CA
2482: MOVLW 05
2484: MOVLB 6
2486: MOVWF xCF
2488: MOVLW 20
248A: MOVWF xCE
248C: CLRF xD1
248E: MOVLW 64
2490: MOVWF xD0
2492: MOVLB 0
2494: CALL 1AE2
2498: MOVFF 00,3BE
249C: MOVFF 01,3BF
24A0: MOVFF 02,3C0
24A4: MOVFF 03,3C1
24A8: MOVLW 06
24AA: MOVWF FE9
24AC: MOVFF 3B5,6D1
24B0: MOVFF 3B4,6D0
24B4: MOVFF 3B3,6CF
24B8: MOVFF 3B2,6CE
24BC: MOVLW 03
24BE: MOVLB 6
24C0: MOVWF xD2
24C2: MOVLB 0
24C4: RCALL 1DB0
24C6: MOVLW 20
24C8: MOVLB 6
24CA: MOVWF xDB
24CC: MOVLB 0
24CE: CALL 13D4
24D2: MOVLW 03
24D4: MOVWF FE9
24D6: MOVFF 3A7,6D1
24DA: MOVFF 3A6,6D0
24DE: MOVFF 3A5,6CF
24E2: MOVFF 3A4,6CE
24E6: MOVLB 6
24E8: MOVWF xD2
24EA: MOVLB 0
24EC: RCALL 1DB0
24EE: MOVLW 20
24F0: MOVLB 6
24F2: MOVWF xDB
24F4: MOVLB 0
24F6: CALL 13D4
24FA: MOVLW 03
24FC: MOVWF FE9
24FE: MOVFF 3B9,6D1
2502: MOVFF 3B8,6D0
2506: MOVFF 3B7,6CF
250A: MOVFF 3B6,6CE
250E: MOVLB 6
2510: MOVWF xD2
2512: MOVLB 0
2514: RCALL 1DB0
2516: MOVLW 20
2518: MOVLB 6
251A: MOVWF xDB
251C: MOVLB 0
251E: CALL 13D4
2522: MOVLW 03
2524: MOVWF FE9
2526: MOVFF 3AB,6D1
252A: MOVFF 3AA,6D0
252E: MOVFF 3A9,6CF
2532: MOVFF 3A8,6CE
2536: MOVLB 6
2538: MOVWF xD2
253A: MOVLB 0
253C: RCALL 1DB0
253E: MOVLW 20
2540: MOVLB 6
2542: MOVWF xDB
2544: MOVLB 0
2546: CALL 13D4
254A: MOVLW 03
254C: MOVWF FE9
254E: MOVFF 3BD,6D1
2552: MOVFF 3BC,6D0
2556: MOVFF 3BB,6CF
255A: MOVFF 3BA,6CE
255E: MOVLB 6
2560: MOVWF xD2
2562: MOVLB 0
2564: RCALL 1DB0
2566: MOVLW 20
2568: MOVLB 6
256A: MOVWF xDB
256C: MOVLB 0
256E: CALL 13D4
2572: MOVLW 03
2574: MOVWF FE9
2576: MOVFF 3AF,6D1
257A: MOVFF 3AE,6D0
257E: MOVFF 3AD,6CF
2582: MOVFF 3AC,6CE
2586: MOVLB 6
2588: MOVWF xD2
258A: MOVLB 0
258C: RCALL 1DB0
258E: MOVLW 20
2590: MOVLB 6
2592: MOVWF xDB
2594: MOVLB 0
2596: CALL 13D4
259A: MOVLW 03
259C: MOVWF FE9
259E: MOVFF 3C1,6D1
25A2: MOVFF 3C0,6D0
25A6: MOVFF 3BF,6CF
25AA: MOVFF 3BE,6CE
25AE: MOVLB 6
25B0: MOVWF xD2
25B2: MOVLB 0
25B4: CALL 1DB0
25B8: MOVLW 20
25BA: MOVLB 6
25BC: MOVWF xDB
25BE: MOVLB 0
25C0: CALL 13D4
25C4: MOVLW 0A
25C6: MOVLB 6
25C8: MOVWF xDB
25CA: MOVLB 0
25CC: CALL 13D4
25D0: MOVLW 0D
25D2: MOVLB 6
25D4: MOVWF xDB
25D6: MOVLB 0
25D8: CALL 13D4
.................... }
25DC: BRA 201A
.................... }
25DE: BRA 1FE4
.................... }
25E0: SLEEP
 
Configuration Fuses:
Word 1: CE3C IESO FCMEN HSPLL PLL5 CPUDIV4 USBDIV
Word 2: 0E39 NOBROWNOUT WDT128 NOWDT BORV20 NOPUT VREGEN
Word 3: 8700 PBADEN CCP2C1 MCLR LPT1OSC
Word 4: 00A1 STVREN NODEBUG NOLVP NOXINST ICPRT
Word 5: C00F NOPROTECT NOCPD NOCPB
Word 6: E00F NOWRT NOWRTD NOWRTC NOWRTB
Word 7: 400F NOEBTR NOEBTRB
/programy/C/PIC/mereni/inertial/main.pjt
0,0 → 1,37
[PROJECT]
Target=D:\svnKaklik\programy\C\PIC_C\mereni\inertial\main.hex
Development_Mode=
Processor_Text=PIC18F4550
ToolSuite=CCS
Processor=0x4550
[D:\svnKaklik\programy\C\PIC_C\mereni\inertial\main]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
[mru-list]
1=D:\svnKaklik\programy\C\PIC_C\mereni\inertial\main.c
[Windows]
0=0000 %S 0 0 796 451 3 0
[Opened Files]
1=main.c
2=
3=C:\Program Files\PICC\devices\18F4550.h
4=C:\Program Files\PICC\drivers\usb_cdc.h
5=C:\Program Files\PICC\drivers\pic18_usb.h
6=C:\Program Files\PICC\drivers\usb_hw_layer.h
7=C:\Program Files\PICC\drivers\usb_desc_cdc.h
8=C:\Program Files\PICC\drivers\usb.h
9=C:\Program Files\PICC\drivers\usb.c
10=C:\Program Files\PICC\drivers\pic18_usb.c
11=C:\Program Files\PICC\drivers\ctype.h
12=C:\Program Files\PICC\drivers\math.h
13=
[Target Data]
OptionString=-p +FH
FileList=D:\svnKaklik\programy\C\PIC_C\mereni\inertial\main.c
[Units]
Count=1
1=main.c (main)
/programy/C/PIC/mereni/inertial/main.h
0,0 → 1,35
#include <18F4550.h>
#device adc=10
 
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HSPLL //Crystal/Resonator with PLL enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES MCLR //Master Clear pin enabled
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL5 //Divide By 5(20MHz oscillator input)
#FUSES CPUDIV4 //System Clock by 4
#FUSES USBDIV //USB clock source comes from PLL divide by 2
#FUSES VREGEN //USB voltage regulator enabled
#FUSES ICPRT //ICPRT enabled
 
#use delay(clock=24000000)
 
/programy/C/PIC/mereni/serva/PIC16F84/main.BAK
0,0 → 1,80
#include "D:\@Kaklik\programy\PIC_C\mereni\serva\main.h"
#DEFINE servo1 PIN_A4
#DEFINE servo2 PIN_A3
#DEFINE servo3 PIN_A2
#DEFINE servo4 PIN_A0
#DEFINE SW PIN_A1
 
void main()
{
int i;
 
while(true)
{
While(input(SW))
{
output_high(servo1);
Delay_us(1500);
output_low(servo1);
output_high(servo2);
Delay_us(1500);
output_low(servo2);
output_high(servo3);
Delay_us(1500);
output_low(servo3);
output_high(servo4);
Delay_us(1500);
output_low(servo4);
Delay_ms(10);
}
While(!input(SW))
{
for(i=0; i<100; ++i)
{
output_high(servo1);
Delay_us(1000);
output_low(servo1);
output_high(servo2);
Delay_us(1000);
output_low(servo2);
output_high(servo3);
Delay_us(1000);
output_low(servo3);
output_high(servo4);
Delay_us(1000);
output_low(servo4);
Delay_ms(10);
}
for(i=0; i<100; ++i)
{
output_high(servo1);
Delay_us(2000);
output_low(servo1);
output_high(servo2);
Delay_us(2000);
output_low(servo2);
output_high(servo3);
Delay_us(2000);
output_low(servo3);
output_high(servo4);
Delay_us(2000);
output_low(servo4);
Delay_ms(10);
}
}
}
}
/programy/C/PIC/mereni/serva/PIC16F84/main.HEX
0,0 → 1,33
:1000000000308A00272800001030840000080319FF
:10001000182801308D008C018C0B0C288D0B0B28BF
:100020004A308C008C0B122800000000800B09283D
:10003000003411308400FC308005800C800C0008F6
:100040000319262824280000800B2328003484016B
:100050001F308305831685148312851C7B28831625
:100060000512831205160130900004200230900022
:10007000EC3091001920900B38288316051283125A
:100080000512831685118312851501309000042016
:1000900002309000EC3091001920900B4A28831612
:1000A0008511831285118316051183120515013000
:1000B0009000042002309000EC3091001920900B49
:1000C0005C2883160511831205118316051083120F
:1000D000051401309000042002309000EC309100B3
:1000E0001920900B6E2883160510831205100A3014
:1000F000900004202A288316851483128518ED2881
:100100008F010F08633C031CB62883160512831267
:100110000516013090000420831605128312051283
:1001200083168511831285150130900004208316F3
:10013000851183128511831605118312051501306F
:1001400090000420831605118312051183160510F3
:1001500083120514013090000420831605108312C9
:1001600005100A30900004208F0A81288F010F08A3
:10017000633C031CEC28831605128312051602301B
:100180009000042083160512831205128316851130
:100190008312851502309000042083168511831286
:1001A0008511831605118312051502309000042075
:1001B0008316051183120511831605108312051489
:1001C00002309000042083160510831205100A30B7
:0E01D000900004208F0AB7287B282A2863009D
:02400E00F93F78
:00000001FF
;PIC16F84
/programy/C/PIC/mereni/serva/PIC16F84/main.LST
0,0 → 1,340
CCS PCW C Compiler, Version 3.110, 15448
 
Filename: d:\@kaklik\programy\pic_c\mereni\serva\main.LST
 
ROM used: 239 (23%)
Largest free fragment is 785
RAM used: 4 (6%) at main() level
5 (7%) worst case
Stack: 1 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 027
0003: NOP
.................... #include "D:\@Kaklik\programy\PIC_C\mereni\serva\main.h"
.................... #include <16F84.h>
.................... //////// Standard Header file for the PIC16F84 device ////////////////
.................... #device PIC16F84
.................... #list
....................
.................... #use delay(clock=4000000)
0004: MOVLW 10
0005: MOVWF 04
0006: MOVF 00,W
0007: BTFSC 03.2
0008: GOTO 018
0009: MOVLW 01
000A: MOVWF 0D
000B: CLRF 0C
000C: DECFSZ 0C,F
000D: GOTO 00C
000E: DECFSZ 0D,F
000F: GOTO 00B
0010: MOVLW 4A
0011: MOVWF 0C
0012: DECFSZ 0C,F
0013: GOTO 012
0014: NOP
0015: NOP
0016: DECFSZ 00,F
0017: GOTO 009
0018: RETLW 00
0019: MOVLW 11
001A: MOVWF 04
001B: MOVLW FC
001C: ANDWF 00,F
001D: RRF 00,F
001E: RRF 00,F
001F: MOVF 00,W
0020: BTFSC 03.2
0021: GOTO 026
0022: GOTO 024
0023: NOP
0024: DECFSZ 00,F
0025: GOTO 023
0026: RETLW 00
.................... #fuses XT,NOWDT
....................
....................
.................... #DEFINE servo1 PIN_A4
.................... #DEFINE servo2 PIN_A3
.................... #DEFINE servo3 PIN_A2
.................... #DEFINE servo4 PIN_A0
.................... #DEFINE SW PIN_A1
....................
.................... void main()
.................... {
.................... int i;
0027: CLRF 04
0028: MOVLW 1F
0029: ANDWF 03,F
....................
.................... while(true)
.................... {
.................... While(input(SW))
002A: BSF 03.5
002B: BSF 05.1
002C: BCF 03.5
002D: BTFSS 05.1
002E: GOTO 07B
.................... {
.................... output_high(servo1);
002F: BSF 03.5
0030: BCF 05.4
0031: BCF 03.5
0032: BSF 05.4
.................... Delay_us(1500);
0033: MOVLW 01
0034: MOVWF 10
0035: CALL 004
0036: MOVLW 02
0037: MOVWF 10
0038: MOVLW EC
0039: MOVWF 11
003A: CALL 019
003B: DECFSZ 10,F
003C: GOTO 038
.................... output_low(servo1);
003D: BSF 03.5
003E: BCF 05.4
003F: BCF 03.5
0040: BCF 05.4
....................
.................... output_high(servo2);
0041: BSF 03.5
0042: BCF 05.3
0043: BCF 03.5
0044: BSF 05.3
.................... Delay_us(1500);
0045: MOVLW 01
0046: MOVWF 10
0047: CALL 004
0048: MOVLW 02
0049: MOVWF 10
004A: MOVLW EC
004B: MOVWF 11
004C: CALL 019
004D: DECFSZ 10,F
004E: GOTO 04A
.................... output_low(servo2);
004F: BSF 03.5
0050: BCF 05.3
0051: BCF 03.5
0052: BCF 05.3
....................
.................... output_high(servo3);
0053: BSF 03.5
0054: BCF 05.2
0055: BCF 03.5
0056: BSF 05.2
.................... Delay_us(1500);
0057: MOVLW 01
0058: MOVWF 10
0059: CALL 004
005A: MOVLW 02
005B: MOVWF 10
005C: MOVLW EC
005D: MOVWF 11
005E: CALL 019
005F: DECFSZ 10,F
0060: GOTO 05C
.................... output_low(servo3);
0061: BSF 03.5
0062: BCF 05.2
0063: BCF 03.5
0064: BCF 05.2
....................
.................... output_high(servo4);
0065: BSF 03.5
0066: BCF 05.0
0067: BCF 03.5
0068: BSF 05.0
.................... Delay_us(1500);
0069: MOVLW 01
006A: MOVWF 10
006B: CALL 004
006C: MOVLW 02
006D: MOVWF 10
006E: MOVLW EC
006F: MOVWF 11
0070: CALL 019
0071: DECFSZ 10,F
0072: GOTO 06E
.................... output_low(servo4);
0073: BSF 03.5
0074: BCF 05.0
0075: BCF 03.5
0076: BCF 05.0
....................
.................... Delay_ms(10);
0077: MOVLW 0A
0078: MOVWF 10
0079: CALL 004
.................... }
007A: GOTO 02A
....................
.................... While(!input(SW))
007B: BSF 03.5
007C: BSF 05.1
007D: BCF 03.5
007E: BTFSC 05.1
007F: GOTO 0ED
.................... {
.................... for(i=0; i<100; ++i)
0080: CLRF 0F
0081: MOVF 0F,W
0082: SUBLW 63
0083: BTFSS 03.0
0084: GOTO 0B6
.................... {
.................... output_high(servo1);
0085: BSF 03.5
0086: BCF 05.4
0087: BCF 03.5
0088: BSF 05.4
.................... Delay_us(1000);
0089: MOVLW 01
008A: MOVWF 10
008B: CALL 004
.................... output_low(servo1);
008C: BSF 03.5
008D: BCF 05.4
008E: BCF 03.5
008F: BCF 05.4
....................
.................... output_high(servo2);
0090: BSF 03.5
0091: BCF 05.3
0092: BCF 03.5
0093: BSF 05.3
.................... Delay_us(1000);
0094: MOVLW 01
0095: MOVWF 10
0096: CALL 004
.................... output_low(servo2);
0097: BSF 03.5
0098: BCF 05.3
0099: BCF 03.5
009A: BCF 05.3
....................
.................... output_high(servo3);
009B: BSF 03.5
009C: BCF 05.2
009D: BCF 03.5
009E: BSF 05.2
.................... Delay_us(1000);
009F: MOVLW 01
00A0: MOVWF 10
00A1: CALL 004
.................... output_low(servo3);
00A2: BSF 03.5
00A3: BCF 05.2
00A4: BCF 03.5
00A5: BCF 05.2
....................
.................... output_high(servo4);
00A6: BSF 03.5
00A7: BCF 05.0
00A8: BCF 03.5
00A9: BSF 05.0
.................... Delay_us(1000);
00AA: MOVLW 01
00AB: MOVWF 10
00AC: CALL 004
.................... output_low(servo4);
00AD: BSF 03.5
00AE: BCF 05.0
00AF: BCF 03.5
00B0: BCF 05.0
....................
.................... Delay_ms(10);
00B1: MOVLW 0A
00B2: MOVWF 10
00B3: CALL 004
.................... }
00B4: INCF 0F,F
00B5: GOTO 081
....................
.................... for(i=0; i<100; ++i)
00B6: CLRF 0F
00B7: MOVF 0F,W
00B8: SUBLW 63
00B9: BTFSS 03.0
00BA: GOTO 0EC
.................... {
.................... output_high(servo1);
00BB: BSF 03.5
00BC: BCF 05.4
00BD: BCF 03.5
00BE: BSF 05.4
.................... Delay_us(2000);
00BF: MOVLW 02
00C0: MOVWF 10
00C1: CALL 004
.................... output_low(servo1);
00C2: BSF 03.5
00C3: BCF 05.4
00C4: BCF 03.5
00C5: BCF 05.4
....................
.................... output_high(servo2);
00C6: BSF 03.5
00C7: BCF 05.3
00C8: BCF 03.5
00C9: BSF 05.3
.................... Delay_us(2000);
00CA: MOVLW 02
00CB: MOVWF 10
00CC: CALL 004
.................... output_low(servo2);
00CD: BSF 03.5
00CE: BCF 05.3
00CF: BCF 03.5
00D0: BCF 05.3
....................
.................... output_high(servo3);
00D1: BSF 03.5
00D2: BCF 05.2
00D3: BCF 03.5
00D4: BSF 05.2
.................... Delay_us(2000);
00D5: MOVLW 02
00D6: MOVWF 10
00D7: CALL 004
.................... output_low(servo3);
00D8: BSF 03.5
00D9: BCF 05.2
00DA: BCF 03.5
00DB: BCF 05.2
....................
.................... output_high(servo4);
00DC: BSF 03.5
00DD: BCF 05.0
00DE: BCF 03.5
00DF: BSF 05.0
.................... Delay_us(2000);
00E0: MOVLW 02
00E1: MOVWF 10
00E2: CALL 004
.................... output_low(servo4);
00E3: BSF 03.5
00E4: BCF 05.0
00E5: BCF 03.5
00E6: BCF 05.0
....................
.................... Delay_ms(10);
00E7: MOVLW 0A
00E8: MOVWF 10
00E9: CALL 004
.................... }
00EA: INCF 0F,F
00EB: GOTO 0B7
.................... }
00EC: GOTO 07B
.................... }
00ED: GOTO 02A
.................... }
....................
00EE: SLEEP
/programy/C/PIC/mereni/serva/PIC16F84/main.PJT
0,0 → 1,35
[PROJECT]
Target=main.HEX
Development_Mode=
Processor=0x684A
ToolSuite=CCS
 
[Directories]
Include=C:\PROGRAM FILES\PICC\devices\;C:\PROGRAM FILES\PICC\dr
Library=
LinkerScript=
 
[Target Data]
FileList=main.c;
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[main.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=main.c
 
[Windows]
0=0000 main.c 0 0 796 451 3 0
 
[Opened Files]
1=D:\KAKLIK\programy\PIC_C\mereni\serva\PIC16F84\main.c
2=
/programy/C/PIC/mereni/serva/PIC16F84/main.SYM
0,0 → 1,16
00C @SCRATCH
00D @SCRATCH
00D _RETURN_
00F main.i
010 delay_ms.P1
010 main.@SCRATCH
011 delay_us.P1
 
0004 delay_ms
0019 delay_us
0027 main
 
Project Files:
d:\@kaklik\programy\pic_c\mereni\serva\main.c
D:\@Kaklik\programy\PIC_C\mereni\serva\main.h
C:\PROGRAM FILES\PICC\devices\16F84.h
/programy/C/PIC/mereni/serva/PIC16F84/main.c
0,0 → 1,81
#include "D:\@Kaklik\programy\PIC_C\mereni\serva\main.h"
#DEFINE servo1 PIN_A4
#DEFINE servo2 PIN_A3
#DEFINE servo3 PIN_A2
#DEFINE servo4 PIN_A0
#DEFINE SW PIN_A1
 
void main()
{
int i;
 
 
while(true)
{
While(input(SW))
{
output_high(servo1);
Delay_us(1500);
output_low(servo1);
output_high(servo2);
Delay_us(1500);
output_low(servo2);
output_high(servo3);
Delay_us(1500);
output_low(servo3);
output_high(servo4);
Delay_us(1500);
output_low(servo4);
Delay_ms(10);
}
While(!input(SW))
{
for(i=0; i<100; ++i)
{
output_high(servo1);
Delay_us(1000);
output_low(servo1);
output_high(servo2);
Delay_us(1000);
output_low(servo2);
output_high(servo3);
Delay_us(1000);
output_low(servo3);
output_high(servo4);
Delay_us(1000);
output_low(servo4);
Delay_ms(10);
}
for(i=0; i<100; ++i)
{
output_high(servo1);
Delay_us(2000);
output_low(servo1);
output_high(servo2);
Delay_us(2000);
output_low(servo2);
output_high(servo3);
Delay_us(2000);
output_low(servo3);
output_high(servo4);
Delay_us(2000);
output_low(servo4);
Delay_ms(10);
}
}
}
}
/programy/C/PIC/mereni/serva/PIC16F84/main.cod
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/serva/PIC16F84/main.err
0,0 → 1,0
No Errors
/programy/C/PIC/mereni/serva/PIC16F84/main.h
0,0 → 1,4
#include <16F84.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
 
/programy/C/PIC/mereni/serva/PIC16F84/main.sta
0,0 → 1,29
 
ROM used: 239 (23%)
785 (77%) including unused fragments
 
1 Average locations per line
5 Average locations per statement
 
RAM used: 4 (6%) at main() level
5 (7%) worst case
 
Lines Stmts % Files
----- ----- --- -----
81 49 100 d:\@kaklik\programy\pic_c\mereni\serva\main.c
5 0 0 D:\@Kaklik\programy\PIC_C\mereni\serva\main.h
111 0 0 C:\PROGRAM FILES\PICC\devices\16F84.h
----- -----
394 98 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 21 9 1 delay_ms
0 14 6 1 delay_us
0 200 84 2 main
 
Segment Used Free
--------- ---- ----
0000-0003 4 0
0004-03FF 235 785
 
/programy/C/PIC/mereni/serva/PIC16F84/main.tre
0,0 → 1,22
ÀÄmain
ÀÄmain 0/200 Ram=2
ÃÄ??0??
ÃÄdelay_ms 0/21 Ram=1
ÃÄdelay_us 0/14 Ram=1
ÃÄdelay_ms 0/21 Ram=1
ÃÄdelay_us 0/14 Ram=1
ÃÄdelay_ms 0/21 Ram=1
ÃÄdelay_us 0/14 Ram=1
ÃÄdelay_ms 0/21 Ram=1
ÃÄdelay_us 0/14 Ram=1
ÃÄdelay_ms 0/21 Ram=1
ÃÄdelay_ms 0/21 Ram=1
ÃÄdelay_ms 0/21 Ram=1
ÃÄdelay_ms 0/21 Ram=1
ÃÄdelay_ms 0/21 Ram=1
ÃÄdelay_ms 0/21 Ram=1
ÃÄdelay_ms 0/21 Ram=1
ÃÄdelay_ms 0/21 Ram=1
ÃÄdelay_ms 0/21 Ram=1
ÃÄdelay_ms 0/21 Ram=1
ÀÄdelay_ms 0/21 Ram=1
/programy/C/PIC/mereni/serva/PIC16F84/prg.bat
0,0 → 1,8
:start
call picpgr stop
call picpgr erase pic16f84
call picpgr program main.hex hex pic16f84
call picpgr run
pause
call picpgr stop
rem goto start
/programy/C/PIC/mereni/serva/PIC16F84/vssver.scc
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/tester_serv/blikac.BAK
0,0 → 1,40
#include "blikac.h"
#DEFINE SERVO_X PIN_A2 // piny na ktere jsou pripojena serva
#DEFINE SERVO_Y PIN_B0
#DEFINE TL1 PIN_B1
 
void main()
{
int i;
while (true)
{
while(input(TL1))
{
for(i=0;i<=100;i++)
{
output_high(servo_y);
output_high(servo_x);
delay_us(1000);
output_low(servo_y);
output_low(servo_x);
delay_ms(20);
}
 
for(i=0;i<=100;i++)
{
output_high(servo_y);
output_high(servo_x);
delay_us(2000);
output_low(servo_y);
output_low(servo_x);
delay_ms(20);
}
}
output_high(servo_y);
output_high(servo_x);
delay_us(1500);
output_low(servo_y);
output_low(servo_x);
delay_ms(20);
}
}
/programy/C/PIC/mereni/tester_serv/blikac.HEX
0,0 → 1,23
:020000040000FA
:1000000000308A002B2800001330840000080319F8
:10001000172801308D008C018C0B0C288D0B0B28C0
:100020004A308C008C0B12281528800B09280034CC
:1000300012309402031C2A2814308400FC308005FE
:100040000310800C800C000803192A2828280000BF
:10005000800B27287E2884011F3083058316861491
:100060008312861C6E2892011208643C031C5028DF
:1000700083160610831206148316051183120515C4
:100080000130930004208316061083120610831695
:10009000051183120511143093000420920A3428AC
:1000A00092011208643C031C6D288316061083120B
:1000B00006148316051183120515023093000420DF
:1000C000831606108312061083160511831205117C
:1000D000143093000420920A51282E28831606100B
:1000E000831206148316051183120515013093003F
:1000F000042002309300F73094001828930B7B28DB
:10010000831606108312061083160511831205113B
:0A0110001430930004202E28630031
:02400E00F93F78
:00000001FF
;PIC16C84
;CRC=26BE CREATED="23-I-10 18:21"
/programy/C/PIC/mereni/tester_serv/blikac.LST
0,0 → 1,204
CCS PCM C Compiler, Version 4.090, 47914 23-I-10 18:21
 
Filename: D:\svnKaklik\programy\C\PIC_C\mereni\tester serv\blikac.lst
 
ROM used: 141 words (14%)
Largest free fragment is 883
RAM used: 7 (19%) at main() level
8 (22%) worst case
Stack: 1 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 02B
0003: NOP
.................... #include "blikac.h"
.................... #include <16C84.h>
.................... //////// Standard Header file for the PIC16C84 device ////////////////
.................... #device PIC16C84
.................... #list
....................
.................... #use delay(clock=4000000)
0004: MOVLW 13
0005: MOVWF 04
0006: MOVF 00,W
0007: BTFSC 03.2
0008: GOTO 017
0009: MOVLW 01
000A: MOVWF 0D
000B: CLRF 0C
000C: DECFSZ 0C,F
000D: GOTO 00C
000E: DECFSZ 0D,F
000F: GOTO 00B
0010: MOVLW 4A
0011: MOVWF 0C
0012: DECFSZ 0C,F
0013: GOTO 012
0014: GOTO 015
0015: DECFSZ 00,F
0016: GOTO 009
0017: RETLW 00
0018: MOVLW 12
0019: SUBWF 14,F
001A: BTFSS 03.0
001B: GOTO 02A
001C: MOVLW 14
001D: MOVWF 04
001E: MOVLW FC
001F: ANDWF 00,F
0020: BCF 03.0
0021: RRF 00,F
0022: RRF 00,F
0023: MOVF 00,W
0024: BTFSC 03.2
0025: GOTO 02A
0026: GOTO 028
0027: NOP
0028: DECFSZ 00,F
0029: GOTO 027
002A: GOTO 07E (RETURN)
.................... #fuses XT,PUT,NOWDT
....................
....................
.................... #DEFINE SERVO_X PIN_A2 // piny na ktere jsou pripojena serva
.................... #DEFINE SERVO_Y PIN_B0
.................... #DEFINE TL1 PIN_B1
....................
.................... void main()
.................... {
002B: CLRF 04
002C: MOVLW 1F
002D: ANDWF 03,F
.................... int i;
.................... while (true)
.................... {
.................... while(input(TL1))
.................... {
002E: BSF 03.5
002F: BSF 06.1
0030: BCF 03.5
0031: BTFSS 06.1
0032: GOTO 06E
.................... for(i=0;i<=100;i++)
0033: CLRF 12
0034: MOVF 12,W
0035: SUBLW 64
0036: BTFSS 03.0
0037: GOTO 050
.................... {
.................... output_high(servo_y);
0038: BSF 03.5
0039: BCF 06.0
003A: BCF 03.5
003B: BSF 06.0
.................... output_high(servo_x);
003C: BSF 03.5
003D: BCF 05.2
003E: BCF 03.5
003F: BSF 05.2
.................... delay_us(1000);
0040: MOVLW 01
0041: MOVWF 13
0042: CALL 004
.................... output_low(servo_y);
0043: BSF 03.5
0044: BCF 06.0
0045: BCF 03.5
0046: BCF 06.0
.................... output_low(servo_x);
0047: BSF 03.5
0048: BCF 05.2
0049: BCF 03.5
004A: BCF 05.2
.................... delay_ms(20);
004B: MOVLW 14
004C: MOVWF 13
004D: CALL 004
.................... }
004E: INCF 12,F
004F: GOTO 034
....................
.................... for(i=0;i<=100;i++)
0050: CLRF 12
0051: MOVF 12,W
0052: SUBLW 64
0053: BTFSS 03.0
0054: GOTO 06D
.................... {
.................... output_high(servo_y);
0055: BSF 03.5
0056: BCF 06.0
0057: BCF 03.5
0058: BSF 06.0
.................... output_high(servo_x);
0059: BSF 03.5
005A: BCF 05.2
005B: BCF 03.5
005C: BSF 05.2
.................... delay_us(2000);
005D: MOVLW 02
005E: MOVWF 13
005F: CALL 004
.................... output_low(servo_y);
0060: BSF 03.5
0061: BCF 06.0
0062: BCF 03.5
0063: BCF 06.0
.................... output_low(servo_x);
0064: BSF 03.5
0065: BCF 05.2
0066: BCF 03.5
0067: BCF 05.2
.................... delay_ms(20);
0068: MOVLW 14
0069: MOVWF 13
006A: CALL 004
.................... }
006B: INCF 12,F
006C: GOTO 051
.................... }
006D: GOTO 02E
.................... output_high(servo_y);
006E: BSF 03.5
006F: BCF 06.0
0070: BCF 03.5
0071: BSF 06.0
.................... output_high(servo_x);
0072: BSF 03.5
0073: BCF 05.2
0074: BCF 03.5
0075: BSF 05.2
.................... delay_us(1500);
0076: MOVLW 01
0077: MOVWF 13
0078: CALL 004
0079: MOVLW 02
007A: MOVWF 13
007B: MOVLW F7
007C: MOVWF 14
007D: GOTO 018
007E: DECFSZ 13,F
007F: GOTO 07B
.................... output_low(servo_y);
0080: BSF 03.5
0081: BCF 06.0
0082: BCF 03.5
0083: BCF 06.0
.................... output_low(servo_x);
0084: BSF 03.5
0085: BCF 05.2
0086: BCF 03.5
0087: BCF 05.2
.................... delay_ms(20);
0088: MOVLW 14
0089: MOVWF 13
008A: CALL 004
.................... }
008B: GOTO 02E
.................... }
008C: SLEEP
 
Configuration Fuses:
Word 1: 3FF9 XT NOWDT PUT NOPROTECT
/programy/C/PIC/mereni/tester_serv/blikac.PJT
0,0 → 1,40
[PROJECT]
Target=blikac.HEX
Development_Mode=
Processor=0x6C84
ToolSuite=CCS
Processor_Text=PIC16C84
 
[Directories]
Include=C:\PROGRAM FILES\PICC\devices\;C:\PROGRAM FILES\PICC\dr
Library=
LinkerScript=
 
[Target Data]
FileList=D:\svnKaklik\programy\C\PIC_C\mereni\tester serv\blikac.c
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[blikac.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=blikac.c
 
[Windows]
0=0000 blikac.c 0 0 796 451 3 0
 
[Opened Files]
1=blikac.c
2=C:\PROGRAM FILES\PICC\devices\16C84.h
3=
[Units]
Count=1
1=blikac.c (main)
/programy/C/PIC/mereni/tester_serv/blikac.SYM
0,0 → 1,50
004-005 @READ_PROGRAM_MEMORY8.P1
00C @SCRATCH
00D @SCRATCH
00D _RETURN_
00E @SCRATCH
00F @SCRATCH
010 @SCRATCH
012 main.i
013 @delay_ms1.P1
013 main.@SCRATCH1
014 @delay_us1.P1
10D-10E @READ_PROGRAM_MEMORY8.P1
 
ROM Allocation:
0004 @delay_ms1
0018 @delay_us1
002B main
002B @cinit
 
 
User Memory space:
 
Project Directory:
D:\svnKaklik\programy\C\PIC_C\mereni\tester serv\
 
Project Files:
blikac.c
blikac.h
C:\PROGRAM FILES\PICC\devices\16C84.h
 
Units:
D:\svnKaklik\programy\C\PIC_C\mereni\tester serv\blikac.c (main)
 
Compiler Settings:
Processor: PIC16C84
Pointer Size: 8
Opt Level: 9
Short,Int,Long: UNSIGNED: 1,8,16
Float,Double: 32,32
 
Output Files:
Errors: blikac.err
Ext Symbols: blikac.esym
INHX8: blikac.hex
Symbols: blikac.sym
List: blikac.lst
Debug/COFF: blikac.cof
Project: blikac.PJT
Call Tree: blikac.tre
Statistics: blikac.sta
/programy/C/PIC/mereni/tester_serv/blikac.c
0,0 → 1,40
#include "blikac.h"
#DEFINE SERVO_X PIN_A2 // piny na ktere jsou pripojena serva
#DEFINE SERVO_Y PIN_B0
#DEFINE TL1 PIN_B1
 
void main()
{
int i;
while (true)
{
while(input(TL1))
{
for(i=0;i<=100;i++)
{
output_high(servo_y);
output_high(servo_x);
delay_us(1000);
output_low(servo_y);
output_low(servo_x);
delay_ms(20);
}
 
for(i=0;i<=100;i++)
{
output_high(servo_y);
output_high(servo_x);
delay_us(2000);
output_low(servo_y);
output_low(servo_x);
delay_ms(20);
}
}
output_high(servo_y);
output_high(servo_x);
delay_us(1500);
output_low(servo_y);
output_low(servo_x);
delay_ms(20);
}
}
/programy/C/PIC/mereni/tester_serv/blikac.err
0,0 → 1,2
Memory usage: ROM=14% RAM=19% - 22%
0 Errors, 0 Warnings.
/programy/C/PIC/mereni/tester_serv/blikac.sta
0,0 → 1,45
 
ROM used: 141 (14%)
141 (14%) including unused fragments
 
1 Average locations per line
5 Average locations per statement
 
RAM used: 7 (19%) at main() level
8 (22%) worst case
 
Stack used: 1 worst case (out of 8 total available)
 
Lines Stmts % Files
----- ----- --- -----
41 26 100 blikac.c
5 0 0 blikac.h
115 0 0 C:\PROGRAM FILES\PICC\devices\16C84.h
----- -----
161 26 Total
 
Page ROM % RAM Vol Diff Functions:
---- --- --- --- --- ---- ----------
0 20 14 1 @delay_ms1
0 19 13 1 @delay_us1
0 98 70 2 670 3.8 main
 
Program metrics:
Functions 1
Statements 26
Comments 37
Volume (V) 675
Difficilty (D) 3.7
Effort to implement (E) 2505
Time to implement (T) 2 minutes
Est Delivered Bugs (B) 0
Cyclomatic Complexity 2
Maintainability (MI) 84
 
Segment Used Free
----------- ---- ----
00000-00003 4 0
00004-003FF 137 883
 
 
 
/programy/C/PIC/mereni/tester_serv/blikac.tre
0,0 → 1,10
ÀÄblikac
ÀÄmain 0/98 Ram=2
ÃÄ??0??
ÃÄ@delay_ms1 0/20 Ram=1
ÃÄ@delay_ms1 0/20 Ram=1
ÃÄ@delay_ms1 0/20 Ram=1
ÃÄ@delay_ms1 0/20 Ram=1
ÃÄ@delay_ms1 0/20 Ram=1
ÃÄ@delay_us1 0/19 Ram=1
ÀÄ@delay_ms1 0/20 Ram=1
/programy/C/PIC/mereni/tester_serv/blikac.cod
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/tester_serv/blikac.h
0,0 → 1,4
#include <16C84.h>
#use delay(clock=4000000)
#fuses XT,PUT,NOWDT
 
/programy/C/PIC/mereni/tester_serv/vssver.scc
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/teplomer/1wire.c
0,0 → 1,43
#define ONE_WIRE_PIN PIN_A3 // pro pristup k cidlu jsem zvolil
 
void onewire_reset()
{
output_low(ONE_WIRE_PIN);
delay_us(240);
output_float(ONE_WIRE_PIN);
delay_us(150);
output_float(ONE_WIRE_PIN);
}
 
void onewire_write(int data)
{
int count;
 
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 );
output_bit(ONE_WIRE_PIN, shift_right(&data,1,1));
 
delay_us( 40 );
output_float(ONE_WIRE_PIN);
delay_us( 2 );
}
}
 
int onewire_read()
{
int count, data;
 
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 );
output_float(ONE_WIRE_PIN);
delay_us( 8 );
shift_right(&data,1,input(ONE_WIRE_PIN));
delay_us(5);
}
 
return( data );
}
/programy/C/PIC/mereni/teplomer/main.c
0,0 → 1,84
#include "main.h"
#define LED_K1 PIN_A2 // anody segmentovek
#define LED_K2 PIN_A1
#include "1wire.c"
 
 
void main()
{
//long duty; // strida PWM
int znak1; // hodnota jednotek
int znak2; // hodnota desitek
int znak; // zobrazovany znak
int i, n, temp; // i pro for
int8 temp1, temp2;
signed int16 temp3;
 
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
 
while(TRUE)
{
temp3 = make16(temp2, temp1);
temp=(int) (temp3/16);
znak2=(int) (temp/10); //vydelit deseti a zaokrouhlit dolu = desitky
znak1=temp-znak2*10; //jednotky rozdil teploty a desitek
for (n=0;n<=2;n++)
{
for (i=0;i<=2;i++) { //cyklus zobrazeni udaje
if (i==1) {
output_low(LED_K2); //dva bloky pro sepnuti aktivniho segmentu na 1
if (n==0){
onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);
}
output_high(LED_K1);
znak=znak1;
 
}
if (i==2) {
output_low(LED_K1);
if (n==0){
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
}
output_high(LED_K2);
znak=znak2;
}
if (temp>=85)
{
output_high(LED_K1);
output_high(LED_K2);
output_b(0b00001101);
}
else
{
if (znak==1) output_b(0b11110010); //blok if pro rozeznani zobrazeneho znaku
if (znak==2) output_b(0b01001000);
if (znak==3) output_b(0b01100000);
if (znak==4) output_b(0b00110010);
if (znak==5) output_b(0b00100100);
if (znak==6) output_b(0b00000100);
if (znak==7) output_b(0b11110000);
if (znak==8) output_b(0b00000000);
if (znak==9) output_b(0b00100000);
if (znak==0) output_b(0b10000000);
}
Delay_ms(6);
}
}
// duty=104+(2,31*temp); // .000416/(16*(1/4000000)) ....PWM presne podle helpu
// set_pwm1_duty(duty);
}
}
/programy/C/PIC/mereni/teplomer/main.h
0,0 → 1,6
#include <16F88.h>
#device adc=8
#fuses NOWDT,INTRC_IO, NOPUT, NOMCLR, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOFCMEN, NOIESO
#use delay(clock=4000000)
 
 
/programy/C/PIC/mereni/teplomer/main.hex
0,0 → 1,76
:1000000000308A006D290000831685118312851146
:10001000A630F700F70B0A28000083168515A630D6
:10002000F700F70B11280000851583120034B30187
:100030003308073C031C372883168511831285116A
:10004000000000000314B20C031828288511292889
:100050008515831685111330F700F70B2D28000046
:1000600000008515000000008312B30A1828003430
:10007000B2013208073C031C5A28831685118312EB
:10008000851100000000831685150230F700F70B7C
:100090004728000085158312851950280310512820
:1000A0000314B30C2730F700F70B542800000000AE
:1000B000B20A39283308F80000343308350680398D
:1000C000B700B31F6828B209B309B20A0319B30A0B
:1000D000B51F6F28B409B509B40A0319B50AF801A8
:1000E000F901F701FA013508031D792834080319CD
:1000F00093281030B6000310B20DB30DF70DFA0DB2
:1001000035087A02031D862834087702031C8F28DD
:100110003408F702031CFA033508FA020314F80D39
:10012000F90DB60B7B280000B71F9B28F809F909C9
:10013000F80A0319F90A8A11E4288E30F700330807
:10014000F8003208F900FA01F808031DB12879080F
:10015000F800F9010830F702F808031DB128F7018B
:10016000B9280310F81BB828F90DF80DF703B128CA
:10017000F81300008A11E828A9010420CC30B2004D
:1001800017204430B2001720A908031DCB283820BF
:100190007808A900C4280420CC30B2001720BE3053
:1001A000B200172038207808AA0038207808AB0061
:1001B0002B08AD002A08AC002D08B3002C08B200B3
:1001C000B5011030B4005D287808B301B2009D2855
:1001D0007A08B1007908B0007808AF007708AE005F
:1001E0002E08F7002F08F8003008F9003108FA004F
:1001F0008A11A7298E30F7002908F7022A08F9008A
:100200002B08F800F917F708031911290310F9084A
:10021000031D0D29F80803191129F90CF80CF70B27
:100220000629AA1F1829F809F909F80A0319F90A71
:1002300000008A11B0292A08F8012902031823298D
:100240002908F7002F29F7010830AB00A90DF70D99
:100250002A0877020318F700F80DAB0B26298A113C
:10026000BF29F701F801290803102A18F707F70C2E
:10027000F80CAA18F707F70CF80C2A19F707F70C6F
:10028000F80CAA19F707F70CF80C2A1AF707F70C5D
:10029000F80CAA1AF707F70CF80C2A1BF707F70C4B
:1002A000F80CAA1BF707F70CF80C8A11C62929309D
:1002B0008400000803196B290130F800F701F70BDF
:1002C0005F29F80B5E294A30F700F70B652900001B
:1002D0000000800B5C298A11412A84011F308305AC
:1002E000603083168F001F129F121B0880399B00FD
:1002F00007309C001F129F121B0880399B0083123D
:100300001F109412831606118614061200308312F1
:100310009400831694000108C739083881008312BD
:1003200090010030F80092000030831692000730F0
:100330009C0005080330F700F70B9C291C0883126A
:100340000D1383169D018F010F088312BC287A08B4
:10035000AC007908AB007808AA007708A900FA2851
:100360007808A3002308093C031CBA292308A40029
:10037000A501C9292308A9000A30AA001B29780869
:10038000A5002508A9000A30AA003129780823020F
:10039000A400A7012708013C031C432AA708031D4A
:1003A000DB298316851083128510831605118312AD
:1003B00005152408A600270BE729831605118312CB
:1003C000051183168510831285142508A600260BB7
:1003D000EE2983168601F330831286002608023C3C
:1003E000031DF729831686014930831286002608EB
:1003F000033C031D002A83168601613083128600A8
:100400002608043C031D092A831686013330831213
:1004100086002608053C031D122A83168601253016
:10042000831286002608063C031D1B2A83168601BC
:100430000530831286002608073C031D242A8316F4
:100440008601F130831286002608083C031D2D2A00
:10045000831686010130831286002608093C031D9D
:10046000362A83168601213083128600A608031DD2
:100470003E2A831686018130831286000A30A90045
:0C0480005729A70ACA298316A529630082
:04400E00F83FFF3F39
:00000001FF
;PIC16F88
/programy/C/PIC/mereni/teplomer/main.sta
0,0 → 1,40
 
ROM used: 582 (14%)
582 (14%) including unused fragments
 
1 Average locations per line
7 Average locations per statement
 
RAM used: 13 (7%) at main() level
28 (16%) worst case
 
Lines Stmts % Files
----- ----- --- -----
88 52 60 D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\main.c
19 0 0 D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\main.h
279 0 0 C:\Program Files\PICC\devices\16F88.h
49 22 16 D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\1wire.c
29 13 8 D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\ds1820.c
----- -----
928 174 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 22 4 1 @delay_ms1
0 19 3 0 onewire_reset
0 33 6 2 onewire_write
0 37 6 2 onewire_read
0 62 11 9 ds1820_read
0 64 11 6 @DIVS1616
0 31 5 2 @ITOF
0 217 37 8 main
0 33 6 4 @SFTOI
0 22 4 3 @DIV88
0 38 7 2 @MUL88
 
Segment Used Free
--------- ---- ----
00000-00003 4 0
00004-007FF 578 1466
00800-00FFF 0 2048
 
/programy/C/PIC/mereni/teplomer/main.sym
0,0 → 1,78
015-016 CCP_1
015 CCP_1_LOW
016 CCP_1_HIGH
021-022 main.duty
023 main.temp
024 main.znak1
025 main.znak2
026 main.znak
027 main.i
028 main.n
029 ds1820_read.busy
029 @DIV88.P1
029 @delay_ms1.P2
029 @MUL88.P3
029-02C @SFTOI.P4
02A @DIV88.P1
02A ds1820_read.temp1
02A @MUL88.P1
02B ds1820_read.temp2
02B @DIV88.@SCRATCH
02C-02D ds1820_read.temp3
02E-031 ds1820_read.result
032 onewire_read.count
032-033 @ITOF.P1
032-033 @DIVS1616.P2
032 onewire_write.data
033 onewire_write.count
033 onewire_read.data
034-035 @DIVS1616.P1
036 @DIVS1616.@SCRATCH
037 @DIVS1616.@SCRATCH
077 @SCRATCH
078 @SCRATCH
078 _RETURN_
079 @SCRATCH
07A @SCRATCH
07B @SCRATCH
09C.6 C1OUT
09C.7 C2OUT
 
0157 @delay_ms1
0004 onewire_reset
0017 onewire_write
0038 onewire_read
00BC ds1820_read
005D @DIVS1616
009D @ITOF
016D main
00FA @SFTOI
011B @DIV88
0131 @MUL88
016D @cinit
 
Project Files:
D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\main.c
D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\main.h
C:\Program Files\PICC\devices\16F88.h
D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\1wire.c
D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\ds1820.c
 
Units:
D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\main.c (main)
 
Compiler Settings:
Processor: PIC16F88
Pointer Size: 8
ADC Range: 0-255
Opt Level: 9
Short,Int,Long: 1,8,16
 
Output Files:
Errors: D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\main.err
INHX8: D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\main.hex
Symbols: D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\main.sym
List: D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\main.lst
Debug/COFF: D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\main.cof
Call Tree: D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\main.tre
Statistics: D:\KAKLIK\projekty\programy\C\PIC_C\mereni\teplomer\main.sta
/programy/C/PIC/mereni/teplomer/main.tre
0,0 → 1,19
ÀÄmain
ÀÄmain 0/217 Ram=8
ÃÄ??0??
ÃÄds1820_read 0/62 Ram=9
³ ÃÄonewire_reset 0/19 Ram=0
³ ÃÄonewire_write 0/33 Ram=2
³ ÃÄonewire_write 0/33 Ram=2
³ ÃÄonewire_read 0/37 Ram=2
³ ÃÄonewire_reset 0/19 Ram=0
³ ÃÄonewire_write 0/33 Ram=2
³ ÃÄonewire_write 0/33 Ram=2
³ ÃÄonewire_read 0/37 Ram=2
³ ÃÄonewire_read 0/37 Ram=2
³ ÃÄ@DIVS1616 0/64 Ram=6
³ ÀÄ@ITOF 0/31 Ram=2
ÃÄ@SFTOI 0/33 Ram=4
ÃÄ@DIV88 0/22 Ram=3
ÃÄ@MUL88 0/38 Ram=2
ÀÄ@delay_ms1 0/22 Ram=1
/programy/C/PIC/mereni/teplomer/ds1820.c
0,0 → 1,28
float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
 
onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);
 
while (busy == 0)
busy = onewire_read();
 
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
 
result = (int) (temp3/16); //calculation pro DS18B20 with 0.1 deg C
 
 
return(result);
 
}
 
/programy/C/PIC/mereni/teplomer/main.err
0,0 → 1,2
No Errors
0 Errors, 0 Warnings.
/programy/C/PIC/mereni/teplomer/mainhcg.BAK
0,0 → 1,82
#include "main.h"
 
 
#define LED_K1 PIN_A2 // anody segmentovek
#define LED_K2 PIN_A1
//#define LED_D1 PIN_A1 // katody segmentovek ///ted uz nepotreba
//#define LED_D2 PIN_A2
//#define LED_D3 PIN_A3
//#define LED_D4 PIN_A4
//#define LED_D5 PIN_A5
//#define LED_D6 PIN_A6
//#define LED_D7 PIN_A7
 
#include "1wire.c"
#include "ds1820.c"
 
void main()
{
float temperature; // teplota z ds1820.c
long duty; // strida PWM
int temp; // zaokrouhlena teplota
int znak1; // hodnota jednotek
int znak2; // hodnota desitek
int znak; // zobrazovany znak
int i; // i pro for
 
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(TRUE);
 
 
while(TRUE)
{
temperature = ds1820_read();
temp = (int) temperature;
 
if (temp<10) { //pro teploty 0-10°C
znak1=temp;
znak2=0;
}
else {
znak2=(int) (temp/10); //vydelit deseti a zaokrouhlit dolu = desitky
znak1=temp-((int) (temp/10))*10; //jednotky rozdil teploty a desitek
}
for (i=1;i<=2;i++) { //cyklus zobrazeni udaje
output_low(0x7f); //vymaz display
if (i==1) {
output_high(LED_K1); //dva bloky pro sepnuti aktivniho segmentu na 1
output_low(LED_K2);
znak=znak1;
}
if (i==2) {
output_high(LED_K2);
output_low(LED_K1);
znak=znak2;
}
if (znak==1) output_b(0x4f); //blok if pro rozeznani zobrazeneho znaku
if (znak==2) output_b(0x12);
if (znak==3) output_b(0x06);
if (znak==4) output_b(0x4c);
if (znak==5) output_b(0x2c);
if (znak==6) output_b(0x20);
if (znak==7) output_b(0x0f);
if (znak==8) output_b(0x00);
if (znak==9) output_b(0x04);
if (znak==0) output_b(0x01);
Delay_ms(50);
}
// duty=104+(2,31*temperature); // .000416/(16*(1/4000000)) ....PWM presne podle helpu
// set_pwm1_duty(duty);
}
 
 
 
 
}
/programy/C/PIC/mereni/gmetr/gmetr.BAK
0,0 → 1,65
#include ".\gmetr.h"
 
#define LCD_RS PIN_B1 // rizeni registru LCD displeje
#define LCD_E PIN_B0 // enable LCD displeje
#define LCD_DATA_LSB PIN_C4 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
 
#include "C:\library\CCS\lcd.c"
 
 
void main()
{
signed int16 stred;
signed int8 hodnota;
unsigned int8 i, offset;
 
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
 
lcd_init();
Delay_ms(100);
set_adc_channel(1);
 
LCD_gotoxy(1,1);
printf(lcd_putc,"Gmetr 0.1.2 Beta");
LCD_gotoxy(1,2);
printf(lcd_putc,"Kaklik@mlab.cz");
Delay_ms(500);
 
LCD_clr();
LCD_gotoxy(1,1);
printf(lcd_putc,"Clibration...");
 
stred = 0;
for(i=0;i<=127;i++)
{
Delay_ms(10);
stred = stred + read_adc();
}
stred = stred >> 7;
 
while(true)
{
hodnota = read_adc();
Delay_ms(50);
LCD_clr();
LCD_gotoxy(6,1);
printf(lcd_putc," %03ld ",(stred - hodnota));
if (hodnota > stred)
{
offset = hodnota - stred;
offset = (offset >> 5) + 8;
}
else
{
offset = stred - hodnota;
offset = offset >> 5;
}
LCD_gotoxy(offset,2);
printf(lcd_putc,"*");
}
}
/programy/C/PIC/mereni/gmetr/gmetr.HEX
0,0 → 1,87
:1000000000308A00842900000A108A100A11820731
:1000100028340C34013406340A108A100A1182077D
:1000200047346D34653474347234203430342E34B3
:1000300031342E34323420344234653474346134F3
:1000400000340A108A100A1182074B3461346B3471
:100050006C3469346B3440346D346C3461346234E4
:100060002E3463347A3400340A108A100A1182075D
:1000700043346C34693462347234613474346934B6
:100080006F346E342E342E342E3400340A108A101D
:100090000A1182072A34003436308400000803191C
:1000A00060280130A100A001A00B5428A10B532807
:1000B0004A30A000A00B5A2800000000800B5128F5
:1000C000003407080F39BD003C0EA000F030A00539
:1000D0002008F0393D04870006148316061000003E
:1000E000831206108316061083120034BA08031D0B
:1000F0007B2886107C288614831686108312BB0EFC
:100100003B08BC006120BB0E3B08BC0061200D30E9
:10011000A000A00B892800341430B6004C200F300A
:1001200083168705831286108316861083120610A5
:10013000831606108312AB012B08023C031CA8286F
:100140000230B6004C200330BC006120AB0A9C2872
:100150000D30A000A00BAA280230BC0061200D3099
:10016000A000A00BB128AB012B08023C031CC42843
:100170002B080420AC00BA012C08BB00762002300A
:10018000B6004C20AB0AB4288A11BD2901303602D2
:10019000B8003708023C031DCF284030B8073808A4
:1001A0008038B900BA013908BB0076200034350820
:1001B0000C3A0319E528063A0319ED28073A031902
:1001C000F328053A0319F828FD28BA010130BB00CD
:1001D00076200230B6004C2009290130B6000230EA
:1001E000B700C62009290130B600B700C62009298A
:1001F000BA011030BB007620092935081F3C031CCA
:1002000003290730B5050130BA003508BB00762058
:10021000092900340C30B500D72000340408B4009C
:10022000AE1F1A29B417341EB40AAD09AE09AD0ABF
:100230000319AE0A2E0EF038B000B007E23EB1004E
:10024000323EB3002E080F39B107B107B307E93EBC
:10025000B200B207B2072D0E0F39B207B307B20DC5
:10026000B30DB309B30D2D080F39B307B00D073027
:10027000AF000A30B307B203031C3A29B207B10337
:10028000031C3E29B107B003031C4229B007AF038A
:10029000031C46292F3084000730340534138403AF
:1002A0003405031D5A29341A840A341A5A29203075
:1002B000A00077298407333004020319341700089B
:1002C000A000031D6B29341B6B29341A7F29B41934
:1002D0006B2920307629B41F73292D30A0008403A8
:1002E0003413B4137729B41534123030A007AE019B
:1002F0000408AD002008B500D7202D088400840A2A
:10030000341F5B298A11472A84011F308305831615
:100310001F149F141F159F11FF308312A500831611
:100320001F109F101F119F1183121F139F138316FD
:100330009F1783121F149412A51225088316870095
:10034000831225162508831687008312A511250818
:1003500083168700003083129400831694000108EE
:10036000C73908388100831290010030A100920043
:1003700000308316920083128C286430B6004C2023
:100380000830A1001F08C73921049F000130B600C2
:10039000B700C620AB012B080C2000380319D42964
:1003A000AB0AB500D720CB290130B6000230B70028
:1003B000C620AB012B08212000380319E329AB0A22
:1003C000B500D720DA290230AB00FA30B6004C2055
:1003D000AB0BE5290A210130B600B700C620AB01FE
:1003E0002B08342000380319F929AB0AB500D720AF
:1003F000F029A701A601A90129087F3C031C102AA6
:100400000A30B6004C201F151F19042A83161E0837
:100410008312A6070318A70A1E08A707A90AFC2922
:10042000A70CA60CA70CA60CA70CA60CA70CA60C38
:10043000A70CA60CA70CA60CA70CA60C0130A705B0
:100440001F151F19212A83161E088312A800323097
:10045000B6004C200A210630B6000130B700C62095
:10046000A3012808A000A81BA3032602AB002708AD
:10047000AC002308031C230FAC022030B500D720AA
:100480000B3084002C08AE002B08AD000E29203064
:10049000B500D720A3012808A000A01BA303A1003A
:1004A000A71F552AA31F612A572AA31B782A2708AA
:1004B0002302031C782A031D612A26082102031C3B
:1004C000782AA3012808A81BA303A100260821025B
:1004D000A0002708031C270FA3022008AA002A0E49
:1004E000A000A00C0730A0052008083EAA008C2A16
:1004F000A3012808A81BA3032602A0002308031CAD
:10050000230F842A2708852A2702A3002008AA008F
:10051000AA0EAA0C0730AA052A08B6000230B700B6
:10052000C620AB012B084620003803199B2AAB0AD2
:0A053000B500D720922A202A6300AC
:02400E00393F38
:00000001FF
;PIC16F873
/programy/C/PIC/mereni/gmetr/gmetr.LST
0,0 → 1,885
CCS PCM C Compiler, Version 3.245, 27853 27-VI-07 00:22
 
Filename: D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.lst
 
ROM used: 669 words (16%)
Largest free fragment is 2048
RAM used: 13 (7%) at main() level
31 (16%) worst case
Stack: 5 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 184
0003: NOP
.................... #include ".\gmetr.h"
.................... #include <16F873.h>
.................... //////// Standard Header file for the PIC16F873 device ////////////////
.................... #device PIC16F873
.................... #list
....................
.................... #device adc=10
.................... #fuses NOWDT,XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
.................... #use delay(clock=4000000)
*
004C: MOVLW 36
004D: MOVWF 04
004E: MOVF 00,W
004F: BTFSC 03.2
0050: GOTO 060
0051: MOVLW 01
0052: MOVWF 21
0053: CLRF 20
0054: DECFSZ 20,F
0055: GOTO 054
0056: DECFSZ 21,F
0057: GOTO 053
0058: MOVLW 4A
0059: MOVWF 20
005A: DECFSZ 20,F
005B: GOTO 05A
005C: NOP
005D: NOP
005E: DECFSZ 00,F
005F: GOTO 051
0060: RETLW 00
....................
....................
....................
.................... #define LCD_RS PIN_B1 // rizeni registru LCD displeje
.................... #define LCD_E PIN_B0 // enable LCD displeje
.................... #define LCD_DATA_LSB PIN_C4 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
....................
.................... #include "C:\library\CCS\lcd.c"
.................... // LCD modul pro ovladani dvouradkoveho LCD modulu se standardnim Hitachi radicem
.................... // (c)miho 2002,2005
.................... //
.................... // 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
.................... // 0.03 Doplnena procedura lcd_clr pro smazani displeje
.................... //
.................... //
.................... // 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_clr smaze displej
.................... //
.................... // 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
0061: MOVF 07,W
0062: ANDLW 0F
0063: MOVWF 3D
0064: SWAPF 3C,W
0065: MOVWF 20
0066: MOVLW F0
0067: ANDWF 20,F
0068: MOVF 20,W
0069: ANDLW F0
006A: IORWF 3D,W
006B: MOVWF 07
.................... #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
006C: BSF 06.0
006D: BSF 03.5
006E: BCF 06.0
.................... delay_us(1); // pockej alespon 450ns od e nebo alespon 195ns od dat
006F: NOP
.................... output_bit(LCD_E,0); // sestupna hrana (minimalni perioda e je 1us)
0070: BCF 03.5
0071: BCF 06.0
0072: BSF 03.5
0073: BCF 06.0
.................... }
0074: BCF 03.5
0075: RETLW 00
....................
....................
.................... // 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
0076: MOVF 3A,F
0077: BTFSS 03.2
0078: GOTO 07B
0079: BCF 06.1
007A: GOTO 07C
007B: BSF 06.1
007C: BSF 03.5
007D: BCF 06.1
.................... swap(n);
007E: BCF 03.5
007F: SWAPF 3B,F
.................... lcd_send_nibble(n); // posli horni pulku bajtu
0080: MOVF 3B,W
0081: MOVWF 3C
0082: CALL 061
.................... swap(n);
0083: SWAPF 3B,F
.................... lcd_send_nibble(n); // posli spodni pulku bajtu
0084: MOVF 3B,W
0085: MOVWF 3C
0086: CALL 061
.................... delay_us(40); // minimalni doba na provedeni prikazu
0087: MOVLW 0D
0088: MOVWF 20
0089: DECFSZ 20,F
008A: GOTO 089
.................... }
008B: RETLW 00
....................
....................
.................... // 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
008C: MOVLW 14
008D: MOVWF 36
008E: CALL 04C
....................
.................... #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
008F: MOVLW 0F
0090: BSF 03.5
0091: ANDWF 07,F
.................... #endif
....................
.................... output_bit(LCD_RS,0); // nastav jako vystup a nastav klidovy stav
0092: BCF 03.5
0093: BCF 06.1
0094: BSF 03.5
0095: BCF 06.1
.................... output_bit(LCD_E, 0); // nastav jako vystup a nastav klidovy stav
0096: BCF 03.5
0097: BCF 06.0
0098: BSF 03.5
0099: BCF 06.0
....................
.................... for (i=0; i<3; i++) // nastav lcd do rezimu 8 bitu sbernice
009A: BCF 03.5
009B: CLRF 2B
009C: MOVF 2B,W
009D: SUBLW 02
009E: BTFSS 03.0
009F: GOTO 0A8
.................... {
.................... delay_ms(2); // muze byt rozdelany prenos dat (2x 4 bity) nebo pomaly povel
00A0: MOVLW 02
00A1: MOVWF 36
00A2: CALL 04C
.................... lcd_send_nibble(3); // rezim 8 bitu
00A3: MOVLW 03
00A4: MOVWF 3C
00A5: CALL 061
.................... }
00A6: INCF 2B,F
00A7: GOTO 09C
....................
.................... delay_us(40); // cas na zpracovani
00A8: MOVLW 0D
00A9: MOVWF 20
00AA: DECFSZ 20,F
00AB: GOTO 0AA
.................... lcd_send_nibble(2); // nastav rezim 4 bitu (plati od nasledujiciho prenosu)
00AC: MOVLW 02
00AD: MOVWF 3C
00AE: CALL 061
.................... delay_us(40); // cas na zpracovani
00AF: MOVLW 0D
00B0: MOVWF 20
00B1: DECFSZ 20,F
00B2: GOTO 0B1
....................
.................... for (i=0;i<3;i++) // proved inicializaci (nastaveni modu, smazani apod)
00B3: CLRF 2B
00B4: MOVF 2B,W
00B5: SUBLW 02
00B6: BTFSS 03.0
00B7: GOTO 0C4
.................... {
.................... lcd_send_byte(0,LCD_INIT_STRING[i]);
00B8: MOVF 2B,W
00B9: CALL 004
00BA: MOVWF 2C
00BB: CLRF 3A
00BC: MOVF 2C,W
00BD: MOVWF 3B
00BE: CALL 076
.................... delay_ms(2);
00BF: MOVLW 02
00C0: MOVWF 36
00C1: CALL 04C
.................... }
00C2: INCF 2B,F
00C3: GOTO 0B4
.................... }
00C4: BCF 0A.3
00C5: GOTO 1BD (RETURN)
....................
....................
.................... // Proved presun kurzoru
.................... //
.................... // Pozice 1.1 je domu
.................... //
.................... void lcd_gotoxy( BYTE x, BYTE y)
.................... {
....................
.................... BYTE Adr;
....................
.................... Adr=x-1;
00C6: MOVLW 01
00C7: SUBWF 36,W
00C8: MOVWF 38
.................... if(y==2)
00C9: MOVF 37,W
00CA: SUBLW 02
00CB: BTFSS 03.2
00CC: GOTO 0CF
.................... Adr+=LCD_LINE_2;
00CD: MOVLW 40
00CE: ADDWF 38,F
....................
.................... lcd_send_byte(0,0x80|Adr);
00CF: MOVF 38,W
00D0: IORLW 80
00D1: MOVWF 39
00D2: CLRF 3A
00D3: MOVF 39,W
00D4: MOVWF 3B
00D5: CALL 076
.................... }
00D6: RETLW 00
....................
....................
.................... // Zapis znaku na displej, zpracovani ridicich znaku
.................... //
.................... void lcd_putc( char c)
.................... {
....................
.................... switch (c)
.................... {
00D7: MOVF 35,W
00D8: XORLW 0C
00D9: BTFSC 03.2
00DA: GOTO 0E5
00DB: XORLW 06
00DC: BTFSC 03.2
00DD: GOTO 0ED
00DE: XORLW 07
00DF: BTFSC 03.2
00E0: GOTO 0F3
00E1: XORLW 05
00E2: BTFSC 03.2
00E3: GOTO 0F8
00E4: GOTO 0FD
.................... case '\f' : lcd_send_byte(0,1); // smaz displej
00E5: CLRF 3A
00E6: MOVLW 01
00E7: MOVWF 3B
00E8: CALL 076
.................... delay_ms(2);
00E9: MOVLW 02
00EA: MOVWF 36
00EB: CALL 04C
.................... break;
00EC: GOTO 109
.................... case '\n' : lcd_gotoxy(1,2); break; // presun se na 1. znak 2. radky
00ED: MOVLW 01
00EE: MOVWF 36
00EF: MOVLW 02
00F0: MOVWF 37
00F1: CALL 0C6
00F2: GOTO 109
.................... case '\r' : lcd_gotoxy(1,1); break; // presun home
00F3: MOVLW 01
00F4: MOVWF 36
00F5: MOVWF 37
00F6: CALL 0C6
00F7: GOTO 109
.................... case '\b' : lcd_send_byte(0,0x10); break; // posun kurzor o 1 zpet
00F8: CLRF 3A
00F9: MOVLW 10
00FA: MOVWF 3B
00FB: CALL 076
00FC: GOTO 109
.................... default : if (c<0x20) c&=0x7; // preklopeni definovatelnych znaku na rozsah 0 az 0x1F
00FD: MOVF 35,W
00FE: SUBLW 1F
00FF: BTFSS 03.0
0100: GOTO 103
0101: MOVLW 07
0102: ANDWF 35,F
.................... lcd_send_byte(1,c); break; // zapis znak
0103: MOVLW 01
0104: MOVWF 3A
0105: MOVF 35,W
0106: MOVWF 3B
0107: CALL 076
0108: GOTO 109
.................... }
.................... }
0109: RETLW 00
....................
....................
.................... // 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_);
.................... }
....................
....................
.................... // Smaz displej
.................... //
.................... void lcd_clr()
.................... {
.................... lcd_putc('\f');
010A: MOVLW 0C
010B: MOVWF 35
010C: CALL 0D7
.................... }
010D: RETLW 00
....................
....................
.................... // 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);
.................... //}
....................
....................
....................
.................... void main()
.................... {
*
0184: CLRF 04
0185: MOVLW 1F
0186: ANDWF 03,F
0187: BSF 03.5
0188: BSF 1F.0
0189: BSF 1F.1
018A: BSF 1F.2
018B: BCF 1F.3
.................... signed int16 stred;
.................... signed int8 hodnota;
.................... unsigned int8 i, offset;
....................
.................... setup_adc_ports(ALL_ANALOG);
*
018F: BSF 03.5
0190: BCF 1F.0
0191: BCF 1F.1
0192: BCF 1F.2
0193: BCF 1F.3
.................... setup_adc(ADC_CLOCK_DIV_2);
0194: BCF 03.5
0195: BCF 1F.6
0196: BCF 1F.7
0197: BSF 03.5
0198: BSF 1F.7
0199: BCF 03.5
019A: BSF 1F.0
.................... setup_spi(FALSE);
*
018C: MOVLW FF
018D: BCF 03.5
018E: MOVWF 25
*
019B: BCF 14.5
019C: BCF 25.5
019D: MOVF 25,W
019E: BSF 03.5
019F: MOVWF 07
01A0: BCF 03.5
01A1: BSF 25.4
01A2: MOVF 25,W
01A3: BSF 03.5
01A4: MOVWF 07
01A5: BCF 03.5
01A6: BCF 25.3
01A7: MOVF 25,W
01A8: BSF 03.5
01A9: MOVWF 07
01AA: MOVLW 00
01AB: BCF 03.5
01AC: MOVWF 14
01AD: BSF 03.5
01AE: MOVWF 14
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
01AF: MOVF 01,W
01B0: ANDLW C7
01B1: IORLW 08
01B2: MOVWF 01
.................... setup_timer_1(T1_DISABLED);
01B3: BCF 03.5
01B4: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
01B5: MOVLW 00
01B6: MOVWF 21
01B7: MOVWF 12
01B8: MOVLW 00
01B9: BSF 03.5
01BA: MOVWF 12
....................
.................... lcd_init();
01BB: BCF 03.5
01BC: GOTO 08C
.................... Delay_ms(100);
01BD: MOVLW 64
01BE: MOVWF 36
01BF: CALL 04C
.................... set_adc_channel(1);
01C0: MOVLW 08
01C1: MOVWF 21
01C2: MOVF 1F,W
01C3: ANDLW C7
01C4: IORWF 21,W
01C5: MOVWF 1F
....................
.................... LCD_gotoxy(1,1);
01C6: MOVLW 01
01C7: MOVWF 36
01C8: MOVWF 37
01C9: CALL 0C6
.................... printf(lcd_putc,"Gmetr 0.1.2 Beta");
01CA: CLRF 2B
01CB: MOVF 2B,W
01CC: CALL 00C
01CD: IORLW 00
01CE: BTFSC 03.2
01CF: GOTO 1D4
01D0: INCF 2B,F
01D1: MOVWF 35
01D2: CALL 0D7
01D3: GOTO 1CB
.................... LCD_gotoxy(1,2);
01D4: MOVLW 01
01D5: MOVWF 36
01D6: MOVLW 02
01D7: MOVWF 37
01D8: CALL 0C6
.................... printf(lcd_putc,"Kaklik@mlab.cz");
01D9: CLRF 2B
01DA: MOVF 2B,W
01DB: CALL 021
01DC: IORLW 00
01DD: BTFSC 03.2
01DE: GOTO 1E3
01DF: INCF 2B,F
01E0: MOVWF 35
01E1: CALL 0D7
01E2: GOTO 1DA
.................... Delay_ms(500);
01E3: MOVLW 02
01E4: MOVWF 2B
01E5: MOVLW FA
01E6: MOVWF 36
01E7: CALL 04C
01E8: DECFSZ 2B,F
01E9: GOTO 1E5
....................
.................... LCD_clr();
01EA: CALL 10A
.................... LCD_gotoxy(1,1);
01EB: MOVLW 01
01EC: MOVWF 36
01ED: MOVWF 37
01EE: CALL 0C6
.................... printf(lcd_putc,"Clibration...");
01EF: CLRF 2B
01F0: MOVF 2B,W
01F1: CALL 034
01F2: IORLW 00
01F3: BTFSC 03.2
01F4: GOTO 1F9
01F5: INCF 2B,F
01F6: MOVWF 35
01F7: CALL 0D7
01F8: GOTO 1F0
....................
.................... stred = 0;
01F9: CLRF 27
01FA: CLRF 26
.................... for(i=0;i<=127;i++)
01FB: CLRF 29
01FC: MOVF 29,W
01FD: SUBLW 7F
01FE: BTFSS 03.0
01FF: GOTO 210
.................... {
.................... Delay_ms(10);
0200: MOVLW 0A
0201: MOVWF 36
0202: CALL 04C
.................... stred = stred + read_adc();
0203: BSF 1F.2
0204: BTFSC 1F.2
0205: GOTO 204
0206: BSF 03.5
0207: MOVF 1E,W
0208: BCF 03.5
0209: ADDWF 26,F
020A: BTFSC 03.0
020B: INCF 27,F
020C: MOVF 1E,W
020D: ADDWF 27,F
.................... }
020E: INCF 29,F
020F: GOTO 1FC
.................... stred = stred >> 7;
0210: RRF 27,F
0211: RRF 26,F
0212: RRF 27,F
0213: RRF 26,F
0214: RRF 27,F
0215: RRF 26,F
0216: RRF 27,F
0217: RRF 26,F
0218: RRF 27,F
0219: RRF 26,F
021A: RRF 27,F
021B: RRF 26,F
021C: RRF 27,F
021D: RRF 26,F
021E: MOVLW 01
021F: ANDWF 27,F
....................
.................... while(true)
.................... {
.................... hodnota = read_adc();
0220: BSF 1F.2
0221: BTFSC 1F.2
0222: GOTO 221
0223: BSF 03.5
0224: MOVF 1E,W
0225: BCF 03.5
0226: MOVWF 28
.................... Delay_ms(50);
0227: MOVLW 32
0228: MOVWF 36
0229: CALL 04C
.................... LCD_clr();
022A: CALL 10A
.................... LCD_gotoxy(6,1);
022B: MOVLW 06
022C: MOVWF 36
022D: MOVLW 01
022E: MOVWF 37
022F: CALL 0C6
.................... printf(lcd_putc," %03ld ",(stred - hodnota));
0230: CLRF 23
0231: MOVF 28,W
0232: MOVWF 20
0233: BTFSC 28.7
0234: DECF 23,F
0235: SUBWF 26,W
0236: MOVWF 2B
0237: MOVF 27,W
0238: MOVWF 2C
0239: MOVF 23,W
023A: BTFSS 03.0
023B: INCFSZ 23,W
023C: SUBWF 2C,F
023D: MOVLW 20
023E: MOVWF 35
023F: CALL 0D7
0240: MOVLW 0B
0241: MOVWF 04
0242: MOVF 2C,W
0243: MOVWF 2E
0244: MOVF 2B,W
0245: MOVWF 2D
0246: GOTO 10E
0247: MOVLW 20
0248: MOVWF 35
0249: CALL 0D7
.................... if (hodnota >= stred)
024A: CLRF 23
024B: MOVF 28,W
024C: MOVWF 20
024D: BTFSC 20.7
024E: DECF 23,F
024F: MOVWF 21
0250: BTFSS 27.7
0251: GOTO 255
0252: BTFSS 23.7
0253: GOTO 261
0254: GOTO 257
0255: BTFSC 23.7
0256: GOTO 278
0257: MOVF 27,W
0258: SUBWF 23,W
0259: BTFSS 03.0
025A: GOTO 278
025B: BTFSS 03.2
025C: GOTO 261
025D: MOVF 26,W
025E: SUBWF 21,W
025F: BTFSS 03.0
0260: GOTO 278
.................... {
.................... offset = hodnota - stred;
0261: CLRF 23
0262: MOVF 28,W
0263: BTFSC 28.7
0264: DECF 23,F
0265: MOVWF 21
0266: MOVF 26,W
0267: SUBWF 21,W
0268: MOVWF 20
0269: MOVF 27,W
026A: BTFSS 03.0
026B: INCFSZ 27,W
026C: SUBWF 23,F
026D: MOVF 20,W
026E: MOVWF 2A
.................... offset = (offset >> 5) + 8;
026F: SWAPF 2A,W
0270: MOVWF 20
0271: RRF 20,F
0272: MOVLW 07
0273: ANDWF 20,F
0274: MOVF 20,W
0275: ADDLW 08
0276: MOVWF 2A
.................... }
.................... else
0277: GOTO 28C
.................... {
.................... offset = stred - hodnota;
0278: CLRF 23
0279: MOVF 28,W
027A: BTFSC 28.7
027B: DECF 23,F
027C: SUBWF 26,W
027D: MOVWF 20
027E: MOVF 23,W
027F: BTFSS 03.0
0280: INCFSZ 23,W
0281: GOTO 284
0282: MOVF 27,W
0283: GOTO 285
0284: SUBWF 27,W
0285: MOVWF 23
0286: MOVF 20,W
0287: MOVWF 2A
.................... offset = offset >> 5;
0288: SWAPF 2A,F
0289: RRF 2A,F
028A: MOVLW 07
028B: ANDWF 2A,F
.................... }
.................... LCD_gotoxy(offset,2);
028C: MOVF 2A,W
028D: MOVWF 36
028E: MOVLW 02
028F: MOVWF 37
0290: CALL 0C6
.................... printf(lcd_putc,"*");
0291: CLRF 2B
0292: MOVF 2B,W
0293: CALL 046
0294: IORLW 00
0295: BTFSC 03.2
0296: GOTO 29B
0297: INCF 2B,F
0298: MOVWF 35
0299: CALL 0D7
029A: GOTO 292
.................... }
029B: GOTO 220
.................... }
029C: SLEEP
 
Configuration Fuses:
Word 1: 3F39 XT NOWDT NOPUT NOPROTECT NOBROWNOUT NOLVP NOCPD NOWRT NODEBUG
/programy/C/PIC/mereni/gmetr/gmetr.PJT
0,0 → 1,41
[PROJECT]
Target=gmetr.HEX
Development_Mode=
Processor=0x873F
ToolSuite=CCS
 
[Directories]
Include=C:\Program Files\PICC\devices\;C:\Program Files\PICC\dr
Library=
LinkerScript=
 
[Target Data]
FileList=D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.c
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[gmetr.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=gmetr.c
 
[Windows]
0=0000 gmetr.c 0 0 796 451 3 0
 
[Opened Files]
1=D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.c
2=C:\library\CCS\lcd.c
3=C:\Program Files\PICC\devices\16F873.h
4=
5=
[Units]
Count=1
1=D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.c (main)
/programy/C/PIC/mereni/gmetr/gmetr.SYM
0,0 → 1,80
015 CCP_1_LOW
015-016 CCP_1
016 CCP_1_HIGH
01B CCP_2_LOW
01B-01C CCP_2
01C CCP_2_HIGH
020 @SCRATCH
021 @SCRATCH
021 _RETURN_
022 @SCRATCH
023 @SCRATCH
024 @SCRATCH
025 @TRIS_C
026-027 main.stred
028 main.hodnota
029 main.i
02A main.offset
02B lcd_init.i
02B main.@SCRATCH
02C lcd_init.@SCRATCH
02C main.@SCRATCH
02D-02E @PRINTF_LD_273.P1
02F @PRINTF_LD_273.@SCRATCH
030 @PRINTF_LD_273.@SCRATCH
031 @PRINTF_LD_273.@SCRATCH
032 @PRINTF_LD_273.@SCRATCH
033 @PRINTF_LD_273.@SCRATCH
034 @PRINTF_LD_273.@SCRATCH
035 lcd_putc.c
036 lcd_gotoxy.x
036 @delay_ms1.P1
037 lcd_gotoxy.y
038 lcd_gotoxy.Adr
039 lcd_gotoxy.@SCRATCH
03A lcd_send_byte.Adr
03B lcd_send_byte.n
03C lcd_send_nibble.n
03D lcd_send_nibble.@SCRATCH
03E lcd_send_nibble.@SCRATCH
 
004C @delay_ms1
0004 @const35
0061 lcd_send_nibble
0076 lcd_send_byte
008C lcd_init
00C6 lcd_gotoxy
00D7 lcd_putc
010A lcd_clr
0184 main
000C @const10098
0021 @const10103
0034 @const10109
010E @PRINTF_LD_273
0046 @const10155
0184 @cinit
 
Project Files:
D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.c
D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.h
C:\Program Files\PICC\devices\16F873.h
C:\library\CCS\lcd.c
 
Units:
D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.c (main)
 
Compiler Settings:
Processor: PIC16F873
Pointer Size: 8
ADC Range: 0-1023
Opt Level: 9
Short,Int,Long: 1,8,16
 
Output Files:
Errors: D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.err
INHX8: D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.hex
Symbols: D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.sym
List: D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.lst
Debug/COFF: D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.cof
Call Tree: D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.tre
Statistics: D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.sta
/programy/C/PIC/mereni/gmetr/gmetr.c
0,0 → 1,65
#include ".\gmetr.h"
 
#define LCD_RS PIN_B1 // rizeni registru LCD displeje
#define LCD_E PIN_B0 // enable LCD displeje
#define LCD_DATA_LSB PIN_C4 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
 
#include "C:\library\CCS\lcd.c"
 
 
void main()
{
signed int16 stred;
signed int8 hodnota;
unsigned int8 i, offset;
 
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
 
lcd_init();
Delay_ms(100);
set_adc_channel(1);
 
LCD_gotoxy(1,1);
printf(lcd_putc,"Gmetr 0.1.2 Beta");
LCD_gotoxy(1,2);
printf(lcd_putc,"Kaklik@mlab.cz");
Delay_ms(500);
 
LCD_clr();
LCD_gotoxy(1,1);
printf(lcd_putc,"Clibration...");
 
stred = 0;
for(i=0;i<=127;i++)
{
Delay_ms(10);
stred = stred + read_adc();
}
stred = stred >> 7;
 
while(true)
{
hodnota = read_adc();
Delay_ms(50);
LCD_clr();
LCD_gotoxy(6,1);
printf(lcd_putc," %03ld ",(stred - hodnota));
if (hodnota >= stred)
{
offset = hodnota - stred;
offset = (offset >> 5) + 8;
}
else
{
offset = stred - hodnota;
offset = offset >> 5;
}
LCD_gotoxy(offset,2);
printf(lcd_putc,"*");
}
}
/programy/C/PIC/mereni/gmetr/gmetr.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/gmetr/gmetr.err
0,0 → 1,2
No Errors
0 Errors, 0 Warnings.
/programy/C/PIC/mereni/gmetr/gmetr.sta
0,0 → 1,42
 
ROM used: 669 (16%)
669 (16%) including unused fragments
 
1 Average locations per line
8 Average locations per statement
 
RAM used: 13 (7%) at main() level
31 (16%) worst case
 
Lines Stmts % Files
----- ----- --- -----
66 39 45 D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.c
6 0 0 D:\KAKLIK\projekty\programy\PIC_C\mereni\gmetr\gmetr.h
244 0 0 C:\Program Files\PICC\devices\16F873.h
312 47 38 C:\library\CCS\lcd.c
----- -----
1256 172 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 21 3 1 @delay_ms1
0 8 1 0 @const35
0 21 3 3 lcd_send_nibble
0 22 3 2 lcd_send_byte
0 58 9 2 lcd_init
0 17 3 4 lcd_gotoxy
0 51 8 1 lcd_putc
0 4 1 0 lcd_clr
0 281 42 7 main
0 21 3 0 @const10098
0 19 3 0 @const10103
0 18 3 0 @const10109
0 118 18 8 @PRINTF_LD_273
0 6 1 0 @const10155
 
Segment Used Free
--------- ---- ----
00000-00003 4 0
00004-007FF 665 1379
00800-00FFF 0 2048
 
/programy/C/PIC/mereni/gmetr/gmetr.tre
0,0 → 1,215
ÀÄgmetr
ÀÄmain 0/281 Ram=7
ÃÄ??0??
ÃÄlcd_init 0/58 Ram=2
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÃÄ@const35 0/8 Ram=0
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÀÄ@delay_ms1 0/21 Ram=1
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄlcd_gotoxy 0/17 Ram=4
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄ@const10098 0/21 Ram=0
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄlcd_gotoxy 0/17 Ram=4
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄ@const10103 0/19 Ram=0
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄlcd_clr 0/4 Ram=0
³ ÀÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄlcd_gotoxy 0/17 Ram=4
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄ@const10109 0/18 Ram=0
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄlcd_clr 0/4 Ram=0
³ ÀÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄlcd_gotoxy 0/17 Ram=4
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄ@PRINTF_LD_273 0/118 Ram=8
³ ÀÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄlcd_gotoxy 0/17 Ram=4
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄ@const10155 0/6 Ram=0
ÀÄlcd_putc 0/51 Ram=1
ÃÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄlcd_gotoxy 0/17 Ram=4
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄlcd_gotoxy 0/17 Ram=4
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÀÄlcd_send_byte 0/22 Ram=2
ÃÄlcd_send_nibble 0/21 Ram=3
ÀÄlcd_send_nibble 0/21 Ram=3
/programy/C/PIC/mereni/gmetr/gmetr.h
0,0 → 1,5
#include <16F873.h>
#device adc=10
#fuses NOWDT,XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay(clock=4000000)
 
/programy/C/PIC/mereni/gmetr/vssver.scc
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/PS2mys/PIC16F84/RUN.PIF
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/PS2mys/PIC16F84/Run.BAT
0,0 → 1,8
@echo off
:loop
picpgr reset PIC16F84 lpt2
picpgr run lpt2
pause
picpgr stop lpt2
pause
goto loop
/programy/C/PIC/mereni/PS2mys/PIC16F84/main.BAK
0,0 → 1,57
#include "main.h"
#include "c:\library\kaklik\CSS\PS2.c"
 
#define SIGN_X 4
 
void trigger()
{
output_high(PIN_A0);
output_low(PIN_A0);
delay_us(100);
output_high(PIN_A0);
}
 
void flash_red() // blikne ledkou
{
output_high(LED_red);
Delay_ms(BLIK);
output_low(LED_red);
}
 
void flash_yellow() // blikne ledkou
{
output_high(LED_yellow);
Delay_ms(BLIK);
output_low(LED_yellow);
}
 
void main()
{
int8 X,y,tl=0;
int8 X_old,y_old,tl_old=0;
 
Delay_ms(500);
send(ENABLE_DATA_REPORTING);
 
while(true)
{
tl = read_byte(PRVNI);
x = read_byte(DRUHY);
y = read_byte(TRETI);
trigger();
 
 
if (bit_test(tl, SIGN_X))
{
output_high(LED_red);
output_low(LED_yellow);
}
else
{
output_high(LED_yellow);
output_low(LED_red);
}
}
}
 
 
/programy/C/PIC/mereni/PS2mys/PIC16F84/main.HEX
0,0 → 1,38
:1000000000308A00D128000016308400000803194F
:10001000182801308D008C018C0B0C288D0B0B28BF
:100020004A308C008C0B122800000000800B09283D
:10003000DB28970183160614861083128610213060
:100040008C008C0B212883160610831206100630B4
:100050008C008C0B29280000831686148312861CC2
:100060002C2896011608073C031C52288316861478
:1000700083128618362815080139003A031D4228D4
:10008000061043280614831606108312150801393A
:1000900097070310950C831686148312861C4B2831
:1000A000960A322883168614831286185228170857
:1000B000FF3A0139003A031D5F2806106028061434
:1000C0008316061086148312861868288316622801
:1000D00069288316861483128618692806148316E5
:1000E00006108614831286187728831671287828BC
:1000F000831606148312E0289601160203188D2831
:10010000831686148312861C8A288316061483128B
:1001100006188B289601960A7D288316861483126A
:1001200086188D2883160614831206188D288316C8
:1001300086148312861C9728950196011608073CA1
:10014000031CBD288316861483128618A228031068
:10015000950C8316061400308312061801308C00AB
:100160000C0C8C0103188C170C089504831686144C
:100170008312861CB628960A9E2815088D00003426
:1001800083160510831205148316051083120510BB
:1001900021308C008C0BCA2883160510831205149D
:1001A000FC2884011F3083059101940102309500E1
:1001B000FA3096000428950BD828F43095001928B9
:1001C000E83083160317FF00831203137C200D0809
:1001D0009100023083160317FF00831203137C2063
:1001E0000D088F00023083160317FF0083120313DC
:1001F0007C200D089000C028111E072983160511C8
:100200008312051583168511831285110F29831614
:100210008511831285158316051183120511E028B7
:02022000630079
:02400E00F93F78
:00000001FF
;PIC16F84
/programy/C/PIC/mereni/PS2mys/PIC16F84/main.LST
0,0 → 1,474
CCS PCW C Compiler, Version 3.110, 15448
 
Filename: d:\@kaklik\programy\pic_c\ps2mys\main.LST
 
ROM used: 273 (27%)
Largest free fragment is 751
RAM used: 9 (13%) at main() level
12 (18%) worst case
Stack: 1 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 0D1
0003: NOP
.................... #include "D:\@Kaklik\programy\PIC_C\PS2mys\main.h"
.................... #include <16F84.h>
.................... //////// Standard Header file for the PIC16F84 device ////////////////
.................... #device PIC16F84
.................... #list
....................
.................... #use delay(clock=4000000)
0004: MOVLW 16
0005: MOVWF 04
0006: MOVF 00,W
0007: BTFSC 03.2
0008: GOTO 018
0009: MOVLW 01
000A: MOVWF 0D
000B: CLRF 0C
000C: DECFSZ 0C,F
000D: GOTO 00C
000E: DECFSZ 0D,F
000F: GOTO 00B
0010: MOVLW 4A
0011: MOVWF 0C
0012: DECFSZ 0C,F
0013: GOTO 012
0014: NOP
0015: NOP
0016: DECFSZ 00,F
0017: GOTO 009
0018: GOTO 0DB (RETURN)
.................... #fuses XT,NOWDT
....................
.................... #DEFINE DATA PIN_B0 // musi byt definovan kanal DATA
.................... #DEFINE CLK PIN_B1 // a taky hodiny CLK
....................
.................... #define PRVNI 1000 // nastaveni prodlevy pred zacatkem vysilani bajtu
.................... #define DRUHY 2
.................... #define TRETI DRUHY
....................
.................... // prikazy
.................... #define RESET 0xFF
.................... #define ENABLE_DATA_REPORTING 0xF4
.................... #define READ_DATA 0xEB
.................... #define STATUS_REQUEST 0xE9
.................... #define SET_REMOTE_MODE 0xF0
.................... #define SET_STREAM_MODE 0xEA
.................... #define GET_DEVICE_ID 0xF2
....................
.................... #DEFINE LED_yellow PIN_A3
.................... #DEFINE LED_red PIN_A2
....................
.................... #DEFINE BLIK 120 // doba rozsviceni led
....................
.................... #include "PS2.c"
.................... // Modul pro komunikaci s Mysi
....................
.................... void send(byte command)
.................... {
.................... int n;
0019: CLRF 17
.................... int parity=0;
....................
.................... //Request-to-send
.................... output_float(DATA);
001A: BSF 03.5
001B: BSF 06.0
.................... output_low(CLK);
001C: BCF 06.1
001D: BCF 03.5
001E: BCF 06.1
.................... delay_us(100);
001F: MOVLW 21
0020: MOVWF 0C
0021: DECFSZ 0C,F
0022: GOTO 021
.................... // start bit
.................... output_low(DATA);
0023: BSF 03.5
0024: BCF 06.0
0025: BCF 03.5
0026: BCF 06.0
.................... delay_us(20);
0027: MOVLW 06
0028: MOVWF 0C
0029: DECFSZ 0C,F
002A: GOTO 029
002B: NOP
.................... while(!input(CLK));
002C: BSF 03.5
002D: BSF 06.1
002E: BCF 03.5
002F: BTFSS 06.1
0030: GOTO 02C
.................... // 8 bitu
.................... for(n=0; n<8; n++)
0031: CLRF 16
0032: MOVF 16,W
0033: SUBLW 07
0034: BTFSS 03.0
0035: GOTO 052
.................... {
.................... while(input(CLK));
0036: BSF 03.5
0037: BSF 06.1
0038: BCF 03.5
0039: BTFSC 06.1
003A: GOTO 036
.................... output_bit(DATA, command & 1);
003B: MOVF 15,W
003C: ANDLW 01
003D: XORLW 00
003E: BTFSS 03.2
003F: GOTO 042
0040: BCF 06.0
0041: GOTO 043
0042: BSF 06.0
0043: BSF 03.5
0044: BCF 06.0
.................... parity += command & 1;
0045: BCF 03.5
0046: MOVF 15,W
0047: ANDLW 01
0048: ADDWF 17,F
.................... command>>=1;
0049: BCF 03.0
004A: RRF 15,F
.................... while(!input(CLK));
004B: BSF 03.5
004C: BSF 06.1
004D: BCF 03.5
004E: BTFSS 06.1
004F: GOTO 04B
.................... };
0050: INCF 16,F
0051: GOTO 032
.................... // parita
.................... while(input(CLK));
0052: BSF 03.5
0053: BSF 06.1
0054: BCF 03.5
0055: BTFSC 06.1
0056: GOTO 052
.................... output_bit(DATA, ~parity & 1);
0057: MOVF 17,W
0058: XORLW FF
0059: ANDLW 01
005A: XORLW 00
005B: BTFSS 03.2
005C: GOTO 05F
005D: BCF 06.0
005E: GOTO 060
005F: BSF 06.0
0060: BSF 03.5
0061: BCF 06.0
.................... while(!input(CLK));
0062: BSF 06.1
0063: BCF 03.5
0064: BTFSC 06.1
0065: GOTO 068
0066: BSF 03.5
0067: GOTO 062
0068: GOTO 069
.................... // stop bit
.................... while(input(CLK));
0069: BSF 03.5
006A: BSF 06.1
006B: BCF 03.5
006C: BTFSC 06.1
006D: GOTO 069
.................... output_bit(DATA, 1);
006E: BSF 06.0
006F: BSF 03.5
0070: BCF 06.0
.................... while(!input(CLK));
0071: BSF 06.1
0072: BCF 03.5
0073: BTFSC 06.1
0074: GOTO 077
0075: BSF 03.5
0076: GOTO 071
0077: GOTO 078
.................... output_float(DATA);
0078: BSF 03.5
0079: BSF 06.0
007A: BCF 03.5
007B: GOTO 0E0 (RETURN)
.................... }
....................
....................
.................... int8 read_byte(int8 const poradi)
.................... {
.................... int8 bajt;
.................... int8 i;
....................
.................... // cekani na komunikacni klid
.................... for (i=0; i<poradi; i++)
007C: CLRF 16
007D: SUBWF 16,W
007E: BTFSC 03.0
007F: GOTO 08D
.................... {
.................... if (!input(CLK) || !input(DATA)) i=0;
0080: BSF 03.5
0081: BSF 06.1
0082: BCF 03.5
0083: BTFSS 06.1
0084: GOTO 08A
0085: BSF 03.5
0086: BSF 06.0
0087: BCF 03.5
0088: BTFSC 06.0
0089: GOTO 08B
008A: CLRF 16
.................... };
008B: INCF 16,F
008C: GOTO 07D
....................
.................... // cekani na startbit
.................... while(input(CLK) || input(DATA));
008D: BSF 03.5
008E: BSF 06.1
008F: BCF 03.5
0090: BTFSC 06.1
0091: GOTO 08D
0092: BSF 03.5
0093: BSF 06.0
0094: BCF 03.5
0095: BTFSC 06.0
0096: GOTO 08D
.................... while(!input(CLK));
0097: BSF 03.5
0098: BSF 06.1
0099: BCF 03.5
009A: BTFSS 06.1
009B: GOTO 097
....................
.................... bajt = 0;
009C: CLRF 15
.................... for(i=0; i<8; i++)
009D: CLRF 16
009E: MOVF 16,W
009F: SUBLW 07
00A0: BTFSS 03.0
00A1: GOTO 0BD
.................... {
.................... while(input(CLK)); // ceka na nulu hodin
00A2: BSF 03.5
00A3: BSF 06.1
00A4: BCF 03.5
00A5: BTFSC 06.1
00A6: GOTO 0A2
....................
.................... bajt >>= 1;
00A7: BCF 03.0
00A8: RRF 15,F
.................... bajt |= input(DATA) << 7;
00A9: BSF 03.5
00AA: BSF 06.0
00AB: MOVLW 00
00AC: BCF 03.5
00AD: BTFSC 06.0
00AE: MOVLW 01
00AF: MOVWF 0C
00B0: RRF 0C,W
00B1: CLRF 0C
00B2: BTFSC 03.0
00B3: BSF 0C.7
00B4: MOVF 0C,W
00B5: IORWF 15,F
....................
.................... while(!input(CLK)); // ceka na jednicku hodin
00B6: BSF 03.5
00B7: BSF 06.1
00B8: BCF 03.5
00B9: BTFSS 06.1
00BA: GOTO 0B6
.................... };
00BB: INCF 16,F
00BC: GOTO 09E
.................... return (bajt);
00BD: MOVF 15,W
00BE: MOVWF 0D
00BF: RETLW 00
.................... }
....................
....................
.................... /*void read_all_byte(int8*st,*nd,*rd) // precte 3 bajty
.................... {
.................... int8 i;
....................
.................... // *st=read_byte(1st);
....................
.................... // cekani na startbit
.................... while(input(CLK) || input(DATA));
.................... while(!input(CLK));
.................... *nd = 0;
.................... for(i=0; i<8; i++)
.................... {
.................... while(input(CLK)); // ceka na nulu hodin
....................
.................... *nd |= input(DATA) << 7;
.................... *nd >>= 1;
....................
.................... while(!input(CLK)); // ceka na jednicku hodin
.................... };
....................
.................... // cekani na startbit
.................... while(input(CLK) || input(DATA));
.................... while(!input(CLK));
.................... *rd = 0;
.................... for(i=0; i<8; i++)
.................... {
.................... while(input(CLK)); // ceka na nulu hodin
....................
.................... *rd |= input(DATA) << 7;
.................... *rd >>= 1;
....................
.................... while(!input(CLK)); // ceka na jednicku hodin
.................... };
.................... }*/
....................
....................
.................... #define SIGN_X 4
....................
.................... void trigger()
.................... {
.................... output_high(PIN_A0);
00C0: BSF 03.5
00C1: BCF 05.0
00C2: BCF 03.5
00C3: BSF 05.0
.................... output_low(PIN_A0);
00C4: BSF 03.5
00C5: BCF 05.0
00C6: BCF 03.5
00C7: BCF 05.0
.................... delay_us(100);
00C8: MOVLW 21
00C9: MOVWF 0C
00CA: DECFSZ 0C,F
00CB: GOTO 0CA
.................... output_high(PIN_A0);
00CC: BSF 03.5
00CD: BCF 05.0
00CE: BCF 03.5
00CF: BSF 05.0
00D0: GOTO 0FC (RETURN)
.................... }
....................
.................... void flash_red() // blikne ledkou
.................... {
.................... output_high(LED_red);
.................... Delay_ms(BLIK);
.................... output_low(LED_red);
.................... }
....................
.................... void flash_yellow() // blikne ledkou
.................... {
.................... output_high(LED_yellow);
.................... Delay_ms(BLIK);
.................... output_low(LED_yellow);
.................... }
....................
.................... void main()
.................... {
.................... int8 X,y,tl=0;
*
00D4: CLRF 11
00D5: CLRF 14
.................... int8 X_old,y_old,tl_old=0;
*
00D1: CLRF 04
00D2: MOVLW 1F
00D3: ANDWF 03,F
....................
.................... Delay_ms(500);
*
00D6: MOVLW 02
00D7: MOVWF 15
00D8: MOVLW FA
00D9: MOVWF 16
00DA: GOTO 004
00DB: DECFSZ 15,F
00DC: GOTO 0D8
.................... send(ENABLE_DATA_REPORTING);
00DD: MOVLW F4
00DE: MOVWF 15
00DF: GOTO 019
....................
.................... while(true)
.................... {
.................... tl = read_byte(PRVNI);
00E0: MOVLW E8
00E1: BSF 03.5
00E2: BSF 03.6
00E3: MOVWF 7F
00E4: BCF 03.5
00E5: BCF 03.6
00E6: CALL 07C
00E7: MOVF 0D,W
00E8: MOVWF 11
.................... x = read_byte(DRUHY);
00E9: MOVLW 02
00EA: BSF 03.5
00EB: BSF 03.6
00EC: MOVWF 7F
00ED: BCF 03.5
00EE: BCF 03.6
00EF: CALL 07C
00F0: MOVF 0D,W
00F1: MOVWF 0F
.................... y = read_byte(TRETI);
00F2: MOVLW 02
00F3: BSF 03.5
00F4: BSF 03.6
00F5: MOVWF 7F
00F6: BCF 03.5
00F7: BCF 03.6
00F8: CALL 07C
00F9: MOVF 0D,W
00FA: MOVWF 10
.................... trigger();
00FB: GOTO 0C0
....................
....................
.................... if (bit_test(tl, SIGN_X))
00FC: BTFSS 11.4
00FD: GOTO 107
.................... {
.................... output_high(LED_red);
00FE: BSF 03.5
00FF: BCF 05.2
0100: BCF 03.5
0101: BSF 05.2
.................... output_low(LED_yellow);
0102: BSF 03.5
0103: BCF 05.3
0104: BCF 03.5
0105: BCF 05.3
.................... }
.................... else
0106: GOTO 10F
.................... {
.................... output_high(LED_yellow);
0107: BSF 03.5
0108: BCF 05.3
0109: BCF 03.5
010A: BSF 05.3
.................... output_low(LED_red);
010B: BSF 03.5
010C: BCF 05.2
010D: BCF 03.5
010E: BCF 05.2
.................... }
.................... }
010F: GOTO 0E0
.................... }
....................
0110: SLEEP
....................
....................
/programy/C/PIC/mereni/PS2mys/PIC16F84/main.PJT
0,0 → 1,37
[PROJECT]
Target=main.HEX
Development_Mode=
Processor=0x684A
ToolSuite=CCS
 
[Directories]
Include=C:\PROGRAM FILES\PICC\devices\;C:\PROGRAM FILES\PICC\dr
Library=
LinkerScript=
 
[Target Data]
FileList=main.c;
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[main.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=main.c
 
[Windows]
0=0000 main.c 0 0 796 451 3 0
 
[Opened Files]
1=D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F84\main.c
2=C:\PROGRAM FILES\PICC\devices\16F84.h
3=c:\library\kaklik\CCS\PS2.c
4=
/programy/C/PIC/mereni/PS2mys/PIC16F84/main.SYM
0,0 → 1,32
00C @SCRATCH
00D @SCRATCH
00D _RETURN_
00F main.X
010 main.y
011 main.tl
012 main.X_old
013 main.y_old
014 main.tl_old
015 send.command
015 read_byte.bajt
015 main.@SCRATCH
016 delay_ms.P1
016 send.n
016 read_byte.i
017 send.parity
017 read_byte.@SCRATCH
018 send.@SCRATCH
delay_us.P1
read_byte.poradi
 
0004 delay_ms
0019 send
007C read_byte
00C0 trigger
00D1 main
 
Project Files:
d:\@kaklik\programy\pic_c\ps2mys\main.c
D:\@Kaklik\programy\PIC_C\PS2mys\main.h
C:\PROGRAM FILES\PICC\devices\16F84.h
d:\@kaklik\programy\pic_c\ps2mys\PS2.c
/programy/C/PIC/mereni/PS2mys/PIC16F84/main.c
0,0 → 1,57
#include "main.h"
#include "c:\library\kaklik\CCS\PS2.c"
 
#define SIGN_X 4
 
void trigger()
{
output_high(PIN_A0);
output_low(PIN_A0);
delay_us(100);
output_high(PIN_A0);
}
 
void flash_red() // blikne ledkou
{
output_high(LED_red);
Delay_ms(BLIK);
output_low(LED_red);
}
 
void flash_yellow() // blikne ledkou
{
output_high(LED_yellow);
Delay_ms(BLIK);
output_low(LED_yellow);
}
 
void main()
{
int8 X,y,tl=0;
int8 X_old,y_old,tl_old=0;
 
Delay_ms(500);
send(ENABLE_DATA_REPORTING);
 
while(true)
{
tl = read_byte(PRVNI);
x = read_byte(DRUHY);
y = read_byte(TRETI);
trigger();
 
 
if (bit_test(tl, SIGN_X))
{
output_high(LED_red);
output_low(LED_yellow);
}
else
{
output_high(LED_yellow);
output_low(LED_red);
}
}
}
 
 
/programy/C/PIC/mereni/PS2mys/PIC16F84/main.cod
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/PS2mys/PIC16F84/main.err
0,0 → 1,0
Error[51] c:\library\kaklik\CCS\PS2.c 48 : A numeric expression must appear here
/programy/C/PIC/mereni/PS2mys/PIC16F84/main.h
0,0 → 1,24
#include <16F84.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
 
#DEFINE DATA PIN_B0 // musi byt definovan kanal DATA
#DEFINE CLK PIN_B1 // a taky hodiny CLK
 
#define PRVNI 1000 // nastaveni prodlevy pred zacatkem vysilani bajtu
#define DRUHY 2
#define TRETI DRUHY
 
// prikazy
#define RESET 0xFF
#define ENABLE_DATA_REPORTING 0xF4
#define READ_DATA 0xEB
#define STATUS_REQUEST 0xE9
#define SET_REMOTE_MODE 0xF0
#define SET_STREAM_MODE 0xEA
#define GET_DEVICE_ID 0xF2
 
#DEFINE LED_yellow PIN_A3
#DEFINE LED_red PIN_A2
 
#DEFINE BLIK 120 // doba rozsviceni led
/programy/C/PIC/mereni/PS2mys/PIC16F84/main.sta
0,0 → 1,32
 
ROM used: 273 (27%)
751 (73%) including unused fragments
 
1 Average locations per line
4 Average locations per statement
 
RAM used: 9 (13%) at main() level
12 (18%) worst case
 
Lines Stmts % Files
----- ----- --- -----
58 25 34 d:\@kaklik\programy\pic_c\ps2mys\main.c
25 0 0 D:\@Kaklik\programy\PIC_C\PS2mys\main.h
111 0 0 C:\PROGRAM FILES\PICC\devices\16F84.h
100 48 49 d:\@kaklik\programy\pic_c\ps2mys\PS2.c
----- -----
588 146 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 21 8 1 delay_ms
0 99 36 4 send
0 68 25 4 read_byte
0 17 6 0 trigger
0 64 23 7 main
 
Segment Used Free
--------- ---- ----
0000-0003 4 0
0004-03FF 269 751
 
/programy/C/PIC/mereni/PS2mys/PIC16F84/main.tre
0,0 → 1,9
ÀÄmain
ÀÄmain 0/64 Ram=7
ÃÄ??0??
ÃÄdelay_ms 0/21 Ram=1
ÃÄsend 0/99 Ram=4
ÃÄread_byte 0/68 Ram=4
ÃÄread_byte 0/68 Ram=4
ÃÄread_byte 0/68 Ram=4
ÀÄtrigger 0/17 Ram=0
/programy/C/PIC/mereni/PS2mys/PIC16F84/prg.bat
0,0 → 1,6
call picpgr stop
call picpgr erase pic16f84
call picpgr program main.hex hex pic16f84
call picpgr run
pause
call picpgr stop
/programy/C/PIC/mereni/PS2mys/PIC16F84/ps2.BAK
0,0 → 1,99
// Modul pro komunikaci s Mysi
 
void send(byte command)
{
int n;
int parity=0;
 
//Request-to-send
// output_float(DATA);
output_low(CLK);
delay_us(100);
// start bit
output_low(DATA);
delay_us(20);
while(!input(CLK));
// 8 bitu
for(n=0; n<8; n++)
{
while(input(CLK));
output_bit(DATA, command & 1);
parity += command & 1;
command>>=1;
while(!input(CLK));
};
// parita
while(input(CLK));
output_bit(DATA, ~parity & 1);
while(!input(CLK));
// stop bit
while(input(CLK));
output_bit(DATA, 1);
while(!input(CLK));
output_float(DATA);
}
 
 
int8 read_byte(int8 const poradi)
{
int8 bajt;
int8 i;
 
// cekani na komunikacni klid
for (i=0; i<poradi; i++)
{
if (!input(CLK) || !input(DATA)) i=0;
};
 
// cekani na startbit
while(input(CLK) || input(DATA));
while(!input(CLK));
 
bajt = 0;
for(i=0; i<8; i++)
{
while(input(CLK)); // ceka na nulu hodin
 
bajt >>= 1;
bajt |= input(DATA) << 7;
 
while(!input(CLK)); // ceka na jednicku hodin
};
return (bajt);
}
 
 
/*void read_all_byte(int8*st,*nd,*rd) // precte 3 bajty
{
int8 i;
 
// *st=read_byte(1st);
 
// cekani na startbit
while(input(CLK) || input(DATA));
while(!input(CLK));
*nd = 0;
for(i=0; i<8; i++)
{
while(input(CLK)); // ceka na nulu hodin
 
*nd |= input(DATA) << 7;
*nd >>= 1;
 
while(!input(CLK)); // ceka na jednicku hodin
};
 
// cekani na startbit
while(input(CLK) || input(DATA));
while(!input(CLK));
*rd = 0;
for(i=0; i<8; i++)
{
while(input(CLK)); // ceka na nulu hodin
 
*rd |= input(DATA) << 7;
*rd >>= 1;
 
while(!input(CLK)); // ceka na jednicku hodin
};
}*/
/programy/C/PIC/mereni/PS2mys/PIC16F84/ps2mouse.BAK
0,0 → 1,100
#include "main.h"
#include "ps2mouse.h"
 
void send(byte command)
{
int n;
int parity=0;
 
//Request-to-send
input(DATA);
output_low(CLK);
delay_us(100);
// start bit
output_low(DATA);
delay_us(20);
while(!input(CLK));
// 8 bitu
for(n=0; n<8; n++)
{
while(input(CLK));
output_bit(DATA, command & 1);
parity += command & 1;
command>>=1;
while(!input(CLK));
};
// parita
while(input(CLK));
output_bit(DATA, ~parity & 1);
while(!input(CLK));
// stop bit
while(input(CLK));
output_bit(DATA, 1);
while(!input(CLK));
output_float(DATA);
}
 
 
int8 read_byte(int8 const poradi)
{
int8 bajt;
int8 i;
 
// cekani na komunikacni klid
for (i=0; i<poradi; i++)
{
if (!input(CLK) || !input(DATA)) i=0;
};
 
// cekani na startbit
while(input(CLK) || input(DATA));
while(!input(CLK));
 
bajt = 0;
for(i=0; i<8; i++)
{
while(input(CLK)); // ceka na nulu hodin
 
bajt >>= 1;
bajt |= input(DATA) << 7;
 
while(!input(CLK)); // ceka na jednicku hodin
};
return (bajt);
}
 
 
/*void read_all_byte(int8*st,*nd,*rd) // precte 3 bajty
{
int8 i;
 
// *st=read_byte(1st);
 
// cekani na startbit
while(input(CLK) || input(DATA));
while(!input(CLK));
*nd = 0;
for(i=0; i<8; i++)
{
while(input(CLK)); // ceka na nulu hodin
 
*nd |= input(DATA) << 7;
*nd >>= 1;
 
while(!input(CLK)); // ceka na jednicku hodin
};
 
// cekani na startbit
while(input(CLK) || input(DATA));
while(!input(CLK));
*rd = 0;
for(i=0; i<8; i++)
{
while(input(CLK)); // ceka na nulu hodin
 
*rd |= input(DATA) << 7;
*rd >>= 1;
 
while(!input(CLK)); // ceka na jednicku hodin
};
}*/
/programy/C/PIC/mereni/PS2mys/PIC16F84/ps2mouse.c
0,0 → 1,97
void send(byte command)
{
int n;
int parity=0;
 
//Request-to-send
input(DATA);
output_low(CLK);
delay_us(100);
// start bit
output_low(DATA);
delay_us(20);
while(!input(CLK));
// 8 bitu
for(n=0; n<8; n++)
{
while(input(CLK));
output_bit(DATA, command & 1);
parity += command & 1;
command>>=1;
while(!input(CLK));
};
// parita
while(input(CLK));
output_bit(DATA, ~parity & 1);
while(!input(CLK));
// stop bit
while(input(CLK));
output_bit(DATA, 1);
while(!input(CLK));
output_float(DATA);
}
 
 
int8 read_byte(int8 const poradi)
{
int8 bajt;
int8 i;
 
// cekani na komunikacni klid
for (i=0; i<poradi; i++)
{
if (!input(CLK) || !input(DATA)) i=0;
};
 
// cekani na startbit
while(input(CLK) || input(DATA));
while(!input(CLK));
 
bajt = 0;
for(i=0; i<8; i++)
{
while(input(CLK)); // ceka na nulu hodin
 
bajt >>= 1;
bajt |= input(DATA) << 7;
 
while(!input(CLK)); // ceka na jednicku hodin
};
return (bajt);
}
 
 
/*void read_all_byte(int8*st,*nd,*rd) // precte 3 bajty
{
int8 i;
 
// *st=read_byte(1st);
 
// cekani na startbit
while(input(CLK) || input(DATA));
while(!input(CLK));
*nd = 0;
for(i=0; i<8; i++)
{
while(input(CLK)); // ceka na nulu hodin
 
*nd |= input(DATA) << 7;
*nd >>= 1;
 
while(!input(CLK)); // ceka na jednicku hodin
};
 
// cekani na startbit
while(input(CLK) || input(DATA));
while(!input(CLK));
*rd = 0;
for(i=0; i<8; i++)
{
while(input(CLK)); // ceka na nulu hodin
 
*rd |= input(DATA) << 7;
*rd >>= 1;
 
while(!input(CLK)); // ceka na jednicku hodin
};
}*/
/programy/C/PIC/mereni/PS2mys/PIC16F84/ps2mouse.h
0,0 → 1,18
 
#define PRVNI 1000 // nastaveni prodlevy pred zacatkem vysilani bajtu
#define DRUHY 2
#define TRETI DRUHY
 
 
// prikazy
#define RESET 0xFF
#define ENABLE_DATA_REPORTING 0xF4
#define READ_DATA 0xEB
#define STATUS_REQUEST 0xE9
#define SET_REMOTE_MODE 0xF0
#define SET_STREAM_MODE 0xEA
#define GET_DEVICE_ID 0xF2
 
void send(byte command);
int8 read_byte(int8 const poradi);
 
/programy/C/PIC/mereni/PS2mys/PIC16F84/vssver.scc
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/PS2mys/PIC16F88/mys.BAK
0,0 → 1,54
#include "D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.h"
 
#define LCD_RS PIN_A0 // rizeni registru LCD displeje
#define LCD_E PIN_A1 // enable LCD displeje
#define LCD_DATA_LSB PIN_B0 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
#include "C:\library\CCS\lcd.c"
 
#define TRIGGER_PIN PIN_B4
 
#DEFINE DATA PIN_B5 // musi byt definovan kanal DATA
#DEFINE CLK PIN_B6 // a taky hodiny CLK
#include "C:\library\kaklik\CCS\ps2.c"
 
 
 
void trigger()
{
output_high(TRIGGER_PIN);
delay_us(50);
output_low(TRIGGER_PIN);
}
 
void main()
{
signed int16 x=0,y=0;
signed int8 hodnota,dx,dy;
unsigned int8 tl1,tl2,tl3;
 
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
 
lcd_init();
Delay_ms(500);
 
send(SET_REMOTE_MODE);
 
while (true)
{
LCD_gotoxy(1,1);
printf(lcd_putc,"%X X=%ld Y=%ld TL1=%U TL2=%U TL3=%U",hodnota, x,y,tl1,tl2,tl3);
delay_ms(20);
send(READ_DATA);
hodnota=read_byte();
read_standard_byte(&dx,&dy,&tl1,&tl2,&tl3);
x+=dx;
y+=dy;
}
}
/programy/C/PIC/mereni/PS2mys/PIC16F88/mys.HEX
0,0 → 1,123
:1000000000308A00E22A00000A108A100A118207D2
:1000100028340C34013406340A108A100A1182077D
:1000200025345834203458343D3425346C34643409
:10003000203459343D3425346C3464342034543401
:100040004C3431343D342534553454344C3432340A
:100050003D3425345534203454344C3433343D3419
:1000600025345534003434308400000803194728FF
:100070000130F800F701F70B3B28F80B3A284A301B
:10008000F700F70B412800000000800B38280034EF
:100090000608F039BB003A080F393B048600851486
:1000A0008316851000008312851083168510831235
:1000B0000034B808031D5E2805105F280514831658
:1000C00005108312B90E3908BA004820B90E390854
:1000D000BA0048200D30F700F70B6C2800341430BC
:1000E000B4003320F0308316860583120510831682
:1000F000051083128510831685108312AB012B081F
:10010000023C031C8B280230B40033200330BA00B9
:100110004820AB0A7F280D30F700F70B8D280230FE
:10012000BA0048200D30F700F70B9428AB012B08DC
:10013000023C031CA7282B080420AC00B8012C08A3
:10014000B90059200230B4003320AB0A97288A1135
:10015000242BAD0183168616061383120613213055
:10016000F700F70BB12883168612831286128316C6
:1001700006178312061BB728AC012C08073C031C8A
:10018000DA28831606178312061BC1282B18CA28E3
:100190008612CB2886168316861283122B08013905
:1001A000AD070310AB0C831606178312061FD32866
:1001B000AC0ABD28831606178312061BDA282D0801
:1001C000FF3A0139003A031DE7288612E82886160F
:1001D0008316861206178312061BF0288316EA2858
:1001E0008316861686168312861EF8288316F22832
:1001F000831606178312061BF82883160617831228
:10020000061FFD28831686168312861EFD280034DD
:1002100001303402B6003508023C031D112940307C
:10022000B60736088038B700B8013708B90059203A
:10023000003433080C3A03192729063A03192F29E9
:10024000073A03193529053A03193A293F29B80114
:100250000130B90059200230B40033204B2901305D
:10026000B4000230B50008214B290130B400B500BC
:1002700008214B29B8011030B90059204B29330807
:100280001F3C031C45290730B3050130B800330873
:10029000B90059204B290034AC1B5E290F30F70000
:1002A0002B0EF7050A307702031859293030F7076B
:1002B0005B292C08F7077708B30019210F30AB052D
:1002C0000A302B020318662930306829AC132C0839
:1002D000AB072B08B30019218A11372B0408B20091
:1002E000AC1F7B292D30B30019218403AB09AC0965
:1002F000AB0A0319AC0A2C0EF038AE00AE07E23E92
:10030000AF00323EB1002C080F39AF07AF07B1077D
:10031000E93EB000B007B0072B0E0F39B007B107A8
:10032000B00DB10DB109B10D2B080F39B107AE0DEC
:100330000730AD000A30B107B003031C9B29B0079A
:10034000AF03031C9F29AF07AE03031CA329AE070D
:10035000AD03031CA7292D30840007303205840724
:10036000313004020319D0290008F700031DBE290B
:10037000321ACE29B219C0292030C1290830B20062
:100380003030F707AC010408AB007708AD00770800
:10039000B30019212B0884002D08F700840AB02926
:1003A0000008F7003030F7077708B3001921003450
:1003B0003208F80131020318E0293108F700EC296E
:1003C000F7010830B300B10DF70D320877020318BA
:1003D000F700F80DB30BE32900343013B0122F08E7
:1003E000B1006430B200D8217708AF007808031D4F
:1003F000172AB01A172AB019252A301B052A3018D7
:10040000052A3019052AB01B252A301C112AB01BD9
:10041000252A301B112A3018252A3019112AB01B21
:10042000252A2030301E3030B3001921252AB0167D
:10043000B01F212A78088000F8002D30B300192160
:10044000B01330307807B3001921301B302A2F0841
:10045000B1000A30B200D8217708AF003017F62972
:10046000B01F352A2D30B300192130302F07B300CB
:10047000192100343510831606178312061B3B2AF8
:10048000831686168312861A3B2A83160617831252
:10049000061F452AB301B4013408073C031C7C2A1B
:1004A000831606178312061B502A0310B30C8316FB
:1004B000861600308312861A0130F700770CF70198
:1004C0000318F7177708B304003035180130B60069
:1004D0008316861600308312861A01303606F8001D
:1004E0007818742A3510752A351483160617831266
:1004F000061F752AB40A4C2A831606178312061B98
:100500007C2A003035180130B6008316861600307C
:100510008312861A01303606F8007818912A3510B1
:10052000922A3514831606178312061F922A831601
:1005300006178312061B972A831606178312061FB7
:100540009C2A3308F80000343A227808B0003A2296
:100550007808B1003A227808B20030080839083C1F
:10056000031DB82A2B0884003108003C8000BC2AF7
:100570002B0884003108800030081039103C031D1E
:10058000C72A2C0884003208003C8000CB2A2C08A3
:100590008400320880002D08840030080139800072
:1005A0002E0884000310300C013980002F088400CD
:1005B000300CF700F70C3F30F70577080139800061
:1005C0008A11A52B84011F30830583161F129F12E9
:1005D0001B0880399B0007309C001C0883120D13F8
:1005E000603083168F008312A101A201A301A40130
:1005F00083161F129F121B0880399B0083121F1045
:100600009412831606118614061200308312940089
:10061000831694000108C7390838810083129001BD
:100620000030F800920000308316920007309C00E2
:1006300005080330F700F70B1B2B1C0883120D1362
:1006400083169D0183126F280230AB00FA30B4008C
:100650003320AB0B262BF030AB00A9200130B400C7
:10066000B50008212508AB003730AC004C292030FC
:10067000B30019215830B30019213D30B3001921BE
:10068000103084002208AC002108AB006E2120301D
:10069000B30019215930B30019213D30B30019219D
:1006A000103084002408AC002308AB006E210E300B
:1006B000AB002B080C20AB0AF700B3001921133054
:1006C0002B02031D592B2808AF001830B000ED2174
:1006D0000330AC002030B3001921AC0B6A2B15306D
:1006E000AD002D080C20AD0AF700B3001921193018
:1006F0002D02031D712B2908AF001830B000ED2129
:100700001B30AE002E080C20AE0AF700B3001921F2
:1007100020302E02031D822B2A08AF001830B000B3
:10072000ED211430B4003320EB30AB00A9203A2285
:100730007808A5002630AB002730AC002830AD008B
:100740002930AE002A30AF00A42AFA012608A61BE1
:10075000FA03A1070318A20A7A08A207FA012708D8
:10076000A71BFA03A3070318A40A7A08A4072E2BD1
:02077000630024
:04400E00783FFF3FB9
:00000001FF
;PIC16F88
/programy/C/PIC/mereni/PS2mys/PIC16F88/mys.LST
0,0 → 1,1177
CCS PCM C Compiler, Version 3.221, 27853 19-XII-05 23:22
 
Filename: D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.LST
 
ROM used: 953 words (23%)
Largest free fragment is 2048
RAM used: 19 (11%) at main() level
33 (19%) worst case
Stack: 5 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 2E2
0003: NOP
.................... #include "D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.h"
.................... #include <16F88.h>
.................... //////// Standard Header file for the PIC16F88 device ////////////////
.................... #device PIC16F88
.................... #list
....................
.................... #device adc=8
.................... #fuses NOWDT,INTRC_IO, NOPUT, MCLR, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, FCMEN, IESO
.................... #use delay(clock=4000000)
*
0033: MOVLW 34
0034: MOVWF 04
0035: MOVF 00,W
0036: BTFSC 03.2
0037: GOTO 047
0038: MOVLW 01
0039: MOVWF 78
003A: CLRF 77
003B: DECFSZ 77,F
003C: GOTO 03B
003D: DECFSZ 78,F
003E: GOTO 03A
003F: MOVLW 4A
0040: MOVWF 77
0041: DECFSZ 77,F
0042: GOTO 041
0043: NOP
0044: NOP
0045: DECFSZ 00,F
0046: GOTO 038
0047: RETLW 00
....................
....................
....................
.................... #define LCD_RS PIN_A0 // rizeni registru LCD displeje
.................... #define LCD_E PIN_A1 // enable LCD displeje
.................... #define LCD_DATA_LSB PIN_B0 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
.................... #include "C:\library\CCS\lcd.c"
.................... // LCD modul pro ovladani dvouradkoveho LCD modulu se standardnim Hitachi radicem
.................... // (c)miho 2002,2005
.................... //
.................... // 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
.................... // 0.03 Doplnena procedura lcd_clr pro smazani displeje
.................... //
.................... //
.................... // 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_clr smaze displej
.................... //
.................... // 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
0048: MOVF 06,W
0049: ANDLW F0
004A: MOVWF 3B
004B: MOVF 3A,W
004C: ANDLW 0F
004D: IORWF 3B,W
004E: MOVWF 06
.................... #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
004F: BSF 05.1
0050: BSF 03.5
0051: BCF 05.1
.................... delay_us(1); // pockej alespon 450ns od e nebo alespon 195ns od dat
0052: NOP
.................... output_bit(LCD_E,0); // sestupna hrana (minimalni perioda e je 1us)
0053: BCF 03.5
0054: BCF 05.1
0055: BSF 03.5
0056: BCF 05.1
.................... }
0057: BCF 03.5
0058: RETLW 00
....................
....................
.................... // 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
0059: MOVF 38,F
005A: BTFSS 03.2
005B: GOTO 05E
005C: BCF 05.0
005D: GOTO 05F
005E: BSF 05.0
005F: BSF 03.5
0060: BCF 05.0
.................... swap(n);
0061: BCF 03.5
0062: SWAPF 39,F
.................... lcd_send_nibble(n); // posli horni pulku bajtu
0063: MOVF 39,W
0064: MOVWF 3A
0065: CALL 048
.................... swap(n);
0066: SWAPF 39,F
.................... lcd_send_nibble(n); // posli spodni pulku bajtu
0067: MOVF 39,W
0068: MOVWF 3A
0069: CALL 048
.................... delay_us(40); // minimalni doba na provedeni prikazu
006A: MOVLW 0D
006B: MOVWF 77
006C: DECFSZ 77,F
006D: GOTO 06C
.................... }
006E: RETLW 00
....................
....................
.................... // 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
006F: MOVLW 14
0070: MOVWF 34
0071: CALL 033
....................
.................... #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
0072: MOVLW F0
0073: BSF 03.5
0074: ANDWF 06,F
.................... #endif
....................
.................... output_bit(LCD_RS,0); // nastav jako vystup a nastav klidovy stav
0075: BCF 03.5
0076: BCF 05.0
0077: BSF 03.5
0078: BCF 05.0
.................... output_bit(LCD_E, 0); // nastav jako vystup a nastav klidovy stav
0079: BCF 03.5
007A: BCF 05.1
007B: BSF 03.5
007C: BCF 05.1
....................
.................... for (i=0; i<3; i++) // nastav lcd do rezimu 8 bitu sbernice
007D: BCF 03.5
007E: CLRF 2B
007F: MOVF 2B,W
0080: SUBLW 02
0081: BTFSS 03.0
0082: GOTO 08B
.................... {
.................... delay_ms(2); // muze byt rozdelany prenos dat (2x 4 bity) nebo pomaly povel
0083: MOVLW 02
0084: MOVWF 34
0085: CALL 033
.................... lcd_send_nibble(3); // rezim 8 bitu
0086: MOVLW 03
0087: MOVWF 3A
0088: CALL 048
.................... }
0089: INCF 2B,F
008A: GOTO 07F
....................
.................... delay_us(40); // cas na zpracovani
008B: MOVLW 0D
008C: MOVWF 77
008D: DECFSZ 77,F
008E: GOTO 08D
.................... lcd_send_nibble(2); // nastav rezim 4 bitu (plati od nasledujiciho prenosu)
008F: MOVLW 02
0090: MOVWF 3A
0091: CALL 048
.................... delay_us(40); // cas na zpracovani
0092: MOVLW 0D
0093: MOVWF 77
0094: DECFSZ 77,F
0095: GOTO 094
....................
.................... for (i=0;i<3;i++) // proved inicializaci (nastaveni modu, smazani apod)
0096: CLRF 2B
0097: MOVF 2B,W
0098: SUBLW 02
0099: BTFSS 03.0
009A: GOTO 0A7
.................... {
.................... lcd_send_byte(0,LCD_INIT_STRING[i]);
009B: MOVF 2B,W
009C: CALL 004
009D: MOVWF 2C
009E: CLRF 38
009F: MOVF 2C,W
00A0: MOVWF 39
00A1: CALL 059
.................... delay_ms(2);
00A2: MOVLW 02
00A3: MOVWF 34
00A4: CALL 033
.................... }
00A5: INCF 2B,F
00A6: GOTO 097
.................... }
00A7: BCF 0A.3
00A8: GOTO 324 (RETURN)
....................
....................
.................... // Proved presun kurzoru
.................... //
.................... // Pozice 1.1 je domu
.................... //
.................... void lcd_gotoxy( BYTE x, BYTE y)
.................... {
....................
.................... BYTE Adr;
....................
.................... Adr=x-1;
*
0108: MOVLW 01
0109: SUBWF 34,W
010A: MOVWF 36
.................... if(y==2)
010B: MOVF 35,W
010C: SUBLW 02
010D: BTFSS 03.2
010E: GOTO 111
.................... Adr+=LCD_LINE_2;
010F: MOVLW 40
0110: ADDWF 36,F
....................
.................... lcd_send_byte(0,0x80|Adr);
0111: MOVF 36,W
0112: IORLW 80
0113: MOVWF 37
0114: CLRF 38
0115: MOVF 37,W
0116: MOVWF 39
0117: CALL 059
.................... }
0118: RETLW 00
....................
....................
.................... // Zapis znaku na displej, zpracovani ridicich znaku
.................... //
.................... void lcd_putc( char c)
.................... {
....................
.................... switch (c)
.................... {
0119: MOVF 33,W
011A: XORLW 0C
011B: BTFSC 03.2
011C: GOTO 127
011D: XORLW 06
011E: BTFSC 03.2
011F: GOTO 12F
0120: XORLW 07
0121: BTFSC 03.2
0122: GOTO 135
0123: XORLW 05
0124: BTFSC 03.2
0125: GOTO 13A
0126: GOTO 13F
.................... case '\f' : lcd_send_byte(0,1); // smaz displej
0127: CLRF 38
0128: MOVLW 01
0129: MOVWF 39
012A: CALL 059
.................... delay_ms(2);
012B: MOVLW 02
012C: MOVWF 34
012D: CALL 033
.................... break;
012E: GOTO 14B
.................... case '\n' : lcd_gotoxy(1,2); break; // presun se na 1. znak 2. radky
012F: MOVLW 01
0130: MOVWF 34
0131: MOVLW 02
0132: MOVWF 35
0133: CALL 108
0134: GOTO 14B
.................... case '\r' : lcd_gotoxy(1,1); break; // presun home
0135: MOVLW 01
0136: MOVWF 34
0137: MOVWF 35
0138: CALL 108
0139: GOTO 14B
.................... case '\b' : lcd_send_byte(0,0x10); break; // posun kurzor o 1 zpet
013A: CLRF 38
013B: MOVLW 10
013C: MOVWF 39
013D: CALL 059
013E: GOTO 14B
.................... default : if (c<0x20) c&=0x7; // preklopeni definovatelnych znaku na rozsah 0 az 0x1F
013F: MOVF 33,W
0140: SUBLW 1F
0141: BTFSS 03.0
0142: GOTO 145
0143: MOVLW 07
0144: ANDWF 33,F
.................... lcd_send_byte(1,c); break; // zapis znak
0145: MOVLW 01
0146: MOVWF 38
0147: MOVF 33,W
0148: MOVWF 39
0149: CALL 059
014A: GOTO 14B
.................... }
.................... }
014B: RETLW 00
....................
....................
.................... // 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_);
.................... }
....................
....................
.................... // Smaz displej
.................... //
.................... void lcd_clr()
.................... {
.................... lcd_putc('\f');
.................... }
....................
....................
.................... // 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);
.................... //}
....................
....................
.................... #define TRIGGER_PIN PIN_B4
....................
.................... #DEFINE DATA PIN_B5 // musi byt definovan kanal DATA
.................... #DEFINE CLK PIN_B6 // a taky hodiny CLK
.................... #include "C:\library\kaklik\CCS\ps2.c"
.................... ////////////////////////////////////////////////////////////////////////////////
.................... // Modul pro komunikaci s PS/2 mysi
.................... //
.................... // #DEFINE DATA PIN_B0 // musi byt definovan kanal DATA
.................... // #DEFINE CLK PIN_B1 // a taky hodiny CLK
.................... //
.................... ////////////////////////////////////////////////////////////////////////////////
....................
.................... #define PRVNI 1000 // nastaveni prodlevy pred zacatkem vysilani bajtu
.................... #define DRUHY 2
.................... #define TRETI DRUHY
....................
.................... // prikazy
.................... #define RESET 0xFF
.................... #define ENABLE_DATA_REPORTING 0xF4
.................... #define READ_DATA 0xEB
.................... #define STATUS_REQUEST 0xE9
.................... #define SET_REMOTE_MODE 0xF0
.................... #define SET_STREAM_MODE 0xEA
.................... #define GET_DEVICE_ID 0xF2
....................
....................
.................... void send(byte command)
.................... {
.................... unsigned int8 n;
.................... unsigned int8 parity=0;
*
00A9: CLRF 2D
....................
.................... //Request-to-send
.................... output_float(DATA);
00AA: BSF 03.5
00AB: BSF 06.5
.................... output_low(CLK);
00AC: BCF 06.6
00AD: BCF 03.5
00AE: BCF 06.6
.................... delay_us(100);
00AF: MOVLW 21
00B0: MOVWF 77
00B1: DECFSZ 77,F
00B2: GOTO 0B1
.................... // start bit
.................... output_low(DATA);
00B3: BSF 03.5
00B4: BCF 06.5
00B5: BCF 03.5
00B6: BCF 06.5
.................... while(input(CLK)); // ceka se na hodiny od mysi (mys zataha za hodiny)
00B7: BSF 03.5
00B8: BSF 06.6
00B9: BCF 03.5
00BA: BTFSC 06.6
00BB: GOTO 0B7
.................... // 8 bitu
.................... for(n=0; n<8; n++)
00BC: CLRF 2C
00BD: MOVF 2C,W
00BE: SUBLW 07
00BF: BTFSS 03.0
00C0: GOTO 0DA
.................... {
.................... while(input(CLK));
00C1: BSF 03.5
00C2: BSF 06.6
00C3: BCF 03.5
00C4: BTFSC 06.6
00C5: GOTO 0C1
.................... output_bit(DATA, command & 1);
00C6: BTFSC 2B.0
00C7: GOTO 0CA
00C8: BCF 06.5
00C9: GOTO 0CB
00CA: BSF 06.5
00CB: BSF 03.5
00CC: BCF 06.5
.................... parity += command & 1;
00CD: BCF 03.5
00CE: MOVF 2B,W
00CF: ANDLW 01
00D0: ADDWF 2D,F
.................... command >>= 1;
00D1: BCF 03.0
00D2: RRF 2B,F
.................... while(!input(CLK));
00D3: BSF 03.5
00D4: BSF 06.6
00D5: BCF 03.5
00D6: BTFSS 06.6
00D7: GOTO 0D3
.................... };
00D8: INCF 2C,F
00D9: GOTO 0BD
.................... // parita
.................... while(input(CLK));
00DA: BSF 03.5
00DB: BSF 06.6
00DC: BCF 03.5
00DD: BTFSC 06.6
00DE: GOTO 0DA
.................... output_bit(DATA, ~parity & 1);
00DF: MOVF 2D,W
00E0: XORLW FF
00E1: ANDLW 01
00E2: XORLW 00
00E3: BTFSS 03.2
00E4: GOTO 0E7
00E5: BCF 06.5
00E6: GOTO 0E8
00E7: BSF 06.5
00E8: BSF 03.5
00E9: BCF 06.5
.................... while(!input(CLK));
00EA: BSF 06.6
00EB: BCF 03.5
00EC: BTFSC 06.6
00ED: GOTO 0F0
00EE: BSF 03.5
00EF: GOTO 0EA
....................
.................... // stop bit
.................... output_float(DATA);
00F0: BSF 03.5
00F1: BSF 06.5
.................... while(input(DATA)); // mys musi sama jeste jednou zatahat za hodiny a data
00F2: BSF 06.5
00F3: BCF 03.5
00F4: BTFSS 06.5
00F5: GOTO 0F8
00F6: BSF 03.5
00F7: GOTO 0F2
.................... while(input(CLK));
00F8: BSF 03.5
00F9: BSF 06.6
00FA: BCF 03.5
00FB: BTFSC 06.6
00FC: GOTO 0F8
....................
.................... // ceka se az nastane klidovy stav
.................... while(!input(CLK) || !input(DATA));
00FD: BSF 03.5
00FE: BSF 06.6
00FF: BCF 03.5
0100: BTFSS 06.6
0101: GOTO 0FD
0102: BSF 03.5
0103: BSF 06.5
0104: BCF 03.5
0105: BTFSS 06.5
0106: GOTO 0FD
.................... }
0107: RETLW 00
....................
....................
.................... int8 read_byte() // dodelat paritu
.................... {
.................... unsigned int8 bajt;
.................... unsigned int8 i;
.................... int1 parity=0;
*
023A: BCF 35.0
....................
.................... // cekani na startbit
.................... while(input(CLK) || input(DATA)); // oba signaly musi byt v 0
023B: BSF 03.5
023C: BSF 06.6
023D: BCF 03.5
023E: BTFSC 06.6
023F: GOTO 23B
0240: BSF 03.5
0241: BSF 06.5
0242: BCF 03.5
0243: BTFSC 06.5
0244: GOTO 23B
.................... while(!input(CLK)); // ceka se na nabeznou hranu hodin
0245: BSF 03.5
0246: BSF 06.6
0247: BCF 03.5
0248: BTFSS 06.6
0249: GOTO 245
....................
.................... bajt = 0;
024A: CLRF 33
.................... for(i=0; i<8; i++)
024B: CLRF 34
024C: MOVF 34,W
024D: SUBLW 07
024E: BTFSS 03.0
024F: GOTO 27C
.................... {
.................... while(input(CLK)); // ceka na nulu hodin
0250: BSF 03.5
0251: BSF 06.6
0252: BCF 03.5
0253: BTFSC 06.6
0254: GOTO 250
....................
.................... bajt >>= 1;
0255: BCF 03.0
0256: RRF 33,F
.................... bajt |= input(DATA) << 7; // zapise se stav do promene
0257: BSF 03.5
0258: BSF 06.5
0259: MOVLW 00
025A: BCF 03.5
025B: BTFSC 06.5
025C: MOVLW 01
025D: MOVWF 77
025E: RRF 77,W
025F: CLRF 77
0260: BTFSC 03.0
0261: BSF 77.7
0262: MOVF 77,W
0263: IORWF 33,F
.................... parity^=input(DATA);
0264: MOVLW 00
0265: BTFSC 35.0
0266: MOVLW 01
0267: MOVWF 36
0268: BSF 03.5
0269: BSF 06.5
026A: MOVLW 00
026B: BCF 03.5
026C: BTFSC 06.5
026D: MOVLW 01
026E: XORWF 36,W
026F: MOVWF 78
0270: BTFSC 78.0
0271: GOTO 274
0272: BCF 35.0
0273: GOTO 275
0274: BSF 35.0
....................
.................... while(!input(CLK)); // ceka na jednicku hodin
0275: BSF 03.5
0276: BSF 06.6
0277: BCF 03.5
0278: BTFSS 06.6
0279: GOTO 275
.................... };
027A: INCF 34,F
027B: GOTO 24C
.................... while(input(CLK));
027C: BSF 03.5
027D: BSF 06.6
027E: BCF 03.5
027F: BTFSC 06.6
0280: GOTO 27C
.................... parity^=input(DATA);
0281: MOVLW 00
0282: BTFSC 35.0
0283: MOVLW 01
0284: MOVWF 36
0285: BSF 03.5
0286: BSF 06.5
0287: MOVLW 00
0288: BCF 03.5
0289: BTFSC 06.5
028A: MOVLW 01
028B: XORWF 36,W
028C: MOVWF 78
028D: BTFSC 78.0
028E: GOTO 291
028F: BCF 35.0
0290: GOTO 292
0291: BSF 35.0
.................... // if (parity)
.................... while(!input(CLK)); // ceka na jednicku hodin
0292: BSF 03.5
0293: BSF 06.6
0294: BCF 03.5
0295: BTFSS 06.6
0296: GOTO 292
.................... while(input(CLK));
0297: BSF 03.5
0298: BSF 06.6
0299: BCF 03.5
029A: BTFSC 06.6
029B: GOTO 297
.................... while(!input(CLK)); // ceka na jednicku hodin
029C: BSF 03.5
029D: BSF 06.6
029E: BCF 03.5
029F: BTFSS 06.6
02A0: GOTO 29C
.................... return (bajt);
02A1: MOVF 33,W
02A2: MOVWF 78
.................... }
02A3: RETLW 00
....................
....................
.................... void read_standard_byte(signed int8 *x,*y,unsigned int8 *tl1,*tl2,*tl3)
.................... {
.................... unsigned int8 st,nd,rd;
....................
.................... st = read_byte();
02A4: CALL 23A
02A5: MOVF 78,W
02A6: MOVWF 30
.................... nd = read_byte();
02A7: CALL 23A
02A8: MOVF 78,W
02A9: MOVWF 31
.................... rd = read_byte();
02AA: CALL 23A
02AB: MOVF 78,W
02AC: MOVWF 32
....................
.................... if ((st & 0b1000) == 0b1000) *x=-nd; else *x=nd;
02AD: MOVF 30,W
02AE: ANDLW 08
02AF: SUBLW 08
02B0: BTFSS 03.2
02B1: GOTO 2B8
02B2: MOVF 2B,W
02B3: MOVWF 04
02B4: MOVF 31,W
02B5: SUBLW 00
02B6: MOVWF 00
02B7: GOTO 2BC
02B8: MOVF 2B,W
02B9: MOVWF 04
02BA: MOVF 31,W
02BB: MOVWF 00
.................... if ((st & 0b10000) == 0b10000) *y=-rd; else *y=rd;
02BC: MOVF 30,W
02BD: ANDLW 10
02BE: SUBLW 10
02BF: BTFSS 03.2
02C0: GOTO 2C7
02C1: MOVF 2C,W
02C2: MOVWF 04
02C3: MOVF 32,W
02C4: SUBLW 00
02C5: MOVWF 00
02C6: GOTO 2CB
02C7: MOVF 2C,W
02C8: MOVWF 04
02C9: MOVF 32,W
02CA: MOVWF 00
....................
.................... *tl1=st & 1;
02CB: MOVF 2D,W
02CC: MOVWF 04
02CD: MOVF 30,W
02CE: ANDLW 01
02CF: MOVWF 00
.................... *tl2=(st >> 1) & 1;
02D0: MOVF 2E,W
02D1: MOVWF 04
02D2: BCF 03.0
02D3: RRF 30,W
02D4: ANDLW 01
02D5: MOVWF 00
.................... *tl3=(st >> 2) & 1;
02D6: MOVF 2F,W
02D7: MOVWF 04
02D8: RRF 30,W
02D9: MOVWF 77
02DA: RRF 77,F
02DB: MOVLW 3F
02DC: ANDWF 77,F
02DD: MOVF 77,W
02DE: ANDLW 01
02DF: MOVWF 00
.................... }
02E0: BCF 0A.3
02E1: GOTO 3A5 (RETURN)
.................... void ps2break()
.................... {
.................... output_low(CLK);
.................... }
.................... void ps2enable()
.................... {
.................... output_float(CLK);
.................... }
....................
....................
....................
....................
.................... void trigger()
.................... {
.................... output_high(TRIGGER_PIN);
.................... delay_us(50);
.................... output_low(TRIGGER_PIN);
.................... }
....................
.................... void main()
.................... {
02E2: CLRF 04
02E3: MOVLW 1F
02E4: ANDWF 03,F
02E5: BSF 03.5
02E6: BCF 1F.4
02E7: BCF 1F.5
02E8: MOVF 1B,W
02E9: ANDLW 80
02EA: MOVWF 1B
02EB: MOVLW 07
02EC: MOVWF 1C
02ED: MOVF 1C,W
02EE: BCF 03.5
02EF: BCF 0D.6
02F0: MOVLW 60
02F1: BSF 03.5
02F2: MOVWF 0F
.................... signed int16 x=0,y=0;
02F3: BCF 03.5
02F4: CLRF 21
02F5: CLRF 22
02F6: CLRF 23
02F7: CLRF 24
.................... signed int8 hodnota,dx,dy;
.................... unsigned int8 tl1,tl2,tl3;
....................
.................... setup_adc_ports(NO_ANALOGS|VSS_VDD);
02F8: BSF 03.5
02F9: BCF 1F.4
02FA: BCF 1F.5
02FB: MOVF 1B,W
02FC: ANDLW 80
02FD: MOVWF 1B
.................... setup_adc(ADC_OFF);
02FE: BCF 03.5
02FF: BCF 1F.0
.................... setup_spi(FALSE);
0300: BCF 14.5
0301: BSF 03.5
0302: BCF 06.2
0303: BSF 06.1
0304: BCF 06.4
0305: MOVLW 00
0306: BCF 03.5
0307: MOVWF 14
0308: BSF 03.5
0309: MOVWF 14
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
030A: MOVF 01,W
030B: ANDLW C7
030C: IORLW 08
030D: MOVWF 01
.................... setup_timer_1(T1_DISABLED);
030E: BCF 03.5
030F: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
0310: MOVLW 00
0311: MOVWF 78
0312: MOVWF 12
0313: MOVLW 00
0314: BSF 03.5
0315: MOVWF 12
.................... setup_comparator(NC_NC_NC_NC);
0316: MOVLW 07
0317: MOVWF 1C
0318: MOVF 05,W
0319: MOVLW 03
031A: MOVWF 77
031B: DECFSZ 77,F
031C: GOTO 31B
031D: MOVF 1C,W
031E: BCF 03.5
031F: BCF 0D.6
.................... setup_vref(FALSE);
0320: BSF 03.5
0321: CLRF 1D
....................
.................... lcd_init();
0322: BCF 03.5
0323: GOTO 06F
.................... Delay_ms(500);
0324: MOVLW 02
0325: MOVWF 2B
0326: MOVLW FA
0327: MOVWF 34
0328: CALL 033
0329: DECFSZ 2B,F
032A: GOTO 326
....................
.................... send(SET_REMOTE_MODE);
032B: MOVLW F0
032C: MOVWF 2B
032D: CALL 0A9
....................
.................... while (true)
.................... {
.................... LCD_gotoxy(1,1);
032E: MOVLW 01
032F: MOVWF 34
0330: MOVWF 35
0331: CALL 108
.................... printf(lcd_putc,"%X X=%ld Y=%ld TL1=%U TL2=%U TL3=%U",hodnota, x,y,tl1,tl2,tl3);
0332: MOVF 25,W
0333: MOVWF 2B
0334: MOVLW 37
0335: MOVWF 2C
0336: GOTO 14C
0337: MOVLW 20
0338: MOVWF 33
0339: CALL 119
033A: MOVLW 58
033B: MOVWF 33
033C: CALL 119
033D: MOVLW 3D
033E: MOVWF 33
033F: CALL 119
0340: MOVLW 10
0341: MOVWF 04
0342: MOVF 22,W
0343: MOVWF 2C
0344: MOVF 21,W
0345: MOVWF 2B
0346: CALL 16E
0347: MOVLW 20
0348: MOVWF 33
0349: CALL 119
034A: MOVLW 59
034B: MOVWF 33
034C: CALL 119
034D: MOVLW 3D
034E: MOVWF 33
034F: CALL 119
0350: MOVLW 10
0351: MOVWF 04
0352: MOVF 24,W
0353: MOVWF 2C
0354: MOVF 23,W
0355: MOVWF 2B
0356: CALL 16E
0357: MOVLW 0E
0358: MOVWF 2B
0359: MOVF 2B,W
035A: CALL 00C
035B: INCF 2B,F
035C: MOVWF 77
035D: MOVWF 33
035E: CALL 119
035F: MOVLW 13
0360: SUBWF 2B,W
0361: BTFSS 03.2
0362: GOTO 359
0363: MOVF 28,W
0364: MOVWF 2F
0365: MOVLW 18
0366: MOVWF 30
0367: CALL 1ED
0368: MOVLW 03
0369: MOVWF 2C
036A: MOVLW 20
036B: MOVWF 33
036C: CALL 119
036D: DECFSZ 2C,F
036E: GOTO 36A
036F: MOVLW 15
0370: MOVWF 2D
0371: MOVF 2D,W
0372: CALL 00C
0373: INCF 2D,F
0374: MOVWF 77
0375: MOVWF 33
0376: CALL 119
0377: MOVLW 19
0378: SUBWF 2D,W
0379: BTFSS 03.2
037A: GOTO 371
037B: MOVF 29,W
037C: MOVWF 2F
037D: MOVLW 18
037E: MOVWF 30
037F: CALL 1ED
0380: MOVLW 1B
0381: MOVWF 2E
0382: MOVF 2E,W
0383: CALL 00C
0384: INCF 2E,F
0385: MOVWF 77
0386: MOVWF 33
0387: CALL 119
0388: MOVLW 20
0389: SUBWF 2E,W
038A: BTFSS 03.2
038B: GOTO 382
038C: MOVF 2A,W
038D: MOVWF 2F
038E: MOVLW 18
038F: MOVWF 30
0390: CALL 1ED
.................... delay_ms(20);
0391: MOVLW 14
0392: MOVWF 34
0393: CALL 033
.................... send(READ_DATA);
0394: MOVLW EB
0395: MOVWF 2B
0396: CALL 0A9
.................... hodnota=read_byte();
0397: CALL 23A
0398: MOVF 78,W
0399: MOVWF 25
.................... read_standard_byte(&dx,&dy,&tl1,&tl2,&tl3);
039A: MOVLW 26
039B: MOVWF 2B
039C: MOVLW 27
039D: MOVWF 2C
039E: MOVLW 28
039F: MOVWF 2D
03A0: MOVLW 29
03A1: MOVWF 2E
03A2: MOVLW 2A
03A3: MOVWF 2F
03A4: GOTO 2A4
.................... x+=dx;
03A5: CLRF 7A
03A6: MOVF 26,W
03A7: BTFSC 26.7
03A8: DECF 7A,F
03A9: ADDWF 21,F
03AA: BTFSC 03.0
03AB: INCF 22,F
03AC: MOVF 7A,W
03AD: ADDWF 22,F
.................... y+=dy;
03AE: CLRF 7A
03AF: MOVF 27,W
03B0: BTFSC 27.7
03B1: DECF 7A,F
03B2: ADDWF 23,F
03B3: BTFSC 03.0
03B4: INCF 24,F
03B5: MOVF 7A,W
03B6: ADDWF 24,F
.................... }
03B7: GOTO 32E
.................... }
....................
03B8: SLEEP
 
Configuration Fuses:
Word 1: 3F78 NOWDT NOPUT MCLR BROWNOUT NOLVP NOCPD NOWRT NODEBUG CCPB0 NOPROTECT INTRC_IO
Word 2: 3FFF FCMEN IESO
/programy/C/PIC/mereni/PS2mys/PIC16F88/mys.PJT
0,0 → 1,39
[PROJECT]
Target=mys.HEX
Development_Mode=
Processor=0x688F
ToolSuite=CCS
 
[Directories]
Include=C:\Program Files\PICC\devices\;C:\Program Files\PICC\dr
Library=
LinkerScript=
 
[Target Data]
FileList=mys.c;
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[mys.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=mys.c
 
[Windows]
0=0000 mys.c 0 0 796 451 3 0
 
[Opened Files]
1=D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.c
2=C:\library\CCS\lcd.c
3=D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.h
4=C:\Program Files\PICC\devices\16F88.h
5=C:\library\kaklik\CCS\ps2.c
6=
/programy/C/PIC/mereni/PS2mys/PIC16F88/mys.SYM
0,0 → 1,109
015-016 CCP_1
015 CCP_1_LOW
016 CCP_1_HIGH
021-022 main.x
023-024 main.y
025 main.hodnota
026 main.dx
027 main.dy
028 main.tl1
029 main.tl2
02A main.tl3
02B lcd_init.i
02B send.command
02B-02C @PRINTF_LD_278.P1
02B @PRINTF_X_278.P2
02B read_standard_byte.x
02B main.@SCRATCH
02C send.n
02C @PRINTF_X_278.P1
02C read_standard_byte.y
02C lcd_init.@SCRATCH
02C main.@SCRATCH
02D send.parity
02D read_standard_byte.tl1
02D main.@SCRATCH
02D @PRINTF_LD_278.@SCRATCH
02E read_standard_byte.tl2
02E send.@SCRATCH
02E main.@SCRATCH
02E @PRINTF_LD_278.@SCRATCH
02F @PRINTF_U_278.P1
02F read_standard_byte.tl3
02F @PRINTF_LD_278.@SCRATCH
030 read_standard_byte.st
030 @PRINTF_U_278.P1
030 @PRINTF_LD_278.@SCRATCH
031 @DIV88.P1
031 read_standard_byte.nd
031 @PRINTF_LD_278.@SCRATCH
032 @DIV88.P1
032 read_standard_byte.rd
032 @PRINTF_LD_278.@SCRATCH
033 lcd_putc.c
033 read_byte.bajt
033 read_standard_byte.@SCRATCH
033 @DIV88.@SCRATCH
034 read_byte.i
034 lcd_gotoxy.x
034 @delay_ms1.P1
034 read_standard_byte.@SCRATCH
035 lcd_gotoxy.y
035.0 read_byte.parity
036 lcd_gotoxy.Adr
036 read_byte.@SCRATCH
037 lcd_gotoxy.@SCRATCH
038 lcd_send_byte.Adr
039 lcd_send_byte.n
03A lcd_send_nibble.n
03B lcd_send_nibble.@SCRATCH
03C lcd_send_nibble.@SCRATCH
077 @SCRATCH
078 @SCRATCH
078 _RETURN_
079 @SCRATCH
07A @SCRATCH
07B @SCRATCH
09C.6 C1OUT
09C.7 C2OUT
 
0033 @delay_ms1
0004 @const27
0048 lcd_send_nibble
0059 lcd_send_byte
006F lcd_init
0108 lcd_gotoxy
0119 lcd_putc
00A9 send
023A read_byte
02A4 read_standard_byte
02E2 main
000C @const10225
014C @PRINTF_X_278
016E @PRINTF_LD_278
01D8 @DIV88
01ED @PRINTF_U_278
02E2 @cinit
 
Project Files:
D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.c
D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.h
C:\Program Files\PICC\devices\16F88.h
C:\library\CCS\lcd.c
C:\library\kaklik\CCS\ps2.c
 
Compiler Settings:
Processor: PIC16F88
Pointer Size: 8
ADC Range: 0-255
Opt Level: 9
Short,Int,Long: 1,8,16
 
Output Files:
Errors: D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.err
INHX8: D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.HEX
Symbols: D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.SYM
List: D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.LST
Debug/COFF: D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.cof
Call Tree: D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.tre
Statistics: D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.sta
/programy/C/PIC/mereni/PS2mys/PIC16F88/mys.c
0,0 → 1,58
#include "D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.h"
 
#define LCD_RS PIN_A0 // rizeni registru LCD displeje
#define LCD_E PIN_A1 // enable LCD displeje
#define LCD_DATA_LSB PIN_B0 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
#include "C:\library\CCS\lcd.c" // modul pro ovladani LCD
 
#define TRIGGER_PIN PIN_B4
 
#DEFINE DATA PIN_B5 // drat DATA
#DEFINE CLK PIN_B6 // hodiny CLK
#include "C:\library\kaklik\CCS\ps2.c" // modul pro SW ovladani PS2
 
 
 
void trigger()
{
output_high(TRIGGER_PIN);
delay_us(50);
output_low(TRIGGER_PIN);
}
 
void main()
{
signed int16 x=0,y=0;
signed int8 hodnota,dx,dy;
unsigned int8 tl1,tl2,tl3;
 
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
 
lcd_init();
Delay_ms(200);
ps2send(RESET); // resetuje mys
read_byte(); // prijme 0xFA
read_byte(); // 0xAA self-test passed
read_byte(); // mouse ID
Delay_ms(200);
ps2send(SET_REMOTE_MODE);
 
while (true)
{
LCD_gotoxy(1,1);
printf(lcd_putc,"%X X=%ld Y=%ld TL1=%U TL2=%U TL3=%U",hodnota, x,y,tl1,tl2,tl3);
delay_ms(20);
send(READ_DATA);
hodnota=read_byte();
read_standard_byte(&dx,&dy,&tl1,&tl2,&tl3);
x+=dx;
y+=dy;
}
}
/programy/C/PIC/mereni/PS2mys/PIC16F88/mys.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/PS2mys/PIC16F88/mys.err
0,0 → 1,0
No Errors
/programy/C/PIC/mereni/PS2mys/PIC16F88/mys.h
0,0 → 1,5
#include <16F88.h>
#device adc=8
#fuses NOWDT,INTRC_IO, NOPUT, MCLR, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, FCMEN, IESO
#use delay(clock=4000000)
 
/programy/C/PIC/mereni/PS2mys/PIC16F88/mys.sta
0,0 → 1,45
 
ROM used: 953 (23%)
953 (23%) including unused fragments
 
1 Average locations per line
7 Average locations per statement
 
RAM used: 19 (11%) at main() level
33 (19%) worst case
 
Lines Stmts % Files
----- ----- --- -----
55 24 17 D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.c
6 0 0 D:\KAKLIK\programy\PIC_C\mereni\PS2mys\PIC16F88\mys.h
275 0 0 C:\Program Files\PICC\devices\16F88.h
312 47 29 C:\library\CCS\lcd.c
113 67 32 C:\library\kaklik\CCS\ps2.c
----- -----
1522 276 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 21 2 1 @delay_ms1
0 8 1 0 @const27
0 17 2 3 lcd_send_nibble
0 22 2 2 lcd_send_byte
0 58 6 2 lcd_init
0 17 2 4 lcd_gotoxy
0 51 5 1 lcd_putc
0 95 10 4 send
0 106 11 4 read_byte
0 62 7 10 read_standard_byte
0 215 23 14 main
0 39 4 0 @const10225
0 34 4 2 @PRINTF_X_278
0 106 11 8 @PRINTF_LD_278
0 21 2 3 @DIV88
0 77 8 2 @PRINTF_U_278
 
Segment Used Free
--------- ---- ----
00000-00003 4 0
00004-007FF 949 1095
00800-00FFF 0 2048
 
/programy/C/PIC/mereni/PS2mys/PIC16F88/mys.tre
0,0 → 1,668
ÀÄmys
ÀÄmain 0/215 Ram=14
ÃÄ??0??
ÃÄlcd_init 0/58 Ram=2
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@const27 0/8 Ram=0
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄ@delay_ms1 0/21 Ram=1
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄsend 0/95 Ram=4
ÃÄlcd_gotoxy 0/17 Ram=4
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@PRINTF_X_278 0/34 Ram=2
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@PRINTF_LD_278 0/106 Ram=8
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@PRINTF_LD_278 0/106 Ram=8
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@const10225 0/39 Ram=0
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@PRINTF_U_278 0/77 Ram=2
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@const10225 0/39 Ram=0
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@PRINTF_U_278 0/77 Ram=2
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@const10225 0/39 Ram=0
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@PRINTF_U_278 0/77 Ram=2
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄsend 0/95 Ram=4
ÃÄread_byte 0/106 Ram=4
ÀÄread_standard_byte 0/62 Ram=10
ÃÄread_byte 0/106 Ram=4
ÃÄread_byte 0/106 Ram=4
ÀÄread_byte 0/106 Ram=4
/programy/C/PIC/mereni/geiger/bez_GPS/geiger.BAK
0,0 → 1,19
#include <16F88.h>
#device adc=8
 
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOIESO //Internal External Switch Over mode enabled
 
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B3,rcv=PIN_B5,bits=8)
 
/programy/C/PIC/mereni/geiger/bez_GPS/geiger.PJT
0,0 → 1,40
[PROJECT]
Target=geiger.HEX
Development_Mode=2
Processor=0x688F
ToolSuite=CCS
 
[Directories]
Include=
Library=
LinkerScript=
 
[Target Data]
FileList=D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[geiger.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c
 
[Windows]
0=0000 D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c 0 0 796 451 3 0
 
[Opened Files]
1=D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c
2=D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.h
3=C:\Program Files\PICC\devices\16F88.h
4=
[Units]
Count=1
1=D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c (main)
/programy/C/PIC/mereni/geiger/bez_GPS/geiger.c
0,0 → 1,27
#include "D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.h"
 
 
void main()
{
unsigned int16 n;
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(A0_A2_A1_A2_OUT_ON_A3_A4);
setup_vref(VREF_LOW|1|VREF_A2);
setup_oscillator(False);
n=0;
set_timer0(0);
While(true)
{
printf("%Lu0, %u\n\r", n++, get_timer0());
set_timer0(0);
Delay_ms(10000);
}
}
/programy/C/PIC/mereni/geiger/bez_GPS/geiger.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/geiger/bez_GPS/geiger.err
0,0 → 1,2
No Errors
0 Errors, 0 Warnings.
/programy/C/PIC/mereni/geiger/bez_GPS/geiger.h
0,0 → 1,19
#include <16F88.h>
#device adc=8
 
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOIESO //Internal External Switch Over mode disabled
 
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B3,rcv=PIN_B5,bits=8)
 
/programy/C/PIC/mereni/geiger/bez_GPS/geiger.hex
0,0 → 1,47
:1000000000308A00E12800008316861183128611D1
:100010000830F800000000000000F8171E28F81350
:10002000AE0C03188615031C861178171E2878134A
:10003000F80B10280000000000008615A73084008F
:10004000840B202800000000F81B0F28781B1728BD
:1000500000340408AD00270EF038A900A907E23EDD
:10006000AA00323EAC0027080F39AA07AA07AC073E
:10007000E93EAB00AB07AB07260E0F39AB07AC0769
:10008000AB0DAC0DAC09AC0D26080F39AC07A90DB2
:100090000730A8000A30AC07AB03031C4B28AB07A2
:1000A000AA03031C4F28AA07A903031C5328A90766
:1000B000A803031C57282830840007302D052D1372
:1000C00084072C30040203192D170008F700031DC4
:1000D00071282D1B71282D1A7D28AD19712820300B
:1000E0007428AD152D123030F707A7010408A600BB
:1000F0007708AE00042026088400840A2D1F61289A
:100100008A113C292908F801280203188A2828089E
:10011000F7009628F7010830AA00A80DF70D290866
:1001200077020318F700F80DAA0B8D280034780821
:100130002608A8006430A90082207708A600780865
:100140003030031DAA28A71CB128A719B128271AE7
:100150002030AD28A71127122714F8077808AE0021
:1001600004202608A8000A30A90082207708A600EB
:1001700078083030031DC228A719C628271CC628B6
:10018000271A2030F8077808AE0004203030A60780
:100190002608AE0004208A114A2924308400000871
:1001A0000319DF280630F800F701F70BD528F80B04
:1001B000D4287B30F700F70BDB28800BD2288A117C
:1001C000562984011F3083058316861183128615F4
:1001D00083161F129F121B0880399B0007309C005A
:1001E0001F129F121B0880399B0083121F1094124C
:1001F00083160611861406120030831294008316AB
:1002000094000108C739383881008312900100300A
:10021000F8009200003083169200061483129701B2
:100220009701063083169C0005080738E7398500DA
:100230001030F700F70B1A2900001C0883120D1369
:10024000E13083169D0005158F010F088312A2016E
:10025000A10181012208FA002108A10A0319A20ABA
:10026000A3007A08A4000108A50010308400240827
:10027000A7002308A60029283030AE0004202C3027
:10028000AE0004202030AE0004202508A6001B305C
:10029000A70097280A30AE0004200D30AE000420DD
:1002A00081012830A300FA30A400CD28A30B5329E4
:0402B0002A29630094
:04400E002A3FFC3F0A
:00000001FF
;PIC16F88
/programy/C/PIC/mereni/geiger/bez_GPS/geiger.lst
0,0 → 1,250
CCS PCM C Compiler, Version 3.245, 27853 10-VI-06 10:23
 
Filename: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.lst
 
ROM used: 346 words (8%)
Largest free fragment is 2048
RAM used: 10 (6%) at main() level
19 (11%) worst case
Stack: 2 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 0E1
0003: NOP
.................... #include "D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.h"
.................... #include <16F88.h>
.................... //////// Standard Header file for the PIC16F88 device ////////////////
.................... #device PIC16F88
.................... #list
....................
.................... #device adc=8
....................
.................... #FUSES NOWDT //No Watch Dog Timer
.................... #FUSES HS //High speed Osc (> 4mhz)
.................... #FUSES NOPUT //No Power Up Timer
.................... #FUSES MCLR //Master Clear pin enabled
.................... #FUSES NOBROWNOUT //No brownout reset
.................... #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
.................... #FUSES NOCPD //No EE protection
.................... #FUSES NOWRT //Program memory not write protected
.................... #FUSES NODEBUG //No Debug mode for ICD
.................... #FUSES NOPROTECT //Code not protected from reading
.................... #FUSES NOFCMEN //Fail-safe clock monitor disabled
.................... #FUSES NOIESO //Internal External Switch Over mode disabled
....................
.................... #use delay(clock=20000000)
00CD: MOVLW 24
00CE: MOVWF 04
00CF: MOVF 00,W
00D0: BTFSC 03.2
00D1: GOTO 0DF
00D2: MOVLW 06
00D3: MOVWF 78
00D4: CLRF 77
00D5: DECFSZ 77,F
00D6: GOTO 0D5
00D7: DECFSZ 78,F
00D8: GOTO 0D4
00D9: MOVLW 7B
00DA: MOVWF 77
00DB: DECFSZ 77,F
00DC: GOTO 0DB
00DD: DECFSZ 00,F
00DE: GOTO 0D2
00DF: BCF 0A.3
00E0: GOTO 156 (RETURN)
.................... #use rs232(baud=9600,parity=N,xmit=PIN_B3,rcv=PIN_B5,bits=8)
*
0004: BSF 03.5
0005: BCF 06.3
0006: BCF 03.5
0007: BCF 06.3
0008: MOVLW 08
0009: MOVWF 78
000A: NOP
000B: NOP
000C: NOP
000D: BSF 78.7
000E: GOTO 01E
000F: BCF 78.7
0010: RRF 2E,F
0011: BTFSC 03.0
0012: BSF 06.3
0013: BTFSS 03.0
0014: BCF 06.3
0015: BSF 78.6
0016: GOTO 01E
0017: BCF 78.6
0018: DECFSZ 78,F
0019: GOTO 010
001A: NOP
001B: NOP
001C: NOP
001D: BSF 06.3
001E: MOVLW A7
001F: MOVWF 04
0020: DECFSZ 04,F
0021: GOTO 020
0022: NOP
0023: NOP
0024: BTFSC 78.7
0025: GOTO 00F
0026: BTFSC 78.6
0027: GOTO 017
0028: RETLW 00
....................
....................
....................
....................
.................... void main()
.................... {
*
00E1: CLRF 04
00E2: MOVLW 1F
00E3: ANDWF 03,F
00E4: BSF 03.5
00E5: BCF 06.3
00E6: BCF 03.5
00E7: BSF 06.3
00E8: BSF 03.5
00E9: BCF 1F.4
00EA: BCF 1F.5
00EB: MOVF 1B,W
00EC: ANDLW 80
00ED: MOVWF 1B
00EE: MOVLW 07
00EF: MOVWF 1C
.................... unsigned int16 n;
....................
.................... setup_adc_ports(NO_ANALOGS|VSS_VDD);
00F0: BCF 1F.4
00F1: BCF 1F.5
00F2: MOVF 1B,W
00F3: ANDLW 80
00F4: MOVWF 1B
.................... setup_adc(ADC_OFF);
00F5: BCF 03.5
00F6: BCF 1F.0
.................... setup_spi(FALSE);
00F7: BCF 14.5
00F8: BSF 03.5
00F9: BCF 06.2
00FA: BSF 06.1
00FB: BCF 06.4
00FC: MOVLW 00
00FD: BCF 03.5
00FE: MOVWF 14
00FF: BSF 03.5
0100: MOVWF 14
.................... setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
0101: MOVF 01,W
0102: ANDLW C7
0103: IORLW 38
0104: MOVWF 01
.................... setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
0105: BCF 03.5
0106: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
0107: MOVLW 00
0108: MOVWF 78
0109: MOVWF 12
010A: MOVLW 00
010B: BSF 03.5
010C: MOVWF 12
.................... setup_ccp1(CCP_OFF);
010D: BSF 06.0
010E: BCF 03.5
010F: CLRF 17
0110: CLRF 17
.................... setup_comparator(A0_A2_A1_A2_OUT_ON_A3_A4);
0111: MOVLW 06
0112: BSF 03.5
0113: MOVWF 1C
0114: MOVF 05,W
0115: IORLW 07
0116: ANDLW E7
0117: MOVWF 05
0118: MOVLW 10
0119: MOVWF 77
011A: DECFSZ 77,F
011B: GOTO 11A
011C: NOP
011D: MOVF 1C,W
011E: BCF 03.5
011F: BCF 0D.6
.................... setup_vref(VREF_LOW|1|VREF_A2);
0120: MOVLW E1
0121: BSF 03.5
0122: MOVWF 1D
0123: BSF 05.2
.................... setup_oscillator(False);
0124: CLRF 0F
0125: MOVF 0F,W
....................
.................... n=0;
0126: BCF 03.5
0127: CLRF 22
0128: CLRF 21
.................... set_timer0(0);
0129: CLRF 01
.................... While(true)
.................... {
.................... printf("%Lu0, %u\n\r", n++, get_timer0());
012A: MOVF 22,W
012B: MOVWF 7A
012C: MOVF 21,W
012D: INCF 21,F
012E: BTFSC 03.2
012F: INCF 22,F
0130: MOVWF 23
0131: MOVF 7A,W
0132: MOVWF 24
0133: MOVF 01,W
0134: MOVWF 25
0135: MOVLW 10
0136: MOVWF 04
0137: MOVF 24,W
0138: MOVWF 27
0139: MOVF 23,W
013A: MOVWF 26
013B: GOTO 029
013C: MOVLW 30
013D: MOVWF 2E
013E: CALL 004
013F: MOVLW 2C
0140: MOVWF 2E
0141: CALL 004
0142: MOVLW 20
0143: MOVWF 2E
0144: CALL 004
0145: MOVF 25,W
0146: MOVWF 26
0147: MOVLW 1B
0148: MOVWF 27
0149: GOTO 097
014A: MOVLW 0A
014B: MOVWF 2E
014C: CALL 004
014D: MOVLW 0D
014E: MOVWF 2E
014F: CALL 004
.................... set_timer0(0);
0150: CLRF 01
.................... Delay_ms(10000);
0151: MOVLW 28
0152: MOVWF 23
0153: MOVLW FA
0154: MOVWF 24
0155: GOTO 0CD
0156: DECFSZ 23,F
0157: GOTO 153
.................... }
0158: GOTO 12A
.................... }
0159: SLEEP
 
Configuration Fuses:
Word 1: 3F2A HS NOWDT NOPUT MCLR NOBROWNOUT NOLVP NOCPD NOWRT NODEBUG CCPB0 NOPROTECT
Word 2: 3FFC NOFCMEN NOIESO
/programy/C/PIC/mereni/geiger/bez_GPS/geiger.sta
0,0 → 1,33
 
ROM used: 346 (8%)
346 (8%) including unused fragments
 
1 Average locations per line
20 Average locations per statement
 
RAM used: 10 (6%) at main() level
19 (11%) worst case
 
Lines Stmts % Files
----- ----- --- -----
28 17 100 D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c
20 0 0 D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.h
279 0 0 C:\Program Files\PICC\devices\16F88.h
----- -----
654 34 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 20 6 1 @delay_ms1
0 37 11 1 @PUTCHAR_1_
0 121 35 5 main
0 89 26 8 @PRINTF_LU_9600_51_53
0 21 6 3 @DIV88
0 54 16 2 @PRINTF_U_9600_51_53
 
Segment Used Free
--------- ---- ----
00000-00003 4 0
00004-007FF 342 1702
00800-00FFF 0 2048
 
/programy/C/PIC/mereni/geiger/bez_GPS/geiger.sym
0,0 → 1,61
015-016 CCP_1
015 CCP_1_LOW
016 CCP_1_HIGH
021-022 main.n
023 main.@SCRATCH
024 @delay_ms1.P1
024 main.@SCRATCH
025 main.@SCRATCH
026-027 @PRINTF_LU_9600_51_53.P1
026 @PRINTF_U_9600_51_53.P2
027 @PRINTF_U_9600_51_53.P1
028 @DIV88.P1
028 @PRINTF_LU_9600_51_53.@SCRATCH
029 @DIV88.P1
029 @PRINTF_LU_9600_51_53.@SCRATCH
02A @PRINTF_LU_9600_51_53.@SCRATCH
02A @DIV88.@SCRATCH
02B @PRINTF_LU_9600_51_53.@SCRATCH
02C @PRINTF_LU_9600_51_53.@SCRATCH
02D @PRINTF_LU_9600_51_53.@SCRATCH
02E @PUTCHAR_1_.P1
077 @SCRATCH
078 @SCRATCH
078 _RETURN_
079 @SCRATCH
07A @SCRATCH
07B @SCRATCH
09C.6 C1OUT
09C.7 C2OUT
 
00CD @delay_ms1
0004 @PUTCHAR_1_
00E1 main
0029 @PRINTF_LU_9600_51_53
0082 @DIV88
0097 @PRINTF_U_9600_51_53
00E1 @cinit
 
Project Files:
D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c
D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.h
C:\Program Files\PICC\devices\16F88.h
 
Units:
D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c (main)
 
Compiler Settings:
Processor: PIC16F88
Pointer Size: 8
ADC Range: 0-255
Opt Level: 9
Short,Int,Long: 1,8,16
 
Output Files:
Errors: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.err
INHX8: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.hex
Symbols: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.sym
List: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.lst
Debug/COFF: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.cof
Call Tree: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.tre
Statistics: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.sta
/programy/C/PIC/mereni/geiger/bez_GPS/geiger.tre
0,0 → 1,17
ÀÄgeiger
ÀÄmain 0/121 Ram=5
ÃÄ??0??
ÃÄ@PRINTF_LU_9600_51_53 0/89 Ram=8
³ ÀÄ@PUTCHAR_1_ 0/37 Ram=1
ÃÄ@PUTCHAR_1_ 0/37 Ram=1
ÃÄ@PUTCHAR_1_ 0/37 Ram=1
ÃÄ@PUTCHAR_1_ 0/37 Ram=1
ÃÄ@PRINTF_U_9600_51_53 0/54 Ram=2
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/37 Ram=1
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/37 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/37 Ram=1
ÃÄ@PUTCHAR_1_ 0/37 Ram=1
ÃÄ@PUTCHAR_1_ 0/37 Ram=1
ÀÄ@delay_ms1 0/20 Ram=1
/programy/C/PIC/mereni/geiger/geiger.BAK
0,0 → 1,19
#include <16F88.h>
#device adc=8
 
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOIESO //Internal External Switch Over mode enabled
 
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B3,rcv=PIN_B5,bits=8)
 
/programy/C/PIC/mereni/geiger/geiger.PJT
0,0 → 1,40
[PROJECT]
Target=geiger.HEX
Development_Mode=2
Processor=0x688F
ToolSuite=CCS
 
[Directories]
Include=
Library=
LinkerScript=
 
[Target Data]
FileList=D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[geiger.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c
 
[Windows]
0=0000 D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c 0 0 796 451 3 0
 
[Opened Files]
1=D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c
2=D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.h
3=C:\Program Files\PICC\devices\16F88.h
4=
[Units]
Count=1
1=D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c (main)
/programy/C/PIC/mereni/geiger/geiger.c
0,0 → 1,27
#include "D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.h"
 
 
void main()
{
unsigned int16 n;
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(A0_A2_A1_A2_OUT_ON_A3_A4);
setup_vref(VREF_LOW|1|VREF_A2);
setup_oscillator(False);
n=0;
set_timer0(0);
While(true)
{
printf("%Lu0, %u\n\r", n++, get_timer0());
set_timer0(0);
Delay_ms(10000);
}
}
/programy/C/PIC/mereni/geiger/geiger.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/geiger/geiger.err
0,0 → 1,2
No Errors
0 Errors, 0 Warnings.
/programy/C/PIC/mereni/geiger/geiger.h
0,0 → 1,19
#include <16F88.h>
#device adc=8
 
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOIESO //Internal External Switch Over mode disabled
 
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B3,rcv=PIN_B5,bits=8)
 
/programy/C/PIC/mereni/geiger/geiger.hex
0,0 → 1,47
:1000000000308A00E12800008316861183128611D1
:100010000830F800000000000000F8171E28F81350
:10002000AE0C03188615031C861178171E2878134A
:10003000F80B10280000000000008615A73084008F
:10004000840B202800000000F81B0F28781B1728BD
:1000500000340408AD00270EF038A900A907E23EDD
:10006000AA00323EAC0027080F39AA07AA07AC073E
:10007000E93EAB00AB07AB07260E0F39AB07AC0769
:10008000AB0DAC0DAC09AC0D26080F39AC07A90DB2
:100090000730A8000A30AC07AB03031C4B28AB07A2
:1000A000AA03031C4F28AA07A903031C5328A90766
:1000B000A803031C57282830840007302D052D1372
:1000C00084072C30040203192D170008F700031DC4
:1000D00071282D1B71282D1A7D28AD19712820300B
:1000E0007428AD152D123030F707A7010408A600BB
:1000F0007708AE00042026088400840A2D1F61289A
:100100008A113C292908F801280203188A2828089E
:10011000F7009628F7010830AA00A80DF70D290866
:1001200077020318F700F80DAA0B8D280034780821
:100130002608A8006430A90082207708A600780865
:100140003030031DAA28A71CB128A719B128271AE7
:100150002030AD28A71127122714F8077808AE0021
:1001600004202608A8000A30A90082207708A600EB
:1001700078083030031DC228A719C628271CC628B6
:10018000271A2030F8077808AE0004203030A60780
:100190002608AE0004208A114A2924308400000871
:1001A0000319DF280630F800F701F70BD528F80B04
:1001B000D4287B30F700F70BDB28800BD2288A117C
:1001C000562984011F3083058316861183128615F4
:1001D00083161F129F121B0880399B0007309C005A
:1001E0001F129F121B0880399B0083121F1094124C
:1001F00083160611861406120030831294008316AB
:1002000094000108C739383881008312900100300A
:10021000F8009200003083169200061483129701B2
:100220009701063083169C0005080738E7398500DA
:100230001030F700F70B1A2900001C0883120D1369
:10024000E13083169D0005158F010F088312A2016E
:10025000A10181012208FA002108A10A0319A20ABA
:10026000A3007A08A4000108A50010308400240827
:10027000A7002308A60029283030AE0004202C3027
:10028000AE0004202030AE0004202508A6001B305C
:10029000A70097280A30AE0004200D30AE000420DD
:1002A00081012830A300FA30A400CD28A30B5329E4
:0402B0002A29630094
:04400E002A3FFC3F0A
:00000001FF
;PIC16F88
/programy/C/PIC/mereni/geiger/geiger.lst
0,0 → 1,250
CCS PCM C Compiler, Version 3.245, 27853 10-VI-06 10:23
 
Filename: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.lst
 
ROM used: 346 words (8%)
Largest free fragment is 2048
RAM used: 10 (6%) at main() level
19 (11%) worst case
Stack: 2 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 0E1
0003: NOP
.................... #include "D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.h"
.................... #include <16F88.h>
.................... //////// Standard Header file for the PIC16F88 device ////////////////
.................... #device PIC16F88
.................... #list
....................
.................... #device adc=8
....................
.................... #FUSES NOWDT //No Watch Dog Timer
.................... #FUSES HS //High speed Osc (> 4mhz)
.................... #FUSES NOPUT //No Power Up Timer
.................... #FUSES MCLR //Master Clear pin enabled
.................... #FUSES NOBROWNOUT //No brownout reset
.................... #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
.................... #FUSES NOCPD //No EE protection
.................... #FUSES NOWRT //Program memory not write protected
.................... #FUSES NODEBUG //No Debug mode for ICD
.................... #FUSES NOPROTECT //Code not protected from reading
.................... #FUSES NOFCMEN //Fail-safe clock monitor disabled
.................... #FUSES NOIESO //Internal External Switch Over mode disabled
....................
.................... #use delay(clock=20000000)
00CD: MOVLW 24
00CE: MOVWF 04
00CF: MOVF 00,W
00D0: BTFSC 03.2
00D1: GOTO 0DF
00D2: MOVLW 06
00D3: MOVWF 78
00D4: CLRF 77
00D5: DECFSZ 77,F
00D6: GOTO 0D5
00D7: DECFSZ 78,F
00D8: GOTO 0D4
00D9: MOVLW 7B
00DA: MOVWF 77
00DB: DECFSZ 77,F
00DC: GOTO 0DB
00DD: DECFSZ 00,F
00DE: GOTO 0D2
00DF: BCF 0A.3
00E0: GOTO 156 (RETURN)
.................... #use rs232(baud=9600,parity=N,xmit=PIN_B3,rcv=PIN_B5,bits=8)
*
0004: BSF 03.5
0005: BCF 06.3
0006: BCF 03.5
0007: BCF 06.3
0008: MOVLW 08
0009: MOVWF 78
000A: NOP
000B: NOP
000C: NOP
000D: BSF 78.7
000E: GOTO 01E
000F: BCF 78.7
0010: RRF 2E,F
0011: BTFSC 03.0
0012: BSF 06.3
0013: BTFSS 03.0
0014: BCF 06.3
0015: BSF 78.6
0016: GOTO 01E
0017: BCF 78.6
0018: DECFSZ 78,F
0019: GOTO 010
001A: NOP
001B: NOP
001C: NOP
001D: BSF 06.3
001E: MOVLW A7
001F: MOVWF 04
0020: DECFSZ 04,F
0021: GOTO 020
0022: NOP
0023: NOP
0024: BTFSC 78.7
0025: GOTO 00F
0026: BTFSC 78.6
0027: GOTO 017
0028: RETLW 00
....................
....................
....................
....................
.................... void main()
.................... {
*
00E1: CLRF 04
00E2: MOVLW 1F
00E3: ANDWF 03,F
00E4: BSF 03.5
00E5: BCF 06.3
00E6: BCF 03.5
00E7: BSF 06.3
00E8: BSF 03.5
00E9: BCF 1F.4
00EA: BCF 1F.5
00EB: MOVF 1B,W
00EC: ANDLW 80
00ED: MOVWF 1B
00EE: MOVLW 07
00EF: MOVWF 1C
.................... unsigned int16 n;
....................
.................... setup_adc_ports(NO_ANALOGS|VSS_VDD);
00F0: BCF 1F.4
00F1: BCF 1F.5
00F2: MOVF 1B,W
00F3: ANDLW 80
00F4: MOVWF 1B
.................... setup_adc(ADC_OFF);
00F5: BCF 03.5
00F6: BCF 1F.0
.................... setup_spi(FALSE);
00F7: BCF 14.5
00F8: BSF 03.5
00F9: BCF 06.2
00FA: BSF 06.1
00FB: BCF 06.4
00FC: MOVLW 00
00FD: BCF 03.5
00FE: MOVWF 14
00FF: BSF 03.5
0100: MOVWF 14
.................... setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
0101: MOVF 01,W
0102: ANDLW C7
0103: IORLW 38
0104: MOVWF 01
.................... setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
0105: BCF 03.5
0106: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
0107: MOVLW 00
0108: MOVWF 78
0109: MOVWF 12
010A: MOVLW 00
010B: BSF 03.5
010C: MOVWF 12
.................... setup_ccp1(CCP_OFF);
010D: BSF 06.0
010E: BCF 03.5
010F: CLRF 17
0110: CLRF 17
.................... setup_comparator(A0_A2_A1_A2_OUT_ON_A3_A4);
0111: MOVLW 06
0112: BSF 03.5
0113: MOVWF 1C
0114: MOVF 05,W
0115: IORLW 07
0116: ANDLW E7
0117: MOVWF 05
0118: MOVLW 10
0119: MOVWF 77
011A: DECFSZ 77,F
011B: GOTO 11A
011C: NOP
011D: MOVF 1C,W
011E: BCF 03.5
011F: BCF 0D.6
.................... setup_vref(VREF_LOW|1|VREF_A2);
0120: MOVLW E1
0121: BSF 03.5
0122: MOVWF 1D
0123: BSF 05.2
.................... setup_oscillator(False);
0124: CLRF 0F
0125: MOVF 0F,W
....................
.................... n=0;
0126: BCF 03.5
0127: CLRF 22
0128: CLRF 21
.................... set_timer0(0);
0129: CLRF 01
.................... While(true)
.................... {
.................... printf("%Lu0, %u\n\r", n++, get_timer0());
012A: MOVF 22,W
012B: MOVWF 7A
012C: MOVF 21,W
012D: INCF 21,F
012E: BTFSC 03.2
012F: INCF 22,F
0130: MOVWF 23
0131: MOVF 7A,W
0132: MOVWF 24
0133: MOVF 01,W
0134: MOVWF 25
0135: MOVLW 10
0136: MOVWF 04
0137: MOVF 24,W
0138: MOVWF 27
0139: MOVF 23,W
013A: MOVWF 26
013B: GOTO 029
013C: MOVLW 30
013D: MOVWF 2E
013E: CALL 004
013F: MOVLW 2C
0140: MOVWF 2E
0141: CALL 004
0142: MOVLW 20
0143: MOVWF 2E
0144: CALL 004
0145: MOVF 25,W
0146: MOVWF 26
0147: MOVLW 1B
0148: MOVWF 27
0149: GOTO 097
014A: MOVLW 0A
014B: MOVWF 2E
014C: CALL 004
014D: MOVLW 0D
014E: MOVWF 2E
014F: CALL 004
.................... set_timer0(0);
0150: CLRF 01
.................... Delay_ms(10000);
0151: MOVLW 28
0152: MOVWF 23
0153: MOVLW FA
0154: MOVWF 24
0155: GOTO 0CD
0156: DECFSZ 23,F
0157: GOTO 153
.................... }
0158: GOTO 12A
.................... }
0159: SLEEP
 
Configuration Fuses:
Word 1: 3F2A HS NOWDT NOPUT MCLR NOBROWNOUT NOLVP NOCPD NOWRT NODEBUG CCPB0 NOPROTECT
Word 2: 3FFC NOFCMEN NOIESO
/programy/C/PIC/mereni/geiger/geiger.sta
0,0 → 1,33
 
ROM used: 346 (8%)
346 (8%) including unused fragments
 
1 Average locations per line
20 Average locations per statement
 
RAM used: 10 (6%) at main() level
19 (11%) worst case
 
Lines Stmts % Files
----- ----- --- -----
28 17 100 D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c
20 0 0 D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.h
279 0 0 C:\Program Files\PICC\devices\16F88.h
----- -----
654 34 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 20 6 1 @delay_ms1
0 37 11 1 @PUTCHAR_1_
0 121 35 5 main
0 89 26 8 @PRINTF_LU_9600_51_53
0 21 6 3 @DIV88
0 54 16 2 @PRINTF_U_9600_51_53
 
Segment Used Free
--------- ---- ----
00000-00003 4 0
00004-007FF 342 1702
00800-00FFF 0 2048
 
/programy/C/PIC/mereni/geiger/geiger.sym
0,0 → 1,61
015-016 CCP_1
015 CCP_1_LOW
016 CCP_1_HIGH
021-022 main.n
023 main.@SCRATCH
024 @delay_ms1.P1
024 main.@SCRATCH
025 main.@SCRATCH
026-027 @PRINTF_LU_9600_51_53.P1
026 @PRINTF_U_9600_51_53.P2
027 @PRINTF_U_9600_51_53.P1
028 @DIV88.P1
028 @PRINTF_LU_9600_51_53.@SCRATCH
029 @DIV88.P1
029 @PRINTF_LU_9600_51_53.@SCRATCH
02A @PRINTF_LU_9600_51_53.@SCRATCH
02A @DIV88.@SCRATCH
02B @PRINTF_LU_9600_51_53.@SCRATCH
02C @PRINTF_LU_9600_51_53.@SCRATCH
02D @PRINTF_LU_9600_51_53.@SCRATCH
02E @PUTCHAR_1_.P1
077 @SCRATCH
078 @SCRATCH
078 _RETURN_
079 @SCRATCH
07A @SCRATCH
07B @SCRATCH
09C.6 C1OUT
09C.7 C2OUT
 
00CD @delay_ms1
0004 @PUTCHAR_1_
00E1 main
0029 @PRINTF_LU_9600_51_53
0082 @DIV88
0097 @PRINTF_U_9600_51_53
00E1 @cinit
 
Project Files:
D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c
D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.h
C:\Program Files\PICC\devices\16F88.h
 
Units:
D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.c (main)
 
Compiler Settings:
Processor: PIC16F88
Pointer Size: 8
ADC Range: 0-255
Opt Level: 9
Short,Int,Long: 1,8,16
 
Output Files:
Errors: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.err
INHX8: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.hex
Symbols: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.sym
List: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.lst
Debug/COFF: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.cof
Call Tree: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.tre
Statistics: D:\KAKLIK\programy\PIC_C\mereni\geiger\geiger.sta
/programy/C/PIC/mereni/geiger/geiger.tre
0,0 → 1,17
ÀÄgeiger
ÀÄmain 0/121 Ram=5
ÃÄ??0??
ÃÄ@PRINTF_LU_9600_51_53 0/89 Ram=8
³ ÀÄ@PUTCHAR_1_ 0/37 Ram=1
ÃÄ@PUTCHAR_1_ 0/37 Ram=1
ÃÄ@PUTCHAR_1_ 0/37 Ram=1
ÃÄ@PUTCHAR_1_ 0/37 Ram=1
ÃÄ@PRINTF_U_9600_51_53 0/54 Ram=2
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/37 Ram=1
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/37 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/37 Ram=1
ÃÄ@PUTCHAR_1_ 0/37 Ram=1
ÃÄ@PUTCHAR_1_ 0/37 Ram=1
ÀÄ@delay_ms1 0/20 Ram=1
/programy/C/PIC/mereni/geiger/nmea.c
0,0 → 1,1434
// Change the following to change the clock frequency
#define CRYSTAL_FREQ 16000000
// Change the following to change between 16 or 20 column display
#define DISPLAY_COLS 20
// Speed units are "1" (nautical knots), "2" (metric kph), or "3" (statute mph)
#define SPEED_UNITS 1
 
/****************************************************************************
GPS18.c
 
This program receives NMEA-0183 data from a GPS and displays it.
Meant for large display version still in 16F876.
Three buttons
Automicaly resets if main loop stops (not the best solution, still don't know why it's stopping)
 
Next: don't display GPS screens unless GPS is active
detect display needing reset
preset data eeprom for first-time operation
don't display init stuff if reseting from main loop
 
 
 
+5 +5+5
| | |
20 15 2
---------- ----------
~SerIn -----18-| |-24-----11-|DB4 A Vdd |
| |-25-----12-|DB5 |
ADC0 ------2-| |-26-----13-|DB6 |
ADC1 ------3-| 16F876 |-27-----14-|DB7 Vo| 3--
ADC2 ------5-| | | LCD | |
| |-14------6-|EN | |
XTAL--9-| |-15------4-|R/S | |
XTAL-10-| |-28-FET-16-|K | |
| | | RW Vss | |
BUTTON 1---21-| | ---------- |
BUTTON 2---22-| | 1 5 |
BUTTON 3---23-| | | | |
| | Gnd Gnd |
| | |
| |-11----------R/C-----------
| |
| |
----------
8 19
| |
Gnd Gnd
 
***************************************************************************/
#case
#include <16F876.h>
#include <jonsinc.h>
#device = *=16 ADC=10 /* allow RAM addresses over 255 */
 
#if ( ( CRYSTAL_FREQ < 4000000) || ( CRYSTAL_FREQ > 20000000 ) )
#error "CRYSTAL FREQ" not defined to between 8000000 and 20000000
#endif
#if ( ( DISPLAY_COLS != 16 ) && ( DISPLAY_COLS != 20 ) )
#error "DISPLAY COLS" not defined to 16 or 20
#endif
 
// RMC_TIME = 1 per clock megahertz, rounded
#define RMC_TIME CRYSTAL_FREQ/1000000
 
#define LCD_D0 PIN_B3
#define LCD_D1 PIN_B4
#define LCD_D2 PIN_B5
#define LCD_D3 PIN_B6
#define LCD_EN PIN_C3
#define LCD_RS PIN_C4
#define RX_IN PIN_C7
#define BUTTON_1 PIN_B0
#define BUTTON_2 PIN_B1
#define BUTTON_3 PIN_B2
#define LCD_BACKLITE PIN_B7
#define LINE_1 0x00
#define LINE_2 0x40
#if DISPLAY_COLS == 20
#define LINE_3 0x14
#define LINE_4 0x54
#endif
#if DISPLAY_COLS == 16
#define LINE_3 0x10
#define LINE_4 0x50
#endif
#define CLEAR_DISP 0x01
#define EOF 0x00
#define COMMA ','
#define CR 13
#define SPACE ' '
#define PERIOD '.'
#define DEGREE 0xdf
#define DOLLAR '$'
#define NULL 0
#define GPRMC_CODE 75
#define GPRMB_CODE 74
#define RX_BUFFER_SIZE 70
#define POSITION_SCREEN 1
#define WAYPOINT_SCREEN 2
#define BATTERY_SCREEN 3
#define HIDDEN_RMC 5
#define WARNING_MSG 0
#define NODATA_MSG 1
#define ACTIVITY_SYMBOL 0xFF
#define MAX_VOLTS 15
#define EEPROM_CONTRAST 0
#define EEPROM_INITIAL 1
 
/* Set the following define to "YES" to display XOR'ed GPS sentence code */
/* such as GPRMC and the display will read out the value of 74. */
#define GET_GPS_CODE NO
 
#separate void Display ( void );
#separate void LCD_Init ( void );
#separate void LCD_SetPosition ( unsigned int cX );
#separate void LCD_PutChar ( unsigned int cX );
#separate void LCD_PutCmd ( unsigned int cX );
#separate void LCD_PulseEnable ( void );
#separate void LCD_SetData ( unsigned int cX );
#separate void SkipField ( char cCnt );
#separate char GetField ( void );
#separate void InitRxBuffer ( char cCode );
#separate char GetRxChar ( void );
#separate void DisplayLatLon ( void );
#separate void DisplayWaypoint ( void );
#separate void DisplayLatitude ( char cLine );
#separate void DisplayLongitude ( char cLine );
#separate void DisplayHeading ( char cLine );
#separate void DisplaySpeed ( char cLine );
#separate void DisplaySteer ( char cLine, char cX );
#separate void DisplayWaypointName ( char cLine, char cX );
#separate void DisplayDistance ( char cLine, char cX );
#separate void DisplayBearing ( char cLine, char cX );
#separate void GetUtcAndMagVar ( void );
#separate long TrueToMag ( long iH );
#separate long FieldFiveToLong ( void );
#separate void DisplayAnalog ( void );
#separate void DisplayScaledVoltage ( long iV, char cScale );
#separate void DisplayArrival ( char cLine );
#separate void DisplayMessage ( char cMsgNum );
#separate void DisplayTemplateLatLon ( void );
#separate void DisplayTemplateWaypoint ( void );
#separate void DisplayTemplateAnalog ( void );
#separate void Delay5mS ( char cCnt );
 
#fuses HS, NOPROTECT, PUT, NOWDT, BROWNOUT, NOLVP, NOCPD
#use standard_io ( A )
#use standard_io ( B )
#use standard_io ( C )
#use delay ( clock = CRYSTAL_FREQ )
#use rs232 ( baud=4800, xmit=PIN_C6, rcv=PIN_C7, ERRORS ) // XMIT must be assigned to enable hardward USART
#priority RDA, RTCC, EXT
 
static char cC [ 10 ]; // local buffer
static char cTimeOut;
static char cRxBuffer [ RX_BUFFER_SIZE ]; // Fifo
static char cRxByteCnt; // Number of bytes in the recv fifo
static char *cRxBufferWritePtr; // Pointers for the Rx buffer
static char *cRxBufferReadPtr;
static char cRxIsrState, cRxMsgTypeReceived, cRxMsgTypeDesired;
static char cRxMsgReady, cReceiveFlag;
static long iVar, iLastRange, iTimeOut;
static char cVarDir, cScreenChanged, cAdcDone;
static char cButtonPressed, cSkip, cButtonCount;
static char cScreen, cSavedScreen, cRmcTimer1, cRmcTimer2;
static char cToFrom [ 5 ], cIndicator, cIllumination, cRxErrorFlag;
static char cDone, cContrast;
 
/*******************************************************************/
#int_ad
void AdcInterrupt ( void )
{
/* Gets here when ADC is done conversion, sets flag */
cAdcDone = YES;
}
 
#int_timer1
void Timer1Interrupt ( void )
{
/* Periodic RMC data timer, gets here every 204mS */
/* This routine forces RMC to run every 10 minutes to update */
/* magnetic variation */
if ( cRmcTimer1-- == 0 )
{
cRmcTimer1 = 255; // 52 seconds @ 10.240MHz
if ( cRmcTimer2-- == 0 )
{
cRmcTimer2 = RMC_TIME; // triggers every 10 minutes
cSavedScreen = cScreen; // save current screen type
cScreen = HIDDEN_RMC; // force RMC to run
}
}
}
 
#int_rtcc
void Timer0Interrupt ( void )
{
// Gets here every 16.4mS at 8MHz, 8.2mS at 16MHz
// Handles data timeout and switch debounce.
 
// DATA TIMEOUT TIMER
if ( cTimeOut != 0 )
{
cTimeOut--;
}
 
// This timer is preset by the normal operating loop, unless the operating
// loop stops looping, at which point iTimeOut finally decrements to zero
// and resets CPU.
if ( iTimeOut != 0 )
{
iTimeOut--;
}
else
{
reset_cpu(); // force reset
}
 
if ( input ( BUTTON_2 ) == LOW ) // if button still pressed
{
cScreen = WAYPOINT_SCREEN;
cSkip = YES; // skip out of anything in process
cScreenChanged = YES; // repaint complete screen
}
 
if ( input ( BUTTON_3 ) == LOW ) // if button still pressed
{
cScreen = BATTERY_SCREEN;
cSkip = YES; // skip out of anything in process
cScreenChanged = YES; // repaint complete screen
}
 
// SWITCH DEBOUNCE
if ( input ( BUTTON_1 ) == LOW ) // if button still pressed
{
if ( cButtonCount < 255 ) // hold at 255
{
cButtonCount++; // otherwise increment
}
}
else // if button is unpressed
{
if ( cButtonCount > 2 ) // filter out glitches
{
//If button press is greater than 3.3 seconds, cold reset
if ( cButtonCount == 255 )
{
reset_cpu();
}
if ( ( cButtonCount > 57 ) && ( cButtonCount < 255 ) )
{
if ( cScreen != HIDDEN_RMC ) // if not in the middle of getting magnetic variation
{
// cIllumination ^= ON;
output_bit ( LCD_BACKLITE, cIllumination ^= ON );
}
}
// If button press is less than 0.5 second
if ( cButtonCount <= 57 )
{
if ( cScreen != HIDDEN_RMC ) // if not in the middle of getting magnetic variation
{
//if ( cScreen++ >= BATTERY_SCREEN ) // increment to next screen
{
cScreen = POSITION_SCREEN; // wrap
}
cSkip = YES; // skip out of anything in process
cScreenChanged = YES; // repaint complete screen
}
}
}
cButtonCount = 0; // restart
}
}
 
#int_rda
void SerialInterrupt ( void )
{
/*
Reads incoming data from the USART and puts in in a rolling buffer
( but in this application, it should never roll.)
If the buffer is full, this routine just discards the received byte.
Not checking the LRC byte at the end of the NMEA-0183 sentence.
*/
char cChar;
 
if ( rs232_errors & 0x04 ) // get framing error bit from Rx status reg
{
cRxErrorFlag = ON;
}
cChar = getchar(); // get char from UART, clear any errors
 
if ( cRxByteCnt == RX_BUFFER_SIZE ) // is recv fifo full ???
{
goto done;
}
switch ( cRxIsrState )
{
case 0:
{
if ( cChar == DOLLAR ) // if start of NMEA0183 message
{
cRxByteCnt = 0; // reset byte count
cReceiveFlag = OFF; // default to off
cRxMsgTypeReceived = NULL; // set hashed value to null
cRxIsrState++; // next state
}
break;
}
case 1: // five type characters to obtain
case 2:
case 3:
case 4:
case 5:
{
cRxMsgTypeReceived ^= cChar; // hash in msg type
if ( cRxIsrState++ == 5 ) // if time to check message type
{
if ( cRxMsgTypeReceived == cRxMsgTypeDesired ) // if good
{
cReceiveFlag = YES; // enable receiving
cRxBufferWritePtr = cRxBuffer; // reset to beginning of buffer
}
else // don't want this message
{
cRxIsrState = 0; // reset to look for next msg
}
}
break;
}
case 6:
{
/* Case 6 skips the comma character following msg type */
cRxIsrState++;
break;
}
default: // remainder of characters
{
if ( cReceiveFlag == YES ) // if this message is wanted
{
*cRxBufferWritePtr = cChar; // put char in fifo
cRxBufferWritePtr++; // increment pointer
if ( cRxBufferWritePtr == ( cRxBuffer + RX_BUFFER_SIZE ) ) // pointer past end ?
{
cRxBufferWritePtr = cRxBuffer; // set pointer to start of fifo
}
cRxByteCnt++; // Increment byte count
if ( cChar == CR )
{
cRxMsgReady = YES; // signal that message is ready
cReceiveFlag = NO; // no more receive
}
}
}
}
done:;
}
 
/*******************************************************************/
 
void main ( void )
{
char cX;
 
iTimeOut = 65535; // default to very long to get by init
/* INITIALIZE */
output_float ( RX_IN ); // ensure Rx input is HiZ
output_float ( BUTTON_1 ); // ensure switch input is HiZ
output_float ( BUTTON_2 ); // ensure switch input is HiZ
output_float ( BUTTON_3 ); // ensure switch input is HiZ
output_low ( LCD_BACKLITE ); // turn off backlighting
port_b_pullups ( ON ); // enable pullups on switches
 
// GET SAVED SETTINGS
cContrast = read_eeprom ( EEPROM_CONTRAST ); // get stored value
 
// PWM is for display contrast
setup_ccp2 ( CCP_PWM ); // set for PWM mode
//The cycle time will be (1/clock)*4*t2div*(period+1)
// 1/8000000 * 4 * 1 * 128 = 51.2uS = 19.5KHz
setup_timer_2 ( T2_DIV_BY_1, 255, 1 ); // set PWM period
// duty cycle = value*(1/clock)*t2div
// 10 * 1/8000000 * 1 = 1.2uS
set_pwm2_duty ( cContrast ); // set contrast duty cycle
 
// SETUP TIMER 0
// Need 8-bit Timer0 to roll over every 13mS, approximately.
// Roll time = 256 * 1 / ( clock_freq / prescaler setting / 4 )
#if CRYSTAL_FREQ >= 15000000
setup_counters ( RTCC_INTERNAL, RTCC_DIV_256 ); // ~13mS timer wrap
#elif CRYSTAL_FREQ >= 8000000
setup_counters ( RTCC_INTERNAL, RTCC_DIV_128 ); // ~13mS timer wrap
#elif CRYSTAL_FREQ < 8000000
setup_counters ( RTCC_INTERNAL, RTCC_DIV_64 ); // ~13mS timer wrap
#endif
 
// Timer 1 roll time = 65536 * 1 / ( clock_freq / prescaler setting / 4 )
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 ); // 16-bit timer
 
setup_adc_ports ( RA0_RA1_RA3_ANALOG ); /* these three statements set up the ADC */
setup_adc ( ADC_CLOCK_INTERNAL );
cIllumination = OFF;
 
LCD_Init(); // set up LCD for 4-wire bus, etc.
 
/* INIT MESSAGE */
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( LINE_1 + 0 );
printf ( LCD_PutChar, " Northern Light " ); // welcome screen
LCD_SetPosition ( LINE_2 + 2 );
printf ( LCD_PutChar, "Monitor/Repeater" );
LCD_SetPosition ( LINE_3 + 3 );
printf ( LCD_PutChar, "v18 06/21/03" );
LCD_SetPosition ( LINE_4 + 5 );
printf ( LCD_PutChar, "c Jon Fick" );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( LINE_1 + 0);
printf ( LCD_PutChar, " Northern Light " ); // welcome screen
LCD_SetPosition ( LINE_2 + 2 );
printf ( LCD_PutChar, "GPS Repeater" );
LCD_SetPosition ( LINE_3 + 1 );
printf ( LCD_PutChar, "v18 06/21/03" );
LCD_SetPosition ( LINE_4 + 3 );
printf ( LCD_PutChar, "c Jon Fick" );
#endif
delay_ms ( 1000 );
 
/* INSTRUCTION MESSAGE */
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( LINE_1 + 0 );
printf ( LCD_PutChar, "BUTTONS:" );
LCD_SetPosition ( LINE_2 + 0 );
printf ( LCD_PutChar, "<-- Lat/Lon" );
LCD_SetPosition ( LINE_3 + 0 );
printf ( LCD_PutChar, "<-- Waypoint" );
LCD_SetPosition ( LINE_4 + 0 );
printf ( LCD_PutChar, "<-- Battery" );
delay_ms ( 2000 );
 
/* SETUP MODE */
if ( input ( BUTTON_1 ) == LOW ) // if button is pressed
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( LINE_1 + 0 );
printf ( LCD_PutChar, "Set contrast:" );
LCD_SetPosition ( LINE_2 + 0 );
printf ( LCD_PutChar, "<-- More" );
LCD_SetPosition ( LINE_3 + 0 );
printf ( LCD_PutChar, "<-- DONE" );
LCD_SetPosition ( LINE_4 + 0 );
printf ( LCD_PutChar, "<-- Less" );
while ( input ( BUTTON_1 ) == LOW ); // wait for switch to be released after entering SETUP mode
cContrast = 120; // start at full contrast
cDone = NO;
while ( cDone == NO )
{
set_pwm2_duty ( cContrast ); // update contrast
if ( input ( BUTTON_1 ) == LOW )
{
if ( cContrast > 0 )
{
cContrast--; // more
}
}
if ( input ( BUTTON_2 ) == LOW )
{
cDone = YES; // done
}
if ( input ( BUTTON_3 ) == LOW )
{
if ( cContrast < 255 )
{
cContrast++; // less
}
}
delay_ms ( 30 ); // autorepeat
}
write_eeprom ( EEPROM_CONTRAST, cContrast ); // save CONTRAST to EEPROM
 
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( LINE_2 + 0 );
printf ( LCD_PutChar, "<- Press initial" );
LCD_SetPosition ( LINE_3 + 0 );
printf ( LCD_PutChar, " bootup screen" );
while ( input ( BUTTON_1 ) == LOW ); // wait until button not pressed
cX = POSITION_SCREEN;
while ( TRUE )
{
LCD_SetPosition ( LINE_4 + 3 );
switch ( cX )
{
case POSITION_SCREEN:
{
printf ( LCD_PutChar, "POSITION " );
break;
}
case WAYPOINT_SCREEN:
{
printf ( LCD_PutChar, "WAYPOINT " );
break;
}
case BATTERY_SCREEN:
{
printf ( LCD_PutChar, "BATTERY " );
break;
}
}
delay_ms ( 750 );
if ( input ( BUTTON_1 ) == LOW ) // if button is pressed
{
write_eeprom ( EEPROM_INITIAL, cX ); // save screen number to EEPROM
break;
}
if ( cX++ == BATTERY_SCREEN )
{
cX = POSITION_SCREEN;
}
}
LCD_PutCmd ( CLEAR_DISP );
}
 
/* This IF/ENDIF is a tool for getting the $GP... codes */
/* that are used in the switch/case in the main loop. */
#if ( GET_GPS_CODE == YES )
printf ( LCD_PutChar, "%u", 'G'^'P'^'R'^'M'^'B');
while ( TRUE );
#endif
 
/* INTERRUPTS */
ext_int_edge ( H_TO_L ); // set falling edge ext interrupt
enable_interrupts ( INT_TIMER1 ); // enable Timer1 interrupt
enable_interrupts ( INT_RDA ); // enable serial interrupt
enable_interrupts ( INT_RTCC ); // enable Timer0 interrupt
enable_interrupts ( INT_AD ); // enable ADC interrupt
enable_interrupts ( GLOBAL ); // enable all interrupts
 
/* VARIABLES */
iVar = NULL; // default, no variation yet
cVarDir = SPACE; // default, no variation yet
cRmcTimer1 = 255; // initialize to 52 seconds
cRmcTimer2 = RMC_TIME; // trigger forced RMC after 10 minutes
cScreen = HIDDEN_RMC; // default screen, get magnetic variation first
cSavedScreen = read_eeprom ( EEPROM_INITIAL ); // restore initial screen
iLastRange = 65535; // make max by default
strcpy ( cToFrom, " " ); // blank by default
cScreenChanged = YES;
cIndicator = 0;
cButtonCount = 0;
cButtonPressed = NO;
cRxErrorFlag = OFF;
 
/* MAIN LOOP */
while ( TRUE )
{
cTimeOut = 188; // 231 * 0.013mS = 3 seconds
switch ( cScreen )
{
case HIDDEN_RMC:
{
InitRxBuffer( GPRMC_CODE ); // set code and turn on serial interrupt
while ( ( cRxMsgReady == NO ) && ( cTimeOut != 0 ) );
disable_interrupts ( INT_RDA ); // ignore rest of messages
if ( cTimeOut != 0 ) // if not timed out
{
GetUtcAndMagVar(); // get and store the magnetic variation
}
cScreen = cSavedScreen; // revert to previous screen
break;
}
case POSITION_SCREEN:
{
if ( cScreenChanged == YES )
{
disable_interrupts ( INT_RDA );
cScreenChanged = NO;
cSkip = NO;
LCD_PutCmd ( CLEAR_DISP );
DisplayTemplateLatLon();
enable_interrupts ( INT_RDA );
}
InitRxBuffer( GPRMC_CODE ); // set code and turn on serial interrupt
while ( ( cRxMsgReady == NO ) && ( cTimeOut != 0 ) && ( cScreenChanged != YES ) );
disable_interrupts ( INT_RDA ); // ignore rest of messages
if ( cScreenChanged == NO )
{
if ( cTimeOut != 0 )
{
DisplayLatLon();
}
else
{
DisplayMessage ( NODATA_MSG );
}
}
cRxErrorFlag = OFF;
break;
}
case WAYPOINT_SCREEN:
{
if ( cScreenChanged == YES )
{
disable_interrupts ( INT_RDA );
cScreenChanged = NO;
cSkip = NO;
LCD_PutCmd ( CLEAR_DISP );
DisplayTemplateWaypoint();
enable_interrupts ( INT_RDA );
}
cSkip = NO;
InitRxBuffer( GPRMB_CODE ); // set code and turn on serial interrupt
while ( ( cRxMsgReady == NO ) && ( cTimeOut != 0 ) && ( cScreenChanged != YES ) );
disable_interrupts ( INT_RDA ); // ignore rest of messages
if ( cScreenChanged == NO )
{
if ( cTimeOut != 0 )
{
DisplayWaypoint();
}
else
{
DisplayMessage ( NODATA_MSG );
}
}
break;
}
case BATTERY_SCREEN:
{
if ( cScreenChanged == YES )
{
disable_interrupts ( INT_RDA );
cScreenChanged = NO;
cSkip = NO;
LCD_PutCmd ( CLEAR_DISP );
DisplayTemplateAnalog();
}
DisplayAnalog();
break;
}
}
 
// Preset timeout counter each loop; RTCC interrupt decrements, resets if zero is reached
iTimeOut = 2000; // ~ 30 seconds
 
/* Flashing activity indicator in lower right of screen. */
cIndicator ^= 1;
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( LINE_4 + 19 );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( LINE_4 + 15 );
#endif
if ( cIndicator == 1 )
{
printf ( LCD_PutChar, "%c", ACTIVITY_SYMBOL );
}
else
{
printf ( LCD_PutChar, " " );
}
}
}
 
#separate void DisplayTemplateLatLon ( void )
{
LCD_SetPosition ( LINE_1 );
printf ( LCD_PutChar, "LAT" );
LCD_SetPosition ( LINE_2 );
printf ( LCD_PutChar, "LON" );
LCD_SetPosition ( LINE_3 );
#if ( DISPLAY_COLS == 20 )
printf ( LCD_PutChar, "SPEED" );
LCD_SetPosition ( LINE_4 );
printf ( LCD_PutChar, "HEADING" );
#elif ( DISPLAY_COLS == 16 )
printf ( LCD_PutChar, "SPD" );
LCD_SetPosition ( LINE_4 );
printf ( LCD_PutChar, "HDG" );
#endif
}
 
#separate void DisplayTemplateWaypoint ( void )
{
LCD_SetPosition ( LINE_1 );
#if ( DISPLAY_COLS == 20 )
printf ( LCD_PutChar, "WAYPOINT" );
#elif ( DISPLAY_COLS == 16 )
printf ( LCD_PutChar, "WAYPT" );
#endif
LCD_SetPosition ( LINE_2 );
printf ( LCD_PutChar, "STEER" );
LCD_SetPosition ( LINE_3 );
printf ( LCD_PutChar, "DIST" );
LCD_SetPosition ( LINE_4 );
printf ( LCD_PutChar, "BEARING" );
}
 
#separate void DisplayTemplateAnalog ( void )
{
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( LINE_1 + 3 );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( LINE_1 + 1 );
#endif
printf ( LCD_PutChar, "BATTERY STATUS" );
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( LINE_2 );
printf ( LCD_PutChar, "Primary" );
LCD_SetPosition ( LINE_3 );
printf ( LCD_PutChar, "Secondary" );
LCD_SetPosition ( LINE_4 );
printf ( LCD_PutChar, "Refrigerator" );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( LINE_2 );
printf ( LCD_PutChar, "Main#1 " );
LCD_SetPosition ( LINE_3 );
printf ( LCD_PutChar, "Main#2 " );
LCD_SetPosition ( LINE_4 );
printf ( LCD_PutChar, "Refrig " );
#endif
}
 
#separate void DisplayLatLon ( void )
{
SkipField ( 1 ); // skip UTC
GetField(); // A = OK, V = warning
if ( ( cC [ 0 ] == 'A' ) && ( !cSkip ) )
{
GetField(); // LAT
if ( !cSkip )
{
DisplayLatitude ( LINE_1 );
}
GetField(); // LON
if ( !cSkip )
{
DisplayLongitude ( LINE_2 );
}
GetField(); // SPEED
if ( !cSkip )
{
DisplaySpeed ( LINE_3 );
}
GetField(); // HEADING
if ( !cSkip )
{
DisplayHeading ( LINE_4 );
}
}
else
{
DisplayMessage( WARNING_MSG );
}
}
 
#separate void DisplayWaypoint ( void )
{
char cX;
 
GetField(); // A = OK, V = warning
if ( ( cC [ 0 ] == 'A' ) && ( !cSkip ) )
{
cX = GetField(); // XTE
if ( !cSkip )
{
DisplaySteer ( LINE_2, cX );
}
SkipField ( 1 ); // skip origin WP ID
GetField(); // DEST WP ID
if ( !cSkip )
{
DisplayWaypointName ( LINE_1, cX );
}
SkipField ( 4 ); // skip LAT, NS, LON, EW
cX = GetField(); // RANGE
if ( !cSkip )
{
DisplayDistance ( LINE_3, cX );
}
cX = GetField(); // BEARING
if ( !cSkip )
{
DisplayBearing ( LINE_4, cX );
}
SkipField ( 1 ); // skip SPEED TO DEST
GetField(); // ARRIVAL FLAG
if ( !cSkip )
{
DisplayArrival ( LINE_1 ); // overwrite RANGE if arrived
}
}
else
{
DisplayMessage( WARNING_MSG );
}
}
 
#separate void DisplayAnalog ( void )
{
long iX;
char cCnt;
 
set_adc_channel ( 0 ); // set channel
delay_us ( 100 ); // wait aquisition time
cAdcDone = NO;
if ( !cSkip )
{
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( LINE_2 + 13 );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( LINE_2 + 8 );
#endif
DisplayScaledVoltage ( read_adc(), MAX_VOLTS );
printf ( LCD_PutChar, " V " );
}
set_adc_channel ( 1 );
delay_us ( 100 );
cAdcDone = NO;
if ( !cSkip )
{
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( LINE_3 + 13 );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( LINE_3 + 8 );
#endif
DisplayScaledVoltage ( read_adc(), MAX_VOLTS );
printf ( LCD_PutChar, " V " );
}
set_adc_channel ( 3 );
delay_us ( 100 );
cAdcDone = NO;
if ( !cSkip )
{
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( LINE_4 + 13 );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( LINE_4 + 8 );
#endif
DisplayScaledVoltage ( read_adc(), MAX_VOLTS );
printf ( LCD_PutChar, " V " );
}
Delay5mS ( 100 ); // slow loop down a bit
}
 
#separate void GetUtcAndMagVar ( void )
{
/*
This is a non-display version of the RMC sentence
to get the A/V warning, the magnetic variation, and the
magnetic direction.
*/
 
GetField(); // get UTC
GetField(); // A = OK, V = warning
if ( cC [ 0 ] == 'A' )
{
SkipField ( 7 ); // skip fields
GetField(); // MAGNETIC VARIATION
iVar = FieldFiveToLong(); // save to global variable, used in other sentences
GetField(); // EW
cVarDir = cC [ 0 ]; // save direction
}
else
{
iVar = NULL; // invalid
cVarDir = SPACE;
}
}
 
/******************************************************************/
 
#separate void DisplayScaledVoltage ( long iV, char cScale )
{
float fX;
 
/*
0 to 5V input at pin 2 results in 0 - 1023. This routine
scales it to something else.
*/
while ( cAdcDone == NO ); // wait for completion by ADC interrupt
if ( iV == 1023 )
{
printf ( LCD_PutChar, "O/L" ); /* print it to the screen */
}
else
{
fX = ( ( float ) iV ) / 1023 * ( float ) cScale; // scale to proper range, 1023 leaves room for out-of-range
printf ( LCD_PutChar, "%2.1f", fX ); /* print it to the screen */
}
}
 
#separate void DisplayArrival ( char cLine )
{
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( cLine + 11 );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( cLine + 9 );
#endif
if ( cC [ 0 ] == 'A' )
{
printf ( LCD_PutChar, "Arrived" );
}
else
{
printf ( LCD_PutChar, " " );
}
}
 
#separate void DisplayWaypointName ( char cLine, char cX )
{
/* Displays waypoint name, pads field with blanks */
char cChar, cI;
 
LCD_SetPosition ( cLine );
if ( cX != 0 )
{
printf ( LCD_PutChar, "\"" );
for ( cI = 0; cI < 6; cI++ )
{
cChar = cC [ cI ];
if ( cChar == EOF )
{
break;
}
printf ( LCD_PutChar, "%c", cChar );
}
printf ( LCD_PutChar, "\"" );
// Blank remainder of field
cChar = SPACE;
for ( ; cI < 6; cI++ )
{
printf ( LCD_PutChar, "%c", cChar );
}
}
else
{
printf ( LCD_PutChar, "- none -" );
}
}
 
#separate void DisplaySteer ( char cLine, char cX )
{
/*
Displays A.BC literals, appends 'L' or 'R'.
If less than 1.0, displays feet rather than nm.
Doesn't display distance if on track.
*/
long iX;
char cCnt;
 
if ( cX != 0 )
{
if ( ( cC [ 0 ] != '0' ) || ( cC [ 2 ] != '0' ) || ( cC [ 3 ] != '0' ) ) // if not 0.00
{
LCD_SetPosition ( cLine + 14 );
#if ( DISPLAY_COLS == 20 )
printf ( LCD_PutChar, " " ); // blank possible characters
LCD_SetPosition ( cLine + 11 );
#elif ( DISPLAY_COLS == 16 )
printf ( LCD_PutChar, " " ); // blank possible characters
LCD_SetPosition ( cLine + 8);
#endif
if ( cC [ 0 ] == '0' ) // if less than 1.0 nm, display as feet
{
iX = ( 528 * ( long ) ( cC [ 2 ] - 0x30 ) ) + ( 52 * ( long ) ( cC [ 3 ] - 0x30 ) );
printf ( LCD_PutChar, "%luft ", iX );
}
else // if 1.0 nm or greater, display as nautical miles
{
printf ( LCD_PutChar, "%c%c%c%cmi ", cC [ 0 ], cC [ 1 ], cC [ 2 ] , cC [ 3 ] );
}
GetField(); // L or R
LCD_SetPosition ( cLine + 6 );
if ( cC [ 0 ] == 'L' )
{
#if ( DISPLAY_COLS == 20 )
printf ( LCD_PutChar, "PORT " );
#elif ( DISPLAY_COLS == 16 )
printf ( LCD_PutChar, "L" );
#endif
}
else
{
#if ( DISPLAY_COLS == 20 )
printf ( LCD_PutChar, "STBD " );
#elif ( DISPLAY_COLS == 16 )
printf ( LCD_PutChar, "R" );
#endif
}
}
else // if 0.00
{
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( cLine + 11 );
printf ( LCD_PutChar, "On track " );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( cLine + 6 );
printf ( LCD_PutChar, " On track" );
#endif
GetField(); // dummy L or R
}
}
else
{
LCD_SetPosition ( cLine + 6 );
printf ( LCD_PutChar, " " );
}
}
 
#separate void DisplayDistance ( char cLine, char cX )
{
/* Format: ABC.D nautical miles */
char cChar, cI;
long iThisRange;
 
if ( cX != 0 ) // if waypoint data to display
{
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( cLine + 11 );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( cLine + 8 );
#endif
cI = 0;
for ( cI = 0; cI < 2; cI++ ) // find first non-zero
{
cChar = cC [ cI ];
if ( cChar != '0' )
{
break;
}
}
for ( ; cI < 5; cI++ ) // display from there on
{
printf ( LCD_PutChar, "%c", cC [ cI ] );
}
printf ( LCD_PutChar, "nm " ); // pad with blanks
 
/*
The least significant character from the GPS is 0.1 nm.
Multiply whole thing by 10 and make it type long.
Discern if increasing (FROM) or decreasing (TO).
*/
iThisRange = 1000 * ( long ) ( cC [ 0 ] - 0x30 );
iThisRange += 100 * ( long ) ( cC [ 1 ] - 0x30 );
iThisRange += 10 * ( long ) ( cC [ 2 ] - 0x30 );
iThisRange += ( long ) ( cC [ 4 ] - 0x30 );
if ( iThisRange < iLastRange )
{
#if ( DISPLAY_COLS == 20 )
strcpy ( cToFrom, "TO " );
#elif ( DISPLAY_COLS == 16 )
strcpy ( cToFrom, "TO" );
#endif
}
if ( iThisRange > iLastRange )
{
#if ( DISPLAY_COLS == 20 )
strcpy ( cToFrom, "FROM" );
#elif ( DISPLAY_COLS == 16 )
strcpy ( cToFrom, "FM" );
#endif
}
iLastRange = iThisRange; // save this range to compare next time
LCD_SetPosition ( cLine + 5 );
printf ( LCD_PutChar, cToFrom );
}
else
{
LCD_SetPosition ( cLine + 5 );
#if ( DISPLAY_COLS == 20 )
printf ( LCD_PutChar, " " );
#elif ( DISPLAY_COLS == 16 )
printf ( LCD_PutChar, " " );
#endif
}
}
 
#separate void DisplayBearing ( char cLine, char cX )
{
/*
Compass variation comes from RMC sentence. If RMC has not run yet
then "T" is displayed after bearing.
*/
long iHdg;
char cTrueIndicator;
 
if ( cX != 0 ) // if waypoint data to display
{
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( cLine + 11 );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( cLine + 8 );
#endif
iHdg = FieldFiveToLong();
iHdg = TrueToMag ( iHdg ); // factor variation into heading
if ( ( iVar == NULL ) || ( cVarDir == SPACE ) )
{
cTrueIndicator = 'T';
}
else
{
cTrueIndicator = ' ';
}
printf ( LCD_PutChar, "%lu%c%c ", iHdg, DEGREE, cTrueIndicator ); // pad with blanks
}
else
{
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( cLine + 11 );
printf ( LCD_PutChar, " " );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( cLine + 8 );
printf ( LCD_PutChar, " " );
#endif
}
}
 
#separate void DisplayLatitude ( char cLine )
{
/* Displays latitude ABCD.EF as AB CD.EF, appends 'N' or 'S' */
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( cLine + 8 );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( cLine + 5 );
#endif
if ( cC [ 0 ] == '0' )
{
cC [ 0 ] = SPACE;
}
printf ( LCD_PutChar, "%c%c%c", cC [ 0 ], cC [ 1 ], DEGREE );
printf ( LCD_PutChar, "%c%c%c%c%c%c", cC [ 2 ], cC [ 3 ], cC [ 4 ], cC [ 5 ], cC [ 6 ], cC [ 7 ] );
GetField(); // NS
printf ( LCD_PutChar, " %c", cC [ 0 ] );
}
 
#separate void DisplayLongitude ( char cLine )
{
/* Displays longitude ABCDE.FG as ABC DE.FG, appends 'E' or 'W' */
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( cLine + 7 );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( cLine + 4 );
#endif
if ( cC [ 0 ] == '0' )
{
cC [ 0 ] = SPACE;
}
if ( cC [ 1 ] == '0' )
{
cC [ 1 ] = SPACE;
}
printf ( LCD_PutChar, "%c%c%c%c", cC [ 0 ], cC [ 1 ], cC [ 2 ], DEGREE );
printf ( LCD_PutChar, "%c%c%c%c%c%c", cC [ 3 ], cC [ 4 ], cC [ 5 ], cC [ 6 ], cC [ 7 ], cC [ 8 ] );
GetField(); // EW
printf ( LCD_PutChar, " %c", cC [ 0 ] );
}
 
#separate void DisplaySpeed ( char cLine )
{
float fX;
 
// Format ABC.D
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( cLine + 8 );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( cLine + 5 );
#endif
fX = 100 * ( cC [ 0 ] - 0x30 );
fX += 10 * ( cC [ 1 ] - 0x30 );
fX += 1 * ( cC [ 2 ] - 0x30 );
fX += 0.1 * ( cC [ 4 ] - 0x30 );
#if SPEED_UNITS == 2
fX *= 1.852; // convert knots to km/h
#endif
#if SPEED_UNITS == 3
fX *= 1.151; // convert knots to mi/h
#endif
printf ( LCD_PutChar, "%3.1f ", fX ); // print it to the screen
#if SPEED_UNITS == 1
printf ( LCD_PutChar, "kts " ); // print it to the screen
#endif
#if SPEED_UNITS == 2
printf ( LCD_PutChar, "kph " ); // print it to the screen
#endif
#if SPEED_UNITS == 3
printf ( LCD_PutChar, "mph " ); // print it to the screen
#endif
}
 
#separate void DisplayHeading ( char cLine )
{
long iHdg;
 
#if ( DISPLAY_COLS == 20 )
LCD_SetPosition ( cLine + 8 );
#elif ( DISPLAY_COLS == 16 )
LCD_SetPosition ( cLine + 5 );
#endif
iHdg = FieldFiveToLong();
SkipField ( 1 ); // skip fix date
GetField(); // MAGNETIC VARIATION
iVar = FieldFiveToLong(); // save to global variable, used in other sentences
GetField(); // EW
cVarDir = cC [ 0 ]; // save direction
iHdg = TrueToMag ( iHdg ); // factor variation into heading
printf ( LCD_PutChar, "%lu%c ", iHdg, DEGREE ); // pad with blanks
}
 
#separate long FieldFiveToLong ( void )
{
/* Converts ABC.D to long, rounds decimal up or down */
long iX;
 
iX = 100 * ( long ) ( cC [ 0 ] - 0x30 );
iX += 10 * ( long ) ( cC [ 1 ] - 0x30 );
iX += ( long ) ( cC [ 2 ] - 0x30 );
if ( ( cC [ 3 ] == PERIOD ) && ( cC [ 4 ] >= '5' ) )
{
iX++; // round up
}
return ( iX );
}
 
#separate long TrueToMag ( long iH )
{
/* Magnetic variation information comes from the RMC sentence */
 
if ( cVarDir == 'W' )
{
iH += iVar;
}
else
{
if ( iH >= iVar )
{
iH -= iVar; // OK as-is
}
else
{
iH = iH + 360 - iVar; // correct for below zero
}
}
if ( iH >= 360 )
{
iH -= 360;
}
return ( iH );
}
 
#separate void DisplayMessage ( char cMsgNum )
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( LINE_2 );
switch ( cMsgNum )
{
case WARNING_MSG:
{
#if ( DISPLAY_COLS == 20 )
printf ( LCD_PutChar, " GPS warning " );
#elif ( DISPLAY_COLS == 16 )
printf ( LCD_PutChar, " GPS warning" );
#endif
break;
}
case NODATA_MSG:
{
if ( cRxErrorFlag == OFF ) // is it a framing error problem ?
{
#if ( DISPLAY_COLS == 20 )
printf ( LCD_PutChar, " No data from GPS" );
#elif ( DISPLAY_COLS == 16 )
printf ( LCD_PutChar, "No data from GPS" );
#endif
}
else
{
#if ( DISPLAY_COLS == 20 )
printf ( LCD_PutChar, " Baud error" );
#elif ( DISPLAY_COLS == 16 )
printf ( LCD_PutChar, " Baud error" );
#endif
cRxErrorFlag = OFF;
}
break;
}
}
Delay5mS ( 255 ); // delay 1.25 seconds
iVar = NULL;
cVarDir = SPACE; // signal "no magnetic variation" yet
cScreenChanged = YES;
}
 
#separate void Delay5mS ( char cCnt )
{
char cX;
 
/* This variable-count 5mS delay is interruptable by a button press */
for ( cX = 0; cX < cCnt; cX++ )
{
if ( cScreenChanged == YES )
{
break;
}
delay_ms ( 5 );
}
}
 
#separate char GetField ( void )
{
char cX, cIndex;
 
cX = NULL;
cIndex = 0;
while ( !cSkip )
{
cX = GetRxChar();
if ( ( cX == COMMA ) || ( cX == CR ) )
{
break;
}
cC [ cIndex++ ] = cX;
}
cC [ cIndex ] = EOF;
return ( cIndex ); // return number of characters in field
}
 
#separate void SkipField ( char cCnt )
{
char cX;
 
for ( cX = 0; cX < cCnt; cX++ )
{
while ( GetRxChar() != COMMA );
}
}
 
/* RS232 FUNCTIONS ================================================== */
 
#separate void InitRxBuffer ( char cCode )
{
disable_interrupts ( INT_RDA );
cRxBufferWritePtr = cRxBuffer; // point to beginning of buffer
cRxBufferReadPtr = cRxBuffer;
cRxByteCnt = 0;
cRxIsrState = 0;
cRxMsgReady = NO;
cRxMsgTypeDesired = cCode;
enable_interrupts ( INT_RDA );
}
 
#separate char GetRxChar ( void )
{
// Get the next available byte in the recv fifo.
// Call this function ONLY if the recv fifo contains data.
char cValue;
 
cValue = 0;
if ( cRxByteCnt > 0 ) // For safety, check if there is any data
{
cValue = *cRxBufferReadPtr++; // Read byte from fifo
if ( cRxBufferReadPtr == ( cRxBuffer + RX_BUFFER_SIZE ) ) // Did tail ptr wrap ?
{
cRxBufferReadPtr = cRxBuffer; // If so, reset it to start of buffer
}
cRxByteCnt--; // Decrement byte count
}
return ( cValue );
}
 
/* LCD FUNCTIONS ================================= */
 
#separate void LCD_Init ( void )
{
LCD_SetData ( 0x00 );
delay_ms ( 200 ); /* wait enough time after Vdd rise */
output_low ( LCD_RS );
LCD_SetData ( 0x03 ); /* init with specific nibbles to start 4-bit mode */
LCD_PulseEnable();
LCD_PulseEnable();
LCD_PulseEnable();
LCD_SetData ( 0x02 ); /* set 4-bit interface */
LCD_PulseEnable(); /* send dual nibbles hereafter, MSN first */
LCD_PutCmd ( 0x2C ); /* function set (all lines, 5x7 characters) */
LCD_PutCmd ( 0x0C ); /* display ON, cursor off, no blink */
LCD_PutCmd ( 0x01 ); /* clear display */
LCD_PutCmd ( 0x06 ); /* entry mode set, increment & scroll left */
}
 
#separate void LCD_SetPosition ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
LCD_SetData ( swap ( cX ) | 0x08 );
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
}
 
#separate void LCD_PutChar ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
if ( !cSkip )
{
output_high ( LCD_RS );
LCD_SetData ( swap ( cX ) ); /* send high nibble */
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) ); /* send low nibble */
LCD_PulseEnable();
output_low ( LCD_RS );
}
}
 
#separate void LCD_PutCmd ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
LCD_SetData ( swap ( cX ) ); /* send high nibble */
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) ); /* send low nibble */
LCD_PulseEnable();
}
 
#separate void LCD_PulseEnable ( void )
{
output_high ( LCD_EN );
delay_us ( 3 ); // was 10
output_low ( LCD_EN );
delay_ms ( 3 ); // was 5
}
 
#separate void LCD_SetData ( unsigned int cX )
{
output_bit ( LCD_D0, cX & 0x01 );
output_bit ( LCD_D1, cX & 0x02 );
output_bit ( LCD_D2, cX & 0x04 );
output_bit ( LCD_D3, cX & 0x08 );
}
 
/programy/C/PIC/mereni/mereni_ultraz/RUN.PIF
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/mereni_ultraz/Run.BAT
0,0 → 1,6
@echo off
picpgr reset PIC16F84
picpgr run
pause
picpgr stop
pause
/programy/C/PIC/mereni/mereni_ultraz/main.BAK
0,0 → 1,23
#include "D:\@Kaklik\programy\PIC_C\mereni_ultraz\main.h"
#use fast_io(A)
 
void main()
{
 
setup_counters(RTCC_INTERNAL,WDT_18MS);
 
set_tris_A(0b11111100);
output_high(pin_A3);
 
mainloop:
output_high(pin_A0);
output_low(pin_A1);
delay_us(9);
output_high(pin_A1);
output_low(pin_A0);
delay_us(9);
 
goto mainloop;
 
}
 
/programy/C/PIC/mereni/mereni_ultraz/main.HEX
0,0 → 1,9
:1000000000308A000428000084011F308305083076
:100010008C008C1D1328073081018130840000087A
:10002000C0390F3880006400813084000008C03976
:100030000C048000FC306500851505148510023025
:100040008C008C0B21280000000085140510023064
:0E0050008C008C0B2928000000001D28630086
:02400E00F93F78
:00000001FF
;PIC16F84
/programy/C/PIC/mereni/mereni_ultraz/main.LST
0,0 → 1,91
CCS PCW C Compiler, Version 3.110, 15448
 
Filename: d:\@kaklik\programy\pic_c\mereni_ultraz\main.LST
 
ROM used: 47 (5%)
Largest free fragment is 977
RAM used: 2 (3%) at main() level
2 (3%) worst case
Stack: 0 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 004
0003: NOP
.................... #include "D:\@Kaklik\programy\PIC_C\mereni_ultraz\main.h"
.................... #include <16F84.h>
.................... //////// Standard Header file for the PIC16F84 device ////////////////
.................... #device PIC16F84
.................... #list
....................
.................... #use delay(clock=4000000)
.................... #fuses XT,NOWDT
....................
....................
.................... #use fast_io(A)
....................
.................... void main()
.................... {
0004: CLRF 04
0005: MOVLW 1F
0006: ANDWF 03,F
....................
.................... setup_counters(RTCC_INTERNAL,WDT_18MS);
0007: MOVLW 08
0008: MOVWF 0C
0009: BTFSS 0C.3
000A: GOTO 013
000B: MOVLW 07
000C: CLRF 01
000D: MOVLW 81
000E: MOVWF 04
000F: MOVF 00,W
0010: ANDLW C0
0011: IORLW 0F
0012: MOVWF 00
0013: CLRWDT
0014: MOVLW 81
0015: MOVWF 04
0016: MOVF 00,W
0017: ANDLW C0
0018: IORWF 0C,W
0019: MOVWF 00
....................
.................... set_tris_A(0b11111100);
001A: MOVLW FC
001B: TRIS 5
.................... output_high(pin_A3);
001C: BSF 05.3
....................
.................... mainloop:
.................... output_high(pin_A0);
001D: BSF 05.0
.................... output_low(pin_A1);
001E: BCF 05.1
.................... delay_us(9);
001F: MOVLW 02
0020: MOVWF 0C
0021: DECFSZ 0C,F
0022: GOTO 021
0023: NOP
0024: NOP
.................... output_high(pin_A1);
0025: BSF 05.1
.................... output_low(pin_A0);
0026: BCF 05.0
.................... delay_us(9);
0027: MOVLW 02
0028: MOVWF 0C
0029: DECFSZ 0C,F
002A: GOTO 029
002B: NOP
002C: NOP
....................
.................... goto mainloop;
002D: GOTO 01D
....................
.................... }
....................
002E: SLEEP
....................
/programy/C/PIC/mereni/mereni_ultraz/main.PJT
0,0 → 1,32
[PROJECT]
Target=main.HEX
Development_Mode=
Processor=0x684A
ToolSuite=CCS
 
[Directories]
Include=C:\PROGRAM FILES\PICC\devices\;C:\PROGRAM FILES\PICC\dr
Library=
LinkerScript=
 
[Target Data]
FileList=main.c;
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[main.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=main.c
 
[Windows]
0=0000 main.c 0 0 796 451 3 0
 
/programy/C/PIC/mereni/mereni_ultraz/main.SYM
0,0 → 1,13
00C @SCRATCH
00D @SCRATCH
00D _RETURN_
delay_ms.P1
delay_us.P2
 
0004 main
001D mainloop
 
Project Files:
d:\@kaklik\programy\pic_c\mereni_ultraz\main.c
D:\@Kaklik\programy\PIC_C\mereni_ultraz\main.h
C:\PROGRAM FILES\PICC\devices\16F84.h
/programy/C/PIC/mereni/mereni_ultraz/main.c
0,0 → 1,23
#include "D:\@Kaklik\programy\PIC_C\mereni_ultraz\main.h"
#use fast_io(A)
 
void main()
{
 
setup_counters(RTCC_INTERNAL,WDT_18MS);
 
set_tris_A(0b11110100);
output_high(pin_A3);
 
mainloop:
output_high(pin_A0);
output_low(pin_A1);
delay_us(9);
output_high(pin_A1);
output_low(pin_A0);
delay_us(9);
 
goto mainloop;
 
}
 
/programy/C/PIC/mereni/mereni_ultraz/main.cod
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/mereni_ultraz/main.err
0,0 → 1,0
No Errors
/programy/C/PIC/mereni/mereni_ultraz/main.h
0,0 → 1,4
#include <16F84.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
 
/programy/C/PIC/mereni/mereni_ultraz/main.sta
0,0 → 1,27
 
ROM used: 47 (5%)
977 (95%) including unused fragments
 
0 Average locations per line
4 Average locations per statement
 
RAM used: 2 (3%) at main() level
2 (3%) worst case
 
Lines Stmts % Files
----- ----- --- -----
24 11 100 d:\@kaklik\programy\pic_c\mereni_ultraz\main.c
5 0 0 D:\@Kaklik\programy\PIC_C\mereni_ultraz\main.h
111 0 0 C:\PROGRAM FILES\PICC\devices\16F84.h
----- -----
280 22 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 43 91 0 main
 
Segment Used Free
--------- ---- ----
0000-0003 4 0
0004-03FF 43 977
 
/programy/C/PIC/mereni/mereni_ultraz/main.tre
0,0 → 1,3
ÀÄmain
ÀÄmain 0/43 Ram=0
ÀÄ??0??
/programy/C/PIC/mereni/mereni_ultraz/prg.bat
0,0 → 1,6
call picpgr stop
call picpgr erase pic16f84
call picpgr program main.hex hex pic16f84
call picpgr run
pause
call picpgr stop
/programy/C/PIC/mereni/mereni_ultraz/vssver.scc
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/mys/PIC16F88/mys.BAK
0,0 → 1,52
#include "D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.h"
 
#define LCD_RS PIN_B3 // rizeni registru LCD displeje
#define LCD_E PIN_B0 // enable LCD displeje
#define LCD_DATA_LSB PIN_A0 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
#include "C:\library\CCS\lcd.c"
 
#include "C:\library\kaklik\CCS\mys_chip_SPI.c" // modul umoznujici komunikaci s cidlem v mysi
 
void main()
{
unsigned int8 hodnota;
signed int16 x=0,y=0;
signed int8 xd,yd;
 
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_XMIT_L_TO_H|SPI_CLK_DIV_64);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
 
chip_write(OPERATION_MODE);
chip_write(0x00); // vypne sleep mode
chip_write(CONFIGURATION);
chip_write(0b00000110); // nastavi rozliseni na 600cpi
lcd_init();
Delay_ms(200);
While(true)
{
LCD_gotoxy(1,1);
printf(lcd_putc,"status: %X", hodnota);
delay_ms(20);
 
LCD_gotoxy(1,2);
printf(lcd_putc,"X=%ld Y=%ld", x, y);
delay_ms(20);
 
hodnota=chip_read(MOTION_STATUS);
xd=chip_read(DELTA_X);
yd=chip_read(DELTA_Y);
x+=xd;
y+=yd;
}
}
/programy/C/PIC/mereni/mys/PIC16F88/mys.HEX
0,0 → 1,74
:1000000000308A00862900000A108A100A1182072F
:1000100028340C34013406340A108A100A1182077D
:100020007334743461347434753473343A34203432
:100030002534583400348316061183120615280817
:100040009300831614182628831221288312003463
:1000500031308400000803193C280130F800F70112
:10006000F70B3028F80B2F284A30F700F70B36280B
:1000700000000000800B2D2800340508F039B8007E
:1000800037080F393804850006148316061000005F
:10009000831206108316061083120034B508031D60
:1000A0005328861154288615831686118312B60E9E
:1000B0003608B7003D20B60E3608B7003D200D309B
:1000C000F700F70B612800341430B1002820F0301D
:1000D00083168505831286118316861183120610F6
:1000E000831606108312A8012808023C031C8028EE
:1000F0000230B10028200330B7003D20A80A742840
:100100000D30F700F70B82280230B7003D200D308C
:10011000F700F70B8928A8012808023C031C9C283B
:1001200028080420A900B5012908B6004E20023095
:10013000B1002820A80A8C288A11D4290130310264
:10014000B3003208023C031DA7284030B307330830
:100150008038B400B5013408B6004E2000343008B1
:100160000C3A0319BD28063A0319C528073A0319A2
:10017000CB28053A0319D028D528B5010130B6009F
:100180004E200230B1002820E1280130B1000230B9
:10019000B2009E20E1280130B100B2009E20E1288B
:1001A000B5011030B6004E20E12830081F3C031C7A
:1001B000DB280730B0050130B5003008B6004E200E
:1001C000E1280034AA1BF4280F30F700290EF705A8
:1001D0000A3077020318EF283030F707F1282A0891
:1001E000F7077708B000AF200F30A9050A302902C1
:1001F0000318FC283030FE28AA132A08A90729086A
:10020000B000AF208A11EB290408AF00A91F112903
:100210002D30B000AF208403A809A909A80A03194A
:10022000A90A290EF038AB00AB07E23EAC00323E23
:10023000AE0029080F39AC07AC07AE07E93EAD00A8
:10024000AD07AD07280E0F39AD07AE07AD0DAE0DEA
:10025000AE09AE0D28080F39AE07AB0D0730AA0066
:100260000A30AE07AD03031C3129AD07AC03031CF4
:100270003529AC07AB03031C3929AB07AA03031CC0
:100280003D292A30840007302F0584072E300402D0
:10029000031966290008F700031D54292F1A642941
:1002A000AF195629203057290830AF003030F707F2
:1002B000A9010408A8007708AA007708B000AF20B9
:1002C000280884002A08F700840A46290008F70055
:1002D0003030F7077708B000AF20003483160611DE
:1002E000831206152808930083161418792983129F
:1002F0007429061583121308930183161418822992
:1003000083127D2983121308F800003484011F3002
:10031000830583161F129F121B0880399B0007302C
:100320009C001C0883120D13603083168F0083120B
:10033000A201A301A401A50183161F129F121B088D
:1003400080399B0083121F109412831606118614A5
:100350000612323083129400003083169400010894
:10036000C73908388100831290010030F8009200EC
:1003700000308316920007309C0005080330F70018
:10038000F70BC0291C0883120D1383169D018530BD
:100390008312A8001B20A8011B208630A8001B2068
:1003A0000630A8001B206428C830B1002820013086
:1003B000B100B2009E20A80128080C20A80AF7006E
:1003C000B000AF2008302802031DDC292108A90055
:1003D0003730AA00E2281430B10028200130B100E3
:1003E0000230B2009E205830B000AF203D30B00047
:1003F000AF20103084002308A9002208A80004219F
:100400002030B000AF205930B000AF203D30B000F8
:10041000AF20103084002508A9002408A80004217A
:100420001430B10028200230A8006E217808A10005
:100430000330A8006E217808A6000430A8006E21C1
:100440007808A700FA012608A61BFA03A2070318DA
:10045000A30A7A08A307FA012708A71BFA03A4072F
:0C0460000318A50A7A08A507D729630035
:04400E00793FFF3FB8
:00000001FF
;PIC16F88
/programy/C/PIC/mereni/mys/PIC16F88/mys.LST
0,0 → 1,829
CCS PCM C Compiler, Version 3.221, 27853 26-XII-05 16:54
 
Filename: D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.LST
 
ROM used: 566 words (14%)
Largest free fragment is 2048
RAM used: 13 (7%) at main() level
30 (17%) worst case
Stack: 5 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 186
0003: NOP
.................... #include "D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.h"
.................... #include <16F88.h>
.................... //////// Standard Header file for the PIC16F88 device ////////////////
.................... #device PIC16F88
.................... #list
....................
.................... #device adc=8
.................... #fuses NOWDT,INTRC, NOPUT, MCLR, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, FCMEN, IESO
.................... #use delay(clock=4000000)
*
0028: MOVLW 31
0029: MOVWF 04
002A: MOVF 00,W
002B: BTFSC 03.2
002C: GOTO 03C
002D: MOVLW 01
002E: MOVWF 78
002F: CLRF 77
0030: DECFSZ 77,F
0031: GOTO 030
0032: DECFSZ 78,F
0033: GOTO 02F
0034: MOVLW 4A
0035: MOVWF 77
0036: DECFSZ 77,F
0037: GOTO 036
0038: NOP
0039: NOP
003A: DECFSZ 00,F
003B: GOTO 02D
003C: RETLW 00
....................
....................
....................
.................... #define LCD_RS PIN_B3 // rizeni registru LCD displeje
.................... #define LCD_E PIN_B0 // enable LCD displeje
.................... #define LCD_DATA_LSB PIN_A0 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
.................... #include "C:\library\CCS\lcd.c"
.................... // LCD modul pro ovladani dvouradkoveho LCD modulu se standardnim Hitachi radicem
.................... // (c)miho 2002,2005
.................... //
.................... // 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
.................... // 0.03 Doplnena procedura lcd_clr pro smazani displeje
.................... //
.................... //
.................... // 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_clr smaze displej
.................... //
.................... // 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
003D: MOVF 05,W
003E: ANDLW F0
003F: MOVWF 38
0040: MOVF 37,W
0041: ANDLW 0F
0042: IORWF 38,W
0043: MOVWF 05
.................... #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
0044: BSF 06.0
0045: BSF 03.5
0046: BCF 06.0
.................... delay_us(1); // pockej alespon 450ns od e nebo alespon 195ns od dat
0047: NOP
.................... output_bit(LCD_E,0); // sestupna hrana (minimalni perioda e je 1us)
0048: BCF 03.5
0049: BCF 06.0
004A: BSF 03.5
004B: BCF 06.0
.................... }
004C: BCF 03.5
004D: RETLW 00
....................
....................
.................... // 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
004E: MOVF 35,F
004F: BTFSS 03.2
0050: GOTO 053
0051: BCF 06.3
0052: GOTO 054
0053: BSF 06.3
0054: BSF 03.5
0055: BCF 06.3
.................... swap(n);
0056: BCF 03.5
0057: SWAPF 36,F
.................... lcd_send_nibble(n); // posli horni pulku bajtu
0058: MOVF 36,W
0059: MOVWF 37
005A: CALL 03D
.................... swap(n);
005B: SWAPF 36,F
.................... lcd_send_nibble(n); // posli spodni pulku bajtu
005C: MOVF 36,W
005D: MOVWF 37
005E: CALL 03D
.................... delay_us(40); // minimalni doba na provedeni prikazu
005F: MOVLW 0D
0060: MOVWF 77
0061: DECFSZ 77,F
0062: GOTO 061
.................... }
0063: RETLW 00
....................
....................
.................... // 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
0064: MOVLW 14
0065: MOVWF 31
0066: CALL 028
....................
.................... #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
0067: MOVLW F0
0068: BSF 03.5
0069: ANDWF 05,F
.................... #endif
....................
.................... output_bit(LCD_RS,0); // nastav jako vystup a nastav klidovy stav
006A: BCF 03.5
006B: BCF 06.3
006C: BSF 03.5
006D: BCF 06.3
.................... output_bit(LCD_E, 0); // nastav jako vystup a nastav klidovy stav
006E: BCF 03.5
006F: BCF 06.0
0070: BSF 03.5
0071: BCF 06.0
....................
.................... for (i=0; i<3; i++) // nastav lcd do rezimu 8 bitu sbernice
0072: BCF 03.5
0073: CLRF 28
0074: MOVF 28,W
0075: SUBLW 02
0076: BTFSS 03.0
0077: GOTO 080
.................... {
.................... delay_ms(2); // muze byt rozdelany prenos dat (2x 4 bity) nebo pomaly povel
0078: MOVLW 02
0079: MOVWF 31
007A: CALL 028
.................... lcd_send_nibble(3); // rezim 8 bitu
007B: MOVLW 03
007C: MOVWF 37
007D: CALL 03D
.................... }
007E: INCF 28,F
007F: GOTO 074
....................
.................... delay_us(40); // cas na zpracovani
0080: MOVLW 0D
0081: MOVWF 77
0082: DECFSZ 77,F
0083: GOTO 082
.................... lcd_send_nibble(2); // nastav rezim 4 bitu (plati od nasledujiciho prenosu)
0084: MOVLW 02
0085: MOVWF 37
0086: CALL 03D
.................... delay_us(40); // cas na zpracovani
0087: MOVLW 0D
0088: MOVWF 77
0089: DECFSZ 77,F
008A: GOTO 089
....................
.................... for (i=0;i<3;i++) // proved inicializaci (nastaveni modu, smazani apod)
008B: CLRF 28
008C: MOVF 28,W
008D: SUBLW 02
008E: BTFSS 03.0
008F: GOTO 09C
.................... {
.................... lcd_send_byte(0,LCD_INIT_STRING[i]);
0090: MOVF 28,W
0091: CALL 004
0092: MOVWF 29
0093: CLRF 35
0094: MOVF 29,W
0095: MOVWF 36
0096: CALL 04E
.................... delay_ms(2);
0097: MOVLW 02
0098: MOVWF 31
0099: CALL 028
.................... }
009A: INCF 28,F
009B: GOTO 08C
.................... }
009C: BCF 0A.3
009D: GOTO 1D4 (RETURN)
....................
....................
.................... // Proved presun kurzoru
.................... //
.................... // Pozice 1.1 je domu
.................... //
.................... void lcd_gotoxy( BYTE x, BYTE y)
.................... {
....................
.................... BYTE Adr;
....................
.................... Adr=x-1;
009E: MOVLW 01
009F: SUBWF 31,W
00A0: MOVWF 33
.................... if(y==2)
00A1: MOVF 32,W
00A2: SUBLW 02
00A3: BTFSS 03.2
00A4: GOTO 0A7
.................... Adr+=LCD_LINE_2;
00A5: MOVLW 40
00A6: ADDWF 33,F
....................
.................... lcd_send_byte(0,0x80|Adr);
00A7: MOVF 33,W
00A8: IORLW 80
00A9: MOVWF 34
00AA: CLRF 35
00AB: MOVF 34,W
00AC: MOVWF 36
00AD: CALL 04E
.................... }
00AE: RETLW 00
....................
....................
.................... // Zapis znaku na displej, zpracovani ridicich znaku
.................... //
.................... void lcd_putc( char c)
.................... {
....................
.................... switch (c)
.................... {
00AF: MOVF 30,W
00B0: XORLW 0C
00B1: BTFSC 03.2
00B2: GOTO 0BD
00B3: XORLW 06
00B4: BTFSC 03.2
00B5: GOTO 0C5
00B6: XORLW 07
00B7: BTFSC 03.2
00B8: GOTO 0CB
00B9: XORLW 05
00BA: BTFSC 03.2
00BB: GOTO 0D0
00BC: GOTO 0D5
.................... case '\f' : lcd_send_byte(0,1); // smaz displej
00BD: CLRF 35
00BE: MOVLW 01
00BF: MOVWF 36
00C0: CALL 04E
.................... delay_ms(2);
00C1: MOVLW 02
00C2: MOVWF 31
00C3: CALL 028
.................... break;
00C4: GOTO 0E1
.................... case '\n' : lcd_gotoxy(1,2); break; // presun se na 1. znak 2. radky
00C5: MOVLW 01
00C6: MOVWF 31
00C7: MOVLW 02
00C8: MOVWF 32
00C9: CALL 09E
00CA: GOTO 0E1
.................... case '\r' : lcd_gotoxy(1,1); break; // presun home
00CB: MOVLW 01
00CC: MOVWF 31
00CD: MOVWF 32
00CE: CALL 09E
00CF: GOTO 0E1
.................... case '\b' : lcd_send_byte(0,0x10); break; // posun kurzor o 1 zpet
00D0: CLRF 35
00D1: MOVLW 10
00D2: MOVWF 36
00D3: CALL 04E
00D4: GOTO 0E1
.................... default : if (c<0x20) c&=0x7; // preklopeni definovatelnych znaku na rozsah 0 az 0x1F
00D5: MOVF 30,W
00D6: SUBLW 1F
00D7: BTFSS 03.0
00D8: GOTO 0DB
00D9: MOVLW 07
00DA: ANDWF 30,F
.................... lcd_send_byte(1,c); break; // zapis znak
00DB: MOVLW 01
00DC: MOVWF 35
00DD: MOVF 30,W
00DE: MOVWF 36
00DF: CALL 04E
00E0: GOTO 0E1
.................... }
.................... }
00E1: RETLW 00
....................
....................
.................... // 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_);
.................... }
....................
....................
.................... // Smaz displej
.................... //
.................... void lcd_clr()
.................... {
.................... lcd_putc('\f');
.................... }
....................
....................
.................... // 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);
.................... //}
....................
....................
.................... #include "C:\library\kaklik\CCS\mys_chip_SPI.c" // modul umoznujici komunikaci s cidlem v mysi
.................... ////////////////////////////////////////////////////////////////////////////////
.................... //
.................... // Modul pro prime ovladani senzoru v opticke mysi.
.................... // (Pouziva SPI jednotku)
.................... //
.................... //
.................... ////////////////////////////////////////////////////////////////////////////////
....................
.................... #define SPI_DATA PIN_B2 // je treba nadefinovat datovy pin, aby se vedelo, ktery pin se ma vypinat pri cteni dat.
....................
.................... // Address
.................... #define PRODUCT_ID 0x00
.................... #define PRODUCT_ID4 0x01
.................... #define MOTION_STATUS 0x02 //
.................... #define DELTA_X 0x03 // vycteni os
.................... #define DELTA_Y 0x04 // -//-
.................... #define OPERATION_MODE 0x85 // zapis do ridiciho registru
.................... #define CONFIGURATION 0x86 // zmeni nastaveni rozliseni, atd.
....................
.................... void chip_write(command)
.................... {
.................... output_high(PIN_B2);
*
001B: BSF 03.5
001C: BCF 06.2
001D: BCF 03.5
001E: BSF 06.2
.................... spi_write(command);
001F: MOVF 28,W
0020: MOVWF 13
0021: BSF 03.5
0022: BTFSC 14.0
0023: GOTO 026
0024: BCF 03.5
0025: GOTO 021
.................... }
0026: BCF 03.5
0027: RETLW 00
....................
.................... signed int8 chip_read(command)
.................... {
.................... output_high(SPI_DATA);
*
016E: BSF 03.5
016F: BCF 06.2
0170: BCF 03.5
0171: BSF 06.2
.................... spi_write(command);
0172: MOVF 28,W
0173: MOVWF 13
0174: BSF 03.5
0175: BTFSC 14.0
0176: GOTO 179
0177: BCF 03.5
0178: GOTO 174
.................... output_float(SPI_DATA);
0179: BSF 06.2
.................... return spi_read(0);
017A: BCF 03.5
017B: MOVF 13,W
017C: CLRF 13
017D: BSF 03.5
017E: BTFSC 14.0
017F: GOTO 182
0180: BCF 03.5
0181: GOTO 17D
0182: BCF 03.5
0183: MOVF 13,W
0184: MOVWF 78
.................... }
0185: RETLW 00
....................
....................
.................... void main()
.................... {
0186: CLRF 04
0187: MOVLW 1F
0188: ANDWF 03,F
0189: BSF 03.5
018A: BCF 1F.4
018B: BCF 1F.5
018C: MOVF 1B,W
018D: ANDLW 80
018E: MOVWF 1B
018F: MOVLW 07
0190: MOVWF 1C
0191: MOVF 1C,W
0192: BCF 03.5
0193: BCF 0D.6
0194: MOVLW 60
0195: BSF 03.5
0196: MOVWF 0F
.................... unsigned int8 hodnota;
.................... signed int16 x=0,y=0;
0197: BCF 03.5
0198: CLRF 22
0199: CLRF 23
019A: CLRF 24
019B: CLRF 25
.................... signed int8 xd,yd;
....................
.................... setup_adc_ports(NO_ANALOGS|VSS_VDD);
019C: BSF 03.5
019D: BCF 1F.4
019E: BCF 1F.5
019F: MOVF 1B,W
01A0: ANDLW 80
01A1: MOVWF 1B
.................... setup_adc(ADC_OFF);
01A2: BCF 03.5
01A3: BCF 1F.0
.................... setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_XMIT_L_TO_H|SPI_CLK_DIV_64);
01A4: BCF 14.5
01A5: BSF 03.5
01A6: BCF 06.2
01A7: BSF 06.1
01A8: BCF 06.4
01A9: MOVLW 32
01AA: BCF 03.5
01AB: MOVWF 14
01AC: MOVLW 00
01AD: BSF 03.5
01AE: MOVWF 14
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
01AF: MOVF 01,W
01B0: ANDLW C7
01B1: IORLW 08
01B2: MOVWF 01
.................... setup_timer_1(T1_DISABLED);
01B3: BCF 03.5
01B4: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
01B5: MOVLW 00
01B6: MOVWF 78
01B7: MOVWF 12
01B8: MOVLW 00
01B9: BSF 03.5
01BA: MOVWF 12
.................... setup_comparator(NC_NC_NC_NC);
01BB: MOVLW 07
01BC: MOVWF 1C
01BD: MOVF 05,W
01BE: MOVLW 03
01BF: MOVWF 77
01C0: DECFSZ 77,F
01C1: GOTO 1C0
01C2: MOVF 1C,W
01C3: BCF 03.5
01C4: BCF 0D.6
.................... setup_vref(FALSE);
01C5: BSF 03.5
01C6: CLRF 1D
....................
.................... chip_write(OPERATION_MODE);
01C7: MOVLW 85
01C8: BCF 03.5
01C9: MOVWF 28
01CA: CALL 01B
.................... chip_write(0x00); // vypne sleep mode
01CB: CLRF 28
01CC: CALL 01B
....................
.................... chip_write(CONFIGURATION);
01CD: MOVLW 86
01CE: MOVWF 28
01CF: CALL 01B
.................... chip_write(0b00000110); // nastavi rozliseni na 600cpi
01D0: MOVLW 06
01D1: MOVWF 28
01D2: CALL 01B
....................
.................... lcd_init();
01D3: GOTO 064
.................... Delay_ms(200);
01D4: MOVLW C8
01D5: MOVWF 31
01D6: CALL 028
....................
.................... While(true)
.................... {
.................... LCD_gotoxy(1,1);
01D7: MOVLW 01
01D8: MOVWF 31
01D9: MOVWF 32
01DA: CALL 09E
.................... printf(lcd_putc,"status: %X", hodnota);
01DB: CLRF 28
01DC: MOVF 28,W
01DD: CALL 00C
01DE: INCF 28,F
01DF: MOVWF 77
01E0: MOVWF 30
01E1: CALL 0AF
01E2: MOVLW 08
01E3: SUBWF 28,W
01E4: BTFSS 03.2
01E5: GOTO 1DC
01E6: MOVF 21,W
01E7: MOVWF 29
01E8: MOVLW 37
01E9: MOVWF 2A
01EA: GOTO 0E2
.................... delay_ms(20);
01EB: MOVLW 14
01EC: MOVWF 31
01ED: CALL 028
....................
.................... LCD_gotoxy(1,2);
01EE: MOVLW 01
01EF: MOVWF 31
01F0: MOVLW 02
01F1: MOVWF 32
01F2: CALL 09E
.................... printf(lcd_putc,"X=%ld Y=%ld", x, y);
01F3: MOVLW 58
01F4: MOVWF 30
01F5: CALL 0AF
01F6: MOVLW 3D
01F7: MOVWF 30
01F8: CALL 0AF
01F9: MOVLW 10
01FA: MOVWF 04
01FB: MOVF 23,W
01FC: MOVWF 29
01FD: MOVF 22,W
01FE: MOVWF 28
01FF: CALL 104
0200: MOVLW 20
0201: MOVWF 30
0202: CALL 0AF
0203: MOVLW 59
0204: MOVWF 30
0205: CALL 0AF
0206: MOVLW 3D
0207: MOVWF 30
0208: CALL 0AF
0209: MOVLW 10
020A: MOVWF 04
020B: MOVF 25,W
020C: MOVWF 29
020D: MOVF 24,W
020E: MOVWF 28
020F: CALL 104
.................... delay_ms(20);
0210: MOVLW 14
0211: MOVWF 31
0212: CALL 028
....................
.................... hodnota=chip_read(MOTION_STATUS);
0213: MOVLW 02
0214: MOVWF 28
0215: CALL 16E
0216: MOVF 78,W
0217: MOVWF 21
....................
.................... xd=chip_read(DELTA_X);
0218: MOVLW 03
0219: MOVWF 28
021A: CALL 16E
021B: MOVF 78,W
021C: MOVWF 26
.................... yd=chip_read(DELTA_Y);
021D: MOVLW 04
021E: MOVWF 28
021F: CALL 16E
0220: MOVF 78,W
0221: MOVWF 27
....................
.................... x+=xd;
0222: CLRF 7A
0223: MOVF 26,W
0224: BTFSC 26.7
0225: DECF 7A,F
0226: ADDWF 22,F
0227: BTFSC 03.0
0228: INCF 23,F
0229: MOVF 7A,W
022A: ADDWF 23,F
.................... y+=yd;
022B: CLRF 7A
022C: MOVF 27,W
022D: BTFSC 27.7
022E: DECF 7A,F
022F: ADDWF 24,F
0230: BTFSC 03.0
0231: INCF 25,F
0232: MOVF 7A,W
0233: ADDWF 25,F
.................... }
0234: GOTO 1D7
.................... }
....................
0235: SLEEP
 
Configuration Fuses:
Word 1: 3F79 NOWDT NOPUT MCLR BROWNOUT NOLVP NOCPD NOWRT NODEBUG CCPB0 NOPROTECT INTRC
Word 2: 3FFF FCMEN IESO
/programy/C/PIC/mereni/mys/PIC16F88/mys.PJT
0,0 → 1,39
[PROJECT]
Target=mys.HEX
Development_Mode=
Processor=0x688F
ToolSuite=CCS
 
[Directories]
Include=C:\Program Files\PICC\devices\;C:\Program Files\PICC\dr
Library=
LinkerScript=
 
[Target Data]
FileList=mys.c;
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[mys.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=mys.c
 
[Windows]
0=0000 mys.c 0 0 796 451 3 0
 
[Opened Files]
1=D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.c
2=C:\library\kaklik\CCS\mys_chip_SPI.c
3=D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.h
4=C:\Program Files\PICC\devices\16F88.h
5=C:\library\CCS\lcd.c
6=
/programy/C/PIC/mereni/mys/PIC16F88/mys.SYM
0,0 → 1,79
015-016 CCP_1
015 CCP_1_LOW
016 CCP_1_HIGH
021 main.hodnota
022-023 main.x
024-025 main.y
026 main.xd
027 main.yd
028 chip_write.command
028 lcd_init.i
028 chip_read.command
028-029 @PRINTF_LD_278.P1
028 main.@SCRATCH
029 @PRINTF_X_278.P1
029 lcd_init.@SCRATCH
02A @PRINTF_X_278.P1
02A @PRINTF_LD_278.@SCRATCH
02B @PRINTF_LD_278.@SCRATCH
02C @PRINTF_LD_278.@SCRATCH
02D @PRINTF_LD_278.@SCRATCH
02E @PRINTF_LD_278.@SCRATCH
02F @PRINTF_LD_278.@SCRATCH
030 lcd_putc.c
031 @delay_ms1.P1
031 lcd_gotoxy.x
032 lcd_gotoxy.y
033 lcd_gotoxy.Adr
034 lcd_gotoxy.@SCRATCH
035 lcd_send_byte.Adr
036 lcd_send_byte.n
037 lcd_send_nibble.n
038 lcd_send_nibble.@SCRATCH
039 lcd_send_nibble.@SCRATCH
077 @SCRATCH
078 @SCRATCH
078 _RETURN_
079 @SCRATCH
07A @SCRATCH
07B @SCRATCH
09C.6 C1OUT
09C.7 C2OUT
 
0028 @delay_ms1
0004 @const27
003D lcd_send_nibble
004E lcd_send_byte
0064 lcd_init
009E lcd_gotoxy
00AF lcd_putc
001B chip_write
016E chip_read
0186 main
000C @const10113
00E2 @PRINTF_X_278
0104 @PRINTF_LD_278
0186 @cinit
 
Project Files:
D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.c
D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.h
C:\Program Files\PICC\devices\16F88.h
C:\library\CCS\lcd.c
C:\library\kaklik\CCS\mys_chip_SPI.c
 
Compiler Settings:
Processor: PIC16F88
Pointer Size: 8
ADC Range: 0-255
Opt Level: 9
Short,Int,Long: 1,8,16
 
Output Files:
Errors: D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.err
INHX8: D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.HEX
Symbols: D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.SYM
List: D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.LST
Debug/COFF: D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.cof
Call Tree: D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.tre
Statistics: D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.sta
/programy/C/PIC/mereni/mys/PIC16F88/mys.c
0,0 → 1,52
#include "D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.h"
 
#define LCD_RS PIN_B3 // rizeni registru LCD displeje
#define LCD_E PIN_B0 // enable LCD displeje
#define LCD_DATA_LSB PIN_A0 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
#include "C:\library\CCS\lcd.c"
 
#include "C:\library\kaklik\CCS\mys_chip_SPI.c" // modul umoznujici komunikaci s cidlem v mysi
 
void main()
{
unsigned int8 hodnota;
signed int16 x=0,y=0;
signed int8 xd,yd;
 
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_XMIT_L_TO_H|SPI_CLK_DIV_64);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
 
chip_write(OPERATION_MODE);
chip_write(0x00); // vypne sleep mode
chip_write(CONFIGURATION);
chip_write(0b00000110); // nastavi rozliseni na 600cpi
lcd_init();
Delay_ms(200);
While(true)
{
LCD_gotoxy(1,1);
printf(lcd_putc,"status: %X", hodnota);
delay_ms(20);
 
LCD_gotoxy(1,2);
printf(lcd_putc,"X=%ld Y=%ld", x, y);
delay_ms(20);
 
hodnota=chip_read(MOTION_STATUS);
xd=chip_read(DELTA_X); //precte z cidla zmenu polohy
yd=chip_read(DELTA_Y);
x+=xd;
y+=yd;
}
}
/programy/C/PIC/mereni/mys/PIC16F88/mys.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/mys/PIC16F88/mys.err
0,0 → 1,0
No Errors
/programy/C/PIC/mereni/mys/PIC16F88/mys.h
0,0 → 1,5
#include <16F88.h>
#device adc=8
#fuses NOWDT,INTRC, NOPUT, MCLR, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, FCMEN, IESO
#use delay(clock=4000000)
 
/programy/C/PIC/mereni/mys/PIC16F88/mys.sta
0,0 → 1,42
 
ROM used: 566 (14%)
566 (14%) including unused fragments
 
1 Average locations per line
7 Average locations per statement
 
RAM used: 13 (7%) at main() level
30 (17%) worst case
 
Lines Stmts % Files
----- ----- --- -----
53 27 34 D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.c
6 0 0 D:\KAKLIK\programy\PIC_C\mereni\mys\PIC16F88\mys.h
275 0 0 C:\Program Files\PICC\devices\16F88.h
312 47 44 C:\library\CCS\lcd.c
33 6 4 C:\library\kaklik\CCS\mys_chip_SPI.c
----- -----
1358 160 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 21 4 1 @delay_ms1
0 8 1 0 @const27
0 17 3 3 lcd_send_nibble
0 22 4 2 lcd_send_byte
0 58 10 2 lcd_init
0 17 3 4 lcd_gotoxy
0 51 9 1 lcd_putc
0 13 2 1 chip_write
0 24 4 1 chip_read
0 176 31 8 main
0 15 3 0 @const10113
0 34 6 2 @PRINTF_X_278
0 106 19 8 @PRINTF_LD_278
 
Segment Used Free
--------- ---- ----
00000-00003 4 0
00004-007FF 562 1482
00800-00FFF 0 2048
 
/programy/C/PIC/mereni/mys/PIC16F88/mys.tre
0,0 → 1,301
ÀÄmys
ÀÄmain 0/176 Ram=8
ÃÄ??0??
ÃÄchip_write 0/13 Ram=1
ÃÄchip_write 0/13 Ram=1
ÃÄchip_write 0/13 Ram=1
ÃÄchip_write 0/13 Ram=1
ÃÄlcd_init 0/58 Ram=2
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@const27 0/8 Ram=0
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄ@delay_ms1 0/21 Ram=1
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄlcd_gotoxy 0/17 Ram=4
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@const10113 0/15 Ram=0
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@PRINTF_X_278 0/34 Ram=2
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄlcd_gotoxy 0/17 Ram=4
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@PRINTF_LD_278 0/106 Ram=8
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@PRINTF_LD_278 0/106 Ram=8
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ³ ÀÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/17 Ram=3
³ ÀÄlcd_send_nibble 0/17 Ram=3
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄchip_read 0/24 Ram=1
ÃÄchip_read 0/24 Ram=1
ÀÄchip_read 0/24 Ram=1
/programy/C/PIC/mereni/mys/mys.JPG
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/otmer/16F873/LCD.C
0,0 → 1,311
// LCD modul pro ovladani dvouradkoveho LCD modulu se standardnim Hitachi radicem
// (c)miho 2002,2005
//
// 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
// 0.03 Doplnena procedura lcd_clr pro smazani displeje
//
//
// 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_clr smaze displej
//
// 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_);
}
 
 
// Smaz displej
//
void lcd_clr()
{
lcd_putc('\f');
}
 
 
// 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);
//}
/programy/C/PIC/mereni/otmer/16F873/otmer.BAK
0,0 → 1,44
#include "D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.h"
 
//Definice portu: // Datovy port displeje pripojeny na 4 bity za sebou na jeden port
 
#define LCD_RS PIN_B1 // rizeni registru LCD displeje
#define LCD_E PIN_B0 // enable LCD displeje
#define LCD_DATA_LSB PIN_C4 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
 
#include "LCD.C"
 
#define DATA PIN_A1
#define CP PIN_A0
#define STROBE PIN_A2
 
#include "C:\library\kaklik\ccs\shift_reg.c"
 
void main()
{
unsigned int16 otacky;
 
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_2);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_OFF);
 
lcd_init();
 
while (true)
{
set_timer1(0);
 
Delay_ms(500);
otacky=get_timer1();
otacky=otacky*40;
 
LCD_gotoxy(2,2);
printf(lcd_putc,"otacky:%lu ot/min ",otacky);
}
 
}
/programy/C/PIC/mereni/otmer/16F873/otmer.HEX
0,0 → 1,64
:1000000000308A00582900000A108A100A1182075D
:1000100028340C34013406340A108A100A1182077D
:100020006F347434613463346B3479343A34253446
:100030006C34753420346F3474342F346D34693437
:100040006E34203420340034323084000008031928
:1000500038280130A100A001A00B2C28A10B2B28CF
:100060004A30A000A00B322800000000800B292895
:10007000003407080F39B900380EA000F030A00591
:100080002008F03939048700061483160610000092
:10009000831206108316061083120034B608031D5F
:1000A0005328861054288614831686108312B70EA0
:1000B0003708B8003920B70E3708B80039200D309E
:1000C000A000A00B612800341430B20024200F30AF
:1000D00083168705831286108316861083120610F6
:1000E000831606108312A8012808023C031C8028EE
:1000F0000230B20024200330B8003920A80A742846
:100100000D30A000A00B82280230B80039200D303D
:10011000A000A00B8928A8012808023C031C9C28E9
:1001200028080420A900B6012908B7004E20023093
:10013000B2002420A80A8C288A119C291030A00023
:10014000A301AC01A90CA80C031CAC282A08A30726
:100150000318AC0A2B08AC07AC0CA30CA20CA10C26
:10016000A00BA2288A11B92901303202B400330849
:10017000023C031DBD284030B40734088038B50068
:10018000B6013508B7004E20003431080C3A031987
:10019000D328063A0319DB28073A0319E128053A60
:1001A0000319E628EB28B6010130B7004E200230D3
:1001B000B2002420F7280130B2000230B300B4208E
:1001C000F7280130B200B300B420F728B601103090
:1001D000B7004E20F72831081F3C031CF1280730D8
:1001E000B1050130B6003108B7004E20F7280034C1
:1001F0000408B0002A0EF038AC00AC07E23EAD00B7
:10020000323EAF002A080F39AD07AD07AF07E93E10
:10021000AE00AE07AE07290E0F39AE07AF07AE0D21
:10022000AF0DAF09AF0D29080F39AF07AC0D07307F
:10023000AB000A30AF07AE03031C1A29AE07AD03AB
:10024000031C1E29AD07AC03031C2229AC07AB031A
:10025000031C26292B3084000730300584072F30FB
:10026000040203194F290008A000031D3D29301A7C
:100270004D29B0193F29203040290830B0003030D6
:10028000A007AA010408A9002008AB002008B100BB
:10029000C520290884002B08A000840A2F29000803
:1002A000A0003030A0072008B100C5208A11D8294D
:1002B00084011F30830583161F149F141F159F117F
:1002C000FF308312A50083161F149F141F159F1162
:1002D00083121F109412A51225088316870083121B
:1002E00025162508831687008312A5112508831675
:1002F0008700003083129400831694000108C739E8
:10030000383881009730831290000030A1009200AD
:10031000003083169200831225112508831687006A
:10032000831207110C309700A51425088316870047
:1003300083129D019D0164288F018E010230A80067
:10034000FA30B2002420A80BA0290F08A3000E0841
:10035000A0000F082302031DA5292008A6002308DA
:10036000A7002708A9002608A800AB012830AA008A
:100370009E282208A7002108A6002608A00027081A
:10038000A300C2290230B200B300B420A80128089B
:100390000C20A80AA000B100C52007302802031DC8
:1003A000C729103084002708AA002608A900F828C9
:1003B0000A30A90029080C20A90AA000B100C52014
:0C03C00013302902031DDA299C29630078
:02400E00793FF8
:00000001FF
;PIC16F873
/programy/C/PIC/mereni/otmer/16F873/otmer.LST
0,0 → 1,762
CCS PCM C Compiler, Version 3.221, 27853 19-VIII-05 18:09
 
Filename: D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.LST
 
ROM used: 486 words (12%)
Largest free fragment is 2048
RAM used: 10 (5%) at main() level
27 (14%) worst case
Stack: 5 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 158
0003: NOP
.................... #include "D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.h"
.................... #include <16F873.h>
.................... //////// Standard Header file for the PIC16F873 device ////////////////
.................... #device PIC16F873
.................... #list
....................
.................... #device adc=8
.................... #fuses NOWDT,XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
.................... #use delay(clock=4000000)
*
0024: MOVLW 32
0025: MOVWF 04
0026: MOVF 00,W
0027: BTFSC 03.2
0028: GOTO 038
0029: MOVLW 01
002A: MOVWF 21
002B: CLRF 20
002C: DECFSZ 20,F
002D: GOTO 02C
002E: DECFSZ 21,F
002F: GOTO 02B
0030: MOVLW 4A
0031: MOVWF 20
0032: DECFSZ 20,F
0033: GOTO 032
0034: NOP
0035: NOP
0036: DECFSZ 00,F
0037: GOTO 029
0038: RETLW 00
....................
....................
....................
.................... //Definice portu: // Datovy port displeje pripojeny na 4 bity za sebou na jeden port
....................
.................... #define LCD_RS PIN_B1 // rizeni registru LCD displeje
.................... #define LCD_E PIN_B0 // enable LCD displeje
.................... #define LCD_DATA_LSB PIN_C4 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
....................
.................... #include "LCD.C"
.................... // LCD modul pro ovladani dvouradkoveho LCD modulu se standardnim Hitachi radicem
.................... // (c)miho 2002,2005
.................... //
.................... // 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
.................... // 0.03 Doplnena procedura lcd_clr pro smazani displeje
.................... //
.................... //
.................... // 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_clr smaze displej
.................... //
.................... // 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
0039: MOVF 07,W
003A: ANDLW 0F
003B: MOVWF 39
003C: SWAPF 38,W
003D: MOVWF 20
003E: MOVLW F0
003F: ANDWF 20,F
0040: MOVF 20,W
0041: ANDLW F0
0042: IORWF 39,W
0043: MOVWF 07
.................... #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
0044: BSF 06.0
0045: BSF 03.5
0046: BCF 06.0
.................... delay_us(1); // pockej alespon 450ns od e nebo alespon 195ns od dat
0047: NOP
.................... output_bit(LCD_E,0); // sestupna hrana (minimalni perioda e je 1us)
0048: BCF 03.5
0049: BCF 06.0
004A: BSF 03.5
004B: BCF 06.0
.................... }
004C: BCF 03.5
004D: RETLW 00
....................
....................
.................... // 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
004E: MOVF 36,F
004F: BTFSS 03.2
0050: GOTO 053
0051: BCF 06.1
0052: GOTO 054
0053: BSF 06.1
0054: BSF 03.5
0055: BCF 06.1
.................... swap(n);
0056: BCF 03.5
0057: SWAPF 37,F
.................... lcd_send_nibble(n); // posli horni pulku bajtu
0058: MOVF 37,W
0059: MOVWF 38
005A: CALL 039
.................... swap(n);
005B: SWAPF 37,F
.................... lcd_send_nibble(n); // posli spodni pulku bajtu
005C: MOVF 37,W
005D: MOVWF 38
005E: CALL 039
.................... delay_us(40); // minimalni doba na provedeni prikazu
005F: MOVLW 0D
0060: MOVWF 20
0061: DECFSZ 20,F
0062: GOTO 061
.................... }
0063: RETLW 00
....................
....................
.................... // 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
0064: MOVLW 14
0065: MOVWF 32
0066: CALL 024
....................
.................... #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
0067: MOVLW 0F
0068: BSF 03.5
0069: ANDWF 07,F
.................... #endif
....................
.................... output_bit(LCD_RS,0); // nastav jako vystup a nastav klidovy stav
006A: BCF 03.5
006B: BCF 06.1
006C: BSF 03.5
006D: BCF 06.1
.................... output_bit(LCD_E, 0); // nastav jako vystup a nastav klidovy stav
006E: BCF 03.5
006F: BCF 06.0
0070: BSF 03.5
0071: BCF 06.0
....................
.................... for (i=0; i<3; i++) // nastav lcd do rezimu 8 bitu sbernice
0072: BCF 03.5
0073: CLRF 28
0074: MOVF 28,W
0075: SUBLW 02
0076: BTFSS 03.0
0077: GOTO 080
.................... {
.................... delay_ms(2); // muze byt rozdelany prenos dat (2x 4 bity) nebo pomaly povel
0078: MOVLW 02
0079: MOVWF 32
007A: CALL 024
.................... lcd_send_nibble(3); // rezim 8 bitu
007B: MOVLW 03
007C: MOVWF 38
007D: CALL 039
.................... }
007E: INCF 28,F
007F: GOTO 074
....................
.................... delay_us(40); // cas na zpracovani
0080: MOVLW 0D
0081: MOVWF 20
0082: DECFSZ 20,F
0083: GOTO 082
.................... lcd_send_nibble(2); // nastav rezim 4 bitu (plati od nasledujiciho prenosu)
0084: MOVLW 02
0085: MOVWF 38
0086: CALL 039
.................... delay_us(40); // cas na zpracovani
0087: MOVLW 0D
0088: MOVWF 20
0089: DECFSZ 20,F
008A: GOTO 089
....................
.................... for (i=0;i<3;i++) // proved inicializaci (nastaveni modu, smazani apod)
008B: CLRF 28
008C: MOVF 28,W
008D: SUBLW 02
008E: BTFSS 03.0
008F: GOTO 09C
.................... {
.................... lcd_send_byte(0,LCD_INIT_STRING[i]);
0090: MOVF 28,W
0091: CALL 004
0092: MOVWF 29
0093: CLRF 36
0094: MOVF 29,W
0095: MOVWF 37
0096: CALL 04E
.................... delay_ms(2);
0097: MOVLW 02
0098: MOVWF 32
0099: CALL 024
.................... }
009A: INCF 28,F
009B: GOTO 08C
.................... }
009C: BCF 0A.3
009D: GOTO 19C (RETURN)
....................
....................
.................... // Proved presun kurzoru
.................... //
.................... // Pozice 1.1 je domu
.................... //
.................... void lcd_gotoxy( BYTE x, BYTE y)
.................... {
....................
.................... BYTE Adr;
....................
.................... Adr=x-1;
*
00B4: MOVLW 01
00B5: SUBWF 32,W
00B6: MOVWF 34
.................... if(y==2)
00B7: MOVF 33,W
00B8: SUBLW 02
00B9: BTFSS 03.2
00BA: GOTO 0BD
.................... Adr+=LCD_LINE_2;
00BB: MOVLW 40
00BC: ADDWF 34,F
....................
.................... lcd_send_byte(0,0x80|Adr);
00BD: MOVF 34,W
00BE: IORLW 80
00BF: MOVWF 35
00C0: CLRF 36
00C1: MOVF 35,W
00C2: MOVWF 37
00C3: CALL 04E
.................... }
00C4: RETLW 00
....................
....................
.................... // Zapis znaku na displej, zpracovani ridicich znaku
.................... //
.................... void lcd_putc( char c)
.................... {
....................
.................... switch (c)
.................... {
00C5: MOVF 31,W
00C6: XORLW 0C
00C7: BTFSC 03.2
00C8: GOTO 0D3
00C9: XORLW 06
00CA: BTFSC 03.2
00CB: GOTO 0DB
00CC: XORLW 07
00CD: BTFSC 03.2
00CE: GOTO 0E1
00CF: XORLW 05
00D0: BTFSC 03.2
00D1: GOTO 0E6
00D2: GOTO 0EB
.................... case '\f' : lcd_send_byte(0,1); // smaz displej
00D3: CLRF 36
00D4: MOVLW 01
00D5: MOVWF 37
00D6: CALL 04E
.................... delay_ms(2);
00D7: MOVLW 02
00D8: MOVWF 32
00D9: CALL 024
.................... break;
00DA: GOTO 0F7
.................... case '\n' : lcd_gotoxy(1,2); break; // presun se na 1. znak 2. radky
00DB: MOVLW 01
00DC: MOVWF 32
00DD: MOVLW 02
00DE: MOVWF 33
00DF: CALL 0B4
00E0: GOTO 0F7
.................... case '\r' : lcd_gotoxy(1,1); break; // presun home
00E1: MOVLW 01
00E2: MOVWF 32
00E3: MOVWF 33
00E4: CALL 0B4
00E5: GOTO 0F7
.................... case '\b' : lcd_send_byte(0,0x10); break; // posun kurzor o 1 zpet
00E6: CLRF 36
00E7: MOVLW 10
00E8: MOVWF 37
00E9: CALL 04E
00EA: GOTO 0F7
.................... default : if (c<0x20) c&=0x7; // preklopeni definovatelnych znaku na rozsah 0 az 0x1F
00EB: MOVF 31,W
00EC: SUBLW 1F
00ED: BTFSS 03.0
00EE: GOTO 0F1
00EF: MOVLW 07
00F0: ANDWF 31,F
.................... lcd_send_byte(1,c); break; // zapis znak
00F1: MOVLW 01
00F2: MOVWF 36
00F3: MOVF 31,W
00F4: MOVWF 37
00F5: CALL 04E
00F6: GOTO 0F7
.................... }
.................... }
00F7: RETLW 00
....................
....................
.................... // 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_);
.................... }
....................
....................
.................... // Smaz displej
.................... //
.................... void lcd_clr()
.................... {
.................... lcd_putc('\f');
.................... }
....................
....................
.................... // 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);
.................... //}
....................
....................
.................... #define DATA PIN_A1
.................... #define CP PIN_A0
.................... #define STROBE PIN_A2
....................
.................... #include "C:\library\kaklik\ccs\shift_reg.c"
.................... ////////////////////////////////////////////////////////////////////////////////
.................... // KNIHOVNA PRO OVLADANI POSUVNEHO REGISTRU
.................... //
.................... ////////////////////////////////////////////////////////////////////////////////
.................... // definice:
.................... //#define DATA PIN_A1
.................... //#define CP PIN_A0
.................... //#define STROBE PIN_A2
....................
.................... void putreg(unsigned int8 out) // zapise do registru 8bitovou promenou.
.................... {
.................... int8 i;
.................... output_low(STROBE);
....................
.................... for(i=0;i<=7;i++)
.................... {
.................... output_bit(DATA,bit_test(out,7-i));
.................... output_low(CP);
.................... output_high(CP);
.................... }
.................... output_high(STROBE);
.................... }
....................
.................... void reg_shift_left()
.................... {
.................... output_low(CP);
.................... output_high(CP);
....................
.................... }
....................
.................... void reg_shift_right()
.................... {
.................... }
....................
....................
.................... void main()
.................... {
*
0158: CLRF 04
0159: MOVLW 1F
015A: ANDWF 03,F
015B: BSF 03.5
015C: BSF 1F.0
015D: BSF 1F.1
015E: BSF 1F.2
015F: BCF 1F.3
.................... unsigned int16 otacky;
....................
.................... setup_adc_ports(NO_ANALOGS);
*
0163: BSF 03.5
0164: BSF 1F.0
0165: BSF 1F.1
0166: BSF 1F.2
0167: BCF 1F.3
.................... setup_adc(ADC_OFF);
0168: BCF 03.5
0169: BCF 1F.0
.................... setup_spi(FALSE);
*
0160: MOVLW FF
0161: BCF 03.5
0162: MOVWF 25
*
016A: BCF 14.5
016B: BCF 25.5
016C: MOVF 25,W
016D: BSF 03.5
016E: MOVWF 07
016F: BCF 03.5
0170: BSF 25.4
0171: MOVF 25,W
0172: BSF 03.5
0173: MOVWF 07
0174: BCF 03.5
0175: BCF 25.3
0176: MOVF 25,W
0177: BSF 03.5
0178: MOVWF 07
0179: MOVLW 00
017A: BCF 03.5
017B: MOVWF 14
017C: BSF 03.5
017D: MOVWF 14
.................... setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
017E: MOVF 01,W
017F: ANDLW C7
0180: IORLW 38
0181: MOVWF 01
.................... setup_timer_1(T1_EXTERNAL|T1_DIV_BY_2);
0182: MOVLW 97
0183: BCF 03.5
0184: MOVWF 10
.................... setup_timer_2(T2_DISABLED,0,1);
0185: MOVLW 00
0186: MOVWF 21
0187: MOVWF 12
0188: MOVLW 00
0189: BSF 03.5
018A: MOVWF 12
.................... setup_ccp1(CCP_PWM);
018B: BCF 03.5
018C: BCF 25.2
018D: MOVF 25,W
018E: BSF 03.5
018F: MOVWF 07
0190: BCF 03.5
0191: BCF 07.2
0192: MOVLW 0C
0193: MOVWF 17
.................... setup_ccp2(CCP_OFF);
0194: BSF 25.1
0195: MOVF 25,W
0196: BSF 03.5
0197: MOVWF 07
0198: BCF 03.5
0199: CLRF 1D
019A: CLRF 1D
....................
.................... lcd_init();
019B: GOTO 064
....................
.................... while (true)
.................... {
.................... set_timer1(0);
019C: CLRF 0F
019D: CLRF 0E
....................
.................... Delay_ms(500);
019E: MOVLW 02
019F: MOVWF 28
01A0: MOVLW FA
01A1: MOVWF 32
01A2: CALL 024
01A3: DECFSZ 28,F
01A4: GOTO 1A0
.................... otacky=get_timer1();
01A5: MOVF 0F,W
01A6: MOVWF 23
01A7: MOVF 0E,W
01A8: MOVWF 20
01A9: MOVF 0F,W
01AA: SUBWF 23,W
01AB: BTFSS 03.2
01AC: GOTO 1A5
01AD: MOVF 20,W
01AE: MOVWF 26
01AF: MOVF 23,W
01B0: MOVWF 27
.................... otacky=otacky*40;
01B1: MOVF 27,W
01B2: MOVWF 29
01B3: MOVF 26,W
01B4: MOVWF 28
01B5: CLRF 2B
01B6: MOVLW 28
01B7: MOVWF 2A
01B8: GOTO 09E
01B9: MOVF 22,W
01BA: MOVWF 27
01BB: MOVF 21,W
01BC: MOVWF 26
....................
.................... switch(otacky)
.................... {
01BD: MOVF 26,W
01BE: MOVWF 20
01BF: MOVF 27,W
01C0: MOVWF 23
01C1: GOTO 1C2
....................
.................... }
....................
.................... LCD_gotoxy(2,2);
01C2: MOVLW 02
01C3: MOVWF 32
01C4: MOVWF 33
01C5: CALL 0B4
.................... printf(lcd_putc,"otacky:%lu ot/min ",otacky);
01C6: CLRF 28
01C7: MOVF 28,W
01C8: CALL 00C
01C9: INCF 28,F
01CA: MOVWF 20
01CB: MOVWF 31
01CC: CALL 0C5
01CD: MOVLW 07
01CE: SUBWF 28,W
01CF: BTFSS 03.2
01D0: GOTO 1C7
01D1: MOVLW 10
01D2: MOVWF 04
01D3: MOVF 27,W
01D4: MOVWF 2A
01D5: MOVF 26,W
01D6: MOVWF 29
01D7: GOTO 0F8
01D8: MOVLW 0A
01D9: MOVWF 29
01DA: MOVF 29,W
01DB: CALL 00C
01DC: INCF 29,F
01DD: MOVWF 20
01DE: MOVWF 31
01DF: CALL 0C5
01E0: MOVLW 13
01E1: SUBWF 29,W
01E2: BTFSS 03.2
01E3: GOTO 1DA
.................... }
01E4: GOTO 19C
....................
.................... }
....................
01E5: SLEEP
 
Configuration Fuses:
Word 1: 3F79 XT NOWDT NOPUT NOPROTECT BROWNOUT NOLVP NOCPD NOWRT NODEBUG
/programy/C/PIC/mereni/otmer/16F873/otmer.PJT
0,0 → 1,39
[PROJECT]
Target=otmer.HEX
Development_Mode=
Processor=0x873F
ToolSuite=CCS
 
[Directories]
Include=C:\Program Files\PICC\devices\;C:\Program Files\PICC\drivers\;C:\library\CCS;
Library=
LinkerScript=
 
[Target Data]
FileList=otmer.c;
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[otmer.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=otmer.c
 
[Windows]
0=0000 otmer.c 0 0 796 451 3 0
 
[Opened Files]
1=D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.c
2=D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.h
3=C:\Program Files\PICC\devices\16F873.h
4=D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\LCD.C
5=C:\library\kaklik\ccs\shift_reg.c
6=
/programy/C/PIC/mereni/otmer/16F873/otmer.SYM
0,0 → 1,75
015 CCP_1_LOW
015-016 CCP_1
016 CCP_1_HIGH
01B CCP_2_LOW
01B-01C CCP_2
01C CCP_2_HIGH
020 @SCRATCH
021 @SCRATCH
021 _RETURN_
022 @SCRATCH
023 @SCRATCH
024 @SCRATCH
025 @TRIS_C
026-027 main.otacky
028 lcd_init.i
028-029 @MUL1616.P1
028 main.@SCRATCH
029-02A @PRINTF_LU_263.P1
029 lcd_init.@SCRATCH
029 main.@SCRATCH
02A-02B @MUL1616.P1
02B @PRINTF_LU_263.@SCRATCH
02C @MUL1616.@SCRATCH
02C @PRINTF_LU_263.@SCRATCH
02D @PRINTF_LU_263.@SCRATCH
02E @PRINTF_LU_263.@SCRATCH
02F @PRINTF_LU_263.@SCRATCH
030 @PRINTF_LU_263.@SCRATCH
031 lcd_putc.c
032 @delay_ms1.P1
032 lcd_gotoxy.x
033 lcd_gotoxy.y
034 lcd_gotoxy.Adr
035 lcd_gotoxy.@SCRATCH
036 lcd_send_byte.Adr
037 lcd_send_byte.n
038 lcd_send_nibble.n
039 lcd_send_nibble.@SCRATCH
03A lcd_send_nibble.@SCRATCH
 
0024 @delay_ms1
0004 @const28
0039 lcd_send_nibble
004E lcd_send_byte
0064 lcd_init
00B4 lcd_gotoxy
00C5 lcd_putc
0158 main
009E @MUL1616
000C @const10134
00F8 @PRINTF_LU_263
0158 @cinit
 
Project Files:
D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.c
D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.h
C:\Program Files\PICC\devices\16F873.h
D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\LCD.C
C:\library\kaklik\ccs\shift_reg.c
 
Compiler Settings:
Processor: PIC16F873
Pointer Size: 8
ADC Range: 0-255
Opt Level: 9
Short,Int,Long: 1,8,16
 
Output Files:
Errors: D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.err
INHX8: D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.HEX
Symbols: D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.SYM
List: D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.LST
Debug/COFF: D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.cof
Call Tree: D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.tre
Statistics: D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.sta
/programy/C/PIC/mereni/otmer/16F873/otmer.c
0,0 → 1,49
#include "D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.h"
 
//Definice portu: // Datovy port displeje pripojeny na 4 bity za sebou na jeden port
 
#define LCD_RS PIN_B1 // rizeni registru LCD displeje
#define LCD_E PIN_B0 // enable LCD displeje
#define LCD_DATA_LSB PIN_C4 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
 
#include "LCD.C"
 
#define DATA PIN_A1
#define CP PIN_A0
#define STROBE PIN_A2
 
#include "C:\library\kaklik\ccs\shift_reg.c"
 
void main()
{
unsigned int16 otacky;
 
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_2);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_OFF);
 
lcd_init();
 
while (true)
{
set_timer1(0);
 
Delay_ms(500);
otacky=get_timer1();
otacky=otacky*40;
switch(otacky)
{
}
 
LCD_gotoxy(2,2);
printf(lcd_putc,"otacky:%lu ot/min ",otacky);
}
 
}
/programy/C/PIC/mereni/otmer/16F873/otmer.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/otmer/16F873/otmer.err
0,0 → 1,0
No Errors
/programy/C/PIC/mereni/otmer/16F873/otmer.h
0,0 → 1,5
#include <16F873.h>
#device adc=8
#fuses NOWDT,XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay(clock=4000000)
 
/programy/C/PIC/mereni/otmer/16F873/otmer.sta
0,0 → 1,40
 
ROM used: 486 (12%)
486 (12%) including unused fragments
 
1 Average locations per line
7 Average locations per statement
 
RAM used: 10 (5%) at main() level
27 (14%) worst case
 
Lines Stmts % Files
----- ----- --- -----
50 18 24 D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.c
6 0 0 D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\otmer.h
240 0 0 C:\Program Files\PICC\devices\16F873.h
312 47 51 D:\KAKLIK\programy\PIC_C\mereni\otmer\16F873\LCD.C
34 9 6 C:\library\kaklik\ccs\shift_reg.c
----- -----
1284 148 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 21 4 1 @delay_ms1
0 8 2 0 @const28
0 21 4 3 lcd_send_nibble
0 22 5 2 lcd_send_byte
0 58 12 2 lcd_init
0 17 3 4 lcd_gotoxy
0 51 10 1 lcd_putc
0 142 29 4 main
0 22 5 5 @MUL1616
0 24 5 0 @const10134
0 96 20 8 @PRINTF_LU_263
 
Segment Used Free
--------- ---- ----
00000-00003 4 0
00004-007FF 482 1562
00800-00FFF 0 2048
 
/programy/C/PIC/mereni/otmer/16F873/otmer.tre
0,0 → 1,98
ÀÄotmer
ÀÄmain 0/142 Ram=4
ÃÄ??0??
ÃÄlcd_init 0/58 Ram=2
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÃÄ@const28 0/8 Ram=0
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÀÄ@delay_ms1 0/21 Ram=1
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄ@MUL1616 0/22 Ram=5
ÃÄlcd_gotoxy 0/17 Ram=4
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄ@const10134 0/24 Ram=0
ÃÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄ@PRINTF_LU_263 0/96 Ram=8
³ ÃÄlcd_putc 0/51 Ram=1
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ³ ÃÄ@delay_ms1 0/21 Ram=1
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_putc 0/51 Ram=1
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄ@delay_ms1 0/21 Ram=1
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_gotoxy 0/17 Ram=4
³ ³ ÀÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÃÄlcd_send_byte 0/22 Ram=2
³ ³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ³ ÀÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄ@const10134 0/24 Ram=0
ÀÄlcd_putc 0/51 Ram=1
ÃÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄlcd_gotoxy 0/17 Ram=4
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄlcd_gotoxy 0/17 Ram=4
³ ÀÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÃÄlcd_send_byte 0/22 Ram=2
³ ÃÄlcd_send_nibble 0/21 Ram=3
³ ÀÄlcd_send_nibble 0/21 Ram=3
ÀÄlcd_send_byte 0/22 Ram=2
ÃÄlcd_send_nibble 0/21 Ram=3
ÀÄlcd_send_nibble 0/21 Ram=3
/programy/C/PIC/mereni/otmer/Kopie - otackomer.c
0,0 → 1,27
#include "D:\KAKLIK\programy\PIC_C\mereni\otmer\otackomer.h"
 
#define DATA PIN_A1
#define CP PIN_A0
 
void main()
{
int i;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 
while(true)
{
output_high(DATA);
output_high(CP);
Delay_ms(100);
output_low(CP);
output_low(DATA);
 
for(i=7;i>0;i--)
{
Delay_ms(100);
output_high(CP);
Delay_ms(100);
output_low(CP);
}
}
}
/programy/C/PIC/mereni/otmer/Kopie - otmer.c
0,0 → 1,38
#include "D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.h"
 
#define DATA PIN_A1
#define CP PIN_A0
#define STROBE PIN_A2
 
#include "shift_reg.c"
 
void main()
{
int n=0;
int i;
putreg(1);
while(true)
{
i=1;
for(n=0;n<=7;n++)
{
putreg(i);
i=i<<1;
Delay_ms(50);
};
i=0x80;
for(n=0;n<=7;n++)
{
putreg(i);
i=i>>1;
Delay_ms(50);
};
}
 
while(true)
{
putreg(~n);
Delay_ms(100);
n++;
}
}
/programy/C/PIC/mereni/otmer/otmer.BAK
0,0 → 1,38
#include "D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.h"
 
#define DATA PIN_A1
#define CP PIN_A0
#define STROBE PIN_A2
 
#include "shift_reg.c"
 
void main()
{
int n=0;
int i;
putreg(1);
while(true)
{
i=1;
for(n=0;n<=7;n++)
{
putreg(~i);
i=i<<1;
Delay_ms(50);
};
i=0x80;
for(n=0;n<=7;n++)
{
putreg(~i);
i=i>>1;
Delay_ms(50);
};
}
 
while(true)
{
putreg(~n);
Delay_ms(100);
n++;
}
}
/programy/C/PIC/mereni/otmer/otmer.HEX
0,0 → 1,19
:1000000000308A0044280000831605118312051170
:1000100093011308073C031C2A281308073C94008B
:1000200012088C0014088D0003191A2803108C0C78
:100030008D0B16280C181E2885101F288514831672
:100040008510051083120510831605108312051400
:10005000930A0928831605118312051500341130FF
:10006000840000080319432801308D008C018C0B9B
:1000700037288D0B36284A308C008C0B3D28000029
:100080000000800B3428003484011F3083058F0169
:10009000013092000420013090008F010F08073CCE
:1000A000031C5C281008920004200310900D3230CD
:1000B00091002F208F0A4E28803090008F010F086A
:1000C000073C031C6D281008920004200310900CBC
:1000D000323091002F208F0A5F284B280F089100A3
:1000E0009109110892000420643091002F208F0A9A
:0400F0006E28630013
:02400E00F93F78
:00000001FF
;PIC16F84
/programy/C/PIC/mereni/otmer/otmer.LST
0,0 → 1,216
CCS PCM C Compiler, Version 3.221, 27853 14-VI-05 22:12
 
Filename: D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.LST
 
ROM used: 122 words (12%)
Largest free fragment is 902
RAM used: 5 (7%) at main() level
8 (12%) worst case
Stack: 1 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 044
0003: NOP
.................... #include "D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.h"
.................... #include <16F84.h>
.................... //////// Standard Header file for the PIC16F84 device ////////////////
.................... #device PIC16F84
.................... #list
....................
.................... #fuses NOWDT,XT, NOPUT, NOPROTECT
.................... #use delay(clock=4000000)
*
002F: MOVLW 11
0030: MOVWF 04
0031: MOVF 00,W
0032: BTFSC 03.2
0033: GOTO 043
0034: MOVLW 01
0035: MOVWF 0D
0036: CLRF 0C
0037: DECFSZ 0C,F
0038: GOTO 037
0039: DECFSZ 0D,F
003A: GOTO 036
003B: MOVLW 4A
003C: MOVWF 0C
003D: DECFSZ 0C,F
003E: GOTO 03D
003F: NOP
0040: NOP
0041: DECFSZ 00,F
0042: GOTO 034
0043: RETLW 00
....................
....................
....................
.................... #define DATA PIN_A1
.................... #define CP PIN_A0
.................... #define STROBE PIN_A2
....................
.................... #include "shift_reg.c"
.................... ////////////////////////////////////////////////////////////////////////////////
.................... // KNIHOVNA PRO OVLADANI POSUVNEHO REGISTRU
.................... //
.................... ////////////////////////////////////////////////////////////////////////////////
.................... // definice
.................... //#define DATA PIN_A1
.................... //#define CP PIN_A0
.................... //#define STROBE PIN_A2
....................
.................... void putreg(unsigned int8 out) // zapise do registru 8bitovou promenou.
.................... {
.................... int8 i;
.................... output_low(STROBE);
*
0004: BSF 03.5
0005: BCF 05.2
0006: BCF 03.5
0007: BCF 05.2
....................
.................... for(i=0;i<=7;i++)
0008: CLRF 13
0009: MOVF 13,W
000A: SUBLW 07
000B: BTFSS 03.0
000C: GOTO 02A
.................... {
.................... output_bit(DATA,bit_test(out,7-i));
000D: MOVF 13,W
000E: SUBLW 07
000F: MOVWF 14
0010: MOVF 12,W
0011: MOVWF 0C
0012: MOVF 14,W
0013: MOVWF 0D
0014: BTFSC 03.2
0015: GOTO 01A
0016: BCF 03.0
0017: RRF 0C,F
0018: DECFSZ 0D,F
0019: GOTO 016
001A: BTFSC 0C.0
001B: GOTO 01E
001C: BCF 05.1
001D: GOTO 01F
001E: BSF 05.1
001F: BSF 03.5
0020: BCF 05.1
.................... output_low(CP);
0021: BCF 05.0
0022: BCF 03.5
0023: BCF 05.0
.................... output_high(CP);
0024: BSF 03.5
0025: BCF 05.0
0026: BCF 03.5
0027: BSF 05.0
.................... }
0028: INCF 13,F
0029: GOTO 009
.................... output_high(STROBE);
002A: BSF 03.5
002B: BCF 05.2
002C: BCF 03.5
002D: BSF 05.2
.................... }
002E: RETLW 00
.................... void reg_shift_left()
.................... {
.................... }
.................... void reg_shift_right()
.................... {
.................... }
....................
....................
.................... void main()
.................... {
*
0044: CLRF 04
0045: MOVLW 1F
0046: ANDWF 03,F
.................... int n=0;
0047: CLRF 0F
.................... int i;
.................... putreg(1);
0048: MOVLW 01
0049: MOVWF 12
004A: CALL 004
.................... while(true)
.................... {
.................... i=1;
004B: MOVLW 01
004C: MOVWF 10
.................... for(n=0;n<=7;n++)
004D: CLRF 0F
004E: MOVF 0F,W
004F: SUBLW 07
0050: BTFSS 03.0
0051: GOTO 05C
.................... {
.................... putreg(i);
0052: MOVF 10,W
0053: MOVWF 12
0054: CALL 004
.................... i=i<<1;
0055: BCF 03.0
0056: RLF 10,F
.................... Delay_ms(50);
0057: MOVLW 32
0058: MOVWF 11
0059: CALL 02F
.................... };
005A: INCF 0F,F
005B: GOTO 04E
.................... i=0x80;
005C: MOVLW 80
005D: MOVWF 10
.................... for(n=0;n<=7;n++)
005E: CLRF 0F
005F: MOVF 0F,W
0060: SUBLW 07
0061: BTFSS 03.0
0062: GOTO 06D
.................... {
.................... putreg(i);
0063: MOVF 10,W
0064: MOVWF 12
0065: CALL 004
.................... i=i>>1;
0066: BCF 03.0
0067: RRF 10,F
.................... Delay_ms(50);
0068: MOVLW 32
0069: MOVWF 11
006A: CALL 02F
.................... };
006B: INCF 0F,F
006C: GOTO 05F
.................... }
006D: GOTO 04B
....................
.................... while(true)
.................... {
.................... putreg(~n);
006E: MOVF 0F,W
006F: MOVWF 11
0070: COMF 11,F
0071: MOVF 11,W
0072: MOVWF 12
0073: CALL 004
.................... Delay_ms(100);
0074: MOVLW 64
0075: MOVWF 11
0076: CALL 02F
.................... n++;
0077: INCF 0F,F
.................... }
0078: GOTO 06E
.................... }
....................
0079: SLEEP
 
Configuration Fuses:
Word 1: 3FF9 XT NOWDT NOPUT NOPROTECT
/programy/C/PIC/mereni/otmer/otmer.PJT
0,0 → 1,38
[PROJECT]
Target=otmer.HEX
Development_Mode=
Processor=0x684A
ToolSuite=CCS
 
[Directories]
Include=C:\Program Files\PICC\devices\;C:\Program Files\PICC\dr
Library=
LinkerScript=
 
[Target Data]
FileList=otmer.c;
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[otmer.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=otmer.c
 
[Windows]
0=0000 otmer.c 0 0 796 451 3 0
 
[Opened Files]
1=D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.c
2=D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.h
3=C:\Program Files\PICC\devices\16F84.h
4=
5=
/programy/C/PIC/mereni/otmer/otmer.SYM
0,0 → 1,36
00C @SCRATCH
00D @SCRATCH
00D _RETURN_
00F main.n
010 main.i
011 @delay_ms1.P1
011 main.@SCRATCH
012 putreg.out
013 putreg.i
014 putreg.@SCRATCH
 
002F @delay_ms1
0004 putreg
0044 main
0044 @cinit
 
Project Files:
D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.c
D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.h
C:\Program Files\PICC\devices\16F84.h
D:\KAKLIK\programy\PIC_C\mereni\otmer\shift_reg.c
 
Compiler Settings:
Processor: PIC16F84
Pointer Size: 8
Opt Level: 9
Short,Int,Long: 1,8,16
 
Output Files:
Errors: D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.err
INHX8: D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.HEX
Symbols: D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.SYM
List: D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.LST
Debug/COFF: D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.cof
Call Tree: D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.tre
Statistics: D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.sta
/programy/C/PIC/mereni/otmer/otmer.c
0,0 → 1,38
#include "D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.h"
 
#define DATA PIN_A1
#define CP PIN_A0
#define STROBE PIN_A2
 
#include "shift_reg.c"
 
void main()
{
int n=0;
int i;
putreg(1);
while(true)
{
i=1;
for(n=0;n<=7;n++)
{
putreg(i);
i=i<<1;
Delay_ms(50);
};
i=0x80;
for(n=0;n<=7;n++)
{
putreg(i);
i=i>>1;
Delay_ms(50);
};
}
 
while(true)
{
putreg(~n);
Delay_ms(100);
n++;
}
}
/programy/C/PIC/mereni/otmer/otmer.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/otmer/otmer.err
0,0 → 1,0
No Errors
/programy/C/PIC/mereni/otmer/otmer.h
0,0 → 1,4
#include <16F84.h>
#fuses NOWDT,XT, NOPUT, NOPROTECT
#use delay(clock=4000000)
 
/programy/C/PIC/mereni/otmer/otmer.sta
0,0 → 1,30
 
ROM used: 122 (12%)
122 (12%) including unused fragments
 
1 Average locations per line
4 Average locations per statement
 
RAM used: 5 (7%) at main() level
8 (12%) worst case
 
Lines Stmts % Files
----- ----- --- -----
39 22 76 D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.c
5 0 0 D:\KAKLIK\programy\PIC_C\mereni\otmer\otmer.h
111 0 0 C:\Program Files\PICC\devices\16F84.h
29 7 14 D:\KAKLIK\programy\PIC_C\mereni\otmer\shift_reg.c
----- -----
368 58 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 21 17 1 @delay_ms1
0 43 35 3 putreg
0 54 44 3 main
 
Segment Used Free
--------- ---- ----
00000-00003 4 0
00004-003FF 118 902
 
/programy/C/PIC/mereni/otmer/otmer.tre
0,0 → 1,10
ÀÄotmer
ÀÄmain 0/54 Ram=3
ÃÄ??0??
ÃÄputreg 0/43 Ram=3
ÃÄputreg 0/43 Ram=3
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄputreg 0/43 Ram=3
ÃÄ@delay_ms1 0/21 Ram=1
ÃÄputreg 0/43 Ram=3
ÀÄ@delay_ms1 0/21 Ram=1
/programy/C/PIC/mereni/otmer/shift_reg.BAK
0,0 → 1,22
////////////////////////////////////////////////////////////////////////////////
// KNIHOVNA PRO OVLADANI POSUVNEHO REGISTRU
//
////////////////////////////////////////////////////////////////////////////////
// definice
//#define DATA PIN_A1
//#define CP PIN_A0
//#define STROBE PIN_A2
 
void putreg(unsigned int8 out) // zapise do registru 8bitovou promenou.
{
int8 i;
output_low(STROBE);
for(i=0;i<=7;i++)
{
output_bit(DATA,bit_test(out,7-i));
output_low(CP);
output_high(CP);
}
output_high(STROBE);
}
/programy/C/PIC/mereni/otmer/vssver.scc
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/piezo_cidlo/PRG.BAT
0,0 → 1,10
@echo off
picpgr reset PIC16F84
picpgr erase PIC16F84
 
rem cls
picpgr program piezo.hex hex PIC16f84 XT_ON PWRTE_ON WDTE_OFF CP_OFF
picpgr run
pause
picpgr stop
pause
/programy/C/PIC/mereni/piezo_cidlo/PRG.PIF
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/piezo_cidlo/RUN.PIF
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/piezo_cidlo/Run.BAT
0,0 → 1,6
@echo off
picpgr reset PIC16F84
picpgr run
pause
picpgr stop
pause
/programy/C/PIC/mereni/piezo_cidlo/piezo.BAK
0,0 → 1,13
#include "D:\@Kaklik\programy\PIC_C\cidlo\piezo.h"
 
 
void main()
{
port_b_pullups(false);
setup_counters(RTCC_INTERNAL,WDT_18MS);
 
while (true)
{
if (input(PIN_B0)) output_high(PIN_A3); else output_low(PIN_A3);
}
}
/programy/C/PIC/mereni/piezo_cidlo/piezo.HEX
0,0 → 1,13
:1000000000308A001928000010308400000803190D
:10001000182801308D008C018C0B0C288D0B0B28BF
:100020004A308C008C0B122800000000800B09283D
:10003000402884011F3083058316811708308312FE
:100040008C008C1D2B280730810181308400000832
:10005000C0390F3880006400813084000008C03946
:100060000C048000831606148312061C4328831692
:1000700085118312851502308F00FA309000042814
:100080008F0B3D284728831685118312851132284E
:0200900063000B
:02400E00FE3F73
:00000001FF
;PIC16C84
/programy/C/PIC/mereni/piezo_cidlo/piezo.LST
0,0 → 1,112
CCS PCW C Compiler, Version 3.110, 15448
 
Filename: d:\@kaklik\programy\pic_c\cidlo\piezo.LST
 
ROM used: 73 (7%)
Largest free fragment is 951
RAM used: 3 (8%) at main() level
4 (11%) worst case
Stack: 1 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 019
0003: NOP
.................... #include "D:\@Kaklik\programy\PIC_C\cidlo\piezo.h"
.................... #include <16C84.h>
.................... //////// Standard Header file for the PIC16C84 device ////////////////
.................... #device PIC16C84
.................... #list
....................
.................... #use delay(clock=4000000)
0004: MOVLW 10
0005: MOVWF 04
0006: MOVF 00,W
0007: BTFSC 03.2
0008: GOTO 018
0009: MOVLW 01
000A: MOVWF 0D
000B: CLRF 0C
000C: DECFSZ 0C,F
000D: GOTO 00C
000E: DECFSZ 0D,F
000F: GOTO 00B
0010: MOVLW 4A
0011: MOVWF 0C
0012: DECFSZ 0C,F
0013: GOTO 012
0014: NOP
0015: NOP
0016: DECFSZ 00,F
0017: GOTO 009
0018: GOTO 040 (RETURN)
.................... #fuses HS,WDT
....................
....................
....................
....................
.................... void main()
.................... {
0019: CLRF 04
001A: MOVLW 1F
001B: ANDWF 03,F
.................... port_b_pullups(false);
001C: BSF 03.5
001D: BSF 01.7
.................... setup_counters(RTCC_INTERNAL,WDT_18MS);
001E: MOVLW 08
001F: BCF 03.5
0020: MOVWF 0C
0021: BTFSS 0C.3
0022: GOTO 02B
0023: MOVLW 07
0024: CLRF 01
0025: MOVLW 81
0026: MOVWF 04
0027: MOVF 00,W
0028: ANDLW C0
0029: IORLW 0F
002A: MOVWF 00
002B: CLRWDT
002C: MOVLW 81
002D: MOVWF 04
002E: MOVF 00,W
002F: ANDLW C0
0030: IORWF 0C,W
0031: MOVWF 00
....................
.................... while (true)
.................... {
.................... if (input(PIN_B0))
0032: BSF 03.5
0033: BSF 06.0
0034: BCF 03.5
0035: BTFSS 06.0
0036: GOTO 043
.................... {
.................... output_high(PIN_A3);
0037: BSF 03.5
0038: BCF 05.3
0039: BCF 03.5
003A: BSF 05.3
.................... delay_ms(500);
003B: MOVLW 02
003C: MOVWF 0F
003D: MOVLW FA
003E: MOVWF 10
003F: GOTO 004
0040: DECFSZ 0F,F
0041: GOTO 03D
.................... }
.................... else output_low(PIN_A3);
0042: GOTO 047
0043: BSF 03.5
0044: BCF 05.3
0045: BCF 03.5
0046: BCF 05.3
.................... }
0047: GOTO 032
.................... }
....................
0048: SLEEP
/programy/C/PIC/mereni/piezo_cidlo/piezo.PJT
0,0 → 1,32
[PROJECT]
Target=piezo.HEX
Development_Mode=
Processor=0x6C84
ToolSuite=CCS
 
[Directories]
Include=C:\PROGRAM FILES\PICC\devices\;C:\PROGRAM FILES\PICC\dr
Library=
LinkerScript=
 
[Target Data]
FileList=piezo.c;
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[piezo.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=piezo.c
 
[Windows]
0=0000 piezo.c 0 0 796 451 3 0
 
/programy/C/PIC/mereni/piezo_cidlo/piezo.SYM
0,0 → 1,14
00C @SCRATCH
00D @SCRATCH
00D _RETURN_
00F main.@SCRATCH
010 delay_ms.P1
delay_us.P1
 
0004 delay_ms
0019 main
 
Project Files:
d:\@kaklik\programy\pic_c\cidlo\piezo.c
D:\@Kaklik\programy\PIC_C\cidlo\piezo.h
C:\PROGRAM FILES\PICC\devices\16C84.h
/programy/C/PIC/mereni/piezo_cidlo/piezo.c
0,0 → 1,18
#include "D:\@Kaklik\programy\PIC_C\cidlo\piezo.h"
 
 
void main()
{
port_b_pullups(false);
setup_counters(RTCC_INTERNAL,WDT_18MS);
 
while (true)
{
if (input(PIN_B0))
{
output_high(PIN_A3);
delay_ms(500);
}
else output_low(PIN_A3);
}
}
/programy/C/PIC/mereni/piezo_cidlo/piezo.cod
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/piezo_cidlo/piezo.err
0,0 → 1,0
No Errors
/programy/C/PIC/mereni/piezo_cidlo/piezo.h
0,0 → 1,4
#include <16C84.h>
#use delay(clock=4000000)
#fuses HS,WDT
 
/programy/C/PIC/mereni/piezo_cidlo/piezo.sta
0,0 → 1,28
 
ROM used: 73 (7%)
951 (93%) including unused fragments
 
1 Average locations per line
8 Average locations per statement
 
RAM used: 3 (8%) at main() level
4 (11%) worst case
 
Lines Stmts % Files
----- ----- --- -----
19 9 100 d:\@kaklik\programy\pic_c\cidlo\piezo.c
5 0 0 D:\@Kaklik\programy\PIC_C\cidlo\piezo.h
111 0 0 C:\PROGRAM FILES\PICC\devices\16C84.h
----- -----
270 18 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 21 29 1 delay_ms
0 48 66 1 main
 
Segment Used Free
--------- ---- ----
0000-0003 4 0
0004-03FF 69 951
 
/programy/C/PIC/mereni/piezo_cidlo/piezo.tre
0,0 → 1,4
ÀÄpiezo
ÀÄmain 0/48 Ram=1
ÃÄ??0??
ÀÄdelay_ms 0/21 Ram=1
/programy/C/PIC/mereni/piezo_cidlo/vssver.scc
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/vyskomer_drak/main.BAK
0,0 → 1,21
#include "D:\@Kaklik\programy\PIC_C\mereni\vyskomer_drak\main.h"
 
#DEFINE SCLK PIN_A2
#DEFINE DOUT
#DEFINE DIN PIN_A1
#include "MS5534A.c"
void main()
{
output_high(pin_B2);
while(true)
{
while(!input(pin_B1))
{
output_high(pin_A3);
Delay_ms(50);
}
output_low(pin_A3);
Delay_ms(50);
}
 
}
/programy/C/PIC/mereni/vyskomer_drak/main.HEX
0,0 → 1,10
:1000000000308A001928000012308400000803190B
:10001000182801308D008C018C0B0C288D0B0B28BF
:100020004A308C008C0B122800000000800B09283D
:10003000003484011F3083058316061183120615D0
:1000400083168614831286182D2883168511831231
:1000500085153230920004202028831685118312E2
:0C0060008511323092000420202863003B
:02400E00F93F78
:00000001FF
;PIC16F84
/programy/C/PIC/mereni/vyskomer_drak/main.LST
0,0 → 1,204
CCS PCW C Compiler, Version 3.110, 15448
 
Filename: d:\@kaklik\programy\pic_c\mereni\vyskomer_drak\main.LST
 
ROM used: 54 (5%)
Largest free fragment is 970
RAM used: 5 (7%) at main() level
6 (9%) worst case
Stack: 1 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 019
0003: NOP
.................... #include "D:\@Kaklik\programy\PIC_C\mereni\vyskomer_drak\main.h"
.................... #include <16F84.h>
.................... //////// Standard Header file for the PIC16F84 device ////////////////
.................... #device PIC16F84
.................... #list
....................
.................... #use delay(clock=4000000)
0004: MOVLW 12
0005: MOVWF 04
0006: MOVF 00,W
0007: BTFSC 03.2
0008: GOTO 018
0009: MOVLW 01
000A: MOVWF 0D
000B: CLRF 0C
000C: DECFSZ 0C,F
000D: GOTO 00C
000E: DECFSZ 0D,F
000F: GOTO 00B
0010: MOVLW 4A
0011: MOVWF 0C
0012: DECFSZ 0C,F
0013: GOTO 012
0014: NOP
0015: NOP
0016: DECFSZ 00,F
0017: GOTO 009
0018: RETLW 00
.................... #fuses XT,NOWDT
....................
....................
....................
.................... #DEFINE SCLK PIN_A2
.................... #DEFINE DOUT PIN_A3
.................... #DEFINE DIN PIN_A1
.................... #include "MS5534A.c"
....................
.................... #DEFINE CLK 250
.................... #DEFINE WORD1 0b111010101000
.................... #DEFINE WORD2 0b111010110000
.................... #DEFINE WORD3 0b111011001000
.................... #DEFINE WORD4 0b111011010000
....................
.................... void send_bit(bit)
.................... {
.................... output_bit(DIN,bit);
.................... output_high(SCLK);
.................... Delay_us(CLK);
.................... output_low(SCLK);
.................... }
.................... int1 read_bit()
.................... {
.................... output_high(SCLK);
.................... Delay_us(CLK);
.................... output_low(SCLK);
.................... if (input(DOUT)) return true;
.................... if (!input(DOUT)) return false;
.................... }
....................
.................... void read_byte(*byte_r)
.................... {
.................... int i;
....................
.................... for(i=0;i>=7;i++)
.................... {
.................... *byte_r = read_bit();
.................... *byte_r << 1;
.................... }
.................... }
....................
.................... void send_command(command,width)
.................... {
.................... int i;
.................... for (i=width;i>=0;i--)
.................... {
.................... send_bit(bit_test(command,0));
.................... command >>1;
.................... }
.................... }
....................
.................... void bar_reset()
.................... {
.................... int8 i;
....................
.................... for(i=0;i>=20;i++) send_bit(Bit_test(i,0));
.................... }
....................
.................... int16 bar_con_pre()
.................... {
.................... int16 word;
....................
.................... send_command(0b1111010000,9);
....................
.................... Delay_ms(10);
....................
.................... While(input(DOUT)) Delay_us(100);
....................
.................... read_byte(&word);
.................... word << 8;
.................... read_byte(&word);
....................
.................... return word;
.................... }
....................
.................... int16 bar_con_term()
.................... {
.................... int16 word;
....................
.................... send_command(0b1111001000,9);
....................
.................... Delay_ms(10);
....................
.................... While(input(DOUT)) Delay_us(100);
....................
.................... read_byte(&word);
.................... word << 8;
.................... read_byte(&word);
....................
.................... return word;
.................... }
....................
.................... int16 bar_read_cal(command)
.................... {
.................... int16 word;
....................
.................... send_command(command,11);
....................
.................... Delay_ms(10);
....................
.................... While(input(DOUT)) Delay_us(100);
....................
.................... read_byte(&word);
.................... word << 8;
.................... read_byte(&word);
....................
.................... return word;
.................... }
....................
....................
....................
....................
....................
....................
....................
.................... void main()
.................... {
0019: CLRF 04
001A: MOVLW 1F
001B: ANDWF 03,F
.................... output_high(pin_B2);
001C: BSF 03.5
001D: BCF 06.2
001E: BCF 03.5
001F: BSF 06.2
.................... while(true)
.................... {
.................... while(!input(pin_B1))
0020: BSF 03.5
0021: BSF 06.1
0022: BCF 03.5
0023: BTFSC 06.1
0024: GOTO 02D
.................... {
.................... output_high(pin_A3);
0025: BSF 03.5
0026: BCF 05.3
0027: BCF 03.5
0028: BSF 05.3
.................... Delay_ms(50);
0029: MOVLW 32
002A: MOVWF 12
002B: CALL 004
.................... }
002C: GOTO 020
.................... output_low(pin_A3);
002D: BSF 03.5
002E: BCF 05.3
002F: BCF 03.5
0030: BCF 05.3
.................... Delay_ms(50);
0031: MOVLW 32
0032: MOVWF 12
0033: CALL 004
.................... }
0034: GOTO 020
....................
.................... }
....................
0035: SLEEP
/programy/C/PIC/mereni/vyskomer_drak/main.PJT
0,0 → 1,32
[PROJECT]
Target=main.HEX
Development_Mode=
Processor=0x684A
ToolSuite=CCS
 
[Directories]
Include=C:\PROGRAM FILES\PICC\devices\;C:\PROGRAM FILES\PICC\dr
Library=
LinkerScript=
 
[Target Data]
FileList=main.c;
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[main.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=main.c
 
[Windows]
0=0000 main.c 0 0 796 451 3 0
 
/programy/C/PIC/mereni/vyskomer_drak/main.SYM
0,0 → 1,28
00C @SCRATCH
00D @SCRATCH
00D _RETURN_
00E @SCRATCH
00F @SCRATCH
010 @SCRATCH
012 delay_ms.P1
delay_us.P1
send_bit.bit
read_byte.byte_r
read_byte.i
send_command.command
send_command.width
send_command.i
bar_reset.i
-000 bar_con_pre.word
-000 bar_con_term.word
bar_read_cal.command
-000 bar_read_cal.word
 
0004 delay_ms
0019 main
 
Project Files:
d:\@kaklik\programy\pic_c\mereni\vyskomer_drak\main.c
D:\@Kaklik\programy\PIC_C\mereni\vyskomer_drak\main.h
C:\PROGRAM FILES\PICC\devices\16F84.h
d:\@kaklik\programy\pic_c\mereni\vyskomer_drak\MS5534A.c
/programy/C/PIC/mereni/vyskomer_drak/main.c
0,0 → 1,21
#include "D:\@Kaklik\programy\PIC_C\mereni\vyskomer_drak\main.h"
 
#DEFINE SCLK PIN_A2
#DEFINE DOUT PIN_A3
#DEFINE DIN PIN_A1
#include "MS5534A.c"
void main()
{
output_high(pin_B2);
while(true)
{
while(!input(pin_B1))
{
output_high(pin_A3);
Delay_ms(50);
}
output_low(pin_A3);
Delay_ms(50);
}
 
}
/programy/C/PIC/mereni/vyskomer_drak/main.cod
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/vyskomer_drak/main.err
0,0 → 1,0
No Errors
/programy/C/PIC/mereni/vyskomer_drak/main.h
0,0 → 1,4
#include <16F84.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
 
/programy/C/PIC/mereni/vyskomer_drak/main.sta
0,0 → 1,29
 
ROM used: 54 (5%)
970 (95%) including unused fragments
 
0 Average locations per line
1 Average locations per statement
 
RAM used: 5 (7%) at main() level
6 (9%) worst case
 
Lines Stmts % Files
----- ----- --- -----
22 9 17 d:\@kaklik\programy\pic_c\mereni\vyskomer_drak\main.c
5 0 0 D:\@Kaklik\programy\PIC_C\mereni\vyskomer_drak\main.h
111 0 0 C:\PROGRAM FILES\PICC\devices\16F84.h
108 45 71 d:\@kaklik\programy\pic_c\mereni\vyskomer_drak\MS5534A.c
----- -----
492 108 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 21 39 1 delay_ms
0 29 54 0 main
 
Segment Used Free
--------- ---- ----
0000-0003 4 0
0004-03FF 50 970
 
/programy/C/PIC/mereni/vyskomer_drak/main.tre
0,0 → 1,5
ÀÄmain
ÀÄmain 0/29 Ram=0
ÃÄ??0??
ÃÄdelay_ms 0/21 Ram=1
ÀÄdelay_ms 0/21 Ram=1
/programy/C/PIC/mereni/vyskomer_drak/ms5534a.BAK
0,0 → 1,107
 
#DEFINE CLK 250
#DEFINE WORD1 0b111010101000
#DEFINE WORD2 0b111010110000
#DEFINE WORD3 0b111011001000
#DEFINE WORD4 0b111011010000
 
void send_bit(bit)
{
output_bit(DIN,bit);
output_high(SCLK);
Delay_us(CLK);
output_low(SCLK);
}
int1 read_bit()
{
output_high(SCLK);
Delay_us(CLK);
output_low(SCLK);
if (input(DOUT)) return true;
if (!input(DOUT)) return false;
}
 
void read_byte(*byte_r)
{
int i;
 
for(i=0;i>=7;i++)
{
*byte_r = read_bit();
*byte_r << 1;
}
}
 
void send_command(command,width)
{
int i;
for (i=width;i>=0;i--)
{
send_bit(bit_test(command,0));
command >>1;
}
}
 
void bar_reset()
{
int8 i;
 
for(i=0;i>=20;i++) send_bit(Bit_test(i,0));
}
 
int16 bar_con_pre()
{
int16 word;
send_command(0b1111010000,9);
 
Delay_ms(10);
 
While(input(DOUT)) Delay_us(100);
 
read_byte(&word);
word << 8;
read_byte(&word);
 
return word;
}
 
int16 bar_con_term()
{
int16 word;
 
send_command(0b1111001000,9);
 
Delay_ms(10);
 
While(input(DOUT)) Delay_us(100);
 
read_byte(&word);
word << 8;
read_byte(&word);
 
return word;
}
 
int16 bar_read_cal(command)
{
int16 word;
 
send_command(command,11);
 
Delay_ms(10);
 
While(input(DOUT)) Delay_us(100);
 
read_byte(&word);
word << 8;
read_byte(&word);
 
return word;
}
 
 
 
 
 
 
/programy/C/PIC/mereni/vyskomer_drak/ms5534a.c
0,0 → 1,107
 
#DEFINE CLK 250
#DEFINE WORD1 0b111010101000
#DEFINE WORD2 0b111010110000
#DEFINE WORD3 0b111011001000
#DEFINE WORD4 0b111011010000
 
void send_bit(bit)
{
output_bit(DIN,bit);
output_high(SCLK);
Delay_us(CLK);
output_low(SCLK);
}
int1 read_bit()
{
output_high(SCLK);
Delay_us(CLK);
output_low(SCLK);
if (input(DOUT)) return true;
if (!input(DOUT)) return false;
}
 
void read_byte(*byte_r)
{
int i;
 
for(i=0;i>=7;i++)
{
*byte_r = read_bit();
*byte_r << 1;
}
}
 
void send_command(command,width)
{
int i;
for (i=width;i>=0;i--)
{
send_bit(bit_test(command,0));
command >>1;
}
}
 
void bar_reset()
{
int8 i;
 
for(i=0;i>=20;i++) send_bit(Bit_test(i,0));
}
 
int16 bar_con_pre()
{
int16 word;
send_command(0b1111010000,9);
 
Delay_ms(10);
 
While(input(DOUT)) Delay_us(100);
 
read_byte(&word);
word << 8;
read_byte(&word);
 
return word;
}
 
int16 bar_con_term()
{
int16 word;
 
send_command(0b1111001000,9);
 
Delay_ms(10);
 
While(input(DOUT)) Delay_us(100);
 
read_byte(&word);
word << 8;
read_byte(&word);
 
return word;
}
 
int16 bar_read_cal(command)
{
int16 word;
 
send_command(command,11);
 
Delay_ms(10);
 
While(input(DOUT)) Delay_us(100);
 
read_byte(&word);
word << 8;
read_byte(&word);
 
return word;
}
 
 
 
 
 
 
/programy/C/PIC/mereni/vyskomer_drak/prg.bat
0,0 → 1,8
:start
call picpgr stop
call picpgr erase pic16f84
call picpgr program main.hex hex pic16f84
call picpgr run
pause
call picpgr stop
rem goto start
/programy/C/PIC/mereni/vyskomer_drak/run.bat
0,0 → 1,5
call picpgr run
pause
call picpgr stop
pause
run.bat
/programy/C/PIC/mereni/vyskomer_drak/vssver.scc
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/zavora/main.BAK
0,0 → 1,16
#include "D:\@Kaklik\programy\PIC_C\mereni\zavora\main.h"
 
 
void main()
{
output_high(PIN_A3);
Delay_ms(250);
output_low(PIN_A3);
Delay_ms(250);
while(true)
{
if(input(PIN_A4)) output_high(PIN_A3);
else output_low(PIN_A3);
}
}
/programy/C/PIC/mereni/zavora/main.HEX
0,0 → 1,11
:1000000000308A00192800000F308400000803190E
:10001000182801308D008C018C0B0C288D0B0B28BF
:100020004A308C008C0B122800000000800B09283D
:10003000003484011F3083058316851183128515D2
:10004000FA308F0004208316851183128511FA304F
:100050008F000420831605168312051E342883168C
:100060008511831285113828831685118312851511
:040070002A286300D7
:02400E00F93F78
:00000001FF
;PIC16F84
/programy/C/PIC/mereni/zavora/main.LST
0,0 → 1,95
CCS PCW C Compiler, Version 3.110, 15448
 
Filename: d:\@kaklik\programy\pic_c\mereni\zavora\main.LST
 
ROM used: 58 (6%)
Largest free fragment is 966
RAM used: 2 (3%) at main() level
3 (4%) worst case
Stack: 1 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 019
0003: NOP
.................... #include "D:\@Kaklik\programy\PIC_C\mereni\zavora\main.h"
.................... #include <16F84.h>
.................... //////// Standard Header file for the PIC16F84 device ////////////////
.................... #device PIC16F84
.................... #list
....................
.................... #use delay(clock=4000000)
0004: MOVLW 0F
0005: MOVWF 04
0006: MOVF 00,W
0007: BTFSC 03.2
0008: GOTO 018
0009: MOVLW 01
000A: MOVWF 0D
000B: CLRF 0C
000C: DECFSZ 0C,F
000D: GOTO 00C
000E: DECFSZ 0D,F
000F: GOTO 00B
0010: MOVLW 4A
0011: MOVWF 0C
0012: DECFSZ 0C,F
0013: GOTO 012
0014: NOP
0015: NOP
0016: DECFSZ 00,F
0017: GOTO 009
0018: RETLW 00
.................... #fuses XT,NOWDT
....................
....................
....................
....................
.................... void main()
.................... {
0019: CLRF 04
001A: MOVLW 1F
001B: ANDWF 03,F
.................... output_high(PIN_A3);
001C: BSF 03.5
001D: BCF 05.3
001E: BCF 03.5
001F: BSF 05.3
.................... Delay_ms(250);
0020: MOVLW FA
0021: MOVWF 0F
0022: CALL 004
.................... output_low(PIN_A3);
0023: BSF 03.5
0024: BCF 05.3
0025: BCF 03.5
0026: BCF 05.3
.................... Delay_ms(250);
0027: MOVLW FA
0028: MOVWF 0F
0029: CALL 004
....................
.................... while(true)
.................... {
.................... if(input(PIN_A4)) output_low(PIN_A3);
002A: BSF 03.5
002B: BSF 05.4
002C: BCF 03.5
002D: BTFSS 05.4
002E: GOTO 034
002F: BSF 03.5
0030: BCF 05.3
0031: BCF 03.5
0032: BCF 05.3
.................... else output_high(PIN_A3);
0033: GOTO 038
0034: BSF 03.5
0035: BCF 05.3
0036: BCF 03.5
0037: BSF 05.3
.................... }
0038: GOTO 02A
.................... }
....................
0039: SLEEP
/programy/C/PIC/mereni/zavora/main.PJT
0,0 → 1,32
[PROJECT]
Target=main.HEX
Development_Mode=
Processor=0x684A
ToolSuite=CCS
 
[Directories]
Include=C:\PROGRAM FILES\PICC\devices\;C:\PROGRAM FILES\PICC\dr
Library=
LinkerScript=
 
[Target Data]
FileList=main.c;
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[main.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=main.c
 
[Windows]
0=0000 main.c 0 0 796 451 3 0
 
/programy/C/PIC/mereni/zavora/main.SYM
0,0 → 1,13
00C @SCRATCH
00D @SCRATCH
00D _RETURN_
00F delay_ms.P1
delay_us.P1
 
0004 delay_ms
0019 main
 
Project Files:
d:\@kaklik\programy\pic_c\mereni\zavora\main.c
D:\@Kaklik\programy\PIC_C\mereni\zavora\main.h
C:\PROGRAM FILES\PICC\devices\16F84.h
/programy/C/PIC/mereni/zavora/main.c
0,0 → 1,16
#include "D:\@Kaklik\programy\PIC_C\mereni\zavora\main.h"
 
 
void main()
{
output_high(PIN_A3);
Delay_ms(250);
output_low(PIN_A3);
Delay_ms(250);
while(true)
{
if(input(PIN_A4)) output_low(PIN_A3);
else output_high(PIN_A3);
}
}
/programy/C/PIC/mereni/zavora/main.cod
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/PIC/mereni/zavora/main.err
0,0 → 1,0
No Errors
/programy/C/PIC/mereni/zavora/main.h
0,0 → 1,4
#include <16F84.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
 
/programy/C/PIC/mereni/zavora/main.sta
0,0 → 1,28
 
ROM used: 58 (6%)
966 (94%) including unused fragments
 
0 Average locations per line
6 Average locations per statement
 
RAM used: 2 (3%) at main() level
3 (4%) worst case
 
Lines Stmts % Files
----- ----- --- -----
17 9 100 d:\@kaklik\programy\pic_c\mereni\zavora\main.c
5 0 0 D:\@Kaklik\programy\PIC_C\mereni\zavora\main.h
111 0 0 C:\PROGRAM FILES\PICC\devices\16F84.h
----- -----
266 18 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 21 36 1 delay_ms
0 33 57 0 main
 
Segment Used Free
--------- ---- ----
0000-0003 4 0
0004-03FF 54 966
 
/programy/C/PIC/mereni/zavora/main.tre
0,0 → 1,5
ÀÄmain
ÀÄmain 0/33 Ram=0
ÃÄ??0??
ÃÄdelay_ms 0/21 Ram=1
ÀÄdelay_ms 0/21 Ram=1
/programy/C/PIC/mereni/zavora/prg.bat
0,0 → 1,8
:start
call picpgr stop
call picpgr erase pic16f84
call picpgr program main.hex hex pic16f84
call picpgr run
pause
call picpgr stop
rem goto start
/programy/C/PIC/mereni/zavora/run.bat
0,0 → 1,5
call picpgr run
pause
call picpgr stop
pause
run.bat
/programy/C/PIC/mereni/zavora/vssver.scc
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property