Forum: Mikrocontroller und Digitale Elektronik TWI (IC2) ATMEL (DVK90CAN1 & AT90CAN128)


von Markus (Gast)


Lesenswert?

Hallo,

ich versuche gerade auf dem AT90CAN128 TWI zum Laufen zu bringen. Jedoch 
doch kommt auf dem Oszi bei SCL nichts an. Wenn ich das gleiche auf dem 
DVK90CAN1 laufen lasse bekomme ich ein periodische Rechtecksignal 
(Obwohl dieses nicht periodisch halb symmetrisch ist).

Quarze sind beide gleich und alle Fuse bits sind gleich gesetzt.
Ich wüsste nicht wo zwischen DVK und AT90 dann noch ein Unterschied 
bestehen könnte. Weiß jemand wo noch Veränderungen vorzunehmen sind? Für 
Hinweise wäre ich sehr dankbar.

Ich habe das ganze auch noch mit einem zweiten AT90CAN128 getestet. Ohne 
Erfolg.

von Mick (Gast)


Lesenswert?

Hast du die Pull-Up Widerstände vergessen?

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mehre Varianten versucht.

SCL - 5V (4,7k)
SDA - 5V (4,7k)

SCL - 5V (10k)
SDA - 5V (10k)

und keine Widerstände.

Am Oszi hat sich dabei nur die Y-Achse verschoben. Die Kurven blieben 
gleich.

IMG-6735 zeigt den DVK
IMG-6736 zeigt den AT90

von Mick (Gast)


Lesenswert?

Bringt dich das hier vielleicht weiter?

Beitrag "I²C (TWI) beim AT90CAN128"

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Also mittlerweile weiß ich gar nicht mehr wo ran es liegen könnte. Denn 
beim AT90CAN springt es mittlerweile weiter im Programm als beim DVK.

Das ist mein Programm was auf beiden läuft (orientiert an Peter Fleury)
Was ich ansteuern möchte ist der MCP4706A0.

Link zum MCP
http://ww1.microchip.com/downloads/en/DeviceDoc/22272A_MCP4706.pdf


Ich hoffe es kann mir jemand weiter helfen. Sehe keinen unterschied zu 
Code Beispielen, die ich sonst noch gefunden habe.
1
#include "main.h"
2
3
#define FOSC           16000        // 8 MHz External cristal
4
#define F_CPU          (FOSC*1000L) // Need for AVR GCC
5
#define SCL_CLOCK  100000L /* I2C clock in Hz */
6
7
#define MCP4706A0 0x60 //i2c address for mcp4706A0
8
9
10
void i2c_init(void){
11
  TWSR = 0;
12
  TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
13
}
14
15
unsigned char i2c_start(unsigned char address_and_RW_bit){
16
  uint8_t twst;
17
18
  TWCR = (1<< TWINT) | (1<< TWSTA) | (1<<TWEN);
19
  
20
  while(!(TWCR & (1<<TWINT)));
21
  PORTA = 0x03; //two LEDs on (Bis hier läuft das Programm beim DVK)
22
  
23
  twst = TW_STATUS & 0xF8;
24
  if ( (twst != TW_START) && (twst != TW_REP_START)) return 0;
25
26
  TWDR = address_and_RW_bit;
27
  TWCR = (1<<TWINT) | (1<<TWEN);
28
  
29
  while(!(TWCR & (1<<TWINT)));
30
  PORTA = 0x07; // three LEDs on
31
  
32
  twst = TW_STATUS & 0xF8;
33
  if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 0;
34
35
  return 1;
36
}
37
38
unsigned char i2c_write(unsigned char data){
39
  uint8_t   twst;
40
  
41
  TWDR = data;
42
  TWCR = (1<<TWINT) | (1<<TWEN);
43
44
  while(!(TWCR & (1<<TWINT)));
45
46
  twst = TW_STATUS & 0xF8;
47
  if( twst != TW_MT_DATA_ACK) return 1;
48
  return 0;
49
}
50
51
void i2c_stop(void){
52
  TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
53
  
54
  while(TWCR & (1<<TWSTO));
55
}
56
57
int main(void)
58
{
59
  //Set direction
60
  DDRA = 0xFF;
61
  //Turn off all relays
62
  PORTA = 0x00;
63
  
64
  i2c_init();
65
  PORTA = 0x01; // one LED on
66
  
67
  while (1){
68
    if (i2c_start(MCP4706A0 + 0)){
69
      PORTA = 0x0F; // four LEDs on 
70
      
71
      i2c_write(MCP4706_0KOhm); //Set up device
72
      i2c_write(0x0F); // Set digital to analog output (0x00 - 0xFF)
73
      i2c_stop();
74
    }
75
    else{
76
      i2c_stop();
77
    }
78
  }
79
  
80
  return 0;
81
}

von Markus (Gast)


Lesenswert?

Habs hinbekommen. Prinzipielle Aufbau sowie der C-Code haben gestimmt.

Jedoch haben wohl beide der AT90 sowie der DVK beim Zusammenstecken 
einen Schuss abgekommen. Irgendwie muss eine Überbrückung kurzfristig 
dagewesen sein. Die I2C Pins können das wohl nicht gut ab.

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.