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
int find_parity (int data){
int count;
#asm
movlw 0x8
movwf count
movlw 0
loop:
xorwf data,w
rrf data,f
decfsz count,f
goto loop
movlw 1
awdwf count,f
movwf _return_
#endasm
}
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.