#include <kd_sfrs.h>
void inits_ad()
{
unsigned int regtemp;
asm { di; }
wsr=0; //Aunque podemos usar cualquier ventana para int_mask/int_mask1
int_mask=int_mask & 0xFD; // Deshabilitamos int del AD (realizaremos encuesta, no int)
/* Modifiquem el registre IOC2, seleccionem les opcions del conversor.*/
wsr=0xf; regtemp=ioc2;
regtemp = regtemp & 0xF7; // AD_TIME_ENA=0 para modo compatible con 196KB
wsr=0x0; ioc2=regtemp;
wsr=0xf; regtemp=ad_command;
regtemp = regtemp | 0x10; // 8 bits
wsr=0x0; ad_command=regtemp;
/* Finalment cal habilitar les interrupcions per poder servir-les. */
asm { ei;}
}
unsigned int conversio_ad(char canal) {
/* Este bucle espera a que se haya acabado la interrupción que lee el contenido del
registro de resultado del conversor AD (rutina RSIADDone). Una vez acabada se
muestra el resultado por el array de leds de la placa placa */
unsigned int regtemp;
wsr=0x0; // Para leer ad_result
while (ad_result&0x08); // Esperar a que haya acabado (encuesta)
asm { di; }
wsr=0xf; regtemp=ad_command;
if (canal==1) { regtemp&=0xF9; regtemp|=1; } // ...001
else if (canal==2) { regtemp&=0xFA; regtemp|=2; } // ...010
else if (canal==3) { regtemp&=0xFB; regtemp|=3; } // ...011
regtemp = regtemp | 0x08; // GO=1
wsr=0x0; ad_command=regtemp;
asm { ei; }
while (ad_result&0x08); // Esperar a que haya acabado (encuesta)
asm { di; }
regtemp=ad_result;
regtemp=regtemp>>8;
regtemp &= 0xFF;
asm { ei; }
return regtemp;
}