Lenguaje ensamblador para PIC desde 0

BCF

Pone a 0 el bit de un registro. El bit debe ser indicado por el programador.

Ejemplo:

Código:
         BCF      TEMP,2

Antes de la instrucción TEMP vale B'11111111'. Después de la instrucción TEMP vale B'11111011'

Para recordar, Bit Clear es borrar File es archivo o registro

No afecta ningún bit del registro Status.

BSF

Pone a 1 el bit de un registro. El bit debe ser indicado por el programador.

Ejemplo:

Código:
         BSF      TEMP,0

Antes de la instrucción TEMP vale B'01110110'. Después de la instrucción TEMP vale B'01110111'

Para recordar, Bit Set es poner a 1 File Archivo o registro

No afecta a ningún Bit del registro Status.

BTFSC

Salta un línea si el bit de un registro es cero. El bit debe ser indicado por el programador.

Ejemplo:

Código:
         BTFSC    TEMP,5
         BCF        PORTA,0
         BSF        PORTB,0

Caso 1:

TEMP vale B'00011110'. El CP analizará solo el Bit 5 del registro TEMP, como es 0, salta la instrucción BCF PORTA,0 y ejecuta la siguiente línea que es BSF PORTB,0 y continua haciendo la instrucción.

Caso 2:

TEMP vale B'00111000'. El CP analizará solo el Bit 5 del registro TEMP, como es 1 no salta la instrucción y hará la instrucción BCF PORTA,0 y luego continua con la instrucción BSF PORTB,0

Para recordar Bit Test es chequear File Skip es salto Clear

No afecta a ningún Bit del registro Status.

BTFSS

Salta una línea si el bit de un registro es 1. EL bit debe ser indicado por el programador.

Ejemplo:

Código:
         BTFSS    TEMP,3
         ADDWF   PORTC
         ANDWF   NODO

Caso 1:

TEMP vale B'01101100'. El CP analizará solo el Bit 3 del registro TEMP, como es 1, salta la instrucción ADD PORTC y ejecuta la siguiente línea que es ANDWF NODO y continua haciendo la instrucción.

Caso 2:

TEMP vale B'11110000'. El CP analizará solo el Bit 3 del registro TEMP, como es 0 no salta la instrucción y hará la instrucción ADD PORTC y luego continua con la instrucción AND NODO.

Para recordar Bit Test es chequear File Skip es salto Set

No afecta a ningún Bit del registro Status.


Normalmente, continuando las instrucciones BTFSS y/o BTFSC va un GOTO o CALL pero no la he puesto porque aún no se explicaron estas instrucciones.
 
CALL

Se digire a una dirección de la memoria de programa designado por el programador. En otras palabras, se utiliza para dirigirce a una rutina o tarea. Su principal ventaja es que una vez que finalizó la tarea, vuelve al punto siguiente desde dónde se llamo.

Ejemplo :

Código:
         CALL       ESC_PORTB

Para recordar, CALL es llamada.

No afecta ningún bit del registro Status.

---------------------------------------------------------------------------------------------------------------------------------------------
Hacemos una exepción con respecto a ver las instrucciones por orden alfabético y veremos la instrucción GOTO.
---------------------------------------------------------------------------------------------------------------------------------------------

GOTO

Se digire a una dirección de la memoria de programa designado por el programador. En otras palabras, se utiliza para saltar instrucciones que no queremos que se ejecuten. A diferencia de la instrucción CALL, no hay forma de volver cuando se ejecuta la instrucción.

Ejemplo:

Código:
         GOTO       INICIO

Para recordar GO TO es ir a.

No afecta a ningún bit del registro Status.

Extendiendo la explicación.

Vamos a hablar del PC para entender bien sobre estas instrucciones. La excelente explicación que continua, por desgracia no es mía (ojalá fuera mi explicación), son de las personas Maunix y BrunoF (del foro todopic)

En la siguiente imagen, vemos el diagrama de bloques del PC o CP.

pc_120.jpg


El PC es de 13 bits en este caso(8kwords). 14 son los bits de cada "word" o instrucción que se graban en cada posición de la FLASH (memeria de programa).
El PC se reparte en: sus 8 bits de menor peso en el registro PCL, y los 5 restantes en el registro PCLATH.

Los pics al tener un set de instrucciones reducido no puede en una sola instrucción meter todos los bits necesarios para direccionar toda su memoria.

EL program counter son 2 registros, el PChigh y PCLow . Cuando haces un CALL o un GOTO, solo se rellenan 11 bits (los 8 del PClow y 3 del PChigh) y los restantes 2 los rellenas con el PCLATH (para completar los 13bits).

El STACK (pila) tiene toda la dirección, no solo parcial. Si haces un call desde la pagina 0 a la página 3 y luego un return el código SI volverá a la página 0, pero el PCLATH sigue apuntando a la página 3, entonces si usas otro goto o call, debes tener en cuenta de modificar el PCLATH.

Entónces, dijimos que:

El PC = ProgramCounter o CP = Contador de Programa, tiene 13 bits; del 0 al 12.

Al ejecutar un call o un goto, se copian del 0 al 10, y los otros 2 bits se copian del registro PCLATH. El pclath solo estará allí para esa situacion.

En un return o retfie la microelectronica del PIC, pega la dirección del PC que estaba guardada.

Lo vemos con un ejemplo


1.
STACK = vacío
PC = 0x00A0
PCLATH = 0b000011000
Ejecutas un CALL 0x230

2. El STACK tiene en su posición 0 la dirección 0x00A0.
PC = 111000110000

3. Se ejecuta la subrutina y en ese punto el PC ya quedó en
PC = 111000110111

4. Viene un RETURN.
La microelectrónica del PIC copiará el stack tal cual en el program counter + 1
Valor STACK 0x00A0 + 1 --> PC = 0x00A1

5. EL código sigue ejecutandose en la página 0 pero hay que tener en cuenta que el PCLATH apunta a la página 3 por ello si harás otro CALL o GOTO, deberás cambiar de nuevo el PCLATH si la subrutina no está en la página 3.

Para cerrar el tema

Vamos a entrar a todo detalle en el Program Counter(PC) para que se vayan todas las dudas ya que es muy importante. Vayamos al tema tema del PC, computed goto(lo que algunos llaman "tabla"), call, returns y goto.

El Program Counter(PC) está conformado en esta familia de uC(y refiriendonos a la familia 16F, las otras poseen más o menos bits implementados) por 13 bits repartidos entre dos registros: PCH y PCL.
El PCL es legible/escribible directamente a traves del registro físico PCL(valga la redundancia). En cambio, el PCH no es directamente accesible. No puede ser leído, y sólo puede se grabado mediante un buffer que contiene el valor temporalmente(oh! aquí aparece nuestro famoso PCLATH). Entonces, recordar: El PCLATH es sólo un buffer temporal que almacena los 5 bits de mayor peso del PC para ser escritos cuando se ejecute una instrucción que lo requiera.

Ahora, hay dos situaciones posibles en las que el PC debe ser cargado de manera distínta: una es cuando queremos trabajar con tablas y otra cuando realizamos un call o un goto que no esté en el mísmo banco.

1era situación: Tabla(Comuted Goto)

La tabla es una situación de uso del PC en la que se afecta directamente al registro PCL. Cuando se afecte directamente al PCL mediante una instrucción, es necesario que el usuario asegure que PCLATH tenga sus 5 bits pre-cargados adecuadamente.

Hago un ejemplo:

Mal:

org 0x000
movlw 0x01
call tabla


org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
.....

Bien:
org 0x000
movlw 0x03
movwf PCLATH
movlw 0x01
call tabla


org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
.....

Mejor:
org 0x000
pageselw tabla
movlw 0x01
call tabla


org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
.....

Pageselw es una instrucción del MPASM que genera dos instrucciones: un movlw literal y un movwf PCLATH. El valor del literal es automáticamente seleccionado por el ensamblador según la etiqueta(o posición de memoria) que se le especifique. En el caso anterior pageselw tabla generaría estas dos instrucciones:

movlw 0x03
movwf PCLATH

Si no aseguramos que los 5 bits del PCLATH estén correctamente seteados al momento de afectar al PCL mediante alguna instrucción(generalmente es la addwf, pero puede usarse subwf y muchas otras) entonces el programa saltará a una posición indeseada.


2da situación: CALL y GOTO

En esta familia de uC, cada instrucción es codificada en 14 bits. En el caso de las instrucciones CALL y GOTO, su estructura es la siguiente:

F2 F1 F0 K10 K9 K8 K7 K6 K5 K4 K3 K2 K1 K0

Donde las F indican cuál instrucción es la que debe ejecutarse(100 para la CALL 101 para la GOTO), y las k corresponden a la dirección a la cual queremos llamar(con un CALL) o saltar(con un GOTO).

Aquí se ve claramente un problema. Podemos ver que un CALL o un GOTO sólo almacena 11 bits de la dirección a la cual debe ir. 11 bits es un máximo 2048 posiciones. ¿Qué pasa cuando un uC posee más de 2k de memoria Flash entonces? Por ejemplo, un 16F877A posee 8k de memoria Flash. ¿Cómo haría para llamar a una subrutina que está más allá de la posición 2047 de la flash?
La solución nuevamente se encuentra en el PCLATH(y es nuevamente el usuario el que tiene el deber de pre-cargar el valor adecuado).

Entonces, dijimos que el PC contiene 13 bits de longitud. 13 bits son hasta 8kwords(una word es en esta familia un conjunto de 14 bits que conforman una instrucción la cual se aloja en la memoria FLASH del uC). Un CALL o un GOTO sólo contienen los 11 bits de menor peso de la dirección a la cual ir, por lo que los 2 bits restantes deberán ser pre-cargados en los bits 4 y 3 del registro PCLATH por el usuario programador.

Cuando se ejecuta una instrucción CALL o GOTO, es imprescindible que el registro PCLATH esté correctamente precargado. La instrucción a la que el uC irá estará conformada por 13 bits y ellos serán:

PCLATH,4 PCLATH,3 K10 K9 K8 K7 K6 K5 K4 K3 K2 K1 K0

Cabe mencionar que el uC carga a PC<10:0> con el valor pasado por los 11 bits de K, y a PC<12:11> con el valor de los bits PCLATH<4:3>. El registro PCLATH no es modificado de ninguna manera. Sólo se leen esos dos bits.

Por ejemplo, en un uC de 8kWords hay 4 páginas. Una página cada 2048 words. Si se está en una página y se quiere ir a otro es necesario precargar antes dichos bits del PCLATH para poder hacerlo.

El usuario no debe preocuparse por precargar el PCLATH en dos sitaciones:
Si el uC no posee más de 2kWords de memoria Flash;
O si en el código creado por el usuario, no se utiliza la memoria FLASH más allá de la posición 2047(0x7FF).

Si ocurre al menos uno de esos dos casos, es suficiente con asegurar que los bits PCLATH<4:3> se encuentren ambos en cero.

Vamos con un par de ejemplos:

Mal:

org 0x000 ;Esto es página0
call cruzo


org 0x800 ;Esto ya es el página1
cruzo
retlw 0xFF
.....


Bien:

org 0x000 ;Esto es página0
movlw 0x08
movwf PCLATH
call cruzo


org 0x800 ;Esto ya es el página1
cruzo
retlw 0xFF
.....


Mejor:

org 0x000 ;Esto es página0
pagesel cruzo ;automaticamente seleccionar banco
call cruzo


org 0x800 ;Esto ya es el página1
cruzo
retlw 0xFF
.....



Pagesel es una instrucción del MPASM que genera dos instrucciones: un bcf/bsf PCLATH,3 y un bcf/bsf PCLATH,4. El software ensamblador selecciona automáticamente la instrucción bcf o bsf según el banco en el cual se encuentra la etiqueta(o posición de memoria) que se le especifique. En el caso anterior pagesel cruzo generaría estas dos instrucciones:

bsf PCLATH,3
bcf PCLATH,4

Ya que la subrutina cruzo se encuentra en la página1.

Finalmente, cuando se ejecuta una instrucción CALL, se carga en el STACK el valor de la posición actual más 1(es decir, se guarda en el STACK el valor PC+1). Se guardan los 13 bits, por lo que durante las instrucciones RETURN,RETLW y RETFIE no es necesario precargar al PCLATH.

Para más información, ver el esquema sección 2.3 del datasheet de los PIC16F87XA que habla de cómo cargar al PC según cada situación.
 

Adjuntos

  • pc_120.jpg
    pc_120.jpg
    22.1 KB · Visitas: 443
CLRF

Borra el contenido de un registro seleccionado por el programador. La forma en que lo hace, pone en 0 los 8 bit del registro. Este registro, puede ser cualquiera de la pocición de la RAM.

Ejemplo:

Código:
         CLRF             PORTB

Antes de la instrucción PORTB vale B'11000111'. Después de la instrucción PORTB vale B'00000000'

Para recordar CLeaR es limpio File es archivo o registro.

Afecta a:


  • Z Se pone a 1

CLRW

Borra al registro W. La forma en que lo hace, pone en 0 los 8 bit del registro.

Ejemplo:

Código:
         CLRW

Antes de la instrucción W vale B'00000111'. Después de la instrucción W vale B'00000000'.

Para recordar CLeaR es limpiar Work es trabajo.

Afecta a:


  • Z Se pone a 1

CLRWDT

Borra al WDT. La forma en que lo hace, pone en 0 al mismo.

Ejemplo:

Código:
          CLRWDT

Antes de la instrucción WDT vale B'11111110'. Después de la instrucción vale B'0000000'.

Para recordar CLeaR es limpiar Watch Dog es perro guardian Timer es contador.

Afecta a:


  • TO (neg) Se pone a 1
    PD (neg) Se pone a 1


NOTA: El WDT o el contador perro guardian, sirve para destrabar al PIC. Cada vez que se desborda, o sea, cada vez que pasa de H'FF' a H'00', produce un reset, y como es un reset, se dirige a la pocición 0h de la memoria de programa.
La forma de trabajar con el, es ir poniendo en lugares estratégicos la instrucción ya explicada, de esta manera evitamos el desborde del contador. Si el CP se traba en algún bucle o algo similar, al no limpiar el contador, el WDT desbordará y llevará al CP a la pocición 0h de la memoria de programa.

Muchas veces se evita de usar esta herramienta por no tener que calcular por todo el programa dónde y cuando limpiar al WDT. Es recomendable su uso.
 
Hola, soy nuevo en esto de los pic y estos tratando de entender como hacer un programa.
Todavia no logro entender el asembler, asi que mientras sigo el avance del foro, estoy jugando con el niple que es mas facil de manejar.
Comence haciendo destellar a un led con un pic 16F84A, y ahora estoy tratando de hacer encender 3 led en secuencia como las luces del auto fantastico, pero se me presento un problemita.

Cargue el programa en el pic pero no se comporta como yo esperaba, en vez de seguir la secuencia esperada (encendiendo los led de a uno de izquierda a derecha y de derecha a izquierda) sigue otra secuencia distinta, pero si provoco un falsocontacto a la resistencia que polariza al reset (pin 4), la secuencia cambia a la esperada y se mantiene asi hasta que se desconecta la alimentacion.

No entiendo porque, si en teoria siempre sigue el mismo programa.
Adjunto los archivos del programa, para que alguien que entienda me ayude a ver donde esta el error.

El foro esta buenisimo, sigan asi.
saludos.
 

Adjuntos

  • led3_845.asm
    2.6 KB · Visitas: 133
  • pic_579.bmp
    27.8 KB · Visitas: 139
Yo tube un inconveniente parecido y me estaba andando mal los condensadores de desacoplo del cristal. Se los saqué y santo remedio. Ovbiamente, los reemplazé por otros.

Cheque eso.
 
COMF

Realiza el complemento de un registro.

Código:
          COMF       TEMP,F

Si TEMP tenía guardado B'00111101' luego de ejecutar la instrucción TEMP vale B'11000010'. Notese, que aquí también podemos elegir el destino y esto nos deja guardarlo en el registro W si así lo requerimos.

Para recordar COMlement es complemento File es registro.

Afecta a:


  • Z Se pone a 1 si la operación da 0

DECF

Decrementa en una unidad, o lo que es lo mismo, resta 1 el contenido de un registro

Código:
          DECF     DECENA,W

Si antes de la instrucción DECENA vale .255, después de la instrucción W vale .254 y DECENA vale .255 Si por el contrario, hubieramos elegido el destino F, después de la instrucción DECENA vale .254

Para recordar DECrement es decremento File es registro.

Afecta a:


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

DECFSZ

Decrementa en uno, o lo que es lo mismo, resta en 1 el contenido de un registro y cuando este vale 0, el CP salta una instrucción

Código:
LOOP    DECFSZ      TEMP
           GOTO     LOOP
           BCF      PORTB,0

El CP descontará en 1 el registro TEMP y evalúa el valor, si no es cero, ejecuta línea siguiente que es GOTO LOOP, el cual se dirige de nuevo a la línea LOOP DECFSZ TEMP el cual volverá a descontar en 1 y evalua el valor, si es cero salta la línea GOTO LOOP y ejecuta la instrucción BCF PORTB. Esta última línea, el programador pondrá la instrucción que necesite ejecutar.
Este pequeño programa que acabamos de ver, es un temporizador o un retardo que tardará en salir del bucle dependiendo de la frecuencia de reloj y el valor cargado en TEMP.

NOTA: Esta instrucción, también hay que elegirle el destino. En el caso que no se exprese, como en este caso, el MPLAB dará por sentado que el resultado se guardará en el registro F y no en W.

Para recordar DECrement es decremento File es registro Skip es salto Zero que es cero.

No afecta ningún bit del registro STATUS.
 
INCF

Incrementa en 1, o suma 1, el contenido de un registro elegido por el programador.

Código:
         INCF          INDF,F

Si antes de la instrucción INDF vale H'29', después de la instrucción INDF vale H'2A'. Notese que también podemos elgeir el destino. Si hubieramos elegido W, después de la instrucción W vale H'2A' y INDF vale H'29'.

Para recordar INCrement es incremento File es registro.

Afecta a:


  • Z se pone a 1 si el resultado es 0

INCFSZ

Incrementa en 1, o suma en 1, el contenido de un registro elegido por el programador y cuando este es 0, el CP salta una instrucción.

Código:
VOLVER          INCFSZ          CONTADOR
                GOTO            VOLVER
                INCF            PORTA

El CP incrementará en 1 el registro CONTADOR y evalúa el valor, si no es cero, ejecuta línea siguiente que es GOTO VOLVER, el cual se dirige de nuevo a la línea VOLVER INCFSZ CONTADOR el cual volverá a incrementar en 1 y evalua el valor, si es cero salta la línea GOTO VOLVER y ejecuta la instrucción INCF PORTA. Esta última línea, el programador pondrá la instrucción que necesite ejecutar.
Este pequeño programa que acabamos de ver, es un temporizador o un retardo que tardará en salir del bucle dependiendo de la frecuencia de reloj y el valor cargado en CONTADOR. Normalmente, se utiliza el retardo con DECFSZ pero este también es válido.

NOTA: Esta instrucción, también hay que elegirle el destino. En el caso que no se exprese, como en este caso, el MPLAB dará por sentado que el resultado se guardará en el registro F y no en W.

Para recordar INCrement es incremento File es registro Skip es salto Zero es cero.

No afecta ningún bit del registro STATUS.

IORLW

Realiza la operación OR entre W y un literal elegido por el programador. El resultado se guarda en W. La operación es W OR L.

Si antes de la instucción W vale B'01110100' y el literal elegido es B'00011111', después de la instrucción W vale B'01111111'.

Para recordar Inclusive es inclusivo OR es la operación binaria OR Literal es literal W es el registro trabajo.

Afecta a:


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

Realiza la operación lógica OR entre el registro W y un registro elegido por el programador. La operación es W OR F.

Código:
          IORWF      PORTC,F

Si antes de la instrucción W vale B'01111111' y PORC vale B'00001111' después de la instrucción PORTC vale B'01111111' y W vale B'01111111'. Notese que podemos elegir el destino y la otra opción, como ya se dieron cuenta por las instrucciones pasadas, puede ser W.

Para recordar Inclusive es inclusivo OR es la operación binaria OR W es el registro trabajo y File es registro.

Afecta a:


  • Z se pone a 1 si el resultado es 0

MOVLW

Carga al registro W con un literal elegido por el programador para luego hacer una operación matemática o moverlo a otro registro como veremos más adelante. Sin duda alguna, una de las instrucciones más usadas en la programación ASM.

Código:
          MOVLW        .255

Si antes de la instrucción W vale .15, después de la instrucción W vale .255.

Para recordar MOVe es mover Literal es literal W es el registro trabajo.

Como es de esperar, no afecta ningún bit del registro STATUS.

MOVF

Mueve el contenido de un registro a otro registro elegido por el usuario.

Código:
         MOVF        RETARDO,W

Si antes de la instrucción W vale H'2A' y RETARDO vale H'FF', después de la instrucción W vale H'FF'. Notese que aquí podemos elegir el destino, y tenemos la posivilidad de elegir el destino al propio registro RETARDO. Al principio parece innecesario, pero se puede tomar como una verificación, ya que se ve afectado el registro STATUS bit Z.

Para recordar MOVe es mover y File es registro.

Afecta a:


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

Anteriormente, habíamos dicho que esta instrucción se la puede tomar como vereficación, para saber si se guardó con el mismo valor que tenía, el bit Z se pone a 1 si el valor es igual al que tenía cargado.
 
NOTA: El WDT o el contador perro guardian, sirve para destrabar al PIC. Cada vez que se desborda, o sea, cada vez que pasa de H'FF' a H'00', produce un reset, y como es un reset, se dirige a la pocición 0h de la memoria de programa.
La forma de trabajar con el, es ir poniendo en lugares estratégicos la instrucción ya explicada, de esta manera evitamos el desborde del contador. Si el CP se traba en algún bucle o algo similar, al no limpiar el contador, el WDT desbordará y llevará al CP a la pocición 0h de la memoria de programa.

Muchas veces se evita de usar esta herramienta por no tener que calcular por todo el programa dónde y cuando limpiar al WDT. Es recomendable su uso.

disculpa la entromicion o duda , pero cual seria la forma de descolgar el pic y que retorne a la misma posicion de memoria ? tengo entendido que es con el wd , saludos diego
 
diego_z dijo:
NOTA: El WDT o el contador perro guardian, sirve para destrabar al PIC. Cada vez que se desborda, o sea, cada vez que pasa de H'FF' a H'00', produce un reset, y como es un reset, se dirige a la pocición 0h de la memoria de programa.
La forma de trabajar con el, es ir poniendo en lugares estratégicos la instrucción ya explicada, de esta manera evitamos el desborde del contador. Si el CP se traba en algún bucle o algo similar, al no limpiar el contador, el WDT desbordará y llevará al CP a la pocición 0h de la memoria de programa.

Muchas veces se evita de usar esta herramienta por no tener que calcular por todo el programa dónde y cuando limpiar al WDT. Es recomendable su uso.

disculpa la entromicion o duda , pero cual seria la forma de descolgar el pic y que retorne a la misma posicion de memoria ? tengo entendido que es con el wd , saludos diego

Haber si te entiendo. Tu lo que quieres saber como volver al lugar dónde se produjo el reset.

En realidad, no necesitas volver a dónde estaba e CP justo en el momento que el WDT produjo un desbordamiento. En una operación normal del programa, jamás debe ocurrir esto ya que se está continuamente borrando el WDT.

La finalidad del WDT es, si el CP quedó en un bucle infinito y no sale de el, si no estubiera el WDT, el operador tiene que resetear manuelamente al PIC. Para esto, MICROCHIP puso a nuestra dispocición el WDT, para que no dependiera de un operador.

Si te fijas en el registro STATUS, hay dos bit que se ven afectado cuando un reset del WDT a ocurrido. entónces al principio de tu programa, y antes de empezar la parte normal del programa, deberas chequear alguno de esos bit, y dependiendo de tu programa y detectas que el reset se produjo por el WDT lo llevarás a una parte de tu programa en caso contrario, continuará por la parte normal.
 
MOVWF

Mueve el contenido del registro W a un registro cualquiera elegido por el programador. Sin duda alguna, esta instrucción, es otra muy usada en la programación ASM

Código:
          MOVWF       ADCON0

Si antes de la intrucción W vale B'10000001' y ADCON0 vale 0x0, después de la instrucción ADCON0 vale 0x81.

Para recordar MOVe es mover W es el registro W y File es registro.

No afecta ningún bit del registro STATUS.

NOP

No realiza ninguna operación. Solo consume un ciclo de instrucción.

Código:
          NOP

Para recordar No es no y OPeration es operación.

No afecta ningún bit del registro STATUS.

RETFIE

Carga al CP con el valor de la parte alta de la pila para volver al lugar dónde se encontraba el CP antes de atender la interrupción. Al mismo tiempo, pone a 1 el bit GIE para activar de nuevo las interrupciones.

Código:
         RETFIE

Para recordar REturn es retornar From es de la IntErrupt es interrupción.

No afecta ningún bit del registro STATUS.
 
Veo que estás a tiro hecho. Ahora estoy con openSUSE, ya lo pasaré cuando pueda a PDF.

Una curiosidad.
Cuando acabes las 35 instrucciones de los PIC 16F de gama media. ¿Te meterás a los 18F de gama alta algún día?

Ya es mucho pedir.
 
Por ahora no. Hay mucho por aprender en la programación ASM. Como armar un programa, concejos a la hora de hacerlo.

Utilización de las rutinas y como armar librerías, luego como adjuntarlas a nuetro nuevo programa, etc.
 
Atrás
Arriba