Как просто переключить контакт (светодиод)

Я не программист, а скорее специалист по оборудованию. В старые добрые времена машинного кода вы могли "считывать" состояние порта и переворачивать его ... по общему признанию, это был гораздо более простой процессор. Разве невозможно сделать это с 328 без большого количества строк кода?

, 👍3

Обсуждение

Когда вы загуглите "Arduino toggle pin", вы получите хорошие результаты. При выполнении этого в Arduino так, как это было бы: digitalWrite(pinToToggle, !digitalRead (pinToToggle));, @chrisl

Другие ядра, кроме официальных, часто обеспечивают функциональность переключения. И если вам не нравятся сверхмедленные функции arduino, вы можете получить доступ к портам напрямую (например, если вы напишете что-то в PINx, это переключит соответствующие биты на PORTx), @KIIV

что сказал @KIIV ... официальная информация приведена в разделе 17.2.2 https://ww1.microchip.com/downloads/en/DeviceDoc/40001906A.pdf, @jsotola


2 ответа


2

Это вполне возможно сделать без "многих строк кода". ATmega328P на самом деле довольно простой чип (конечно, по сегодняшним стандартам). Чтение и запись контактов происходит точно так же, как и всегда: считывается байтовое значение порта из регистра PINx, изменяется и записывается обратно в регистр PORTx.

Многое из того, что делает Arduino API, - это абстрактные вещи, упрощающие сложные операции. Одним из побочных эффектов является то, что это может сделать простые операции более сложными (и в результате на самом деле может замедлить работу). Но вам не обязательно всегда использовать Arduino API для всего.

Обычно напрямую манипулируют регистрами ввода-вывода для выполнения более быстрых манипуляций с выводами ввода-вывода, особенно когда вы хотите делать такие вещи, как эмуляция других протоколов связи или сокращение вашего кода, чтобы он поместился в действительно маленький микроконтроллер с минимальным использованием флэш-памяти, насколько это возможно.

,

2

Чтобы переключить контакт, просто прочитайте pin и инвертируйте значение:

#define LEDPIN 2

void loop() {
    digitalWrite(LEDPIN, !digitalRead(LEDPIN));
}

Вы также можете просто "запомнить" последнее значение:

#define LEDPIN 2
bool led_on = false;
unsigned long led_time = 500; // 1/2 секунды включено и 1/2 секунды выключено
unsigned long lasttime = 0; // последний millis() раз, когда мы выключили или включили светодиод

void setup() {
    digitalWrite(LEDPIN, LOW);
    pinMode(LEDPIN, OUTPUT);
}
void loop() {
    unsigned long now = millis();
    if (lasttime - now > led_time) {
        led_on = !led_on;
        digitalWrite(LEDPIN, led_on);
        last_time = now;
    }
}
,