Forum: Mikrocontroller und Digitale Elektronik I2C funkt nicht auf dem ATmega8 (ATmega128)


von Manuel -. (ploana)


Lesenswert?

Ich finde keinen Fehler an meinem Code

Im ersten schritt stelle ich die Baudrate ein, und dann sollte es los 
gehen ...

Im Debuger sehe ich, dass das TWINT Bit nicht gesetzt oder gleich wieder 
auf 0 gesetzt wird

somit bleibt das programm schon in der ersten while schleife hängen:
1
  TWSR = 0;                         // no prescaler 
2
   TWBR = ( ( (F_CPU/SCL_CLOCK)-16 )/2 );  // must be > 10 for stable operation
3
  while (1)      //Endlosschleife
4
  {
5
    
6
    // send START condition
7
    //TWCR = 0x00 | (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
8
    TWCR = 0x00;
9
    TWCR |= (1<<TWEN);
10
    TWCR |= (1<<TWINT);
11
    TWCR |= (1<<TWSTA);
12
    
13
    
14
    asm("nop");
15
16
    // wait until transmission completed
17
    while(!(TWCR & (1<<TWINT)));
18
19
    // check value of TWI Status Register. Mask prescaler bits.
20
    twst = TW_STATUS & 0xF8;
21
    if ( (twst != TW_START) && (twst != TW_REP_START)) PORTD = 0x01;
22
23
24
25
    // send device address
26
    TWDR = address;
27
    TWCR = (1<<TWINT) | (1<<TWEN);
28
29
    // wail until transmission completed and ACK/NACK has been received
30
    while(!(TWCR & (1<<TWINT)));
31
32
    // check value of TWI Status Register. Mask prescaler bits.
33
    twst = TW_STATUS & 0xF8;
34
    if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) PORTD = 0x02;
35
36
37
38
    // send data to the previously addressed device
39
    TWDR = 0xF0;
40
    TWCR = (1<<TWINT) | (1<<TWEN);
41
42
    // wait until transmission completed
43
    while(!(TWCR & (1<<TWINT)));
44
45
    // check value of TWI Status Register. Mask prescaler bits
46
    twst = TW_STATUS & 0xF8;
47
    if( twst != TW_MT_DATA_ACK) PORTD = 0x04;
48
49
50
51
    //send stop condition
52
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
53
  
54
    // wait until stop condition is executed and bus released
55
    while(TWCR & (1<<TWSTO));


lg und danke im voraus

von Oliver (Gast)


Lesenswert?

>// wait until transmission completed

Wenn du das im Simulator-Debugger laufen lässt, wird die Transmission ja 
auch niemals completed, weil nix am TWI-Bus dranhängt.

http://homepage.hispeed.ch/peterfleury/i2cmaster.zip
kennst du sicherlich? Das Original funktioniert nämlich einwandfrei.

Oliver

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.