Transcripción de función CCS a XC8

Buen día gente del foro.

Soy nuevo acá, estuve buscando algo relacionado al tema pero no encontré la información para resolver mi duda.

Resulta que estoy llevando código de PIC C Compiler CCS a MPLAB XC8 y me quedé sin cómo resolver esta parte ya que se trata una función (shift_right) de CCS y no he podido llevarla a XC8:

PIC C: output_bit(X, shift_right(&cmd,1,0) );

Se que output bit pone en X el estado que encuentre en shift_right(&cmd,1,0)

Pero esto llevado a XC8 será algo como: RTC_IO = cmd >> 1; :unsure:???

Gracias de antemano.
 
Analiza lo que hace la fcion shift_right, por que el C tiene operadores para desplazamiento y rotación asi que no se que cosa innovadora hará esa función.
 
Lo que pasa es que CCS tiene funciones no estándar como:
Output_high
Output_low
Output_toggle
Etc.
Y si no sabes que hace pues ahí va estár el problema.

Ahora digamos que tienes.
10101111
Y quieres rotar 1010

Sería así:
Char valor=10101111;
Valor2=valor>>4;
Lo rote 4 veces a la derecha
Y de le puede hacer una máscara para quitar datos basura:
Valor2= valor2&00001111;
Y eso es todo
 
CCS Compiler tiene esas cosas que lo hacen amado u odiado...
Por ejemplo estas odiosas funciones a veces innecesarias.

output_bit(X, shift_right(&cmd,1,0)

El shift_rigth hace un desplazamiento de bit a la derecha en cada llamada a una posición de memoria apuntada por &cmd, cuya longitud en bits es 8, o sea 1 byte. A cada desplazamiento, segun entiendo Yo, mete un 1 ó 0 por el otro extremo, en este caso un 0 en cada llamada. La funcion devuelve el valor del bit desplazado, o sea 1 ó 0.

Estos valores son tomados por la función output_bit que cambian el estado del bit número X de cierta "variable".

Resulta que ésta "cierta variable" es la dirección de un port del pic a "lo ccs" p.e. PIN_B2

entonces todo éste asunto si lo hacemos dentro de un bucle for ocho veces, lo que hace es un "bit bangins" segun lo apuntado por el puntero &cmd y lo saca por el pin X, en éste caso.

output_bit(X, shift_right(&cmd,1,0)

Todo lo que digo sale de leer el help del ccs, incluso está como ejemplo la sentencia que se plantea con el par de funciones por las cuales se pregunta.
 
Es cierto yo me acomodo con ccs por su facilidad de hacer un programa pero trato de no usar ese vicio de usar funciones propias del compilador no estándar.
Por qué solo correrá el código fuente en ese compilador y pasarlo a otro micro o compilador no funcionará
 
Obviamente no compilará donde sea porque PIC C de CCS es como el Basic de MicroCode Studio o Proton Compiler.
Tienen instrucciones propias para facilitar la programación a personas con poca experiencia.
Pero si ya conoces el lenguaje C, muy fácilmente podrás hacer uso de todos los operadores y hasta crear una función o subrutina idéntica.

Sin embargo, nada impide que el compilador PCWHD de CCS se convierta en un ANSI C.
Solo basta declarar unas pocas cosas de cabecera y no usar sus librerías.
De hecho hasta permite el reconocimiento entre minúsculas o mayúsculas, lo cual ya lo hace más nativo del propio C.

Pero de lo que se trata es de poder realizar un programa lo más fácil que se pueda y con los conocimientos que uno tenga, y que a final de cuentas haga lo que uno quiere.
Ahora que si se entra en cuestiones de optimización, pues eso sí ya es otra historia.
 
Buenas amigos, muchas gracias, luego de probar y probar ya logré avanzar con la transcripción del código.
Esto y más rato de investigación me ayudó mucho:

Lo que pasa es que CCS tiene funciones no estándar como:
Output_high
Output_low
Output_toggle
Etc.
Y si no sabes que hace pues ahí va estár el problema.

Ahora digamos que tienes.
10101111
Y quieres rotar 1010

Sería así:
Char valor=10101111;
Valor2=valor>>4;
Lo rote 4 veces a la derecha
Y de le puede hacer una máscara para quitar datos basura:
Valor2= valor2&00001111;
Y eso es todo

Ahora me encuentro con ooootro problema, resulta que CCS PIC no me dejar declarar los siguiente:

const unsigned char *font;

Me imagino que con esto podría funcionar:
Sin embargo, nada impide que el compilador PCWHD de CCS se convierta en un ANSI C.
Solo basta declarar unas pocas cosas de cabecera y no usar sus librerías. <<<<<----------------------------------
 
Dr. Zoiberg, lo pregunto es porque en XC8 me deja declararlo y sí funciona, es decir necesito es un "equivalente" para llevarlo a CCS y poder trabajar con *font
 
Const es una variable en ROM
Ejemplo:
Const Char variable=34;

La variable siempre será 34 y no se puede modificar.

variable=variable+1;

Marcará error por qué no se puede modificar.

Const solamente se usa para variables fijas como una matriz que contiene los pasos de un motor a pasos, los números de un display de 7 segmentos, los puntos de una matriz de leds etc.
Otra cosa una cosa es ANSI Como mal usado hay que estudiar aún más y otro es el MISRA C que es el modo de programación de la mayoría de los ejemplos de código en C de muchos compiladores serios.

Ahí verás funciones como #if define #elseif #endif
Haciendo mención o pregunta al preprosesador que compilador se usa y se va a compilar solo una parte del código al cual compilador se esté usando.
 
Hola, estoy intentando programar un PIC16F887 y tengo un problema con una función que esta en CCS C y no se como pasarla a XC8.

La funcion original es la siguiente:

void CD()
{
setup_ccp1(CCP_OFF);
output_d(0x08);
setup_ccp1(CCP_PWM | CCP_PULSE_STEERING_D); // PWM output on pin P1D (RD7), others OFF
}

Y lo que yo he hecho es lo siguiente:

void CD()
{
CCP1 = 0;
PORTD = 0x08;
setup_ccp1(CCP_PWM | CCP_PULSE_STEERING_D); // PWM output on pin P1D (RD7), others OFF
}

No se si lo que he hecho es correcto del todo, y la ultima linea la verdad que no se como pasarla a XC8.

Gracias.
 
Lo único que necesitas es ver la hoja de datos para saber cómo se configuran los registros CCPXCON y PSTRCON para generar Pulse Steering.
En este caso se usa el registro CCP1CON "setup_ccp1(...);"
 
Atrás
Arriba