Autor Tema: contador atraves de pulsador no lo consigo desesperado pic c compiler  (Leído 1693 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado genti

  • PIC10
  • *
  • Mensajes: 21
contador atraves de pulsador no lo consigo desesperado pic c compiler
« en: 25 de Septiembre de 2021, 16:06:56 »
Hola ,
Estoy desesperado porque estoy intentando crear un contador que active un led cuando activo un pulsador y que se mantenga encendido hasta finalizar el cuenteo . En este caso lo he puesto que cuente hasta 100. con retardo de 500 ms. Pero lo que me pasa es que al pulsar el pulsador se me queda el led endendido y no se apaga nunca . He intentado de hacerlo de varias maneras e incluso buscando en este foro he encontrado contadores pero solo aumentaban cavez que pulsabas e intentado modificarlos sin exito. y ya no se por donde cambiar para que funcione. Se que se puede hacer tambien por TIMER o Interrupciones. Pero queria hacerlo lo mas sencillo posible ya que soy bastante novato en esto y no queria complicarme mucho.Esta echo con  pic C Compiler . Paso el codigo . Gracias de antemano.

#include <16F876.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)   // reloj a 4 MHz.
#use standard_io(b)
//#use standard_io(c)
//#define LCD_ENABLE_PIN PIN_B0
//#define LCD_RS_PIN PIN_B1
//#define LCD_RW_PIN PIN_B2
//#define LCD_DATA4 PIN_B3
//#define LCD_DATA5 PIN_B4
//#define LCD_DATA6 PIN_B5
//#define LCD_DATA7 PIN_B6
//#include <LCD.C>
int8 i;
void main(){

while(true){
   if(input(PIN_B7) == 1)
   for (i=0; i=100 ; i++){
      output_high(PIN_B6);
delay_ms(500);
     output_low(PIN_B6);
i=0;

}

}

}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:contador atraves de pulsador no lo consigo desesperado pic c compiler
« Respuesta #1 en: 25 de Septiembre de 2021, 16:58:28 »
Es por eso que siempre es mejor ser ordenado al programar, siempre identar el codigo

Código: C
  1. void main(){
  2.  
  3.    while(true){
  4.       if(input(PIN_B7) == 1){
  5.          for (i=0; i=100 ; i++){
  6.             output_high(PIN_B6);
  7.             delay_ms(500);
  8.             output_low(PIN_B6);
  9.             i=0;
  10.          }
  11.       }
  12.    }
  13. }

Tenes 2 errores...

El primero es poner a 0 el i, dentro del for, sino nunca va a parar. Ya que siempre i va a valer 0 y no se va a cumplir la condicion i>100

El Segundo es ver lo que se esta repitiendo

            output_high(PIN_B6);
            delay_ms(500);
            output_low(PIN_B6);

Si observas se prende, se espera 500ms encendido, luego se apaga, y comienza la otra vuelta, donde se prende de nuevo...
El tiempo entre que se apago y se encendio debe haber sido de microsegundos, por eso no lo notas. La solucion es ponerle una demora tambien al apagado


Código: C
  1. void main(){
  2.  
  3.    while(true){
  4.       if(input(PIN_B7) == 1){
  5.          for (i=0; i=100 ; i++){
  6.             output_high(PIN_B6);
  7.             delay_ms(500);
  8.             output_low(PIN_B6);
  9.             delay_ms(500);
  10.          }
  11.       }
  12.    }
  13. }

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:contador atraves de pulsador no lo consigo desesperado pic c compiler
« Respuesta #2 en: 25 de Septiembre de 2021, 17:16:57 »

Además de lo comentado por Killerjc  también tenés que corregir el for:
Código: [Seleccionar]
   for (i=0; i=100 ; i++){

De esa manera se ejecuta una sola vez, debe ser:
Código: [Seleccionar]
   for (i=0; i<100 ; i++){



Desconectado Miguelyx

  • PIC10
  • *
  • Mensajes: 30
Re:contador atraves de pulsador no lo consigo desesperado pic c compiler
« Respuesta #3 en: 26 de Septiembre de 2021, 01:38:01 »
No, tampoco es asi, el output_low(PIN_B6); ha de estar fuera del for para que se apague al finalizar el conteo del for si no, se apagara cuando pasen los 500ms, sin que i se haya incrementado ni una sola vez, la instruccion correcta es asi:

void main(){
 
   while(true){
      if(input(PIN_B7) == 1){

         for (i=0; i<100 ; i++){
             output_high(PIN_B6);
             delay_ms(500);
             }

            output_low(PIN_B6);

      }
   }
}

la accion durara unos 50 seg encendido al pulsar y luego se apagara porque es la multiplicacion de 500ms x 100 veces del for

Supongamos que quieres que este encendido 10 segundos cuando pulsas, cambias el 100 del for o cambias el 500 del delay.
Si cambias el delay serian 100ms de delay, y 100ms x 100 veces del for =10000ms, en total que son 10 segundos encendido.
Y si cambias el 100 del for pones 20 (i=0; i<20; i++) y 500ms x 20 veces del for = 10000 ms que son 10 segundos encendido.

Añado, para esos fallos tan tocanarices que no encuentras, necesitas un debugger con proteus por ejemplo y veras donde esta el fallo casi al instante, solo has de crear un fichero cof en el compilador y lo cargas en el pic como si fuese el hex pero en lugar de darle a play en proteus le das a step y se abrira una ventana donde veras en este caso la variable i y la accion que se realiza y el incremento actuando sobre el puerto RB6 al accionar RB7.
« Última modificación: 26 de Septiembre de 2021, 10:58:58 por Miguelyx »

Desconectado genti

  • PIC10
  • *
  • Mensajes: 21
Re:contador atraves de pulsador no lo consigo desesperado pic c compiler
« Respuesta #4 en: 26 de Septiembre de 2021, 19:08:36 »
hola ,
Gracias por vuestras respuestas. en referencia a lo que dice , Miguelyx he corregido todo lo que me aveis dicho . pero al pulsar el pulsador se enciende led y ya no se apaga he comprobado la salida del puerto RB6 y sigo teniendo tension para alimentar el LED. EL codigo tal y como lo pone Miguelyx . Hace que no se apage . La logica deberia ser que se apagara a los 50 segundos. tal y como esta pero la verdad es que no sepaga lo he estado controlando un buen rato y nada. Y no entiendo porque...

Desconectado Miguelyx

  • PIC10
  • *
  • Mensajes: 30
Re:contador atraves de pulsador no lo consigo desesperado pic c compiler
« Respuesta #5 en: 26 de Septiembre de 2021, 19:37:24 »
Prueba esto:

#byte TRISB=0x86
#byte PORTB=0x06

void main(){

TRISB=0b10000000;
PORTB=0;
 
   while(true){
      if(input(PIN_B7) == 1){
         input(PIN_B7) == 0;

         for (i=0; i<100 ; i++){
             output_high(PIN_B6);
             delay_ms(500);
             }
             output_low(PIN_B7);
            output_low(PIN_B6);

      }
   }
}

Me temo que tienes una accion rebote que ceba el pin RB7 y queda como 1 al pulsar por eso no se apaga al finalizar el conteo, hay que reestablecer el pin RB7 a 0 para que cuando finalice la instruccion for,  el flag de RB7 este a 0 y se apague el led en RB6 al finalizar el conteo.
No estoy muy familiarizado con ese compilador pero hay que devolver la condicion de RB7 a 0 dentro del IF antes de que vuelva al inicio de while.
El caso es que en proteus funciona a la primera, al iniciar la simulacion el led esta apagado y el boton esta esperando voltaje y al pulsar se enciende el led y se apaga transcurridas las condiciones del for.

Ahi te dejo el codigo y el proyecto en proteus para que veas que funciona, esta a 50ms, que con las 100 vueltas del for son 5 segundos encendido, proteus es con la version 8.9
« Última modificación: 27 de Septiembre de 2021, 04:47:04 por Miguelyx »

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:contador atraves de pulsador no lo consigo desesperado pic c compiler
« Respuesta #6 en: 26 de Septiembre de 2021, 19:37:47 »
Probá esto:

Con:
Código: [Seleccionar]
        if(input(PIN_B7) == 1){
            output_high(PIN_B6);       
            for (i=0; i<100 ; i++){
                delay_ms(500);
            }
            output_low(PIN_B6); 
        }
El led queda encendido y a los 50" se apaga.

Con:
Código: [Seleccionar]
        if(input(PIN_B7) == 1){
            for (i=0; i<100 ; i++){
                output_toggle(PIN_B6);       
                delay_ms(500);
            }
            output_low(PIN_B6); 
        }
El led parpadea 50" y se apaga.

Desconectado genti

  • PIC10
  • *
  • Mensajes: 21
Re:contador atraves de pulsador no lo consigo desesperado pic c compiler
« Respuesta #7 en: 27 de Septiembre de 2021, 19:41:43 »
 :-/
Hola . Bueno he probado el codigo de Miguelyx , y por fin he visto la luz ahora lo hace a la perfeccion .Al pulsar el pulsador se mantiene encendido durante 50 seg. y luego se apaga . Es posible que al no tener implementado codigo antirrebote me estuviera jugando una mala pasada y me engañara todo el rato. He probado el codigo de Eduardo2 Y he de decir que funciona esa parte del codigo pero aveces no se me apaga se queda siempre encendio solo aveces y posiblemente por culpa del pulsador que he puesto .
Daros las gracias a todos y en especial Miguelyx  . Estare por estos lares aprendiendo de todos vosotros ...


 

anything