Wire.h: twi.h nicht gefunden, dann LinkingError

Tag,

ich versuche gerade die etwas mit dem I2C Bus zu spielen. Ich Programmiere mit MariaMole und habe über den Dialog den ich vor kurzem Entdeckt habe, die Wire Libary eingebunden.

Quellcode:

#include "LCD-Master_main.h"

void setup() {                
  pinMode(13, OUTPUT); 

	Wire.begin() //Master => keine Adresse

}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);           
  digitalWrite(13, LOW); 
  delay(1000);  
  
  Wire.beginTransmission(3); //Starte übertragung an Slave3
  Wire.write(millis());
  Wire.endTransmission();        
}

MariaMole bindet die Libs in die _main.h ein:

#include <arduino.h>
#include <Wire.h>

Wenn ich den Quelltext jetzt so kompiliere bekomme ich ein ganzes Sortiment von Fehlermeldungen nach dem Motto:

Wire.cpp (63,0) error: 'twi_init' was not declared in this scope

das ganze nochmal so weiter für twi_setAdress, twi_attachSlaveTxEvent, usw. usf…

Ein Hinweis lieferte ganz oben dann eine Warnung:

 Wire.cpp (27,19) warning: twi.h: No such file or directory

also die Wire.cpp geöffnet, den include ausgebessert:

  #include <utility\twi.h>
  //#include <twi.h>

Jetzt bekomme ich in der Wire.cpp einmal in der Zeile 196 und einmal in der Zeile 178 folgenden Linking Error:

 undefined refernce to 'twi_transmit'

Dann in der Zeile 141 undefined refernce to 'twi_WriteTo", in Zeile 63 beschwert er sich über ‘twi_init’.

Was kann ich den tun?

Versuch's einfach mal mit einem

#include "Wire.h"

gleich nach dem #include "LCD-Master_main.h" in Deinem Sketch. Die IDE hat ein ganz spezielles Verfahren, die Bibliotheken einzubinden, das nicht ganz mit dem üblichen C(++)-Regeln konform geht. Vor dem Compilieren wird der Sketch von der IDE entsprechend umgeschrieben und die Include-Pfade angepasst.

Du meinst:

#include "LCD-Master_main.h"
#include "Wire.h"

?

Gerade erledigt, bleibt immer noch beim Linking Error : udefined refernce to twi_transmit, twi_writeTo, twi_init.

Allerdings werden noch zwei Warning angezeigt:

LCD-Master_main.h (2,14) warning: extra tokens at end of #ifndef directive

Dazugehöriger Code:

#ifndef __lcd-master_main_H__

und:

LCD-Master_main.h (3,14) warning: missing whitespace after the macro name

Code:

#define __lcd-master_main_H__

Sieht so aus, als wäre Deine IDE nicht wirklich kompatibel zur Arduino-IDE. Kannst Du mal einen Link zu der Bibliothek LCD-Master_main posten? Ich kann den Compilier-Vorgang nicht selbst testen, da von MariaMole erst eine Windows-Version existiert. Es scheint, als würde die IDE den Code in den Subverzeichnissen nicht mit compilieren. Evtl. musst Du das utility-Verzeichnis der Wire-Bibliothek auch als Bibliothek importieren, damit die IDE das mitkriegt. Die Arduino-IDE ist in dieser Hinsicht eben schon relativ schlau gemacht, man muss sich nicht um vieles kümmern, dafür ist sie in speziellen Fällen auch nicht so flexibel wie z.B. ein Makefile.

Da gibt es keinen Link, da das mein Programm ist. MariaMole bastelt da wohl auch etwas selbst rum, ich poste mal den Inhalt der _main.h:

//-------------------------------------------------------------------
#ifndef __lcd-master_main_H__
#define __lcd-master_main_H__
//-------------------------------------------------------------------
 
#include <arduino.h>
//#include "Wire.h"
 
 
//-------------------------------------------------------------------
 
//-------------------------------------------------------------------
 
// Put yout declarations here
 
//-------------------------------------------------------------------
 
//===================================================================
// -> DO NOT WRITE ANYTHING BETWEEN HERE...
// 		This section is reserved for automated code generation
// 		This process tries to detect all user-created
// 		functions in main_sketch.cpp, and inject their
// 		declarations into this file.
// 		If you do not want to use this automated process,
//		simply delete the lines below, with "&MM_DECLA" text
//===================================================================
//---- DO NOT DELETE THIS LINE -- @MM_DECLA_BEG@---------------------
void loop();
void setup();
//---- DO NOT DELETE THIS LINE -- @MM_DECLA_END@---------------------
// -> ...AND HERE. This space is reserved for automated code generation!
//===================================================================
 
 
//-------------------------------------------------------------------
#endif
//-------------------------------------------------------------------

Sieht so aus, als wäre Deine IDE nicht wirklich kompatibel zur Arduino-IDE.

Meines Wissens wurde MariaMole speziell als Alternative zur Arduino-IDE programmiert.

Meines Wissens wurde MariaMole speziell als Alternative zur Arduino-IDE programmiert.

Eine Alternative ist auch Eclipse, aber auch diese Lösung hat nicht den Automatisierungsgrad der Arduino IDE (dafür andere Vorteile, z.B. beim Editieren), weshalb bei der Integration von Arduino-Bibliotheken mehr Handarbeit angesagt ist. Hast Du das mit dem Importieren des utilities-Verzeichnisses als weitere Bibliothek versucht?

Jo, habe ich. Selber Fehler.

Also: mit der Anpassung auf

#include "utilities/twi.h"

in Wire.cpp und dem

#include "Wire.h"

in Deinem Code?

Falls ja, welche Fehlermeldung kriegst Du genau (ganze Ausgabe, nicht nur eine Zeile)?

Also in der Wire.cpp steht

  #include <utility\twi.h>

Den in dem Unterverzeichnis “utility” der Wire.h befindet sich (zumindest bei mir) die twi.h.
Code ist so wie du gepostet hast.

Fehlermeldung (doof dass ich die von MariaMole nicht er Copy&Paste rausholen kann):

error: Could not build project 'LCD-Master'. Please check for errors
LCD-Master_main.h (2,14) warning: extra tokens at end of #ifndef directive
LCD-Master_main.h (3,14) warning: missing whitespace after the macro name
Wire.cpp (196) => Linking error: udefined refernce to 'twi_transmit'
Wire.cpp (178) => Linking error: udefined refernce to 'twi_transmit'
Wire.cpp (141) => Linking error: udefined refernce to 'twi_writeTo'
Wire.cpp (63) => Linking error: udefined refernce to 'twi_init'

Woher hast Du diese Art von Macro-Definition?

#ifndef __lcd-master_main_H__
#define __lcd-master_main_H__

Meines Wissens sind die *-Namen für den compiler-internen Gebrauch reserviert. Wozu sollen die Underscores am Anfang und am Ende gut sein?

Das macht man im Prinzip gerne mal so, um ziemlich sicher zu sein, dass der Name nicht ganz woanders schonmal definiert wurde und auch nicht für einen anderen Zweck verwendet wird.

Der sinn ist, Probleme zu vermeiden wenn die gleiche include Datei zweimal includiert würde.

Das Problem sind nicht die Unterstriche, sondern das Minus in der Mitte !

Woher hast Du diese Art von Macro-Definition?

Aus der LCD-Master_main.h, automatisch erstellter Code.

Das Problem sind nicht die Unterstriche, sondern das Minus in der Mitte !

Ich habe mal flott ein neues Projekt angelegt, diesmal LcdMaster benannt. Die Wire.h so eingebunden, wie MariaMole das gerne hätte - selbe Fehlermeldungen.

Wieder einen Schritt weiter.

Ich habe jetzt die twi.h über den Wizard in eines der Projekte eingefügt. Jetzt beschwert sich der Kompiler nur noch über die beiden twi_transmit.

Ich war jetzt ein paar Tage unterwegs, konnte also nicht testen.

Hätte den noch wer eine Idee oder könnte das ganze mal unter mariamole testen?

VG