Ir ao conteúdo
  • Cadastre-se
vitorlr

PWM ajustavel

Recommended Posts

Eu estou fazendo um projeto de conclusão de curso e preciso de uma ajuda urgente! Estou fazendo um pwm ajustavel no pic 16f877a,ele ajusta o duty cicle atraves de 2 botões,eu executei ele no proteus eu funciono perfeitamente mas quando passo pro projeto fisico acontece 2 problemas: o primeiro é q quando eu aperto e seguro o botao de incrementar ele dispara e o outro é q quando eu aperto o botao de decrementar ele vai direto pro valor minimo ! Por favor me ajudem!

Ai o programa em assembly! Eu uso o MBLAB v8.91 pra copilar

 

;*****************************************************
;*                   PWM VARIABLE                    *
;*   VERSÃO 2.0                    DATA;14/11/2014   *
;*                        *
;*****************************************************
 
;*****************************************************
;*                  DESCRIÇÃO GERAL                  *
;*****************************************************
; ESTE PROGRAMA ESTA PREPARADO PARA CRIAR UM PWM E
; LER 2 botões PARA VARIAR ESTE PWM UM PARA AUMENTAR
; E OUTRO PARA DIMINUIR O DUTY CICLE DO MESMO.
; PERIODO(PWM)->(PR2+1)*4*Tosc*PRESCALER(TMR2)
;               (61+1) * 4 * 100ns * 4
;                       96us~=10Khz
; DUTY CICLE(PWN)->[CCPR;CCP1CON<5;4>]*Tosc*PRESCALER(TMR2)
;             MAX->[240] * 100ns * 4 = 96us   __ 100%
;             MIN->[12]  * 100ns * 4 = 4.8us  __ 5%
;*****************************************************
;*            CONFIGURAÇÕES PARA A GRAVAÇÃO          *
;*****************************************************
 
 
;*****************************************************
;*     DEFINIÇÕES DAS VARIAVEIS INTERNAS DO PIC      *
;*****************************************************
 
#INCLUDE <P16F877A.INC>
__CONFIG  _BODEN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _HS_OSC;
 
;*****************************************************
;*        DEFINIÇÃO DOS BANCOS DE MEMORIA            *
;*****************************************************
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA
 
#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA
 
;*****************************************************
;*              DEFINIÇÃO DE VARIAVEIS               *
;*****************************************************
 
CBLOCK 0X20
FILTRO
ENDC
 
;*****************************************************
;*                  FLAGS INTERNOS                   *
;*****************************************************
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA
 
;*****************************************************
;*              DEFINIÇÃO DE CONSTANTES              *
;*****************************************************
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA
MIN         EQU     .3   ;MINIMO DUTY CICLE (0,05)
MAX         EQU     .60  ;MAXIMO DUTY CICLE   (1)
T_FILTRO    EQU     .250 ;TEMPO DO FILTRA BOTAO
;*****************************************************
;*                      ENTRADAS                     *
;*****************************************************
 
#DEFINE BTAUMENTA   PORTB,1 ;AUMENTA O PWM
                            ;1->PRESSIONADO
                            ;0->LIBERADO
#DEFINE BTDIMINUI   PORTB,2 ;DIMINUI O PWM
                            ;1->PRESSIONADO
                            ;0->LIBERADO
 
;*****************************************************
;*                      SAIDAS                       *
;*****************************************************
 
;*****************************************************
;*                   VETOR RESET                     *
;*****************************************************
 
ORG 0x0000 ;ENDEREÇO INICIAL DE PROCESSAMENTO
GOTO INICIO
 
;*****************************************************
;*               INICIO DA INTERRUPÇÃO               *
;*****************************************************
; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR
; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO
; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS
 
ORG 0x0004 ;ENDEREÇO INICIAL DA INTERRUPÇÃO
RETFIE ;RETORNA DA INTERRUPÇÃO
 
;*****************************************************
;*                 INCIO DO PROGRAMA                 *
;*****************************************************
INICIO
    BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'00000000' ;PORTA TODOS I/O SAIDAS
MOVWF TRISA
    MOVLW B'00000110' ;PORTB<2:1> DEFINIDOS COMO
MOVWF TRISB       ;ENTRADA (BTAUMENTA E BTDIMINUI)
    MOVLW B'00000000' ;PORTC TODOS I/O SAIDAS
MOVWF TRISC       ;PORTC<2> = CCP1 |SAIDA PWM
    MOVLW B'00000000' ;PORTD TODOS I/O SAIDAS
MOVWF TRISD
    MOVLW B'00000000' ;PORTE TODOS I/O SAIDAS
MOVWF TRISE
    MOVLW B'10000111' ;opções
MOVWF OPTION_REG  ;DESABILITA PULL-UPs
                        ;TMR0 PRESCALER = 1:256
    MOVLW B'00000000' ;DESABILITA TODAS AS INTER.
MOVWF INTCON
    MOVLW B'00000000' ;DESABILITA AS INTER. DE TMR1E2
MOVWF PIE1
    MOVLW B'00000111' ;DESABILITA OS COMPARADORES
MOVWF CMCON
    MOVLW .61         ;COLOCA O VALOR 61 NO PR2
MOVWF PR2         ;O QUE RESULTA NUM PERIODO DE
                        ;100us E UMA FREQUENCIA DE 10kHz
    BANK0
    MOVLW B'00001100' ;ATIVA O PWM E OS COLOCA OS
                        ;BITS MENOS SIGNIFICATIVOS
                        ;EM 0.
MOVWF CCP1CON
    MOVLW B'00000101' ;ATIVA O TMR2 E REGULA O
                        ;PRESCALER = 4
MOVWF T2CON
    MOVLW .30         ;COLOCA O VALOR 31 NO CCPR1L
                        ;RESULTANDO NUM DUTYCICLE DE 0,5
MOVWF CCPR1L      ;CCP1RL INCIA NA METADE
 
;*****************************************************
;*           INCIALIZAÇÃO DAS VARIAVEIS              *
;*****************************************************
    CLRF PORTA ;LIMPA O PORTA
CLRF PORTB ;LIMPA O PORTB
    CLRF PORTC ;LIMPA O PORTC
CLRF PORTD ;LIMPA O PORTD
CLRF PORTE ;LIMPA O PORTE
;*****************************************************
;*                ROTINA PRINCIPAL                   *
;*****************************************************
 
MAIN
MOVLW T_FILTRO
MOVWF FILTRO ;INICIALIZA FILTRO = T_FILTRO
 
CHECABTA
BTFSS BTAUMENTA ;O BOTÃO ESTÁ PRESSIONADO?
GOTO CHECA ;NÃO, ENTÃO CONTINUA ESPERANDO
                        ;SIM
DECFSZ FILTRO,F ;DECREMENTA O FILTRO DO BOTÃO
                        ;TERMINOU?
GOTO CHECABTA ;NÃO, CONTINUA ESPERANDO
                        ;SIM
TESTABTA
;AUMENTAR O DUTYCICLE ?
    BTFSS   BTAUMENTA   ;BT PRESCIONADO?
    GOTO    CHECA       ;NAO, TESTA OUTRO BT
    GOTO    AUMENTA     ;SIM, AUMENTA DC
CHECA
MOVLW T_FILTRO
MOVWF FILTRO ;INICIALIZA FILTRO = T_FILTRO
 
CHECABTD
BTFSS BTDIMINUI ;O BOTÃO ESTÁ PRESSIONADO?
GOTO MAIN ;NÃO, ENTÃO CONTINUA ESPERANDO
;SIM
DECFSZ FILTRO,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO CHECABTD ;NÃO, CONTINUA ESPERANDO
;SIM
TESTABTD
;DIMINUIR O DUTYCICLE ?
    BTFSS   BTDIMINUI   ;BT PRESCIONADO?
    GOTO    MAIN        ;NÃO, TESTA OUTRO BT
    GOTO    DIMINUI     ;SIM, DIMINUI DC
 
AUMENTA
;AUMENTA DUTYCICLE
    INCF    CCPR1L  ;INCREMENTA O CCPR1L AUMENTANDO O
                    ;VALOR EM 4 E AUMENTANDO O DC EM
                    ;0,016
    MOVLW   MAX
    SUBWF   CCPR1L,W    ;MAXIMO VALOR DE DC?
    BTFSS STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO?
GOTO CONTINUAA ;SIM, ENTÃO CONTA < MAX
;NÃO, ENTÃO CONTA >= MAX
    MOVLW MAX
MOVWF CCPR1L    ;ACERTA CONTADOR NO MÁXIMO, POIS
                        ;PASSOU DO VALOR
CONTINUAA
;TRAVA BT SE CONTINUA APERTADO
    BTFSS   BTAUMENTA   ;BT CONTINUA APERTADO?
    GOTO    MAIN        ;NAO,VOLTA PRO LOOP PRINCIPAL
    GOTO    $-2         ;SIM, TRAVA NO LOOP CONTINUA
 
DIMINUI
;DIMINUI DUTYCICLE
    DECF    CCPR1L  ;DIMINUI O CCPR1L DIMINUINDO O
                    ;VALOR EM 4 E DIMINUINDO O DC EM
                    ;0,016
    MOVLW   MIN
    SUBWF   CCPR1L,W    ;MINIMO VALOR DE DC?
    BTFSC STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO?
GOTO CONTINUAD ;NAO, ENTÃO CONTA >= MIN
;SIM, ENTÃO CONTA < MIN
    MOVLW MIN
MOVWF CCPR1L    ;ACERTA CONTADOR NO MINIMO, POIS
                        ;PASSOU DO VALOR
CONTINUAD
;TRAVA BT SE CONTINUA APERTADO
    BTFSS   BTDIMINUI   ;BT CONTINUA APERTADO?
    GOTO    MAIN        ;NAO,VOLTA PRO LOOP PRINCIPAL
    GOTO    $-2         ;SIM, TRAVA NO LOOP CONTINUA
;*****************************************************
;*                FIM DO PROGRAMA                    *
;*****************************************************
END ;FIM

Compartilhar este post


Link para o post
Compartilhar em outros sites

@vitorlr,

Por favor, poste o esquema eletrônico que voce está usando, com todos os componentes ligados a cada pino do Pic. Embora eu nao possa te ajudar no software, posso ver o hardware !

Paulo

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

asm pra mim também não vai rolar muito. Uma coisa que você precisa ver é que quando apertar um botão, é bom esperar soltar. Em c

if (!RB0) {aumetapwm(); delay(xxx); while(!RB0);}//o delay é um anti debounce meia boca

outra coisa a ser vista. Ignorar o repique do botão. o tal de debounce. entrada smitch trigger + capacitor e/ou alguma técnica no sw tipo o delay

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×