Forum: Mikrocontroller und Digitale Elektronik TWI - Problem Atmegas


von Jörgensen (Gast)


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 ?

: Verschoben durch User
von Tom (Gast)


Lesenswert?

Hallo Jörgensen,

Hast Du die richtigen Pullup's verwendet?


Ich habe das mal mit den internen versucht, hat aber nicht geklappt.
Effekt war ähnlich, der Atmega stellte sich tot.



Gruß,
Tom

von Jörgensen (Gast)


Lesenswert?

Natürlich hab an den zwei Leitungen jeweils ein Widerstand.

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.