TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: RaDoN en 14 de Abril de 2005, 17:15:00

Título: Rutina LCD 4 Bits
Publicado por: RaDoN en 14 de Abril de 2005, 17:15:00
Buenas poseo la rutina para el control del LCD con 4 bits. Es la que todos conoceis del libro de ra-ma. Pero tengo un problema, primero mi LCD es un 4x20, con lo que la modifique cono viene en la faqs del libro.

Luego la duda esta aquí, en mi entrenador uso para el control (RS,RW,E) el puerto D (d0,d1,d2) y para datos el puerto D tb (d4,d5,d6,d6). Queria sabes si esto interfiere en el buen funcionamiento ya que inicialmente esta estaba para puertos distintos y e visto que "juega" con el puerto D y por ello kizás es por lo que no me anda.

Si alguien posee una rutina que funcione con la distribución que tengo lo agradeceria mucho.
Título: RE: Rutina LCD 4 Bits
Publicado por: antoniof en 16 de Abril de 2005, 20:14:00
Buenas.

Efectivamente tendrás que cambiar los pines RS, RW y E a otro puerto. Si no te es posible, vas a tener que revisar todas las subrrutinas de envío de datos al LCD y ver que no afecte a las señales de control, lo cual te costará más quizás, que hacerlas de nuevo tu mismo.
Título: RE: Rutina LCD 4 Bits
Publicado por: RaDoN en 23 de Abril de 2005, 15:53:00
Gracias por el interes, al final ya pude comandar el LCD, gracias a la rutina del libro de Ra-Ma (Pic 16f84a) y va de escandalo.
Título: RE: Rutina LCD 4 Bits
Publicado por: pentax30 en 15 de Agosto de 2005, 13:40:00
Buenas des de Cataluña

LLevo mucho tiempo en busca de una rutina para controlar mi LCD atrabes de un bus de datos de 4 bit. Utilizo una placa micropic Trainer de microsystem, i me interesaria poder seguir utilizando la misma placa de pruebas. He probado de programar con Lenguage C i si es mas facil pero, el programa que pretendo realizar no me cabe en la memoria del pic. Mas que personalmente me gusta poder conseguir un mayor control del pic i esto solo lo permite el Asambler
Gracias por vuestra atención.

Título: RE: Rutina LCD 4 Bits
Publicado por: mario_pastor en 07 de Diciembre de 2005, 17:44:00
Pentax30, si aún necesitas la rutinas en ASM puedes mirar este link
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 21 de Junio de 2006, 06:10:13
Estoy intentando gobernar un LCD 16x2 con un Pic 16f877. Y como solo tengo libre el puerto D (8 salidas) me han recomendado usar el LCD en modo 4 pins.

Espero poder ponerlo en marcha...
Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: microcom en 21 de Junio de 2006, 14:41:47
debes enviar primero el nible alto (cuatro bits de mayor peso) del dato y luego enviar el nible de menor peso del dato a visualizar. para mandar el nible mayor y el nible manor dede repetirse el mismo juego de instrucciones.


dato movwf  dato     aqui ya llega el dato a visualizar ya sea de tabla o un dato cualquiera.
       bsf  portb,e     
       movlw  0fh
       andwf   portb
       movf    dato,0
       andlw   0f0h
       iorwf    portb
       call      retardo
       bsf       portb,e
       call      retardo
       bsf       portb,e
       movlw  0fh
       andwf   portb,1
       swapf   dato,w
       andlw   0f0h
       iorwf    portb,1
       call      retardo
       bcf       portb,1
       call      retardo.
      return

bueno

 
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 22 de Junio de 2006, 04:37:56
Hola.
A ver... me estoy liando... tengo la libreria del LCD 4 bit, pero necesito tambien la librería RETARDOS.INC de donde la saco?

Gracias
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 22 de Junio de 2006, 09:50:57
Estoy de los nervios...

Tengo 2 archivos, uno el RETARDOS.INC y P876ALCD_4B.INC. A ver ya digo que soy novato, pero en el programa he puesto abajo del todo:

include <P876ALCD_4B.INC>
include <RETARDOS.INC>

Ok?

Bien pues en el programa principal le pongo LCD_Inicializa (que supongo irá a la rutina que está dentro de P876ALCD_4B.INC)  y tambien el siguiente código:

   call   LCD_Borra   ;borramos pantalla LCD
   movlw   mensaje1   ;movemos a W el valor que contiene Mensaje1 (Probador I/O)
   call   LCD_Mensaje   ;mostramos en el lcd el mensaje PROBADOR I/O
   call   LCD_Linea2   ;escribimos en la línea 2 del LCD
   movlw   mensaje2   ;movelos el valor de mensaje2 a w
   call   LCD_Mensaje   ;mostramos mensaje.

Pues al intentar compilar al HEX me dá todo el rato el mismo error y estoy desesperado... :x

Error[113]   C:\LCD\1\PROGRAMA_FORO_LCD.ASM 35 : Symbol not previously defined (LCD_Inicializa)
Error[113]   C:\LCD\1\PROGRAMA_FORO_LCD.ASM 56 : Symbol not previously defined (LCD_Borra)
Error[113]   C:\LCD\1\PROGRAMA_FORO_LCD.ASM 58 : Symbol not previously defined (LCD_Mensaje)
Error[113]   C:\LCD\1\PROGRAMA_FORO_LCD.ASM 59 : Symbol not previously defined (LCD_Linea2)
Error[113]   C:\LCD\1\PROGRAMA_FORO_LCD.ASM 61 : Symbol not previously defined (LCD_Mensaje)

Que está pasando?

Con el MPlab en HEADER FILES he añadido las librerias RETARDOS.INC y la del LCD.

Help
Gracias
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 22 de Junio de 2006, 11:52:57
picto el MPASM te está diciendo que no conoce las rutinas LCD_borrar, LCD_ Borra, LCD_Mensaje, LCD_Linea2

Si haces un include de la forma que lo has hecho, creo que te debiera dar error.  Hasta donde recuerdo la directiva include necesita un # adelante , aunque tal vez me esté confundiendo con otro lenguaje.

Si usas <> para enmarcar el nombre de archivo, el mpasm asumirá que están en la misma carpeta o subdirectorio en donde está tu archivo PROGRAMA_FORO_LCD.ASM.asm es decir c:\LCD\1 ó bien en los paths del sistema operativo (aunque el mplab cuando se instala agrega paths a los subdirectorios donde se instala).  Por eso si hacemos un include de los archivos .inc que definen a los pics, no hay problemas y siempre los encuentra.

Si están en otra carpeta debes usar las comillas así:

Código: ASM
  1. #include "c:\micarpeta\RETARDOS.INC"
  2.         #include "c:\micarpeta\P876ALCD_4B.INC"


Leyendo los errores, creo que no has posteado todo el código, pero bueno, tal vez con esto ya te sirve para continuar.

Te aconsejo además usar los marcos [ code = asm ]  y [ / code] para enmarcar tu código así se hace más legible.

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 22 de Junio de 2006, 12:54:36
Llevo todo el santo día y no consigo hacer que salga ni una letra por el puerto D de un pic16f877.

Alguien puede aunque sea ayudarme a mostrar 1 sola letra? Una vez consiga  eso creo qyue podré ir paso a paso... :-)

(http://img73.imageshack.us/img73/8759/lcd9bw.png) (http://imageshack.us)

El LCD lo tengo conectado de la siguiente manera, interface 4 bits.

Tenía mi programa hecho y he querido implementarlo con un LCD, pero ya primero quiero hacer un mini programa que me muestre un mensaje y cuando me funcione, aplicarlo al programa verdader.

Tengo unas rutinas que me han pasado, pero no sé ni si funcionan o que hago mal.

GRACIAS!
Título: Re: Rutina LCD 4 Bits
Publicado por: LabPIC en 22 de Junio de 2006, 13:16:32
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.
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 22 de Junio de 2006, 14:41:00
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.

Sí sí, Labpic, si el circuito lo he montado en placa y he coenctado la alimentación y demás. La foto de arriba era para que se viera má que nada los bits que iba a utilizar del Puerto D.

Esque no he podido ni mostrar una sola letra!!! Y me fastidia estar todo el día y no conseguir ni una simple letra... esque veo ejemplos pereo todos a medias o les falta algo.

Por cierto cuando simulaba en proteus se me quedaba al 100% y no hacía nada y en la placa se me veía la primera línea oscura.

Saludos
Y si teneis un ejemplo de los más simple ya me ayudaría... :-/


Gracias Labpic
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 22 de Junio de 2006, 14:52:59
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


Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 22 de Junio de 2006, 15:22:29
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




Perdona, esque ahora estoy en el ordenador de casa tengo que buscar el post. Ahora te digo.

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 22 de Junio de 2006, 15:35:57
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

Y ya no me sale ese fallo... pero no lo entiendo, porque las subrutinas LCD_Inicia están dentro de la rutina P876ALCD_4B.INC, creo que el problema es cuando en mi programa principal le digo que haga algo de la librería P876ALCD_4B no la encuentra...

Me pasarón una rutina, pero no sé yó si será buena.

Os la pongo: http://rapidshare.de/files/23810913/P876ALCD_4B.INC.html

Entonces cuando en mi programa principal pongo LCD_Inicia ya es donde no lo encuentra...

Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 22 de Junio de 2006, 17:23:33
Mira, he echado un vistazo al archivo .inc que adjuntaste y tiene las rutinas que te hacen falta (más allá de que esten bien o mal).

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

Si tu agregas esos labels estas generando las etiquetas que te hacen falta, y por eso no te da error.  Tu código hace un call a una posición del programa definida por las etiquetas y al poner las etiquetas ya las encuentra entonces no te genera error.  Pero no hay código en estas supuestas 'subrutinas' . :?

En un código no puede haber 2 labels iguales, lo cual me hace pensar que si no te dió error de tener 2 labels te ensambla bien porque precisamente no te encuentra el archivo P876ALCD_4B.inc

Creo que tal vez en tu código estás haciendo mal el include, o te falta una letra o está mal el path o algo, pero de ninguna forma se está realizando.  Si no te anda y está bien, prueba hacer el include completo  así

#include "c:\micarpeta\archivo.inc"

con las comillas.


Resumen: Debes eliminar esos labels que agregaste y hacer que se te ensamble el archivo .inc  NO te da error pero el código no hace nada porque no hay nada en dichos labels.

Saludos


Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 22 de Junio de 2006, 18:30:44
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...
Título: Re: Rutina LCD 4 Bits
Publicado por: LabPIC en 22 de Junio de 2006, 18:36:24
La rutina para la LCD puede ser #Include "nombre.lib" o #Include "nombre.inc"

Saludos LabPIC
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 22 de Junio de 2006, 20:50:53
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...

¿Porqué no subes todo el proyecto en un archivo comprimido? así lo puedo ver y corregir si hay algo que veo mal.

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 22 de Junio de 2006, 20:54:14
La rutina para la LCD debe de ser #Include "nombre.lib"

Saludos LabPIC

¿Porqué dices eso LABPic?  Un archivo .inc también puede tener instrucciones en asm.

Tal vez tu estés hablando de alguna librería en concreto, pero los archivo .inc pueden ser ensamblados también.

Saludos


Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 23 de Junio de 2006, 09:48:44
Hola!
Bueno tengo buenas y malas noticias...

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.

Adjunto foto y el programita en cuestión.

(http://img148.imageshack.us/img148/7052/lcd0aw.jpg) (http://imageshack.us)


Gracias por la ayuda.

Código: [Seleccionar]
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
Título: Re: Rutina LCD 4 Bits
Publicado por: LabPIC en 23 de Junio de 2006, 12:50:23
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
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 23 de Junio de 2006, 14:20:46
picto antes que nada me alegro que hayas solucionado tu problema! (al menos en forma parcial).

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.


Creo que estas asumiendo demasiado.   :shock:

No es por corregir pero así es como tu lo solucionaste lo cual no significa que tu frase sea 100% cierta "la forma de incluirlas en el programa principal es poniendolo abajo del todo (antes del END) "

Tu dices que es "la forma" como si fuese la única manera, tengo muchos programas y en gral siempre dejo los .inc en la misma carpeta del proyecto y los referencio con las "" como mencioné antes y sí funciona.   :)



Con respecto a lo de poner "GRACIAS" no te funciona porque tu quieres hacer "movlw mensaje1" cuando esa instrucción solo puede recibir un valor de 8 bits o un byte, o un caracter (si lo ves como un char).

Entonces, hacer eso solo te devuelve la "G" que es el primer dato de la cadena de texto.

Para mostrar gracias, debes ir leyendo uno por uno los valores de 'mensaje1' es decir primero la G, luego la R y así sucesivamente.

Para ello se suele armar una tabla donde cada posición de la tabla es una letra del mensaje a mostrar.  Es tedioso, lo sé pero así se hace en ensamblador.  Debes hacer todo tu mismo.

Corrige eso y te saldrá el mensaje.

Si quieres probar una manera más simple, puedes hacer directamente also así como

Código: ASM
  1. movlw   'G'
  2.         call    LCD_Mensaje     ;mostramos en el lcd el mensaje2
  3.         movlw   'R'
  4.         call    LCD_Mensaje     ;mostramos en el lcd el mensaje2
  5.         movlw   'A'
  6.         call    LCD_Mensaje     ;mostramos en el lcd el mensaje2
  7.         movlw   'C'
  8.         call    LCD_Mensaje     ;mostramos en el lcd el mensaje2
  9.         movlw   'I'
  10.         call    LCD_Mensaje     ;mostramos en el lcd el mensaje2
  11.         movlw   'A'
  12.         call    LCD_Mensaje     ;mostramos en el lcd el mensaje2
  13.         movlw   'S'
  14.         call    LCD_Mensaje     ;mostramos en el lcd el mensaje2




Saludos ;)
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 23 de Junio de 2006, 14:24:45
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

No hay porqué disculparse, todos podemos equivocarnos.   :wink:

El punto era que no sabía si hablaban de alguna librería en concreto que conocieran tu y picto  :mrgreen:


Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 26 de Junio de 2006, 04:12:13
Hola amigos!
Bueno parece que he conseguido que muetre un mensaje... al final la cosa ha quedado así:

Código: [Seleccionar]
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

Pero hay una cosa que no entiendo...

Para que sirve y que significa la instrucción:
   CBLOCK  0x0C
   ENDC


Gracias!
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 26 de Junio de 2006, 04:41:05
Dedicada a Maunix, Labpic, microcom , pibe, etc... y a DavidG no recuerdo su nick!

(http://img221.imageshack.us/img221/4926/lcd0027ml.jpg) (http://imageshack.us)

Saludos!
Título: Re: Rutina LCD 4 Bits
Publicado por: pibe en 26 de Junio de 2006, 05:07:36
Juas.. muy buena picto!  :-/ FELICIDADES!
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 26 de Junio de 2006, 05:27:30
Jeje gracias a vosotros  :mrgreen:

Por cierto ahora me estoy peleando para poder utilizar la seguynda linea del LCD.
Porque solo puedo escribir de línea en línea y yo quiero poder mostrar 2 mensajes a la vez uno en la línea de arriba y otro en la de abajo...
 8)
Título: Re: Rutina LCD 4 Bits
Publicado por: BrunoF en 26 de Junio de 2006, 06:25:25
Picto, por si no te lo mencionaron, la segunda fila arranca desde la posicion 0x40 de la RAM del LCD, es decir que debes enviar los datos desde la 0x40 hasta la 0x4F. Lo comento x si las moscas.
Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 26 de Junio de 2006, 08:21:13
Para que sirve y que significa la instrucción:
   CBLOCK  0x0C
   ENDC


picto CBLOCK ENDC no es una instrucción en ensamblador sino mas bien una "directiva"

Con esto, le estas diciendo que todas las variables que declararas en el bloque , comenzarán a partir de 0x0C.

En vez de hacer un equ para cada variable, lo haces general.

Por ejemplo

Código: ASM
  1. TEMP1   equ     0x0C
  2.         TEMP2   equ     0x0D
  3.         TEMP3   equ     0x0E

Es idéntico a:

Código: ASM
  1. CBLOCK  0x0C
  2.         TEMP1
  3.         TEMP2
  4.         TEMP3
  5.         ENDC

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: LabPIC en 26 de Junio de 2006, 12:14:34
Felicidades picto :-/ :-/, todo esfuerzo tiene recompensa, no cabe la menor duda :mrgreen:.

Saludos LabPIC
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 26 de Junio de 2006, 12:37:58
Buenas tardes EQUIPO!

Al final he conseguido pode escribir en la línea de abajo.

Ya he juntado el primer programa que hice (el de ir pulsando un pulsador por RE0 ye ir activando todas las salidas del puerto A, B yC) y ahora he conseguido manejar el LCD pues juntarlos  :D


He hecho que al iniciar el Pic muestre un mensaje de bienvenida y luego Pulsar P1 para activar salidas.
Pero pasa una cosa muy rara... cuando llegala ultima salida y le vuelvo a dar yo quiero que me muestre un mensaje de PRUEBAS OK y empieze de nuevo, pero el pic se resetea solo la llegar a ese sitio.

Es decir, pulso la ultima salida, me muestra el mensaje rotante y antes de que acabe de rotar se resetea el pic y empieza de nuevo...

Voy avanzando pero cada vez salen problemas nuevos.

Maunix, gracias por lo del Cblock.

Una cosa, como sé si tengo memoria en el pic o como sé en que posicion definir variables?

Gracias. Mañana colgaré una foto!

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: LabPIC en 26 de Junio de 2006, 12:59:21
Con respecto a saber en que posicion definir variables, las data sheet muestran los bancos que tiene cada dispositivo, en esta información de los bancos, en la parte inferior de cada banco se muestra una parte que dice "General Purpose Register, estas direcciones estan alli para ser ocupadas por el usuario.

Por ejemplo el banco 0 del PIC16F877 tiene disponibles de la dirección 20h a la 7Fh para ser ocupadas por cualquier variable o constante que en determinado momento el usuario requiera, de igual manera el banco 1 tienes disponibles las direcciones A0h a EFh.

Aprovechando el momento, alguien puede decirme si las direcciones F0h a FFh del banco 1 del PIC16F877 pueden ser utilizadas por el usuario¿?, al igual que las que aparecen en los bancos 2 y 3 (por variables o constantes), es que no he entendido eso de accesses :mrgreen:.

Espero y no haberme y haberlos confundido esta vez. :roll:

Saludos LabPIC
Título: Re: Rutina LCD 4 Bits
Publicado por: BrunoF en 26 de Junio de 2006, 14:37:41
Hola LabPic.

Te debes estar refiriendo  a los: "accesses 70h-7Fh" que se ven en los Bancos 1,2 y 3 del 16F877.
Esto significa que las posiciones RAM 0x70h-0x7Fh pueden ser accedidas desde cualquiera de los cuatro bancos del pic. Es decir que no hay que cambiarse de banco para trabajar con estas variables.
Ejemplo: Si te refieres a la posicion RAM 0xF0, 0x170 ó 0x1F0 en realidad estas accediendo siempre a la 0x70.

A mi este acceso directo desde cualquier banco a estas variables me ha agilizado mucho los programas, ya que no hay que andar cambiando de banco para acceder a ellas, estes en el banco que estes, tienes asegurado que haras referencia a la mismas.

Saludos.
Título: Re: Rutina LCD 4 Bits
Publicado por: LabPIC en 26 de Junio de 2006, 14:46:22
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.

Gracias BrunoF :)

No cabe duda que todos los dias aprendemos algo nuevo

Saludos LabPIC
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 27 de Junio de 2006, 05:32:09
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.

Gracias BrunoF :)

No cabe duda que todos los dias aprendemos algo nuevo

Saludos LabPIC
Aprendiendo más cositas...

Por cierto como sé cuanto ocupa cada variable?
Título: Re: Rutina LCD 4 Bits
Publicado por: BrunoF en 27 de Junio de 2006, 06:03:44
Es verdad, siempre se aprende algo nuevo  :mrgreen:
A que variables te referis picto?
TODOS los registros especiales(SFR), como los destinados a usos generales(GPR) como los registros de la EEPROM poseen una longitud de 8 bits(1 byte).
Es decir que el cada registro puede contener un valor entre 0 y 255( en sistema decimal).
Si te estas refiriendo a la cantidad de registros GPR en cada banco, pues en la tabla de Memory Organization del datasheet tienes el rango y cantidad para cada banco.
Saludos.

Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 27 de Junio de 2006, 12:23:53
Por cierto como sé cuanto ocupa cada variable?

picto, si te refieres a las variables que tu defines en el código, bueno, solo tú podrás saber cuanto ocupan :)

Suena tonto, pero en ensamblador tienes que saber todo lo que haces.

Por eso si quieres definir una variable de 8 bits y otra variable de 16 bits lo haces 'salteandote' un posición de memoria cuando haces tus declaraciones de variables con los 'equs'

Ejemplo:
Código: ASM
  1. VAR8bits        equ     0x20
  2. VAR16bits       equ     0x21
  3. VARtmp8bits     equ     0x23

Fíjate que la posición de la primer variable es 0x20.

Luego la de la segunda variable es 0x21 porque la anterior variable la quiero de 8 bits

La variable Vartmp8bits se ubica a partir de 0x23 (2 posiciones más arriba) para permitirme que la variable VAR16bits sea de 2 bytes.

Luego por ejemplo en el código haces así.

Código: ASM
  1. incf    VAR16bits+0,f
  2.         incf    VAR16bits+1,f

De esa forma, en la segunda instrucción estamos seteando el byte 'alto' o 'high' de la variable.  (al menos así lo hago yo).

Nuevamente en ensamblador tu armas como te parezca.  Puedes hacer que el byte 0 sea tu low byte, o el high. 

Es tu decisión. 

De hecho la gente de intel hace eso, el low es el byte con posición de memoria mas baja y la gente de Motorola hace totalmente lo inverso.

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 28 de Junio de 2006, 04:41:47
Maunix, ya lo voy cogiendo... 16 bits = 2 posiciones 8 bits=1

8 bits x ejemplo 0x10
16 bits x ejemplo 0x11
16 bits x ejemplo 0x13


Tienes razón en cuanto en ensamblador hay que saber todo lo que se hace, y ese es mi problema, que soy novato y lo estoy aprendiendo por mi cuenta y con vuestra ayuda, y claro, habrá mil cosas que se me escapan.

Ahora mismo, el programa al llegar a un punto se resetea y vuelve a empezar y no sé porqué...

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: BrunoF en 28 de Junio de 2006, 07:33:04
Hola picto, postea el programa si podes para poder ayudarte mas rapido. Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 28 de Junio de 2006, 09:08:36
Ahora mismo, el programa al llegar a un punto se resetea y vuelve a empezar y no sé porqué...

Haz caso a lo que dice BrunoF, postea tu código.  Esto puede deberse a múltiples razones diferentes.

Saludos

Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 28 de Junio de 2006, 09:15:59
Ahí vá!

Tengo que ir mejorandolo poco a poco.

Lo que hace es:
- Muestra mensajes bienvenida.
- Espera a que haya un 1 en RE0 para activar salidas (cada vez que pulso RE0) , así hasta activar todo el Puerto A,B, C, Re1 y Re2.
- Vuelve a esperar y si pulsamos de nuevo RE0 debería mostrar un mensaje que se desplaza y luego saltar a la etiqueta empieza.

El problema es que cuando activo todas las salidas, y vuelvo a darle a RE0 me muestra el mensaje pero antes de que acabe se resetea y empieza desde el principo...

A ver que os parece...

Seguro que hay muchas cosas mal... :P

Título: Re: Rutina LCD 4 Bits
Publicado por: BrunoF en 28 de Junio de 2006, 09:40:47
Mirevision fugaz me suena a que tenes problemas con las tablas...problemas con el PCLATH(extenso tema, ya lo he explicado varias veces en el foro).

Move la parte de los Mensajes(las tablas) y ponelas debajo de:

   org     00h      ;Vector de reset (aqui viene el micro cuando arranca)
   goto    Inicio   ;inmediatamente lo mandamos a Inicio

proba y nos contas que tal te fue.
Saludos.
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 29 de Junio de 2006, 03:35:31
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
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 29 de Junio de 2006, 18:10:22
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

picto creo que debieras leer un poco el datasheet. 

Es un registro que guarda la parte HIGH del program counter del microcontrolador.

El PIC inicia en la posición 0x0000 y es esa la razón por la cual ahí debes poner un código que te lleve a otro lado o bien que haga algo en consecuencia pero no poner datos.

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: BrunoF en 29 de Junio de 2006, 23:46:16
Hola picto. Intente responderme mas temprano, pero se ve que el foro andaba caido y no pude.
Arriba no picto. abajo. el pic como te dijo maunix siempre inicia desde la posicion 0x000. Si lo pones arriba vas a producir un underflow del STACK, produciendo un reset eterno del pic. Si lo pones debajo, el goto inicio se encarga de desviar el programa sin problemas.
El PCL que es el contador de programa bajo, es de 8 bits(como todos los registros) y las tablas necesitan especial atencion cuando las colocas mas alla(o se cruzan) de la posicion 0xFF de la FLASH.
Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 30 de Junio de 2006, 02:59:36
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
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 30 de Junio de 2006, 08:43:51
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

Lo que te quiso decir Bruno es que tengas en cuenta también el PCLATH a la hora de hacer tus saltos de tabla porque si la misma está en medio de un salto de página tendrás problemas y así como está hecha no funcionará.

Para que tu rutina sea más genérica debes tener en cuenta el salto de página o mejor dicho el uso de los bits superiores del program counter. 

El program counter tiene 13 bits. Esto le permite ir de 0x0000 a 0x1FFF

Está separado en 2 registros de 8 bits . PCLATH:PCL

El PCL es solo la parte LOW.

Si solo usas la parte LOW (PCL) no podrás nunca hacer incrementos superiores dentro de una página de 256 bytes.

Por ejemplo

PC = 0x00F0
PCL = 0xF0
PCLATH = 0x00

Si le sumas 5

PC + 0x0005 = 0x00F5
PCL = 0xF5
PCLATH = 0x00

Ahora bien que pasa si le sumas 0x10 (16 en decimal)

PC + 0x0010 = 0x0100

PCL = 0x00
PCLATH = 0x01

Como tú haces, solo tienes en cuenta el PCL, es decir que no tomas los rebasamientos para incrementar el PCLATH, entonces te quedaría asi

PC + 0x0010 = 0x0000 !

Esto haría resetear a tu pic o bien ir a una posición no esperada.  Todo esto seguramente lo podrias ver en la simulación con el ASM.

La parte del código es la siguiente:

Código: ASM
  1. Mensajes
  2.                         addwf   PCL,F
  3. Mensaje0        DT "BIENVENIDOS", 0x00          ; Posición inicial del mensaje 0.
  4. Mensaje1        DT "VERSION 1", 0x00            ; Posición inicial del mensaje 1.
  5. Mensaje2        DT "I/O", 0x00          ; Posición inicial del mensaje 2.
  6. Mensaje3        DT "P1=Prueba Manual", 0x00             ; Empezamos a activar salidas
  7. Mensaje4        DT "P2=Reset", 0x00                             ; Reiniciamos el programa
  8. Mensaje5        DT "                Volver a repetir          " , 0x00
  9. Mensaje6        DT "Si todo OK", 0x00
  10. Finmensajes

La siguiente appliacation note explica todo esto con mucho mayor detalle

AN556: Implementing a Table Read
http://ww1.microchip.com/downloads/en/AppNotes/00556e.pdf (http://ww1.microchip.com/downloads/en/AppNotes/00556e.pdf)



y solo a modo de sugerencia fijate lo siguiente

Código: ASM
  1. ;************************ RESET Y VERCTORES INT ********************************************
  2.         org     00h             ;Vector de reset (aqui viene el micro cuando arranca)
  3.         goto    Inicio  ;inmediatamente lo mandamos a Inicio
  4.         CBLOCK  0x0C
  5.         ENDC
  6.  
  7. Inicio   ;------------------------ INICIALIZA MICROPOCESADOR ---------------------------

La directiva CBLOCK ... ENDC no la usas.  Se usa para definir variables y tu lo haces más arriba con EQUs, puedes eliminar estas líneas de código perfectamente.

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: BrunoF en 30 de Junio de 2006, 09:26:58
picto, no te dije que lo pongas abajo de todo. Dije que lo pongas debajo de la linea goto inicio.

Código: ASM
  1. ;************************ RESET Y VERCTORES INT ********************************************
  2.  
  3.         org     00h             ;Vector de reset (aqui viene el micro cuando arranca)
  4.         goto    Inicio  ;inmediatamente lo mandamos a Inicio
  5.  
  6. Mensajes
  7.                         addwf   PCL,F
  8. Mensaje0        DT "BIENVENIDOS", 0x00          ; Posición inicial del mensaje 0.
  9. Mensaje1        DT "VERSION 1", 0x00            ; Posición inicial del mensaje 1.
  10. Mensaje2        DT "I/O", 0x00          ; Posición inicial del mensaje 2.
  11. Mensaje3        DT "P1=Prueba Manual", 0x00             ; Empezamos a activar salidas
  12. Mensaje4        DT "P2=Reset", 0x00                             ; Reiniciamos el programa
  13. Mensaje5        DT "                Volver a repetir          " , 0x00
  14. Mensaje6        DT "Si todo OK", 0x00
  15. Finmensajes
  16.  
  17. Inicio   ;------------------------ INICIALIZA MICROPOCESADOR ---------------------------
  18. ;resto del codigo aqui

Saludos.
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 30 de Junio de 2006, 09:45:27
Que buenos que sois... alucino... no creo que lo hubiera descubierto por mi cuenta...

Voy a probar a ponerlo debado de goto inicio.

Y luego probaré a hacer lo que dice maunix.

A ver que saco en claro. MUCHISIMAS GRACIAS.
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 06 de Julio de 2006, 09:07:04
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...
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 06 de Julio de 2006, 09:27:54
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...

picto, en donde te da ese errorr? Los errores no vienen así porque sí, suelen tener un número de línea asociado al .asm en que te dió el error .

Con respecto a tus dudas con respecto al PC , PCL y PCLATH puedes concretar tu pregunta?  Qué es lo que no entiendes?

Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 06 de Julio de 2006, 09:48:38
Mensaje32   DT "Salidas ON", 0x00
Mensaje33   DT "Salidas OFF", 0x00
----------------------------------

movlw   Mensaje33  - esta es la línea 312
movlw   Mensaje32 - esta sería la 326

Esas son las líneas que me dá fallo, que corresponden a los mensajes del inicio de programa (tengo 33 escritos de momento)
312 : Argument out of range.  Least significant bits used.
326 : Argument out of range.  Least significant bits used.

Mi pregunta es, como sé cuando me estoy pasando con los mensajes? Y cuantos mensajes puedo escribir en total.Y como solcuiono cuando me pase d elos mensajes?

Ah y otra duda, como hago con el MPLAB para simularlo?
Gracias
Título: Re: Rutina LCD 4 Bits
Publicado por: BrunoF en 06 de Julio de 2006, 10:38:45
picto. "Argument out of range.  Least significant bits used." Significa que en alguna o mas lineas declaraste un valor mayor al que le se puede, y el ensamblador ha descartado los bits mas significativos.
En realidad son advertencias,no errores. Pero pueden contraer resultados no deseados(por eso mismo te advierte).

Ejemplos de casos comunes de este tipo de ERROR:

MOVF    0xF3,W        <-Error de programacion.La maxima posicion es 0x7F. Se elimina el 7mo bit, quedando 0x73

XORWF DIGITO1,2    <-Error de programacion. El destino debe ser 0 o 1.(2= b'10', entonces se reemplaza el 2 por 0)

MOVLW b'100100010'  <-Error de programacion.Se elimina el bit8.

etc...

En tu caso  el error esta en que estas moviendo la posicion dentro de la FLASH donde se encuentran las etiquetas Mensaje32 y Mensaje33.

movlw puede cargar un valor entre 0x00 y 0xff

pero...estas cargando en W un valor superior al maximo permitido(0xFF). Esto sucede porque las etiquetas Mensaje32 y Mensaje33 estan ubicadas mas alla de la posicion 0xFF de la memoria FLASH(que es donde se guardan y desde donde se ejecutan las instrucciones)

Ademas, no se cual es tu intencion...pero lo que estas haciendo esta seguramente mal.

Minimamente para tomar los valores de la tablas deberian ser asi:

Código: ASM
  1. Mensaje32       addwf   PCL,F
  2.                 DT      "Salidas ON", 0x00
  3. Mensaje33       addwf   PCL,F
  4.                 DT      "Salidas OFF", 0x00


Lo que deduzco que a la vez, vas a tener el mismo error que comentamos antes. Todas las tablas(estas son tablas) deberian tratar de ubicarse dentro de las primeras 256 posiciones de la flash.
Si desistis de hacer esto, entonces, vas a tener que llamarlas asi:

Ejemplo:

Código: ASM
  1. clrf            CONTADOR
  2. SigueProximoValor       pageselw        Mensaje32
  3.                         movwf           PCLATH
  4.                         movf            CONTADOR,W
  5.                         call            Mensaje32
  6.                         movwf           TEMP
  7.                         xorlw           0x00
  8.                         btfsc           STATUS,Z
  9.                         goto            TerminoTabla
  10.  
  11.                         movf            TEMP,w
  12.                         call            RutinaEnvioALCD
  13.                         incf            CONTADOR,F
  14.                         goto            SigueProximoValor

Saludos.
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 06 de Julio de 2006, 11:10:42
BrunoF, pero como ubico dentro de las primeras 256 posiciones de la flash las tablas?

Mira, al principio puse las tablas como me indicaste, y son tal que así:
Código: [Seleccionar]
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...


Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 06 de Julio de 2006, 11:37:56
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...

picto a mi modo de verlo, te estas encerrando en que te resolvamos el problema.

Creo que te estamos guiando para que "aprendas a resolverlo solo" por más que te echemos una mano muy grande en la ayuda para lograr tu objetivo.

Te he preguntado qué es lo que no has entendido del datasheet que explica la lectura de tablas usando PCLATH! y no has respondido.

Entender eso , te dará la solución a tus problemas de poner N mensajes, por mas que san 200, pero si quieres seguir con prueba y error... te llevará 10 veces más tiempo hasta incluso tal vez no lo llegues a resolver nunca.

Ser novato no es pecado, pero si te dicen donde leer y qué es lo que tienes que entender para "comprender" la solución a tu problema y tu no lo haces, entonces estas yendo por el camino más largo.

Saludos




Título: Re: Rutina LCD 4 Bits
Publicado por: BrunoF en 06 de Julio de 2006, 12:01:41
Hola picto.
Bueno, pero 35 mensajes no te van a entrar en las 256 primeras posiciones de la FLASH. Probablemente ocupen mucho mas.

Cada MensajeXX deberia contener la instruccion addwf PCL,F. No solamente al principio.

Bueno, en realidad es bastante dificil ubicarte las tablas asi sin saber cuanto ocupa tu programa, el pic que estas usando,etc.

Podes escribir tantos mensajes como memoria FLASH tengas. Es la unica limitacion, seguida de un par mas de menor jerarquia.

El problema con estos PICs y las tablas es que cuando haces la llamada a una tabla, el valor del PCLATH no se setea. Por lo tanto, si no cargas manualmente el valor correcto en el registro PCLATH, cuando llamas a la tabla y se ejecuta el addwf PCL,F el PIC se redirecciona a la primera parte de la FLASH, produciendo lo que puede parecer un RESET(y no lo es).

Si estas usando un 16F87XX entonces tendras, por lo menos, 2KWord de FLASH.Esto es decir. 2048 instrucciones que puedes grabar en la memoria FLASH.

Ahora, la ley es simple. En tu caso tenes demasiadas tablas, lo que hace imposible que entren todas en las primeras 256 lineas de la FLASH.Entonces hay que recurrir a setear el valor correcto del registro PCLATH antes de llamar a cada tabla.
Otra cosa  tener en cuenta es que una tabla no debe, para facilitar las cosas, NUNCA cruzar dos paginas.

Primero vamos a ubicar manualmente las tablas dentro de la FLASH para que no cruce ninguna dos paginas.

Con paginas me refiero a segmentos de 256 palabras de memoria flash, entonces en un 16F877A tendriamos esto:

primer pagina banco cero: 0x000 a 0x0FF
segunda pagina banco cero: 0x100 a 0x1FF
tercer pagina banco cero: 0x200 a 0x2FF
cuarta pagina banco cero: 0x300 a 0x3FF

y asi seguiria con los restantes 3 bancos del 16F877A...

Ahora, voy a suponer que tu codigo(sin contar las tablas de los mensajes) no llega mas alla de la posicion 0x1FF de la FLASH. Si llega a ocupar mas, vas a obtener probablemente una gran tanda de Advertencias del ensamblador diciendo que se han sobreescrito posiciones de la FLASH. Por ahora, supongamos que no sucedera.

Ubica las tablas asi:
Primero, indicamos con un vector, la posicion donde comenzaremos a ponerlas:

Código: ASM
  1. ORG 0x200       ;<- Estamos diciendole al ensamblador que lo que ponga debajo de esto se va a grabar a partir de la posicion 0x200 de la memoria FLASH del pic. Es decir, al inicio del tercer pagina del banco cero
  2.  
  3. ;Inmediatamente debajo de eso, ubicaremos la mitad de los mensajes de la siguiente manera:
  4.  
  5. Mensajes
  6.  
  7. Mensaje0        addwf   PCL,F
  8.                 DT  "XXXXXXX",0x00
  9.  
  10. Mensaje1        addwf   PCL,F
  11.                 DT  "XXXXXXX",0x00
  12.  
  13. Mensaje2        addwf   PCL,F
  14.                 DT  "XXXXXXX",0x00
  15.  
  16. ;...y asi siguen
  17.  
  18. Mensaje15       addwf   PCL,F
  19.                 DT  "XXXXXXX",0x00
  20.  
  21. Mensaje16       addwf   PCL,F
  22.                 DT  "XXXXXXX",0x00
  23.  
  24. ;luego, como precaucion, cambiaremos nuevamente de pagina para evitar que alguna tabla cruce desde la pagina 3 a la 4.
  25.  
  26.                 ORG     0x300   ;Indicando que todo lo que pongamos debajo de esto se grabra partiendo de la posicion 0x300 de la memoria FLASH.
  27.  
  28.  
  29. Mensaje17       addwf   PCL,F
  30.                 DT  "XXXXXXX",0x00
  31.  
  32. Mensaje18       addwf   PCL,F
  33.                 DT  "XXXXXXX",0x00
  34.  
  35. Mensaje19       addwf   PCL,F
  36.                 DT  "XXXXXXX",0x00
  37.  
  38. ;...y asi siguen
  39.  
  40. Mensaje34       addwf   PCL,F
  41.                 DT      "Activacion aut.",0x00
  42.  
  43. Mensaje35       addwf   PCL,F
  44.                 DT      "   salidas", 0x00
  45.  
  46. Finmensajes


Y ahora, en lugar de llamar a las tablas como venias seguramente haciendo, es decir asi:
Ejemplo:

movf RECORRE,W
call  Mensaje16

Hacelo asi:
pageselw  Mensaje16
movwf PCLATH
movf RECORRE,W
call Mensaje16

Asi cargamos manualmente el PCLATH antes de llamar a una tabla.

Espero estes un poquitin mas orientado.
Saludos.
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 06 de Julio de 2006, 12:13:55
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...

Voy a leerme de cabo a rabo tu explicación y a ver si yo solo soy capaz de hacerlo funcionar.
El problema es entender lo que estoy haciendo exactamente. Yo no tengo ni idea... se lo mínimo que vosotros me habeis explicado y os lo agradezco. Pero estando solo sin ayuda, es muy complicado entender ciertas cosas...

Es como si un mecánico me dice... a tu coche le tienes que cambiar la correa de distribución... vale... pero que es la correa? Donde está? me entendeis?

Bueno, voy a ponerme manos a la obra a ver si saco algo en claro.

BrunoF, como aprendiste todo esto?

Saludos.

maunix, perdoname  :?
Título: Re: Rutina LCD 4 Bits
Publicado por: BrunoF en 06 de Julio de 2006, 12:41:45
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.
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 06 de Julio de 2006, 13:32:35
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  :?

picto no es que te tenga que perdonar o no, ni tampoco es que me moleste o me canse explicar las cosas muchas veces.

El punto es que te dí un datasheet para que leas donde está explicado al detalle todo esto y ni siquiera me has dicho "no entiendo tal o cual cosa", simplemente dices que no entiendes...  A eso lo llamo facilismo porque vuelves una y otra vez sobre tu problema puntual de los mensajes de acá o allá pero sin observar lo que te he estado apuntando que es "en el datasheet está explicado como entender lo de tablas que estén en muchos lados o en cualquier página de la memoria de programa"!  Más simple que eso...

Te he pedido una y otra vez que especifiques qué es lo que no entiendes pero no lo has hecho.  Tal vez debamos pensar en que no leíste el datasheet que te dí... lo cual lamentaría mucho que fuese cierto. :? :?

No soy de enojarme, y de hecho no estoy enojado.  Simplemente que parece que hablamos un idioma diferente y así no tiene mayor sentido seguir intentándolo.  Tu postura suena a "quiero resolver mi problema ya, urgente, ayudenme!".  Cuando te estamos mostrando el camino para que "comprendas" qué es lo que le está pasando a tu código!.  Ese es el camino que te llevará a comprender bien las cosas y a que luego ya no tengas que detenerte en pensar en esto, sino en cosas cada vez mas complicadas.

Saludos y hasta la próxima.



Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 10 de Julio de 2006, 02:52:52
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...

Saludos!
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 10 de Julio de 2006, 08:44:25
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.

Si, ese es el espíritu que en gral, se le quiere dar al foro.


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.

Si, es una pena que no sepas inglés.  De todas formas, te comento que hace tiempo no es un "componente extra" saber ingles... sino una necesidad.  Te recomiendo que tomes clases, porque el 95% de los textos de vanguardia en todo lo que sea firmware, microcontroladores y software, viene todo en inglés.  Si esperas a que alguien traduzca puedes esperar semanas, meses o años y encima algunos textos ni siquiera se traducen.

Cuando te metes en este mundillo te vas haciendo "especialista" en la materia, y cuando logras eso, los textos son mas excasos, menos populares y por ende no son masivos , son en casi un 100% en inglés y terminan siendo mucho más dificil de conseguirse (incluso en inglés).

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...

Bueno, hazlo y vuelve a preguntar y como te dije antes... dinos qué es lo que no entiendes del datasheet.

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 11 de Julio de 2006, 03:28:28
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.

Hola BrunoF, acabo de ver el mensaje...

A ver si esta noche puedo conectarme y hablamos...

Estoy mirando la explicación que me diste y tengo el datasheet, quiero intentar entenderlo...

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 12 de Julio de 2006, 06:31:42
Hola de nuevo!

Estoy dale que te pego y no consigo arreglar lo de las tablas...

Por lo que explicais, el Pic16F877 tiene Banco 0 (pagina 1,2,3 y 4) Banco 1 (pagina 1,2,3 y 4) Banco 2 (pagina 1,2,3 y 4) y Banco 3(pagina 1,2,3 y 4).

Si me equivoco porfavore corregidme  :lol:

Entonces mi pregunta es... los bancos 0,1,2 y 3 corresponden a la siguiente imágen?


Entonces, si es así... tengo que hacer lo de cambiar de banco con bsf    STATUS,RP0  por ejemplo?

Otra cosa, hay una opción en el MPLAB que pone [view Disassembly listing] eso es para ver que posicion ocupa cada línea de programa?

Bien, poniendo la opcion Disassembly listing... veo que en las tablas, en el Mensaje 18 me pasa de   00F7  a 101, y si pongo por ejemplo org 0x400 al principoio de la tabla me salta a la 501 en el mensaje 18...

Os pongo un ejemplo...

Código: [Seleccionar]
                                                      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

Entiendo que cuando llega al mensaje18 cambia de página? Me pasa de F7=247 (banco 0 pagina 1) a 102=257 (banco 0 página 2) ?
Es lo que yo interpreto por lo que veo... igual interpreto muy mal...

Si todo esto es correcto, entonces ahora tendría que cambiar de página de la 0 a la 1... pero no sé como se cambia de la 0 a la 1. Con PCLATH? Pero como?

Es más complejo de lo que pensaba... voy a seguir investigando.
Gracias

Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 12 de Julio de 2006, 08:31:28
Creo que vpy cogiendo la idea...

Es como cuangho me expicasteis lo de cambiar de banco con el Status verdad? Pues debería de hacer lo mismo si paso de 255 osea de página...

PEro creo que ya sé porque no he logrado hacerlo funcionar... las librerías que me pasarón son solo válidas para no más de 255 lineas, y mis mensajes pasan de 255...

Mala solución veo...

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 12 de Julio de 2006, 09:21:04
picto estoy haciendo un par de rutinas que subiré en el hilo de veguepic de ejemplos en ensamblador.

Ni bien lo termine te daré el link así lo puedes ojear.

Creo que te será de gran utilidad a tí y a muchos otros.


Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 12 de Julio de 2006, 09:54:33
Ok, maunix.
Gracias :-/
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 12 de Julio de 2006, 15:24:40
Ok, maunix.
Gracias :-/

Fijate en http://www.todopic.com.ar/foros/index.php?topic=12918.0 (http://www.todopic.com.ar/foros/index.php?topic=12918.0)

Espero te sean de utilidad

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 17 de Julio de 2006, 09:26:58
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
Título: Re: Rutina LCD 4 Bits
Publicado por: pibe en 19 de Julio de 2006, 13:36:29
 :shock: Joder picto. A este paso en un mes me superas en conocimiento  :-/. Estás hecho un tigre !
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 20 de Julio de 2006, 14:51:12
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

picto de todas formas 256 posiciones creo que te servirá para los display de uso más común.

La rutina que subí es genérica, no solo para sacar por display sino para cualquier cosa que uno desee.   :)
Título: Re: Rutina LCD 4 Bits
Publicado por: Manofwar en 20 de Julio de 2006, 15:05:59
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.
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 21 de Julio de 2006, 03:11:00
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.

Hola Manofwar, utilizo 3 librerías... Retardos.inc, P876ALCD_4B.INc y LCD_MENS.INC... te adjunto la librería LCD_MENS.INC y hechale un vistazo por favor... tu crees que con este librería se puede utilizar si pasas de las 256 primeras posiciones?

Ayer intenté de nuevo ponerme manos a la obra, pero no iba el foro  :?

Pibe, por cierto, tu si que estás heho un fenómeno!

Maunix, que es eso de macros?

Saludos!
Título: Re: Rutina LCD 4 Bits
Publicado por: Manofwar en 21 de Julio de 2006, 06:31:10
Picto debo estar quedandome ciego :D, no veo el archivo
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 21 de Julio de 2006, 06:55:33
Picto debo estar quedandome ciego :D, no veo el archivo

Que tonto... :(

Te adjunto los archivos.
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 21 de Julio de 2006, 07:05:22
Manofwar, al compilar el asm. Me dá error en 2 líneas del LCD_MENS... y es justamente aquí:

LCD_Mensaje
   movwf   LCD_ApuntaCaracter   ; Posición del primer carácter del mensaje.
   movlw   Mensajes      ; Halla la posición relativa del primer carácter
   subwf   LCD_ApuntaCaracter,F   ; del mensaje respecto de etiqueta "Mensajes".
   decf   LCD_ApuntaCaracter,F   ; Compensa la posición que ocupa "addwf PCL,F".
LCD_VisualizaOtroCaracter
   movf   LCD_ApuntaCaracter,W
   call   Mensajes      ; Obtiene el código ASCII del carácter apuntado.
   movwf   LCD_ValorCaracter   ; Guarda el valor de carácter.
   movf   LCD_ValorCaracter,F   ; Lo único que hace es posicionar flag Z. En caso
   btfsc   STATUS,Z      ; que sea "0x00", que es código indicador final   
   goto   LCD_FinMensaje   ; de mensaje, sale fuera.
LCD_NoUltimoCaracter
   call   LCD_Caracter   ; Visualiza el carácter ASCII leído.
   incf   LCD_ApuntaCaracter,F   ; Apunta a la posición del siguiente carácter
   goto   LCD_VisualizaOtroCaracter ; dentro del mensaje.
LCD_FinMensaje
   return            ; Vuelve al programa principal.

El Fallo lo dá en la línea donde pone movlw   Mensajes, yo creo que ahora tengo bien el ASM, pero la librería tendría que retocarla no? Porque dentro de la etiqueta Mensajes hasta FinMensajes hay tablas en diferentes pagínas no?

Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 21 de Julio de 2006, 08:31:44
Maunix, que es eso de macros?

Es una forma de 'repetir código' de una forma mas legible, versátil y veloz.

Si por ejemplo necesitas hacer

Código: ASM
  1. movlw   .20
  2.         movwf   TEMP1
  3.         call    SUBRUTINA1
  4.         movlw   .21
  5.         movwf   TEMP1
  6.         call    SUBRUTINA1
  7.         movlw   .30
  8.         movwf   TEMP1
  9.         call    SUBRUTINA1
  10.         movlw   .32
  11.         movwf   TEMP1
  12.         call    SUBRUTINA1
  13.         movlw   .33
  14.         movwf   TEMP1
  15.         call    SUBRUTINA1
  16.         movlw   .34
  17.         movwf   TEMP1
  18.         call    SUBRUTINA1
  19.         movlw   .36
  20.         movwf   TEMP1
  21.         call    SUBRUTINA1
  22.         movlw   .38
  23.         movwf   TEMP1
  24.         call    SUBRUTINA1

En ese caso, se me ocurre de inmediato hacer un macro, que me ahorre escribir tanto y que además me haga más legible al código (por ser mas breve). 

Entonces hago.

Código: ASM
  1. preloadsubrutina1    macro    __dato
  2.  
  3.         movlw   __dato
  4.         movwf   TEMP1
  5.         call    SUBRUTINA1
  6.  
  7.         endm
  8.  
  9.  
  10.         preloadsubrutina1 .20
  11.         preloadsubrutina1 .21
  12.         preloadsubrutina1 .30
  13.         preloadsubrutina1 .32
  14.         preloadsubrutina1 .33
  15.         preloadsubrutina1 .34
  16.         preloadsubrutina1 .36
  17.         preloadsubrutina1 .38

En el manual del Assembler está bien explicado como se usan los macros.   Se pueden usar muchos parámetros, incluso variables locales que tengan vida solo dentro del macro, etc.  Pero bueno, no quiero confundir con cosas como esta.  Lo mejor es empezar por algo, si es que consideras que hacer macros te es útil para luego ir complicándolos.  No siempre hace falta hacer un macro y también es cierto que en mis primeros códigos nunca usé un macro, ni sabía como hacerlos, jeje. 

Asi que bueno, lo mejor sería que comiences por hacerlos bien fáciles para luego comenzar a detectar lugares donde te parece que serán útiles.

El código que ocupan en la memoria de programa ambos códigos es exactamente el mismo, pero el segundo código, a mi modo de verlo es más legible y mas breve.

Es una forma que se usa mucho cuando hay que repetir código tantas veces.  De esta forma te olvidas de tener en cuenta muchas cosas y agilizas el proceso de codificación.

Y recalco lo siguiente:  Esto no ahorra código en memoria de programa, solo ahorra tiempo a la hora de escribirlo.


Saludos
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 21 de Julio de 2006, 09:35:09
maunix, eres la máquina! Esque en uno de tus ejemplos he visto que comentabas algo de usar macros, de ahí la prgunta.
Gracias
Título: Re: Rutina LCD 4 Bits
Publicado por: maunix en 21 de Julio de 2006, 13:21:02
maunix, eres la máquina! Esque en uno de tus ejemplos he visto que comentabas algo de usar macros, de ahí la prgunta.
Gracias

Supuse que lo habría sacado de ahí.  :) :)

Con respecto a tus elogios, se agradecen pero en mi opinión no me considero una máquina, solo se 'antes' algunas cosas.

Saludos


Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 25 de Julio de 2006, 05:06:50
Bueno, he intentado probar varias opciones y creo que el problema que tengo está en la librería LCD_MENS a la hora de ejecutar la instrucción para escribir en el LCD.

Título: Re: Rutina LCD 4 Bits
Publicado por: Manofwar en 25 de Julio de 2006, 20:36:36
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
Título: Re: Rutina LCD 4 Bits
Publicado por: picto en 26 de Julio de 2006, 09:19:20
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

Manofwar, muchas gracias de verdad...

Entre hoy y mañana probaré en el circuito, si consigo mostrar más allá de la página 1. Con vuestra ayuda, este es más fácil...

Gracias de nuevo, os diré como vá la cosa.  :-/
Título: Re: Rutina LCD 4 Bits
Publicado por: miguel valdivia en 01 de Mayo de 2011, 11:47:53
Muchas gracias maunix , sabes que tenía el mismo problema que picto y no sabia que la librerias inc se ponian dentro de la carpeta del archivo asm a compilar y me dio varios dolores de cabeza.
tambien pongo una carpeta con un archivo proteus de un control de display lcd. Este quizas sirva al amigo picto
Título: Re: Rutina LCD 4 Bits
Publicado por: nigromanteasesino en 09 de Mayo de 2011, 22:56:21
Hola, yo tambien tengo problmas para controlar una lcd con solo 4bits, pero no tengo prblemas con 8 jejeje, bueno yo me guien por la libreria que biene en el libro del pic 16f84 desarrollador de proyectos me lei todo el capitulo y no se si se me esta escapando algo, bueno basicamente el programa es este no se si me puedan ayudar, cualquier duda sobre mi problema no duden en avisarme porfavor.

Código: [Seleccionar]
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