Hola,
YA lo conseguí. Es más, lo conseguí como lo quería desde el principio.
Despues de batallar con los datasheets, lo he entendido.
Primero os respondo a los que me habeis aportado ideas:
Migsantiago: los apóstrofos se pueden usar cuando es un char, o sea sólo 1 carácter. Si es un string es necesario usar comillas. Tambien para un char se puede usar comillas indistintamente.
LABMouse: Efectivamente uso un 18F46j50, pero no me influía el uso de la otra librería, ya que sólo se diferencian en el uso del LowPower y funciones sleep.
gera: bueno, había probado printf, putc y finalmente me quedé con puts porque realmente es una función que envía un string usando putc, pero al final añade automáticamente RETURN (13) y LINE-FEED (10). Igual que el printf, pero sin añadir el \r\n de forma manual.
Y finalmente, el resultado.
El 16f46j50 incorpora un oscilador interno de precisión de 8MHz que puede inyectar al PLL prescaler para generar una salida de 4MHz que son necesarias para que el PLL genere una señal de 96MHz que al pasar por el divisor /2 genera el reloj a 48MHz para poder usar el USB a alta velocidad.
Entonces, seleccionamos como reloj, el reloj interno con PLL.
En la versión 4.110 de CCS si selecciono INTRC_PLL realmente me marca el config bit como INTOSCPLLO (salida osc en RA6) que yo no quiero la salida de reloj.
Sin embargo si selecciono INTRC_PLL_IO el bit de configuración que marca es INTOSCPLL y RA6 queda disponible. Osea, funcionan al revés.
Y el prescaler para conseguir los 4MHz a partir de los 8MHz internos será PLL2, pero hete aquí que las configuraciones posibles son PLL1,PLL3,PLL4,PLL5,PLL6,PLL10,PLL12 y la PLL2 da un error al compilarla pues no existe.
Revisando el 18f46j50.h descubro que el PLL2 se llama PLLDIV2 (tocate los willis CSS
) a diferencia de las otras posibles configuraciones
Como en el 18F4550 configuro los fuses así y... no funciona
Un par de vueltas por el datasheet ( no hay nadie que haya escrito algo de código usando el PLL sin un cristal de 12MHz externo... ) y localizo lo que me hace falta otra vez en el 18f46j50.h:
-La configuración del PLL se hace por softwareFuncion setup_oscillator y constantes para activar el PLL y el reloj interno de 8MHz:
setup_oscillator(OSC_PLL_ON, OSC_8MHZ);
Compilo y funcionando! La leche que mal trago he pasado con el puñetero oscilador. El caso es que estaba analizando la señal con el logic y no lo daba visto, no veía que había un desfase entre la frecuencia de transmisión de los 9600bps y el ancho de los pulsos de la trama.
Así no veía que estaba mal:
Y finalmente todo encaja en su sitio:
El código entonces, queda así:
#include <18F46J50.h>
#device adc=10
#fuses INTRC_PLL_IO,NOWDT,NOPROTECT,NOCPUDIV,PLLDIV2
#use delay(clock=48000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7, ERRORS)
void main()
{
setup_oscillator(OSC_PLL_ON, OSC_8MHZ);
setup_adc_ports(ALL_ANALOG|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_0);
//setup_pp(PMP_DISABLED);
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
setup_spi2(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_timer_4(T4_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
while(1){
printf("12345\n\r");
};
}
Salu2