TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: bluesboy en 16 de Abril de 2013, 21:28:55

Título: Restar en assembler
Publicado por: bluesboy en 16 de Abril de 2013, 21:28:55
buenas gente, estoy usando el ejemplo del tutorial de Suky para contar cosas, tengo 4 displays de 7 segmentos y no puedo usar LCD.
Mi programa tiene que restar de a uno si se lo indico mediante una llave, pero no logro hacerlo evidentemente porque no se.
Supongamos que tengo un 0 en unidades y un 1 en decenas, le estoy diciendo que cuando decremente la unidad, la pase a 9 y decremente la decena, para eso pregunto si el bit DC de status se pone a uno cuando a 0 le resto 1, y no funca, cada vez que resto me pone a 1 ese bit y se desncadena un error.
Para hacerlo mas fácil, si alguien me puede orientar en como hacer una resta en assembler, en especial restarle 1 a 0 y que pasa con los flags, se lo voy a agradecer.
Muchas gracias por el tiempo.
Sebastián.
Título: Re: Restar en assembler
Publicado por: sander en 16 de Abril de 2013, 21:59:45
Saludos bluesboy, la resta en los PIC  tiene la siguiente secuencia para la instruccion subwf :

dest = File + (WREG^0xFF) + 1

Es decir que usa el metodo de complemento a 2,  esto quiere decir que cuando el resultado de la resta es positivo, es decir, F >= WREG,  el bit C se pone en 1, y cuando el resultado de la resta es negativo el bit C se coloca 0.

En el caso del bit DC se debe tomar en cuenta el nible bajo del registro F y de WREG, es decir, si F<3:0>  >= WREG<3:0> el bit DC se pone en 1.

Si solo necesitas restar en uno puedes usar la instruccion decf , o decfsz . decf decrementa el registro en uno y  decfsz decrementa  y  salta la siguiente instruccion si se llego a cero.

Saludos
Título: Re: Restar en assembler
Publicado por: bluesboy en 16 de Abril de 2013, 22:07:38
¡Gracias Sander! Me estoy quemando la cabeza hace 2 días con esto.
Entonces, si a 0 le resto 1 , ¿el flag C=0?
Gracias.
Título: Re: Restar en assembler
Publicado por: sander en 16 de Abril de 2013, 22:10:42
¡Gracias Sander! Me estoy quemando la cabeza hace 2 días con esto.
Entonces, si a 0 le resto 1 , ¿el flag C=0?
Gracias.

resumiendo.............  Si   :lol:

Cuando estuve aprendiendo ensamblador lei  en algun libro que el comportamiento de los flags en otros procesadores es distinto, y que eso siempre causaba confusion.

suerte con tu proyecto

Saludos