IRremote, Mega 2560 изменить номер пина IR диода.

Next
Offline
Зарегистрирован: 01.09.2015

Доброго времени суток!

Помогите решить проблемку.

Использую мегу вместе с TFT экраном, который садится прямо на нее и занимает 1-12 цифровые ноги.

Библиотека требует подключения диода к третьему пину. Посмотрел код билиотеки, в IRremoteInt.h нашел такие строки:

// Arduino Mega
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
	//#define IR_USE_TIMER1   // tx = pin 11
	//#define IR_USE_TIMER2     // tx = pin 9
	//#define IR_USE_TIMER3   // tx = pin 5
	//#define IR_USE_TIMER4   // tx = pin 6
	#define IR_USE_TIMER5   // tx = pin 46

Думаю чудесно, переключу на 5 таймер и будет мне счастье.

Объявил перменную

#define __AVR_ATmega2560__

в начале файла. Правильно сделал?

Но счастья не наступило. На 46 пине сигнала нет, хоть и скетч компилится без ошибок.

Нашел место где определяется нога дляPWM:

#define TIMER_RESET
#define TIMER_ENABLE_PWM    (TCCR5A |= _BV(COM5A1))
#define TIMER_DISABLE_PWM   (TCCR5A &= ~(_BV(COM5A1)))
#define TIMER_ENABLE_INTR   (TIMSK5 = _BV(OCIE5A))
#define TIMER_DISABLE_INTR  (TIMSK5 = 0)
#define TIMER_INTR_NAME     TIMER5_COMPA_vect

Посмотрел несколько картинок с распиновкой Меги например тут:

http://www.rinkydinkelectronics.com/pm_arduino.php

Обозначений типа COM5A1 нигде не нашел.

Кто нибудь может объяснить что делате код (TCCR5A |= _BV(COM5A1)) и (TCCR5A &= ~(_BV(COM5A1)))?

Radjah
Offline
Зарегистрирован: 06.08.2014

Нафейхуя дефайн делаешь? Оно появляется, когда ты плата на 2560 выбираешь.

Next
Offline
Зарегистрирован: 01.09.2015

Не нашел в коде где она объявляется. Пробовал и с объявлением и нет. Не работает никак :(

Спс, теперь буду знать.

Radjah
Offline
Зарегистрирован: 06.08.2014

Её и не будет в коде, этот дефайн компилятор выставляет.

Next
Offline
Зарегистрирован: 01.09.2015
#elif defined(IR_USE_TIMER5)

#define TIMER_RESET
#define TIMER_ENABLE_PWM    (TCCR5A |= _BV(COM5A1))
#define TIMER_DISABLE_PWM   (TCCR5A &= ~(_BV(COM5A1)))
#define TIMER_ENABLE_INTR   (TIMSK5 = _BV(OCIE5A))
#define TIMER_DISABLE_INTR  (TIMSK5 = 0)
#define TIMER_INTR_NAME     TIMER5_COMPA_vect

#define TIMER_CONFIG_KHZ(val) ({ \
  const uint16_t pwmval = SYSCLOCK / 2000 / (val); \
  TCCR5A = _BV(WGM51); \
  TCCR5B = _BV(WGM53) | _BV(CS50); \
  ICR5 = pwmval; \
  OCR5A = pwmval / 3; \
})

#define TIMER_CONFIG_NORMAL() ({ \
  TCCR5A = 0; \
  TCCR5B = _BV(WGM52) | _BV(CS50); \
  OCR5A = SYSCLOCK * USECPERTICK / 1000000; \
  TCNT5 = 0; \
})

//-----------------
#if defined(CORE_OC5A_PIN)
#	define TIMER_PWM_PIN  CORE_OC5A_PIN
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#	define TIMER_PWM_PIN  46  // Arduino Mega
#else
#	error "Please add OC5A pin number here\n"
#endif

Вот похоже где пин определяется (29 строка). Что за переменная CORE_OC5A_PIN (26 строка)? В коде не вижу, где она объявляется.

Radjah
Offline
Зарегистрирован: 06.08.2014

Если определено CORE_OC5A_PIN, то TIMER_PWM_PIN принимается CORE_OC5A_PIN

иначе

Если плата Mega1280 или Mega2560, то TIMER_PWM_PIN принимается 46.

иначе ошибка "Please add OC5A pin number here"

Вот как-то так оно работает. Если CORE_OC5A_PIN определено, то дальше не проверяем.

Next
Offline
Зарегистрирован: 01.09.2015

Да это я понял. Не понял что такое CORE_OC5A_PIN. По всей видимости такая же переменная как и __AVR_ATmega2560__ обозначающая какой то контролер.

Блин. Нифига не понятно. Пошел курить ШИМ.

Next
Offline
Зарегистрирован: 01.09.2015

Выяснил что без экрана библиотека на 46 пине работает.