(PIC18ADC)PC= 0x2582.ADC conversion started before "wait" time has expired following previous cnversion or channel change.Lei un poco sobre interrupciones en el convertidor Analogico/digital, y trabaja con las banderas ADIF, ADIE.. nose si debe activar una interrupcion entre las lecturas y habilitar y desabilitar estasbandejas.
Como que no tiene mucho sentido tu codigo. Normalmente solo configuras el ADC una ves y listo.
Luego si tenes que cambiar el canal, solo cambias el canal, no vas y cambias todos los registros.
Por otro lado el error del proteusCódigo: [Seleccionar](PIC18ADC)PC= 0x2582.ADC conversion started before "wait" time has expired following previous cnversion or channel change.
Es por que tenes que esperar un tiempo una ves cambias el canal, ya que de esa forma esperas que el capacitor del S/H iguale a la tension de la entrada. Asi que podrias ponerle un pequeño delay ahi. Pensa el ADC de esta forma. al comienzo vos cargas un capacitor interno que va a tener el mismo voltaje que el pin de entrada, luego se abre el circuito y se desconecta el capacitor de la entrada, el ADC procede a convertir esa tension a digital. Termina el ADC y se vuelve a conectar el capacitor al canal seleccionado, supongamos que tenes 4V, cambias de canal, y ese pin tiene 1V, entnoces tenes que esperar que ese capacitor pequeño dentro del PIC se descargue y llegue a 1V, ponele un delay de 1 o 5ms y creo que sobra por mucho.
La conversion se inicia cuando pones el GO_DONE a 1. Y con el while ( no hace falta el continue ) esperas que termineCódigo: C
while(GO_nDONE); // Mientras esta en un valor distinto de 0 sigue ahi dentro atrapado.
El GO_DONE se pone a 0 cuando se termina la conversion.CitarLei un poco sobre interrupciones en el convertidor Analogico/digital, y trabaja con las banderas ADIF, ADIE.. nose si debe activar una interrupcion entre las lecturas y habilitar y desabilitar estasbandejas.
Si necesitas las interrupciones las usas, sino no las usas :P
Seleccionar el canal me refiero a cambiar el registro obviamente. Supongo que esta linea es la que cambia el canal:
ADCON0 = (canal << 2) | 0x01;
Luego de esa linea ponele un delay de unos milisegundos
ADCON0 = (canal << 2) | 0x01;
__delay_ms(1);
GO_nDONE = 1;
( No se si es correcto el nombre de la funcion, pero es para que me entiendas )
De esa forma, antes de comenzar la conversion, le das tiempo a que cuando se cambio de canal el capacitor se cargue, si te tira error de nuevo, proba con 5 ms.
(PIC18)PC=0x24D8. ADC conversion clock period(1e-07) violates the minimun required TAD time.
Citar(PIC18)PC=0x24D8. ADC conversion clock period(1e-07) violates the minimun required TAD time.
Hay un tiempo de conversion por bit, esto va a depender de tu reloj.
No se que clock estas usando exactamente. Fijate en la pagina 265 del datasheet
TABLE 21-1: TAD vs. DEVICE OPERATING FREQUENCIES
Ahi tenes los valores maximos de frecuencia de reloj que podrias usar. Si por ejemplo estas haciendolo funcionar con 48Mhz al PIC, si o si tenes que usar 64 Tosc, ya que este es el unico que asegura que a 48Mhz ( 20.83ns ) se cumpla el minimo TAD (0.7us), 64 * 20.83ns = 1.33us
La eleccion del TAD se debe hacer intentando que el TAD sea lo mas rapido posible Pero por encima del minimo.
Si usas por ejemplo 16 Mhz (62.5 ns) , necesitarias al menos 16 Tosc, para cumplir con los 0.7us.
El minimo se encuentra en el parametro electrico numero 130 por si queres buscarlo, pag 398
Con respecto al problema pasado, vos tenes que asegurarte un tiempo de adquisicion. Tenes 2 formas, una es la que dije yo agergandole un delay y poniendo el TACQ a 0 TAD ( ADC_00TAD ). La otra forma es calculando exactamente los valores de TACQ ( el datasheet da un ejemplo ) y seleccionando el minimo posible tal que cumpla con los requisitos. Con esta ultima forma puede no ser necesario poner un delay ante cada cambio de canal.
ADC_init(ADC_AN01 | ADC_10bit | ADC_FOSC32 | ADC_02TAD );
ADC_init(ADC_AN02);
Observa que en la 2da linea no solo elegis el canal 2, sino que ademas, podes a 0 todo lo demas. Si va a usar el el canal 2, directamente pone. Y listo.
ADC_init(ADC_AN02 | ADC_10bit | ADC_FOSC32 | ADC_02TAD );