Go Down

Topic: RTC DS1307 & LCD 12864B mit SPT Modul (? ST7920) (Read 956 times) previous topic - next topic

Gerrolette

Nun habe ich heute mal alle Kabel getauscht, und das Breadboard entfernt, um auch diese Fehlerquellen ausschließen zu können.
Dann habe mal den Scanner ausprobiert, und der zeigt mir auch 2 Devices an..
0x68 für die RTC
0x50 ... Ich glaube das ist der Speicher auf der RTC. Irgendwas hatte ich mal gelesen das man da ein paar Bytes Speichern kann?
Leider zeigt die Uhr Nicht wirklich was an. Die 165/165/165 45:165:165 bekomme ich auch wenn die RTC gar nicht am Board dran hängt.
Ich würde also meinen das die gar nicht gefunden wird.

Da ich im Fritzing das LCD mit dem SPI Anschluss sowie die RTC irgendwie nicht gefunden habe habe ich mal ein paar Bilder gemacht.

www.corsmeyer.de/user/arduino/RTCProblem.jpg

Brauche ich vielleicht 4,7K Pullups? Ich dachte die bräuchte man nur beim 1-Wire?

Code: [Select]


// LCD
#include "U8glib.h"
U8GLIB_ST7920_128X64 u8g(52, 51, 53, U8G_PIN_NONE );// SPI Com: SCK = en = 30, MOSI = rw = 32, CS = di = 31

int count = 0;

//RTCModule
#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527


void setup(void) {
Serial.begin(9600);

// *******  Hatte ich Vergessen!
        Wire.begin();
}

void loop(void) {
  u8g.firstPage(); 
  do {
    draw();
    Serial.println(printDate());
  } while( u8g.nextPage() );
  delay(5);
}

void draw(void) {

  u8g.setFont(u8g_font_4x6);
  u8g.setPrintPos(0, 6);
  int LineNumber = 0;

  LineNumber++;u8g.setPrintPos(0, 6*LineNumber);  u8g.print("Temperatur View   "); 
  LineNumber++;
  LineNumber++;u8g.setPrintPos(0, 6*LineNumber);  u8g.print("Vorlauf   =+32 C |");
  LineNumber++;u8g.setPrintPos(0, 6*LineNumber);  u8g.print("Ruecklauf =+27 C |"); 
  LineNumber++;u8g.setPrintPos(0, 6*LineNumber);  u8g.print("Aussen    =- 3 C |"); 
  LineNumber++;u8g.setPrintPos(0, 6*LineNumber);  u8g.print("Solar     =+14 C |"); 
  LineNumber++;u8g.setPrintPos(0, 6*LineNumber);  u8g.print("W.Wasser  =+40 C |"); 
  LineNumber++;u8g.setPrintPos(0, 6*LineNumber);  u8g.print("Licht     =" + (String)analogRead(7));
  LineNumber++;u8g.setPrintPos(0, 6*LineNumber);  u8g.print(printDate());
  LineNumber++;u8g.setPrintPos(0, 6*LineNumber);  u8g.print(count);
  count++;
}

String printDate(){
    // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());

 
String DTString =(String)LeadZero(monthDay) + "/" +
(String)LeadZero(month) + "/" +
(String)LeadZero(year) + " " +
(String)LeadZero(hour) + ":" +
(String)LeadZero(minute) + ":" +
(String)LeadZero(second);
  return DTString;
}

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

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

void setDateTime( byte monthDay,byte month,byte year , byte hour,byte minute, byte second, byte weekDay){

  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator

  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(zero); //start
  Wire.endTransmission();
}

void setDateTime(){
  byte second =      00; //0-59
  byte minute =      17; //0-59
  byte hour =        23; //0-23
  byte weekDay =     2; //1-7
  byte monthDay =    01; //1-31
  byte month =       01; //1-12
  byte year  =       13; //0-99
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(zero); //start
  Wire.endTransmission();
}

String LeadZero(int Number){
String ReturnNumber = (String)Number;
if (Number <= 9){
ReturnNumber = "0" + (String)Number;
}
//Serial.println(ReturnNumber);
return ReturnNumber;
}



... so an dieser Stelle brech ich mal ab...
Ich Dummdussel habe das Wire.begin() im Setup vergessen. (Ich schweige und versinke im Boden..)

Ich poste das Bild und den Code trotzdem, vielleicht Interessierts ja noch andere.

Vielen, vielen Dank für den Beistand, und gelernt habe ich trotzdem viel dabei..

Grüsse,
Gerrit

olikraus

Hi

In der Tat brauchen die beiden I2C jeweils einen Pull-Up-Widerstand (üblicherweise 10K). Manchmal sind die aber auch schon verbaut.

Nettes Bild übrigens.

Grüße,
Oliver

uwefed

Die DS1307 hat nur eine Adresse für die Register der RTC und die RAM-Speicherzellen. Lies Dir mal das Datenblatt durch.
Die RTC muß mit einer Zeit initialisiert werden ansonsten liest Du Hausnummern und die Zeit startet auch nicht.
Grüße Uwe

Go Up