Шим на ATTINY 2313

Мне лень смотреть сколько возможно ШИМ у 2313.) Но ведь ядром тебя никто не заставляет пользоваться. Ты можешь использовать Ардуино, но не использовать её функкции. В этом то вся и гибкость Ардуино.

Ты будешь смеяться. Но людям я, зачастую, отдаю .ino файл с тестом. И они фигеют от этого. А основной файл находится в .с или .сpp.

Ядром я наэываю программы поддержки МК в ИДЕ. В настройках платы есть отключение millis

Ну это кто как привык :wink:

Пофигу что в настройках. Просто не используй миллис в всё. Она не будет ключаться у тебя.)

Ну я бы не был так категоричен. В ядре нулевой таймер всегда настраивается по умолчению на генерацию millis не зависимо от использования. Здесь сделан прямой запрет этого действия.

int main() {
while(1){
// и чё?
}
}

Это ты такой умный! А средне статистический пользователь setup и loop попользует и…

Я не умный.) Я тоже setup() и loop() использую, по возможности.)
Просто, ребёнка Си учу, хотя она на Пайтоне курсы проходит.)

Ну нет. Ответ мой был в том, что никто тебе не запрещает не использовать Ардуино IDE. Ты понимаешь? Пиши себе на Си и всё тут.)

Согласен. Я и пишу где мне удобней для данной задачи.

Ну ведь ты же спрашиваешь о ядре и миллис? А я тебе разъясняю, в меру своих возможностей.)

Не. Не спрашиваю. Я наоборот напоминаю ТС, что 4 канала ШИМ можно использовать, если не используешь миллис. Иначе будут нормально работать только 2 канала таймера 1. Того который не нулевой, а настройках обзывается как Secondary.

ОК, виноват.)
Значит, мы вместе объясняем ТС-у.)
Надеюсь что дойдёт.

Наглядный эксперимент
int main () {

  DDRD = 0;
  PORTD = 0xFF;
  uint8_t i = 0;

  while (1) {
    PORTD = i++;
    if (i > 220) {
      i = 0;
    }
  }
  return 0;
}

Скетч использует 84 байт (1%) памяти устройства. Всего доступно 8192 байт.
Глобальные переменные используют 0 байт (0%) динамической памяти, оставляя 1024 байт для локальных переменных. Максимум: 1024 байт.

int main () {

  DDRD = 0;
  PORTD = 0xFF;
  uint8_t i = 0;
  pinMode (10, OUTPUT);

  while (1) {
    PORTD = i++;
    digitalWrite(10, HIGH);
    if (i > 220) {
      i = 0;
      digitalWrite(10, LOW);
    }
  }
  return 0;
}

Скетч использует 334 байт (4%) памяти устройства. Всего доступно 8192 байт.
Глобальные переменные используют 0 байт (0%) динамической памяти, оставляя 1024 байт для локальных переменных. Максимум: 1024 байт.

uint8_t i = 0;

void setup() {

  DDRD = 0;
  PORTD = 0xFF;
  pinMode (10, OUTPUT);
}

void loop() {

  PORTD = i++;
  digitalWrite(10, HIGH);
  if (i > 220) {
    i = 0;
    digitalWrite(10, LOW);
  }
}

Скетч использует 568 байт (6%) памяти устройства. Всего доступно 8192 байт.
Глобальные переменные используют 10 байт (0%) динамической памяти, оставляя 1014 байт для локальных переменных. Максимум: 1024 байт.

int main () {

  DDRD = 1;
  PORTD = 0xFF;
  DDRB = 1;
  
  uint8_t i = 0;

  while (1) {
    PORTD = i++;
    PORTB |= (1 << PB2);      // PB2 это пин 10 в ардуино
    if (i > 220) {
      i = 0;
      PORTB &= ~(1 << PB2);
    }
  }
  return 0;
}

Скетч использует 86 байт (1%) памяти устройства. Всего доступно 8192 байт.
Глобальные переменные используют 0 байт (0%) динамической памяти, оставляя 1024 байт для локальных переменных. Максимум: 1024 байт.

Но мысль то понятна, надеюсь?

Под лупом ещё одна функция прячется. Сделай while(1) в сетупе и получишь ещё один результат.

Конечно. И бреком можно из неё выскочить.
И даже локальную переменную в этом случае на заведёшь.) Ибо, это всё издержки
языка.

Ты попробуй миллис вывести во всех этих экспериментах.

В каких экспериментах? Пример приведи.
Зачастую, миллис там и нах не нужен!