Hola,
Como ya conté en otro hilo estoy intentando sacar un PWM de ciclo variable a partir de una referencia analógica, eso ya está conseguido. Ahora el problema que tengo es que he hecho dos configuraciones, una para sacar el PWM con 8 bits a una frecuencia de 70 KHz y otra para sacar el PWM con 10 bits a una frecuencia de 19,5 KHz, y quiero resetear el pic mediante un pulsador para que, en función de un interruptor, escoja una configuración u otra. No soy capaz de hacer que funcione la simulación en PROTEUS, por más que pruebo distintos puertos de entrada para la señal del interruptor al dar a MCLR no cambia la configuración sino que saliendo la misma señal PWM, es más, ni siquiera parando la simulación o cerrando el PROTEUS cambia la señal, sólo cambia si establezco una configuración u otra desde código como predeterminada.
El código es el siguiente:
//Programa que recibiendo un voltaje lo convertimos a PWM mediante el módulo ADC
float valor; //valor al que asignare los 10 bits del ADC del primer caso
int temp_res; // valor al que asignare los 10 bits del ADC del segundo caso
unsigned short CU = 255;
void main() {
TRISB1_bit=1; //RB1 como entrada
PORTC=0X00; //Inicializacion
TRISC2_bit=0; //RC2 como salida
if (RB1 == 0) {
PR2 = 0b11111111; //PR2 = 255
T2CON = 0b00000100; //Timer2 on; Prescaler = 1; Postscaler = 1:1
while(1) {
valor = ADC_read(2); //Obtengo 10 bits del canal 2
CCP1CON = ((valor/4) - floor(valor/4))*4*16+12; //Divido entre 4 para separar
//los 8 bits mas significativos de los 2 menos significativos, resto el entero
//de la division para quedarme con el valor decimal y vuelvo a multiplicar por
//cuatro para sacar el valor decimal de los 2LSB. Multiplico por 16 para desplazar
//cuatro posiciones a la izquierda y sumo 12 para establecer el modo PWM
CCPR1L = floor(valor/4); //Asigno los 8MSB al registro CCPR1L
}
} else {
PWM1_Init(70000); // Frecuencia PWM
PWM1_Set_duty(CU);
PWM1_Start();
while (1) {
temp_res = ADC_read(2);
CU = temp_res/4;
PWM1_Set_Duty(CU);
}
}
//
}¿Alguna idea por favor?