Hallo,
so damit kann man schonmal was anfangen.
Das liegt wohl daran das beim Code der RP6Lib da schlicht kein Repeated Start gesendet wird.
Da wird gestoppt und neu gestartet.
Setzt vorraus, dass das Register zwischengespeichert wird - macht der Sensor aber wohl nicht und
braucht das alles in einer Transaktion.
Kann man natürlich ändern.
Ist bei der RP6Lib alles in der Interrupt Routine und task_I2CTWI - also komplexer als die Fleury Lib damit noch anderes nebenher laufen kann.
Muss ich mir bei Gelegenheit mal anschauen aber eigentlich habe ich da grad keine Zeit für daher wäre es gut wenn ihr euch das selbst anschaut.
Hinweise:
-->im TWCR Register das TWSTA Bit 1 setzen für Start. TWSTO --> Stop.
Rest steht im ATMEGA Datenblatt.
In der ISR müsste man halt nen Sonderfall einführen (also nen Flag setzen das ein Repeated start benötigt wird und das dann eben
machen anstatt stop senden - für die normalen RP6 Slaves sollte es weiter so laufen wie es aktuell ist)
Glaube im Zustand TWI_MTX_DATA_ACK - da bei // Send Stop after last Byte das Stop wegmachen also 0 << TWSTO...
Die eigentliche Anfrage der Datenbytes wird dann in task_I2CTWI gestartet (daher auch die Pause - das passiert halt irgendwann
wenn die Hauptschleife da wieder vorbeikommt der Controller also Zeit hat sich drum zu kümmern).
Im Prinzip müsste es für einen ersten Test schon reichen das TWSTO in Zeile 381 auf 0 zu setzen .
Alles ohne Gewähr kann auch sein das man noch was anderes ändern muss.
Ist viele Jahre her das ich den Code geschrieben habe und mir das Datenblatt dazu
durchgelesen hab. Zeit zum testen hab ich nicht.
...
Zeile 381: ...(rep<<TWSTO)...
rep darf nur 0 oder 1 sein - 1 für normal - 0 für repeated start.
Machste dann ne neue Funktion oben hin wie eine von den anderen und setzt das da eben auf 1 - in allen anderen auf 0.
Sorry aber das ist nur Quick&Dirty - hab zuviel anderes zu tun zur Zeit um mich da genauer mit zu befassen und das zu testen hoffe die Tipps helfen euch schon um es selbst zu lösen.
MfG,
SlyD
Lesezeichen