Bueno, aprovecho y posteo mi segundo post.
Resulta que me he puesto a experimentar un poco con el USART, para la comunicación entre pics, y hasta el momento sin problemas. Por otra parte también he hecho algunas prácticas de conectar el PIC al PC mediante USB y mas o menos funciona.
Ahora pretendo conectar al pc un pic maestro mediante usb, y empleando el hyperteminal mandar ordenes para que el pic maestro se comunique con un pic esclavo, mediante USART y este le transmita los datos para poder mostrarlos por pantalla.
Creo que el principal problema es el asunto de las frecuencias de trabajo, ya que para el USB es necesario 48Mhz y para el USART 4MHz. ¿no?
Les posteo el código tanto del maestro como del esclavo:
[b][u]CODÍGO PARA EL MAESTRO:[/u][/b]
#include <18F2550.h>
#fuses XT,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay (clock=48000000)
#use RS232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7, bits=8,PARITY=N)
#define USB_CON_SENSE_PIN PIN_B3
#include <stdlib.h>
#include <usb_cdc.h>
void main(){
char ORD;
int8 Dato;
usb_cdc_init();
usb_init();
while(!usb_cdc_connected());
do{
if (usb_enumerated())
{
if (usb_cdc_kbhit())
{
usb_task();
printf(usb_cdc_putc,"\n\r Prueba de envio de órdenes y comunicación entre Pics\r\n");
printf(usb_cdc_putc,"\n\r Introducir variable de lectura. a(RA0) b(RA1):\r\n\n");
ORD=usb_cdc_getc();
if (ORD == 'a') {
PUTC(0);
delay_ms(1500);
Dato=GETC();
usb_task();
printf(usb_cdc_putc,"\n\r Voltaje de %s es =%01.3fV\r\n\n",ORD,Dato*5.0/255.5);
}
else if (ORD =='b') {
PUTC(1);
delay_ms(1500);
Dato=GETC();
usb_task();
printf(usb_cdc_putc,"\n\r Voltaje de %s es =%01.3fV\r\n\n",ORD,Dato*5.0/255.5);
}
Else{
printf(usb_cdc_putc,"\n\rComando incorrecto\r\n\n");
}
}
}
}
While (TRUE);
}
[b][u]CÓDIGO PARA EL ESCLAVO:[/u][/b]
#include <18F2550.h>
//#device *=16 // configuramos para envio de paquetes de 16bits
#fuses XT,NOWDT
#device adc=8
#use delay(Clock=4000000)
#use rs232(Baud=9600, xmit=PIN_C6, rcv=PIN_C7, bits=8,PARITY=N)
#include <LCD.C>
#BYTE TRSIA=0x85
#BYTE PORTA=0x05
char ORD;
int8 S0,S1;
#int_RDA
void RDA_isr()
{
ORD=GETC();
if (ORD=='0'){
PUTC(S0);
}
If (ORD=='1'){
PUTC(S1);
}
}
void main()
{
setup_adc_ports(AN0_TO_AN1|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(10);
lcd_init();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
for (;;)
{
set_adc_channel(0);
delay_us(10);
read_adc(ADC_START_ONLY);
while (!adc_done());
S0=read_adc(ADC_READ_ONLY);
set_adc_channel(1);
delay_us(10);
read_adc(ADC_START_ONLY);
while (!adc_done());
S1=read_adc(ADC_READ_ONLY);
lcd_gotoxy(1,1);
printf(lcd_putc,"V (RA0):=%01.3fV",S0*5.0/255.5);
lcd_gotoxy(1,2);
printf(lcd_putc,"V (RA1):=%01.3fV",S1*5.0/255.5);
delay_us(10);
// /*sleep();*/
}
}
Bueno, si alguien sabe como podría solucionar este problemilla le agradecería que me lo comentara.
Un saludo y gracias.
PD: Usu el CCS para compilar.