Декодирование сигналов РЧ-приемника

Используя следующий черновик, я декодирую сигналы от радиочастотного приемника

#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...

но это просто не работает. Любые мысли, пожалуйста?

, 👍0


1 ответ


Лучший ответ:

0

Я вижу две проблемы:

  1. Макросы A0–A5 — это числа от 14 до 19, а не числа от 0 до 5, поэтому вы ищете (1 << 14) для CH1, а не (1 << 0).
  2. Аналоговые контакты — это порт C, а не порт B, поэтому вам нужно использовать PINC, а не PINB.
  3. Ваши переменные ch?Time должны быть volatile.
,

Упс. На самом деле я использую 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