El código de los pic lo puedo poner ahora, el esquemático aún no está hecho. Los pic hacen lo siguiente, aunque de momento solo a modo de ejemplo y ensayos (para las pruebas de i2c): Hay 2 pic, uno Maestro (A) un 18F2455, y un esclavo (B) 16F873A. El esclavo lee una señal analogica por RA0. Con esta entrada hace parpadear más o menos un led por medio de la salida de PWM 1 y lo guarda en el buffer para poder ser leido por el Maestro.
El maestro lee otra señal analogica por RA0, y a su vez, lee por i2c el valor analogico del Esclavo. Este valor analógico, hace que parpadee otro led en la salida PWM1 de este pic, haciendo que se ilumine más o menos según la entrada analógica del Pic Esclavo. Esto de los led lo hago para comprobar que la conversion A/D funciona, y que también funciona la transmisión.
Si todo esto fuese poco, los 2 valores analógicos los envío por USB, reconociendolo el PC como un joystick y variando 2 ejes.
Los códigos son los siguientes:
ESCLAVO
#include <16F873A.h>
#device ADC=8
#fuses HS,NOWDT,PUT
#use delay(clock=20000000)
#use i2c(SLAVE,SCL=PIN_C3,SDA=PIN_C4,SLOW,FORCE_HW,ADDRESS=0x0A)
int pichB,state,buffer[0x01],adress;
#INT_SSP
void ssp_interrupt()
{ output_high(PIN_A2);
state=i2c_isr_state();
if(state==0x80){
i2c_write(buffer[0x00]);
output_high(PIN_A1);
}
}
void main(){
set_tris_A(0b00000001);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(20);
pichB=read_adc();
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
adress=0x00;
while(TRUE){
set_adc_channel(0);
delay_us(20);
pichB=read_adc();
buffer[0x00]=pichB;
delay_ms(1);
output_high(PIN_A3);
}
}
MAESTRO
#include <18F2455.h>
#device ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#DEFINE USB_HID_DEVICE TRUE
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE 8
#include <pic18_usb.h>
#include <.\include\midi_hid2.h>
#include <usb.c>
#include <ctype.h>
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use i2c(MASTER,SCL=PIN_B1,SDA=PIN_B0,SLOW,FORCE_HW)
#use fast_io(A)
#use fast_io(C)
int pichA,pichB;
int out_data[2];
long ciclo;
void main(void) {
delay_ms(1000);
set_tris_A(0b0000001);
set_tris_C(0);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
usb_init_cs();
setup_timer_2(T2_DIV_BY_1,129,1);
setup_ccp1(CCP_PWM);
while (TRUE) {
usb_task();
if (usb_enumerated())
{
set_adc_channel(0);
delay_us(20);
pichA=read_adc();
delay_ms(10);
i2c_start();
i2c_write(0x0A+1);
pichB=i2c_read(0);
i2c_stop();
ciclo=pichB*2.0392;
set_pwm1_duty(ciclo);
output_high(PIN_A1);
out_data[0]=pichB;
out_data[1]=pichA;
usb_put_packet(1,out_data,2,USB_DTS_TOGGLE);
}
}
}