Forum: Mikrocontroller und Digitale Elektronik I2C kompatibel unter AVRs?


von Simon X. (simon1720)


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)


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)


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)


Lesenswert?

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

von Wolfgang (Gast)


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)


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.

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.