TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ORE en 26 de Junio de 2006, 17:44:47
-
Hola muy buenas,
Ya he comprendido como enviar mensajes desde el PIC al PC vía RS232, con el compilador CCS y un PIC16F877, haciendo uso del MAX232. ¿Pero como envio variables (int, float, etc.) que van variando?
El manual del compilador habla de la instrucción PRINTF([function], string, [values]), pero no se hacer uso de ella para enviar dichas variables.
Un saludo,
-
El truco esta en convertir la variable numérica a texto, por ejemplo el número 56,43 que esta en la variable nNum la convertimos a texto con: fprint("%05.2f\r\n",nNum); esto envia al puerto rs232 una cadena de caracteres que será "56.43" termianada en un retorno de carro "\r" y un salto de linea "\n" para indicar el final de la cadena. El formato de conversión es: %05.2f" representa un número en coma flotante "f" con 5 caracteres "05" rellenado con ceros y dos dígitos decimales "05.2", repasate la funcion fprint donde aparecen todos los formatos de conversión.
Un saludo.
-
Hay que ver ... Redpic te va dar fuerte jejeje, haber para que escribe sus articulos:
http://picmania.garcia-cuervo.com/PICC.htm#RDA1
http://picmania.garcia-cuervo.com/PICC.htm#COMBUF232
-
Hola,
Gracias a ambos, pero la instrucción fprint, me da un error de compilación, ¿no es printf?
Un saludo,
-
Ja, ja, ja :D :D :D
Dani: como sigas haciendome esa publicidad se van a creer que yo sé algo de la RS232 y los PIC's ...
ORE:
Hay tres funciones parecidas en cuyo nombre aparece el printf, y que son la printf propiamente dicha, fprintf y sprintf.
La mas usual es printf("Hola mundo"); que escribe un string en el puerto serie del PIC. A esta misma funcion se le pueden "empotrar" el contenido de una o varias variables dentro del string a enviar. Para ello disponemos de la posibilidad de colocarle dentro unos carácteres especiales que van a indicar que allí deseamos mostrar el contenido de cierta variable.
Por ejemplo si deseamos mostrar este mismo texto de "Hola mundo" pero desde una variable y no desde dentro del printf podemos hacerlo así:
char mistring[]="Hola mundo";
printf("Mi frase favorita es %s",mistring);
Esto dará como resultado que se envíe por el puerto serie la cadena "Mi frase favorita es Hola mundo".
Para cada tipo de variable, entera, flotante, con o sin signo, etc. tenemos su propia forma de indicarle la representación en printf anteponiéndole el consabido %:
• C Character
• S String or character
• U Unsigned int
• x Hex int (lower case output)
• X Hex int (upper case output)
• D Signed int
• e Float in exp format
• f Float
• Lx Hex long int (lower case)
• LX Hex long int (upper case)
• Iu unsigned decimal long
• Id signed decimal long
• % Just a %
printf asume que la salida del string es la STDOUT o sea el puerto serie.
Pero fprintf es igual salvo que podemos indicarle cuál va a ser la salida donde deseamos que nos vuelque el resultado. Al declarar #use_rs232 podemos indicarle un "canal" o nombre de esa salida serie, fprintf puede decirle qué canal en concreto es el que vamos a utilizar.
#use rs232(baud=9600, xmit=PIN_B1,rcv=PIN_B2, stream=CANAL1)
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3, stream=CANAL2)
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7, stream=CANAL3)
fprintf(CANAL2,"Hola mundo");
enviaría nuestro texto al canal CANAL2 definido en la segunda de nuestras declaraciones.
Y por último:
Vemos que con el uso de los "%" podemos "representar las mismas variables de distinta forma.
char mivar='K';
es una variable de tipo char de un solo byte cuyo contenido lo hemos inicializado con el caracter ASCII K, si ahora jugamos con él dentro de printf podemos obtener resultados muy curiosos:
printf("%c %U %H %h",mivar,mivar,mivar,mivar);
enviará al puerto serie el string "K 75 4B 4b"
Como podeís ver printf muestra distintas representaciones de un mismo contenido "formateado".
Esto nos lleva a la última de las funciones que es sprintf.
sprintf es identica a printf salvo que el resultado en vez de lanzarlo por el puerto serie lo guarda en una variable de tipo string que le indiquemos.
char miascii = 'K';
char mistring[3];
mistring = sprintf("%H",miascii);
¿Cuanto vale mistring? Pues "4B\0" (Un asccii '4', un ascii 'B' y un ascii 0) o sea que hemos hecho una conversión de ASCII a integer y de éste a un string hexadecimal de un solo salto. :mrgreen: :mrgreen: :mrgreen:
(Como siempre. Me ha salido otra novela :D :D :D)
Un saludo per tutti.
Edito: Este post me lo copio y lo pongo en Mis Funciones favoritas en CCS C (http://www.todopic.com.ar/foros/index.php?topic=4641.0)
-
Joer, si es que te ha salido todo un tutorial cojonudo.
Saludos.
-
Hola Red PIC,
Tomaré muy buena nota de este post.
Sois unos fenómenos del arte del microcontrolador y ccs.
Un saludo,
-
Como puedo hacer si quiero enviar un numero de 8 bits desde Visual basic al PIC? si quiero enviar 255 me envia el 2 luego 5 y 5. del PIC a Visual Basic es mas simple ya que voy concatenando. Igual si tienes sugerencias para ambos casos, bienvenida sea.
-
Tal vez esta pregunta deberias hacerla en el foro de VB.
un saludo
-
Buenas Fixxxyto,
es muy simple:
la información se establece bajo el formato ASCII
tenemos...
1-Enviar 255 al pic
com1.Output=chr$(255)
Esta forma de envío es típica para formalizar la trama de error (norm. +XOR)
2-El pic envía 100 al pc (de golpe)
TXREG1=.100
el pc recibe en una variable string (varstring)
varstring=com1.Input ------> varstring=d
varstring=asc(com1.input) --> varstring=100
saludos