PROCESSOR 16F887
INCLUDE <P16F887.INC>
errorlevel -302
__CONFIG _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _BOR_OFF & _IESO_ON & _FCMEN_ON & _LVP_OFF
CBLOCK 0X20
LOOP,LOOP2,NIB1,NIB2,NIB3,TEMP,R0,R1,R2,ACAL,ACAH
ACBL,ACBH,ACCL,ACCH,ACDL,ACDH,COUNT
CHANN
ENDC
ORG 0x00
GOTO INI
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CANAL
addwf PCL,F
retlw b'10010001' ; AN4
retlw b'10010101' ; AN5
retlw b'10011001' ; AN6
retlw b'10011101' ; AN7
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FinTablaCANAL
IF (FinTablaCANAL > 0xFF)
ERROR "¡CUIDADO!: La tabla ha superado el tamaño de la página de los"
MESSG "primeros 256 bytes de memoria ROM. NO funcionará correctamente."
ENDIF
RETARDO
MOVWF LOOP
TOP2
MOVLW D'110'
MOVWF LOOP2
TOP
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ LOOP2 ;,F
GOTO TOP
DECFSZ LOOP ;,F
GOTO TOP2
RETURN
MULT
MOVLW .16
MOVWF TEMP
CLRF ACCH
CLRF ACCL
CLRF ACBH
CLRF ACBL
MPLOOP
RRF ACDH,F
RRF ACDL,F
BTFSC STATUS,C
CALL SUM
RRF ACBH,F
RRF ACBL,F
RRF ACCH,F
RRF ACCL,F
DECFSZ TEMP,F
GOTO MPLOOP
RETLW 0
SUM
MOVF ACAL,W
ADDWF ACBL,F
BTFSC STATUS,C
INCF ACBH,F
MOVF ACAH,W
ADDWF ACBH,F
RETLW 0
B2BCD
BANKSEL FSR
MOVLW .24
MOVWF COUNT
CLRF R0
CLRF R1
CLRF R2
LOOP16
RLF ACCL ;,F
RLF ACCH ;,F
RLF ACBL ;,F
RLF R2,F
RLF R1,F
RLF R0,F
DECFSZ COUNT,F
GOTO ADJDEC
RETLW 0
ADJDEC
MOVLW R2
MOVWF FSR
CALL ADJBCD
MOVLW R1
MOVWF FSR
CALL ADJBCD
MOVLW R0
MOVWF FSR
CALL ADJBCD
GOTO LOOP16
ADJBCD
MOVLW 03
ADDWF INDF,W
MOVWF TEMP
BTFSC TEMP,3
MOVWF 00
MOVLW 30
ADDWF 00,W
MOVWF TEMP
BTFSC TEMP,7
MOVWF 00
RETLW 00
AD
;BANKSEL ADCON1
;MOVLW B'10010010'
;MOVWF ADCON1
BANKSEL ADCON0
movf CHANN,W
call CANAL
movwf ADCON0
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Esperamos 1 a 2ms aprox.
movlw .8
movwf LOOP
movlw .200
movwf LOOP2
decfsz LOOP2,F
goto $ - 1
decfsz LOOP,F
goto $ - 5
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BSF ADCON0,GO
NOP
NOP
BTFSC ADCON0,GO
GOTO $-1
MOVF ADRESH,W
MOVWF ACDH
BANKSEL ADRESL
MOVF ADRESL,W
BANKSEL ADRESH
MOVWF ACDL
MOVLW .232
MOVWF ACAL
MOVLW .1
MOVWF ACAH
CALL MULT
CALL B2BCD
SWAPF R0,W
ANDLW 0FH
MOVWF NIB1
MOVLW 30H
ADDWF NIB1 ;,F
MOVF R0,W
ANDLW 0FH
MOVWF NIB2
MOVLW 30H
ADDWF NIB2 ;,F
SWAPF R1,W
ANDLW 0FH
MOVWF NIB3
MOVLW 30H
ADDWF NIB3,F
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
incf CHANN,F ; <<< ### Apunta a cada canal por vez
movlw .4
xorwf CHANN,W
btfsc STATUS,Z
clrf CHANN
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
RETURN
TX
BANKSEL PIR1
MOVF NIB1,0
ESP1
BTFSS PIR1,TXIF
GOTO ESP1
MOVWF TXREG
MOVLW D'44'
ESP3
BTFSS PIR1,TXIF
GOTO ESP3
MOVWF TXREG
MOVF NIB2,0
ESP
BTFSS PIR1,TXIF
GOTO ESP
MOVWF TXREG
MOVF NIB3,0
ESP2
BTFSS PIR1,TXIF
GOTO ESP2
MOVWF TXREG
RETURN
INI
CLRF OSCTUNE
MOVLW B'01100110'
MOVWF OSCCON
BANKSEL TRISA
MOVLW B'11111111' ; <<< ### OK, el que sirve solo es RA5/AN4
MOVWF TRISA
MOVWF TRISB
MOVLW B'10111111'
MOVWF TRISC
MOVLW B'00100110' ;VEL TX
MOVWF TXSTA
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
movlw b'11111111' ; <<< ### El AN5, 6, 7 estan en el TRISE
movwf TRISE
BANKSEL ANSEL ; <<< ### banco 3
movlw b'11111111' ; <<< ### Entradas para el ADC
movwf ANSEL
BANKSEL SPBRG ; <<< ### banco 1
movlw b'00100100' ; <<< ### Al ser envio, se configura TXSTA
movwf TXSTA ; <<< ### con 8bit.
; de esperar para poder enviar un nuevo dato.
movlw b'10010010'
movwf ADCON1
clrf CHANN
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MOVLW D'103'
MOVWF SPBRG ;GENERADOR BAUD
BANKSEL PIR1
BSF PIR1,TXIF
MOVLW B'10000000' ;HAB COM BIT7 EN 1
MOVWF RCSTA
MOVLW B'10010001' ;AN4
MOVWF ADCON0 ;FOSC/32
CICLO
CALL AD
CALL TX
MOVLW D'13'
ESP4
BTFSS PIR1,TXIF
GOTO ESP4
MOVWF TXREG
MOVLW D'10'
ESP5
BTFSS PIR1,TXIF
GOTO ESP5
MOVWF TXREG
NOP
NOP
ESP6
BTFSS PIR1,TXIF
GOTO ESP6
MOVLW D'250'
CALL RETARDO
GOTO CICLO
END