2017-01-27 3 views
0

[I auf den Arduino Stack Exchange diese Frage gestellt, und ich wartete eine Weile, und bekam keine Antwort, so dass ich dachte, dass ich es hier fragen würde!]ersetzt Drahtbibliothek mit TinyWireM (Make-Bibliothek ATtiny kompatibel)

I Ich möchte den Sensor vl53l0x Time of Flight distance von Pololu in ein Projekt von mir integrieren. Sie haben eine library erstellt, um mit der vl53l0x über I2C zu kommunizieren, was auf meinem Uno großartig funktioniert. Das einzige Problem ist, dass Wire.h nicht auf dem ATtiny85 funktioniert.

TinyWireM ist eine Ersatzbibliothek für Wire, die meiner Meinung nach kompatibel wäre. Meine Frage lautet: Wie kann ich Draht durch TinyWireM ersetzen? Ist es so einfach, alle Instanzen von Wire durch TinyWireM zu ersetzen? Muss ich noch etwas tun, um die Bibliothek ATtiny85 kompatibel zu machen?

Ich habe nur versuchen, "Wire", wie TinyWireM neu definiert, wie unten dargestellt:

#include "TinyWireM.h" 
#define Wire TinyWireM 

Alles kompiliert und Uploads zu meinen ATtiny85 just fine. Der Sensor scheint jedoch nur einen Wert von ungefähr 7600 mm ziemlich konstant auszugeben.

Danke!

+0

warum funktioniert tinywirem nicht, sind die peripheren nicht auf dem chip, sind die registernamen falsch? –

+0

@GradyPlayer meinst du warum funktioniert Draht nicht? –

+0

Ja, warum funktioniert es nicht? –

Antwort

1

Die Drahtbibliothek funktioniert nicht auf dem ATTiny, weil es nur eine USI (Universal Serial Interface) hat, die nicht die gleiche Hardware wie im Arduino Uno ist. Die TinyWireM-Bibliothek zeigt fast dasselbe Verhalten wie die Wire-Bibliothek auf dem Uno, ist aber nicht dieselbe Bibliothek, die auf den ATTiny portiert wurde. Ich verstehe nicht vollständig, warum Sie die TinyWireM-Bibliothek in Wire umbenennen möchten. Wenn Sie nur vorgeben möchten, dass es sich wirklich um die Wire-Bibliothek handelt, ist dies möglicherweise keine gute Programmierpraxis, da dies die Tatsache in Ihrem Code verbirgt, dass Sie nicht die Wire-Bibliothek, sondern eine andere Bibliothek verwenden. Wenn Sie Code erstellen möchten, der sowohl auf Uno als auch auf ATTiny wiederverwendbar ist, würde ich vorschlagen, eine Kombination aus #define und #ifdef, #ifndef und #endif Direktiven zu verwenden, so dass abhängig von einem definierten Flag nur der entsprechende Code kompiliert wird. Soweit ich weiß, verwendet das ArduinoIDE diese auch, um die richtigen Header-Dateien für jedes Ziel zu enthalten. Wenn Sie die entsprechende Definition in den Header-Dateien finden, können Sie diese verwenden. Die Verwendung einer eigenen Definition am Anfang der Datei ist jedoch einfacher.

Als Tipp: Wenn Sie jemals versuchen, mit TinyWireM eine multimastered Kommunikation über I2C aufzubauen (was für mich perfekt funktioniert), müssen Sie nach der Übertragung den Bus frei geben, damit ein anderer Master ihn benutzen kann. Ich habe dies mit der Deaktivierung der USI-Hardware mit USICR&= 0b11001111; pinMode(0,INPUT); pinMode(2,INPUT); getan Die Bibliothek tut dies nicht für Sie. (Wenn Sie dies nicht tun, bleibt der Bus besetzt und kein anderer Master kann kommunizieren) Um die USICR-Register direkt zu verwenden du musst auch #include <USI_TWI_Master.h>

+0

Ich werde das bald versuchen - danke. Das Problem, das ich habe, ist einfach, dass die TinyWireM-Bibliothek scheinbar nicht korrekt mit dem Gerät kommunizieren kann. Ich werde versuchen, die Register so zu setzen, wie Sie es vorgeschlagen haben. –

+0

Hatten Sie in Ihrem Problem Fortschritte? Vielleicht - wenn Sie ein arduino haben - können Sie überprüfen, welche Daten tatsächlich an den Sensor gesendet werden. – chrisl

+0

Ich arbeite immer noch daran, aber ich bekomme immer noch keinen Erfolg. Dinge funktionieren gut mit einem Uno, das ist der seltsame Teil. Ich werde es aber weiter untersuchen, also danke für deine Antwort. –