Сколько времени требуется ардуино, чтобы достичь main()?

Я пытаюсь эмулировать поведение схемы с помощью Attiny85

Вот результат, который я получил на данный момент:

На рисунке выше D2 — это VCC, D4, D5 и D6 — выходы схемы, которую я пытаюсь эмулировать. D7 — это результат работы Attiny85

Код, который я использую:

#define F_CPU 8000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

int main() {

  DDRB = 0b00001000;

  PORTB = 0b00001000;
  _delay_ms(5);

  PORTB = 0b00000000;
  _delay_ms(5);
  PORTB = 0b00001000;
  _delay_ms(5);

  PORTB = 0b00000000;
  _delay_ms(5);

  _delay_ms(5);

  while(1)
  {  
     PORTB = 0b00001000;
    _delay_ms(1);
     PORTB = 0b00000000;
    _delay_ms(1);
  }
    return 0;
}

Согласно этому, с момента включения до фактического запуска основной программы проходит примерно 64 мс.

Есть ли причина такой задержки? Как я могу его как-то уменьшить (в идеале до 20 мс или меньше)?

, 👍0

Обсуждение

вы используете загрузчик или программируете его через интернет-провайдера?, @Juraj

Извините, забыл упомянуть - да, я программировал через интернет-провайдера (usbtiny), чтобы убедиться, что загрузчик не активен, @Filipe Rodrigues


1 ответ


Лучший ответ:

5

ATtiny85 имеет встроенный счетчик задержки, который поддерживает сброс MCU. режим в течение некоторого времени после подачи питания. Кажется, это задумано как ожидание стабилизации часов и питания. Длина этого задержка зависит от выбранного вами источника синхронизации и несколько настраивается с помощью предохранителей.

Согласно вашему коду, ваш MCU работает на частоте 8 МГц. Я предполагаю, что ты затем используют внутренний RC-генератор в качестве источника синхронизации. Если это В этом случае у вас есть три варианта задержки запуска:

  • 20 циклов ЦП
  • 20 циклов ЦП + 4 мс
  • 20 циклов ЦП + 64 мс

Последнее рекомендуется, если ваша мощность растет медленно, и это значение по умолчанию. конфигурации, в которой поставляются эти микроконтроллеры. Если ваш уровень мощности повышается быстро, вы можете выбрать более короткую задержку, запрограммировав SUT. предохранители. Подробности смотрите в техническом описании (разделы «Системные часы» и «Часы»). Параметры → Источники синхронизации → Калиброванный внутренний генератор).

,

Вы правы — мой предохранитель L был запрограммирован как 0xE1 (тактовая частота PLL, задержка 64 мс). Я изменил его на 0xD2 (внутренние часы, 8 МГц, задержка 4 мс), и все заработало., @Filipe Rodrigues