;*****************************************************
;lee un valor analogico por el AN0
;y escribe el resultado binario por el puerto D
;
;*****************************************************
List p=16F877a ;procesador
#include <P16F877a.INC>;registros internos
org 0x000 ;vector reset
goto inicio ;va a inicio
nop
org 0x005 ;vector interrupcion
inicio
clrwdt ;borra watch-dog
bcf STATUS,RP1
bsf STATUS,RP0 ;banco 1
movlw B'11111111'
movwf TRISB
movlw b'00000000'
movwf TRISD
movwf TRISC ;portc salida
movwf PIE2
movlw b'00000010'
movwf PIE1 ;cambiar bit 6
movlw b'00000111';prescaler TMR0 1:256
movwf OPTION_REG
movwf b'00100000';habilitada intrr TMR0
movwf INTCON
movlw b'11111111'
movwf PR2
movlw B'10000000'
movwf ADCON1 ;justificacion<7>,conf port<3:0>
;se activan todos los ADC,vref+=RA<3>,vref-=vss
bcf STATUS,RP0;banco 0
movlw b'00101101'
movwf CCPR1L
movlw b'00111111'
movwf CCP1CON
movlw b'01111111'
movwf T2CON
conv0
clrwdt ;borra watch-dog
movlw B'10000001' ;81h-->w
movwf ADCON0 ;fosc/32<7:6>,adc0<5:3>,go/done<2>,adc on<0>
bcf PIR1,ADIF ;borra PIR1
adc0
clrwdt ;borra watch-dog
btfss INTCON,T0IF ;T0IF indica interrupcion por final
;de temorizacion(overflow)
;intcon<2>=1?
goto adc0 ;si.va a conv
bcf INTCON,T0IF ;no.borra intcon<2>
bsf ADCON0,GO ;adcon0<2>=1
;GO/DONE=estado de conversion
;GO/DONE=0-->done
;GO/DONE=1-->go
;comienza conversion A/D
retraso0
clrwdt ;borra watch-dog
btfss PIR1,ADIF ;pir1<6>=1?
goto retraso0 ;no.va a retraso
bsf STATUS,RP0 ;banco 1
banksel ADRESL ;si.adc_lsb-->w
movf ADRESL,w ;adc_lsb-->w
bcf STATUS,RP0
movwf PORTD
movwf CCPR1L
bucle
btfss PIR1,TMR2IF
goto bucle
clrf PIR1
goto conv0
end