Go Down

Topic: [SOLVED]LCD 16x2 showing garbage (Read 8 times) previous topic - next topic

floresta

Quote
but Prueba4 prints like garbage, just random symbols.

It might look like garbage to you but not to others.  We have to know exactly what was supposed to be displayed, what was actually displayed, if the correct number of characters were displayed, if the characters are consistent each time, etc.

Don

liudr

Don,

I think his/her problem is pin conflict. The pin 4 is used both as chip select for the SD card and the LCD. Let's wait until that is fixed.

mrescude

#12
Oct 12, 2012, 06:12 pm Last Edit: Oct 12, 2012, 06:19 pm by mrescude Reason: 1
This is the last code i tested. I chaged th pins in the LCD to 9,8,7,6,5,3.
I keep getting the same error, it sends correctly Prueba, Prueba1, Prueba2 and Prueba3, but the it calls Wire.begin()  everything gets messed up.

Code: [Select]

#include <LiquidCrystal.h>
#include <SdFat.h>
SdFat sd;
SdFile myFile;
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68  // This is the I2C address


// Global Variables
const int chipSelect = 4;
int command = 0;       // This is the command char, in ascii form, sent from the serial port    
int i;
int second, minute, hour, dayOfWeek, dayOfMonth, month, year;
byte test;
byte zero=0x00;
char nombrearchivo[13];
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(9, 8, 7, 6, 5, 3);

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{  return ( (val/10*16) + (val%10) );}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{  return ( (val/16*10) + (val%16) );}

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers, Probably need to put in checks for valid numbers.
// setDateDs1307() solo se necesita una vez, se mantiene el el codigo, por si se debe cambiar la bateria del RTC o modificar la fecha u hora.
/*void setDateDs1307()                
{
  second = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); // Use of (byte) type casting and ascii math to achieve result.  
  minute = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  hour  = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  dayOfWeek = (byte) (Serial.read() - 48);
  dayOfMonth = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  month = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  year= (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(zero);
  Wire.write(decToBcd(second) & 0x7f);    // 0 to bit 7 starts the clock
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));      // If you want 12 hour am/pm you need to set
                                  // bit 6 (also need to change readDateDs1307)
  Wire.write(decToBcd(dayOfWeek));
  Wire.write(decToBcd(dayOfMonth));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.endTransmission();
}*/

// Gets the date and time from the ds1307 and prints result
void getDateDs1307()
{
 // Reset the register pointer
 Wire.beginTransmission(DS1307_I2C_ADDRESS);
 Wire.write(zero);
 Wire.endTransmission();
 Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
 // A few of these need masks because certain bits are control bits
 second     = bcdToDec(Wire.read() & 0x7f);
 minute     = bcdToDec(Wire.read());
 hour       = bcdToDec(Wire.read() & 0x3f);  // Need to change this if 12 hour am/pm
 dayOfWeek  = bcdToDec(Wire.read());
 dayOfMonth = bcdToDec(Wire.read());
 month      = bcdToDec(Wire.read());
 year       = bcdToDec(Wire.read());
 
 snprintf(nombrearchivo,13,"%02d%02d20%02d.txt", second, month, year); //merge together
}


void setup() {
 Serial.begin(9600);
  while (!Serial) {
   ; // wait for serial port to connect. Needed for Leonardo only
 }
 lcd.begin(16, 2);
 lcd.print("Prueba");
 delay(500);
 lcd.clear();
 
 
 // Open serial communications and wait for port to open:
 
 // set up the LCD's number of columns and rows:
 lcd.print("Prueba1");
 delay(500);
 lcd.clear();
 
 // Initialize SdFat or print a detailed error message and halt
 // Use half speed like the native library.
 // change to SPI_FULL_SPEED for more performance.
 
 lcd.print("Prueba2");
 delay(500);
 lcd.clear();
 
 if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();
 lcd.print("Prueba3");
 delay(500);
 lcd.clear();
 
 Wire.begin();
 lcd.print("Prueba4");
 delay(500);
 
}

void loop() {
    /*if (Serial.available()) {      // Look for char in serial que and process if found
     command = Serial.read();
     if (command == 84 || command == 116) {      //If command = "Tt" Set Date
      //setDateDs1307();
      getDateDs1307();
     
     
      if (!myFile.open(nombrearchivo, O_RDWR | O_CREAT | O_AT_END)) {
       sd.errorHalt("opening test.txt for write failed");
     }
     // if the file is available, write to it:
     Serial.print("Writing to test.txt...");
     myFile.println("testing 1, 2, 3.");

     // close the file:
     myFile.close();
     Serial.println("done.");

     }
     else if (command == 82 || command == 114) {      //If command = "Rr" Read Date ... BBR
      getDateDs1307();
      Serial.println(" ");
     }
     
     Serial.print("Command: ");
     Serial.println(command);     // Echo command CHAR in ascii that was sent
     }
     command = 0;                 // reset command
     delay(100);*/
     getDateDs1307();
     year+=2000;
     if (!myFile.open(nombrearchivo, O_RDWR | O_CREAT | O_AT_END)) {
       sd.errorHalt("opening test.txt for write failed");
     }
     // if the file is available, write to it:
     Serial.print("Writing");
     lcd.setCursor(0, 0);
     lcd.print("Writing:");
     delay(1000);
     lcd.setCursor(0, 1);
     lcd.print(nombrearchivo);
     myFile.println("testing 1, 2, 3.");
     if(!myFile.timestamp(T_WRITE,year,month,dayOfMonth,hour,minute,second)){
     Serial.println("Mod date failed");
     }
     // close the file:
     myFile.close();
     Serial.println("done.");
     lcd.clear();
     delay(250);
     
     
 }


I'll add some pictures so I can explain myself.

mrescude

I skipped "Prueba2" and "Prueba3", but they work. I already changed the pins.

floresta

From reply #10:
"It might look like garbage to you but not to others.  We have to know exactly what was supposed to be displayed, what was actually displayed, if the correct number of characters were displayed, if the characters are consistent each time, etc."
You have responded to one of these points ....

There's no need to clear the LCD each time.  Just reposition the cursor and write over the old information.


Quote
but Prueba4 prints like garbage, just random symbols.

You haven't shown us this 'garbage' yet.

Quote
I think his/her problem is pin conflict. The pin 4 is used both as chip select for the SD card and the LCD. Let's wait until that is fixed.

That could certainly mess up the information on the LCD.

Don

Go Up