Hallo Zusammen,
Ich versuche gerade mit einem Atmega328PU per I2C-Protokoll auf den
Uhrenchip DS1307 zuzugreifen. Verwendet wird die I2C-Bibliothek von P.
Fleury.
Ich bekomme immer beim Versuch auf den Uhrenchip zuzugreifen statt ACK
ein NACK.
Was mich irritiert: Laut Screenshot "NACK mit Atmega" interpretiere ich
den Eintrag "Write [0x34] + NAK" so, das versucht wird, auf die Adresse
0x34 des DS1307 zuzugreifen. Aber ich übergebe die Adresse 0x68 laut
Listing.
Ich habe, um Verdrahtungsfehler auszuschließen, versucht, mit Arduino
UNO und der dort enthaltenen WIRE-Bibliothek auf die Platine mit dem
Uhrenchip zuzugreifen, dort funktioniert es, ich bekomme ein ACK (siehe
Anhang "ACK mit ARDUINO). Sieht jemand, ob ich hier einen Fehler gemacht
habe?
Viele Grüße,
tetra
1 | #include <avr/io.h>
|
2 | #include "i2cmaster.h"
|
3 |
|
4 | #define F_CPU 20000000 // processor clock frequency 20 MHz
|
5 | #define DS1307_Adresse 0x68
|
6 |
|
7 |
|
8 | void Initialisierung()
|
9 | {
|
10 | // ----- INITIALISIERUNG -----
|
11 | i2c_init(); // initialize I2C library
|
12 | DDRB |= (1<<DDB1); //Pin PB1 (LED) wird auf Ausgang geschaltet
|
13 | ClearHoldBit(); //Falls der Oszillazor ausgeschaltet sein soll
|
14 | SQW_ON(); //der Ausgang erzeugt ein 1 Hz Rechtecksignal
|
15 | LEDOff();
|
16 | }
|
17 |
|
18 | void SQW_ON()
|
19 | {
|
20 | i2c_start(DS1307_Adresse);
|
21 | i2c_write(0x07); // Control-Register ansprechen
|
22 | i2c_write(0x90); // Setzen auf B 10010000 -> 1 Hz-Ausgang freigeschaltet (1 Hz =>> 0x90 !!!!)
|
23 | i2c_stop(); // set stop condition = release bus
|
24 | }
|
25 |
|
26 | void ClearHoldBit() //There is the CH (clock halt) bit, bit 7 in register 0. If that got set to 1 somehow, the oscillator will not run and neither will SQW.
|
27 | {
|
28 | if (i2c_start(DS1307_Adresse) == 0)
|
29 | {
|
30 | i2c_write(0x00); // Control-Register ansprechen
|
31 | i2c_write(0x40); // Setzen auf B 01000000 -> Clock-Hold-Bit wird geloescht)
|
32 | i2c_stop(); // stop transmitting
|
33 | LEDOff(); //Wenn OK LED aus
|
34 | }
|
35 | else if (i2c_start(DS1307_Adresse) == 1)
|
36 | {
|
37 | LEDOn(); //bei Fehler LED ein
|
38 | }
|
39 | }
|
40 |
|
41 | void LEDOn()
|
42 | {
|
43 | PORTB |= (1<<PORTB1); //LED an PB1 einschalten
|
44 | }
|
45 |
|
46 | void LEDOff()
|
47 | {
|
48 | PORTB &= ~ (1<<PORTB1); //LED an PB1 ausschalten
|
49 | }
|
50 |
|
51 | int main(void)
|
52 | {
|
53 | Initialisierung();
|
54 | while (1)
|
55 | {
|
56 | }
|
57 | }
|