mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TWI bei mega644 nochmal :)


Autor: Jannik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So langsam komme ich der Sache näher, jedoch hat sich seit dem letzten 
Thema einiges bei dem Code verändert. Desshalb dieses Neue.

Der Master (Sender):
#include "twi_com.h"


int slave = 0b0100111;

void twi_init(void) {
  TWBR = 0x5c; //SCL auf 400KHz: 0x11 ; 200KHz: 0x2A ; 100KHz : 0x5C
  TWSR &= ~(1<<TWPS0) | ~(1<<TWPS1); //Prescale Bits - Teiler = 1
}

void twi_trans_value (void) {
    
  int value =100;  

  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);   //Start Condition senden

  while (!(TWCR & (1<<TWINT)));          //Warten ob erfolgreich
  
  TWDR = (slave<<1) | TW_WRITE; //Slave adresse + Zugriffsart (W) in Datenregister schreiben
  
  TWCR = (1<<TWINT) | (1<<TWEN); //TWDR senden

  while (!(TWCR & (1<<TWINT))); //Warten bis gesendet

  TWDR = value; //Daten in TWDR laden

  TWCR = (1<<TWINT) | (1<<TWEN); //Daten senden

  while (!(TWCR & (1<<TWINT)));  //Warten bis gesendet

  TWDR = 130; //Daten in TWDR laden

  TWCR = (1<<TWINT) | (1<<TWEN); //Daten senden

  while (!(TWCR & (1<<TWINT)));  //Warten bis gesendet

  TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); //STOP senden
  
  while (!(TWCR & (1<<TWINT)));

}

Der Slave (Empfänger)
int twi_data = 0;
uint8_t zaehler=0;

void twi_init(void) {

  TWAR = 0b01001110; //Slaveadr.... 
  TWCR = (1<<TWEA)|(1<<TWEN)|(1<<TWIE);
        
}




ISR (TWI_vect)
{   
 
  cli();
  
  char buffer [3];
  itoa(zaehler,buffer,10);
 
  twi_data = TWDR;

  itoa(twi_data,buffer,10);
  lcd_puts(small_font,&buffer); // Ausgabe auf Display
   
     
  TWCR |= (1<<TWINT);
  
  sei();

}

Ich bekomme vom Master Daten gesendet (1. 100 und 2. 130).
Allerdings erscheint auf meinem Display dann folgendes:
78 100 130 4

Woher die 78 kommt kann ich mir noch erklären. Das ist das erste Byte 
welches übertragen wird wo die Slaveadresse inkl. Datenrichtungsbit drin 
steht. Anschließend die 100 und die 130, so wie es soll.

UND auf einmal eine "4" ?! Wo kann die wegkommen. Auf dem Oszi sehe ich 
auch nix, woher diese kommen könnte. Kommt immer zum Ende?!

Noch zwei Fragen zum Verständnis vom I²C:
1. Um das Ack/NACK kümmmert sich doch intern im AVRmega die Hardware 
oder habe ich hier Softwareseitig was zu erfüllen? ACK kommt auf jeden 
Fall an. TWEA ist hier wohl das Stichwort!
2. Wird die ISR im Slave wirklich schon bei der Adresssendung vom Master 
aufgerufen oder erst nachdem der Slave mit seiner Adresse angesprochen 
wurde und mit Ack bestätigt dass eine Verbindung aufgebaut ist? Wunderte 
mich, dass er das erste Byte schon in der ISR einließt (also seine 
Slaveadresse + Datenrichtungsbit).

Viele Dank!

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.