Erro na Saída PWM

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Erro na Saída PWM

Mensagempor have » 03 Mai 2014 10:50

Bom Dia.

Necessito arrumar uma saída PWM que quando esta em 100% ocorre um erro, segue imagem com o erro:

http://i60.tinypic.com/2zjmkn6.jpg
2zjmkn6.jpg


Sendo que o sinal deveria ficar constantemente em alto.

O código em assembly é:

Código: Selecionar todos
;------------------------------------------------------------------------------
;   PWM ASSEMBLY
;------------------------------------------------------------------------------
;   AUTOR:
;   DATA:
;   CONTROLE DE REVISÕES:
;------------------------------------------------------------------------------
#INCLUDE <P16F877A.INC>
;------------------------------------------------------------------------------
;   BITS DE CONFIGURAÇÃO
;------------------------------------------------------------------------------
;   CONFIG
; __config 0xFF79
 __CONFIG _FOSC_XT & _WDTE_ON & _PWRTE_ON & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
; FOSC  - Seleção tipo oscilador.
; WDTE  - Watchdog timer.
; PWRTE - Power on timer (72ms após energização).
; BOREN - Brown-out enable, proteção contra baixa tensão.
; LVP   - Low voltage programming.
; CPD   - Code protect da EEPROM.
; WRT   - Write protection da memória flash.
; CP    - Code protect memória de programa.
;------------------------------------------------------------------------------
;   PAGINAÇÃO DE MEMÓRIA (MACROS)
;------------------------------------------------------------------------------
BANK0   MACRO
            BCF     STATUS,RP0
            BCF     STATUS,RP1
        ENDM

BANK1   MACRO
            BSF     STATUS,RP0
            BCF     STATUS,RP1
        ENDM

BANK2   MACRO
            BCF     STATUS,RP0
            BSF     STATUS,RP1
        ENDM

BANK3   MACRO
            BSF     STATUS,RP0
            BSF     STATUS,RP1
        ENDM
;------------------------------------------------------------------------------
;   VARIÁVEIS
;------------------------------------------------------------------------------
    CBLOCK 0X20
        FILTRO_BOTOES
        TEMPO1
        TEMPO0
    ENDC
;------------------------------------------------------------------------------
;   CONSTANTES
;------------------------------------------------------------------------------
;   CONSTANTES UTILIZADAS PELO SISTEMA
        FILTRO_TECLA   EQU .200
;------------------------------------------------------------------------------
;   ENTRADAS
;------------------------------------------------------------------------------
;   PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
#DEFINE BOTAO_0  PORTB,0    ;ESTADO BOTÃO 0
                            ;1 -> LIBERADO
                            ;0 -> PRESSIONADO
#DEFINE BOTAO_1  PORTB,1    ;ESTADO BOTÃO 1
                            ;1 -> LIBERADO
                            ;0 -> PRESSIONADO
#DEFINE BOTAO_2  PORTB,2    ;ESTADO BOTÃO 2
                            ;1 -> LIBERADO
                            ;0 -> PRESSIONADO
#DEFINE BOTAO_3  PORTB,3    ;ESTADO BOTÃO 3
                            ;1 -> LIBERADO
                            ;0 -> PRESSIONADO
;------------------------------------------------------------------------------
;   SAÍDAS
;------------------------------------------------------------------------------
;   PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
#DEFINE DISPLAY    PORTD    ;BARRAMENTO DE DADOS DO DISPLAY
#DEFINE RS         PORTE,0  ;INDICA P/ O DISPLAY UM DADO OU COMANDO
                            ;1 ->   DADO
                            ;0 ->   COMANDO
#DEFINE ENABLE     PORTE,1  ;SINAL DE ENABLE P/ DISPLAY
                            ;ATIVO NA BORDA DE DESCIDA
#DEFINE VENTILADOR PORTC,1  ;SAÍDA P/ O VENTILADOR
                            ;1 -> VENTILADOR LIGADO
                            ;0 -> VENTILADOR DESLIGADO
;------------------------------------------------------------------------------
;   VETOR DE RESET DO MICROCONTROLADOR
;------------------------------------------------------------------------------
ORG     0X0000      ;ENDEREÇO DO VETOR DE RESET
GOTO    INICIO      ;PULA PARA CONFIG DEVIDO A REGIÃO
                    ;DESTINADA AS ROTINAS SEGUINTES
;------------------------------------------------------------------------------
;   ROTINA DE DELAY (DE 1mS ATÉ 256mS)
;------------------------------------------------------------------------------
;ESTÁ É UMA ROTINA DE DELAY VARIÁVEL, COM DURAÇÃO DE 1mS X O VALOR PASSADO EM
;WORK

DELAY_MS
    MOVWF   TEMPO1      ;CARREGA TEMPO1(UNIDADE DE mS)
    MOVLW   .250
    MOVWF   TEMPO0      ;CARREGA TEMPO0 (P/CONTAR 1mS)

    CLRWDT              ;LIMPA WDT (PERDE TEMPO)
    DECFSZ  TEMPO0,F    ;FIM DE TEMPO0?
    GOTO    $-2         ;NÃO - VOLTA 2 INSTRUÇÕES
                        ;SIM - PASSOU-SE 1mS
    DECFSZ  TEMPO1,F    ;FIM DE TEMPO1?
    GOTO    $-6         ;NÃO - VOLTA 6 INSTRUÇÕES
                        ;SIM
    RETURN              ;RETORNA
;------------------------------------------------------------------------------
;   ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY
;------------------------------------------------------------------------------
;ESTA ROTINA ENVIA UM CARACTER PARA O MÓDULO DE LCD. O CARACTER A SER ESCRITO
;DEVE SER COLOCADO EM WORK (W) ANTES DE CHAMAR A ROTINA.
ESCREVE
    MOVWF   DISPLAY     ;ATUALIZA DISPLAY (PORTD)
    NOP                 ;PERDE 1US PARA ESTABILIZAÇÃO
    BSF     ENABLE      ;ENVIA UM PULSO DE ENABLE AO DISPLAY
    GOTO    $+1
    BCF     ENABLE


    MOVLW   .1
    CALL    DELAY_MS    ;DELAY DE  1MS
    RETURN              ;RETORNA
;------------------------------------------------------------------------------
;   CONFIGURAÇÕES INICIAIS DE HARDWARE E SOFTWARE
;------------------------------------------------------------------------------
;NESTA ROTINA SÃO INICIALIZADAS AS PORTAS DE I/O DO MICROCONTROLADOR E AS
;CONFIGURAÇÕES DOS REGISTRADORES ESPECIAIS (SFR). A ROTINA INICIALIZA A MÁQUINA
;E AGUARDA O ESTOURO DO WDT.
INICIO
    CLRF    PORTA       ;GARANTE TODAS AS SAÍDAS EM ZERO
    CLRF    PORTB
    CLRF    PORTC
    CLRF    PORTD
    CLRF    PORTE

    BANK1               ;SELECIONA BANCO 1 DA RAM
    MOVLW   B'11111111'
    MOVWF   TRISA       ;CONFIGURA I/O DO PORTA

    MOVLW   B'11111111'
    MOVWF   TRISB       ;CONGIGURA I/O DO PORTB

    MOVLW   B'11111101'
    MOVWF   TRISC       ;CONFIGURA I/O DO PORTC

    MOVLW   B'00000000'
    MOVWF   TRISD       ;CONFIGURA I/O DO PORTD

    MOVLW   B'00000100'
    MOVWF   TRISE       ;CONFIGURA I/O DO PORTE

    MOVLW   B'11011111'
    MOVWF   OPTION_REG  ;CONFIGURA OPTIONS
                        ;PULL-UPS DESABILITADOS
                        ;INTER. NA BORDA DE SUBIDA DO RB0
                        ;TIMER0 INCREM. PELO CICLO DE MÁQUINA
                        ;WDT - 1:128
                        ;TIMER - 1:1

    MOVLW   B'00000000'
    MOVWF   INTCON      ;CONFIGURA INTERRUPÇÕES
                        ;DESABILITA TODAS AS INTERRUPÇÕES

    MOVLW   B'00000111'
    MOVWF   ADCON1      ;CONFIGURA CONVERSOR A/D
                        ;CONFIGURA PORTA E PORTE COMO I/O DIGITAL

    MOVLW   .255
    MOVWF   PR2         ;CONFIGURA PERÍODO DO PWM
                        ;T=((PR2)+1)*4*TOSC*TMR2PRESCALE
                        ;T=((255)+1)*4*250ns*16
                        ;T=4,096ms -> 244,14 Hz

    BANK0               ;SELECIONA BANCO 0 DA RAM

    MOVLW   B'00000111'
    MOVWF   T2CON       ;CONFIGURA TMR2
                        ;TIMER 2 LIGADO
                        ;PRESCALE 1:16
                        ;POSTSCALE 1:1

    MOVLW   B'00001111'
    MOVWF   CCP2CON     ;CONFIGURA CCP2CON PARA PWM
                        ;(PINO RC1)
    CLRF    CCPR2L      ;INICIA COM DUTY CYCLE EM ZERO
;------------------------------------------------------------------------------
;   INICIALIZAÇÃO DA RAM
;------------------------------------------------------------------------------
; ESTA ROTINA IRÁ LIMPAR TODA A RAM DO BANCO 0, INDO DE 0X20 A 0X7F.
; EM SEGUIDA, AS VARIÁVEIS DE RAM DO PROGRAMA SÃO INICIALIZADAS.
    MOVLW   0X20
    MOVWF   FSR             ;APONTA O ENDEREÇAMENTO INDIRETO PARA
                            ;A PRIMEIRA POSIÇÃO DA RAM
    LIMPA_RAM
        CLRF    INDF        ;LIMPA POSIÇÃO
        INCF    FSR,F       ;INCREMENTA O PONTEIRO P/ A PRÓX. POS.
        MOVF    FSR,W
        XORLW   0X80        ;COMPARA O PONTEIRO COM A ÚLTIMA POS. +1
        BTFSS   STATUS,Z    ;JÁ LIMPOU TODAS AS POSIÇÕES?
        GOTO    LIMPA_RAM   ;NÃO - LIMPA A PRÓXIMA POSIÇÃO
                            ;SIM
;------------------------------------------------------------------------------
;   CONFIGURAÇÕES INICIAIS DO DISPLAY
;------------------------------------------------------------------------------
; ESTA ROTINA INCIALIZA O DISPLAY P/ COMUNICAÇÃO DE 8 VIAS, DISPLAY PARA 2
; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR À DIREITA.

INICIALIZACAO_DISPLAY
    BCF RS                  ;SELECIONA O DISPLAY P/ COMANDOS

    MOVLW   0X30            ;ESCREVE COMANDO 0X30 PARA
    CALL    ESCREVE         ;INICIALIZAÇÃO

    MOVLW   .3
    CALL    DELAY_MS        ;DELAY DE 3MS (EXIGIDO PELO DISPLAY)

    MOVLW   0X30            ;ESCREVE COMANDO 0X30 PARA
    CALL    ESCREVE         ;INICIALIZAÇÃO

    MOVLW   0X30            ;ESCREVE COMANDO 0X30
    CALL    ESCREVE         ;INICIALIZAÇÃO

    MOVLW   B'00111000'     ;ESCREVE COMANDO PARA
    CALL    ESCREVE         ;INTERFACE DE 8 VIAS DE DADOS

    MOVLW   B'00000001'     ;ESCREVE COMANDO PARA
    CALL    ESCREVE         ;LIMPAR TODO DISPLAY

    MOVLW   .1
    CALL    DELAY_MS        ;DELAY DE 1MS

    MOVLW   B'00001100'     ;ESCREVE COMANDO PARA
    CALL    ESCREVE         ;LIGAR O DISPLAY SEM CURSOR

    MOVLW   B'00000110'     ;ESCREVE COMANDO PARA INCREM.
    CALL    ESCREVE         ;AUTOMÁTICO À DIREITA

;------------------------------------------------------------------------------
;   ROTINA DE ESCRITA DA TELA PRINCIPAL
;------------------------------------------------------------------------------
; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES:
; LINHA 1 - "MICROCONTROLADORES"
; LINHA 2 - "PWM: XX% "

MOSTRA_TELA_PRINCIPAL
    MOVLW   0X80            ;COMANDO PARA POSICIONAR O CURSOR
    CALL    ESCREVE         ;LINHA 0/ COLUNA 1
    BSF     RS              ;SELECIONA O DISPLAY P/ DADOS

                            ;COMANDOS PARA ESCREVER AS
                            ;LETRAS DE "TRABALHO-1"
MOVLW   'T'
CALL    ESCREVE
MOVLW   'R'
CALL    ESCREVE
MOVLW   'A'
CALL    ESCREVE
MOVLW   'B'
CALL    ESCREVE
MOVLW   'A'
CALL    ESCREVE
MOVLW   'L'
CALL    ESCREVE
MOVLW   'H'
CALL    ESCREVE
MOVLW   '0'
CALL    ESCREVE
MOVLW   '-'
CALL    ESCREVE
MOVLW   '1'
CALL    ESCREVE

BCF     RS              ;SELECIONA O DISPLAY P/ COMANDOS
MOVLW   0XC3            ;COMANDO PARA POSICIONAR O CURSOR
CALL    ESCREVE         ;LINHA 1/COLUNA 3
BSF     RS              ;SELECIONA O DISPLAY P/DADOS

                        ;COMANDOS PARA ESCREVER AS
                        ; LETRAS DE "PWM: OFF"
MOVLW   'P'
CALL    ESCREVE
MOVLW   'W'
CALL    ESCREVE
MOVLW   'M'
CALL    ESCREVE
MOVLW   ':'
CALL    ESCREVE
MOVLW   ' '
CALL    ESCREVE
MOVLW   ' '
CALL    ESCREVE
MOVLW   'O'
CALL    ESCREVE
MOVWF   'F'
CALL    ESCREVE
MOVWF   'F'
CALL    ESCREVE

;------------------------------------------------------------------------------
;   VARREDURA DOS BOTÕES
;------------------------------------------------------------------------------
; ESTA ROTINA VERIFICA SE ALGUM BOTÃO ESTÁ PRESSIONADO E CASO AFIRMATIVO
; DESVIA PARA O TRATAMENTO DO MESMO.

VARRE
    CLRWDT                  ;LIMPA WATCHDOG TIMER

; VERIFICA ALGUM BOTÃO PRESSIONADO
VARRE_BOTOES
    BTFSS   BOTAO_0         ;O BOTÃO 0 ESTA PRESSIONADO?
    GOTO    TRATA_BOTAO_0   ;SIM - PULA P/ TRATA_BOTAO_O
                            ;NÃO
    BTFSS   BOTAO_1         ;O BOTÃO 1 ESTA PRESSIONADO?
    GOTO    TRATA_BOTAO_1   ;SIM - PULA P/ TRATA_BOTAO_1
                            ;NÃO
    BTFSS   BOTAO_2         ;O BOTÃO 2 ESTA PRESSIONADO?
    GOTO    TRATA_BOTAO_2   ;SIM - PULA P/ TRATA_BOTAO_2
                            ;NÃO
    BTFSS   BOTAO_3         ;O BOTÃO 3 ESTA PRESSIONADO:
    GOTO    TRATA_BOTAO_3   ;SIM - PULA P/ TRATA_BOTAO_3
                            ;NÃO

; FITRO P/ EVITAR RUIDOS

MOVLW   FILTRO_TECLA        ;CARREGA O VALOR DE FILTRO_TECLA
MOVWF   FILTRO_BOTOES       ;SALVA EM FILTRO_BOTOES
                            ;RECARREGA FILTRO P/ EVITAR RUIDOS
                            ; NOS BOTÕES
GOTO    VARRE               ;VOLTA PARA VARRER TECLADO
;------------------------------------------------------------------------------
;   TRATAMENTO DOS BOTÕES
;------------------------------------------------------------------------------
; NESTE TRECHO DO PROGRAMA ESTÃO TODOS OS TRATAMENTOS DOS BOTÕES

; TRATAMENTO DO BOTÃO 0
TRATA_BOTAO_0
    MOVF    FILTRO_BOTOES,F
    BTFSC   STATUS,Z        ;FILTRO JÁ IGUAL A ZERO?
                            ;(FUNÇÃO JA FOI EXECUTADA?)
    GOTO    VARRE           ;SIM - VOLTA P/ VARREDURA DO TECLADO
                            ;NÃO
    DECFSZ  FILTRO_BOTOES,F ;FIM DO FILTRO?(RUIDO?)
    GOTO    VARRE           ;NÃO - VOLTA P/ VARRE
                            ;SIM - BOTÃO PRESSIONADO

    CLRF    CCPR2L          ;ZERA CCPR2L
    BCF     CCP2CON,5       ;ZERA OS BITS 5 E 4
    BCF     CCP2CON,4       ; (LSB DO DUTY CYCLE)
                            ;Tp=CCPR2L:CCP2CON<5,4>*TOSC*TMR2PRESCALE
                            ;Tp=0*250ns*16
                            ;Tp=0;
                            ;PWM -> DUTY CYCLE = 0% -> OFF
    BCF     RS              ;SELECIONA O DISPLAY P/ COMANDOS
    MOVLW   0XC8            ;COMANDO PARA POSICIONAR O CURSOR
    CALL    ESCREVE         ;LINHA 1 / COLUNA 8
    BSF     RS              ;SELECIONA O DISPLAY P/DADOS

                            ;COMANDOS PARA ESCREVER AS
                            ;LETRAS DE "OFF"
    MOVLW   ' '
    CALL    ESCREVE
    MOVLW   'O'
    CALL    ESCREVE
    MOVLW   'F'
    CALL    ESCREVE
    MOVLW   'F'
    CALL    ESCREVE

    GOTO    VARRE           ;VOLTA P/ VARREDURA DOS BOTÕES

; TRATAMENTO DO BOTÃO 1
TRATA_BOTAO_1
    MOVF    FILTRO_BOTOES,F
    BTFSC   STATUS,Z        ;FILTRO JÁ IGUAL A ZERO?
                            ;(FUNÇÃO JA FOI EXECUTADA?
    GOTO    VARRE           ; SIM - VOLTA P/ VARREDURA DO TECLADO
                            ;NÃO
    DECFSZ  FILTRO_BOTOES,F ;FIM DO FILTRO? (RUIDO?)
    GOTO    VARRE           ;NÃO - VOLTA P/ VARRE
                            ;SIM - BOTÃO PRESSIONADO
    MOVLW   0X80
    MOVWF   CCPR2L          ;CARREGA CCPR2L COM 0X80
    BCF     CCP2CON,5       ;LIMPA OS BITS 5 E 4
    BCF     CCP2CON,4       ;LSB DO DUTY CYCLE
                            ;Tp = CCPR2L:CCP2CON<5,4>*TOSC*TMR2PRESCALE
                            ;Tp = 512 * 250ns * 16
                            ;Tp = 2,048ms
                            ;PWM -> DUTY CYCLE = 50%
    BCF     RS              ;SELECIONA O DISPLAY P/ COMANDOS
    MOVLW   0XC8            ;COMANDO PARA POSICIONAR O CURSOR
    CALL    ESCREVE         ;LINHA1/COLUNA8
    BSF     RS              ;SELECIONA O DISPLAY P/ DADOS

                            ;COMANDOS PARA ESCREVER AS
                            ;LETRAS DE "50%"
    MOVLW   ' '
    CALL    ESCREVE
    MOVLW   '5'
    CALL    ESCREVE
    MOVLW   '0'
    CALL    ESCREVE
    MOVLW   '%'
    CALL    ESCREVE

    GOTO    VARRE           ;VOLTA P/ VARREDURA DOS BOTÕES

; TRATAMENTO DO BOTÃO 2
TRATA_BOTAO_2
    MOVF    FILTRO_BOTOES,F
    BTFSC   STATUS,Z        ;FILTRO JÁ IGUAL A ZERO?
                            ;(FUNÇÃO JA FOI EXECUTADA?
    GOTO    VARRE           ; SIM - VOLTA P/ VARREDURA DO TECLADO
                            ;NÃO
    DECFSZ  FILTRO_BOTOES,F ;FIM DO FILTRO? (RUIDO?)
    GOTO    VARRE           ;NÃO - VOLTA P/ VARRE
                            ;SIM - BOTÃO PRESSIONADO
    MOVLW   0XC0
    MOVWF   CCPR2L          ;CARREGA CCPR2L COM 0XC0
    BCF     CCP2CON,5       ;LIMPA OS BITS 5 E 4
    BCF     CCP2CON,4       ;LSB DO DUTY CYCLE
                            ;Tp = CCPR2L:CCP2CON<5,4>*TOSC*TMR2PRESCALE
                            ;Tp = 768 * 250ns * 16
                            ;Tp = 3,072ms
                            ;PWM -> DUTY CYCLE = 75%
    BCF     RS              ;SELECIONA O DISPLAY P/ COMANDOS
    MOVLW   0XC8            ;COMANDO PARA POSICIONAR O CURSOR
    CALL    ESCREVE         ;LINHA1/COLUNA8
    BSF     RS              ;SELECIONA O DISPLAY P/ DADOS

                            ;COMANDOS PARA ESCREVER AS
                            ;LETRAS DE "75%"
    MOVLW   ' '
    CALL    ESCREVE
    MOVLW   '7'
    CALL    ESCREVE
    MOVLW   '5'
    CALL    ESCREVE
    MOVLW   '%'
    CALL    ESCREVE

    GOTO    VARRE           ;VOLTA P/ VARREDURA DOS BOTÕES

; TRATAMENTO DO BOTÃO 3
TRATA_BOTAO_3
    MOVF    FILTRO_BOTOES,F
    BTFSC   STATUS,Z        ;FILTRO JÁ IGUAL A ZERO?
                            ;(FUNÇÃO JA FOI EXECUTADA?
    GOTO    VARRE           ; SIM - VOLTA P/ VARREDURA DO TECLADO
                            ;NÃO
    DECFSZ  FILTRO_BOTOES,F ;FIM DO FILTRO? (RUIDO?)
    GOTO    VARRE           ;NÃO - VOLTA P/ VARRE
                            ;SIM - BOTÃO PRESSIONADO
    MOVLW   0XFF
    MOVWF   CCPR2L          ;CARREGA CCPR2L COM 0XFF
    BCF     CCP2CON,5       ;SETA OS BITS 5 E 4
    BCF     CCP2CON,4       ;LSB DO DUTY CYCLE
                            ;Tp = CCPR2L:CCP2CON<5,4>*TOSC*TMR2PRESCALE
                            ;Tp = 1023 * 250ns * 16
                            ;Tp = 4,092ms
                            ;PWM -> DUTY CYCLE = 99,9%
    BCF     RS              ;SELECIONA O DISPLAY P/ COMANDOS
    MOVLW   0XC8            ;COMANDO PARA POSICIONAR O CURSOR
    CALL    ESCREVE         ;LINHA1/COLUNA8
    BSF     RS              ;SELECIONA O DISPLAY P/ DADOS

                            ;COMANDOS PARA ESCREVER AS
                            ;LETRAS DE "100%"
    MOVLW   '1'
    CALL    ESCREVE
    MOVLW   '0'
    CALL    ESCREVE
    MOVLW   '0'
    CALL    ESCREVE
    MOVLW   '%'
    CALL    ESCREVE

    GOTO    VARRE           ;VOLTA P/ VARREDURA DOS BOTÕES

;------------------------------------------------------------------------------
;   FIM DO PROGRAMA
;------------------------------------------------------------------------------
END                         ;FIM DO PROGRAMA


O que devo fazer para consertar isso?
Você não está autorizado a ver ou baixar esse anexo.
have
Bit
 
Mensagens: 6
Registrado em: 03 Mai 2014 10:34

Re: Erro na Saída PWM

Mensagempor Djalma Toledo Rodrigues » 03 Mai 2014 12:13

PWM de 100% deixa de sê-lo . Se transforma em CC

O mesmo ocorreria a 0%

Por essa razão o range convencional para PWM é: 1% a 99%

Mas, nada impede, eu mesmo já o fiz:

Se PWM = 100% Saída =1
Se PWM = 0% Saída = 0

Abraço e bom PWM
DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Re: Erro na Saída PWM

Mensagempor have » 03 Mai 2014 13:06

Isso mesmo, preciso que a saída fique em nível alto constantemente, porém necessito modificar o programa, e em assembly não sei aonde faço isso.
have
Bit
 
Mensagens: 6
Registrado em: 03 Mai 2014 10:34

Re: Erro na Saída PWM

Mensagempor andre_luis » 03 Mai 2014 13:27

Tem um link bem interessante, que calcula os valores dos registradores em função do Duty-cycle e da frequencia do PWM:

PWM Calculator & Code Generator


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Erro na Saída PWM

Mensagempor have » 04 Mai 2014 23:31

Boa Noite.

Consegui resolver mudando o registrador.

Agora preciso implementar um botão liga, um desliga, um incrementa 5% e outro decrementa 5% no sinal. Como faço isso?
have
Bit
 
Mensagens: 6
Registrado em: 03 Mai 2014 10:34

Re: Erro na Saída PWM

Mensagempor chrdcv » 05 Mai 2014 18:02

Tem um camarada fera aqui no fórum chamado fabim, ele ADORA microcontroladores da Microchip e irá ajudá-lo no teu projeto. Procure o link dele aqui no site e mande mensagens para ele!

Um abraço!
Seu Madruga: "O trabalho não é ruim, ruim é ter que trabalhar"
Avatar do usuário
chrdcv
Dword
 
Mensagens: 1580
Registrado em: 13 Out 2006 14:13

Re: Erro na Saída PWM

Mensagempor andre_luis » 05 Mai 2014 21:28

have escreveu:Agora preciso implementar um botão liga, um desliga, um incrementa 5% e outro decrementa 5% no sinal. Como faço isso?


Apesar do programa estar bem documentado, não deu pra identificar qual a função dos botoes. De qualquer modo, uma abordagem bem simples seria criando 2 funções que seriam instanciadas após lido cada botão ( Supondo 1 para incrementar e outro para decrementar ).

Segue abaixo um código que acabei de tirar da cabeça, que pode conter erros de sintaxe, mas o conceito está nos comentários :

asm code
INCR_PWM_DUTY:
MOVF CCPR2L,W ; Carrega valor anterior do CCPR2L no W
ADDLW 12 ; Incrementa W em ~5% [ 12,75 = 255 * ( 5/100 ) ]
BTFSS STATUS,C ; Verifica se o resultado foi superior á 255
MOVLW 255 ; Se foi, carrega W com o valor máximo [ =255 ]
MOVWF CCPR2L ; Senão...recarrega valor do W no CCPR2L
RETURN ;

DECR_PWM_DUTY:
MOVF CCPR2L,W ; Carrega valor anterior do CCPR2L no W
SUBLW 12 ; Decrementa W em ~5% [ 12,75 = 255 * ( 5/100 ) ]
BTFSS STATUS,C ; Verifica se o resultado foi inferior á 0
CLRW ; Se foi, carrega W com o valor minimo [ =0 ]
MOVWF CCPR2L ; Senão...recarrega valor do W no CCPR2L
RETURN ;




+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Erro na Saída PWM

Mensagempor have » 05 Mai 2014 21:44

Sou meio leigo em assembly, não consigo identificar os registradores e tal. Tanto que implementei esse código ai e os botões não funcionaram como incrementa e decrementa.

Desculpa pela ignorancia, mas devo substituir nos Botões 02 e 03 do programa inicial correto?
have
Bit
 
Mensagens: 6
Registrado em: 03 Mai 2014 10:34

Re: Erro na Saída PWM

Mensagempor andre_luis » 05 Mai 2014 22:40

have escreveu:Sou meio leigo em assembly, não consigo identificar os registradores e tal.


Na verdade, pareceu muito bem escrito pra quem diz não saber muito... :)

have escreveu: Tanto que implementei esse código ai e os botões não funcionaram como incrementa e decrementa.


Não consegui localizar no seu código a implementação dessa função.
O que eu vi foi apenas a atribuição de um valor fixo, para cada caso:

Código: Selecionar todos
    TRATA_BOTAO_2
        ...
        MOVLW   0XC0
        MOVWF   CCPR2L          ;CARREGA CCPR2L COM 0XC0
Código: Selecionar todos
    TRATA_BOTAO_3
        ...
        MOVLW   0XFF
        MOVWF   CCPR2L          ;CARREGA CCPR2L COM 0XFF


have escreveu: mas devo substituir nos Botões 02 e 03 do programa inicial correto?


O que as funções sugeridas acima fazem ( ou tem pretensão de fazer ) é incrementar ou decrementar o registrador do Duty-cycle quando chamadas. Isso significa que ao apertar o botão de incremento, a função INCR_PWM_DUTY deve ser chamadam, e ao acionar o botão de decremento a função DECR_PWM_DUTY deve ser chamada.

Quanto ao local onde devem ser colocadas, eu diria que poderia ser logo após o label TRATA_BOTAO_x ( não sei exatamente qual botão voce deseja usar pra qual funcao ).
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Erro na Saída PWM

Mensagempor have » 06 Mai 2014 00:24

Não consegui resolver nada ainda. O erro que a principio havia resolvido, começou a aparecer denovo.

Não faço nem ideia como se faz e é para amanhã isso.
have
Bit
 
Mensagens: 6
Registrado em: 03 Mai 2014 10:34

Re: Erro na Saída PWM

Mensagempor have » 08 Mai 2014 09:24

Para quem tiver interesse, os códigos para implementação dos botões ficou assim:

asm code
;------------------------------------------------------------------------------
; PWM ASSEMBLY
;------------------------------------------------------------------------------
; AUTOR:
; DATA:
; CONTROLE DE REVISÕES:
;------------------------------------------------------------------------------
#INCLUDE <P16F877A.INC>
;------------------------------------------------------------------------------
; BITS DE CONFIGURAÇÃO
;------------------------------------------------------------------------------
; CONFIG
; __config 0xFF79
__CONFIG _FOSC_XT & _WDTE_ON & _PWRTE_ON & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
; FOSC - Seleção tipo oscilador.
; WDTE - Watchdog timer.
; PWRTE - Power on timer (72ms após energização).
; BOREN - Brown-out enable, proteção contra baixa tensão.
; LVP - Low voltage programming.
; CPD - Code protect da EEPROM.
; WRT - Write protection da memória flash.
; CP - Code protect memória de programa.
;------------------------------------------------------------------------------
; PAGINAÇÃO DE MEMÓRIA (MACROS)
;------------------------------------------------------------------------------
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM

BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM

BANK2 MACRO
BCF STATUS,RP0
BSF STATUS,RP1
ENDM

BANK3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1
ENDM
;------------------------------------------------------------------------------
; VARIÁVEIS
;------------------------------------------------------------------------------
CBLOCK 0X20
FILTRO_BOTOES
TEMPO1
TEMPO0

FLAG
PWM
COUNT
COUNT_SUB
ENDC
;------------------------------------------------------------------------------
; CONSTANTES
;------------------------------------------------------------------------------
; CONSTANTES UTILIZADAS PELO SISTEMA
FILTRO_TECLA EQU .200
;------------------------------------------------------------------------------
; ENTRADAS
;------------------------------------------------------------------------------
; PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
#DEFINE BOTAO_0 PORTB,0 ;ESTADO BOTÃO 0
;1 -> LIBERADO
;0 -> PRESSIONADO
#DEFINE BOTAO_1 PORTB,1 ;ESTADO BOTÃO 1
;1 -> LIBERADO
;0 -> PRESSIONADO
#DEFINE BOTAO_2 PORTB,2 ;ESTADO BOTÃO 2
;1 -> LIBERADO
;0 -> PRESSIONADO
#DEFINE BOTAO_3 PORTB,3 ;ESTADO BOTÃO 3
;1 -> LIBERADO
;0 -> PRESSIONADO
;------------------------------------------------------------------------------
; SAÍDAS
;------------------------------------------------------------------------------
; PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
#DEFINE DISPLAY PORTD ;BARRAMENTO DE DADOS DO DISPLAY
#DEFINE RS PORTE,0 ;INDICA P/ O DISPLAY UM DADO OU COMANDO
;1 -> DADO
;0 -> COMANDO
#DEFINE ENABLE PORTE,1 ;SINAL DE ENABLE P/ DISPLAY
;ATIVO NA BORDA DE DESCIDA
#DEFINE VENTILADOR PORTC,1 ;SAÍDA P/ O VENTILADOR
;1 -> VENTILADOR LIGADO
;0 -> VENTILADOR DESLIGADO
;------------------------------------------------------------------------------
; VETOR DE RESET DO MICROCONTROLADOR
;------------------------------------------------------------------------------
ORG 0X0000 ;ENDEREÇO DO VETOR DE RESET
GOTO INICIO ;PULA PARA CONFIG DEVIDO A REGIÃO
;DESTINADA AS ROTINAS SEGUINTES
;------------------------------------------------------------------------------
; ROTINA DE DELAY (DE 1mS ATÉ 256mS)
;------------------------------------------------------------------------------
;ESTÁ É UMA ROTINA DE DELAY VARIÁVEL, COM DURAÇÃO DE 1mS X O VALOR PASSADO EM
;WORK

DELAY_MS
MOVWF TEMPO1 ;CARREGA TEMPO1(UNIDADE DE mS)
MOVLW .250
MOVWF TEMPO0 ;CARREGA TEMPO0 (P/CONTAR 1mS)

CLRWDT ;LIMPA WDT (PERDE TEMPO)
DECFSZ TEMPO0,F ;FIM DE TEMPO0?
GOTO $-2 ;NÃO - VOLTA 2 INSTRUÇÕES
;SIM - PASSOU-SE 1mS
DECFSZ TEMPO1,F ;FIM DE TEMPO1?
GOTO $-6 ;NÃO - VOLTA 6 INSTRUÇÕES
;SIM
RETURN ;RETORNA
;------------------------------------------------------------------------------
; ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY
;------------------------------------------------------------------------------
;ESTA ROTINA ENVIA UM CARACTER PARA O MÓDULO DE LCD. O CARACTER A SER ESCRITO
;DEVE SER COLOCADO EM WORK (W) ANTES DE CHAMAR A ROTINA.
ESCREVE
MOVWF DISPLAY ;ATUALIZA DISPLAY (PORTD)
NOP ;PERDE 1US PARA ESTABILIZAÇÃO
BSF ENABLE ;ENVIA UM PULSO DE ENABLE AO DISPLAY
GOTO $+1
BCF ENABLE


MOVLW .1
CALL DELAY_MS ;DELAY DE 1MS
RETURN ;RETORNA
;------------------------------------------------------------------------------
; CONFIGURAÇÕES INICIAIS DE HARDWARE E SOFTWARE
;------------------------------------------------------------------------------
;NESTA ROTINA SÃO INICIALIZADAS AS PORTAS DE I/O DO MICROCONTROLADOR E AS
;CONFIGURAÇÕES DOS REGISTRADORES ESPECIAIS (SFR). A ROTINA INICIALIZA A MÁQUINA
;E AGUARDA O ESTOURO DO WDT.
INICIO
CLRF PORTA ;GARANTE TODAS AS SAÍDAS EM ZERO
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE

BANK1 ;SELECIONA BANCO 1 DA RAM
MOVLW B'11111101'
MOVWF TRISA ;CONFIGURA I/O DO PORTA

MOVLW B'11111111'
MOVWF TRISB ;CONGIGURA I/O DO PORTB

MOVLW B'11111101'
MOVWF TRISC ;CONFIGURA I/O DO PORTC

MOVLW B'00000000'
MOVWF TRISD ;CONFIGURA I/O DO PORTD

MOVLW B'00000100'
MOVWF TRISE ;CONFIGURA I/O DO PORTE

MOVLW B'11011111'
MOVWF OPTION_REG ;CONFIGURA OPTIONS
;PULL-UPS DESABILITADOS
;INTER. NA BORDA DE SUBIDA DO RB0
;TIMER0 INCREM. PELO CICLO DE MÁQUINA
;WDT - 1:128
;TIMER - 1:1

MOVLW B'00000000'
MOVWF INTCON ;CONFIGURA INTERRUPÇÕES
;DESABILITA TODAS AS INTERRUPÇÕES

MOVLW B'00000111'
MOVWF ADCON1 ;CONFIGURA CONVERSOR A/D
;CONFIGURA PORTA E PORTE COMO I/O DIGITAL

MOVLW .255
MOVWF PR2 ;CONFIGURA PERÍODO DO PWM
;T=((PR2)+1)*4*TOSC*TMR2PRESCALE
;T=((255)+1)*4*250ns*16
;T=4,096ms -> 244,14 Hz

BANK0 ;SELECIONA BANCO 0 DA RAM

MOVLW B'00000111'
MOVWF T2CON ;CONFIGURA TMR2
;TIMER 2 LIGADO
;PRESCALE 1:16
;POSTSCALE 1:1

MOVLW B'00001111'
MOVWF CCP2CON ;CONFIGURA CCP2CON PARA PWM
;(PINO RC1)
CLRF CCPR2L ;INICIA COM DUTY CYCLE EM ZERO
;------------------------------------------------------------------------------
; INICIALIZAÇÃO DA RAM
;------------------------------------------------------------------------------
; ESTA ROTINA IRÁ LIMPAR TODA A RAM DO BANCO 0, INDO DE 0X20 A 0X7F.
; EM SEGUIDA, AS VARIÁVEIS DE RAM DO PROGRAMA SÃO INICIALIZADAS.
MOVLW 0X20
MOVWF FSR ;APONTA O ENDEREÇAMENTO INDIRETO PARA
;A PRIMEIRA POSIÇÃO DA RAM
LIMPA_RAM
CLRF INDF ;LIMPA POSIÇÃO
INCF FSR,F ;INCREMENTA O PONTEIRO P/ A PRÓX. POS.
MOVF FSR,W
XORLW 0X80 ;COMPARA O PONTEIRO COM A ÚLTIMA POS. +1
BTFSS STATUS,Z ;JÁ LIMPOU TODAS AS POSIÇÕES?
GOTO LIMPA_RAM ;NÃO - LIMPA A PRÓXIMA POSIÇÃO
;SIM
;------------------------------------------------------------------------------
; CONFIGURAÇÕES INICIAIS DO DISPLAY
;------------------------------------------------------------------------------
; ESTA ROTINA INCIALIZA O DISPLAY P/ COMUNICAÇÃO DE 8 VIAS, DISPLAY PARA 2
; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR À DIREITA.

INICIALIZACAO_DISPLAY
BCF RS ;SELECIONA O DISPLAY P/ COMANDOS

MOVLW 0X30 ;ESCREVE COMANDO 0X30 PARA
CALL ESCREVE ;INICIALIZAÇÃO

MOVLW .3
CALL DELAY_MS ;DELAY DE 3MS (EXIGIDO PELO DISPLAY)

MOVLW 0X30 ;ESCREVE COMANDO 0X30 PARA
CALL ESCREVE ;INICIALIZAÇÃO

MOVLW 0X30 ;ESCREVE COMANDO 0X30
CALL ESCREVE ;INICIALIZAÇÃO

MOVLW B'00111000' ;ESCREVE COMANDO PARA
CALL ESCREVE ;INTERFACE DE 8 VIAS DE DADOS

MOVLW B'00000001' ;ESCREVE COMANDO PARA
CALL ESCREVE ;LIMPAR TODO DISPLAY

MOVLW .1
CALL DELAY_MS ;DELAY DE 1MS

MOVLW B'00001100' ;ESCREVE COMANDO PARA
CALL ESCREVE ;LIGAR O DISPLAY SEM CURSOR

MOVLW B'00000110' ;ESCREVE COMANDO PARA INCREM.
CALL ESCREVE ;AUTOMÁTICO À DIREITA

;------------------------------------------------------------------------------
; ROTINA DE ESCRITA DA TELA PRINCIPAL
;------------------------------------------------------------------------------
; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES:
; LINHA 1 - "MICROCONTROLADORES"
; LINHA 2 - "PWM: XX% "

MOSTRA_TELA_PRINCIPAL
MOVLW 0X80 ;COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ;LINHA 0/ COLUNA 1
BSF RS ;SELECIONA O DISPLAY P/ DADOS

;COMANDOS PARA ESCREVER AS
;LETRAS DE "TRABALHO-1"
MOVLW 'T'
CALL ESCREVE
MOVLW 'R'
CALL ESCREVE
MOVLW 'A'
CALL ESCREVE
MOVLW 'B'
CALL ESCREVE
MOVLW 'A'
CALL ESCREVE
MOVLW 'L'
CALL ESCREVE
MOVLW 'H'
CALL ESCREVE
MOVLW '0'
CALL ESCREVE
MOVLW '-'
CALL ESCREVE
MOVLW '1'
CALL ESCREVE

BCF RS ;SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0XC3 ;COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ;LINHA 1/COLUNA 3
BSF RS ;SELECIONA O DISPLAY P/DADOS

;COMANDOS PARA ESCREVER AS
; LETRAS DE "PWM: OFF"
MOVLW 'P'
CALL ESCREVE
MOVLW 'W'
CALL ESCREVE
MOVLW 'M'
CALL ESCREVE
MOVLW ':'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW 'O'
CALL ESCREVE
MOVWF 'F'
CALL ESCREVE
MOVWF 'F'
CALL ESCREVE

;------------------------------------------------------------------------------
; VARREDURA DOS BOTÕES
;------------------------------------------------------------------------------
; ESTA ROTINA VERIFICA SE ALGUM BOTÃO ESTÁ PRESSIONADO E CASO AFIRMATIVO
; DESVIA PARA O TRATAMENTO DO MESMO.

VARRE
CLRWDT ;LIMPA WATCHDOG TIMER

; VERIFICA ALGUM BOTÃO PRESSIONADO
VARRE_BOTOES
BTFSS BOTAO_0 ;O BOTÃO 0 ESTA PRESSIONADO?
GOTO PWM_ON ;SIM - PULA P/ TRATA_BOTAO_O
;NÃO
BTFSS BOTAO_1 ;O BOTÃO 1 ESTA PRESSIONADO?
GOTO BOTAO_INCREMENTA ;SIM - PULA P/ TRATA_BOTAO_1
;NÃO
BTFSS BOTAO_2 ;O BOTÃO 2 ESTA PRESSIONADO?
GOTO BOTAO_DECREMENTA ;SIM - PULA P/ TRATA_BOTAO_2
;NÃO


; FITRO P/ EVITAR RUIDOS

MOVLW FILTRO_TECLA ;CARREGA O VALOR DE FILTRO_TECLA
MOVWF FILTRO_BOTOES ;SALVA EM FILTRO_BOTOES
;RECARREGA FILTRO P/ EVITAR RUIDOS
; NOS BOTÕES
GOTO VARRE ;VOLTA PARA VARRER TECLADO
;------------------------------------------------------------------------------
; TRATAMENTO DOS BOTÕES
;------------------------------------------------------------------------------
; NESTE TRECHO DO PROGRAMA ESTÃO TODOS OS TRATAMENTOS DOS BOTÕES

; TRATAMENTO DO BOTÃO 0
PWM_ON
MOVF FILTRO_BOTOES,F
BTFSC STATUS,Z ;FILTRO JÁ IGUAL A ZERO?
;(FUNÇÃO JA FOI EXECUTADA?)
GOTO VARRE ;SIM - VOLTA P/ VARREDURA DO TECLADO
;NÃO
DECFSZ FILTRO_BOTOES,F ;FIM DO FILTRO?(RUIDO?)
GOTO VARRE ;NÃO - VOLTA P/ VARRE
;SIM - BOTÃO PRESSIONADO

BTFSC FLAG,1
GOTO TESTE
BSF FLAG,1

CLRF CCPR2L ;ZERA CCPR2L
BCF CCP2CON,5 ;ZERA OS BITS 5 E 4
BCF CCP2CON,4 ; (LSB DO DUTY CYCLE)
;Tp=CCPR2L:CCP2CON<5,4>*TOSC*TMR2PRESCALE
;Tp=0*250ns*16
;Tp=0;
;PWM -> DUTY CYCLE = 0% -> OFF
BCF RS ;SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0XC8 ;COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ;LINHA 1 / COLUNA 8
BSF RS ;SELECIONA O DISPLAY P/DADOS

;COMANDOS PARA ESCREVER AS
;LETRAS DE "OFF"
MOVLW ' '
CALL ESCREVE
MOVLW 'O'
CALL ESCREVE
MOVLW 'F'
CALL ESCREVE
MOVLW 'F'
CALL ESCREVE

GOTO VARRE ;VOLTA P/ VARREDURA DOS BOTÕES

TESTE
BCF FLAG,1
GOTO CONFIGURA_PWM

TRATA_ESTOURO_1
MOVLW 0XFF
MOVWF PWM
RETURN
TRATA_ESTOURO_2
MOVLW 0X00
MOVWF PWM
RETURN

SUB_COMP_2 ;COUNT_SUB - 35
COMF COUNT_SUB,F
INCF COUNT_SUB,F
MOVLW .13
ADDWF COUNT_SUB,F
BTFSC STATUS,C
GOTO RESULT_ZERO
RESULT_POSITIVO
COMF COUNT_SUB,F
INCF COUNT,F
RETLW .1
RESULT_ZERO
BSF FLAG,2
MOVF COUNT_SUB,W
BTFSS STATUS,Z
GOTO RESULT_NEGATIVO
RETLW .0
RESULT_NEGATIVO
BSF FLAG,2
RETLW .2

; TRATAMENTO DO BOTÃO 1
BOTAO_INCREMENTA



MOVF FILTRO_BOTOES,F
BTFSC STATUS,Z ;FILTRO JÁ IGUAL A ZERO?
;(FUNÇÃO JA FOI EXECUTADA?
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO
;NÃO
DECFSZ FILTRO_BOTOES,F ;FIM DO FILTRO? (RUIDO?)
GOTO VARRE ;NÃO - VOLTA P/ VARRE
;SIM - BOTÃO PRESSIONADO
BTFSC FLAG,1
GOTO VARRE
BCF FLAG,2
MOVF PWM,W ; Carrega valor anterior do CCPR2L no W
ADDLW .13
MOVWF PWM ; Incrementa W em ~5% [ 12,75 = 255 * ( 5/100 ) ]
BTFSC STATUS,C ; Verifica se o resultado foi superior á 0
CALL TRATA_ESTOURO_1 ; Senão...recarrega valor do W no CCPR2L
GOTO CONFIGURA_PWM

CONFIGURA_PWM
MOVF PWM,W
MOVWF CCPR2L ;CARREGA CCPR2L COM 0X80
BCF CCP2CON,5 ;LIMPA OS BITS 5 E 4
BCF CCP2CON,4 ;LSB DO DUTY CYCLE

;Tp = CCPR2L:CCP2CON<5,4>*TOSC*TMR2PRESCALE
;Tp = 512 * 250ns * 16
;Tp = 2,048ms
;PWM -> DUTY CYCLE = 50%

BCF RS ;SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0XC8 ;COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ;LINHA1/COLUNA8
BSF RS ;SELECIONA O DISPLAY P/ DADOS

;COMANDOS PARA ESCREVER AS
;LETRAS DE "50%"
MOVLW ' '
CALL ESCREVE
MOVLW 'O'
CALL ESCREVE
MOVLW 'N'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE

GOTO VARRE ;VOLTA P/ VARREDURA DOS BOTÕES

; TRATAMENTO DO BOTÃO 2
BOTAO_DECREMENTA



MOVF FILTRO_BOTOES,F
BTFSC STATUS,Z ;FILTRO JÁ IGUAL A ZERO?
;(FUNÇÃO JA FOI EXECUTADA?
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO
;NÃO
DECFSZ FILTRO_BOTOES,F ;FIM DO FILTRO? (RUIDO?)
GOTO VARRE ;NÃO - VOLTA P/ VARRE
;SIM - BOTÃO PRESSIONADO

BTFSC FLAG,1
GOTO VARRE
BTFSC FLAG,2
GOTO VARRE
MOVF PWM,W
MOVWF COUNT_SUB
CALL SUB_COMP_2 ; Carrega valor anterior do CCPR2L no W
MOVF COUNT_SUB,W
MOVWF PWM
BTFSC FLAG,2 ; Incrementa W em ~5% [ 12,75 = 255 * ( 5/100 ) ]
; Verifica se o resultado foi superior á 0
CALL TRATA_ESTOURO_2 ; Senão...recarrega valor do W no CCPR2L
GOTO CONFIGURA_PWM


BCF RS ;SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0XC8 ;COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ;LINHA1/COLUNA8
BSF RS ;SELECIONA O DISPLAY P/ DADOS

;COMANDOS PARA ESCREVER AS
;LETRAS DE "75%"
MOVLW ' '
CALL ESCREVE
MOVLW '7'
CALL ESCREVE
MOVLW '5'
CALL ESCREVE
MOVLW '%'
CALL ESCREVE

GOTO VARRE ;VOLTA P/ VARREDURA DOS BOTÕES


;------------------------------------------------------------------------------
; FIM DO PROGRAMA
;------------------------------------------------------------------------------
END ;FIM DO PROGRAMA


Abraço
have
Bit
 
Mensagens: 6
Registrado em: 03 Mai 2014 10:34


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x