2017-01-27 3 views
0

[J'ai posé cette question sur le Arduino Stack Exchange, et j'ai attendu un certain temps et a obtenu aucune réponse, donc je pensais que je demande ici!]Remplacer bibliothèque fil avec TinyWireM (Bibliothèque Faire ATtiny compatible)

I Je veux intégrer le capteur vl53l0x Time of Flight distance de Pololu dans un de mes projets. Ils ont créé un library pour interfacer avec le vl53l0x sur I2C, ce qui fonctionne très bien sur mon Uno. Le seul problème est que Wire.h ne fonctionne pas sur l'ATtiny85.

TinyWireM est une bibliothèque de remplacement pour Wire que je pense serait compatible. Ma question est la suivante: comment puis-je remplacer Wire avec TinyWireM? Est-ce aussi simple que de remplacer toutes les instances de Wire avec TinyWireM? Y at-il autre chose que je dois faire pour rendre la bibliothèque ATtiny85 compatible?

J'ai essayé simplement de redéfinir « fil » comme TinyWireM comme suit:

#include "TinyWireM.h" 
#define Wire TinyWireM 

Tout compile et ajouts à mon ATtiny85 très bien. Cependant, le capteur semble seulement émettre une valeur d'environ 7600 mm assez régulièrement.

Merci!

+0

pourquoi tinywirem ne fonctionne pas, les périphériques ne sont pas sur la puce, les noms de registre sont-ils faux? –

+0

@GradyPlayer voulez-vous dire pourquoi Wire ne fonctionne pas? –

+0

ouais, pourquoi ça ne marche pas? –

Répondre

1

La bibliothèque de fils ne fonctionne pas sur l'ATTiny, car elle ne possède qu'une interface USI (Universal Serial Interface), qui n'est pas le même matériel que dans l'Arduino Uno. La bibliothèque TinyWireM montre presque le même comportement que la bibliothèque de fils sur l'Uno, mais n'est pas la même bibliothèque portée sur l'ATTiny. Je ne comprends pas complètement, pourquoi vous voulez renommer la bibliothèque TinyWireM à Wire. Si vous voulez simplement prétendre que ce serait vraiment la bibliothèque de fils, cela pourrait ne pas être une bonne pratique de codage, car cela cache quelque peu le fait que vous n'utilisez pas la bibliothèque de fils, mais une bibliothèque différente. Si vous voulez créer du code réutilisable à la fois sur Uno et ATTiny, je suggère d'utiliser une combinaison de directives #define et #ifdef, #ifndef et #endif, de sorte qu'en fonction d'un indicateur défini, seul le code correspondant soit compilé. Pour autant que je sache, l'ArduinoIDE utilise également ceux-ci pour inclure les fichiers d'en-tête pour chaque cible. Si vous pouvez trouver la définition correspondante dans les fichiers d'en-tête, vous pouvez l'utiliser. Mais utiliser votre propre définition au début du fichier est plus facile.

Astuce: Si vous essayez d'établir une communication multi-master sur I2C avec TinyWireM (qui fonctionne parfaitement pour moi), vous devez libérer le bus après votre transmission, afin qu'un autre maître puisse l'utiliser. Je l'ai fait avec la désactivation du matériel USI avec USICR&= 0b11001111; pinMode(0,INPUT); pinMode(2,INPUT); La bibliothèque ne fait pas cela pour vous (si vous ne faites pas cela, le bus restera occupé et aucun autre maître ne peut communiquer) Pour utiliser le registre USICR directement vous devez également #include <USI_TWI_Master.h>

+0

Je vais essayer cela bientôt - merci. Cependant, le problème que j'ai est simplement que la bibliothèque de TinyWireM ne peut pas sembler communiquer correctement avec le périphérique. Je vais essayer de mettre les registres comme vous l'avez suggéré. –

+0

Avez-vous eu des progrès dans votre problème? Peut-être - si vous avez un arduino de rechange - vous pouvez vérifier, quelles données sont réellement envoyées au capteur. – chrisl

+0

Je travaille encore dessus, mais je n'ai toujours pas de succès. Les choses fonctionnent très bien avec un Uno qui est la partie étrange. Je vais continuer à enquêter plus souvent, alors merci pour votre réponse. –