Yo lo plantearia asi:Código: ASM
Principal: BTFSS PushAumento CALL Incrementar BTFSS PushDecremento CALL Decrementar CALL Muestro GOTO Principal Incrementar ;Mientras no suelte, me quedo aca atrapado, asi no cuenta muchas veces call Retardo_10ms BTFSS PushAumento GOTO Incrementar ; Incremento INCF Incremento, F ; Verifico que no me pase, si me pase lo vuelvo a 9, sino dejo el numero como esta MOVLW d'10' SUBWF Incremento, W BTFSS STATUS, Z RETURN MOVLW d'9' MOVWF Incremento RETURN Muestro MOVWF Incremento, W CALL TABLADisplayA MOVWF PORTB; RETURN Decrementar call Retardo_10ms BTFSS PushDecremento GOTO Decrementar ; Decremento DECF Incremento, F ; Reviso que no me pase, si me pase el resultado es 0xFF COMF Incremento, W BTFSC STATUS, Z CLRF Incremento RETURN Borrar clrf Incremento return TABLADisplayA subwf PCL,F retlw b'00111111'; 0 retlw b'00000110'; 1 retlw b'01011011'; 2 retlw b'01001111'; 3 retlw b'01100110'; 4 retlw b'01101101'; 5 retlw b'01111101'; 6 retlw b'00000111'; 7 retlw b'01111111'; 8 retlw b'01100111'; 9
Observa el loop Principal, leo los botones y actuo sobre incremento. Luego Cambio el display.
Esto me permite que en la rutina del boton de incremento. Poner un bloqueo para que no me cuente muchas veces el mismo boton. Y es ahi donde me aseguro que no se pase.
Lo mismo hago con el decremetno.
Finalmente la tabla es de 10 elementos..
PD: No lo probe, solamente lo escribi en el block de notas, asi que puede tener errores, pero te da una idea.
por ejemplo en "Decrementar" pusiste la instruccion COMf, por lo que he visto eso sirve basicamente para poner el complemento bit a bit, pero exactamente que funcion me otorga esa instruccion en este caso?,
tambien en la tabla del display en vez de pusiste addwf decidiste poner un subwf, por que ?
tambien en Incrementar , luego de que incrementas lo restas con 10 para la comprobacion, pero, si hago eso siempre se me va a quedar en el mismo digito no?
porque siento que por no poner la resistencia pull up puede ser que me este ocurriendo un error
Te respondo por partes:Citarpor ejemplo en "Decrementar" pusiste la instruccion COMf, por lo que he visto eso sirve basicamente para poner el complemento bit a bit, pero exactamente que funcion me otorga esa instruccion en este caso?,
Tu tabla tiene 10 entradas, es decir de 0 a 9.
Usamos el registro Incremento para guardar ese offset, el problema es que yo tengo que cuidarme de no salirme de los numeros 0 a 9,
Y aca la pregunta es.... ¿Que pasa si mi registro era 0 y yo decremente en 1?
El registro pasa a tener el valor 0xFF ( 255 ) Y eso es algo que mi tabla NO llega. Por lo que quiero detectar cuando es que esto ocurre.
Al hacer un complemento bit a bit, el 0xFF ( 0b1111 1111) queda como 0b0000 0000, Es el unico caso en que ocurre.
Esto quiere decir que si era 0xFF, le hago el complemento, la bandera Z se activaria. De esa forma DETECTO ese problema y lo vuelvo a 0 que es un valor valido de mi tabla.
PD: Podria haber usado un IORLW 0xFF, un SUBLW 0xFF, etc para lograr este cometido, use el COMF por que parecio mas sencillo.Citartambien en la tabla del display en vez de pusiste addwf decidiste poner un subwf, por que ?
En realidad es un error, es ADDWF, yo copie tu codigo y lo modifique, y esa parte yo no la habia tocado, observa que en el codigo que VOS colgaste tenes un SUBWF, pero es ADDWF.Citartambien en Incrementar , luego de que incrementas lo restas con 10 para la comprobacion, pero, si hago eso siempre se me va a quedar en el mismo digito no?
De la misma forma que antes, si yo incremento y estaba en 9, va a quedar con el valor 10, que es un valor que NO corresponde a mi tabla, por eso observo que si llego a 10 lo vuelvo a dejar en 9. De esa forma nunca me voy a pasar.
PD: Use el SUBWF, pero podria haber usado el IORLW 0xA (10 decimal) para hacer exactamente lo mismo.
Asi como lo plantee si presionas el incrementar comenzando desde cero verias esto:
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 9 -> 9 -> 9 -> 9
Si presionas decrementar muchas veces verias esto (Supongo que comienzo desde 5):
5 -> 4 -> 3 -> 2 -> 1 -> 0 -> 0 -> 0 -> 0
Es decir va hacia arriba y abajo, pero no supera esos valores, no es que de 0 pasa a 9.
Si quisieras que haga ese rollback, entonces deberias cambiar los limites. Es decir:
- En Decrementar, donde detecte el 0xFF, en ves de ponerlo en 0, que lo ponga en 9
- En Incrementar, donde detecta el 10 decimal, en ves de ponerlo en 9, que lo ponga en 0.
Y solamente modificando esos limites cambias el funcionamiento.
Para ser correcto, comparar con igualdades es suficiente. Pero si uno quisiera estar TOTALMENTE seguro, entonces deberia comparar en ambos casos por numeros mayores a nueve. Si es 255 se cumpliria, y si se pasa de 9 y es 10, tambien se cumpliria.Citarporque siento que por no poner la resistencia pull up puede ser que me este ocurriendo un error
El programa espera un pulso BAJO como para indicar que se presionó. Respecto a las conexiones de tu imagen:
Si seguis con esa logica (la de la imagen) en realidad lo que te faltaria es una resistencia de PULL-DOWN, es decir cuando no este presionado estaria en 0 y al presionar le estarias dando VCC al pin es decir (1).
Si cambias la logica, es decir el boton a GND, Deberias tener una resistencia de PULL_UP, es decir ahora si la resistencia a VCC, mientras no este presionado estaría en 1, y al presionar iría a 0