Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

21/06/2013 #81

Avatar de XSGAV

hola, gracias por responder aquí te dejo el archivo adjunto
21/06/2013 #82
Moderador

Avatar de D@rkbytes

Prueba cambiando estas partes de la cabecera en tu programa por esto...
#use delay (internal = 4000000)
#define use_portb_lcd true
#include <lcd.c>

Suerte.
21/06/2013 #83

Avatar de XSGAV

D@rkbytes dijo: Ver Mensaje
Prueba cambiando estas partes de la cabecera en tu programa por esto...
#use delay (internal = 4000000)
#define use_portb_lcd true
#include <lcd.c>

Suerte.
D@rkbytes problema solucionado, al parecer la librería CCS de la versión inferior a 4 causa problemas, la librería que te adjunte venia en una nueva versión de CCS la cual no había probado además me reconoció sin problemas la instrucción #use delay (internal = 4000000)

Gracias
21/06/2013 #84


Tengo una duda respecto a lo desarrollado en este tema, por ahí nombran la librería "flex_lcd.c", estaban hablando de la "lcd.c" de esta última sé que tiene algunas limitaciones, no se puede elegir libremente la asignación de los pines del micro con las líneas del LCD, si o si deben ir todas las líneas a un mísmo puerto, además las líneas datos 4 bit's, deben ser los bits más significativo del puerto.
Será que en "flex_lcd.c" esta limitación, no existe, y que tambien podría emplear pines de diversos puertos para conectar con el LCD, ¿es asi?, alguien me aclara...
21/06/2013 #85
Moderador

Avatar de D@rkbytes

Si se pueden modificar en la librería los pines de control y los de datos.
Léela un poco y verás que existen comentarios en ella mencionando lo que se tiene que hacer.

Personalmente yo la he modificado para usar la pantalla por el puerto A y con los pines que yo elija.

Y si, los pines que se usan en configuración de 4 Bits, son los bits más significativos del puerto,
pero también se puede usar por ejemplo RA3, RA2, RA1 y RA0 cómo el bus de datos de 4 Bits.

Saludos.
16/01/2014 #86


Problemas con Display LCD en CCS
Hola buen dia a todos, como verán acá vuelvo con otro problema con mis queridos pics

Esta vez me toco con un pic 16f877a, aclaro que el pic funciona joya, siempre y cuando sea una rutina normal ej prender leds ..., ahora el problema es cuando quiero utilizar un Display de 16x2, declaro todo para el manejo del display.

#include <lcd.c>

#define LCD_DATA_PORT getenv("SFR:PORTD")

#define LCD_ENABLE_PIN PIN_D0 ////
#define LCD_RS_PIN PIN_D1 ////
#define LCD_RW_PIN PIN_D2 ////
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7

Compila, todo bien, en proteus aclaro que anda, pero al grabar el PIC y querer hacerlo andar, ahí ni siquiera arranca. El display anda porque lo probé con un 16f84a, asi que de a poco fui borrando lineas para ver que onda, y me encontré que al compilar alguna instrucción de la librería del LCD el PIC no arrancaba ej:

void main()
{
lcd_gotoxy(1,1);
printf(lcd_putc,"hola");

while(true)
{
output_low(LED);
delay_ms(DELAY);
output_high(LED);
delay_ms(DELAY);
}

}

si pongo eso en el programa no arranca directamente, pero si borro las lineas que utilizan el lcd " lcd_gotoxy(1,1); printf(lcd_putc,"hola"); ", el pic arranca y hace parpadear el led

El compilador que uso es el CCS " pic c compiler v4.130" y para grabar tengo un pickit2 clone.

Espero que alguien me pueda dar una mano con esto, mañana voy a seguir probando hasta que ande .... muchas gracias, Saludos a todos .
Archivos Adjuntos
Tipo de Archivo: txt libreria LCD.txt (13,9 KB (Kilobytes), 25 visitas)
17/01/2014 #87
Moderador

Avatar de D@rkbytes

IxMagoxI dijo: Ver Mensaje
Hola buen dia a todos, como verán acá vuelvo con otro problema con mis queridos pics

Esta vez me toco con un pic 16f877a, aclaro que el pic funciona joya, siempre y cuando sea una rutina normal ej prender leds ..., ahora el problema es cuando quiero utilizar un Display de 16x2, declaro todo para el manejo del display.
Te falta inicializar la pantalla.
Tampoco es necesario que declares el puerto D y los pines para la pantalla.
Esa configuración es la que usa por defecto el compilador para el 16F877A
En el código tampoco se ven los fuses, el periodo para DELAY, ni que pin escogiste para el LED.

Quizás obviaste esos detalles al subir tu programa, y sólo por probar tu librería compilé tu programa, pero simplificado.

Le cambié el nombre al archivo que subiste por lcd_prueba.c y lo coloqué dentro de la carpeta del proyecto.
Código:
#include <16f877a.h>
#fuses   NOBROWNOUT
#use     delay(crystal = 4MHz)

#include "lcd_prueba.c" // Librería bajo prueba

#define LED PIN_B7
#define DELAY 500

void main()
{
   lcd_init();
      lcd_putc("\fhola");

   while(true)
   {
      output_toggle(LED);
         delay_ms(DELAY);
      }
   }
Y físicamente funciona todo sin ningún problema.
Agrega la instrucción lcd_init(); en el main del código para que funcione tu programa.

Suerte.
17/01/2014 #88


D@rkbytes dijo: Ver Mensaje
Te falta inicializar la pantalla.
Tampoco es necesario que declares el puerto D y los pines para la pantalla.
Esa configuración es la que usa por defecto el compilador para el 16F877A
En el código tampoco se ven los fuses, el periodo para DELAY, ni que pin escogiste para el LED.

Quizás obviaste esos detalles al subir tu programa, y sólo por probar tu librería compilé tu programa, pero simplificado.

Le cambié el nombre al archivo que subiste por lcd_prueba.c y lo coloqué dentro de la carpeta del proyecto.
Código:
#include <16f877a.h>
#fuses   NOBROWNOUT
#use     delay(crystal = 4MHz)

#include "lcd_prueba.c" // Librería bajo prueba

#define LED PIN_B7
#define DELAY 500

void main()
{
   lcd_init();
      lcd_putc("\fhola");

   while(true)
   {
      output_toggle(LED);
         delay_ms(DELAY);
      }
   }
Y físicamente funciona todo sin ningún problema.
Agrega la instrucción lcd_init(); en el main del código para que funcione tu programa.

Suerte.
Hola buen dia D@rkbytes, gracias por contestar, ahi compiler el codigo que me pasaste y solo le fataba arriba de #include <lcd.c> esta linea " #define use_portD_lcd_TRUE " sino me tiraba error, lei por ahi y faltaba esa declaracion, lo programe y salio andando ... igual raro ayer estaba todo y no funcionaba jaja, medio raro pero bue ...
Dejo el codigo de como esta funcionando ahora:

-------------main.c--------------------------------------------------------------------

Código PHP:
#include <main.h>

#define use_portD_lcd_TRUE
#include <lcd.c> // Librería bajo prueba


void main()
{

      
lcd_init();
      
lcd_gotoxy(1,1);
      
printf(lcd_putc,"hola");

   while(
true)
   {
      
output_toggle(pin_b1);
         
delay_ms(200);
      }
   } 
------------------------main.h--------------------------------------------------
Código PHP:
#include <16F877A.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=4000000) 
Muchas gracias a todos, Saludos.
19/03/2014 #89


Problemas con Display LCD en CCS
Hola estoy haciendo un programita en el cual quiero grabar unas cadenas en variables y luego estas variables sacarlas por la pantalla de LCD pero no puedo lograrlo. Estoy usando CCS

esto es lo que estoy haciendo y no funciona:

unsigned char cadena;

cadena="Texto LCD";

printf(LCD_PUTC, "%s",cadena);
19/03/2014 #90

Avatar de TRILO-BYTE

aver aver aver

deja me desenpolvo en C

tu programa deberia ser asi:

char cadena[10]="un perro"; // darle una longitud a la cadena

printf(lcd_putc,"%s",cadena); //hacer uso de lcd e imprimir la cadena


te explicare como hacer uso del PRINTF en CCS

PRINTF


el printf en CCS esta dado del siguiete modo

printf(funcion con char,"cadena con formato");

donde en realidad lo que hace este formato es meter el formato dentro de una funcion que escribe caracter por caracter.

en este caso la funcion sera: lcd_putc();
lo que hace esta funcion es imprimir solo 1 caracter
¿que es lo que hace el printf?
solo da formato a la cadena y caracter a caracter lo envia a la funcion lcd_putc()

¿como darle formato a una cadena entera?
usando SPRINTF como su nombre lo indica es un string printf, lo que hace a diferencia del printf es que da formato a una cadena entera y no caracter a caracter

¿como la uso?
debo declarar una cadena de caracteres y el sprintf lo que hace es darle formato a mi cadena pero no la imprime en la pantalla por que no estoy mandando llamar lcd_putc();

ejemplo:

char cadena[20];
int numero=10;

sprintf(cadena,"Trilobyte = %d",numero);

ahora la cadena de caracteres contiene todo el formato que seria
Trilobyte =10

y si queremos imprimirla en una LCD usariamos el printf con su funcion lcd_putc

quedaria asi:

printf(lcd_putc,"%s",cadena);
ahora lo que veriamos en la LCD seria :Trilobyte =10

¿por que saber esto?

por que muchos se confunden y creen que el printf sirve para imprimir en la LCD o en el UART
pero en realidad NO en realidad imprimen una cadena con formato o una serie de caracteres con formato.

que se mande llamar una funcion dentro del printf es diferente.

bueno esto es util cuando no usamos CCS y queremos usar la LCD en otro compilador de otro microcontrolador
19/03/2014 #91


Gracias por tu respuesta, pero me pareces que me falto explicar una cosa o no lo explique bien.
Esto es lo que tengo yo:

Código:
void escLCDProg(pos){
char texto[5];

texto[1]="1-texto1";
texto[2]="2-texto2";
texto[3]="3-texto3";
texto[4]="4-texto4";


             lcd_init();
             lcd_gotoxy(1,1);         //Visualiza en el lcd
             lcd_putc("\f");
             printf(LCD_PUTC, "%s", texto[pos]);
             
   
}
Es decir, dependiendo del valor de "pos" que imprima el texto correspondiente en el LCD
19/03/2014 #92

Avatar de jvk85321

Código:
printf(LCD_PUTC, "%s", texto[pos]);
LCD_PUTC va en minusculas

---------- Actualizado después de 11 minutos ----------

Adjunto un mini codigo y circuito com sample

Código:
#include <16F877A.h> 
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOPUT,NODEBUG,NOBROWNOUT,NOCPD,NOWRT 
#use delay(clock=20000000) 
 
#include <LCD.C> 
 
#byte TRISA = 0x85 
#byte PORTA = 0x05 
#byte TRISB = 0x86 
#byte PORTB = 0x06 
 
INT FLAG=0, MEN=0x01, FLAG1=0; 
 
void presentacion() 
{ 
  printf(lcd_putc,"\f CLASE ROBOTICA"); 
  printf(lcd_putc,"\n SEXTO  CONTROL"); 
} 
 
void menu() 
{ 
    switch(MEN) 
    { 
        case 0x01:           //1234567890123456 
            printf(lcd_putc,"\f      MENU      "); 
            printf(lcd_putc,"\n%c   1 LED D4    ",0x7E); 
            if (FLAG1==2) 
            { 
                PORTB=0b00001000; 
                FLAG1=0; 
            } 
            else FLAG1=1; 
      break; 
        case 0x02:           //1234567890123456 
            printf(lcd_putc,"\f    1 LED D4   "); 
            printf(lcd_putc,"\n%c   2 LED D3    ",0x7E); 
            if (FLAG1==2) 
            { 
                PORTB=0b00000100; 
                FLAG1=0; 
            } 
            else FLAG1=1; 
      break; 
        case 0x03:           //1234567890123456 
            printf(lcd_putc,"\f    2 LED D3   "); 
            printf(lcd_putc,"\n%c   3 LED D2    ",0x7E); 
            if (FLAG1==2) 
            { 
                PORTB=0b00000010; 
                FLAG1=0; 
            } 
            else FLAG1=1; 
      break; 
        case 0x04:           //1234567890123456 
            printf(lcd_putc,"\f    3 LED D2   "); 
            printf(lcd_putc,"\n%c   4 LED D1    ",0x7E); 
            if (FLAG1==2) 
            { 
                PORTB=0b00000001; 
                FLAG1=0; 
            } 
            else FLAG1=1; 
      break; 
    }     
} 
 
void teclado(void) 
{ 
  switch((PORTA & 0x3C)) 
  { 
    case 0x20: 
      if (FLAG==1) 
      { 
          FLAG=0; 
          if (FLAG1==1) FLAG1=2; 
          menu(); 
      } 
      else FLAG=1; 
      break; 
    case 0x10: 
      if (FLAG==1) 
      { 
          FLAG=0; 
          if (MEN<5) MEN++; 
          else MEN=0x04; 
          menu(); 
      } 
      else FLAG=1; 
      break; 
    case 0x08: 
      if (FLAG==1)  
      { 
          FLAG=0; 
          if (MEN<5) MEN--; 
          else MEN=0x01; 
          menu(); 
      } 
      else FLAG=1; 
      break; 
    case 0x04: 
      if (FLAG==1) 
      { 
          FLAG=0; 
          presentacion(); 
          PORTB=0b00000000; 
      } 
      else FLAG=1; 
      break; 
  } 
  if (FLAG==1) delay_ms(500); 
} 
 
void main(void) 
{ 
  lcd_init(); 
  TRISA = 0b00111100; 
  TRISB = 0x00; 
  PORTB = 0b00000000; 
  presentacion(); 
  WHILE(TRUE) 
  { 
      teclado(); 
    } 
}
Imágenes Adjuntas
Tipo de Archivo: bmp CTO_LCD.BMP (79,9 KB (Kilobytes), 13 visitas)
10/04/2014 #93


hola companeros
tengo problemas con un lcd 20x4 para controlarlo con un pic16f877A, lo que sucede es lo siguiente
el programa lo compilo con el CCS compiler y lo simulo con proteus hasta este punto se simula y se compila bien, pero cuando lo graba al pic y lo conecto en el protoboard no me muestra ningun mensaje solo se ven las lineas 1 y 3 todos los caracteres en negro.
para grabar el pic utilizo el master-prog+ (hasta ahora no me habia dado fallas)
adjunto la simulacion y el codigo

---------- Actualizado después de 4 minutos ----------

aqui estas los archivos
Imágenes Adjuntas
Tipo de Archivo: jpg pic16f877a.jpg (9,9 KB (Kilobytes), 17 visitas)
Tipo de Archivo: jpg lcd40x4.jpg (114,4 KB (Kilobytes), 27 visitas)
Archivos Adjuntos
Tipo de Archivo: txt display.txt (9,1 KB (Kilobytes), 23 visitas)
11/04/2014 #94

Avatar de TRILO-BYTE

¿y estas seguro que el protoboard esta bien armado?
luego ese es un factor

el segundo factor

¿el controlador del LCD es compatible con el que usa el CCS?
11/04/2014 #95


el controlador no se si afecte el lcd que utilzo es un AZ DISPLAYS modelo ACM2004D tambien probe un lcd AMPIRE modelo 204A-QW e hizo lo mismo, d aqui me salio otra duda si afecta que lo estoy manejando a 4bitsn adjuto los datos de lcd que manejo
el pic lo conecto como en la imagen del post 93 y el lcd esta configurado en el puerto D tal como esta en la simulacion con proteus

este es el datasheet del lcd
Archivos Adjuntos
Tipo de Archivo: pdf DISPLAY_acm2004d.pdf (787,9 KB (Kilobytes), 6 visitas)
12/04/2014 #96
Moderador

Avatar de D@rkbytes

sukakaw dijo: Ver Mensaje
El controlador no sé si afecte el lcd que utilizo, es un AZ DISPLAYS modelo ACM2004D
También probé un lcd AMPIRE modelo 204A-QW e hizo lo mismo
La pantalla que estás usando, según la hoja de datos usa el controlador ST7066U-0A y el fabricante del controlador dice que es pin por pin compatible con el HD44780, el KS0066 y el SED1278.
Así que debe tener compatibilidad para trabajar con las librerías 4x20 que existen.

No tengo pantallas de ese tipo para hacer una prueba, pero mira si este ejemplo que adjunto con la librería LCD420.C de CCS modificada para trabajar con el puerto D, te funciona.
Esta librería se tiene que modificar directamente porque viene definida para usar el puerto B por defecto.

Nota que cambia la disposición de los pines de control. Espero te funcione.

Suerte.
Imágenes Adjuntas
Tipo de Archivo: jpg 16F877A LCD 20x4 SCH.jpg (99,8 KB (Kilobytes), 69 visitas)
Archivos Adjuntos
Tipo de Archivo: rar 16F877A LCD 20x4.rar (39,1 KB (Kilobytes), 161 visitas)
09/05/2014 #97

Avatar de luis1234567890

problema lcd.c
Hola a todos,tengo un problema al simular en proteus , no me muestra ningún carácter que envió en la pantalla lcd 2x16 cuando trabajo con el pic 18f2550 ,pero con otros micros como el 16f877a si se muestra los caracteres que envío .
No se cual sera el problema .

#include <18f2550.h>
#fuses HSPLL,NOWDT,NOMCLR
#use delay (clock=48000000)
#define use_portb_lcd TRUE
#include <lcd.c>


void main()
{
lcd_init();
setup_adc_ports(AN0_ANALOG );//pines digitales
while(true)
{lcd_gotoxy(1,1);
printf(lcd_putc,"PIC18F2550");


}
}
Imágenes Adjuntas
Tipo de Archivo: jpg l.jpg (102,5 KB (Kilobytes), 12 visitas)
09/05/2014 #98
Moderador

Avatar de D@rkbytes

luis1234567890 dijo: Ver Mensaje
Hola a todos,tengo un problema al simular en proteus , no me muestra ningún carácter que envió en la pantalla lcd 2x16 cuando trabajo con el pic 18f2550 ,pero con otros micros como el 16f877a si se muestra los caracteres que envío .
No se cual sera el problema .

#include <18f2550.h>
#fuses HSPLL,NOWDT,NOMCLR
#use delay (clock=48000000)
Debes tener un problema con la palabra de configuración.
¿Estás usando directamente un cristal de 48MHz, u otro?

Como comentario, si únicamente quieres realizar una prueba de escritura, no lo hagas dentro del bucle while.
Puedes empezar a escribir "PIC18F2550" después de lcd_init(); y en el bucle while hacer parpadear un LED a un tiempo conocido para que te des cuenta si el PIC está trabajando a la frecuencia correcta.

Por ejemplo, así:

void main ()
{
lcd_init ();
lcd_putc ("\fPIC18F2550");

while (true)
{
output_toggle (pin_xx);
delay_ms (500);
}
}
09/05/2014 #99

Avatar de TRILO-BYTE

yo tuve el mismo problema hace años
prueba estas lineas de codigo

#use delay(clock=48M)
#fuses XT,NOWDT,PLL5
#define LCD_DATA_PORT getenv("SFR:PORTB")
#include <lcd.c>
09/05/2014 #100

Avatar de luis1234567890

Hola D@rkbytes ,bueno la programación anterior ya me salio ahorra si me aparece los caracteres que envió ,recién estoy trabajando con el pic18f2550 y estaba pasándo algunos ejemplos que había hecho con el pic16.
Bueno cambie el cristal a 20Mhz ya que cuando estaba a 48Mhz no aperecía una letra ("P C18F2550"),pero ahorra para probar con retardos como dices D@rkbytes,cuando quiero hacer un contador de cada un segundo con lcd se demora y hasta también cuando quiero parpadear un led se demora como 3s en vez que sea 1s. l
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.