TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Franc749 en 20 de Febrero de 2007, 16:14:30

Título: ¿ Se puede introducir codigo en asembler en C ?
Publicado por: Franc749 en 20 de Febrero de 2007, 16:14:30
Hola.

Estaba programando en asembler hasta que me encontre con un problema que solo un lenguaje de alto nivel puede solucionar.

Y para no comenzar de nuevo les pregunto si:

¿Se puede introducir el codigo en asembler que hice en un nuevo programa en C?
Alguien lo hizo antes?

Gracias por la ayuda. Pues no sé programar en C.
Título: Re: ¿ Se puede introducir codigo en asembler en C ?
Publicado por: Nocturno en 20 de Febrero de 2007, 16:16:11
Sí, claro que se puede, aunque la sintaxis es distinta para cada compilador. ¿Cuál es el que estás usando?
Título: Re: ¿ Se puede introducir codigo en asembler en C ?
Publicado por: Franc749 en 20 de Febrero de 2007, 16:26:32
Creo que voy a usar el MPlab C18 student.

Aunque no estoy seguro si me sirve, tengo que programar un 16F873.

Cual me recomendarias?
Título: Re: ¿ Se puede introducir codigo en asembler en C ?
Publicado por: Nocturno en 20 de Febrero de 2007, 17:55:51
Yo te recomiendo CCS. En este último puedes insertar asm así:
Código: C
  1. int find_parity (int data)    {
  2.  
  3.  
  4.  
  5. int count;
  6.  
  7. #asm
  8.  
  9. movlw   0x8
  10.  
  11. movwf   count
  12.  
  13. movlw   0
  14.  
  15. loop:
  16.  
  17. xorwf   data,w
  18.  
  19. rrf     data,f
  20.  
  21. decfsz  count,f
  22.  
  23. goto    loop
  24.  
  25. movlw   1
  26.  
  27. awdwf   count,f
  28.  
  29. movwf   _return_
  30.  
  31. #endasm
  32.  
  33. }
Título: Re: ¿ Se puede introducir codigo en asembler en C ?
Publicado por: maunix en 20 de Febrero de 2007, 18:43:45
Franc749, con el C18 sí se posible.  Una forma es la que te posteó Nocturno (manolo) y la otra es la de hacer una función en Assembler que sea posible de llamar desde el C18. 

Esto ya es bastante más complicado aunque más compatible.  Si tu software interactúa con variables del software general, entonces es el camino a seguir.

Te sugiero leas el manual del C18 donde te cuenta cómo se debe hacer esto e incluso hay un ejemplo.  No es algo para principiantes ya que debes tener en cuenta cómo maneja el C18 su stack y el formato de traspaso y devolución de parámetros. 

Saludos
Título: Re: ¿ Se puede introducir codigo en asembler en C ?
Publicado por: Franc749 en 05 de Marzo de 2007, 16:08:50
Hola que tal.

Por esa casualidades del destino, conseguí el compilador en C CCS PCWH con IDE, el cual esta muy piola, donde su entorno de trabajo es muy parecido al MPLAB IDE. Ademas puedo usar el PIC 16F873.

Todavia estoy leyendo manuales, pero tengo otra pregunta:

En Asembler habia declarado registros de uso general para las distintas rutinas, asignandoles nombres o etiquetas.

¿El compilador de C respetará esas etiquetas?

¿Se pueden definir en C las mismas para que el compilador no asigne esos registros a otras rutinas?

Les muestro una parte del codigo ASM a insertar en C.

list p=16f873
   include "p16f873.inc"
   
W      EQU   0      ;Destino Registro acumulador
F      EQU   1      ;Destino Registro usado
RP0      EQU   5      ;Manejan los 4 bancos de memoria de datos
RP1      EQU   6      ;
DATO      EQU   20h      ;Ángulo medido por sensor hall no lineal.
ANGULO      EQU   21h      ;Ángulo corregido por tabla.
POSI      EQU   22h      ;Distancia del motor medida en forma lineal.
VELOCIDAD   EQU   23h      ;Velocidad proporcional a la tensión medida.

RETARDO      EQU   24h
GO      EQU   2

;.............................................................................
;PROGRAMA PRINCIPAL

      ORG      00h
      GOTO    PROGRAMA   
          
        ORG      05h       
PROGRAMA   BCF      STATUS,RP0   ;Página 0
      BCF      STATUS,RP1
      CALL      INI_ADC
      CALL      INI_USART
      CLRF      PORTB      ;en Pág 0
      BSF      STATUS,RP0   ;Pág 1
      CLRF      TRISB      ;Configura a todo el puerto B como salida
      BCF      STATUS,RP0   ;Pág 0
      CLRF      PORTB

BUCLE   CALL      LEEPOSI
      CALL      SEND
      CALL      LEEANG
      CALL      SEND
      CALL      VELOCI
      CALL      SEND
      GOTO      BUCLE      
;.....................................................................................
;Subrrutina que obtiene el ángulo de la paleta y lo corrige por tabla.

LEEANG   MOVLW   b'10001001'   ;Configuración del ADC. Fosc/32, A/D ON. channel 1.
      MOVWF   ADCON0      ;Configuro ADC.
      CALL      DELAY      ;para estabilizar la entrada (25 uS)
                     
      BSF      ADCON0,GO      ;Inicia conversión
SALTO1    BTFSC   ADCON0,GO      ;Si GO = 1 => Sigo verificando
      GOTO      SALTO1
      BCF      PIR1,ADIF      ;Borra la bandera de fin de conversión

      BSF      STATUS,RP0   
      MOVF      ADRESL,W      ;Carga valor del conversor en
      BCF      STATUS,RP0
      MOVWF   DATO         ;en el registro DATO =Offset para la tabla en memoria
   
      MOVLW   b'00000110'   ;Memoria de programa página 0 subpagina 6
      MOVWF   PCLATH      ;Carga el PCLATH para el salto en memoria
      MOVF      DATO         ;Carga el offset en W
      CALL      TABLA      ;Busca la correción del ángulo   
      MOVWF   ANGULO      ;Ángulo corregido a usar   
      CLRF      PCLATH      ;Pág 0 subpagina 0
      MOVF      ANGULO,W      

      RETURN


Saludos desde la Patagonia :)
Título: Re: ¿ Se puede introducir codigo en asembler en C ?
Publicado por: manex_1987 en 27 de Marzo de 2007, 08:25:54
CCS simplemente apesta para el ensamblador... sobre todo porque mete instrucciones redundantes, y tiene ciertos bugs al respecto.

Me voy a pasar a c18 lo juro.
Título: Re: ¿ Se puede introducir codigo en asembler en C ?
Publicado por: sander en 28 de Marzo de 2007, 12:10:13
Manex_1987,  el css para los pic16 no apesta , pero huele un poco mal a veces , yo he usado la directiva #asm con los pic16 y siempre me ha generado el codigo de asm correcto , sin poner cosas redundantes.

Y Franc749 si quieres que el compilador de c respete las variables las tienes que volver a definir , por ejemplo para tus variables debes usar #locate

para :  dato equ 0x20  deberas poner #locate dato  =  0x20

saludos
Título: Re: ¿ Se puede introducir codigo en asembler en C ?
Publicado por: Franc749 en 03 de Abril de 2007, 17:26:54
Hola!

Muchas gracias por la info. Lo voy a probar, tambien me comentaron que podia definir los registros con el comando #define.

Ya he programado algo en asm. Por lo que ví en la solapa de mostrar en asm del css, es que redunda cuando cambias a las distintas bancos de la ram. Al parecer el programa salta solo sin la necesidad de tener que poner el "BCF STATUS,RP0" etc.


Saludos y Gracias. :)
Título: Re: ¿ Se puede introducir codigo en asembler en C ?
Publicado por: sander en 04 de Abril de 2007, 10:45:08
Citar
Estaba programando en asembler hasta que me encontre con un problema que solo un lenguaje de alto nivel puede solucionar.

Cual es ese problema?? porque creo que todo se puede solucionar con asm

Saludos
Título: Re: ¿ Se puede introducir codigo en asembler en C ?
Publicado por: Franc749 en 22 de Abril de 2007, 17:27:29
Hola

El problema era: poder realizar operaciones aritmeticas en punto flotante y luego hacer el casting  del resultado a 8 bit.

Saludos