TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: elmasvital en 18 de Febrero de 2008, 23:04:47
-
Me he vuelto loco buscando un error en una rutina de un libro de microcontroladores y cuando reviso me doy cuenta de lo siguiente
incf MensajeL,F ; Apunta a la posición del siguiente carácter
btfss STATUS,C ;Si hay acarreo al incrementar MensajeL es por
incf PCLATH ;haber cambiado de página por lo que hay que sumar 1 al PCLATH
ok la rutina desea que si por ejemplo MesajeL es FF y al incrementarla pasa a ser 00, osea que se desborda pues incremente
el PCLATH....
ok estupendo... pero es que el desborde de MesajeL mediante un incf o mediante un decf no afecta al carry ni al DC....
estoy en lo cierto verdad???
tendria que usar addwf o subwf para esto no?
1 saludo
-
Sip Jose Antonio. Efectivamente. las instrucciones incf y decf no afectan el flag C. Pareceria ser un error, aunque si el codigo es bueno, puede que haya usado incf y decf precisamente para no afectar el estado del flag C y poder conservar el resultado de una operacion anterior....
Saludos!
-
Buah... a ver si me ayudais...
como se restaria 1 a un registro y se comprueba que el registro no se has desbordado??
movfw MensajeAnteriorL
sublw 0x01 ;Decrementamos una posición para buscar el 0x00 de la opción anterior
movwf MensajeAnteriorL
btfsc STATUS,C ;Si menajeanteiorL es 00 decrementamos mensajeanteiorh
esto no funciona... he estado mirando en el datasheet y sublw sustrae el literal a w pero claro en complemento a 2... cómo seria el nº 1 en complemento a 2?
PD: Manda cojones la que hay que liar... :-(
1 saludo.
-
Para hallar el complemento a dos de un numero puedes hacer esto:
movlw 0x01
sublw 0 , estos es 0 -(W) = -W alli tienes el complemento a dos del numero sino mal recuerdo
-
otra cosita deberias hacer btfss stratus,z para chequear si el numero llego a cero :mrgreen:
-
Por ejemplo podrias:
movlw .1
subwf MensajeAnteriorL,F
btfss STATUS,C ;si el resultado de la resta es mayor o igual a cero, C vale 1. Sino C vale 0.
goto Desborda
;no desborda
-
Comprobando mediante Z...
decf MensajeAnteriorL,F
movf MensajeAnteriorL,W
xorlw 0xFF
btfsc STATUS,Z
goto Desborda
;no desborda
-
Comprobando mediante Z alternativa 1:
decf MensajeAnteriorL,F
incf MensajeAnteriorL,W
btfsc STATUS,Z
goto Desborda
;no desborda
Esa lleva una linea menos..Bueno, podria estar toda la noche! Que te sirva Jose! ;)
-
gracias bruno estaba algo ofuscado... la verdad
finalmente me quedo con esta
movlw 0x01
subwf MensajeAnteriorL,f
-
Una cosita a tener en cuenta cuando realizamos operaciones de resta si el resultado da >=0 el flag C = 1, si el resultado es negativo C = 0
Ojo con esto tambien
-
De nada Jose! Cuando quieras...
Una cosita a tener en cuenta cuando realizamos operaciones de resta si el resultado da >=0 el flag C = 1, si el resultado es negativo C = 0
Ojo con esto tambien
btfss STATUS,C ;si el resultado de la resta es mayor o igual a cero, C vale 1. Sino C vale 0.
;)
-
Te diste cuenta :mrgreen:
-
8) Perdon pero volviendo al tema INCF y DECF y el ejemplo:
"incf MensajeL,F ; Apunta a la posición del siguiente carácter
btfss STATUS,C ;Si hay acarreo al incrementar MensajeL es por
incf PCLATH ;haber cambiado de página por lo que hay que sumar 1 al PCLATH"
el unico bit que cambia cuando se desborda "MensajeL" ejecutando INCF es el Z de STATUS al cual se deberia consultar para incrementar PCLATH. Un abrazo. Bandus.