GeSHi (csharp):#fuses HSPLL,NOMCLR,PUT,BROWNOUT,BORV43,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,CCP2B3#use delay(clock=48000000)#use rs232(baud=115200, xmit=TTL_TX, rcv=TTL_RX) #define MaxRecords 255
GeSHi (csharp):int8 timer1_overflows;char next_Interrupt_1;char next_Interrupt_2;char next_Interrupt_3;int8 flagFirstEdge; char ChannelEdge[MaxRecords];int8 Overflows[MaxRecords];int16 Timer[MaxRecords];int8 Index;
GeSHi (csharp):void limpia_data_records(void){ for(Index=0;Index<MaxRecords;Index++){ ChannelEdge[Index] = 0x00; Overflows[Index] = 0x00; Timer[Index] = 0x00; } Index=0;} void exec_COMMAND_START(void){ limpia_data_records(); flagFirstEdge = 0x00; ext_int_edge(0,H_TO_L); next_Interrupt_1='L'; ext_int_edge(1,H_TO_L); next_Interrupt_2='L'; ext_int_edge(2,H_TO_L); next_Interrupt_3='L'; if( !input(PIN_B0) ){ ext_int_edge(0,L_TO_H); next_Interrupt_1='H'; } if( !input(PIN_B1) ){ ext_int_edge(1,L_TO_H); next_Interrupt_2='H'; } if( !input(PIN_B2) ){ ext_int_edge(2,L_TO_H); next_Interrupt_3='H'; } enable_interrupts(int_ext); enable_interrupts(int_ext1); enable_interrupts(int_ext2); enable_interrupts(int_timer1); printf("<%c,%c,%c,%c>\r\n",COMMAND_ACK,next_Interrupt_1,next_Interrupt_2,next_Interrupt_3);}
GeSHi (csharp):// Base de Tiempos //////////////////////////////////////////////////#int_timer1void timer1_handler(void){ ++timer1_overflows; // One Tick: 0.0833 uS, One Overflow: 5,461333 mS } // Canal 1 : RB0 ////////////////////////////////////////////////////#int_extvoid channel_1_handler(void){ if(flagFirstEdge==0x00){ flagFirstEdge=0x01; timer1_overflows=0x00; set_timer1(0); } ChannelEdge[Index] = '1' + next_Interrupt_1; Overflows[Index] = timer1_overflows; Timer[Index] = get_timer1(); ++Index; if(next_Interrupt_1=='H'){ ext_int_edge(0,H_TO_L); next_Interrupt_1='L'; } else{ ext_int_edge(0,L_TO_H); next_Interrupt_1='H'; } } // Canal 2 : RB1 ////////////////////////////////////////////////////#int_ext1void channel_2_handler(void){ if(flagFirstEdge==0x00){ flagFirstEdge=0x01; timer1_overflows=0x00; set_timer1(0); } ChannelEdge[Index] = '2' + next_Interrupt_2; Overflows[Index] = timer1_overflows; Timer[Index] = get_timer1(); ++Index; if(next_Interrupt_2=='H'){ ext_int_edge(1,H_TO_L); next_Interrupt_2='L'; } else{ ext_int_edge(1,L_TO_H); next_Interrupt_2='H'; }} // Canal 3 : RB2 ////////////////////////////////////////////////////#int_ext2void channel_3_handler(void){ if(flagFirstEdge==0x00){ flagFirstEdge =0x01; timer1_overflows=0x00; set_timer1(0); } ChannelEdge[Index] = '3' + next_Interrupt_3; Overflows[Index] = timer1_overflows; Timer[Index] = get_timer1(); ++Index; if(next_Interrupt_3=='H'){ ext_int_edge(2,H_TO_L); next_Interrupt_3='L'; } else{ ext_int_edge(2,L_TO_H); next_Interrupt_3='H'; }}
GeSHi (csharp): if(flagFirstEdge==0x00){ flagFirstEdge=0x01; timer1_overflows=0x00; set_timer1(0); }
GeSHi (csharp):#define INTCON2 0xFF1 #bit Edge1 = INTCON2.6#bit Edge2 = INTCON2.5#bit Edge3 = INTCON2.4
GeSHi (csharp):void exec_COMMAND_START(void){ char sEdge1='u',sEdge2='u',sEdge3='u'; limpia_data_records(); flagFirstEdge = 0x00; Edge1=0; Edge2=0; Edge3=0; if( !input(PIN_B0) ) Edge1=1; if( !input(PIN_B1) ) Edge2=1; if( !input(PIN_B2) ) Edge3=1; if(Edge1) sEdge1='H'; else sEdge1='L'; if(Edge2) sEdge2='H'; else sEdge2='L'; if(Edge3) sEdge3='H'; else sEdge3='L'; printf("<%c,%c,%c,%c>\r\n",COMMAND_ACK,sEdge1,sEdge2,sEdge3); timer1_overflows=0x00; set_timer1(0); enable_interrupts(int_ext); enable_interrupts(int_ext1); enable_interrupts(int_ext2); enable_interrupts(int_timer1);}
GeSHi (csharp):#int_ext2void channel_3_handler(void){ if(flagFirstEdge==0x00){ flagFirstEdge =0x01; timer1_overflows=0x00; set_timer1(0); } ChannelEdge[Index] = 'E'+Edge3; Overflows[Index] = timer1_overflows; Timer[Index] = get_timer1(); ++Index; ++Edge3;}
GeSHi (csharp)://///////////////////////////////////////////////////////////////////////////////////////////////////// DEFINES y CONSTANTES///////////////////////////////////////////////////////////////////////////////////////////////////// #define INTCON2 0xFF1#bit Edge1 = INTCON2.6#bit Edge2 = INTCON2.5#bit Edge3 = INTCON2.4 struct tRecord{ char Channel; char Edge; int8 Overflow; int16 Timer;}; #define MaxRecords 381 /////////////////////////////////////////////////////////////////////////////////////////////////////// R A M///////////////////////////////////////////////////////////////////////////////////////////////////// char Command='\0'; int16 Index;int8 timer3_overflows;struct tRecord singleRecord;struct tRecord Records[MaxRecords];
GeSHi (csharp):// Base de Tiempos //////////////////////////////////////////////////#int_timer3void timer3_handler(void){ ++timer3_overflows; // One Tick: 0.0833 uS, One Overflow: 5,461333 mS} // Canal 1 : RB0 ////////////////////////////////////////////////////#int_extvoid channel_1_handler(void){ singleRecord.Overflow = timer3_overflows; singleRecord.Timer = get_timer3(); singleRecord.Edge = Edge1; singleRecord.Channel = '1'; ++Edge1; memcpy(&Records[Index],&singleRecord,sizeof(singleRecord)); ++Index;} // Canal 2 : RB1 ////////////////////////////////////////////////////#int_ext1void channel_2_handler(void){ singleRecord.Overflow = timer3_overflows; singleRecord.Timer = get_timer3(); singleRecord.Edge = Edge2; singleRecord.Channel = '2'; ++Edge2; memcpy(&Records[Index],&singleRecord,sizeof(singleRecord)); ++Index; } // Canal 3 : RB2 ////////////////////////////////////////////////////#int_ext2void channel_3_handler(void){ singleRecord.Overflow = timer3_overflows; singleRecord.Timer = get_timer3(); singleRecord.Edge = Edge3; singleRecord.Channel = '3'; ++Edge3; memcpy(&Records[Index],&singleRecord,sizeof(singleRecord)); ++Index;}
GeSHi (csharp):void dump_data_record(int16 nrecord){ int8 dispOverflow; dispOverflow=Records[nrecord].Overflow-Records[0].Overflow; printf("<%c,%3Lu,%c,%c,%3u,%5Lu>\r\n",COMMAND_DUMP,nrecord,Records[nrecord].Channel,'0'+Records[nrecord].Edge,dispOverflow,Records[nrecord].Timer);} void exec_COMMAND_DUMP(void){ int16 i; for(i=0;i<Index;i++){ // Direct // for(i=Index;i<255;--i){ // Reverse // Corrección de Errores de Recogida de Datos ... if(i>0){ // Si hay dato anterior if(Records[i].Timer<100 && (Records[i].Overflow==Records[i-1].Overflow)){ // Si la recogida del Timer es menor que 100 y .. Records[i].Overflow +=1; // el Overflow es igual al anterior el overflow es uno más. } } dump_data_record(i); } printf("Overflows Offset %3u\r\n",Records[0].Overflow);}
GeSHi (asm):.................... // Canal 1 : RB0 ////////////////////////////////////////////////////0186: BCF FA1.10188: GOTO 0088.................... #int_ext.................... void channel_1_handler(void){........................................ Overflows[Index] = timer3_overflows;018C: CLRF 03018E: MOVLB 40190: MOVF x16,W0192: ADDLW 190194: MOVWF FE90196: MOVLW 010198: ADDWFC 03,W019A: MOVWF FEA019C: MOVFF 19,FEF.................... Timer[Index] = get_timer3();01A0: BCF FD8.001A2: RLCF x16,W01A4: MOVWF 0201A6: CLRF 0301A8: RLCF 03,F01AA: MOVF 02,W01AC: ADDLW 1801AE: MOVWF FE901B0: MOVLW 0201B2: ADDWFC 03,W01B4: MOVWF FEA01B6: MOVF FB2,W01B8: MOVFF FB3,0301BC: MOVWF FEF01BE: MOVFF 03,FEC01C2: MOVF FED,F.................... ChannelEdge[Index] = 'A'+Edge1;01C4: CLRF 0301C6: MOVF x16,W01C8: ADDLW 1A01CA: MOVWF FE901CC: MOVLW 0001CE: ADDWFC 03,W01D0: MOVWF FEA01D2: MOVLW 0001D4: BTFSC FF1.601D6: MOVLW 0101D8: ADDLW 4101DA: MOVWF FEF.................... ++Index;01DC: INCF x16,F.................... ++Edge1;01DE: BTG FF1.6.................... }
GeSHi (asm):.................... // Canal 1 : RB0 ////////////////////////////////////////////////////0186: BCF FA1.10188: GOTO 0088.................... #int_ext.................... void channel_1_handler(void){........................................ singleRecord.Overflow = timer3_overflows;*01AE: MOVFF 1C,1F.................... singleRecord.Timer = get_timer3();01B2: MOVF FB2,W01B4: MOVFF FB3,0301B8: MOVWF 2001BA: MOVFF 03,21.................... singleRecord.Edge = Edge1;01BE: CLRF 1E01C0: BTFSC FF1.601C2: INCF 1E,F.................... singleRecord.Channel = '1';01C4: MOVLW 3101C6: MOVWF 1D.................... ++Edge1;01C8: BTG FF1.6.................... memcpy(&Records[Index],&singleRecord,sizeof(singleRecord));01CA: MOVFF 1B,7B701CE: MOVFF 1A,7B601D2: MOVLB 701D4: CLRF xB901D6: MOVLW 0501D8: MOVWF xB801DA: MOVLB 001DC: RCALL 018C01DE: MOVFF 02,0301E2: MOVF 01,W01E4: ADDLW 2201E6: MOVLB 701E8: MOVWF xAC01EA: MOVLW 0001EC: ADDWFC 02,W01EE: MOVWF xAD01F0: MOVWF FEA01F2: MOVFF 7AC,FE901F6: CLRF FE201F8: MOVLW 1D01FA: MOVWF FE101FC: MOVLW 0501FE: MOVWF 010200: MOVFF FE6,FEE0204: DECFSZ 01,F0206: BRA 0200.................... ++Index;0208: INCF 1A,F020A: BTFSC FD8.2020C: INCF 1B,F.................... }
GeSHi (csharp):int1 iEdge1, iEdge2, iEdge3;
GeSHi (csharp): ext_int_edge(0,H_TO_L); ext_int_edge(1,H_TO_L); ext_int_edge(2,H_TO_L); if( !input(PIN_B0) ){ ext_int_edge(0,L_TO_H); } if( !input(PIN_B1) ){ ext_int_edge(1,L_TO_H); } if( !input(PIN_B2) ){ ext_int_edge(2,L_TO_H); } iEdge1=Edge1; iEdge2=Edge2; iEdge3=Edge3;
GeSHi (csharp):#int_extvoid channel_1_handler(void){ singleRecord.Overflow = timer3_overflows; singleRecord.Timer = get_timer3(); singleRecord.Channel = '1'; ++Edge1; memcpy(&Records[Index],&singleRecord,sizeof(singleRecord)); ++Index;}...
GeSHi (csharp): // Computa Edge en función de iEdgex sEdge='u'; switch(Records[nrecord].Channel){ case '1': sEdge='0'+iEdge1; ++iEdge1; break; case '2': sEdge='0'+iEdge2; ++iEdge2; break; case '3': sEdge='0'+iEdge3; ++iEdge3; break; }
GeSHi (asm):.................... // Canal 1 : RB0 ////////////////////////////////////////////////////.................... #int_ext.................... void channel_1_handler(void){....................018C: MOVFF 1C,1E .................... singleRecord.Overflow = timer3_overflows;0190: MOVF FB2,W .................... singleRecord.Timer = get_timer3();0192: MOVFF FB3,030196: MOVWF 1F0198: MOVFF 03,20 .................... singleRecord.Channel = '1';019C: MOVLW 31019E: MOVWF 1D01A0: BTG FF1.6 .................... ++Edge1;01A2: RLCF 1A,W .................... memcpy(&Records[Index],&singleRecord,sizeof(singleRecord));01A4: MOVWF 0201A6: RLCF 1B,W01A8: MOVWF 0301AA: RLCF 02,F01AC: RLCF 03,F01AE: MOVLW FC01B0: ANDWF 02,F01B2: MOVF 02,W01B4: ADDLW 2101B6: MOVLB 601B8: MOVWF x4F01BA: MOVLW 0001BC: ADDWFC 03,W01BE: MOVWF x5001C0: MOVWF FEA01C2: MOVFF 64F,FE901C6: CLRF FE201C8: MOVLW 1D01CA: MOVWF FE101CC: MOVLW 0401CE: MOVWF 0101D0: MOVFF FE6,FEE01D4: DECFSZ 01,F01D6: BRA 01D001D8: INCF 1A,F .................... ++Index;01DA: BTFSC FD8.201DC: INCF 1B,F.................... }
GeSHi (csharp): 2 018C: MOVFF 1C,1E .................... singleRecord.Overflow = timer3_overflows; 1 0190: MOVF FB2,W .................... singleRecord.Timer = get_timer3(); 2 0192: MOVFF FB3,03 1 0196: MOVWF 1F 2 0198: MOVFF 03,20 .................... singleRecord.Channel = '1'; 1 019C: MOVLW 31 1 019E: MOVWF 1D 1 01A0: BTG FF1.6 .................... ++Edge1; 1 01A2: RLCF 1A,W .................... memcpy(&Records[Index],&singleRecord,sizeof(singleRecord)); 1 01A4: MOVWF 02 1 01A6: RLCF 1B,W 1 01A8: MOVWF 03 1 01AA: RLCF 02,F 1 01AC: RLCF 03,F 1 01AE: MOVLW FC 1 01B0: ANDWF 02,F 1 01B2: MOVF 02,W 1 01B4: ADDLW 21 1 01B6: MOVLB 6 1 01B8: MOVWF x4F 1 01BA: MOVLW 00 1 01BC: ADDWFC 03,W 1 01BE: MOVWF x50 1 01C0: MOVWF FEA 2 01C2: MOVFF 64F,FE9 1 01C6: CLRF FE2 1 01C8: MOVLW 1D 1 01CA: MOVWF FE1 1 01CC: MOVLW 04 1 01CE: MOVWF 01 2 01D0: MOVFF FE6,FEE 3 01D4: DECFSZ 01,F 2 01D6: BRA 01D0 1 01D8: INCF 1A,F .................... ++Index; 3 01DA: BTFSC FD8.2 1 01DC: INCF 1B,F