Autor Tema: Falsa lectura de pulsaores  (Leído 654 veces)

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

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Falsa lectura de pulsaores
« en: 01 de Diciembre de 2022, 07:05:57 »
Hola amigos, tengo un problema con un código que no me lee bien unos interruptores.
El código es el siguiente:

void leer_seleccion(){
   bool codigo1=digitalRead(codigo_1);
   bool codigo2=digitalRead(codigo_2);
   bool codigo3=digitalRead(codigo_3);
   bool codigo4=digitalRead(codigo_4);
    if (codigo1 == 1 | codigo2 == 1 | codigo3 == 1 | codigo4 == 1){
       delay(1000); 
    }
   valor_seleccion = 0;
   codigo1=0;
   codigo2=0;
   codigo3=0;
   codigo4=0;
   codigo1=digitalRead(codigo_1);
   codigo2=digitalRead(codigo_2);
   codigo3=digitalRead(codigo_3);
   codigo4=digitalRead(codigo_4);
   valor_seleccion = (codigo1*1) + (codigo2*2) + (codigo3*4) + (codigo4*8);
  }

La función es que se leer el estado de 4 interruptores, si alguno se encuentra cerrado se espera 1 segundo y se realiza una nueva lectura.
Bien cuando se cierran los interruptores después del segundo siempre la lectura es correcta, pero si se abre alguno de ellos,  después  de estar cerrado en la segunda lectura salen numero aleatorios, pero siempre el mismo dependiendo de que interruptor se abra.

Me podríais ayudar diciendo que pasa.
la lectura se realiza en un LCD y esta siempre es correcta salvo al abrir los interruptores.
¿Creéis que puede ser un efecto e rebotes? ¿Con un segundo despues en la segunda lectura nos¡ se deberia de haber evitado?
Gracias de antemano
Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re:Falsa lectura de pulsaores
« Respuesta #1 en: 01 de Diciembre de 2022, 08:07:15 »
¿ Puede ser porque la variable valor_seleccion no tenga definido su tipo?

F.
Todos los días se aprende algo nuevo.

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Falsa lectura de pulsaores
« Respuesta #2 en: 01 de Diciembre de 2022, 10:23:32 »
¿ Puede ser porque la variable valor_seleccion no tenga definido su tipo?

Probablemente, pero debería haber dado un mensaje de error, al menos un warning. 
Aunque si mal no recuerdo Arduino no tiene activados todos los warnings.
Eso si, a valor_seleccion declarala como volatile char.

A mi personalmente no me gusta usar digital_read cuando se quiere leer varios bits a la vez , prefiero que estén consecutivos en un puerto y leerlo completo.
Por ejemplo, si codigo_1,..,4  fuesen PD4,PD5,PD6 y PD7 esto se reduciría a:

Código: [Seleccionar]
void leer_seleccion(void){

    if(PIND>>4) _delay_ms(1000);
       
    valor_seleccion = PIND>>4 ;
}

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re:Falsa lectura de pulsaores
« Respuesta #3 en: 01 de Diciembre de 2022, 11:26:30 »
Gracias por la respuesta.
Al final lo solucione.
El problema radicaba en que no borraba el LCD antes de escribir el nuevo valor. Por eso si la cifra escrita era de 2 cifras al volver a escribir un valor nuevo si el valor era de una cifra, esta se escribe bien, pero se quedaba la segunda cifra con el valor anterior.

F.
Todos los días se aprende algo nuevo.