Проблемы с Dimmer.h на ATmega 128

Я использую схему ZCD, управляющую симистором. Сейчас я использую для этой цели библиотеку Dimmer. Он отлично работает с ATMega 328, но всякий раз, когда я пытаюсь загрузить код в ATMega 128 с помощью Arduino IDE, появляется эта ошибка:

Arduino: 1.8.4 (Windows 10), Board: "ATmega128, 2.7v, Disabled (default), 16 MHz external"

C:\Program Files (x86)\Arduino\libraries\Dimmer-master\src\Dimmer.cpp: In member function 'void Dimmer::begin(uint8_t, bool)':

C:\Program Files (x86)\Arduino\libraries\Dimmer-master\src\Dimmer.cpp:15:20: error: 'TCCR2A' was not declared in this scope

 #define _TCCRxA(X) TCCR ## X ## A

                    ^

C:\Program Files (x86)\Arduino\libraries\Dimmer-master\src\Dimmer.cpp:16:19: note: in expansion of macro '_TCCRxA'

 #define TCCRxA(X) _TCCRxA(X)

                   ^

C:\Program Files (x86)\Arduino\libraries\Dimmer-master\src\Dimmer.cpp:157:5: note: in expansion of macro 'TCCRxA'

     TCCRxA(DIMMER_TIMER) = TCCRxA_VALUE;         // Timer config byte A

     ^

C:\Program Files (x86)\Arduino\libraries\Dimmer-master\src\Dimmer.cpp:17:20: error: 'TCCR2B' was not declared in this scope

 #define _TCCRxB(X) TCCR ## X ## B

                    ^

C:\Program Files (x86)\Arduino\libraries\Dimmer-master\src\Dimmer.cpp:18:19: note: in expansion of macro '_TCCRxB'

 #define TCCRxB(X) _TCCRxB(X)

                   ^

C:\Program Files (x86)\Arduino\libraries\Dimmer-master\src\Dimmer.cpp:158:5: note: in expansion of macro 'TCCRxB'

     TCCRxB(DIMMER_TIMER) = TCCRxB_VALUE;         // Timer config byte B

     ^

C:\Program Files (x86)\Arduino\libraries\Dimmer-master\src\Dimmer.cpp:19:20: error: 'TIMSK2' was not declared in this scope

 #define _TIMSKx(X) TIMSK ## X

                    ^

C:\Program Files (x86)\Arduino\libraries\Dimmer-master\src\Dimmer.cpp:20:19: note: in expansion of macro '_TIMSKx'

 #define TIMSKx(X) _TIMSKx(X)

                   ^

C:\Program Files (x86)\Arduino\libraries\Dimmer-master\src\Dimmer.cpp:159:5: note: in expansion of macro 'TIMSKx'

     TIMSKx(DIMMER_TIMER) = 0x02;                 // Timer Compare Match Interrupt Enable

     ^

C:\Program Files (x86)\Arduino\libraries\Dimmer-master\src\Dimmer.cpp:21:19: error: 'OCR2A' was not declared in this scope

 #define _OCRxA(X) OCR ## X ## A

                   ^

C:\Program Files (x86)\Arduino\libraries\Dimmer-master\src\Dimmer.cpp:22:18: note: in expansion of macro '_OCRxA'

 #define OCRxA(X) _OCRxA(X)

                  ^

C:\Program Files (x86)\Arduino\libraries\Dimmer-master\src\Dimmer.cpp:160:5: note: in expansion of macro 'OCRxA'

     OCRxA(DIMMER_TIMER) = 100 * 60 / acFreq - 1; // Compare value (frequency adjusted)

     ^

exit status 1
Error compiling for board ATmega128.

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Есть идеи, в чем проблема?

, 👍1

Обсуждение

ATMega328 и ATMega128 не полностью взаимозаменяемы....заголовочный файл имеет либо разные имена регистров, либо регистры не существуют в ATMega128, @jsotola

какое ядро используешь? возможно, только названия у него другие. Я проверил библиотеку Dimmer с помощью MightyCore, и для Atmega16/32/164 я получаю ошибки, потому что в них нет таймера, используемого библиотекой. но у тебя ошибки разные. MightyCore не поддерживает 128 (хотя он есть в readme), @Juraj

@Юрай, я использую Megacore. Мне нужно использовать 128, потому что мне нужно много портов., @TechCreogen

@jsotola То, на что вы указали, похоже на проблему… это очевидно. но есть ли обходной путь?, @TechCreogen

Мне нужно много портов....с какой целью? ..... похоже, что это проблема XY ..... у вас может быть или не быть ошибочное решение проблемы отсутствия контактов ввода-вывода, и вы задаете свой вопрос, пытаясь заставить решение работать, @jsotola


1 ответ


1

Библиотека Dimmer не поддерживает Atmega128/164/16/32. Имеет

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define DIMMER_TIMER 4
#elif defined(__AVR_ATmega32U4__)
#define DIMMER_TIMER 3
#else
#define DIMMER_TIMER 2
#endif

Для Atmega128/164/16/32 будет использоваться таймер 2. Основные ошибки:

'OCR2A' was not declared in this scope
'TCCR2A' was not declared in this scope
'TCCR2B' was not declared in this scope
'TIMSK2' was not declared in this scope

Возможное решение:

Вы можете попробовать использовать таймер 3. Только вам нужно изменить номер таймера в Dimmer.h и в Dimmer.cpp в строке 159, измените TIMMKx(DIMMER_TIMER) = 0x02, возможно, на bitSet(ETIMSK, 3);. Проверьте таблицу данных. Проверить не могу, у меня нет чипа.

,