Как прочитать этот цифровой 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    
        }  

, 👍-1

Обсуждение

Вы читали [учебник](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


1 ответ


0
  1. Считайте состояние порта с помощью PIND
  2. Изолируйте нужный вам бит с помощью &
  3. Прибыль
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