Forum: Mikrocontroller und Digitale Elektronik DS1307 kein Clock-Output auf SQW


von Thinksilicon (Gast)


Lesenswert?

Hallo Forum,
habe leider mal wieder ein Problem. Habe mir kürzlich von eBay ein 
DS1307-Modul erstanden, damit ich eine genaue Zeitbasis und ein wenig 
nvram für mein Projekt habe. Der DS1307 soll dabei auf seinem SQW-Output 
sekündlich ein Signal geben, welches ich an einen Interrupt-Pin an 
meinem Atmega führe.

Ich hatte das ganze auch schon soweit laufen, aber irgendwann wollte der 
SQW-Output nix mehr ausgeben. Die Register des DS1307 lassen sich alle 
noch ohne Probleme über i2c auslesen und schreiben.

Ich initialisieren die RTC mit folgender Funktion:
1
/* Real-Time-Clock aktivieren und Clock-Output auf 1Hz
2
 * INT1 auf falling edge
3
 *
4
 */
5
uint8_t init_RTC() {
6
        if( i2c_start( DS1307 + I2C_WRITE) == 0 ) {
7
                i2c_write( 0x07 );
8
9
                // SQWE-Bit setzen fuer 1Hz Clock-Output
10
                i2c_write( 0x90 );
11
12
                i2c_stop();
13
                
14
                // Register auslesen zum Ueberpruefen
15
                i2c_start( DS1307 + I2C_WRITE );
16
                i2c_write( 0x07 );
17
                i2c_rep_start( DS1307 + I2C_READ );
18
                if( i2c_readNak() != 0x90 ) {
19
                    i2c_stop();
20
                    return( 1 );
21
                }
22
                i2c_stop();
23
                
24
                DDRD &= ~( 1<<DDD2 );   // Clear the PD2 pin
25
                                        // PD2 (INT0 pin) is now an input
26
                PORTD |= ( 1<<PD2 ); // Pull-Up on
27
28
                MCUCR |=  (1<<ISC01 ) | ( 1<<ISC11 );   // set INT0 to trigger on falling edge
29
                GICR |= ( 1<<INT0 );                    // Turns on INT0
30
31
                return( 0 );
32
        } else {
33
                return( 1 );
34
        }
35
}

Gebe ich dem Interrupt-Pin des Atmega manuell einen Impuls wird er auch 
ausgelöst. Nur am SQW-Pin der RTC kann ich nichts messen.

Da ich die Befürchtung hatte evtl. den Treiber-Transistor am Ausgang der 
RTC durch irgendetwas zerstört zu haben, habe ich nochmals ein neues 
Modul bestellt. Aber auch hier ist das gleiche zu beobachten: Register 
lassen sich lesen/schreiben, aber der Clock-Output bleibt stumm.

Was habe ich übersehen? Eigentlich hatte das ganze ja schon 
funktioniert???

von Thomas F. (igel)


Lesenswert?

Du hast Bit 7 in Register 0 gelöscht?

<Datasheet>
Note that the initial power-on state of all registers is not defined. 
Therefore, it is important to enable the oscillator (CH bit = 0) during 
initial configuration.
</Datasheet>

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thinksilicon schrieb:
> Nur am SQW-Pin der RTC kann ich nichts messen.

Auszug aus dem Datenblatt:

"The SQW/OUT pin is open drain which requires an external pullup 
resistor."

Pullup vergessen?

von Thinksilicon (Gast)


Lesenswert?

Hi,
vielen Dank für die Antworten! Jetzt klappt es! Pull-Up ist aktiv, daran 
hat es nicht gelegen -> PORTD |= ( 1<<PD2 ); // Pull-Up on

Aber natürlich lag es am Clock-Halt! Das muss wohl anfänglich aus irgend 
einem Grund mal auf 0 gestanden haben (Registerwert ist ja nicht 
definiert, bis zur Initialisierung). Dann hat es wohl mal umgeschlagen 
und seither ging es dann nicht mehr.

Wenn ich es jetzt beim Initialisieren setze, dann geht es wie gewünscht 
;-)

Nochmals vielen Dank - das hatte ich schlicht übersehen...

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.