-

+ Antworten
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 9 bis 16 von 23

Thema: [I²C] Beschleunigungssensor gibt kein ACK aus

  1. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.09.2009
    Ort
    Geilenkirchen (Kein Witz)
    Beiträge
    404
    Hallo Oberallgeier!

    Danke für deine Antwort.
    Allerdings würde ich am liebsten keine fertige LIB nutzen, das wäre dann die Notlösung.
    Aber eigentlich muss nurnoch das ACK Problem gelöst werden

    Gruß
    Olaf

  2. #10
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    23
    Beiträge
    980
    Hallo,
    soweit ich weiß, gibt ein I2C-Slave ein ACK, wenn er seine Adresse erkannt hat bzw. noch weitere Daten entgegennehmen will/kann.
    Irgendetwas stimmt noch nicht, sonst würde sich der Slave ja melden

    Wenn du das integrierte TWI-Modul verwendest (was ich dir wirklich nocheinmal ans Herz legen möchte, ich meine es ja nur gut ), kannst du im Register TWSR nachschauen, ob ein ACK angekommen ist (Datenblatt Seite 186, z.B. Code $38 oder $48 ).
    Infos zum TWI/I2C im Datenblatt gibt es ab Seite 167; konkret wird es ab Seite 175.

    Grüße,
    Bernhard
    Geändert von BMS (31.03.2012 um 17:05 Uhr)

  3. #11
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.09.2009
    Ort
    Geilenkirchen (Kein Witz)
    Beiträge
    404
    Hallo Bernhard,

    ich möchte doch das I²C Modul verwenden, nur keine fertige Lib
    Also, d akann ich eifnach gucken, bo ein ACK angekommen sit?
    Und das amcht der ganz automtisch ohne, dass ich irgendein bit setzten muss?

    Was hat es eigneltich mit der Startbedingung auf sich?
    Muss ich da das Bit setzen und dann selbst wieder das Bit löschen?

    Gruß
    Olaf

  4. #12
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    6.585
    Zitat Zitat von crabtack Beitrag anzeigen
    ... am liebsten keine fertige LIB ... muss nur noch das ACK Problem gelöst werden ...
    Ne fertige Lib hat den Vorteil, dass sie (von fast allen Autoren) ziemlich sicher funktioniert. Unter fast allen Bedingungen. Und im Code bzw. in der onlinehilfe von Fleury kannst Du auch lesen, wann und warum das ACK kommt.

    Zum ACK: ich hatte mir vor ner Weile, bei meinem ersten, erfolgreichen I²C-Abenteuer (nach etlichen erfolglosen), einen I²C-Sniffer gebaut (klick für mehr) und damit den Datenaustausch mitgeschnitten. Da siehst Du, wann - und ob - das ACK kommt. Schöner wär natürlich ein Logikanalysator mit I²C-Interpreter, da kann man sauber lesen, wann und ob das ACK kommt. Die teure Lösung . . .

    Kennst Du dieses Tutorial?
    Ciao sagt der JoeamBerg

  5. #13
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    23
    Beiträge
    980
    Hallo,
    bevor das TWI-Modul verwendest, musst du das Modul "einschalten" und die Geschwindigkeiten usw. einstellen (drei Register setzen, nämlich TWBR, TWSR und TWCR).

    Für die Startbedingung musst du dann "nur" ein paar Bits in TWCR setzen und warten bis die Signale ausgegeben wurden:

    Code:
    void i2c_start()
    {
     TWCR=0b10100100;        //TWEN, TWSTA und TWINT; unschön, aber geht ;)
     while( !(TWCR & 128) ) ;    //warten bis fertig (TWINT auf logisch 1)
    }
    Grüße,
    Bernhard

  6. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.09.2009
    Ort
    Geilenkirchen (Kein Witz)
    Beiträge
    404
    Danke!

    Jo, das Tutorial kenne ich
    Also, wie gesagt eine LIB wäre die notlösung.
    Ich ahbe noch nie eine "nicht standart Lib" benutzt und das soll erstmal sob leiben
    Also irgendwas macht er jedenfalls.
    Das hier steht jetzt in meiner Main:
    Code:
    uart_init (); 
    TWSR  |= (1 << TWPS1);
    i2c_start ();
    TWDR = 0b01110000; //sla +R
    TWCR = 0b10000100;
    if (TWINT &1)
    {uart_write ("TWINT = 1");}
    else
    {uart_write ("TWINT = 0");}
    wenn ich ihn nun starte bekomme ich TWINT = 1 ausgegeben.
    Wenn ich ihn starte aber dem Beschleunigungssensor die VCC Leitung kappe, dann bekomem ich garnichts.
    Das Problem ist nur, dass wenn ich dem Sensor Masse kappe, dann bekomme ich TWINT = 1
    Also liegt es nur and en Pull up widerständen, er redet nicht wirklich mit mit.
    Aber im Datenblatt ist eigneltich bei jedem Status Code TWINT = 1;
    Und viele Unterscheiden sich überhaupt nicht.
    Wie kann ich nun ein ACK erkennen?

    Gruß
    Olaf

  7. #15
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    23
    Beiträge
    980
    Hallo,
    das TWINT hat damit erst mal nichts zu tun. TWINT wird gesetzt wenn die aktuelle Übertragung abgeschlossen ist.
    Außerdem wäre die Abfrage des TWINT-Bits so falsch. Richtig müsste es heißen if(TWCR & 128 ) oder if(TWCR & (1<<TWINT)).
    TWINT ist nur ein Bit im Register TWCR und ist an siebter Stelle, d.h. TWINT ist immer 7.
    7 dezimal ist 111 binär, und in der if-Abfrage steht also: 111 & 1 , das gibt immer 1, ist also kein Wunder warum er über uart dann "TWINT = 1" ausgibt
    Das steht also in keiner Verbindung dazu, was auf dem Bus passiert.

    ACK auslesen:
    if( TWSR ==0x18 || TWSR==0x28 ){/*Ack wurde erkannt*/} beim Senden
    if( TWSR ==0x40 || TWSR==0x50 ){/*Ack wurde erkannt*/} beim Lesen
    Die Zahlen kommen von Seite 183 und 186 im Datenblatt. $ bzw 0x bedeutet hexadezimal.

    Grüße,
    Bernhard

  8. #16
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.09.2009
    Ort
    Geilenkirchen (Kein Witz)
    Beiträge
    404
    Vielen Dank!
    Das bringt mich schon einen ganzen Schritt weiter.
    Er empfängt jetzt jedenfalls schonmal ACK´s
    Aber irgendwie macht er nicht merh weiter nachdem ich stoppe und dann wieder starte.
    Code:
    uart_init (); 
    TWBR = 00010001;
    i2c_start ();
    while(!( TWSR == 0x08) )
    {}
    uart_write ("Start ");
    TWDR = 0b01110000; //sla +R
    TWCR = 0b10000100; // senden
    while(!( TWSR ==0x18 || TWSR==0x28 ))
    {}
    uart_write ("ACK empfangen ");
    TWDR = 0b00000010; //2. register
    TWCR = 0b10000100; //senden
    while(!( TWSR ==0x18 || TWSR==0x28 ))
    {}
    uart_write ("ACK2 empfangen ");
    TWCR = 10010100; //Stop
    while( !(TWCR & 128) )
    {}                     //warten
    uart_write ("Stop ");
     
    i2c_start ();
    while(!( TWSR == 0x08) )
    {}
    uart_write ("Start2 ");
    TWDR = 0b01110001;
    TWCR = 0b10000100; // senden
    while(!( TWSR ==0x18 || TWSR==0x28 ))
    {}
    uart_write ("ACK3 empfangen ");
    Das letzte, was ich empfange ist "STOP"
    Aber eigneltich mache ich beim Starten ja genau das gleiche, wie oben auch.
    Aber ich bekomme einfach kein START2.
    Was mache ich falsch?

    Gruß
    Olaf

+ Antworten
Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ähnliche Themen

  1. DCF77 gibt kein Signal
    Von .:markus:. im Forum Elektronik
    Antworten: 13
    Letzter Beitrag: 06.08.2010, 18:10
  2. Beschleunigungssensor
    Von oratus sum im Forum Sensoren / Sensorik
    Antworten: 12
    Letzter Beitrag: 01.11.2009, 01:31
  3. Beschleunigungssensor
    Von bastman im Forum Sensoren / Sensorik
    Antworten: 3
    Letzter Beitrag: 01.11.2006, 09:53
  4. MyAVR- Board gibt kein masse
    Von senk im Forum AVR Hardwarethemen
    Antworten: 49
    Letzter Beitrag: 03.11.2005, 20:48
  5. Beschleunigungssensor
    Von BlackBroom im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 14.07.2005, 21:52

Berechtigungen

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