Как просто переключить контакт (светодиод)
Я не программист, а скорее специалист по оборудованию. В старые добрые времена машинного кода вы могли "считывать" состояние порта и переворачивать его ... по общему признанию, это был гораздо более простой процессор. Разве невозможно сделать это с 328 без большого количества строк кода?
@Colin, 👍3
Обсуждение2 ответа
Это вполне возможно сделать без "многих строк кода". ATmega328P на самом деле довольно простой чип (конечно, по сегодняшним стандартам). Чтение и запись контактов происходит точно так же, как и всегда: считывается байтовое значение порта из регистра PINx, изменяется и записывается обратно в регистр PORTx.
Многое из того, что делает Arduino API, - это абстрактные вещи, упрощающие сложные операции. Одним из побочных эффектов является то, что это может сделать простые операции более сложными (и в результате на самом деле может замедлить работу). Но вам не обязательно всегда использовать Arduino API для всего.
Обычно напрямую манипулируют регистрами ввода-вывода для выполнения более быстрых манипуляций с выводами ввода-вывода, особенно когда вы хотите делать такие вещи, как эмуляция других протоколов связи или сокращение вашего кода, чтобы он поместился в действительно маленький микроконтроллер с минимальным использованием флэш-памяти, насколько это возможно.
Чтобы переключить контакт, просто прочитайте 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;
}
}
- NodeMCU - Vin контакт как выход 5V?
- Использовать все контакты как цифровые входы/выходы
- Что такое ICSP pin (разъём)?
- Сколько датчиков может поддерживать один модуль Arduino?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Какой тип разъема использует система GROVE?
- Неиспользуемые контакты в Arduino L293D motor shield?
- Как выбрать вывод передачи в библиотеке IRremote для Arduino Uno?
Когда вы загуглите "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