//////////////////////////////////////////////////////////////////////////////// // // // CR_TX_PWM2C_3B_C // // // // (TX) TRANSMISSOR PARA CONTROLE REMOTO PWM DE 2 CANAIS E 3 ON/OFF // TRABALHA EM CONJUNTO COM RECEPTOR CR_RX_PWM2C_3B_C // AUTOR: CLÁUDIO LÁRIOS // INÍCIO: 15/11/2013 TÉRMINO: 15/11/2013 // LIBERADO USO PARA FINS DIDÁTICOS APENAS. // // TAMBÉM, EM CASO DE PERDA DO BYTE DE CALIBRAÇÃO, PODE SER USADO UM PROVISÓRIO // OBS.SUJEITO A BUGS AINDA NÃO OBSERVADOS EM USO. MONTAGEM REALIZADA E TESTADA // SOMENTE EM PLACA DE PROTOBOARD. //============================================================================== //============================================================================== // ATENÇÃO: CERTIFIQUE DE EXISTIR O BYTE DE CALIBRAÇÃO NO ENDEREÇO 3FFH DA FLASH // Caso tenha sido apagado acidentalmente, ao ligar, após a programação do pic, // NÃO funcionará. O programa irá fazer um 'call'para buscar o byte de calibra- // ção, mas não encontrará a instrução de retorno 'retlw xx'. Isto fará o progra- // se perder, resetando continuamente. // COMO SABER SE TENHO O BYTE DE CALIBRAÇÃO NO PIC? // LENDO A FLASH COM UM PROGRAMADOR, DEVERÁ SER ENCONTRADO NO ENDEREÇO 0X3FF, UM // VALOR COMEÇANDO COM 34 SEGUIDO DE 2 DIGITOS. EX. 3480. (34=RETLW 80= LITERAL // QUE SERÁ RETORNADO EM 'W' PARA CARGA DO REGISTRADOR '0SCCAL'. #define PERDI_BYTE_CALIBRACAO //Descomente o acima se você tem um pic que foi apagado o byte de calibração. //Será substituido por valor padrão que permita a operação do circuito. // //============================================================================== #include <12F675.h> #fuses INTRC_IO,NOWDT,NOPROTECT, NOMCLR ,BROWNOUT, PUT // palavra configuração #use delay(clock=4000000) // clock para 4 mhz #use fast_io(A) // sentido das portas feita pelo programador #ifdef PERDI_BYTE_CALIBRACAO // calibração do oscilador interno do pic #ROM 0X3FF = {0X3440}//máxima freq= 0x34fc ;média=0x3480; minima=0x3400 #endif #ignore_warnings 203 //desconsidera mensagem de 'condition always true' int8 buffer[5]= {0,0,0,0,0}; #locate buffer=0x40 #byte trisio=0x85 #byte wpu=0x95 #byte option_reg=0x81 #BYTE GPIO = 0X05 #BYTE ADCON0=0X1F //B7=ADFM/B6=VCFG/B4=CHS1/BB3=CHS #bit out_tx = gpio.5 byte const TRIS_GPIO = 0b011111; //SENTIDO DAS PORTAS gp5=saida para tx byte const serial_number =0x57 ; //serial number para este receptor // // tem que ser igual do TX long byte const te = 500; //tempo básico do bit a transmitir (em us) void env_bit1(){ out_tx=0; delay_us(2*te); out_tx=1; delay_us(te); out_tx=0; } void env_bit0(){ out_tx=0; delay_us(te); out_tx=1; delay_us(2*te); out_tx=0; } void start_bit(){ out_tx=1; delay_us(te); out_tx=0; } void main() { setup_adc_ports(sAN2|sAN3|VSS_VDD ); setup_adc(ADC_CLOCK_DIV_8); // setup_counters(RTCC_INTERNAL,RTCC_DIV_1); // setup_timer_1(T1_DISABLED); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); gpio=0; wpu=0x03;//pullup option_reg&=0x7f;//ligados TRISIO= TRIS_GPIO;// ajusta trisio while(true){ int a; buffer[4]= serial_number; buffer[0]+=serial_number; set_adc_channel(2); delay_us(50); bit_clear(adcon0,7);// justifica a esquerda buffer[3]=read_adc(); buffer[0]+=buffer[3]; set_adc_channel(3); delay_us(50); bit_clear(adcon0,7);// justifica a esquerda buffer[2]=read_adc(); buffer[0]+=buffer[2]; buffer[1]= input_a() ; buffer[1]&=0b00001011; buffer[0]+=buffer[1]; start_bit(); for (a=0;a<40;++a){ if ((bit_test(buffer[0],0)) == true){ env_bit1();} else { env_bit0(); } shift_right(buffer,5,0); } delay_us(11 * te); //pausa entre transmissões } }