picto los pines 7 a 10 de la LCD deben ir a 5 V entanto que los pines 1, 2 y 3 controlan el contraste de la LCD.
Te dejo una imagen de lo que menciono.
Saludos LabPIC.
PD: no hagas caso a al PIC16F84, pues las conexiones son las mismas para cualquier otro PIC que se utilize, fijate que aqui se utiliza el puerto B y A del micro (unicamente se utilizan 7 pines) puedes modificarlo para que se adecue al puerto D que tienes aun libre.
picto, te he respondido tu duda sobre los errores al ensamblar y no me has respondido.
Si te sigue dando errores, el software NO FUNCIONARA ya que el archivo .HEX pudiera tener cualquier cosa.
Saludos
maunix, he copiado las rutinas (que no sé si realmente serán buenas) en la carpeta donde tenía el programa.
Luego he utilziado # como bien me has dicho, los errores que me salian al compilar, los he solucionado poniendo en el encabezado del programa
LCD_Inicializa
LCD_Mensaje
LCD_Linea2
LCD_Mensaje
He probado de todo...
En la misma carpeta poniendo #include como me has dicho... y nada... lo que no sé si las librerías tienen que ser *.inc o *.lib, el programa lo estoy haciendo en assembler...
Mañana por la mañana vovleré a ver si puedo avanzar algo... yo creo que es lo que tu dices... que cuando llamo a la etiqueta no la encuentra...
La rutina para la LCD debe de ser #Include "nombre.lib"
Saludos LabPIC
LIST p=16f877 ;indicamos procesador que utilizamos
#include <p16f877.inc> ;processor specific definitions
__config _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF
ERRORLEVEL -302 ;elimina mensaje de warning "not in bank 0"
ERRORLEVEL -203 ;elimina mensaje de warning
ERRORLEVEL -305 ;elimina mensaje de warning
ERRORLEVEL -205 ;elimina mensaje de warning
;**************Definimos variables para la demora ******************************************
temp_1 equ 20h ;definimos variable temp_1 para la demora
temp_2 equ 21h ;definimos variable temp_2 para la demora
pcl equ 22h ;Registro PC
;**************Definimos el puerto de conexionado del LCD, en este caso Puerto D ***********
#define DB4 PORTD,0 ;DB4 del LCD está conectado a pin RD0 del pic
#define DB5 PORTD,1 ;DB5 del LCD está conectado a pin RD1 del pic
#define DB6 PORTD,2 ;DB5 del LCD está conectado a pin RD2 del pic
#define DB7 PORTD,3 ;DB5 del LCD está conectado a pin RD3 del pic
#define PINRS PORTD,4 ;Pin RS del LCD está conectado a pin RD4 del pic
#define PINE PORTD,5 ;Pin E (enable) del LCD está conectado a pin RD5 del pic
;************************ RESET Y VERCTORES INT ********************************************
org 00h ;Vector de reset (aqui viene el micro cuando arranca)
goto Inicio ;inmediatamente lo mandamos a Inicio
org 0x05 ;Le indicamos en que posición de memoria comienza lo que sigue
Inicio ;------------------------ INICIALIZA MICROPOCESADOR ---------------------------
;Inicializa puertos y LCD
IniPorts
clrf PORTA ;pone a 0 el puerto A
clrf PORTB ;pone a 0 el puerto B
clrf PORTC ;pone a 0 el puerto C
clrf PORTE ;pone a 0 el puerto E
bsf STATUS,RP0 ;Seleccionamos Bank 1
movlw 0x06 ; ponemos todos los pines
movwf ADCON1 ; como digital TTL
clrf TRISA ;indicamos puerto A salidas
clrf TRISB ;indicamos puerto B salidas
clrf TRISC ;indicamos puerto C salidas
clrf TRISD ;indicamos puerto D salidas
bcf STATUS,RP0 ;Seleccionamos Bank 0
call LCD_Inicializa ;inicializamos el LCD desde la librería.
call LCD_2Lineas4Bits5x7 ;le ponemos en modo 4 bits 2 líneas
Main
; Inicialización del módulo LCD
call LCD_Borra ;borramos pantalla LCD
movlw mensaje1 ;movemos a W el valor que contiene Mensaje1
call LCD_Mensaje ;mostramos en el lcd el mensaje2
call LCD_Linea2 ;pasamos a la línea 2
movlw mensaje2 ;cargamos mensaje AMIGOS
call LCD_Mensaje ;muestra el mensaje AMIGOS
loop goto loop
;Mensajes a mostrar
Mensajes
addwf pcl,f
mensaje1 dt"GRACIAS",0x00
mensaje2 dt"AMIGOS", 0x00
finmensajes
include <P876ALCD_4B.INC>
include <RETARDOS.INC>
include <LCD_MENS.INC>
end
El problema radicaba básicamente por lo que comentaba maunix... es decir, iba a los labels, pero como no había nada no hacía anda. Entonces la forma de que el MPlab compile las librerías es metiendo las librerías en la carpeta MPASM Suite que es la ubicación de todas las librerías usadas por MPLab.
Y la forma de incluirlas en el programa principal es poniendolo abajo del todo (antes del END) de la siguiente forma
include <NOMBRE LIBRERÍA.INC> de sta forma funciona, es decir compila bien.
Entonces, una vez arreglado esto, he hecho un mini programa que me muestre la palabra GRACIAS, pero al ejecutar el programa en la placa me muestra el display lleno de G's.
Una disculpa maunix :D :D, pero me refería eso que comentas, lo que pasa es que lo di por hecho.
Ya he modificado el mensaje anterior :mrgreen:
Saludos LabPIC
Principal
movlw Mensaje0 ; Apunta al mensaje 0.
call Visualiza
movlw Mensaje1 ; Apunta al mensaje 1.
call Visualiza
movlw Mensaje2 ; Apunta al mensaje 2.
call Visualiza
call Retardo_5s ; Permanece apagada durante este tiempo.
goto Principal ; Repite la visualización de todos los mensajes.
;
; Subrutina "Visualiza" -----------------------------------------------------------------
;
Visualiza
call LCD_Mensaje
call Retardo_2s ; Visualiza el mensaje durante este tiempo.
call LCD_Borra ; Borra la pantalla y se mantiene así durante
call Retardo_200ms ; este tiempo.
return
; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
addwf PCL,F
Mensaje0 ; Posición inicial del mensaje 0.
DT "Hola amigos", 0x00
Mensaje1 ; Posición inicial del mensaje 1.
DT "esto parece", 0x00
Mensaje2 ; Posición inicial del mensaje 2.
DT "que funciona", 0x00
include <P876ALCD_4B.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <RETARDOS.INC>
END
Para que sirve y que significa la instrucción:
CBLOCK 0x0C
ENDC
O sea puedo declarar variables dentro de estas dos limites de direcciones y acceder en un programa a ellas sin importar en que banco me encuentre :mrgreen:. Es genial esto.Aprendiendo más cositas...
Gracias BrunoF :)
No cabe duda que todos los dias aprendemos algo nuevo
Saludos LabPIC
Por cierto como sé cuanto ocupa cada variable?
Ahora mismo, el programa al llegar a un punto se resetea y vuelve a empezar y no sé porqué...
Probaré ahora, a ver si se soluciona.
Entonces copio las tablas de los mensajes arriba despues del ORG y el Goto Inicio?
Que es el pclath?
Saludos
Ok, pero me comentas que ponga las tablas abajo del todo, y ya lo están. No sé exactamente que debo de modificar.
Saludos y gracias
Hola de nuevo amigos!
He avanzado en el programa y casi lo tengo listo... pero me ha vuelto a pasar lo siguiente:
Argument out of range. Least significant bits used.
Argument out of range. Least significant bits used.
Son los 2 últimos mensajes que añadí el número 32 y el 33... como sé cuantos mensajes puedo escribir y cuando me dá el fallo?
Puse los mensajes arriba del todo, pero he leido y releido lo que comentais del PC, PCL y PCLATCH y no acabo de entender com ohacer para que no me dé fallo.
Tengo que cambiar de banco? O como? Estoy se complica por momentos...
Mensajes
addwf PCL,F
Mensaje0 DT " XXXXXXX", 0x00
Mensaje1 DT " XXXXXXX", 0x00
Mensaje2 DT "XXXXXXX", 0x00
Mensaje3 DT "XXXXXXXXXXXX", 0x00
Mensaje4 DT "XXXXXXXXX", 0x00
Mensaje5
Mensaje6
Mensaje7
Mensaje8
Mensaje9
Mensaje10
Mensaje11
Mensaje12
Mensaje13
.
.
.
.
.
Mensaje32 DT "Salidas ON", 0x00
Mensaje33 DT "Salidas OFF", 0x00
Mensaje34 DT"Activacion aut.",0x00
Mensaje35 DT" salidas", 0x00
Finmensajes He resumido la tabla, pero vá desde Mensaje1 a Mensaje35.
Pero puede que aún tenga que poner 5 o 6 mensajes más...
Tu lo tienes muy claro, pero yo esque soy novato, y no sé como hacer para poder escribir mas mensajes...
BrunoF, gracias por el interes y la ayuda... no voy a preguntaros más cosas porque entiendo que la gente se canse de explicar las cosas muchas veces...
maunix, perdoname :?
Hola amigos, vuelvo a estar por aquí!
A ver si esta semana tengo un poco de tiempo y vuelvo a intentar resolver mis dudas.
Muanix, que sí, que tienes razón. Lo suyo es entender uno mismo las cosas.
PEro el datasheet si estuviera en castellano, entendería el 80% de lo que dice, pero en ingles encima, la cosa se complica. Aparte que comenta cosas que me pierdo.
Voy a intentar como he dicho, hacer que funcione y sui veo que me atasco os digo...
Esque lo suyo es saber lo que se hace...
Hola picto. No me molesta explicar. Pasa que este tema es bastante delicado,largo y confuso.Si tenes MSN fijate en mi perfil que figura mi mail, agregame y te lo explico x ahi que va a ser mas rapido.
A los PICs los aprendi solito. Mirando codigo ajeno y leyendo, leyendo muchos datasheets. Pero nadie me explico nada. Excepto mi gran maestro Peter Jakab (www.jap.hu (http://www.jap.hu)) quien me oriento con un par de dudas de novato.
Programar en ASM implica irremediablemente conocer el Hardware de un PIC al 100%, cosa que quienes programan en lenguajes de mas alto nivel no tienen obligacion de conocer(y muchos no conocen absolutamente nada pero programan y funcionan).
Fijate sino,por ejemplo, lo facil que es escribir en una memoria I2C programando en C, mientras que yo pa lograrlo he sudado 3 dias enteros...
Ahora, si hablamos de programacion....pues es lo que he estudiado en la Universidad.
Bueno, seguimos x MSN este tema si te parece. Saludos.
35: Mensajes
0001 0782 ADDWF 0x2, F 36: addwf PCL,F
0002 3420 RETLW 0x20 37: Mensaje0 DT " mensaje 0", 0x00
0011 3420 RETLW 0x20 38: Mensaje1 DT " mensaje 1", 0x00
001F 3442 RETLW 0x42 39: Mensaje2 DT "mensaje 2", 0x00
002F 3450 RETLW 0x50 40: Mensaje3 DT "mensaje 3", 0x00
0040 3450 RETLW 0x50 41: Mensaje4 DT "mensaje 4", 0x00
004A 3450 RETLW 0x50 42: Mensaje5 DT "-" , 0x00
005B 3450 RETLW 0x50 43: Mensaje6 DT "-", 0x00
0068 3456 RETLW 0x56 44: Mensaje7 DT "-", 0x00
0078 3456 RETLW 0x56 45: Mensaje8 DT "-", 0x00
0088 3456 RETLW 0x56 46: Mensaje9 DT "-", 0x00
0098 3456 RETLW 0x56 47: Mensaje10 DT "-"0x00
00A8 3456 RETLW 0x56 48: Mensaje11 DT "-"0x00
00B8 3456 RETLW 0x56 49: Mensaje12 DT "-"0x00
00C8 3450 RETLW 0x50 50: Mensaje13 DT "-",0x00
00D9 3445 RETLW 0x45 51: Mensaje14 DT "-", 0X00
00E3 3445 RETLW 0x45 52: Mensaje15 DT "-", 0x00
00ED 3445 RETLW 0x45 53: Mensaje16 DT "-", 0x00
00F7 3441 RETLW 0x41 54: Mensaje17 DT "-", 0x00
0102 344C RETLW 0x4c 55: Mensaje18 DT "-", 0x00
010F 3452 RETLW 0x52 56: Mensaje19 DT "-", 0x00
011A 344D RETLW 0x4d 57: Mensaje20 DT "-", 0x00
0125 3445 RETLW 0x45 58: Mensaje21 DT "-", 0x00
0132 3445 RETLW 0x45 59: Mensaje22 DT "-", 0x00
013F 3445 RETLW 0x45 60: Mensaje23 DT "-", 0x00
014C 3445 RETLW 0x45 61: Mensaje24 DT "-", 0x00
0159 3443 RETLW 0x43 62: Mesnaje25 DT "-", 0x00
0164 344D RETLW 0x4d 63: Mensaje26 DT "-", 0x00
016F 3442 RETLW 0x42 64: Mensaje27 DT "-", 0x00
017B 3441 RETLW 0x41 65: Mensaje28 DT "-", 0x00
0187 3443 RETLW 0x43 66: Mensaje29 DT "-",0x00
0194 3441 RETLW 0x41 67: Mensaje30 DT "-", 0x00
019E 3449 RETLW 0x49 68: Mensaje31 DT "-", 0x00
01AC 3453 RETLW 0x53 69: Mensaje32 DT "-", 0x00
01B7 3453 RETLW 0x53 70: Mensaje33 DT "-", 0x00
01C3 3441 RETLW 0x41 71: Mensaje34 DT"-",0x00
01D3 3420 RETLW 0x20 72: Mensaje35 DT" -", 0x00
01DE 3449 RETLW 0x49 73: Mensaje36 DT"mensaje 36", 0x00
74: Finmensajes
Ok, maunix.
Gracias :-/
Bueno, vuelvo a la carga.
Ahora qu tengo un poco de tiempo voy a vovler a revisar y entender las cosas.
Lo que sí he averiguado... que aparte, el problema que yo tenía en el programa es que la librería que me pasarón del control de LCD solo es válida si no supera 256 posiciones... osea que aunque hiciera bien el programa, no me funcionaria si no tengo una librería que me deje.
Saludos
Hola Picto, he estado mirando la librería de control del LCD (P876ALCD_4B.INC) y no encuentro razones para que no la puedas usar con tablas de más de 256 valores. Si utilizas las rutinas que ha publicado Maunix, añadiendo un byte más para llegar a 16 de Offset como dice el código, podrás hacerlo funcionar bien.
Picto debo estar quedandome ciego :D, no veo el archivo
Maunix, que es eso de macros?
maunix, eres la máquina! Esque en uno de tus ejemplos he visto que comentabas algo de usar macros, de ahí la prgunta.
Gracias
Hola Picto, no he tenido tiempo de ver tu código hasta ahora, pero bueno mejor tarde que nunca.
He tenido que sustituir tu archivo P876ALCD_4B.INC por el original LCD_4BIT.INC para que funcionase. Adjunto te remito los que yo he utilizado.
He hecho unas modificaciones a tu código y al LCD_MENS.INC le he incluido un par de líneas y todo va bien.
Sería conveniente que leas lo que los compañeros te han dicho y así podrás entender lo que hace el código, pero si aún sigues con dudas sólo tienes que preguntar.
Saludos
list p=16f84a
#include <p16f84a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _CP_OFF & _PWRTE_ON
CBLOCK 0X0C
CONT
ENDC
ORG 0
BSF STATUS,5
MOVLW 0X18
MOVWF TRISA
MOVLW 0X0F
MOVWF TRISB
BCF STATUS,5
OTRO BTFSS PORTA,3
GOTO OTRO
CALL LCD_Inicializa
CALL LCD_CursorOFF
MOVLW 'B'
CALL LCD_Caracter
MOVLW 'i'
CALL LCD_Caracter
MOVLW 'e'
CALL LCD_Caracter
MOVLW 'n'
CALL LCD_Caracter
MOVLW 'v'
CALL LCD_Caracter
MOVLW 'e'
CALL LCD_Caracter
MOVLW 'n'
CALL LCD_Caracter
MOVLW 'i'
CALL LCD_Caracter
MOVLW 'd'
CALL LCD_Caracter
MOVLW 'o'
CALL LCD_Caracter
MOVLW 4
CALL LCD_PosicionLinea2
MOVLW 'M'
CALL LCD_Caracter
MOVLW 'e'
CALL LCD_Caracter
MOVLW 'c'
CALL LCD_Caracter
MOVLW 'a'
CALL LCD_Caracter
MOVLW 't'
CALL LCD_Caracter
MOVLW 'r'
CALL LCD_Caracter
MOVLW 'o'
CALL LCD_Caracter
MOVLW 'y'
CALL LCD_Caracter
MOVLW 'e'
CALL LCD_Caracter
MOVLW 'r'
CALL LCD_Caracter
BOTON BTFSS PORTB,0
GOTO BOTON
CALL LCD_Borra
MOVLW 'A' ;SEGUNDO MENSAJE
CALL LCD_Caracter
MOVLW 'u'
CALL LCD_Caracter
MOVLW 't'
CALL LCD_Caracter
MOVLW 'o'
CALL LCD_Caracter
MOVLW 'D'
CALL LCD_Caracter
MOVLW 'e'
CALL LCD_Caracter
MOVLW 's'
CALL LCD_Caracter
MOVLW 't'
CALL LCD_Caracter
MOVLW 'r'
CALL LCD_Caracter
MOVLW 'u'
CALL LCD_Caracter
MOVLW 'c'
CALL LCD_Caracter
MOVLW 'c'
CALL LCD_Caracter
MOVLW 'i'
CALL LCD_Caracter
MOVLW 'o'
CALL LCD_Caracter
MOVLW 'n'
CALL LCD_Caracter
MOVLW 6
CALL LCD_PosicionLinea2
MOVLW 'E'
CALL LCD_Caracter
MOVLW 'n'
CALL LCD_Caracter
MOVLW ':'
CALL LCD_Caracter
CALL LCD_UnEspacioBlanco
MOVLW 10
MOVWF CONT
MUGEN MOVLW 10
CALL LCD_PosicionLinea2
MOVF CONT,0
CALL TABLA
DECFSZ CONT,1
GOTO MUGEN
CALL LCD_Borra
MOVLW 8
CALL LCD_PosicionLinea1
MOVLW 'B'
CALL LCD_EscribeLCD
MOVLW 'Y'
CALL LCD_EscribeLCD
MOVLW 'E'
CALL LCD_EscribeLCD
CALL Retardo_1s
CALL LCD_OFF
TABLA addwf PCL,1
retlw 'S'
retlw '0'
retlw '1'
retlw '2'
retlw '3'
retlw '4'
retlw '5'
retlw '6'
retlw '7'
retlw '8'
retlw '9'
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END