Você está na página 1de 18

1

UNIVERSIDADE DO OESTE DE SANTA CATARINA CAMPUS JOAABA REA DE CINCIAS EXATAS E DA TERRA CURSO DE ENGENHARIA ELTRICA

GILIARD PAGANINI

APRESENTAO DO PROGRAMA MDULO PWM

JOAABA, JUNHO 2013

INTRODUO A modulao por largura de pulso (MLP) - mais conhecida pela sigla em ingls PWM (Pulse-Width Modulation) - de um sinal ou em fontes de alimentao envolve a modulao de sua razo cclica (duty cycle) para transportar qualquer informao sobre um canal de comunicao ou controlar o valor da alimentao entregue a carga. O relatrio visa descrever o processo de funcionamento do PWM, algumas caractersticas e aplicaes. A experincia aciona e varia a velocidade do cooler da placa e alimenta o resistor, variando a tenso, e por consequncia a temperatura. Todas as variveis so alteradas pelos botes.

MODULAO PWM O PWM significa modulao por largura de pulso, um sinal digital com frequncia fixa, mas com largura do pulso varivel. O mdulo PWM pode ser utilizado em diversas aplicaes , como por exemplo: conversores digital/analgico, fontes chaveadas, nobreaks, entre outros.
Podemos visualizar o PWM na figura 1.

Figura 1 PWM

Ainda na figura 1 podemos dizer que a parte do ciclo ativo representado pelo sinal em nvel 1, e como podemos observar quanto maior a largura, maior a frequncia do ciclo. O perodo do ciclo do sinal PWM definido pelo valor escrito no registrador PR2, pela FOSC e pelo fator de prescaler aplicado a TMR2. O valor exato pode ser obtido pela frmula: T = [(PR2) + 1] x 4 x Tosc x (Prescale do TMR2), no podemos esquecer tambm que: PWMFreq = 1 / T. Outra forma , deduzindo o valor de PR2, obtemos um calculo em funo da frequncia do sinal PWM: PR2 = [(Fosc/Fpwm x 4 x (Prescale do TMR2)]-1. Outro elemento importante para saber o duty cicle, que representa e relao entre o ciclo ativo e o perodo do sinal PWM. DutyCycle=PWM(ciclo ativo)/T(pwm). Para representao utilizasse em porcentagem, assim: DutyCycle=[PWM(ciclo ativo)/T(pwm)]*100%. Se a resultante for igual a zero, significa q o PWM ser sempre 0, no havendo tempo em que ele estar em nvel 1, e se o resultado for maior que 1 significa que ele ter sempre nvel 1. No podemos deixar de comentar que sempre que o duty cycle do sinal PWM varia, o nvel DC de sua sada tambm varia. Porm para o PIC define-se o tempo de pulso, calculado por: tp = CCPRxL:CCPxCON<CCPxX:CCPxY> x Tosc x (Prescale do TMR2). Assim o CCPRxL que armazen os 8 bit mais significativos e o CCPxCON que armazena os dois bits menos significativos, representam os 10 bits que controlam o duty cycle do PWM, assim calculamos o duty cycle atravs da diviso entre o tempo de pulso em nvel alto pelo perodo total do PWM: Tp/T= CCPRxL:CCPxCON<DCxB1:DCxB0> x TOSC x (Prescale do TMR2)/ [(PR2) + 1] x 4 x TOSC x (Prescale do TMR2). Assim: Tp/T= CCPRxL:CCPxCON<DCxB1:DCxB0>/ [(PR2) + 1] X 4.

Percebe-se assim que o duty cycle depende exclusivamente de PR2, CCPRxL e CCPxCON.

PROGRAMA

;************************************** ;* CONFIGURAES PARA GRAVAO ;**************************************

__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC ;************************************** ;* DEFINIO DAS VARIVEIS * ;************************************** ; ESTE BLOCO DE VARIVEIS EST LOCALIZADO LOGO NO INCIO DO BANCO 0 CBLOCK 0X20 ; POSIO INICIAL DA RAM ; FILTRO PARA RUIDOS

BOT_FILT

TEMP_11 ; CONTADORES PARA DELAY TEMP_12 ; CONTADORES PARA DELAY BAND AUX ;VARIAVEL PARA CONVERTER NUMERO E MOSTRAR NO DISPLAY NUMERO ;NUMERO QUE SERA MOSTRADO NO DISPLAY VARI_11 ;PARA IMPRIMIR NO DISPLAY VARI_22 ;PARA IMPRIMIR NO DISPLAY AUX2 FREQPWM ENDC ;************************************** ;* DEFINIO DAS VARIVEIS INTERNAS DO PIC ;************************************** #INCLUDE <P16F877A.INC> UTILIZADO ; *

MICROCONTROLADOR

;************************************** ;* DEFINIO DOS BANCOS DE RAM ;************************************** #DEFINE DA MEMORIA #DEFINE DA MEMORIA BANK1 RAM BANK0 RAM BSF BCF STATUS,RP0 STATUS,RP0

; SELECIONA BANK1 ; SELECIONA BANK0

;************************************** ;* CONSTANTES INTERNAS * ;**************************************

FILTRO_TECLA EQU .200 BOTES

FILTRO

P/

EVITAR

RUIDOS

DOS

;************************************** ; * DECLARAO DOS FLAGs DE SOFTWARE - ENTRADAS * ;************************************** #DEFINE BOT0 PORTB,0 ; ESTADO DO BOTO 0 ; 1 -> LIBERADO ; 0 -> PRESSIONADO ; ESTADO DO BOTO 1 ; 1 -> LIBERADO ; 0 -> PRESSIONADO ; ESTADO DO BOTO 2 ; 1 -> LIBERADO ; 0 -> PRESSIONADO ; ESTADO DO BOTO 3 ; 1 -> LIBERADO ; 0 -> PRESSIONADO ;???

#DEFINE

BOT1

PORTB,1

#DEFINE

BOT2

PORTB,2

#DEFINE

BOT3

PORTB,3

#DEFINE ON_OFF BAND,0 #DEFINE VISOR BAND,1 #DEFINE RENOVAVISOR BAND,2

;************************************** ; * DECLARAO DOS FLAGs DE SOFTWARE * ;************************************** #DEFINE DISPLAY DADOS DO DISPLAY #DEFINE RS UM DADO OU COMANDO PORTD PORTE,0 ;

SADAS

BARRAMENTO

DE

; INDICA P/ O DISPLAY ; 1 -> DADO ; 0 -> COMANDO

#DEFINE DISPLAY DESCIDA

ENABLE

PORTE,1 ;

; SINAL DE ENABLE P/ ATIVO ; NA BORDA P/ DE O

#DEFINE MOTOR VENTILADOR DESLIGADO

PORTC,1

SADA

; 1 -> VENTILADOR LIGADO ; 0 -> VENTILADOR

ORG 0X0000 GOTO CONFIG1

; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES *

;************************************** ;* ROTINA DE DELAY (DE 1MS AT 256MS) ;************************************** DELAY_MS MOVWF MOVLW MOVWF CLRWDT DECFSZ GOTO DECFSZ GOTO RETURN TEMP_11 .250 TEMP_12 TEMP_12,F $-2 TEMP_11,F $-6 ; CARREGA TEMPO1 ; CARREGA TEMPO0

; LIMPA Watchdog timer ; TERMINOU O TEMPO0 ? ; NO - VOLTA 2 INSTRUES ; SIM - PASSOU-SE 1MS ; FIM DE TEMPO1 ? ; NO - VOLTA 6 INSTRUES ; SIM ; RETORNA

;************************************** ; * ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY * ;************************************** ESCREVE MOVWF DISPLAY NOP ESTABILIZAO BSF ENABLE DISPLAY GOTO $+1 BCF ENABLE MOVLW .1 CALL DELAY_MS RETURN ; ATUALIZA DISPLAY (PORTD) ; PERDE 1US PARA ; ENVIA UM PULSO DE ENABLE AO ; VA PARA ( AVANA UMA LINHA ; LIMPA ENABLE ; DELAY DE 1MS ; RETORNA

;************************************** ; * CONFIGURAES INICIAIS DE HARDWARE E SOFTWARE * ;************************************** CONFIG1 CLRF PORTA CLRF PORTB CLRF PORTC CLRF PORTD CLRF PORTE BANK1

; ; ; ; ;

GARANTE GARANTE GARANTE GARANTE GARANTE

A A A A A

SADA SADA SADA SADA SADA

A EM ZERO B EM ZERO C EM ZERO D EM ZERO E EM ZERO

; SELECIONA BANCO 1 DA RAM

MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF DO RB0

B'11111111' TRISA B'11111111' TRISB B'11111101' TRISC B'00000000' TRISD B'00000100' TRISE B'11011111' OPTION_REG

; CONFIGURA I/O DO PORT A ; CONFIGURA I/O DO PORT B ; CONFIGURA I/O DO PORT C ; CONFIGURA I/O DO PORT D ; CONFIGURA I/O DO PORT E ; CONFIGURA OPTIONS ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA ; TIMER0 INCREM. PELO CICLO DE

MQUINA ; WDT - 1:128 ; TIMER - 1:1 MOVLW MOVWF B'00000000' INTCON

; CONFIGURA INTERRUPES ; DESABILITADA TODAS

AS

INTERRUPES MOVLW MOVWF B'00000111' ADCON1 ; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA E PORTE

COMO I/O DIGITAL MOVLW MOVWF .255 PR2 ; ; ; ; CONFIGURA PERODO DO PWM T =((PR2)+1)*4*Tosc*TMR2 Prescale T =((255)+1)*4*250ns*16 T =4,096ms -> 244,14Hz

BANK0 MOVLW MOVWF B'00000111' T2CON

; SELECIONA BANCO 0 DA RAM

; CONFIGURA TMR2 ; TIMER 2 LIGADO ; PRESCALE - 1:16 ; POSTSCALE - 1:1 ;4 - Define o valor do prescaler, bit 1 e 0 do registro T2CON. Se for 00 = prescaler 1, 01 = prescaler 4 e 1x = prescaler 16. ;5 - Habilitar o timer2, setando o bit TMR2ON do registro T2CON; MOVLW B'00001111'

MOVWF CCP2CON ; CONFIGURA CCP2CON PARA PWM (modulo de comparao. O special event triggergerado no modo comparao quando o contedo do registrador ; de contagem do Timer 1 iguala ao contedo do registrador de comparao. ; (PINO RC1) CLRF CCPR2L ; INICIA COM DUTY CYCLE EM ZERO

;************************************** ;* INICIALIZAO DA RAM * ;************************************** MOVLW 0X20 MOVWF FSR ; APONTA O ENDEREAMENTO INDIRETO PARA registro FSR, que especifica o endereo do byte na RAM. LIMPA_RAM CLRF INDF ; LIMPA A POSIO INCF FSR,F ; INCREMENTA O PONTEIRO P/ A PRX. POS. MOVFFSR,W XORLW 0X80 ; COMPARA O PONTEIRO COM A LT. POS. +1 BTFSS STATUS,Z ; J LIMPOU TODAS AS POSIES? GOTO LIMPA_RAM ; NO - LIMPA A PRXIMA POSIO ; SIM ;************************************** ;* CONFIGURAES INICIAIS DO DISPLAY ;************************************** INICIALIZACAO_DISPLAY BCF RS COMANDOS MOVLW 0X30 CALL ESCREVE MOVLW .3 CALL DELAY_MS MOVLW 0X30 CALL ESCREVE MOVLW 0X30 CALL ESCREVE MOVLW B'00111000' CALL ESCREVE MOVLW B'00000001' CALL ESCREVE *

SELECIONA

DISPLAY

P/

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO ; DELAY DE 3MS (EXIGIDO PELO DISPLAY) ; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO ; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO ; ESCREVE COMANDO PARA ; INTERFACE DE 8 VIAS DE DADOS ; ESCREVE COMANDO PARA ; LIMPAR TODO O DISPLAY

10

MOVLW .1 CALL DELAY_MS

; DELAY DE 1MS ; ESCREVE COMANDO PARA ; LIGAR O DISPLAY SEM CURSOR ; ESCREVE COMANDO PARA

MOVLW B'00001100' CALL ESCREVE MOVLW B'00000110' INCREM. CALL ESCREVE

; AUTOMTICO DIREITA

;************************************** ;* VARREDURA DOS BOTES * ;************************************** MOVLW .0 MOVWF NUMERO CALL PRIMEIRO_VISOR MOVLW 'O' CALL ESCREVE MOVLW 'F' CALL ESCREVE MOVLW 'F' CALL ESCREVE BSF RENOVAVISOR VARRE CLRWDT ; LIMPA WATCHDOG TIMER ALGUM BOTO PRESSIONADO

; **************** VERIFICA ************************* VARRE_BOTOES BTFSS BOT0 PRESSIONADO ? GOTO TRATA_BOTAO_0 BTFSS BOT1 PRESSIONADO ? GOTO TRATA_BOTAO_1 BTFSS BOT2 PRESSIONADO ? GOTO TRATA_BOTAO_2 BTFSS BOT3 PRESSIONADO ? GOTO TRATA_BOTAO_3 BTFSS RENOVAVISOR CALL ATUALIZA_DISPLAY

BOTO

ESTA

; SIM - PULA P/ TRATA_BOTAO_0 ; NO, VERIFICA BOTAO 1 ; O BOTO 1 ESTA

; SIM - PULA P/ TRATA_BOTAO_1 ; NO, VERIFICA BOTAO 2 ; O BOTO 2 ESTA

; SIM - PULA P/ TRATA_BOTAO_2 ; NO, VERIFICA BOTAO 3 ; O BOTO 3 ESTA

; SIM - PULA P/ TRATA_BOTAO_3 ; NO, SEGUE A ROTINA

11

; *************************** *********************** MOVLW FILTRO_TECLA FILTRO_TECLA MOVWF BOT_FILT EVITAR RUIDOS NOS BOTES GOTO TECLADO VARRE

FILTRO ;

P/

EVITAR O

RUIDOS DE P/

CARREGA

VALOR

; SALVA EM FILTRO_BOTOES ; RECARREGA FILTRO ; VOLTA PARA

VARRER

ATUALIZA_DISPLAY BCF RS ; SELECIONA O DISPLAY P/ COMANDOS;(PORTE 0)INDICA P/ O DISPLAY UM DADO OU COMANDO ; 1 -> DADO ; 0 -> COMANDO MOVLW 0XC7 ; COMANDO PARA POSICIONAR O CURSOR CALL ESCREVE ; LINHA 2 / COLUNA 09 BSF RS ; SELECIONA O DISPLAY P/ DADOS MOVFNUMERO,W ; INICIALEMNTE, NUMERO ZERO(EM VARREDURA DE BOTOES) E .0 EH ADD EM W BTFSC STATUS,Z ; VERIFICA SE MESMO ZERO E ESCREVE NO DISPLAY, CASO CONTRARIO, PULA GOTO ESCREVE_ZERO MOVLW .156 ADDWF BTFSS GOTO NUMERO,W STATUS,C MORNE ;

MOVLW '1' CALL ESCREVE MOVLW '0' CALL ESCREVE MOVLW '0' CALL ESCREVE MOVLW '%' CALL ESCREVE BSF VISOR RETURN ESCREVE_ZERO MOVLW '0' CALL ESCREVE MOVLW '0' CALL ESCREVE MOVLW '%'

12

CALL ESCREVE BSF VISOR RETURN MORNE BTFSC VISOR ;COMO INCIIALMENTE VISOR UM, VAI PARA PRIMEIRO VISOR E ESCREVE ''VENTILADOR PWM:`` CALL PRIMEIRO_VISOR MOVF NUMERO,W ;QUANDO VISOR FOR ZERO, ELE MOVE O VALOR DE NUMERO PRA W, CONVERTE E ESCREVE NO DISPLAY CALL CONVERTENDO MOVF VARI_11,W ;APS DEFINIDO, MOVE ESSE VALOR PARA W E ESCREVE NO DISPLAY A DEZENA E UNIDADE CALL CONVEVISOR CALL ESCREVE MOVF VARI_22,W CALL CONVEVISOR CALL ESCREVE MOVLW '%' CALL ESCREVE RETURN CONVERTENDO MOVWF AUX CLRF VARI_11 CLRF VARI_22 INCF VARI_22,F ; EM W TM NUMERO, Q MOVIDO PARA AUX ; LIMPA DEZ ; LIMPA UNID ;INCREMENTA UNID(5, NO CASO)

MOVF VARI_22,W ;MOVE ESSE VALOR PRA W E COMPARA COM ZERO XORLW 0X0A BTFSS STATUS,Z ;SE O RESULTADO FOR ZERO, ELE LIMPA A UNIDADE E INCREMENTA A DEZENA. GOTO $+3 ;SE FOR 1, INCREMENTA UNIDADE. CLRF VARI_22 INCF VARI_11,F DECFSZ AUX,F GOTO $-8 RETURN CONVEVISOR ANDLW B'00001111' ADDWF PCL,F RETLW '0' RETLW '1' RETLW '2'

13

RETLW '3' RETLW '4' RETLW '5' RETLW '6' RETLW '7' RETLW '8' RETLW '9' RETLW 'E' RETLW 'E' RETLW 'E' RETLW 'E' RETLW 'E' RETLW 'E' ;************************************** ;* TRATAMENTO DOS BOTES * ;************************************** TRATA_BOTAO_0 MOVFBOT_FILT,F BTFSC STATUS,Z GOTO TECLADO DECFSZ GOTO VARRE BOT_FILT,F VARRE

; FILTRO J IGUAL A ZERO ? ; (FUNO JA FOI EXECUTADA?) ; SIM - VOLTA P/ VARREDURA DO ; NO ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

BTFSS GOTO GOTO

ON_OFF ROTINON ROTINOFF

ROTINOFF MOVFCCPR2L,W ;INICIALMENTE ZERO, MAS ADD ESSE VALOR EM W MOVWF FREQPWM ;MOVE O VALOR DO COMPARADOR PARA FREQ. 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*TMR2 Prescale ; Tp = 0 * 250ns * 16 ; Tp = 0 ; PWM -> DUTY CYCLE = 0% -> OFF BCF ON_OFF CALL PRIMEIRO_VISOR MOVLW 'O' CALL ESCREVE

14

MOVLW 'F' CALL ESCREVE MOVLW 'F' CALL ESCREVE BSF VISOR BSF RENOVAVISOR GOTO VARRE ROTINON ; MOVLW 0X00C ; MOVWF CCPR2L BCF CCP2CON,5 BCF CCP2CON,4

; CARREGA CCPR2L COM 0X80 ; LIMPA OS BITS 5 e 4 ; LSB DO DUTY CYCLE ; Tp = CCPR2L:CCP2CON<5,4>*Tosc*TMR2 Prescale ; Tp = 512 * 250ns * 16 ; Tp = 2,048ms ; PWM -> DUTY CYCLE = 50% MOVF FREQPWM,W MOVWF CCPR2L CALL PRIMEIRO_VISOR MOVLW 'O' CALL ESCREVE MOVLW 'N' CALL ESCREVE MOVLW .255 CALL DELAY_MS BCF RENOVAVISOR BSF ON_OFF GOTO BOTES VARRE ; VOLTA P/ VARREDURA DOS

TRATA_BOTAO_2 MOVFBOT_FILT,F BTFSC STATUS,Z GOTO TECLADO DECFSZ GOTO BTFSS GOTO BCF BCF Prescale VARRE BOT_FILT,F VARRE ON_OFF VARRE

; FILTRO J IGUAL A ZERO ? ; (FUNO JA FOI EXECUTADA?) ; SIM - VOLTA P/ VARREDURA DO ; NO ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

CCP2CON,5 CCP2CON,4 ;

; LIMPA OS BITS 5 e 4 ; LSB DO DUTY CYCLE Tp = CCPR2L:CCP2CON<5,4>*Tosc*TMR2

; Tp = 512 * 250ns * 16 ; Tp = 2,048ms ; PWM -> DUTY CYCLE = 50%

15

MOVLW .16 ADDWF CCPR2L,W BTFSS STATUS,C GOTO SIRNE GOTO VARRE SIRNE MOVLW 0X0C ADDWF CCPR2L,F MOVLW .5 ADDWF NUMERO GOTO BOTES VARRE ; VOLTA P/ VARREDURA DO BOTO DOS 2

; ************************* *************************** TRATA_BOTAO_1 MOVFBOT_FILT,F BTFSC STATUS,Z GOTO TECLADO DECFSZ GOTO BTFSS GOTO BCF BCF VARRE BOT_FILT,F VARRE ON_OFF VARRE CCP2CON,5 CCP2CON,4

TRATAMENTO

; FILTRO J IGUAL A ZERO ? ; (FUNO JA FOI EXECUTADA?) ; SIM - VOLTA P/ VARREDURA DO ; NO ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; VERIFICA SE T ON OU OFF ; LIMPA OS BITS 5 e 4 ; LSB DO DUTY CYCLE

MOVF BTFSC GOTO

CCPR2L,W STATUS,Z VARRE

MOVLW .6 MOVWF AUX ROTIN3 DECFSZ GOTO GOTO ROTIN4 AUX ROTIN4 ROTINCONT

16

DECF GOTO ROTINCONT MOVLW MOVWF ROTIN1 DECFSZ GOTO GOTO

NUMERO,F ROTIN3 0X0D AUX AUX ROTIN2 VARRE

ROTIN2 DECF CCPR2L,F GOTO ROTIN1

GOTO BOTES

VARRE

VOLTA

P/

VARREDURA DO BOTO

DOS 3

; ************************* *************************** TRATA_BOTAO_3 MOVF CCPR2L,W MOVWF FREQPWM MOVLW .255 MOVWF CCPR2L MOVLW .255 CALL DELAY_MS MOVF FREQPWM,W MOVWF CCPR2L

TRATAMENTO

GOTO BOTES

VARRE

VOLTA

P/

VARREDURA

DOS

;************************************** ;* ROTINA DE ESCRITA DA TELA PRINCIPAL ;************************************** PRIMEIRO_VISOR BCF VISOR BCF RS COMANDOS MOVLW 0X01 CALL ESCREVE MOVLW .1

; SELECIONA O DISPLAY P/ ; COMANDO P/ LIMPAR A TELA

17

CALL DELAY_MS MOVLW 0X81 CURSOR CALL ESCREVE BSF RS DADOS ESCREVER AS

; DELAY DE 1MS ; COMANDO PARA POSICIONAR O ; LINHA 0 / COLUNA 1 ; SELECIONA O DISPLAY P/ ; ; COMANDOS LETRAS DE PARA "CURSO

MODULO 2" MOVLW 'V' CALL ESCREVE MOVLW 'e' CALL ESCREVE MOVLW 'n' CALL ESCREVE MOVLW 't' CALL ESCREVE MOVLW 'i' CALL ESCREVE MOVLW 'l' CALL ESCREVE MOVLW 'a' CALL ESCREVE MOVLW 'd' CALL ESCREVE MOVLW 'o' CALL ESCREVE MOVLW 'r' CALL ESCREVE BCF RS COMANDOS MOVLW 0XC3 CURSOR CALL ESCREVE BSF RS DADOS MOVLW 'P' ASLETRAS DE " PWM: OFF CALL ESCREVE MOVLW 'W' CALL ESCREVE MOVLW 'M' CALL ESCREVE MOVLW ':' CALL ESCREVE RETURN

; ;

SELECIONA PARA

DISPLAY

P/ O P/

COMANDO

POSICIONAR DISPLAY

; LINHA 1 / COLUNA 3 ; SELECIONA O

; "

COMANDOS

PARA

ESCREVER

;************************************** ;* FIM DO PROGRAMA *

18

;************************************** END ; FIM DO PROGRAMA

Referncias

Zanco, Wagner da Silva. Microcontroladores PIC- uma abordagem pratica e objetva. Editora rica, 1 ed., So Paulo SP 2005 p.365. IMINIPA Sistemas de Treinamento em Microcontroladores PIC