7 плавно загорающих и гаснущих диодов.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016
#include <avr/interrupt.h>

const byte Pins[8] = {5, 6, 7, 8, 9, 10, 11, 12};

struct listPWM {
  int period;
  int phase;

  byte* port;
  byte pin;
  byte OCR;
} pinList[8];

ISR(TIMER2_COMPA_vect) {
  byte t = OCR2A;
  byte n = OCR2A - 2;

  for (byte i = 0; i < 8; i++) {
    if ( ((pinList[i].OCR - t) & 0xff) < 2) {
      *(pinList[i].port) |= pinList[i].pin;
    }
    else if (((pinList[i].OCR - t) & 0xff) < ((n - t) & 0xff) )
      n = pinList[i].OCR;
  }
  OCR2A = n;
}

ISR(TIMER2_OVF_vect) {
  for (byte i = 0; i < 8; i++) *(pinList[i].port) &= ~pinList[i].pin;
}

void setup() {
  Serial.begin(115200);

  for (byte i = 0; i < 8; i++) {
    byte p = digitalPinToPort(Pins[i]);
    pinMode (Pins[i], OUTPUT);
    pinList[i].port = portOutputRegister(p);
    pinList[i].pin = digitalPinToBitMask(Pins[i]);
    pinList[i].OCR = 200;
    pinList[i].period = 450 * random(2, 16);
    pinList[i].phase = 0;
  }

  TCCR2A = 0b00000000; //COM2A1:COM2A0:COM2B1:COM2B0:x:x:WGM21:WGM20
  TCCR2B = 0b00000110; //ICNC1:ICES1:X:WGM13:WGM12:CS12:CS11:CS10
  //режим 0 прескаллер 256 - ШИМ 244Гц.
  OCR2A = 0;
  TIMSK2 = 0b00000011; //xxxxx:OCIEB:OCIEA:TOIE
}

void loop() {
  static uint32_t om = millis();
  uint32_t nm = millis();

  if (nm - om > 10) {
    om = nm;
    for (byte i = 0; i < 8; i++) {
      pinList[i].phase+=10;
      if (pinList[i].phase > pinList[i].period) pinList[i].phase = 0;
      pinList[i].OCR = map(pinList[i].phase,0,pinList[i].period,177,254);
    }
  }
}

https://youtu.be/TrYYu718xF8

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

-NMi- пишет:

Базаришь. На десятичном счётчике влёхкую замучу, но без рандома)))      (но не хочу)

Как много "но", однако...

Green
Онлайн
Зарегистрирован: 01.10.2015

"Не могу и не хочу...")