La diferencia entre CCS y XC8 radica que a pesar que XC8 posee funciones para el manejo de los modulos, lo mas seguro es que termines modificando directamente lso registros. Te muestro unos ejemplos:
Ejemplo 1 - ASM
BANKSEL TRISA
CLRF TRISA
MOVLW 0x10
MOVWF TRISB
BANKSEL PORTB
LOOP:
BSF PORTB, 1
BTFSS PORTB, 1
BCF PORTB, 1
GOTO LOOP
Ejemplo 1 - XC8
TRISA = 0x00;
TRISB = 0x10
while(true)
{
PORTBbits.RB0 = 1;
if ( PORTBbits.RB0 == 1 )
{
PORTBbits.RB0 = 1;
}
}
Observaras que lo unico que cambio de ASM a XC8 es que deje de preocuparme por que hay en W, ni bancos ni nada, simplemente asigne los valores y listo. Y cambiaron la forma de los condicionales y loops.
CCS - Ejemplo 1:
set_tris_a(0x00);
set_tris_b(0x10);
while(true)
{
output_high(PIN_B0);
if ( input(PIN_B0) == 1 )
{
output_low(PIN_B0);
}
}
Veras que los loops y condicionales es igual, solo que ahora en ves de escribir al registro se usan funciones que ya vienen predefinidas.
Asi nomas el codigo no te va a funcionar. Por que CCS provee una funcionalidad para aquellos que recien comienzan. intentar leer el estado de un pin ( como es el caso del input(PIN_B0) ) hace que el compilador agregue lineas para modificar el TRIS y volverlo entrada, algo que no sucede con los 2 casos anteriores, de todas formas podes decirle que no lo haga usando una directiva que es #USE FAST_IO(B). ¿Podes modificar los registros directamente? SI pero tenes que definirlos todos!
Pero veamos otro ejemplo en que CCS es mejor ( cuando no se tiene ninguna libreria obviamente) Supongamos el caso de una UART, con 9no bit y paridad. y tambien para enviar
ASM - Ejemplo 2:
BANKSEL RCSTA ; Registros tal ves no reales
MOVLW 0x00
MOVWF RCSTA
MOVLW 0x00
MOVWF TXSTA
MOVLW 0x00
MOVWF RCCON
;Aca tmb el baud rate, etc
BSF PIE1, RCIE
BCF PIE1, RCIF
.....
...
INTERRUPCION
MOVWF W_TEMP ; Ya ni me acuerdo como es
MOVF STATUS
MOVWF STATUS_TEMP
BTFSS PIR1, RCIF
CALL INTERRUPCION_RX ; Aca dentro limpio flag
BTFSS PIR1, TMR1IF
CALL INTERRUPCION_TMR1
MOVF STATUS_TEMP
MOVWF STATUS
SWAPF W_TEMP, W
RETFIE
INTERRUPCION_RX:
;Aca verifico paridad, limpio flag
RETURN
INTERRUPCION_TMR1:
;Recargo timer, limpio flag
RETURN
XC8 - Ejemplo 2:
void main(void)
{
RCSTA = 0x00;
TXSTA = 0x00;
RCCON = 0x00;
//Aca demas asignaciones a registros
PIR1bits.RCIF = 0;
PIE1bits.RCIE = 1;
// ....
}
void interrupt Funcion_Interrupcion(void)
{
if(PIR1bits.RCIF == 1)
{
Interrupcion_Rx();
}
if(PIR1bits.TMR1IF == 1)
{
Interrupcion_TMR1();
}
}
void Interrupcion_Rx(void)
{
// Aca limpio flag
// Tengo que hacer el codigo para revisar la paridad
// Etc
}
void Interrupcion_TMR1(void)
{
// Aca limpio flag
// Cargo timer, Etc
}
Observaras que la estructura es la misma, Pero omito el tema de salvar el contexto en la interrupcion. Pero debo preguntar por cada flag en esa funcion de interrupcion ( el compilador sabe que es esa por el "interrupt" )
Ahora veamos CCS:
#USE RS232(UART1, BAUD=9600,PARITY=E, BITS= 8,STREAM=modem)
void main(void)
{
//Aca configurar el timer
}
#INT_RDA
void Interupcion_RX(void)
{
// NO hace falta limpiar el flag
// NO hace falta verificar la paridad, ya lo hace antes
// Simplemente tomo el dato y lo uso
}
#INT_TMR1
void Interrupcion_TMR1(void)
{
// Recargo el timer nomas
}
Observaras que con una linea y en forma sencilla se pudo configurar enteramente la UART, tambien cada interrupcion posee su funcion aunque internamente se haga lo mismo que hicimos con XC8 o ASM. Tambien podes crear UART por software especificando los pines y sin ninguna complejidad:
#USE RS232(UART1, BAUD=9600,PARITY=E, BITS= 8, RCV=PIN_A6, XMIT=PIN_B0,STREAM=modem)
Tambien para enviar. En XC8 podes crearte una funcion "printf" que te envie un texto. Pero CCS permite una manejo mas facil. Y mas si tenes varias UART ( sean por software o hardware )
#USE RS232(UART1, BAUD=9600,PARITY=E, BITS= 8,STREAM=modem)
#USE RS232(UART2, BAUD=9600,BITS=8,STREAM=gps)
void main(void)
{
fprintf(modem
,"Enviar esto %d por modem",12); fprintf(gps
,"Esto es enviado por GPS o UART2"); }
Lo principal que tenes que tener en cuenta es que no tenes acceso al codigo de las funciones de CCS, distinto a XC8 la cual tenes el codigo a mano y podes ver que esta haciendo realmente. Tambien hay librerias o podes crearlas vos mismo por ejemplo una que sea:
OpenUART1(UART_NO_INVERTIDA & UART_RX_ACTIVADA,UART_TX_ACTIVADO & BGRH_ACTIVADO, 25);
(Codigo de ejemplo, no funciona)
Pero todo en codigo que se puede realmente ver el contenido del mismo. Asi como la UART, tenes I2C, SPI con CCS y se hacen todos de forma muy facil.
----------
La principal cuestion es:
Que tanto control necesitas de tu microcontrolador ? Observaras que ambos son C, y poseen las mismas cosas, nomas que CCS tiene funciones ya predefinidas y vas a necesitar un manual que leer para cada funcion, aun asi tiene formas de simplificarte la vida enormemente. Por otro lado XC8 es lo mas parecido a ASM que tenes pero podes aprovechar las capacidades de C. Incluso con el tiempo te podes crear funciones que hagan masomenos algo parecido a lo que tenes en CCS.
PD: Es hora de cambiar el MPLAB, hace rato que dejo de usarse el 8.92, realmente no se si tiene soporte con XC8.