ARDUINO Как при включении платы подать HIGH на пин минуя LOW?

DeLithium

✩✩✩✩✩✩✩
20 Авг 2020
6
0
Есть у меня небольшая самоделка, в которой нужно сделать так, чтобы при включении режима OUTPUT, на пин сразу подавался уровень HIGH. Поясню зачем: при подаче общего питания база транзистора, управляемого ардуиной, сразу подтягивается к плюсу (так надо), но при включении ардуины и переводе пина в режим OUTPUT, на него будет подан LOW, который программа тут же сменит на HIGH, что вызовет "дребезг", от которого я хочу полностью избавиться.
Возможно ли как-то включить пин с готовым HIGH на нём? Ставить конденсатор на базу не хочется, потому что в начале заряда он закоротит [базу] на землю.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
473
133
@DeLithium,
Попробуйте сначала вызвать digitalWrite() а потом pinMode()
Для "обычных" Ардуин это точно работает.
 
  • Лойс +1
Реакции: te238s и DeLithium

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
Если по феншую, то поковырять wiring_digital.c, но тогда при обновлении библиотеки все станет как обычно, либо написать свою мини-библиотеку.
В void pinMode(uint8_t pin, uint8_t mode)
Заменить:
Код:
    } else {
        uint8_t oldSREG = SREG;
        cli();
        *reg |= bit;
        SREG = oldSREG;
    }
на
Код:
    } else {
        uint8_t oldSREG = SREG;
        cli();
        *out |= bit;
        *reg |= bit;
        SREG = oldSREG;
    }
 

DeLithium

✩✩✩✩✩✩✩
20 Авг 2020
6
0
@Bruzzer,
Спасибо. Попробую.

@Геннадий П,
Я подозревал, что надо копать в сторону прямой записи в регистры, чтобы (может быть) режим менять одновременно с уровнем.
Посмотрел в wiring_digital.c. Интересное дело, для mode == INPUT* там есть добавление бита *out |= bit а вот для OUTPUT нужно дописывать...
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
@DeLithium, Хотя, изменять так библиотеку лучше не стоит чтобы оставить совместимость. Лучше добавить третий аргумент по умолчанию, от которого и включать выход в HIGH или LOW.
 

Sergo_ST

★★★★★★✩
15 Мар 2020
957
825
Если для мег то можно так:
C++:
#define MY_PIN 2 //номер пина(0..19)

#define DDR_REG(portx)  (*(&portx - 1))
#define BIT_SET(value, bit) ((value) |= (0x01 << (bit)))

#define DECODE_PORT(pin) ((pin < 8) ? PORTD : ((pin < 14) ? PORTB : PORTC))
#define DECODE_BIT(pin) ((pin < 8) ? pin : ((pin < 14) ? (pin - 8) : (pin - 14)))

#define MY_BIT   DECODE_BIT(MY_PIN)
#define MY_PORT  DECODE_PORT(MY_PIN)

#define MY_SET     (BIT_SET(MY_PORT, MY_BIT))
#define MY_OUT    (BIT_SET(DDR_REG(MY_PORT), MY_BIT))

#define MY_INIT  MY_SET; MY_OUT
C++:
#define MY_PIN 2 - сюда записываем свой номер пина(0..19)
MY_INIT; - это вызывем в setup
 
Изменено:

DeLithium

✩✩✩✩✩✩✩
20 Авг 2020
6
0
@Sergo_ST,
В моём случае это Attiny85, так что номер порта можно не высчитывать.
 

Sergo_ST

★★★★★★✩
15 Мар 2020
957
825
Тогда так:
C++:
#define MY_PIN 2 //номер пина(0..4)

#define BIT_SET(value, bit) ((value) |= (0x01 << (bit)))

#define MY_SET    (BIT_SET(PORTB, MY_PIN))
#define MY_OUT    (BIT_SET(DDRB, MY_PIN))

#define MY_INIT  MY_SET; MY_OUT
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
611
145
А если поставить транзистор из комплиментарной пары? При LOW транзистор будет открыт.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
97
Развели тут демагогию с решениями по 100 строк.
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
Вот и всё. Сначала включаем подтяжку(пин при включении всегда в режиме входа), потом его на выход настраиваем.
В даташитах на МК так и написано,что при смене режима вывода появляется третье,промежуточное состояние. И лишь программист решает,через 0 или 1 переключаться,по ситуации.
 
  • Лойс +1
Реакции: DeLithium