////////////////////////////////////////////////////////////////////////////////
// daq USB 
// Caracteristicas:
//                8 entradas analogicas AN0:AN7
//                8 entradas digitales  RB0:RB7
//                8 salidas digitales   RD0:RD7
//                2 salidas PWM         RC1 y RC2 
//                1 entrada contadora   RA4
// Author:Raul Barreto Quinteros
////////////////////////////////////////////////////////////////////////////////
#include <18F4550.h>
#DEVICE ADC=8
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#include <pic18_usb.h>     
#include "usb_desc_scope.h"  
#include <usb.c>
#use fast_io(b)
////////////////////////////////////////////////////////////////////////////////
int8  datoRX[8];                 
int8  datoTX[10];
int8  count=0;
void main(void) 
{
   port_b_pullups(true);
   setup_port_a(AN0_TO_AN7);
   setup_adc(ADC_CLOCK_INTERNAL); 
   setup_timer_0 (RTCC_EXT_H_TO_L);
   set_timer0(0);
   setup_timer_2(T2_DIV_BY_1, 127, 1);
   set_pwm1_duty(0);
   set_pwm2_duty(0); 
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);  
   set_tris_a(0b11111111);     
   set_tris_b(0b11111111);               
   set_tris_c(0b00000000);
   set_tris_d(0b00000000);
   output_c(0b00000000);
   output_d(0b00000000);
   usb_init();
   delay_ms(50);
   while (TRUE)
   {
      if(usb_enumerated())         
      {
         if (usb_kbhit(1))          
         {  
         usb_get_packet(1,datoRX,3);
         set_pwm1_duty(datoRX[0]);
         set_pwm2_duty(datoRX[1]);
         output_d(datoRX[2]);
         }
         for(count=0;count<8;count++)
         {
         set_adc_channel(count);
         delay_us(10);
         datoTX[count]=read_adc();
         }
         datoTX[8]=get_timer0();
         datoTX[9]=input_b();
         usb_put_packet(1,datoTX,10,USB_DTS_TOGGLE);  
      }
   }
}