gracias Chaly29 por tu interes y amabilidad.
Esto es lo que hice en el pic:
#include<18f2550.h>
#DEVICE ADC=10 // CAD a 10 bits, justificación a a la derecha.
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000) // Frecuencia máxima de trabajo.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.
#define led1 PIN_B2 //está encendido el pic
#define led2 PIN_B3 //esta listo para comunicar
#define led3 PIN_B4 //titila cuando está comunicando
#define salida1 PIN_B5 //avanza el cilindro
#define salida2 PIN_B6 //retrocede el cilindro
#define req PIN_C0 //pin solicita señal a la regla
#define dat PIN_C1 //pin recibe dato de la regla
#define clk PIN_C2 //pin recible reloj de la regla
#define pin_on output_high
#define pin_off output_low
int8 Mensaje[14];
int8 valor_adc_alta=0; // Contiene el MSB del valor del ADC.
int8 valor_adc_baja=0; // Contiene el LSB del valor del ADC.
void config_adcon2(void) {
#asm
movlw 0b10111110
iorwf 0xFC0,1
#endasm
}
void lecturaanalogica1 (void) {
//lectura de canal 0
Mensaje[1]= 0;
Mensaje[2]= 0;
valor_adc_alta=0;
valor_adc_baja=0;
set_adc_channel(0); // Seleccionamos el canal 0 y comenzamos a leer.
delay_us(10); // Esperamos un tiempo para estabalizar el dato leido.
valor_adc_alta = (read_adc()>>8); // Enviamos la parte alta de la conversión de 10 bits.
valor_adc_baja = (int)(read_adc()); // Enviamos la parte baja de la conversión de 10 bits.
//fin de lectura de canal 0
Mensaje[1]=valor_adc_alta;
Mensaje[2]=valor_adc_baja;
}
void lecturaanalogica2 (void) {
//lectura de canal 1
Mensaje[3]= 0;
Mensaje[4]= 0;
valor_adc_alta=0;
valor_adc_baja=0;
set_adc_channel(1); // Seleccionamos el canal 0 y comenzamos a leer.
delay_us(10); // Esperamos un tiempo para estabalizar el dato leido.
valor_adc_alta = (read_adc()>>8); // Enviamos la parte alta de la conversión de 10 bits.
valor_adc_baja = (int)(read_adc()); // Enviamos la parte baja de la conversión de 10 bits.
//fin de lectura de canal 0
Mensaje[3]=valor_adc_alta;
Mensaje[4]=valor_adc_baja;
}
void lecturaregladigital(void) {
int8 i = 0; int8 j = 0; int8 k = 0; //variable aux para obtener el valor de la regla
int8 datoObtenido[14];
Mensaje[5]=0;
Mensaje[6]=0;
Mensaje[7]=0;
Mensaje[8]=0;
Mensaje[9]=0;
Mensaje[10]=0;
Mensaje[11]=0;
Mensaje[12]=0;
Mensaje[13]=0;
datoObtenido[] = 0;
pin_on(req);
for (i=0; i<13; i++){
k=0;
for (j=0; j<4; j++){
while (!input(clk)) {};
while (input(clk)) {};
if (input(dat)==0) bit_clear(k,j);
if (input(dat)==1) bit_set(k,j);
}
datoObtenido[i] = k;
}
Mensaje[5]=datoObtenido[5]; //valor metro
Mensaje[6]=datoObtenido[6]; //valor decimetro
Mensaje[7]=datoObtenido[7]; //valor centimetro
Mensaje[8]=datoObtenido[8]; //valor milimetro
Mensaje[9]=datoObtenido[9]; //valor decimal
Mensaje[10]=datoObtenido[10]; //valor centecimal
Mensaje[11]=datoObtenido[11]; //decimal
Mensaje[12]=datoObtenido[12]; //unidad
Mensaje[13]=datoObtenido[4]; //singo
//fin de lectura de la regla digital
}
void main(void) {
unsigned char datoIN; // Dato que llega por la USART
// definiciones del pic:
set_tris_b(0x00);
delay_cycles(5);
pin_off(led1);
pin_off(led2);
pin_off(led3);
pin_off(salida1);
pin_off(salida2);
setup_adc_ports(AN0_TO_AN1); // Configura canales usados por el ADC.
setup_adc(ADC_CLOCK_DIV_64); // Asigna la velocidad: reloj\64.
config_ADCON2(); // Configuramos el ADCON2.
// inicio de puerto usb:
usb_cdc_init(); // Configura el puerto
usb_init(); // Inicializamos el stack USB.
usb_task();
while (!usb_cdc_connected()) {}; // espera a detectar una transmisión de la PC (Set_Line_Coding).
do{
usb_task();
if (usb_enumerated()){ // Espera a que el dispositivo sea enumerado por el host.
if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
datoIN=usb_cdc_getc(); // Lee lo que llego al buffer
//datoIN debe como un byte, cada bit representa las siguientes funciones
//bit 7 = Solicita lectura analógica 2
//bit 6 = Solicita lectura analogica 1
//bit 5 = Solicita lectura de regla
//bit 4 = Enciente salida 2
//bit 3 = Enciende salida 1
//bit 2 = Enciende led 3
//bit 1 = Enciende led 2
//bit 0 = Enciende led 1
if (!bit_test(datoIN,0)){
pin_off(led1);
}
if (bit_test(datoIN,0)){
pin_on(led1);
}
if (!bit_test(datoIN,1)){
pin_off(led2);
}
if (bit_test(datoIN,1)){
pin_on(led2);
}
if (!bit_test(datoIN,2)){
pin_off(led3);
}
if (bit_test(datoIN,2)){
pin_on(led3);
}
if (!bit_test(datoIN,3)){
pin_off(salida1);
}
if (bit_test(datoIN,3)){
pin_on(salida1);
}
if (!bit_test(datoIN,4)){
pin_off(salida2);
}
if (bit_test(datoIN,4)){
pin_on(salida2);
}
if (bit_test(datoIN,5)==1){
lecturaregladigital();
}
if (bit_test(datoIN,6)==1){
lecturaanalogica1();
}
if (bit_test(datoIN,7)==1){
lecturaanalogica2();
}
printf(usb_cdc_putc, "%Xa%Xb%Xc%Xd%U%U%U%U%U%U%U%U%Uq", Mensaje[1], Mensaje[2], Mensaje[3],
Mensaje[4], Mensaje[5], Mensaje[6], Mensaje[7], Mensaje[8], Mensaje[9],
Mensaje[10], Mensaje[11], Mensaje[12], Mensaje[13]);
}
}
}while (TRUE); // bucle infinito.
}
En la pc tenía una solicitud de datos cada 0.1 seg. Si lo bajo tiraba errores en los datos entregados. No se porque puede ser.
¿se optimizar la programación?