Ардуино на частоте 11,0592 МГц. Изменить Timer0, delayMicroseconds()

Я использую ATMega328P на частоте 11,0592 МГц со средой Arduino. Я понял, что функция delayMicroseconds() работает примерно на 27% быстрее. Причина в том, что код в wireing.c предполагает, что тактовая частота теперь составляет 8 МГц.

Сейчас пытаюсь исправить. Я нашел разные сообщения, но я не уверен, что это наиболее совместимый способ с Arduino. Что вы можете порекомендовать?

  1. Умножить переменную «us» в wireing.c на 1,27, если частота F_CPU составляет 11,0592 МГц? Легко, но влияет только на delayMicroseconds, а не на millis(), micros(), delay() и т. д.
  2. Измените коэффициент масштабирования, возможно, с 64 до ???

Другие идеи или руководства?

Заранее спасибо.

Феликс


person FelixA    schedule 01.01.2014    source источник


Ответы (1)


Способ Arduino состоял бы в том, чтобы создать собственную ПЛАТФОРМУ для вашей платы с новой скоростью F_CPU. Основные библиотеки должны поддерживать этот F_CPU.

Это достаточно просто, создав файл boards.txt с вашими отличиями. Где расположение файла (одинаковое между двумя) отличается между двумя текущими IDE. В случае Arduino IDE 1.0.5:

C:\Users\mflaga\Documents\Arduino\hardware\myArduino11MgHz\boards.txt

а в случае 1.5.5:

C:\Users\mflaga\Documents\Arduino\hardware\myArduino11MgHz\avr\boards.txt

Где в вашем случае каталог эскиза будет другим.

# See: http://code.google.com/p/arduino/wiki/Platforms

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

myArduino11MgHz.name=Arduino 11MgHz

myArduino11MgHz.vid.0=0x2341
myArduino11MgHz.pid.0=0x0043
myArduino11MgHz.vid.1=0x2341
myArduino11MgHz.pid.1=0x0001

myArduino11MgHz.upload.tool=avrdude
myArduino11MgHz.upload.protocol=arduino
myArduino11MgHz.upload.maximum_size=32256
myArduino11MgHz.upload.maximum_data_size=2048
myArduino11MgHz.upload.speed=115200

myArduino11MgHz.bootloader.tool=avrdude
myArduino11MgHz.bootloader.low_fuses=0xFF
myArduino11MgHz.bootloader.high_fuses=0xDE
myArduino11MgHz.bootloader.extended_fuses=0x05
myArduino11MgHz.bootloader.unlock_bits=0x3F
myArduino11MgHz.bootloader.lock_bits=0x0F
myArduino11MgHz.bootloader.file=optiboot/optiboot_atmega328.hex

myArduino11MgHz.build.mcu=atmega328p
myArduino11MgHz.build.f_cpu=11059200L
myArduino11MgHz.build.board=AVR_myArduino11MgHz
myArduino11MgHz.build.core=arduino:arduino
myArduino11MgHz.build.variant=arduino:standard

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

Вот сторонний графический редактор файла board.txt.

Отказ от ответственности. Вышеприведенное компилируется и должно работать нормально. Где я на самом деле не тестировал и не загружал в блок.


Тем не менее, я ожидаю, что F_CPU загрузчика не будет совпадать. Здесь есть три возможных решения.

Первый; загрузчик optiboot должен иметь соответствующую цель со следующим отклонением:

\arduino-1.5.5\hardware\arduino\avr\bootloaders\optiboot\Makefile

myArduino11MgHz: AVR_FREQ = 11059200L

Второй; Измените скорость загрузки boards.txt, чтобы она соответствовала изменению =115200*(11059200/16000000).

myArduino11MgHz.upload.speed=79626

Это нетипичная скорость передачи данных, поэтому либо avrdude, либо последовательный порт могут ее поддерживать.

Третий; Не используйте загрузочную загрузку, загрузив через программатор ISP.


Я также планировал сделать плату с другим F_CPU, но на самом деле сделал только собственные платы с той же скоростью. Мне было бы любопытно узнать, действительно ли вышеизложенное работает в вашем случае.

person mpflaga    schedule 01.01.2014
comment
Спасибо. Но на Arduino мало установить скорость F_CPU. Hardware Serial и SoftwareSerial, например, имеют множество жестко закодированных исключений для 8 МГц, 16 МГц и 20 МГц. Если вы посмотрите в wireing.c и подробнее на delaymicrosecond(), то увидите, что это специально для 3-х частот. Если вы установите F_CPU на 11059200L, то вы будете использовать функцию delaymicrosends на частоте 8 МГц, и ваши задержки составят 27% от быстрой. Теперь это моя проблема. - person FelixA; 01.01.2014
comment
облом, ничто не мешает вам сделать собственную версию delaymicrosecond11MgHz(). Где похоже, что в некоторых случаях F_CPU повлияет, как в случае с millis(), но не delaymicrosecond. Поскольку последний слишком быстрый и просто цикл nop. Где micros() и другие все считывают timer0_overflow_count, который, похоже, рассчитывается из F_CPU. так что да, некоторые исключения будут там. и нужно будет обработать. - person mpflaga; 02.01.2014