Autor Tema: Ayuda, errores en mi primer programa PIC16F628A  (Leído 3137 veces)

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

Desconectado Dave_butd

  • PIC10
  • *
  • Mensajes: 3
Ayuda, errores en mi primer programa PIC16F628A
« en: 24 de Septiembre de 2017, 17:49:18 »
Hola que tal.
Mucho gusto, soy nuevo en el foro y estoy aprendiendo sobre el lenguaje de ensamblador utilizando el PIC16F628A, y como primer práctica me encargaron hacer un programa que sume y reste 2 números de tres bits cada uno, utilizando el puerto A como entrada, también un selector en el mismo puerto, y cuatro bits del puerto B como salida, tres de los cuales se usan como resultado de la operación, y el cuarto como bandera de carry o negative. Me estoy basando en la hoja de datos del pic para hacer esto pero al momento de compilar el programa con MPLAB me aparecen estos errores.
adjunto el programa y los errores, espero que me puedan ayudar.




 __CONFIG _FOSC_EXTRCCLK & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF

 #INCLUDE <P16F628A.INC>

           ORG   0000H
   
           CLRF   PORTA
           MOVLW   07H
               MOVWF   CMCON
            BSF   STATUS,RP0
            BCF   STATUS,RP1
            MOVLW   0FFH
            MOVWF   TRISA
           CLRF   TRISB
           BCF   STATUS,RP0
   
INICIO   CLRF   PORTB
            MOVLW   PORTA,70H
           BTFSC   PORTA,80H
           GOTO   RESTA
           ADDWF   PORTA,07H,W
           MOVWF   PORTB,07H
           BTFSC   STATUS,C
           BSF           PORTB,08H
           GOTO   INICIO
   
RESTA   SUBWF   PORTA,07H,W
           MOVWF   PORTB,07H
            BTFSS   STATUS,C
           BSF   PORTA,08H
           GOTO   INICIO
   
          END



make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'C:/Users/david/OneDrive/Documentos/Micros 2da/2do parcial/pic/Practica_1.X'
make  -f nbproject/Makefile-default.mk dist/default/production/Practica_1.X.production.hex
make[2]: Entering directory 'C:/Users/david/OneDrive/Documentos/Micros 2da/2do parcial/pic/Practica_1.X'
"C:\Program Files (x86)\Microchip\MPLABX\v3.55\mpasmx\mpasmx.exe" -q -p16f628a -l"build/default/production/main.lst" -e"build/default/production/main.err" -o"build/default/production/main.o" "main.asm"
Message[302] C:\USERS\DAVID\ONEDRIVE\DOCUMENTOS\MICROS 2DA\2DO PARCIAL\PIC\PRACTICA_1.X\MAIN.ASM 13 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] C:\USERS\DAVID\ONEDRIVE\DOCUMENTOS\MICROS 2DA\2DO PARCIAL\PIC\PRACTICA_1.X\MAIN.ASM 14 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Error[108]   C:\USERS\DAVID\ONEDRIVE\DOCUMENTOS\MICROS 2DA\2DO PARCIAL\PIC\PRACTICA_1.X\MAIN.ASM 18 : Illegal character (,)
Warning[202] C:\USERS\DAVID\ONEDRIVE\DOCUMENTOS\MICROS 2DA\2DO PARCIAL\PIC\PRACTICA_1.X\MAIN.ASM 19 : Argument out of range.  Least significant bits used.
Error[108]   C:\USERS\DAVID\ONEDRIVE\DOCUMENTOS\MICROS 2DA\2DO PARCIAL\PIC\PRACTICA_1.X\MAIN.ASM 21 : Illegal character (,)
Error[108]   C:\USERS\DAVID\ONEDRIVE\DOCUMENTOS\MICROS 2DA\2DO PARCIAL\PIC\PRACTICA_1.X\MAIN.ASM 22 : Illegal character (,)
Warning[202] C:\USERS\DAVID\ONEDRIVE\DOCUMENTOS\MICROS 2DA\2DO PARCIAL\PIC\PRACTICA_1.X\MAIN.ASM 24 : Argument out of range.  Least significant bits used.
Error[108]   C:\USERS\DAVID\ONEDRIVE\DOCUMENTOS\MICROS 2DA\2DO PARCIAL\PIC\PRACTICA_1.X\MAIN.ASM 27 : Illegal character (,)
Error[108]   C:\USERS\DAVID\ONEDRIVE\DOCUMENTOS\MICROS 2DA\2DO PARCIAL\PIC\PRACTICA_1.X\MAIN.ASM 28 : Illegal character (,)
Warning[202] C:\USERS\DAVID\ONEDRIVE\DOCUMENTOS\MICROS 2DA\2DO PARCIAL\PIC\PRACTICA_1.X\MAIN.ASM 30 : Argument out of range.  Least significant bits used.
nbproject/Makefile-default.mk:101: recipe for target 'build/default/production/main.o' failed
make[2]: Leaving directory 'C:/Users/david/OneDrive/Documentos/Micros 2da/2do parcial/pic/Practica_1.X'
nbproject/Makefile-default.mk:84: recipe for target '.build-conf' failed
make[1]: Leaving directory 'C:/Users/david/OneDrive/Documentos/Micros 2da/2do parcial/pic/Practica_1.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
make[2]: *** [build/default/production/main.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 2s)
« Última modificación: 24 de Septiembre de 2017, 18:16:51 por Dave_butd »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda, errores en mi primer programa PIC16F628A
« Respuesta #1 en: 24 de Septiembre de 2017, 20:02:50 »
Código: ASM
  1. MOVLW   PORTA,70H

MOVLW toma un solo valor, por lo tanto el "PORTA," esta por demas. Lo que hace esta instrucciones es cargar a W con un valor para luego usarlo con otra instruccion.
Lo vas a tener reemplazar por un MOVLW 0x70 y un MOVWF PORTA

Código: ASM
  1. BTFSC   PORTA,80H
  2. BSF     PORTB,08H

el BTFSC es para testear el bit, y toma valores de 0 a 7, vos tenes un 0x80, imagino que intentaste poner PORTA,7
el BSF ocurre lo mismo, necesitas si o si un numero del 0 al 7, BSF PORTB,4

Código: ASM
  1. ADDWF   PORTA,07H,W
  2. SUBWF   PORTA,07H,W

ADDWF como su nombre lo indica es ADD ( sumar ) W con F (registro). Posee 2 parametros, SUBWF tambien. El primero es que registro vas a sumar (junto con W) y luego donde va a ir el resultado.
Si quieres sumarle a PORTA el valor 0x07, primero cargas el registro W con 0x7 y luego sumas. De alli lo pones en W o en PORTA ( F ) Ejemplo:

Código: ASM
  1. MOVLW 0x7
  2. ADDWF PORTA, W ; Esto suma el valor del PORTA + 0x7 y el resultado lo pone en W.
  3. MOVLW 0x1
  4. SUBWF PORTA, F ; En PORTA, vas a tener el resultado de PORTA - W

Otro que posee error
Código: ASM
  1. MOVWF   PORTB,07H

el MOVWF simplemente pasa lo que tengas en W al registro que pongas, por lo cual tiene un solo parametro y no 2 como pusiste.

seria MOVWF PORTB solamente.

Desconectado Dave_butd

  • PIC10
  • *
  • Mensajes: 3
Re:Ayuda, errores en mi primer programa PIC16F628A
« Respuesta #2 en: 24 de Septiembre de 2017, 22:49:30 »
Código: ASM
  1. MOVLW   PORTA,70H

MOVLW toma un solo valor, por lo tanto el "PORTA," esta por demas. Lo que hace esta instrucciones es cargar a W con un valor para luego usarlo con otra instruccion.
Lo vas a tener reemplazar por un MOVLW 0x70 y un MOVWF PORTA

Código: ASM
  1. BTFSC   PORTA,80H
  2. BSF     PORTB,08H

el BTFSC es para testear el bit, y toma valores de 0 a 7, vos tenes un 0x80, imagino que intentaste poner PORTA,7
el BSF ocurre lo mismo, necesitas si o si un numero del 0 al 7, BSF PORTB,4

Código: ASM
  1. ADDWF   PORTA,07H,W
  2. SUBWF   PORTA,07H,W

ADDWF como su nombre lo indica es ADD ( sumar ) W con F (registro). Posee 2 parametros, SUBWF tambien. El primero es que registro vas a sumar (junto con W) y luego donde va a ir el resultado.
Si quieres sumarle a PORTA el valor 0x07, primero cargas el registro W con 0x7 y luego sumas. De alli lo pones en W o en PORTA ( F ) Ejemplo:

Código: ASM
  1. MOVLW 0x7
  2. ADDWF PORTA, W ; Esto suma el valor del PORTA + 0x7 y el resultado lo pone en W.
  3. MOVLW 0x1
  4. SUBWF PORTA, F ; En PORTA, vas a tener el resultado de PORTA - W

Otro que posee error
Código: ASM
  1. MOVWF   PORTB,07H

el MOVWF simplemente pasa lo que tengas en W al registro que pongas, por lo cual tiene un solo parametro y no 2 como pusiste.

seria MOVWF PORTB solamente.




Primero que nada, muchas gracias por contestar. Ahora, en base a tu respuesta hice algunas modificaciones y añadí algunos comentarios, trataré de adjuntar el archivo ya que veo que es posible.

Código: ASM
  1. ORG     0000H
  2.        
  3.         CLRF    PORTA
  4.         MOVLW   07H
  5.         MOVWF   CMCON
  6.         BSF     STATUS,RP0
  7.         BCF     STATUS,RP1
  8.         MOVLW   0FFH
  9.         MOVWF   TRISA
  10.         CLRF    TRISB
  11.         BCF     STATUS,RP0
  12.        
  13. INICIO  CLRF    PORTB
  14.         MOVLW   PORTA,70H       ; Sólo quiero agregar a W los pines RA6:RA4
  15.         BTFSC   PORTA,7         ; Quiero leer el pin RA7
  16.         GOTO    RESTA          
  17.         ADDWF   PORTA,07H,W     ; Quiero hacer la suma sólo sobre W y RA2:RA0
  18.         MOVWF   PORTB
  19.         BTFSC   STATUS,C
  20.         BSF     PORTB,3        
  21.         GOTO    INICIO
  22.        
  23. RESTA   SUBWF   PORTA,07H,W     ; Quiero hacer la resta sólo sobre W y RA2:RA0
  24.         MOVWF   PORTB
  25.         BTFSS   STATUS,C
  26.         BSF     PORTB,3
  27.         GOTO    INICIO
  28.        
  29.         END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda, errores en mi primer programa PIC16F628A
« Respuesta #3 en: 24 de Septiembre de 2017, 23:56:50 »
Código: ASM
  1. MOVLW   PORTA,70H       ; Sólo quiero agregar a W los pines RA6:RA4

No se si intentas agregarlos, o directametne que W tenga los valores unicamente de RA6:RA4,  si queres tomar solo algunos valores, debes usar una AND como una mascara.
"Agregarlos" significaria que los demas bits que no son de interes queden con el valor que tenian antes.

Código: ASM
  1. MOVLW 0x70         ; W = 0b0111 0000 , es mi "mascara"
  2. ANDWF PORTA, W  ; W = PORTA and W, hago una AND entre PORTA y W, de esa forma solo quedan los bits de RA4 a RA6, y todos los demas en 0.

Pero ojo.... esto deja los bits en ese lugar. Para bajarlos y sumarlos/restarlos comunmente, vas a necesitar un swap, es decir vas a tener algo asi: 0xxx 0000 y queres que quede asi: 0000 0xxx. La forma mas corta de hacer todo esto es:

Código: ASM
  1. SWAPF PORTA, W ; Cambio los nibles como explique antes y lo pongo en W
  2. ANDLW 0x7  ; Hago una AND donde ahora estarian mis RA6:RA4 (ahora estarian en el lugar de RA2:RA0 )


------------------------------------------------------

Con respecto a leer el pin es correcto.

------------------------------------------------------

Código: ASM
  1. ADDWF   PORTA,07H,W     ; Quiero hacer la suma sólo sobre W y RA2:RA0

Aca te va a faltar un registro para usar seguramente. Primero debemos obtener solos los valores de RA2 a RA0. Lo hacemos de la misma forma que antes:

Código: ASM
  1. MOVLW 0x07
  2. ANDWF PORTA, W

Hasta ahi tenemos que W, tiene el valor de RA0 a RA2, el problema es lo otro que tenemos que sumar. Si por ejemplo las entradas de RA4 a RA6 lo pusiste en un registro llamado ENTRADAB el codgio completo te quedaria asi:

Código: ASM
  1. MOVLW 0x07
  2. ANDWF PORTA, W
  3. ADDWF ENTRADAB, W

Ese ultima instruccion sumaria lo de las entradas RA2:RA0 que se encuentra en W, y lo que esta en ENTRADAB que seria RA6:RA4  (que pusimos los bits en la posicion correcta) Y todo eso fue a parar a W.

-----------------------------

Código: ASM
  1. RESTA   SUBWF   PORTA,07H,W     ; Quiero hacer la resta sólo sobre W y RA2:RA0

Otra ves... W lo vas a necesitar para quitar RA2:RA0 del PORTA, por lo tanto lo que tenias pensado en tener en W lo vas a tener que tener en otro registro.

Desconectado Dave_butd

  • PIC10
  • *
  • Mensajes: 3
Re:Ayuda, errores en mi primer programa PIC16F628A
« Respuesta #4 en: 25 de Septiembre de 2017, 00:10:50 »
Te agradezco muchísimo, KILLERJC, me has sido de muchísima ayuda, y aprendí cosas nuevas con tu aportación.
Gracias por tu tiempo, ¡Eres grande!
Sigue así, saludos.

Desconectado Arenado98

  • PIC10
  • *
  • Mensajes: 4
Re:Ayuda, errores en mi primer programa PIC16F628A
« Respuesta #5 en: 05 de Octubre de 2017, 15:05:17 »
Te agradezco muchísimo, KILLERJC, me has sido de muchísima ayuda, y aprendí cosas nuevas con tu aportación.
Gracias por tu tiempo, ¡Eres grande!
Sigue así, saludos.

He entrado al foro y ya tengo la solución! Gracias!!


 

anything