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???