Hallo! Mal wieder ein verzweifelter Anfänger! Ein Atmega8 und ein SRF08, das Ganze mit Assembler, funktioniert nach diesem Schema: 1. Send a start sequence 2. Send 0xE0 ( I2C address of the SRF08 with the R/W bit low (even address) 3. Send 0x00 (Internal address of the command register) 4. Send 0x51 (The command to start the SRF08 ranging) 5. Send the stop sequence. Dies geht sogar als loop! Knackt und blinkt lustig vor sich hin. Jetzt aber: 1. Send a start sequence 2. Send 0xC0 ( I2C address of the CMPS03 with the R/W bit low (even address) 3. Send 0x01 (Internal address of the bearing register) 4. Send a start sequence again (repeated start) 5. Send 0xC1 ( I2C address of the CMPS03 with the R/W bit high (odd address) 6. Read data byte from CMPS03 7. Send the stop sequence. Diese Schema habe ich auf den SRF umgewandelt und habe Punkt 6 vorerst ausgelassen. Sieht so aus: twidata: ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR,temp rcall INTcheck ldi temp,0xE0 out TWDR,temp ldi temp, (1<<TWINT) | (1<<TWEN) out TWCR,temp rcall INTcheck ldi temp,0x00 out TWDR,temp ldi temp, (1<<TWINT) | (1<<TWEN) out TWCR,temp rcall INTcheck ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR,temp rcall INTcheck ldi temp,0xE1 out TWDR,temp ldi temp, (1<<TWINT) | (1<<TWEN)|(1<<TWEA) out TWCR,temp rcall INTcheck ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) out TWCR,temp rcall clear (löscht das Display) rcall schreib (schreibt irgendwas auf das Display) Wenn ich jetzt per rjmp eine messung auslösen will geht das nicht. Wieso nicht? Zeit ist genug da "clear" und "schreib" eine lange warteschleife beinhalten. Ändere ich das "0xE1" zu "0xE0" , tu also so als ob da noch ein befehl and den SRF gesendet erden soll, läuft es wieder prima,das SRF knackt und blinkt wieder und auf dem Display blinkt ein Zeichen. Ich entschuldige mich jetzt schonmal für die miserable Darstellung des Problems hoffe aber das es dennoch verständlich ist. Hat jemand eine Idee?
:
Verschoben durch User
> Ich entschuldige mich jetzt schonmal für die miserable Darstellung des > Problems hoffe aber das es dennoch verständlich ist. mach es besser! Ich hab mal in diese Anleitung geschaut: http://www.roboter-teile.de/datasheets/srf08.pdf "Das SRF08 Modul wartet mit einer I²C Aktivität generell bis zum Ende der Messung. Ist der Messvorgang noch aktiv, erhält man (wenn man z.B. die Software Version in Register 0 liest) den Wert 255 (0xFF)." Das könntest Du ja erstmal prüfen..
Was hat denn der CMPS03 oben in deiner Beschreibung zu suchen? Ich denke das Protokoll vom SRF08 ist anders als vom CMPS03. I2C Chips sind da sehr frei in der Gestaltung ihrer Protokolle. Es gibt sicher viele Ähnlichkeiten, aber der Teufel steckt im Detail. Kurzes Googeln ergab folgendes: i2c_start(); // send start sequence i2c_tx(0xE0); // SRF08 I2C address with R/W bit clear i2c_tx(0x00); // SRF08 command register address i2c_tx(0x51); // command to start ranging in cm i2c_stop(); // send stop sequence Now after waiting 65mS for the ranging to complete (I've left that to you) the following example shows how to read the light sensor value from register 1 and the range result from registers 2 & 3. i2c_start(); // send start sequence i2c_tx(0xE0); // SRF08 I2C address with R/W bit clear i2c_tx(0x01); // SRF08 light sensor register address i2c_start(); // send a restart sequence i2c_tx(0xE1); // SRF08 I2C address with R/W bit set lightsensor = i2c_rx(1); // get light sensor and send acknowledge. Internal register address will increment automatically. rangehigh = i2c_rx(1); // get the high byte of the range and send acknowledge. rangelow = i2c_rx(0); // get low byte of the range - note we don't acknowledge the last byte. i2c_stop(); // send stop sequence Also: Erst das Kommando geben zum Ranging (scheint ja schon zu klappen), dann 65 ms warten und dann die Sequenz senden um Daten zu lesen.
Hallo Rainer, Hallo Frank, Hallo an all die Anderen! Ich gebs auf! War bislang alles was diese komischen Geräte machen nachvollziehbar macht TWI WAS ES WILL! Vielleicht erbarmt sich jemand und schaut sich den beigefügten code an. Mein Display zeigt: "22ä" an. Aber auch nicht immer. Abhängig vom Luftdruck oder der Anzahl gerauchter Zigeratten meines Nachbarn oder was weiss ich kommt auch schon mal "ä"
Attila schrieb: > Ich gebs auf! War bislang alles was diese komischen Geräte machen > nachvollziehbar macht TWI WAS ES WILL! Wenn Du das HW-I2C benutzen willst, mußt Du es auch verstehen. Deinen unkommentierten Spaghetticode mit nem Haufen unbekannter Funktionen mag sich keiner ansehen. Schreib Dir erstmal die 4 Basisfunktionen: - START + Adresse + R/W, - STOP, - senden Byte + Testen ACK, - Lesen Byte + Senden ACK/NACK. Und dann rufst Du immer nur diese Funktionen auf und wertest auch jedesmal den Status aus. Wenn eine Funktion fehlschlägt, ist es Blödsinn, dann noch weiter zu senden. Viele I2C-ICs stellen sich tot, wenn sie beschäftigt sind, d.h. Du kriegst ein NACK auf die Adresse. Und dann nenne Assemblerprogramme .asm und nicht .txt, sind ja keine Liebesbriefe. Und wenn Du Hilfe willst, mußt Du natürlich auch kommentieren. Und wenn Du Funktionen aufrufst, mußt Du natürlich auch diese mitschicken. Niemand kann sonst erkennen, was diese Black-Box macht. Peter
Wichtige Regeln - erst lesen, dann posten! •Aussagekräftigen Betreff wählen •Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)