TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: groundman en 06 de Agosto de 2011, 11:58:39

Título: dudas en paginacion
Publicado por: groundman en 06 de Agosto de 2011, 11:58:39
hola.tengo algunas dudas sobre como se comporta el PC en los saltos entre paginas.
estoy haciendo un programa que visualize en una LCD de 16 caracteres.el texto del quijote (como practica) hasta que se agote la memoria de un 16f877
el programa principal esta hubicado en la pagina 0.y la tabla como el puntero de salto en las restantes.

como es normal hay que modificar el PCLATH cuando se realiza el salto entre paginas.y esto me hace suponer que voy a tener que poner punteros de tabla en cada pagina.o realizar la conmutacion antes de que se realice el salto erroneo.
en todo caso la duda que tengo es que si estoy en la pagina 0.y conmuto PCLATH para saltar a la pagina 1.porque cuando retorna al encontrar un retlw.
lo hace a la pagina 0.si el PCLATH no ha sido modificado durante el retorno?
Título: Re: dudas en paginacion
Publicado por: groundman en 06 de Agosto de 2011, 12:29:03
he dado un repaso al datasheet.los call y goto pueden saltar cualquier posicion dentro de una pagina.pero un salto a otra pagina implica seleccionar en el PCLATH
a que pagina se quiere saltar.
respecto al retorno.aqui no hay problema ya que en el puntero de pila se guarda la direccion desde donde se realizo la llamada,incluso la pagina.
por lo visto el PCLATH no es modificado durante el retorno.

me ha parecido entender que los unicos bits utiles del registro PCLATH. almenos en el 16f877 son el bit3 y bit4.ya que aunque se puden escribir del 0 al 2.
no seria practico ya que los gestiona un call o un goto.
Título: Re: dudas en paginacion
Publicado por: tapi8 en 06 de Agosto de 2011, 14:01:44
Si porque en la pila son todos los bits de direccion pero en el PC no, los tre mas significativos son un codigo de control (o algo asi) el codigo para call y goto es:

CALL  10 0KKK KKKK KKKK
GOTO 10 1KKK KKKK KKKK

Como ves solo 11 bits de direccion, 8 para el PCL y y tres para el PCLATCH, con esto direccionas 2K pero a partir de ahi hay que ayudarle un poquito al PC  :lol:
Título: Re: dudas en paginacion
Publicado por: groundman en 06 de Agosto de 2011, 19:14:34
llevo mucho tiempo estudiando los pics.pero realizando programas cortos.las tablas es lo que mas ocupa memoria en un microcontrolador.y cuando hay qye hacer paginacion es un lio.hay que tener muy claras las cosas.

aunque de aqui en adelante voy a tirar para la serie 18Fxxxx en estos no hay paginacion que yo sepa.y ademas estos chips estan incluso mas varatos que los 16fxxx.
solo queria terminar de hacer este programa para entender bien como funciona la paginacion.yo creo que con esto ya le habre sacado bastante jugo a estos pic.
no creo que suceda lo mismo con los 18Fxxxx. :D estan vastante completos.
Título: Re: dudas en paginacion
Publicado por: groundman en 07 de Agosto de 2011, 18:24:23
bueno.esto va de perlas.ya he podido visualizar en la LCD un mensage que ocupa 3 paginas de eeprom y con solo un puntero al principio de pagina
es un poco complicado aprender paso por paso lo que realiza un controlador.sobretodo cuando hay que conmutar los bancos de memoria.
ahora tengo un error que no entiendo porque sale.
me indica que me he pasado del ultimo byte de que dispone la eeprom del pic.

Error - section '.org_2' can not fit the absolute section. Section '.org_2' start=0x00000800, length=0x00002e02
Errors    :

y digo que no lo entiendo porque realmente no me he pasado de la direccion 0x1FFF. el error me sale cuando sobrepaso la direccion 0x1EFF
255 bytes antes de terminar la pagina 3.

el pic es el 16F876 y segun el datasheet tiene 8192bytes.porque me da error si escribo en estos ultimos 255bytes?
Título: Re: dudas en paginacion
Publicado por: groundman en 08 de Agosto de 2011, 18:38:55
solucionado.he tenido que dividir la tabla poniendo los 255bytes restantes en otra tabla.

con un org 0x1F00.y ya no sale el error.

supongo que el compilador no admite tablas tan largas con la directiva dt"  "
Título: Re: dudas en paginacion
Publicado por: groundman en 14 de Agosto de 2011, 12:13:56
ya termine el programa.aqui esta el programa: http://www.todopic.com.ar/foros/index.php?topic=24397.msg297596#new

me ha parecido mejor lugar donde ubicarlo.para poder encontrarlo mas facilmente.
la parte mas importante para que el PC no se desborde en el salto entre paginas. es la seleccion de la pagina adecuada antes salto por modificacion
del PCL.
aunque para la lectura de los datos en una tabla.tambien hay que tener encuenta los sectores de las paginas.esto se realiza con la el incremento
del PCLATH.ya que aunque los bits de la conmutacion de las paginas son el bit3 y bit4.el bit0,bit1 y bit2 se encargan de conmutar los bancos de cada pagina.
la modificacion de estos bits conmutan los 8 bancos de cada pagina.
al igual de que si no seleccionamos correctamente una pagina. durante un retorno el PC saltaria errorneamente a otra pagina.
si no seleccionamos bien los sectores.el PC saltaria a un banco erroneo dentro de la misma pagina.
Título: Re: dudas en paginacion
Publicado por: groundman en 14 de Agosto de 2011, 20:15:24
bueno.pues ya que logre hacer funcionar la LCD. y aunque este hilo estaba orientado a resolver un problema de paginacion.he decidido realizar una modificacion al programa para que funcione en el modo de 4 bit.con esto lograremos ahorrarnos 4 pin del pic.

he estado buscando informacion para entender como se gestiona la LCD para mostrar mensages con este modo de funcionamiento.
no he encontrado una informacion muy exacta.

la diferencia que he encontrado entre un sistema y  otro.es que en el modo 8 bit,se manda un byte.y posteriormente un impulso en E del LCD.
y en el modo de 4bit hay que mandar un nible,impulso en E,otro nible y otro impulso en E.

por ahora lo que me sale es un mensage de error: attempted to write after reading a single nibble.

"trató de escribir después de leer un solo nible".no estoy muy seguro de lo que quiere decir.

estare practicando haber cual es la solucion.si alguen sabe de alguna libreria para asm le agradeceria me indicase donde adquirirla.
me gustaria hecharle un vistazo.
Título: Re: dudas en paginacion
Publicado por: om@r en 14 de Agosto de 2011, 21:40:07
Hola groundman ,esta es la rutina que uso cuando quiero usar el lcd 16x2 a 4bits :shock: ,el retardo esta hecho para un oscilador 4mhz y me resulto bien para varios modelos de lcd ,el registro TEMPLCD es el que contiene el byte sea de comando o dato. La rutina esta hecha para usar la parte alta del puerto B y las señales de control estan puestas en el puerto A :shock:
Saludos!!!
;*********************************************************
;INICIO LCD MODO 4
;*********************************************************
LCD    MOVLW      02H
          CALL          CONTROL
          MOVLW      28H
          CALL          CONTROL
          MOVLW      0CH
          CALL          CONTROL
          MOVLW      06H
          CALL          CONTROL
          MOVLW      01H   
          CALL          CONTROL
          RETURN
;*********************************************
RETARDO
              MOVLW   0FFH
   MOVWF  TEMP_1
   NOP
              DECFSZ   TEMP_1,F
             GOTO       $-1
             RETURN
;====================================
;**********************************************
CONTROL
              BCF        PORTA,RS
              GOTO     DATO2
DATO     BSF        PORTA,RS
DATO2   BSF         PORTA,E
              MOVWF   TEMPLCD
              MOVLW    0FH
              ANDWF    PORTB,F
              MOVF      TEMPLCD,W
              ANDLW    0F0H
              IORWF     PORTB,F
              CALL        RETARDO
              BCF         PORTA,E
              CALL        RETARDO
              BSF         PORTA,E
              MOVLW   0FH
              ANDWF   PORTB,F
              SWAPF   TEMPLCD,W
              ANDLW    0F0H
              IORWF    PORTB,F
              CALL       RETARDO
              BCF         PORTA,E
              CALL       RETARDO
              RETURN
;===============================
 
Título: Re: dudas en paginacion
Publicado por: groundman en 15 de Agosto de 2011, 18:19:03
gracias om@r por tu aporte.lo estudiare a fondo para entender que es lo que estoy haciendo mal.
por lo que he visto por encima.este programa es la secuencia de inicializacion?

ya que no veo que envie caracteres a la LCD.supongo que tambien sevira para enviar caracteres.quizas haya que seleccionar el modo dato en la lcd.
Título: Re: dudas en paginacion
Publicado por: om@r en 15 de Agosto de 2011, 22:43:31
Hola ,si la rutina sirve para enviar info al lcd tanto dato como control  :shock: es una sola rutina dividida para los dos usos
es solo para no duplicar la parte en donde se trabaja el byte ya que seria igual.
La rutina LCD es para inicializar el lcd a 4bits ,la principal lo que hace es dividir en dos el byte que quieres enviar ,tambien se encarga de no modificar el estado de la mitad del puerto en este caso el B que no se usa para el lcd ,esto lo podes modificar facilmente si usas otro puerto o otra parte del puerto como tambien los que se usan para RS y E ,el R/W esta a tierra  :shock:.
RS y E salen por los pines 0 y1 del puerto A
RS   EQU   0 ;PORTA,0
E     EQU   1 ;PORTA,1

Ejemplo
            CALL           LCD             
            MOVLW       80H             
            CALL           CONTROL     
            MOVLW       'A'                 
            CALL            DATO
Saludos!!!
Título: Re: dudas en paginacion
Publicado por: groundman en 16 de Agosto de 2011, 17:14:48
gracias ya lo he entendido mejor.le dare un buen repaso. ;-)
Título: Re: dudas en paginacion
Publicado por: groundman en 04 de Septiembre de 2011, 14:46:21
por fin he hecho funcionar la LCD en modo a 4bit.me ha venido muy bien tu ejemplo. om@r. :)

lo pondre en pequeños proyectos.pero tengo una duda.quisiera comprovar el bit BUSY.y no se si la lectura en 4 bit se comporta igual que la lectura en 8bit.
sabes algo al respecto?
Título: Re: dudas en paginacion
Publicado por: groundman en 05 de Septiembre de 2011, 18:05:02
pues logre hacerlo funcionar.aunque no se si esta bien hecho.he segido las instrucciones.pero como es una simulacio,no se si internamente el flag BUSY
esta activandose.supongo que tendre que usar el ICD2 para comprobarlo.

este es el codigo.por si alguien le encuentra algun error.

Código: [Seleccionar]
LCD_BUSY    movfw PORTA ;carga en W el contenido de PORTA
andlw 0x01 ;guarda el valor del estado del bit RS
movwf TEMP_RS ;salva el valor de RS en el registro temporal
COMANDOS ;selecciona el modo comandos
BANK1 ;selecciona banco 1
          movlw    H'F0' ;
          movwf    TRISB        ;nible alto de PORT B como entrada
          BANK0    ;Selecciona el banco 0
READ          ;Pone el LCD en Modo RD "lectura"
          ENABLE          ;Activa el LCD (lectura del nible alto)
L_BUSY      btfsc    PORTB,7      ;Chequea bit de Busy
          goto    L_BUSY ;espera a que la LCD este libre
      DISABLE        ;Desactiva LCD

ENABLE ;Activa el LCD (lectura del nible bajo)
call RETARDO ;retardo de 1ms
DISABLE ;Desactiva LCD

          BANK1 ;selecciona banco 1
          clrf    TRISB        ;Puerta B salida
          BANK0 ;Selecciona el banco 0
          WRITE          ;Pone LCD en modo WR

movfw TEMP_RS ;restaura el valor de SR
iorwf PORTA,f ;activa en PORTA el bit RS
          return ;retorna
Título: Re: dudas en paginacion
Publicado por: groundman en 05 de Septiembre de 2011, 19:26:03
 :-/ parece que si funciona.por lo visto el registro que contiene el flag BUSY.tambien contiene la direccion de la CG RAM o DD RAM.
y puedo ver como se van incrementando los bit cuando se van visualizando los caracteres.
solo que se realiza en dos nibles. :)
Título: Re: dudas en paginacion
Publicado por: om@r en 05 de Septiembre de 2011, 19:40:45
Hola a Todos ,no hice la rutina de lectura de bandera de ocupado o libre :shock: porque siempre la utilizo a 4bits cuando no tengo pines libres en los puertos:shock: si hice una para lectura de pantalla a 4bits si alguien la necesita la busco y la pego :shock: me alegro que lo hayas logrado :-/
Saludos!
Título: Re: dudas en paginacion
Publicado por: groundman en 06 de Septiembre de 2011, 10:14:02
gracias om@r.para que sirve el leer la pantalla? o te refieres a leer los caracteres especiales de la CG RAM.
Título: Re: dudas en paginacion
Publicado por: om@r en 06 de Septiembre de 2011, 22:58:07
Hola a Todos! a veces es muy util leer la pantalla  :shock: ,si por ejemplo tenes un menu extenso de varias pantallas de entrada de datos de una aplicacion ,digamos que tenes campos en donde el usuario carga datos y antes de sali del menu se le ocurre reconfigurar algo de lo hecho ,esto provacaria que tengas que volver para atras en tu programa y esto redunda en escribir mas codigo para cada una de las posibilidades o combinaciones posibles que el usuario pueda intentar ,leer la pantalla te permite dejar que el usuario se mueva libremente :shock: ,podra escribir lo que quiera en el orden que quiera
y al tomar la opcion de ''guardar'' :shock: solo tu programa tendra que leer la pantalla en las direcciones que necesites para obtener los datos cargados  :shock:
Para la cgram solo cargo los datos y luego los llamos como si fuera un caracter mas :shock: nada mas que lo hago por su direccion de carga :shock:
Saludos!
Título: Re: dudas en paginacion
Publicado por: groundman en 07 de Septiembre de 2011, 10:25:45
la verdad es que no entiendo muy bien lo que quieres decir.ya que lo unico que he realizado con estos LCDs es escribir en la DD RAM y rotar hacia la izquierda.
creo entender que lo que quieres decir con pantallas.son los primeros caracteres que no se quedan ocultos en la DD RAM.
pero en una lcd de 16x2. solo caben dos pantallas completas por fila.ya que la DD RAM es de 40bytes por linea.

aunque tambien se me ocurre que lo que quieres decir es que solo modificas los caracteres de la pantalla que suelen cambiar constantemente.
pero si ya sabemos donde se hubican estos valores.no se para que leerlos.a no ser que uses la LCD como si fuera una eeprom externa.y leas el valor deseado
para no tenerlo que guardarlo en el pic.