Hola a todos esta es mi primera vez en el foro, ademas estoy empezando con la programacion en ASM.
Tengo un problema similar a l de JoseV
El microcontrolador utilizado es un PIC16F1939, el circuito se basa en 3 potenciometros mediantes los cuales deseo controlar el dutyi de 3 PWM.
Al simular en ISIS la convercion AD resulta buena pero me salen MUCHOS mensajes de erro del tipo:
ADC conversion started before wait time has expired following previous convercion or chanel change
Adjunto el fragmento del codigo donde se realiza la convercion AD donde supongo q recide el problema, puse un dalay antes de realizar la convercion como aconseja el fabricante pero sigo teniendo los mensajes de error. En caso de ser necesario adjunto el codigo completo.
;****************************************************************
;******************** CONFIGURACION DE TMR1 ********************
;****************************************************************
BANKSEL T1CON
movlw b'00110000' ;Fuente de Clock Fos/4, prescale en 8,Apagado
movwf T1CON
movlw b'00000000' ;Desactivo Disparos
movlw T1GCON
;****************************************************************
;*************** CONFIGURACION DE CONVERSORES AD ***************
;* AN12 (RB0, pin 33) ===>> Dimer Red \\ Ya definidas *
;* AN10 (RB1, pin 34) ===>> Dimer Green >> como entradas *
;* AN 8 (RB2, pin 35) ===>> Dimer Blue // analogicas *
;****************************************************************
; A este registro lo configuro solo al principio, porq determina el clock de convercion, tensiones de referencia
;y tipo de justificacion, parametros q no necesito afectar luego
BANKSEL ADCON1
movlw b'01100000' ;b7=0 Justificado a izquierda (ADRESH tiene los 8 mas significativos,
movwf ADCON1 ;b6-b4 => clock = Fosc/64, b2 => V-=Vss, b1-b0 => V+=Vdd,
movlw b'00000001' ;Selecciono AN0, GO=0, AD ON
movwf ADCON0
;****************************************************************
call PAUSA
CONV:
;CONVERCION Dimer Red ==> Determino Duty Red
BANKSEL ADCON0
movlw b'00110011' ;b6-b2 selecciono AN12 (dimer red), b1=1 => convercion en proceso,
movwf ADCON0 ;b0=1 => ADC on
btfsc ADCON0,GO_NOT_DONE ;testeo la bandera GO si esta es 1 todabia esta realizandoce la convercion
goto $-1 ;y me mantengo en bucle, si es 0 la convercion se termino y salto una linea
BANKSEL ADRESH
movfw ADRESH ;tomo la parte alta de la convercion y lo muevo a W
BANKSEL CCPR1L
movwf CCPR1L ;muevo W a CCPR1L q determina el duty de PRM Red
call PAUSA
;CONVERCION Dimer Green ==> Determino Duty Green
BANKSEL ADCON0
movlw b'00101011' ;b6-b2 selecciono AN10 (dimer green), b1=1 => convercion en proceso,
movwf ADCON0
btfsc ADCON0,GO_NOT_DONE
goto $-1
BANKSEL ADRESH
movfw ADRESH
BANKSEL CCPR2L
movwf CCPR2L ;muevo W a CCPR1L q determina el duty de PRM green
call PAUSA
;CONVERCION Dimer Blue ==> Determino Duty Blue
BANKSEL ADCON0
movlw b'00100011' ;b6-b2 selecciono AN8 (dimer blue), b1=1 => convercion en proceso,
movwf ADCON0
btfsc ADCON0,GO_NOT_DONE
goto $-1
BANKSEL ADRESH
movfw ADRESH
BANKSEL CCPR3L
movwf CCPR3L ;muevo W a CCPR1L q determina el duty de PRM Blue
call PAUSA
goto CONV ;me mantengo en un ciclo realizando las converciones AD sucesivamente
;****************************************************************
PAUSA:
BANKSEL PIR1 ;selecciono bank de PIR1 donde tambien esta TCON y TMR1
bcf PIR1,TMR1IF
clrf TMR1L ;Cago 0000 en el TMR1L
clrf TMR1H
bsf T1CON,TMR1ON;prendo TMR1
btfss PIR1,TMR1IF ;Si TMR1IF es 1 salta la linea
goto $-1 ;mientras sea cero sigue preguntando
bcf T1CON,TMR1ON
return
Desde ya muchas gracias por su ayuda!