Ben al een halve dag aan het uitzoeken hoe je het libraries van arduino kunt gebruiken in een niet arduino based project. Elke keer als ik een bibliotheek toevoeg word mijn lijst met error's langer.

Ik kan spijtig genoeg de lijst van fouten niet als tekst neer plempen.
http://i63.photobucket.com/albums/h148/fragme_dmc/electronics/projects/oled%20gps/oled_gps_errors_1.jpg

// oledgps.c created for project oledgps on 10/05/2014 11:21:53
#define F_CPU 8000000UL
#define BAUDRATE 9600
#define BAUD_PRESCALE ((( F_CPU / ( BAUDRATE * 16UL))) - 1)
#define AS 20 // SIZE OF ARRAY
#define MAX 300 //max size of sentence buffer
char NMEA[MAX];
#include <avr/io.h>
//#include <stdio.h>
#include <util/delay.h>
//arduino shiiiiit
#include <core/WProgram.h>
#include <libraries/Wire/Wire.h>
#include <arduino/TinyGPSPlus-0.94b/TinyGPS++.h>
#include <arduino/GOFi2cOLED/GOFi2cOLED.h>
// voor de rest staat alles als commentaar

Iemand een idee???
**Als compiler gebruik ik avr_gcc, als IDE gebruik ik AVR Project IDE

[Bericht gewijzigd door Henry S. op (0%)]

Waarschijnlijk wordt er een algemene include file gebruikt voor allerlei types. Dus de eerste fout onderzoeken en kijken of je in de auduino directories ergens een header file vind die dat type declareert.

Wat ook kan is dat het c++ gebruikt. Ik zie in sommige code soms wel eens wat staan wat erg daar op lijkt?

Verder controleer je compiler opties omdat ik allerlei attribute errors voorbij zie komen.

[Bericht gewijzigd door henri62 op (14%)]

Arduino code lijkt op c++ code maar is verder uitgewerkt.

Als ik bvb voor wire.h op lijn 27 gaan kijken dan staat er dit: class TwoWire
op lijn 64: extern TwoWire Wire;

[Bericht gewijzigd door Damic op (16%)]

Heb je die header files al eens bekeken hoe ze eruit zien?
Is dat ook C++ spul? (helaas geen arduino spul op mijn laptop staan dus kan het niet checken).

Ik weet wel dat de gcc compiler geen C files als echte C++ file compileerd als de extensie niet .cpp of zo eindigt.
Kortom: Noem je eigen files eens met een cpp extensie.

Dus eigenlijk had die file wire.hpp moeten heten?

-edit- zit nu even op de github site van arduino te bladeren, inderdaad allemaal hoofdzakelijk c++ code.
Dat kun je dus niet zo direct uit C aanroepen.

Dus ook je eigen project C++ maken (of wrappers maken die de classes instantieren, maar dat is nogal "messsy").

ha of andere compiler gebruiken :Dow wacht verkeerd begrepen

[Bericht gewijzigd door Damic op (33%)]

Arduino /is/ gewoon C++. Je mag in je "setup" en "loop" functies het bij C laten, maar de libraries zijn meestal echt C++. Kortom, ik denk dat je de boel met een C++ compiler (g++) moet compileren. Daarna een kleinbeetje prutsen om de boel vanuit je main aan te roepen/gebruiken.

Hernoem je source file eens naar .cpp.

Want nu include je met de arduino .h files C++ code in een file waar de compiler C verwacht. En dat leidt tot teleurstellingen....

Door de file blahblah.cpp te noemen verwacht GCC C++ code. Er zijn andere manieren (g++ gebruiken bijvoorbeeld), maar dit is meestal de simpelste.

Ha simpel :)
http://i63.photobucket.com/albums/h148/fragme_dmc/electronics/projects/oled%20gps/oled_gps_errors_2.jpg
En de lijst word korter (lijn 160 tot 164):

#if ARDUINO >= 100
  virtual size_t write(uint8_t);
#else
  virtual void   write(uint8_t);
#endif

Lijn 48 van print.h: virtual size_t write(uint8_t) = 0;

[Bericht gewijzigd door Damic op (95%)]

Op 5 oktober 2014 23:07:23 schreef blurp:
Hernoem je source file eens naar .cpp.

Zei ik ook al, werkt dus aanzienlijk beter.
De gcc compiler is normaal ook de C++ compiler, alleen MOET de extensie cpp zijn. (Voor de puristen: gcc is een wrapper front-end die de echte c of c++ compiler aanroept)

Wat die laatste error betreft: Voeg bovenaan in je code (voor alle #include files)
#define ARDUINO 100

Of zo en kijk eens of alle errors weg zijn.

Alleen de vraag even wat die variable nu echt is geweest (arduino versie of zo denk ik).

Je kunt ook een makefile var definieren en aan de compiler meegeven:
-DARDUINO=100

Mag ik a kussen :p veel te lang niet meer geprogrammeerd code bij elkaar gesmeten :(
Nvm de lijst word ineens langer :( krijg hem niet gecompileerd.

[Bericht gewijzigd door Damic op (28%)]

Moeten de arduino libs niet tussen "" geplaatst worden?

voorbeeldje:

#include "arduino.h"

Nu ben ik niet een wonder in programmeren hoor. Begin nog maar net.

Maar de paden moeten toch altijd met \ ipv /

Voorbeeldje:
c:\lokatie\ed

niet
c:\lokatie/ed

[Bericht gewijzigd door Dazzled op (47%)]

Speelt geen rol, vind de bestanden toch ;)

wat betreft de <> en de "" heb ik dat op gezocht en heeft te maken of je het bestand de eerste keer include of de 2de keer, om het simpel te zeggen.

Misschien moet die ARDUINO define een andere waarde krijgen.
In de originele arduino tooling uitzoeken wat het zou moeten zijn.
Er worden waarschijnlijk conditioneel dingen wel of niet meegenomen.

Dus er zit niks anders op dan per error uit te zoeken wat het probleem precies is. En laat je niet misleiden door alle foutmeldingen, soms zit de fout ergens anders en zijn een bak errors "collateral damage" van een fout ergens anders.

Hahaa ik denk dat de compilerlinker iets serieus verkeerd doet.

Als ik voor avr-g++ volgende command line mee geeft -ansi of -std=c++98 dan krijg ik een hele lijst met reference error's (undefined reference to ...) maar gaat ie wel door

Execute: avr-g++ -I"C:\arduino\libraries" -I"C:\Arduino\hardware\arduino\cores\arduino" -I"D:\tech tekeningen\elektronica\oledgps" -I"D:\tech tekeningen\elektronica\oledgps" -mmcu=at90can64 -DF_CPU=8000000UL -Os -fpack-struct -fshort-enums -funsigned-char -funsigned-bitfields -ffunction-sections -fdata-sections -Wall -gdwarf-2 -MD -MP -MT oledgps.o -c -ansi "D:/tech tekeningen/elektronica/oledgps/oledgps.cpp"
Execute: avr-ar rcs liboledgps.a
Execute: avr-gcc -mmcu=at90can64 -Wl,-Map=oledgps.map -Wl,--gc-sections -Os liboledgps.a oledgps.o -L"C:\arduino\libraries" -L"C:\Arduino\hardware\arduino\cores\arduino" -o oledgps.elf
####Error: ELF file not created at D:\tech tekeningen\elektronica\oledgps\output\oledgps.elf
Deleting: oledgps.o liboledgps.a oledgps.d liboledgps.a
Deleted: 'oledgps.o', 'liboledgps.a', 'oledgps.d',
Build Failed with 0 errors

De avr-g++ command line opties heb ik hier gevonden, want als ik standaard -std=gnu99 mee geef of iets dat hem niet kent dan geeft ie daar een fout op met als melding "Undefined reference to main"

Dus nu is de vraag wat gaat er verkeerd :/ow wacht het is de avr-gcc dat in de fout gaat bij het aanmaken van het elf bestand, moet dat trouwens ook niet die avr-g++ zijn?

Ik dacht dat de arduino geen main() functie gebruikt voor je programma maar iets anders.
Het probleem is dat de linker verwacht dat er een main is.
Bij arduino zit er ook een main in de arduino code zelf verstopt maar die zie je niet.

Rename je hoofd functie loop zodat je zoiets krijgt:


void main(void) {

  /* Je Code komt hier */

}

Op 7 oktober 2014 21:48:34 schreef Damic:
Hahaa ik denk dat de compiler iets serieus verkeerd doet.

Ik denk het niet, ligt in 99,99% van de gevallen aan de gebruiker of foute code.

[Bericht gewijzigd door henri62 op (14%)]

Als ik loop gebruik zoals in arduino ide dan geeft ie een error dat ie geen main kan vinden :) de code ziet er zo uit:

// oledgps.cpp created for project oledgps on 10/07/2014 08:53:29
/* http://gathering.tweakers.net/forum/list_messages/1596164 */
#define ARDUINO 100
#include "Arduino.h"
#include <GOFi2cOLED/GOFi2cOLED.h>
#include <TinyGPSPlus-0.94b/TinyGPS++.h>

TinyGPSPlus gps;
GOFi2cOLED GOFoled;

int Snelheid=0;
int Satelliet = 0;
int Tijd = 0;
int GMTOffset = 2;

static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (Serial.available())
      gps.encode(Serial.read());
  } while (millis() - start < ms);
}

static void printTime(TinyGPSTime &t)
{
    char sz[32];

    int hour = t.hour() + GMTOffset;
    if (hour > 23) 
    {hour = hour - 24;}
        
    sprintf(sz, "%02d:%02d:%02d ", hour, t.minute(), t.second());
    GOFoled.print(sz);
 }
 
void setup()
{                  
  //default address is 0x3D.
  GOFoled.init(0x3C);
  // init done
  
  GOFoled.display(); // show splashscreen
  delay(5000);
  GOFoled.clearDisplay();

  Serial.begin(9600);
  
}

int main(void)
{
	setup();
    Satelliet = (gps.satellites.value());
        GOFoled.setTextSize(1);
        GOFoled.setTextColor(WHITE);
        GOFoled.setCursor(0,0);
        GOFoled.clearArea(0,0,127,8);
        GOFoled.print("Sat : ");
        GOFoled.print(Satelliet);

        GOFoled.println();
        GOFoled.setTextSize(1);
        GOFoled.clearArea(0,8,127,8);
        GOFoled.print("Tijd       : ");
        printTime(gps.time);

        Snelheid = (gps.speed.kmph());  
        GOFoled.clearArea(0,30,127,34);
        GOFoled.setCursor(0,30);
        GOFoled.setTextSize(5);
        GOFoled.print(Snelheid);
        GOFoled.setTextSize(1);
        GOFoled.print("km/h");     
        GOFoled.display(); 
        
   smartDelay(1000);
}

En hier de fouten:
http://i63.photobucket.com/albums/h148/fragme_dmc/electronics/projects/oled%20gps/oled_gps_errors_3.jpg

Volgens mij is het echt de avr-gcc dat de 2de keer word aangeroepen, dat het avr-g++ moet zijn, dus in de plaats van:

Execute: avr-gcc -mmcu=at90can64 -Wl,-Map=oledgps.map -Wl,--gc-sections -Os liboledgps.a oledgps.o -L"C:\arduino\libraries" -L"C:\Arduino\hardware\arduino\cores\arduino" -o oledgps.elf

zou het

Execute: avr-g++ -mmcu=at90can64 -Wl,-Map=oledgps.map -Wl,--gc-sections -Os liboledgps.a oledgps.o -L"C:\arduino\libraries" -L"C:\Arduino\hardware\arduino\cores\arduino" -o oledgps.elf

en dat kan ik niet veranderen :(

Op 8 oktober 2014 06:55:38 schreef Damic:

Volgens mij is het echt de avr-gcc dat de 2de keer word aangeroepen, dat het avr-g++ moet zijn

Die aanroep van avr-gcc is om te linken, want alle input-files zijn .a of .o.
Linken doe je met gecompileerde files, en dan is het verschil tussen C en C++ al niet meer zichtbaar.

en dat kan ik niet veranderen :(

En daarmee illustreer je een groot nadeel van IDE's. Alhoewel het in dit geval niet uitmaakt.

Wat verder terug:

Als ik voor avr-g++ volgende command line mee geeft -ansi of -std=c++98 dan krijg ik een hele lijst met reference error's (undefined reference to ...) maar gaat ie wel door

Fouten negeren is geen oplossing. Het is niet voor niets dat de meeste serieuze ontwikkelaars de optie '-Wall-Werror' aanzetten: Alle warnings als fouten zien.

De compiler klaagt dat ie referenties (naar classes of functies) niet kent. Dat betekend dat je iets niet meecompileert wat wel moet. Zoek dat op.
En begin bij de eerste fout.

Ohja, en zet eens een zip met alle sources online.

Edit: -Werror, niet (alleen) -Wall.
@hieronder: -wall is fout. '-w' onderdrukt alle warnings. Als je nu vind dat GCC een zeikprogramma is; '-Wpedantic' en gcc zeikt nog meer :-)

-Wall word meegegeven.*typo
Zal straks eens proberen alles te packen. en voila: http://www.mazda-club.be/downloads/oledgps.zip [500kB]

Heb die -Wall en -Werror eens getest, resultaat veranderd niet. Lijst blijft even lang.
Bij -Wpedantic krijg ik Undefined reference to 'main', jaokroll

Omdat het C++ is moet je alle classes met een "new <classnaam>(...)" instantiëren. In arduino hebben ze dat allemaal weggemoffeld in macro's en in de IDE en headerfiles (waarschijnlijk).

Leuk bedacht maar c++ leer je er helemaal niet mee. Voor de beginner is het wel handig.

Maar nu moet je dat allemaal zelf doen.

Bijvoorbeeld de class GOFoled:

Zet dit eens in je globale main functie:

In de main:


 GOFoled = new GOFi2cOLED();  // Het maken van de "instantie" van die class.

Voor de rest van de code. (Niet getest maar zoiets moet het worden voor alle classes)

Ook de setup() functie is zo weggemoffeld, maar dat heb je zelf al ontdekt zie ik: door deze in je main aan te roepen.

Mmmh eens een boek aanschaffen over c++ :p

Ik zag net dat mijn voorbeeld fout is, die global is al gedefinieerd blijkbaar als typedef.
Is nu aangepast hierboven.

mmmh volgens deze tutorial over classes en objects moet dat niet: http://www.tutorialspoint.com/cplusplus/cpp_classes_objects.htm

Ja die setup hou ik tegenwoordig zelf aan :p is handig om van alles in te stoppen die je echt in het begin moet aanroepen.

Edit: ik zien juist van dat AVR studio 6 nog geïnstalleerd staat eens zien wat ie daar in doet.
@goof: eens koeken :)

ik heb een tijdje terug zoiets geprobeerd voor de rpi vanuit een arduino source. https://github.com/gnulnulf/RF24
Heb je hier iets aan?

Mmh eventjes in Studio 6 gegooid en krijg dezelfde fouten.

Op 8 oktober 2014 22:07:38 schreef Damic:
mmmh volgens deze tutorial over classes en objects moet dat niet: http://www.tutorialspoint.com/cplusplus/cpp_classes_objects.htm

Oops: Das waar ook...te lang geleden C++ geprogrammeerd. Ik probeer C++ zo veel mogelijk te vermijden omdat ik het te messy vind en er een belangrijk aantal conceptuele blunders in zitten.