mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I²C/TWI Tutorial


Autor: Benjamin Pfeiffer (ben21684)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich weis es gibt schon viele fertige Programmbeispiele, zum Thema aber 
irgendwie steig ich da nicht so sehr durch. Ich möchte gern 2 Bytes 
(Werte von 0...255) von einem ATMega16 auf einen ATMega8 übertragen. Das 
ganze soll über TWI/I²C geschehen. Jetzt weis ich nicht so recht, wie 
ich dass programmieren soll. Schön wäre, wenn jemand mal ein Bespiel 
hätte, bei dem an einem µC eine Taste gredrückt wird und an einem 
anderen ne LED leuchtet. Die Programmierung für Master und Slave in C 
und so simple wie möglich gehalten. Ich denke sowas als Tutorial wäre 
echt hilfreich für viele User.
MFG Benny

Autor: Markus L. (lucky79)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Also ein Tutorial muss nicht unbedingt sein, da es beim durchstöbern 
dieses Forums ziemlich viele Lösungen gibt...

Weiters gibts da ja noch sehr gute Libs, die das auch voll in Software 
bewerkstelligen.

Grüße

Markus

Autor: Jan Krause (jeangonzales)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich kann die Anfrage schon verstehen, denn auch ich habe hier und 
woanders im web keine vernünftige Implementierung des TWI/I2C gefunden 
und mir deshalb ne eigene kleine Funktionssammlung geschrieben. Ich 
wollte die TWI-Kommunikation über Interrupts - also asynchron - lösen 
und habe es nach vielem Testen und Verzweifeln auch irgendwann 
hinbekommen und möchte meine Ergebnisse der interessierten Allgemeinheit 
nicht vorenthalten :)

Hier mal die Prototypen der Funktionen. Den ganzen Quellcode gibts im 
Anhang.

#define TWI_OK              0
#define TWI_ERR_BUSY        1
#define TWI_ERR_BUFFER_LEN  2

// init the twi
// piSlaveaddress:  own I2C address
// piBR:            baudrate prescaler (register TWBR)
void twi_init (uint8_t piSlaveAddress, uint8_t piBR);

// checks for a received message and copies the message into the supplied buffer
// ppiBuffer:   pointer to local databuffer
// piBufLen:    max len of databuffer
uint8_t twi_getMsg (uint8_t *ppiBuffer, uint8_t piBufLen);

// starts an async write request to slave with address piSlaveAddr.
// piSlaveAddr: I2C address of slave
// ppiData:     pointer to databytes
// piDataLen:   bufferlen in bytes
uint8_t twi_WriteBytesAsync (uint8_t piSlaveAddr, uint8_t *ppiData, uint8_t piDataLen);

// starts an async read request for slave with address piSlaveAddr and tries to receive piDataLen databytes
uint8_t twi_ReadBytesAsync (uint8_t piSlaveAddr, uint8_t piDataLen);

// checks for IDLE state
// returns "0" when IDLE, "1" else
uint8_t twi_busy (void);


Der Empfänger macht jetzt also etwas in dieser Form:

 uint8_t liRet;
 uint8_t laiTWIBuf[100];

 twi_init(1);

 sei();

 while (1)
 {
   // TWI Msg Handler
   liRet = twi_getMsg (laiTWIBuf, 100);
   if (liRet)
   {
     // Nachricht empfangen ...
   }



Der Sender könnte so aussehen:

 uint8_t laiTWIBuf[100];

 twi_init(2);

 sei();

 // laiTWIBuf mit Daten füllen
 // ...

 // und 3 Bytes an Slave 1 senden
 twi_WriteBytesAsync (1, laiTWIBuf, 3);


  

Autor: Jan Krause (jeangonzales)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, mit dem Amhang hab ich hier so meine Probleme... vielleicht jetzt?

Autor: Benjamin Pfeiffer (ben21684)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super danke erstmal für die Antworten. hab leider grad nicht so viel 
zeit werds mir die Woche mal anschauen. aber dass scheint genau das zu 
sein wonach ich gesucht habe.

Autor: Jan Krause (jeangonzales)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, schaus die an. Wenns hilft, bin ich froh :)
Ist zwar nicht wirklich dokumentiert, aber es funktioniert auf jeden 
Fall. Ich  kommuniziere damit zwischen einem ATMEGA32 und mehreren 
ATMEGA8, die jeweils ein grafisches Display und einen Drehgeber 
ansteuern. Ausserdem hängen noch ein paar PCF8574 und LM75 am Bus.

Gruß, Jan

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.