Noticias:

Grupo en telegram, del foro de meteorología fácil: https://t.me/meteorologiafacil

Para mas detalles, puedes visitar el siguiente tema http://www.meteorologiafacil.com.ar/foros/index.php?topic=1608.0

Espero que les sea de mucha utilidad.

Menú Principal

ASM desde 0

Iniciado por David Met, Mayo 26, 2011, 10:07:29 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

David Met

RLF

Rota hacia la izquierda los bit de un registro seleccionado por el programador. El destino de la operación se puede elegir. Cada rotación equivale a multiplicar por 2 si el bit C del registro STATUS es 0.

Ejemplo:


              RLF         PORTC,F


Si antes de la instrucción PORTC vale B'00001000', después de la instrucción vale B'00010000'. Si se hubiera elegido como destino W, PORTC después de la instrucción continua valiendo B'00001000' y W vale B'00010000'

Para recordar Rotate es rotar Left es izquierda File es el registro.

Afecta a:


  • C se pone a 1 si hubo acarreo

RRF

Rota hacia la derecha los bits de un registro seleccionado por el programador. El destino de la operación se puede elegir. Cada rotación equivale a dividir por 2 si el bit C del registro STATUS es 0.

Ejemplo


             RRF         PORTB,F


Si antes de la instrucción PORTB vale B'10000000' después de la instrucción PORTB vale B'0100000'. Si se hubiera elegido como destino W, PORTB después de la instrucción continua valiendo B'10000000' y W vale B'01000000'

Para recordar Rotate es rotar Right es derecha File es el registro.

Afecta a:


  • C se pone a 1 si hubo acarreo

Extendiendo la explicación de las instrucciones RRF y RLF

A la hora de utilizar estas dos instrucciones, hay que prestarle atención al bit C del registro STATUS. La razón de esto, es porque la rotación se hace atravéz del bit C.

Supongamos que tenemos lo siguiente:


  • BIT C = 0
  • TEMP = B'00010000'

Ejecutamos la instrucción RRF y TEMP vale B'00001000'. O si ejecutamos la instrucción RLF TEMP vale B'00100000'

Pero si ahora tenemos:


  • BIT C = 1
  • TEMP = B'00010000'

Ejecutamos la instrucción RRF y TEMP vale B'10001000'. O si ejecutamos la instrucción RLF TEMP vale B'00100001'

Vemos como rota los bit dependiendo del valor del bit C. Pero anteriormente, avíamos dicho que estas dos instrucciones afectan al bit C. La actualización del bit C, lo hace después de la rotación. Lo vemos con un ejemplo:


           MOVLW  B'10001001'
           MOVWF  temp
           BCF   STATUS,C        ;PONEMOS A 0 AL BIT C
           RLF   temp,F          ;ROTAMOS A LA IZQUIERDA
           


Al ejecutar este programa, nos dará lo siguientes resultados:


  • TEMP = B'00010010'
  • BIT C = 1

Y para ver la diferencia vemos lo siguiente:


           MOVLW  B'00000001'
           MOVWF  temp
           BCF   STATUS,C        ;PONEMOS A 0 AL BIT C
           RLF   temp,F          ;ROTAMOS A LA IZQUIERDA
           


Al ejecutar este programa, nos dará lo siguientes resultados:


  • TEMP = B'00000010'
  • BIT C = 0

Algo que me había olvidado de mencionar pero que MIGSANTIAGO del foro de TODOPIC estuvo atento es que estás dos instrucciones, nos sirve para enviar datos en forma serial utilizando el bit C que lo veremos más adelante.

Recordemos que, para utilizar estas instrucciones para multiplicar o dividir, debemos asegurarnos de que el bit C, esté en 0.

SLEEP

Pone al microcontrolador en bajo consumo.


              SLEEP


Para recordar SLEEP es dormir.

Afecta a:


  • TD se pone a 1
  • PD se pone a 1

SUBLW

Resta el contenido de W con un literal de hasta 8 bit (.255). El resultado se guarda en W.


              SUBLW       .20


Si antes de la instrucción W vale .23 después de la instrucción W vale .3 Para saber si el resultado es negativo o positivo, hay que chequear el bit C del registro Status. Si hay acarreo, el resultado es negativo, y por el contrario, si no hay acarreo es positivo.

Para recordar SUBtraction es restar Literal es literal y W es el registro W.

Afecta a:


  • Z se pone a 1 si el resultado es 0
  • DC se pone a 0 si hay acarreo del bit del 4 al 5 bit del registro (recordemos que en la resta, es distinto a la suma, por eso, se pone a 0 si hubo acarreo).
  • C se pone a 0 si hubo acarreo (recordemos que en la resta, es distinto a la suma, por eso, se pone a 0 si hubo acarreo).
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

SUBWF

Resta el contenido de un registro seleccionado por el programador con el contenido del registro W. La fórmula es F - W = d. d es la dirección elegida por el programador en dónde se guardará el resultado que puede ser el registro W o el registro elegido por el programador.

Ejemplo:


           SUBWF        MINUENDO,W


Si antes de la instrucción W vale .55 y MINUENDO vale .56, después de la instrucción, MINUENDO vale .56 y W vale .1

Para recordar SUBtraction es resta W es el registro W y File es el registro elegido.

Afecta a:


  • Z se pone a 1 si el resultado es 0
  • DC se pone a 0 si hubo un acarreo del 4 bit al 5 bit (recordemos que en la resta, es distinto a la suma, por eso, se pone a 0 si hubo acarreo).
  • C se pone a 0 si hubo acarreo del 7 bit. (recordemos que en la resta, es distinto a la suma, por eso, se pone a 0 si hubo acarreo).

SWAPF

Intercambia los bits de un mismo registro elegido por el programador. Los 4 bit de menor peso, pasan a ser lo 4 bits de mayor peso, y los 4 bits de mayor peso, pasan a ser los 4 bits de menor peso. El destino puede ser seleccionado.

Cabe pensar que puede ser una instrucción de muy poco uso, pero todo lo contrario si se utilizan con las interrupciones. Microchips recomienda su utilización a la hora de salvar el contexto y restaurarlo en una interrupción ya que no modifica el registro STATUS. Cuando trabajemos con la interrupciones, se verá que es muy recomendable salvar el registro STATUS y W en la RAM para luego restaurarlos. Si utilizamos la instrucción MOVF, es afectado el bit Z, perdiendo su estado original en el momento de la interrupción. Esto se soluciona, utilizando la instrucción SWAPF. No se preocupen si no lo entiende por ahora. Lo entenderan cuando veamos ejemplo de interrupciones.

Ejemplo:

Citar
              SWAPF         STATUS,W

Si antes de la instrucción W bale H'55' y el registro STATUS vale B'00100100', después de la instrucción el registro STATUS vale H'24' y el registro W vale B'01000010'

Para recordar SWAP es intercambiar NIBBLE es porción File es el registro.

No afecta ningún bit del registro STATUS.

XORLW

Realiza la operación lógica XOR entre un literal o valor y el registro W. El resultado queda guardado en el registro W.

Ejemplo:


               XORLW        B'11000101'


Si antes de la instrucción W vale B'11111000', después de la instrucción W vale B'00111101'.

Para recordar XOR es la operación lógica XOR Literal es un valor W es el registro W.

Afecta a:


  • Z se pone a 1 si la operación es 0

XORWF

Realiza la operación XOR entre un registro elegido por el programador y el registro W. La operación es F XOR W = d. El resultado se puede elegir dónde será guardado.

Ejemplo:


               XORWF        PORTB,F


Si antes de la instrucción PORTB vale B11111110' y W vale B'00000001', después de la instrucción W vale .1 y PORTB vale B'11111111'.

Para recordar XOR es la operación lógica XOR W es el registro W y File es el registro elegido.

Afecta a:


  • Z se pone a 1 si la operación es 0
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

#17
Una vez que vimos todas las instrucciones y asumiendo que ya se la saben de memoria (tiempo tuvieron de sobra) y si no lo han echo, es hora de hacerlo, empecemos a escribir programas muy sencillos. Pero ¿cómo?. Si se están asiendo esta pregunta, es hora de leer desde el primer mensaje. Tienen que acordarse las posiciones de las cuatro columnas.

Recuerden que vamos a escribir los programas en el MPLAB, por lo que si aún no lo tienen, es hora de descargarlo de la página de Microchip en forma gratuita e instalarlo en la PC. Lamentablemente, este programa trabaja solo bajo windows, por los que tienen mac o Linux, no lo podrán hacer si no es por un emulador de windows y aún así, no se si funcione correctamente.

Empezaremos bien desde el principio y para ello, voy a explicar cosas nuevas. Todo programa tiene un  encabezado que se repite en cada programa nuevo y que varía según el PIC a utilizar y las prestaciones del programa a escribir. Muchas de las personas crean plantillas nuevas para ahorrarse el trabajo. Yo soy una de ellas y aquí les doy una plantilla que pueden utilizar sin problemas y modificarlas según su necesidad.

He aquí la plantilla que también está adjuntado.

         LIST      P=16F877A
         INCLUDE      <P16F877A.INC>
         __CONFIG   _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;
;---------------------------------------------------------------
;VARIABLES.
;---------------------------------------------------------------
;
         CBLOCK      H'20'

         ENDC
;
RESET      ORG         H'00'
         GOTO      INICIO
         ORG         H'04'         ;VECTOR INTERRUPCIÓN
INTERRUP
;
INICIO
;
         END


Primera línea:

LIST  P=16F877A

Esta línea, sive solo para el MPLAB y le indica que el PIC a utilizar es el 16F877A. Se debe actualizar según sea necesario.

Segunda línea:

INCLUDE   <P16F877A.INC>

Esta línea sirve a la hora de compilar ya que dentro de este archivo que viene incluido dentro del MPLAB, le indica al ensamblador dónde están ubicados cada registro y el nombre de cada bits del PIC a utilizar así, nos ahorra de hacerlo nosotros mismos. Si desean abrir el archivo, lo pueden hacer con el notepad o cualquier editor de texto. Se debe actualizar según sea necesario.

Tercera línea:

__CONFIG   _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

Linea muy importante pero se puede omitir. Aquí se configura la palabra de configuración del PIC y que está en el datasheet del pic correspondiente.
En mi caso, yo la omito y luego lo configuro desde el ICPROG a la hora de pasar el archivo .hex al pic. Es por eso que esta línea está incompleta para el pic a utilizar pero completa para el PIC 16F84.

Vemos en más detalle esta línea: __CONFIG Directiva para el ensamblador de que debe generar la palabra de configuración correspondiente de acuerdo a:

_CP_OFF la protección de lectura del PIC desabilitado.
_PWRTE_ON Reset de encendido habilitado
_WDT_OFF Perro guardián desabilitado.
_XT_OSC Oscilador a cristal.

El caracter & sirve para unir una directiva con otra.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

Cuarta línea:

;
;---------------------------------------------------------------
;VARIABLES.
;---------------------------------------------------------------
;

Este no es más que un pequeño encabezado. El ensamblador omitirá estas líneas y solo porque empieza con ";". Recuerden que, toda línea que empieze con ";" es comentario y el ensamblador la omitirá.

Justo por debajo de este encabezado, penemos las variables. ¿a que le llamo variables? a pociciones de memorias o nombre de bit que yo quiera darle personalmente.
Por ejemplo, dentro del archivo P16F877A.INC a la pocición de memoria 0x05 le llama PORTA pero si yo quero llamarlo PUERTO_A, es quí dónde le indico al ensamblador.

¿Cómo se hace?

Es muy fácil y con la instrucción "EQU"

PUERTO_A   EQU  H'05'

Si al Bit RA6 lo quero llamar LED6 lo hacemos así:

LED6  EQU  6

Supongamos que quiero encender el LED 6 que está en el Puerto a bit 6, y este se activa con un 1 lógico, ponemos esta instrucción:

BSF   PUERTO_A,LED6

Y el ensamblador lo traducirá así: BSF  0X05,0X06

Quinta línea:

CBLOCK      H'20'

         ENDC

A estas dos líneas las unifique porque van juntas. Entre ellas van los nombres de cada pocición de la RAM que nosotros querramos nombrar, o cada Registro que querramos renombrar.
Recuerden que los registros están implementados en la RAM y que la pocición de la RAM que puede utilizar el usuario para guardar cosas, empieza desde una pocición que está indicada en el datasheet. Para el caso de 16F877 empieza desde la pocición 0x20 como lo ven en la figura siguiente.


La directiva CBLOCK      H'20' indica que empezamos a nombrar pociciones de memoria desde la ubicación 0x20. Por ejemplo

CBLOCK  H'20'
temperatura
demora1
demora2
ENDC

La pocición 0x20 se llama temperatura, la pocición 0x21 se llama demora1 y así sucesivamente. Tambien existe otra forma de nombrar o renombrar pociciones de memoria o registro, y ya lo vimos que es con la directiva EQU. por ejemplo:

temperatura   EQU   H'20'
demora1        EQU   H'21'
demora2        EQU   H'22'

Sexta línea:

RESET      ORG         H'00'
         GOTO      INICIO
         ORG         H'04'         ;VECTOR INTERRUPCIÓN
INTERRUP

He unificado estas líneas porque por lo general así se escribe en la mayoría de nuestros programas. Vemos con más detalles estas líneas.

RESET  ORG  H'00'

Aquí es en dónde empieza el CP cuando se enciende al PIC. Y estos se debe, porque cuando hay un reset por el pin MCLR o un reset interno producido por, encendido del PIC o, por ejemplo, del perro guardía, el vector reset se ubica en la pocición 0x00 de la memoria de programa.
Como pueden apreciar, hemos llamado a la pocición 0x00 con el nombre de RESET, ya que la primer columna es una etiqueta. Las etiquetas sirven para nombrar pociciones de memoria de programa.

ORG  H'00' indica que se empieza a escribir desde la pocición 0x00 por lo que la siguiente instrución, quedará alojada en la pocición 0x00. ORG es una directiva, y solo sirve para el ensamblador. Esta línea, SIEMPRE debe estar y no se puede modificar, salvo la etiqueta.

Siguiente línea es GOTO  INICIO, esta instrucción queda alojada en la pocición 0x00 y es un salto a la etiqueta INICIO. Este salto tiene que estar, porque en las siguientes pociciones de memoria de programa, está la interrupción, externa e interna del PIC. Por eso es necesario hacer el salto.

Siguiente línea nos encontramos con ORG  H'04', como se dieron cuenta, es una directiva. Esta pocición de memoria, indica el vector de interrupción. Cuando estén habilitadas las interrupciones y una de ella se activa, el CP apuntará aquí, a la pocición 0x04.

Siguiente línea nos encontramos con la etiqueta INTERRUP. Si trabajamos con las interrupciones, aquí es donde escribiremos lo que necesitamos hacer con ellas.

Séptima línea:

;
INICIO
;

Vemos la etiqueta INICIO. Aquí vendrá el CP cuando alla un reset gracias al GOTO INICIO ubicado en la pocición 0x00 de la memoria de programa. De esta manera, saltamos un montón de instrucciones que no debemos ejecutar antes. Como por ejemplo las interrupciones si hubiese.
Por ende, a partir de esta etiqueta, estará nuestro programa principal. Configuraremos los puertos, las insterrupciones y empezaremos a darle trabajo al CP.

Octava línea:

END

Esta es una directiva y solo sirve para el ensamblador indicando que después de esta directiva, se terminó el programa. Instruciones que estén por debajo de esta línea, no serán tenido encuenta. Y esta directiva es obligatoria colocarla.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.