Autor Tema: Analizador lógico de 3 Canales monitorizado en el PC  (Leído 40948 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado leoelectronic

  • PIC10
  • *
  • Mensajes: 29
Re: Analizador lógico de 3 Canales monitorizado en el PC
« Respuesta #120 en: 26 de Marzo de 2012, 15:58:17 »
Pues a mi tampoco me funciona me sale el mismo error en verdad no se como conectarlo  :5]

Desconectado EeePic

  • PIC10
  • *
  • Mensajes: 4
Re: Analizador lógico de 3 Canales monitorizado en el PC
« Respuesta #121 en: 09 de Julio de 2012, 04:49:43 »
Buenas a todos, yo tenía el mismo problema de que no conectaba (ni enviaba ni recibía nada por el RS232) y he podido solucionarlo, buscando por otros foros para buscar un ejemplo de comunicación serie con un 18F4550, hasta dar con un ejemplo que me funcionase.  He realizado unos cambios al código fuente y he conseguido que el soft comunique con el PC sin problemas, ahora el problema que tengo es que no termino de entender como funciona la sonda y el programa. Alguien podría poner un tutorial pequeñito para burros como yo, que no saben realizar un sampleo?  :oops:. Con tal de que me ponga sobre la pista, me sirve...

En principio, para que me funcione la comunicación serie hay varios puntos importantes:

Los fuses:

Código: [Seleccionar]
#fuses HS,NOMCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN

#FUSES CPUDIV1         //DIVISION DE FRECUENCIA DEL OSCILADOR: 1

La inicialización de la uart:

Código: [Seleccionar]
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7,stream=PC,bits=8)

Y para imprimir (o enviar, como se quiera llamar) el texto por el puerto serie del PIC, sustituir todos los printf, por la orden fprintf, de acuerdo a este esquema:

Printf original:

Código: [Seleccionar]
printf("Telnet format:\r\n\n");

Sentencia fprintf:

Código: [Seleccionar]
fprintf(PC,"Telnet format:\r\n\n");

En principio, como se ve, se trata de añadir el stream sobre el que queremos que se envien los datos, en este caso "PC", que se definió en la sentencia de inicialización de la UART, mas arriba.

Posteo el código completo para que lo vayáis probando y espero que os solucione los problemas. Yo estoy haciendo las pruebas con la tarjeta entrenadora de Mikroeletronika, la EasyPic v6, y me ha funcionado, con cristal de 20Mhz y CCS C v4.130. Ahora me queda probar que realice las capturas correctamente, que es donde de momento me he quedado estancado y necesito un empujoncito.

El código:

Código: [Seleccionar]
// RR Logical Analyzer v.1.2.2d
#include <18F4550.h>

#fuses HS,NOMCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN

#FUSES CPUDIV1         //DIVISION DE FRECUENCIA DEL OSCILADOR: 1

#use delay(clock=20000000)
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7,stream=PC,bits=8)

int  const NMUESTRAS=192;

char const SOFT_COMMAND_RESET    = 'r';
char const SOFT_COMMAND_FIRMWARE = 'w';
char const SOFT_COMMAND_DATA     = 'x';
char const SOFT_COMMAND_CONFIG   = 'c';
char const SOFT_COMMAND_EEPROM   = 'e';

char const HARD_COMMAND_RESET    = 'R';
char const HARD_COMMAND_FIRMWARE = 'W';
char const HARD_COMMAND_DATA     = 'X';
char const HARD_COMMAND_CONFIG   = 'C';
char const HARD_COMMAND_CONFIG1  = '1';
char const HARD_COMMAND_CONFIG2  = '2';
char const HARD_COMMAND_CONFIG3  = '3';
char const RESPONSE_ACK          = '^';

int  const DIR_C1_SETTINGS       =  0;
int  const DIR_C2_SETTINGS       =  1;
int  const DIR_C3_SETTINGS       =  2;

// Variables en RAM /////////////////////////////////////////////////

char Version[]="1.2.2d\0";
char CharRcv=0;
char Command=0;

int  i=0x00;
int  uTimeUp=0;
int  uTimeDown=0;
int  nTintext=0;
int  tUpC[NMUESTRAS];
long tUpT[NMUESTRAS];
long tUpI[NMUESTRAS];
int  tDownC[NMUESTRAS];
long tDownT[NMUESTRAS];
long tDownI[NMUESTRAS];
long nTimer1Overflow;
int1 fedge1=0;
int1 fedge2=0;
int1 fedge3=0;
int1 flag_recibe_config1=0;
int1 flag_recibe_config2=0;
int1 flag_recibe_config3=0;

// Settings x CANAL /////////////////////////////////////////////////

int  C1_Settings= 0;
int1 C1_Active  = 0;
int1 C1_Raising = 0;
int1 C1_Falling = 0;
int1 C1_Trigger = 0;
int1 C1_Invert  = 0;

int  C2_Settings= 0;
int1 C2_Active  = 0;
int1 C2_Raising = 0;
int1 C2_Falling = 0;
int1 C2_Trigger = 0;
int1 C2_Invert  = 0;

int  C3_Settings= 0;
int1 C3_Active  = 0;
int1 C3_Raising = 0;
int1 C3_Falling = 0;
int1 C3_Trigger = 0;
int1 C3_Invert  = 0;

// Definicion de funciones //////////////////////////////////////////

void menu_trans(void);
void friendly_eeprom_trans(void);
void friendly_firmware_trans(void);
void hardy_firmware_trans(void);
void friendly_data_trans(void);
void hardy_data_trans(void);
void friendly_config_trans(void);
void hardy_config_trans(void);
void on_reset(int1 verbose);
void ack_trans(void);
void set_channel1(void);
void set_channel2(void);
void set_channel3(void);
void config_channels(int1 verbose);

#int_rda
void rda_handler() {

   CharRcv=0;
   if(kbhit()){
      CharRcv=getc();
      if(CharRcv!=0){
         Command=CharRcv;
      }
   }
}

#int_ext
ext_handler() {

   long t;
   long n;

   disable_interrupts(int_timer1);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);
   ++nTintext;
   if(nTintext==1){
      set_timer1(0);
      nTimer1Overflow=0;
   }
   n=nTimer1Overflow;
   t=get_timer1();

   if(fedge1==0){
      ext_int_edge(0,L_TO_H);
      tDownI[uTimeDown]=n;
      tDownT[uTimeDown]=t;
      tDownC[uTimeDown]=1;
      ++uTimeDown;
   }else
   {
      ext_int_edge(0,H_TO_L);
      tUpI[uTimeUp]=n;
      tUpT[uTimeUp]=t;
      tUpC[uTimeUp]=1;
      ++uTimeUp;
   }
   ++fedge1;
   if(bit_test(C2_SETTINGS,7)==1){
      enable_interrupts(int_ext1);
   }
   if(bit_test(C3_SETTINGS,7)==1){
      enable_interrupts(int_ext2);
   }
   enable_interrupts(int_timer1);
}

#int_ext1
ext1_handler() {

   long t;
   long n;

   disable_interrupts(int_timer1);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext2);
   ++nTintext;
   if(nTintext==1){
      set_timer1(0);
      nTimer1Overflow=0;
   }
   n=nTimer1Overflow;
   t=get_timer1();

   if(fedge2==0){
      ext_int_edge(1,L_TO_H);
      tDownI[uTimeDown]=n;
      tDownT[uTimeDown]=t;
      tDownC[uTimeDown]=2;
      ++uTimeDown;
   }else
   {
      ext_int_edge(1,H_TO_L);
      tUpI[uTimeUp]=n;
      tUpT[uTimeUp]=t;
      tUpC[uTimeUp]=2;
      ++uTimeUp;
   }
   ++fedge2;
   if(bit_test(C1_SETTINGS,7)==1){
      enable_interrupts(int_ext);
   }
   if(bit_test(C3_SETTINGS,7)==1){
      enable_interrupts(int_ext2);
   }
   enable_interrupts(int_timer1);
}

#int_ext2
ext2_handler() {

   long t;
   long n;

   disable_interrupts(int_timer1);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   ++nTintext;
   if(nTintext==1){
      set_timer1(0);
      nTimer1Overflow=0;
   }
   n=nTimer1Overflow;
   t=get_timer1();

   if(fedge3==0){
      ext_int_edge(2,L_TO_H);
      tDownI[uTimeDown]=n;
      tDownT[uTimeDown]=t;
      tDownC[uTimeDown]=3;
      ++uTimeDown;
   }else
   {
      ext_int_edge(2,H_TO_L);
      tUpI[uTimeUp]=n;
      tUpT[uTimeUp]=t;
      tUpC[uTimeUp]=3;
      ++uTimeUp;
   }
   ++fedge3;
   if(bit_test(C1_SETTINGS,7)==1){
      enable_interrupts(int_ext);
   }
   if(bit_test(C2_SETTINGS,7)==1){
      enable_interrupts(int_ext1);
   }
   enable_interrupts(int_timer1);
}

#int_timer1
timer1_handler(){
   ++nTimer1Overflow;
}

// ON_RESET /////////////////////////////////////////////////////////

void on_reset(int1 verbose){

   disable_interrupts(global);
   disable_interrupts(int_timer1);
   disable_interrupts(int_rda);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_psp(PSP_DISABLED);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   setup_timer_0(RTCC_OFF);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

 
   port_b_pullups(FALSE);
   set_tris_b(0b00000111);

   for(i=0;i<NMUESTRAS;i++){ tUpT[i]=0; tUpI[i]=0; tUpC[i]=0; tDownT[i]=0; tDownI[i]=0; tDownC[i]=0;}

   nTintext=0;
   uTimeUp=0;
   uTimeDown=0;
   flag_recibe_config1=0;
   flag_recibe_config2=0;
   flag_recibe_config3=0;

   config_channels(verbose);

   delay_ms(100);
   // Habilito Canal 1
   if(bit_test(C1_SETTINGS,7)==1){
      enable_interrupts(int_ext);
      if(verbose){ fprintf(PC,"\r\nint_ext enabled\r\n");}
   }
   // Habilito Canal 2
   if(bit_test(C2_SETTINGS,7)==1){
      enable_interrupts(int_ext1);
      if(verbose)fprintf(PC,"\r\nint_ext1 enabled\r\n");}
   }
   // Habilito Canal 3
   if(bit_test(C3_SETTINGS,7)==1){
      enable_interrupts(int_ext2);
      if(verbose){ fprintf(PC,"\r\nint_ext2 enabled\r\n");}
   }
   // Habilito Recepción RS232
   enable_interrupts(int_rda);
   
   // Habilito Interrupciones Global
   enable_interrupts(global);
}

// MAIN //////////////////////////////////////////////////////////////////

void main() {

   
   on_reset(0);

   do{

      if(Command!=0){

         // Accepta byte de configuracion para Channel 1
         if(flag_recibe_config1==1){
            set_channel1();
         }
         // Accepta byte de configuracion para Channel 2
         if(flag_recibe_config2==1){
            set_channel2();
         }
         // Accepta byte de configuracion para Channel 3
         if(flag_recibe_config3==1){
            set_channel3();
         }

         // Procesa cxommandos
         switch(Command){

            // Commands Telnet  - SOFT COMMANDS ---------------------

            case '?': menu_trans();
                      break;
            case SOFT_COMMAND_RESET :
                      on_reset(1);               // Reset
                      break;
            case SOFT_COMMAND_FIRMWARE:
                      friendly_firmware_trans(); // Send Firmaware
                      break;
            case SOFT_COMMAND_DATA :
                      friendly_data_trans();     // Send Data
                      break;
            case SOFT_COMMAND_CONFIG :
                      friendly_config_trans();   // Send Config
                      break;
            case SOFT_COMMAND_EEPROM :
                      friendly_eeprom_trans();   // Send EEPROM
                      break;

            // Commands Soft PC - HARD COMMANDS ---------------------

            case HARD_COMMAND_RESET :
                      on_reset(0);               // Reset
                      ack_trans();
                      break;
            case HARD_COMMAND_FIRMWARE:
                      hardy_firmware_trans();    // Send Firmaware
                      break;
            case HARD_COMMAND_DATA :
                      hardy_data_trans();        // Send Data
                      break;
            case HARD_COMMAND_CONFIG :
                      hardy_config_trans();      // Send Config
                      break;
            case HARD_COMMAND_CONFIG1 :          // Atento : siguiente recepción de Cfg Channel 1
                      flag_recibe_config1=1;
                      ack_trans();
                      break;
            case HARD_COMMAND_CONFIG2 :          // Atento : siguiente recepción de Cfg Channel 2
                      flag_recibe_config2=1;
                      ack_trans();
                      break;
            case HARD_COMMAND_CONFIG3 :          // Atento : siguiente recepción de Cfg Channel 3
                      flag_recibe_config3=1;
                      ack_trans();
                      break;
         }
         Command=0;
      }

   } while (TRUE);
}

// menu_trans ///////////////////////////////////////////////////////

void menu_trans(void){

   friendly_firmware_trans();

   fprintf(PC,"Telnet format:\r\n\n");
   fprintf(PC,"  %c  reset tables\r\n",     SOFT_COMMAND_RESET);
   fprintf(PC,"  %c  version firmware\r\n", SOFT_COMMAND_FIRMWARE);
   fprintf(PC,"  %c  config transmit\r\n",  SOFT_COMMAND_CONFIG);
   fprintf(PC,"  %c  data transmit\r\n",    SOFT_COMMAND_DATA);
   fprintf(PC,"  %c  eeprom transmit\r\n",  SOFT_COMMAND_EEPROM);
   fprintf(PC,"\r\n");
   fprintf(PC,"Hardware format:\r\n\n");
   fprintf(PC,"  %c  reset tables\r\n",     HARD_COMMAND_RESET);
   fprintf(PC,"  %c  version firmware\r\n", HARD_COMMAND_FIRMWARE);
   fprintf(PC,"  %c  data transmit\r\n",    HARD_COMMAND_DATA);
   fprintf(PC,"  %c  config transmit\r\n",  HARD_COMMAND_CONFIG);
   fprintf(PC,"  %cb config Channel1\r\n",  HARD_COMMAND_CONFIG1);
   fprintf(PC,"  %cb config Channel2\r\n",  HARD_COMMAND_CONFIG2);
   fprintf(PC,"  %cb config Channel3\r\n",  HARD_COMMAND_CONFIG3);
   fprintf(PC,"\r\n");

}

// Set Canal ////////////////////////////////////////////////////////

void set_channel1(void){

   flag_recibe_config1=0;
   C1_Settings=Command;
   Command=0;
   write_eeprom(DIR_C1_SETTINGS,C1_SETTINGS);
   delay_ms(10);
   ack_trans();
}

void set_channel2(void){

   flag_recibe_config2=0;
   C2_Settings=Command;
   Command=0;
   write_eeprom(DIR_C2_SETTINGS,C2_SETTINGS);
   delay_ms(10);
   ack_trans();
}

void set_channel3(void){

   flag_recibe_config3=0;
   C3_Settings=Command;
   Command=0;
   write_eeprom(DIR_C3_SETTINGS,C3_SETTINGS);
   delay_ms(10);
   ack_trans();
}

void config_channels(int1 verbose){

   // Recupero configuracion desde la EEPROM
   C1_SETTINGS = read_eeprom(DIR_C1_SETTINGS);
   C2_SETTINGS = read_eeprom(DIR_C2_SETTINGS);
   C3_SETTINGS = read_eeprom(DIR_C3_SETTINGS);
   if(verbose){ fprintf(PC,"\r\Config 1=%u 2=%u 3=%u\r\n",C1_SETTINGS,C2_SETTINGS,C3_SETTINGS);}
   // Configuro Channel1 Flanco inicial
   if(bit_test(C1_SETTINGS,7)==1){
     if(bit_test(C1_SETTINGS,5)==1){
        fedge1=0;
        ext_int_edge(0,H_TO_L);
        if(verbose){ fprintf(PC,"\r\nint_ext 0 H_to_L\r\n");}
     }
     if(bit_test(C1_SETTINGS,6)==1){
        fedge1=1;
        ext_int_edge(0,L_TO_H);
        if(verbose){ fprintf(PC,"\r\nint_ext 1 L_to_H\r\n");}
     }
   }
   // Configuro Channel2 Flanco inicial
   if(bit_test(C2_SETTINGS,7)==1){
     if(bit_test(C2_SETTINGS,5)==1){
        fedge2=0;
        ext_int_edge(1,H_TO_L);
        if(verbose){ fprintf(PC,"\r\nint_ext1 0 H_to_L\r\n");}
     }
     if(bit_test(C2_SETTINGS,6)==1){
        fedge2=1;
        ext_int_edge(1,L_TO_H);
        if(verbose){ fprintf(PC,"\r\nint_ext1 1 L_to_H\r\n");}
     }
   }
   // Configuro Channel3 Flanco inicial
   if(bit_test(C3_SETTINGS,7)==1){
     if(bit_test(C3_SETTINGS,5)==1){
        fedge3=0;
        ext_int_edge(2,H_TO_L);
        if(verbose){ fprintf(PC,"\r\nint_ext2 0 H_to_L\r\n");}
     }
     if(bit_test(C3_SETTINGS,6)==1){
        fedge3=1;
        ext_int_edge(2,L_TO_H);
        if(verbose){ fprintf(PC,"\r\nint_ext2 1 L_to_H\r\n");}
     }
   }
}

// ack_trans ////////////////////////////////////////////////////////

void ack_trans(void){

   fprintf(PC,"%c\r\n",RESPONSE_ACK);
}

// eeprom_trans /////////////////////////////////////////////////////

void friendly_eeprom_trans(void){

   int i,j,u;

   fprintf(PC,"\r\n");
   for(i=0;i<16;i++) printf("%X ",i);
   fprintf(PC,"\r\n");
   for(i=0;i<16;i++) printf("== ");
   fprintf(PC,"\r\n");
   j=0;
   for(i=0;i<255;i++){
     u=read_eeprom(i);
     fprintf(PC,"%X ",u);
     if(++j>15){
       j=0;
       fprintf(PC,"\r\n");
     }
   }
   u=read_eeprom(255);
   fprintf(PC,"%X ",u);
   fprintf(PC,"\r\n\r\n");
}

// firmware_trans ///////////////////////////////////////////////////

void friendly_firmware_trans(void){

   fprintf(PC,"\r\nLogical Analyzer v.%s by Redpic\r\n\n",Version);
}

void hardy_firmware_trans(void){

   fprintf(PC,"{%s}\r\n",Version);
   delay_ms(10);
   ack_trans();
}

// data_trans ///////////////////////////////////////////////////////

void friendly_data_trans(void){

   disable_interrupts(int_timer1);

   fprintf(PC,"\r\nResults Table:\r\n\n");

   fprintf(PC,"Total INT_EXT detected %2u\r\n",nTintext);

   fprintf(PC,"\r\nFalling edges Table\r\n\n");
   fprintf(PC,"Nº C   Overflows  Timer\r\n");
   fprintf(PC,"=======================\r\n");
   for(i=0;i<NMUESTRAS;i++){
      printf("%2u %1u       %5lu  %5lu\r\n",i,tDownC[i],tDownI[i],tDownT[i]);
   }
   fprintf(PC,"\r\n\nRising edges Table\r\n\n");
   fprintf(PC,"Nº C   Overflows  Timer\r\n");
   fprintf(PC,"=======================\r\n");
   for(i=0;i<NMUESTRAS;i++){
      fprintf(PC,"%2u %1u       %5lu  %5lu\r\n",i,tUpC[i],tUpI[i],tUpT[i]);
   }
}

void hardy_data_trans(void){

   disable_interrupts(int_timer1);

   for(i=0;i<NMUESTRAS;i++){
      fprintf(PC,"{ %3u %1u %5lu %5lu %1u %5lu %5lu }\r\n",i+1,tUpC[i],tUpI[i],tUpT[i],tDownC[i],tDownI[i],tDownT[i]);
   }
   delay_ms(10);
   ack_trans();
}

// config_trans /////////////////////////////////////////////////////

void friendly_config_trans(void){

   disable_interrupts(int_timer1);

   fprintf(PC,"\r\nConfig Channels :\r\n\n");

   fprintf(PC,"Channel 1 = %2u\r\n\n",C1_Settings);
   fprintf(PC,"Channel 2 = %2u\r\n\n",C2_Settings);
   fprintf(PC,"Channel 3 = %2u\r\n\n",C3_Settings);
}

void hardy_config_trans(void){

   disable_interrupts(int_timer1);

   fprintf(PC,"{ %3u %3u %3u }\r\n",C1_Settings,C2_Settings,C3_Settings);
   delay_ms(10);
   ack_trans();
}
///////////////////////////////////////////////////////////////////////////////////////////////////


He modificado el código lo mínimo imprescindible para que funcione la comunicación serie. Por favor, si algún maestro pudiera confirmar que no afecta al buen funcionamiento de la sonda, se lo agradecería muchísimo. (aunque no lo parezca, estoy muy muy verde aún en esto de los PICs).

Gracias a todos y en especial a RedPic, por este fantástico programa y para agradecerle su esfuerzo.

Un saludo!!!
« Última modificación: 09 de Julio de 2012, 14:04:47 por EeePic »

Desconectado EeePic

  • PIC10
  • *
  • Mensajes: 4
Re: Analizador lógico de 3 Canales monitorizado en el PC
« Respuesta #122 en: 09 de Julio de 2012, 14:28:01 »
Me respondo a mi mismo.... :grin: :grin:



Uploaded with ImageShack.us

Parece que voy progresando...

Gracias de nuevo!!

Desconectado nutriax

  • PIC10
  • *
  • Mensajes: 42
Re: Analizador lógico de 3 Canales monitorizado en el PC
« Respuesta #123 en: 28 de Enero de 2014, 12:27:17 »
Hola RedPic, puedes subir una version de tu soft para que trabaje con los diferentes com?? ya que cuando intento conectarlo me dice que no se puede conectar al hardware 18F4550 y he realizado pruebas con hyperterminal y me devuelvo todo el menu y demas, por lo que creo que solo es porque a nivel de programacion (software de pc) no toma en cuenta los demas comm tal como tu lo dijiste en post anteriores.
Muchas gracias.

Desconectado n00b30

  • PIC10
  • *
  • Mensajes: 1
Re: Analizador lógico de 3 Canales monitorizado en el PC
« Respuesta #124 en: 07 de Octubre de 2015, 17:34:35 »
Buenas a todos, yo tenía el mismo problema de que no conectaba (ni enviaba ni recibía nada por el RS232) y he podido solucionarlo, buscando por otros foros para buscar un ejemplo de comunicación serie con un 18F4550, hasta dar con un ejemplo que me funcionase.  He realizado unos cambios al código fuente y he conseguido que el soft comunique con el PC sin problemas, ahora el problema que tengo es que no termino de entender como funciona la sonda y el programa. Alguien podría poner un tutorial pequeñito para burros como yo, que no saben realizar un sampleo?  :oops:. Con tal de que me ponga sobre la pista, me sirve...

En principio, para que me funcione la comunicación serie hay varios puntos importantes:

Los fuses:

Código: [Seleccionar]
#fuses HS,NOMCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN

#FUSES CPUDIV1         //DIVISION DE FRECUENCIA DEL OSCILADOR: 1

La inicialización de la uart:

Código: [Seleccionar]
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7,stream=PC,bits=8)

Y para imprimir (o enviar, como se quiera llamar) el texto por el puerto serie del PIC, sustituir todos los printf, por la orden fprintf, de acuerdo a este esquema:

Printf original:

Código: [Seleccionar]
printf("Telnet format:\r\n\n");

Sentencia fprintf:

Código: [Seleccionar]
fprintf(PC,"Telnet format:\r\n\n");

En principio, como se ve, se trata de añadir el stream sobre el que queremos que se envien los datos, en este caso "PC", que se definió en la sentencia de inicialización de la UART, mas arriba.

Posteo el código completo para que lo vayáis probando y espero que os solucione los problemas. Yo estoy haciendo las pruebas con la tarjeta entrenadora de Mikroeletronika, la EasyPic v6, y me ha funcionado, con cristal de 20Mhz y CCS C v4.130. Ahora me queda probar que realice las capturas correctamente, que es donde de momento me he quedado estancado y necesito un empujoncito.

El código:

Código: [Seleccionar]
// RR Logical Analyzer v.1.2.2d
#include <18F4550.h>

#fuses HS,NOMCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN

#FUSES CPUDIV1         //DIVISION DE FRECUENCIA DEL OSCILADOR: 1

#use delay(clock=20000000)
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7,stream=PC,bits=8)

int  const NMUESTRAS=192;

char const SOFT_COMMAND_RESET    = 'r';
char const SOFT_COMMAND_FIRMWARE = 'w';
char const SOFT_COMMAND_DATA     = 'x';
char const SOFT_COMMAND_CONFIG   = 'c';
char const SOFT_COMMAND_EEPROM   = 'e';

char const HARD_COMMAND_RESET    = 'R';
char const HARD_COMMAND_FIRMWARE = 'W';
char const HARD_COMMAND_DATA     = 'X';
char const HARD_COMMAND_CONFIG   = 'C';
char const HARD_COMMAND_CONFIG1  = '1';
char const HARD_COMMAND_CONFIG2  = '2';
char const HARD_COMMAND_CONFIG3  = '3';
char const RESPONSE_ACK          = '^';

int  const DIR_C1_SETTINGS       =  0;
int  const DIR_C2_SETTINGS       =  1;
int  const DIR_C3_SETTINGS       =  2;

// Variables en RAM /////////////////////////////////////////////////

char Version[]="1.2.2d\0";
char CharRcv=0;
char Command=0;

int  i=0x00;
int  uTimeUp=0;
int  uTimeDown=0;
int  nTintext=0;
int  tUpC[NMUESTRAS];
long tUpT[NMUESTRAS];
long tUpI[NMUESTRAS];
int  tDownC[NMUESTRAS];
long tDownT[NMUESTRAS];
long tDownI[NMUESTRAS];
long nTimer1Overflow;
int1 fedge1=0;
int1 fedge2=0;
int1 fedge3=0;
int1 flag_recibe_config1=0;
int1 flag_recibe_config2=0;
int1 flag_recibe_config3=0;

// Settings x CANAL /////////////////////////////////////////////////

int  C1_Settings= 0;
int1 C1_Active  = 0;
int1 C1_Raising = 0;
int1 C1_Falling = 0;
int1 C1_Trigger = 0;
int1 C1_Invert  = 0;

int  C2_Settings= 0;
int1 C2_Active  = 0;
int1 C2_Raising = 0;
int1 C2_Falling = 0;
int1 C2_Trigger = 0;
int1 C2_Invert  = 0;

int  C3_Settings= 0;
int1 C3_Active  = 0;
int1 C3_Raising = 0;
int1 C3_Falling = 0;
int1 C3_Trigger = 0;
int1 C3_Invert  = 0;

// Definicion de funciones //////////////////////////////////////////

void menu_trans(void);
void friendly_eeprom_trans(void);
void friendly_firmware_trans(void);
void hardy_firmware_trans(void);
void friendly_data_trans(void);
void hardy_data_trans(void);
void friendly_config_trans(void);
void hardy_config_trans(void);
void on_reset(int1 verbose);
void ack_trans(void);
void set_channel1(void);
void set_channel2(void);
void set_channel3(void);
void config_channels(int1 verbose);

#int_rda
void rda_handler() {

   CharRcv=0;
   if(kbhit()){
      CharRcv=getc();
      if(CharRcv!=0){
         Command=CharRcv;
      }
   }
}

#int_ext
ext_handler() {

   long t;
   long n;

   disable_interrupts(int_timer1);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);
   ++nTintext;
   if(nTintext==1){
      set_timer1(0);
      nTimer1Overflow=0;
   }
   n=nTimer1Overflow;
   t=get_timer1();

   if(fedge1==0){
      ext_int_edge(0,L_TO_H);
      tDownI[uTimeDown]=n;
      tDownT[uTimeDown]=t;
      tDownC[uTimeDown]=1;
      ++uTimeDown;
   }else
   {
      ext_int_edge(0,H_TO_L);
      tUpI[uTimeUp]=n;
      tUpT[uTimeUp]=t;
      tUpC[uTimeUp]=1;
      ++uTimeUp;
   }
   ++fedge1;
   if(bit_test(C2_SETTINGS,7)==1){
      enable_interrupts(int_ext1);
   }
   if(bit_test(C3_SETTINGS,7)==1){
      enable_interrupts(int_ext2);
   }
   enable_interrupts(int_timer1);
}

#int_ext1
ext1_handler() {

   long t;
   long n;

   disable_interrupts(int_timer1);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext2);
   ++nTintext;
   if(nTintext==1){
      set_timer1(0);
      nTimer1Overflow=0;
   }
   n=nTimer1Overflow;
   t=get_timer1();

   if(fedge2==0){
      ext_int_edge(1,L_TO_H);
      tDownI[uTimeDown]=n;
      tDownT[uTimeDown]=t;
      tDownC[uTimeDown]=2;
      ++uTimeDown;
   }else
   {
      ext_int_edge(1,H_TO_L);
      tUpI[uTimeUp]=n;
      tUpT[uTimeUp]=t;
      tUpC[uTimeUp]=2;
      ++uTimeUp;
   }
   ++fedge2;
   if(bit_test(C1_SETTINGS,7)==1){
      enable_interrupts(int_ext);
   }
   if(bit_test(C3_SETTINGS,7)==1){
      enable_interrupts(int_ext2);
   }
   enable_interrupts(int_timer1);
}

#int_ext2
ext2_handler() {

   long t;
   long n;

   disable_interrupts(int_timer1);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   ++nTintext;
   if(nTintext==1){
      set_timer1(0);
      nTimer1Overflow=0;
   }
   n=nTimer1Overflow;
   t=get_timer1();

   if(fedge3==0){
      ext_int_edge(2,L_TO_H);
      tDownI[uTimeDown]=n;
      tDownT[uTimeDown]=t;
      tDownC[uTimeDown]=3;
      ++uTimeDown;
   }else
   {
      ext_int_edge(2,H_TO_L);
      tUpI[uTimeUp]=n;
      tUpT[uTimeUp]=t;
      tUpC[uTimeUp]=3;
      ++uTimeUp;
   }
   ++fedge3;
   if(bit_test(C1_SETTINGS,7)==1){
      enable_interrupts(int_ext);
   }
   if(bit_test(C2_SETTINGS,7)==1){
      enable_interrupts(int_ext1);
   }
   enable_interrupts(int_timer1);
}

#int_timer1
timer1_handler(){
   ++nTimer1Overflow;
}

// ON_RESET /////////////////////////////////////////////////////////

void on_reset(int1 verbose){

   disable_interrupts(global);
   disable_interrupts(int_timer1);
   disable_interrupts(int_rda);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_psp(PSP_DISABLED);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   setup_timer_0(RTCC_OFF);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

 
   port_b_pullups(FALSE);
   set_tris_b(0b00000111);

   for(i=0;i<NMUESTRAS;i++){ tUpT[i]=0; tUpI[i]=0; tUpC[i]=0; tDownT[i]=0; tDownI[i]=0; tDownC[i]=0;}

   nTintext=0;
   uTimeUp=0;
   uTimeDown=0;
   flag_recibe_config1=0;
   flag_recibe_config2=0;
   flag_recibe_config3=0;

   config_channels(verbose);

   delay_ms(100);
   // Habilito Canal 1
   if(bit_test(C1_SETTINGS,7)==1){
      enable_interrupts(int_ext);
      if(verbose){ fprintf(PC,"\r\nint_ext enabled\r\n");}
   }
   // Habilito Canal 2
   if(bit_test(C2_SETTINGS,7)==1){
      enable_interrupts(int_ext1);
      if(verbose)fprintf(PC,"\r\nint_ext1 enabled\r\n");}
   }
   // Habilito Canal 3
   if(bit_test(C3_SETTINGS,7)==1){
      enable_interrupts(int_ext2);
      if(verbose){ fprintf(PC,"\r\nint_ext2 enabled\r\n");}
   }
   // Habilito Recepción RS232
   enable_interrupts(int_rda);
   
   // Habilito Interrupciones Global
   enable_interrupts(global);
}

// MAIN //////////////////////////////////////////////////////////////////

void main() {

   
   on_reset(0);

   do{

      if(Command!=0){

         // Accepta byte de configuracion para Channel 1
         if(flag_recibe_config1==1){
            set_channel1();
         }
         // Accepta byte de configuracion para Channel 2
         if(flag_recibe_config2==1){
            set_channel2();
         }
         // Accepta byte de configuracion para Channel 3
         if(flag_recibe_config3==1){
            set_channel3();
         }

         // Procesa cxommandos
         switch(Command){

            // Commands Telnet  - SOFT COMMANDS ---------------------

            case '?': menu_trans();
                      break;
            case SOFT_COMMAND_RESET :
                      on_reset(1);               // Reset
                      break;
            case SOFT_COMMAND_FIRMWARE:
                      friendly_firmware_trans(); // Send Firmaware
                      break;
            case SOFT_COMMAND_DATA :
                      friendly_data_trans();     // Send Data
                      break;
            case SOFT_COMMAND_CONFIG :
                      friendly_config_trans();   // Send Config
                      break;
            case SOFT_COMMAND_EEPROM :
                      friendly_eeprom_trans();   // Send EEPROM
                      break;

            // Commands Soft PC - HARD COMMANDS ---------------------

            case HARD_COMMAND_RESET :
                      on_reset(0);               // Reset
                      ack_trans();
                      break;
            case HARD_COMMAND_FIRMWARE:
                      hardy_firmware_trans();    // Send Firmaware
                      break;
            case HARD_COMMAND_DATA :
                      hardy_data_trans();        // Send Data
                      break;
            case HARD_COMMAND_CONFIG :
                      hardy_config_trans();      // Send Config
                      break;
            case HARD_COMMAND_CONFIG1 :          // Atento : siguiente recepción de Cfg Channel 1
                      flag_recibe_config1=1;
                      ack_trans();
                      break;
            case HARD_COMMAND_CONFIG2 :          // Atento : siguiente recepción de Cfg Channel 2
                      flag_recibe_config2=1;
                      ack_trans();
                      break;
            case HARD_COMMAND_CONFIG3 :          // Atento : siguiente recepción de Cfg Channel 3
                      flag_recibe_config3=1;
                      ack_trans();
                      break;
         }
         Command=0;
      }

   } while (TRUE);
}

// menu_trans ///////////////////////////////////////////////////////

void menu_trans(void){

   friendly_firmware_trans();

   fprintf(PC,"Telnet format:\r\n\n");
   fprintf(PC,"  %c  reset tables\r\n",     SOFT_COMMAND_RESET);
   fprintf(PC,"  %c  version firmware\r\n", SOFT_COMMAND_FIRMWARE);
   fprintf(PC,"  %c  config transmit\r\n",  SOFT_COMMAND_CONFIG);
   fprintf(PC,"  %c  data transmit\r\n",    SOFT_COMMAND_DATA);
   fprintf(PC,"  %c  eeprom transmit\r\n",  SOFT_COMMAND_EEPROM);
   fprintf(PC,"\r\n");
   fprintf(PC,"Hardware format:\r\n\n");
   fprintf(PC,"  %c  reset tables\r\n",     HARD_COMMAND_RESET);
   fprintf(PC,"  %c  version firmware\r\n", HARD_COMMAND_FIRMWARE);
   fprintf(PC,"  %c  data transmit\r\n",    HARD_COMMAND_DATA);
   fprintf(PC,"  %c  config transmit\r\n",  HARD_COMMAND_CONFIG);
   fprintf(PC,"  %cb config Channel1\r\n",  HARD_COMMAND_CONFIG1);
   fprintf(PC,"  %cb config Channel2\r\n",  HARD_COMMAND_CONFIG2);
   fprintf(PC,"  %cb config Channel3\r\n",  HARD_COMMAND_CONFIG3);
   fprintf(PC,"\r\n");

}

// Set Canal ////////////////////////////////////////////////////////

void set_channel1(void){

   flag_recibe_config1=0;
   C1_Settings=Command;
   Command=0;
   write_eeprom(DIR_C1_SETTINGS,C1_SETTINGS);
   delay_ms(10);
   ack_trans();
}

void set_channel2(void){

   flag_recibe_config2=0;
   C2_Settings=Command;
   Command=0;
   write_eeprom(DIR_C2_SETTINGS,C2_SETTINGS);
   delay_ms(10);
   ack_trans();
}

void set_channel3(void){

   flag_recibe_config3=0;
   C3_Settings=Command;
   Command=0;
   write_eeprom(DIR_C3_SETTINGS,C3_SETTINGS);
   delay_ms(10);
   ack_trans();
}

void config_channels(int1 verbose){

   // Recupero configuracion desde la EEPROM
   C1_SETTINGS = read_eeprom(DIR_C1_SETTINGS);
   C2_SETTINGS = read_eeprom(DIR_C2_SETTINGS);
   C3_SETTINGS = read_eeprom(DIR_C3_SETTINGS);
   if(verbose){ fprintf(PC,"\r\Config 1=%u 2=%u 3=%u\r\n",C1_SETTINGS,C2_SETTINGS,C3_SETTINGS);}
   // Configuro Channel1 Flanco inicial
   if(bit_test(C1_SETTINGS,7)==1){
     if(bit_test(C1_SETTINGS,5)==1){
        fedge1=0;
        ext_int_edge(0,H_TO_L);
        if(verbose){ fprintf(PC,"\r\nint_ext 0 H_to_L\r\n");}
     }
     if(bit_test(C1_SETTINGS,6)==1){
        fedge1=1;
        ext_int_edge(0,L_TO_H);
        if(verbose){ fprintf(PC,"\r\nint_ext 1 L_to_H\r\n");}
     }
   }
   // Configuro Channel2 Flanco inicial
   if(bit_test(C2_SETTINGS,7)==1){
     if(bit_test(C2_SETTINGS,5)==1){
        fedge2=0;
        ext_int_edge(1,H_TO_L);
        if(verbose){ fprintf(PC,"\r\nint_ext1 0 H_to_L\r\n");}
     }
     if(bit_test(C2_SETTINGS,6)==1){
        fedge2=1;
        ext_int_edge(1,L_TO_H);
        if(verbose){ fprintf(PC,"\r\nint_ext1 1 L_to_H\r\n");}
     }
   }
   // Configuro Channel3 Flanco inicial
   if(bit_test(C3_SETTINGS,7)==1){
     if(bit_test(C3_SETTINGS,5)==1){
        fedge3=0;
        ext_int_edge(2,H_TO_L);
        if(verbose){ fprintf(PC,"\r\nint_ext2 0 H_to_L\r\n");}
     }
     if(bit_test(C3_SETTINGS,6)==1){
        fedge3=1;
        ext_int_edge(2,L_TO_H);
        if(verbose){ fprintf(PC,"\r\nint_ext2 1 L_to_H\r\n");}
     }
   }
}

// ack_trans ////////////////////////////////////////////////////////

void ack_trans(void){

   fprintf(PC,"%c\r\n",RESPONSE_ACK);
}

// eeprom_trans /////////////////////////////////////////////////////

void friendly_eeprom_trans(void){

   int i,j,u;

   fprintf(PC,"\r\n");
   for(i=0;i<16;i++) printf("%X ",i);
   fprintf(PC,"\r\n");
   for(i=0;i<16;i++) printf("== ");
   fprintf(PC,"\r\n");
   j=0;
   for(i=0;i<255;i++){
     u=read_eeprom(i);
     fprintf(PC,"%X ",u);
     if(++j>15){
       j=0;
       fprintf(PC,"\r\n");
     }
   }
   u=read_eeprom(255);
   fprintf(PC,"%X ",u);
   fprintf(PC,"\r\n\r\n");
}

// firmware_trans ///////////////////////////////////////////////////

void friendly_firmware_trans(void){

   fprintf(PC,"\r\nLogical Analyzer v.%s by Redpic\r\n\n",Version);
}

void hardy_firmware_trans(void){

   fprintf(PC,"{%s}\r\n",Version);
   delay_ms(10);
   ack_trans();
}

// data_trans ///////////////////////////////////////////////////////

void friendly_data_trans(void){

   disable_interrupts(int_timer1);

   fprintf(PC,"\r\nResults Table:\r\n\n");

   fprintf(PC,"Total INT_EXT detected %2u\r\n",nTintext);

   fprintf(PC,"\r\nFalling edges Table\r\n\n");
   fprintf(PC,"Nº C   Overflows  Timer\r\n");
   fprintf(PC,"=======================\r\n");
   for(i=0;i<NMUESTRAS;i++){
      printf("%2u %1u       %5lu  %5lu\r\n",i,tDownC[i],tDownI[i],tDownT[i]);
   }
   fprintf(PC,"\r\n\nRising edges Table\r\n\n");
   fprintf(PC,"Nº C   Overflows  Timer\r\n");
   fprintf(PC,"=======================\r\n");
   for(i=0;i<NMUESTRAS;i++){
      fprintf(PC,"%2u %1u       %5lu  %5lu\r\n",i,tUpC[i],tUpI[i],tUpT[i]);
   }
}

void hardy_data_trans(void){

   disable_interrupts(int_timer1);

   for(i=0;i<NMUESTRAS;i++){
      fprintf(PC,"{ %3u %1u %5lu %5lu %1u %5lu %5lu }\r\n",i+1,tUpC[i],tUpI[i],tUpT[i],tDownC[i],tDownI[i],tDownT[i]);
   }
   delay_ms(10);
   ack_trans();
}

// config_trans /////////////////////////////////////////////////////

void friendly_config_trans(void){

   disable_interrupts(int_timer1);

   fprintf(PC,"\r\nConfig Channels :\r\n\n");

   fprintf(PC,"Channel 1 = %2u\r\n\n",C1_Settings);
   fprintf(PC,"Channel 2 = %2u\r\n\n",C2_Settings);
   fprintf(PC,"Channel 3 = %2u\r\n\n",C3_Settings);
}

void hardy_config_trans(void){

   disable_interrupts(int_timer1);

   fprintf(PC,"{ %3u %3u %3u }\r\n",C1_Settings,C2_Settings,C3_Settings);
   delay_ms(10);
   ack_trans();
}
///////////////////////////////////////////////////////////////////////////////////////////////////


He modificado el código lo mínimo imprescindible para que funcione la comunicación serie. Por favor, si algún maestro pudiera confirmar que no afecta al buen funcionamiento de la sonda, se lo agradecería muchísimo. (aunque no lo parezca, estoy muy muy verde aún en esto de los PICs).

Gracias a todos y en especial a RedPic, por este fantástico programa y para agradecerle su esfuerzo.

Un saludo!!!

actualmente estoy probando este circuito y solo habia que acorregir esta linea:
Código: [Seleccionar]
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,MCLR,CPUDIV1, PLL1 
Este tema es algo viejo pero actualmente estoy tratando de decifrar un codigo y e intentado con este programa pero no e podido hacer que funcione del todo bien, hay alguna actualizacion?

Saludos!