Декодирование сигналов РЧ-приемника
Используя следующий черновик, я декодирую сигналы от радиочастотного приемника
#define CH1 2
#define CH2 3
#define CH3 4
#define CH4 5
#define CH5 6
#define CH6 7
int ch1Time, ch2Time, ch3Time, ch4Time, ch5Time, ch6Time = 0;
void channels()
{
TCNT1 = 0;
ch1Time = 0; ch2Time = 0; ch3Time = 0; ch4Time = 0; ch5Time = 0; ch6Time = 0;
while ((PIND & ((1 << CH1) | (1 << CH2) | (1 << CH3) | (1 << CH4) | (1 << CH5) | (1 << CH6))))
{
if (PIND & (1 << CH1))
ch1Time = TCNT1;
if (PIND & (1 << CH2))
ch2Time = TCNT1;
if (PIND & (1 << CH3))
ch3Time = TCNT1;
if (PIND & (1 << CH4))
ch4Time = TCNT1;
if (PIND & (1 << CH5))
ch5Time = TCNT1;
if (PIND & (1 << CH6))
ch6Time = TCNT1;
}
}
Проблема в том, что мне также нужно использовать 6 ШИМ платы nano. Поэтому я подумал о переносе каналов 1-6 на аналоговые контакты вот так..
#define CH1 A0
#define CH2 A1
#define CH3 A2
#define CH4 A3
#define CH5 A4
#define CH6 A5
while ((PINC & ((1 << CH1) | (1 << CH2) | (1 << CH3) | (1 << CH4) | (1 << CH5) | (1 << CH6))))
{
if (PINC & (1 << CH1))
ch1Time = TCNT1;
etc...
но это просто не работает. Любые мысли, пожалуйста?
@OrElse, 👍0
1 ответ
Лучший ответ:
▲ 0
Я вижу две проблемы:
- Макросы A0–A5 — это числа от 14 до 19, а не числа от 0 до 5, поэтому вы ищете (1 << 14) для CH1, а не (1 << 0).
- Аналоговые контакты — это порт C, а не порт B, поэтому вам нужно использовать
PINC
, а неPINB
. - Ваши переменные
ch?Time
должны бытьvolatile
.
,
@Majenko
Смотрите также:
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какое максимальное энергопотребление Arduino Nano 3.0?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Питание светодиодной ленты - Сколько ампер?
- Arduino nano как клавиатура HID
- Как я могу запитать Arduino Nano от батареи LiPo, желательно 3,7 В
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
Упс. На самом деле я использую PORTC, и это опечатка. Я отредактирую его как можно скорее. Метод каналов вызывается... attachInterrupt(0,channels,RISING);, @OrElse
На самом деле я не понимаю. (PINC & (1 << 0)) для CH1 также не работает с pinMode(A0, INPUT);, @OrElse
Добавлена изменчивая опция, но проблема остается., @OrElse
@OrElse Вы уверены, что хотите очистить TCNT1 непосредственно перед чтением из него?, @Majenko
На самом деле да. Таким образом, считая время, я декодирую сигнал радиочастотного приемника, который составляет от 1 мс до 2 мс. Кроме того, это прекрасно работает с цифровыми входами. TCCR1A = 0; ТИМСК1 = 0; ТИФР1 = 0; ТЦНТ1 = 0; TCCR1B = (1 << CS10); Спасибо за все ваши усилия, @OrElse
Ах да, я вижу, что вы делаете с ним сейчас., @Majenko