I2C kompatibel unter AVRs?

OP #5606483
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
}
Gast #5606501
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren