0
votes

I want to use ArduinoCore-avr in my project. I don't want to use arduino's IDE default function setup() and loop(). I also don't want to use arduino's IDE to compile and burn hex file into my device. ArduinoCore-avr library is downloaded from ArduinoCore.
Hardware: arduino uno (atmega328p)
Directory structure:
./ArduinoCore-avr/cores/arduino/Arduino.h
./main.c
./Makefile

main.c:

#ifndef F_CPU
#define F_CPU 16000000UL // or whatever may be your frequency
#endif

#include <avr/io.h>
#include <util/delay.h>                // for _delay_ms()

#include "ArduinoCore-avr/cores/arduino/Arduino.h" // This line gave me error.

#define LED_PIN 13

int main(void)
{
    DDRB=0b11100000;//pin 13 is in output mode
    while (1) {
        PORTB=0b11100000; //make pin 13 high and power on the led
        _delay_ms(1000);
        PORTB=0b11000000; //make pin 13 low and power off the led
    _delay_ms(1000);
    }
}

Makefile:

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

# 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.
# FUSES ........ Parameters for avrdude to flash the fuses appropriately.

DEVICE     = atmega328p
AVRDUDE_DEVICE = m328p
CLOCK      = 16000000
PROGRAMMER = -c arduino -P /dev/tty.usbmodem1411
OBJECTS    = main.o
FUSES      = -U lfuse:w:0x64:m -U hfuse:w:0xdd:m -U efuse:w:0xff:m
HEADER     = ArduinoCore-avr/cores/arduino/Arduino.h

######################################################################
######################################################################

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

AVRDUDE = avrdude $(PROGRAMMER) -p $(AVRDUDE_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)

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
# 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

When compiling with the following command.
make
It shows the following error.

In file included from main.c:7:
ArduinoCore-avr/cores/arduino/Arduino.h:257:10: fatal error: pins_arduino.h: No such file or directory
 #include "pins_arduino.h"
          ^~~~~~~~~~~~~~~~
compilation terminated.
  1. I know that I have to add the library in my Makefile, but I don't know how to do that.
  2. When including the header file in main.c, should I use #include "ArduinoCore-avr/cores/arduino/Arduino.h" or #include "Arduino.h".
  3. The reason why I want to include Arduino.h file is that I want to use pinMode and digitalWrite function in my main.c. I don't want to reinvent the wheel (write the driver from scratch). Is that possible? I've tried to search the example code, but they all use arduino's default function which are loop and setup which is what I want to avoid.

Thank you.

1
You could use this program to compile your Arduino code from the command line instead of building a Makefile yourself: platformio.orgDavid Grayson
@DavidGrayson: I want to learn how the compiling chain works, so I avoid using the tool. thxLion Lai
@DavidGrayson: I've checked arduino-mk github, it looks like it's more difficult than I thought. It seems I have to figure out the whole include structure of arduino library so I can use the simple digitalWrite() function. It's not that simple that I just have to include Arduino.h. Am I right?Lion Lai
My impression is you will have to add several directories to your include path, and you will also have to compile a bunch of .c and .cpp files from the Arduino core code into a static library, and link the static library into your program. I suggest ditching the Makefile for a while since you are still learning how GCC works; just write a shell script that runs all the commands you need.David Grayson

1 Answers

0
votes

Yes, it should be possible to the use Arduino AVR core code if you can manage to invoke the compiler in the right way to compile it and link it into your progam.

I am not going to give you an entire tutorial to solve all the problems you might find along the way. I think it will be sufficient to just point out how to solve the error you are currently getting, which is that pins_arduino.h is not found.

GCC has a list of directories called an include search path. When you #include a file, GCC searches the directories in the include search path for a file of that name. To make sure GCC can find pins_arduino.h, you need to locate the directory that has the right version of pins_arduino.h and add it to your include path using GCC's -I option. For example:

avr-gcc -Ipath/to/folder/ ...

The path can be relative or absolute but relative ones are easier to maintain and share with others.