TWI Master-Slave will nicht so ganz

Gast #2588168
Lesenswert?

Hallo,
ich habe 2 Atmega8 über TWI verbunden und verwende folgendes Programm, 
jedoch tut sich bei dem Slave nichts... währe super wenn einer von euch 
mit vlt. helfen könnte

Slave:
1
#define F_CPU 1000000
2

3
#include <avr/io.h>
4
#include <util/delay.h>
5

6

7
void twi_init()
8
{
9
  // 10khz 
10
  TWBR = 10;
11
  TWSR = 1;
12

13
  // Meine Adresse
14
  TWAR = 50;
15

16
  // TWI aktivieren
17
  TWCR = (1<<TWEN | 0<<TWSTO | 1<<TWSTA);
18
}
19

20

21
int main(void)
22
{
23
  // PortB als Eingang
24
  DDRB = (1<<0 | 1<<1 | 1<<2 | 1<<3);
25

26
  // TWI Init
27
  twi_init();
28
  _delay_ms(500);
29

30
  while(1)
31
  {
32
    PORTB = TWDR;
33
  }
34
}


Der master
1
#define F_CPU 1000000
2

3
#include <avr/io.h>
4
#include <util/delay.h>
5

6

7
void twi_init()
8
{
9
  // 10khz 
10
  TWBR = 10;
11
  TWSR = 1;
12
}
13

14
void send(unsigned char daten)
15
{
16
  // Startbedingung
17
  TWCR = ((1<<TWINT) | (1<<TWSTA) | (1<<TWEN));
18
  
19
  // Warten
20
  while(!(TWCR &(1<<TWINT)));
21
  
22
  // Adresse von dem Slave auf dem Bus senden
23
  TWDR = 50;
24
  TWCR = ((1<<TWINT) | (1<<TWEN));
25
  while(!(TWCR &(1<<TWINT)));
26

27
  //Daten senden
28
  TWDR = daten;
29
  TWCR = ((1<<TWINT) | (1<<TWEN));
30
  while(!(TWCR &(1<<TWINT)));
31

32
  // Stopp senden
33
  TWCR = ((1<<TWINT) | (1<<TWSTO) | (1<<TWEN));
34
}
35

36
int main(void)
37
{
38
  // Variablen
39
  unsigned char zustand;
40

41
  // PortB als Eingang
42
  DDRB = 0;
43

44
  // TWI Init
45
  twi_init();
46
  _delay_ms(500);
47

48
  while(1)
49
  {
50
    // Status von PortB abfragen
51
    zustand = PINB;
52

53
    send(zustand);
54

55
    _delay_ms(100);
56
  }
57
}
#2588670
Lesenswert?

Hallo,

Erst mal,
am Slave hat TWSTA beim Init nichts zu suchen - du willst ja keine 
Startbedingung senden. Dafür musst du TWEA setzen.

Im übrigen währe es für Tests sinnvoll wenn du am Master die Statusbits 
(TWSR) ausgeben könntest - das erleichtert die Fehlersuche ungemein. Im 
übrigen sollte man die auch nach jeder Aktion prüfen.

Sascha
Gast #2589409
Lesenswert?

...
1
  // TWI aktivieren
2
  TWCR = (1<<TWEN | 0<<TWSTO | 0<<TWSTA | 1<<TWEA);
...

Habe ich jetzt umgeändert, jedoch leuchtet immer nur ein und die selbe 
led bei den anderen tut sich nichts, es ändert sich auch nichts wenn ich 
die eingänge per schalter am master ändere.

Eine Möglichkeit zum anzeigen habe ich leider nicht.

Im späterem Velrauf wollte ich das ganze noch in Interrupts und 
Statusabfragen verpacken mir ging es jetzt hedoch ersteinmal darum 
überhaupt etwas zu "versenden" über TWI

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