entrada PIC16F877a siempre verdadera

0

Estoy programando un PIC16F877a con 3 interruptores y un LCD de 20 x 4. Los 3 interruptores están soldados a los pines B0 - B2 en el PIC. El otro extremo de los interruptores está conectado a + 5v (PortsB tiene resistencias de extracción internas). Estoy programando usando CCS y el problema que he encontrado es que, por alguna razón, los puertos B0 - B2 siempre leen verdadero e ignoran los botones. El problema podría ser un problema de software, así que aquí está mi programa:

#include <16f877a.h>
#fuses XT,NOWDT,BROWNOUT,PUT,NOLVP
#use delay (crystal=4000000)

#include <Flex_LCD420.c>
#include <7segDisp.c>

#define btn_A PIN_B0
#define btn_B PIN_B1
#define btn_C PIN_B2

int i;
void main() {

   output_low(LCD_RW); 

   lcd_init();
   printf(lcd_putc, "\fPress Any Button");
   while(1){
      if(input(btn_A) == 0 || input(btn_B) == 1 || input(btn_C) == 1) {
         break;
      }
   }
   printf(lcd_putc, "\fChecking Btns..A");
   while(1){
      if(input(btn_A) == 1) {
         break;
      }
   }
   printf(lcd_putc, "\fChecking Btns..B");
   while(1){
      if(input(btn_B) == 1) {
         break;
      }
   }
      printf(lcd_putc, "\fChecking Btns..C");
   while(1){
      if(input(btn_C) == 1) {
         break;
      }
   }
   printf(lcd_putc, "\f\nEnd Check");
   while(1);
}

Necesito ayuda con urgencia ya que esto es para un proyecto que vence hoy.

Gracias de antemano.

    
pregunta Seif Shawkat

4 respuestas

3

Si está utilizando los pullups internos, simplemente puede conectar el otro lado de los interruptores a tierra en lugar de a + 5V e invertir su lógica de detección (es decir, 1 = no presionar, 0 = presionar)

Lospullupssonmuydébiles,porloqueactúancomounaresistenciadealtovalorconectadadesdeelpina+5VdentrodelPIC.
ComolomencionóArminb,lospullupsactualmentemantienensuspinesenunnivellógicoalto,porloqueelpinsiempredice1.

Ensucódigo,agregaríaunchequedereboteasusrutinasparaqueseaexhaustivo,comoenelprimer"Presione cualquier botón". Si presiona el botón A, el interruptor puede rebotar, el micro detectará más de una presión y ir a través de la segunda verificación "botón de verificación A" también.

Un interruptor mecánico generalmente "rebota" entre 1 y 0 unas cuantas veces antes de asentarse, por lo que el microcontrolador puede detectar más de una "presión" a menos que usted haga algo al respecto. Esto a menudo se resuelve en el software simplemente probando el botón, si se presiona, espere unos milisegundos y luego vuelva a verificarlo. Si aún se presiona, es válido.
Aquí hay un par de enlaces para anunciar tutoriales / código:
ejemplo de Arduino
12F675 example
Un montón de ejemplos en hackaday
Cambiar tutorial de rebote con varias soluciones

    
respondido por el Oli Glaser
2

El puerto B tiene controles internos, pero están desactivados en el encendido ( hoja de datos , p.46). No los habilitaste, entonces no están activos.

Incluso si fuesen, tendrías un problema: los pull-ups hacen que la entrada sea alta y al presionar un botón también se establece un nivel alto en la entrada. ¿Cuándo será bajo? Nunca. Tienes que conectar los botones a tierra, no Vcc. Y activar los pull-ups. Eliminación del bit RBPU en OPTION_REG < 7 > habilita todos los pull-ups en el puerto.

    
respondido por el stevenvh
0

Si presiona un botón, alimenta el pin de entrada apropiado con + 5V. Debido a las flexiones internas, el micorontroller quiere mantener la señal de + 5V en el pin de entrada. Eso significa que si suelta el botón, no hay una señal definida que alimente al pin. Es + 5V pero debería ser 0V (GND). La solución es conectar resistencias contra GND para cada botón. Las resistencias pueden ser ~ 100kOhm.

    
respondido por el arminb
0

Voy a asumir que has configurado TRIS, a menudo también necesitas configurar ANSEL para que cambie los pines a NO ser analógicos. Mientras se configuran como entradas analógicas, los pines siempre leerán un valor, independientemente del valor en el pin.

    
respondido por el Cobusve

Lea otras preguntas en las etiquetas