;************************************************************************************* ;Programa FOGUETE.ASM - Controle de lançamento elétrico p/ espaçomodelos - versão 1.0 ;Desenvolvido por Marcio Soares ;Compilador - MPASM ;Ultima alteração - 06/02/2003 ;************************************************************************************ ; ;Clock = 4MHz ; ;Ports ;RA0 -> Chave de início da contagem ;RA1 -> Chave de seleção UP-Down ;RA2 -> Habilita 4511 ;RB0 -> rele lançamento ;RB1 -> beep ;RB2 -> Led UP ;RB3 -> LED DOWN ;RB4-RB7 -> Saída BCD para 4511 ; ; radix dec include __CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC ;configura bits ;************************************************* ;Define registros ;************************************************* PICRES equ 0x00 PICINT equ 0x04 RAMINIT equ 0x0C RELE equ 0x00 ;rele BUZZER equ 0x01 ;buzzer LEDUP equ 0x02 ;led up LEDDOWN equ 0x03 ;led down CHINI equ 0x00 ;chave de inicio UPDOWN equ 0x01 ;chave UP-DOWN L4511 equ 0x02 ;liga/desliga 4511 ;************************************************ ;Variaveis de uso do programa ;************************************************ org RAMINIT ;endereco da RAM T1 res 1 ;temporizador T2 res 1 ;temporizador T3 res 1 ;temporizador T4 res 1 ;temporizador COUNT res 1 ;variavel de contagem DISP res 1 ;variavel para display ;************************************************* ; Inicio do setup da PIC ;************************************************* org PICRES ;endereco de reset goto inicio ;desvia p/ inicio org PICINT ;endereco do vector de INT retfie ;************************************************* ; Rotina para setar a PIC ;************************************************* inicio: movlw 0x00 ;ajuste para os bits INTCON movwf INTCON clrf PORTA clrf PORTB bsf STATUS,RP0 ;seleciona banco 1 para options e tris movlw 0x03 ;ajusta os bits em A como entrada, exceto RA2, RA3 e RA4 movwf TRISA movlw 0x00 ;ajusta os bits em B como saida movwf TRISB bcf STATUS,RP0 ;volta ao banco 0... (padrão do reset) call beep2 ;toca beep, 2 vezes ;************************************************* ; Rotina principal de varredura da teclas ;************************************************* principal: btfss PORTA, CHINI call lancar btfsc PORTA, UPDOWN goto LIGAUP movlw 0x08 ;liga led down movwf DISP bsf PORTB, LEDDOWN bcf PORTB, LEDUP goto FIMPRINC LIGAUP: movlw 0x04 ;liga led up movwf DISP bcf PORTB, LEDDOWN bsf PORTB, LEDUP FIMPRINC: goto principal ;************************************************* ; rotina para iniciar lançamento ;************************************************* lancar: call _5ms ;aguarda 5ms btfsc PORTA,CHINI ;testa novamente return call beep ;toca beep bsf PORTA,L4511 ;habilita 4511 movlw 0x08 ;verifica se conta up ou down xorwf DISP,W ;compara para saber se DOWN btfsc STATUS,Z ;testa se zero goto lancaDOWN ; lancaUP: movlw 0x00 ;é UP, conta crescente goto carregaCOUNT lancaDOWN: movlw 0x09 ;é DOWN, conta decrescente carregaCOUNT: movwf COUNT ;inicia contador contar: swapf COUNT,W ;inverte os nibbles de CONT, e guarda em W iorwf DISP,W ;or de W com disp para manter acesso led UP-DOWN movwf PORTB ;mostra contagem no display movlw 0x08 ;verifica se está contando up ou down xorwf DISP,W ;compara para saber se DOWN btfss STATUS,Z ;testa se zero goto up down: movlw 0xFF ;compara com FF xorwf COUNT,W ;xor btfsc STATUS,Z ;testa se zero goto liga ;se FF, liga rele. Senão continua decf COUNT,F ;decrementa CONT goto espera up: movlw 0x09 ;compara com 09 xorwf COUNT,W ;xor btfsc STATUS,Z ;testa se zero goto liga ;se 09, liga rele. Senão continua incf COUNT,F ;incrementa CONT espera: call _1000ms ;aguarda 1 segundo goto contar ;continua contando liga: bsf PORTB,LEDUP ;liga LEDS bsf PORTB,LEDDOWN bsf PORTB,RELE ;liga rele call beep2 ;toca beep longo call _1000ms ;aguarda 5 segundos call _1000ms call _1000ms call _1000ms call _1000ms bcf PORTB,RELE ;desliga rele bcf PORTA,L4511 ;desabilita 4511 return ;********************************************************* ; rotina para tocar o buzzer ;********************************************************* beep: movlw 50 ;prepara para fazer 50 vezes movwf T3 goto beepA beep2: movlw 100 ;prepara para fazer 100 vezes movwf T3 goto beepA beep3: movlw 150 ;prepara para fazer 150 vezes movwf T3 beepA: bsf PORTB,BUZZER ;liga buzzer call _1ms ;aguarda 1 ms bcf PORTB,BUZZER ;desliga buzzer call _1ms ;aguarda 1 ms decfsz T3,1 ;decrementa T3 goto beepA ;faz até ser zero return ;********************************************************* ; rotinas de temporização ;********************************************************* _1ms: movlw 0x02 ;carrega W com 01 movwf T1 ;carrega T1 com W movlw 0x00 ;carrega T4 com 0 movwf T4 goto car_1 _5ms: movlw 0x06 ;carrega W com 06 movwf T1 ;carrega T1 com W movlw 0x00 ;carrega T4 com 0 movwf T4 goto car_1 _200ms: movlw 0x01 ;carrega W com 86 movwf T1 ;carrega T1 com W movlw 0x01 ;carrega T4 com 1 movwf T4 goto car_1 ;aguarda 1 segundo com clock de 4MHz _1000ms: movlw 0x06 ;carrega W com 4 movwf T3 ;carrega T3 com 4 movlw 0x01 ;carrega T4 com 1 movwf T4 car: movlw 0xff ;carrega W com 255 movwf T1 ;carrega T1 com W btfsc T4,0 ;testa bit 0 de T4 decfsz T3 ;decrementa T3 goto car_1 return car_1: movlw 0xFF ;carrega W com 255 movwf T2 ;carrega T2 com 255 dec_1: decfsz T2,1 ;decrementa T2 goto dec_1 ;255 x T1 vezes decfsz T1,1 ;decrementa T1 goto car_1 ;volta a carregar T2 btfsc T4,0 ;testa bit 0 de T4 goto car ;retorna 0 em W return ; ;********************** ;* fim do programa ;********************** end