Anda di halaman 1dari 5

list p= 12f1822

#include "p12f1822.inc"
__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF
& _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_LO & _LVP_OFF

CBLOCK 0X20
M1A
M1B
M2A
M2B
M3A
M3B
S3
DUTY_1
DUTY_2
ENDC
;inicializamos el registro de origen
ORG 0

; SELECIONADO LA FOSC A 8 MHZ


BANKSEL OSCCON
MOVLW 0X70
MOVWF OSCCON

; CLEAR PORTA & LATCHA


BANKSEL PORTA
CLRF PORTA
BANKSEL LATA
CLRF LATA

; AN4, PIN-3 IS ANALOG INPUTS, ALL OTHER PINS ARE DIGITAL I/O
BANKSEL ANSELA
CLRF ANSELA ; ANSELA = 00
BSF ANSELA,ANSA4 ; PIN_3 AN3 IS ANALOG INPUT V_POT

BANKSEL TRISA
MOVLW B'00111010'
MOVWF TRISA

;ENABLE INTERNAL PUL_UP FOR RA5 PIN_5 TO READ SWITH


BANKSEL WPUA
CLRF WPUA ; NO PULL UPP
BSF WPUA,WPUA5 ; SET PULL_UP FOR RA4-PIN2
BANKSEL OPTION_REG ; ENBLE PULL-UPS
BCF OPTION_REG,NOT_WPUEN

; INIT A/D TO WORK WITH INTERNAL CLOCK


BANKSEL ADCON1
MOVLW B'10010000' ; AD RIGHT JUSTIFIED, VREF = VDD COV_CLK 1uS.
MOVWF ADCON1
MOVLW B'00001101' ; AD ON AND SELECT CHANEEL AN3
MOVWF ADCON0

; PWM INIT Fw = 20kHz DUTY {0 400}


BANKSEL PR2
MOVLW .99 ; Fw = 20 KHz
MOVWF PR2
BANKSEL CCP1CON
MOVLW B'00001100' ; SET PWM WHIT P1 OUT
MOVWF CCP1CON
MOVLW B'00000010' ; SET DUTY TO .200 1100 1000 C8h > 50%
MOVWF CCPR1L

;INIT UART A 9600 8BIT 1 STOP


BANKSEL SPBRGH ; SELECT BANK3 FOR THE UART REG.
CLRF SPBRGH ; 9600 BAUD, SYNC =0 BRGH = 0 BRG16=0 RST VALUES
MOVLW .12 ; BR = FOSC7[64(N+1)] n = 12 DECIMAL
MOVWF SPBRGL
BSF RCSTA,SPEN ; ENABLE SERIAL PORT
BSF TXSTA,TXEN ; ENABLE TX PART
BSF RCSTA,CREN ; ENABLE RX PART

BANKSEL T2CON
BSF T2CON,TMR2ON ; HABILITAMOS timer 2

BANKSEL 0
CLRF M1A
CLRF M1B
CLRF M2A
CLRF M2B
CLRF M3A
CLRF M3B
CLRF S3
BCF STATUS,C
;-----------------------------------------------------------------------
REPETIR
CALL ADC_LECTURA
CALL ADC_MULT
CALL PWM_OUT

MOVLW 'N'
CALL TX_ENVIAR
MOVLW '='
CALL TX_ENVIAR
MOVF DUTY_2
CALL TX_ENVIAR

CALL TX_SALTO_LINEA

GOTO REPETIR

ADC_LECTURA ; BUCLE PRINCIPAL DE LA LECTURA DEL ADC


READ_AD
BANKSEL ADCON0
BSF ADCON0,GO ;INICIAMOS ADC
NOP
NOP
AD_WAIT BTFSC ADCON0,GO ;TIEMPO DE ESPERA PARA LA CONVERSION
GOTO AD_WAIT

RETURN

ADC_MULT ; ACONDICIONA Y MULTIPLICA ADC OUT(0 - 400)


;DEL REGISTRO DEL ADC MOVEMOS A LA MEMORIA A GUARDAR
BANKSEL ADRESL
MOVF ADRESL,0
;MOVLW B'00011111'
BANKSEL 0
MOVWF M3A ;CARGAMOS EL REGISTRO COMPLETO
BANKSEL ADRESH
MOVF ADRESH,0
;MOVLW B'00000011'
BANKSEL 0
MOVWF M3B
MOVLW B'00000011' ;PARA PASAR SOLO LOS DOS PRIMEROS BITS AND
ANDWF M3B,1 ; ASTA AQUI GRABAMOS EL VALOR DEL ADC EN CADA BYTE
;HACEMOS SHIF (2) A LA IZQUIERDA LOS 2 BYTES M3 EN ORDEN
BCF STATUS,C
RLF M3A,1 ;SHIF IZQUIERDA Y GUARDAMOS EN M3A
RLF M3B,1 ;SHIF OTRO BYTE Y LO COMPLEMENTAMOS CON EL
BCF STATUS,C
RLF M3A,1
RLF M3B,1
;COPIAMOS M3 A LOS DEMAS REGISTROS
MOVF M3A,0
MOVWF M2A
MOVWF M1A
MOVF M3B,0 ;CARGAMOS AL OTRO DIGITO
MOVWF M2B
MOVWF M1B
;HACEMOS M1 SHIF (4) A LA IZQUIERDA
BCF STATUS,C
RLF M1A,1 ;SHIF IZQUIERDA Y GUARDAMOS EN M1A
RLF M1B,1
BCF STATUS,C
RLF M1A,1
RLF M1B,1
BCF STATUS,C
RLF M1A,1
RLF M1B,1
BCF STATUS,C
RLF M1A,1
RLF M1B,1
;HACEMOS M2 SHIF (3) A LA IZQUIERDA
BCF STATUS,C
RLF M2A,1
RLF M2B,1
BCF STATUS,C
RLF M2A,1
RLF M2B,1
BCF STATUS,C
RLF M2A,1
RLF M2B,1
;TERMINAMOS EL SHIF AHORA SOLO TENEMOS QUE SUMAR M1 + M2 + M3
MOVF M2A,0
ADDWF M3A,1 ;SUMAMOS LOS 2 PRIMEROS Y LO GUARDAMOS EN M3A

MOVF M2B,0
ADDWFC M3B,1 ;RESULTADO EN M3B

MOVLW .0
ADDWFC S3,1 ;AQUI SUMAMOS EL ULTIMO DIGITO CON EL CARRIE
;AHORA SUMAMOS EL RESULTADO CON EL M1
BCF STATUS,C
MOVF M1A,0
ADDWF M3A,1 ;RESULTADO FINAL DEL PRIMER BYTE (SE DESCARTA)

MOVF M1B,0
ADDWFC M3B,1 ;RESULTADO FINAL SEGUNDO BYTE EN M3B

MOVLW .0
ADDWFC S3,1 ;RESULTADO FINAL TERCER BYTE S3
;RESULTADO ES( S3(2BITS) M3B(8BITS)) = (MSB LSB)
RETURN

PWM_OUT
BANKSEL 0
MOVF M3B,0 ;LLEVO EL PRIMER BYTE AL ACUMULADOR
MOVWF DUTY_2 ; asignamos el ancho depulso

BCF STATUS,C ;AQUI CORREMOS(2) DERECHA Y S3 PASA A CCPR1L POR EL CARRIE


RRF S3,1
RRF DUTY_2,1

BCF STATUS,C
RRF S3,1
RRF DUTY_2,1
BCF STATUS,C
;PASAMOS LOS LSB DE M3B A EL REG CCP1CON
BANKSEL 0
BTFSS M3B,0
GOTO NEX1
BANKSEL CCP1CON
BSF CCP1CON,4
GOTO NEX2
NEX1
BANKSEL CCP1CON
BCF CCP1CON,4
NEX2 ;PASAMOS EL OTRO BIT AL REGISTRO MENOS SIGNIFICATIVO
BANKSEL 0
BTFSS M3B,1
GOTO NEX11
BANKSEL CCP1CON
BSF CCP1CON,5
GOTO NEX22
NEX11
BANKSEL CCP1CON
BCF CCP1CON,5
NEX22
;TERMINAMOS DE COLOCAR TODO EL REGISTRO DUTY
;HABILITAMOS LA BANDERA DE ENVIO
BANKSEL 0
MOVF DUTY_2,0
BANKSEL CCPR1L
MOVWF CCPR1L ;CARGO DUTY MAS SIGNIFICATIVO
RETURN

TX_ENVIAR ;SUBRUTINA ENVIAR BYTE


BANKSEL TXSTA
BTFSS TXSTA,TRMT ;bit test high
GOTO $-1
MOVWF TXREG
BANKSEL PORTA
RETURN ;RETORNA DE LA SUBRRUTINA
TX_SALTO_LINEA
MOVLW .13
BANKSEL TXSTA
BTFSS TXSTA,TRMT ;bit test high
GOTO $-1
MOVWF TXREG
BANKSEL PORTA
RETURN

TX_HEXADECIMAL

RETURN

END