TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Resistencio en 11 de Septiembre de 2007, 23:04:28
-
Crossing page boundary -- ensure page bits are set.
Esto es lo que arroja la compilacion de un 648A...en que parte debo setear el bit de pagina ???
Agradeceria una ayudita...sobre como interpretar este mensaje de ERROR o donde puedo leer algo al respecto !!!
Gracias de antemano...Ya conozco la predisposicion y voluntad del FORO, asi que no tengo mas que agradecerles !!!
SALUDOS a todos y gracias por compartir !!!
_____________________________
"Justo a mi me toco ser YO" QUINO
-
Realmente es un error o un warning ?? 8) 8)
-
Hola MGLSOFT, es un mensaje con codigo 306...si lo paso por alto, el soft, no corre...
Por lo que vengo leyendo hasta el momento, tiene que ver con el paginado de memoria...nunca antes habia hecho un programa de mas de 2k, y ahora me encuentro con este problema...donde estoy llamando a subrutinas que estan en la 2º pagina de un 648A...parece que la solucion estaria en indicar antes del call, que quiero ir a esa pagina...pero eso me obligaria a retocar mucho el programa en gral...
Una opcion que se me ocurre, es correr esa subrutina a la 1º pagina y enviar otras menos "llamadas" a la 2º...No se si esta es una elegante solucion o una terrible "estupidez"...
Espero impaciente el aporte de alguno de los mas sabios y con mas experiencia en estas "batallas" !!!
SALUDOS !!!
-
Sera bueno si paginas correctamente, las rutinas conviene tenerlas en lo posible en la primera pagina, evitando saltos.
Lo que no debes hacer es dejar que una rutina determinada comience en una pagina y termine en la siguiente, alli tendras un problema grave...
Prueba haciendo macros como BANK0, BANK1, etcetera, donde seteas los bits de esa pagina, luego las llamas segun la pagina donde este la rutina...
-
Por lo que vengo leyendo hasta el momento, tiene que ver con el paginado de memoria...nunca antes habia hecho un programa de mas de 2k, y ahora me encuentro con este problema...donde estoy llamando a subrutinas que estan en la 2º pagina de un 648A...parece que la solucion estaria en indicar antes del call, que quiero ir a esa pagina...pero eso me obligaria a retocar mucho el programa en gral...
Antes que nada, quiero aclarar que el mensaje que te arroja el ensamblador es un warning o advertencia, indicandote que cierto código está una parte en una página y mitad en otra.
Respecto a "retocar" el programa, no te escapas.
Una opcion que se me ocurre, es correr esa subrutina a la 1º pagina y enviar otras menos "llamadas" a la 2º...No se si esta es una elegante solucion o una terrible "estupidez"...
Me parece una solución práctica y no la veo una estupidez ni mucho menos. :)
Saludos
-
Gracias MAUNIX, estuve haciendo mucha lectura sobre este problema...y he leido sobre tus aportes al respecto...entre tantas soluciones propuestas, lei tambien la de BRUNOF, que invita al uso de PAGESEL...
Use misma tecnica, con PAGESELW, por ej. pero no tuve los resultados esperados...Entiendo el problema que tengo enfrente, uso las herramientas necesarias para poder solucionarlo, pero aun asi no puedo...Por el momento resulta bastante frustante, no poder solucionar este inconveniente...pero se que mas adelante estare gratificado con la solucion...
Gracias por los aportes y seguire tratando de encontrarle la vuelta !!!
El compilador MPLAB7.50, solo dice mensaje(306)...no aclara si es un WARNNING o un ERROR...
SALUDOS !!!
______________________________
"justo a mi me toco ser YO" QUINO.
-
Gracias MAUNIX, estuve haciendo mucha lectura sobre este problema...y he leido sobre tus aportes al respecto...entre tantas soluciones propuestas, lei tambien la de BRUNOF, que invita al uso de PAGESEL...
Hacer un pagesel es como configurar los bits del PCLATH pero te lo hace solo el Ensamblador. Pagesel es un macro, no lo mencioné antes porque es lo mismo que estas haciendo, por ende, no cambia nada.
Use misma tecnica, con PAGESELW, por ej. pero no tuve los resultados esperados...
Ojo que pageselw guarda en el WREG el valor de la página, lo cual no es lo mismo que guardarlo en el PCLATH.
Entiendo el problema que tengo enfrente, uso las herramientas necesarias para poder solucionarlo, pero aun asi no puedo...Por el momento resulta bastante frustante, no poder solucionar este inconveniente...pero se que mas adelante estare gratificado con la solucion...
Si, es frustante cuando uno no le encuentra la vuelta pero también se aprende mucho así. En cuanto a consejos, o cosas para revisar, te puedo decir que si estas en la página 0 y llamas con un call a una subrutina en la pagina 1, el return hará que vuelva sola, pero de inmediato si vas a llamar a una rutina dentro de la página 0, debes volver a cargar la página 0 en el PCLATH.
Y como un ejemplo vale a veces más que mil palabras te dejo este link para no repetir el tema.
Ejemplo pagesel (http://www.todopic.com.ar/foros/index.php?topic=16441.msg108343#msg108343)
El compilador MPLAB7.50, solo dice mensaje(306)...no aclara si es un WARNNING o un ERROR...
De todas formas no es un error, si fuera un error no se ensamblaría el archivo. Un error detiene el proceso de ensamblado.
Saludos
-
He seguido al pie de la letra el ejemplo de pagesel, pero no funciona...tambien use el pageselw y tampoco...he comenzado a cuestionar mi capacidad de interpretacion y la posibilidad de pasarme a arquitecturas VON NEUMAN, sin paginado...Existe alguna gama de PIC que no use paginados...
De todos modos pienso seguir insistiendo !!!
Por ejemplo, podria armar un programita que encienda un led y llamar a la rutina de demora, que ubicaria en la segunda pagina, y desde ahi ver que va pasando...
Y yo que me jactaba de entender algo de micros y su manejo (si hasta he experimentado con EEPROM sin problemas) , y me derrota un pagesel, que ironia, la de los micros, cuanto mas los conozco, menos los domino...me pasa lo mismo con mi DVD...que maldicion tecnologia me estara persiguiendo ??? :D
SALUDOS y gracias a quien pueda aportarme alguna otra pista...creame que lei casi todo al respecto en este foro...nada me sirve !!!
_____________________________
"Justo a mi me toco ser Yo" QUINO
-
He seguido al pie de la letra el ejemplo de pagesel, pero no funciona...tambien use el pageselw y tampoco...he comenzado a cuestionar mi capacidad de interpretacion y la posibilidad de pasarme a arquitecturas VON NEUMAN, sin paginado...Existe alguna gama de PIC que no use paginados...
Si, los 18F, 24F, dsPCI
Por ejemplo, podria armar un programita que encienda un led y llamar a la rutina de demora, que ubicaria en la segunda pagina, y desde ahi ver que va pasando...
Buena Idea.
Y yo que me jactaba de entender algo de micros y su manejo (si hasta he experimentado con EEPROM sin problemas) , y me derrota un pagesel, que ironia, la de los micros, cuanto mas los conozco, menos los domino...
Solo puedo decirte que cuanto más aprendo más me doy cuenta de cosas que no se...
Es propio del que poco sabe (y me ha pasado) creer que todo es fácil, minimizar la complejidad de los problemas y pensar que todo se hará más rápido de lo que termina siendo. También me ha pasado jeje.
me pasa lo mismo con mi DVD...que maldicion tecnologia me estara persiguiendo ??? :D
SALUDOS y gracias a quien pueda aportarme alguna otra pista...creame que lei casi todo al respecto en este foro...nada me sirve !!!
Si pones un código de ejemplo al que le podamos echar mano, entonces te vamos a poder ayudar. Para explicar la idea está el ejemplo del link que te mandé y si no es suficiente hace falta ir a lo concreto.
-
Gracias MAUNIX, voy a escribir algo como lo que comento y ver que pasa...
Estaba esperando el oporte de BRUNOF, pero la ultima vez lo volvi loco al pobre (y estoy hablando de MAYO 2007), y parece que ni quiere aparecer por aca...de todos modos he leido mucho de sus explicaciones y de las tuyas...como las de CHARLY y otros que no recuerdo sus nicks...
Tambien con MISTER INCREIBLE !!! (ese es su AVATAR)...Todos demuestran un espiritu de compartir, increible y gratificante...Estoy hace unos meses en algunos foros americanos (los "YONIS" saben muchisimo de esto...sobre todo en las universidades de NY y W, donde leo bastante y hasta me he atrevido a preguntar !!!)...la diferencia fundamental con este foro, es que se nota una falta de compromiso, con las respuestas, todo esta preasumido como que deberia saberse !!! y luego no importa mucho, si el aporte sirve o no !!! Pero en fin, son otras culturas y/o formaciones la de los sajones...digo esto solo para buscarle alguna explicacion, mi viejo es descendiente de anglo-irlandeses, asi que los conozco bastante bien...
En fin seguire viendo si puedo sacar definitivamente este problema de encima...y ese fucking DVD, que tengo adentro de la reproductora hace meses !!! :D
SALUDOS...a tutti !!!
_____________________________
"Justo a mi me todo ser Yo" QUINO
-
Gracias MAUNIX, voy a escribir algo como lo que comento y ver que pasa...
Bueno.
Estaba esperando el oporte de BRUNOF, pero la ultima vez lo volvi loco al pobre (y estoy hablando de MAYO 2007), y parece que ni quiere aparecer por aca...
No creo que sea esa la razón (que no quiera), de seguro está ocupado con algo, los que somos miembros del foro solemos tener 'vida' después del foro. :)
Tambien con MISTER INCREIBLE !!! (ese es su AVATAR)...
Ariel, nick Aitopes.
la diferencia fundamental con este foro, es que se nota una falta de compromiso, con las respuestas, todo esta preasumido como que deberia saberse !!! y luego no importa mucho, si el aporte sirve o no !!! Pero en fin, son otras culturas y/o formaciones la de los sajones...digo esto solo para buscarle alguna explicacion, mi viejo es descendiente de anglo-irlandeses, asi que los conozco bastante bien...
Si, son diferentes, en esos foros si no captas el interés de alguien (con alguna pregunta complicada y que demuestre algún bug serio del compilador por ejemplo) solo te responderán diciendote "lee acá, fijate esto" y hasta ahi nomás.
Como bien intuis son culturas diferentes, donde ellos valoran mucho el esfuerzo pero el esfuerzo propio asi que si te interesa te dan material para leer... pero el esfuerzo lo tenes que hacer 102% vos.
Acá , no somos como ellos, pero si te vamos a pedir que el esfuerzo lo pongas vos. :mrgreen: :mrgreen:
-
Hola muchachos!
lei tambien la de BRUNOF, que invita al uso de PAGESEL...
Use misma tecnica, con PAGESELW, por ej. pero no tuve los resultados esperados...
Deberia funcionar. ¿Cómo sabés que no lo hace?
Use misma tecnica, con PAGESELW, por ej. pero no tuve los resultados esperados...
Ojo que pageselw guarda en el WREG el valor de la página, lo cual no es lo mismo que guardarlo en el PCLATH.
Bueno, todo tiene una explicación. Si bien la más cómoda sería usar la macro PAGESEL(formada por una instruccion movlw xxx y otra movwf PCLATH) en lugar de la PAGESELW(solo la instruccion movlw xxx), hace un tiempo atrás tuve problemas con la PAGESEL. Hubo una tanda(aunque no sé si el error no continúa) de versiones del MPLAB en las que sencillamente el PAGESEL no hacía absolutamente nada. Ponías un PAGESEL y en el código de salida no generaba instrucción alguna(y en más de una ocasión me ha generado instrucciones completamente bizarras).
Si en las nuevas versiones el PAGESEL efectivamente mueve el literal al acumulador y luego lo copia al registro PCLATH, aliento a usar dicha macro en reemplazo de la PAGESELW.
Estaba esperando el oporte de BRUNOF, pero la ultima vez lo volvi loco al pobre (y estoy hablando de MAYO 2007), y parece que ni quiere aparecer por aca...de todos modos he leido mucho de sus explicaciones y de las tuyas...como las de CHARLY y otros que no recuerdo sus nicks...
Pero si siempre estoy! ;)
http://www.todopic.com.ar/foros/index.php?topic=14797.msg130360#msg130360
¿Acaso no me has visto?
Estaba esperando el oporte de BRUNOF, pero la ultima vez lo volvi loco al pobre (y estoy hablando de MAYO 2007), y parece que ni quiere aparecer por aca...
No creo que sea esa la razón (que no quiera), de seguro está ocupado con algo, los que somos miembros del foro solemos tener 'vida' después del foro. :)
Efectivamente, la semana pasada me planchó una angina y en la oficina me asesinan si no me pongo las pilas un poco con el trabajo acumulado...
Pero igualmente siempre ando por aqui.
Saludos!.
-
Hola BRUNO, se efectivamente que no funciona porque, grabe el PIC con ese HEX, y no hace lo esperado...cosa que si hace cuando lo hago de la manera que venia usando hasta ahora...es decir todo en una misma pagina !!!
El tema es que no pasa de pagina o no vuelve !!! IMPOSIBLE saberlo ???
El micro que uso es el 648A...considero que la pag 1 (o la 2º pagina) esta en 0X800...
Probe con varios micros, 3 por lo menos, pero no anda...uso MPLAB 7.50 !!!
Este IDE insiste con esto....Message[306] : Crossing page boundary -- ensure page bits are set.
No parece un error de hecho indica que la compilacion es BUILD SUCCEEDED, pero al ejecutar el soft, se "freeza", exactamente en ese lugar !!! :x
Pa´mi que esta embrujado !!! :D
Me parece que me paso a los 18F, como me sugirio alguien por ahi....Lei un comentario tuyo, donde decias que te pasabas a C o BASIC, por un problema similar...y hay quien dice, que si ya estoy lidiando con los problemas de paginado, es hora de pasarse a otro lenguaje...lo cierto es que me siento muy comodo en ASM, por varias razones, entre ellas, tengo pleno control de lo que hago (salvo esto del paginado, claro :D)...
SALUDOS y seguire tratando de hacerlo andar en ASM...aunque me tome 1 mes !!! (no - si, para porfiado no me gana nadie !!! :mrgreen:)
_____________________________
"Justo a mi me toco ser YO" QUINO
-
Efectivamente, la semana pasada me planchó una angina y en la oficina me asesinan si no me pongo las pilas un poco con el trabajo acumulado...
Pero igualmente siempre ando por aqui.
Bruno, ojalá te hayas repuesto bien de la angina :) :) y recuerda, primero tu salud y después el foro!! :mrgreen: :mrgreen:
-
De la respuesta de MAUNIX se desprende que seria lo mismo usar PAGESEL que BANKSEL...digo esto a riesgo de equivocarme...
http://www.todopic.com.ar/foros/index.php?topic=15674.0
en esa parte del foro, se dice ciertamente que:
banksel REGISTRO --> hará un bsf y bcf del STATUS,RP0 y STATUS,RP1 para que apunten a la página donde está definida la variable
pagesel SUBRUTINA --> hará una carga del PCLATH con los bits adecuados de acuerdo a la página donde esté SUBRUTINA
Con lo cual se me ocurre que si conozco en que pagina esta tal variable, estare llendo a esa pagina, a encontrar por ejemplos RUTINAS...es decir estaria usando el BANKSEL en lugar del PAGESEL, para iguales propositos !!!
Es eso correcto ??? O hay diferencia entre BANCOS DE MEMORIA y PAGINAS ??? :shock:
QUE CONFUSION MAMITA, y a mi el PAGESEL que no me anda !!! :-)
______________________________
"Justo a mi me toco ser YO" QUINO
-
Con lo cual se me ocurre que si conozco en que pagina esta tal variable, estare llendo a esa pagina, a encontrar por ejemplos RUTINAS...es decir estaria usando el BANKSEL en lugar del PAGESEL, para iguales propositos !!!
Es eso correcto ??? O hay diferencia entre BANCOS DE MEMORIA y PAGINAS ??? :shock:
QUE CONFUSION MAMITA, y a mi el PAGESEL que no me anda !!! :-)
De verdad que estas muy muy confundido.... El pic tiene una arquitectura harvard, la memoria de programa está separada de la de datos y además tienen un "ancho" diferente. En un pic 16F, la memoria de programa tiene 14bits por posición y la de datos 8 bits por posición.
Un banksel configurará el RP0 y RP1 para que apunten al "bancos de memoria" adecuado y un pagesel modificara el PROGRAM COUNTER para que apunten a la posición de memoria de programa!
Tal vez estes acostumbrado a otras arquitecturas (como la de las pcs) donde memoria de programa y de datos cohabitan.
PD: sin que pongas el código que no te funciona, difícil saber qué te sucede.
Saludos
-
Bueno, todo tiene una explicación. Si bien la más cómoda sería usar la macro PAGESEL(formada por una instruccion movlw xxx y otra movwf PCLATH) en lugar de la PAGESELW(solo la instruccion movlw xxx), hace un tiempo atrás tuve problemas con la PAGESEL. Hubo una tanda(aunque no sé si el error no continúa) de versiones del MPLAB en las que sencillamente el PAGESEL no hacía absolutamente nada. Ponías un PAGESEL y en el código de salida no generaba instrucción alguna(y en más de una ocasión me ha generado instrucciones completamente bizarras).
Si en las nuevas versiones el PAGESEL efectivamente mueve el literal al acumulador y luego lo copia al registro PCLATH, aliento a usar dicha macro en reemplazo de la PAGESELW.
:shock: :shock: la verdad solamente me ocurrió eso en pics que no tenían paginas por eso el MPASM no generaba las instrucciones. ¿Es posible que el pic del proyecto estuviera mal seleccionado?
Pregunto porque el MPASM rara vez cambia, el que cambia suele ser el IDE; los include files que se agregan, el simulador que permite soportar nuevos pics (mediante el agregado de archivos .dev, no siempre cambia el MPSIM) o demas yerbas pero el ejecutable en sí no cambia con mucha frecuencia que digamos. Hace rato está la versión 5.1 del MPASM.
Saludos
-
y BUENO, aca esta, el que lo hace andar !!!
Lo hice como para probar, pero ni por sencillo anda !!!
================================================
LIST P=16F648a, F=INHX8M
include <P16F648a.inc>
ERRORLEVEL -302 , -305
RADIX HEX
; *******************************************
; * DECLARACION DE VARIABLES *
; *******************************************
CBLOCK 0x20
AUXA, AUXB, AUXC
ENDC
; *******************************************
; * COMIENZO *
; *******************************************
ORG 0x00
GOTO INICIO
INICIO NOP
BANKSEL PORTA
CLRF PORTA
MOVLW 0x07
MOVWF CMCON
CLRF PORTB
BANKSEL TRISA
MOVLW 0xFF
MOVWF TRISA ;config. PORTA con *11111111*
MOVLW 0x00
MOVWF TRISB ;config. PORTB con *00000000*
MOVLW 0x07
MOVWF OPTION_REG
BANKSEL PORTA
CLRF AUXA
CLRF AUXB
CLRF AUXC
; *************************************
; * INICIA RUTINA *
; *************************************
MAIN NOP
BSF PORTB , 04
PAGESEL DEL2M
CALL DEL2M
BCF PORTB , 04
PAGESEL DEL1M
CALL DEL1M
GOTO MAIN
; *******************************************
; * DEMORA 100 ms *
; *******************************************
DEL1M MOVLW 0x04 ;d'4'
MOVWF AUXC
DE10M MOVLW 0x0A ;d'10'
MOVWF AUXB
DE20M MOVLW 0xFA ;d'250'
MOVWF AUXA
DE22M NOP ;aprox. = (10 * 1us) * 250 = 2,5 ms
GOTO $+1
GOTO $+1
GOTO $+1
DECFSZ AUXA , F ;son 2 ciclos en DECFSZ
GOTO DE22M
DECFSZ AUXB , F
GOTO DE20M ;hasta aca demora = 2,5 ms * 10= 25 ms
DECFSZ AUXC , F
GOTO DE10M
RETURN ;total demora 25 ms * 4 = 100 ms
ORG 0x900
; *******************************************
; * DEMORA 100 ms *
; *******************************************
DEL2M MOVLW 0x04 ;d'4'
MOVWF AUXC
DE12M MOVLW 0x0A ;d'10'
MOVWF AUXB
DE222M MOVLW 0xFA ;d'250'
MOVWF AUXA
DE222 NOP ;aprox. = (10 * 1us) * 250 = 2,5 ms
GOTO $+1
GOTO $+1
GOTO $+1
DECFSZ AUXA , F ;son 2 ciclos en DECFSZ
GOTO DE222
DECFSZ AUXB , F
GOTO DE222M ;hasta aca demora = 2,5 ms * 10= 25 ms
DECFSZ AUXC , F
GOTO DE12M
RETURN ;total demora 25 ms * 4 = 100 ms
; ******************************************
; * FIN *
; ******************************************
END
-
Bueno, todo tiene una explicación. Si bien la más cómoda sería usar la macro PAGESEL(formada por una instruccion movlw xxx y otra movwf PCLATH) en lugar de la PAGESELW(solo la instruccion movlw xxx), hace un tiempo atrás tuve problemas con la PAGESEL. Hubo una tanda(aunque no sé si el error no continúa) de versiones del MPLAB en las que sencillamente el PAGESEL no hacía absolutamente nada. Ponías un PAGESEL y en el código de salida no generaba instrucción alguna(y en más de una ocasión me ha generado instrucciones completamente bizarras).
Si en las nuevas versiones el PAGESEL efectivamente mueve el literal al acumulador y luego lo copia al registro PCLATH, aliento a usar dicha macro en reemplazo de la PAGESELW.
:shock: :shock: la verdad solamente me ocurrió eso en pics que no tenían paginas por eso el MPASM no generaba las instrucciones. ¿Es posible que el pic del proyecto estuviera mal seleccionado?
Pregunto porque el MPASM rara vez cambia, el que cambia suele ser el IDE; los include files que se agregan, el simulador que permite soportar nuevos pics (mediante el agregado de archivos .dev, no siempre cambia el MPSIM) o demas yerbas pero el ejecutable en sí no cambia con mucha frecuencia que digamos. Hace rato está la versión 5.1 del MPASM.
Saludos
Hmm...Ahora me haces poner en duda si no fue una burrada mía, pero no creo...porque estoy seguro que era un proyecto con un 16F877A...
Ahora se hade dificil conseguir la evidencia. Igual estoy hablando hace más de un año atrás.
Hola Resistencio.
El código anda perfecto. Desactivá el watchdog timer y tiene que salir andando...no es problema de paginación...
Saludos.
-
A mi me parecia que era asi nomas, como decis MAUNIX, pero como en la explicacion dice:
banksel REGISTRO --> hará un bsf y bcf del STATUS,RP0 y STATUS,RP1 para que apunten a la página donde está definida la variable
pagesel SUBRUTINA --> hará una carga del PCLATH con los bits adecuados de acuerdo a la página donde esté SUBRUTINA
Osea siempre hablabas de PAGINA, eso me confundia...me parece que tiene mas que ver con una cuestion de definiciones...una cosa es PAGINAS y otras BANCOS, creo que eso me genera mucha confusion...como siempre digo esto a riesgo de estar equivocado, y a la espera que se pueda aclarar si es lo mismo en cuanto a definicion, en cuanto a la arquitectura esta bastante claro...(cada vez me gusta mas la VON NEWMAN, creo que es la que usa MOTOROLA)
SALUDOS !!! a tutti !!!
______________________________
"Justo a mi me toco ser YO" QUINO
-
Pero como haces BRUNO ??? Cuando lo compilo me tira:
Message[306] Crossing page boundary -- ensure page bits are set.
Siempre hace lo mismo, y lo peor es que no anda el programa...tengo que desactivar el WDT en el WINPIC o en donde ???
Cada vez estoy mas descorcertado, sera que tengo que usar ICPROG ???
Lo estoy haciendo ahora mismo...
SALUDOS !!!
-
banksel REGISTRO --> hará un bsf y bcf del STATUS,RP0 y STATUS,RP1 para que apunten a la página donde está definida la variable
Lo importante es que habla de VARIABLE. Se esta refiriendo a una posicion de memoria.
pagesel SUBRUTINA --> hará una carga del PCLATH con los bits adecuados de acuerdo a la página donde esté SUBRUTINA
Lo importante es que habla de SUBRUTINA. Se esta refiriendo a memoria de DATOS.
Saludos!
-
Gracias BRUNO esa es la diferencia que no veia...ahora esta mucho mas claro...VARIABLE y SUBRITINA !!! eso tiene sentido, totalmente !!! GRACIAS - GRACIAS !!! :-)
Como haces para que no te tire el mensaje 306 que me dice a mi el MPLAB ??? :shock:
Desactive el WDT, y hace lo mismo !!!
O meto todo el programa en una sola pagina, o uso un 18F...XD !!!
ALGUIEN MAS QUE LO PUEDA COMPILAR....PLZ !!!
SALUDOS !!!
-
Primero: ¡No desesperes, hombre!
Tranquilo que todo tiene una explicación y por suerte estás lidiando en áreas técnicas/científicas que te aportarán la mayoría de las respuestas que necesitas con gran precisión.
Pero como haces BRUNO ??? Cuando lo compilo me tira:
Message[306] Crossing page boundary -- ensure page bits are set.
Nadie dijo que los "Messages" e inclusive "Warnings" fuesen malos.
Los Messages son meramente eso: mensajes. Es un detalle del MPASM que intenta avisarte que puede que estés cometiendo un error en este caso, por lo que te larga un mensaje diciendote simplemente que reuerdes eso. El MPASM no es tan inteligente(y dudo que algun dia lo sea ya que resulta practicamente imposible) como para saber si efectivamente se trata de un error o lo hiciste adrede. El simplemente te avisa. Lo mejor que puedes hacer tu es seguir su consejo y "Ensure page bits are set" es decir, asegurarte que hayas seteado los bits de paginacion correctamente.
Siempre hace lo mismo, y lo peor es que no anda el programa...tengo que desactivar el WDT en el WINPIC o en donde ???
Lo podés hacer desde muchos lugares. Pero hay que mantener la coherencia entre las partes.
Podés agregarle la configuración directamente al archivo .asm, y el MPASM se encargara de incluirla en el .hex generado. Si optas por esta opcion, asegurate que el ICPROG(lo he usado durante años antes de pasar al WINPIC800 y nunca tuve mayores problemas) lea la configuracion desde el archivo .hex.
Ejemplo de configuracion(varia de PIC en PIC segun la disponibilidad de las diversas opciones/módulos)
__CONFIG _CP_OFF & _PWRTE_ON&_WDT_OFF & _BODEN_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
_CP_OFF= Code Protect OFF (no protejo la zona de datos contra lectura)
_PWRTE_ON= Power Up Timer ON (demora inicial al encender el PIC activada)
_WDT_OFF = WatchDog Timer OFF (perro guardian desactivado)
_BODEN_OFF=Brown Out Detection OFF (reiniciado ante deteccion de voltaje fuera de limite desactivado)
_MCLRE_OFF= Memory Clear OFF (no uso pin MCLR)
_INTRC_OSC_NOCLKOUT = Internal Clock Oscillator No Clock Out (oscilador interno, no genero clocks de salida)
Si querés ver la lista completa de posibilidades para setear la configuracion de un PIC, lo mas facil es abrir su archivo .inc y encontras el listado ahi dentro.
Saludos
-
Bueno...
1) No sos el hombre con más fortuna del planeta*;
2) El error es ajeno a la paginación;
El error:
El PIN RB4 del PIC 16F648A puede ser configurado para funcionar como PGM. Está asociado a la función de Low Voltage Programming(LVP). Si esta función está activa, el pin RB4 se utiliza como ENTRADA(por eso no variaba su estado).
¿Solución?
Indicarle al programa grabador(ICPROG en tu caso) que NO vamos a usar la función LVP.
Te paso el programa asm para que lo ensambles y pruebes.
El mensaje 306 se suprime como cualquier otro, con la instruccion ERRORLEVEL -numero
LIST P=16F648a, F=INHX8M
include <P16F648a.inc>
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF & _BODEN_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF
ERRORLEVEL -302 , -305 , -306
RADIX HEX
; *******************************************
; * DECLARACION DE VARIABLES *
; *******************************************
CBLOCK 0x20
AUXA, AUXB, AUXC
ENDC
; *******************************************
; * COMIENZO *
; *******************************************
ORG 0x00
GOTO INICIO
INICIO NOP
BANKSEL PORTA
CLRF PORTA
MOVLW 0x07
MOVWF CMCON
CLRF PORTB
BANKSEL TRISA
MOVLW 0xFF
MOVWF TRISA ;config. PORTA con *11111111*
MOVLW 0x00
MOVWF TRISB ;config. PORTB con *00000000*
MOVLW 0x07
MOVWF OPTION_REG
BANKSEL PORTA
CLRF AUXA
CLRF AUXB
CLRF AUXC
; *************************************
; * INICIA RUTINA *
; *************************************
MAIN NOP
BSF PORTB , 04
PAGESEL DEL2M
CALL DEL2M
BCF PORTB , 04
PAGESEL DEL1M
CALL DEL1M
GOTO MAIN
; *******************************************
; * DEMORA 100 ms *
; *******************************************
DEL1M MOVLW 0x04 ;d'4'
MOVWF AUXC
DE10M MOVLW 0x0A ;d'10'
MOVWF AUXB
DE20M MOVLW 0xFA ;d'250'
MOVWF AUXA
DE22M NOP ;aprox. = (10 * 1us) * 250 = 2,5 ms
GOTO $+1
GOTO $+1
GOTO $+1
DECFSZ AUXA , F ;son 2 ciclos en DECFSZ
GOTO DE22M
DECFSZ AUXB , F
GOTO DE20M ;hasta aca demora = 2,5 ms * 10= 25 ms
DECFSZ AUXC , F
GOTO DE10M
RETURN ;total demora 25 ms * 4 = 100 ms
ORG 0x900
; *******************************************
; * DEMORA 100 ms *
; *******************************************
DEL2M MOVLW 0x04 ;d'4'
MOVWF AUXC
DE12M MOVLW 0x0A ;d'10'
MOVWF AUXB
DE222M MOVLW 0xFA ;d'250'
MOVWF AUXA
DE222 NOP ;aprox. = (10 * 1us) * 250 = 2,5 ms
GOTO $+1
GOTO $+1
GOTO $+1
DECFSZ AUXA , F ;son 2 ciclos en DECFSZ
GOTO DE222
DECFSZ AUXB , F
GOTO DE222M ;hasta aca demora = 2,5 ms * 10= 25 ms
DECFSZ AUXC , F
GOTO DE12M
RETURN ;total demora 25 ms * 4 = 100 ms
; ******************************************
; * FIN *
; ******************************************
END
*) Si hubieses elegido cualquier otro pin I/O el programa te hubiese funcionado(siempre y cuando el WDT estuviese deshabilitado).
Saludos y a desarrollar la paciencia! ;)
-
Efectivamente BRUNO, en este ejemplo que puse el error esta resuelto...si a esto le agrego el -306...quedaria OK !!!
Paso a explicar lo que me pasaba, que de hecho era simple...Eso puedo decirlo ahora !!!
cuando volvia de la pagina 1, no incluia el nuevo pagesel para indicarle al contador que ahora estaba sobre la pagina 0...
eso en el ejemplo que puse estaba bien...entonces solo perseguia que se arreglara lo del mensaje 306, que ahora y segun lo que me decis, es una advertencia...quizas por eso la compilacion daba siempre BUILD SUCCEEDED...
Aun asi...si no pones el pagesel de RETORNO, no anda el soft, porque el P_T_ pclath se queda con el dato de la pagina donde estaba...probe el programa en cuestion (que no es precisamente este) y lo probe con y sin el pagesel a primera pagina...entonces descubri que con el pagesel anda ok y sin el NO...Yo pensaba que con el RETURN volvia a la pagina desde la cual venia y sabia que estaba, en posicion...
En resumen si haces:
MAIN NOP
BSF PORTB , 04
PAGESEL DEL2M
CALL DEL2M
BCF PORTB , 04
PAGESEL DEL1M
CALL DEL1M
GOTO MAIN
Anda OK !!!
Pero si haces:
MAIN NOP
BSF PORTB , 04
PAGESEL DEL2M
CALL DEL2M
BCF PORTB , 04
CALL DEL1M
GOTO MAIN
ALPISTE !!!
Seguire investigando un poquito mas, pero parece que si solo tomo al 306 como una advertencia y verifico esa condicion estaria todo bien...
Ahora me doy cuenta de otro detalle...cuando revisaba donde estaba el error, en IDE, lo señala con una flecha VERDE a la izquierda, desde donde esta el ERROR...y en este caso lo indicaba despues del primer PAGASEL, con lo cual Yo deberia haber concluido que el ERROR estaba por debajo de esa linea...dende efectivamente estaba !!! porque me faltaba indicar que estaba devuelta en la pagina 0...XD !!!
Pero nunca habia visto esa flecha VERDE antes !!!, estaba trabajando con el MPLAB 5, hasta hace unos dias !!! :-)
SALUDOS y gracias por los aportes !!!
_____________________________
"Justo a mi me toco ser YO! QUINO
-
Hola Resistencio.
¿Pero vos leiste más arriba que lo que impedía que RB4 cambie de estado era la configuración del LVP?
La flecha es el cursor, y se usa mucho para simular código.
Saludos.
-
Si BRUNO, lo lei...en el programa ese pin lo estaba usando para otra cosa...se dio que en el ejemplo puse sin darme cuenta ese mismo pin...y en la practica no tenia como probarlo porque estaba probando sobre un circuito que usaba el PB,02...
Yo estaba emperrado con el tema del 306 y como nunca dejaba de aparecer, pensaba que iba a tener el mismo error con cualquier pin que eligiera...lo cierto es que con el PB,02 y con el mismo progrma del ejemplo anda bien...
Voy a mirar lo que me decis del PB,04...que pasara a ser otro tema a tener en cuenta...
Estoy usando ahora el WINPIC y al igual que en el ICPROG tengo todo desmarcado !!!
Ahora pruebo, lo de PGM en PB,04 !!! :-/
SALUDOS !!!
-
Yo estaba emperrado con el tema del 306 y como nunca dejaba de aparecer, pensaba que iba a tener el mismo error con cualquier pin que eligiera...lo cierto es que con el PB,02 y con el mismo progrma del ejemplo anda bien...
Pero Resistencio, fíjate que te hemos explicado una y otra vez lo del mensaje 306. Lee desde el 1er post al último y fíjate que no has prestado mucha atención o tal vez no hayas comprendido del todo su significado.
Nada pero nada tiene que ver que elijas un pin u otro en tu código o el LVP con un mensaje 306.
Saludos
PD: Bruno, respecto a la 'evidencia' no tiene mayor trascendencia ahora, solamente curiosidad de mi parte ¿si? Ya que no había oído de tal problema y yo tengo firmwares viejos hechos completamente en assembly para 16F876, 16F876A, 16f873, 16f873A , 16f877A, 16F874A y los uso con muchísima frecuencia y jamás me pasó eso, por ello mi duda. Es todo.
Saludos 2
-
Gracias MAUNIX, he leido todos los post...entendi que era una advertencia...lo que pasa, es que en mi caso, ademas de advertirme, me tiene que sonar alguna trompeta, para que me avive !!!
Estaba interpretando, que me decian que por salir por porta,04, se me generaba ese mensaje...perdon fue mal interpretada esa parte...
En resumen el mensaje aparece, solo como una advertencia, como bien me dicen ambos...Pero OJO que sino le das "bola" puedo estar en un verdadero ERROR !!!
Probe volviendo a la pagina de origen, y sin reescribir el PCLATH, y el IDE me tiraba la misma advertencia...y el programa NO ANDABA !!!
Luego probe, volver a la pagina de origen y escribir en el PCLATH (que es como debe hacerse) y el IDE me tiraba la misma advertencia, por lo cual, Yo creia, que nada se habia solucionado...Pero de esta menera el programa ANDA OK...
Por eso digo, que no veia diferencia entre una compilacion y otra (en cuanto a mensaje, se trata)...a lo cual se agrego el tema del LVP y el PORTB,04, para terminar de pensar que estaba haciendo todo para el "CUCU" !!!
Lo que finalmente hice, fue llevar a la practica y probar el programa en el mismo circuito, y ahi descubri que con una compilacion y a igual mensaje (306), en un caso andaba y en otro no...
En fin, un enrededo, de conceptos y pruebas...Lo importante que rescate de todo esto, es que el PAGESEL resuelve perfectamente del tema del paginado...basta con poner el nombre de cualquier etiqueta que se encuentre en la pagina que quiero apuntar, y el PC, sabe que tiene que ir a esa pagina !!!
Ahora voy a probar un poquito el PAGESELW, y ver como trabaja !!!
A la final, me parece que esto de los micros no se termina de aprender nunca...y menos mal que son RISC !!!
Les agradezco infinitamente el compromiso y las ganas de aportar, siempre los estoy leyendo...de hecho antes de preguntar esto, repase algunos casos similares, pero como nadie preguntaba sobre este micro, pensaba que era diferente en algo...
En fin, sigo aprendiendo cada dia un poco mas...GRACIAS por las molestias !!!
_____________________________
"Justo a mi me toco ser YO" QUINO
-
A la final, me parece que esto de los micros no se termina de aprender nunca...y menos mal que son RISC !!!
Por eso para programas largos rara vez los haras en assembly por no decir nunca. Lo que uno termina haciendo es conocer el assembler como para codificar en C y poderle sacar provecho a las optimizaciones de la arquitectura y solamente se usaría el assembly en pedazos de código muy puntuales que requieran cierta velocidad que no se puede lograr de otra forma.
Les agradezco infinitamente el compromiso y las ganas de aportar, siempre los estoy leyendo...de hecho antes de preguntar esto, repase algunos casos similares, pero como nadie preguntaba sobre este micro, pensaba que era diferente en algo...
Se suele preguntar más sobre el 16F628 y 16F628A que son bastantes similares.
En fin, sigo aprendiendo cada dia un poco mas...GRACIAS por las molestias !!!
De nada, saludos
-
yo tengo un problema igual, hice un programa batante largo el cual ocupa aproximadamente 5k de la memoria de un 16f877a, cuando mando a llamar una subrutina..el program counter se va a una parte que ni al caso donde ni siquiera existe una etiqueta, trate de usar el pagesel (numbre subrutina), y luego llamar a la subrutina, y cuando compilo el codigo me dice que es un error y me tira el siguiente mensaje: Directive only allowed when generating an object file, estoy usando el mplab version 8.20 que puedo hacer???
-
Hola Charly46, usted esta usando una version vieja del MPLAB, la version que yo uso ahora mismo es la V8,56, Microchip ha hechos muchos cambios en cada versiones por problema de este tipos, asi que te recomiendo que actualice y si el problema continua nos informa aqui.
Saludos
-
Hola Charly46, usted esta usando una version vieja del MPLAB, la version que yo uso ahora mismo es la V8,56, Microchip ha hechos muchos cambios en cada versiones por problema de este tipos, asi que te recomiendo que actualice y si el problema continua nos informa aqui.
Saludos
Efectivamente compañero, ese era el problema, actualize mi version de MPLAB a la version 8.63 y todo arreglado gracias..!