3

I quit using the Arduino IDE, instead I am now using Crosspack via the command line on my Mac.

It is working totally fine. I use "make" to compile it, "make flash" to upload it to the Arduino.

This is the Makefile I got right now:

# Name: Makefile
# Author: <insert your name here>
# Copyright: <insert your copyright message here>
# License: <insert your license reference here>

# This is a prototype Makefile. Modify it according to your needs.
# You should at least check the settings for
# DEVICE ....... The AVR device you compile for
# CLOCK ........ Target AVR clock rate in Hertz
# OBJECTS ...... The object files created from your source files. This list is
#                usually the same as the list of source files with suffix ".o".
# PROGRAMMER ... Options to avrdude which define the hardware you use for
#                uploading to the AVR and the interface where this hardware
#                is connected. We recommend that you leave it undefined and
#                add settings like this to your ~/.avrduderc file:
#                   default_programmer = "stk500v2"
#                   default_serial = "avrdoper"
# FUSES ........ Parameters for avrdude to flash the fuses appropriately.

DEVICE     = atmega328p
CLOCK      = 16000000    # 16 MHz for Arduino
PROGRAMMER = #-c stk500v2 -P avrdoper <-- leave this commented since we already specified the default programmer above
FUSES      = -U lfuse:w:0xFF:m -U hfuse:w:0xDE:m -U efuse:w:0x05:m # arduino defaults
OBJECTS    = main.o

# ATMega8 fuse bits used above (fuse bits for other devices are different!):
# Example for 8 MHz internal oscillator
# Fuse high byte:
# 0xd9 = 1 1 0 1   1 0 0 1 <-- BOOTRST (boot reset vector at 0x0000)
#        ^ ^ ^ ^   ^ ^ ^------ BOOTSZ0
#        | | | |   | +-------- BOOTSZ1
#        | | | |   +---------- EESAVE (set to 0 to preserve EEPROM over chip erase)
#        | | | +-------------- CKOPT (clock option, depends on oscillator type)
#        | | +---------------- SPIEN (if set to 1, serial programming is disabled)
#        | +------------------ WDTON (if set to 0, watchdog is always on)
#        +-------------------- RSTDISBL (if set to 0, RESET pin is disabled)
# Fuse low byte:
# 0x24 = 0 0 1 0   0 1 0 0
#        ^ ^ \ /   \--+--/
#        | |  |       +------- CKSEL 3..0 (8M internal RC)
#        | |  +--------------- SUT 1..0 (slowly rising power)
#        | +------------------ BODEN (if 0, brown-out detector is enabled)
#        +-------------------- BODLEVEL (if 0: 4V, if 1: 2.7V)
#
# For computing fuse byte values for other devices and options see
# the fuse bit calculator at http://www.engbedded.com/fusecalc/


# Tune the lines below only if you know what you are doing:

AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE)
COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE)

# symbolic targets:
all:    main.hex

.c.o:
    $(COMPILE) -c $< -o $@

.S.o:
    $(COMPILE) -x assembler-with-cpp -c $< -o $@
# "-x assembler-with-cpp" should not be necessary since this is the default
# file type for the .S (with capital S) extension. However, upper case
# characters are not always preserved on Windows. To ensure WinAVR
# compatibility define the file type manually.

.c.s:
    $(COMPILE) -S $< -o $@

flash:  all
    $(AVRDUDE) -U flash:w:main.hex:i

fuse:
    $(AVRDUDE) $(FUSES)

# Xcode uses the Makefile targets "", "clean" and "install"
install: flash fuse

# if you use a bootloader, change the command below appropriately:
load: all
    bootloadHID main.hex

clean:
    rm -f main.hex main.elf $(OBJECTS)

# file targets:
main.elf: $(OBJECTS)
    $(COMPILE) -o main.elf $(OBJECTS)

main.hex: main.elf
    rm -f main.hex
    avr-objcopy -j .text -j .data -O ihex main.elf main.hex
    avr-size --format=avr --mcu=$(DEVICE) main.elf
# If you have an EEPROM section, you must also create a hex file for the
# EEPROM and add it to the "flash" target.

# Targets for code debugging and analysis:
disasm: main.elf
    avr-objdump -d main.elf

cpp:
    $(COMPILE) -E main.c

I cannot just include "Arduino.h", but I need (want) to use it anyway.

My question is how I would go about doing that? I know where Arduino.h is located, but I cannot just copy that file to the project folder because it needs other files too.

If more info is needed, please let me know.

1 Answer 1

2

You need to compile all the core .c, .cpp and .S files into .o files (optionally archiving them into a .a file) then link them with your main program. Your main program will then become a sketch where you use setup() and loop() instead of main() since the main.cpp file in the core has main() in it. Of course you need to include Arduino.h in your source files as well or nothing will work.

The same goes for libraries. You need to compile and link the source code with your code as well as including the header file(s) in your code (and providing the paths to them with -I... directives).

9
  • First of all; thank you for your answer. I don't know if you mean exactly the same as I do. Let me explain a little bit: I have a Crosspack project with a main.c(pp) file. In this file I want to build a project. What I want to achieve is that I can do #include "Arduino.h" at the top of the file. If this is the same as you wrote, could you maybe explain a little bit how to do this, or at least point me in the right direction? I don't know how to do this since I have no experience with linking / compilers. Thanks again.
    – Jeroen
    Commented Sep 14, 2016 at 19:09
  • Arduino.h doesn't need to be in you make file. It needs to be the first line of your source files (your main.c or main.cpp files). #include in a make file will be treated as a comment, because # means comment. Commented Sep 15, 2016 at 8:13
  • @JeroenJK Yes, that is what I mean. Using Makefiles can be a bit of a black art. You will need to create targets for .cpp.o and .S.o which call the correct compilation commands for those file types. Then you add all the .o files to your OBJECTS variable. Alternatively create a libcore.a target which uses the archiver avr-ar to create a libcore.a archive which you then link with your main.o with: -L. -lcore. Note that calling your file main.c (which compiles into main.o) is a bad idea since the core contains main.cpp which compiles into main.o as well. Conflict city...
    – Majenko
    Commented Sep 15, 2016 at 10:17
  • @Matt Ah no, I mean #include at the top of the main.c file. ;) Sorry if that was not clear. @Majenko I will look into how to do what you wrote. I hope I will find out by Googling and trial and error. If not, I'll let you know. And if it succeeds I will of course accept your answer.
    – Jeroen
    Commented Sep 15, 2016 at 13:39
  • @JeroenJK - This is confusing. Do you mean "How do I include Arduino.h in main.c?" OR do you mean "My make file can't find Arduino.h, how do I tell it where to find it?" The exact argument depends on the compiler but it is usually -I, or some compilers accept the content of the INCLUDE environment variaible. Commented Sep 15, 2016 at 14:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.