;=============================================================================== ; PWM2C.ASM ; PWM PARA 2 CANAIS COM PIC 12F675 OU 12F629 (MUDE O ASM E RECOMPILE) ; OBJETIVO: FORNECER TENSÕES CONTINUAS DE 0 - 5 VOLTS EM 2 CANAIS ; INDEPENDENTES, CONTROLADOS POR BOTÕES DACTILAR (UP E DOWN). ; FREQUÊNCIA DE SAIDA (SEM CAPACITORES DE FILTRO) EM TORNO DE 40 HERTZ ; USO: ATRAVÉS DESTA TENSÃO VARIÁVEL, CONTROLAR CARGAS MEDIANTE O USO DE ; TRANSISTORES OU CONTROLAR VOLUME MEDIANTE O USO DE CIRCUITOS INTEGRADOS ; ESPECIFICOS,ETC. ; OBS. CARACTER APENAS DIDÁTICO ; AUTOR: CLAUDIO LÁRIOS INICIO: 17-03-2013 TERMINO:20-03-2013 ;=============================================================================== ;=============================================================================== ; ESCOLHA DO USUÁRIO: ; QUAL MICROCONTROLADOR VOCÊ DESEJA TRABALHAR? ; (DESCOMENTE A SUA OPÇÃO E COMENTE O NÃO USADO). ;#DEFINE PIC_629 ;PARA MICROCONTROLADOR 12F629 #DEFINE PIC_675 ;PARA MICROCONTROLADOR 12F675 ;=============================================================================== IFDEF PIC_675 LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" ENDIF IFDEF PIC_629 LIST P=12f629 , R=DEC INCLUDE "P12F629.INC" ENDIF ;ELIMINA MENSAGEM DE ERRO DO COMPILADOR ERRORLEVEL -302 ;PALAVRA DE CONFIGURAÇÃO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_OFF ;BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;DEFINIÇÕES #DEFINE UPB GPIO,0 ;PINO 7 BOTÃO UP CANAL B #DEFINE DOWNB GPIO,3 ;PINO 4 BOTÃO DOWN CANAL B #DEFINE OUT_A GPIO,5 ;PINO 2 SAIDA PWM A #DEFINE DOWNA GPIO,2 ;PINO 5- BOTÃO DOWN CANAL A #DEFINE UPA GPIO,1 ;PINO 6- BOTÃO UP CANAL A #DEFINE OUT_B GPIO,4 ;PINO 3- SAIDA PWM B #DEFINE FONA FLAGS,0 ;FLAG #DEFINE FONB FLAGS,1 ;FLAG ;RAM CBLOCK 0X20 CONT1,CONT2,TEMP,PWMA1,PWMA2,PWMB1,PWMB2,PWMAX,PWMBX,C2,C1,C0,FLAGS W_TEMP,STATUS_TEMP,R0,R1,R2 ENDC ORG 0X00 GOTO START ORG 0X04 GOTO INT_PWM ;INICIO DO PROGRAMA START BANK1 ;BANCO 1 CALL 0X03FF ;BUSCA CALIBRAÇÃO DO OSCILADOR MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR MOVLW B'10100000' ;LIGA GIE E TMR0 MOVWF INTCON MOVLW b'11001111' ;DEFINE ENTRADAS (1) E SAIDAS (0) NA PIO MOVWF TRISIO ; MOVLW B'00001000' ;VALOR DO PRESCALLER TMR0 .....ORIG.FINAL 00000111.... MOVWF OPTION_REG ;PRESCALLER 1:1 CLRF VRCON MOVLW 0XFF MOVWF WPU ;ACIONA PULL-UPS INDIVIDUAL IFDEF PIC_675 CLRF ANSEL ;LIBERA PORTAS DO AD (SOMENTE 12f675) ENDIF BANK0 MOVLW .7 ;DESLIGA COMPARADORES ANALÓGICOS MOVWF CMCON CLRF GPIO CLRF FLAGS CLRF PWMA1 INCF PWMA1,F CLRF PWMB1 INCF PWMB1,F ;=================================================================================== ;LOOP PRINCIPAL MAIN BTFSC UPA ;GP1 ;TESTA CHAVE 'UP'A GOTO PX1 MOVFW PWMAX XORLW 0XFF ;SE FOR '0XFF' NÃO INCREMENTA MAIS BTFSS STATUS,Z INCF PWMAX,F PX1 BTFSC UPB ;GP0 ;TESTA CHAVE 'UP'B GOTO PX2 MOVFW PWMBX XORLW 0XFF ;SE FOR '0XFF' NÃO INCREMENTA MAIS BTFSS STATUS,Z INCF PWMBX,F PX2 BTFSC DOWNA ;GP2 ;TESTA CHAVE 'DOWN' A GOTO PX3 MOVFW PWMAX XORLW .0 BTFSS STATUS,Z ;SE FOR '0' NÃO DECREMENTA MAIS DECF PWMAX,F PX3 BTFSC DOWNB ;GP3 ;TESTA CHAVE 'DOWN' B GOTO PX4 MOVFW PWMBX XORLW .0 ;SE FOR '0' NÃO DECREMENTA MAIS BTFSS STATUS,Z DECF PWMBX,F PX4 MOVLW 0X10 MOVWF R1 CLRF R0 DECFSZ R0,F ;GERA TEMPO DE DELAY PARA UM ACIONAMENTO SUAVE DOS BOTÕES GOTO $-1 DECFSZ R1,F GOTO $-3 GOTO MAIN ;========================================================================= ;ROTINA DE INTERRUPÇÃO DO TIMER 0 INT_PWM MOVWF W_TEMP ;SALVA W EM W TEMP SWAPF STATUS,W; CARREGA W COM STATUS, SEM ALTERAR STATUS MOVWF STATUS_TEMP; SALVA STATUS EM STATUS_TEMP BANK0 ;CERTIFICA DE RODAR NO BANCO CERTO BTFSS INTCON,2 ;TESTA SE E INT. DO TIMER 0 GOTO SAI_INT ;SE NAO ,SAI DA INTERRUPCAO BCF INTCON,2 ;LIMPA FLAG DA INTERRUPCAO. ;TEMPO OFF 'A' BTFSC FONA ;TESTA FLAGON GOTO D_1 DECFSZ PWMA1,F GOTO V_1 COMF PWMAX,W ;RECARGA DO VALOR MOVWF PWMA2 MOVF PWMA2,F BTFSC STATUS,Z INCF PWMA2,F BSF OUT_A ;LIGA SAIDA PWM CANAL 'A' PINO 2 BSF FONA GOTO V_1INT D_1 ; TEMPO ON 'A' DECFSZ PWMA2,F GOTO V_1 MOVFW PWMAX MOVWF PWMA1 MOVF PWMA1,F BTFSC STATUS,Z INCF PWMA1,F BCF OUT_A ;DESLIGA SAIDA PWM CANAL 'A' PINO 2 BCF FONA GOTO V_1INT V_1 ; TEMPO OFF 'B' V_1INT BTFSC FONB GOTO D_1B DECFSZ PWMB1,F GOTO V_2 COMF PWMBX,W MOVWF PWMB2 MOVF PWMB2,F BTFSC STATUS,Z INCF PWMB2,F BSF OUT_B ;LIGA SAIDA PWM CANAL 'B' PINO 3 BSF FONB GOTO SAI_INT D_1B ; TEMPO ON 'B' DECFSZ PWMB2,F GOTO V_2 MOVFW PWMBX MOVWF PWMB1 MOVF PWMB1,F BTFSC STATUS,Z INCF PWMB1,F BCF OUT_B ;DESLIGA SAIDA PWM CANAL 'B' PINO 3 BCF FONB GOTO SAI_INT V_2 SAI_INT MOVLW .192 ;RECARREGA TIMER 0 MOVWF TMR0 SWAPF STATUS_TEMP,W ;INVERTE NIBLES DE STATUS_TEMP MOVWF STATUS ;RECUPERA STATUS DE ANTES DA INTERRUPCAO SWAPF W_TEMP,F ;TROCA NIBLES SWAPF W_TEMP,W ;CARREGA W COM VALOR DE ANTES DA INTERRUPCAO RETFIE END