Как прочитать этот цифровой pin для Nano с помощью Atmel Studo от AVR?
Как я могу прочитать цифровой вывод 6 в AVR?
Я установил вывод в качестве входного следующим образом:
DDRD = B0100000; //это установит вывод 6 в качестве входного
Но как я могу теперь в цифровом виде прочитать этот вывод?:
Иначе говоря: как я могу преобразовать этот код Arduino для использования в Atmel Studio?:
digitalRead(DATA_PIN);
Изменить:
while (1) {
unsigned long data = 0;//32 bit variable to store encoder data
for (int i=0; i<25; i++) {//25 bit encoder data, first 12 bit is CCW count data and the rest 13 bit is the position angle data
data <<= 1;//shift all read data left one bit
PORTD &= ~(1 << 5);//clock pin goes low
_delay_us(2);
PORTD |= (1 << 5);//clock pin goes high
_delay_us(2);
data |= digitalRead(DATA_PIN);//cat the new read bit to the whole read data
}
Я хочу использовать обычный код C для AVR вместо использования digitalRead выше. данные представляют собой 32-битный массив, в котором хранятся 25-битные данные кодера. Он по крупицам заполняется digitalRaed.
Я думаю, что нашел это:
while (1) {
unsigned long data = 0;//32 bit variable to store encoder data
uint8_t val;
for (int i=0; i<25; i++) {//25 bit encoder data, first 12 bit is CCW count data and the rest 13 bit is the position angle data
data <<= 1;//shift all read data left one bit
PORTD &= ~(1 << 5);//clock pin goes low
_delay_us(2);
PORTD |= (1 << 5);//clock pin goes high
_delay_us(2);
if ( (PIND & (1 << PIND6)) == (1 << PIND6) ) {
val = 1;
} else {
val = 0;
}
data |= val;//cat the new read bit to the whole read data
}
@ty_1917, 👍-1
Обсуждение1 ответ
- Считайте состояние порта с помощью PIND
- Изолируйте нужный вам бит с
помощью &
- Прибыль
if (PIND & 0b0100000) {
val |= 1;
}
Или, как троичный:
val |= ((PIND & 0b01000000) ? 1 : 0);
Спасибо, я попробую это, но каким может быть тип данных для val ? Ради скорости, @ty_1917
uint8_t
(или unsigned char
, если хотите), @Majenko
Большое спасибо! Последний вопрос. Это будет в цикле for, например val |= ((PORTD & 0b01000000) ? 1 : 0); а затем data |= val; . Как вы думаете, я должен объявить val в самом начале кода(перед основным) как uint8_t val = 0; или volatile uint8_t val = 0;? Имеет ли это значение в данном случае?, @ty_1917
Если все, что вы делаете, это data |= val
, то замените val
на data
., @Majenko
На самом деле данные-это 32-битный массив без знака длинного типа. Я храню входящие биты в этой переменной данных в виде массива 25 бит данных кодера. Входящий бит в данном случае является состоянием вывода val., @ty_1917
Есть данные <<= 1; в начале цикла for, @ty_1917
PORTD & 0b01000000
- это "true или false" для того, является ли вывод высоким или низким. "1 : 0" - это два альтернативных значения, которые следует использовать в любом случае. То, чему вы приписываете этот результат, полностью зависит от вас. Если вы хотите, чтобы вывод был связан с битом 12 данных, просто перейдите data |= ((PORTD & 0b01000000) ? (1 << 12) : 0);
, @Majenko
Поскольку вы хотите связать его с битом 0, это просто 1 или 0, которые вы хотите связать с данными., @Majenko
@ty_1917 На самом деле, я допустил ошибку (недостаточно использовал AVR) - используйте "PIND", а не PORTD
., @Majenko
Как-то это не работает, я загружу код sction на вопрос, @ty_1917
Пожалуйста, посмотрите мое обновление спасибо, @ty_1917
- Как сканировать сигнал HIGH на digitalRead во время основного цикла, одновременно выполняя другие задачи?
- Невозможно использовать аналоговые контакты в качестве цифровых входов
- Странные значения поворотного энкодера
- Программирование ATmega4809 через Atmel-ICE с шестнадцатеричным файлом из Arduino IDE - почему не работает код цикла?
- Nano: все цифровые контакты ничего не выводят
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какое максимальное энергопотребление Arduino Nano 3.0?
Вы читали [учебник](https://www.arduino.cc/en/Reference/PortManipulation)?, @Edgar Bonet
Я немного тороплюсь. Но в основном моя строка кода в Arduino такова: data |= digitalRead(DATA_PIN); ..... Теперь мне нужно получить состояние DATA_PIN, которое является контактом 6 в Nano. Я хотел бы узнать более подробно, но я думаю, что пройдет много времени, прежде чем мне нужно будет преобразовать это., @ty_1917
@Juraj Я не вижу в этом уроке, как я могу прочитать состояние вывода как единицу или ноль., @ty_1917
См. Обновление правка, @ty_1917