- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: I²C Bus mit C Programmieren

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    26.04.2006
    Beiträge
    18
    Anzeige

    Powerstation Test
    ja danke ich werd mal ausprobieren, ob die sache bei meinem board ebenfalls funktioniert
    gruß Green Hell

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    17.07.2006
    Beiträge
    30
    Hallo zusammen,

    ich bin Neuling auf dem Gebiet der uC. Seit neustem beschäftige ich mich mit dem TWI. Der Code von bhm hat mir schon seehr viel geholfen, allerdings hab ich ihn teilweise noch nicht ganz durchschaut. Wer hat Lust, mir folgende Zeilen (den Knackpunkt der Funktion) zu erklären:

    Auszug aus Master-Receiver von bhm's TWI-Lib
    Code:
      while (1) {          // endlos, verlassen via break in if TW_Status
          if (len<lenmax) {
             TWCR = _BV(TWEA) | _BV(TWEN) | _BV(TWINT);      //receive, ACK,
          } else {
             TWCR =             _BV(TWEN) | _BV(TWINT);      //receive, NACK,
          }   
          waitTWINT();
          if (TW_STATUS != TW_MR_DATA_ACK) break;         // LOOP VERLASSEN
          *Data++ = TWDR; len++;                     // Daten verarbeitet
       }
    Meine Fragen dazu:
    - was hat es mit der Längengeschichte (Variablen len und lenmax) auf sich
    - gesamte funktionsweise der while-Schleife

    Toll wäre eine kurzer, verständlicher Abriss über die Schritte, die in der while-Schleife passieren. Das würde mir sehr weiterhelfen und zum Gesamtverstädnis beitragen.

    Vielen Dank im voraus für Euere Hilfe!

  3. #13
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Schau,
    "len" sind die empfangenen Bytes, am Anfang "1"
    "lenmax" die gegebene Anzahl, wieviele es werden dürfen
    Data* zeigt auf den datenbuffer

    while(1) heißt, von sich aus hört die Schleife nicht auf.

    if (len < lenmax) // noch nicht genug bytes
    TWCR = _BV(TWEA) | _BV(TWEN) | _BV(TWINT);
    wenn ein Byte kommt, ACK zurückschicken

    sonst
    TWCR = _BV(TWEN) | _BV(TWINT);
    auch empfangen, aber KEIN Ack zurück

    Dann warten, was passiert

    Beim empfang MIT ACK
    *Data++ = TWDR // Daten speichern (pointer+1)
    len++ // mitzählen

    Beim empfang OHNE ACK (also letztes Byte) --> break, schleife exit.


    Nach der Schleife wird auch noch das letzte (nicht "geackte" Byte gespeichert

    Und STOP abgesetzt. aus.


    Der Witz dabei ist, daß der Master receiver das letzte geholte byte NICHT "Acked", damit der Slave weiß, das war das letzte.
    (Der steht sonst nämlich da wie die Kuh vor dem neuen Tor)


    logo ?

    EDIT: Ich weiß, ich hab auch schon elegantere Schleifen gesehen, aber was soll's
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    17.07.2006
    Beiträge
    30
    Danke PicNick für die super schnelle und ideotensichere Antwort. C-Code beherrsche ich schon, mir ging es eher um das Verständnis der einzelnen Registerwerte, d.h. was macht der uC wenn der und der Wert drin steht .... - das ist noch meine Schwachstelle und das muss ich noch lernen/üben.

    Aber deine Erklärung ist super. VIELEN DANK !!!

  5. #15
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ah so-

    Die TWCR Register sind für sich allein nicht eindeutig, was er macht, hängt davon ab, welchen zustand die TWI grad hat. also

    Als Master sagt man am Anfang START INT/ EN / STA, das ist neutral

    ist das ok,
    Schickt man mit adresse->TWDR und INT/ EN die Adresse weg

    schreibt man die Slaveaddresse + W (also die "gerade" adresse)
    ist man dann Master transmitter
    da geht es immer Daten --> TWDR und INT/ EN

    schreibt man die Slaveaddresse + R (also die adresse + 1)
    ist man dann Master receiver
    da geht es immer umgekehrt, INT/ EN , TWDR --> Daten
    sagt man auch EA/ dazu, schickt er ein ACK zurück, sonst eben nicht

    (dazwischen natürlich immer warten, ob ein INT zurückkommt)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #16
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.05.2004
    Ort
    Bergstraße
    Beiträge
    245
    Zitat Zitat von PicNick
    Schau,
    ....
    logo ?

    EDIT: Ich weiß, ich hab auch schon elegantere Schleifen gesehen, aber was soll's
    Hallo PickNick,
    gute Erklärung, hätte ich nicht besser gekonnt

    Das mit der eleganten Programmierung liegt wahrschenlich daran, dass ich eher aus der Pascal-Welt komme und natürlich auch bei C Pascal denke.
    Insofern ist
    Code:
    while (1) {
    .. 
      if (irgendwas) { break; }
    }
    schon ein Zugeständniss!
    Eigentlich müsste es sauber strukturiert so aussehen
    Code:
    int  ende;
    ende =0;
    while (ende==0) {
    ..
    if (irgendwas) { ende =1; }
    }
    aber das scheint selbst mir etwas -hm- geschwätzig. Aber ob *(buf++) oder *buf++ oder *(&(*buf)++) oder doch buf[i++] besser oder gar eleganter ist werde ich wohl nie lernen.

    Meine Anforderung an meine C-Programme ist, dass sie a) einigermaßen funktionieren (ist oft genug nicht der Fall) und b) ich sie nach 3 Monaten noch oder wieder verstehe (scheint hier gelungen zu sein ).

    ciao bernd

  7. #17
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Deine Anforderungen klingen vernünftig, ich möcht' fast sagen, das ist genau das, worauf's ankommt.
    Ich bin überzeugt, wenn ein Programmierer in die Hölle kommen sollte, muß er dort alle seine Programme nach-dokumentieren. Und das tut man sich dann leichter
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #18
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.05.2004
    Ort
    Bergstraße
    Beiträge
    245
    Zitat Zitat von PicNick
    Ich bin überzeugt, wenn ein Programmierer in die Hölle kommen sollte, muß er dort alle seine Programme nach-dokumentieren. Und das tut man sich dann leichter
    uff! gut, dass ich kein Programmierer bin (jedenfalls keiner der das für Geld macht ) und auch nicht in die Hölle komme (das ist jedenfalls der Plan)

    ciao .. bernd

  9. #19
    Benutzer Stammmitglied
    Registriert seit
    11.12.2005
    Ort
    Chemnitz
    Alter
    36
    Beiträge
    87
    Wie sieht denn nun zum Beispiel eine typische main.c mit den Funktionen drin aus für Master und Slave?!

    Genauer gesagt möchte ich mittels TWI die ADC eingänge eines Anderen Mega32 an den Master übermitteln. Der Master soll also den Slave immer wieder abfragen. Wie stelle ich das an?
    Kann mir bitte jemand helfen?
    Grüße Sebastian

    --
    Signatur:
    Bild hier  

    Sowas find ich absolut faszinierend!

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen