Forum: Mikrocontroller und Digitale Elektronik TWI Master-Slave will nicht so ganz


von DeGast (Gast)


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
}

von DeGast (Gast)


Lesenswert?

Währe wirklich super wenn mir jmd. sagen könnte wo mein Fehler liegt

von Sascha W. (sascha-w)


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

von DeGast (Gast)


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

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.