Autor Tema: XC8 mixto ensamblador y C problema  (Leído 5286 veces)

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

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
XC8 mixto ensamblador y C problema
« en: 23 de Enero de 2015, 22:11:52 »
Buenas días foreros me gustaría comentar con vosotros un problema que me ha surgido y no encuentro solución.

estoy programando un sistema mixto de c y ensamblador separado es decir ficheros C y ficheros asm, nada de ASM() etc.

el problema es que al hacer una cosa tan simple como:
MOVLW 0x06     
MOVWF ADCON1
me da un warning y hace que mi programa no funcione ya que no se escribe nada en ese registro. el warning es el siguiente:
        ASM.asm:30: warning: (1352) truncation of operand value (0x9f) to 7 bits
es muy curioso por que solo me ocurre con algunos registros, con la mayoria pero con otros funciona perfectamente la rutina completa seria este:
    GLOBAL _IOPORT_Config ; make _add globally accessible
    SIGNAT _IOPORT_Config,4218 ; tell the linker how it should be called
    ; everything following will be placed into the mytext psect
    PSECT Mitexto1,local,class=CODE,delta=2                   
                                                       

_IOPORT_Config:

    MOVLW 0x00      ;Limpiamos el puerto A estableciendolo a 0
    MOVWF PORTA

    MOVLW 0x06      ;establecemos todos los pines como E/S digitales
    MOVWF ADCON1

    MOVLW %00001111 ;establecemos la parte baja del puerto a como entrada
    MOVWF TRISA

    MOVLW 0x00      //todo el puerto salida
    MOVWF TRISB

    MOVLW 0x00      //todo el puerto salida
    MOVWF TRISC

    MOVLW 0x00      //todo el puerto salida
    MOVWF TRISD

    MOVLW 0x00      //todo el puerto salida
    MOVWF TRISE

    RETURN

como veis solo estoy configurando los puertos en todos me salta el mismo warning menos al escribir el puerto A, no encuentro solución, pero mi intuicion me dice que podria ser algo de la optimización.
la version del compilador es v1.33
muchas gracias a todos.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: XC8 mixto ensamblador y C problema
« Respuesta #1 en: 23 de Enero de 2015, 22:50:19 »
Hola juaperser1, solo veo un pequeño detalle, aunque de XC8 no tengo mucha experiencia  :? ....

En .asm para escribir un número hexadecimal se utilizan estas dos maneras: H'00' o simplemente 0

El uso de 0x00 es para el C y si tu estas programando en .asm te recomendaría cambiar todos los 0x00 por simplemente .0 (en decimal).

El puerto A es el único que as querido escribir en binario y pues en .asm el binario se escribe de esta manera B'00001111'

Espero te sea de ayuda. Comenta los resultados.

Un saludo.

Atte. CARLOS.

« Última modificación: 23 de Enero de 2015, 22:57:25 por Chaly29 »
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: XC8 mixto ensamblador y C problema
« Respuesta #2 en: 23 de Enero de 2015, 22:57:00 »
MUCHAS GRACIAS POR RESPONDER

he probado lo que me dices pero el resultado es el mismo,en xc8 se puede utilizar como lo tengo declarado , como tu dices o poniendo una h detras de un numero sin embargo de ninguna manera funciona.

estoy empezando a pensar que es error de el compilador, ya k he revisado documentos de microchip datasshet etc y parece estar correcto.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: XC8 mixto ensamblador y C problema
« Respuesta #3 en: 23 de Enero de 2015, 22:58:40 »
Hola juaperser1, que micro estás queriendo programar?

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 KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: XC8 mixto ensamblador y C problema
« Respuesta #4 en: 23 de Enero de 2015, 23:45:11 »
En el MPLAB® XC8 C Compiler User’s Guide
5.12.3.2 ACCESSING REGISTERS FROM ASSEMBLY CODE

Se encuentra un codigo de ejemplo asi:

Código: [Seleccionar]
#include <xc.inc>
GLOBAL _setports
PSECT text,class=CODE,local,delta=2
_setports:
MOVLW 0xAA
BANKSEL (PORTA)
MOVWF BANKMASK(PORTA)
BANKSEL (PORTB)
BSF RB1

Es de notar como usa los registros en especial con el MOVWF

Mirando un poco el xc.inc que te manda a pic.inc que te manda a otro archivo para luego POR FIN incluir el archivo en cuestion ( por ejemplo pic16f887.inc ) dentro de ese archivo los registros no estan definidos como normalmente se hace..

Definicion de un bit:
#define TRISA0                           BANKMASK(TRISA), 0

Registros:
// Register: TRISD
TRISD                                    equ 0088h
// bitfield definitions
TRISD_TRISD0_POSN                        equ 0000h
TRISD_TRISD0_POSITION                    equ 0000h
TRISD_TRISD0_SIZE                        equ 0001h

Tal ves debas utilizar BANKMASK despues de todo.
« Última modificación: 23 de Enero de 2015, 23:53:36 por KILLERJC »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: XC8 mixto ensamblador y C problema
« Respuesta #5 en: 24 de Enero de 2015, 12:23:16 »
pues el micro que estoy programando, chaly29 es pic16f877a, y muchas gracias KILLERJC, has dado en el clavo ya no me salta el warning ademas de que al subrutina funciona, la verdad es que tengo mucha experiencia en C pero en ensamblador muy poca y la poca que tengo es con el motorola 68000, que cambia bastante la manera de programación (o al menos a mi me lo parece), estoy programando en C un sistema operativo para los PIC32MX y PIC32MZ, ya es funcional, el scheduler funciona correctamente y gestiona bien las prioridades y tiempos de las tareas, el problema con el que me he topado es a la hora de meter bucles en las tareas que ejecuta el SO y me he dado cuenta de que necesito ensamblador para poder hacerlo, así que estoy haciendo algún proyectito sencillo como este para famicializarme con el antes de abordar cosas mas complejas.

¿algún consejo o guía que en vuestra opinión sea buena? agradezco mucho vuestra ayuda gracias.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: XC8 mixto ensamblador y C problema
« Respuesta #6 en: 24 de Enero de 2015, 13:19:02 »
Hola juaperser1, felicitaciones por el proyecto, suena más que interesante  ;-) . Me alegro que hayas logrado hacer que funcione lo que deseas. Felicidades!!!

Por supuesto que el .asm de los PIC's cambia mucho al del 68000. Para empezar son dos arquitecturas muy distintas  ;-)

Con respecto a lo del .asm lo único que puedo recomendarte es que practiques mucho, y vallas desde programas sencillos (encender y apagar un led) hacia los más complejos.
Es bueno también aprenderse muy bien la función de cada instrucción y los registros que esta modifica. Un apunte de lo anterior a tu lado cada ves que programas es muy útil. Ante la menor duda sobre una instrucción lo consultas rápidamente y así lograrás fijar más el aprendizaje. Vamos, que de esta manera aprenderás mucho más rápido.  :mrgreen:

Por último, lo que te propongo es que postees tu duda sobre la inquietud o lo que no logras hacer funcionar y con gusto, por lo menos yo (y de seguro muchos más) estaremos para responderte y ayudarte que lo entiendas y lograr el objetivo. El sub foro adecuado sería Almacén del Assembler

Ahora la parte fea que a nadie le gusta escuchar:
Si bien vas a aprender el .asm del 16F877, y verás que lo sacas de manera relativamente rápida porque solo son 33 instrucciones, pues esto no tendrá ni parecido al .asm de un PIC32, las instrucciones que aprendas de seguro te servirán, pero el PIC32 tiene cientos de instrucciones más que un PIC16 (sí, cientos, lo escribí correctamente  :oops: ).
Pero bueno, calculo que tú sabrás lo que estás haciendo y de seguro sabrás la complejidad que necesitas del .asm para el PIC32 y de acuerdo a esta será lo que te cueste conseguir la meta.

Sin más cuenta con mi humilde ayuda. 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 juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: XC8 mixto ensamblador y C problema
« Respuesta #7 en: 24 de Enero de 2015, 14:42:01 »
Buenas tardes Carlos, estoy totalmente de acuerdo contigo, de que el ensamblador de los pic32 no tiene absolutamente nada que ver con los del pic16, es mas en el proyecto del SO, cuando me di cuenta de que necesitaba ensamblador para hacer lo que necesitaba, intente ponerme directamente con en ensamblador del pic32... mala idea jeje, así que de la misma manera que con C empece con micros bajos como el pic18f2550 y ahora saco todo el partido de los pic32, pensé que seria bueno hacer lo mismo con el ensamblador y empezar con micros pequeños e ir subiendo así que aprovecho los proyectos sencillos e intento ir metiendo ensamblador. Este para el que he planteado la duda es concretamente un simple teclado hexadecimal, 4 display de 7 seg y un altavoz.

como me pides voy a postear mi duda:
En el proyecto del sistema operativo, he conseguido que creando la tarea, dandole el tiempo y la prioridad, el SO y el scheduler maneje adecuadamente las tareas de manera impecable, sin embargo dentro de una tarea no puedes poner un bucle como while(1), ya que se quedaría infinitamente en esa tarea y no se puede devolver el control al scheduler, y si te fijas en un SO como free RTOS o COOCOX, este proyecto no se podrá llamar "SO" hasta que no consiga esto, y para ello necesito el ensamblador.

La idea que se me ha ocurrido para implementar los while y ya de paso los delay, es que dentro de cada tarea, al final, se ejecute una función que creé una etiqueta, cambie el puntero de la función a una tarea vacía, y devuelva el control al scheduler de esta manera, el scheduler, cada vez que ejecutara esa tarea la mandaría a una tarea vacía, hasta que termine el tiempo del delay,entonces el puntero volvera a ser el mismo y la tarea continuría por la etiqueta.

Esto es imposible de hacer en C (y si se puede, yo no se como) sin embargo en ensamblador esa permitido los saltos a donde quieras y tienes un mayor control sobre este tipo de cosas. Es por esto por lo voy a intentar dominar ensamblador.

de momento uso el SO en mis proyectos como una manera de tener una temporización y abstraerme de lo que este haciendo el micro, pero debo de tener el cuidado de no crear retrasos dentro de las tareas y esto es lo que quiero conseguir.

un saludo.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: XC8 mixto ensamblador y C problema
« Respuesta #8 en: 24 de Enero de 2015, 18:06:37 »
Citar
como me pides voy a postear mi duda:
En el proyecto del sistema operativo, he conseguido que creando la tarea, dandole el tiempo y la prioridad, el SO y el scheduler maneje adecuadamente las tareas de manera impecable, sin embargo dentro de una tarea no puedes poner un bucle como while(1), ya que se quedaría infinitamente en esa tarea y no se puede devolver el control al scheduler, y si te fijas en un SO como free RTOS o COOCOX, este proyecto no se podrá llamar "SO" hasta que no consiga esto, y para ello necesito el ensamblador.

FREERTOS usa un timer cada 1ms para generar una interrupcion, para que se produsca la seleccion de tareas. Es decir esta interrupcion le devuelve el control al scheduler. Asi por mas que este dentro de un while, cada x tiempo se produce el cambio de tarea. Esta es la idea minima.
En el Cortex M4F que estoy usando utiliza hasta 3 interrupciones,

Citar
SVCall
A supervisor call (SVC) is an exception that is triggered by the SVC instruction. In an OS environment, applications can use SVC instructions to access OS kernel functions and device drivers.
PendSV
PendSV is an interrupt-driven request for system-level service. In an OS environment, use PendSV for context switching when no other exception is active.
SysTick
A SysTick exception is an exception the system timer generates when it reaches zero. Software can also generate a SysTick exception. In an OS environment, the processor can use this exception as system tick.

Esta todo escrito en C, lo unico que tengo en ASM es una parte del port para el M4F

En mi port el Systick activa la interrupcion de PendSV para el cambio de contexto si esta activo configUSE_PREEMPTION activando el flag del PendSV , de esa foma pide el cambio de contexto,
Las otras 2 interrupciones esas estan en ASM ( son del port para el M4F ) de esa forma el cambio de contexto se hace mas rapido
PenSV produce un cambio ( guarda y luego carga otro set de registros, tanto los registros de trabajo/status como tambien lo de la unidad de punto flotante si se estuvo usando)
SVCall solo parece que tomara los datos de los registros y nada mas, no guarda, Pero tampoco se cuando se ejecuta, por que debe ser llamado desde el mismo RTOS.

-------------------------------

Algo un poco parecido a lo que es PIC32 en ASM son los dsPIC , ya ahi cambia la forma de programarlos, en realidad lo que cambia es el compilador, sus directivas etc etc ( que es mas ya de una programacion general, es decir definir donde esta el stack, bss, text, data, aligment, etc ) aunque las instrucciones siguen pareciendose a los del PIC de gama baja Y no tanto como PIC32 que es otro nucleo totalmente distinto. Pero como dije ASM al menos donde vi en RTOS es solo del port para el micro, y seguro que hay un port para PIC32 que podes tomar de referencia.
« Última modificación: 24 de Enero de 2015, 19:03:48 por KILLERJC »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: XC8 mixto ensamblador y C problema
« Respuesta #9 en: 24 de Enero de 2015, 18:53:25 »
Exacto, mi sistema también genera una interrupción cada milisegundo y acto seguido llama a una tarea que reajusta todos los tiempos restantes para la selección de tareas, el problema es cuando tienes una tarea que es por ejemplo asi:

void tarea1(void)
{
      while(1)
      {
            //hace algo
      }
}
los sistemas operativos suelen llamar a una funcion que como dices guarda el registro, el estado etc para cuando se atienda otra tarea esta pueda continuar por donde se quedo, como si fuera otro proceso totalmente independiente.
El problema es que si haces esto en mi sistema con C te quedaras en el while y no se ejecutara ninguna tarea mas, por eso es necesario el ensamblador.
No se si me estoy explicando bien, no digo que necesite ensamblador en las tareas, si no para programar el SO en si.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: XC8 mixto ensamblador y C problema
« Respuesta #10 en: 24 de Enero de 2015, 19:22:20 »
Ten entiendo perfectamente, y es como lo entendi al principio.

Aunque se me ocurren algunos problemas que puedas tener. Y creo que es lo que estas teniendo

Si estas trabajando con un micro de gama baja que tiene su propio "stack" para las direcciones de retorno de los call o retorno de interrupcion.
Lo cual serian todos GOTO por decirlo asi. Y deberias de guardar las direcciones donde quedo el anterior programa, el problema es que no se me ocurre como sacar eso de esa pila especial (destinado a calls y return o retfie) que tienen algunos micros.

No me acuerdo de ninguna instruccion en ASM que pueda cambiar eso. A no ser que disponga de un registro o un stack para todo como hacen los micros mas grandes. Todo depende de con que micro estas trabajando.

Por ejemplo el dsPIC33F posee un registro W15 ( Stack Pointer ) el cual usa la RAM como stack y no unos registros especiales dentro del micro, con lo cual podes conseguir la ultima direccion
El PIC32 ( nucleo M4K  ) tiene 2 , R29 (stack pointer) y R31 ( return adress ) que te pueden servir, el R31 solo es para volver nada mas

Mientras que un PIC16F887 posee un stack en el cual no se puede acceder (8 niveles).. solo CALL, RETURN RETFIE, RETLW, y todos estos te van a llevar nuevametne a tu programa original, incluso en ASM, entonces el tema pasaria por como saltar esa limitacion
Mientras que un 18F2550/4550 estos si poseen instrucciones para eso.. que son POP y PUSH ( de stack 32 niveles ) o poseen registros especiales para leer el valor que esta en el TOP ( 3 registros )

Todavia no se con que micro estas trabajando, pero por las instrucciones en ASM imagino que uno de estos ultimos.
« Última modificación: 24 de Enero de 2015, 19:36:26 por KILLERJC »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: XC8 mixto ensamblador y C problema
« Respuesta #11 en: 25 de Enero de 2015, 00:08:04 »
Pues si la duda que comente al principio y que tu me solucionaste, es de un micro bajo el pic16f877a, pero el SO lo tengo implementado en micros grandes, en concreto el PIC32MX2570 y ahora lo he portado a un PIC32MZ2048, supongo que esos micros tendrán instrucciones en ensamblador para hartarse solo con mirarselas como comentaba CARLOS jeje.
un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: XC8 mixto ensamblador y C problema
« Respuesta #12 en: 25 de Enero de 2015, 02:50:42 »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: XC8 mixto ensamblador y C problema
« Respuesta #13 en: 25 de Enero de 2015, 09:33:49 »
wow gracias, nunca me había dado por mirar la documentación del nucleo directamente, creo que esto me va a venir muy bien.

muchas gracias. cuando termine los examenes (en 1 semana) volveré a retomar el SO y abriré un nuevo post aqui en Almacen de assembler supongo, he iré comentando los avances, y mejorando lo que me propongais.

un saludo.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw