Al final conseguí hacer funcionar el ADC y el PWM, ahora tengo un nuevo problema relacionado, y es que quiero sacar 10 bits del PWM y por ello no voy a utilizar las funciones de la librería de PWM que vienen en MikroC si no que usaré los registros del PIC.
El problema es que no consigo que funcione y no sé qué puedo estar haciendo mal, cuando cargo la simulación en Proteus y doy al play me sale el error que adjunto en la imagen. Por lo que me dice es cuestión de que no doy el tiempo adecuado a la conversión ADC para finalizar cuando ya quiero empezar la siguiente. Pero he configurado los bits y el fosc siguiendo las instrucciones del datasheet del 16f877a para dejar un tad de 1,6us.
Os dejo el nuevo programa a ver si me podéis echar una mano:
utilizo un cristal de 20MHz
//Programa que recibiendo un voltaje lo convertimos a PWM mediante el módulo ADC
char alto, bajo;
void inicia_AD();
void selecciona_AD(unsigned num);
void arranca_AD();
char leer_AD();
void set_PWM(char alto, char bajo);
void main() {
PORTC=0X00; //Inicializacion
TRISC2_bit=0; //RC2 como salida
PR2 = 0b11111111; // PR2 = 255
T2CON = 0b00000100; // Timer2 Prescaler = 1
inicia_AD();
while(1) {
arranca_AD();
alto, bajo = leer_AD();
set_PWM(alto, bajo);
}
}
void inicia_AD() {
ADCON0=0b11010001; //Fosc/32 ; channel 2; utilizo un cristal de 20MHz
ADCON1=0b00000010; // Left-justified: dos bits menos significativos en ADRESL. Utilizamos como voltajes de referencia VDD y VSS.
}
void selecciona_AD(unsigned num)
{
char aux;
aux=ADCON0 & 0b10000111; //pongo a 0 el canal de conversion
ADCON0=aux | (num<<3); //activamos el canal que se pasa
//000 = Channel 0 (AN0)
//001 = Channel 1 (AN1)
//010 = Channel 2 (AN2)
//011 = Channel 3 (AN3)
//100 = Channel 4 (AN4)
//101 = Channel 5 (AN5)
//110 = Channel 6 (AN6)
//111 = Channel 7 (AN7)
}
void arranca_AD()
{
ADCON0=0b11010101; //ponemos en marcha el conversor
}
char leer_AD()
{
char alto,bajo;
while (ADCON0==0b11010101); //aquí esperamos a que acabe de convertir
bajo= ADRESL;
alto = ADRESH;
return(alto,bajo);
}
void set_PWM(char alto, char bajo)
{
char aux;
aux = bajo>>2;
CCP1CON = CCP1CON&0b11001111;
CCP1CON = CCP1CON|aux;
CCPR1L=alto;
}