Contar pulsos con CCP en modo captura

Ok. Voy a ver como lo implemento, o en vez de leer por adc ya marcar la tensión y que salga por el pwm y no usaría la memoria, ¿es correcto?
No entendí absolutamente nada.
Pero, lo que tienes que guardar es el valor de la variable "ciclo_activo" y al iniciar el programa debes leer ese valor y asignarlo a la variable.
 
Mi ides era ya asignar la tensión con los pulsadores no leerla del adc, si coloco con el pulsador 15 volt que el pwm saque la proporción a 15 volt,

18 volt = máximo pwm
0 volt = mínimo pwm
Y que los pulsadores se muevan en ese rango
Y avance 1,1 1,2 1,3 y sale saque la tensión

Lo voy haciendo y subo,gracias
 
Eso que mencionas, es lo que exactamente hace el programa que subí.
Pero yo aproveché uno de los canales ADC de ese PIC para leer el voltaje.
 
Si tenes razón! Como le agrego dos pulsadores más así apretando por 3 segundo tengo 2 memorias y puedo tener dos voltajes diferentes y cada ves que apretó por 3 segundo puedo guardar el valor y trabajo con eso?
 
Pues no lo veo correcto.
De esa forma no estarás mostrando el voltaje de salida.
Ten en cuenta que la carga presenta una resistencia que provocará una caída de tensión y el programa estará indicando un voltaje que calculas por software, pero ese voltaje no será el que está presente en el momento.
Aparte, en el programa estás usando el ADC 4 y no lo tienes conectado en ninguna parte del esquema.

No entiendo por qué estás modificando un proyecto que se te está dando funcional, por algo que no tiene sentido.
 
Porque estoy trabado con el tema de las memorias y no encuentro la manera que cuando se apaga vuelve a cero. El proyecto que hiciste es muy bueno. Solo necesito que me de la forma de guardar 2 datos así no es tedioso empezar de cero cada vez que se apaga, la opción mejor es usar el adc.
 
En el post #121 te expliqué cómo hacerlo, y la verdad es muy sencillo.
Es algo tan básico, que es una de las primeras cosas que se deben saber al programar microcontroladores.

Ahora, si quieres algo más elaborado, puedes sensar el voltaje de alimentación del microcontrolador y guardar los datos cuando ese voltaje esté por debajo de 5 V.
O sea, establecer un voltaje de referencia antes de que ocurra el BOR (Brown-Out Reset)
El compilador de CCS por defecto siempre desactiva éste fuse, así que dependiendo el PIC, podrá operar hasta por debajo de unos 3.3 V.
Así que tienes un amplio rango para poder fijar una histéresis y no provocar falsas lecturas.
 
ok es algo si como lo estoy haciendo


void memoria()
{
if (!input(PIN_A2))
{
write_eeprom (00,voltaje);
}
else if (!input(PIN_A2))
{

voltaje=read_eeprom(00);
lcd_gotoxy(11,1);
printf(lcd_putc,"%4.1fV ",voltaje);
}
}
 
No. Muy mal, y no estás prestando atención a lo que te mencioné.
Lo que tienes que guardar es el valor de la variable "ciclo_activo" y al iniciar el programa debes leer ese valor y asignarlo a la variable.
¿Por qué se debe guardar el valor de la variable "ciclo_activo"?
Porque el valor de esa variable es lo que define el ciclo activo del PWM y por ende el voltaje de salida.
Así que guardar y leer la variable "voltaje", no tiene relevancia porque el ciclo activo determina el voltaje.

Ahora, ¿por qué leer la variable "ciclo_activo" al iniciar el programa?
Porque justo en ese momento es cuando se requiere saber que valor tenía anteriormente.
Por lo tanto, el programa al iniciar ya tendrá un valor con el cual ajustar el ciclo activo del PWM, y ésto se verá inmediatamente reflejado en el voltaje de salida.

Recuerda ésto:
Para programar debes tener noción e imaginación sobre el acontecimiento de eventos.
 
void memoria()
{
if (!input(PIN_A2)) // si apreto pin a2 por 1 segundo guardo el dato
{
delay_ms(1000);
write_eeprom(00,ciclo_activo ); // guardo el dato ciclo activo

}
if (!input(pin_a2)) // si preciono pin a2 leo el dato en la posicion de la memoria
{

valor =read_eeprom(00); // paso el dato a la variable valor

}

lcd_gotoxy(11,1);
printf(lcd_putc, "%4.1fV ",valor); // muestro el dato en lcd remplazando el dato del adc
}

Si tenes razón , probé de esta manera hacerla la función y me parece que esta mal.
 
void memoria()
{
if (!input(PIN_A2)) // si apreto pin a2 por 1 segundo guardo el dato
{
delay_ms(1000);
write_eeprom(00,ciclo_activo ); // guardo el dato ciclo activo

}
if (!input(pin_a2)) // si preciono pin a2 leo el dato en la posicion de la memoria
{

valor =read_eeprom(00); // paso el dato a la variable valor

}

lcd_gotoxy(11,1);
printf(lcd_putc, "%4.1fV ",valor); // muestro el dato en lcd remplazando el dato del adc
}

Si tenes razón , probé de esta manera hacerla la función y me parece que esta mal.
Buenas.
Vamos a ver si entiendo :unsure:, lo que quieres hacer es que al pulsar el botón por un segundo guarde el valor del voltaje en la memoria y al pulsarlo nuevamente lea la memoria y despliegue nuevamente ese voltaje.
Si es asi, tu código esta mal, recuerda que los micros ejecutan las instrucciones de forma lineal,o sea que tu segunda instruccion de leer la memoria no se ejecutara.
Te paso un ejemplo con tu codigo para que lo pruebes y analizes:
PHP:
void memoria()
{     
 int8 cont;     
   if(input(pin_a2)==0){
          while(!input(pin_a2)){
          cont++;
          delay_ms(10);
          if (cont >80){
          write_eeprom(00,ciclo_activo ); // guardo el dato ciclo activo
         delay_ms(50);
	lcd_gotoxy(2,1);
         printf(lcd_putc, "\fMEMORIA GRABADA");
         delay_ms(1000);
         CONT = 0;
          }
          }
           ciclo_activo =read_eeprom(00); // paso el dato a la variable ciclo_activo
           lcd_gotoxy(2,1);
           printf(lcd_putc, "\fMEMORIA LEIDA");
           delay_ms(1000);
           printf(lcd_putc,"\f"); 
           cont=0;
            delay_ms(50);
             establecer_ciclo(ciclo_activo);
            }
}
PD: En este ejemplo al pulsar el botón conectado al Pin A2 por un segundo o mas guarda el valor del ciclo_activo, y al pulsarlo solo una vez sin dejarlo presionado lee la memoria y despliega el voltaje.:apreton::apreton:
 
PD: En este ejemplo, al pulsar el botón conectado al Pin A2 por un segundo o más, guarda el valor del ciclo_activo, y al pulsarlo sólo una vez sin dejarlo presionado, lee la memoria y despliega el voltaje.
Por ahí va la cosa. Pero, ¿Qué caso tiene leer el valor del ciclo activo guardado en la EEPROM, si durante ese periodo, el valor del ciclo activo no se a perdido y también está previamente asignado?
Como corroboración, es comprensible, pero también redundante.

La importancia de leer el valor guardado del ciclo activo, radica más que nada, al iniciar el programa.
Pero aquí ocurre otro detalle, en dado caso de que no ocurra un corte eléctrico, el equipo siempre arrancará con el motor encendido, puesto que posiblemente quede almacenado un valor diferente al mínimo para el ciclo activo del PWM.
Aquí entra en juego otro factor a guardar y posteriormente comparar, que sería el factor tiempo.
 
Por ahí va la cosa. Pero, ¿Qué caso tiene leer el valor del ciclo activo guardado en la EEPROM, si durante ese periodo, el valor del ciclo activo no se a perdido y también está previamente asignado?
Como corroboración, es comprensible, pero también redundante.
Es cierto Tenes razón, solo tiene que guardar en la EEprom el ciclo activo, para que pueda volver a desplegar el voltaje en caso que la equipo se haya apagado.(y)(y)

La importancia de leer el valor guardado del ciclo activo, radica más que nada, al iniciar el programa.
Pero aquí ocurre otro detalle, en dado caso de que no ocurra un corte eléctrico, el equipo siempre arrancará con el motor encendido, puesto que posiblemente quede almacenado un valor diferente al mínimo para el ciclo activo del PWM.
Aquí entra en juego otro factor a guardar y posteriormente comparar, que sería el factor tiempo.
El ejemplo que subí hace exactamente eso, al encender el equipo, lo hace con el ciclo activo en 1, y al pulsar el boton conectado al pin_A2 y vuelve a desplegar el voltaje guardado, que es lo que entendí que el compañero quiere hacer.
Subo la simulacion y el codigo implementado:
 

Adjuntos

Similar a lo que comenté en el post #125, con un bucle y un contador.
Y si se cumple el conteo predeterminado, actualizas el periodo del retardo por un tiempo menor.
 
Hola estoy probando y me encuentro que con el oscilador interno a 8mhz me da problema, con la lectura de los pulsadores , y todavía ando mareado con el contador
void memoria()
{
int8 cont; esta variable se declara para alojar los datos de la memoria?
if(
input(pin_a2)==0){ apretó pin a2
while(!
input(pin_a2)){ while no entiendo que hace
cont++; contador asciende
delay_ms(10);
if (
cont >80){ contador mayor de 80
write_eeprom(00,ciclo_activo ); // guardo el dato ciclo activo
delay_ms(50);
lcd_gotoxy(2,1);
printf(lcd_putc, "\fMEMORIA GRABADA");
delay_ms(1000);
CONT = 0; y el conatdor a 0


claro yo nunca lo iba hacer andar si no entiendo bien como funciona, el contador para que hacienda o baje mas rápido el voltaje no se como hacerlo, subo lo que hicimos hasta aca


 

Adjuntos

Última edición:
Ya casi esta me falta un poco de ayuda para que corra mejor el programa, ya sube y baja rápido pero no logro reflejar la muestra en el adc, lo demás funciona bien no se si estoy aplicando bien las memorias pero hace lo que necesito.
 

Adjuntos

Última edición: