Официальный сайт компании Arduino по адресу arduino.cc
#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
Базаришь. На десятичном счётчике влёхкую замучу, но без рандома))) (но не хочу)
Как много "но", однако...
"Не могу и не хочу...")
https://youtu.be/TrYYu718xF8
Базаришь. На десятичном счётчике влёхкую замучу, но без рандома))) (но не хочу)
Как много "но", однако...
"Не могу и не хочу...")