www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TWI I2C Anfängerhilfe


Autor: Sebastian E. (musarati)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich suche Infos für Anfänger um an einem Atmega8 den TWI Bus zum laufen 
zu bekommen.

Ich habe das AVR TWI gesehen, aber mich würde vor allem mal 
interessieren, wie ich PC4/5 dazu bringe kein Ein/Ausgang zu sein, 
sondern ein TWI zu sein.

Also so ein richtiges Anfänger Tut.

Grüße

Sebastian

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sofern auf PC4/5 das TWI hängt, einfach TWI per enable Bit einschalten.
(Baudrate noch festlegen)
Geh einfach mal das Datenblatt vom AVR durch, da ist das
gut beschrieben. Im Prinzip muss deine software nur dem TWI
einen Auftrag geben, dann warten bis das IRQ Flag gesetzt wird und 
entsprechend dem Status den Nächten Auftrag geben.

Was wann wie gemacht werden kann und welche folgen es hat steht im.... 
Datenblatt :-)

Tipp: Besorge die einen I2C Sniffer! Speicheroszi geht zwar auch,
ist aber sehr mühsam.

Autor: Sebastian E. (musarati)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim schrieb:
> Was wann wie gemacht werden kann und welche folgen es hat steht im....
> Datenblatt :-)

Naja, wenn man weiß wonach man suchen muss bestimmt toll, aber auf den 
310 Seiten als Anfänger was zu finden nicht so toll ;)

Ich hab die Fuse Bit Seite angeschaut aber da ist nicht passendes - 
kannst du mir auf die Sprünge helfen?

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich würde ab der Seite 163 versuchen. Da startet die Beschreibung 
für TWI.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian E. schrieb:
> Tim schrieb:
>> Was wann wie gemacht werden kann und welche folgen es hat steht im....
>> Datenblatt :-)
>
> Naja, wenn man weiß wonach man suchen muss bestimmt toll, aber auf den
> 310 Seiten als Anfänger was zu finden nicht so toll ;)

Darum ist das Datenblatt ja auch in Kapitel organisiert :-)

> Ich hab die Fuse Bit Seite angeschaut aber da ist nicht passendes -
> kannst du mir auf die Sprünge helfen?

Die Fuse Bits werden dir da nicht weiterhelfen.


Hinweis: Es gibt ein Kapitel "Two Wire Serial Interface"
Dreimal darfst du raten, worum es in diesem Kapitel geht

Hinweis 2: Du hast dir im PDF hoffentlich das "Inhaltsverzeichnis" 
dazugeschaltet, auch wenn der entsprechende Schalter links mit dem 
Tooltip 'Bookmarks' versehen ist? (Das Blatt Papier mit der blauen 
Fahne)

Autor: Sebastian E. (musarati)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Hinweis: Es gibt ein Kapitel "Two Wire Serial Interface"
> Dreimal darfst du raten, worum es in diesem Kapitel geht

Schon klar... ich habe mir auch schon alles über die Kommunikation 
durchgelesen, aber den Part "Send START condition" braucht man denke ich 
nur um die Kommunikation einzuleiten, nicht aber für die Konfiguration 
der Pins oder?

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal auf Seite 169 unter "SCL and SDA Pins".

Autor: Sebastian E. (musarati)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oje schwere Geburt...
Für alle dies mal suchen:

von Seite 169 landet man auf Seite 61.
Da steht dann:
When the TWEN bit in TWCR is set (one) to enable the
Two-wire Serial Interface, pin PC4 is disconnected from the port and becomes the Serial Data
I/O pin for the Two-wire Serial Interface.

Also man muss nichts aktivieren, es reicht wenn das TWEN Bit gesetzt 
wird.

Das wiederum (so schauts mir auf Seite 177 aus) wird einfach im TWI 
Control Register (Befehl TWCR) erledigt.

stimmts?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Das wiederum (so schauts mir auf Seite 177 aus) wird einfach im TWI
>Control Register (Befehl TWCR) erledigt.
>stimmts?

Ja. Und in der Beschreibung zum TWEN-Bit steht das Gleiche.

MfG Spess

Autor: Sebastian E. (musarati)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahja wenn man das weiß kann man auch schonmal mit AVR TWI was 
anfangen ;)

ich versuche nämlich den SAA1064 mit 2 7-Segmentanzeigen die ich auf 
meinem Breadboard zusammengesteckt habe zum laufen zu bringen ;)

Das erweist sich als schwieriger als gedacht aber wenns einfach wäre 
könnts ja jeder 8)
#include <avr/io.h>

int main(void)
{

  PORTC = 0xff;                 /* Alle Pull-UP Widerstände aktivieren */
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);    /* TWEN (aktiviert TWI), TWSTA (ich bin Master), TWINT (Interupt)*/
  while (!(TWCR & (1<<TWINT)))        /* wenn Interupt nicht auf 1 ist dann */
  {
    TWDR = 0x70;              /* Adresse HEX 70 festlegen */
    TWCR = (1<<TWINT) | (1<<TWEN);      /* wenn Interupt nicht auf 1 ist dann */
    while (!(TWCR & (1<<TWINT)))      /* Interupt auf 1 und */
    {
    /* if ((TWSR & 0xF8) != MT_SLA_ACK)    /* wenn Start nicht richtig empfangen wurde */*/
    /* ERROR();                /* mal eine Errorrutine schreiben wenn mans mal kann*/*/
    TWDR = DATA;              /* Daten senden */
    TWCR = (1<<TWINT) | (1<<TWEN);      /* Twen (da Bus aktiv, wird zuerst gestoppt und dann wieder gestartet) + Interupt*/
      };
  };
return (0);
}

so ich hoffe jemand erbarmt sich und liest sichs mal durch.

Was ich noch nicht verstanden habe:

Gehören Subadressen mit in den Data Block? Wenn ja, der Datablock darf 
ja nur 8 Bit haben, also muss ich danach das ganze Spiel von vorne 
starten nur  beim 2. mal mit den Daten?

Danke für eure Geduld ;)

Grüße Sebastian

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> so ich hoffe jemand erbarmt sich und liest sichs mal durch.

Ich versuchs mal...
PORTC = 0xff;                 /* Alle Pull-UP Widerstände aktivieren */
Warum? du hast aber schon extern 4,7K Pullups am BUS ja?
 TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);    /* TWEN (aktiviert TWI), TWSTA (ich bin Master), TWINT (Interupt)*/
TWEN passt ja noch,
TWSTA = das TWI soll Master werden
TWINT setzt hier das Flag zurück, gibt dem TWI also die freigabe zu 
arbeiten. Hat bei dir erstmal nix mit IRQs zu tun.

  while (!(TWCR & (1<<TWINT)))        /* wenn Interupt nicht auf 1 ist dann */
Solange (!(TWCR & (1<<TWINT))) hast du am TWI NIX rumzufummeln.
Da ding versucht nämlich gerade Busmaster zu werden (1<<TWSTA).
Sollte das geklappt haben spring TWINT auf 1.
Solange musst du *warten*:
while (!(TWCR & (1<<TWINT))) {
 asm volatile ("nop");
};

Dann das TWSR hohlen, putzen, auswerten und entsprechend
Tabelle 99 Seite 180 handeln:
void twi_handler(void){
 uint_8t twi_status;
 twi_status = TWSR & 0xf8;
 if (twi_status == 0x08){
  // Start hat geklappt
  // Jetzt Zieladresse senden
  TWDR = 0x70;  // Stimmt das das R/W flag????
  // Fertig, TWI soll weitermachen:
  TWCR = (1<<TWINT)|(1<<TWEN);
 } else if (twi_status == 0x18){
  // Slave ACK
  TWDR = 0x33;  // die zu sendenden Daten
  // Fertig, TWI soll weitermachen:
  TWCR = (1<<TWINT)|(1<<TWEN);
 } else if (twi_status == 0x00){
  // Oh, Bus error....
  //....
 };
};
Jetzt must du das nur noch für alle anderen (relevanten) Statuscodes
erweitern. Die Funktion rufst du immer dann auf, wenn das TWI seinen
Auftrag erledigt hat.
while (1) {
 // Warten auf twi.....
 while (!(TWCR & (1<<TWINT))) {
  asm volatile ("nop");
 };
 // Status bearbeiten
 twi_handler();
};

Das ist kein funktionsfähiger (oder gar geprüfter) code.
Er soll dir nur den weg zeigen.....

Das TWI ist eine (billige) statemaschine.
Du gibst ihr einen Auftrag (Start||Stop||Daten) + TWINT=1 und
dann werkelt das teil. Wenn es eine Entscheidung brauch was
als nächtes zu tun ist setzt es TWSR + TWINT und wartet.
(Solange ist auch der Bus blockiert)
Alles was dein code tun ist die (richtige) entscheidung zu
fällen und dem TWI einen neuen Auftrag zu geben.

> Danke für eure Geduld ;)
Lies erstmal das Datasheet und verstehe wie das ding arbeitet.
Dann schreib code. Mit rumprobieren kommt du beim TWI NIE an ziel.
Hoffe du hast wenigstens einen funktionierenden UART um die
Status/Debuginfos ausgeben zu lassen.

Autor: Sebastian E. (musarati)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim schrieb:
>> Danke für eure Geduld ;)
> Lies erstmal das Datasheet und verstehe wie das ding arbeitet.
> Dann schreib code. Mit rumprobieren kommt du beim TWI NIE an ziel.
> Hoffe du hast wenigstens einen funktionierenden UART um die
> Status/Debuginfos ausgeben zu lassen.

OK... also ich vergess das ganze dann mal und fang weiter unten an ;)

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.