Hola amigos,
Estoy trabajando con el PIC18F4550 es un proyecto que requiere de la digitalización de datos y utilizo los 10 bits del ADC interno. Me gustaría mandar estos datos en paquetes de 64 bytes, por lo que les mando el código para ver su opinión especialmente si el tipo de datos es el correcto para representar los 1024 posibles valores del ADC. Esta es parte del programa que implemente basandome en el buen trabajo del proyecto picUSB:
#include <18f4550.h> //Librería del PIC utilizado
#device ADC=10
//Palabras de configuración
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000) //Frecuencia de Trabajo
//______________________________________________________________________________
//deshabilitamos el uso de las directivas HID
#define USB_HID_DEVICE FALSE
//Habilita EP1(EndPoint1) para transf. de entrada bulk/interrup
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK
//Habilita EP1(EndPoint1) para transf. de salida bulk/interrup
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK
//Tamaño del Endpoint TX 1 buffer
#define USB_EP1_TX_SIZE 64
//Tamaño del Endpoint RX 1 buffer
#define USB_EP1_RX_SIZE 3
//______________________________________________________________________________
//Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <pic18_usb.h>
//Configuración del USB por Enumerador
#include <enumerador_pic.h>
//handles usb setup tokens and get descriptor reports
#include <usb.c>
//__________________
#define LEDV pin_C0
#define LEDR pin_C1
#define alto output_high
#define bajo output_low
#define modo recibe[0] //Selecciona los modos de trabajo de la interface
#define param1 recibe[1]
#define param2 recibe[2]
#define resul envia[0]
//Variables Globales
int8 recibe[3];
int8 i,muestras[64];
void main()
{
bajo(LEDV);
alto(LEDR);
usb_init(); //inicializamos el USB
usb_task(); //habilita periferico usb e interrupciones
//Esperar hasta que el Pic se configure por el host
usb_wait_for_enumeration();
bajo(LEDR);
alto(LEDV);
setup_adc_ports(AN0_TO_AN1|VSS_VREF); //Configuración Canales Analógicos
setup_adc(ADC_CLOCK_DIV_64); //Configuración Reloj de Conversión
#asm
bsf 0xFC0,7 //Justificación a la derecha
//Configuración del tiempo de adquisición, taq=2TAD
bsf 0xFC0,3
bcf 0xFC0,4
bcf 0xFC0,5
#endasm
while(1)
{
if(usb_enumerated()) //si el Pic está configurado
{
if(usb_kbhit(1)) //si el endpoint de salida contiene datos del host
{
usb_get_packet(1, recibe, 3); //cojemos el paquete de tamaño 2bytes del EP1 y almacenamos en recibe
switch(modo)
{
case 0:
set_adc_channel(0); //Canal 0 del ADC
for(e = 0;e < 64;e++)
{
muestras[e]=read_adc();
delay_us(50);
}
usb_put_packet(1,muestras,64,USB_DTS_TOGGLE);
break;
}
}
}
}
Básicamente la duda surge porque como se trabaja con un ADC=10 me confunde el formato de us datos que talves se deba enviar int16...
Saludos