de sensibilidade de borda do modulo CCP1 gera o disparo erroneo desta interrupcao, portanto, temos que tomar a precaucao de manter desabilitada essa interrupcao durante esta mudanca de borda. Programa /****************************************************************************** JL Audio Manutencao Eletronica Data: 09/2013Autor: Jean CarlosProjeto: Decodificador de sinais PPMMicroprocessador: PIC16F887Clock do processador: 8MHzEstacao de desenvolvimento: PK2LabCompilador: MikroC PRO V4.60.0.0Versao atual: 1.0Descricao: Este projeto consiste em decodificar os sinais PPM provenientes da saida de um receptor de radio controle *******************************************************************************/// Configuracao do LCD da placa PK2Lab V.1.1 sbit LCD_RS at RB2_bit;sbit LCD_EN at RB3_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit; sbit LCD_RS_Direction at TRISB2_bit;sbit LCD_EN_Direction at TRISB3_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit; //Variaveis Globais char txt[7];unsigned int Tempo_L, Tempo_H, Pulso; //Interrupcoes void interrupt(){if(CCP1IF_bit && CCP1CON.B0) // Captura por CCP1 e borda como subida... { CCP1IF_bit = 0; // Limpa a flag para nova captura CCP1IE_bit = 0; // Desabilita interrupcao por perifericos(CCP1) CCP1CON = 4; // Configura a borda de captura para DESCIDA. CCP1IE_bit = 1; // Habilita interrupcao por perifericos(CCP1) TMR1H = 0; // Zera registradores do TMR1 para contagem de tempo TMR1L = 0; TMR1ON_bit = 1; // Habilita contagem de tempo. } else if(CCP1IF_bit) { CCP1IF_bit = 0; // Limpa a flag para nova captura TMR1ON_bit = 0; // Desabilita contagem de tempo. CCP1IE_bit = 0; // Desabilita interrupcao por perifericos(CCP1) CCP1CON = 5; // Configura a borda de captura para SUBIDA. CCP1IE_bit = 1; // Habilita interrupcao por perifericos(CCP1) Tempo_H = CCPR1H; Tempo_L = CCPR1L; // Carrega valores de tempo capturado } } //Rotina Principal void main(){TRISD = 0b00000000;TRISE = 0b00000000;TRISC = 0b00000100; // Entrada CCP1PORTC = 0b00000000;ANSEL = 0b00000000; // Entradas digitais.ANSELH = 0b00000000; // Entradas digitais.INTCON = 0b11000000; // Liga interruptores GIE e PEIETMR1IE_bit = 0; // Desabilita interrpcoes de TMR1CCP1IE_Bit = 1; // Habilita interrupcoes por CAPTURA(CCP1)CCP1CON = 5; // CCP1 para CAPTURA borda de SUBIDA. T1CKPS1_bit = 0; // Prescaller TMR1 2:1T1CKPS0_bit = 1;TMR1CS_bit = 0; // Clock selecionado -> OSC/4TMR1ON_bit = 0; // Timer -> 1 = Habilita contagem Lcd_Init();Lcd_Cmd(_Lcd_Cursor_Off);Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"*** PK2Lab ***");Lcd_Out(2,1,"Pulso us: ");Delay_ms(100); while(1){ Delay_ms(100); // Intervalo entre leituras. Pulso = (Tempo_H<<8)+ Tempo_L; // Obtencao do pulso PPM IntToStr(Pulso, txt); // Converte texto para impressao Lcd_Out(2,11,txt); // Mostra Pulso em us no display if(Pulso > 1600) PORTE.B1 = 1; else PORTE.B1 = 0; if(Pulso > 1100) PORTD.B0 = 1; else PORTD.B0 = 0; if(Pulso > 1200) PORTD.B1 = 1; else PORTD.B1 = 0; if(Pulso > 1300) PORTD.B2 = 1; else PORTD.B2 = 0; if(Pulso > 1400) PORTD.B3 = 1; else PORTD.B3 = 0; if(Pulso > 1500) PORTD.B4 = 1; else PORTD.B4 = 0; if(Pulso > 1600) PORTD.B5 = 1; else PORTD.B5 = 0; if(Pulso > 1700) PORTD.B6 = 1; else PORTD.B6 = 0; if(Pulso > 1800) PORTD.B7 = 1; else PORTD.B7 = 0; }//while(1)}//main /****************************************************************************** Video do projeto