Código para controlar PIC por comunicación RS232 y LCD

¿5 de 5 o 5 de 10?

una vez hise un compilador grafico y pude leer el ADC a nivel byte de un freescale KWISTICK por que el code warrior 10.5 estaba limitado con la licencia.

y me reprobaron por ayudar a un compañero con un proyecto aveces la vida es injusta pero bueno

Trilo-Byte 5 de 5!!! :)
 
hola amigos , tengo algunos problemas y la verdad no encuentro la solución

Hice el siguiente código para poder lograr escribir en el Display pero lo que sucede es que el primer valor que esta marcado en circulo rojo de la imagen que adjunto lo escribe en la posición correcta del codigo ..... pero los siguientes valores ya no los escribe en esa posición si no que lo traslada siempre a otra posición donde esta el numero 11 , me he partido la cabeza y no saber cual puede ser el error
aquí esta el código que utilizo y una imagen del cirtuito , gracias

USO pic 16f877 COMO RECEPTOR Y compilador Pic CCs ESTOY USANDO LAS FUNCIONES GETS , PUTS PARA LA RECOLECCION Y ENVIAR DATOS
ALGUNAS SUGERENCIAS O CAMBIOS QUE TUVIERA QUE REALIZAR ? GRACIAS AMIGOS.

Código:
#include "16f877a.h"
#include <flex_lcd.c>

#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//#include <conio.h>
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7 , bits=8)

char H,S;
char M;
char datorecep[8];

int main( void ){

 lcd_init();
  delay_ms(10);
 while(1){
      M=datorecep;
      lcd_gotoxy(3,1); printf(lcd_putc,"%s",M);
     //delay_ms(500);
      puts(M);

   if(kbhit()){    //Revisamo si hemos recibido algo por el puerto serial.
      
      
      gets(datorecep);

}

return 0;
}


Ver el archivo adjunto 134749
 
tache tache compañero

Código:
char H,S;
[B][COLOR="Red"]char M;[/COLOR][/B]
char datorecep[8];

int main( void ){

 lcd_init();
  delay_ms(10);
 while(1){
      [B][COLOR="Red"]M=datorecep;[/COLOR][/B]
      lcd_gotoxy(3,1); printf(lcd_putc,"%s",M);
     //delay_ms(500);
      puts(M);

   if(kbhit()){    //Revisamo si hemos recibido algo por el puerto serial.
      
      
      gets(datorecep);

no puedes igualar una cadena a un caracter y esperar que un caracter escriba la cadena

si quieres igualar una cadena a otra cadena debes copiar todos los bytes de la cadena o usar STRCPY para poder copiar una cadena a otra ;)



otra cosa que se me paso decir fue:

digamos que tenemos lo siguiente

no puedo hacer esto

Código:
char cadena1[10]="trilobyte"; //recordar que existe el [B]caracter NULO[/B]
char cadena2[10];



cadena2=cadena1;

printf("mi cadena es:%s",cadena2 );

y esperar que se imprima

para que se pueda copiar debes usar STRCPY

y seria correctamente asi:

Código:
char cadena1[10]="trilobyte"; //recordar que existe el [B]caracter NULO[/B]
char cadena2[10];



[B]strcpy(cadena2,cadena1);[/B]

printf("mi cadena es:%s",cadena2 );
 
Última edición:
Hola TRILO-BYTE gracias por responder amigo,

sabes gracias por la lección con respecto a cadenas y caracteres pensé que si se podia hacer eso.

mira hice las correcciones que me recomendaste y tambien agregue el codigo que me diste pero aun asi no se corrige el primer numero si sale en la posicion deseada en el circulo rojo pero los siguientes valores vuelve a ese lugar abajo por defecto ...... te comento que tambien probe poniendo directamente la variable DATORECEP en el printf pero igual sigue con ese problema ......:cry:


Código:
#include "16f877a.h"
#include <flex_lcd.c>

#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//#include <conio.h>
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7 , bits=8)

char H,S;
char M[10];
char datorecep[10];

int main( void ){

 lcd_init();
  delay_ms(10);
 while(1){
      
     strcpy(M,datorecep);
      lcd_gotoxy(3,1); printf(lcd_putc,"%s",M);
     //delay_ms(500);
      puts(M);

   if(kbhit()){    //Revisamo si hemos recibido algo por el puerto serial.
      
      
      gets(datorecep);

}

return 0;
}
 

Adjuntos

  • LCD2.jpg
    LCD2.jpg
    97.6 KB · Visitas: 4
Última edición:
yo pienso que el problema esta en quien envia

por ejeplo si yo mando por el puerto serie

TRILOBYTE

del otro lado debe salir la palabra

TRILOBYTE

pero si yo mando

T
R
I
L
O
B
Y
T
E


del otro lado saldra


T
R
I
L
O
B
Y
T
E


a que voy con esta jalada

cada vez que el CCS usa la funcion GETS recive un caracter y termina de leer cuando recive un retorno de carro en ascii es 13 o en caracter seria : \r

si enviamos letra a letra por el puerto serie en realidad vemos lo siguiente:


T\r
R\r
I\r
L\r
O\r
B\r
Y\r
T\r
E\r


es decir estamos enviando 9 strings

pero si enviamos:

TRILOBYTE\r

enviamos solo 1 string con su respectivo retorno de carro

esto no lo vemos pero el compilador programa el micro para enviar el retorno de carro. por cuestiones de compatibilidad

yo diria que mandaras todo de un tajo sin enviar pedazos

ejemplo

yo enviaria asi:

52535455

que enviar

52
53
54
55
 
Hola, TRYLO-BYTE. Gracias por la pronta respuesta.
Te cuento lo que quiero hacer, así me pueden entender un poco más.

Yo estoy enviando desde el arduino uno, un valor numérico de 0 a 60 segundos con la función println(seconds), donde Seconds es mi variable entera que recolecta de un DS1302 en tiempo real.
Bueno, todo esto está simulado en Proteus, hasta allí todo perfecto.

Luego utilizo un PIC16F877, el cual servirá para la comunicación vía LCD y teclado para ver y manejar resultados.
Entonces para eso utilizo esas funciones puts y gets porque éstas me permiten tener el valor real de lo que envía arduino, ya que si uso putc y getc el pic lo entiende como valores ASCII y se me vuelve todo más engorroso.
En cambio, leyendo otras publicaciones de amigos en este foro, vi que usando puts y gets es más sencillo, ya que guardo el dato como una cadena y así poder luego convertirlo a un valor real más adelante.

Entonces todo estaba bien hasta que quise mostrarlo en el LCD 16x2 y me salen esos errores de no poner el número en la ubicación que necesito, porque también necesitaré poner las horas y los minutos, pero por ahora estoy probando con segundos y no me resulta :( Es allí donde me he estancado.

Espero que con esta breve explicación este más claro lo que deseo hacer usando estas alternativas.

Les envío mi avance con el material completo y así lo podrán revisar para encontrar el error o lo que falta para poder con la solución.

Gracias por su paciencia.
 

Adjuntos

  • ayudaweb.rar
    73.3 KB · Visitas: 4
Última edición por un moderador:
Es que en realidad estás leyendo 4 cadenas.

Porque envías:
52
53
54
55

Son 4, porque si sólo fuera una cadena, enviarías:
52535455

Lo que debes hacer, es leer esas 4 cadenas e imprimir esas 4 cadenas en la LCD.
 
Última edición por un moderador:
Atrás
Arriba