www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TWI - Problem Atmegas


Autor: Jörgensen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
int main (void)
{

  lcd_init();               //lcd initialisieren
  init_interrupt();        //Interrups organisieren
    
  //Übertragungsrate auf 10000Hz setzen 
  TWBR = 48;
  TWSR = 1; 
      
  while(1)      
  {
            
    if (sekunden == Gesam_t)              // 600 sekunden
  
    {


    Geschwindigkeit = (Ct * Si_wert) / Gesam_t;

      
    
    //TWI aktivieren:
           TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    while(!(TWCR & (1<<TWINT)));
    //TWDR = 1<<1|TWIM_SCHREIBEN;      // Adresse des slaves und schreiben

    TWDR=2;  
        
    TWCR = (1<<TWINT)|(1<<TWEN);
       while (!(TWCR & (1<<TWINT)));    //warten

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

    TWDR = Si_wert;
    TWCR = (1<<TWINT)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT)));  //warten
    //Stop:
    TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)|(1<<TWEA);
        
    Si_wert = 0;        // Si_wert  null setzen
      
    sekunden = 0;          // 10 minuten zurücksetzen    
  
    }
  }
}      
 

Slave

int main (void)
{

lcd_init();               //lcd initialisieren
        
      
  sei();          //Globale Interrupts einschalten

  Start_Clock();      //Starten der DCF77 Uhr  
      
  //Übertragungsrate auf 10000Hz setzen
  TWBR = 48;
  TWSR = 1; 

  while (1)
  {
      LCD_ZEIT_DATUM_ANZEIGEN();

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

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

      if(TWCR & (1<<TWINT))
      {

      //ohne Ack:
            TWCR = (1<<TWINT)|(1<<TWEN);
          while (!(TWCR & (1<<TWINT)));
        Geschwindigkeit = TWDR;


      TWCR = (1<<TWINT)|(1<<TWEN);
          while (!(TWCR & (1<<TWINT)));
      Si_wert = TWDR;

      //Stop:
      TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)|(1<<TWEA);
      }
        
      
    }  
  
  
return (1);
}

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 Moderator
Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörgensen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich hab an den zwei Leitungen jeweils ein Widerstand.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.