Forum: Mikrocontroller und Digitale Elektronik DS1307 an 3,3V


von Coco J. (Firma: Student) (dathcoco)


Lesenswert?

Schönen guten Tag,

ich bastele grade an einer Binär-Uhr die ich mit einem DS1307 regeln 
wollte.

Zu guter erst mein momentaner aufbau:

Die Spannungsversorgung läuft über USB und wird mit einem STEP-DOWN 
Regler auf 3,3 V heruntergeregelt, und dann mit einem 100µF Kondensator 
geglättet. Der STEP-DOWN Regler dient als Strombegrenzer und reduziert 
etwas die Verluste durch vorwiderstände

Die Komplette Anzeige gegelt ein ATMega 46PU, Steuert die LEDS mit 
3-Fach Multiplexing an.

Der DS1307 selbst, ist direkt an 5V angeschlossen. Der TWI-Bus ist mit 
4,7kOhm Pullups auf 3,3V mit dem ATMega verbunden.

Die VBat wird mit Hilfe eines 2,22 F Gold-Cap und einer LED realisiert, 
der Kondensator lädt sich auf 2,6V auf und hält einige Tage (bis er 
unter die 2V laut Datenblatt fällt).

Laut Datenblatt des DS1307  ist ein low-Pegel < 0,8V und ein High-Pegel 
> 2,2 V, von daher sollte der Bus 3,3V kompatibel sein.


zum Code:
Vorbild: Beitrag "DS1307 Lib für Fleury's I2C"

ich nutze einen sehr leicht abgeänderten code um den DS1307 zu 
initialisieren:

Initialisierung der Pins:
1
void init_IO(void)
2
{
3
  DDRD  = _bv(LED0) | _bv(LED1) | _bv(LED1) | _bv(LED3) | _bv(LED4) | _bv(LED5) | _bv(LED6);
4
  DDRB  = _bv(LEDSEL_HOUR) | _bv(LEDSEL_MIN) | _bv(LEDSEL_SEC) | _bv(LED_DIMMER);
5
  DDRC  = _bv(PINC4) | _bv(PINC5);  // SDA, SCL als output
6
  PORTD  = _bv(PIND2);   // Einschalten des Pullups um INT0 zu verweden.
7
}

Die Ansteuerung des DS1307 :
1
#define CLOCK_HALT   7
2
#define SQW_CONTROL_REG 0x07
3
#define SQW_OUT         7
4
#define SQW_SQWE        4
5
#define SQW_RS1_RS0_1Hz 0x0
6
7
8
void ds1307_init()
9
{
10
  /* Tell the DS1307 to start the oscillator (turn off CLOCK HALT) in
11
   * case it has lost power. */
12
  uint8_t reg0;
13
14
  /* Address, say read from memory slot 0, then read data. */
15
    i2c_start_wait(DS1307+I2C_WRITE);
16
    i2c_write(0x0);
17
    i2c_rep_start(DS1307+I2C_READ);
18
    reg0=i2c_readNak();
19
20
  /* Turn off the clock halt if necessary. */
21
    if(reg0 & _BV(CLOCK_HALT)) {
22
      i2c_start_wait(DS1307+I2C_WRITE);
23
      i2c_write(0x0);
24
      i2c_write(reg0 & ~_BV(CLOCK_HALT));
25
    }
26
27
  /* Fire up the 1Hz interrupt. */
28
  //hier habe ich die Abfrage heraus genommen, da ich die Interrupts in jedem Fall einschalten möchte.
29
  i2c_start_wait(DS1307+I2C_WRITE);
30
  i2c_write(SQW_CONTROL_REG);
31
  i2c_write(_BV(SQW_SQWE) | SQW_RS1_RS0_1Hz);
32
  i2c_stop();
33
34
35
}

in der Main schleife wird nun eigentlich nur folgendes gemacht:
1
int main(void)
2
{
3
  init_IO();
4
  init_Interrupt();
5
  
6
  i2c_init();
7
  ds1307_init();
8
  
9
  
10
  /*
11
  //Test der Anzeige
12
  time.hour = 20;
13
  time.minute = 32;
14
  time.second = 52;*/
15
  
16
  sei();
17
    while(1)
18
    {
19
        set_Time(time);
20
    }
21
}


Der ATMega hängt irgendwo in der Funktiuon ds1307_init();, und mit 
Irgendwo vermute ich den i2c_start_wait(..) Befehl..

Als beides noch auf 3,3 V lief, lief alles durch, jedoch passierte 
nichts am Ausgang.

hat jemand eine Idee was ich falsch machen könnte?
lg Coco.

von Coco J. (Firma: Student) (dathcoco)


Lesenswert?

könnte es vielleicht sein, dass die Clock zu ungenau ist, da ich den 
ATmega nur mit interner Clock laufen lasse?

>> hatte mich vertippt, es ist ein ATMega 48PU

von Bernhard S. (b_spitzer)


Lesenswert?

Aus dem Datenblatt des DS1307:

RECOMMENDED DC OPERATING CONDITIONS
                  MIN  TYP  MAX   UNITS
Supply Voltage    4.5  5.0  5.5   V

Was fällt auf???  ^^^

von Coco J. (Firma: Student) (dathcoco)


Lesenswert?

>>Der DS1307 selbst, ist direkt an 5V angeschlossen. Der TWI-Bus ist mit
>>4,7kOhm Pullups auf 3,3V mit dem ATMega verbunden.


das habe ich Eingehalten
PARAMETER || SYMBOL || MIN  || MAX     || UNITS || NOTES
Logic 1   || VIH    || 2.2  || VCC+0.3 || V     || 1
Logic 0   || VIL    || -0.3 || +0.8    || V     || 1


das habe ich meiner Meinung nach auch eingehalten...

von Bernhard S. (b_spitzer)


Lesenswert?

Mach bei der geringen Spannung mal die Pullups kleiner - 2,2k oder so.

Wenn der Controller irgendwo hängt, dann schalte bei einem fraglichen 
Abschnitt vorher eine LED ein, danach aus. So kannst Du Fehler 
eingrenzen.

von Nico (nico123)


Lesenswert?

Die Sache mit der Schnittstelle und den Pegeln müßte passen so wie Du es 
gemacht hast!
Wie schnell läuft denn dein I²C-Bus?

Um den Fehler zu finden wäre ein Oszilloskop gut!
Wenn Du keins hast, dann musst Du per Hardware debuggen. D.h. setze 
hinter der Befehlszeile einen Ausgangsport auf high und schließe dort 
eine LED an, dann siehst Du wo das Programm hängen bleibt!

von Coco J. (Firma: Student) (dathcoco)


Lesenswert?

Ich habe grade ein wenig in meinem Programm Herumgewerkelt, und habe 
jetzt die Warnung "large integer blabla" undzwar bei:
1
void i2c_init(void)
2
{
3
  /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
4
  
5
  TWSR = 0;                         /* no prescaler */
6
  TWBR = ((F_CPU/SCL_CLOCK)-16)/2;  /* must be > 10 for stable operation */
7
  set_LED_debug(0x01);
8
}/* i2c_init */

mal eben schauen was ich da für einen Prescaler brauche
mein F_CPU ist 1000000UL //1 MHZ
SCL_CLOCK ist 10000UL


*edit

habe jetzt F_CPU auf 8000000UL hochgestellt und die FUSE clk/8 weg 
gemacht. Leider kein Erfolg

von Nico (nico123)


Lesenswert?

Setze einfach mal TWBR auf 10 und F_CPU läßt Du auf 1MHz. Dann läuft I²C 
zwar nur auf 27kHz aber das ist ja egal!

von Coco J. (Firma: Student) (dathcoco)


Lesenswert?

So wie es momentan aussieht hängt er in der funktion:
void i2c_start_wait(unsigned char address)
an der stelle:
1
twst = TW_STATUS & 0xF8;
2
      if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) ) 
3
      {         
4
          /* device busy, send stop condition to terminate write operation */
5
          TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
6
          
7
          // wait until stop condition is executed and bus released
8
          while(TWCR & (1<<TWSTO));
9
         
10
          continue;
11
      }

hier springt er immer wieder zurück.


*edit
 TWBR auf 10 hab ich gemacht, leider keine Änderung..

von Coco J. (Firma: Student) (dathcoco)


Angehängte Dateien:

Lesenswert?

Also ich habe jetzt noch einmal gemessen, die SDA und SCL line sind ohne 
Initialisierung auf 3,310 V (laut Multimeter).

Hardware Debugging kommt bis set_LED_debug(0x01);

ich habe das komplette Projektfile als zip, und den Schaltplan 
angehängt, ich würde mich echt freuen, wenn jemand noch eine Idee hat.. 
das ganze sollte ein Weihnachtsgeschenk jemanden aus meiner Familie 
werden ;).

(bitte entschluldigt den Schaltplan, das ist im grunde der erste dieser 
Größe den ich je gezeichnet habe)

Werte für den Schaltplan:

Uhrenquarz Q2 = 32,768 kHz 12.5pF
Elko       C3 = 220 000F 5V
Widerstände:
R1, R2, R3, R4 = 470k
R5, R6 = 4,7kOhm
Im Schaltplan fehlen noch die Basiswiderstände der Transistoren (sie 
sind 1,5kOhm)
Induktivität L1 = 13 Windungen (also kA, sie ist selbst gewickelt)
AREF und AVCC hängen beide an 3,3V waren aber irrelevant.

Der Mega8 ist Pingleich mit dem 48PU

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

hat dein Schaltregler im realen Leben auch eine Diode?

Sascha

von Coco J. (Firma: Student) (dathcoco)


Lesenswert?

die Diode geht zum Elko, welcher die "Baterie" für den ds1307 darstellt. 
Die existiert auch in echt.

von Sascha W. (sascha-w)


Lesenswert?

die meine ich auch nicht, damit ein Schaltregler ein Schaltregler ist, 
gehört da an der Spule auch noch eine Schottkydiode dran - schau mal ins 
Datenblatt vom LM2574!

Sascha

von Coco J. (Firma: Student) (dathcoco)


Lesenswert?

hmm die habe ich wirklich nicht, aber wozu ist die da?
Leider habe ich auch keine Shottky hier zuhause rumliegen, kann ich da 
irgendetwas anderes für nutzen?

ich habe jetzt "sowas wie 1Hz" am Ausgang des ds1307, aber nur wenn ich 
mein Messgerät dran halte, außerdem fabriziert mir das ganze ungefähr 10 
Impulse.

Ich habe den Glättungskondensator am Eingang vergessen einzulöten, und 
scheinbar hat das den ds1307 derartig gestört dass er nicht mehr 
funktionieren wollte.

von Eumel (Gast)


Lesenswert?

coco jack schrieb:
> hmm die habe ich wirklich nicht, aber wozu ist die da?
> Leider habe ich auch keine Shottky hier zuhause rumliegen, kann ich da
> irgendetwas anderes für nutzen?

Na, weil sonst ein Strom fließt der die Spannung wieder dem Eingang 
anpasst?

Propier halt mal eine normale Diode, aber nicht wundern wenn es qualmt 
;)

von Coco J. (Firma: Student) (dathcoco)


Lesenswert?

der Unterschied zw. einer normalen Diode und einer Shotky ist doch 
ledigtlich der, dass die Shotky schneller schaltet. Außerdem wird sie 
als Spannungsgesteuerte Kapatzität genutzt (in diesem Fall)

von Sascha W. (sascha-w)


Lesenswert?

coco jack schrieb:
> der Unterschied zw. einer normalen Diode und einer Shotky ist doch
> ledigtlich der, dass die Shotky schneller schaltet.
genau, denn der Schaltregler soll ja die Spannungsreglung effizienter 
machen. Mit einer normalen Diode wirds auch erst mal gehen, zumal du ja 
auch keine für den Schaltregler geeignete Induktivität verwendest.

> Außerdem wird sie
> als Spannungsgesteuerte Kapatzität genutzt (in diesem Fall)
????? wie kommst du jetzt darauf ?????
Du solltest dir mal die Funktionsweise eines Schaltreglers anschauen, 
bevor du sowas einbaust! Und dann nicht auch noch Bauteile die 
dazugehören weglassen.
Ohne Diode wird die Ausgangsspannung nur mit einer Art PWM reduziert! 
Wie groß ist der Elko am rechten Anschluss von L1?

Sascha

von Coco J. (Firma: Student) (dathcoco)


Lesenswert?

der ist 220µF groß, wie es im Datenblatt stand. Jedoch vermutete ich 
dass schon alles enthalten war, und die Induktivität nur zur glättung 
der Ausganggspannung gedacht ist.

Egal, aus Fehlern lernt man, ich werde am Montag mal Conrad aufsuchen 
und mir die fehlenden Bauteile herraussuchen.

Mit einem LM317, (den ich auf 3,3V variabel gebaut habe) funktioniert 
alles einwandfrei.

Vielen dank erstmal für die zahlreiche Hilfe, ich denke nicht dass der 
Fehler alleine so schnell gefunden wäre.

PS.: ich komme darauf, da ich in der Vorlesung "Elektronische Bauteile" 
einmal eine Diode in Sperrichtung als Spannungsgesteuerte Kapatzität 
gesehen habe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.