processor PIC16F873A #include __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CP_OFF & _CPD_OFF cblock 0x20 ;definir variaveis tempbyte1 tempbyte2 ;; tempbyteX vai no timer para contar byte1t1 byte2t1 ;; byteXt1: 2 bytes para armazernar o tempo 1 byte1t2 byte2t2 ;; byteXt2: 2 bytes para armazenar o tempo 2 flag ;; para saber se o timer deve adicionar ou esperar 256 ciclos contador ;; para ajudar a contar os ciclos do timer endc org 0x0 errorlevel -302 ;desabilitar mensagens de avisos na compilacao goto INICIO ;;;;;;;;INICIO DO TIMER;;;;;;;;;;;;;;;; org 0x004 ;;toif = 0;;;;;;;;;;;;;;; movlw b'10100000' banksel INTCON movwf INTCON ;;TMR0 = 255;;;;;;;;;;;;;;;;;;;;;; movlw d'253' movwf TMR0 ; nao precisar selecionar o banco, pois INTCON esta no mesmo banco de TMR0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; btfss flag, 0 ;; se o primeiro bit da flag for 0, entao adicionar goto ADICIONAR_1 ;; sim -> adicionar 1 decf contador, 1; decrementar 1 no contador goto PULO ADICIONAR_1: ;;ADICIONAR 1 NO tempbyteX incfsz tempbyte1, 1 goto PULO incf tempbyte2, 1 goto PULO ;;;;;;;;; PULO: retfie INICIO: ; RB2 -> echo ; RB1 -> trigger banksel TRISB movlw b'00000100' ; rb22= input(recebe) / rb1 = output(manda) movwf TRISB ;; echo e trigger arrumados ;;setar timer ;;;;option_reg movlw b'00000010' ; prescaler = 8 banksel OPTION_REG movwf OPTION_REG ;;;;intcon movlw b'00000000' ; rotinas de interrupcoes estao desativadas por enquanto banksel INTCON ; e todas as rotinas de interrupcao estao desativadas movwf INTCON ;;;;TMR0 ;movlw d'253' ; para o timer ficar 25us movlw d'253' banksel TMR0 ; Nint = 500000 movwf TMR0 ;; resetar tempbyteX movlw d'0' movwf tempbyte1 movwf tempbyte2 movlw d'0' ;; colocar 0 no flag movwf flag ;;ATIVAR O TRIGGER;;; banksel PORTB bsf PORTB, RB1 ; ligou o trigger nop nop banksel PORTB bsf PORTB, RB3 ; ativar um led nop nop nop nop nop nop nop nop nop nop nop nop nop ;; 15 us bcf PORTB, RB1 ;; desliga o trigger ;;ATIVAR O TIMER;; movlw b'10100000' movwf INTCON ;nao precisa selecionar intcon esta no banco do portb ;;;;;;;;;;;;;;;;;;;;; !!!!!!! PQ TA DEMORANDO PARA O TIMER COMECAR ;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ESPERA_RETORNO1: banksel PORTB btfss PORTB, RB2 ; VERIFICAR SE echo esta em 1 goto ESPERA_RETORNO1 ; nao ;;perguntar do timer que esta muito rapido e portanto nao sai dele ;;perguntar do pq o rb2 esta em 1 quando comeca -> testar isso com um led ;;DESATIVA O TIMER;; movlw b'00000000' banksel INTCON movwf INTCON ; banksel PORTB ; bcf PORTB, RB3 ; desativar o led ;;;;SALVAR O VALOR;;;; movf tempbyte1, W movwf byte1t1 movf tempbyte2, W movwf byte2t1 ;;ATIVAR UM TIMER POR 400 CICLOS;;;; ;;para dar 10 ms;;;;;;;;;;;;;;;;;;;; movlw b'10100000' ;; ativar o timer banksel INTCON movwf INTCON movlw d'255' ;; colocar 1 no flag movwf flag movwf contador ; contador = 255; ESPERA_255: btfss STATUS, Z ; ver se contador - 1 = 0 goto ESPERA_255 ; se nao for movlw d'145' ; 255+145 = 400 movwf contador; contador = 145 bcf STATUS, Z ; garantir que Z = 0 antes de entrar ESPERA_145: btfss STATUS, Z ; ver se contador - 1 = 0 goto ESPERA_145 ; se nao for ;;;termino 10 ms ;;desativar o timer movlw b'00000000' movwf INTCON ;;TERMINO DA ESPERA ;goto $ ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!VERIFICAR AQUI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DEPOIS TESTAR O RESTO ;;;ATIVAR A SEGUNDA VEZ O SENSOR;;;;;; movlw d'0' ;; colocar 0 no flag movwf flag movwf tempbyte1 ;;resetar o tempbyteX movwf tempbyte2 ;;ATIVAR O TRIGGER;;; banksel PORTB bsf PORTB, RB1 ; ligou o trigger nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop ;; 15 us bcf PORTB, RB1 ;; desliga o trigger ;;ATIVAR O TIMER;; movlw b'10100000' movwf INTCON ;nao precisa selecionar intcon esta no banco do portb ;;;;;;;;;;;;;;;;;;;;; !!!!!!! PQ TA DEMORANDO PARA O TIMER COMECAR ESPERA_RETORNO2: banksel PORTB btfss PORTB, RB2 ; VERIFICAR SE echo esta em 1 goto ESPERA_RETORNO2 ; nao ;;DESATIVA O TIMER;; movlw b'00000000' banksel INTCON movwf INTCON ;;;;SALVAR O VALOR;;;; movf tempbyte1, W movwf byte1t2 movf tempbyte2, W movwf byte2t2 banksel PORTB bcf PORTB, RB3 ; desativar o led goto $ end