Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
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.
// 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%)]
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
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%)]
Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
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%)]
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
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").
Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
ha of andere compiler gebruiken ow wacht verkeerd begrepen
[Bericht gewijzigd door Damic op (33%)]
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
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.
Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
Ha simpel 
En de lijst word korter (lijn 160 tot 164):
#if ARDUINO >= 100
virtual size_t write(uint8_t);
#else
virtual void write(uint8_t);
#endifLijn 48 van print.h: virtual size_t write(uint8_t) = 0;
[Bericht gewijzigd door Damic op (95%)]
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
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
Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
Mag ik a kussen
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%)]
Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
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.
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
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.
Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
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?
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
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%)]
Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
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);
}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 
Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
-Wall word meegegeven.*typoZal 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
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
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.
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
Ik zag net dat mijn voorbeeld fout is, die global is al gedefinieerd blijkbaar als typedef.
Is nu aangepast hierboven.
Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
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
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?
Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
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.