Sei sulla pagina 1di 18

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/266341318

Solução por Software para Implementar PWM em qualquer Microcontrolador


PIC

Article

CITATIONS READS

0 281

1 author:

Francisco Fambrini
Faculdade Campo Limpo Paulista
12 PUBLICATIONS   9 CITATIONS   

SEE PROFILE

All content following this page was uploaded by Francisco Fambrini on 31 December 2015.

The user has requested enhancement of the downloaded file.


Solução por Software para Implementar PWM em
qualquer Microcontrolador PIC

Prof. Francisco Fambrini


Faculdade de Engenharia, Universidade Anhanguera
Pólo Santa Bárbara do Oeste

Palavras-Chave:
Microcontroladores, PWM, Modulação por largura de Pulso, Microchip, PIC.

Keywords:
Microcontrollers, PWM, Pulse Width Modulation, Microchip, PIC.

Abstract:
Some PIC Microcontrollers (Microchip) have built-in PWM modules, whose devices can produce pwm
signals without computacional effort and extra firmware. However, all older PICs and some new models (for
instance, PIC12F675) don´t have built-in PWM modules in chip case.
In this paper, the author intends to describe a PWM Software Solution for the PIC12F675 and other PIC
microcontrollers without hard-coded PWM. This solution allows to build a digital pwm system embeeded at
all PIC Microcontrollers chips.
In adittion, a short revision about PWM System and MOS-FET transistors power control are described.
A review about PWM concepts and its applications is also done as well as considerations about power stage,
using MOS-FET transistors.
Some considerations about programming techniques in Assembly language and a variety of examples about
the implementation code were also included in this text in order to permit the interested reader to make the
experience in laboratory.

Resumo:
Muitos Microcontroladores PIC (Microchip) possuem módulos PWM internos na própria pastilha, que
possibilitam gerar sinais de pwm sem esforço computacional e sem firmware extra.
Entretanto, todos os PICs mais antigos e alguns novos modelos (por exemplo, PIC12F675) não possuem tal
módulo PWM interno em sua pastilha.
Neste trabalho o autor pretende descrever um método para se implementar um Controlador PWM em
qualquer microcontrolador PIC (Microchip), até mesmo em modelos que não possuem o módulo de PWM
interno construído por hardware.
Uma revisão sobre o Conceito de PWM e suas aplicações também é levada a feito, bem como considerações
sobre o estágio de potência, usando transístores hex MOS-FET .
Algumas considerações a respeito de técnicas de programação em linguagem Assembly e vários exemplos de
como esse código foi implementado também foram incluídas no texto, com a finalidade de possibilitar ao
leitor interessado reproduzir a idéia em laboratório.
Conceitos:
PWM é uma sigla para Pulse Width Modulation, ou seja, Modulação por largura de pulsos.
É um método consagrado para controlar a energia (e consequentemente a potência) entregue à carga em
dispositivos que trabalham em sistemas de Corrente Continua (DC).
Quanto maior a duração do Tempo Ligado (tempo em que o PWM permanece em On) daqui em diante
denominado Ton neste trabalho, maior será a Energia entregue à carga.

PWMs são por definição sistemas de Frequência (F) e Período (T) constantes e de Largura de Pulso (ciclo
ativo) ajustável.

Denominando de Toff o tempo em que a carga é mantida desativada, o periodo total de nosso PWM será:

T = Ton + Toff

Define-se Ciclo Ativo (Duty Cycle D.C. ) por:

Ton
D.C. =
Ton + Toff

A figura –1 abaixo ilustra a forma de onda típica de um sistema PWM digital:

Ton

Toff

Figura-1 – Forma de onda caracteristica do PWM

A solução proposta foi testada e desenvolvida num microcontrolador PIC12F675 (que não possue módulo
PWM interno) e baseia-se em firmware.
A figura-2 abaixo ilustra a pinagem deste inovador microcontrolador de apnas 8 pinos:
Figura-2 Microcontrolador PIC12F675, em seu inovador invólucro DIP de 8 pinos

Nosso Firmware foi escrito totalmente em Linguagem Assembly pois nossa intenção inicial de utilizar
Linguagem C revelou-se incapaz de proporcionar a velocidade necessária de processamento para gerar o
PWM, ler os dois botões (Up e Down) sem causar efeitos de “flicker” na onda retangular gerada.
Sobre velocidade de processamento, é importante frisar que optamos por utilizar o oscilador RC interno dos
PIC12F675, cuja frequencia de clock é fixa e igual a 4 MHz.
Como os Microcontroladores PIC dividem internamente o clock por 4, temos um clock efetivo interno de
valor 1 MHz o que nos dá um Ciclo de Máquina de duração 1 us (um microsegundo).

Com este ciclo de máquina, optamos por uma solução de software otimizada para a arquitetura do PIC,
segundo nossa referência bibliográfica (1), o que nos proporcionou excelente desempenho no PWM.
O sistema utiliza-se da interrupção do TMR0 (Timer-Zero) cujo prescaler foi ajustado para 1:2, ou seja, a
cada 2 us temos uma interrupção de timer 0 e o fluxo do programa será desviado para o endereço 0x04
(endereço do vetor de interrupção do PIC12F675).

As variáveis usadas no programa foram as seguintes:

CBLOCK 0X20
STACKW
STACKS
COUNTER
COUNTER2
PWMDESIRED
PWMMAX
PWMHELP
MAX ;VALOR MAXIMO DO PWMDESIRED
MIN ;VALOR MINIMO
FILTRO1 ;filtros dos botoes
FILTRO2
FLAGS
ENDC

Nota-se a declaração de tais variáveis a partir do endereço 0x20, que é o endereço do topo da memória RAM
do dispositivo PIC utilizado.
Outros microcontroladores podem exigir um novo endereço, bastando para isso que se altere a instrução

CBLOCK 0x20

Para o novo valor do endereço inicial de memória desejado.

Rotina de Interrupção:
A partir do endereço 0x04 é colocada a rotina de interrupção, que será atendida toda vez que o contador
denominado TMR0 (Timer-Zero) excede o valor 0xFF, caracterizando o “Overflow”.
Tal rotina é mostrada abaixo:
Org 0x04
btfsc TMR0,0
GOTO PwmInt
PwmInt:
movwf STACKW
SWAPF STACKW,F
SWAPF STATUS,W
MOVWF STACKS
BCF INTCON,T0IF
BTFSC LED
GOTO LOWPULSE
HIGHPULSE:
COMF PWMDESIRED,W
MOVWF PWMHELP
ADDWF PWMMAX,F
BTFSS STATUS,C
GOTO HIGHIMPINT
HIGHIMPSHRT:
MOVF PWMMAX,W
ADDWF PCL,F
BSF LED
BSF LED
BSF LED
.........
........ (essa instrução BSF LED é repetida diversas vezes)
.........
........
BSF LED
BSF LED
BCF LED
INCF COUNTER, F
COMF PWMHELP ,W
ADDLW PWMADJUSTVAL+5
MOVWF TMR0
GOTO LOWIMPINT2
HIGHIMPINT:
ADDLW PWMADJUSTVAL
MOVWF TMR0
HIGHIMPINT2:
BSF LED
INCF COUNTER,F
MOVLW PWMMAXVAL-1
MOVWF PWMMAX
SWAPF STACKS,W
MOVWF STATUS
SWAPF STACKW,W
RETFIE

A instrução RETFIE finaliza a interrupção e devolve controle do fluxo do programa ao endereço


armazenado no PCLATCH (Program Counter);

Na rotina de interrupção temos uma estrutura de software da seguinte forma:

MOVF pwmdesired , W
ADDWF PCL,F
bsf LED
bsf LED
bsf LED
bsf LED
bsf LED
bsf LED
.....
.....
.....
Cada instrução do tipo BSF (Bit Set File) mantém a saída LED em nível lógico alto durante um tempo igual a
1 us. De modo análogo, cada instrução do tipo BCF (Bit Clear File) mantém a mesma saída em nível lógico
baixo durante o mesmo intervalo de tempo. A associação série de diversas instruções idênticas desse tipo é
que permite produzir os tempos Ton e Toff necessários para se construir a forma de onda do PWM desejado.

O registrador pwmdesired armazena o valor desejado de Ton. A seguir este valor é movido para o W e
somado ao PCL que produz um salto relativo para a instrução que mantém o PWM pelo tempo correto na
saída do microcontrolador.
O uso de interrupção do Timer0 nos possibilita independência para leitura dos botoes UP e DOWN sem
prejudicar a geração da onda do PWM.
O botão UP incrementa o ciclo ativo e o botão DOWN decrementa.
O PWM inicializa-se sempre em zero, ou seja, ao restabelecer a energia, começa sempre desativado.

A constante “LED” é definida no cabeçalho do programa da seguinte forma:

#define LED GPIO,5

sendo que o gate do transistor de potência utilizado foi então conectado ao pino GPIO.5 do Microcontrolador,
sendo este o elemento de saida onde é gerado o sinal PWM.

Rotina de Controle do Ciclo Ativo:


A rotina que faz a Leitura das duas teclas ( denominadas respectivamente “UP” e “Down” ) é mostrada
abaixo, sendo que tais teclas tem por função incrementar ou decrementar o ciclo ativo do sinal de PWM
produzido no pino GPIO.5 do Microcontrolador usado no protótipo:

CONTROLE:
clrwdt
BTFSS BT1
GOTO AUMENTAR
BTFSS BT2
GOTO DIMINUIR
goto CONTROLE
AUMENTAR:
MOVF MAX,W ; verifica se o valor de “pwmdesired” ja está no máximo
XORWF PWMDESIRED,W
BTFSC STATUS,Z
GOTO CONTROLE ; se pwmdesired=MAX volta para CONTROLE
INCF PWMDESIRED,1 ; caso contrario, incrementa a variavel pwmdesired
CALL DELAY
GOTO CONTROLE
DIMINUIR:
MOVF MIN,W
XORWF PWMDESIRED,W
BTFSC STATUS,Z
GOTO CONTROLE
DECF PWMDESIRED,1
CALL DELAY
GOTO CONTROLE

Filtros Anti -debouncing:


Os botões (que são chaves mecânicas convencionais, do tipo “push-buttons” ) geram, ao serem pressionados,
o inevitável ruído elétrico conhecido na literatura como “bouncing” (referência 8) .
Com a finalidade de resolver tal problema, foi acrescentado um filtro por software, que nada mais é do que
uma rotina de atraso de tempo (conhecida na literatura como “delay” ), que produz um atraso da ordem de
100 ms para um clock interno de 4 MHz e ciclo de máquina de 1 microsegundo.
Tal rotina é descrita abaixo:

DELAY:
movlw .30
movwf FILTRO2
DL1:
clrwdt
movlw .255
movwf FILTRO1
DL2:
clrwdt
NOP
DECFSZ FILTRO1,F
GOTO DL2
DECFSZ FILTRO2,F
GOTO DL1
RETURN

Outro detalhe é o uso dos resistores de pull-up internos ao Microcontrolador PIC em questão, o que nos
dispensou de usá-los externamente, através da configuração do registrador WPU.
Também não foi utilizado nenhum oscilador de clock externo ao chip, nem cristal de quartzo, tendo-se optado
pelo uso do oscilador RC interno ao chip como forma de minimizar a quantidade de componentes externos.

É importante tecer algumas considerações sobre o estágio de Potência.


A escolha recaiu para um transistor MOS de Efeito de Campo (MOS-FET) da International Rectifier, o IRLZ
44 N.
A letra “L” no prefixo IRLZ indica que seu gate é adequado para controles lógicos e que o mesmo pode ser
saturado com tensões de 5 Volts, o que não ocorre com os tipos IRF ou IRFZ.
Nestes, um valor tão baixo de tensão pode não levá-lo à saturação, fazendo o Mos-Fet operar na região linear,
o que iria provocar um considerável aquecimento do componente ( referência 6 ).

Operando na condição de Corte e Saturação, o aquecimento é mínimo (não ocorre perda de energia por
dissipação de potência na junção Dreno – Source de maneira apreciável ) .
Assim, o transistor poderá manipular correntes elevadas (até 47 A segundo o datasheet do fabricante),
exibindo (quando saturado) uma resistência DRENO-SOURCE ( Rds ) de apenas Rds = 0,022 ohms (6).
A tensão máxima admissível entre D e S é de 55 Volts, ainda de acordo com (6).

A escolha do resistor de Gate do mos-fet também é importante: a capacitância interna entre G e S é elevada
(da ordem de 1700 pF ) e um resistor de valor elevado formaria com esta um RC com constante de tempo
considerável, prejudicando o disparo rápido para corte e saturação deste transistor.
Nota-se que o tempo necessário para que um capacitor que compõe uma rede RC esteja totalmente carregado
é dado por:

T = 5.R.C

Onde o tempo é dado em segundos, o capacitor é dado em farads e o resistor em ohms.


E a Energia total acumulada por este capacitor será, em unidades SI (joules):

CU 2
E=
2

Onde C é a capacitância em farads e U é o valor final da tensão sobre o capacitor.

Por outro lado, a carga elétrica total armazenada por este capacitor é dada por:

Q = C.U

Onde Q representa a carga total armazenada medida em coulombs.


Tal energia acumulada na junção gate-source será da ordem de 0,02 microJoules e a carga elétrica total será
de 0,0085 microCoulombs.

Por outro lado, o menor valor de resistor admissível pela saída do microcontrolador PIC é de 200 ohms, pois
tais dispositivos são especificados para uma corrente máxima de saída de 25 mA em 5 Volts de alimentação
(ref. 7) .
O valor escolhido foi então de 200 ohms.
Faz-se também necessário acrescentar um diodo zener entre o gate do mos-fet e a porta de saída do PIC, para
evitar que spikes rápidos de tensão venham a atingir o microcontrolador, o que provocaria a queima do
mesmo.
Um diodo zener (1N4733A) foi inserido entre um resistor de 22 ohms e outro de 180 ohms associados em
série, para evitar oscilações parasitas que poderiam provocar o disparo errático do terminal Gate do transístor
Mos-Fet usado no estágio de potência. O diagrama elétrico do circuito experimentalmente adotado é mostrado
abaixo:

Figura-3 - Circuito Elétrico experimental proposto


A potência dissipada pela junção Dreno-Source do transistor Mos-Fet utilizado, considerando-se uma carga
resistiva de 1,2 ohms acoplada ao dreno foi da ordem de 1,25 watts, o que equivale a uma energia de 1,25 J
por segundo produzida na forma de calor.
Tal medida foi efetuada em laboratório, usando-se um calorímetro específico.
Essa dissipação de potência nos leva a recomendar o uso de um pequeno radiador de calor, preferencialmente
em alumínio, acoplado termicamente ao transístor, com a finalidade de aumentar a superfície da pastilha em
contato com o ar e possibilitar a necessária refrigeração.
Recomenda-se ainda que tal dissipador de calor seja pintado na cor preta, com tinta apropriada para
superfícies de alumínio, porque a cor negra tem melhores propriedades de irradiação térmica.

Nota-se ainda pelo diagrama elétrico da figura 2 que um terminal “jumper” foi acrescentado no pino A3
(também denominado GPIO.3) com a finalidade de se acrescentar futuras inovações.
A idéia é que, através da colocação deste jumper no circuito, novas funções possam ser implementadas, tais
como a leitura de um LDR (Light Dependent Resistor) ou uma foto-célula, com a finalidade de comandar
automaticamente a intensidade da iluminação ambiente, levando-se em conta o nível de luz local.
Tais implementações serão oportunamente descritas.
Ainda sobre a entrada GPIO.3 (na figura 2 chamada simplesmente A3) nota-se que também não foram
utilizados os resistores de “pull-up” tradicionais, o que se traduz numa economia de componentes e maior
confiabilidade para o circuito.
Ao invés de se utilizar resistores de pull-up externos, optou-se mais uma vez pelo uso dos elementos internos
ao Microcontrolador, que foram acionados através da correta configuração do registrador WPU:

MOVLW 16h
MOVWF WPU ;configura os resitores de pull-up

Configurações Iniciais:
As configurações usadas para inicializar o Microcontrolador, bem como o estado incial do registrador
STATUS são descritas abaixo:

#include <p12f675.inc>
__CONFIG 314Ch
#define BANK0 BCF STATUS, RP0
#define BANK1 BSF STATUS, RP0
BANK1 ; ajusta oscilador interno para 4MHz
CALL 3FFh
MOVWF OSCCAL
BANK0
CLRF GPIO
MOVLW 07h
MOVWF CMCON ; desliga comparadores analógicos
BANK1
CLRF ANSEL ;todos I/Os digitais
MOVLW 1Fh
MOVWF TRISIO ;configura as saidas e entradas
MOVLW 16h
MOVWF WPU ;configura os resitores de pull-up
MOVLW B'00000000' ; ajusta o OPTION_REG, TMR0 com divisor 1:2
MOVWF OPTION_REG ; habilita os pull-up
MOVLW B'10100000' ;ajusta o INTCON
MOVWF INTCON ;liga interrup do TMR0 e liga pull-ups
BANK0
A seguinte subrotina Assembly tem por função verificar quando a variável pwmdesired atingiu seu valor
máximo através do ajuste do botão “UP” pelo usuário:

;****************************************************************************
AUMENTAR:
MOVF MAX,W ; verifica se o valor de “pwmdesired” ja está no máximo
XORWF PWMDESIRED,W
BTFSC STATUS,Z
GOTO CONTROLE ; se pwmdesired=MAX volta para CONTROLE
INCF PWMDESIRED,1 ; caso contrario, incrementa a variavel pwmdesired
CALL DELAY
GOTO CONTROLE
;*****************************************************************************

Ressalta-se o uso da instrução XORWF (OU Exclusivo) com a finalidade de se efetuar a comparação entre a
variável “pwmdesired” e a constante MAX, previamente definida no firmware para limitar o valor máximo a
ser atingido pelo Ton (tempo no qual a saida permanece em nível lógico alto) do PWM.

CONCLUSÃO:

Este software é capaz de produzir na saída de qualquer Microcontrolador um PWM de ciclo ativo variável
digitalmente através de 2 botões, com 255 passos de ajuste ( 256 steps, incluindo o valor 0).
O consumo de memória do processador é inferior a 200 words (cerca de 20% da capacidade de um
PIC12F675).
A Frequência do PWM gerado gira em torno de 2,2 KHz.
O período medido é de aproximadamente 450 us.
O uso de um MOS-FET lógico de potência (IRLZ 44) da International Rectifier garante que elevadas
correntes podem ser controladas, o que torna este dispositivo ideal para controle de luminosidade de lâmpadas
e de velocidade de motores DC.

A figura-4 mostra o aspecto final do protótipo que foi montado tendo por base uma placa de cicuito impresso
padrão:

Figura-4 – Foto do Protótipo montado


REFERÊNCIAS:

(1)- Ropcke, Ole. AN654, Aplicattion Note da Microchip (www.microchip.com)


(2)- Zanco, Wagner. Microcontroladores PIC, Ed. Érica, 3 Edição
(3)- Souza, David José. Desbravando o PIC, 6 Edição, Ed. Érica
(4)- Pereira, Fabio. Microcontroladores PIC Técnicas Avançadas, Ed. Érica.
(5)- Fambrini, Francisco Apostila sobre Linguagem Assembly, INTEP, edição do Autor.
(6)- International Rectifier, Datasheet do transistor IRLZ 4
(7)- Microchip, Datasheet do microcontrolador PIC12F6xx
(8)- www.rentron.com/Myke6.htm Myke Predko, artigo sobre bouncings

ANEXO1- LISTA DE MATERIAL REFERENTE AO CIRCUITO DA FIGURA 3

ANEXO-2- CÓDIGO FONTE COMPLETO DO FIRMWARE IMPLEMENTADO


Anexo 1

Lista de Material referente ao circuito da fig- 2


Circuitos Integrados
c.i. 1 PIC 12F675 - Microcontrolador Microchip

Resistores todos 1/8 Watt


R1 470 ohms
R2 22 ohms
R3 180 ohms

Capacitores
C1 470 uF, 25V, cap eletrolítico
C2 220 uF, 25V, cap eletrolitico
C3 100nF, 16V, cap. cerâmico disco
C4 100uF, 16 V, cap eletrolitico

Diodos
D1 1N4007, diodo de Silicio
D2 1N4733A, diodo zener 5.1 V, 1 watt
D3 1N4733A, diodo zener 5.1 V, 1 watt

chaves
S1 e S2 chaves tipo push button para circuito impresso

Transistor
Q1 Transistor Hex Power Mos-Fet IRLZ 44 N
ANEXO - 1

;******************************************************
; PWM por software para PIC12F675 *
; VARIAVEL PWMDESIRED CONTROLA *
; O NIVEL DE PWM *
;;*****************************************************
#include <p12f675.inc>

__CONFIG 314Ch

#define BANK0 BCF STATUS,RP0


#define BANK1 BSF STATUS,RP0

;****************************
;variaveis do programa
;****************************
CBLOCK 0X20
STACKW
STACKS
COUNTER
COUNTER2
PWMDESIRED
PWMMAX
PWMHELP
MAX ;VALOR MAXIMO DO PWMDESIRED
MIN ;VALOR MINIMO
FILTRO1 ;filtros dos botoes
FILTRO2
FLAGS
ENDC
;****************************
; Constantes usadas no programa:
PWMADJUSTVAL EQU .22
PWMMAXVAL EQU .29
;****************************
#define LDR GPIO,0
#define BT1 GPIO,1
#define BT2 GPIO,2
#define JUMPER GPIO,4
#define LED GPIO,5

org 0x00
goto power_on

;***********************************
;Endereco inicial da interrupcao
;***********************************
org 0x04
btfsc TMR0,0
GOTO PwmInt

PwmInt:
movwf STACKW
SWAPF STACKW,F
SWAPF STATUS,W
MOVWF STACKS
BCF INTCON,T0IF
BTFSC LED
GOTO LOWPULSE

HIGHPULSE:
COMF PWMDESIRED,W
MOVWF PWMHELP
ADDWF PWMMAX,F
BTFSS STATUS,C
GOTO HIGHIMPINT

HIGHIMPSHRT:
MOVF PWMMAX,W
ADDWF PCL,F
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BSF LED
BCF LED

INCF COUNTER,F
COMF PWMHELP,W
ADDLW PWMADJUSTVAL+5
MOVWF TMR0
GOTO LOWIMPINT2

HIGHIMPINT:
ADDLW PWMADJUSTVAL
MOVWF TMR0
HIGHIMPINT2:
BSF LED
INCF COUNTER,F

MOVLW PWMMAXVAL-1
MOVWF PWMMAX
SWAPF STACKS,W
MOVWF STATUS
SWAPF STACKW,W
RETFIE
;****************************

LOWPULSE:
COMF PWMHELP,W
ADDWF PWMMAX,F
BTFSS STATUS,C
GOTO LOWIMPINT

LOWIMPSHRT:
MOVF PWMMAX,W
ADDWF PCL,F
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BCF LED
BSF LED

COMF PWMDESIRED,W
MOVWF PWMHELP
ADDLW PWMADJUSTVAL+5
MOVWF TMR0
GOTO HIGHIMPINT2
LOWIMPINT:
ADDLW PWMADJUSTVAL
MOVWF TMR0

LOWIMPINT2:
BCF LED
MOVLW PWMMAXVAL
MOVWF PWMMAX
SWAPF STACKS,W
MOVWF STATUS
SWAPF STACKW,W
RETFIE

;*********************************************************************
; inicio do programa propriamente
;*********************************************************************

power_on: ;ajustes iniciais

clrf TMR0
CLRF PWMDESIRED
BCF LED
MOVLW PWMMAXVAL
MOVWF PWMMAX

;*******************************************************************
; Configuração do PIC
;*******************************************************************
BANK1 ; ajusta oscilador interno para 4MHz
CALL 3FFh
MOVWF OSCCAL

BANK0
CLRF GPIO
MOVLW 07h
MOVWF CMCON ; desliga comparadores analógicos

BANK1
CLRF ANSEL ;todos I/Os digitais
MOVLW 1Fh
MOVWF TRISIO ;configura as saidas e entradas
MOVLW 16h
MOVWF WPU ;configura os resitores de pull-up

MOVLW B'00000000' ; ajusta o OPTION_REG, TMR0 com divisor 1:2


MOVWF OPTION_REG ; habilita os pull-up

MOVLW B'10100000' ;ajusta o INTCON


MOVWF INTCON ;liga interrup do TMR0 e liga pull-ups

BANK0
;****************************************

Idle:
clrwdt
btfss COUNTER,07h
goto Idle
bcf COUNTER,07h

;**********************
;Controle do PWM
;**********************
MOVLW .0
MOVWF PWMDESIRED ;valor inicial do PWM
MOVWF MIN ;valor minimo do pwm
MOVLW .250 ;valor maximo do pwm
MOVWF MAX

CONTROLE:
clrwdt
;******************
;Checa o botao 1:
;******************
BTFSS BT1
GOTO AUMENTAR
;******************
;Checa o botao 2:
;******************
BTFSS BT2
GOTO DIMINUIR
goto CONTROLE
;******************

;******************************************************************
AUMENTAR:
MOVF MAX,W ; verifica se o valor de “pwmdesired” ja está no máximo
XORWF PWMDESIRED,W
BTFSC STATUS,Z
GOTO CONTROLE ; se pwmdesired=MAX volta para CONTROLE
INCF PWMDESIRED,1 ; caso contrario, incrementa a variavel pwmdesired
CALL DELAY
GOTO CONTROLE
;******************************************************************

;******************************************************************
DIMINUIR:
MOVF MIN,W
XORWF PWMDESIRED,W
BTFSC STATUS,Z
GOTO CONTROLE
DECF PWMDESIRED,1
CALL DELAY
GOTO CONTROLE
;******************************************************************

;*************************
; Rotina de delay
;*************************
DELAY:
movlw .30
movwf FILTRO2
DL1:
clrwdt
movlw .255
movwf FILTRO1
DL2:
clrwdt
NOP
DECFSZ FILTRO1,F
GOTO DL2
DECFSZ FILTRO2,F
GOTO DL1
RETURN
;************************
END

View publication stats

Potrebbero piacerti anche