Buenas noches,
he estado jugando con el modulo ADC de este PIC, pero no consigo hacerlo andar.
Proteus me indica que no tengo configurado el pin como entrada analogica, y que intento hacer una conversion AD sin haber dado tiempo a terminar la anterior.
Soy completamente nuevo en el tema de la conversión AD, y más aún con estos PICs mas "sofisticados". Por ello me he basado en un ejemplo ya hecho para enviar los datos por el USB.
Pego el codigo a continuación:
Agradezco cualquier consejo. Por cierto, no termino de entender el tema de la TACQ. Pero vamos paso a paso..
Lo curioso es que, basandome en el mismo ejemplo, y con una version de CCS anterior pude simular perfectamente un programa casi identico con el PIC18F2550...
he estado jugando con el modulo ADC de este PIC, pero no consigo hacerlo andar.
Proteus me indica que no tengo configurado el pin como entrada analogica, y que intento hacer una conversion AD sin haber dado tiempo a terminar la anterior.
Soy completamente nuevo en el tema de la conversión AD, y más aún con estos PICs mas "sofisticados". Por ello me he basado en un ejemplo ya hecho para enviar los datos por el USB.
Pego el codigo a continuación:
Código:
#include <18F13K50.h>
#device adc=10
#fuses NOWDT,NOLVP,NODEBUG,USBDIV1,CPUDIV1
#use delay(clock=48000000)
#define USB_HID_DEVICE FALSE //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE 1 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 3 //size to allocate for the rx endpoint 1 buffer
#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include "usb_desc_scope.h" //Configuración del USB por Enumerador Palitroquez
#include <usb.c> //handles usb setup tokens and get descriptor reports
#define LED PIN_B7
unsigned int16 valor_adc;
int8 recibe[1];
int8 envia[1];
void main(void)
{
set_tris_b(0); //SALIDA
set_tris_a(255); //ENTRADA
set_tris_c(255); //ENTRADA
usb_init(); //inicializamos el USB
usb_task(); //habilita periferico usb e interrupciones
usb_wait_for_enumeration(); //esperamos hasta que el PicUSB sea configurado por el host
#asm
//Configuro el ADCON1:
bcf 0xFC1,3 //Se toma Vref+ del pin correspondiente
bsf 0xFC1,2
bcf 0xFC1,1 //Se toma Vss para Vref-
bcf 0xFC1,0
//Configuro l'ADCON0:
bcf 0xFC2,7
bcf 0xFC2,6
bcf 0xFC2,5
bsf 0xFC2,4
bsf 0xFC2,3
bsf 0xFC2,2
bsf 0xFC2,0
//Configuro l'ADCON2:
bcf 0xFC0,7 //Justificación a la derecha
bsf 0xFC0,5 //Tiempo de asquisición 12TAD
bcf 0xFC0,4
bsf 0xFC0,3
//bcf 0xFC0,2 //No compredo bien que debe ir aquí
//bcf 0xFC0,1
//bcf 0xFC0,0
#endasm
delay_us(20);
while (1)
{
if(usb_enumerated()) //si el PicUSB está configurado
{
if (usb_kbhit(1)) //si el endpoint de salida contiene datos del host
{
output_high(LED); //Se enciende el LED
usb_get_packet(1, recibe, 2);
if(recibe[0]==0x01)
{
envia[0] = 10;
usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); //Si hay comunicación, envio un '10'
}
if(recibe[0]==0x02)
{
valor_adc=read_adc (); //Hace conversión AD
delay_us(20); //Esperamos a que termine
envia[0]=make8(valor_adc,1); //Seleccionamos el valor alto
usb_put_packet(1, envia, 1, USB_DTS_TOGGLE);
}
if(recibe[0]==0x03)
{
envia[0]=make8(valor_adc,0); //Seleccionamos el valor bajo
usb_put_packet(1, envia, 1, USB_DTS_TOGGLE);
}
if(recibe[0]==0x04)
{
}
if(recibe[0]==0x05)
{
}
}
}
}
}
Agradezco cualquier consejo. Por cierto, no termino de entender el tema de la TACQ. Pero vamos paso a paso..
Lo curioso es que, basandome en el mismo ejemplo, y con una version de CCS anterior pude simular perfectamente un programa casi identico con el PIC18F2550...