-         

Ergebnis 1 bis 7 von 7

Thema: Frage zur I2C-Bibliothek von P.Fleury

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685

    Frage zur I2C-Bibliothek von P.Fleury

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Moin!
    Ich habe mal eine Frage zur oben genannten Bibliothek:

    Ich steuere mit einem Mega32 zwei SFR02 Ultraschallsensoren an. Ich möchte aber nicht nach dem Start der Messung 65 ms warten, sondern nur so lange, bis die Messung fertig ist. Leider steht im Datenblatt nur ein Beispiel für Bascom drin, aber da scheint mir eine Eigenart des Bascom-I2C genutzt zu werden. Wenn ich mir aber die Doku zu 'i2c_start_wait' anschaue, dann steht da was von 'ack polling' bei einem 'busy device'. Das wäre ja genau das, was ich brauche, aber wie mache ich das denn konkret, dieses 'ack polling'?? Es gibt da eine auskommentierte Zeile in der 'i2c_start_wait()', aber deren Sinn erschließt sich mir leider nicht.....

    Versucht habe ich schon folgendes, funktioniert aber nicht.
    Zuverlässig funktioniert es bisher nur, wenn ich halt nach dem Start der Messung 65ms warte....


    Code:
    unsigned int read_us(unsigned char address)
    {
    	unsigned char lowbyte,highbyte;
    	unsigned int distance;
    	
    	i2c_start_wait(address+I2C_WRITE);
    	while (i2c_write(0));  // Befehlsregister '0'
    	while (i2c_write(81)); // Messung in cm starten
    	i2c_stop();
    
    	i2c_start_wait(address+I2C_WRITE);
    	while (i2c_write(2)); // Register '2', highbyte der Entfernung
    	i2c_stop();
    
    	i2c_start_wait(address+I2C_READ);
    	highbyte = i2c_readAck();
    	lowbyte=i2c_readNak();
    	distance = (highbyte*256)+lowbyte;
    	i2c_stop();
    	return distance;
    }
    Danke schonmal!!

    MfG Volker
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    der SRF02 kann solange nicht angesprochen werden (wie wenn nicht vorhanden), bis die Messung fertig ist. Also muss man nur solange ein Start an diese Slaveadresse senden bis ein ACK zurückkommt.
    Die i2c_start_wait-Funktion scheint genau das zu tun.

    Diese Funktion blockiert wahrscheinlich in dieser Zeit den Bus, falls es noch mehr Master geben würde, die auf den Bus wollen, da mit maximaler Geschwindikgeit die Starts versendet werden.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685
    Moin!
    So hatte ich das eigentlich vermutet, aber irgendwie funktioniert das nicht. Wenn ich so in den Sourcecode schaue, dann habe ich eher den Eindruck, dass da eine Stopcondition erzeugt wird, wenn der Slave nicht antwortet, um den Bus wieder freizugeben, das hilft mir ja aber nicht....
    Sehe ich das richtig ??

    Danke schonmal!!

    MfG Voker
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Der Stop muss ja gesendet werden, sonst kann kein neues Start über den Bus gehen.
    Da das ganze aber in einer Schleife läuft, dauert das Start-Stop solange bis ein ACK kommt, dann kann man normal weitermachen.

    Blöd ist das nur, wenns diese Slaveadresse garnicht gibt, dann bleibt der AVR da drin hängen, bis der Saft ausgeht.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685
    Achja, mac ht Sinn.
    Allerdings haut das bei mir irgendwie nicht hin.
    Wenn ich an den Sensor den Startbefehl sende, müßte ein nachfolgendes 'i2c_start_wait' erst dann beendet werden, wenn die Messung fertig ist und der Sensor wieder antwortet. Leider kriege ich dann nur Mist ausgelesen, die Werte springen und hüpfen nur so....
    <grübel...>

    MfG Volker
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Verwendest Du die SoftwareVersion dieser Lib, oder das TWI ?
    dH. compilierst Du die twimaster.c oder die i2cmaster.S ?
    Wenn du die Pins verwendest die für I2C bzw. TWI vorgesehen sind, sollte man auch twimaster.c verwenden, die i2cmaster.h bleibt die gleiche, in der twimaster.c muss man nur die Frequenzen einstellen.

    Evtl. musst Du nach dem ersten Stop doch ein klein wenig warten bis der zum Messen anfängt, evtl. meldet der SRF sich noch vorher und dann kommen solche Werte raus ist aber nur eine Vermutung.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685
    Ich benutze TWI, die Frequenz passt (100KHz, 400 KHz war zu schnell für meinen SD20). Bisher mußte ich immer bei jedem Slave-Device (ein ATtiny26, ein SD20, ein Portexpander PCF8574 sowie jetzt zwei SRF02) nach einem Stop kurz warten. Aber jetzt hab ichs!! Manchmal steh ich echt vor 'ner Wand :

    'i2c_start_wait(slave)'
    habe ich jetzt einfach durch
    'while (i2c_start(slave));
    ersetzt, und nun funktionierts!!!!

    Vielen Dank für die Mühen!!

    MfG Volker
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

Berechtigungen

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