TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: migsantiago en 03 de Mayo de 2004, 15:20:00
-
Ya escribí mi primer programa en MPLAB 6.4 para el pic16f84a.
Es un programa que establece al puerto a como entrada y al puerto b como salida. Obtiene dato de pto a, le suma 0x02 y luego saca el resultado a pto b.
Salvé el archivo como .asm y adjunté el linker 16f84a.lkr. El programa .asm es como sigue:
----------
LIST P=16F84A
#include <p16F84a.inc>
porta EQU 0x05 ;banco 0
portb EQU 0x06 ;banco 0
estado EQU 0x03 ;status
banco EQU 5 ;bit de localidad status
ORG 0
BSF estado,banco ;pone a uno bit 5 status = banco 1
MOVLW 0xff
MOVWF TRISA ; pto a es de entrada
BCF estado,banco ;pone a cero bit 5 status = banco 0
MOVLW 0x00
MOVWF TRISB ; pto b es de salida
inicio MOVF porta,W ;carga W con pto a
ADDLW 0x02 ;suma W + 0x02
MOVWF portb ;manda W a ptob
GOTO inicio
END
--------------
Según entiendo el código está bien, pero me marca el sig. error al construirlo:
-----------------
Deleting intermediary files... done.
Executing: "C:Archivos de programaMPLAB IDEMCHIP_Toolsmpasmwin.exe" /q /p16F84A "ptoayptob.asm" /l"ptoayptob.lst" /e"ptoayptob.err" /o"ptoayptob.o"
Message[302] C:TEMPORALPICBORRAPTOAYPTOB.ASM 14 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:TEMPORALPICBORRAPTOAYPTOB.ASM 17 : Register in operand not in bank 0. Ensure that bank bits are correct.
Executing: "C:Archivos de programaMPLAB IDEMCHIP_Toolsmplink.exe" "16f84a.lkr" "C: emporalpicborraptoayptob.o" /o"ptoayptob.cof"
MPLINK 3.60, Linker
Copyright (c) 2003 Microchip Technology Inc.
Error - section ".org_0" can not fit the absolute section. Section ".org_0" start=0x00000000, length=0x00000014
Errors : 1
BUILD FAILED: Mon May 03 15:19:08 2004
---------------
Por favor dígame alguien que estoy haciendo mal. Gracias.
-
segun tengo entendido despues de:
Org 0
TE FALTA :
goto inicio
0RG 5
Inicio y apartir de aqui tu programa
-
El error que te veo es que el estado,banco se deve de poner en "1" para iniciar tanto el portb como el porta y solo cuaando ellos ya estan inicializados se pone "0" en el estado,banco ademas debes de poner despues de tu org "0" deves de poner un goto inicio y despues poner un org 04 y ademas no se si te fijaste que pusiste a porta como entrada y a portb como salida y dime como le entra el dato a porta con pulsadores? si es asi hay que hacer una rutina mas clara para que el pic sepa que es lo que tiene que hacer bueno has los cambios y luego avisa como te fue. suerte.
-
Vamos que tu programa quedaria asi:
Teb he marcado en rojo los cambios
----------
LIST P=16F84A
#include <p16F84a.inc>
porta EQU 0x05 ;banco 0
portb EQU 0x06 ;banco 0
Las dos lineas que siguen si las quieres utilizar te falta un #define, pero segun te he puesto el codigo no las necesitas[/color]
estado EQU 0x03 ;status
banco EQU 5 ;bit de localidad status
ORG 0
goto inicio
ORG 5
inicio BSF STATUSRO0 ;pone a uno bit 5 status = banco 1
MOVLW 0xff
MOVWF TRISA ; pto a es de entrada
BCF STATUS,RP0; pone a cero bit 5 status = banco 0
MOVLW 0x00
MOVWF TRISB ; pto b es de salida
Bucle MOVF porta,W ;carga W con pto a
ADDLW 0x02 ;suma W + 0x02
MOVWF portb ;manda W a ptob
GOTO bucle
END
-
Si quieres poner tus 2 lineas anteriores el programa te quedaria:
LIST P=16F84A
#include <p16F84a.inc>
#define Banco_0 equ bcf STARUS,RP0
#define Banco_1 equ bsf STATUS,RP0
ORG 0
goto inicio
ORG 5
inicio BSF STATUS,RP0 ;pone a uno bit 5 status = banco 1
MOVLW 0xff
MOVWF TRISA ; pto a es de entrada
BCF STATUS,RP0; pone a cero bit 5 status = banco 0
MOVLW 0x00
MOVWF TRISB ; pto b es de salida
Bucle MOVF porta,W ;carga W con pto a
ADDLW 0x02 ;suma W + 0x02
MOVWF portb ;manda W a ptob
GOTO bucle
END
Por otra parte si incluyes el fichero "*.INC" no te hace falta declarar los puertos a y b pues ya van incorporados en el fichero "inc".
Ademas si es para simular con el MPLab en las entradas no te hacen falta retardos ya que los bits se cambian por software.; otro caso muy diferente será cuando lo quieras simular en tiempo real y si las entradas son por pulsadores, como dice nuestro colega Micom, tendrás que poner retardos para eliminar los rebotes que se producen al cerrar los pulsadores y/o interruptores.
espero que te sirva de ayuda
fermin
-
Con las prisas no cambie las lineas aqui estan, de todos modos funcionan igual
LIST P=16F84A
#include <p16F84a.inc>
#define Banco_0 equ bcf STARUS,RP0
#define Banco_1 equ bsf STATUS,RP0
ORG 0
goto inicio
ORG 5
inicio Banco_1;pone a uno bit 5 status = banco 1
MOVLW 0xff
MOVWF TRISA ; pto a es de entrada
Banco_0; pone a cero bit 5 status = banco 0
MOVLW 0x00
MOVWF TRISB ; pto b es de salida
Bucle MOVF porta,W ;carga W con pto a
ADDLW 0x02 ;suma W + 0x02
MOVWF portb ;manda W a ptob
GOTO bucle
END
Por otra parte si incluyes el fichero "*.INC" no te hace falta declarar los puertos a y b pues ya van incorporados en el fichero "inc".
Ademas si es para simular con el MPLab en las entradas no te hacen falta retardos ya que los bits se cambian por software.; otro caso muy diferente será cuando lo quieras simular en tiempo real y si las entradas son por pulsadores, como dice nuestro colega Micom, tendrás que poner retardos para eliminar los rebotes que se producen al cerrar los pulsadores y/o interruptores.
espero que te sirva de ayuda
fermin
-
En mi opinión lo teneís mal al volver al banco 0 antes de definir el puerto B como salida. Además no te hace falta linkarlo con que utilices el comando "Quickbuild ....." del menú "Proyect" en el MPLAB es suficiente. Tu programa debería ser como sigue:
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
Constante EQU 0x02
ORG 0
bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B configuradas como salidas.
movlw b"00011111" ; Las 5 líneas del Puerto A configuradas como entradas.
movwf TRISA
bcf STATUS,RP0 ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
Principal
movf PORTA,W ; Carga el registro de datos del Puerto A en (W).
addlw Constante ; (W)=(PORTA)+Constante.
movwf PORTB ; El contenido de W se deposita en el puerto de salida.
goto Principal ; Crea un bucle cerrado e infinito.
END ; Fin del programa.
-
LIST P=16F84A
#include <p16F84a.inc>
porta EQU 05h ; banco 0
portb EQU 06h ; banco 0
estado EQU 03h ; status
banco EQU 05h ; bit de localidad status
; no ocupes tris es una instruccion pasada.
; solo cambio de banco el micro sabe que es tris
ORG 0
BSF estado,banco ;pone a uno bit 5 status = banco 1
MOVLW 0xff
MOVWF porta ; pto a es de entrada
MOVLW 0x00
MOVWF porta ; pto b es de salida
BCF estado,banco ;pone a cero bit 5 status = banco 0
inicio MOVF porta,W ;carga W con pto a
ADDLW 0x02 ;suma W + 0x02
MOVWF portb ;manda W a ptob
GOTO inicio
end
esta bien tu programa un solo detalle
-
Tenias razon compis. Puse mal el regreso del banco antes de configurar el puertoB.
Son cosas de contestar en el curro de prisa y corriendo.
Pero ahora al revisar el código os tengo que dar la razon en lo de la linea BCF STATUS,RP0
Por lo demas el programa funciona
Saludos a todos,
Fermín
-
Orale pues chavos, muchas gracias por responder. Me llegaron a confundir poniendo cada uno un programa a cada rato jeje.
La verdad no le puse pulsadores ni interruptores ya que es mi primer programa en pic y sólo quería ver que lo compilara bien. 
Gracias Fermín, Micom y Ma-tec.
-
Analizando el programa me doy cuenta de que se debe poner un jump a la dirección 05 o a la 04 (org 04 ó 05).
¿Es necesario mandar siempre a la dirección 05 de memoria? He leído que es para evitar interrupciones o algo así.
Sólo me gustaría saber si es necesario ponerla siempre, y si es mejor poner 04 ó 05.
-
Hola santiago:
Siempre es conveniente poner el ORG 5, el org 4 solo lo debes de poner antes del ORG 5 si utilizas interrupciones, en caso contrario no es necesario.
Saludos
Fermin
-
OK, gracias Fermín.
Cualquier otra duda la pondré aquí.