Autor Tema: EEPROM externa y LCD  (Leído 2549 veces)

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

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
EEPROM externa y LCD
« en: 29 de Febrero de 2008, 19:00:02 »
Muy buenas, estoy haciendo este programa de prueba para usar una EEPROM externa, y no me funciona. Creo que es problema de la libreria del LCD, pues si uso la que trae el CCS funciona correctamente.
El problema es cuando uso la EEPROM externa, pues cuando no la uso, el LCD con mi libreia funciona correctamente.

Programa:
Código: [Seleccionar]
# include <16F876a.h>
# DEVICE ADC=10 //ADC usa 10 bit
# use delay(clock=10000000)
# fuses HS,NOWDT,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD
//------------------------------------------------------------------------------
# define PORTA 0x05// Puerto A
# define PORTB 0x06// Registro de direccionamiento Puerto A
# define TRISA 0x85// Puerto B
# define TRISB 0x86// Registro de direccionamiento Puerto B
# define PORTC 0x07// Registro de direccionamiento Puerto C
# define TRISC 0x87// Puerto C
//Se definen los terminales de conexion del display
# bit lcd_db4 = PORTA.2
# bit tris_lcd_db4 = TRISA.2
# bit lcd_db5 = PORTA.4
# bit tris_lcd_db5 = TRISA.4
# bit lcd_db6 = PORTA.5
# bit tris_lcd_db6 = TRISA.5
# bit lcd_db7 = PORTC.0
# bit tris_lcd_db7 = TRISC.0

# bit lcd_en = PORTC.5
# bit tris_lcd_en = TRISC.5
# bit lcd_rs = PORTC.6
# bit tris_lcd_rs = TRISC.6
# include <lcd_flex.c>
//------------------------------------------------------------------------------
# include <2416.c>
# use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, SLOW, NOFORCE_SW, RESTART_WDT)

# USE FAST_IO(A)
# USE FAST_IO(B)
# USE FAST_IO(C)
/******************************************************************************/
int16 Var1,Var2;
int1 Guardar;
int Tecla,direccion;
byte dato1,dato2;
/******************************************************************************/
void main(){
Set_TRIS_A(0b11000011);
Set_TRIS_B(0b11110001);
Set_TRIS_C(0b10000001);

   init_ext_eeprom();
   lcd_init();
   dato1 = 25;
   direccion = 35;
   write_ext_eeprom(direccion,dato1);
   delay_ms(20);
   dato2 = read_ext_eeprom(direccion);
   lcd_gotoxy(2,2);
   printf(lcd_putc," %u",dato2);

DO{
}while(1);
}

Y esto la famosa lcd_flex:
Código: [Seleccionar]
//include LCD para CCS

// La ventaja de este codigo es que puedes trabajar si lo quieres con pines
// dispersos es decir no estas sujeto a la mitad de un puerto. Además no se usa
// el pin R/W, se conecta a masa
/*
// Registros de Puertos A & B
#define PORTA 0x05// Puerto A
#define PORTB 0x06// Registro de direccionamiento Puerto A
#define TRISA 0x85// Puerto B
#define TRISB 0x86// Registro de direccionamiento Puerto B
#define PORTC 0x07// Registro de direccionamiento Puerto C
#define TRISC 0x87// Puerto C
*/
// Definición de Puertos Pantalla LCD 40x20 Hitachi 44780
/*
#bit lcd_db4 = PORTC.0
#bit tris_lcd_db4 = TRISC.0
#bit lcd_db5 = PORTC.1
#bit tris_lcd_db5 = TRISC.1
#bit lcd_db6 = PORTC.2
#bit tris_lcd_db6 = TRISC.2
#bit lcd_db7 = PORTC.3
#bit tris_lcd_db7 = TRISC.3

#bit lcd_en = PORTC.5
#bit tris_lcd_en = TRISC.5
#bit lcd_rs = PORTC.4
#bit tris_lcd_rs = TRISC.4
*/
/*
#bit lcd_db4 = PORTB.0
#bit tris_lcd_db4 = TRISB.0
#bit lcd_db5 = PORTB.1
#bit tris_lcd_db5 = TRISB.1
#bit lcd_db6 = PORTC.0
#bit tris_lcd_db6 = TRISC.0
#bit lcd_db7 = PORTC.1
#bit tris_lcd_db7 = TRISC.1

#bit lcd_en = PORTA.0
#bit tris_lcd_en = TRISA.0
#bit lcd_rs = PORTA.2
#bit tris_lcd_rs = TRISA.2
*/
/*
#bit lcd_db4 = PORTB.0
#bit tris_lcd_db4 = TRISB.0
#bit lcd_db5 = PORTB.1
#bit tris_lcd_db5 = TRISB.1
#bit lcd_db6 = PORTB.2
#bit tris_lcd_db6 = TRISB.2
#bit lcd_db7 = PORTB.3
#bit tris_lcd_db7 = TRISB.3

#bit lcd_en = PORTA.3
#bit tris_lcd_en = TRISA.3
#bit lcd_rs = PORTA.2
#bit tris_lcd_rs = TRISA.2
*/

// lcd_init() Inicialización del LCD (debe utilizarse al principio,
// antes de trabajar con el LCD).
//
// lcd_putc(c) Imprime un caracter en el LCD.
//
// lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el LCD.
// (la esquina superior izquierda es 1,1)
//
// lcd_getc(x,y) Devuelve el caracter de la posicion x,y del LCD.
//
// void lcd_erase_line(x) Borra una cantidad de caracter hacia la derecha

// Conexion a la pantalla LCD 40x4
// RC0 <---> LCD DB4
// RC1 <---> LCD DB5
// RC2 <---> LCD DB6
// RC3 <---> LCD DB7
// RC5 <---> LCD ENABLE
// RC4 <---> LCD RS
//

#define LCD_DATO 1
#define LCD_INST 0

#define LCD_LINEA1 0x80// Direccion de memoria para la 1 linea
#define LCD_LINEA2 0xc0 // Direccion de memoria para la 2 linea
#define LCD_LINEA3 0x94 // Direccion de memoria para la 3 linea
#define LCD_LINEA4 0xd4 // Direccion de memoria para la 4 linea

//7 6 5 4 3 2 1 0
// Function Set 0b 0 0 1 B L F 0 0
// Bus size, B:0=4 bits, B:1=8 bits
// Line Number, L:0=1 Line, L:1=2 Lines
// Font size F:0=5x8, F:1=5x10
#define LCD_FUNCTION_SET 0b00101000// Bus=4bit, Line=2, Font=5x8

// 7 6 5 4 3 2 1 0
// Display/Cursor 0b 0 0 0 0 1 D U B
// Set Display on/off, D:0=off, D:1=on
// Underline cursor, U:0=off, U:1=on
// Blinking cursor, B:0=off, B:1=on
#define LCD_DISPLAY_CURSOR 0b00001100 // Display=on, Scroll=off, Blinkin=off

// 7 6 5 4 3 2 1 0
// Entry Mode 0b 0 0 0 0 0 1 M S
// Cursor direction, M:0=left, 1=right
// Display Scroll, S:0=no scroll, S:1=scroll
#define LCD_ENTRY_MODE 0b00000110 // Increment cursor, no disp shift

void lcd_set_write() {
tris_lcd_db4 = 0; //
tris_lcd_db5 = 0; //
tris_lcd_db6 = 0; //
tris_lcd_db7 = 0; //---> Set portb RB0-RB3 mode output
}

void lcd_send_nibble(int8 n) {
if (bit_test(n,0)) //
lcd_db4 = 1; //
else //
lcd_db4 = 0; //

if (bit_test(n,1)) //
lcd_db5 = 1; //
else //
lcd_db5 = 0; //

if (bit_test(n,2)) //
lcd_db6 = 1; //
else //
lcd_db6 = 0; //

if (bit_test(n,3)) //
lcd_db7 = 1; //
else //
lcd_db7 = 0; //---> Set data nibble
delay_cycles(5); //nop
lcd_en = 1; // Habilita LCD Eneable __
delay_us(20); // Espera 2 uSeg. | |
lcd_en = 0; // Desabilita LCD Eneable __| |__
}

void lcd_send_byte (int1 select, int8 n) {
lcd_rs = 0; // Modo de instruccion
lcd_rs = select; // Escoje entre RS=0 : Instruccion & RS=1 : Data
delay_cycles(5); // nop
lcd_en = 0; // Desabilita LCD Eneable
lcd_send_nibble(n >> 4); // Envia los datos superiores MSB
lcd_send_nibble(n); // Envia los datos inferiores LSB
}

void lcd_init() {
int8 i, count=0;
lcd_set_write(); // Prepara el puerto DB4-DB7 como salida
tris_lcd_en = 0; //
tris_lcd_rs = 0; //---> Set porta RA0, RA1 & RA2 mode output
lcd_en = 0; //
lcd_rs = 0; //---> Clear LCD_EN, LCD_RW & LCD_RS
delay_ms(100);
retry:
for(i=1; i<=3; ++i) {
lcd_send_nibble(0b0011); // 8 bit mode 3 times
delay_ms(30);
}
lcd_send_nibble(0b0010); // 4 bit mode
lcd_send_byte(LCD_INST, LCD_FUNCTION_SET); // Function Set
lcd_send_byte(LCD_INST, LCD_DISPLAY_CURSOR); // Display Cursor
lcd_send_byte(LCD_INST, LCD_ENTRY_MODE); // Entry Mode
}

void lcd_gotoxy(int8 x, int8 y)
{
int8 const address[4]={LCD_LINEA1,LCD_LINEA2,LCD_LINEA3,LCD_LINEA4};
int8 pos;
pos=address[y-1]+(x-1);
lcd_send_byte (LCD_INST, pos);
}

void lcd_putc(char c) {
lcd_send_byte(LCD_DATO,c);
}

void lcd_clear() {
lcd_send_byte(LCD_INST,0x01);
}

void lcd_home() {
lcd_send_byte(LCD_INST,0x02);
}

void lcd_erase_line(int8 x) {
int8 i;
for(i=1;i<=x;++i) {
lcd_send_byte(LCD_DATO,32);
}
}

Espero ayuda de algun maestro del 'c'.

1saludo y gracias.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado ema

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1078
Re: EEPROM externa y LCD
« Respuesta #1 en: 29 de Febrero de 2008, 19:37:04 »
Fijate en esto que a lo mejor te sirva. Primero deshabilitas el WDT.

# fuses HS,NOWDT,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD

Y aqui lo reseteas.

# use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, SLOW, NOFORCE_SW, RESTART_WDT)

Saludos

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: EEPROM externa y LCD
« Respuesta #2 en: 29 de Febrero de 2008, 20:04:16 »
He probado a deshabilitarlo en los dos sitios y no funciona, sin embargo si uso la EEPROM interna del pic, si funciona.

1saludo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado ema

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1078
Re: EEPROM externa y LCD
« Respuesta #3 en: 01 de Marzo de 2008, 00:04:58 »
Fijate en lo siguiente.
Vos estas configurando la I2C.

# include <2416.c>
# use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, SLOW, NOFORCE_SW, RESTART_WDT)

Pero en la libreria ya esta configurada de la siguiente forma.

file (2416.c)
#define EEPROM_SDA  PIN_C4
#define EEPROM_SCL  PIN_C3
#use i2c(master,sda=EEPROM_SDA, scl=EEPROM_SCL)


Estarias configurandolo dos veces. Si borras tu configuración deberia funcionar, o configuralo bien pero en la libreria.

Saludos

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: EEPROM externa y LCD
« Respuesta #4 en: 01 de Marzo de 2008, 16:05:02 »
He probado a quitar esa linea y sigue sin funcionar, pero no creo que sea eso pues si coloco el LCD en el puerto B con la libreria del CCS si que funciona, el tema es que el puerto B lo necesito para un teclado.

Gracias por la ayuda.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado ema

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1078
Re: EEPROM externa y LCD
« Respuesta #5 en: 01 de Marzo de 2008, 17:51:34 »
Bueno me parece que ahora si di en el clavo :mrgreen:. Mira esta parte del código

# bit lcd_db5 = PORTA.4
# bit tris_lcd_db5 = TRISA.4

El pin A4 es colector abierto. Puedes leer este post donde se habla del tema

http://www.todopic.com.ar/foros/index.php?topic=8121.0

Espero que esta ves funcione

Saludos

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: EEPROM externa y LCD
« Respuesta #6 en: 01 de Marzo de 2008, 18:44:12 »
Hola ema: Muchas gracias por las molestias que te estas tomando.

Tengo puesta la resistencia en el RA4, no es ese el problema.

El lcd con esa configuración funciona, pero solo si no uso la eeprom externa, si quito la linea: init_ext_eeprom(); y las de lectura y escritura en la eeprom externa, el lcd funciona, el problema debe de ser que la configuración de la eeprom desconfigura la del lcd, pero no encuentro donde.

1 saludo.
 
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado ema

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1078
Re: EEPROM externa y LCD
« Respuesta #7 en: 01 de Marzo de 2008, 19:52:26 »
No se mas que decir :( :(; pero a veces acomodar un poco el código me hace funcionar las cosas. Proba de esta manera.

Código: [Seleccionar]
# include <16F876a.h>
# fuses HS,NOWDT,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD
# use delay(clock=10000000)

# USE STANDARD_IO(A)
# USE STANDARD_IO(B)
# USE STANDARD_IO(C)

# include <lcd_flex.c>
# include <2416.c>

int16 Var1, Var2;
int1 Guardar;
int Tecla, direccion;
byte dato1, dato2;


void main()
{

   lcd_init();
   init_ext_eeprom();
   dato1 = 25;
   direccion = 35;
   write_ext_eeprom(direccion,dato1);
   delay_ms(20);
   dato2 = read_ext_eeprom(direccion);
   lcd_gotoxy(2,2);
   printf(lcd_putc," %u",dato2);

   DO{
   }while(1);
}

Y en la libreria LCDFLEX

Código: [Seleccionar]
//include LCD para CCS

// La ventaja de este codigo es que puedes trabajar si lo quieres con pines
// dispersos es decir no estas sujeto a la mitad de un puerto. Además no se usa
// el pin R/W, se conecta a masa
/*
// Registros de Puertos A & B & C
#define PORTA 0x05// Puerto A
#define PORTB 0x06// Registro de direccionamiento Puerto A
#define TRISA 0x85// Puerto B
#define TRISB 0x86// Registro de direccionamiento Puerto B
#define PORTC 0x07// Registro de direccionamiento Puerto C
#define TRISC 0x87// Puerto C

//Se definen los terminales de conexion del display

# bit lcd_db4 = PORTA.2
# bit tris_lcd_db4 = TRISA.2
# bit lcd_db5 = PORTA.4
# bit tris_lcd_db5 = TRISA.4
# bit lcd_db6 = PORTA.5
# bit tris_lcd_db6 = TRISA.5
# bit lcd_db7 = PORTC.0
# bit tris_lcd_db7 = TRISC.0

# bit lcd_en = PORTC.5
# bit tris_lcd_en = TRISC.5
# bit lcd_rs = PORTC.6
# bit tris_lcd_rs = TRISC.6

// lcd_init() Inicialización del LCD (debe utilizarse al principio,
// antes de trabajar con el LCD).
//
// lcd_putc(c) Imprime un caracter en el LCD.
//
// lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el LCD.
// (la esquina superior izquierda es 1,1)
//
// lcd_getc(x,y) Devuelve el caracter de la posicion x,y del LCD.
//
// void lcd_erase_line(x) Borra una cantidad de caracter hacia la derecha

#define LCD_DATO 1
#define LCD_INST 0

#define LCD_LINEA1 0x80// Direccion de memoria para la 1 linea
#define LCD_LINEA2 0xc0 // Direccion de memoria para la 2 linea
#define LCD_LINEA3 0x94 // Direccion de memoria para la 3 linea
#define LCD_LINEA4 0xd4 // Direccion de memoria para la 4 linea

//7 6 5 4 3 2 1 0
// Function Set 0b 0 0 1 B L F 0 0
// Bus size, B:0=4 bits, B:1=8 bits
// Line Number, L:0=1 Line, L:1=2 Lines
// Font size F:0=5x8, F:1=5x10
#define LCD_FUNCTION_SET 0b00101000// Bus=4bit, Line=2, Font=5x8

// 7 6 5 4 3 2 1 0
// Display/Cursor 0b 0 0 0 0 1 D U B
// Set Display on/off, D:0=off, D:1=on
// Underline cursor, U:0=off, U:1=on
// Blinking cursor, B:0=off, B:1=on
#define LCD_DISPLAY_CURSOR 0b00001100 // Display=on, Scroll=off, Blinkin=off

// 7 6 5 4 3 2 1 0
// Entry Mode 0b 0 0 0 0 0 1 M S
// Cursor direction, M:0=left, 1=right
// Display Scroll, S:0=no scroll, S:1=scroll
#define LCD_ENTRY_MODE 0b00000110 // Increment cursor, no disp shift

void lcd_set_write() {
tris_lcd_db4 = 0; //
tris_lcd_db5 = 0; //
tris_lcd_db6 = 0; //
tris_lcd_db7 = 0; //---> Set portb RB0-RB3 mode output
}

void lcd_send_nibble(int8 n) {
if (bit_test(n,0)) //
lcd_db4 = 1; //
else //
lcd_db4 = 0; //

if (bit_test(n,1)) //
lcd_db5 = 1; //
else //
lcd_db5 = 0; //

if (bit_test(n,2)) //
lcd_db6 = 1; //
else //
lcd_db6 = 0; //

if (bit_test(n,3)) //
lcd_db7 = 1; //
else //
lcd_db7 = 0; //---> Set data nibble
delay_cycles(5); //nop
lcd_en = 1; // Habilita LCD Eneable __
delay_us(20); // Espera 2 uSeg. | |
lcd_en = 0; // Desabilita LCD Eneable __| |__
}

void lcd_send_byte (int1 select, int8 n) {
lcd_rs = 0; // Modo de instruccion
lcd_rs = select; // Escoje entre RS=0 : Instruccion & RS=1 : Data
delay_cycles(5); // nop
lcd_en = 0; // Desabilita LCD Eneable
lcd_send_nibble(n >> 4); // Envia los datos superiores MSB
lcd_send_nibble(n); // Envia los datos inferiores LSB
}

void lcd_init() {
int8 i, count=0;
lcd_set_write(); // Prepara el puerto DB4-DB7 como salida
tris_lcd_en = 0; //
tris_lcd_rs = 0; //---> Set porta RA0, RA1 & RA2 mode output
lcd_en = 0; //
lcd_rs = 0; //---> Clear LCD_EN, LCD_RW & LCD_RS
delay_ms(100);
retry:
for(i=1; i<=3; ++i) {
lcd_send_nibble(0b0011); // 8 bit mode 3 times
delay_ms(30);
}
lcd_send_nibble(0b0010); // 4 bit mode
lcd_send_byte(LCD_INST, LCD_FUNCTION_SET); // Function Set
lcd_send_byte(LCD_INST, LCD_DISPLAY_CURSOR); // Display Cursor
lcd_send_byte(LCD_INST, LCD_ENTRY_MODE); // Entry Mode
}

void lcd_gotoxy(int8 x, int8 y)
{
int8 const address[4]={LCD_LINEA1,LCD_LINEA2,LCD_LINEA3,LCD_LINEA4};
int8 pos;
pos=address[y-1]+(x-1);
lcd_send_byte (LCD_INST, pos);
}

void lcd_putc(char c) {
lcd_send_byte(LCD_DATO,c);
}

void lcd_clear() {
lcd_send_byte(LCD_INST,0x01);
}

void lcd_home() {
lcd_send_byte(LCD_INST,0x02);
}

void lcd_erase_line(int8 x) {
int8 i;
for(i=1;i<=x;++i) {
lcd_send_byte(LCD_DATO,32);
}
}

Saludos



Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: EEPROM externa y LCD
« Respuesta #8 en: 04 de Marzo de 2008, 20:15:32 »
Lamentablemente la ultima opción tampoco funciona. Lo que hare es compartir el puerto B con el teclado y el LCD, que así si que funciona la memoria externa.

Gracias por la ayuda. 1 saludo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡


 

anything