Я пытаюсь разработать программу Arduino, которая соответствовала бы этим параметрам. Сначала я думал, что это будет не так сложно, но я не знаю, какая логика или способ думать о подходе к этой проблеме. Теперь я немного застрял. В любом случае, здесь — это то, что у меня есть. Любая помощь и вклад очень ценятся. Спасибо.
Программа, которая проверяла бы два входных вентиля (И, ИЛИ, И-НЕ, ИЛИ-НЕ и XOR)
Ответы (1)
Основная логика такова:
- For out in 3, 6, 8, 11,
- is_and = is_or = is_xor = is_nand = is_nor = true.
- For p in 0, -1,
- Set pin out-2 to (p ? HIGH : LOW).
- For q in 0, -1,
- Set pin out-1 to (q ? HIGH : LOW).
- Read pin out.
- If the value read isn't equal (p & q ? HIGH : LOW),
- is_and = false.
- If the value read isn't equal (p | q ? HIGH : LOW),
- is_or = false.
- If the value read isn't equal (p ^ q ? HIGH : LOW),
- is_xor = false.
- If the value read isn't equal (p & q ? LOW : HIGH),
- is_nand = false.
- If the value read isn't equal (p | q ? LOW : HIGH),
- is_nor = false.
- If is_and,
- Print "AND".
- Else if is_or,
- Print "OR".
- Else if is_xor,
- Print "XOR".
- Else if is_nand,
- Print "NAND".
- Else if is_nor,
- Print "NOR".
- Else
- Print "???".
int out_pins[4] = { 3, 6, 8, 11 };
const int num_out_pins = sizeof(out_pins) / sizeof(out_pins[0]);
void setup() {
int i = num_out_pins;
while (i--) {
pinMode(out_pins[i], OUTPUT);
pinMode(out_pins[i-1], INPUT);
pinMode(out_pins[i-2], INPUT);
}
}
void test_gate(int out_pin) {
boolean is_and = true;
boolean is_or = true;
boolean is_xor = true;
boolean is_nand = true;
boolean is_nor = true;
for (int p=0; p>-2; --p) {
digitalWrite(out_pin-2, (p ? HIGH : LOW))
for (int q=0; p>-2; --p) {
digitalWrite(out_pin-1, (q ? HIGH : LOW))
// Is a delay needed here?
int out = digitalRead(out_pin);
if (out == (p & q ? HIGH : LOW)) is_nand = false; else is_and = false;
if (out == (p | q ? HIGH : LOW)) is_nor = false; else is_or = false;
if (out != (p ^ q ? HIGH : LOW)) is_xor = false;
}
}
if (is_and) {
printf("%d is the output of an AND gate\n", out_pin);
}
else if (is_or) {
printf("%d is the output of an OR gate\n", out_pin);
}
else if (is_xor) {
printf("%d is the output of an XOR gate\n", out_pin);
}
else if (is_nand) {
printf("%d is the output of a NAND gate\n", out_pin);
}
else if (is_nor) {
printf("%d is the output of a NOR gate\n", out_pin);
}
else {
printf("%d is the output of an unrecognized gate\n", out_pin);
}
}
void test_chip() {
for (int i=0; i<num_out_pins; ++i) {
test_gate(i, out_pins[i]);
}
}
void loop() {
test_chip();
delay(1000);
}
person
ikegami
schedule
06.12.2013
Икегами, не могли бы вы показать мне, как это будет выглядеть? Извините, но это слишком расплывчато для человека с минимальным опытом работы с Arduino.
- person zokiboi; 07.12.2013
Это будет выглядеть примерно так же, как я разместил. Вам просто нужно использовать правильный синтаксис. Вы уже знаете, как читать и устанавливать контакты, так что остаются циклы foreach. Я даже не знаю, на каком языке написан ваш код, поэтому я не могу показать вам, как сделать в нем цикл foreach. Прочитайте это!
- person ikegami; 07.12.2013
Это Ардуино. Язык Arduino — это просто набор функций C/C++, которые можно вызывать из кода. Я знаком только с java. Кроме того, что вы подразумеваете под циклами foreach?
- person zokiboi; 07.12.2013
Еще раз привет, Икегами. Итак, я получил это, но когда я запускаю программа, я получаю сообщение об ошибке с указанием ожидаемого неквалифицированного идентификатора перед токеном '{'. Как вы думаете, в чем может быть дело? Спасибо за помощь как всегда.
- person zokiboi; 08.12.2013
Цикл Foreach: Цикл, который перебирает каждый элемент списка. Если в вашем языке его нет, вы можете поместить номера выводов в массив и зациклиться на индексах массива.
- person ikegami; 08.12.2013
Если предположить, что это C++, то ошибок много. У меня есть
;
, где они не имеют смысла, и x == x + int 1;
не имеет смысла.
- person ikegami; 08.12.2013
Извините, если я слишком много прошу, икегами, но не могли бы вы помочь мне исправить это?
- person zokiboi; 08.12.2013
Обновите базовую логику. Я немного неправильно прочитал задание. И я сделал всю работу за вас тоже сейчас. Я не знаю, как вы отправляете сообщения на консоль, поэтому я просто использовал
printf
для замены.
- person ikegami; 08.12.2013