TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: loren en 30 de Mayo de 2006, 15:05:11
-
Hola, me gustaría saber como funcionan los señalizadores z,c, y dc. Aunque tengo una idea de como lo hacen quisera saber si hay algo por ahí, con ejemplos si es posible.
Gracias y saludos.
-
bueno loren los señalizadores son los elementos mas utilizados para indagar los resultados en las operaciones aritmeticas de un programa.
el señalizador z es usada para indagar si la oparacion es 0 .
el carri se activa si la operacion es negativa o positiva.
5-4 la oparacion es positiva y el carri es 1
4-5 la oparacion es negativa y el carri es 0
cuando hay un conteo de mas de 255 el carris se activa
-
Hola loren, como ha mencionado el amigo microcom los señalizadores sirven para verificar el resultado de las operaciones aritmeticas que suceden dentro del programa principal. Las instrucciones que afectan a estos bits del registro STATUS especificamente no tiene que ser aquellas que realicen una operacion aritmetica.
La imagen que pongo es la de Set de instrucciones allí aparecen las instrucciones y los bits que se afectan en el registro STATUS al usar estas (estan marcadas de amarillo).
Las instrucciones que afectan al bit C del registro STATUS son las siguentes:
ADDWF, ADDLW, SUBLW, SUBWF
Las que afectan el bit DC del registro STATUS son exactamente las mismas.
Saludos LabPIC :mrgreen:
-
Me podrias poner algún ejemplo de instrucción para el señalizador Z, que es el que me interesa saber utilizar, ya que quiero hacer un archivo que solamente cuando introduzca por la puerta A un número en binario y coincide con el acordado se pueda encender un led.
Gracias y saludos.
-
una manera de realizar esto es lo siguiente:
Esto es simplemente un ejemplo
PREGUNTAR btfss STATUS,Z;¿es 0 o no la operacion aritmetica?
goto PREGUNTAR;Si no es 0 el resultado de la operacion regresa a preguntar
movlw b'00000001';si es 0 entonces prende un bit del puerto B
movwf PORTB;
Claro que este es simplemente una parte que llevaría el programa y como mencione mas arriba esto es un simple ejemplo. Espero y te sea de ayuda. :)
Saludos LabPIC
-
De igual manera puedes hacer lo siguiente
PREGUNTAR btfsc STATUS,Z;
call ENC_LED; si es 0 la operación aritmetica llama rutina de encerder LED
goto PREGUNTAR; si no es 0 el resultado de la operacion aritmetica, PREGUNTAR
ENC_LED movlw b'00000001';
movwf PORTB;
Saludos LabPIC :mrgreen:
-
ee movf porta,0
xorlw b'0000'
btfsc status,z
goto ee
bsf portb,0 ;si el puertoa cambia de estado en cualquier pin se debe
;encender un led en rb0
-
Hola, tengo claro, como se activan los señalizadores, pero ahora quiero saber cuándo se desactivan, si lo hacen de una mera automática o hay que hacerlo manual, ya que veo que cuando hay un retorno de subrutina se bajan automaticamente.
Gracias y saludos.
-
Hola, tengo claro, como se activan los señalizadores, pero ahora quiero saber cuándo se desactivan, si lo hacen de una mera automática o hay que hacerlo manual, ya que veo que cuando hay un retorno de subrutina se bajan automaticamente.
Gracias y saludos.
Se hacen manualmente. Un retorno de subrutina no habilita los flags o señalizadores automáticamente.
En el código de una subrutina lo que se suele hacer es dos cosas, guardar el contexto (STATUS, WREG, PCLATH, FSR ) al ingresar a la subrutina y restaurarlo al salir. (Un vector de interrupción es también una subrutina y por eso se hace lo mismo).
Si los flags estaban 'bajos' antes de ingresar a la subrutina, pues seguirán estandolo al salir de ella. Al menos es así si uno programa de cierta forma organizada.
Si posteas un código de ejemplo donde quieras analizar su funcionamiento te invito a que lo hagas.
Saludos
-
Hola, cuando un señalizador se activa por acarreo, cuando hago un retorno con retlw, automaticamente veo que se vuelve a bajar, y se vuelve a cero. Una cosita, cuando la orden sublw, ¿El acarreo que se produce cuando pasa de cero a FF? Yo estoy utilizando un 16f84a, con la orden addlw el bit C se activa al pasar de FF a 00.
Gracias y saludos.
-
Hola.
La instruccion RETLW NO AFECTA NINGUN FLAG. Busca el datasheet del pic que estes usando, y fijate en la seccion Instruction Set Summary que veras cada instruccion detallada.
En el caso de la SUBLW o SUBWF:
El flag Z se pone en alto si la resta da como resultado cero.Si no se pone en bajo.
El flag C se pone en alto si la resta da mayor o igual a cero. Si no se pone en bajo.
En el caso de la ADDLW o ADDWF:
El flag Z se pone en alto si la suma da como resultado cero.Si no se pone en bajo.
El flag C se pone en alto si la suma da mayor a 0xFF. Si no se pone en bajo.
Saludos.
-
Hola, ya he hecho dos o tres programas utilizando los señalizadores y ya tengo claro de como funcionan y que registros les afecta, pero veo que los señalizadores también se baja automaticamente:
movf PUERTAA,W
addlw b'11110110'
al ser el valor de A en la primera instrucción cero el señalizador Z se activa, y en el momento de ejecutar la segunda instrucción automaticamente el señalizador Z vuelve a cero, lo estoy simulando con el Mplab. A esto es a lo que me refería al no ser el valor de W cero, automáticamente se vuelve a bajar el señalizador, por lo que según veo cuando deja de ser cero o uno, los señalizadores se bajan automaticamente.
Gracias y saludos.
-
Hola loren un saludo, solo para comentarte que de igual manera yo no limpio las banderas que se activan cuando sucede un evento que solicita interrupcion, a consideracion de las que especificamente el data sheet dice que debe de ser limpiado por software, y pues los programas que he realizado no he tenido algun problema.
Saludos LabPIC
-
Otra pistita:
movf PRUEBA,W ; Si la variable PRUEBA contiene 00h el simple hecho de moverla al acumulador te pondrá el flag Z a 1
btfss STATUS,Z
goto no_es_00
goto es_00