Autor Tema: Problemas con llamada a función  (Leído 2949 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
Problemas con llamada a función
« en: 23 de Febrero de 2006, 17:52:00 »
Hola a todos!!

Estoy teniendo problemas para llamar a una función que tengo ubicada en la dirección 0x0900, llamándola desde la dirección 0x0200. Como cruza una página, siempre he gastado el siguiente código:

movlw   HIGH    Funcion
movwf   PCLATH
call       Funcion

Y no se por qué, estoy gastando un PIC16F685, y el código que siempre he
utilizado no funciona, el programa se va a otra parte diferente que no es la función que yo quiero ejecutar.

Sin embargo si le pongo lo siguiente:

movlw    HIGH Funcion
movwf   PCLATH
movlw    Funcion
movwf    PCL

Si que se dirije hacia donde yo quiero.


Alguien podría decirme, el por qué de mi error?????

En principio, con el código que yo gastaba antes siempre me funcionó con otros PICS (16F84,16F73,etc.)

Un saludo y gracias!!

Desconectado hernando2999

  • PIC12
  • **
  • Mensajes: 99
RE: Problemas con llamada a función
« Respuesta #1 en: 23 de Febrero de 2006, 22:12:00 »
LA RESPUESTA ES LA SIGUIENTE:
;******************************************************************************************************
CUANDO SE DEBE PAGINAR UN PROGRAMA:
COMO SU NOMBRE LO INDICA LAS PAGINAS DE PROGRAMA DE LOS MICROCONTROLADORES ESTAN O CONTIENEN UN VALOR MAXIMO
DE 256 LINEAS DE CODIGO... CADA LINEA PUEDE SER UN CALL, GOTO, MOVWF O UN NOP....ETC
TEN CUENTA QUE LA CANTIDAD DE PAGINAS DE PROGRAMA LAS DA LAS CARACTERISTICAS DEL PIC Y ESTA DADO EN 1K 2K ...ETC
COMO CONCEJO CUANDO LLEGAMOS AUN RANGO CERCANO A LAS 240 LINEAS ES MEJOR PASAR A UNA NUEVA PAGINA DE PROGRAMA
FIJATE QUE SONBRARIAN 16 LINEAS DE PROGRAMA ...ESTAS LAS DEJAMOS COMO SEGURIDAD EN EL CASO DE CORRECCIONES.....
;******************************************************************************************************
COMO SE HACE UNA NUEVA PAGINA:
FACIL...
PONES UN ENCABEZADO ASI

ORG 0X00   ;PAGINA 0--> PCLATCH =0 EN HEX MAXIMO F
AQUI NUESTRO CODIGO MAXIMO 256 LINEAS DE CODIGO

ORG 0X100   ;PAGINA 1--> PCLATCH =2 EN HEX MAXIMO F
AQUI NUESTRO CODIGO MAXIMO 256 LINEAS DE CODIGO

ORG 0X200   ;PAGINA 2--> PCLATCH =3 EN HEX MAXIMO F
AQUI NUESTRO CODIGO MAXIMO 256 LINEAS DE CODIGO

ORG 0X300   ;PAGINA 3--> PCLATCH =4 EN HEX MAXIMO F
AQUI NUESTRO CODIGO MAXIMO 256 LINEAS DE CODIGO

ORG 0X400   ;PAGINA 4--> PCLATCH =5 EN HEX MAXIMO F
AQUI NUESTRO CODIGO MAXIMO 256 LINEAS DE CODIGO

ORG 0X500   ;PAGINA 5--> PCLATCH =6 EN HEX MAXIMO F
AQUI NUESTRO CODIGO MAXIMO 256 LINEAS DE CODIGO

;******************************************************************************************************
COMO PASAR DE UNA PAGINA A OTRA....
HAY BARIOS METODOS DE HACERLO
;***********************************************
;>>>>>>>PRIMER METODO EL COMPLICADO
POR MANIPULACION DIRECTA DE LOS BITS DEL PCLATH
;**********
;EN EL PROGRAMA EJMPLO ESTANDO EJECUTANDO LINEAS EN LA PAGINA 2 Y LLAMANDO UNA RUTINA_N DE LA PAGINA 4
   BSF PCLATH,2    ; MANIPULO EL BIT DOS DEL PCLATH
   CALL RUTINA_N   ;LLAMO LA RUTINA
   BCF PCLATH,2    ;RETORNO VALORES AL PCLATH PARA QUE SIGA EN DICHA PAGINA 2
   BCF PCLATH,1
;**********
;EN EL PROGRAMA EJMPLO ESTANDO EJECUTANDO LINEAS EN LA PAGINA 5 Y LLAMANDO UNA RUTINA_N DE LA PAGINA 3
   BSF PCLATH,0    ; MANIPULO EL BIT CERO DEL PCLATH
   BSF PCLATH,1    ; MANIPULO EL BIT UNO DEL PCLATH
   CALL RUTINA_N   ;LLAMO LA RUTINA.
   CLRF PCLATH
   BSF PCLATH,0    ; MANIPULO EL BIT CERO DEL PCLATH
   BSF PCLATH,2    ; MANIPULO EL BIT DOS DEL PCLATH RETORNO VALORES AL PCLATH PARA QUE SIGA EN DICHA PAGINA 5
;**********
;; Y ASI COMPLICADAMENTE SEGUIMOS TRABAJANDO

;***********************************************
;>>>>>>>SEGUNDO METODO Y EL FACIL
SE HARIA POR MACROS EN DONDE SOLO LE LLAMAS EL MACRO ALGO PARECIDO AL ANTERIOR PERO MENOS COMPLICADO
TEN ENCUENTA QUE EL LLAMADO DE UN MACRO NO ES LO MISMO QUE UN CALL ...PUES SOLO ESCRIBES EL NOMBRE DEL MACRO
Y TU COPILADOR SE ENCARGA DE COPIAR EL CODIGO CONTENIDO EN EL MACRO.
;**********
PAGINA0 MACRO
   CLRF PCLATH   ; BORRO TODOS LOS BITS DEL PCLATH
   ENDM
PAGINA1 MACRO
   PAGINA0      ;LLAMO EL MACRO PAGINA0 POR SEGURIDAD Y ASI EVITAR MALOS SALTOS
   BSF PCLATH,0    ; MANIPULO EL BIT CERO DEL PCLATH
   ENDM
PAGINA2 MACRO
   PAGINA0      ;LLAMO EL MACRO PAGINA0 POR SEGURIDAD Y ASI EVITAR MALOS SALTOS
   BSF PCLATH,1   ; MANIPULO EL BIT UNO DEL PCLATH
   ENDM
PAGINA3 MACRO
   PAGINA0      ;LLAMO EL MACRO PAGINA0 POR SEGURIDAD Y ASI EVITAR MALOS SALTOS
   PAGINA2
   BSF PCLATH,0    ; MANIPULO EL BIT CERO DEL PCLATH
   ENDM
PAGINA4 MACRO
   PAGINA0      ;LLAMO EL MACRO PAGINA0 POR SEGURIDAD Y ASI EVITAR MALOS SALTOS
   BSF PCLATH,2    ; MANIPULO EL BIT DOS DEL PCLATH
   ENDM
PAGINA5 MACRO
   PAGINA4
   BSF PCLATH,0    ; MANIPULO EL BIT CERO DEL PCLATH
   ENDM
PAGINA6 MACRO
   PAGINA4
   BSF PCLATH,1   ; MANIPULO EL BIT UNO DEL PCLATH
   ENDM
;***ETC
;**********
;EN EL PROGRAMA EJMPLO ESTANDO EJECUTANDO LINEAS EN LA PAGINA 2 Y LLAMANDO UNA RUTINA_N DE LA PAGINA 4
   PAGINA4        ;PONGO EL MACRO PAGINA4 PARA APUNTAR A DICHA PAGINA
   CALL RUTINA_N   ;LLAMO LA RUTINA
   PAGINA2        ;RETORNO VALORES AL PCLATH PARA QUE SIGA EN DICHA PAGINA 2
;**********
;EN EL PROGRAMA EJMPLO ESTANDO EJECUTANDO LINEAS EN LA PAGINA 5 Y LLAMANDO UNA RUTINA_N DE LA PAGINA 3
   PAGINA3        ;PONGO EL MACRO PAGINA3 PARA APUNTAR A DICHA PAGINA
   CALL RUTINA_N   ;LLAMO LA RUTINA
   PAGINA5        ;RETORNO VALORES AL PCLATH PARA QUE SIGA EN DICHA PAGINA 5
;**********
;; Y ASI FACILITO SEGUIMOS TRABAJANDO
;******************************************************************************************************
;AHORA LA SOLUCION A TU PREGUNTA

CUANDO LE DAS CARGAR

movlw HIGH Funcion   ;AQUI CARGA AL PCLATH EL VALOR DE LA UBICACION DE LA PAGINA DE LA FUNCION
movwf PCLATH       ;MUEVE DICHO VALOR AL PCLATH
movlw Funcion       ;AQUI CARGA AL PCL EL VALOR DE LA UBICACION EN LA PAGINA DE LA FUNCION
movwf PCL       ;MUEVE DICHO VALOR AL PCL
         ;ASI MISMO EJECUTA DICHA FUNCION

SALUDOS ESPERO LES SIRBA MI EXPLICACION




Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: Problemas con llamada a función
« Respuesta #2 en: 24 de Febrero de 2006, 01:35:00 »
Hola hernando2999, veo ya de muy mala manera cuando tu contestas un post, porque en esta noche ya es visto que has respondido 4 y muy mal (incluido este) y en este momento paso a corregirte por cuarta ves y consecutiva.

Las paginas de memoria de programa no son de 265 Bytes como comentas y no es necesario repaginar en la dirección 240.

Las paginas son de 2048 Bytes esto es para todos los PIC de más de 2K de memoria de programa, ya que si estas usando un PIC de 2K o menos no es necesario repaginar y aparte no conozco un PIC de la familia 16F que posea mas de 4 páginas.¿Tú sí? dime cual.

Por otro lado, ¿Podrías dejar de escribir en mayúscula? como sabrás escribir en mayúscula en un foro es como levantar el tono, y acá en este foro no hay ni sordos ni ciego, OK.

Hola TOFLE, para tu pregunta realmente no tengo una explicación, ya que debería funcionar cualquiera de las 2 formas.

Un saludo.

Atte. CARLOS.



La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Problemas con llamada a función
« Respuesta #3 en: 24 de Febrero de 2006, 05:53:00 »
Gracias por tu respuesta hernando2999, y Chaly29

He probado lo de las macros, pero nada, realmente lo de las macros es lo que yo ya hacía con mi código.

El problema es que cuando ejecuto el call, el programa me envía al principio de la dirección 0x0100, y no a la 0x0900 que tiene cargado el PCLATH.

No sé Chaly, es una "marcianada" un poco rara. Me extraña mucho que cargando el valor en PCL funcione, y si lo hago con "call" no.

Gracias a los dos...

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Problemas con llamada a función
« Respuesta #4 en: 24 de Febrero de 2006, 06:31:00 »
Esto es una cosa rara rara. Prueba si cargando el valor 0x09 en el PCLATH en vez de usar el HIGH te salta a la 0x900.

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Problemas con llamada a función
« Respuesta #5 en: 24 de Febrero de 2006, 06:44:00 »
Ya lo he probado antoniof

Y.....nada de nada, sigue igual. Con el HIGH si que carga el valor 0x0900 en el PCLATH, lo estoy mirando continuamente en el MPLAB en los registros y si que lo carga, pero a la hora del call....nada.

Gracias!

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Problemas con llamada a función
« Respuesta #6 en: 24 de Febrero de 2006, 06:57:00 »
Lo único ya, comprobar en el código del archivo *.list, a que direccion llama el call, y porsupuesto que no tengas la Funcion con otro nombre, mayusculas minusculas, tildes, etc.

Mira poniendo otra etiqueta distinta y haciendo el call a esta nueva etiqueta haber que pasa.

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Problemas con llamada a función
« Respuesta #7 en: 24 de Febrero de 2006, 07:27:00 »
Hola de nuevo antoniof,

Sigo igual, no sé que puede fallar. Lo del nombre de la función está correcto,
he mirado el datasheet del 16f685 para comprobar que realmente tiene 4K y si, los tiene, lo único que me "mosquea" es que por ejemplo, en el datasheet del 16f73 (también de 4K) marca las dos páginas de memoria de que dispone, y en el datasheet de éste no.


En fin, gracias de nuevo!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
RE: Problemas con llamada a función
« Respuesta #8 en: 24 de Febrero de 2006, 08:50:00 »
Buenas...

Escrito originalmente por TOFLE
Hola a todos!!

Estoy teniendo problemas para llamar a una función que tengo ubicada en la dirección 0x0900, llamándola desde la dirección 0x0200. Como cruza una página, siempre he gastado el siguiente código:

movlw   HIGH    Funcion
movwf   PCLATH
call       Funcion

Y no se por qué, estoy gastando un PIC16F685, y el código que siempre he
utilizado no funciona, el programa se va a otra parte diferente que no es la función que yo quiero ejecutar.

Sin embargo si le pongo lo siguiente:

movlw    HIGH Funcion
movwf   PCLATH
movlw    Funcion
movwf    PCL

Si que se dirije hacia donde yo quiero.


Alguien podría decirme, el por qué de mi error?????

En principio, con el código que yo gastaba antes siempre me funcionó con otros PICS (16F84,16F73,etc.)

Un saludo y gracias!!


La teoria esta bien, estuve simulando esto:

movlw   HIGH    Funcion
movwf   PCLATH
call       Funcion

En el MPLAB SIM y anda perfecto, y es mas, deberia funcionar perfecto.

Por otro lado, esto:

movlw    HIGH Funcion
movwf   PCLATH
movlw    Funcion
movwf    PCL

es en realidad una "especie" de GOTO, no es un CALL. Por lo tanto el STACK no se carga con el valor donde debe retornar.
Si utilizas esto, y al final de la rutina "Funcion" pones un RETURN,RETFIE o RETLW vas a provocar un "underflow" del STACK...
Exitos...
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Problemas con llamada a función
« Respuesta #9 en: 24 de Febrero de 2006, 08:55:00 »
Hola BrunoF,

Yo también he aislado el problema, he creado un programa con sólo ésta llamada a la función que tengo ubicada en la dirección 0x0900 y nada.
Yo gasto el MPLAB 7.11, y hasta la fecha, siempre fué bien.

¿Podías incluir el código que has puesto para que lo pueda testear en mi MPLAB?

Un saludo y gracias!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
RE: Problemas con llamada a función
« Respuesta #10 en: 24 de Febrero de 2006, 09:06:00 »
Hola. pues no mucho mas que esto:

Codigo:


   LIST      P=PIC16F685
   #include   <P16F685.INC>

         ORG   0X0000

         movlw   HIGH    Funcion
         movwf   PCLATH
         call    Funcion
         nop

         org   0x900
Funcion      return

         END




Exitos...
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Problemas con llamada a función
« Respuesta #11 en: 24 de Febrero de 2006, 09:12:00 »
Bueno, pues entonces lo teníamos igual.

Acabo de descargarme la versión 7.3 del MPLAB y curiosamente ya funciona.

No se por qué, pero éstas marcianadas siempre me pasan a mí, en fin, resignación Sonrisa

Gracias a todos por vuestra ayuda!

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: Problemas con llamada a función
« Respuesta #12 en: 24 de Febrero de 2006, 13:37:00 »
Hola TOFLE, no solo te pasan a ti, a mike666 el MPLAB 7.2 no le dejaba configurar el puerto A del 16C57C, lo e probado con el mío (7.2 también) y corrobore lo mismo, supongo que a los chicos de microchip de ves en cuando se le deben escapar algunas cosas.

Un saludo.

Atte. CARLOS

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.