Forum: Mikrocontroller und Digitale Elektronik I2C kompatibel unter AVRs?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Simon X. (simon1720)


Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe einen I2C Code geschrieben, der auf einem Atmega644PA läuft. 
Ich wollte jetzt diesen auf den Atmega2560 transferieren. Jedoch 
funktioniert dieser code dort überhaupt nicht mehr. Ich dachte die 
Register bleiben gleich oder stehe ich da falsch im Bild. Oder sieht 
jemand den fehler im Code.
1
#include <avr/io.h>
2
3
#include "i2c.h"
4
//Initialisierung
5
void i2c_init(void)
6
{
7
  TWBR = 8;
8
  TWCR = 0x84;
9
  TWSR = 0x00;
10
}
11
//I2C Starten, Adresse angeben
12
void i2c_start(uint8_t address, uint8_t read)  //schreiben 0 lesen 1
13
{
14
  // TWI START
15
  TWCR = 0xA4;
16
  
17
  // TWI SEND: address first brick
18
  while(!(TWCR & 0x80));
19
  TWDR = address | read;
20
  TWCR = 0x84;
21
}
22
//I2C stopen
23
void i2c_stop(void)
24
{
25
  // TWI STOP
26
  while(!(TWCR & 0x80));
27
  TWCR = 0x94;
28
}
29
//I2C schreiben, Daten angeben
30
void i2c_write(uint8_t data)
31
{
32
  // TWI SEND: data
33
  while(!(TWCR & 0x80));
34
  TWDR = data;
35
  TWCR = 0x84;
36
}
37
//I2C lesen, Register angeben und ACK oder NACK
38
uint8_t i2c_read(uint8_t sendACK)
39
{
40
  // TWI READ: send zero
41
  while(!(TWCR & 0x80));
42
  TWDR = 0xFF;
43
  TWCR = 0x84 | (sendACK ? 0x40 : 0x00);
44
  while(!(TWCR & 0x80));
45
  return TWDR;
46
}

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Simon X. schrieb:
> Jedoch funktioniert dieser code dort überhaupt nicht mehr.

Was heißt das?

> Ich dachte die Register bleiben gleich oder stehe ich da falsch im Bild.

Guckst du Headerfiles, die sich meist an das Datenblatt halten.

von Simon X. (simon1720)


Bewertung
0 lesenswert
nicht lesenswert
Die beiden I2C Pins am Mikrokontroller bleiben auf high und ändern sich 
nicht. Kompilieren lässt sich der Code. Oder was meinst du genau?

von Simon X. (simon1720)


Bewertung
0 lesenswert
nicht lesenswert
Im Datenblatt sehe ich keinen Unterschied zwischen den beiden 
Mikrokontrollern in dem berich was I2C angeht.

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Simon X. schrieb:
> Die beiden I2C Pins am Mikrokontroller bleiben auf high und ändern sich
> nicht. Kompilieren lässt sich der Code.

Mit der Fehlerbeschreibung kann man doch schon mal mehr anfangen.

Das Beste wird sein, wenn du dir das Datenblatt nimmst, den Debugger 
anschmeißt und verfolgst, ob deine "magic numbers" die richtigen Bits in 
den Registern ändern.

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Die beiden I2C Pins ...

Dass das ATmega2560.PD0&1, hingegen ATmega644.PC0&1 heißt, ist klar, 
oder? Mehr fällt mir ad hoc leider nicht ein.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.