TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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.
-
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
-
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.
-
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
-
Perfecto, es justo lo que queria :-/
Muchas gracias!
Un saludo.
-
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
-
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.
-
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).
-
ok,entendido,gracias por su tiempo,ya que como siempre digo,el tiempo es lo mas valioso :)
-
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
-
Tienes que sacar los caracteres en ascii, prueba así:
printf("%c%c%c%c%c%c%c",0x1E,0X00,etc.....);
-
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)
-
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)
-
No nos estamos liando Manolo, estamos diciendo lo mismo. El caracter RS corresponde en hexadecimal a 0x1E.
-
Ah, ok. ¿Y porqué te parece raro?
-
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.
-
Claro, es que si hace eso lo primero que sale es un "1", o lo que es igual, 0x30.
-
El 1 es 0x31
-
¡Glub!, olvídalo, es que aún no he tomado mi dosis. :?
-
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.
-
ok amigos voy a probar como ustedes dicen,una vezmas gracias por tomarse el tiempo,de verdad que gracias,ahora mismo les digo
-
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
-
Ahora que ya he tomado mi dosis, tengo que decir que los dos resultados que has obtenido son coherentes.
-
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?
-
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.
-
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 !
-
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 :)
-
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..
-
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:
fprintf (stream, cstring, values...)
Y lo usarias asi:
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.