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.

in de arduino.mk worden nog wat extra dingen toegevoegd. (ik denk deze: https://github.com/sudar/Arduino-Makefile ) Het is een arduino.mk om zonder arduino ide toch te kunnen compileren.
De main zit daar in.

( krijg het gevoel dat het best lang geleden is.)

@goof: blijkbaar heel lang geleden want je hebt de arduino ide nodig :p

In ieder geval dit gevonden: http://stackoverflow.com/questions/12573816/what-is-an-undefined-refer… daar eens doorlezen.

edit: nog een gevonden met een oplossingen:
http://stackoverflow.com/questions/18549526/undefined-references-to-fu…

[Bericht gewijzigd door Damic op (26%)]

Ik heb TS zijn source even gepakt en geprobeerd te bouwen.

Omdat ik geen zin heb een IDE te installeren heb ik gewoon mijn standaard Makefile genomen, en alle bijna sources erin gezet.

oledgps.cpp heb ik als target genomen. main.cpp heb ik weggelaten.

Dat gaf deze foutmelding:
wiring_digital.c:(.text+0x6a): undefined reference to 'digital_pin_to_bit_mask_PGM'

"digital_pin_to_bit_mask_PGM" heb ik even gegoogled, en dat leert dat die normaal in pins_arduino.h gedefinieerd wordt. Wat verder zoeken leert dat de pins_arduino.h die TS had incompleet was. Dus even een goede gezocht, en voila:
Alles bouwt (met een paar warnings)...

Conclusie: TS heeft zijn IDE verkeerd ingesteld.

Makefile:

# Makefile
TARGET = oledgps

MCU=atmega328p
# put at end of mem in bootloader memory

SRC = twi.c  WInterrupts.c  wiring_analog.c  wiring.c  wiring_digital.c  wiring_pulse.c  wiring_shift.c
INCLUDE = .
CXXSRC = GOFi2cOLED.cpp TinyGPS++.cpp CDC.cpp HardwareSerial.cpp HID.cpp IPAddress.cpp new.cpp Print.cpp Stream.cpp Tone.cpp USBCore.cpp  Wire.cpp WMath.cpp WString.cpp

F_CPU = 16000000

OBJCOPY = /usr/bin/avr-objcopy
OBJDUMP = /usr/bin/avr-objdump
CC      = /usr/bin/avr-gcc
CXX     = /usr/bin/avr-g++
SIZE    = /usr/bin/avr-size
NM      = /usr/bin/avr-nm
AR      = /usr/bin/avr-ar
RM      = /bin/rm -f

CXXFLAGS      = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -DARDUINO=100 -Os -I$(INCLUDE)
CFLAGS        = -mmcu=$(MCU) -DF_CPU=$(F_CPU) $(C_DEFINES) -O2 -I$(INCLUDE)
LDFLAGS       = -lm 
# all objects
OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o)
#default target
all: hex lss sym bin size

elf: $(TARGET).elf
hex: $(TARGET).ihex
eep: $(TARGET).eep
lss: $(TARGET).lss
sym: $(TARGET).sym
bin: $(TARGET).bin

#Display size
HEXSIZE = $(SIZE) --target=ihex $(TARGET).ihex
ELFSIZE = $(SIZE) $(TARGET).elf
size:
        @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(HEXSIZE); echo; fi

.SUFFIXES: .elf .ihex .eep .lss .sym .bin

# standard rules for building

.elf.ihex:
        $(OBJCOPY) -j .text -j .data -j .buildstamp -O ihex $< $@

.elf.bin:
        $(OBJCOPY) -j .text -j .data -j .buildstamp -O binary $< $@

.elf.eep:
        -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
        --change-section-lma .eeprom=0 -O ihex $< $@

# Create extended listing file from ELF output file.
.elf.lss:
        $(OBJDUMP) -h -S $< > $@

# Create a symbol table from ELF output file.
.elf.sym:
        $(NM) -n $< > $@

# Link: create ELF output file from library.
$(TARGET).elf: $(TARGET).cpp common.a
        $(CC) $(CFLAGS) -o $@ $(TARGET).cpp  -L. common.a $(LDFLAGS)
        $(RM) buildstamp.o

common.a: $(OBJ)
        @for i in $(OBJ); do echo $(AR) rcs common.a $$i; $(AR) rcs common.a $$i; done
        $(RM) $(OBJ)

# Compile: create object files from C++ source files.
.cpp.o:
        $(CXX) -c $(CXXFLAGS) $< -o $@

# Compile: create object files from C source files.
.c.o:
        $(CC) -c $(CFLAGS) $< -o $@

clean:
        $(RM) $(TARGET).ihex $(TARGET).eep $(TARGET).elf \
        $(TARGET).map $(TARGET).sym $(TARGET).lss common.a \
        $(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d) \
        $(TARGET).bin


.PHONY: all build elf hex eep lss sym program coff extcoff clean depend sizebefore sizeafter readfuse bin

Ha dan heeft den installer van Arduino problemen, want ik had nog bestanden dat er niet waren. Eens de zip downloaden en die uitpakken in de arduino map.

Trouwens de 328p gebruik ik niet :p zal nog wel wat moeten aanpassen voor de 90can

Voor een 90can zul je zeker moeten aanpassen, want je gebruikt allerlei arduino-code die ervan uit gaat dat er een mapping is van het arduino pinnummer ('12' in digitalWrite(12,1) bijvoorbeeld) naar een bit in een Atmega SFR.

Als je dat niet goed hebt zal het wel bouwen en programmeren, maar in de praktijk waarschijnlijk niets doen.
Of roken als je pech hebt :)

Edit: @damic hieronder. Apart, want mijn v1.0.5. heeft pins_arduino.h wel. En zonder die file gaat zelfs de blink scetch niet werken....

[Bericht gewijzigd door blurp op (16%)]

Ja maar eerst is het van: compileerd het en dan is het van werkt het ;)

Edit: wat ik helemaal niet grappig vind is dat pins_arduino.h zelf niet bij in het zip bestand (v1.0.6) zit :/ nu de beta versie aan het downloaden. was in de verkeerde map aan het zien :(

Juist een atmega8 aangesloten via usbasp, wil ik de source compileren in de laatste beta versie van arduino, krijg ik een mooie domme melding, dat er iets is fout gegaan maar voor de rest noegabollen.

Arduino: 1.5.8 (Windows 7), Board: "Arduino NG or older, ATmega8"

Using library Wire in folder: C:\Arduino\hardware\arduino\avr\libraries\Wire
Using library GOFi2cOLED in folder: C:\Arduino\libraries\GOFi2cOLED (legacy)
Using library TinyGPSPlus in folder: C:\Arduino\libraries\TinyGPSPlus (legacy)

C:\Arduino/hardware/tools/avr/bin/avr-gcc -c -g -Os -w -ffunction-sections -fdata-sections -MMD -mmcu=atmega8 -DF_CPU=16000000L -DARDUINO=158 -DARDUINO_AVR_NG -DARDUINO_ARCH_AVR -IC:\Arduino\hardware\arduino\avr\cores\arduino -IC:\Arduino\hardware\arduino\avr\variants\standard -IC:\Arduino\hardware\arduino\avr\libraries\Wire -IC:\Arduino\libraries\GOFi2cOLED -IC:\Arduino\libraries\TinyGPSPlus C:\Users\damic\AppData\Local\Temp\build7059498318240703907.tmp\hooks.c -o C:\Users\damic\AppData\Local\Temp\build7059498318240703907.tmp\hooks.c.o

Error compiling.

handig he :/

HA nu zien ik het, als ik het project opendoen krijg ik:

File name TinyGPS++.cpp is invalid: ignoredFile name TinyGPS++.h is invalid: ignored