Вы находитесь на странице: 1из 7

2.5.2 Instrucciones de transferencia de datos.

El modelo de programacin de los microcontroladores consta del registro de trabajo W (Wornking Register), que hace la funcin de acumulador de los microcontroladores, y de los registros de la memoria de datos, ya sean de funciones especiales (SFR: Special Funtion Registers) o de propsito general (GPR: General Purpose Registers). Desde el punto de vista del programador, las caractersticas ms relevantes de instrucciones de los microcontroladores PIC de gama media son: Todas las instrucciones son del mismo tamao, es decir, 14 bits. La mayora de las instrucciones son ejecutadas en un solo ciclo de instruccin que dura cuatro periodos del oscilador principal del microcontrolador. Solo las instrucciones de salto toman dos ciclos, si se produce el salto. Tambin duran dos ciclos aquellas instrucciones que modifican el registro PCL. Cualquier registro del microcontrolador puede ser fuente o destino en operaciones de transferencia de datos, aritmticas o lgicas. Se puede acceder individualmente a cualquier bit de cualquier registro de la memoria de datos del microcontrolador. No es posible hacer transferencias de memoria a memoria en una nica instruccin; hay que usar el registro W como puente. No hay instrucciones para guardar o extraer datos en la pila (como PUSH y POP, instrucciones que son comunes en muchos microprocesadores). La pila solo almacena direcciones de instrucciones y con la pila operan solo las instrucciones de llamadas a subrutinas o retorno desde ellas. Transferencia de datos. Para estas instrucciones, cualquier registro del microcontrolador puede ser fuente o destino, pero no es posible hacer transferencias de memoria a memoria en una nica instruccin; hay que usar el registro W como fuente si el registro especificado es INDF, entonces se est utilizando direccionamiento indirecto y la operacin se realiza con el registro apuntado por el registro de funciones especiales FSR.

39

MOVF: El contenido del registro F se mueve al destino d. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f. Permite verificar el registro, puesto que afecta a Z. Ejemplo 1: MOVF PORTA,1 ; Al ejecutar la Instruccin, PORTA => PORTA. Ejemplo 2: MOVF PORTA,0 ; Al ejecutar la Instruccin, PORTA => W MOVWF: El contenido del registro W pasa al registro F. Ejemplo: MOVLW 0X01 ; Cargamos a W con 1. MOVWF PORTA ; Al ejecutar la Instruccin, W => PORTA. PORTA = 1 MOVLW: La literal k pasa al registro W. Ejemplo: MOVLW 0X01 ; Cargamos a W con 1. CLRF: El registro F se carga con 0X00. E l falg Z se activa. Ejemplo: CLRF PORTC CLRW: E l registro de trabajo W se carga con 0X00. El flag Z se activa. Ejemplo: CLRW ; al ejecutarse la instruccin W queda con el valor 0X00. SWAPF: Los 4 bits de ms peso y los 4 de menos son intercambiados. Si s es 0, el resultado se almacena en W, si d es 1 se almacena en F. Ejemplo 1: SWAPF PORTB,1 ; Al ejecutarse la instruccin cambiara los nibbles de 76543210 => 32107654; y claro el cambio de bits en este caso se guardara en PORTB. Ejemplo 2: SWAPF PORTB,0 ; Al ejecutarse la instruccin cambiara los nibbles de 76543210 => 32107654; y claro el cambio de bits en este caso se guardara en W.

Las instrucciones MOVF, CLRF Y CLRW afectan al indicador o bandera del cero (bit Z del registro STATUS), mientras que MOVWF, MOVLW y SAWPF no afectan a ninguna bandera. Todas las instrucciones de este grupo se ejecutan en un ciclo de instruccin. Obsrvese que MOVWF f copia el contenido del registro de trabajo W en registro f de la memoria de datos, sin alterar ningn indicar o bandera. En cambio, la instruccin MOVF f,0 realiza la operacin inversa, es decir, copia el contenido del registro f en el registro de trabajo, sin modificar el registro f.

40

2.5.3 Instrucciones de Operaciones Aritmticas y Lgicas

ADDWF: Suma el contenido del registro de w y el registro f, Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f. Afecta las banderas C, DC y Z. Ejemplo 1: MOVLW 0X01 ; Aqu estamos cargando a doble con el valor de 1. ADDWF PORTC,1 ; Al ejecutar la operacin, se sumara W+PORTC => PORTC Ejemplo 2: MOVLW 0X01 ADDWF PORTC,0 ; Al ejecutar la operacin, se sumara W+PORTC => W ADDLW: Suma el contenido del registro W y L, guardando el resultado en W. Afecta las banderas C, DC y Z. Ejemplo: MOVLW 0X01 ; Aqu estamos cargando a doble con el valor de 1. ADDLW 0X01 ; Al ejecutar la operacin, se sumara W + L => W ; En este caso el valor del registro al ejecuatrse la suma sera de 2.

41

SUDWF: Mediante el metodo del complemento a dos el contenido de W es restado al de F. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f. Afecta las banderas C, DC y Z. Ejemplo 1: MOVLW 0X01 SUBWF PORTC,1 ; Al ejecutar la operacin, se restara PORTC - W => PORTC ; En este caso el valor del registro F al ejecuatrse la resta sera de PORTC - 1. Ejemplo 2: MOVLW 0X01 SUBWF PORTC,0 ; Al ejecutar la operacin, se restara PORTC - W => W ; En este caso el valor del registro W al ejecuatrse la resta sera de W = PORTC - 1. SUDLW: Mediante el metodo del complemento a dos el contenido de W es restado al literal. El resultado se almacena en W. Afecta las banderas C, DC y Z. Ejemplo: MOVLW 0X01 SUBLW 0X01 ; Al ejecutar la operacin, se restara L - W => W ; En este caso el valor del registro W al ejecuatrse la resta sera de W = 1 1 = 0. Por lo tanto activara la bandera Z. INCF: Incrementa en 1el contenido de F. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en F. Solo afecta a la bandera Z. Ejemplo 1: INCF PORTA,1 ; Al ejecutar la Instruccin, PORTA + 1 => PORTA. Ejemplo 2: INCF PORTA,0 ; Al ejecutar la Instruccin, PORTA + 1 => W. DECF: Decrementa en 1 el contenido de F. Si d es 0, el resultado se alamcena en W, si d es 1 se almacena en F. Solo afecta a la bandera Z. Ejemplo 1: DECF PORTA,1 ; Al ejecutar la Instruccin, PORTA - 1 => PORTA. Ejemplo 2: DECF PORTA,0 ; Al ejecutar la Instruccin, PORTA - 1 => W. ANDWF: Realiza la operacin logica AND entre los registros W y F. Si d es 0, el resultado se alamcena en W, si d es 1 se almacena en F. Solo afecta a la bandera Z. Ejemplo 1: MOVLW 0X0F ; Se alamcena en doble el valor de 15 en decimal. ANDWF PORTA,1 ; Al ejecutar la Instruccin, W AND PORTA => PORTA. Ejemplo 2: MOVLW 0X0F ; Se alamcena en doble el valor de 15 en decimal. ANDWF PORTA,0 ; Al ejecutar la Instruccin, W AND PORTA => W. ANDLW: Realiza la operacin logica AND entre el contenido del registro W y k L, guardando el resultado en W. Solo afecta a la bandera Z. Ejemplo: MOVLW 0X0F ; Se alamcena en doble el valor de 15 en decimal. ANDLW 0x01 ; Al ejecutar la Instruccin, W AND k => W. W = 1 IORWF: Realiza la opracion logica OR entre los registros W y F. Si d es 0, el resultado se alamcena en W, si d es 1 se almacena en F. Solo afecta a la bandera Z.

42

Ejemplo 1: MOVLW IORWF Ejemplo 2: MOVLW IORDWF

0X0F PORTA,1 0X0F PORTA,0

; Se alamcena en doble el valor de 15 en decimal. ; Al ejecutar la Instruccin, W OR PORTA => PORTA. ; Se alamcena en doble el valor de 15 en decimal. ; Al ejecutar la Instruccin, W OR PORTA => W

IORLW: Realiza la operacin logica OR entre el contenido del registro W y k L, guardando el resultado en W. Solo afecta a la bandera Z. Ejemplo: MOVLW 0X0F ; Se alamcena en doble el valor de 15 en decimal. IORLW 0x01 ; Al ejecutar la Instruccin, W OR k => W. W= 0X0F XORWF: Realiza la opracion logica XOR entre los registros W y F. Si d es 0, el resultado se alamcena en W, si d es 1 se almacena en F. Solo afecta a la bandera Z. Ejemplo 1: MOVLW 0X0F ; Se alamcena en doble el valor de 15 en decimal. XORWF PORTA,1 ; Al ejecutar la Instruccin, W XOR PORTA => PORTA. Ejemplo 2: MOVLW 0X0F ; Se alamcena en doble el valor de 15 en decimal. XORWF PORTA,0 ; Al ejecutar la Instruccin, W XOR PORTA => W XORLW: Realiza la operacin logica XOR entre el contenido del registro W y k L, guardando el resultado en W. Solo afecta a la bandera Z. Ejemplo: MOVLW 0X0F ; Se alamcena en doble el valor de 15 en decimal. XORLW 0x01 ; Al ejecutar la Instruccin, W XOR k => W. W= 0X0E COMF: El registro F es complementado. Es lo mismo como la operacin logica not. El flag Z se activa si el resultado es 0. Si d es 0, el resultado se alamcena en W, si d es 1 se almacena en F. Solo afecta a la bandera Z. Ejemplo 1: COMF PORTA,1 ; Al ejecutar la Instruccin, COM(PORTA) => PORTA. Ejemplo 2: COMF PORTA,0 ; Al ejecutar la Instruccin, COM(PORTA) => W RLF: El contenido de F se rota a la izquierda. El bit de mayor peso de F pasa al carry (C), y el carry se coloca en el menor peso . Si d es 0, el resultado se alamcena en W, si d es 1 se almacena en F. Solo afecta a la bandera C. RRF: El contenido de F se rota a la derecha. El bit de menor peso de F pasa al carry (C), y el carry se coloca en el mayor peso.. Si d es 0, el resultado se alamcena en W, si d es 1 se almacena en F. Solo afecta a la bandera C.

43

2.5.4 Instrucciones de Transferencia de control


Las instrucciones de transferencia de control incluyen los saltos incondicionados y condicionados al estado de un bit de un registro, y las llamadas a subrutinas y retornos.

GOTO: Se trata de un salto incondicional. La parte baja de k se carga en PCL, y la parte alta en PCLATCH. Ocupa os ciclos de reloj. Ejemplo: GOTO INICIO ; se puede poner esta instruccin al final del programa para volver al principio del mismo para volverlo a ejecutar. BTFSC: Si el bit b del registro F es 0, se salta una instruccin y se continua con la ejecucin. En caso de salto, ocupara dos ciclos de reloj. Ejemplo: BTFSC PORTA,0 ; Preguntamos si el bit 0 del PORTA tiene un 0. GOTO UNO ; Si no es 0 el bit 0 del PORTA, ejecutara normalmente. GOTO CERO ; Si es 0 saltara la instruccin anterior y ejecutara esta y ; continuar. BTFSS: Si el bit b del registro F es 1, se salta una instruccin y se continua con la ejecucin. En caso de salto, ocupara dos ciclos de reloj. Ejemplo: BTFSC PORTA,0 ; Preguntamos si el bit 0 del PORTA tiene un 1. GOTO CERO ; Si no es 1 el bit 0 del PORTA, ejecutara normalmente. GOTO UNO ; Si es 1 saltara la instruccin anterior y ejecutara esta y ; continuar.

44

INCFSZ: Incrementa el contenido del registro F. Si d es 0, el resultad se almacena en W, si d es 1 se almacena en F. Si el incremento es 0 salta la siguiente instruccin, en cuyo caso costara 2 ciclos. Ejemplo: INCFSZ PORTC,1 ; Se incrementa el PORTC y se guarda ah mismo. GOTO $-1 ;Hace que retroceda una instruccin. GOTO INICIO ;Hasta el incremento llegue a 255 se ejecutara. DECFSZ: Decrementa el contenido del registro F. Si d es 0, el resultad se almacena en W, si d es 1 se almacena en F. Si la resta es 0 salta la siguiente instruccin, en cuyo caso costara 2 ciclos. Ejemplo: DECFSZ PORTC,1 ;Se decremento el PORTC y se guarda ah mismo. GOTO $-1 ;Hace que retroceda una instruccin. GOTO INICIO ;Hasta el decremento llegue a 255 se ejecutara. CALL: Salto a una subrutina. La parte baja de k se carga en PCL, y la parte alta en PCLATCH. Ocupa 2 ciclos de reloj. Ejemplo: programa CALL SUMA programa SUMA: ADDWF PORTA,0 programa RETURN: El PC se carga con el contenido de la cima de la pila (TOS): direccin de retorno. Consume 2 ciclos. Ejemplo: programa CALL SUMA programa SUMA: ADDWF PORTA,0 RETURN programa RETFIE: El PC se carga con el contenido de la cima de la pila (TOS): direccin de retorno. Consume 2 ciclos. Las interrupciones vuelven a ser habilitadas. RETLW: El registro W se carga con la constante k. El PC se carga con el contenido de la cima de la pila (TOS): direccin de retorno. Consume 2 ciclos. El ejemplo los veremos cuando realicemos tablas.

45

Вам также может понравиться