Autor Tema: ¿ Se puede introducir codigo en asembler en C ?  (Leído 2757 veces)

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

Desconectado Franc749

  • PIC10
  • *
  • Mensajes: 22
¿ Se puede introducir codigo en asembler en C ?
« 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.
"Prenden fuego y no queman nada"

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: ¿ Se puede introducir codigo en asembler en C ?
« Respuesta #1 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?

Desconectado Franc749

  • PIC10
  • *
  • Mensajes: 22
Re: ¿ Se puede introducir codigo en asembler en C ?
« Respuesta #2 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?
"Prenden fuego y no queman nada"

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: ¿ Se puede introducir codigo en asembler en C ?
« Respuesta #3 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. }

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ¿ Se puede introducir codigo en asembler en C ?
« Respuesta #4 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
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Franc749

  • PIC10
  • *
  • Mensajes: 22
Re: ¿ Se puede introducir codigo en asembler en C ?
« Respuesta #5 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 :)
"Prenden fuego y no queman nada"

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: ¿ Se puede introducir codigo en asembler en C ?
« Respuesta #6 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.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: ¿ Se puede introducir codigo en asembler en C ?
« Respuesta #7 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
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado Franc749

  • PIC10
  • *
  • Mensajes: 22
Re: ¿ Se puede introducir codigo en asembler en C ?
« Respuesta #8 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. :)
"Prenden fuego y no queman nada"

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: ¿ Se puede introducir codigo en asembler en C ?
« Respuesta #9 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
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado Franc749

  • PIC10
  • *
  • Mensajes: 22
Re: ¿ Se puede introducir codigo en asembler en C ?
« Respuesta #10 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
"Prenden fuego y no queman nada"


 

anything