Bueno, pues ya está efectuado el cambio en todo el código.
Ahora, según vuestras indicaciones, tengo un bucle principal, donde testeo la pulsación de los botones, y una ISR activada por desbordamiento del timer, encargada de visualizar los displays.
Parece que todo funciona bien, salvo unas excepciones que me están volviendo loco.
Los marcadores se muestran correctamente, y 7 botones funcionan bien, otros 7 no funcionan.
El bucle principal del programa es el siguiente:
polling
btfsc BANDERAS,F_PARTIDA_REINICIAR
goto INICIO_2 ; Si se tiene la orden de reiniciar, salta del bucle principal
MOVF PORTB,W ; Lee el valor del botón pulsado (a través de RB4-7)
andlw b'11110000' ; Del puerto B se queda solamente con el nibble alto (rb4-7)
sublw b'00000000' ; y se comprueba que no haya ningun boton pulsado
btfsc STATUS,2 ; (¿rb4-7=0?)
goto fin_polling ; sí, no hay boton pulsado, sigue testeando
call Retardo_10ms ; no, espera a que es estabilice y...
MOVF PORTB,W ; Vuelve a leer el puerto para leer el valor estabilizado
movwf BTN_PRES ; Lo almacena en una variable
andlw b'11110000' ; Del puerto B se queda solamente con el nibble alto (rb4-7)
sublw b'00000000' ; y se comprueba que no sea un rebote
btfsc STATUS,2 ; si lo es...
goto fin_polling ; sigue testeando
call ejecuta ; si no es rebote efectua los calculos
call convierte_bcd
EsperaDejePulsar
MOVF PORTB,W ; Mientras el boton está pulsado continua en un bucle leyendo el puerto
andlw b'11110000' ; hasta que sea soltado
sublw b'00000000'
btfss STATUS,2
goto EsperaDejePulsar
fin_polling goto polling
La rutina de la ISR, como he dicho antes, visualiza alternativamente cada display (cada 500us). y la subrutina "ejecuta", hace los calculos de suma dependiendo de qué boton de los 14 existentes se haya pulsado.
Cada botón suma un valor determinado, los 7 primeros suman bien, pero los últimos 7 no lo hacen.
Después de devanarme mucho los sesos, pienso que quizá sea un problema 'hardware':
Como no tengo un pin de un puerto para indicar la pulsación de un botón, sino que son 4 pines a la vez, tengo que comprobar con comparacion de palabras enteras y quizá esto sea un problema porque no todos los bits estén a la vez. Esto es así por el encoder que utilizo y que he comentado anteriormente, lo que ocurre, es que el encoder, no es de 16 entradas y 4 salidas (sino que son dos 74ls148 de 8 entradas y 3 salidas, colocados encadenados en cascada), y quizá se deba a un comportamiento relativo a los tiempos en los que tarda el acarreo en llegar al cuarto bit de la salida que conforman los 2 enconder unidos. Pienso esto, porque curiosamente, los botones que no funcionan, son los que tienen ese cuarto bit a 1.
1XXX no suman nada (si los pulso rápidamente repetidas veces, alguna vez sí suman el valor correcto, pero 1 de cada 30...)
0XXX sí suman bien siempre.
(el diseño electrónico funciona porque con la versión anterior del programa (con RBIE) , sumaba los 14 valores correctamente. pero estaba el problema del rebote. Y como he comentado antes, si pulso repetidas veces, tb suma correctamente el valor del botón pulsado.
¿Puede ser? ¿y como puedo solventarlo? sino, ¿a alguien se le ocurre qué otra cosa puede estar pasando?
gracias de nuevo.