TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado 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?
-
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.
-
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:
-
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.
-
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?
-
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" "
-
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.
-
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.
-
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
;===============================
-
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.
-
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!!!
-
gracias ya lo he entendido mejor.le dare un buen repaso. ;-)
-
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?
-
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.
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
-
:-/ 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. :)
-
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!
-
gracias om@r.para que sirve el leer la pantalla? o te refieres a leer los caracteres especiales de la CG RAM.
-
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!
-
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.