Conjunto de instrucciones del PIC 16F628 (16F628A)

February 15, 2007 at 11:05 pm | Posted in Ensamblador, MPASM | 53 Comments

Como ya hemos visto, para que el microcontrolador lleve acabo una tarea, debemos indicarle exactamente que debe hacer, o en otras palabras, debemos escribir el programa que el micro ejecutara. Ya hemos visto varios ejemplos y muchas de las instrucciones del pic, pero ahora veremos las 35 instrucciones del ensamblador mpasm. Estas 35 instrucciones son las mismas para toda la gama media de los microcontroladores pic asi que si mas adelante se quiere realizar un programa para un pic 16F877 se usaran las mismas instrucciones.

Antes de continuar es necesario definir algunos terminos que se usaran para explicar las instrucciones:
f: cualquier registro del microcontrolador
W: registro de trabajo
b: posicion de un bit en el registro ‘f’
d: destino, puede ser ‘f’ (d=1) o ‘W’ (d=0)
etiqueta: grupo de caracteres que marcan el inicio de una parte del programa
[]: opcional
: posicion de un bit dentro de un registro

Instrucciones orientadas a registros

ADDWF: Suma W y f
Suma el contenido del registro ‘W’ y el registro ‘f’. Si “d” es 0, el resultado se almacena en el registro W. Si ‘d’ es 1 el resutado se almacena en el registro ‘f’.
Sintaxis: [etiqueta] ADDWF f,d
Operación: (W) + (f) –> (destino)
Flags afectados: C, DC, Z
Ejemplo: ADDWF REG,1
Antes de la instrucción: W=0x03, REG=0x04
Después de la instrucción: W=0x03, REG=0x07

Lea el artículo completo en el blog Circuitos electronicos.

53 Comments »

RSS feed for comments on this post. TrackBack URI

  1. HOLA, VEO QUE POSTEASTE EL SET DE INSTRUCCIONES Y LAS EXPLICASTE, ESO ES MUY UTIL (GENERALMENTE SOLO SE EXPLICAN EN INGLES…).
    TENGO UNA DUDA, DESPUES TE TENER UN PROYECTO ARMADO EN EL MPLAB Y COMPILADO, COMO LO SIMULO??? Y COMO ARMO UNA VENTANA QUE ME MUESTRE LOS REGISTROS QUE QUIERO VER???

  2. YA PUDE HACERLO CORRER, ES CON LOS BOTONES QUE ESTAN MAS A LA DERECHA, AUN ASI NO LOGRO ARMAR UNA VENTANA CON LO QUE QUIERO VER.

  3. Para ver el comportamiento de tu programa ocupas abrir la ventana donde te aparecen los registros de funciones especiales, para eso ve al menu “View -> Special Function Registers”, con eso se abre una ventanita que contiene todos los registros SFR del micro, ahora para simularlo usa las teclas F6, F7 y F8 para que veas paso a paso como se desarrolla el programa, con F6 reinicias el programa, con F7 avanzas una instruccion y con F8 te saltas una subrutina, por ejemplo una rutina de retardo que tomaria mucho tiempo simularla te la puedes saltar con F8.
    Espero que esto te sea de ayuda.

  4. sip, me es de gran ayuda tnx

  5. oie pues muy bien por la pagina tiene muchos archivos de gran interes .. como le puedes hacer para programar un robot rastrero? como se utilizaria el MPLAB..

  6. Esas son buenas preguntas, lo investigare

  7. hola me parece bacano el set de intrucciones pero buscando programas me encontre con un tipo de literal de la forma .9, lo estan utilizando de la siguiente forma y no tengo idea que tipo de dato es:
    movlw .9 movwf SSPADD

    si lo sabes te lo agradeceria

  8. .9 es un número decimal, los decimales se pueden escribir utilizando esa notación y tambien esta otra: d’9′, en cualquier caso eso significa que el valor de la literal es un 9 decimal, hubiera sido igual que poner 0x09 en hexadecimal o b’00001001′ en binario

  9. Alguien podria ayudarme con el codigo del robot rastrero, o darme ideas de como realizarlo con el pic 16f628a y simularlo en mplab, se los agradeceria de por vida

    =)

  10. QUE SIGNIFICA Y PARA QUE SE UTILIZA CBLOCK

  11. UN LISTADO DE INSTRUCIONES ESPECIFICAS DEL 16F628

  12. FRANCISCO estas instrucciones son especificas al 16f628 y a cualquier pic de la gama media. Por otro lado la directiva CBLOCK sirve para definir un bloque de constantes, su sintaxis es
    CBLOCK "direccion"
    constante1
    constante2
    ...
    ENDC
    donde “direccion” es la direccion de memoria donde iniciaran las constantes, para el pic 16f628 los registros de la memoria de datos disponibles para el usuario empiezan a partir de la direccion 0x20 asi que puedes comenzar tu CBLOCK en la direccion 0x20:
    CBLOCK "direccion"
    constante1
    constante2
    ...
    ENDC

  13. HOLA SAVES SI NO ES MUCHA MOLESTIA ME PODRIAS EXPLICAR O PARA QUE SIRVEN CADA UNA DE LOS REGISTROS DEL BANCO DE MEMORIA DE DATOS

  14. Lo siento DANIEL, explicar todos los registros es demasiada información, si tienes duda en algun registro en específico con gusto te puedo ayudar

  15. hola.
    alguien podria darme algunos ejemplos sobre las directivas de control por ejemplo page, title…

  16. hola qeria pedirte un favor si me podrias dar unos ejemplos mas aparte de los qe estan aca para poder saber como usar las instrucciones RRF y RLF,gracias

  17. eca, la rotación hacia la derecha o hacia la izquierda se hace a través del carry
    supon que se tiene un registro REG que tiene almacenado el valor b’10011001′ y que la bandera de carry (STATUS,C) es 0, tenemos entonces la instrucción:
    rlf REG,f
    al hacer esto el nuevo valor del registro REG es b’00110010′ y la bandera de carry ahora es 1, ahora tenemos de nuevo la instruccion:
    rlf REG,f
    despues de esta instrucción el valor de REG es b’01100101′, si te das cuenta el carry que se tenía también se recorrió a la izquierda y pasó a formar parte del registro REG, el nuevo valor del carry es 0
    la instrucción RRF funciona igual, supon que ahora el registro REG vale b’11100101′, que el carry vale 0 y que se tiene la siguiente instrucción
    rrf REG,f
    el carry que se tenia se recorre hacia la derecha de modo que el nuevo valor de REG es b’01110010′ y el carry ahora vale 1
    espero que haya quedado claro

  18. muchas gracias ahora si me qedo claro, disculpa pero es qe mañana tengo un parcial y tengo otra duda,a nosotros nos dieron el siguiente problema: considerando los valores NO signados 5Ah y 7Fh desarrolle el programa que efectue la suma de los mismos y al resultado lo guarde en la posicion de memoria 0Ch, si yo hago asi…

    RESULTADO EQU 0C
    movlw 0x5A
    addlw 0x7f
    movlw RESULTADO

    esta bien? gracias por responder siempre mis dudas!

  19. Si, solo que la ultima instrucción debe ser movwf en lugar de movlw
    RESULTADO EQU 0C
    movlw 0×5A
    addlw 0×7f
    movwf RESULTADO

    Y no me des las gracias, gracias a ti por visitar esta página y hacer esas preguntas.

  20. hola quisieras saber si el progrma lo puedo usar en el pic 16f627 o 16f628

    gracias

  21. Cualquier programa que hagas para el pic 16f628 lo podras ejecutar en el 16f627 (si es que no excedes la memoria de ese micro), así como en el 16f648 y con algunos cambios menores en cualquier microcontrolador de la gama media de microchip

  22. hola alguine me podria ayudar acerca de los registros:
    option
    tmro
    status
    intcon
    de antemano gracias; alguna web donde pueda conseguir la datashet del pic???

  23. La información sobre esos registros la puedes encontrar en el datasheet del pic, misma que puedes encontrar en la página oficial de microchip o en google buscando “pic 16f628 datasheet” o el pic que te interese, no es dificil encontrar esos documentos.
    De todas formas en este mismo blog puedes encontrar información sobre esos registros, en el post Temporizador Timer 0 puedes se explica el registro tmr0 y algunos bits del registro option, y en el post Manejo de Interrupciones está explicado el registro intcon, de todas formas como te digo no es dificil encontrar información sobre los registros.

  24. Un saludo a el o a los realizadores de este blog, no pude dejar pasar la oportunidad de felicitarlos por este exelente trabajo ya que en verdad no habia encontrado nada en la red la cual pudiera ayudarme a empezar a programar y sin dudad alguna es lo mejor con lo que me he topado, hasta podria decir que ni siquiera los libros me han ayudado tanto, ojala signa asi, ya que soy estudiante de ingenieria electronica y es de ran utilidad para nosotros los estudiantes trabajos con tanto empeño como este, gracias de nuevo y un saludo y felicitacion.

  25. me parece interesante este foro..tengo un pic 16f628a y lo quiero programar de manera que reciba 48bits proveniente del puerto serial de una PC y lo mande ala salida acorde ala entrada y que esta salida pemanesca “alta” 2microsegundos para luego recibir los sigtes 48bits que correspone ala segunda fila de una matriz de leds de 7×48.. alguien m puede guiar?? tengo entendido que tengo que configurar “USART” ???

  26. disculpen alguien me podria explicar para k sirven las instrucciones “decfsz” y “call” si lo k m piden es obtener una señal cuadrada simetrica de 50HZ en el bit 5 del puerto b
    gracias

  27. es posible utilizar la instriccion subwf y poder guardar el resultado en otra localoidad de memoria diferente a la ke se esta restando y diferente de w

  28. CESAR, esas instrucciones creo que están bien explicadas.

    miguel, en los pics de la familia 16F no es posible guardar el resultado en un registro distinto al que realiza la operación o distinto a w, sin embargo con la instrucción MOVWF puedes guardar el valor de W en cualquier registro F que quieras. Más información en Conjunto de instrucciones (segunda parte), donde explico la instruccion movwf.

  29. hola
    alguno de ustedes m podria dar informacion de como puedo hacer un retardo de 5 segundos con la instruccion DECFSZ, es k tengo k hacer un programa en el k cada bit del puerto b se valla encendiendo cada 5 segundos,
    gracias

    • EN EL LIBRO DE MICROCONTROLADOR PIC16F84 DE ENRIQUE PALACIOS, FERNANDO REMIRO Y LUCAS J. LOPEZ VIENE LA EXPLICACION PARA HACER ESE RETARDO Y OTROS. CONSULTA RETARDOS CON LAZOS ANIDADOS.
      SUPONIENDO QUE TUVIERAS UN CRISTAL OSCILADOR DE 4 MHZ, ENTONCES TENDRIAS UNA OSCILACION DE 1 MHZ DE CICLOS MAQUINA, YA QUE CADA CICLO MAQUINA SE LLEVA 4 CICLOS DE RELOJ. SI QUIERES HACER UN RETARDO DE POR EJEMPLO 5 MICROSEGUNDOS CON CINCO INSTRUCCIONES NOP, PERO SI QUIERES HACER UN RETRASO DE MAS TIEMPO TIENES QUE HACER YA SEA UN CICLO, O DOS CICLOS ANIDADOS, O TRES CICLOS ANIDADOS,…PARA GENERAR 5 SEGUNDOS DE RETARDO NECESITAS GENERAR 5 MILLONES DE CICLOS MAQUINA, SUPONIENDO QUE ESTAS USANDO UNA OSCILACION DE 4 MH.
      PARA GENERAR 5 SEGUNDOS YO CREO QUE TIENES QUE GENERAR UN CICLO TRIPLE DE RETRAZO. POR EJEMPLO
      AL INICIO TIENES QUE DECLARAR 3 VARIABLES QUE VAS A USAR, UNA POR CADA CICLO.
      CBLOCK
      CONTA
      CONTB
      CONTC
      ENDC

      CALL RETARDO5S

      RETARDO5S
      MOVLW D’50’
      MOVWF CONTC
      EXTERNO2
      MOVLW D´100´
      MOVWF CONTB
      EXTERNO1
      MOVLW D´249´
      MOVWF CONTA
      INTERNO
      NOP
      DECFZ CONTA,F
      GOTO INTERNO
      DECFZ CONTB, F
      GOTO EXTERNO1
      DECFZ CONTC
      GOTO EXTERNO2
      RETURN
      AHORA SI QUIERES SABER COMO SE CALCULARON LOS VALORES 50, 100, 249 CONSULTA EL LIBRO MENCINADO. ESTO FUNCIONA CUANDO TIENES UN CRISTAL OSCILADOR DE 4 MHZ, SI TIENES OTRA FRECUENCIA, SE PUEDE CALCULAR. SUPON QUE N ES EL 50, M ES EL 100 Y K ES EL 249. EN LA SIGUIENTE FORMULA MODIFICA UNICAMENTE EL VALOR DE M
      CM= 7 + 4N + 4MN + 4KMN = 5000207 CICLOS MAQUINA QUE EN ESTE CASO SON APROX 5 SEGUNDOS. CONSERVA LOS VALORES DE K (249) Y EL DE M (100), ESCRIBE LOS CICLOS MAQUIINA QUE QUIERES Y CALCULA EL VALOR DE N PARA FACILIDAD DEL CALCULO.
      SI QUIERES HACER MENOS TIEMPO QUITA UNO DE LOS CICLOS ANIDADOS Y LA FORMULA SERIA
      CM= 5 + 4M + 4KM. CONSERVA A K =249, SUSTITUYE EL NUMERO DE CICLOS MAQUINA Y CALCULA EL VALOR DE M PARA FACILIDAD DE CALCULO

      SI QUIERES HACER MENOS CICLOS QUEDATE CON UN CICLO Y UTILIZA LA FORMULA SIGUIENTE.
      CM = 5 + 4K CALCULA LOS CICLOS MAQUINA SUSTITUYELOS EN LA FORMULA Y CALCULA EL VALOR DE K

  30. ALGUIEN ME PODRA DECIEL COMO HACER UNA MULTIPLICACION DE 2 NUMEROS POR MEDIO DE ROTACIONES SE LOS AGRADECERIA

  31. TENGO UNA APLICACION CON 16F84, PERO NECESITO MUDARME A 16F628. QUE PROGRAMA (BAJO MS-DOS) PUEDO USAR PARA GRABAR EL 628…

  32. ESTA MUY COMPLETA LA INFORMACION, GRACIAS

  33. Hola:

    ¿En un futuro podrías explicar las instrucciones del 18F4550?

  34. En un futuro no muy cercano tal vez si.

  35. Necesito ayuda para utilizar el pin PWM del pic16f628a utilizando lenguaje C, además como puedo generar el archivo .HEX en mplab 8 usando lenguaje C. O a su vez necesito crear subrutinas que me permitan comunicarme serialmente con una pc y con el pic.

  36. Hola.
    Estaba pensando en hacer un sensor de luz con una LDR y un PIC 16f628A. Habia pensado utilizar el módulo analógico, comparador y Vref pero no tengo mucha experiencia con esta parte.
    Me gustaría tener una escala, que no fuese o apagado o encendido, se que esto se puede hacer.
    ¿Me puedes dar una idea muy genérica y ya buscaré mas información?

  37. Hola:

    Muy buen comentario sobre nombrar las 35 instrucciones de l agama media 16F. ¿Podrías hacer lo mismo pero con la gama alta 18F?

    Se que es mucho, sin embargo hacer una instrucción una cada día o cada semana, cuando te des cuenta, ya tienes todos, al menos ya te ahorra 35 de la lista.

    Un cordial saludos.

  38. Espero que no sea un futuro demasiado lejano para entrar con los 18F.

  39. BUENAS TARDES A TODOS
    me estoy encarretando con los uC
    ESTUDIANDO LAS INSTRUCCIONES
    Como inicio a aplicarlas

  40. Hola

    Que tal un saludo a todos
    bueno aqui molestandolos si me podrian echar la mano de como debo configurar el pic16f627 para ralizar comunicasion serial por medio del Usart, como quedari el programa a grandes rasgo,

    Saludosss gracias

  41. hola tengo un pic16f74_1/p
    lo programe y en el emilador si funciona el problema es cuando le cargo el programa
    no trabajan las salidas como le puedo probar

  42. Hola
    Muy buena tu página. Estoy aprendiendo a programar y entender los PIC’s con ayuda de este sitio, y de un par de libros al uso….
    Me cuesta un poquitín, ya que hace como 6 ó 7 años que terminé Electrónica Industria, y entoces aprendimos con un instructor Promax, el 65C02 -que es ligeramente diferente-
    La pregunta es: Estoy siguiendo tus ejemplos en el repertorio de instrucciones, y tengo una duda. En la instruccion BSF, según el resultado la instrucción correcta deberia ser BSF REG 1 y no BSF REG 2, puesto que has variado el 2º bit de menor peso ¿Estoy en lo cierto?

    Saludos

    Emilio, EA5TI

  43. saludos, podrian proporcionar ayuda para mover el texto de una matriz, e hecho mucho de lo que mencionan en el foro, pero o solamente muestra texto fijo(una E) o solo muestra el despalzamiento podria decirse sin forma especifica, gracias.
    este es me program
    AllDigital
    TRISA = %00000
    TRISB = %00000000
    Symbol pulso = PORTA.0
    Symbol dato = PORTA.1
    Dim rotar As Word
    Dim i As Byte
    PORTB = 0
    inicio:
    rotar = %1111111111111100
    Gosub escribo
    PORTB.0 = 1
    WaitMs 2
    PORTB.0 = 0
    rotar = %0111111111111111
    Gosub escribo
    PORTB.1 = 1
    WaitMs 2
    PORTB.1 = 0
    rotar = %1111111111111110
    Gosub escribo
    PORTB.2 = 1
    WaitMs 2
    PORTB.2 = 0
    rotar = %1111111111111110
    Gosub escribo
    PORTB.3 = 1
    WaitMs 2
    PORTB.3 = 0
    rotar = %1111111111111100
    Gosub escribo
    PORTB.4 = 1
    WaitMs 2
    PORTB.4 = 0
    Goto inicio
    End
    escribo:
    For i = 0 To 16
    If rotar.15 = 0 Then
    dato = 0
    pulso = 0
    WaitUs 1
    pulso = 1
    Else
    dato = 1
    pulso = 0
    WaitUs 1
    pulso = 1
    Endif
    rotar = ShiftLeft(rotar, 1)
    Next i
    Return

  44. Hola otra vez y una disculpa, el problema es que para hacer el desplazamiento tengo que poner a 1 los bits que utilize y no se le ve forma de E,
    rotar = %1111111111111100
    Gosub escribo
    PORTB.0 = 1
    WaitMs 2
    PORTB.0 = 1

    si apago las filas o el prtb.0 ene ste caso la letra se queda fija……?
    gracias por la ayuda

  45. hola dejeme felicitarlo por el trabajo q estan haciendo, es de gran ayuda para aquellas personas como yo lo necesitamos..
    mi pregunta es. para yo poder hacer un programa que sume del 0 al 9 es decir de forma ascendente cuando este en 1 y de forma descendente del 9 al 0 cuando este en 0 q instruccion podria utilizar con mayor facilidad. gracias por su atencion

  46. hola a todos bueno antes que nada esta muy completo tu blog y gracias a la informacion que he encontrado aqui me he podido basar en practicas que estoy realizando en un curso de micrcontroladores como soy un principante estaba revisando las instrucciones que tienes posteadas pero como que siento que faltan unas como la de movlwf que es una de las instrucciones que estado buscando con ejemplos ya que como no las se manupular todas no se si podrias poner esta instruccion con ejemplos bueno en mi caso necesito saber como funciona debido a que estoy usando interrupcciones en estas interrupciones debo realizar una serie de pasos en la que tengo que salvar STATUS para que el valor no se pierda al momento de la interrupcion bueno gracias y espero que puedas poner esa instruccion.

  47. Esta aportacion me ayudo mucho compa!!
    gracias por la información

  48. discula kisiera saber como se usan as directivas para activar el oscilador interno del pic18f4455…

  49. Tu pagina me ha sido de gran utilidad en mi carrera de Ingenieria Gracias =)

  50. porfavor explicame para que sirve el PIC 16F628A necesito saberlo de mucha urgenciaaaa.

  51. mmm ola, alguien sabe que asen las funciones FSR y INDF??? cual es su funcion???

    alguien me ayudaria xfavor

  52. hola me podria ayudar como hacer un programa con el pic 16f28A ya que hecho programs en lenguaje C y no me hace la funcion no se si pudieran ayudarme este es mi progrma:
    #include

    void main()
    {
    port_b_pullups(TRUE);
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_ccp1(CCP_OFF);
    setup_comparator(NC_NC_NC_NC);

    //TODO: User Code
    while (true){

    output_high (pin_b0);
    delay_ms(500);

    output_high (pin_b1);
    delay_ms (500);

    output_high (pin_b2);
    delay_ms (500);

    output_low (pin_b0);
    delay_ms (200);
    output_low (pin_b1);
    delay_ms (200);
    output_low (pin_b2);
    delay_ms(200);
    }
    }
    me podrian ayudar por k el pic 16f628A no hace lo que le pido k los puertos B0,B1,B2 son k no prende y no apgan en una secuencia de leds


Leave a reply to Emilio Cancel reply

Create a free website or blog at WordPress.com.
Entries and comments feeds.