Forum: Gesperrte Threads Zu blöd für TWI!


von Attila (Gast)


Lesenswert?

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
von Attila (Gast)


Lesenswert?

Kann denn niemand helfen?

von Rainer U. (r-u)


Lesenswert?

> 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..

von Frank S. (herrschrader)


Lesenswert?

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.

von Attila (Gast)


Angehängte Dateien:

Lesenswert?

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 "ä"

von Peter D. (peda)


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Wichtige Regeln - erst lesen, dann posten!
•Aussagekräftigen Betreff wählen
•Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.