TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Salty en 26 de Noviembre de 2014, 09:08:57
-
Buenos días, estoy haciendo un proyecto en C en un PIC18f46k22, con el compilador XC8.
Soy bastante novata en esto y necesito ayuda con algunas instrucciones en ensamblador que tengo que poner en c.
También he oído que hay una forma de poner instrucciones en ensamblador en el programa en c, cualquiera de las dos opciones me vale en un principio aunque preferiría el equivalente en c.
Las instrucciones en ensamblador son las siguientes:
1- LFSR 0,BUFFER_ENT"
2- MOVFF SSP1BUF,POSTINCO
3- Limpiar memoria RAM al iniciar el programa
Alguien tiene alguna idea sobre como hacer eso en c??
Un saludo
-
Depende de lo que quieras hacer. No siempre hay una equivalencia exacta.
En general se traduce un conjunto de instrucciones en ensamblador a otro conjunto de instrucciones en C.
Pero no siempre una traducción "literal" es buena. Como en los lenguajes de las personas, la traducción libre es mejor.
La instrucción LFSR no existe en C, hay que implementarla con varias instrucciones.
1º Leer bit 0
2º Desplazar variable a la derecha
3º Copiar bit 0 en el bit 7
La otra, se suele implementar con punteros. Por ejemplo: *p++ = 5;
Saludos.
-
Como dijo Picuino lo mas interesante seria hacerlo con punteros. De ahi el compilador se encargara de eso.
1-
La instruccion LFSR hace:
Syntax: LFSR f, k
Operands: 0 < f > 2
0 < k > 4095
Operation: k -> FSRf
Por lo tanto en C si pudieras cargar los valores al registro directamente es otra alternativa:
FSR0H = ((BUFFER_ENT >> 8 ) & 0x0F)
FSR0L = (BUFFER_ENT & 0xFF) // No se si es necesario un cast al tamaño de un byte aunque no creo
Recordando que son 12 bits. Y realmente no se si se pudiera asignar completamente.
Como FSR0 = BUFFER_ENT
Probaste ?
2-
POSTINCO = SSP1BUF
(Pero esto imagino que estara dentro de una rutina de interrupcion o esperaras que exista un dato antes de leerlo)
3-
Aqui depende de vos, no se por que limpiarias la RAM antes... Si es una variable inicializada obviamente tiene un valor (ejemplo int i=0; ), pero sino le deberias asignarle un valor (ejemplo int datos[5]; ), o recorrerlo asignandole un valor de esa forma se encuentra "Limpia", aunque no encuentro un por que leerias antes de escribir en esa posición de memoria.
-
...
También he oído que hay una forma de poner instrucciones en ensamblador en el programa en c, cualquiera de las dos opciones me vale en un principio aunque preferiría el equivalente en c.
...
#ASM
....
....
....
#ENDASM
-
Tambien creo que con asm("LFSR 0,BUFFER_ENT");
-
Muchas gracias a los tres. ya tengo los tres puntos que mencionaba en c :mrgreen: la forma de KILLERJC para poner instrucciones en ensamblador funciona. La de elgarbe no compila, no reconoce las expresiones. Gracias por las explicaciones :)
-
Buenos días!! Me ha surgido una nueva duda. Si quiero seleccionar un determinado banco como puedo hacerlo en c? Es decir, si quiero hacer: BANKSEL PR4 cual seria el equivalente en c? Gracias de nuevo ;)
-
Buenos días!! Me ha surgido una nueva duda. Si quiero seleccionar un determinado banco como puedo hacerlo en c? Es decir, si quiero hacer: BANKSEL PR4 cual seria el equivalente en c? Gracias de nuevo ;)
La memoria es continua, estuve leyendo y dice que solo una instruccion en ASM hace uso de los 12 bits para el direccionamiento que es MOVFF, mientras que las demas hacen uso de 8 bits + 4 dado por el registro BSR.
El BSR se carga con la instruccion en ASM que es MOVLB. El BSR separa la RAM en 16 secciones/bancos de 256 bytes cada uno. Segun la direccion que tengan estos el compilador va a cargar esos 4 bits al BSR.
Pero no se por que te preocuparias de cambiar de banco en C, cuando este deberia hacerlo por si mismo, es decir si esta ocupando un lugar en la memoria que es 0x2A0 , C deberia cargar o cargaria ese 2 en el BSR, esto es para un acceso directo.
Su ASM deberia ser un
MOVLB 0x2
aca instruccion con la direccion A0
Y si fuera indirecto que es lo mas seguro que haga es cargar los 12 bits de la direccion a un FSRx y leer/escribir su INDFx. y se mantiene en el banco 15
LFSR 0,0x2A0
Aca instruccion de lectura/escritura/lo que sea de INDF0
Y probar en C no costaria nada, pero como digo no tiene sentido.
Los SFR ( Registros de funciones especiales) estan ubicados en el banco 15 inclusive el BSR. Por eso existe una instruccion en ASM para cargar el BSR (al menos por eso la nombre ).
Probaste BSR = 0x2;
o algo asi ?.
Muchas gracias a los tres. ya tengo los tres puntos que mencionaba en c :mrgreen: la forma de KILLERJC para poner instrucciones en ensamblador funciona. La de elgarbe no compila, no reconoce las expresiones. Gracias por las explicaciones :)
Por que creo que la opcion que te dio el es para CCS