TWI - Problem Atmegas

Gast #1883692
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 ?
Gast #1883709
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.