No creo que tengas problemas. Por ahi me preguntaria si es necesario los 3 valores dentro del if. Como por ejemplo:
( C1OUT && C2OUT && x==0 )
C1OUT corresponde a los 5 V, C2OUT corresponde a los 3V, si quisiera activar la salida de la bateria solo necesitaria saber si es que C2OUT se cumple. ( ya poseo x quien me dice que esta descargandose / cargandose )
Entonces tengo distintas situaciones:
- Cuando la bateria esta llena, pasar a la bateria si o si y comenzar a descargarla
- Si la bateria esta en un valor intermedio y estamos en "descarga" entonces seguimos alimentando con la bateria
- Si la bateria esta "agotada" y estabamos en "descarga" pasamos a un estado de "Carga" y alimentamos desde el cargador. Ese estado de "carga" va a evitar que se cambie hasta que no este llena la bateria.
- Si la bateria esta en estado de "carga" y tiene un valor intermedio seguiriamos con el cargador.
La ultima opcion es compleja que suceda, por que estamos asegurandonos al comienzo del programa que inicie en modo "descarga", en ese estado ocurririan las 3 primeras opciones que di , entonces opino que con 3 preguntas estaria el programa realizado. Esta bien que le falta un par de instrucciones ( como lo de activar RB3 o RB2 ).
// Solo para darle nombres a los valores.
enum estado {
DESCARGA,
CARGA
};
void main(void)
{
// Aca la configuracion de pines / comparadores, etc
enum estado x;
x = DESCARGA; // Comienzo como "DESCARGA"
while(1)
{
if ( C1OUT == 1 )
{
// Bateria 5V
// Uso bateria, apenas llegue el voltaje de la bateria al correcto cambio
x = DESCARGA; // Descarga
}
else if ( C2OUT == 1 && x == DESCARGA )
{
// Bateria por encima de los 3V
// Uso bateria, supongo que estoy en regimen de descarga por eso el x==0
// Aca no modifico x, solo se modifica en los extremos
}
else if ( C2OUT == 0 && x == DESCARGA )
{
// Bateria agotada del regimen de descarga
// Activo Cargador, modifico x, ya que es un extremo del valor de la bateria
x = CARGA; // Carga
}
}
}
En fin, si lo tuyo funciona dale para adelante, que no le veo nada malo.Una pregunta mas. Esto es unicamente para indicar de donde esta cargando ? o pensas activar algo para que aliemente entre uno u otro. Lo pregunto por esto:
output_high(PIN_Bx);
output_low(PIN_Bx);
Al ejecutarse la primera instruccion, hasta que no se ejecute la segunda vas a tener las 2 salidas en 1, es decir PIN_B2 y PIN_B3 en 1 (no es mucho a 20Mhz estamos hablando de 200ns). Dependiendo que quieras hacer por ahi te conviene desactivar primero y luego activar la otra, es decir cambiarle el orden a las instrucciones de arriba:
output_low(PIN_Bx);
output_high(PIN_Bx);
PD: Sobre el foro, codigos, etcPara poner un codigo, copias y pegas el codigo, luego seleccionas unicamente el codigo, y donde tenes para insertar imagenes, negritas,etc a la derecha de todo tenes un menu desplegable que dice Codigo, si haces click ahi te aparecen los distintos lenguajes, seleccionas C y todo lo que tenias seleccionado queda encerrado en algo parecido a esto (code = c ) ( / code ) , donde los parentesis en realidad son corchetes, pero lo puse asi para que no me los transforme el foro.