2016-10-05 5 views
1

Мне не разрешено использовать библиотеку Arduino (или любую библиотеку) для этой программы. Как проверить вход булавки?Получить входной сигнал без библиотеки Arduino

Я нашел две различные функции:

В Arduino.h:

#define bitRead(value, bit) (((value) >> (bit)) & 0x01) 

Читает digitalRead обратно pgmspace.h:

#define __LPM_enhanced__(addr) \ 
(__extension__({    \ 
    uint16_t __addr16 = (uint16_t)(addr); \ 
    uint8_t __result;   \ 
    __asm__ __volatile__  \ 
    (       \ 
     "lpm %0, Z" "\n\t"  \ 
     : "=r" (__result)  \ 
     : "z" (__addr16)  \ 
    );       \ 
    __result;     \ 
})) 

Для первого, я не знайте, откуда взялись бит и ценность, и я просто не понимаю второго.

+0

Возможно, вам необходимо опубликовать этот вопрос в правильном обмене столами для Arduino. http://api.jquery.com/category/selectors/attribute-selectors/ –

+0

Почему вам не разрешено использовать библиотеку arduino? – Qix

+0

@ HussainPatel вы опубликовали ссылку на jQuery api lol – Qix

ответ

1

Нет необходимости в этих реализациях. Это довольно просто.

LED13 включается, когда контакт 0 высок. Я тестировал этот код на Arduino

#include <avr/io.h>          // Includes all the definition of register port etc 
 
#ifndef F_CPU 
 

 
#define F_CPU 16000000UL  //Need to include it before <util/delay.h> 
 

 
#endif          //Change 16000000 with your crystal freq. In my case its 16 MHz 
 

 
#include <util/delay.h> //includes delay functions delay_ms and delay_us 
 

 
void setup() { 
 
    // put your setup code here, to run once: 
 
    DDRB |= 0xFF; //Configured Port B as OP 
 
    DDRD &= 0x00; //Configured Port D as IP 
 
} 
 

 
void loop() { 
 
    // put your main code here, to run repeatedly: 
 
    
 
    if (PIND&(0x01)) //to check pin0 of portD (which is Pin 0 of arduino) 
 
    PORTB |= 0xFF; 
 
    else 
 
    PORTB &= 0x00; 
 

 
}

+0

Итак, не используя библиотеку вообще, я все равно напишу функцию, которая обращается к PIND правильно ? – kingcobra1986

+1

Да, поскольку вы программируете на ардуине, вы на самом деле программируете на ATMega328P, поэтому вам придется писать свой код как таковой. Библиотека arduino помогает вам не беспокоиться об этом. – Foitn

+0

@Foitn Или ATMega168 - как в мини-платах Arduino Pro. –

0

Я предполагаю, что вы используете Arduino Uno, однако, общее правило применяется к любому Arduino.

Во-первых, вам нужно проверить Arduino контактный отображение:

Тогда давайте предположим, что вы хотите использовать цифровой контакт 2, так PD2 на ATmega168/328. (PD2 является коротким для вывода PORTD 2). Для того, чтобы использовать его в качестве входных данных вам нужно сделать:

DDRD &= ~(1 << PD2); 

DDRD является направление регистра данных порта для D. Вся операция устанавливает бит соответствует контакту 2 до 0. Затем прочитать этот вывод:

if (PIND & (1<<PD2)) { 
    // do something 
} 

Кроме того, пожалуйста, проверьте, как управлять отдельными битами: How do you set, clear, and toggle a single bit?

Смежные вопросы