EJEMPLOS DE USO DE MODULOS ADC, UART, PWM, Y PUERTOS DE UN PIC 16F876A
CONVERSION AD DE 10 BITS, ENVIO DE ADRESH Y ADRESL HACIA LOS PUERTOS B Y C
;CONVERSIÓN ANALÓGICA DIGITAL DE 10 BITS
;PARA SIMULAR EN PROTEUS CARGAR EL ARCHIVO .COF O EXPORTAR EL ARCHIVO .HEX
;===================================
list p=16f876A
;================================
PORTA EQU 0x05
PORTB EQU 0x06
PORTC EQU 0x07
TRISA EQU H'85'
TRISB EQU H'86'
TRISC EQU H'87'
RP0 EQU H'05'
RP1 EQU H'06'
STATUS EQU H'03'
ADCON0 EQU H'1F'
ADCON1 EQU H'9F'
PIR1 EQU H'0C'
INTCON EQU H'0B'
PIE1 EQU H'8C'
ADRESH EQU H'1E'
ADRESL EQU H'9E'
OPTION_REG EQU H'81'
GRU EQU 0x05
MED EQU 0x10
FIN EQU 0x20
REG1 EQU H'22'
REG2 EQU H'23'
REG3 EQU H'24'
;=================================
reset
org 0
CLRF STATUS ;BORRA EL REGISTRO STATUS
BSF STATUS,RP0 ;BANK1
BCF STATUS,RP1
MOVLW B'00111111' ;PUERTO A COMO ENTRADA
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB ;PUERTO B TODO SALIDAS
MOVLW B'00000000'
MOVWF TRISC ;PUERTO C TODO SALIDAS
;============ CONFIGURA ENTRADAS ANALOGICAS ==============
INICIO
BSF STATUS,RP0
;BCF STATUS,RP1 ;BANK1
MOVLW B'10000000' ;TODAS LAS ENTRADAS SERAN ANALOGICAS
MOVWF ADCON1 ;JUSTIFICACION A LA DERECHA
;============== PREPARA CONVERSION A/D ==========================
BCF STATUS,RP0
BCF STATUS,RP1 ;BANK0
MOVLW B'00000001' ;FOSCI/2..CANAL 0..A/D OPERANDO
MOVWF ADCON0 ;se transfiere desde W hacia ADCON0
BCF PIR1,6 ;BORRA ADIF DEL REGISTRO PIR1
;===== FIN DE LA CONFIGURACION DEL A/D ===============
BSF STATUS,RP0
BCF STATUS,RP1 ;BANK1
BSF INTCON,7
BSF PIE1,6 ;COLOCA 1 EN ADIE Y GIE
BCF STATUS,RP0
;BCF STATUS,RP1 ;BANK 0
BSF ADCON0,2 ;INICIA LA CONVERSION
ESPER1 BTFSS PIR1,6 ;ESPERA FIN DE CONVERSION
GOTO ESPER1
;******************** FIN DE LA CONVERSION A/D *********
BCF PIR1,6 ;BORRA ADIF
;LOS REGISTROS ADRESH Y ADRESL CONTIENEN EL DATO CONVERTIDO EN 10 BITS ========
MOVF ADRESH,W
MOVWF PORTC ;COPIA BYTE ALTO EN PUERTOC
BSF STATUS,RP0
;BCF STATUS,RP1 ;BANK 1
MOVF ADRESL,W
BCF STATUS,RP0
;BCF STATUS,RP1 ;BANK 0
MOVWF PORTB ;COPIA BYTE BAJO EN PUERTOB
CALL TEMPORIZADOR
GOTO INICIO
TEMPORIZADOR
MOVLW GRU ;GRU,REG,ETC ESTAN EN BANK0
MOVWF REG1
DEM3
MOVLW MED
MOVWF REG2
DEM2
MOVLW FIN
MOVWF REG3
DEM1
DECFSZ REG3
GOTO DEM1
DECFSZ REG2
GOTO DEM2
DECFSZ REG1
GOTO DEM3
RETLW 0
END
CONVERSION AD Y TRANSMISION SERIAL
;Este programa solo digitaliza un dato y lo transfiere por el puerto serie
;La comunicación se ejecuta a 19200 baudios con reloj de 4 MHZ
;===================================
list p=16f876A
;================================
PORTA EQU 0x05
PORTB EQU 0x06
TRISA EQU H'85'
TRISB EQU H'86'
TRISC EQU H'87'
RP0 EQU H'05'
RP1 EQU H'06'
STATUS EQU H'03'
DATO EQU H'21'
ADCON0 EQU H'1F'
ADCON1 EQU H'9F'
PIR1 EQU H'0C'
INTCON EQU H'0B'
PIE1 EQU H'8C'
ADRESH EQU H'1E'
ADRESL EQU H'9E'
SPBRG EQU H'99'
TXSTA EQU H'98'
RCSTA EQU H'18'
TXREG EQU H'19'
RCREG EQU H'1A'
OPTION_REG EQU H'81'
IRP EQU H'07'
VAR1 EQU H'20'
VAR2 EQU H'A0'
VAR3 EQU H'110'
VAR4 EQU H'190'
INDF EQU H'0'
FSR EQU H'04'
LECTURA1 EQU D'40' ;CADA LECTURA GENERARA DOS DATOS
LAZOS1 EQU H'7F'
LECTURA2 EQU D'40'
LAZOS2 EQU H'7E'
LECTURA3 EQU D'48'
LAZOS3 EQU H'7D'
LECTURA4 EQU D'48'
LAZOS4 EQU H'7C'
GRU EQU 0x15
MED EQU 0x20
FIN EQU 0x20
REG1 EQU H'22'
REG2 EQU H'23'
REG3 EQU H'24'
;=================================
reset
org 0
CLRF STATUS ;BORRA EL REGISTRO STATUS
BSF STATUS,RP0 ;BANK1
BCF STATUS,RP1
MOVLW B'00111111' ;PUERTO A COMO ENTRADA
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB ;PUERTO B TODO SALIDAS
MOVLW B'10001111'
MOVWF TRISC ;PUERTO C,PIN TX ES SALIDA PIN RX ES ENTRADA
BCF OPTION_REG,7 ;HABILITA PULLUPS
;**************** PRUEBA DEL PUERTO B ********
BCF STATUS,RP0
BCF STATUS,RP1
MOVLW B'01010101'
MOVWF PORTB
CALL DEMORA
MOVLW B'10101010'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
;============ CONFIGURA ENTRADAS ANALOGICAS ==============
INICIO
BSF STATUS,RP0
;BCF STATUS,RP1 ;BANK1
MOVLW B'10000000' ;TODAS LAS ENTRADAS SERAN ANALOGICAS
MOVWF ADCON1
;============= CONFIGURA EL PUERTO SERIE ================
BSF STATUS,RP0
BCF STATUS,RP1 ;BANK1
MOVLW .12
MOVWF SPBRG ;19200 BAUDIOS, 4 MHZ
MOVLW B'10100100' ;8 BITS, ASYNC,ALTA VELOCIDAD
MOVWF TXSTA
BCF STATUS,RP0
BCF STATUS,RP1 ;BANK0
MOVLW B'10010000' ;RECEPCION 8 BITS, RECPCION HABILITADA
MOVWF RCSTA
;======= RECEPCION SERIAL ==========================
BSF RCSTA,4 ;HABILITA RECEPCION SETEANDO BIT CREN
LLENAS
BTFSS PIR1,5 ;PRUEBA EL BIT RCIF=1 DE RECEPCION COMPLETA
GOTO LLENAS ;PERMANECE EN EL LAZO HASTA QUE INGRESE EL DATO
MOVF RCREG,W ;SE TRANSFIERE EL DATO RECIBIDO HACIA EL W
MOVWF PORTB ;SEGUIMOS EN EL BANK0
;**** realiza la conversión A/D solo luego de ingresar un dato****
;============== PREPARA CONVERSION A/D ==========================
;============== selección de canal analógico usando RCREG ==========
BCF STATUS,RP0
BCF STATUS,RP1 ;BANK0;FOSCI/8..CANAL según RCREG..A/D OPERANDO
MOVWF ADCON0 ;se transfiere desde W hacia ADCON0
;valores permitidos son 65 73 81 89 97 105 113 121
BCF PIR1,6 ;BORRA ADIF DEL REGISTRO PIR1
;===== FIN DE LA CONFIGURACION DEL A/D ===============
BSF STATUS,RP0
;BCF STATUS,RP1 ;BANK1
BSF INTCON,7
BSF PIE1,6 ;COLOCA 1 EN ADIE Y GIE
BCF STATUS,RP0
;BCF STATUS,RP1 ;BANK 0
BSF ADCON0,2 ;INICIA LA CONVERSION
ESPER1
BTFSS PIR1,6 ;ESPERA FIN DE CONVERSION
GOTO ESPER1
;******************** FIN DE LA CONVERSION A/D *********
BCF PIR1,6 ;BORRA ADIF
;===================== TRANSMISION SERIAL ===============================
BSF STATUS,RP0
BCF STATUS,RP1
MOVF ADRESL,W ;CARGARA UN BYTE BAJO
BCF STATUS,RP0
;BCF STATUS,RP1 ;BANK0
MOVWF TXREG ;TRANSMITE BYTE BAJO
BSF STATUS,RP0
;BCF STATUS,RP1 ;BANK1
ESPE1
BTFSS TXSTA,1 ;PRUEBA TRMT,SI BUFFER ESTA VACIO
GOTO ESPE1
BCF STATUS,RP0
BCF STATUS,RP1 ;BANK0
MOVF ADRESH,W ;SE TRANSMITIRA EL BYTE ALTO
MOVWF TXREG
BSF STATUS,RP0
;BCF STATUS,RP1 ;BANK1
ESPE11
BTFSS TXSTA,1
GOTO ESPE11
BCF TXSTA,1
;=========== FIN DE TRANSMISION DE LOS DOS BYTES ===============
GOTO INICIO
DEMORA
MOVLW GRU ;GRU,REG,ETC ESTAN EN BANK0
MOVWF REG1
DEM3
MOVLW MED
MOVWF REG2
DEM2
MOVLW FIN
MOVWF REG3
DEM1
DECFSZ REG3
GOTO DEM1
DECFSZ REG2
GOTO DEM2
DECFSZ REG1
GOTO DEM3
RETLW 0
END
CONVERSION AD, COMUNICACIÓN SERIAL, SALIDA DAC, Y SALIDA DE ONDA PWM
;PROGRAMA PARA INTERFACE ADC , DAC Y SALIDA PWM
;SE PODRA DIGITALIZAR UN DATO ANALOGICO Y ENVIARLO A LA PC
;SE RECIBIRA UN DATO DE 8 BITS DESDE LA PC Y SE LO PRESENTARA EN EL PUERTOB
;SE DIGITALIZA UN DATO Y SE LOS TRANSFIERE POR EL PUERTO SERIE
;LA COMUNICACION SE EJECUTA A 19200 BAUDIOS CON RELOJ DE 4 MHZ
;SE COLOCA UN DUTY CYCLE FIJO INICIAL DE 70% Y PERIODO DE 4,2 MSEG
;LUEGO SE ACTUALIZA DE ACUERDO A LO QUE SE RECIBE DESDE EL VISUAL BASIC
;===================================
list p=16f876A
;================================
PORTA EQU 0x05
PORTB EQU 0x06
TRISA EQU H'85'
TRISB EQU H'86'
TRISC EQU H'87'
RP0 EQU H'05'
RP1 EQU H'06'
STATUS EQU H'03'
DATO EQU H'21'
ADCON0 EQU H'1F'
ADCON1 EQU H'9F'
PIR1 EQU H'0C'
INTCON EQU H'0B'
PIE1 EQU H'8C'
PIE2 EQU H'8D'
ADRESH EQU H'1E'
ADRESL EQU H'9E'
SPBRG EQU H'99'
TXSTA EQU H'98'
RCSTA EQU H'18'
TXREG EQU H'19'
RCREG EQU H'1A'
OPTION_REG EQU H'81'
IRP EQU H'07'
TMR0 EQU 0X01
TMR2 EQU 0X11
T1CON EQU 0X10
T2CON EQU 0X12
PR2 EQU 0X92
CCPR1L EQU 0X15
CCPR1H EQU 0X16
CCP1CON EQU 0X17
VAR1 EQU H'20'
VAR2 EQU H'A0'
VAR3 EQU H'110'
VAR4 EQU H'190'
INDF EQU H'0'
FSR EQU H'04'
PS0 EQU 0X00
PS1 EQU 0X01
Z EQU 0X02
PS2 EQU 0X02
TOIF EQU 0X02
PSA EQU 0X03
TOIE EQU 0X05
TOCS EQU 0X05
PEIE EQU 0X06
GIE EQU 0X07
TMR2IF EQU 0X01
TMR2IE EQU 0X01
TMR2ON EQU 0X02
LECTURA1 EQU D'40' ;CADA LECTURA GENERARA DOS DATOS
LAZOS1 EQU H'7F'
LECTURA2 EQU D'40'
LAZOS2 EQU H'7E'
LECTURA3 EQU D'48'
LAZOS3 EQU H'7D'
LECTURA4 EQU D'48'
LAZOS4 EQU H'7C'
GRU EQU 0x15
MED EQU 0x20
FIN EQU 0x20
REG1 EQU H'22'
REG2 EQU H'23'
REG3 EQU H'24'
;=================================
reset
org 0
CLRF STATUS ;BORRA EL REGISTRO STATUS
BSF STATUS,RP0 ;BANK1
BCF STATUS,RP1
MOVLW B'00111111' ;PUERTO A COMO ENTRADA
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB ;PUERTO B TODO SALIDAS
MOVLW B'10000000'
MOVWF TRISC ;PUERTO C,PIN TX ES SALIDA PIN RX ES ENTRADA
;EL PIN RC2 ES LA SALIDA PWM DEL CCP1
;**************** PRUEBA DEL PUERTO B ********
BCF STATUS,RP0
BCF STATUS,RP1
MOVLW B'00000000'
MOVWF PORTB
CALL DEMORA
CLRF PORTB ;SE BORRA EL PUERTO B
;.......... inicializa TMR2 ..............
BCF STATUS,RP0 ;BANK0
BCF STATUS,RP1
CLRF T2CON ;BORRA REGISTROS ASOCIADOS A TMR2
CLRF TMR2
CLRF INTCON
BSF STATUS,RP0
BCF STATUS,RP1
CLRF PIE1
BCF STATUS,RP0 ;BANK0
BCF STATUS,RP1
MOVLW B'00000011' ;POSTSCALER 1/1 PRESCALER 16 Y timer2 apagado
MOVWF T2CON
;...inicializa PWM ..................................
CLRF CCP1CON ;MODULO CCP APAGADO
CLRF TMR2 ;TIMER2 BORRADO
BSF STATUS,RP0 ;BANK1
BCF STATUS,RP1
MOVLW B'11111111' ;CARGARÁ 255d EN W Y EN PR2
MOVWF PR2
BCF STATUS,RP0 ;BANK0
BCF STATUS,RP1
MOVLW B'10110011' ;CARGARÁ 179d EN CCPR1L
MOVWF CCPR1L ; DUTY CYCLE SERÁ DEL 70%
BSF STATUS,RP0 ;BANK1
BCF STATUS,RP1
CLRF INTCON
CLRF PIE1 ;deshabilita interrupción de periféricos
BCF STATUS,RP0 ;BANK0
BCF STATUS,RP1
CLRF PIR1 ;BORRA BANDERAS DE INTERRUPCIÓN DE PERIFERICOS
MOVLW B'00011100' ;CARGARÁ 00 01 1100
MOVWF CCP1CON ;CONFIGURA COMO MODO PWM, LOS DOS LSbs DE DUTY CYCLE SON 0 Y 1
;-------EL DUTY CYCLE ES 10110011 01 = 717 DECIMAL ----------------------
BSF T2CON,TMR2ON ;ENCIENDE EL TIMER2 Y SE INCREMENTARÁ
INICIO
;============ CONFIGURA ENTRADAS ANALOGICAS ==============
BSF STATUS,RP0
BCF STATUS,RP1 ;BANK1
MOVLW B'10000000' ;TODAS LAS ENTRADAS SERAN ANALOGICAS
MOVWF ADCON1
;============= CONFIGURA EL PUERTO SERIE ================
BSF STATUS,RP0
BCF STATUS,RP1 ;BANK1
MOVLW .12
MOVWF SPBRG ;19200 BAUDIOS, 4 MHZ
MOVLW B'10100100' ;8 BITS, ASYNC,ALTA VELOCIDAD
MOVWF TXSTA
BCF STATUS,RP0
BCF STATUS,RP1 ;BANK0
MOVLW B'10010000' ;RECEPCION 8 BITS HABILITADA
MOVWF RCSTA
;======= RECEPCION SERIAL ==========================
; SE RECIBIRAN DOS DATOS, EL PRIMERO SERA EL DATO DE 8 BITS, EL SEGUNDO SERA EL DATO DE CONFIGURACION
PARA EL ADC
; RECEPCION DE UN DATO DE 8 BITS
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
BSF RCSTA,4 ;HABILITA RECEPCION SETEANDO BIT CREN
LLENAS
BTFSS PIR1,5 ;PRUEBA EL BIT RCIF=1 DE RECEPCION COMPLETA
GOTO LLENAS ;PERMANECE EN EL LAZO HASTA QUE INGRESE EL DATO
MOVF RCREG,W ;SE TRANSFIERE EL DATO RECIBIDO HACIA EL W
MOVWF PORTB ;ENVIA EL DATO HACIA EL PUERTO B
MOVWF CCPR1L ;TAMBIEN ENVIA PARA ESTABLECER EL NUEVO CICLO DE TRABAJO
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; RECEPCION DEL DATO DE CONFIGURACION DEL ADC
;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
BSF RCSTA,4 ;HABILITA RECEPCION SETEANDO BIT CREN
LLENAS1
BTFSS PIR1,5 ;PRUEBA EL BIT RCIF=1 DE RECEPCION COMPLETA
GOTO LLENAS1 ;PERMANECE EN EL LAZO HASTA QUE INGRESE EL DATO
MOVF RCREG,W ;SE TRANSFIERE EL DATO RECIBIDO HACIA EL W
;SEGUIMOS EN EL BANK0
;**** realizar una conversión A/D solo luego de ingresar un dato****
;============== PREPARA CONVERSION A/D ==========================
;============== selección de canal analógico usando RCREG ==========
BCF STATUS,RP0
BCF STATUS,RP1 ;BANK0;FOSCI/8..CANAL segun RCREG..A/D OPERANDO
MOVWF ADCON0 ;se transfiere desde W hacia ADCON0
;valores permitidos son 65 73 81 89 97 105 113 121
BCF PIR1,6 ;BORRA ADIF DEL REGISTRO PIR1
;===== FIN DE LA CONFIGURACION DEL A/D ===============
BSF STATUS,RP0
BCF STATUS,RP1 ;BANK1
BSF INTCON,7
BSF PIE1,6 ;COLOCA 1 EN ADIE Y GIE
BCF STATUS,RP0
BCF STATUS,RP1 ;BANK 0
BSF ADCON0,2 ;INICIA LA CONVERSION
ESPER1 BTFSS PIR1,6 ;ESPERA FIN DE CONVERSION
GOTO ESPER1
;******************** FIN DE LA CONVERSION A/D *********
BCF PIR1,6 ;BORRA ADIF
;===================== TRANSMISION SERIAL ===============================
BSF STATUS,RP0
BCF STATUS,RP1
MOVF ADRESL,W ;CARGARA UN BYTE BAJO
BCF STATUS,RP0
BCF STATUS,RP1 ;BANK0
MOVWF TXREG ;TRANSMITE BYTE BAJO
BSF STATUS,RP0
BCF STATUS,RP1 ;BANK1
ESPE1
BTFSS TXSTA,1 ;PRUEBA TRMT,SI BUFFER ESTA VACIO
GOTO ESPE1
;===============================================================
BCF STATUS,RP0
BCF STATUS,RP1 ;BANK0
MOVF ADRESH,W ;SE TRANSMITIRA EL BYTE ALTO
MOVWF TXREG
BSF STATUS,RP0
BCF STATUS,RP1 ;BANK1
ESPE11
BTFSS TXSTA,1
GOTO ESPE11
BCF TXSTA,1
;=========== FIN DE TRANSMISION DE LOS DOS BYTES ===============
GOTO INICIO
DEMORA
MOVLW GRU ;GRU,REG,ETC ESTAN EN BANK0
MOVWF REG1
DEM3
MOVLW MED
MOVWF REG2
DEM2
MOVLW FIN
MOVWF REG3
DEM1
DECFSZ REG3
GOTO DEM1
DECFSZ REG2
GOTO DEM2
DECFSZ REG1
GOTO DEM3
RETLW 0
END