16f84a cambio de entradas

Buenas! soy nuevo en este mundo, la verdad es que no tengo ni zorra y tengo una duda que me esta volviendo loco y seguramente sera la mayor chorrada del mundo, pero bueno os la explico.

Tengo 4 entradas y 4 salidas en el puerto B y una entrada y otra salida en el puerto A para la comunicacion por puerto serie. De RB0-RB3 son entradas y el resto las salidas. El programa lo que tiene que hacer es detecar un cambio de interruptores de entrada y al detectarlo enviar los estados de esas interruptores por puerto serie. El ordenador las interpretara y devolvera una secuencia de 8 bits que sera la instruccion de salida. Esta información despues la quiero poner en el puerto B. El problema que tengo es que simulando el codigo en mplab funciona bien pero al probarlo no funciona el detector de cambio de entradas y siempre esta enviando datos no se queda en el bucle. El codigo es el sigiente:


Código:
main:
	bsf	STATUS, RP0	
	bcf	tx_port, tx_pin ; Pin T como salida
	movlw b'00001111'
	movwf TRISB
	bcf	STATUS, RP0
	clrf AUX
	bsf PORTA,tx_pin ;a 1 para la salida de puerto serie
	
loop: movf PORTB,W		;quiero esperar asta que cambien
	  subwf AUX,W		;las entradas y cuando cambien
	  btfsc STATUS,2	;acer el salto para enviarlas por puerto serie
	  goto loop
	  movf PORTB,W
	  call send_b		;enviamos los 8bits de W
	  call recv_b		;espera hasta recivir un dato y lo guarda en W
	  movwf PORTB	
	  movf PORTB,0
	  movwf AUX
	  goto loop
	  end

Por ejemplo, si tengo las 4 entradas a cero se queda en en bucle. RB0 se pone a uno, sale del bucle y envia 00000001. El pc interpreta y devuelve por ejemplo 10110000. Estos datos se guardan en W y los muevo al puerto B ya que los primeros 4 bit son d salida.
 
acuerdate que en la vida real los interruptores mecanicos te generan una señal inestable al momento en que los oprimes; necesitas un subprograma de retardo para limpiar la señal o en su caso por hardware

dbounce4.gif
 
Lo mejor será que modifiques el código para que envíe el dato cuando el interruptor sea presionado y SOLTADO, ya que debido a la frecuencia del procesador tendras resultados erroneos si lo mantienes presionado mas de 10ms.
 
Atrás
Arriba