Wie "#define F_CPU" richtig nutzen?

Hab den Bootloader schon auf 8MHz umgestellt.

Ich habe mir ein python script zum compilieren mit dem arduino-cli erstellt.
Und kann dabei unterschiedlichste .hex erstellen, in abhängigkeit der defines.

Jetzt möchte ich die 8MHz über den Sketch setzen, jedoch frisst er das nicht. Es kommen immer die 16MHz von der Boards.txt zum einsatz.

das hier habe ich probiert

#ifdef F_CPU
#undef F_CPU
#define F_CPU 8000000L
#endif

Ich habe mir ein python script zum compilieren mit den arduino-cli erstellt habe.

Welche Sprache ist das?

Deutsch ist das offensichtlich nicht, denn dann hätte ich eine Chance.
Bei japanisch, russisch, türkisch und Latein auch...
Aber das geht nicht runter.

--

Es kommen immer die 16MHz von der Boards.txt zum einsatz.

Klar!
Wenn dir das nicht passt, dann ändere das.

python ist jetzt eigentlich nicht ganz unbekannt.

ist ein simples script was den arduino-cli per consolen befehl aufruft. also ähnlich einem batch-script.

dachte es gibt eine gute lösung für den sketch. denn die boards.txt immer zu editieren (wenn ich 16MHz brauche), finde ich etwas unelegant.

harryberlin:
python ist jetzt eigentlich nicht ganz unbekannt.

ist ein simples script was den arduino-cli per consolen befehl aufruft. also ähnlich einem batch-script.

dachte es gibt eine gute lösung für den sketch. denn die boards.txt immer zu editieren (wenn ich 16MHz brauche), finde ich etwas unelegant.

Wenn es nicht zu lang ist, dann poste das Python-Programm. Fasse es in Code-Tags, damit es gut lesbar ist. Ein Fleißbildchen kannst Du Dir verdienen, wenn Du es zuvor aufhübschst :slight_smile:

Gruß

Gregor

das python script shaut so aus:

#!/usr/bin/env python
# -*- coding: utf-8 -*-


__author__ = 'harryberlin'

import os
import re
import subprocess


def call(command):
    try:
        try:
            output = subprocess.check_output(command, stderr=subprocess.STDOUT)
        except subprocess.CalledProcessError as error:
            output = error.output
            return error.returncode
        else:
            return output
    finally:
        pass


def compile_hex(device, rcam=False, lseq=False, ibus_if=False, clock=16):
    arduino_cli_path = os.path.join('C:\\', 'Users', 'harry', 'Downloads', 'arduino-cli', 'arduino-cli.exe')

    sketch_path = os.path.join('C:\\', 'Users', 'harry', 'Desktop', 'mein_sketch')

    output_path = os.path.join('Release')
    output_files = {'NANO': 'MEIN_SKETCH_NANO', 'MEGA': 'MEIN_SKETCH_MEGA'}

    boards = {'NANO': 'arduino:avr:nano', 'MEGA': 'arduino:avr:mega'}

    define_file = os.path.join(sketch_path, 'defines.h')

    board = boards[device]
    output_file = output_files[device]

    if lseq and device == 'NANO':
        output_file += '_LSEQ'

    elif rcam:
        output_file += '_RCAM'

    elif ibus_if:
        output_file += '_IBUS_IF'

    with open(define_file, 'w') as temp_file:

        if device == 'MEGA':
            temp_file.write('#define MEGA\n')

        if ibus_if:
            temp_file.write('#define IBUS_IF\n')
            temp_file.write('#define LIGHT_SEQ\n')
            temp_file.write('#define LIGHT_SEQ_EXT\n')

        elif lseq and device == 'NANO':
            temp_file.write('#define LIGHT_SEQ\n')
            temp_file.write('#define LIGHT_SEQ_EXT\n')

        elif rcam and device == 'NANO':
            temp_file.write('#define SET_MENU\n')
            temp_file.write('#define RCAM_RELAY\n')

        elif device == 'MEGA':
            temp_file.write('#define SET_MENU\n')
            temp_file.write('#define SET_MENU_EXT\n')
            if rcam:
                temp_file.write('#define RCAM_RELAY\n')
            temp_file.write('#define LIGHT_SEQ\n')
            temp_file.write('#define LIGHT_SEQ_EXT\n')

        elif device == 'NANO':
            temp_file.write('#define SET_MENU\n')

        if clock != 16:
            temp_file.write('#ifdef F_CPU\n')
            temp_file.write('#undef F_CPU\n')
            temp_file.write('#define F_CPU %s000000UL\n' % clock)
            temp_file.write('#endif\n')
            output_file += '_%sMHz' % clock

    target_path = os.path.join(output_path, output_file)

    command = '%s compile -b %s -o %s %s' % (arduino_cli_path, board, target_path, sketch_path)

    # print('Compiling [%s] ...' % OUTPUT_FILE)

    output = call(command)

    start = 'Sketch uses '
    end = ' of program storage'

    size = re.search('%s(.*)%s' % (start, end), output).group(1)

    # clean for compiling in IDE
    with open(define_file, 'w') as temp_file:
        temp_file.write('')

    # workaround to delete -elf and bootloader file
    if os.path.isfile('%s.hex' % target_path):
        os.remove('%s.elf' % target_path)
        os.remove('%s.with_bootloader.hex' % target_path)

        print 'Compiling %s [%s]' % (size, output_file)


def main():
    print('Compiling ...')
    compile_hex('NANO')
    compile_hex('NANO', rcam=True)
    compile_hex('NANO', lseq=True)
    compile_hex('NANO', ibus_if=True)
    compile_hex('MEGA')
    compile_hex('MEGA', rcam=True)
    compile_hex('MEGA', rcam=True, clock=8)
    compile_hex('MEGA', ibus_if=True)
    compile_hex('MEGA', ibus_if=True, clock=8)


if __name__ == '__main__':
    main()

im sketch ist dann dieses include drin:

#include "defines.h"

Und back to topic:
Auch in der IDE wird das #define F_CPU = 8000000L nicht verarbeitet.

harryberlin:

...

Ich kenne Python nicht und kann nur sagen, dass mir nichts aufgefallen ist, was nach Fehler aussieht.

Gruß

Gregor

hat jetzt auch nix mit dem script zu tun, denn in der Arduino IDE verhält es sich genauso, dass das "#define F_CPU" ignoriert wird.

Wenn dir die original Boardefinition nicht passt, dann bau dir eine eigene!

python ist jetzt eigentlich nicht ganz unbekannt.

Python ist mir schon bekannt.
Aber deine Sprache nicht.

Ich habe mir ein python script zum compilieren mit den arduino-cli erstellt habe.

Deutsch ist das nicht.

dachte es gibt eine gute lösung für den sketch. denn die boards.txt immer zu editieren (wenn ich 16MHz brauche), finde ich etwas unelegant.

Auch kein Deutsch.

Darf ich dich fragen:
Kannst du nicht anders, oder willst du nicht?

Versuchs mal in einer anderen Sprache...
z.B. English, oder Japanisch...

was geht heut mit dir, bin solch eine pamige art von dir nicht gewohnt. :open_mouth:
was stört dich denn bitte?

ja ok, "dem" arduino-cli.

don't hassle the hoff

Hallo,

wenn du im Sketch
#define F_CPU 8000000UL
schreibst, bekommste eine redefined Warnung.
Ich weiß vor lauter Schreck nicht wo F_CPU definiert wird.
Nur dort müßtest du das rausnehmen bzw. ersetzen durch

#if !defined F_CPU
#define F_CPU 8000000UL
#endif

Irgendwie haben manche Leute heute einen schlechten Tag oder wie? Nur rumgemotze über irgendwelchen Scheiß!

Nur rumgemotze über irgendwelchen Scheiß!

Stimmt, das ist deine Rolle!

Wenn dir die original Boardefinition nicht passt, dann bau dir eine eigene!

Das ist das Mittel der Wahl!
Ob euch das durch den Hals will, oder auch nicht, geht mir am "Dingens" vorbei.

combie:
Stimmt, das ist deine Rolle!

Manchmal bekommst du leider nicht mit wie du über das Ziel hinausschießt. Erst provozierst du andere mit deiner Art und Weise und danach regste dich auf wenn sich andere über dich aufgeregt haben. Wollte ich nur einmal gesagt haben.

combie:
Ob euch das durch den Hals will, oder auch nicht, geht mir am "Dingens" vorbei.

Verstehe ich nicht. Kannst du bitte auf Spanisch schreiben?

Doc_Arduino:
Hallo,

wenn du im Sketch
#define F_CPU 8000000UL
schreibst, bekommste eine redefined Warnung.
Ich weiß vor lauter Schreck nicht wo F_CPU definiert wird.
Nur dort müßtest du das rausnehmen bzw. ersetzen durch

#if !defined F_CPU
#define F_CPU 8000000UL
#endif

OK, dann werd ich mal schaun, wie ich das gelöst kriege.

Hallo,

besser wäre dann so, die orignalen 16MHz sollen ja erhalten bleiben. :slight_smile:

#if !defined F_CPU
#define F_CPU 16000000UL
#endif

Was ist ein "arduino-cli"?
Grüße Uwe

F_CPU se especifica en los boards.txt.
Si desea ajustar este valor, debe ajustar los boards.txt o crear el suyo propio.
Mi consejo, crea tu propia definición de tablero.

uwefed:
Was ist ein "arduino-cli"?
Grüße Uwe

Mit dem command line interface kann man sketche ohne IDE compilieren:

Hallo,

habe mal gesucht. Also in der boards.txt ist eine Variable bspw.
uno.build.f_cpu=16000000L
schon bekannt der dann dort ein Wert zugewiesen wird.
Vielleicht kannste irgendwie diese Variable verwenden?
Wäre nur so ein Gedanke.

Was ist ein "arduino-cli"?

ein Kommandozeilenprogramm, DOS like.

Doc_Arduino:
Hallo,

habe mal gesucht. Also in der boards.txt ist eine Variable bspw.
uno.build.f_cpu=16000000L
schon bekannt der dann dort ein Wert zugewiesen wird.
Vielleicht kannste irgendwie diese Variable verwenden?
Wäre nur so ein Gedanke.

danke der mühe
die boards.txt ist ja dass thema von combie, wenn man das gemecker und jammern ignoriert.
wird wohl drauf hinauslaufen, einen zweiten mega mit 8MHz anzulegen.