Programas para Pic C Compiler (Tutorial)

Gracias, D@rkbytes, estuve modificando el programa desde la mañana de hoy y ya tengo algo mejor.
Lo que estoy haciendo es tratar de visualizar en la LCD el valor de un slider de mi teléfono android (aplicación hecha en app inventor) y estuve viendo la función gets(); que se espera hasta tener el \r (retorno de carro) y ya logré que se visualicen los números , es decir:
1.- Cuando envío p.e. 120 a través del bluetooth terminal (lo mismo que la hyperterminal de windows) y le doy enter y se visualiza el 120 en la LCD.
2.- Ya estando el 120 en pantalla pongo 1 y se borra todo y sale el 1, justo lo que quiero.

Ahora lo que no sé es cómo enviar el retorno de carro a través de la aplicación en app inventor. Lo que tengo es esto de la aplicación en app inventor:
Sin título.png

y mi código ya funcionando en el pic16f887 en:

Código:
while(1==1){// Ciclo infinito
 
    gets(string);
    x = atoi(string); // x is now 123
    lcd_gotoxy(1,1);
    printf(lcd_putc,"%u   ",x);

   }

En la parte del programa de bloques "join" he intentado enviar primeramente la ubicación el slider y después el texto equivalente al \r de las siguientes formas:
1.- \r
2.- '\r'
3.- "\r"

Pero con ninguna de esas formas logro obtener lo que quiero, YO sé que mi problema está en enviar el retorno de carro después de la posición del slider para que gets(); haga su trabajo después del retorno de carro.

Por la ayuda que me puedan dar muchas gracias.
 
En la parte del programa de bloques "join" he intentado enviar primeramente la ubicación del slider y después el texto equivalente al \r de las siguientes formas:
1.- \r
2.- '\r'
3.- "\r"

Pero con ninguna de esas formas logro obtener lo que quiero.
Yo sé que mi problema está en enviar el retorno de carro después de la posición del slider para que gets(); haga su trabajo después del retorno de carro.
El ASCII de Retorno de Carro (Carriage Return) es el 13.
Prueba enviando ese valor, debe funcionar.
 
Hola a todos, tengo que representar el valor de una variable en un display led de dos o aun mejor tres digitos, pero no logro hacerlo.
Uso ccs, mi pregunta es, no hay una libreria como el del LDC para usar display led??Gracias.
 
marcelo2112 dijo:
Hola a todos, tengo que representar el valor de una variable en un display led de dos o aun mejor tres digitos, pero no logro hacerlo.
Uso ccs, mi pregunta es, no hay una libreria como el del LDC para usar display led??Gracias.
Hola Tengo un ejemplo que se puede utilizar, es fácil de modificar para otro pic o más pantallas.
 

Adjuntos

  • PIC16F873A-Display 7SEG.rar
    16 KB · Visitas: 69
Que tal compañeros del foro, solo una duda, que por mas que leo el manual de ccs no logro entender el funcionamiento de las siguientes lineas de código:

Código:
do{                              // Espera por el comando1
   gets(comando);
   if(!strcmp(comando,comando1))break;
   }while(1);

Lo que quiero es esperar en un pic receptor, hasta obtener toda la cadena de caracteres.

Sin más de momento reciban saludos.
 
¿Qué tal compañeros del foro? Sólo una duda, que por mas que leo el manual de ccs no logro entender el funcionamiento de las siguientes lineas de código:

Código:
do{                              // Espera por el comando1
   gets(comando);
   if(!strcmp(comando,comando1))break;
   }while(1);
Lo que quiero es esperar en un pic receptor, hasta obtener toda la cadena de caracteres.
Mira el ejemplo adjunto.
Se trata de dos programas. "Transmisor y Receptor"
Se envían dos cadenas diferentes, una para encender un LED y otra para apagarlo.

Ambos códigos están comentados para que puedas comprender el funcionamiento de las instrucciones.

Suerte.
 

Adjuntos

  • 16F628A Recibir y comparar cadenas.rar
    33 KB · Visitas: 69
Muchas gracias D@rkbytes, lo que pasa es que ese código lo vi en un programa y como no sabía cual era su función pensé que era un bucle en el que se esperaba hasta recibir el string completo, lejos de compararlo, y una vez recibiendolo procesaba la info. Eso es lo que quiero hacer con algo como una bandera o algo por el estilo, nada más que hasta ahora no he tenido mucha suerte.
 
Mendek. solucionaste el problema de el envió del retorno de carro con app inventor. si lo hiciste como lo
concatenaste el retorno de carro con el slideer. yo puse en su lugar en numero 13, sin embargo a la hora de correr el app me da un error.
 
Código:
 set_adc_channel(0);                  
   delay_ms(10);    
   temperatura= (float)read_adc()/2;

Bueno pues esta es mi prgunta:
Mirando por san google me encuentro en un programa la instruccion para la temperatura, cuando yo hize unas pruebas con LM35 lo que hacia era crear una variable int y otra float y con eso controlaba la temperatura pero en esta instruccion aparece un float delante de read_adc() y luego se divide por 2 y no se interpretar esta instruccion.

Alguien me la puede explicar para comprenderla?.

Se me olvida decir que la variable temperatura esta declarada como float.
 
miglo dijo:
Código:
 set_adc_channel(0);                  
   delay_ms(10);    
   temperatura= (float)read_adc()/2;

Bueno pues esta es mi prgunta:
Mirando por san google me encuentro en un programa la instruccion para la temperatura, cuando yo hize unas pruebas con LM35 lo que hacia era crear una variable int y otra float y con eso controlaba la temperatura pero en esta instruccion aparece un float delante de read_adc() y luego se divide por 2 y no se interpretar esta instruccion.

Alguien me la puede explicar para comprenderla?.

Se me olvida decir que la variable temperatura esta declarada como float.

el convertidor analogo a digital almacena el valor en una variable de tipo unsigned int es decir 0 a 65535, pero claro que no llega a 65535 solo guarda un valor dependiendo de los bits de conversion, ejemplo

Si tu microcontrolador tiene una resolucion del ADC de 10 bit entonces tienes un rango de 0 - 1023,
y como no puedes guardar el valor en una variable de tipo Char ya que este es de un rango de 0 - 255, entonces usa una variable de tipo unsigned int (0-65535),

entonces con la intruccion -> (float) variable

temperatura = (float)read_adc()/2;

estas convirtiendo o transformando esa variable de tipo unsigned int a un float pero sin cambiar el resultado de la conversión que obtuviste al leer el adc para asi , realizar operaciones con decimales.

Ejemplo:

unsigned int var;
float temperatura;

var = read_adc(); //

//var = 1024

temperatura = (float)var / 2;

//(float)var = 1024.00 / 2 = 512.00

//temperatura = 512.00


¡Saludos!
 
usar algo como "(tipo)variable" es una conversión explicita de tipos, supongo que tu variable Temperatura es tipo float, si realizas read_adc()/2 el valor devuelto por read_adc() se divide en 2, pero si es un numero impar perderás ese 0,5 ya que es un entero y el programa interpreta la operación con enteros. al declarar (float)read_adc() indicas que se convierte explícitamente el valor devuelto en un tipo float, así al realizar la división, el programa sabe que deseas tratarlo como un tipo float en lugar de un entero y el resultado puede entregar decimales.
 
el convertidor analogo a digital almacena el valor en una variable de tipo unsigned int es decir 0 a 65535, pero claro que no llega a 65535 solo guarda un valor dependiendo de los bits de conversion, ejemplo

Si tu microcontrolador tiene una resolucion del ADC de 10 bit entonces tienes un rango de 0 - 1023,
y como no puedes guardar el valor en una variable de tipo Char ya que este es de un rango de 0 - 255, entonces usa una variable de tipo unsigned int (0-65535),

entonces con la intruccion -> (float) variable

temperatura = (float)read_adc()/2;

estas convirtiendo o transformando esa variable de tipo unsigned int a un float pero sin cambiar el resultado de la conversión que obtuviste al leer el adc para asi , realizar operaciones con decimales.

Ejemplo:

unsigned int var;
float temperatura;

var = read_adc(); //

//var = 1024

temperatura = (float)var / 2;

//(float)var = 1024.00 / 2 = 512.00

//temperatura = 512.00


¡Saludos!

Te agradezco tu explicacion pero no lo acabo de entender, yo he comentado que en el programa que vi la variable de temperatura estaba declarada como tipo (float) y solamente esta declarada esa variable, no hay declarada ninguna otra que sea de tipo int.

En el ejemplo pones una de tipo unsigned int y otra de tipo float, que es como yo lo hecho alguna vez con el protoboard para hacer pruebas, pero en este programa solo esta declarada esta variable y es de tipo float, supongo que asi se ahorra memoria y eso es lo que quiero comprender pero no entiendo el (float) delante de la funcion read_adc()/2; como lo explicas.
 
¿Leíste lo que escribí?

Hay dos tipos de conversiones, las implícitas que no se declaran y se realizan automáticamente, por ejemplo convertir un tipo char a int cuando se realiza una multiplicación con un tipo int y luego se realiza la operación.

La explicitas se declaran usando (tipo)variable y son necesarias para evitar confusiones al compilador y que traten una como otra.

read_adc() devuelve un tipo, según la librería será un tipo especifico, en este caso sería un unsigned int.
float temperatura está declarada, pero si a un unsigned int le haces división a 2 como lo indicas, no se hace con números flotantes, se hace con enteros y el resultado pasa al float por conversión implícita pero sin decimales ya que los valores eran enteros y el resultado de la operación fue un entero.

Al hacer (float)read_adc()/2 se convierte explícitamente el valor de read_adc() a un float, luego se realiza la división (2 se convierte a float implícitamente, pero deberías escribir lo como 2f, el sufijo f es para declarar que es constante tipo float), el resultado de esta operación es un tipo float, así que conserva los decimales.
 
Última edición:
¿Leíste lo que escribí?

Hay dos tipos de conversiones, las implícitas que no se declaran y se realizan automáticamente, por ejemplo convertir un tipo char a int cuando se realiza una multiplicación con un tipo int y luego se realiza la operación.

La explicitas se declaran usando (tipo)variable y son necesarias para evitar confusiones al compilador y que traten una como otra.

read_adc() devuelve un tipo, según la librería será un tipo especifico, en este caso sería un unsigned int.
float temperatura está declarada, pero si a un unsigned int le haces división a 2 como lo indicas, no se hace con números flotantes, se hace con enteros y el resultado pasa al float por conversión implícita pero sin decimales ya que los valores eran enteros y el resultado de la operación fue un entero.

Al hacer (float)read_adc()/2 se convierte explícitamente el valor de read_adc() a un float, luego se realiza la división (2 se convierte a float implícitamente, pero deberías escribir lo como 2f, el sufijo f es para declarar que es constante tipo float), el resultado de esta operación es un tipo float, así que conserva los decimales.

Ahora si lo he comprendido mejor, sobretodo por el ultimo parrafo. Gracias
 
Atrás
Arriba