как преобразовать следующий код в один, используя прямую манипуляцию с портом
Ниже представлена программа для сканирования клавиатуры для передачи MIDI. В настоящее время код работает нормально, но он мог бы быть быстрее. Мне нужно знать, как использовать прямое управление портом внутри цикла for.
boolean keypressed[6][6]; //для хранения ключевых состояний
int midinote[6][6] ={ 60 ,61 ,62 ,63 ,64 ,65
,66 ,67 ,68 ,69 ,70 ,71
,72 ,73 ,74 ,75 ,76 ,77
,78 ,79 ,80 ,81 ,82 ,83
,84 ,85 ,86 ,87 ,88 ,89
,90 ,91 ,92 ,93 ,94 ,95 }; // код для различных миди-нот от C3 до C6
void setup() {
Serial.begin(38400);
for(int i=0; i<6; i++){
pinMode(i+2,OUTPUT);
digitalWrite(i+8,HIGH);
}
for(int i=0; i<6; i++){
pinMode(i+8,INPUT);
digitalWrite(i+8,HIGH);
}
for(int i=0; i<6; i++){
for(int j=0; j<6; j++){
keypressed[i][j] = false;
}
}
}
void loop() {
for(int i=0; i<6; i++){
digitalWrite(i+2, LOW);
for(int j =0; j<6; j++){
if ((digitalRead(j+8) == LOW) && !keypressed[i][j]){
Serial.write(0x91);
Serial.write(midinote[i][j]);
Serial.write(127);
keypressed[i][j] = true;
}
if ((digitalRead(j+8) == HIGH) && keypressed[i][j]){
Serial.write(0x91);
Serial.write(midinote[i][j]);
Serial.write(0);
keypressed[i][j] =false;
}
}
digitalWrite(i+2, HIGH);
}
}
@ASWIN VENU, 👍2
Обсуждение1 ответ
Лучше использовать прерывания вместо объединения выводов. но это связано с вашим контроллером arduino. что у вас за контроллер ядра ардуино? если вы можете выбрать, я предпочитаю "Nano 33 IoT" который имеет 9 контактов (2, 3, 9, 10, 11, 13, 15, A5, A7), доступных для прерывания. эту страницу можно использовать: https://playground.arduino.cc/Main/PinChangeInterrupt/
Я не уверен, насколько полезны прерывания на матрице кнопок., @Gerben
опрос заставляет процессор проверять порты ввода-вывода в цикле, что приводит к потере времени процессора, а код представляет собой каскадный цикл for. где использование прерываний позволяет процессору выполнять свой обычный код, а прерывание с его входным вектором делает все готовым для вас, с помощью некоторых побитовых операций вы можете найти измененный порт и отправить правильный вывод., @Saeed Mirshams
Это очень распространенная ловушка новичков. Но вперед., @Delta_G
- Миграция проекта Arduino Uno R3 в Wemos D1 R2 — проблемы с распиновкой
- Отправить SMS Arduino Uno + плата SIM900A
- Не удается загрузить код на плату Arduino на Mac
- MIDI клавиатура управляемая светодиодная лента
- Настройка ввода pullup через регистры
- Два порта на Uno с Ethernet-экраном
- Светодиод, управляемый Midi через USB
- Как загрузить и сохранить настройки/переменные с компьютера на Arduino?
Вам необходимо скачать техпаспорт AVR и посмотреть регистры портов. Затем вы можете получить доступ (чтение или запись) ко всем битам порта с помощью одной инструкции. Вам нужно будет соответствующим образом изменить алгоритм сканирования клавиатуры. -- Сказав это, я не уверен, что в библиотеках Arduino уже нет методов для этого., @the busybee
Я не думаю, что прямой доступ к порту значительно увеличивает скорость вашей программы. Если вы изначально читаете PORT, вы должны сохранить значение в регистре ЦП, а затем проверить его биты в цикле. Существует разница в чтении регистра ввода-вывода по сравнению с внутренним регистром ЦП, но она не так велика по сравнению со временем, которое требуется для отправки миди-заметки. И это ограничено средней скоростью. (Насколько мне известно, это 31250 бит/с, а не 38400, как я видел в вашем коде). Но если получатель понимает, то все в порядке ;-). Итак, я бы сказал, что узким местом является миди-скорость, а не алгоритм сканера клавиатуры., @Peter Paul Kiefer
Ах, если вам не нужны мудрые (тупые ;-)) разговоры. Вот ссылка, которая отвечает на ваш вопрос. Таким образом, вы можете решить, стоит ли менять вашу программу. https://www.arduino.cc/en/Reference/PortManipulation, @Peter Paul Kiefer
Я сомневаюсь, что вы что-то выиграете от этого, так как Serial будет узким местом. Но если вам нужно, я бы предложил что-то вроде [библиотеки digitalWriteFast] (https://github.com/NicksonYap/digitalWriteFast)., @Gerben