Гасить все а поджигать тот самый
Руки бы поотрывать за такие скетчи.
У него их нет. ![]()
“Критикуешь - предлагай!”(с) И членовредительство это не предложение!
ой, я код толстый опубликовал из 35го и даже не заметил)))
ну судя по сообщениям, и не только в этой теме, не один я стал не внимательно читать темы)))
вот это версия! необычно))) хоть и 0-7
ну да, если задействовать весь порт D (RX и TX в том числе) то так, осталось увидеть, что Green предложит, но ожидать чуда не приходится
тогда вот моя версия))) вроде работает
пишите так, и после проекта вас не пнут под зад))) но это не точно…
#include <avr/io.h>
#include <avr/interrupt.h>
/* ==================== КОНФИГУРАЦИЯ ==================== */
constexpr uint8_t HYST = 20; // Гистерезис (единицы АЦП)
constexpr uint16_t ZONE_W = 128; // Ширина зоны (1024 / 8)
constexpr uint8_t TIMER_TOP = 155; // ~10 мс: (155+1)*1024/16e6
/* ==================== СОСТОЯНИЕ ==================== */
volatile int8_t lastZone = 0;
/* ==================== ЧТЕНИЕ АЦП НАПРЯМУЮ ==================== */
static inline uint16_t adc_read() {
ADCSRA |= _BV(ADSC); // Старт преобразования
while (ADCSRA & _BV(ADSC)); // Ждём завершения
return ADC;
}
/* ==================== SETUP ==================== */
void setup() {
// --- Настройка портов для пинов 2-7 (PORTD) и 8-9 (PORTB) ---
DDRD |= 0b11111100; // Пины 2-7 — выход
DDRB |= 0b00000011; // Пины 8-9 — выход
PORTD &= ~0b11111100; // Выключить
PORTB &= ~0b00000011; // Выключить
// --- Тест-мигание при старте ---
for (uint8_t i = 0; i < 8; i++) {
PORTD = (PORTD & 0b00000011) | (1 << (i + 2)); // Пины 2-7
if (i >= 6) {
PORTB = (PORTB & 0b11111100) | (1 << (i - 6)); // Пины 8-9
}
delay(80);
PORTD &= ~0b11111100;
PORTB &= ~0b00000011;
}
delay(200);
// --- Настройка АЦП ---
ADMUX = _BV(REFS0); // AVcc, ADC0
ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); // Вкл, /128
// --- Настройка Таймера 2 (8-битный) ---
TCCR2A = _BV(WGM21); // CTC режим
TCCR2B = _BV(CS22) | _BV(CS21) | _BV(CS20); // Делитель 1024
OCR2A = TIMER_TOP; // TOP для ~10 мс
TIMSK2 = _BV(OCIE2A); // Прерывание по совпадению
sei(); // Глобальные прерывания
}
/* ==================== ВСЯ ЛОГИКА В ПРЕРЫВАНИИ ==================== */
ISR(TIMER2_COMPA_vect) {
uint16_t v = adc_read();
// --- Гистерезис без if ---
int16_t lo = (int16_t)lastZone * ZONE_W + HYST;
int16_t hi = (int16_t)(lastZone + 1) * ZONE_W - HYST;
lastZone += (v > hi) - (v < lo);
if (lastZone < 0) lastZone = 0;
if (lastZone > 7) lastZone = 7;
// --- Формируем маски для портов ---
// Для простоты используем сдвиги, но можно и таблицы, как раньше.
uint8_t mask_d = (lastZone < 6) ? (1 << (lastZone + 2)) : 0;
uint8_t mask_b = (lastZone >= 6) ? (1 << (lastZone - 6)) : 0;
// --- Пишем в порты, сохраняя пины 0,1 (RX/TX) ---
PORTD = (PORTD & 0b00000011) | mask_d;
PORTB = (PORTB & 0b11111100) | mask_b;
}
/* ==================== ПУСТОЙ LOOP ==================== */
void loop() {}
Чего тут предлагать! Вместо того что бы делать просто и ясно пишешь накручено и как курица лапой. Выключай все и зажигай нужный - уже сказали. Пины светодиодов в массив, что бы можно было подключать как непопадя и что бы можно было подключать разное их кол-во. И форматирование включай, не будь быдлокодером!
Пнут
Дядь, я тя, конечно, тоже люблю, но в этой ветке нет ни одного моего скетча. ![]()
“Редакция ответственности не несёт и опубликовано без исправлений”(с)
не всё так оптимистично - https://wokwi.com/projects/475390323970510849
да как так то ?))) ладно, тогда такая версия, один хороший человек который не зажмотил код, и поделился им! и благодаря этому вот такую версию можно сделать, однако на wokwi не скомпилировалось, слишком долго… а на ардуино собирать проект на макетке лень))) после такого тоже пнуть могут ?)))
/* ============================================================
ПРЕПРОЦЕССОРНЫЙ МЕТАЯЗЫК ДЛЯ 8 LED + ПОТЕНЦИОМЕТРА
============================================================ */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <stdint.h>
/* ===== БАЗОВЫЕ ПРИМИТИВЫ ===== */
#define cat(a, ...) primitive_cat(a, __VA_ARGS__)
#define primitive_cat(a, ...) a ## __VA_ARGS__
/* ===== IF НА ПРЕПРОЦЕССОРЕ ===== */
#define iif(c) primitive_cat(iif_, c)
#define iif_0(t, ...) __VA_ARGS__
#define iif_1(t, ...) t
/* ===== ПРОВЕРКА НА СКОБКИ ===== */
#define check_n(x, n, ...) n
#define check(...) check_n(__VA_ARGS__, 0,)
#define probe(x) x, 1,
#define empty()
#define defer(id) id empty()
#define obstruct(...) __VA_ARGS__ defer(empty)()
#define expand(...) __VA_ARGS__
/* ===== ЛОГИЧЕСКИЕ ОПЕРАЦИИ ===== */
#define _not_(x) check(primitive_cat(not_, x))
#define not_0 probe(~)
#define _compl(b) primitive_cat(_compl_, b)
#define _compl_0 1
#define _compl_1 0
#define _bool_(x) _compl(_not_(x))
#define _if_(c) iif(_bool_(c))
/* ===== WHEN ===== */
#define eat(...)
#define when(c) _if_(c)(expand, eat)
/* ===== DEC1 ===== */
#define dec1(x) primitive_cat(dec1_, x)
#define dec1_0 0
#define dec1_1 0
#define dec1_2 1
#define dec1_3 2
#define dec1_4 3
#define dec1_5 4
#define dec1_6 5
#define dec1_7 6
#define dec1_8 7
#define dec1_9 8
/* ===== EVAL ===== */
#define eval(...) eval1(eval1(eval1(__VA_ARGS__)))
#define eval1(...) eval2(eval2(eval2(__VA_ARGS__)))
#define eval2(...) eval3(eval3(eval3(__VA_ARGS__)))
#define eval3(...) eval4(eval4(eval4(__VA_ARGS__)))
#define eval4(...) eval5(eval5(eval5(__VA_ARGS__)))
#define eval5(...) __VA_ARGS__
/* ============================================================
ПРИКЛАДНЫЕ МАКРОСЫ
============================================================ */
/* Пин = номер LED + 2 (LED0 → пин 2, LED7 → пин 9) */
#define PIN(n) (n + 2)
/* Маска для PORTD (только пины 2-7) */
#define MASKD(n) ((n) < 6 ? (1 << ((n) + 2)) : 0)
/* Маска для PORTB (только пины 8-9) */
#define MASKB(n) ((n) >= 6 ? (1 << ((n) - 6)) : 0)
/* ===== REPEAT ===== */
#define repeat(count, macro, ...) \
when(count) (obstruct(repeat_indirect)()(dec1(count), macro, __VA_ARGS__) \
obstruct(macro)(dec1(count), __VA_ARGS__))
#define repeat_indirect() repeat
/* ===== SETUP: НАСТРОЙКА 8 ПИНОВ ===== */
#define M(i, _) pinMode((i) + 2, OUTPUT);
/* ===== ТЕСТ-МИГАНИЕ ===== */
#define BLINK(i, _) \
PORTD = (PORTD & 0b00000011) | MASKD(i); \
PORTB = (PORTB & 0b11111100) | MASKB(i); \
delay(80); \
PORTD &= ~0b11111100; \
PORTB &= ~0b00000011;
/* ===== ГИСТЕРЕЗИС ===== */
#define HYST 20
#define ZONE_W 128
/* ============================================================
ТАБЛИЦЫ МАСОК (генерируются препроцессором)
============================================================ */
#define MASK_D_TABLE { \
MASKD(0), MASKD(1), MASKD(2), MASKD(3), \
MASKD(4), MASKD(5), MASKD(6), MASKD(7) \
}
#define MASK_B_TABLE { \
MASKB(0), MASKB(1), MASKB(2), MASKB(3), \
MASKB(4), MASKB(5), MASKB(6), MASKB(7) \
}
const uint8_t MASK_D[8] PROGMEM = MASK_D_TABLE;
const uint8_t MASK_B[8] PROGMEM = MASK_B_TABLE;
/* ============================================================
РАНТАЙМ
============================================================ */
volatile int8_t lastZone = 0;
static inline uint16_t adc_read() {
ADCSRA |= _BV(ADSC);
while (ADCSRA & _BV(ADSC));
return ADC;
}
/* ===== SETUP ===== */
void setup(void) {
DDRD |= 0b11111100;
DDRB |= 0b00000011;
PORTD &= ~0b11111100;
PORTB &= ~0b00000011;
/* Препроцессорный цикл: 8 раз pinMode(...) */
eval(repeat(8, M, ~))
/* Препроцессорное тест-мигание: 8 раз BLINK(...) */
eval(repeat(8, BLINK, ~))
delay(200);
ADMUX = _BV(REFS0);
ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
TCCR2A = _BV(WGM21);
TCCR2B = _BV(CS22) | _BV(CS21) | _BV(CS20);
OCR2A = 155;
TIMSK2 = _BV(OCIE2A);
sei();
}
/* ===== ISR ===== */
ISR(TIMER2_COMPA_vect) {
uint16_t v = adc_read();
int16_t lo = (int16_t)lastZone * ZONE_W + HYST;
int16_t hi = (int16_t)(lastZone + 1) * ZONE_W - HYST;
lastZone += (v > hi) - (v < lo);
if (lastZone < 0) lastZone = 0;
if (lastZone > 7) lastZone = 7;
PORTD = (PORTD & 0b00000011) | pgm_read_byte(&MASK_D[lastZone]);
PORTB = (PORTB & 0b11111100) | pgm_read_byte(&MASK_B[lastZone]);
}
void loop(void) {}
я им не пользуюсь, - не умею))) но вроде там в коде пины 0 -7 а на схеме 2-9
Потому и пнут, что результат тебе неинтересен, ибо лень.
вот зачем плодить лишние сущности? ты серьёзно считаешь, что надо писать код не отталкиваясь от принципиальной схемы (универсальный)?
а ты считаешь, что ее надо изменить сначала под себя,
написать потом 12 строчек кода “не для новичка”, не увидеть там “косяк”, который ранее увидел в коде от ИИ и продолжать словоблудить?
вот! от таблеток и я бы не отказался наверное… если есть качественные… и на халяву!
Нормально ИМХО, но
это для новичка не ардуино, а “голого” AVR, для какой-нибудь Тиньки , где сериала нет)))
Зато это единственный код, что я понял ![]()
Из всех сообщ, мне ещё понравилось
int zone = analogRead(potPin) / 128;
![]()
ну да, а главное это “укладывается” в ранее выдвинутые притензии/косяк