Forum: Mikrocontroller und Digitale Elektronik TWI Bus Error


von willi2098 (Gast)


Lesenswert?

Hallo,

ich versuche gerade die RealTimeClock DS1307 mit einem ATMEGA16 per TWI 
anzusteuern. Dazu ist erst ein Schreibzugriff notwendig, um dem DS1307 
die Register-Adress mitzuteilen. Dann können ab dieser Adresse 
fortlaufend die Daten gelesen werden. Der Schreibzugriff funktioniert 
auch, wie er soll. Nur beim anschließenden Lesen der Werte bekomme ich 
ständig einen Bus-Error. Allerdings werden trotz Fehler die richtigen 
Werte aus dem DS1307 gelesen. Das verstehe ich nicht. Habe gestern schon 
den ganzen Tag nach dem Fehler gesucht, aber kann ihn nicht finden :(. 
Ich hoffe ihr könnt mir weiterhelfen.

Hier noch meine Quell-Code:
1
  twiInit(); debug();    // TWSR = 0x18
2
  twiStart(0b11010000, 0); debug();     // TWSR = 0x18
3
  twiWriteByte(0x00); debug();    // TWSR = 0x28
4
  twiStop(); debug();    // TWSR = 0x18
5
6
        _delay_ms(500);
7
8
  twiStart(0b11010000, 1); debug();    // TWSR = 0x40
9
10
  twiReadByte(); debug();    // TWSR = 0x00  <-  Bus error
11
  twiReadByte(); debug();    // TWSR = 0x00
12
  twiReadByte(); debug();    // TWSR = 0x00
13
  twiReadByte(); debug();    // TWSR = 0x00
14
  twiReadByte(); debug();    // TWSR = 0x00
15
  twiReadByte(); debug();    // TWSR = 0x00
16
  twiReadByte(); debug();    // TWSR = 0x00
17
  twiStop(); debug();     // TWSR = 0x18

Das debug(); gibt mir den Wert des TWSR auf einem LCD aus (siehe 
Kommentare).

1
void twiInit(void) {
2
  TWSR = 0x00;
3
  TWBR = 255;
4
  TWCR = (1 << TWEN);    // enable TWI
5
}
6
7
void twiStart(uint8_t address, uint8_t readMode) {
8
  TWCR = (1 << TWSTA) | (1 << TWINT) | (1 << TWEN);   // send start condition
9
  while (!(TWCR & (1 << TWINT)));
10
11
  if (readMode) twiWriteByte(address | 0x01);
12
  else twiWriteByte(0xfe & address);
13
}
14
15
void twiStop(void) {
16
  TWCR = (1 << TWSTO) | (1 << TWINT) | (1 << TWEN);    // send stop condidtion
17
}
18
19
void twiWriteByte(uint8_t data) {
20
  TWDR = data;
21
  TWCR = (1 << TWINT) | (1 << TWEN);
22
  while (!(TWCR & (1 << TWINT)));
23
}
24
25
uint8_t twiReadByte(void) {
26
  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA);
27
  while (!(TWCR & (1 << TWINT)));
28
29
  return TWDR;
30
}


Ich bedanke mich schonmal im Vorraus für eure Mühe.
Willi

von willi2098 (Gast)


Lesenswert?

OH Gott!

Ich ziehe die Frage zurück.

Habe gerade gemerkt, dass der Fehler bei der Ausgabe des Status-Byte auf 
dem Display lag.

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.