CCS PCM C Compiler, Version 3.200, 16465 Filename: C:\Arquivos de programas\PICC\proj_c\rx_gen_ht6p_V4.LST ROM used: 801 words (78%) Largest free fragment is 223 RAM used: 22 (34%) at main() level 29 (45%) worst case Stack: 3 locations * 0000: MOVLW 00 0001: MOVWF 0A 0002: GOTO 004 0003: NOP 0004: CALL 3FF 0005: BSF 03.5 0006: MOVWF 10 0007: MOVLW 00 0008: MOVWF 0A 0009: GOTO 30B .................... .................... /************************************************************************** .................... ; PLACA PARA CONTROLE REMOTO DE PORTÃO PARA 2 MOTORES INDEPENDENTES .................... ; VERSÃO 'C' PARA COMPILADOR 'PCW C COMPILER IDE' .................... ; .................... ; COMO TRANSMISSOR, USAR QUALQUER TRANSMISSOR ('CHAVEIRINHO') .................... ; COM INTEGRADO HT6P20B. .................... ; PARA DECODIFICAR UTILIZA UM PIC 12F675. .................... ; UTILIZA 4 RELES PARA CONTROLAR 2 MOTORES LIGADO A 2 PORTÕES POR CREMALHEIRA. .................... ; TRABALHA COM 4 FINS DE CURSO TIPO RED SWITCH (COM IMÃS) LIGADOS A M1, M2, .................... ; M3 E M4 , VIA RESISTORES DE PROTEÇÃO. .................... ; APÓS ACIONAR RELE DO MOTOR, TEM UMA TEMPORIZAÇÃO MAXIMA (TMAX) DE MODO .................... ; QUE ESTE FICA LIGADO POR APENAS 35 SEG., SENDO REGULAVEL NO PROGRAMA, .................... ; ALTERANDO A CONSTANTE 'C_TEMPO_SAIDA_ON '. .................... ; OBS. NÃO USA INTERRUPÇÕES. .................... ; .................... ; CLAUDIO LÁRIOS INICIO: 20-02-2013 TERMINO:22-05-2013 .................... ; .................... .................... ;************************************************************************** .................... ; .................... ; GRAVAR CONTROLE: APERTE UM DOS BOTÕES DO C. REMOTO E MANTENHA APERTADO. .................... ; APERTE TAMBÉM O BOTÃO 'LEARN_A' (CANAL A) OU 'LEARN_B'(CANAL B) NA PLACA E .................... ; SOLTE-O EM MENOS DE 2 SEGUNDOS. DEVERÁ ACIONAR UMA SAIDA DE RELE PARA .................... ; O MOTOR , SE FOI BEM SUCEDIDO O APRENDIZADO. O LED VERMELHO PISCARÁ 1 .................... ; VEZ, PARA INDICAR ISTO. REPITA ISTO COM TODOS OS BOTÕES DO CONTROLE REMO .................... ; TO , UM POR VEZ. .................... ; APAGAR TODOS OS CONTROLES DA MEMÓRIA: APERTAR BOTÃO 'LEARN_A' PARA CANAL .................... ; 'A' E 'LEARN_B' PARA CANAL 'B', NA PLACA E MANTENHA PRESSIONADO POR MAIS .................... DE 10 SEGUNDOS. O LED VERMELHO PISCARÁ 3 VEZES , INDICANDO O PLENO .................... APAGAMENTO DE TODOS OS CONTROLES DA MEMÓRIA. .................... ;******************************************************************************/ .................... .................... .................... //Escolha o modelo de microcontrolador (comente o não usado) .................... #include <12f675.h> .................... //////// Standard Header file for the PIC12F675 device //////////////// .................... #device PIC12F675 .................... #list .................... .................... //#include <12f629.h> .................... //****************************************************************************** .................... //PALAVRA DE CONFIGURAÇÃO .................... #fuses INTRC_IO,NOWDT,NOPROTECT, NOMCLR .................... #use delay(clock=4000000) * 00B8: MOVLW 3B 00B9: MOVWF 04 00BA: MOVF 00,W 00BB: BTFSC 03.2 00BC: GOTO 0CC 00BD: MOVLW 01 00BE: MOVWF 21 00BF: CLRF 20 00C0: DECFSZ 20,F 00C1: GOTO 0C0 00C2: DECFSZ 21,F 00C3: GOTO 0BF 00C4: MOVLW 4A 00C5: MOVWF 20 00C6: DECFSZ 20,F 00C7: GOTO 0C6 00C8: NOP 00C9: NOP 00CA: DECFSZ 00,F 00CB: GOTO 0BD 00CC: RETLW 00 .................... .................... //DEFINIÇÕES DE PINOS E CONSTANTES .................... #define LRN PIN_A0 //PINO 7 IN LEARN BOTTON .................... #DEFINE LED PIN_A0 //PINO 7 OUT LED (MESMO PINO DO ACIMA) .................... #DEFINE C_Z1 220 // TEMPO PARA APAGAR EEPROM .................... #DEFINE TMAX 40 // CONTAGEM MÁXIMA PARA VALOR ACEITAVEL .................... #DEFINE C_TEMPO_BOTAO_AP 10 //TEMPO DE ESPERA QUANDO SOLTA BOTÃO DO TX .................... #DEFINE C_TEMPO_SAIDA_ON 3 //PARA 30 SEGUNDOS MÁXIMO LIGADO .................... .................... #BYTE TRISIO = 0X85 .................... #BYTE FLAGS = 0X5F // FIXA POSIÇÃO PARA REGISTRADOR .................... #BYTE FLAGS1 = 0X5E // FIXA POSIÇÃO PARA REGISTRADOR .................... .................... #BIT FLAG = FLAGS.0 // FLAG DE SITUAÇÃO .................... #BIT FLAG1 = FLAGS.1 // FLAG DE NOVA LEITURA .................... #BIT FLAGGR = FLAGS.2 // FLAG DE 'LEARN' APRENDER .................... #BIT FLAG_A = FLAGS.3 // FLAG AUX .................... #BIT FLAG_AE = FLAGS.4 // FLAG AUX .................... #BIT FLAG_BAA = FLAGS.5 // FLAG DE BOTÃO AINDA APERTADO .................... #BIT F_A = FLAGS.6 // FLAG DE CANAL 'A' .................... #BIT C1 = FLAGS.7 // BIT AUXILIAR .................... #BIT FLAG_BAP = FLAGS1.0 // FLAG DE 'PAROU DE APERTAR BOTÃO' .................... #BIT FLAG_TA = FLAGS1.1 // FLAG REED ACIONADO .................... #BIT FLAG_TB = FLAGS1.2 // FLAG REED ACIONADO .................... .................... .................... #BIT TRIS_LRN = 0X85.0 // TRISIO.0 .................... #BIT LEARN = 0X05.0 // LRN .................... .................... #BYTE GPIO = 0X05 .................... #BIT M4 = 0X5.5 //PINO 2 .................... #BIT M3 = 0X5.4 //PINO 3 .................... #BIT M2 = 0X5.2 //PINO 5 .................... #BIT M1 = 0X5.1 //PINO 6 .................... #BIT SIN = 0X5.3 //PINO 4 .................... .................... #BIT TRIS_M4 = 0X85.5 //PINO 2 .................... #BIT TRIS_M3 = 0X85.4 //PINO 3 .................... #BIT TRIS_M2 = 0X85.2 //PINO 5 .................... #BIT TRIS_M1 = 0X85.1 //PINO 6 .................... .................... // VARIAVÉIS GLOBAIS .................... INT RES0,RES1,RES2,RES3,RES0A,RES1A,RES2A,QB,LC,HC,Z1,Z0,Y1,Y0,W0,W1,W2,U0,U1,U2; .................... // MODO DE COMPILAÇÃO .................... #use fast_io(a) //modo rápido de entrada e saída .................... .................... //DECLARAÇÃO DE SUBROTINAS .................... VOID CONFIG_INIT (VOID); .................... VOID TESTA_APAGAR_MEM (VOID); .................... VOID SHIFT_RESULT (INT A, INT1 B); .................... VOID APAGAR (VOID); .................... VOID REG_INIT(VOID); .................... VOID _ERRO (VOID); .................... VOID ERASE_3BYTES (INT I); .................... VOID ESCREVE_RES210 (INT I); .................... INT RECEIVE (VOID); .................... VOID TESTA_FIM_DE_CURSOS (VOID); .................... INT TESTA_LRN (VOID); .................... VOID TESTA_APAGAR_MEM (VOID); .................... VOID PISCA (INT I); .................... VOID APAGAR (VOID); .................... INT GRAVAR_CONTROLE (VOID); .................... INT TESTA_LRN (VOID); .................... VOID SALVA_PRIMEIRA_REC (VOID); .................... VOID GRAVAR_TX_NA_MEM (VOID); .................... VOID RECEBE_TX (VOID); .................... VOID TESTA_TX_ON (VOID); .................... VOID TESTA_TEMPO_MAX_LIG (VOID); .................... VOID TEMPORIZAR_SAIDA_A (VOID); .................... VOID TEMPORIZAR_SAIDA_B (VOID); .................... /******************************************************************************* .................... * SUBROTINAS .................... *******************************************************************************/ .................... .................... .................... /******************************************************************************* .................... CONFIG_INIT .................... *******************************************************************************/ .................... VOID CONFIG_INIT (VOID) .................... { .................... .................... //configurações .................... TRISIO=0b00001001;// Define entradas e saídas * 0010: MOVLW 09 0011: BSF 03.5 0012: MOVWF 05 .................... setup_comparator (nc_nc_nc_nc); //desliga comparadores 0013: MOVLW 07 0014: BCF 03.5 0015: MOVWF 19 0016: BSF 03.5 0017: MOVF 05,W 0018: MOVLW 03 0019: BCF 03.5 001A: MOVWF 20 001B: DECFSZ 20,F 001C: GOTO 01B 001D: MOVF 19,W 001E: BCF 0C.3 .................... #if __device__ == 675 // P/ 12f675, desliga o conversor AD .................... setup_adc_ports(no_analogs); //todas as portas são digitais 001F: MOVF 1F,W 0020: ANDLW BF 0021: MOVWF 1F 0022: BSF 03.5 0023: MOVF 1F,W 0024: ANDLW F0 0025: MOVWF 1F .................... #endif .................... GPIO=0; //DESLIGAS SAÍDAS 0026: BCF 03.5 0027: CLRF 05 .................... FLAGS=0; 0028: CLRF 5F .................... FLAGS1=0; 0029: CLRF 5E .................... REG_INIT(); 002A: CALL 00A .................... .................... .................... } 002B: GOTO 31A (RETURN) .................... /******************************************************************************* .................... SHIFT_RESULT .................... *******************************************************************************/ .................... .................... //ROTINA PARA DESLOCAR RES3,RES2,RES1,RES0 PARA DIREITA .................... // SENDO A= NUMERO DE VEZES QUE SERÁ DESLOCADO E B= O BIT .................... // A SER INTRODUZIDO NO DESLOCAMENTO (0 OU 1) .................... VOID SHIFT_RESULT (INT A, INT1 B) .................... { .................... WHILE (A){ * 016A: MOVF 38,F 016B: BTFSC 03.2 016C: GOTO 179 .................... SHIFT_RIGHT (&RES0,4,B); 016D: MOVF 39,F 016E: BTFSS 03.2 016F: GOTO 172 0170: BCF 03.0 0171: GOTO 173 0172: BSF 03.0 0173: RRF 25,F 0174: RRF 24,F 0175: RRF 23,F 0176: RRF 22,F .................... A--;} 0177: DECF 38,F 0178: GOTO 16A .................... } 0179: RETLW 00 .................... .................... /******************************************************************************* .................... REG_INIT .................... *******************************************************************************/ .................... .................... .................... VOID REG_INIT(VOID) .................... { QB=28; * 000A: MOVLW 1C 000B: MOVWF 29 .................... LC=0; 000C: CLRF 2A .................... HC=0; 000D: CLRF 2B .................... FLAG=0;} 000E: BCF 5F.0 000F: RETLW 00 .................... /******************************************************************************* .................... ERRO .................... *******************************************************************************/ .................... .................... VOID _ERRO (VOID) .................... { RES2A=0; * 017A: CLRF 28 .................... RES1A=0; 017B: CLRF 27 .................... RES0A=0; 017C: CLRF 26 .................... REG_INIT(); 017D: CALL 00A .................... } 017E: RETLW 00 .................... /******************************************************************************* .................... ERASE_3BYTES .................... /******************************************************************************/ .................... VOID ERASE_3BYTES (INT I) .................... { write_eeprom (I, 0XFF); * 00CD: MOVF 39,W 00CE: BSF 03.5 00CF: MOVWF 1B 00D0: MOVLW FF 00D1: MOVWF 1A 00D2: BSF 1C.2 00D3: BCF 03.5 00D4: MOVF 0B,W 00D5: MOVWF 20 00D6: BCF 0B.7 00D7: BSF 03.5 00D8: MOVLW 55 00D9: MOVWF 1D 00DA: MOVLW AA 00DB: MOVWF 1D 00DC: BSF 1C.1 00DD: BTFSC 1C.1 00DE: GOTO 0DD 00DF: BCF 1C.2 00E0: BCF 03.5 00E1: MOVF 20,W 00E2: IORWF 0B,F .................... write_eeprom (--I, 0XFF); //(I-1, 0XFF) 00E3: DECF 39,F 00E4: MOVF 39,W 00E5: BSF 03.5 00E6: MOVWF 1B 00E7: MOVLW FF 00E8: MOVWF 1A 00E9: BSF 1C.2 00EA: BCF 03.5 00EB: MOVF 0B,W 00EC: MOVWF 20 00ED: BCF 0B.7 00EE: BSF 03.5 00EF: MOVLW 55 00F0: MOVWF 1D 00F1: MOVLW AA 00F2: MOVWF 1D 00F3: BSF 1C.1 00F4: BTFSC 1C.1 00F5: GOTO 0F4 00F6: BCF 1C.2 00F7: BCF 03.5 00F8: MOVF 20,W 00F9: IORWF 0B,F .................... write_eeprom (--I, 0XFF);} 00FA: DECF 39,F 00FB: MOVF 39,W 00FC: BSF 03.5 00FD: MOVWF 1B 00FE: MOVLW FF 00FF: MOVWF 1A 0100: BSF 1C.2 0101: BCF 03.5 0102: MOVF 0B,W 0103: MOVWF 20 0104: BCF 0B.7 0105: BSF 03.5 0106: MOVLW 55 0107: MOVWF 1D 0108: MOVLW AA 0109: MOVWF 1D 010A: BSF 1C.1 010B: BTFSC 1C.1 010C: GOTO 10B 010D: BCF 1C.2 010E: BCF 03.5 010F: MOVF 20,W 0110: IORWF 0B,F 0111: RETLW 00 .................... .................... .................... /******************************************************************************* .................... ESCREVE 3 BYTES NA EEPROM .................... /******************************************************************************/ .................... .................... VOID ESCREVE_RES210 (INT I) .................... { .................... write_eeprom (I, RES0); // estava I, RES2); * 017F: MOVF 3C,W 0180: BSF 03.5 0181: MOVWF 1B 0182: BCF 03.5 0183: MOVF 22,W 0184: BSF 03.5 0185: MOVWF 1A 0186: BSF 1C.2 0187: BCF 03.5 0188: MOVF 0B,W 0189: MOVWF 20 018A: BCF 0B.7 018B: BSF 03.5 018C: MOVLW 55 018D: MOVWF 1D 018E: MOVLW AA 018F: MOVWF 1D 0190: BSF 1C.1 0191: BTFSC 1C.1 0192: GOTO 191 0193: BCF 1C.2 0194: BCF 03.5 0195: MOVF 20,W 0196: IORWF 0B,F .................... write_eeprom (--I, RES1); // estava I, RES1); 0197: DECF 3C,F 0198: MOVF 3C,W 0199: BSF 03.5 019A: MOVWF 1B 019B: BCF 03.5 019C: MOVF 23,W 019D: BSF 03.5 019E: MOVWF 1A 019F: BSF 1C.2 01A0: BCF 03.5 01A1: MOVF 0B,W 01A2: MOVWF 20 01A3: BCF 0B.7 01A4: BSF 03.5 01A5: MOVLW 55 01A6: MOVWF 1D 01A7: MOVLW AA 01A8: MOVWF 1D 01A9: BSF 1C.1 01AA: BTFSC 1C.1 01AB: GOTO 1AA 01AC: BCF 1C.2 01AD: BCF 03.5 01AE: MOVF 20,W 01AF: IORWF 0B,F .................... write_eeprom (--I, RES2); // estava I, RES0); 01B0: DECF 3C,F 01B1: MOVF 3C,W 01B2: BSF 03.5 01B3: MOVWF 1B 01B4: BCF 03.5 01B5: MOVF 24,W 01B6: BSF 03.5 01B7: MOVWF 1A 01B8: BSF 1C.2 01B9: BCF 03.5 01BA: MOVF 0B,W 01BB: MOVWF 20 01BC: BCF 0B.7 01BD: BSF 03.5 01BE: MOVLW 55 01BF: MOVWF 1D 01C0: MOVLW AA 01C1: MOVWF 1D 01C2: BSF 1C.1 01C3: BTFSC 1C.1 01C4: GOTO 1C3 01C5: BCF 1C.2 01C6: BCF 03.5 01C7: MOVF 20,W 01C8: IORWF 0B,F .................... .................... } 01C9: RETLW 00 .................... .................... /******************************************************************************* .................... SALVA_PRIMEIRA_REC .................... *******************************************************************************/ .................... VOID SALVA_PRIMEIRA_REC (VOID) .................... .................... { FLAG1=1; * 020F: BSF 5F.1 .................... RES2A=RES2; // SALVA A PRIMEIRA RECEPÇÃO 0210: MOVF 24,W 0211: MOVWF 28 .................... RES1A=RES1; 0212: MOVF 23,W 0213: MOVWF 27 .................... RES0A=RES0; 0214: MOVF 22,W 0215: MOVWF 26 .................... REG_INIT(); 0216: CALL 00A .................... } .................... /******************************************************************************* .................... RECEIVE .................... *******************************************************************************/ .................... .................... INT RECEIVE (VOID) .................... { .................... .................... IF (SIN) //ENTRADA SIN = 1 * 01CA: BTFSS 05.3 01CB: GOTO 1D1 .................... { FLAG=1; 01CC: BSF 5F.0 .................... HC++; 01CD: INCFSZ 2B,F .................... IF (!HC) HC--; 01CE: GOTO 1D0 01CF: DECF 2B,F .................... } .................... ELSE 01D0: GOTO 200 .................... { IF (FLAG) //ENTRADA SIN = 0 01D1: BTFSS 5F.0 01D2: GOTO 1FD .................... { IF (LC>TMAX) 01D3: MOVF 2A,W 01D4: SUBLW 28 01D5: BTFSC 03.0 01D6: GOTO 1DC .................... { REG_INIT(); 01D7: CALL 00A .................... RETURN 0 ; } 01D8: MOVLW 00 01D9: MOVWF 21 01DA: GOTO 208 .................... ELSE 01DB: GOTO 1FC .................... { IF (LC>HC) //ESTAVA LC0X7F) 014C: MOVF 37,W 014D: SUBLW 7F 014E: BTFSC 03.0 014F: GOTO 156 .................... { .................... IF (F_A) //ESTAVA (F_A==1) 0150: BTFSS 5F.6 0151: GOTO 155 .................... ERASE_3BYTES (I); 0152: MOVF 38,W 0153: MOVWF 39 0154: CALL 0CD .................... } .................... ELSE 0155: GOTO 15B .................... { IF (!F_A) //ESTAVA (F_A==0) 0156: BTFSC 5F.6 0157: GOTO 15B .................... ERASE_3BYTES (I); 0158: MOVF 38,W 0159: MOVWF 39 015A: CALL 0CD .................... } .................... .................... } 015B: DECF 38,F 015C: GOTO 13C .................... } .................... .................... .................... .................... /******************************************************************************* .................... GRAVAR_TX _NA_MEM .................... *******************************************************************************/ .................... .................... VOID GRAVAR_TX_NA_MEM (VOID) .................... { .................... INT TEMP,I; .................... .................... IF (FLAGGR) //TESTA FLAG 'LEARN' * 02B2: BTFSS 5F.2 02B3: GOTO 30A .................... { .................... I= GRAVAR_CONTROLE (); // GRAVA NA MEMÓRIA RES2..0 , CONFORME O FLAG_A * 02F5: MOVF 21,W 02F6: MOVWF 39 .................... IF (I) 02F7: MOVF 39,F 02F8: BTFSC 03.2 02F9: GOTO 2FE .................... {PISCA(1);} //OK, GRAVOU ,PISCA 1 VEZ O LED LEARN 02FA: MOVLW 01 02FB: MOVWF 3A 02FC: CALL 112 .................... ELSE 02FD: GOTO 301 .................... { PISCA (10);} //MEMÓRIA CHEIA, NÃO GRAVOU, PISCA 10 VEZES 02FE: MOVLW 0A 02FF: MOVWF 3A 0300: CALL 112 .................... TEMP=1; 0301: MOVLW 01 0302: MOVWF 38 .................... WHILE (TEMP) .................... { 0303: MOVF 38,F 0304: BTFSC 03.2 0305: GOTO 30A .................... TEMP= TESTA_LRN(); //ESPERA SOLTAR BOTÃO 'LEARN_A'OU 'B' 0306: CALL 07E 0307: MOVF 21,W 0308: MOVWF 38 .................... } 0309: GOTO 303 .................... .................... } .................... } .................... /******************************************************************************* .................... BUSCA POSIÇÃO LIVRE PARA GRAVAR CONTROLE .................... /******************************************************************************/ .................... .................... .................... .................... .................... INT GRAVAR_CONTROLE (VOID) .................... { .................... .................... INT VALUE,I; .................... .................... FOR (I=0X7D;I!=0XFF;I=I-3) * 02B4: MOVLW 7D 02B5: MOVWF 3B 02B6: INCFSZ 3B,W 02B7: GOTO 2B9 02B8: GOTO 2F3 .................... { .................... VALUE = read_eeprom (I); 02B9: MOVF 3B,W 02BA: BSF 03.5 02BB: MOVWF 1B 02BC: BCF 1C.7 02BD: BSF 1C.0 02BE: MOVF 1A,W 02BF: BCF 03.5 02C0: MOVWF 3A .................... {IF (VALUE==0XFF) 02C1: INCFSZ 3A,W 02C2: GOTO 2CD .................... VALUE = read_eeprom (I-1); 02C3: MOVLW 01 02C4: SUBWF 3B,W 02C5: MOVWF 3C 02C6: BSF 03.5 02C7: MOVWF 1B 02C8: BCF 1C.7 02C9: BSF 1C.0 02CA: MOVF 1A,W 02CB: BCF 03.5 02CC: MOVWF 3A .................... {IF (VALUE==0XFF) 02CD: INCFSZ 3A,W 02CE: GOTO 2D9 .................... VALUE = read_eeprom (I-2); 02CF: MOVLW 02 02D0: SUBWF 3B,W 02D1: MOVWF 3C 02D2: BSF 03.5 02D3: MOVWF 1B 02D4: BCF 1C.7 02D5: BSF 1C.0 02D6: MOVF 1A,W 02D7: BCF 03.5 02D8: MOVWF 3A .................... {IF (VALUE==0XFF) 02D9: INCFSZ 3A,W 02DA: GOTO 2EF .................... {IF (F_A)// ESTAVA IF (F_A==1) 02DB: BTFSS 5F.6 02DC: GOTO 2E7 .................... { RES2= RES2|0X80; //SETA RES2.7 02DD: BSF 24.7 .................... ESCREVE_RES210 (I); 02DE: MOVF 3B,W 02DF: MOVWF 3C 02E0: CALL 17F .................... F_A=0; 02E1: BCF 5F.6 .................... FLAGGR=0; 02E2: BCF 5F.2 .................... RETURN (1); } 02E3: MOVLW 01 02E4: MOVWF 21 02E5: GOTO 2F5 .................... ELSE 02E6: GOTO 2EF .................... { RES2=RES2 & 0X7F; //ZERA RES2.7 02E7: BCF 24.7 .................... ESCREVE_RES210 (I); 02E8: MOVF 3B,W 02E9: MOVWF 3C 02EA: CALL 17F .................... FLAGGR=0; 02EB: BCF 5F.2 .................... RETURN (1); } 02EC: MOVLW 01 02ED: MOVWF 21 02EE: GOTO 2F5 .................... .................... } .................... .................... .................... } .................... } .................... } .................... .................... { continue;} 02EF: GOTO 2F0 .................... .................... } 02F0: MOVLW 03 02F1: SUBWF 3B,F 02F2: GOTO 2B6 .................... RETURN (0); 02F3: MOVLW 00 02F4: MOVWF 21 .................... } .................... .................... .................... .................... /******************************************************************************* .................... RECEBE_TX .................... /******************************************************************************/ .................... .................... .................... VOID RECEBE_TX (VOID) .................... { .................... INT TEMP,I; //variavéis locais .................... TEMP= RECEIVE(); //rotina de recepção de sinal rf * 0208: MOVF 21,W 0209: MOVWF 36 .................... IF (TEMP) 020A: MOVF 36,F 020B: BTFSC 03.2 020C: GOTO 30A .................... { .................... IF (!FLAG1) 020D: BTFSC 5F.1 020E: GOTO 218 .................... SALVA_PRIMEIRA_REC(); .................... ELSE * 0217: GOTO 30A .................... { IF (!((RES2^0XFF) | (RES1^0XFF) | (RES0^0XFF)))//ELIMINA FALSA RECEPÇÃO 0218: MOVF 24,W 0219: XORLW FF 021A: MOVWF 38 021B: MOVF 23,W 021C: XORLW FF 021D: IORWF 38,W 021E: MOVWF 39 021F: MOVF 22,W 0220: XORLW FF 0221: IORWF 39,W 0222: XORLW 00 0223: BTFSS 03.2 0224: GOTO 227 .................... { _ERRO();} 0225: CALL 17A .................... ELSE 0226: GOTO 30A .................... { .................... // SEGUNDA RECEPÇÃO, COMPARA COM A PRIMEIRA .................... FLAG1=0; //RESETA FLAG1 0227: BCF 5F.1 .................... IF (((RES2^RES2A) | (RES1^RES1A) | (RES0^RES0A))) 0228: MOVF 24,W 0229: XORWF 28,W 022A: MOVWF 38 022B: MOVF 23,W 022C: XORWF 27,W 022D: IORWF 38,W 022E: MOVWF 39 022F: MOVF 22,W 0230: XORWF 26,W 0231: IORWF 39,W 0232: XORLW 00 0233: BTFSC 03.2 0234: GOTO 236 .................... {_ERRO();} // RECEPÇÃO 1 DIFERENTE DA 2; ERRO DE RECEPÇÃO 0235: CALL 17A .................... //RECEPÇÃO 1 IGUAL RECEPÇÃO 2; SEGUE COMPARANDO RES2...0 COM EEPROM .................... IF (RES2>0X7F) 0236: MOVF 24,W 0237: SUBLW 7F 0238: BTFSC 03.0 0239: GOTO 23D .................... {FLAG_A=1; 023A: BSF 5F.3 .................... RES2= RES2 & 0X7F;} //APAGA RES2.7 023B: BCF 24.7 .................... ELSE 023C: GOTO 23E .................... {FLAG_A=0;} 023D: BCF 5F.3 .................... .................... FOR (I=0X7D; I>0; I=I-3) 023E: MOVLW 7D 023F: MOVWF 37 0240: MOVF 37,F 0241: BTFSC 03.2 0242: GOTO 2B2 .................... {RES3= READ_EEPROM(I-2); 0243: MOVLW 02 0244: SUBWF 37,W 0245: MOVWF 38 0246: BSF 03.5 0247: MOVWF 1B 0248: BCF 1C.7 0249: BSF 1C.0 024A: MOVF 1A,W 024B: BCF 03.5 024C: MOVWF 25 .................... RES3= RES3 & 0X7F; //APAGA RES2.7 024D: BCF 25.7 .................... IF ((RES0^READ_EEPROM(I))|(RES1^READ_EEPROM(I-1))|(RES2^RES3)) 024E: MOVF 37,W 024F: BSF 03.5 0250: MOVWF 1B 0251: BCF 1C.7 0252: BSF 1C.0 0253: MOVF 1A,W 0254: BCF 03.5 0255: XORWF 22,W 0256: MOVWF 38 0257: MOVLW 01 0258: SUBWF 37,W 0259: MOVWF 39 025A: BSF 03.5 025B: MOVWF 1B 025C: BCF 1C.7 025D: BSF 1C.0 025E: MOVF 1A,W 025F: BCF 03.5 0260: XORWF 23,W 0261: IORWF 38,W 0262: MOVWF 3A 0263: MOVF 24,W 0264: XORWF 25,W 0265: IORWF 3A,W 0266: XORLW 00 0267: BTFSC 03.2 0268: GOTO 26B .................... { .................... CONTINUE; 0269: GOTO 2AF .................... } // PASSA PARA O PRÓXIMO CICLO DO LAÇO 'FOR' .................... ELSE 026A: GOTO 2AF .................... { // ENDEREÇO ENCONTRADO ; ACIONAR .................... // QUAL CANAL ACIONAR ? .................... RES3= READ_EEPROM(I-2); //TESTA RES2.7, CANAL A=1 / B='0' 026B: MOVLW 02 026C: SUBWF 37,W 026D: MOVWF 38 026E: BSF 03.5 026F: MOVWF 1B 0270: BCF 1C.7 0271: BSF 1C.0 0272: MOVF 1A,W 0273: BCF 03.5 0274: MOVWF 25 .................... IF (RES3 > 0x7F) 0275: MOVF 25,W 0276: SUBLW 7F 0277: BTFSC 03.0 0278: GOTO 27B .................... FLAG_A=1; 0279: BSF 5F.3 .................... ELSE 027A: GOTO 27C .................... FLAG_A=0; 027B: BCF 5F.3 .................... IF (!FLAG_BAP) 027C: BTFSC 5E.0 027D: GOTO 2AA .................... { .................... { IF (RES2 & 0X40) //SE RES2.6 = '1' ACIONA M1 OU M2 DO 'A' 027E: BTFSS 24.6 027F: GOTO 295 .................... {M1=FLAG_TA; //ACIONA M1 OU M2 0280: BTFSS 5E.1 0281: BCF 05.1 0282: BTFSC 5E.1 0283: BSF 05.1 .................... M2=!M1; 0284: MOVLW 00 0285: BTFSS 05.1 0286: MOVLW 01 0287: MOVWF 21 0288: BTFSC 21.0 0289: GOTO 28C 028A: BCF 05.2 028B: GOTO 28D 028C: BSF 05.2 .................... FLAG_TA=M2; 028D: BCF 5E.1 028E: BTFSC 05.2 028F: BSF 5E.1 .................... TEMPORIZAR_SAIDA_A();} .................... ELSE * 0294: GOTO 2A9 .................... {M3=FLAG_TB; //ACIONA M3 OU M4 0295: BTFSS 5E.2 0296: BCF 05.4 0297: BTFSC 5E.2 0298: BSF 05.4 .................... M4=!M3; 0299: MOVLW 00 029A: BTFSS 05.4 029B: MOVLW 01 029C: MOVWF 21 029D: BTFSC 21.0 029E: GOTO 2A1 029F: BCF 05.5 02A0: GOTO 2A2 02A1: BSF 05.5 .................... FLAG_TB=M4; 02A2: BCF 5E.2 02A3: BTFSC 05.5 02A4: BSF 5E.2 .................... TEMPORIZAR_SAIDA_B();} .................... } .................... FLAG_BAP=1; * 02A9: BSF 5E.0 .................... } .................... Y1= C_TEMPO_BOTAO_AP; 02AA: MOVLW 0A 02AB: MOVWF 2E .................... FLAGGR=0; //APAGA 02AC: BCF 5F.2 .................... REG_INIT(); 02AD: CALL 00A .................... BREAK; //ENCERRA LOOP 'FOR' ANTECIPADO 02AE: GOTO 2B2 .................... } .................... } 02AF: MOVLW 03 02B0: SUBWF 37,F 02B1: GOTO 240 .................... GRAVAR_TX_NA_MEM (); .................... } .................... } .................... } .................... } * 030A: GOTO 31F (RETURN) .................... .................... /******************************************************************************* .................... TESTA_TEX_ON .................... *******************************************************************************/ .................... .................... VOID TESTA_TX_ON (VOID) .................... { .................... IF (!--Y0) //DECREMENTA,SE '0' * 0045: DECFSZ 2F,F 0046: GOTO 04C .................... { IF(!--Y1) //DECREMENTA,SE '0' 0047: DECFSZ 2E,F 0048: GOTO 04C .................... { Y1= C_TEMPO_BOTAO_AP; 0049: MOVLW 0A 004A: MOVWF 2E .................... FLAG_BAP=0;} 004B: BCF 5E.0 .................... } .................... .................... } 004C: GOTO 31C (RETURN) .................... .................... /******************************************************************************* .................... TESTA_TEMPO_MAX_LIG .................... *******************************************************************************/ .................... .................... .................... VOID TESTA_TEMPO_MAX_LIG (VOID) .................... { .................... .................... IF (!--W0) //DECREMENTA,SE '0' * 002C: DECFSZ 30,F 002D: GOTO 038 .................... { IF(!--W1) //DECREMENTA,SE '0' 002E: DECFSZ 31,F 002F: GOTO 038 .................... { IF (!--W2) 0030: DECFSZ 32,F 0031: GOTO 038 .................... {M1=0; 0032: BCF 05.1 .................... M2=0; 0033: BCF 05.2 .................... W0=1; 0034: MOVLW 01 0035: MOVWF 30 .................... W1=1; 0036: MOVWF 31 .................... W2=1;} 0037: MOVWF 32 .................... } .................... } .................... IF (!--U0) //DECREMENTA,SE '0' 0038: DECFSZ 33,F 0039: GOTO 044 .................... { IF(!--U1) //DECREMENTA,SE '0' 003A: DECFSZ 34,F 003B: GOTO 044 .................... { IF(!--U2) 003C: DECFSZ 35,F 003D: GOTO 044 .................... {M3=0; 003E: BCF 05.4 .................... M4=0; 003F: BCF 05.5 .................... U0=1; 0040: MOVLW 01 0041: MOVWF 33 .................... U1=1; 0042: MOVWF 34 .................... U2=1;} 0043: MOVWF 35 .................... } .................... } .................... .................... } 0044: GOTO 31B (RETURN) .................... .................... /******************************************************************************* .................... TEMPORIZAR_SAIDA_A .................... *******************************************************************************/ .................... .................... .................... VOID TEMPORIZAR_SAIDA_A (VOID) .................... { .................... W0= 0; * 0290: CLRF 30 .................... W1= 0; 0291: CLRF 31 .................... W2= C_TEMPO_SAIDA_ON; 0292: MOVLW 03 0293: MOVWF 32 .................... } .................... /******************************************************************************* .................... TEMPORIZAR_SAIDA_B .................... *******************************************************************************/ .................... .................... VOID TEMPORIZAR_SAIDA_B (VOID) .................... { .................... U0= 0; * 02A5: CLRF 33 .................... U1= 0; 02A6: CLRF 34 .................... U2= C_TEMPO_SAIDA_ON; 02A7: MOVLW 03 02A8: MOVWF 35 .................... } .................... .................... /******************************************************************************* .................... FIM DAS SUBROTINAS .................... *******************************************************************************/ .................... .................... .................... .................... /******************************************************************************* .................... .................... MAIN - ROTINA PRINCIPAL .................... .................... /******************************************************************************/ .................... .................... void main() .................... { * 030B: CLRF 04 030C: MOVLW 1F 030D: ANDWF 03,F 030E: MOVF 1F,W 030F: ANDLW BF 0310: MOVWF 1F 0311: BSF 03.5 0312: MOVF 1F,W 0313: ANDLW F0 0314: IORLW 0F 0315: MOVWF 1F 0316: MOVLW 07 0317: BCF 03.5 0318: MOVWF 1F .................... CONFIG_INIT(); // CONFIGURAÇÕES INICIAIS DE PORTAS 0319: GOTO 010 .................... .................... // loop principal continuo .................... WHILE(TRUE) .................... { TESTA_TEMPO_MAX_LIG(); //tESTA TEMPO PARA DESLIGAR SAÍDAS ACIONADAS 031A: GOTO 02C .................... TESTA_TX_ON(); //TESTA SE AINDA TEM UMA TRANSMISSÃO DO TX 031B: GOTO 045 .................... TESTA_FIM_DE_CURSOS(); //TESTA OS FINS DE CURSO (REED SWITCH) 031C: GOTO 04D .................... TESTA_APAGAR_MEM(); //TESTA SE DEVE FAZER APAGAMENTO DA MEMÓRIA 031D: GOTO 12C .................... RECEBE_TX(); //RECEBE TX E ACIONA SAIDAS 031E: GOTO 1CA .................... } 031F: GOTO 31A .................... .................... } .................... .................... .................... 0320: SLEEP Configuration Fuses: Word 1: 39D4 NOWDT NOCPD NOPROTECT NOMCLR NOPUT INTRC_IO BROWNOUT