Autor Tema: Ahora no me cuenta un caracter de una cadena.  (Leído 1808 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado gapsna

  • PIC10
  • *
  • Mensajes: 20
Ahora no me cuenta un caracter de una cadena.
« en: 26 de Febrero de 2011, 15:45:06 »
Hola a todos, estoy con un trabajo en el cual tengo que leer unos datos por rs232 y mostrarlos en un lcd con el pic, aun no voy en la parte del rs232, estoy tratando de imprimir una frace en el lcd, no quise usar las funciones predeterminadas en el ccs, y ahora estoy teniendo problemas por eso. Hice mi funcion para inicializar, funciona, tengo una funcion para imprimir una cadena, imprime (algo ilegible). lo que estoy tratando es mandar una cadena declarada y que la imprima, el problema es que imprime caracteres extranios. les dejo el codigo si alguien me puede ayudar. Muchas gracias.
aclaro que uso un pic 18f4455.

codigo:

#include "C:\Users\PsychoBear\Documents\UPB\perifericos\lab 3\testeo rs232\lcd solo\lcd_ini\lcd_ini1.h"

//#use RS232(BAUD=4800,RCV=PIN_C7,XMIT=PIN_C6,PARITY=N,BITS=8)

void ini_lcd();
void escribo(*cadena);

char cadena[16]="Hola gente";
int j=0;
//int *buffer = cadena;


void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_32|RTCC_8_bit);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(False);

   // TODO: USER CODE!!
   delay_ms(30);
   ini_lcd();
   escribo(*cadena);
   for(;;){


   }

}

void escribo(*dato){
while(j<16){
output_high(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(*dato[j]);//imprime
output_low(pin_D5);//E
delay_ms(30);
j++;
}
}

void ini_lcd(){

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//limpia lcd
output_low(pin_D5);//E
delay_ms(30);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//function set
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//display on/off control
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(59);//entry mode seet
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(15);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(1);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(6);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(200);


}
« Última modificación: 26 de Febrero de 2011, 20:47:53 por gapsna »

Desconectado culebrasx

  • PIC10
  • *
  • Mensajes: 39
Re: no me imprime la cadena en el lcd
« Respuesta #1 en: 26 de Febrero de 2011, 19:36:56 »
¿por que no quieres utilizar las funciones de ccs para este caso? para otros si que es cierto que casi uno prefiere hacerselas por uno mismo, pero las de lcd funcionan muy bien,ademas hay por ahi otras funciones mas versatiles hechas por gente del foro(creo...jjeje) como pueden ser flex_lcd para utilizar modos de 4 bits y poder configurar a gusto los pines de cada funcion...

es que ahora mismo no recuerdo muy bien la inicialización del lcd....

Desconectado gapsna

  • PIC10
  • *
  • Mensajes: 20
Re: no me imprime la cadena en el lcd
« Respuesta #2 en: 26 de Febrero de 2011, 20:37:37 »
¿por que no quieres utilizar las funciones de ccs para este caso? para otros si que es cierto que casi uno prefiere hacerselas por uno mismo, pero las de lcd funcionan muy bien,ademas hay por ahi otras funciones mas versatiles hechas por gente del foro(creo...jjeje) como pueden ser flex_lcd para utilizar modos de 4 bits y poder configurar a gusto los pines de cada funcion...

es que ahora mismo no recuerdo muy bien la inicialización del lcd....

hahahah no se, supongo que queria recordar el uso del lcd, lo bueno es que ya lo arregle, y ya me sale bien, incluso agrege la parte del rs232 y funciona, ahora lo que no me funciona es guardar los dados que lee del rs232 en una cadena y luego recorrerla. lo que envio con el pc por el rs232 es algo como:

$GPGGA,195002.000,0614.4766,N,07535.4178,W,1,08,1.0,1534.5,M,1.3,M,,0000*42

que son los datos que envia un gps.
lo que intento hacer en el codigo es: guardar los datos en cadena1 (esto ya comprove que funciona),  con un if cuento el numero de comas (,) que le llega a la cadena (no se si funciona), una vez finaliza el if (kbhit()) recorro la cadena1 contando de nuevo las comas, cuando el contador va en 2 (que es cuando inicia la latitud y la lingitud) mando el valor de la cadena a partir de ese punto a que la meustre en el lcd (no funciona).
Pongo el codigo, en caso de que me puedas ayudar.

#include "C:\Users\PsychoBear\Documents\UPB\perifericos\lab 3\testeo rs232\lcd solo\lcd_ini\lcd_ini1.h"
#use RS232(BAUD=4800,RCV=PIN_C7,XMIT=PIN_C6,PARITY=N,BITS=8)

void ini_lcd();
void escribo(cadena);

char c,cadena1[100],numcoma=0;
int j=0,i=0,contcoma=0,contcoma2=0;
//int *buffer = cadena;


void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_32|RTCC_8_bit);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(False);

   // TODO: USER CODE!!
   delay_ms(30);
   ini_lcd();
   //escribo(*cadena);
   for(;;){
   if (kbhit())
   {
      j++;
      c=getc();
      cadena1[j]=c;
      if(c==',')
         contcoma++;
     // sprintf(numcoma, "%d", contcoma);
    // numcoma=(char)contcoma;
     // escribo(numcoma);
      //escribo(c);
      //delay_ms(1);
   }
 if(contcoma>=11){
      for(i=0;i<=j;i++){
         if(cadena1==',')
          contcoma2++;
         if(contcoma2>=2)
            escribo(cadena1);
      }
   }
}

}

void escribo(cadena){
//while(j<16){
output_high(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(cadena);//imprime
output_low(pin_D5);//E
//delay_ms(5);
j++;
//}
}

void ini_lcd(){

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//limpia lcd
output_low(pin_D5);//E
delay_ms(30);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//function set
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//display on/off control
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(59);//entry mode seet
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(15);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(1);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(6);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(200);


}

muchas gracias.

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Ahora no me cuenta un caracter de una cadena.
« Respuesta #3 en: 26 de Febrero de 2011, 20:52:51 »
Hola amigo, yo por lo general utilizo también mi propia rutina para control del LCD acá te la comparto, un ejemplo para LCD a 4 bits o a 8 bits.

saludos.
Código: [Seleccionar]
#include <16F873A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT

#byte porta=5 //Definicion de variables del pic
#byte portb=6
#byte adcon1=0x1f

#define puerto_lcd portb
#define rs1 porta,0 //Definicion de bits
#define e1 porta,1
#define rs2 porta,2
#define e2 porta,3

int i; //Variable de 8 bit

byte const tabla1[17]={"Prueba LCD 8 bit"}; //Tabla que contiene la palabra
byte const tabla2[17]={"Prueba LCD 4 bit"}; //para el LCD
byte const caracter1[8]={ 0b10000,
0b10100,
0b10010,
0b11111,
0b00010,
0b00100,
0b00000,
0b00000,};


///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void display_8b(short valor, int respaldo) //Rutina que envia al LCD una palabra de control o dirección
{
if(valor == 0)
{bit_clear(rs1);}
else
{bit_set(rs1);}

puerto_lcd = respaldo;

bit_set(e1);
delay_cycles(10);
bit_clear(e1);
delay_ms(1);
}
///////////////////////////////////////////////////////////////////////////////
void display_4b(short valor , int respaldo) //Rutina que envia al LCD una palabra de control o dirección
{
int respaldo2;

if(valor == 0)
{bit_clear(rs2);}
else
{bit_set(rs2);}

puerto_lcd &= 0x0f;
respaldo2 = respaldo & 0xf0 ;
puerto_lcd |= respaldo2;

bit_set(e2);
delay_cycles(10);
bit_clear(e2);

puerto_lcd &= 0x0f;
respaldo2 = swap(respaldo) & 0xf0 ;
puerto_lcd |= respaldo2;

bit_set(e2);
delay_cycles(10);
bit_clear(e2);

delay_ms(1);
}
///////////////////////////////////////////////////////////////////////////////
void mensa_1_4b()
{
display_4b(0 , 0x80); //Dirección donde se escribirá el mensaje

for(i=0;i<sizeof(tabla2)-1;i++) //Ciclo que envía la palabra "prueba LCD"                                                           
{
display_4b(1 , tabla2[i]);
}
display_4b(0 , 0xc8); //Dirección donde se escribirá el mensaje
display_4b(1 , 0);
}
///////////////////////////////////////////////////////////////////////////////
void mensa_1_8b()
{
display_8b(0 , 0x80); //Dirección donde se escribirá el mensaje

for(i=0;i<sizeof(tabla1)-1;i++) //Ciclo que envía la palabra "prueba LCD"                                                           
{
display_8b(1 , tabla1[i] );
}
display_8b(0 , 0xc8); //Dirección donde se escribirá el mensaje
display_8b(1 , 0);
}
///////////////////////////////////////////////////////////////////////////////
void ini_lcd_8b()
{
display_8b(0 , 0b00111000); //Codigo para display a 8 bits
display_8b(0 , 0b00001100); //Codigo que activa el display
display_8b(0 , 0b00000110); //Codigo que define el cursor para
//Que se desplace hacia la derecha
//display_8b(0 , 0b00000111)//Codigo que define el cursor para
//que desplace hacia la izquierda
display_8b(0 , 1); //Limpia el display
delay_ms(2);
}
///////////////////////////////////////////////////////////////////////////////
void ini_lcd_4b() //modo de configuracion para 4 bit
{
int i;

delay_ms(15);
bit_clear(rs2);
puerto_lcd = 0b00110000; //se envia 3 veces este binario

for(i=1;i<=3;i++)
{
delay_cycles(10);
bit_set(e2);
delay_cycles(10);
bit_clear(e2);
delay_ms(5);
}
puerto_lcd = 0b00100000;
delay_cycles(10);
bit_set(e2);
delay_cycles(10);
bit_clear(e2);
delay_ms(5);

display_4b(0 , 0b00101000); //Codigo para display a 4 bits
display_4b(0 , 0b00001100); //Codigo que activa el display
display_4b(0 , 0b00000110); //Que se desplace hacia la derecha
//display_4b(0 , 0b00000111) //Codigo que define el cursor para
//que desplace hacia la izquierda
//todo el mensaje
display_4b(0 , 1); //Limpia el display
delay_ms(2);
}
///////////////////////////////////////////////////////////////////////////////
void crear_carac_8b()
{
for(i=0x40;i<=0x48;i++)
{
display_8b(0 , i);
display_8b(1 , caracter1[i-0x40]);
}
}
///////////////////////////////////////////////////////////////////////////////
void crear_carac_4b()
{
for(i=0x40;i<=0x48;i++)
{
display_4b(0 , i);
display_4b(1 , caracter1[i-0x40]);
}
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

#zero_ram //Borrado de la memoria ram

void main() //Rutina principal
{
set_tris_a(0b010000); //Configuracion de entradas y salidas del puerto A
set_tris_b(0b00000000); //Configuracion de entradas y salidas del puerto B
port_b_pullups(true); //Habilitación de las resistencias pull-ups
adcon1=(0x07); //Configuracion del tmr1

porta = 0; //Porta inicia en 0
puerto_lcd = 0; //Portb inicia en 0

delay_ms(2);
ini_lcd_4b();
ini_lcd_8b();
crear_carac_8b();
crear_carac_4b();

while(true) //Rutina general
{
delay_ms(500);
mensa_1_4b();
mensa_1_8b();
}
}
///////////////////////////////////////////////////////////////////////////////


Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ahora no me cuenta un caracter de una cadena.
« Respuesta #4 en: 26 de Febrero de 2011, 22:56:36 »
No entiendo porque reniegan usando rutinas propias para el LCD, cuando en cada lenguaje alguien ya lo hizo y depuro para usarlo como librería...
Es sadomasoquismo??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.