Forum: Mikrocontroller und Digitale Elektronik Problem mit TWI


von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

mache grade erste Gehversuche mit TWI. Es soll eine Speicheradresse 
eines ICs ausgelesen werden.

Leider hängt das Programm in dieser Subfunktion (siehe Pfeil):
1
#define BASEADR    0x19  // Basisadresse lt. Datenblatt: 0011001  
2
#define TW_READ    1    // LSB bei Busadresse zur Kennzeichnung eines Lesezugriffes
3
#define TW_WRITE   0    // LSB bei Busadresse zur Kennzeichnung eines Schreibzugriffes
4
5
...
6
7
8
/**
9
  @brief  Byte aus EEPROM von Adresse lesen
10
  @param  Adresse
11
  @return  Datenbyte
12
*/
13
14
uint8_t EEPROM_ByteRead(uint16_t addr) 
15
{
16
  uint8_t wert;
17
  
18
  i2c_start(); 
19
  i2c_send(BASEADR | TW_WRITE); <--- *** an dieser Stelle haengt das Programm ***
20
21
  //  i2c_send(addr >> 8, 0);    // bei 16-Bit Adressierung HSB zuerst
22
  i2c_send(addr);
23
24
  i2c_start();
25
  i2c_send(BASEADR | TW_READ);
26
  wert = i2c_receive(0);
27
  i2c_stop();
28
  return wert;
29
}

Der Controller ist ein M168 und und verwendet wird AVR-Studio 4.19/GCC.
Der IC ist ein Beschleunigungssensor und kein Eeprom.

Im Anhang ist der vollständige Beispiel-Code für das Eeprom, an dem ich 
mich orientiere.

Kann man an dem geposteten Code schon absehen, wo der Fehler liegt? 
Ansonsten kann ich später auch den von mit veränderten Code-Teil 
(Änderungen nur in der Main-Funktion vorgenommen) posten (ist auf einem 
anderen Rechner).

von hp-freund (Gast)


Lesenswert?

Das Übliche.
Schiebe deine BASEADR eins nach links.

von Route_66 H. (route_66)


Lesenswert?

Frank schrieb:
> #define BASEADR    0x19  // Basisadresse lt. Datenblatt: 0011001

Nimm mal als BASEADR 0x32

Frank schrieb:
> i2c_send(BASEADR | TW_WRITE); <--- *** an dieser Stelle haengt das

Frank schrieb:
> #define TW_WRITE   0    // LSB bei Busadresse zur Kennzeichnung eines

Ein 0-Bit kann nicht mit OR erzeugt werden!

: Bearbeitet durch User
von Frank (Gast)


Lesenswert?

Danke!

hp-freund schrieb:
> Das Übliche.
> Schiebe deine BASEADR eins nach links.

Route 6. schrieb:
> Nimm mal als BASEADR 0x32

0x32 -> binär: 110010

Das sieht schon mal besser aus! :-)



Route 6. schrieb:
> Frank schrieb:
>> #define TW_WRITE   0    // LSB bei Busadresse zur Kennzeichnung eines
>
> Ein 0-Bit kann nicht mit OR erzeugt werden!

Das wundert mich auch.

von Einer K. (Gast)


Lesenswert?

Frank schrieb:
> Das wundert mich auch.

Bewirkt nix.
Stört aber auch nicht.

Der Kompiler wirds wohl großzügig weg optimieren.

von Route_66 H. (route_66)


Lesenswert?

Arduino F. schrieb:
> Bewirkt nix.
> Stört aber auch nicht.

Ja, in diesem Programmteil ist das nebensächlich. Solche Unarten darf 
man sich aber grunsätzlich nicht angewöhnen.

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.