TWI - Problem Atmegas

Gast #1883692
Lesenswert?

Hallo freunde,

ich versuche zwischen zwei Atmegas ein TWI-schnittstelle zu realisieren.
Der Master, in diesem Fall Atmega 16L soll nach einer gewissen Zeit, 2 
werte über diese Schnitstelle verschicken. Der Atmega 32 soll die werte 
Empfangen und verarbeiten.

Master
1
int main (void)
2
{
3

4
  lcd_init();               //lcd initialisieren
5
  init_interrupt();        //Interrups organisieren
6
    
7
  //Übertragungsrate auf 10000Hz setzen 
8
  TWBR = 48;
9
  TWSR = 1; 
10
      
11
  while(1)      
12
  {
13
            
14
    if (sekunden == Gesam_t)              // 600 sekunden
15
  
16
    {
17

18

19
    Geschwindigkeit = (Ct * Si_wert) / Gesam_t;
20

21
      
22
    
23
    //TWI aktivieren:
24
           TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
25
    while(!(TWCR & (1<<TWINT)));
26
    //TWDR = 1<<1|TWIM_SCHREIBEN;      // Adresse des slaves und schreiben
27

28
    TWDR=2;  
29
        
30
    TWCR = (1<<TWINT)|(1<<TWEN);
31
       while (!(TWCR & (1<<TWINT)));    //warten
32

33
    TWDR = Geschwindigkeit;
34
    TWCR = (1<<TWINT)|(1<<TWEN);
35
    while (!(TWCR & (1<<TWINT)));    //warten
36

37
    TWDR = Si_wert;
38
    TWCR = (1<<TWINT)|(1<<TWEN);
39
    while (!(TWCR & (1<<TWINT)));  //warten
40
    //Stop:
41
    TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)|(1<<TWEA);
42
        
43
    Si_wert = 0;        // Si_wert  null setzen
44
      
45
    sekunden = 0;          // 10 minuten zurücksetzen    
46
  
47
    }
48
  }
49
}

Slave
1
int main (void)
2
{
3

4
lcd_init();               //lcd initialisieren
5
        
6
      
7
  sei();          //Globale Interrupts einschalten
8

9
  Start_Clock();      //Starten der DCF77 Uhr  
10
      
11
  //Übertragungsrate auf 10000Hz setzen
12
  TWBR = 48;
13
  TWSR = 1; 
14

15
  while (1)
16
  {
17
      LCD_ZEIT_DATUM_ANZEIGEN();
18

19
      //Eigene Slave-Ansprechadresse einstellen
20
        TWAR = (1 << 1);
21

22
      //TWI aktivieren:
23
        TWCR = (1<<TWEN)|(1<<TWEA);
24

25
      if(TWCR & (1<<TWINT))
26
      {
27

28
      //ohne Ack:
29
            TWCR = (1<<TWINT)|(1<<TWEN);
30
          while (!(TWCR & (1<<TWINT)));
31
        Geschwindigkeit = TWDR;
32

33

34
      TWCR = (1<<TWINT)|(1<<TWEN);
35
          while (!(TWCR & (1<<TWINT)));
36
      Si_wert = TWDR;
37

38
      //Stop:
39
      TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)|(1<<TWEA);
40
      }
41
        
42
      
43
    }  
44
  
45
  
46
return (1);
47
}

Das Problem nach der erechnung der Geschwinidgkeit bleibt das Programm 
irgendwo stecken und verschickt nicht die werte zum Atmega32.

was mach ich falsch ?

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