Por fin lo he conseguido. El problema estaba en que la librería de CCS hacía una gestión de la memoria de datos de USB como si estuviera trabajando con un 18F2550, cuyo mapa de memoria es este:
Mientras que el mapa de memoria del 18F2450 es diferente:
Estuve ajustando direcciones de memoria para encajarlo todo entre 0x400 y 0x4FF y parece que finalmente lo he conseguido.
Hola tengo el mismo problema que tu, la función usb_cdc_getc() me devuelve siempre 0.
Estoy intentando utilizar el CDC en un pic 18F2450 y tengo la versión de CCS v4.084
He probado a modificar mi usb_cdc.h para hacerlo coincidir con el que tu has subido, con estas lineas:
#if USB_MAX_EP0_PACKET_LENGTH==8
//#locate usb_cdc_get_buffer_status_buffer=0x500+24 // Para 18F2550
#locate usb_cdc_get_buffer_status_buffer=0x400+24 // Para 18F2450
#elif USB_MAX_EP0_PACKET_LENGTH==64
//#locate usb_cdc_get_buffer_status_buffer=0x500+136 // Para 18F2550
#locate usb_cdc_get_buffer_status_buffer=0x400+136 // Para 18F2450
Pero no funciona. Ahora la función si que me devuelve un dato, pero es siempre el mismo, no cambia si le envío caracteres diferentes con el hyperterminal.
He estado viendo los SFR's el ICD2 en modo debugger (en el mplab, View->File registers), y resulta que los datos si que llegan bien, porque aparecen en la dirección 0x430. Si envío una 'A' ascci, la cabrona aparece en 0x430 y sin embargo, no me sale devuelta por usb_cdc_getc(). En su lugar usb_cdc_getc(), devuelve siempre 0xA1 (que no es ninguna letra del mapa ascii simple). Mirando los SFR's he visto que el único valor que es 0xA1 entre 0x400 y 0x4FF está precisamente en la dirección 0x418 que es en la que tú haces el "#locate usb_cdc_get_buffer_status_buffer=0x400+24" (0x400+24d = 0x418).
Que coño pasa? Tiene algo que ver "USB_MAX_EP0_PACKET_LENGTH"
No se como a ti te funciona.
A parte de estas dos lineas con #locate debajo de las que lo hacían a 0x500 en vez de 0x400, has cambiado alguna otra cosa? Debe ser eso la única explicación.
Edito:Me respodo a mi mismo, he tenido que poner esta otra línea en vez de la que recomienda nocturno y ahora si que va de puta madre.
#if USB_MAX_EP0_PACKET_LENGTH==8
//#locate usb_cdc_get_buffer_status_buffer=0x500+24 // Para 18F2550
//#locate usb_cdc_get_buffer_status_buffer=0x400+24 // Para 18F2450, no funciona.
#locate usb_cdc_get_buffer_status_buffer=0x400+48 // Para 18F2450, ahora si funciona!!
Un saludo.