TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: rashii en 02 de Febrero de 2008, 19:12:55

Título: Comandos hexadecimales en CCS por el puerto serie
Publicado por: rashii en 02 de Febrero de 2008, 19:12:55
Hola, queria saber como se podría hacer en ccs para enviar y recibir directamente en vez de caracteres normales comandos en hexadecimal, es decir lo que quiero hacer es mandar 0xD3,0xF4....en vez de mandar el su correspondiente valor en caracter...¿es esto posible? y del mismo modo recibirlos como hexadecimales en vez de como caracteres...es que las funciones de printf y getc del ccs no te lo dan en valores hexadecimales. Un saludo.
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: jfh900 en 02 de Febrero de 2008, 19:15:59
El sistema Hexadecimal es un sistema de numeración y por consiguiente no afecta al número en cuestión. Lo que varias es el modo de representar el número pero no dicho número. Si quieres verlo en hexadecimal usa:

printf("%X",VarNumero);

Un saludo
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: rashii en 02 de Febrero de 2008, 19:47:24
Gracias jfh, y podría hacer algo así: putc(0x00) ?? como haría si no para enviar un caracter del que se su representación en hexadecimal pero no su representación en decimal? Un saludo.
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: jfh900 en 02 de Febrero de 2008, 19:52:35
Como bien dices, se podría hacer como dices:

Tres formas de enviar el mismo número:

putc(13);  // Decimal
putc(0x0D);  // Hexadecimal
putc(0b00001101);  // Binario

Un saludo
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: rashii en 02 de Febrero de 2008, 20:46:01
Perfecto, es justo lo que queria  :-/

Muchas gracias!

Un saludo.
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: scientist en 21 de Marzo de 2008, 01:51:34
una preguntita,yo tambien quiero mandar comandos en hexa, y pongo asi:
#int_rda
secuencia(){

dato=0x00;
  if(kbhit()){
    dato=getc();
  }
}


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(global);
  enable_interrupts(int_rda);


   // TODO: USER CODE!!
   
   while(1){
if(dato!=0x00){
     printf("%X%X%X%X%X",0x1E,0x00,0x1C,0xD1,0x00);
     dato =0x00;
    }
   }
}

mi pregunta es la siguiente,lo detecta realmente como datos hexadecimales o como valores ascci que luego interpreta como valores hexa,por decir asi,el valor 1 lo interpreta como 0x31?pregunto esto por que lo he leido en otro post aqui abierto y tengo la duda,gracias por su atencion
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: Nocturno en 21 de Marzo de 2008, 03:09:27
El sistema Hexadecimal es un sistema de numeración y por consiguiente no afecta al número en cuestión. Lo que varias es el modo de representar el número pero no dicho número. Si quieres verlo en hexadecimal usa:

printf("%X",VarNumero);

Un saludo
Ya lo decía Jesús. El dato es el dato, y la notación hexadecimal, decimal, binaria, octal o ascii no son más que formas de representarlo.
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: pocher en 21 de Marzo de 2008, 04:16:08
Yo para no liarme siempre que se pueda envio caracteres ASCII y el PIC que detecte caracteres ASCII (variables definidas como char, te evitas confusiones).
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: scientist en 21 de Marzo de 2008, 15:24:50
ok,entendido,gracias por su tiempo,ya que como siempre digo,el tiempo es lo mas valioso :)
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: scientist en 22 de Marzo de 2008, 02:53:18
ok, una cuestion mas, tal vez no me explique bien que es lo que pretendia hacer, es en si mandar estos datos hexadecimales: 1E 00 0C D1 00 07 00 01 00 03 00 01 60 00 72 D7,pero al poner
printf("%X%X%X%X%X%X%X",0x1E,0X00,etc.....);
cuando monitoreo la salida del pic me sale los valores 30 4F 31 61 etc... esto quiere decir que solo lo que hace es convertir el 0 en 30 y asi sucesivamente, lo hice con putc(0x00) y ahi si que me da el valor en hexa, pero no me deja poner una cadena de datos en un mismo putc, como puedo hacer esto? por favor,ya llevo dos dias rompiendome la cabeza si pudieran ayudarme un poquito
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: Nocturno en 22 de Marzo de 2008, 03:02:22
Tienes que sacar los caracteres en ascii, prueba así:
printf("%c%c%c%c%c%c%c",0x1E,0X00,etc.....);
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: pocher en 22 de Marzo de 2008, 04:11:52
Que raro.

Si tu haces printf("%X",0x1E) vas a recibir 1E

Si haces printf("%c",0x1E) vas a recibir el caracter no imprimible RS (Separador de Registros)
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: Nocturno en 22 de Marzo de 2008, 04:17:59
Que raro.

Si tu haces printf("%X",0x1E) vas a recibir 1E

Si haces printf("%c",0x1E) vas a recibir el caracter no imprimible RS (Separador de Registros)

Creo que estamos liándonos. Si hace esto printf("%X",0x1E) sacará un "1" y una "E", por eso lee 0x30 y 0x4F.
Si lo que quiere es leer 0x1E tendrá que poner printf("%c",0x1E)
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: pocher en 22 de Marzo de 2008, 04:35:01
No nos estamos liando Manolo, estamos diciendo lo mismo. El caracter RS corresponde en hexadecimal a 0x1E.
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: Nocturno en 22 de Marzo de 2008, 04:38:44
Ah, ok. ¿Y porqué te parece raro?
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: pocher en 22 de Marzo de 2008, 04:55:41
Me parece raro porque dice que hace printf("%X",0x1E) y cuando monitorea la salida del pic le sale el valor 30 en lugar de 1E.
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: Nocturno en 22 de Marzo de 2008, 04:58:07
Claro, es que si hace eso lo primero que sale es un "1", o lo que es igual, 0x30.
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: pocher en 22 de Marzo de 2008, 05:06:19
El 1 es 0x31
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: Nocturno en 22 de Marzo de 2008, 05:18:49
¡Glub!, olvídalo, es que aún no he tomado mi dosis.  :?
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: pocher en 22 de Marzo de 2008, 05:25:47
Nada Manolo, gusto con charlar contigo esta mañana.

Podríamos decirle a scientist que pusiera el programa a ver si lo sacamos del apuro, que seguramente será una tontería, que la mayor parte de las veces son las más dificiles de pillar.
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: scientist en 22 de Marzo de 2008, 12:55:26
ok amigos voy a probar como ustedes dicen,una vezmas gracias por tomarse el tiempo,de verdad que gracias,ahora mismo les digo
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: scientist en 22 de Marzo de 2008, 13:11:28
primero que nada gracias,el problema esta resuelto como decian ustedes,ya que mando:
printf("%c%c%c",0x1E,0x00,0x1C);
manda los valores hexadecimales correspondientes : 1E,00,1C
pero al mandar
printf("%X",0x1E);
recibo: 31, 45, esto quiere decir que 31=1,E=45,cosa chistosa no?, bueno creo que solo me queda decir , tenian razon, jejejeje, gracias amigos
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: Nocturno en 22 de Marzo de 2008, 13:31:49
Ahora que ya he tomado mi dosis, tengo que decir que los dos resultados que has obtenido son coherentes.
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: pocher en 22 de Marzo de 2008, 17:01:32
Pués a mí me ha descolocao. Tanto que me he ido a PROTEUS a probarlo y con printf("%X",0x1E); el VTERM recibe 1E.

En fin me gustaria saber que está pasando. Podrías poner el programa?
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: jfh900 en 22 de Marzo de 2008, 17:21:52
Efectivamente recibes dos caracteres "1E" al poner "%X", ya que recibes el texto "1E" y si pones "%c" recibes un solo caracter que es el caracter "1E".

Un saludo.
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: pocher en 23 de Marzo de 2008, 02:12:08
Vale, al final me había liado yo también. Ahora veo claro cual ha sido el principio de toda esta fiesta.

Inicialmente scientist había dicho:

ok, una cuestion mas, tal vez no me explique bien que es lo que pretendia hacer, es en si mandar estos datos hexadecimales: 1E 00 0C D1 00 07 00 01 00 03 00 01 60 00 72 D7,pero al poner
printf("%X%X%X%X%X%X%X",0x1E,0X00,etc.....);
cuando monitoreo la salida del pic me sale los valores 30 4F
31 61 etc... esto quiere decir que solo lo que hace es convertir el 0 en 30 y asi sucesivamente, lo hice con putc(0x00) y ahi si que me da el valor en hexa, pero no me deja poner una cadena de datos en un mismo putc, como puedo hacer esto? por favor,ya llevo dos dias rompiendome la cabeza si pudieran ayudarme un poquito

... y esto confundió a Manolo ya que tenía que haber dicho que recibía 31 45 etc

En esta segunda intervención scientist ya lo ha dicho bien:

primero que nada gracias,el problema esta resuelto como decian ustedes,ya que mando:
printf("%c%c%c",0x1E,0x00,0x1C);
manda los valores hexadecimales correspondientes : 1E,00,1C
pero al mandar
printf("%X",0x1E);
recibo: 31, 45
, esto quiere decir que 31=1,E=45,cosa chistosa no?, bueno creo que solo me queda decir , tenian razon, jejejeje, gracias amigos

... y ahora me había liao yo.

¡ Problema aclarado !
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: scientist en 23 de Marzo de 2008, 02:13:23
aqui mando el programa,lo que pasa con proteus a mi tambien me paso y es por eso que me confundia al poner el serial monitor y no era lo que me mandaba el proteus, esto pense,por que el proteus su virtual terminal esta como ascci,es por eso que los caracteres al poner printf("%X",0x1E), lo saca como 1E,pero en realidad lo estas viendo como ascci,
#FUSES HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=16934411)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#use standard_io(b)
#byte porta=5
char dato;
int1 flag;

//////////////////////interrupciones!!!!!!!!!!!!!!!!
#int_rda
void secuencia(){

dato=0x00;
  if(kbhit()){
 
    dato=getc();
   
  }
}

///////////////////////   

#int_EXT
void interrupcion_isr(){
flag=1;

}

//////////////////////funciones/////////////////////////
///////////////////sincronizacion////////////////
enter(){
printf("%c%c%c%c%c%c%c%c%c%c",0x1E,0x00,0x0C,0xD1,0x00,0x07,0x00,0x01,0x00,0x03);
printf("%c%c%c%c%c%c",0x00,0x01,0x60,0x00,0x72,0xD7);
}
//////////////////////////////////////////////1E 00 0C D1 00 07 00 01 00 03,00 01 60 00 72 D7
llamar(){
printf("%c%c%c%c%c%c%c%c%c%c",0x1E,0x00,0x10,0x01,0x00,0x23,0x00,0x01,0x00,0x01);
printf("%c%c%c%c%c%c%c%c%c%c",0x0A,0x00,0x39,0x00,0x38,0x00,0x31,0x00,0x31,0x00);
printf("%c%c%c%c%c%c%c%c%c%c",0x30,0x00,0x35,0x00,0x34,0x00,0x32,0x00,0x31,0x00);
printf("%c%c%c%c%c%c%c%c%c%c",0x38,0x05,0x01,0x05,0x00,0x02,0x00,0x00,0x01,0x01);
printf("%c%c%c%c",0x61,0x00,0x6E,0x21);
}

//1E 00 10 01 00 23 00 01 00 01,
//0A 00 39 00 38 00 31 00 31 00,
//30 00 35 00 34 00 32 00 31 00,
//38 05 01 05 00 02 00 00 01 01,
//61 00 6E 21
/////////////////////////////////////
cortar(){
printf("%c%c%c%c%c%c%c%c%c%c",0x1E,0x00,0x0C,0x01,0x00,0x07,0x00,0x01,0x00,0x08);
printf("%c%c%c%c%c%c",0x60,0x01,0x63,0x00,0x11,0x0E);
}
////////1E 00 0C 01 00 07 00 01 00 08 ,60 01 63 00 11 0E
/////////////////////////////////////////////programa///////////////////////////
   void main(){
   delay_ms(333);                  // Espero a que todo se estabilice e ...
   disable_interrupts(global);     // Inicializo el Micro y ...
   disable_interrupts(int_rda);
   disable_interrupts(int_ext);
   
   
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   set_tris_a(0);
   set_tris_c(0b10000000);        // Habilito como entrada RC7 para canal RS232
   set_tris_b(0xFF);
   ext_int_edge(L_TO_H); 
   
   enable_interrupts(global);
   
   enable_interrupts(int_ext);
   
   while(1){
   
   ext_int_edge(L_TO_H);
   
   if (flag==1){
   
   delay_ms(333);
   flag=0;
   porta=0x01;
   enter();
   delay_ms(100);
   enter();
   delay_ms(1000);
   llamar();
   delay_ms(1);
   
       
   }else{
   porta=0x00;
   
   }
}
}
este es el programa ya medio terminado,ya que no me sale la interrupcion esterna,jejeje,habra que afinarlo :)
Título: Re: Comandos hexadecimales en CCS por el puerto serie
Publicado por: ASOGEN09 en 19 de Abril de 2018, 20:55:23
primero que nada gracias,el problema esta resuelto como decian ustedes,ya que mando:
printf("%c%c%c",0x1E,0x00,0x1C);
manda los valores hexadecimales correspondientes : 1E,00,1C
pero al mandar
printf("%X",0x1E);
recibo: 31, 45, esto quiere decir que 31=1,E=45,cosa chistosa no?, bueno creo que solo me queda decir , tenian razon, jejejeje, gracias amigos

Hola tengo una consulta, y si tengo varios puertos seriales como detallaría la linea para indicar por cual puerto serie enviar la info?? gracias..
Título: Re:Comandos hexadecimales en CCS por el puerto serie
Publicado por: KILLERJC en 19 de Abril de 2018, 21:43:26
Si tenes varios, podes nombrar cada uno con un nombre, ejemplo (no valido los pins ni nada por el estilo):

#use rs232(baud=9600,xmit=pin_b3,stream=DEBUG)
#use rs232(baud=9600,xmit=pin_b4,stream=DATA)

Luego para definir por cual sale usas fprintf segun el manual:

Citar
fprintf (stream, cstring, values...)

Y lo usarias asi:

Código: C
  1. fprintf(DEBUG,"%X",0x1E);
  2. fprintf(DATA,"%X",0x1E);

Ahi podes especificar por donde lo envia si es que tenes varios. Si tenes uno solo lo va a enviar por ese y usas el printf solo.